aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INFO13
-rw-r--r--INFO.yaml56
-rw-r--r--README.md317
-rw-r--r--dashboard/.gitignore21
-rw-r--r--dashboard/README.md35
-rw-r--r--dashboard/babel.config.js5
-rw-r--r--dashboard/package.json59
-rw-r--r--dashboard/public/css/boosted-grid.css4726
-rw-r--r--dashboard/public/css/boosted-grid.css.map1
-rw-r--r--dashboard/public/css/boosted-grid.min.css12
-rw-r--r--dashboard/public/css/boosted-grid.min.css.map1
-rw-r--r--dashboard/public/css/boosted-reboot.css344
-rw-r--r--dashboard/public/css/boosted-reboot.css.map1
-rw-r--r--dashboard/public/css/boosted-reboot.min.css13
-rw-r--r--dashboard/public/css/boosted-reboot.min.css.map1
-rw-r--r--dashboard/public/css/boosted-rtl.css14536
-rw-r--r--dashboard/public/css/boosted-rtl.css.map1
-rw-r--r--dashboard/public/css/boosted-rtl.min.css12
-rw-r--r--dashboard/public/css/boosted-rtl.min.css.map1
-rw-r--r--dashboard/public/css/boosted.css14485
-rw-r--r--dashboard/public/css/boosted.css.map1
-rw-r--r--dashboard/public/css/boosted.min.css12
-rw-r--r--dashboard/public/css/boosted.min.css.map1
-rw-r--r--dashboard/public/css/font-awesome.css2337
-rw-r--r--dashboard/public/css/font-awesome.min.css4
-rw-r--r--dashboard/public/css/moon.css98
-rw-r--r--dashboard/public/css/o-rtl.css60
-rw-r--r--dashboard/public/css/o-rtl.css.map1
-rw-r--r--dashboard/public/css/orangeHelvetica.css16
-rw-r--r--dashboard/public/css/orangeHelvetica.css.map1
-rw-r--r--dashboard/public/css/orangeHelvetica.min.css2
-rw-r--r--dashboard/public/css/orangeHelvetica.min.css.map1
-rw-r--r--dashboard/public/css/orangeIcons.css3681
-rw-r--r--dashboard/public/css/orangeIcons.css.map1
-rw-r--r--dashboard/public/css/orangeIcons.min.css2
-rw-r--r--dashboard/public/css/orangeIcons.min.css.map1
-rw-r--r--dashboard/public/favicon.icobin0 -> 15086 bytes
-rw-r--r--dashboard/public/fonts/FontAwesome.otfbin0 -> 134808 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue55_W1G.eotbin0 -> 39193 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue55_W1G.svg653
-rw-r--r--dashboard/public/fonts/HelvNeue55_W1G.ttfbin0 -> 88172 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue55_W1G.woffbin0 -> 48038 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue55_W1G.woff2bin0 -> 38000 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue75_W1G.eotbin0 -> 39324 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue75_W1G.svg653
-rw-r--r--dashboard/public/fonts/HelvNeue75_W1G.ttfbin0 -> 85816 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue75_W1G.woffbin0 -> 47987 bytes
-rw-r--r--dashboard/public/fonts/HelvNeue75_W1G.woff2bin0 -> 37996 bytes
-rw-r--r--dashboard/public/fonts/fontawesome-webfont.eotbin0 -> 165742 bytes
-rw-r--r--dashboard/public/fonts/fontawesome-webfont.svg2671
-rw-r--r--dashboard/public/fonts/fontawesome-webfont.ttfbin0 -> 165548 bytes
-rw-r--r--dashboard/public/fonts/fontawesome-webfont.woffbin0 -> 98024 bytes
-rw-r--r--dashboard/public/fonts/fontawesome-webfont.woff2bin0 -> 77160 bytes
-rw-r--r--dashboard/public/fonts/icon-orange.eotbin0 -> 389532 bytes
-rw-r--r--dashboard/public/fonts/icon-orange.svg672
-rw-r--r--dashboard/public/fonts/icon-orange.ttfbin0 -> 389372 bytes
-rw-r--r--dashboard/public/fonts/icon-orange.woffbin0 -> 389448 bytes
-rw-r--r--dashboard/public/fonts/icon-orange.woff2bin0 -> 165812 bytes
-rw-r--r--dashboard/public/img/ORANGE_LOGO_rgb.jpgbin0 -> 44293 bytes
-rw-r--r--dashboard/public/img/orange_logo.svg1
-rw-r--r--dashboard/public/index.html44
-rw-r--r--dashboard/public/js/boosted.bundle.js8233
-rw-r--r--dashboard/public/js/boosted.bundle.js.map1
-rw-r--r--dashboard/public/js/boosted.bundle.min.js12
-rw-r--r--dashboard/public/js/boosted.bundle.min.js.map1
-rw-r--r--dashboard/public/js/boosted.js5632
-rw-r--r--dashboard/public/js/boosted.js.map1
-rw-r--r--dashboard/public/js/boosted.min.js12
-rw-r--r--dashboard/public/js/boosted.min.js.map1
-rw-r--r--dashboard/src/App.vue41
-rw-r--r--dashboard/src/assets/logo.pngbin0 -> 6849 bytes
-rw-r--r--dashboard/src/components/FormHeader.vue27
-rw-r--r--dashboard/src/components/assignment/Category.vue103
-rw-r--r--dashboard/src/components/assignment/CreateData.vue75
-rw-r--r--dashboard/src/components/assignment/Policy.vue123
-rw-r--r--dashboard/src/components/model/AddCategory.vue126
-rw-r--r--dashboard/src/components/model/AddMetarule.vue111
-rw-r--r--dashboard/src/components/model/Category.vue64
-rw-r--r--dashboard/src/components/model/CreateModel.vue57
-rw-r--r--dashboard/src/components/model/Metarule.vue155
-rw-r--r--dashboard/src/components/model/Model.vue112
-rw-r--r--dashboard/src/components/model/OrphanCategory.vue65
-rw-r--r--dashboard/src/components/model/Orphans.vue79
-rw-r--r--dashboard/src/components/pdp/AddPolicy.vue64
-rw-r--r--dashboard/src/components/pdp/CreatePdp.vue83
-rw-r--r--dashboard/src/components/pdp/Pdp.vue173
-rw-r--r--dashboard/src/components/pdp/UpdatePolicy.vue64
-rw-r--r--dashboard/src/components/policy/AssignPerimeter.vue244
-rw-r--r--dashboard/src/components/policy/CreateData.vue75
-rw-r--r--dashboard/src/components/policy/CreatePerimeter.vue73
-rw-r--r--dashboard/src/components/policy/CreatePolicy.vue84
-rw-r--r--dashboard/src/components/policy/CreateRule.vue213
-rw-r--r--dashboard/src/components/policy/DataList.vue16
-rw-r--r--dashboard/src/components/policy/FilterRules.vue24
-rw-r--r--dashboard/src/components/policy/Policy.vue186
-rw-r--r--dashboard/src/components/policy/Rule.vue231
-rw-r--r--dashboard/src/components/policy/UnusedData.vue89
-rw-r--r--dashboard/src/config.js4
-rw-r--r--dashboard/src/helpstrings.js25
-rw-r--r--dashboard/src/main.js58
-rw-r--r--dashboard/src/router.js56
-rw-r--r--dashboard/src/services/Attribute.service.js46
-rw-r--r--dashboard/src/services/Import.service.js16
-rw-r--r--dashboard/src/services/Model.service.js351
-rw-r--r--dashboard/src/services/Pdp.service.js92
-rw-r--r--dashboard/src/services/Policy.service.js470
-rw-r--r--dashboard/src/services/Util.service.js153
-rw-r--r--dashboard/src/views/Admin.vue52
-rw-r--r--dashboard/src/views/Assignments.vue54
-rw-r--r--dashboard/src/views/Auth.vue65
-rw-r--r--dashboard/src/views/Error.vue8
-rw-r--r--dashboard/src/views/Models.vue80
-rw-r--r--dashboard/src/views/Pdps.vue53
-rw-r--r--dashboard/src/views/Rules.vue50
-rw-r--r--dashboard/vue.config.js5
-rw-r--r--dashboard/yarn.lock8200
-rw-r--r--moon_authz/Dockerfile8
-rw-r--r--moon_cache/.gitignore105
-rw-r--r--moon_cache/Changelog34
-rw-r--r--moon_cache/LICENSE (renamed from moon_authz/LICENSE)0
-rw-r--r--moon_cache/MANIFEST.in10
-rw-r--r--moon_cache/README.md3
-rw-r--r--moon_cache/moon_cache/__init__.py13
-rw-r--r--moon_cache/moon_cache/cache.py1466
-rw-r--r--moon_cache/moon_cache/context.py345
-rw-r--r--moon_cache/moon_cache/request_wrapper.py35
-rw-r--r--moon_cache/requirements.txt1
-rw-r--r--moon_cache/setup.py51
-rw-r--r--moon_cache/tests/unit_python/api/__init__.py11
-rw-r--r--moon_cache/tests/unit_python/api/test_attributes.py36
-rw-r--r--moon_cache/tests/unit_python/api/test_cache.py535
-rw-r--r--moon_cache/tests/unit_python/conftest.py151
-rw-r--r--moon_cache/tests/unit_python/mock_repo/__init__.py12
-rw-r--r--moon_cache/tests/unit_python/mock_repo/data.py306
-rw-r--r--moon_cache/tests/unit_python/mock_repo/urls.py174
-rw-r--r--moon_cache/tests/unit_python/requirements.txt7
-rw-r--r--moon_engine/.gitignore104
-rw-r--r--moon_engine/Changelog61
-rw-r--r--moon_engine/LICENSE (renamed from moon_interface/LICENSE)0
-rw-r--r--moon_engine/MANIFEST.in (renamed from moon_wrapper/MANIFEST.in)0
-rw-r--r--moon_engine/README.md146
-rw-r--r--moon_engine/conf/config.cfg (renamed from python_moondb/python_moondb/__init__.py)9
-rw-r--r--moon_engine/conf/moon.yaml58
-rw-r--r--moon_engine/conf/moon_engine_users.json1
-rw-r--r--moon_engine/conf/policy_mls.json495
-rw-r--r--moon_engine/conf/policy_rbac.json393
-rw-r--r--moon_engine/conf/policy_rbac_mls.json525
-rw-r--r--moon_engine/moon_engine/__init__.py30
-rw-r--r--moon_engine/moon_engine/__main__.py113
-rw-r--r--moon_engine/moon_engine/api/__init__.py29
-rw-r--r--moon_engine/moon_engine/api/authz/__init__.py12
-rw-r--r--moon_engine/moon_engine/api/authz/authz.py28
-rw-r--r--moon_engine/moon_engine/api/authz/managers.py20
-rw-r--r--moon_engine/moon_engine/api/configuration.py195
-rw-r--r--moon_engine/moon_engine/api/import_json.py29
-rw-r--r--moon_engine/moon_engine/api/logs.py25
-rw-r--r--moon_engine/moon_engine/api/orchestration/__init__.py12
-rw-r--r--moon_engine/moon_engine/api/orchestration/managers.py21
-rw-r--r--moon_engine/moon_engine/api/orchestration/pipeline.py51
-rw-r--r--moon_engine/moon_engine/api/orchestration/slave.py44
-rw-r--r--moon_engine/moon_engine/api/pipeline/__init__.py11
-rw-r--r--moon_engine/moon_engine/api/pipeline/authz.py35
-rw-r--r--moon_engine/moon_engine/api/pipeline/update.py188
-rw-r--r--moon_engine/moon_engine/api/pipeline/update_pipeline.py220
-rw-r--r--moon_engine/moon_engine/api/pipeline/validator.py125
-rw-r--r--moon_engine/moon_engine/api/status.py30
-rw-r--r--moon_engine/moon_engine/api/wrapper/__init__.py11
-rw-r--r--moon_engine/moon_engine/api/wrapper/api/__init__.py11
-rw-r--r--moon_engine/moon_engine/api/wrapper/api/authz.py43
-rw-r--r--moon_engine/moon_engine/api/wrapper/api/pipeline.py100
-rw-r--r--moon_engine/moon_engine/api/wrapper/api/update.py179
-rw-r--r--moon_engine/moon_engine/api/wrapper/router.py115
-rw-r--r--moon_engine/moon_engine/api/wrapper/update_wrapper.py233
-rw-r--r--moon_engine/moon_engine/authz_driver.py68
-rw-r--r--moon_engine/moon_engine/orchestration_driver.py100
-rw-r--r--moon_engine/moon_engine/plugins/__init__.py12
-rw-r--r--moon_engine/moon_engine/plugins/authz.py32
-rw-r--r--moon_engine/moon_engine/plugins/oslowrapper.py137
-rw-r--r--moon_engine/moon_engine/plugins/pyorchestrator.py372
-rw-r--r--moon_engine/moon_engine/server.py288
-rw-r--r--moon_engine/moon_engine_users.json1
-rw-r--r--moon_engine/requirements.txt7
-rw-r--r--moon_engine/setup.py55
-rw-r--r--moon_engine/tests/func_policies/moon.yaml58
-rw-r--r--moon_engine/tests/func_policies/opst_rbac.json59378
-rw-r--r--moon_engine/tests/func_policies/opst_rbac_cinder.json5078
-rw-r--r--moon_engine/tests/func_policies/opst_rbac_glance.json2918
-rw-r--r--moon_engine/tests/func_policies/opst_rbac_keystone.json12998
-rw-r--r--moon_engine/tests/func_policies/opst_rbac_kg.json1
-rw-r--r--moon_engine/tests/func_policies/opst_rbac_nova.json27158
-rw-r--r--moon_engine/tests/func_policies/policy_attributes.json452
-rw-r--r--moon_engine/tests/func_policies/policy_mls.json495
-rw-r--r--moon_engine/tests/func_policies/policy_rbac.json393
-rw-r--r--moon_engine/tests/func_policies/test_base_configuration.py30
-rw-r--r--moon_engine/tests/func_policies/tmp/glance.policy.json (renamed from tools/policies/policy.json.d/glance.policy.json)0
-rw-r--r--moon_engine/tests/func_policies/tmp/keystone.policy.json (renamed from tools/policies/policy.json.d/keystone.policy.json)0
-rw-r--r--moon_engine/tests/func_postman/Test Authz through Wrapper.postman_collection.json24
-rw-r--r--moon_engine/tests/func_postman/db.json1
-rw-r--r--moon_engine/tests/func_postman/gunicorn.cfg3
-rw-r--r--moon_engine/tests/func_postman/moon.yaml49
-rwxr-xr-xmoon_engine/tests/func_postman/run.sh3
-rw-r--r--moon_engine/tests/performance_tests/authz_pipeline.py115
-rw-r--r--moon_engine/tests/performance_tests/locustfile.py26
-rw-r--r--moon_engine/tests/performance_tests/policy_rbac.json411
-rw-r--r--moon_engine/tests/performance_tests/utils.py60
-rw-r--r--moon_engine/tests/unit_python/api/__init__.py12
-rw-r--r--moon_engine/tests/unit_python/api/moon.yaml54
-rw-r--r--moon_engine/tests/unit_python/api/pipeline/__init__.py11
-rw-r--r--moon_engine/tests/unit_python/api/pipeline/test_authz.py37
-rw-r--r--moon_engine/tests/unit_python/api/pipeline/test_update.py525
-rw-r--r--moon_engine/tests/unit_python/api/test_status.py21
-rw-r--r--moon_engine/tests/unit_python/api/wrapper/__init__.py11
-rw-r--r--moon_engine/tests/unit_python/api/wrapper/test_oslo_wrapper.py209
-rw-r--r--moon_engine/tests/unit_python/api/wrapper/test_pipeline.py32
-rw-r--r--moon_engine/tests/unit_python/api/wrapper/test_update.py602
-rw-r--r--moon_engine/tests/unit_python/api/wrapper/test_wrapper_authz.py57
-rw-r--r--moon_engine/tests/unit_python/conftest.py60
-rw-r--r--moon_engine/tests/unit_python/mock_require_data.py762
-rw-r--r--moon_engine/tests/unit_python/moon.yaml54
-rw-r--r--moon_engine/tests/unit_python/moon_engine_users.json1
-rw-r--r--moon_engine/tests/unit_python/policy_example.json470
-rw-r--r--moon_engine/tests/unit_python/requirements.txt5
-rw-r--r--moon_interface/Dockerfile8
-rw-r--r--moon_manager/.gitignore109
-rw-r--r--moon_manager/Changelog115
-rw-r--r--moon_manager/Dockerfile8
-rw-r--r--moon_manager/MANIFEST.in2
-rw-r--r--moon_manager/README.md124
-rw-r--r--moon_manager/conf/moon.yaml108
-rw-r--r--moon_manager/docs/test.rst (renamed from moon_authz/moon_authz/api/__init__.py)0
-rw-r--r--moon_manager/moon_manager/__init__.py20
-rw-r--r--moon_manager/moon_manager/__main__.py234
-rw-r--r--moon_manager/moon_manager/api/__init__.py28
-rw-r--r--moon_manager/moon_manager/api/assignments.py764
-rw-r--r--moon_manager/moon_manager/api/attributes.py207
-rw-r--r--moon_manager/moon_manager/api/auth.py42
-rw-r--r--moon_manager/moon_manager/api/checks.py211
-rw-r--r--moon_manager/moon_manager/api/configuration.py237
-rw-r--r--moon_manager/moon_manager/api/data.py695
-rw-r--r--moon_manager/moon_manager/api/db/__init__.py12
-rw-r--r--moon_manager/moon_manager/api/db/managers.py24
-rw-r--r--moon_manager/moon_manager/api/db/migrations/__init__.py12
-rw-r--r--moon_manager/moon_manager/api/db/migrations/moon_001.py336
-rw-r--r--moon_manager/moon_manager/api/db/model.py429
-rw-r--r--moon_manager/moon_manager/api/db/pdp.py115
-rw-r--r--moon_manager/moon_manager/api/db/policy.py971
-rw-r--r--moon_manager/moon_manager/api/db/slave.py55
-rw-r--r--moon_manager/moon_manager/api/information/__init__.py11
-rw-r--r--moon_manager/moon_manager/api/information/global_attrs.py145
-rw-r--r--moon_manager/moon_manager/api/information/information.py106
-rw-r--r--moon_manager/moon_manager/api/information/managers.py19
-rw-r--r--moon_manager/moon_manager/api/json_export.py241
-rw-r--r--moon_manager/moon_manager/api/json_import.py552
-rw-r--r--moon_manager/moon_manager/api/logs.py25
-rw-r--r--moon_manager/moon_manager/api/meta_data.py575
-rw-r--r--moon_manager/moon_manager/api/meta_rules.py286
-rw-r--r--moon_manager/moon_manager/api/models.py259
-rw-r--r--moon_manager/moon_manager/api/orchestration/__init__.py12
-rw-r--r--moon_manager/moon_manager/api/orchestration/managers.py21
-rw-r--r--moon_manager/moon_manager/api/orchestration/pipeline.py44
-rw-r--r--moon_manager/moon_manager/api/orchestration/slave.py44
-rw-r--r--moon_manager/moon_manager/api/pdp.py492
-rw-r--r--moon_manager/moon_manager/api/perimeter.py968
-rw-r--r--moon_manager/moon_manager/api/policy.py293
-rw-r--r--moon_manager/moon_manager/api/rules.py338
-rw-r--r--moon_manager/moon_manager/api/slave.py341
-rw-r--r--moon_manager/moon_manager/api/status.py127
-rw-r--r--moon_manager/moon_manager/api/users.py95
-rw-r--r--moon_manager/moon_manager/daemon.py183
-rw-r--r--moon_manager/moon_manager/db_driver.py256
-rw-r--r--moon_manager/moon_manager/manager_setup.py31
-rw-r--r--moon_manager/moon_manager/orchestration_driver.py81
-rw-r--r--moon_manager/moon_manager/pip_driver.py350
-rw-r--r--moon_manager/moon_manager/plugins/__init__.py12
-rw-r--r--moon_manager/moon_manager/plugins/global_attrs.py582
-rw-r--r--moon_manager/moon_manager/plugins/moon_keystone_plugin.py77
-rw-r--r--moon_manager/moon_manager/plugins/moon_nova_plugin.py71
-rw-r--r--moon_manager/moon_manager/plugins/moon_openstack_plugin.py203
-rw-r--r--moon_manager/moon_manager/plugins/pyorchestrator.py493
-rw-r--r--moon_manager/moon_manager/plugins/sql.py2085
-rw-r--r--moon_manager/moon_manager/server.py115
-rw-r--r--moon_manager/moonrc18
-rw-r--r--moon_manager/requirements.txt14
-rw-r--r--moon_manager/setup.py76
-rw-r--r--moon_manager/tests/command_lines/test_complete.py764
-rw-r--r--moon_manager/tests/func_postman/Import tests.postman_collection.json1476
-rw-r--r--moon_manager/tests/func_postman/Test Manager.postman_collection.json916
-rw-r--r--moon_manager/tests/func_tests/Logs/test.txt (renamed from moon_interface/moon_interface/api/__init__.py)0
-rw-r--r--moon_manager/tests/func_tests/__init__.py11
-rw-r--r--moon_manager/tests/func_tests/features/README.md11
-rw-r--r--moon_manager/tests/func_tests/features/__init__.py11
-rw-r--r--moon_manager/tests/func_tests/features/assignments.feature290
-rw-r--r--moon_manager/tests/func_tests/features/authorization_pipeline.feature388
-rw-r--r--moon_manager/tests/func_tests/features/authorization_wrapper.feature386
-rw-r--r--moon_manager/tests/func_tests/features/data.feature330
-rw-r--r--moon_manager/tests/func_tests/features/environment.py27
-rw-r--r--moon_manager/tests/func_tests/features/meta_data.feature295
-rw-r--r--moon_manager/tests/func_tests/features/meta_rules.feature234
-rw-r--r--moon_manager/tests/func_tests/features/model.feature176
-rw-r--r--moon_manager/tests/func_tests/features/partner.feature7
-rw-r--r--moon_manager/tests/func_tests/features/pdp.feature141
-rw-r--r--moon_manager/tests/func_tests/features/perimeter.feature465
-rw-r--r--moon_manager/tests/func_tests/features/policy.feature245
-rw-r--r--moon_manager/tests/func_tests/features/rules.feature188
-rw-r--r--moon_manager/tests/func_tests/features/steps/Static_Variables.py89
-rw-r--r--moon_manager/tests/func_tests/features/steps/__init__.py11
-rw-r--r--moon_manager/tests/func_tests/features/steps/assignments.py858
-rw-r--r--moon_manager/tests/func_tests/features/steps/authorization.py217
-rw-r--r--moon_manager/tests/func_tests/features/steps/common_functions.py279
-rw-r--r--moon_manager/tests/func_tests/features/steps/data.py629
-rw-r--r--moon_manager/tests/func_tests/features/steps/meta_data.py394
-rw-r--r--moon_manager/tests/func_tests/features/steps/meta_rules.py335
-rw-r--r--moon_manager/tests/func_tests/features/steps/model.py230
-rw-r--r--moon_manager/tests/func_tests/features/steps/pdp.py248
-rw-r--r--moon_manager/tests/func_tests/features/steps/perimeter.py727
-rw-r--r--moon_manager/tests/func_tests/features/steps/policy.py219
-rw-r--r--moon_manager/tests/func_tests/features/steps/rules.py495
-rwxr-xr-xmoon_manager/tests/func_tests/run.sh25
-rw-r--r--moon_manager/tests/performance_tests/authz_pipeline.py115
-rw-r--r--moon_manager/tests/performance_tests/locustfile.py26
-rw-r--r--moon_manager/tests/performance_tests/policy_rbac.json411
-rw-r--r--moon_manager/tests/performance_tests_policies/actions.py54
-rw-r--r--moon_manager/tests/performance_tests_policies/locustfile.py32
-rw-r--r--moon_manager/tests/performance_tests_policies/meta_rules.py80
-rw-r--r--moon_manager/tests/performance_tests_policies/objects.py54
-rw-r--r--moon_manager/tests/performance_tests_policies/subjects.py57
-rw-r--r--moon_manager/tests/performance_tests_policies/utils.py45
-rw-r--r--moon_manager/tests/unit_python/api/__init__.py12
-rw-r--r--moon_manager/tests/unit_python/api/meta_rules_test.py69
-rw-r--r--moon_manager/tests/unit_python/api/test_assignement.py469
-rw-r--r--moon_manager/tests/unit_python/api/test_assignemnt.py174
-rw-r--r--moon_manager/tests/unit_python/api/test_auth.py71
-rw-r--r--moon_manager/tests/unit_python/api/test_data.py301
-rw-r--r--moon_manager/tests/unit_python/api/test_json_export.py321
-rw-r--r--moon_manager/tests/unit_python/api/test_json_import.py832
-rw-r--r--moon_manager/tests/unit_python/api/test_keystone.py63
-rw-r--r--moon_manager/tests/unit_python/api/test_meta_data.py370
-rw-r--r--moon_manager/tests/unit_python/api/test_meta_rules.py687
-rw-r--r--moon_manager/tests/unit_python/api/test_models.py469
-rw-r--r--moon_manager/tests/unit_python/api/test_nova.py58
-rw-r--r--moon_manager/tests/unit_python/api/test_pdp.py499
-rw-r--r--moon_manager/tests/unit_python/api/test_perimeter.py1357
-rw-r--r--moon_manager/tests/unit_python/api/test_perimeter_examples.py55
-rw-r--r--moon_manager/tests/unit_python/api/test_policies.py443
-rw-r--r--moon_manager/tests/unit_python/api/test_rules.py342
-rw-r--r--moon_manager/tests/unit_python/api/test_slaves.py90
-rw-r--r--moon_manager/tests/unit_python/api/utilities.py34
-rw-r--r--moon_manager/tests/unit_python/conftest.py372
-rw-r--r--moon_manager/tests/unit_python/helpers/__init__.py11
-rw-r--r--moon_manager/tests/unit_python/helpers/assignment_helper.py57
-rw-r--r--moon_manager/tests/unit_python/helpers/category_helper.py47
-rw-r--r--moon_manager/tests/unit_python/helpers/data_builder.py283
-rw-r--r--moon_manager/tests/unit_python/helpers/data_helper.py106
-rw-r--r--moon_manager/tests/unit_python/helpers/import_export_helper.py287
-rw-r--r--moon_manager/tests/unit_python/helpers/meta_rule_helper.py84
-rw-r--r--moon_manager/tests/unit_python/helpers/model_helper.py81
-rw-r--r--moon_manager/tests/unit_python/helpers/pdp_helper.py31
-rw-r--r--moon_manager/tests/unit_python/helpers/policy_helper.py84
-rw-r--r--moon_manager/tests/unit_python/helpers/rules_helper.py18
-rw-r--r--moon_manager/tests/unit_python/mock_engine.py19
-rw-r--r--moon_manager/tests/unit_python/mock_keystone.py59
-rw-r--r--moon_manager/tests/unit_python/mock_nova.py28
-rw-r--r--moon_manager/tests/unit_python/mock_slaves.py38
-rw-r--r--moon_manager/tests/unit_python/plugins/__init__.py12
-rw-r--r--moon_manager/tests/unit_python/plugins/test_global_attrs.py148
-rw-r--r--moon_manager/tests/unit_python/requirements.txt16
-rw-r--r--moon_orchestrator/Dockerfile8
-rw-r--r--moon_orchestrator/tests/unit_python/test_pods.py145
-rw-r--r--moon_utilities/.gitignore105
-rw-r--r--moon_utilities/Changelog54
-rw-r--r--moon_utilities/LICENSE (renamed from moon_orchestrator/LICENSE)0
-rw-r--r--moon_utilities/MANIFEST.in10
-rw-r--r--moon_utilities/README.md3
-rw-r--r--moon_utilities/conf/policy.json.d/cinder.policy.json (renamed from tools/policies/policy.json.d/cinder.policy.json)0
-rw-r--r--moon_utilities/conf/policy.json.d/glance.policy.json63
-rw-r--r--moon_utilities/conf/policy.json.d/keystone.policy.json260
-rw-r--r--moon_utilities/conf/policy.json.d/neutron.policy.json (renamed from tools/policies/policy.json.d/neutron.policy.json)0
-rw-r--r--moon_utilities/conf/policy.json.d/nova.policy.json (renamed from tools/policies/policy.json.d/nova.policy.json)0
-rw-r--r--moon_utilities/moon_utilities/__init__.py13
-rw-r--r--moon_utilities/moon_utilities/auth_functions.py307
-rw-r--r--moon_utilities/moon_utilities/exceptions.py903
-rw-r--r--moon_utilities/moon_utilities/generate_opst_policy.py503
-rw-r--r--moon_utilities/moon_utilities/install.py155
-rw-r--r--moon_utilities/moon_utilities/invalided_functions.py440
-rw-r--r--moon_utilities/moon_utilities/json_utils.py2076
-rw-r--r--moon_utilities/moon_utilities/security_functions.py83
-rw-r--r--moon_utilities/moon_utilities/update_opst_policies.py85
-rw-r--r--moon_utilities/requirements.txt3
-rw-r--r--moon_utilities/setup.py58
-rw-r--r--moon_utilities/tests/unit_python/api/__init__.py12
-rw-r--r--moon_utilities/tests/unit_python/api/test_auth_functions.py83
-rw-r--r--moon_utilities/tests/unit_python/api/test_import_to_cache.py775
-rw-r--r--moon_utilities/tests/unit_python/api/test_import_to_db.py772
-rw-r--r--moon_utilities/tests/unit_python/api/test_invalidate_function.py64
-rw-r--r--moon_utilities/tests/unit_python/api/test_security_functions.py18
-rw-r--r--moon_utilities/tests/unit_python/conftest.py172
-rw-r--r--moon_utilities/tests/unit_python/helpers/__init__.py13
-rw-r--r--moon_utilities/tests/unit_python/helpers/import_export_cache_helper.py234
-rw-r--r--moon_utilities/tests/unit_python/helpers/import_export_db_helper.py178
-rw-r--r--moon_utilities/tests/unit_python/helpers/slaves_helpers.py32
-rw-r--r--moon_utilities/tests/unit_python/mock_slaves.py50
-rw-r--r--moon_utilities/tests/unit_python/requirements.txt10
-rw-r--r--moon_wrapper/Dockerfile8
-rw-r--r--old/external_policy_checker/Changelog (renamed from external_policy_checker/Changelog)0
-rw-r--r--old/external_policy_checker/Dockerfile (renamed from external_policy_checker/Dockerfile)0
-rw-r--r--old/external_policy_checker/README.md (renamed from external_policy_checker/README.md)0
-rw-r--r--old/external_policy_checker/conf/templates/cinder.policy.json (renamed from external_policy_checker/conf/templates/cinder.policy.json)0
-rw-r--r--old/external_policy_checker/conf/templates/glance.policy.json (renamed from external_policy_checker/conf/templates/glance.policy.json)0
-rw-r--r--old/external_policy_checker/conf/templates/keystone.policy.json (renamed from external_policy_checker/conf/templates/keystone.policy.json)0
-rw-r--r--old/external_policy_checker/conf/templates/neutron.policy.json (renamed from external_policy_checker/conf/templates/neutron.policy.json)0
-rw-r--r--old/external_policy_checker/conf/templates/nova.policy.json (renamed from external_policy_checker/conf/templates/nova.policy.json)0
-rw-r--r--old/external_policy_checker/external_policy_checker/__init__.py (renamed from external_policy_checker/external_policy_checker/__init__.py)0
-rw-r--r--old/external_policy_checker/external_policy_checker/__main__.py (renamed from external_policy_checker/external_policy_checker/__main__.py)0
-rw-r--r--old/external_policy_checker/external_policy_checker/conf_installer.py (renamed from external_policy_checker/external_policy_checker/conf_installer.py)0
-rw-r--r--old/external_policy_checker/external_policy_checker/server.py (renamed from external_policy_checker/external_policy_checker/server.py)0
-rw-r--r--old/external_policy_checker/requirements.txt (renamed from external_policy_checker/requirements.txt)0
-rw-r--r--old/external_policy_checker/setup.cfg (renamed from external_policy_checker/setup.cfg)0
-rw-r--r--old/external_policy_checker/setup.py (renamed from external_policy_checker/setup.py)0
-rw-r--r--old/moon_authz/Changelog (renamed from moon_authz/Changelog)9
-rw-r--r--old/moon_authz/Dockerfile15
-rw-r--r--old/moon_authz/LICENSE (renamed from moon_wrapper/LICENSE)0
-rw-r--r--old/moon_authz/MANIFEST.in (renamed from moon_authz/MANIFEST.in)0
-rw-r--r--old/moon_authz/README.md (renamed from moon_authz/README.md)0
-rw-r--r--old/moon_authz/moon_authz/__init__.py (renamed from moon_wrapper/moon_wrapper/__init__.py)2
-rw-r--r--old/moon_authz/moon_authz/__main__.py (renamed from moon_authz/moon_authz/__main__.py)4
-rw-r--r--old/moon_authz/moon_authz/api/__init__.py (renamed from moon_interface/tests/unit_python/api/__init__.py)0
-rw-r--r--old/moon_authz/moon_authz/api/authorization.py (renamed from moon_authz/moon_authz/api/authorization.py)151
-rw-r--r--old/moon_authz/moon_authz/api/update.py42
-rw-r--r--old/moon_authz/moon_authz/http_server.py (renamed from moon_authz/moon_authz/http_server.py)16
-rw-r--r--old/moon_authz/moon_authz/server.py (renamed from moon_authz/moon_authz/server.py)6
-rw-r--r--old/moon_authz/requirements.txt (renamed from moon_authz/requirements.txt)0
-rw-r--r--old/moon_authz/setup.py (renamed from moon_authz/setup.py)0
-rw-r--r--old/moon_authz/tests/unit_python/conftest.py (renamed from moon_authz/tests/unit_python/conftest.py)0
-rw-r--r--old/moon_authz/tests/unit_python/mock_pods.py (renamed from moon_authz/tests/unit_python/mock_pods.py)12
-rw-r--r--old/moon_authz/tests/unit_python/requirements.txt (renamed from moon_authz/tests/unit_python/requirements.txt)0
-rw-r--r--old/moon_authz/tests/unit_python/test_authz.py (renamed from moon_authz/tests/unit_python/test_authz.py)0
-rw-r--r--old/moon_authz/tests/unit_python/utilities.py (renamed from moon_authz/tests/unit_python/utilities.py)0
-rw-r--r--old/moon_bouchon/Dockerfile (renamed from moon_bouchon/Dockerfile)0
-rw-r--r--old/moon_bouchon/README.md (renamed from moon_bouchon/README.md)0
-rw-r--r--old/moon_bouchon/moon_bouchon/__init__.py (renamed from moon_bouchon/moon_bouchon/__init__.py)0
-rw-r--r--old/moon_bouchon/moon_bouchon/__main__.py (renamed from moon_bouchon/moon_bouchon/__main__.py)0
-rw-r--r--old/moon_bouchon/moon_bouchon/server.py (renamed from moon_bouchon/moon_bouchon/server.py)0
-rw-r--r--old/moon_bouchon/requirements.txt (renamed from moon_bouchon/requirements.txt)0
-rw-r--r--old/moon_bouchon/setup.cfg (renamed from moon_bouchon/setup.cfg)0
-rw-r--r--old/moon_bouchon/setup.py (renamed from moon_bouchon/setup.py)0
-rw-r--r--old/moon_bouchon/tests/test_interface.py (renamed from moon_bouchon/tests/test_interface.py)0
-rw-r--r--old/moon_bouchon/tests/test_wrapper.py (renamed from moon_bouchon/tests/test_wrapper.py)0
-rw-r--r--old/moon_dashboard/.gitignore1
-rw-r--r--old/moon_dashboard/.gitlab-ci.yml64
-rw-r--r--old/moon_dashboard/Dockerfile38
-rw-r--r--old/moon_dashboard/LICENSE (renamed from moon_orchestrator/moon_orchestrator/api/__init__.py)0
-rw-r--r--old/moon_dashboard/MANIFEST.in3
-rw-r--r--old/moon_dashboard/README.md40
-rw-r--r--old/moon_dashboard/README.rst39
-rw-r--r--old/moon_dashboard/babel-django.cfg5
-rw-r--r--old/moon_dashboard/babel-djangojs.cfg14
-rw-r--r--old/moon_dashboard/moon/__init__.py (renamed from moon_wrapper/moon_wrapper/api/__init__.py)0
-rw-r--r--old/moon_dashboard/moon/api/__init__.py (renamed from moon_wrapper/tests/unit_python/api/__init__.py)0
-rw-r--r--old/moon_dashboard/moon/api/moon_api.py (renamed from python_moonclient/python_moonclient/cli/__init__.py)0
-rw-r--r--old/moon_dashboard/moon/dashboard.py13
-rw-r--r--old/moon_dashboard/moon/enabled/_32000_moon.py19
-rw-r--r--old/moon_dashboard/moon/model/__init__.py (renamed from python_moonclient/python_moonclient/core/__init__.py)0
-rw-r--r--old/moon_dashboard/moon/model/panel.py23
-rw-r--r--old/moon_dashboard/moon/model/templates/model/index.html16
-rw-r--r--old/moon_dashboard/moon/model/tests.py19
-rw-r--r--old/moon_dashboard/moon/model/urls.py20
-rw-r--r--old/moon_dashboard/moon/model/views.py22
-rw-r--r--old/moon_dashboard/moon/pdp/__init__.py (renamed from python_moonclient/tests/unit_python/__init__.py)0
-rw-r--r--old/moon_dashboard/moon/pdp/panel.py23
-rw-r--r--old/moon_dashboard/moon/pdp/templates/pdp/index.html16
-rw-r--r--old/moon_dashboard/moon/pdp/tests.py19
-rw-r--r--old/moon_dashboard/moon/pdp/urls.py20
-rw-r--r--old/moon_dashboard/moon/pdp/views.py22
-rw-r--r--old/moon_dashboard/moon/policy/__init__.py (renamed from python_moondb/python_moondb/api/__init__.py)0
-rw-r--r--old/moon_dashboard/moon/policy/panel.py23
-rw-r--r--old/moon_dashboard/moon/policy/templates/policy/index.html16
-rw-r--r--old/moon_dashboard/moon/policy/tests.py19
-rw-r--r--old/moon_dashboard/moon/policy/urls.py20
-rw-r--r--old/moon_dashboard/moon/policy/views.py22
-rw-r--r--old/moon_dashboard/moon/static/moon/js/angular-resource.js863
-rwxr-xr-xold/moon_dashboard/moon/static/moon/js/import.service.js27
-rwxr-xr-xold/moon_dashboard/moon/static/moon/js/moon.module.js29
-rwxr-xr-xold/moon_dashboard/moon/static/moon/js/util.service.js140
-rwxr-xr-xold/moon_dashboard/moon/static/moon/js/util.service.spec.js86
-rw-r--r--old/moon_dashboard/moon/static/moon/model/model.controller.js316
-rw-r--r--old/moon_dashboard/moon/static/moon/model/model.html139
-rwxr-xr-xold/moon_dashboard/moon/static/moon/model/model.service.js291
-rwxr-xr-xold/moon_dashboard/moon/static/moon/model/model.service.spec.js288
-rw-r--r--old/moon_dashboard/moon/static/moon/pdp/pdp.controller.js125
-rw-r--r--old/moon_dashboard/moon/static/moon/pdp/pdp.html41
-rwxr-xr-xold/moon_dashboard/moon/static/moon/pdp/pdp.service.js123
-rwxr-xr-xold/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js143
-rw-r--r--old/moon_dashboard/moon/static/moon/policy/policy.controller.js341
-rw-r--r--old/moon_dashboard/moon/static/moon/policy/policy.html214
-rwxr-xr-xold/moon_dashboard/moon/static/moon/policy/policy.service.js428
-rwxr-xr-xold/moon_dashboard/moon/static/moon/policy/policy.service.spec.js487
-rw-r--r--old/moon_dashboard/moon/static/moon/scss/moon.scss58
-rw-r--r--old/moon_dashboard/moon/templates/moon/base.html11
-rw-r--r--old/moon_dashboard/run.sh42
-rw-r--r--old/moon_dashboard/setup.cfg24
-rw-r--r--old/moon_dashboard/setup.py14
-rw-r--r--old/moon_forming/.gitignore105
-rw-r--r--old/moon_forming/Changelog11
-rw-r--r--old/moon_forming/Dockerfile (renamed from moon_forming/Dockerfile)8
-rw-r--r--old/moon_forming/README.md (renamed from moon_forming/README.md)0
-rw-r--r--old/moon_forming/conf2consul.py (renamed from moon_forming/conf2consul.py)2
-rw-r--r--old/moon_forming/config_moon.sh (renamed from moon_forming/config_moon.sh)0
-rw-r--r--old/moon_gui/.gitignore (renamed from moon_gui/.gitignore)0
-rw-r--r--old/moon_gui/.jshintrc (renamed from moon_gui/.jshintrc)0
-rw-r--r--old/moon_gui/DEV.md (renamed from moon_gui/DEV.md)0
-rw-r--r--old/moon_gui/Dockerfile (renamed from moon_gui/Dockerfile)0
-rw-r--r--old/moon_gui/README.md (renamed from moon_gui/README.md)0
-rw-r--r--old/moon_gui/delivery/assets/css/main.css (renamed from moon_gui/delivery/assets/css/main.css)0
-rw-r--r--old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.eot (renamed from moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.eot)bin20335 -> 20335 bytes
-rw-r--r--old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.svg (renamed from moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.svg)0
-rw-r--r--old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.ttf (renamed from moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.ttf)bin41280 -> 41280 bytes
-rw-r--r--old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.woff (renamed from moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.woff)bin23320 -> 23320 bytes
-rwxr-xr-xold/moon_gui/delivery/assets/i18n/en.json (renamed from moon_gui/delivery/assets/i18n/en.json)0
-rwxr-xr-xold/moon_gui/delivery/assets/i18n/fr.json (renamed from moon_gui/delivery/assets/i18n/fr.json)0
-rwxr-xr-xold/moon_gui/delivery/assets/img/ajax-loader.gif (renamed from moon_gui/delivery/assets/img/ajax-loader.gif)bin673 -> 673 bytes
-rwxr-xr-xold/moon_gui/delivery/assets/img/ajax-waiting.gif (renamed from moon_gui/delivery/assets/img/ajax-waiting.gif)bin10819 -> 10819 bytes
-rwxr-xr-xold/moon_gui/delivery/assets/img/arrow-link.gif (renamed from moon_gui/delivery/assets/img/arrow-link.gif)bin87 -> 87 bytes
-rw-r--r--old/moon_gui/delivery/assets/img/et.jpg (renamed from moon_gui/delivery/assets/img/et.jpg)bin31641 -> 31641 bytes
-rwxr-xr-xold/moon_gui/delivery/assets/img/favicon.ico (renamed from moon_gui/delivery/assets/img/favicon.ico)bin318 -> 318 bytes
-rwxr-xr-xold/moon_gui/delivery/assets/img/logo-openstack.png (renamed from moon_gui/delivery/assets/img/logo-openstack.png)bin3180 -> 3180 bytes
-rwxr-xr-xold/moon_gui/delivery/assets/img/logo-orange.gif (renamed from moon_gui/delivery/assets/img/logo-orange.gif)bin981 -> 981 bytes
-rw-r--r--old/moon_gui/delivery/html/authentication/authentication.tpl.html (renamed from moon_gui/delivery/html/authentication/authentication.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/common/404/404.tpl.html (renamed from moon_gui/delivery/html/common/404/404.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/common/compatibility/compatibility.tpl.html (renamed from moon_gui/delivery/html/common/compatibility/compatibility.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/common/footer/footer.tpl.html (renamed from moon_gui/delivery/html/common/footer/footer.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/common/header/header.tpl.html (renamed from moon_gui/delivery/html/common/header/header.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/common/loader/loader.tpl.html (renamed from moon_gui/delivery/html/common/loader/loader.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/common/waiting/waiting.tpl.html (renamed from moon_gui/delivery/html/common/waiting/waiting.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/dashboard/dashboard.tpl.html (renamed from moon_gui/delivery/html/dashboard/dashboard.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/logs/logs.tpl.html (renamed from moon_gui/delivery/html/logs/logs.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/action/model-add.tpl.html (renamed from moon_gui/delivery/html/model/action/model-add.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/action/model-delete.tpl.html (renamed from moon_gui/delivery/html/model/action/model-delete.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/action/model-view.tpl.html (renamed from moon_gui/delivery/html/model/action/model-view.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metadata/metadata-edit.tpl.html (renamed from moon_gui/delivery/html/model/edit/metadata/metadata-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metadata/metadata-list.tpl.html (renamed from moon_gui/delivery/html/model/edit/metadata/metadata-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-add.tpl.html (renamed from moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-add.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-map.tpl.html (renamed from moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-map.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-unmap.tpl.html (renamed from moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-unmap.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit-basic.tpl.html (renamed from moon_gui/delivery/html/model/edit/metarules/action/metarules-edit-basic.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit.tpl.html (renamed from moon_gui/delivery/html/model/edit/metarules/action/metarules-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/metarules/metarules-list.tpl.html (renamed from moon_gui/delivery/html/model/edit/metarules/metarules-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/model-edit-basic.tpl.html (renamed from moon_gui/delivery/html/model/edit/model-edit-basic.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/edit/model-edit.tpl.html (renamed from moon_gui/delivery/html/model/edit/model-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/model/model-list.tpl.html (renamed from moon_gui/delivery/html/model/model-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/pdp/action/pdp-add.tpl.html (renamed from moon_gui/delivery/html/pdp/action/pdp-add.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/pdp/action/pdp-delete.tpl.html (renamed from moon_gui/delivery/html/pdp/action/pdp-delete.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/pdp/edit/pdp-edit-basic.tpl.html (renamed from moon_gui/delivery/html/pdp/edit/pdp-edit-basic.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/pdp/edit/pdp-edit.tpl.html (renamed from moon_gui/delivery/html/pdp/edit/pdp-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/pdp/pdp-list.tpl.html (renamed from moon_gui/delivery/html/pdp/pdp-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/action/mapping/policy-map.tpl.html (renamed from moon_gui/delivery/html/policy/action/mapping/policy-map.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/action/mapping/policy-unmap.tpl.html (renamed from moon_gui/delivery/html/policy/action/mapping/policy-unmap.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/action/policy-add.tpl.html (renamed from moon_gui/delivery/html/policy/action/policy-add.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/action/policy-delete.tpl.html (renamed from moon_gui/delivery/html/policy/action/policy-delete.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-edit.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-list.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/data/data-edit.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/data/data-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/data/data-list.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/data/data-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-edit.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-list.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/rules/rules-edit.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/rules/rules-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/parameter/rules/rules-list.tpl.html (renamed from moon_gui/delivery/html/policy/edit/parameter/rules/rules-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/policy-edit-basic.tpl.html (renamed from moon_gui/delivery/html/policy/edit/policy-edit-basic.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/edit/policy-edit.tpl.html (renamed from moon_gui/delivery/html/policy/edit/policy-edit.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/policy-list.tpl.html (renamed from moon_gui/delivery/html/policy/policy-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/policy/policy-mapped-list.tpl.html (renamed from moon_gui/delivery/html/policy/policy-mapped-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/project/action/mapping/project-map.tpl.html (renamed from moon_gui/delivery/html/project/action/mapping/project-map.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/project/action/mapping/project-unmap.tpl.html (renamed from moon_gui/delivery/html/project/action/mapping/project-unmap.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/project/action/project-add.tpl.html (renamed from moon_gui/delivery/html/project/action/project-add.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/project/action/project-delete.tpl.html (renamed from moon_gui/delivery/html/project/action/project-delete.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/project/action/project-view.tpl.html (renamed from moon_gui/delivery/html/project/action/project-view.tpl.html)0
-rw-r--r--old/moon_gui/delivery/html/project/project-list.tpl.html (renamed from moon_gui/delivery/html/project/project-list.tpl.html)0
-rw-r--r--old/moon_gui/delivery/index.html (renamed from moon_gui/delivery/index.html)0
-rw-r--r--old/moon_gui/delivery/js/app.js (renamed from moon_gui/delivery/js/app.js)0
-rw-r--r--old/moon_gui/delivery/js/modules.js (renamed from moon_gui/delivery/js/modules.js)0
-rwxr-xr-xold/moon_gui/delivery/version.json (renamed from moon_gui/delivery/version.json)0
-rw-r--r--old/moon_gui/gulpfile.js (renamed from moon_gui/gulpfile.js)0
-rw-r--r--old/moon_gui/package.json (renamed from moon_gui/package.json)2
-rw-r--r--old/moon_gui/run.sh (renamed from moon_gui/run.sh)0
-rwxr-xr-xold/moon_gui/static/app/authentication/authentication.controller.js (renamed from moon_gui/static/app/authentication/authentication.controller.js)0
-rwxr-xr-xold/moon_gui/static/app/authentication/authentication.tpl.html (renamed from moon_gui/static/app/authentication/authentication.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/common/404/404.tpl.html (renamed from moon_gui/static/app/common/404/404.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/common/compatibility/compatibility.tpl.html (renamed from moon_gui/static/app/common/compatibility/compatibility.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/common/footer/footer.controller.js (renamed from moon_gui/static/app/common/footer/footer.controller.js)0
-rwxr-xr-xold/moon_gui/static/app/common/footer/footer.tpl.html (renamed from moon_gui/static/app/common/footer/footer.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/common/header/header.controller.js (renamed from moon_gui/static/app/common/header/header.controller.js)0
-rwxr-xr-xold/moon_gui/static/app/common/header/header.tpl.html (renamed from moon_gui/static/app/common/header/header.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/common/loader/loader.dir.js (renamed from moon_gui/static/app/common/loader/loader.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/common/loader/loader.tpl.html (renamed from moon_gui/static/app/common/loader/loader.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/common/waiting/waiting.tpl.html (renamed from moon_gui/static/app/common/waiting/waiting.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/dashboard/dashboard.tpl.html (renamed from moon_gui/static/app/dashboard/dashboard.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/logs/logs.controller.js (renamed from moon_gui/static/app/logs/logs.controller.js)0
-rwxr-xr-xold/moon_gui/static/app/logs/logs.tpl.html (renamed from moon_gui/static/app/logs/logs.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/action/model-add.tpl.html (renamed from moon_gui/static/app/model/action/model-add.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/action/model-delete.tpl.html (renamed from moon_gui/static/app/model/action/model-delete.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/action/model-view.tpl.html (renamed from moon_gui/static/app/model/action/model-view.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/action/model.controller.add.js (renamed from moon_gui/static/app/model/action/model.controller.add.js)0
-rwxr-xr-xold/moon_gui/static/app/model/action/model.controller.delete.js (renamed from moon_gui/static/app/model/action/model.controller.delete.js)0
-rwxr-xr-xold/moon_gui/static/app/model/action/model.controller.view.js (renamed from moon_gui/static/app/model/action/model.controller.view.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metadata/metadata-edit.tpl.html (renamed from moon_gui/static/app/model/edit/metadata/metadata-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metadata/metadata-list.tpl.html (renamed from moon_gui/static/app/model/edit/metadata/metadata-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metadata/metadata.edit.dir.js (renamed from moon_gui/static/app/model/edit/metadata/metadata.edit.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metadata/metadata.list.dir.js (renamed from moon_gui/static/app/model/edit/metadata/metadata.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-add.tpl.html (renamed from moon_gui/static/app/model/edit/metarules/action/mapping/metarules-add.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-map.tpl.html (renamed from moon_gui/static/app/model/edit/metarules/action/mapping/metarules-map.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-unmap.tpl.html (renamed from moon_gui/static/app/model/edit/metarules/action/mapping/metarules-unmap.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.controller.add.js (renamed from moon_gui/static/app/model/edit/metarules/action/mapping/metarules.controller.add.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.map.controller.js (renamed from moon_gui/static/app/model/edit/metarules/action/mapping/metarules.map.controller.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.unmap.controller.js (renamed from moon_gui/static/app/model/edit/metarules/action/mapping/metarules.unmap.controller.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/metarules-edit-basic.tpl.html (renamed from moon_gui/static/app/model/edit/metarules/action/metarules-edit-basic.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/metarules-edit.tpl.html (renamed from moon_gui/static/app/model/edit/metarules/action/metarules-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/metarules.controller.edit.js (renamed from moon_gui/static/app/model/edit/metarules/action/metarules.controller.edit.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/action/metarules.edit.basic.dir.js (renamed from moon_gui/static/app/model/edit/metarules/action/metarules.edit.basic.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/metarules-list.tpl.html (renamed from moon_gui/static/app/model/edit/metarules/metarules-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/metarules/metarules.list.dir.js (renamed from moon_gui/static/app/model/edit/metarules/metarules.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/model-edit-basic.tpl.html (renamed from moon_gui/static/app/model/edit/model-edit-basic.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/model-edit.tpl.html (renamed from moon_gui/static/app/model/edit/model-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/model.controller.edit.js (renamed from moon_gui/static/app/model/edit/model.controller.edit.js)0
-rwxr-xr-xold/moon_gui/static/app/model/edit/model.edit.basic.dir.js (renamed from moon_gui/static/app/model/edit/model.edit.basic.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/model/model-list.tpl.html (renamed from moon_gui/static/app/model/model-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/model/model.controller.list.js (renamed from moon_gui/static/app/model/model.controller.list.js)0
-rw-r--r--old/moon_gui/static/app/moon.constants.js (renamed from moon_gui/static/app/moon.constants.js)0
-rwxr-xr-xold/moon_gui/static/app/moon.module.js (renamed from moon_gui/static/app/moon.module.js)0
-rwxr-xr-xold/moon_gui/static/app/pdp/action/pdp-add.tpl.html (renamed from moon_gui/static/app/pdp/action/pdp-add.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/pdp/action/pdp-delete.tpl.html (renamed from moon_gui/static/app/pdp/action/pdp-delete.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/pdp/action/pdp.controller.add.js (renamed from moon_gui/static/app/pdp/action/pdp.controller.add.js)0
-rwxr-xr-xold/moon_gui/static/app/pdp/action/pdp.controller.delete.js (renamed from moon_gui/static/app/pdp/action/pdp.controller.delete.js)0
-rwxr-xr-xold/moon_gui/static/app/pdp/edit/pdp-edit-basic.tpl.html (renamed from moon_gui/static/app/pdp/edit/pdp-edit-basic.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/pdp/edit/pdp-edit.tpl.html (renamed from moon_gui/static/app/pdp/edit/pdp-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/pdp/edit/pdp.controller.edit.js (renamed from moon_gui/static/app/pdp/edit/pdp.controller.edit.js)0
-rwxr-xr-xold/moon_gui/static/app/pdp/edit/pdp.edit.basic.dir.js (renamed from moon_gui/static/app/pdp/edit/pdp.edit.basic.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/pdp/pdp-list.tpl.html (renamed from moon_gui/static/app/pdp/pdp-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/pdp/pdp.controller.list.js (renamed from moon_gui/static/app/pdp/pdp.controller.list.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/mapping/policy-map.tpl.html (renamed from moon_gui/static/app/policy/action/mapping/policy-map.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/mapping/policy-unmap.tpl.html (renamed from moon_gui/static/app/policy/action/mapping/policy-unmap.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/mapping/policy.controller.map.js (renamed from moon_gui/static/app/policy/action/mapping/policy.controller.map.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/mapping/policy.controller.unmap.js (renamed from moon_gui/static/app/policy/action/mapping/policy.controller.unmap.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/policy-add.tpl.html (renamed from moon_gui/static/app/policy/action/policy-add.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/policy-delete.tpl.html (renamed from moon_gui/static/app/policy/action/policy-delete.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/policy.controller.add.js (renamed from moon_gui/static/app/policy/action/policy.controller.add.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/action/policy.controller.delete.js (renamed from moon_gui/static/app/policy/action/policy.controller.delete.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/assignments/assignments-edit.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/assignments/assignments-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/assignments/assignments-list.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/assignments/assignments-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/assignments/assignments.edit.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/assignments/assignments.edit.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/assignments/assignments.list.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/assignments/assignments.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/data/data-edit.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/data/data-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/data/data-list.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/data/data-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/data/data.edit.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/data/data.edit.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/data/data.list.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/data/data.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-edit.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-list.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.edit.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.edit.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.list.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/rules/rules-edit.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/rules/rules-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/rules/rules-list.tpl.html (renamed from moon_gui/static/app/policy/edit/parameter/rules/rules-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/rules/rules.edit.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/rules/rules.edit.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/parameter/rules/rules.list.dir.js (renamed from moon_gui/static/app/policy/edit/parameter/rules/rules.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/policy-edit-basic.tpl.html (renamed from moon_gui/static/app/policy/edit/policy-edit-basic.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/policy-edit.tpl.html (renamed from moon_gui/static/app/policy/edit/policy-edit.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/policy.controller.edit.js (renamed from moon_gui/static/app/policy/edit/policy.controller.edit.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/edit/policy.edit.basic.dir.js (renamed from moon_gui/static/app/policy/edit/policy.edit.basic.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/policy-list.tpl.html (renamed from moon_gui/static/app/policy/policy-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/policy-mapped-list.tpl.html (renamed from moon_gui/static/app/policy/policy-mapped-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/policy/policy.controller.list.js (renamed from moon_gui/static/app/policy/policy.controller.list.js)0
-rwxr-xr-xold/moon_gui/static/app/policy/policy.mapped.list.dir.js (renamed from moon_gui/static/app/policy/policy.mapped.list.dir.js)0
-rwxr-xr-xold/moon_gui/static/app/project/action/mapping/project-map.tpl.html (renamed from moon_gui/static/app/project/action/mapping/project-map.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/project/action/mapping/project-unmap.tpl.html (renamed from moon_gui/static/app/project/action/mapping/project-unmap.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/project/action/mapping/project.controller.map.js (renamed from moon_gui/static/app/project/action/mapping/project.controller.map.js)0
-rwxr-xr-xold/moon_gui/static/app/project/action/mapping/project.controller.unmap.js (renamed from moon_gui/static/app/project/action/mapping/project.controller.unmap.js)0
-rwxr-xr-xold/moon_gui/static/app/project/action/project-add.tpl.html (renamed from moon_gui/static/app/project/action/project-add.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/project/action/project-delete.tpl.html (renamed from moon_gui/static/app/project/action/project-delete.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/project/action/project-view.tpl.html (renamed from moon_gui/static/app/project/action/project-view.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/project/action/project.controller.add.js (renamed from moon_gui/static/app/project/action/project.controller.add.js)0
-rwxr-xr-xold/moon_gui/static/app/project/action/project.controller.delete.js (renamed from moon_gui/static/app/project/action/project.controller.delete.js)0
-rwxr-xr-xold/moon_gui/static/app/project/action/project.controller.view.js (renamed from moon_gui/static/app/project/action/project.controller.view.js)0
-rwxr-xr-xold/moon_gui/static/app/project/project-list.tpl.html (renamed from moon_gui/static/app/project/project-list.tpl.html)0
-rwxr-xr-xold/moon_gui/static/app/project/project.controller.list.js (renamed from moon_gui/static/app/project/project.controller.list.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/alert.service.js (renamed from moon_gui/static/app/services/gui/alert.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/browser.service.js (renamed from moon_gui/static/app/services/gui/browser.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/form.service.js (renamed from moon_gui/static/app/services/gui/form.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/menu.service.js (renamed from moon_gui/static/app/services/gui/menu.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/security.pipeline.service.js (renamed from moon_gui/static/app/services/gui/security.pipeline.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/util.service.js (renamed from moon_gui/static/app/services/gui/util.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/gui/version.service.js (renamed from moon_gui/static/app/services/gui/version.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/model/model.service.js (renamed from moon_gui/static/app/services/moon/model/model.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/pdp.service.js (renamed from moon_gui/static/app/services/moon/pdp.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/policy/parameters/assignements.service.js (renamed from moon_gui/static/app/services/moon/policy/parameters/assignements.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/policy/parameters/data.service.js (renamed from moon_gui/static/app/services/moon/policy/parameters/data.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/policy/parameters/perimeter.service.js (renamed from moon_gui/static/app/services/moon/policy/parameters/perimeter.service.js)0
-rw-r--r--old/moon_gui/static/app/services/moon/policy/parameters/rule.service.js (renamed from moon_gui/static/app/services/moon/policy/parameters/rule.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/policy/parameters/rules.service.js (renamed from moon_gui/static/app/services/moon/policy/parameters/rules.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/policy/policy.service.js (renamed from moon_gui/static/app/services/moon/policy/policy.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/rule/metadata.service.js (renamed from moon_gui/static/app/services/moon/rule/metadata.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/moon/rule/metarule.service.js (renamed from moon_gui/static/app/services/moon/rule/metarule.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/partner/authentication.service.js (renamed from moon_gui/static/app/services/partner/authentication.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/partner/nova.service.js (renamed from moon_gui/static/app/services/partner/nova.service.js)0
-rwxr-xr-xold/moon_gui/static/app/services/partner/project.service.js (renamed from moon_gui/static/app/services/partner/project.service.js)0
-rwxr-xr-xold/moon_gui/static/favicon.ico (renamed from moon_gui/static/favicon.ico)bin318 -> 318 bytes
-rwxr-xr-xold/moon_gui/static/i18n/en.json (renamed from moon_gui/static/i18n/en.json)0
-rwxr-xr-xold/moon_gui/static/i18n/fr.json (renamed from moon_gui/static/i18n/fr.json)0
-rwxr-xr-xold/moon_gui/static/img/ajax-loader.gif (renamed from moon_gui/static/img/ajax-loader.gif)bin673 -> 673 bytes
-rwxr-xr-xold/moon_gui/static/img/ajax-waiting.gif (renamed from moon_gui/static/img/ajax-waiting.gif)bin10819 -> 10819 bytes
-rwxr-xr-xold/moon_gui/static/img/arrow-link.gif (renamed from moon_gui/static/img/arrow-link.gif)bin87 -> 87 bytes
-rw-r--r--old/moon_gui/static/img/et.jpg (renamed from moon_gui/static/img/et.jpg)bin31641 -> 31641 bytes
-rwxr-xr-xold/moon_gui/static/img/logo-openstack.png (renamed from moon_gui/static/img/logo-openstack.png)bin3180 -> 3180 bytes
-rwxr-xr-xold/moon_gui/static/img/logo-orange.gif (renamed from moon_gui/static/img/logo-orange.gif)bin981 -> 981 bytes
-rw-r--r--old/moon_gui/static/styles/main.css (renamed from moon_gui/static/styles/main.css)0
-rwxr-xr-xold/moon_gui/static/version.json (renamed from moon_gui/static/version.json)0
-rw-r--r--old/moon_gui/templates/index.html (renamed from moon_gui/templates/index.html)0
-rw-r--r--old/moon_interface/Changelog (renamed from moon_interface/Changelog)8
-rw-r--r--old/moon_interface/Dockerfile15
-rw-r--r--old/moon_interface/LICENSE (renamed from python_moonclient/LICENSE)0
-rw-r--r--old/moon_interface/MANIFEST.in (renamed from moon_interface/MANIFEST.in)0
-rw-r--r--old/moon_interface/README.md (renamed from moon_interface/README.md)0
-rw-r--r--old/moon_interface/moon_interface/__init__.py (renamed from moon_orchestrator/moon_orchestrator/__init__.py)2
-rw-r--r--old/moon_interface/moon_interface/__main__.py (renamed from moon_interface/moon_interface/__main__.py)0
-rw-r--r--old/moon_interface/moon_interface/api/__init__.py (renamed from python_moondb/python_moondb/migrate_repo/__init__.py)0
-rw-r--r--old/moon_interface/moon_interface/api/authz.py (renamed from moon_interface/moon_interface/api/authz.py)0
-rw-r--r--old/moon_interface/moon_interface/api/generic.py (renamed from moon_interface/moon_interface/api/generic.py)0
-rw-r--r--old/moon_interface/moon_interface/api/update.py49
-rw-r--r--old/moon_interface/moon_interface/authz_requests.py (renamed from moon_interface/moon_interface/authz_requests.py)21
-rw-r--r--old/moon_interface/moon_interface/http_server.py (renamed from moon_interface/moon_interface/http_server.py)10
-rw-r--r--old/moon_interface/moon_interface/server.py (renamed from moon_interface/moon_interface/server.py)0
-rw-r--r--old/moon_interface/requirements.txt (renamed from moon_interface/requirements.txt)0
-rw-r--r--old/moon_interface/setup.py (renamed from moon_interface/setup.py)0
-rw-r--r--old/moon_interface/tests/unit_python/api/__init__.py (renamed from python_moondb/python_moondb/migrate_repo/versions/__init__.py)0
-rw-r--r--old/moon_interface/tests/unit_python/api/test_authz.py (renamed from moon_interface/tests/unit_python/api/test_authz.py)6
-rw-r--r--old/moon_interface/tests/unit_python/conftest.py (renamed from moon_interface/tests/unit_python/conftest.py)0
-rw-r--r--old/moon_interface/tests/unit_python/requirements.txt (renamed from moon_interface/tests/unit_python/requirements.txt)0
-rw-r--r--old/moon_manager/.gitignore104
-rw-r--r--old/moon_manager/Changelog73
-rw-r--r--old/moon_manager/Dockerfile15
-rw-r--r--old/moon_manager/LICENSE (renamed from python_moondb/LICENSE)0
-rw-r--r--old/moon_manager/MANIFEST.in9
-rw-r--r--old/moon_manager/README.md8
-rw-r--r--old/moon_manager/moon_manager/__init__.py (renamed from moon_authz/moon_authz/__init__.py)2
-rw-r--r--old/moon_manager/moon_manager/__main__.py4
-rw-r--r--[-rwxr-xr-x]old/moon_manager/moon_manager/api/__init__.py (renamed from python_moondb/tests/unit_python/models/__init__.py)0
-rw-r--r--old/moon_manager/moon_manager/api/assignments.py391
-rw-r--r--old/moon_manager/moon_manager/api/base_exception.py (renamed from moon_manager/moon_manager/api/base_exception.py)3
-rw-r--r--old/moon_manager/moon_manager/api/data.py311
-rw-r--r--old/moon_manager/moon_manager/api/generic.py (renamed from moon_manager/moon_manager/api/generic.py)7
-rw-r--r--old/moon_manager/moon_manager/api/json_export.py279
-rw-r--r--old/moon_manager/moon_manager/api/json_import.py584
-rw-r--r--old/moon_manager/moon_manager/api/json_utils.py (renamed from moon_manager/moon_manager/api/json_utils.py)87
-rw-r--r--old/moon_manager/moon_manager/api/meta_data.py246
-rw-r--r--old/moon_manager/moon_manager/api/meta_rules.py152
-rw-r--r--old/moon_manager/moon_manager/api/models.py117
-rw-r--r--old/moon_manager/moon_manager/api/pdp.py214
-rw-r--r--old/moon_manager/moon_manager/api/perimeter.py375
-rw-r--r--old/moon_manager/moon_manager/api/policies.py (renamed from moon_manager/moon_manager/api/policies.py)81
-rw-r--r--old/moon_manager/moon_manager/api/rules.py135
-rw-r--r--old/moon_manager/moon_manager/api/slaves.py (renamed from moon_manager/moon_manager/api/slaves.py)17
-rw-r--r--old/moon_manager/moon_manager/http_server.py (renamed from moon_manager/moon_manager/http_server.py)13
-rw-r--r--old/moon_manager/moon_manager/server.py39
-rw-r--r--old/moon_manager/requirements.txt5
-rw-r--r--old/moon_manager/setup.py47
-rw-r--r--old/moon_manager/tests/functional_pod/conftest.py (renamed from moon_manager/tests/functional_pod/conftest.py)0
-rw-r--r--old/moon_manager/tests/functional_pod/json/mls.json (renamed from moon_manager/tests/functional_pod/json/mls.json)0
-rw-r--r--old/moon_manager/tests/functional_pod/json/rbac.json (renamed from moon_manager/tests/functional_pod/json/rbac.json)0
-rw-r--r--old/moon_manager/tests/functional_pod/run_functional_tests.sh (renamed from moon_manager/tests/functional_pod/run_functional_tests.sh)0
-rw-r--r--old/moon_manager/tests/functional_pod/test_manager.py (renamed from moon_manager/tests/functional_pod/test_manager.py)0
-rw-r--r--old/moon_manager/tests/functional_pod/test_models.py (renamed from moon_manager/tests/functional_pod/test_models.py)0
-rw-r--r--old/moon_manager/tests/unit_python/api/import_export_utilities.py (renamed from moon_manager/tests/unit_python/api/import_export_utilities.py)93
-rw-r--r--old/moon_manager/tests/unit_python/api/meta_data_test.py (renamed from moon_manager/tests/unit_python/api/meta_data_test.py)42
-rw-r--r--old/moon_manager/tests/unit_python/api/meta_rules_test.py162
-rw-r--r--old/moon_manager/tests/unit_python/api/test_assignement.py280
-rw-r--r--old/moon_manager/tests/unit_python/api/test_assignemnt.py270
-rw-r--r--old/moon_manager/tests/unit_python/api/test_data.py239
-rw-r--r--old/moon_manager/tests/unit_python/api/test_export.py (renamed from moon_manager/tests/unit_python/api/test_export.py)40
-rw-r--r--old/moon_manager/tests/unit_python/api/test_import.py (renamed from moon_manager/tests/unit_python/api/test_import.py)98
-rw-r--r--old/moon_manager/tests/unit_python/api/test_meta_data.py305
-rw-r--r--old/moon_manager/tests/unit_python/api/test_meta_rules.py415
-rw-r--r--old/moon_manager/tests/unit_python/api/test_pdp.py164
-rw-r--r--old/moon_manager/tests/unit_python/api/test_perimeter.py1028
-rw-r--r--old/moon_manager/tests/unit_python/api/test_policies.py342
-rw-r--r--old/moon_manager/tests/unit_python/api/test_rules.py129
-rw-r--r--old/moon_manager/tests/unit_python/api/test_unit_models.py352
-rw-r--r--old/moon_manager/tests/unit_python/api/utilities.py26
-rw-r--r--old/moon_manager/tests/unit_python/conftest.py254
-rw-r--r--old/moon_manager/tests/unit_python/helpers/__init__.py (renamed from python_moondb/tests/unit_python/policies/__init__.py)0
-rw-r--r--old/moon_manager/tests/unit_python/helpers/assignment_helper.py49
-rw-r--r--old/moon_manager/tests/unit_python/helpers/category_helper.py40
-rw-r--r--old/moon_manager/tests/unit_python/helpers/data_builder.py260
-rw-r--r--old/moon_manager/tests/unit_python/helpers/data_helper.py99
-rw-r--r--old/moon_manager/tests/unit_python/helpers/meta_rule_helper.py49
-rw-r--r--old/moon_manager/tests/unit_python/helpers/model_helper.py48
-rw-r--r--old/moon_manager/tests/unit_python/helpers/pdp_helper.py23
-rw-r--r--old/moon_manager/tests/unit_python/helpers/policy_helper.py63
-rw-r--r--old/moon_manager/tests/unit_python/requirements.txt5
-rw-r--r--old/moon_orchestrator/Changelog (renamed from moon_orchestrator/Changelog)7
-rw-r--r--old/moon_orchestrator/Dockerfile15
-rw-r--r--old/moon_orchestrator/LICENSE (renamed from python_moonutilities/LICENSE)0
-rw-r--r--old/moon_orchestrator/MANIFEST.in (renamed from moon_orchestrator/MANIFEST.in)0
-rw-r--r--old/moon_orchestrator/README.md (renamed from moon_orchestrator/README.md)0
-rw-r--r--old/moon_orchestrator/moon_orchestrator/__init__.py (renamed from moon_interface/moon_interface/__init__.py)2
-rw-r--r--old/moon_orchestrator/moon_orchestrator/__main__.py (renamed from moon_orchestrator/moon_orchestrator/__main__.py)0
-rw-r--r--old/moon_orchestrator/moon_orchestrator/api/__init__.py0
-rw-r--r--old/moon_orchestrator/moon_orchestrator/api/generic.py (renamed from moon_orchestrator/moon_orchestrator/api/generic.py)7
-rw-r--r--old/moon_orchestrator/moon_orchestrator/api/pods.py (renamed from moon_orchestrator/moon_orchestrator/api/pods.py)38
-rw-r--r--old/moon_orchestrator/moon_orchestrator/api/slaves.py (renamed from moon_orchestrator/moon_orchestrator/api/slaves.py)0
-rw-r--r--old/moon_orchestrator/moon_orchestrator/drivers.py (renamed from moon_orchestrator/moon_orchestrator/drivers.py)30
-rw-r--r--old/moon_orchestrator/moon_orchestrator/http_server.py (renamed from moon_orchestrator/moon_orchestrator/http_server.py)7
-rw-r--r--old/moon_orchestrator/moon_orchestrator/server.py (renamed from moon_orchestrator/moon_orchestrator/server.py)0
-rw-r--r--old/moon_orchestrator/requirements.txt (renamed from moon_orchestrator/requirements.txt)0
-rw-r--r--old/moon_orchestrator/setup.py (renamed from moon_orchestrator/setup.py)0
-rw-r--r--old/moon_orchestrator/tests/unit_python/conftest.py (renamed from moon_orchestrator/tests/unit_python/conftest.py)0
-rw-r--r--old/moon_orchestrator/tests/unit_python/mock_pods.py (renamed from moon_orchestrator/tests/unit_python/mock_pods.py)13
-rw-r--r--old/moon_orchestrator/tests/unit_python/requirements.txt (renamed from moon_orchestrator/tests/unit_python/requirements.txt)0
-rw-r--r--old/moon_orchestrator/tests/unit_python/test_pods.py287
-rw-r--r--old/moon_orchestrator/tests/unit_python/test_slaves.py (renamed from moon_orchestrator/tests/unit_python/test_slaves.py)0
-rw-r--r--old/moon_orchestrator/tests/unit_python/utilities.py (renamed from moon_orchestrator/tests/unit_python/utilities.py)0
-rw-r--r--old/moon_pythonfunctest/Dockerfile (renamed from moon_pythonfunctest/Dockerfile)0
-rw-r--r--old/moon_pythonfunctest/README.md (renamed from moon_pythonfunctest/README.md)0
-rwxr-xr-xold/moon_pythonfunctest/run_func_test.sh (renamed from moon_pythonfunctest/run_func_test.sh)0
-rw-r--r--old/moon_pythonunittest/Dockerfile (renamed from moon_pythonunittest/Dockerfile)0
-rw-r--r--old/moon_pythonunittest/README.md (renamed from moon_pythonunittest/README.md)0
-rw-r--r--old/moon_pythonunittest/requirements.txt (renamed from moon_pythonunittest/requirements.txt)0
-rw-r--r--old/moon_pythonunittest/run_tests.sh (renamed from moon_pythonunittest/run_tests.sh)0
-rw-r--r--old/moon_wrapper/Changelog (renamed from moon_wrapper/Changelog)19
-rw-r--r--old/moon_wrapper/Dockerfile15
-rw-r--r--old/moon_wrapper/LICENSE202
-rw-r--r--old/moon_wrapper/MANIFEST.in9
-rw-r--r--old/moon_wrapper/README.md (renamed from moon_wrapper/README.md)0
-rw-r--r--old/moon_wrapper/moon_wrapper/__init__.py6
-rw-r--r--old/moon_wrapper/moon_wrapper/__main__.py (renamed from moon_wrapper/moon_wrapper/__main__.py)4
-rw-r--r--old/moon_wrapper/moon_wrapper/api/__init__.py0
-rw-r--r--old/moon_wrapper/moon_wrapper/api/generic.py (renamed from moon_wrapper/moon_wrapper/api/generic.py)17
-rw-r--r--old/moon_wrapper/moon_wrapper/api/oslowrapper.py (renamed from moon_wrapper/moon_wrapper/api/oslowrapper.py)41
-rw-r--r--old/moon_wrapper/moon_wrapper/api/slaveupdate.py87
-rw-r--r--old/moon_wrapper/moon_wrapper/http_server.py (renamed from moon_wrapper/moon_wrapper/http_server.py)16
-rw-r--r--old/moon_wrapper/moon_wrapper/server.py (renamed from moon_wrapper/moon_wrapper/server.py)4
-rw-r--r--old/moon_wrapper/requirements.txt (renamed from moon_wrapper/requirements.txt)0
-rw-r--r--old/moon_wrapper/setup.py (renamed from moon_wrapper/setup.py)0
-rw-r--r--old/moon_wrapper/tests/README.md (renamed from moon_wrapper/tests/README.md)0
-rw-r--r--old/moon_wrapper/tests/unit_python/api/__init__.py0
-rw-r--r--old/moon_wrapper/tests/unit_python/api/test_wrapper.py (renamed from moon_wrapper/tests/unit_python/api/test_wrapper.py)0
-rw-r--r--old/moon_wrapper/tests/unit_python/conftest.py (renamed from moon_wrapper/tests/unit_python/conftest.py)10
-rw-r--r--old/moon_wrapper/tests/unit_python/requirements.txt (renamed from moon_wrapper/tests/unit_python/requirements.txt)0
-rw-r--r--old/python_moonclient/.gitignore106
-rw-r--r--old/python_moonclient/Changelog (renamed from python_moonclient/Changelog)8
-rw-r--r--old/python_moonclient/LICENSE202
-rw-r--r--old/python_moonclient/MANIFEST.in (renamed from python_moonclient/MANIFEST.in)0
-rw-r--r--old/python_moonclient/README.md (renamed from python_moonclient/README.md)0
-rw-r--r--old/python_moonclient/python_moonclient/__init__.py6
-rw-r--r--old/python_moonclient/python_moonclient/cli/__init__.py0
-rw-r--r--old/python_moonclient/python_moonclient/cli/authz.py (renamed from python_moonclient/python_moonclient/cli/authz.py)14
-rw-r--r--old/python_moonclient/python_moonclient/cli/export.py (renamed from python_moonclient/python_moonclient/cli/export.py)4
-rw-r--r--old/python_moonclient/python_moonclient/cli/import.py (renamed from python_moonclient/python_moonclient/cli/import.py)3
-rw-r--r--old/python_moonclient/python_moonclient/cli/models.py (renamed from python_moonclient/python_moonclient/cli/models.py)14
-rw-r--r--old/python_moonclient/python_moonclient/cli/parser.py (renamed from python_moonclient/python_moonclient/cli/parser.py)19
-rw-r--r--old/python_moonclient/python_moonclient/cli/pdps.py (renamed from python_moonclient/python_moonclient/cli/pdps.py)64
-rw-r--r--old/python_moonclient/python_moonclient/cli/policies.py (renamed from python_moonclient/python_moonclient/cli/policies.py)90
-rw-r--r--old/python_moonclient/python_moonclient/cli/projects.py (renamed from python_moonclient/python_moonclient/cli/projects.py)18
-rw-r--r--old/python_moonclient/python_moonclient/cli/slaves.py (renamed from python_moonclient/python_moonclient/cli/slaves.py)20
-rw-r--r--old/python_moonclient/python_moonclient/core/__init__.py0
-rw-r--r--old/python_moonclient/python_moonclient/core/authz.py (renamed from python_moonclient/python_moonclient/core/authz.py)64
-rw-r--r--old/python_moonclient/python_moonclient/core/check_tools.py (renamed from python_moonclient/python_moonclient/core/check_tools.py)127
-rw-r--r--old/python_moonclient/python_moonclient/core/cli_exceptions.py (renamed from python_moonclient/python_moonclient/core/cli_exceptions.py)3
-rw-r--r--old/python_moonclient/python_moonclient/core/config.py (renamed from python_moonclient/python_moonclient/core/config.py)28
-rw-r--r--old/python_moonclient/python_moonclient/core/json_export.py (renamed from python_moonclient/python_moonclient/core/json_export.py)8
-rw-r--r--old/python_moonclient/python_moonclient/core/json_import.py (renamed from python_moonclient/python_moonclient/core/json_import.py)8
-rw-r--r--old/python_moonclient/python_moonclient/core/models.py (renamed from python_moonclient/python_moonclient/core/models.py)17
-rw-r--r--old/python_moonclient/python_moonclient/core/pdp.py (renamed from python_moonclient/python_moonclient/core/pdp.py)41
-rw-r--r--old/python_moonclient/python_moonclient/core/policies.py (renamed from python_moonclient/python_moonclient/core/policies.py)107
-rw-r--r--old/python_moonclient/python_moonclient/core/slaves.py (renamed from python_moonclient/python_moonclient/core/slaves.py)21
-rw-r--r--old/python_moonclient/python_moonclient/moon.py37
-rw-r--r--old/python_moonclient/requirements.txt (renamed from python_moonclient/requirements.txt)0
-rw-r--r--old/python_moonclient/setup.py (renamed from python_moonclient/setup.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/__init__.py0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_action_assignments.py (renamed from python_moonclient/tests/unit_python/conf/conf_action_assignments.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_action_categories.py (renamed from python_moonclient/tests/unit_python/conf/conf_action_categories.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_action_data.py (renamed from python_moonclient/tests/unit_python/conf/conf_action_data.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_actions.py (renamed from python_moonclient/tests/unit_python/conf/conf_actions.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_all.py (renamed from python_moonclient/tests/unit_python/conf/conf_all.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_meta_rules.py (renamed from python_moonclient/tests/unit_python/conf/conf_meta_rules.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_models.py (renamed from python_moonclient/tests/unit_python/conf/conf_models.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_object_assignments.py (renamed from python_moonclient/tests/unit_python/conf/conf_object_assignments.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_object_categories.py (renamed from python_moonclient/tests/unit_python/conf/conf_object_categories.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_object_data.py (renamed from python_moonclient/tests/unit_python/conf/conf_object_data.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_objects.py (renamed from python_moonclient/tests/unit_python/conf/conf_objects.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_pdps.py (renamed from python_moonclient/tests/unit_python/conf/conf_pdps.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_policies.py (renamed from python_moonclient/tests/unit_python/conf/conf_policies.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_projects.py (renamed from python_moonclient/tests/unit_python/conf/conf_projects.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_rules.py (renamed from python_moonclient/tests/unit_python/conf/conf_rules.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_subject_assignments.py (renamed from python_moonclient/tests/unit_python/conf/conf_subject_assignments.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_subject_categories.py (renamed from python_moonclient/tests/unit_python/conf/conf_subject_categories.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_subject_data.py (renamed from python_moonclient/tests/unit_python/conf/conf_subject_data.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conf/conf_subjects.py (renamed from python_moonclient/tests/unit_python/conf/conf_subjects.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/conftest.py (renamed from python_moonclient/tests/unit_python/conftest.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/mock_config.py (renamed from python_moonclient/tests/unit_python/mock_config.py)26
-rw-r--r--old/python_moonclient/tests/unit_python/requirements.txt (renamed from python_moonclient/tests/unit_python/requirements.txt)0
-rw-r--r--old/python_moonclient/tests/unit_python/test_config.py (renamed from python_moonclient/tests/unit_python/test_config.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/test_models.py (renamed from python_moonclient/tests/unit_python/test_models.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/test_pdp.py (renamed from python_moonclient/tests/unit_python/test_pdp.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/test_policies.py (renamed from python_moonclient/tests/unit_python/test_policies.py)0
-rw-r--r--old/python_moonclient/tests/unit_python/utilities.py (renamed from python_moonclient/tests/unit_python/utilities.py)0
-rw-r--r--old/python_moondb/.gitignore106
-rw-r--r--old/python_moondb/Changelog (renamed from python_moondb/Changelog)57
-rw-r--r--old/python_moondb/LICENSE202
-rw-r--r--old/python_moondb/MANIFEST.in (renamed from python_moondb/MANIFEST.in)0
-rw-r--r--old/python_moondb/README.md (renamed from python_moondb/README.md)0
-rw-r--r--old/python_moondb/bin/drop_tables.sql (renamed from python_moondb/bin/drop_tables.sql)0
-rw-r--r--old/python_moondb/python_moondb/__init__.py6
-rw-r--r--old/python_moondb/python_moondb/api/__init__.py0
-rw-r--r--old/python_moondb/python_moondb/api/keystone.py (renamed from python_moondb/python_moondb/api/keystone.py)1
-rw-r--r--old/python_moondb/python_moondb/api/managers.py (renamed from python_moondb/python_moondb/api/managers.py)1
-rw-r--r--old/python_moondb/python_moondb/api/model.py338
-rw-r--r--old/python_moondb/python_moondb/api/pdp.py (renamed from python_moondb/python_moondb/api/pdp.py)8
-rw-r--r--old/python_moondb/python_moondb/api/policy.py751
-rw-r--r--old/python_moondb/python_moondb/backends/__init__.py (renamed from python_moondb/python_moondb/backends/__init__.py)3
-rw-r--r--old/python_moondb/python_moondb/backends/sql.py (renamed from python_moondb/python_moondb/backends/sql.py)551
-rw-r--r--old/python_moondb/python_moondb/core.py (renamed from python_moondb/python_moondb/core.py)2
-rw-r--r--old/python_moondb/python_moondb/db_manager.py (renamed from python_moondb/python_moondb/db_manager.py)0
-rw-r--r--old/python_moondb/python_moondb/migrate_repo/__init__.py0
-rw-r--r--old/python_moondb/python_moondb/migrate_repo/versions/001_moon.py (renamed from python_moondb/python_moondb/migrate_repo/versions/001_moon.py)103
-rw-r--r--old/python_moondb/python_moondb/migrate_repo/versions/__init__.py0
-rw-r--r--old/python_moondb/requirements.txt (renamed from python_moondb/requirements.txt)0
-rw-r--r--old/python_moondb/setup.py (renamed from python_moondb/setup.py)0
-rw-r--r--old/python_moondb/tests/unit_python/conftest.py (renamed from python_moondb/tests/unit_python/conftest.py)0
-rw-r--r--old/python_moondb/tests/unit_python/helpers/__init__.py0
-rw-r--r--old/python_moondb/tests/unit_python/helpers/assignment_helper.py49
-rw-r--r--old/python_moondb/tests/unit_python/helpers/category_helper.py54
-rw-r--r--old/python_moondb/tests/unit_python/helpers/data_helper.py98
-rw-r--r--old/python_moondb/tests/unit_python/helpers/meta_rule_helper.py48
-rw-r--r--old/python_moondb/tests/unit_python/helpers/mock_data.py156
-rw-r--r--old/python_moondb/tests/unit_python/helpers/model_helper.py47
-rw-r--r--old/python_moondb/tests/unit_python/helpers/pdp_helper.py23
-rw-r--r--old/python_moondb/tests/unit_python/helpers/policy_helper.py72
-rw-r--r--old/python_moondb/tests/unit_python/mock_components.py (renamed from python_moondb/tests/unit_python/mock_components.py)0
-rw-r--r--old/python_moondb/tests/unit_python/mock_keystone.py (renamed from python_moondb/tests/unit_python/mock_keystone.py)0
-rwxr-xr-xold/python_moondb/tests/unit_python/models/__init__.py0
-rw-r--r--old/python_moondb/tests/unit_python/models/test_categories.py111
-rw-r--r--old/python_moondb/tests/unit_python/models/test_meta_rules.py403
-rw-r--r--old/python_moondb/tests/unit_python/models/test_models.py622
-rw-r--r--old/python_moondb/tests/unit_python/policies/__init__.py0
-rw-r--r--old/python_moondb/tests/unit_python/policies/mock_data.py74
-rwxr-xr-xold/python_moondb/tests/unit_python/policies/test_assignments.py235
-rwxr-xr-xold/python_moondb/tests/unit_python/policies/test_data.py707
-rwxr-xr-xold/python_moondb/tests/unit_python/policies/test_policies.py643
-rw-r--r--old/python_moondb/tests/unit_python/requirements.txt (renamed from python_moondb/tests/unit_python/requirements.txt)3
-rw-r--r--old/python_moondb/tests/unit_python/test_keystone.py (renamed from python_moondb/tests/unit_python/test_keystone.py)0
-rwxr-xr-xold/python_moondb/tests/unit_python/test_pdp.py149
-rw-r--r--old/python_moondb/tests/unit_python/utilities.py (renamed from python_moondb/tests/unit_python/utilities.py)0
-rw-r--r--old/python_moonutilities/.gitignore105
-rw-r--r--old/python_moonutilities/Changelog (renamed from python_moonutilities/Changelog)67
-rw-r--r--old/python_moonutilities/Jenkinsfile10
-rw-r--r--old/python_moonutilities/LICENSE202
-rw-r--r--old/python_moonutilities/MANIFEST.in (renamed from python_moonutilities/MANIFEST.in)0
-rw-r--r--old/python_moonutilities/README.md (renamed from python_moonutilities/README.md)0
-rw-r--r--old/python_moonutilities/python_moonutilities/__init__.py6
-rw-r--r--old/python_moonutilities/python_moonutilities/cache.py (renamed from python_moonutilities/python_moonutilities/cache.py)32
-rw-r--r--old/python_moonutilities/python_moonutilities/configuration.py (renamed from python_moonutilities/python_moonutilities/configuration.py)0
-rw-r--r--old/python_moonutilities/python_moonutilities/context.py (renamed from python_moonutilities/python_moonutilities/context.py)81
-rw-r--r--old/python_moonutilities/python_moonutilities/exceptions.py (renamed from python_moonutilities/python_moonutilities/exceptions.py)256
-rw-r--r--old/python_moonutilities/python_moonutilities/misc.py (renamed from python_moonutilities/python_moonutilities/misc.py)0
-rw-r--r--old/python_moonutilities/python_moonutilities/request_wrapper.py (renamed from python_moonutilities/python_moonutilities/request_wrapper.py)0
-rw-r--r--old/python_moonutilities/python_moonutilities/security_functions.py (renamed from python_moonutilities/python_moonutilities/security_functions.py)107
-rw-r--r--old/python_moonutilities/requirements.txt (renamed from python_moonutilities/requirements.txt)0
-rw-r--r--old/python_moonutilities/setup.py (renamed from python_moonutilities/setup.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/conftest.py (renamed from python_moonutilities/tests/unit_python/conftest.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/mock_repo/__init__.py (renamed from python_moonutilities/tests/unit_python/mock_repo/__init__.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/mock_repo/components_utilities.py (renamed from python_moonutilities/tests/unit_python/mock_repo/components_utilities.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/mock_repo/data.py (renamed from python_moonutilities/tests/unit_python/mock_repo/data.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/mock_repo/urls.py (renamed from python_moonutilities/tests/unit_python/mock_repo/urls.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/requirements.txt1
-rw-r--r--old/python_moonutilities/tests/unit_python/test_cache.py (renamed from python_moonutilities/tests/unit_python/test_cache.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/test_configuration.py (renamed from python_moonutilities/tests/unit_python/test_configuration.py)0
-rw-r--r--old/python_moonutilities/tests/unit_python/test_validated_input.py154
-rw-r--r--old/tests/functional/README.md (renamed from tests/functional/README.md)0
-rwxr-xr-xold/tests/functional/run_tests.sh18
-rw-r--r--old/tests/functional/run_tests_for_component.sh (renamed from tests/functional/run_tests_for_component.sh)0
-rw-r--r--old/tests/functional/scenario_available/delegation.py (renamed from tests/functional/scenario_available/delegation.py)0
-rw-r--r--old/tests/functional/scenario_available/mls.py (renamed from tests/functional/scenario_available/mls.py)0
-rw-r--r--old/tests/functional/scenario_available/rbac.py (renamed from tests/functional/scenario_available/rbac.py)0
-rw-r--r--old/tests/functional/scenario_available/rbac_custom_100.py (renamed from tests/functional/scenario_available/rbac_custom_100.py)0
-rw-r--r--old/tests/functional/scenario_available/rbac_custom_1000.py (renamed from tests/functional/scenario_available/rbac_custom_1000.py)0
-rw-r--r--old/tests/functional/scenario_available/rbac_custom_50.py (renamed from tests/functional/scenario_available/rbac_custom_50.py)0
-rw-r--r--old/tests/functional/scenario_available/rbac_large.py (renamed from tests/functional/scenario_available/rbac_large.py)0
-rw-r--r--old/tests/functional/scenario_available/rbac_mls.py (renamed from tests/functional/scenario_available/rbac_mls.py)0
-rw-r--r--old/tests/functional/scenario_available/session.py (renamed from tests/functional/scenario_available/session.py)0
-rw-r--r--old/tests/functional/scenario_available/session_large.py (renamed from tests/functional/scenario_available/session_large.py)0
l---------old/tests/functional/scenario_enabled/mls.py (renamed from tests/functional/scenario_enabled/mls.py)0
l---------old/tests/functional/scenario_enabled/rbac.py (renamed from tests/functional/scenario_enabled/rbac.py)0
-rw-r--r--old/tests/functional/scenario_tests/mls.py (renamed from tests/functional/scenario_tests/mls.py)0
-rw-r--r--old/tests/functional/scenario_tests/rbac.py (renamed from tests/functional/scenario_tests/rbac.py)0
-rw-r--r--old/tests/performance/README.md (renamed from tests/performance/README.md)0
-rw-r--r--old/tests/python_unit/README.md (renamed from tests/python_unit/README.md)0
-rw-r--r--old/tests/python_unit/run_tests.sh (renamed from tests/python_unit/run_tests.sh)0
-rw-r--r--old/tools/bin/README.md (renamed from tools/bin/README.md)0
-rw-r--r--old/tools/bin/api2rst.py (renamed from tools/bin/api2rst.py)0
-rw-r--r--old/tools/bin/bootstrap.py (renamed from tools/bin/bootstrap.py)0
-rw-r--r--old/tools/bin/build_all.sh (renamed from tools/bin/build_all.sh)0
-rw-r--r--old/tools/bin/build_all_pip.sh (renamed from tools/bin/build_all_pip.sh)0
-rw-r--r--old/tools/bin/delete_orchestrator.sh (renamed from tools/bin/delete_orchestrator.sh)0
-rw-r--r--old/tools/bin/get_keystone_token.py (renamed from tools/bin/get_keystone_token.py)0
-rw-r--r--old/tools/bin/moon_lib_upload.sh (renamed from tools/bin/moon_lib_upload.sh)0
-rw-r--r--old/tools/bin/set_auth.src (renamed from tools/bin/set_auth.src)0
-rwxr-xr-xold/tools/bin/start.sh (renamed from tools/bin/start.sh)0
-rw-r--r--old/tools/moon_jenkins/Dockerfile (renamed from tools/moon_jenkins/Dockerfile)0
-rw-r--r--old/tools/moon_jenkins/README.md (renamed from tools/moon_jenkins/README.md)0
-rw-r--r--old/tools/moon_jenkins/docker-compose.yml (renamed from tools/moon_jenkins/docker-compose.yml)0
-rw-r--r--old/tools/moon_jenkins/images/Create Multibranch Pipeline.png (renamed from tools/moon_jenkins/images/Create Multibranch Pipeline.png)bin55639 -> 55639 bytes
-rw-r--r--old/tools/moon_jenkins/images/Git Source Multibranch Pipeline.png (renamed from tools/moon_jenkins/images/Git Source Multibranch Pipeline.png)bin31054 -> 31054 bytes
-rw-r--r--old/tools/moon_jenkins/images/Multibranch Pipeline Log.png (renamed from tools/moon_jenkins/images/Multibranch Pipeline Log.png)bin55231 -> 55231 bytes
-rw-r--r--old/tools/moon_jenkins/images/Select Source Multibranch Pipeline.png (renamed from tools/moon_jenkins/images/Select Source Multibranch Pipeline.png)bin23375 -> 23375 bytes
-rw-r--r--old/tools/moon_jenkins/plugins.txt (renamed from tools/moon_jenkins/plugins.txt)0
-rw-r--r--old/tools/moon_jenkins/security.groovy (renamed from tools/moon_jenkins/security.groovy)0
-rw-r--r--old/tools/moon_keystone/Dockerfile (renamed from tools/moon_keystone/Dockerfile)0
-rw-r--r--old/tools/moon_keystone/README.md (renamed from tools/moon_keystone/README.md)0
-rw-r--r--old/tools/moon_keystone/run.sh (renamed from tools/moon_keystone/run.sh)0
-rw-r--r--old/tools/moon_kubernetes/README.md (renamed from tools/moon_kubernetes/README.md)0
-rw-r--r--old/tools/moon_kubernetes/conf/moon.conf (renamed from tools/moon_kubernetes/conf/moon.conf)0
-rw-r--r--old/tools/moon_kubernetes/conf/password_moon.txt (renamed from tools/moon_kubernetes/conf/password_moon.txt)0
-rw-r--r--old/tools/moon_kubernetes/conf/password_root.txt (renamed from tools/moon_kubernetes/conf/password_root.txt)0
-rw-r--r--old/tools/moon_kubernetes/init_k8s_moon.sh (renamed from tools/moon_kubernetes/init_k8s_moon.sh)2
-rw-r--r--old/tools/moon_kubernetes/templates/consul.yaml (renamed from tools/moon_kubernetes/templates/consul.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/db.yaml (renamed from tools/moon_kubernetes/templates/db.yaml)2
-rw-r--r--old/tools/moon_kubernetes/templates/keystone.yaml (renamed from tools/moon_kubernetes/templates/keystone.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/kube-dns.yaml (renamed from tools/moon_kubernetes/templates/kube-dns.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/moon_forming.yaml (renamed from tools/moon_kubernetes/templates/moon_forming.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/moon_functest.yaml (renamed from tools/moon_kubernetes/templates/moon_functest.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/moon_gui.yaml (renamed from tools/moon_kubernetes/templates/moon_gui.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/moon_manager.yaml (renamed from tools/moon_kubernetes/templates/moon_manager.yaml)0
-rw-r--r--old/tools/moon_kubernetes/templates/moon_orchestrator.yaml (renamed from tools/moon_kubernetes/templates/moon_orchestrator.yaml)0
-rw-r--r--old/tools/openstack/README.md (renamed from tools/openstack/README.md)0
-rw-r--r--old/tools/openstack/glance/policy.json (renamed from tools/openstack/glance/policy.json)0
-rw-r--r--old/tools/openstack/nova/policy.json (renamed from tools/openstack/nova/policy.json)0
-rw-r--r--old/tools/policies/generate_opst_policy.py (renamed from tools/policies/generate_opst_policy.py)0
-rw-r--r--old/tools/policies/policy.json.d/cinder.policy.json104
-rw-r--r--old/tools/policies/policy.json.d/glance.policy.json63
-rw-r--r--old/tools/policies/policy.json.d/keystone.policy.json260
-rw-r--r--old/tools/policies/policy.json.d/neutron.policy.json235
-rw-r--r--old/tools/policies/policy.json.d/nova.policy.json485
-rw-r--r--python_moonclient/python_moonclient/__init__.py6
-rw-r--r--python_moonclient/python_moonclient/moon.py41
-rw-r--r--python_moondb/python_moondb/api/model.py123
-rw-r--r--python_moondb/python_moondb/api/policy.py290
-rw-r--r--python_moondb/tests/unit_python/models/test_categories.py44
-rw-r--r--python_moondb/tests/unit_python/models/test_meta_rules.py174
-rw-r--r--python_moondb/tests/unit_python/models/test_models.py178
-rw-r--r--python_moondb/tests/unit_python/policies/mock_data.py55
-rwxr-xr-xpython_moondb/tests/unit_python/policies/test_assignments.py257
-rwxr-xr-xpython_moondb/tests/unit_python/policies/test_data.py567
-rwxr-xr-xpython_moondb/tests/unit_python/policies/test_policies.py290
-rwxr-xr-xpython_moondb/tests/unit_python/test_pdp.py112
-rw-r--r--python_moonutilities/python_moonutilities/__init__.py8
-rw-r--r--python_moonutilities/tests/unit_python/requirements.txt2
-rw-r--r--tests/functional/run_tests.sh13
1053 files changed, 254570 insertions, 6131 deletions
diff --git a/INFO b/INFO
index 965671d3..d0886418 100644
--- a/INFO
+++ b/INFO
@@ -2,8 +2,8 @@ Project: Security Management Module (Moon)
Project Creation Date: 07 Mai 2015
Project Category: Collaborative Development
Lifecycle State: Incubation
-Primary Contact: ruan.he@orange.com
-Project Lead: ruan.he@orange.com
+Primary Contact: thomas.duval@orange.com
+Project Lead: thomas.duval@orange.com
Jira Project Name: Security Management Module
Jira Project Prefix: MOON
Mailing list tag: [moon]
@@ -11,18 +11,21 @@ IRC: #opnfv-moon
Repository: moon
Contributors:
-ruan.he@orange.com
+rebirthmonkey@gmail.com
jamil.chawki@orange.com
thomas.duval@orange.com
loic.lagadec@ensta-bretagne.fr
ad5939@att.com
marcel.winandy@huawei.com
pyegani@juniper.net
+jonathan.gourdin@orange.com
+rhanafy.ext@orange.com
+rfawzy.ext@orange.com
+mmagraby.ext@orange.com
+francois.cellier@orange.com
Committers:
-ruan (Linux Foundation ID) ruan.he@orange.com
asteroide (Linux Foundation ID) thomas.duval@orange.com: nomination July 3rd 2015
-WuKong (Linux Foundation ID) rebirthmonkey@gmail.com: nomination July 3rd 2015
Link to TSC approval of the project: http://meetbot.opnfv.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-05-12-13.59.html
Link(s) to approval of additional committers:
diff --git a/INFO.yaml b/INFO.yaml
new file mode 100644
index 00000000..7dcb8b6d
--- /dev/null
+++ b/INFO.yaml
@@ -0,0 +1,56 @@
+---
+project: 'Security Management Module (Moon)'
+project_creation_date: '07 Mai 2015'
+project_category: 'Collaborative Development'
+lifecycle_state: 'Incubation'
+project_lead: &opnfv_moon_ptl
+ name: 'Ruan HE'
+ email: 'ruan.he@orange.com'
+ id: 'Ruan'
+ company: 'orange.com'
+ timezone: 'Unknown'
+primary_contact: *opnfv_moon_ptl
+issue_tracking:
+ type: 'jira'
+ url: 'https://jira.opnfv.org/projects/MOON'
+ key: 'MOON'
+mailing_list:
+ type: 'mailman2'
+ url: 'opnfv-tech-discuss@lists.opnfv.org'
+ tag: '[moon]'
+realtime_discussion:
+ type: irc
+ server: 'freenode.net'
+ channel: '#opnfv-moon'
+meetings:
+ - type: 'gotomeeting+irc'
+ agenda: # eg: 'https://wiki.opnfv.org/display/'
+ url: # eg: 'https://global.gotomeeting.com/join/819733085'
+ server: 'freenode.net'
+ channel: '#opnfv-meeting'
+ repeats: 'weekly'
+ time: # eg: '16:00 UTC'
+repositories:
+ - 'moon'
+committers:
+ - <<: *opnfv_moon_ptl
+ - name: 'Marcel Winandy'
+ email: 'marcel.winandy@huawei.com'
+ company: 'huawei.com'
+ id: 'mwinandy'
+ - name: 'jamil chawki'
+ email: 'jamil.chawki@orange.com'
+ company: 'orange.com'
+ id: 'jamy'
+ - name: 'Asteroide'
+ email: 'thomas.duval@orange.com'
+ company: 'orange.com'
+ id: 'asteroide'
+ - name: 'WuKong Sun'
+ email: 'rebirthmonkey@gmail.com'
+ company: 'gmail.com'
+ id: 'WuKong'
+tsc:
+ # yamllint disable rule:line-length
+ approval: 'http//meetbot.opnfv.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-05-12-13.59.html'
+ # yamllint enable rule:line-length
diff --git a/README.md b/README.md
index 51e5077f..7dedd014 100644
--- a/README.md
+++ b/README.md
@@ -1,118 +1,207 @@
# Moon
-__Version 4.3__
+__Version 5.4__
This directory contains all the modules for running the Moon platform.
-## Platform
-### Setup
-- [Docker installation](tools/moon_kubernetes/README.md)
-- [kubeadm installation](tools/moon_kubernetes/README.md)
-- [Moon deployment](tools/moon_kubernetes/README.md)
-- [OpenStack deployment](tools/openstack/README.md)
-
-### Micro-service Architecture
-The Moon platform is composed on the following components/containers:
-- *consul*: a Consul configuration server
-- *db*: a MySQL database server
-- *keystone*: a Keystone authentication server
-- [gui](moon_gui/README.md): a Moon web interface
-- [manager](moon_manager/README.md): the Moon manager for the database
-- [orchestrator](moon_orchestrator/README.md): the Moon component that manage pods in te K8S platform
-- [wrapper](moon_wrapper/README.md): the Moon endpoint where OpenStack component connect to.
-
-
-## Manipulation
-### moon_gui
-The web access of Moon is through the URL `http://$MOON_HOST:30002` with the login and password of Keystone.
-The default login and password can be found here: `http://$MOON_HOST:30005/ui/#/dc1/kv/openstack/keystone/edit`.
-
-**WARNING: the password is in clear text, this is a known security issue.**
-
-### moon_manager
-The REST access of Moon is through `http://$MOON_HOST:30001`
-
-**WARNING: By default, no login/password will be needed because of the configuration which is in DEV mode.**
-
-For more security, update `http://$MOON_HOST:30005/ui/#/dc1/kv/openstack/keystone/edit` by modifying the `check_token` argument to `yes`
-Requests to Moon API must include a valid token taken from Keystone in the header of `X-Auth-Token`.
-
-Check if the Manager API is running with:
-```bash
-curl http://$MOON_HOST:30001
-curl http://$MOON_HOST:30001/pdp
-curl http://$MOON_HOST:30001/policies
-```
-
-The Moon platform is fully installed and configured when you have no error with the `moon_get_keystone_projects`:
-```bash
-sudo pip install python_moonclient --upgrade
-moon project list
-```
-
-### moon_wrapper
-The moon_wrapper component is used to connect OpenStack to the Moon platform.
-You need to load one wrapper before connecting OpenStack to Moon.
-First of all, get the names of all available slaves:
-```bash
-moon slave list
-```
-Select the slave you want to configure:
-```bash
-moon slave set <name_of_the_slave>
-```
-If you don't put a name here, by default, the script will use `kubernetes-admin@kubernetes`
-which is the master.
-
-If you need to unload the slave, use the following command:
-```bash
-moon slave delete <name_of_the_slave>
-```
-If you don't put a name here, by default, the script will use `kubernetes-admin@kubernetes`.
-
-### inport/export of the moon database
-Using the moon python client, it is possible to export and import the content of the moon database. The format of the file must be json. Examples of files that can be imported are found in the moon_manager package (rbac.json and mls.json)
-
-The relations between different elements of the json in made using their names. Therefore, the name acts, for now, as a unique identifier in the json files. Importing several times the same json file can lead to unexpected behavior. It is advised to import json file in an empty database.
-
-Two particular entries in the json description are used to specify the way of performing the import:
- - "mandatory": it can be true or false. This field is only valid for policies description. The policy having this field set to true, will be automatically added to the other elements of the json file that have an empty "policy" field (subject data for instance) or that have a "policies" field which does not already contain the mandatory policy name (such as subjects).
- - "override" : it can be true or false. This field is only valid for policies and models. If set to true and a policy/model with an identical name already exists in the database, it will be overwritten.
-
-
-## Tests
-- [Python Unit Test](tests/python_unit/README.md)
-- [Functional Test](tests/functional/README.md)
-
-
-## Annexe
-### Authentication
-If you configured the authentication in the Moon platform:
-```bash
-curl -i \
- -H "Content-Type: application/json" \
- -d '
-{ "auth": {
- "identity": {
- "methods": ["password"],
- "password": {
- "user": {
- "name": "admin",
- "domain": { "id": "default" },
- "password": "<set_your_password_here>"
- }
- }
- },
- "scope": {
- "project": {
- "name": "admin",
- "domain": { "id": "default" }
- }
- }
- }
-}' \
- "http://moon_hostname:30006/v3/auth/tokens" ; echo
-
-curl --header "X-Auth-Token: <token_retrieve_from_keystone>" http://moon_hostname:30001
-curl --header "X-Auth-Token: <token_retrieve_from_keystone>" http://moon_hostname:30001/pdp
-curl --header "X-Auth-Token: <token_retrieve_from_keystone>" http://moon_hostname:30001/policies
-```
+## What is Moon
+
+The Moon platform is a security policy engine with the following characteristics:
+
+* centralized (or not)
+ * Moon can centralize all authorization requests for multiple VIMs (Virtual Infrastructure Managers) at one time
+ * Moon can centralize all security policies for multiple VIMs
+ * with fully customizable security policies
+* Moon can work on RBAC (Role based Access Control) policies or MLS (Multi Layer Security) policies
+ * Moon can also create and use a new custom policy
+* with a user centric management
+ * The end user (administrator of the VIM) is able to generate his/her own policies and manage them
+
+The Moon platform can also be a security orchestrator which can:
+
+* dynamically assign and manage policies
+* integrate OpenStack and OpenDaylight
+* theorically integrate more systems (like VIMs, IoT, ...)
+
+If you want to install the platform see [here](moon_manager/README.md)
+
+## Software Architecture
+
+Moon platform is composed on several API servers written in Python. Those servers can be installed on a bare metal system or on Docker, Kubernetes, OpenStack, ...
+
+The communication between those servers is done by classic client/server connections (HTTP REST API) so the different components can be located on different and non homogenous systems.
+
+The Moon platform is build on a plugins architecture so it is easy to customize the platform.
+
+## Deployment Architecture
+
+Moon is based on "Control Plane" and "Data Plane". The "Control Plane" manages the security policies, The "Data Plane" applies those policies.
+
+![Moon planes](/docs/img/moon_planes.png)
+
+Each project on a VIM will be connected to a specific PDP (Policy Decision Point) which is the main and the only entry point for this project.
+
+The Moon "Control Plane" and "Data Planes" can be theoretically located everywhere as shown in the figure below:
+
+![Moon planes overview](/docs/img/moon_planes2.png)
+
+A "Data plane" could be located:
+
+* in the same server as the "Control plane"
+* in a totally different server
+* in a virtual machine in an OpenStack VIM
+* in a different server managing 2 different OpenStack
+
+## Data Models
+
+### Introduction
+
+The Moon data model is based on a ABAC policy model (Attribute Based Access Control) which allow us to modeling every security policies.
+
+When a connect like OpenStack need an authorization response, it sends to Moon a request with 3 elements (plus the project ID):
+
+* the subject ID (user who do the action)
+* the object ID (object which is the destination of the action)
+* the action ID (action done by the user on the object)
+
+For example, the "admin" (subject) wants to "start" (action) a specific virtual machine (object).
+
+In the Moon data model, those elements are called "perimeter" elements.
+
+To be able to write rules for authorization requests, the Moon data model uses 3 other elements, called "data".
+
+For example, the role "admin" (subject) can do the action "start" (action) on a specific virtual machine (object).
+
+The Moon data model objective is to 'map' perimeter elements with data elements given a specific data model.
+
+![Moon data model](/docs/img/data_model.png)
+
+
+### Examples
+
+#### OpenStack
+
+For example, the RBAC policy of OpenStack can be modeling with the following model:
+
+* a user (perimeter subject) is mapped to a specific role (data subject)
+* an virtual machine (perimeter object) is mapped to a specific ID (data object)
+* an action, like "start a virtual machine" (perimeter action) is mapped to a specific ID (data action)
+
+#### Multi Layer Security
+
+The confidential defense, secret defense, ... policy (which are security level) could be modeling with a MLS policy like this:
+
+* a user (perimeter subject) is linked to a specific security level (data subject)
+* an virtual machine (perimeter object) is linked to a specific security level (data object)
+* an action, like "start a virtual machine" (perimeter action) is linked to a specific ID (data action)
+
+#### A more complex example
+
+The Moon data model can be used to create more complex policies. For example, you need to set a different role for your users and you need also to tag them with a security level (high, medium and low). You also need to reduce the number of OpenStack commands to manage. At last, you need to reduce the number of managed objects and you want to tag each object with a security level. The model can be created with the following meta rule:
+
+* the user name is linked to a role and to a security level
+* the object ID is linked to a security level
+* the action name is linked to a type of action
+
+Here are some examples of data we can have in the perimeter items:
+
+* subject: user_1, user_2, ...
+* object: vm_1, vm_2, all_vm, glance_image_1, network_id1, ...
+* action: compute:create, image_list, network::list, ...
+
+Here are some examples of data we can have in the data items
+
+* subject, role: admin, user, readonly, ...
+* subject, security level: high, low
+* object, security level: high, low
+* action, type of action: nova_read, nova_write, glance_read, glance_write, neutron_read, ...
+
+Linking perimeter with data is essential, in this example, we can have such assignments:
+
+* subject, role: user_1 → admin
+* subject, security level: user_1 → high
+* subject, role: user_2 → admin
+* subject, security level: user_1 → low
+* object, security level: vm_1 → high
+* object, security level: vm_2 → low
+* object, security level: all_vm → low
+* object, security level: glance_image_1 → low
+* action, type of action: compute:create → nova_write
+* action, type of action: image_list → glance_read
+* action, type of action: network::list → neutron_read
+
+At last, here are some examples of rules:
+
+* (admin, high), (high), (nova_read)
+* (admin, high), (high), (nova_write)
+* (admin, low), (high), (nova_read)
+* (admin, low), (low), (nova_read)
+* (admin, low), (low), (nova_write)
+* ...
+
+## Components
+
+The Moon platform is composed on 3 components:
+
+* Manager
+* Engine/Wrapper
+* Engine/Pipeline
+
+The first one can be considered as the master and the latest ones as slaves. Each components is a micro-service and is independent from other components.
+
+![Moon components](/docs/img/components.png)
+
+As shown in the previous diagram, the Manager manages several wrappers which can themselves manage several pipelines.
+
+A more complete architecture applied for OpenStack can be this figure:
+
+![Moon architecture](/docs/img/architecture.png)
+
+
+### Manager
+
+The manager is responsible of managing (read, write, delete) all data in the platform. It is connected to the main database (SQLite, MySQL, ...) and is the entry point for every requests concerning data inside the platform.
+
+### Engine/Wrapper
+
+The Wrapper is the entry point for the Manager to the slaves.
+
+The main objective of the wrapper is to route every requests from the Manager or from the outside connector (like OpenStack, OpenDaylight, ...) to the correct Pipeline.
+
+### Engine/Pipeline
+
+The Pipeline contains the effective authorization engine of the Moon platform, if needed, it can work on its own without the need to contact the Manager. A user/developer can only use the engine if he/she doesn't need the whole Moon framework.
+
+The Pipeline listen to requests from its dedicated wrapper or from outside connector, compute the result and send it back.
+
+### Open Sourced
+
+For the Open Source community, we released the following elements:
+
+* a security policy engine
+* a driver for
+ * OpenStack
+ * OpenDaylight
+* a hook in Oslo_Policy (to be able to connect to external PDP)
+* a web GUI integrated in the official OpenStack dashboard: Horizon
+
+## Industrialization
+
+Since 2018, a big effort has been done to transform the platform for industrialization requirements:
+
+* Continuous integration with Gitlab-CI
+* Project management with Jira
+* Documentation management with Confluence
+
+## Team
+
+Actually the team is composed of:
+
+* Administrative project leader: Philippe Calvez & Sok-Yen Loui (Orange)
+* Technical project leader: Christophe Le Toquin (Orange)
+* Consultant : Thomas Duval (Orange)
+* Developpers:
+ * Dimitri Darthenay (Orange)
+ * Gregory Quere (Orange)
+
+The Egypt team contract ended in march/april 2019.
+
diff --git a/dashboard/.gitignore b/dashboard/.gitignore
new file mode 100644
index 00000000..a0dddc6f
--- /dev/null
+++ b/dashboard/.gitignore
@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/dashboard/README.md b/dashboard/README.md
new file mode 100644
index 00000000..f4c095eb
--- /dev/null
+++ b/dashboard/README.md
@@ -0,0 +1,35 @@
+# Moon Dashboard
+
+To build project, yarn is necessary : https://yarnpkg.com/
+
+This project uses Vuejs framework : https://vuejs.org/
+
+This project uses Orange Boosted for styles : https://boosted.orange.com/
+
+
+## Project setup
+```
+yarn install
+```
+Install all dependencies.
+
+### Compiles and hot-reloads for development
+```
+yarn run serve
+```
+Follow instruction in console to test this project in development mode.
+
+### Compiles and minifies for production
+```
+yarn run build
+```
+All generated files are in dist folder, this folder can be copied to be served directly by server.
+
+
+### Configuration
+Configuration are in src/config.js file.
+Define Moon Manager server URL.
+
+
+### TODO
+- test of services (see ../www/moon/services/*.spec.js for the old versions)
diff --git a/dashboard/babel.config.js b/dashboard/babel.config.js
new file mode 100644
index 00000000..ba179669
--- /dev/null
+++ b/dashboard/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ '@vue/app'
+ ]
+}
diff --git a/dashboard/package.json b/dashboard/package.json
new file mode 100644
index 00000000..aa8de6ad
--- /dev/null
+++ b/dashboard/package.json
@@ -0,0 +1,59 @@
+{
+ "name": "moon_ui",
+<<<<<<< HEAD:moon_ui/package.json
+ "version": "2.0.0",
+=======
+ "version": "1.0.0",
+>>>>>>> develop:package.json
+ "private": true,
+ "scripts": {
+ "serve": "vue-cli-service serve",
+ "build": "vue-cli-service build",
+ "lint": "vue-cli-service lint"
+ },
+ "dependencies": {
+ "babel-helper-vue-jsx-merge-props": "^2.0.3",
+ "core-js": "^2.6.5",
+ "vee-validate": "^2.2.10",
+ "vue": "^2.6.10",
+ "vue-nav-tabs": "^0.5.7",
+ "vue-resource": "^1.5.1",
+ "vue-router": "^3.0.3",
+ "vue-toasted": "^1.1.27"
+ },
+ "devDependencies": {
+ "@vue/cli-plugin-babel": "^3.6.0",
+ "@vue/cli-plugin-eslint": "^3.6.0",
+ "@vue/cli-service": "^3.6.0",
+ "babel-eslint": "^10.0.1",
+ "eslint": "^5.16.0",
+ "eslint-plugin-vue": "^5.0.0",
+ "vue-template-compiler": "^2.5.21"
+ },
+ "eslintConfig": {
+ "root": true,
+ "env": {
+ "node": true
+ },
+ "extends": [
+ "plugin:vue/essential",
+ "eslint:recommended"
+ ],
+ "rules": {
+ "no-console": "off"
+ },
+ "parserOptions": {
+ "parser": "babel-eslint"
+ }
+ },
+ "postcss": {
+ "plugins": {
+ "autoprefixer": {}
+ }
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not ie <= 8"
+ ]
+}
diff --git a/dashboard/public/css/boosted-grid.css b/dashboard/public/css/boosted-grid.css
new file mode 100644
index 00000000..113b475c
--- /dev/null
+++ b/dashboard/public/css/boosted-grid.css
@@ -0,0 +1,4726 @@
+/*!
+ * Boosted Grid v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap Grid v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+html {
+ box-sizing: border-box;
+ -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: inherit;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 5px;
+ padding-left: 5px;
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ max-width: 312px;
+ margin-right: auto;
+ margin-left: auto;
+ width: 100%;
+}
+
+@media (min-width: 480px) {
+ .container {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+.container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 480px) {
+ .container {
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ margin-right: 1.5625%;
+ margin-left: 1.5625%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ margin-right: 4.16667%;
+ margin-left: 4.16667%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 480px) {
+ .container {
+ max-width: 468px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 744px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ max-width: 960px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ max-width: 1200px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ max-width: 1320px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 5px;
+ padding-left: 5px;
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ width: auto;
+}
+
+@media (min-width: 480px) {
+ .container-fluid {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+.container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 480px) {
+ .container-fluid {
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ margin-right: 1.5625%;
+ margin-left: 1.5625%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container-fluid {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container-fluid {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container-fluid {
+ margin-right: 4.16667%;
+ margin-left: 4.16667%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+.row {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px;
+}
+
+@media (min-width: 480px) {
+ .row {
+ margin-right: -5px;
+ margin-left: -5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+.col-xxl-auto {
+ position: relative;
+ width: 100%;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
+@media (min-width: 480px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+.col {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.col-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+}
+
+.col-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+}
+
+.col-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+}
+
+.col-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+
+.col-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+}
+
+.col-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+}
+
+.col-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+
+.col-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+}
+
+.col-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+}
+
+.col-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+
+.col-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+}
+
+.col-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+}
+
+.col-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+}
+
+.order-first {
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -ms-flex-order: 13;
+ order: 13;
+}
+
+.order-0 {
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.order-1 {
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-2 {
+ -ms-flex-order: 2;
+ order: 2;
+}
+
+.order-3 {
+ -ms-flex-order: 3;
+ order: 3;
+}
+
+.order-4 {
+ -ms-flex-order: 4;
+ order: 4;
+}
+
+.order-5 {
+ -ms-flex-order: 5;
+ order: 5;
+}
+
+.order-6 {
+ -ms-flex-order: 6;
+ order: 6;
+}
+
+.order-7 {
+ -ms-flex-order: 7;
+ order: 7;
+}
+
+.order-8 {
+ -ms-flex-order: 8;
+ order: 8;
+}
+
+.order-9 {
+ -ms-flex-order: 9;
+ order: 9;
+}
+
+.order-10 {
+ -ms-flex-order: 10;
+ order: 10;
+}
+
+.order-11 {
+ -ms-flex-order: 11;
+ order: 11;
+}
+
+.order-12 {
+ -ms-flex-order: 12;
+ order: 12;
+}
+
+.offset-1 {
+ margin-left: 8.333333%;
+}
+
+.offset-2 {
+ margin-left: 16.666667%;
+}
+
+.offset-3 {
+ margin-left: 25%;
+}
+
+.offset-4 {
+ margin-left: 33.333333%;
+}
+
+.offset-5 {
+ margin-left: 41.666667%;
+}
+
+.offset-6 {
+ margin-left: 50%;
+}
+
+.offset-7 {
+ margin-left: 58.333333%;
+}
+
+.offset-8 {
+ margin-left: 66.666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.333333%;
+}
+
+.offset-11 {
+ margin-left: 91.666667%;
+}
+
+@media (min-width: 480px) {
+ .col-sm {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-sm-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-sm-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-sm-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-sm-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-sm-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-sm-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-sm-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-sm-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-sm-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-sm-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-sm-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-sm-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-sm-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-sm-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-sm-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-sm-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-sm-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-sm-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-sm-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-sm-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-sm-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-sm-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-sm-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-sm-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-sm-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+ .offset-sm-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-md {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-md-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-md-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-md-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-md-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-md-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-md-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-md-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-md-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-md-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-md-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-md-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-md-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-md-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-md-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-md-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-md-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-md-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-md-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-md-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-md-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-md-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-md-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-md-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-md-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-md-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-md-0 {
+ margin-left: 0;
+ }
+ .offset-md-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 980px) {
+ .col-lg {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-lg-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-lg-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-lg-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-lg-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-lg-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-lg-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-lg-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-lg-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-lg-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-lg-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-lg-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-lg-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-lg-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-lg-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-lg-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-lg-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-lg-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-lg-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-lg-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-lg-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-lg-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-lg-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-lg-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-lg-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-lg-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+ .offset-lg-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1220px) {
+ .col-xl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xl-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xl-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xl-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xl-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xl-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xl-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xl-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xl-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xl-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xl-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xl-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xl-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xl-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-xl-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-xl-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-xl-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-xl-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-xl-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-xl-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-xl-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-xl-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-xl-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-xl-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-xl-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-xl-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+ .offset-xl-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1380px) {
+ .col-xxl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xxl-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xxl-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xxl-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xxl-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xxl-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xxl-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xxl-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xxl-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xxl-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xxl-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xxl-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xxl-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xxl-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xxl-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xxl-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-xxl-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-xxl-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xxl-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-xxl-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-xxl-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-xxl-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-xxl-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-xxl-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-xxl-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-xxl-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-xxl-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-xxl-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-xxl-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
+ .offset-xxl-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-xxl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+ .offset-xxl-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-xxl-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+ .offset-xxl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xxl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+ .offset-xxl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xxl-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+.d-none {
+ display: none !important;
+}
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-table {
+ display: table !important;
+}
+
+.d-table-row {
+ display: table-row !important;
+}
+
+.d-table-cell {
+ display: table-cell !important;
+}
+
+.d-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+}
+
+.d-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+}
+
+@media (min-width: 480px) {
+ .d-sm-none {
+ display: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
+ display: block !important;
+ }
+ .d-sm-table {
+ display: table !important;
+ }
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+ .d-sm-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important;
+ }
+ .d-md-inline {
+ display: inline !important;
+ }
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .d-md-block {
+ display: block !important;
+ }
+ .d-md-table {
+ display: table !important;
+ }
+ .d-md-table-row {
+ display: table-row !important;
+ }
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+ .d-md-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-inline {
+ display: inline !important;
+ }
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+ .d-lg-table {
+ display: table !important;
+ }
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+ .d-lg-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .d-xl-none {
+ display: none !important;
+ }
+ .d-xl-inline {
+ display: inline !important;
+ }
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xl-block {
+ display: block !important;
+ }
+ .d-xl-table {
+ display: table !important;
+ }
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xl-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .d-xxl-none {
+ display: none !important;
+ }
+ .d-xxl-inline {
+ display: inline !important;
+ }
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xxl-block {
+ display: block !important;
+ }
+ .d-xxl-table {
+ display: table !important;
+ }
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xxl-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xxl-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media print {
+ .d-print-none {
+ display: none !important;
+ }
+ .d-print-inline {
+ display: inline !important;
+ }
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+ .d-print-block {
+ display: block !important;
+ }
+ .d-print-table {
+ display: table !important;
+ }
+ .d-print-table-row {
+ display: table-row !important;
+ }
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+ .d-print-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-print-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+.flex-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.flex-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+}
+
+.flex-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+}
+
+.flex-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+}
+
+.flex-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+}
+
+.flex-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+}
+
+.justify-content-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 480px) {
+ .flex-sm-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-sm-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-sm-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-sm-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-sm-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-sm-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-sm-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .flex-md-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-md-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-md-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-md-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-md-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-md-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-md-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .flex-lg-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-lg-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-lg-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-lg-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-lg-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-lg-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-lg-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .flex-xl-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xl-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-xl-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-xl-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-xl-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-xl-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xl-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .flex-xxl-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xxl-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xxl-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xxl-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xxl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xxl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xxl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xxl-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-xxl-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-xxl-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-xxl-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-xxl-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xxl-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xxl-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xxl-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xxl-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xxl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xxl-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xxl-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xxl-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xxl-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xxl-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xxl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xxl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xxl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xxl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xxl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xxl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xxl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xxl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xxl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xxl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xxl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xxl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.mt-0,
+.my-0 {
+ margin-top: 0 !important;
+}
+
+.mr-0,
+.mx-0 {
+ margin-right: 0 !important;
+}
+
+.mb-0,
+.my-0 {
+ margin-bottom: 0 !important;
+}
+
+.ml-0,
+.mx-0 {
+ margin-left: 0 !important;
+}
+
+.m-1 {
+ margin: 0.3125rem !important;
+}
+
+.mt-1,
+.my-1 {
+ margin-top: 0.3125rem !important;
+}
+
+.mr-1,
+.mx-1 {
+ margin-right: 0.3125rem !important;
+}
+
+.mb-1,
+.my-1 {
+ margin-bottom: 0.3125rem !important;
+}
+
+.ml-1,
+.mx-1 {
+ margin-left: 0.3125rem !important;
+}
+
+.m-2 {
+ margin: 0.625rem !important;
+}
+
+.mt-2,
+.my-2 {
+ margin-top: 0.625rem !important;
+}
+
+.mr-2,
+.mx-2 {
+ margin-right: 0.625rem !important;
+}
+
+.mb-2,
+.my-2 {
+ margin-bottom: 0.625rem !important;
+}
+
+.ml-2,
+.mx-2 {
+ margin-left: 0.625rem !important;
+}
+
+.m-3 {
+ margin: 1.25rem !important;
+}
+
+.mt-3,
+.my-3 {
+ margin-top: 1.25rem !important;
+}
+
+.mr-3,
+.mx-3 {
+ margin-right: 1.25rem !important;
+}
+
+.mb-3,
+.my-3 {
+ margin-bottom: 1.25rem !important;
+}
+
+.ml-3,
+.mx-3 {
+ margin-left: 1.25rem !important;
+}
+
+.m-4 {
+ margin: 1.875rem !important;
+}
+
+.mt-4,
+.my-4 {
+ margin-top: 1.875rem !important;
+}
+
+.mr-4,
+.mx-4 {
+ margin-right: 1.875rem !important;
+}
+
+.mb-4,
+.my-4 {
+ margin-bottom: 1.875rem !important;
+}
+
+.ml-4,
+.mx-4 {
+ margin-left: 1.875rem !important;
+}
+
+.m-5 {
+ margin: 3.75rem !important;
+}
+
+.mt-5,
+.my-5 {
+ margin-top: 3.75rem !important;
+}
+
+.mr-5,
+.mx-5 {
+ margin-right: 3.75rem !important;
+}
+
+.mb-5,
+.my-5 {
+ margin-bottom: 3.75rem !important;
+}
+
+.ml-5,
+.mx-5 {
+ margin-left: 3.75rem !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.pt-0,
+.py-0 {
+ padding-top: 0 !important;
+}
+
+.pr-0,
+.px-0 {
+ padding-right: 0 !important;
+}
+
+.pb-0,
+.py-0 {
+ padding-bottom: 0 !important;
+}
+
+.pl-0,
+.px-0 {
+ padding-left: 0 !important;
+}
+
+.p-1 {
+ padding: 0.3125rem !important;
+}
+
+.pt-1,
+.py-1 {
+ padding-top: 0.3125rem !important;
+}
+
+.pr-1,
+.px-1 {
+ padding-right: 0.3125rem !important;
+}
+
+.pb-1,
+.py-1 {
+ padding-bottom: 0.3125rem !important;
+}
+
+.pl-1,
+.px-1 {
+ padding-left: 0.3125rem !important;
+}
+
+.p-2 {
+ padding: 0.625rem !important;
+}
+
+.pt-2,
+.py-2 {
+ padding-top: 0.625rem !important;
+}
+
+.pr-2,
+.px-2 {
+ padding-right: 0.625rem !important;
+}
+
+.pb-2,
+.py-2 {
+ padding-bottom: 0.625rem !important;
+}
+
+.pl-2,
+.px-2 {
+ padding-left: 0.625rem !important;
+}
+
+.p-3 {
+ padding: 1.25rem !important;
+}
+
+.pt-3,
+.py-3 {
+ padding-top: 1.25rem !important;
+}
+
+.pr-3,
+.px-3 {
+ padding-right: 1.25rem !important;
+}
+
+.pb-3,
+.py-3 {
+ padding-bottom: 1.25rem !important;
+}
+
+.pl-3,
+.px-3 {
+ padding-left: 1.25rem !important;
+}
+
+.p-4 {
+ padding: 1.875rem !important;
+}
+
+.pt-4,
+.py-4 {
+ padding-top: 1.875rem !important;
+}
+
+.pr-4,
+.px-4 {
+ padding-right: 1.875rem !important;
+}
+
+.pb-4,
+.py-4 {
+ padding-bottom: 1.875rem !important;
+}
+
+.pl-4,
+.px-4 {
+ padding-left: 1.875rem !important;
+}
+
+.p-5 {
+ padding: 3.75rem !important;
+}
+
+.pt-5,
+.py-5 {
+ padding-top: 3.75rem !important;
+}
+
+.pr-5,
+.px-5 {
+ padding-right: 3.75rem !important;
+}
+
+.pb-5,
+.py-5 {
+ padding-bottom: 3.75rem !important;
+}
+
+.pl-5,
+.px-5 {
+ padding-left: 3.75rem !important;
+}
+
+.m-n1 {
+ margin: -0.3125rem !important;
+}
+
+.mt-n1,
+.my-n1 {
+ margin-top: -0.3125rem !important;
+}
+
+.mr-n1,
+.mx-n1 {
+ margin-right: -0.3125rem !important;
+}
+
+.mb-n1,
+.my-n1 {
+ margin-bottom: -0.3125rem !important;
+}
+
+.ml-n1,
+.mx-n1 {
+ margin-left: -0.3125rem !important;
+}
+
+.m-n2 {
+ margin: -0.625rem !important;
+}
+
+.mt-n2,
+.my-n2 {
+ margin-top: -0.625rem !important;
+}
+
+.mr-n2,
+.mx-n2 {
+ margin-right: -0.625rem !important;
+}
+
+.mb-n2,
+.my-n2 {
+ margin-bottom: -0.625rem !important;
+}
+
+.ml-n2,
+.mx-n2 {
+ margin-left: -0.625rem !important;
+}
+
+.m-n3 {
+ margin: -1.25rem !important;
+}
+
+.mt-n3,
+.my-n3 {
+ margin-top: -1.25rem !important;
+}
+
+.mr-n3,
+.mx-n3 {
+ margin-right: -1.25rem !important;
+}
+
+.mb-n3,
+.my-n3 {
+ margin-bottom: -1.25rem !important;
+}
+
+.ml-n3,
+.mx-n3 {
+ margin-left: -1.25rem !important;
+}
+
+.m-n4 {
+ margin: -1.875rem !important;
+}
+
+.mt-n4,
+.my-n4 {
+ margin-top: -1.875rem !important;
+}
+
+.mr-n4,
+.mx-n4 {
+ margin-right: -1.875rem !important;
+}
+
+.mb-n4,
+.my-n4 {
+ margin-bottom: -1.875rem !important;
+}
+
+.ml-n4,
+.mx-n4 {
+ margin-left: -1.875rem !important;
+}
+
+.m-n5 {
+ margin: -3.75rem !important;
+}
+
+.mt-n5,
+.my-n5 {
+ margin-top: -3.75rem !important;
+}
+
+.mr-n5,
+.mx-n5 {
+ margin-right: -3.75rem !important;
+}
+
+.mb-n5,
+.my-n5 {
+ margin-bottom: -3.75rem !important;
+}
+
+.ml-n5,
+.mx-n5 {
+ margin-left: -3.75rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mt-auto,
+.my-auto {
+ margin-top: auto !important;
+}
+
+.mr-auto,
+.mx-auto {
+ margin-right: auto !important;
+}
+
+.mb-auto,
+.my-auto {
+ margin-bottom: auto !important;
+}
+
+.ml-auto,
+.mx-auto {
+ margin-left: auto !important;
+}
+
+@media (min-width: 480px) {
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .mt-sm-0,
+ .my-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mr-sm-0,
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ }
+ .mb-sm-0,
+ .my-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-sm-0,
+ .mx-sm-0 {
+ margin-left: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-sm-1,
+ .my-sm-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-sm-1,
+ .mx-sm-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-sm-1,
+ .my-sm-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-sm-1,
+ .mx-sm-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-sm-2,
+ .my-sm-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-sm-2,
+ .mx-sm-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-sm-2,
+ .my-sm-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-sm-2,
+ .mx-sm-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-sm-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-sm-3,
+ .my-sm-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-sm-3,
+ .mx-sm-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-sm-3,
+ .my-sm-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-sm-3,
+ .mx-sm-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-sm-4,
+ .my-sm-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-sm-4,
+ .mx-sm-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-sm-4,
+ .my-sm-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-sm-4,
+ .mx-sm-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-sm-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-sm-5,
+ .my-sm-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-sm-5,
+ .mx-sm-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-sm-5,
+ .my-sm-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-sm-5,
+ .mx-sm-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .pt-sm-0,
+ .py-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pr-sm-0,
+ .px-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pb-sm-0,
+ .py-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-sm-0,
+ .px-sm-0 {
+ padding-left: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-sm-1,
+ .py-sm-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-sm-1,
+ .px-sm-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-sm-1,
+ .py-sm-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-sm-1,
+ .px-sm-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-sm-2,
+ .py-sm-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-sm-2,
+ .px-sm-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-sm-2,
+ .py-sm-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-sm-2,
+ .px-sm-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-sm-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-sm-3,
+ .py-sm-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-sm-3,
+ .px-sm-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-sm-3,
+ .py-sm-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-sm-3,
+ .px-sm-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-sm-4,
+ .py-sm-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-sm-4,
+ .px-sm-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-sm-4,
+ .py-sm-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-sm-4,
+ .px-sm-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-sm-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-sm-5,
+ .py-sm-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-sm-5,
+ .px-sm-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-sm-5,
+ .py-sm-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-sm-5,
+ .px-sm-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-sm-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-sm-n1,
+ .my-sm-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-sm-n1,
+ .mx-sm-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-sm-n1,
+ .my-sm-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-sm-n1,
+ .mx-sm-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-sm-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-sm-n2,
+ .my-sm-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-sm-n2,
+ .mx-sm-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-sm-n2,
+ .my-sm-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-sm-n2,
+ .mx-sm-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-sm-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-sm-n3,
+ .my-sm-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-sm-n3,
+ .mx-sm-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-sm-n3,
+ .my-sm-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-sm-n3,
+ .mx-sm-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-sm-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-sm-n4,
+ .my-sm-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-sm-n4,
+ .mx-sm-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-sm-n4,
+ .my-sm-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-sm-n4,
+ .mx-sm-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-sm-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-sm-n5,
+ .my-sm-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-sm-n5,
+ .mx-sm-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-sm-n5,
+ .my-sm-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-sm-n5,
+ .mx-sm-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mt-sm-auto,
+ .my-sm-auto {
+ margin-top: auto !important;
+ }
+ .mr-sm-auto,
+ .mx-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-auto,
+ .my-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-sm-auto,
+ .mx-sm-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .mt-md-0,
+ .my-md-0 {
+ margin-top: 0 !important;
+ }
+ .mr-md-0,
+ .mx-md-0 {
+ margin-right: 0 !important;
+ }
+ .mb-md-0,
+ .my-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-md-0,
+ .mx-md-0 {
+ margin-left: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-md-1,
+ .my-md-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-md-1,
+ .mx-md-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-md-1,
+ .my-md-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-md-1,
+ .mx-md-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-md-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-md-2,
+ .my-md-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-md-2,
+ .mx-md-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-md-2,
+ .my-md-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-md-2,
+ .mx-md-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-md-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-md-3,
+ .my-md-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-md-3,
+ .mx-md-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-md-3,
+ .my-md-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-md-3,
+ .mx-md-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-md-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-md-4,
+ .my-md-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-md-4,
+ .mx-md-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-md-4,
+ .my-md-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-md-4,
+ .mx-md-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-md-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-md-5,
+ .my-md-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-md-5,
+ .mx-md-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-md-5,
+ .my-md-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-md-5,
+ .mx-md-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .pt-md-0,
+ .py-md-0 {
+ padding-top: 0 !important;
+ }
+ .pr-md-0,
+ .px-md-0 {
+ padding-right: 0 !important;
+ }
+ .pb-md-0,
+ .py-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-md-0,
+ .px-md-0 {
+ padding-left: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-md-1,
+ .py-md-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-md-1,
+ .px-md-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-md-1,
+ .py-md-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-md-1,
+ .px-md-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-md-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-md-2,
+ .py-md-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-md-2,
+ .px-md-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-md-2,
+ .py-md-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-md-2,
+ .px-md-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-md-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-md-3,
+ .py-md-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-md-3,
+ .px-md-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-md-3,
+ .py-md-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-md-3,
+ .px-md-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-md-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-md-4,
+ .py-md-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-md-4,
+ .px-md-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-md-4,
+ .py-md-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-md-4,
+ .px-md-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-md-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-md-5,
+ .py-md-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-md-5,
+ .px-md-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-md-5,
+ .py-md-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-md-5,
+ .px-md-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-md-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-md-n1,
+ .my-md-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-md-n1,
+ .mx-md-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-md-n1,
+ .my-md-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-md-n1,
+ .mx-md-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-md-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-md-n2,
+ .my-md-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-md-n2,
+ .mx-md-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-md-n2,
+ .my-md-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-md-n2,
+ .mx-md-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-md-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-md-n3,
+ .my-md-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-md-n3,
+ .mx-md-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-md-n3,
+ .my-md-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-md-n3,
+ .mx-md-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-md-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-md-n4,
+ .my-md-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-md-n4,
+ .mx-md-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-md-n4,
+ .my-md-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-md-n4,
+ .mx-md-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-md-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-md-n5,
+ .my-md-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-md-n5,
+ .mx-md-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-md-n5,
+ .my-md-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-md-n5,
+ .mx-md-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mt-md-auto,
+ .my-md-auto {
+ margin-top: auto !important;
+ }
+ .mr-md-auto,
+ .mx-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-auto,
+ .my-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-md-auto,
+ .mx-md-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .mt-lg-0,
+ .my-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mr-lg-0,
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ }
+ .mb-lg-0,
+ .my-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-lg-0,
+ .mx-lg-0 {
+ margin-left: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-lg-1,
+ .my-lg-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-lg-1,
+ .mx-lg-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-lg-1,
+ .my-lg-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-lg-1,
+ .mx-lg-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-lg-2,
+ .my-lg-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-lg-2,
+ .mx-lg-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-lg-2,
+ .my-lg-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-lg-2,
+ .mx-lg-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-lg-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-lg-3,
+ .my-lg-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-lg-3,
+ .mx-lg-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-lg-3,
+ .my-lg-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-lg-3,
+ .mx-lg-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-lg-4,
+ .my-lg-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-lg-4,
+ .mx-lg-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-lg-4,
+ .my-lg-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-lg-4,
+ .mx-lg-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-lg-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-lg-5,
+ .my-lg-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-lg-5,
+ .mx-lg-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-lg-5,
+ .my-lg-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-lg-5,
+ .mx-lg-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .pt-lg-0,
+ .py-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pr-lg-0,
+ .px-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pb-lg-0,
+ .py-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-lg-0,
+ .px-lg-0 {
+ padding-left: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-lg-1,
+ .py-lg-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-lg-1,
+ .px-lg-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-lg-1,
+ .py-lg-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-lg-1,
+ .px-lg-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-lg-2,
+ .py-lg-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-lg-2,
+ .px-lg-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-lg-2,
+ .py-lg-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-lg-2,
+ .px-lg-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-lg-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-lg-3,
+ .py-lg-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-lg-3,
+ .px-lg-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-lg-3,
+ .py-lg-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-lg-3,
+ .px-lg-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-lg-4,
+ .py-lg-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-lg-4,
+ .px-lg-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-lg-4,
+ .py-lg-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-lg-4,
+ .px-lg-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-lg-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-lg-5,
+ .py-lg-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-lg-5,
+ .px-lg-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-lg-5,
+ .py-lg-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-lg-5,
+ .px-lg-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-lg-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-lg-n1,
+ .my-lg-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-lg-n1,
+ .mx-lg-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-lg-n1,
+ .my-lg-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-lg-n1,
+ .mx-lg-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-lg-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-lg-n2,
+ .my-lg-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-lg-n2,
+ .mx-lg-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-lg-n2,
+ .my-lg-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-lg-n2,
+ .mx-lg-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-lg-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-lg-n3,
+ .my-lg-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-lg-n3,
+ .mx-lg-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-lg-n3,
+ .my-lg-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-lg-n3,
+ .mx-lg-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-lg-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-lg-n4,
+ .my-lg-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-lg-n4,
+ .mx-lg-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-lg-n4,
+ .my-lg-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-lg-n4,
+ .mx-lg-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-lg-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-lg-n5,
+ .my-lg-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-lg-n5,
+ .mx-lg-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-lg-n5,
+ .my-lg-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-lg-n5,
+ .mx-lg-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mt-lg-auto,
+ .my-lg-auto {
+ margin-top: auto !important;
+ }
+ .mr-lg-auto,
+ .mx-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-auto,
+ .my-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-lg-auto,
+ .mx-lg-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .mt-xl-0,
+ .my-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xl-0,
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xl-0,
+ .my-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xl-0,
+ .mx-xl-0 {
+ margin-left: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-xl-1,
+ .my-xl-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-xl-1,
+ .mx-xl-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-xl-1,
+ .my-xl-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-xl-1,
+ .mx-xl-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-xl-2,
+ .my-xl-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-xl-2,
+ .mx-xl-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-xl-2,
+ .my-xl-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-xl-2,
+ .mx-xl-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-xl-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-xl-3,
+ .my-xl-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-xl-3,
+ .mx-xl-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-xl-3,
+ .my-xl-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-xl-3,
+ .mx-xl-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-xl-4,
+ .my-xl-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-xl-4,
+ .mx-xl-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-xl-4,
+ .my-xl-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-xl-4,
+ .mx-xl-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-xl-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-xl-5,
+ .my-xl-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-xl-5,
+ .mx-xl-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-xl-5,
+ .my-xl-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-xl-5,
+ .mx-xl-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .pt-xl-0,
+ .py-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xl-0,
+ .px-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xl-0,
+ .py-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xl-0,
+ .px-xl-0 {
+ padding-left: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-xl-1,
+ .py-xl-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-xl-1,
+ .px-xl-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-xl-1,
+ .py-xl-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-xl-1,
+ .px-xl-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-xl-2,
+ .py-xl-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-xl-2,
+ .px-xl-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-xl-2,
+ .py-xl-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-xl-2,
+ .px-xl-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-xl-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-xl-3,
+ .py-xl-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-xl-3,
+ .px-xl-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-xl-3,
+ .py-xl-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-xl-3,
+ .px-xl-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-xl-4,
+ .py-xl-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-xl-4,
+ .px-xl-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-xl-4,
+ .py-xl-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-xl-4,
+ .px-xl-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-xl-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-xl-5,
+ .py-xl-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-xl-5,
+ .px-xl-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-xl-5,
+ .py-xl-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-xl-5,
+ .px-xl-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-xl-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-xl-n1,
+ .my-xl-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-xl-n1,
+ .mx-xl-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-xl-n1,
+ .my-xl-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-xl-n1,
+ .mx-xl-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-xl-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-xl-n2,
+ .my-xl-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-xl-n2,
+ .mx-xl-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-xl-n2,
+ .my-xl-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-xl-n2,
+ .mx-xl-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-xl-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-xl-n3,
+ .my-xl-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-xl-n3,
+ .mx-xl-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-xl-n3,
+ .my-xl-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-xl-n3,
+ .mx-xl-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-xl-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-xl-n4,
+ .my-xl-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-xl-n4,
+ .mx-xl-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-xl-n4,
+ .my-xl-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-xl-n4,
+ .mx-xl-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-xl-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-xl-n5,
+ .my-xl-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-xl-n5,
+ .mx-xl-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-xl-n5,
+ .my-xl-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-xl-n5,
+ .mx-xl-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mt-xl-auto,
+ .my-xl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xl-auto,
+ .mx-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-auto,
+ .my-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xl-auto,
+ .mx-xl-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+ .mt-xxl-0,
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xxl-0,
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xxl-0,
+ .my-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xxl-0,
+ .mx-xxl-0 {
+ margin-left: 0 !important;
+ }
+ .m-xxl-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-xxl-1,
+ .my-xxl-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-xxl-1,
+ .mx-xxl-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-xxl-1,
+ .my-xxl-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-xxl-1,
+ .mx-xxl-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-xxl-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-xxl-2,
+ .my-xxl-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-xxl-2,
+ .mx-xxl-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-xxl-2,
+ .my-xxl-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-xxl-2,
+ .mx-xxl-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-xxl-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-xxl-3,
+ .my-xxl-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-xxl-3,
+ .mx-xxl-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-xxl-3,
+ .my-xxl-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-xxl-3,
+ .mx-xxl-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-xxl-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-xxl-4,
+ .my-xxl-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-xxl-4,
+ .mx-xxl-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-xxl-4,
+ .my-xxl-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-xxl-4,
+ .mx-xxl-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-xxl-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-xxl-5,
+ .my-xxl-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-xxl-5,
+ .mx-xxl-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-xxl-5,
+ .my-xxl-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-xxl-5,
+ .mx-xxl-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+ .pt-xxl-0,
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xxl-0,
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xxl-0,
+ .py-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xxl-0,
+ .px-xxl-0 {
+ padding-left: 0 !important;
+ }
+ .p-xxl-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-xxl-1,
+ .py-xxl-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-xxl-1,
+ .px-xxl-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-xxl-1,
+ .py-xxl-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-xxl-1,
+ .px-xxl-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-xxl-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-xxl-2,
+ .py-xxl-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-xxl-2,
+ .px-xxl-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-xxl-2,
+ .py-xxl-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-xxl-2,
+ .px-xxl-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-xxl-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-xxl-3,
+ .py-xxl-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-xxl-3,
+ .px-xxl-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-xxl-3,
+ .py-xxl-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-xxl-3,
+ .px-xxl-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-xxl-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-xxl-4,
+ .py-xxl-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-xxl-4,
+ .px-xxl-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-xxl-4,
+ .py-xxl-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-xxl-4,
+ .px-xxl-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-xxl-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-xxl-5,
+ .py-xxl-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-xxl-5,
+ .px-xxl-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-xxl-5,
+ .py-xxl-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-xxl-5,
+ .px-xxl-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-xxl-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-xxl-n1,
+ .my-xxl-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-xxl-n1,
+ .mx-xxl-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-xxl-n1,
+ .my-xxl-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-xxl-n1,
+ .mx-xxl-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-xxl-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-xxl-n2,
+ .my-xxl-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-xxl-n2,
+ .mx-xxl-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-xxl-n2,
+ .my-xxl-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-xxl-n2,
+ .mx-xxl-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-xxl-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-xxl-n3,
+ .my-xxl-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-xxl-n3,
+ .mx-xxl-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-xxl-n3,
+ .my-xxl-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-xxl-n3,
+ .mx-xxl-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-xxl-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-xxl-n4,
+ .my-xxl-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-xxl-n4,
+ .mx-xxl-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-xxl-n4,
+ .my-xxl-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-xxl-n4,
+ .mx-xxl-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-xxl-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-xxl-n5,
+ .my-xxl-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-xxl-n5,
+ .mx-xxl-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-xxl-n5,
+ .my-xxl-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-xxl-n5,
+ .mx-xxl-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+ .mt-xxl-auto,
+ .my-xxl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xxl-auto,
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xxl-auto,
+ .my-xxl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xxl-auto,
+ .mx-xxl-auto {
+ margin-left: auto !important;
+ }
+}
+/*# sourceMappingURL=boosted-grid.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted-grid.css.map b/dashboard/public/css/boosted-grid.css.map
new file mode 100644
index 00000000..4fa41b10
--- /dev/null
+++ b/dashboard/public/css/boosted-grid.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/boosted-grid.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_variables.scss","../../scss/mixins/_breakpoints.scss","boosted-grid.css","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;EACE,uBAAsB;EACtB,8BAA6B;CAC9B;;AAED;;;EAGE,oBAAmB;CACpB;;AChBC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,mBAA0B;EAC1B,kBAAyB;EAQzB,oBCsOK;EDrOL,mBCqOK;EDrNL,iBCwMO;EDtMP,mBAAkB;EAClB,kBAAiB;EDhCnB,YAAW;CACZ;;AGmDC;EHvDF;ICMI,mBAA0B;IAC1B,kBAAyB;GDH5B;CI+BF;;ADoBG;EHvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;CIsCF;;ADaG;EHvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;CI6CF;;ADMG;EHvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;CIoDF;;ADDG;EHvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;CI2DF;;AH7CK;EACE,mBAAkB;EAClB,kBAAiB;CAClB;;AEkCH;EHvDF;ICeI,oBCuOK;IDtOL,mBCsOK;GFlPR;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CG0DN;;ADxBG;EHvDF;ICeI,sBCwOO;IDvOP,qBCuOO;GFnPV;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CGqEN;;ADnCG;EHvDF;ICeI,qBCyOM;IDxON,oBCwOM;GFpPT;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CGgFN;;AD9CG;EHvDF;ICeI,qBC0OM;IDzON,oBCyOM;GFrPT;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CG2FN;;ADzDG;EHvDF;ICeI,uBC2OS;ID1OT,sBC0OS;GFtPZ;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CGsGN;;ADpEG;EHvDF;ICgCI,iBCyMO;IDvMP,mBAAkB;IAClB,kBAAiB;GD/BpB;CI+HF;;AD5EG;EHvDF;ICgCI,iBC0MO;IDxMP,mBAAkB;IAClB,kBAAiB;GD/BpB;CIuIF;;ADpFG;EHvDF;ICgCI,iBC2MO;IDzMP,mBAAkB;IAClB,kBAAiB;GD/BpB;CI+IF;;AD5FG;EHvDF;ICgCI,kBC4MQ;ID1MR,mBAAkB;IAClB,kBAAiB;GD/BpB;CIuJF;;ADpGG;EHvDF;ICgCI,kBC6MS;ID3MT,mBAAkB;IAClB,kBAAiB;GD/BpB;CI+JF;;AJtJC;ECbA,mBAAkB;EAClB,kBAAiB;EAKb,mBAA0B;EAC1B,kBAAyB;EAQzB,oBCsOK;EDrOL,mBCqOK;EFtOP,YAAW;CACZ;;AGuCC;EH1CF;ICPI,mBAA0B;IAC1B,kBAAyB;GDS5B;CIoKF;;AD7HG;EH1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;CI2KF;;ADpIG;EH1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;CIkLF;;AD3IG;EH1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;CIyLF;;ADlJG;EH1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;CIgMF;;AH9LK;EACE,mBAAkB;EAClB,kBAAiB;CAClB;;AEkCH;EH1CF;ICEI,oBCuOK;IDtOL,mBCsOK;GFtOR;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CG2MN;;ADzKG;EH1CF;ICEI,sBCwOO;IDvOP,qBCuOO;GFvOV;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CGsNN;;ADpLG;EH1CF;ICEI,qBCyOM;IDxON,oBCwOM;GFxOT;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CGiON;;AD/LG;EH1CF;ICEI,qBC0OM;IDzON,oBCyOM;GFzOT;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CG4ON;;AD1MG;EH1CF;ICEI,uBC2OS;ID1OT,sBC0OS;GF1OZ;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CGuPN;;AJpPC;EC4BA,qBAAa;EAAb,cAAa;EACb,oBAAe;EAAf,gBAAe;EAKX,mBAA0B;EAC1B,kBAAyB;CDjC5B;;AG6BC;EH/BF;ICkCI,mBAA0B;IAC1B,kBAAyB;GDjC5B;CIgQF;;ADnOG;EH/BF;ICkCI,oBAA0B;IAC1B,mBAAyB;GDjC5B;CIuQF;;AD1OG;EH/BF;ICkCI,oBAA0B;IAC1B,mBAAyB;GDjC5B;CI8QF;;ADjPG;EH/BF;ICkCI,oBAA0B;IAC1B,mBAAyB;GDjC5B;CIqRF;;ADxPG;EH/BF;ICkCI,oBAA0B;IAC1B,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","file":"boosted-grid.css","sourcesContent":["/*!\n * Boosted Grid v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n width: 100%; // Boosted mod\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n width: auto; // Boosted mod\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n@mixin make-container($gutters: $grid-gutter-widths) {\n margin-right: auto;\n margin-left: auto;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n // width: 100%; //Boosted mod our fluid is not 100% width\n }\n }\n\n // boosted mod\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n margin-right: $container-margin;\n margin-left: $container-margin;\n // reset margin for second level container\n .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n }\n }\n // end mod\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n // boosted mod\n margin-right: auto;\n margin-left: auto;\n // end mod\n }\n }\n}\n\n@mixin make-gutters($gutters: $grid-gutter-widths) {\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n }\n}\n\n@mixin make-row($gutters: $grid-gutter-widths) {\n display: flex;\n flex-wrap: wrap;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n }\n }\n}\n\n@mixin make-col-ready($gutters: $grid-gutter-widths) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n }\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","/*!\n * Boosted Grid v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n\n/*# sourceMappingURL=boosted-grid.css.map */","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n\n@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n @include make-gutters($gutters);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted-grid.min.css b/dashboard/public/css/boosted-grid.min.css
new file mode 100644
index 00000000..009a8ef2
--- /dev/null
+++ b/dashboard/public/css/boosted-grid.min.css
@@ -0,0 +1,12 @@
+/*!
+ * Boosted Grid v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap Grid v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{margin-right:auto;margin-left:auto;padding-right:5px;padding-left:5px;margin-right:1.25%;margin-left:1.25%;max-width:312px;margin-right:auto;margin-left:auto;width:100%}@media (min-width:480px){.container{padding-right:5px;padding-left:5px}}@media (min-width:768px){.container{padding-right:10px;padding-left:10px}}@media (min-width:980px){.container{padding-right:10px;padding-left:10px}}@media (min-width:1220px){.container{padding-right:10px;padding-left:10px}}@media (min-width:1380px){.container{padding-right:10px;padding-left:10px}}.container .container-fluid{margin-right:auto;margin-left:auto}@media (min-width:480px){.container{margin-right:1.25%;margin-left:1.25%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:768px){.container{margin-right:1.5625%;margin-left:1.5625%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:980px){.container{margin-right:3.125%;margin-left:3.125%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1220px){.container{margin-right:3.125%;margin-left:3.125%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1380px){.container{margin-right:4.16667%;margin-left:4.16667%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:480px){.container{max-width:468px;margin-right:auto;margin-left:auto}}@media (min-width:768px){.container{max-width:744px;margin-right:auto;margin-left:auto}}@media (min-width:980px){.container{max-width:960px;margin-right:auto;margin-left:auto}}@media (min-width:1220px){.container{max-width:1200px;margin-right:auto;margin-left:auto}}@media (min-width:1380px){.container{max-width:1320px;margin-right:auto;margin-left:auto}}.container-fluid{margin-right:auto;margin-left:auto;padding-right:5px;padding-left:5px;margin-right:1.25%;margin-left:1.25%;width:auto}@media (min-width:480px){.container-fluid{padding-right:5px;padding-left:5px}}@media (min-width:768px){.container-fluid{padding-right:10px;padding-left:10px}}@media (min-width:980px){.container-fluid{padding-right:10px;padding-left:10px}}@media (min-width:1220px){.container-fluid{padding-right:10px;padding-left:10px}}@media (min-width:1380px){.container-fluid{padding-right:10px;padding-left:10px}}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}@media (min-width:480px){.container-fluid{margin-right:1.25%;margin-left:1.25%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:768px){.container-fluid{margin-right:1.5625%;margin-left:1.5625%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:980px){.container-fluid{margin-right:3.125%;margin-left:3.125%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1220px){.container-fluid{margin-right:3.125%;margin-left:3.125%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1380px){.container-fluid{margin-right:4.16667%;margin-left:4.16667%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}@media (min-width:480px){.row{margin-right:-5px;margin-left:-5px}}@media (min-width:768px){.row{margin-right:-10px;margin-left:-10px}}@media (min-width:980px){.row{margin-right:-10px;margin-left:-10px}}@media (min-width:1220px){.row{margin-right:-10px;margin-left:-10px}}@media (min-width:1380px){.row{margin-right:-10px;margin-left:-10px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{position:relative;width:100%;padding-right:5px;padding-left:5px}@media (min-width:480px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:5px;padding-left:5px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}@media (min-width:980px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}@media (min-width:1220px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}@media (min-width:1380px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:480px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:980px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1220px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}@media (min-width:1380px){.col-xxl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xxl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xxl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xxl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xxl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xxl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xxl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xxl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xxl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xxl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xxl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xxl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xxl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xxl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xxl-first{-ms-flex-order:-1;order:-1}.order-xxl-last{-ms-flex-order:13;order:13}.order-xxl-0{-ms-flex-order:0;order:0}.order-xxl-1{-ms-flex-order:1;order:1}.order-xxl-2{-ms-flex-order:2;order:2}.order-xxl-3{-ms-flex-order:3;order:3}.order-xxl-4{-ms-flex-order:4;order:4}.order-xxl-5{-ms-flex-order:5;order:5}.order-xxl-6{-ms-flex-order:6;order:6}.order-xxl-7{-ms-flex-order:7;order:7}.order-xxl-8{-ms-flex-order:8;order:8}.order-xxl-9{-ms-flex-order:9;order:9}.order-xxl-10{-ms-flex-order:10;order:10}.order-xxl-11{-ms-flex-order:11;order:11}.order-xxl-12{-ms-flex-order:12;order:12}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.333333%}.offset-xxl-2{margin-left:16.666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.333333%}.offset-xxl-5{margin-left:41.666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.333333%}.offset-xxl-8{margin-left:66.666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.333333%}.offset-xxl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:480px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:980px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1220px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1380px){.d-xxl-none{display:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:-ms-flexbox!important;display:flex!important}.d-xxl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:480px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:980px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1220px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1380px){.flex-xxl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xxl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xxl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xxl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xxl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xxl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xxl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xxl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xxl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xxl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xxl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xxl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xxl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xxl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xxl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xxl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xxl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xxl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xxl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xxl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xxl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xxl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xxl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xxl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xxl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xxl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xxl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xxl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xxl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xxl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xxl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xxl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xxl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.3125rem!important}.mt-1,.my-1{margin-top:.3125rem!important}.mr-1,.mx-1{margin-right:.3125rem!important}.mb-1,.my-1{margin-bottom:.3125rem!important}.ml-1,.mx-1{margin-left:.3125rem!important}.m-2{margin:.625rem!important}.mt-2,.my-2{margin-top:.625rem!important}.mr-2,.mx-2{margin-right:.625rem!important}.mb-2,.my-2{margin-bottom:.625rem!important}.ml-2,.mx-2{margin-left:.625rem!important}.m-3{margin:1.25rem!important}.mt-3,.my-3{margin-top:1.25rem!important}.mr-3,.mx-3{margin-right:1.25rem!important}.mb-3,.my-3{margin-bottom:1.25rem!important}.ml-3,.mx-3{margin-left:1.25rem!important}.m-4{margin:1.875rem!important}.mt-4,.my-4{margin-top:1.875rem!important}.mr-4,.mx-4{margin-right:1.875rem!important}.mb-4,.my-4{margin-bottom:1.875rem!important}.ml-4,.mx-4{margin-left:1.875rem!important}.m-5{margin:3.75rem!important}.mt-5,.my-5{margin-top:3.75rem!important}.mr-5,.mx-5{margin-right:3.75rem!important}.mb-5,.my-5{margin-bottom:3.75rem!important}.ml-5,.mx-5{margin-left:3.75rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.3125rem!important}.pt-1,.py-1{padding-top:.3125rem!important}.pr-1,.px-1{padding-right:.3125rem!important}.pb-1,.py-1{padding-bottom:.3125rem!important}.pl-1,.px-1{padding-left:.3125rem!important}.p-2{padding:.625rem!important}.pt-2,.py-2{padding-top:.625rem!important}.pr-2,.px-2{padding-right:.625rem!important}.pb-2,.py-2{padding-bottom:.625rem!important}.pl-2,.px-2{padding-left:.625rem!important}.p-3{padding:1.25rem!important}.pt-3,.py-3{padding-top:1.25rem!important}.pr-3,.px-3{padding-right:1.25rem!important}.pb-3,.py-3{padding-bottom:1.25rem!important}.pl-3,.px-3{padding-left:1.25rem!important}.p-4{padding:1.875rem!important}.pt-4,.py-4{padding-top:1.875rem!important}.pr-4,.px-4{padding-right:1.875rem!important}.pb-4,.py-4{padding-bottom:1.875rem!important}.pl-4,.px-4{padding-left:1.875rem!important}.p-5{padding:3.75rem!important}.pt-5,.py-5{padding-top:3.75rem!important}.pr-5,.px-5{padding-right:3.75rem!important}.pb-5,.py-5{padding-bottom:3.75rem!important}.pl-5,.px-5{padding-left:3.75rem!important}.m-n1{margin:-.3125rem!important}.mt-n1,.my-n1{margin-top:-.3125rem!important}.mr-n1,.mx-n1{margin-right:-.3125rem!important}.mb-n1,.my-n1{margin-bottom:-.3125rem!important}.ml-n1,.mx-n1{margin-left:-.3125rem!important}.m-n2{margin:-.625rem!important}.mt-n2,.my-n2{margin-top:-.625rem!important}.mr-n2,.mx-n2{margin-right:-.625rem!important}.mb-n2,.my-n2{margin-bottom:-.625rem!important}.ml-n2,.mx-n2{margin-left:-.625rem!important}.m-n3{margin:-1.25rem!important}.mt-n3,.my-n3{margin-top:-1.25rem!important}.mr-n3,.mx-n3{margin-right:-1.25rem!important}.mb-n3,.my-n3{margin-bottom:-1.25rem!important}.ml-n3,.mx-n3{margin-left:-1.25rem!important}.m-n4{margin:-1.875rem!important}.mt-n4,.my-n4{margin-top:-1.875rem!important}.mr-n4,.mx-n4{margin-right:-1.875rem!important}.mb-n4,.my-n4{margin-bottom:-1.875rem!important}.ml-n4,.mx-n4{margin-left:-1.875rem!important}.m-n5{margin:-3.75rem!important}.mt-n5,.my-n5{margin-top:-3.75rem!important}.mr-n5,.mx-n5{margin-right:-3.75rem!important}.mb-n5,.my-n5{margin-bottom:-3.75rem!important}.ml-n5,.mx-n5{margin-left:-3.75rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:480px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.3125rem!important}.mt-sm-1,.my-sm-1{margin-top:.3125rem!important}.mr-sm-1,.mx-sm-1{margin-right:.3125rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.3125rem!important}.ml-sm-1,.mx-sm-1{margin-left:.3125rem!important}.m-sm-2{margin:.625rem!important}.mt-sm-2,.my-sm-2{margin-top:.625rem!important}.mr-sm-2,.mx-sm-2{margin-right:.625rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.625rem!important}.ml-sm-2,.mx-sm-2{margin-left:.625rem!important}.m-sm-3{margin:1.25rem!important}.mt-sm-3,.my-sm-3{margin-top:1.25rem!important}.mr-sm-3,.mx-sm-3{margin-right:1.25rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1.25rem!important}.ml-sm-3,.mx-sm-3{margin-left:1.25rem!important}.m-sm-4{margin:1.875rem!important}.mt-sm-4,.my-sm-4{margin-top:1.875rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.875rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.875rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.875rem!important}.m-sm-5{margin:3.75rem!important}.mt-sm-5,.my-sm-5{margin-top:3.75rem!important}.mr-sm-5,.mx-sm-5{margin-right:3.75rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3.75rem!important}.ml-sm-5,.mx-sm-5{margin-left:3.75rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.3125rem!important}.pt-sm-1,.py-sm-1{padding-top:.3125rem!important}.pr-sm-1,.px-sm-1{padding-right:.3125rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.3125rem!important}.pl-sm-1,.px-sm-1{padding-left:.3125rem!important}.p-sm-2{padding:.625rem!important}.pt-sm-2,.py-sm-2{padding-top:.625rem!important}.pr-sm-2,.px-sm-2{padding-right:.625rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.625rem!important}.pl-sm-2,.px-sm-2{padding-left:.625rem!important}.p-sm-3{padding:1.25rem!important}.pt-sm-3,.py-sm-3{padding-top:1.25rem!important}.pr-sm-3,.px-sm-3{padding-right:1.25rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1.25rem!important}.pl-sm-3,.px-sm-3{padding-left:1.25rem!important}.p-sm-4{padding:1.875rem!important}.pt-sm-4,.py-sm-4{padding-top:1.875rem!important}.pr-sm-4,.px-sm-4{padding-right:1.875rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.875rem!important}.pl-sm-4,.px-sm-4{padding-left:1.875rem!important}.p-sm-5{padding:3.75rem!important}.pt-sm-5,.py-sm-5{padding-top:3.75rem!important}.pr-sm-5,.px-sm-5{padding-right:3.75rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3.75rem!important}.pl-sm-5,.px-sm-5{padding-left:3.75rem!important}.m-sm-n1{margin:-.3125rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.3125rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.3125rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.3125rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.3125rem!important}.m-sm-n2{margin:-.625rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.625rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.625rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.625rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.625rem!important}.m-sm-n3{margin:-1.25rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1.25rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1.25rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1.25rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1.25rem!important}.m-sm-n4{margin:-1.875rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.875rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.875rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.875rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.875rem!important}.m-sm-n5{margin:-3.75rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3.75rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3.75rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3.75rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3.75rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.3125rem!important}.mt-md-1,.my-md-1{margin-top:.3125rem!important}.mr-md-1,.mx-md-1{margin-right:.3125rem!important}.mb-md-1,.my-md-1{margin-bottom:.3125rem!important}.ml-md-1,.mx-md-1{margin-left:.3125rem!important}.m-md-2{margin:.625rem!important}.mt-md-2,.my-md-2{margin-top:.625rem!important}.mr-md-2,.mx-md-2{margin-right:.625rem!important}.mb-md-2,.my-md-2{margin-bottom:.625rem!important}.ml-md-2,.mx-md-2{margin-left:.625rem!important}.m-md-3{margin:1.25rem!important}.mt-md-3,.my-md-3{margin-top:1.25rem!important}.mr-md-3,.mx-md-3{margin-right:1.25rem!important}.mb-md-3,.my-md-3{margin-bottom:1.25rem!important}.ml-md-3,.mx-md-3{margin-left:1.25rem!important}.m-md-4{margin:1.875rem!important}.mt-md-4,.my-md-4{margin-top:1.875rem!important}.mr-md-4,.mx-md-4{margin-right:1.875rem!important}.mb-md-4,.my-md-4{margin-bottom:1.875rem!important}.ml-md-4,.mx-md-4{margin-left:1.875rem!important}.m-md-5{margin:3.75rem!important}.mt-md-5,.my-md-5{margin-top:3.75rem!important}.mr-md-5,.mx-md-5{margin-right:3.75rem!important}.mb-md-5,.my-md-5{margin-bottom:3.75rem!important}.ml-md-5,.mx-md-5{margin-left:3.75rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.3125rem!important}.pt-md-1,.py-md-1{padding-top:.3125rem!important}.pr-md-1,.px-md-1{padding-right:.3125rem!important}.pb-md-1,.py-md-1{padding-bottom:.3125rem!important}.pl-md-1,.px-md-1{padding-left:.3125rem!important}.p-md-2{padding:.625rem!important}.pt-md-2,.py-md-2{padding-top:.625rem!important}.pr-md-2,.px-md-2{padding-right:.625rem!important}.pb-md-2,.py-md-2{padding-bottom:.625rem!important}.pl-md-2,.px-md-2{padding-left:.625rem!important}.p-md-3{padding:1.25rem!important}.pt-md-3,.py-md-3{padding-top:1.25rem!important}.pr-md-3,.px-md-3{padding-right:1.25rem!important}.pb-md-3,.py-md-3{padding-bottom:1.25rem!important}.pl-md-3,.px-md-3{padding-left:1.25rem!important}.p-md-4{padding:1.875rem!important}.pt-md-4,.py-md-4{padding-top:1.875rem!important}.pr-md-4,.px-md-4{padding-right:1.875rem!important}.pb-md-4,.py-md-4{padding-bottom:1.875rem!important}.pl-md-4,.px-md-4{padding-left:1.875rem!important}.p-md-5{padding:3.75rem!important}.pt-md-5,.py-md-5{padding-top:3.75rem!important}.pr-md-5,.px-md-5{padding-right:3.75rem!important}.pb-md-5,.py-md-5{padding-bottom:3.75rem!important}.pl-md-5,.px-md-5{padding-left:3.75rem!important}.m-md-n1{margin:-.3125rem!important}.mt-md-n1,.my-md-n1{margin-top:-.3125rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.3125rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.3125rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.3125rem!important}.m-md-n2{margin:-.625rem!important}.mt-md-n2,.my-md-n2{margin-top:-.625rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.625rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.625rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.625rem!important}.m-md-n3{margin:-1.25rem!important}.mt-md-n3,.my-md-n3{margin-top:-1.25rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1.25rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1.25rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1.25rem!important}.m-md-n4{margin:-1.875rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.875rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.875rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.875rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.875rem!important}.m-md-n5{margin:-3.75rem!important}.mt-md-n5,.my-md-n5{margin-top:-3.75rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3.75rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3.75rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3.75rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:980px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.3125rem!important}.mt-lg-1,.my-lg-1{margin-top:.3125rem!important}.mr-lg-1,.mx-lg-1{margin-right:.3125rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.3125rem!important}.ml-lg-1,.mx-lg-1{margin-left:.3125rem!important}.m-lg-2{margin:.625rem!important}.mt-lg-2,.my-lg-2{margin-top:.625rem!important}.mr-lg-2,.mx-lg-2{margin-right:.625rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.625rem!important}.ml-lg-2,.mx-lg-2{margin-left:.625rem!important}.m-lg-3{margin:1.25rem!important}.mt-lg-3,.my-lg-3{margin-top:1.25rem!important}.mr-lg-3,.mx-lg-3{margin-right:1.25rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1.25rem!important}.ml-lg-3,.mx-lg-3{margin-left:1.25rem!important}.m-lg-4{margin:1.875rem!important}.mt-lg-4,.my-lg-4{margin-top:1.875rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.875rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.875rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.875rem!important}.m-lg-5{margin:3.75rem!important}.mt-lg-5,.my-lg-5{margin-top:3.75rem!important}.mr-lg-5,.mx-lg-5{margin-right:3.75rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3.75rem!important}.ml-lg-5,.mx-lg-5{margin-left:3.75rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.3125rem!important}.pt-lg-1,.py-lg-1{padding-top:.3125rem!important}.pr-lg-1,.px-lg-1{padding-right:.3125rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.3125rem!important}.pl-lg-1,.px-lg-1{padding-left:.3125rem!important}.p-lg-2{padding:.625rem!important}.pt-lg-2,.py-lg-2{padding-top:.625rem!important}.pr-lg-2,.px-lg-2{padding-right:.625rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.625rem!important}.pl-lg-2,.px-lg-2{padding-left:.625rem!important}.p-lg-3{padding:1.25rem!important}.pt-lg-3,.py-lg-3{padding-top:1.25rem!important}.pr-lg-3,.px-lg-3{padding-right:1.25rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1.25rem!important}.pl-lg-3,.px-lg-3{padding-left:1.25rem!important}.p-lg-4{padding:1.875rem!important}.pt-lg-4,.py-lg-4{padding-top:1.875rem!important}.pr-lg-4,.px-lg-4{padding-right:1.875rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.875rem!important}.pl-lg-4,.px-lg-4{padding-left:1.875rem!important}.p-lg-5{padding:3.75rem!important}.pt-lg-5,.py-lg-5{padding-top:3.75rem!important}.pr-lg-5,.px-lg-5{padding-right:3.75rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3.75rem!important}.pl-lg-5,.px-lg-5{padding-left:3.75rem!important}.m-lg-n1{margin:-.3125rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.3125rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.3125rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.3125rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.3125rem!important}.m-lg-n2{margin:-.625rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.625rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.625rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.625rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.625rem!important}.m-lg-n3{margin:-1.25rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1.25rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1.25rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1.25rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1.25rem!important}.m-lg-n4{margin:-1.875rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.875rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.875rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.875rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.875rem!important}.m-lg-n5{margin:-3.75rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3.75rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3.75rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3.75rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3.75rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1220px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.3125rem!important}.mt-xl-1,.my-xl-1{margin-top:.3125rem!important}.mr-xl-1,.mx-xl-1{margin-right:.3125rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.3125rem!important}.ml-xl-1,.mx-xl-1{margin-left:.3125rem!important}.m-xl-2{margin:.625rem!important}.mt-xl-2,.my-xl-2{margin-top:.625rem!important}.mr-xl-2,.mx-xl-2{margin-right:.625rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.625rem!important}.ml-xl-2,.mx-xl-2{margin-left:.625rem!important}.m-xl-3{margin:1.25rem!important}.mt-xl-3,.my-xl-3{margin-top:1.25rem!important}.mr-xl-3,.mx-xl-3{margin-right:1.25rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1.25rem!important}.ml-xl-3,.mx-xl-3{margin-left:1.25rem!important}.m-xl-4{margin:1.875rem!important}.mt-xl-4,.my-xl-4{margin-top:1.875rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.875rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.875rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.875rem!important}.m-xl-5{margin:3.75rem!important}.mt-xl-5,.my-xl-5{margin-top:3.75rem!important}.mr-xl-5,.mx-xl-5{margin-right:3.75rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3.75rem!important}.ml-xl-5,.mx-xl-5{margin-left:3.75rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.3125rem!important}.pt-xl-1,.py-xl-1{padding-top:.3125rem!important}.pr-xl-1,.px-xl-1{padding-right:.3125rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.3125rem!important}.pl-xl-1,.px-xl-1{padding-left:.3125rem!important}.p-xl-2{padding:.625rem!important}.pt-xl-2,.py-xl-2{padding-top:.625rem!important}.pr-xl-2,.px-xl-2{padding-right:.625rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.625rem!important}.pl-xl-2,.px-xl-2{padding-left:.625rem!important}.p-xl-3{padding:1.25rem!important}.pt-xl-3,.py-xl-3{padding-top:1.25rem!important}.pr-xl-3,.px-xl-3{padding-right:1.25rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1.25rem!important}.pl-xl-3,.px-xl-3{padding-left:1.25rem!important}.p-xl-4{padding:1.875rem!important}.pt-xl-4,.py-xl-4{padding-top:1.875rem!important}.pr-xl-4,.px-xl-4{padding-right:1.875rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.875rem!important}.pl-xl-4,.px-xl-4{padding-left:1.875rem!important}.p-xl-5{padding:3.75rem!important}.pt-xl-5,.py-xl-5{padding-top:3.75rem!important}.pr-xl-5,.px-xl-5{padding-right:3.75rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3.75rem!important}.pl-xl-5,.px-xl-5{padding-left:3.75rem!important}.m-xl-n1{margin:-.3125rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.3125rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.3125rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.3125rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.3125rem!important}.m-xl-n2{margin:-.625rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.625rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.625rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.625rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.625rem!important}.m-xl-n3{margin:-1.25rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1.25rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1.25rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1.25rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1.25rem!important}.m-xl-n4{margin:-1.875rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.875rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.875rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.875rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.875rem!important}.m-xl-n5{margin:-3.75rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3.75rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3.75rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3.75rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3.75rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}@media (min-width:1380px){.m-xxl-0{margin:0!important}.mt-xxl-0,.my-xxl-0{margin-top:0!important}.mr-xxl-0,.mx-xxl-0{margin-right:0!important}.mb-xxl-0,.my-xxl-0{margin-bottom:0!important}.ml-xxl-0,.mx-xxl-0{margin-left:0!important}.m-xxl-1{margin:.3125rem!important}.mt-xxl-1,.my-xxl-1{margin-top:.3125rem!important}.mr-xxl-1,.mx-xxl-1{margin-right:.3125rem!important}.mb-xxl-1,.my-xxl-1{margin-bottom:.3125rem!important}.ml-xxl-1,.mx-xxl-1{margin-left:.3125rem!important}.m-xxl-2{margin:.625rem!important}.mt-xxl-2,.my-xxl-2{margin-top:.625rem!important}.mr-xxl-2,.mx-xxl-2{margin-right:.625rem!important}.mb-xxl-2,.my-xxl-2{margin-bottom:.625rem!important}.ml-xxl-2,.mx-xxl-2{margin-left:.625rem!important}.m-xxl-3{margin:1.25rem!important}.mt-xxl-3,.my-xxl-3{margin-top:1.25rem!important}.mr-xxl-3,.mx-xxl-3{margin-right:1.25rem!important}.mb-xxl-3,.my-xxl-3{margin-bottom:1.25rem!important}.ml-xxl-3,.mx-xxl-3{margin-left:1.25rem!important}.m-xxl-4{margin:1.875rem!important}.mt-xxl-4,.my-xxl-4{margin-top:1.875rem!important}.mr-xxl-4,.mx-xxl-4{margin-right:1.875rem!important}.mb-xxl-4,.my-xxl-4{margin-bottom:1.875rem!important}.ml-xxl-4,.mx-xxl-4{margin-left:1.875rem!important}.m-xxl-5{margin:3.75rem!important}.mt-xxl-5,.my-xxl-5{margin-top:3.75rem!important}.mr-xxl-5,.mx-xxl-5{margin-right:3.75rem!important}.mb-xxl-5,.my-xxl-5{margin-bottom:3.75rem!important}.ml-xxl-5,.mx-xxl-5{margin-left:3.75rem!important}.p-xxl-0{padding:0!important}.pt-xxl-0,.py-xxl-0{padding-top:0!important}.pr-xxl-0,.px-xxl-0{padding-right:0!important}.pb-xxl-0,.py-xxl-0{padding-bottom:0!important}.pl-xxl-0,.px-xxl-0{padding-left:0!important}.p-xxl-1{padding:.3125rem!important}.pt-xxl-1,.py-xxl-1{padding-top:.3125rem!important}.pr-xxl-1,.px-xxl-1{padding-right:.3125rem!important}.pb-xxl-1,.py-xxl-1{padding-bottom:.3125rem!important}.pl-xxl-1,.px-xxl-1{padding-left:.3125rem!important}.p-xxl-2{padding:.625rem!important}.pt-xxl-2,.py-xxl-2{padding-top:.625rem!important}.pr-xxl-2,.px-xxl-2{padding-right:.625rem!important}.pb-xxl-2,.py-xxl-2{padding-bottom:.625rem!important}.pl-xxl-2,.px-xxl-2{padding-left:.625rem!important}.p-xxl-3{padding:1.25rem!important}.pt-xxl-3,.py-xxl-3{padding-top:1.25rem!important}.pr-xxl-3,.px-xxl-3{padding-right:1.25rem!important}.pb-xxl-3,.py-xxl-3{padding-bottom:1.25rem!important}.pl-xxl-3,.px-xxl-3{padding-left:1.25rem!important}.p-xxl-4{padding:1.875rem!important}.pt-xxl-4,.py-xxl-4{padding-top:1.875rem!important}.pr-xxl-4,.px-xxl-4{padding-right:1.875rem!important}.pb-xxl-4,.py-xxl-4{padding-bottom:1.875rem!important}.pl-xxl-4,.px-xxl-4{padding-left:1.875rem!important}.p-xxl-5{padding:3.75rem!important}.pt-xxl-5,.py-xxl-5{padding-top:3.75rem!important}.pr-xxl-5,.px-xxl-5{padding-right:3.75rem!important}.pb-xxl-5,.py-xxl-5{padding-bottom:3.75rem!important}.pl-xxl-5,.px-xxl-5{padding-left:3.75rem!important}.m-xxl-n1{margin:-.3125rem!important}.mt-xxl-n1,.my-xxl-n1{margin-top:-.3125rem!important}.mr-xxl-n1,.mx-xxl-n1{margin-right:-.3125rem!important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-.3125rem!important}.ml-xxl-n1,.mx-xxl-n1{margin-left:-.3125rem!important}.m-xxl-n2{margin:-.625rem!important}.mt-xxl-n2,.my-xxl-n2{margin-top:-.625rem!important}.mr-xxl-n2,.mx-xxl-n2{margin-right:-.625rem!important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-.625rem!important}.ml-xxl-n2,.mx-xxl-n2{margin-left:-.625rem!important}.m-xxl-n3{margin:-1.25rem!important}.mt-xxl-n3,.my-xxl-n3{margin-top:-1.25rem!important}.mr-xxl-n3,.mx-xxl-n3{margin-right:-1.25rem!important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-1.25rem!important}.ml-xxl-n3,.mx-xxl-n3{margin-left:-1.25rem!important}.m-xxl-n4{margin:-1.875rem!important}.mt-xxl-n4,.my-xxl-n4{margin-top:-1.875rem!important}.mr-xxl-n4,.mx-xxl-n4{margin-right:-1.875rem!important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-1.875rem!important}.ml-xxl-n4,.mx-xxl-n4{margin-left:-1.875rem!important}.m-xxl-n5{margin:-3.75rem!important}.mt-xxl-n5,.my-xxl-n5{margin-top:-3.75rem!important}.mr-xxl-n5,.mx-xxl-n5{margin-right:-3.75rem!important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-3.75rem!important}.ml-xxl-n5,.mx-xxl-n5{margin-left:-3.75rem!important}.m-xxl-auto{margin:auto!important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto!important}.mr-xxl-auto,.mx-xxl-auto{margin-right:auto!important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto!important}.ml-xxl-auto,.mx-xxl-auto{margin-left:auto!important}}
+/*# sourceMappingURL=boosted-grid.min.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted-grid.min.css.map b/dashboard/public/css/boosted-grid.min.css.map
new file mode 100644
index 00000000..f119da24
--- /dev/null
+++ b/dashboard/public/css/boosted-grid.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["..\\..\\scss\\boosted-grid.scss","dist\\css\\boosted-grid.css","..\\..\\scss\\_grid.scss","..\\..\\scss\\mixins\\_grid.scss","..\\..\\scss\\mixins\\_breakpoints.scss","..\\..\\scss\\mixins\\_grid-framework.scss","..\\..\\scss\\utilities\\_display.scss","..\\..\\scss\\utilities\\_flex.scss","..\\..\\scss\\utilities\\_spacing.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Boosted Grid v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Boosted Grid v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xxl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xxl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xxl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xxl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xxl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xxl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xxl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xxl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xxl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xxl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xxl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xxl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xxl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xxl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xxl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xxl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xxl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n/*# sourceMappingURL=boosted-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n width: 100%; // Boosted mod\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n width: auto; // Boosted mod\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n@mixin make-container($gutters: $grid-gutter-widths) {\n margin-right: auto;\n margin-left: auto;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n // width: 100%; //Boosted mod our fluid is not 100% width\n }\n }\n\n // boosted mod\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n margin-right: $container-margin;\n margin-left: $container-margin;\n // reset margin for second level container\n .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n }\n }\n // end mod\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n // boosted mod\n margin-right: auto;\n margin-left: auto;\n // end mod\n }\n }\n}\n\n@mixin make-gutters($gutters: $grid-gutter-widths) {\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n }\n}\n\n@mixin make-row($gutters: $grid-gutter-widths) {\n display: flex;\n flex-wrap: wrap;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n }\n }\n}\n\n@mixin make-col-ready($gutters: $grid-gutter-widths) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n }\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n\n@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n @include make-gutters($gutters);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted-reboot.css b/dashboard/public/css/boosted-reboot.css
new file mode 100644
index 00000000..e570d9c9
--- /dev/null
+++ b/dashboard/public/css/boosted-reboot.css
@@ -0,0 +1,344 @@
+/*!
+ * Boosted Reboot v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
+ */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block;
+}
+
+body {
+ margin: 0;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #000;
+ text-align: left;
+ background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+ outline: 0 !important;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: 1.25rem;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: 700;
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -.25em;
+}
+
+sup {
+ top: -.5em;
+}
+
+a {
+ color: #000;
+ text-decoration: none;
+ background-color: transparent;
+}
+
+a:hover {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+p a {
+ text-decoration: underline;
+}
+
+p a:hover, p a:focus {
+ text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-size: 1em;
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
+
+figure {
+ margin: 0 0 1rem;
+}
+
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+
+svg {
+ overflow: hidden;
+ vertical-align: middle;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.625rem 0.625rem 0.625rem 0;
+ padding-bottom: 0.625rem 0.625rem 0.625rem 0;
+ color: #666;
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ text-align: inherit;
+}
+
+label {
+ display: inline-block;
+ margin-bottom: 0.625rem;
+}
+
+button {
+ border-radius: 0;
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+select {
+ word-wrap: normal;
+}
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled) {
+ cursor: pointer;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+/*# sourceMappingURL=boosted-reboot.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted-reboot.css.map b/dashboard/public/css/boosted-reboot.css.map
new file mode 100644
index 00000000..99a39bbf
--- /dev/null
+++ b/dashboard/public/css/boosted-reboot.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/boosted-reboot.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","boosted-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"boosted-reboot.css","sourcesContent":["/*!\n * Boosted Reboot v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// Boosted Mod\np a {\n text-decoration: underline;\n\n @include hover-focus {\n text-decoration: underline;\n }\n}\n// End mod\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Boosted Reboot v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=boosted-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted-reboot.min.css b/dashboard/public/css/boosted-reboot.min.css
new file mode 100644
index 00000000..f298ba44
--- /dev/null
+++ b/dashboard/public/css/boosted-reboot.min.css
@@ -0,0 +1,13 @@
+/*!
+ * Boosted Reboot v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
+ */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.25;color:#000;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:1.25rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#000;text-decoration:none;background-color:transparent}a:hover{color:#f16e00;text-decoration:none}p a{text-decoration:underline}p a:focus,p a:hover{text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.625rem .625rem .625rem 0;padding-bottom:.625rem .625rem .625rem 0;color:#666;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.625rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
+/*# sourceMappingURL=boosted-reboot.min.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted-reboot.min.css.map b/dashboard/public/css/boosted-reboot.min.css.map
new file mode 100644
index 00000000..6dcd15c7
--- /dev/null
+++ b/dashboard/public/css/boosted-reboot.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["..\\..\\scss\\boosted-reboot.scss","..\\..\\scss\\_reboot.scss","dist\\css\\boosted-reboot.css","..\\..\\scss\\vendor\\_rfs.scss","boosted-reboot.css","..\\..\\scss\\mixins\\_hover.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Boosted Reboot v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// Boosted Mod\np a {\n text-decoration: underline;\n\n @include hover-focus {\n text-decoration: underline;\n }\n}\n// End mod\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Boosted Reboot v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=boosted-reboot.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Boosted Reboot v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=boosted-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted-rtl.css b/dashboard/public/css/boosted-rtl.css
new file mode 100644
index 00000000..67b522fe
--- /dev/null
+++ b/dashboard/public/css/boosted-rtl.css
@@ -0,0 +1,14536 @@
+@charset "UTF-8";
+/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+ --blue: #527edb;
+ --indigo: #6610f2;
+ --purple: #a885d8;
+ --pink: #ffb4e6;
+ --red: #cd3c14;
+ --orange: #f16e00;
+ --yellow: #fc0;
+ --green: #32c832;
+ --teal: #50be87;
+ --cyan: #4bb4e6;
+ --white: #fff;
+ --gray: #999;
+ --gray-dark: #595959;
+ --primary: #f16e00;
+ --secondary: #000;
+ --success: #32c832;
+ --info: #527edb;
+ --warning: #fc0;
+ --danger: #cd3c14;
+ --light: #ddd;
+ --dark: #000;
+ --breakpoint-xs: 0;
+ --breakpoint-sm: 480px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 980px;
+ --breakpoint-xl: 1220px;
+ --breakpoint-xxl: 1380px;
+ --font-family-sans-serif: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block;
+}
+
+body {
+ margin: 0;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #000;
+ text-align: right;
+ background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+ outline: 0 !important;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: 1.25rem;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: 700;
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-right: 0;
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -.25em;
+}
+
+sup {
+ top: -.5em;
+}
+
+a {
+ color: #000;
+ text-decoration: none;
+ background-color: transparent;
+}
+
+a:hover {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+p a {
+ text-decoration: underline;
+}
+
+p a:hover, p a:focus {
+ text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-size: 1em;
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
+
+figure {
+ margin: 0 0 1rem;
+}
+
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+
+svg {
+ overflow: hidden;
+ vertical-align: middle;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.625rem 0.625rem 0.625rem 0;
+ padding-bottom: 0.625rem 0.625rem 0.625rem 0;
+ color: #666;
+ text-align: right;
+ caption-side: bottom;
+}
+
+th {
+ text-align: inherit;
+}
+
+label {
+ display: inline-block;
+ margin-bottom: 0.625rem;
+}
+
+button {
+ border-radius: 0;
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+select {
+ word-wrap: normal;
+}
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled) {
+ cursor: pointer;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ margin-bottom: 1.25rem;
+ font-family: inherit;
+ font-weight: 700;
+ line-height: 1.1;
+ color: inherit;
+}
+
+h1, .h1 {
+ font-size: 2.125rem;
+}
+
+h2, .h2 {
+ font-size: 1.875rem;
+}
+
+h3, .h3 {
+ font-size: 1.5rem;
+}
+
+h4, .h4 {
+ font-size: 1.25rem;
+}
+
+h5, .h5 {
+ font-size: 1.125rem;
+}
+
+h6, .h6 {
+ font-size: 1rem;
+}
+
+@media (max-width: 767.98px) {
+ h1, .h1 {
+ font-size: 1.25rem;
+ }
+ h2, .h2 {
+ font-size: 1.125rem;
+ }
+ h3, .h3 {
+ font-size: 1rem;
+ }
+ h4, .h4 {
+ font-size: 0.875rem;
+ }
+ h5, .h5 {
+ font-size: 0.875rem;
+ }
+ h6, .h6 {
+ font-size: 0.875rem;
+ }
+}
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.display-1 {
+ font-size: 3.75rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+.display-2 {
+ font-size: 3.125rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+.display-3 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+.display-4 {
+ font-size: 2.125rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+hr {
+ margin-top: 1.25rem;
+ margin-bottom: 1.25rem;
+ border: 0;
+ border-top: 1px solid #eee;
+}
+
+small,
+.small {
+ font-size: 0.875rem;
+ font-weight: 400;
+}
+
+mark,
+.mark {
+ padding: 0.2em;
+ background-color: #f16e00;
+}
+
+.list-unstyled {
+ padding-right: 0;
+ list-style: none;
+}
+
+.list-inline {
+ padding-right: 0;
+ list-style: none;
+}
+
+.list-inline-item {
+ display: inline-block;
+}
+
+.list-inline-item:not(:last-child) {
+ margin-left: 0.3125rem;
+}
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+.blockquote {
+ margin-bottom: 1.25rem;
+ font-size: 1.25rem;
+}
+
+.blockquote-footer {
+ display: block;
+ font-size: 0.875rem;
+ color: #666;
+}
+
+.blockquote-footer::before {
+ content: "\2014\00A0";
+}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.img-thumbnail {
+ padding: 0.625rem;
+ background-color: #fff;
+ border: 2px solid #000;
+ max-width: 100%;
+ height: auto;
+}
+
+.figure {
+ display: inline-block;
+}
+
+.figure-img {
+ margin-bottom: 0.625rem;
+ line-height: 1;
+}
+
+.figure-caption {
+ font-size: 90%;
+ color: #333;
+}
+
+code {
+ font-size: 87.5%;
+ color: #333;
+ word-break: break-word;
+}
+
+a > code {
+ color: inherit;
+}
+
+kbd {
+ padding: 0.0625rem 0.0625rem;
+ font-size: 87.5%;
+ color: #000;
+ background-color: #eee;
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700;
+}
+
+pre {
+ display: block;
+ font-size: 87.5%;
+ color: #333;
+}
+
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ margin-left: auto;
+ margin-right: auto;
+ padding-left: 5px;
+ padding-right: 5px;
+ margin-left: 1.25%;
+ margin-right: 1.25%;
+ max-width: 312px;
+ margin-left: auto;
+ margin-right: auto;
+ width: 100%;
+}
+
+@media (min-width: 480px) {
+ .container {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+.container .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+@media (min-width: 480px) {
+ .container {
+ margin-left: 1.25%;
+ margin-right: 1.25%;
+ }
+ .container .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ margin-left: 1.5625%;
+ margin-right: 1.5625%;
+ }
+ .container .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ margin-left: 3.125%;
+ margin-right: 3.125%;
+ }
+ .container .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ margin-left: 3.125%;
+ margin-right: 3.125%;
+ }
+ .container .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ margin-left: 4.16667%;
+ margin-right: 4.16667%;
+ }
+ .container .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 480px) {
+ .container {
+ max-width: 468px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 744px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ max-width: 960px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ max-width: 1200px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ max-width: 1320px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+.container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ padding-left: 5px;
+ padding-right: 5px;
+ margin-left: 1.25%;
+ margin-right: 1.25%;
+ width: auto;
+}
+
+@media (min-width: 480px) {
+ .container-fluid {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .container-fluid {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container-fluid {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container-fluid {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+.container-fluid .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+@media (min-width: 480px) {
+ .container-fluid {
+ margin-left: 1.25%;
+ margin-right: 1.25%;
+ }
+ .container-fluid .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ margin-left: 1.5625%;
+ margin-right: 1.5625%;
+ }
+ .container-fluid .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container-fluid {
+ margin-left: 3.125%;
+ margin-right: 3.125%;
+ }
+ .container-fluid .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container-fluid {
+ margin-left: 3.125%;
+ margin-right: 3.125%;
+ }
+ .container-fluid .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container-fluid {
+ margin-left: 4.16667%;
+ margin-right: 4.16667%;
+ }
+ .container-fluid .container-fluid {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+.row {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-left: -5px;
+ margin-right: -5px;
+}
+
+@media (min-width: 480px) {
+ .row {
+ margin-left: -5px;
+ margin-right: -5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-left: -10px;
+ margin-right: -10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .row {
+ margin-left: -10px;
+ margin-right: -10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .row {
+ margin-left: -10px;
+ margin-right: -10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .row {
+ margin-left: -10px;
+ margin-right: -10px;
+ }
+}
+
+.no-gutters {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+.col-xxl-auto {
+ position: relative;
+ width: 100%;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+@media (min-width: 480px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+.col {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.col-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+}
+
+.col-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+}
+
+.col-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+}
+
+.col-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+
+.col-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+}
+
+.col-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+}
+
+.col-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+
+.col-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+}
+
+.col-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+}
+
+.col-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+
+.col-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+}
+
+.col-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+}
+
+.col-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+}
+
+.order-first {
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -ms-flex-order: 13;
+ order: 13;
+}
+
+.order-0 {
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.order-1 {
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-2 {
+ -ms-flex-order: 2;
+ order: 2;
+}
+
+.order-3 {
+ -ms-flex-order: 3;
+ order: 3;
+}
+
+.order-4 {
+ -ms-flex-order: 4;
+ order: 4;
+}
+
+.order-5 {
+ -ms-flex-order: 5;
+ order: 5;
+}
+
+.order-6 {
+ -ms-flex-order: 6;
+ order: 6;
+}
+
+.order-7 {
+ -ms-flex-order: 7;
+ order: 7;
+}
+
+.order-8 {
+ -ms-flex-order: 8;
+ order: 8;
+}
+
+.order-9 {
+ -ms-flex-order: 9;
+ order: 9;
+}
+
+.order-10 {
+ -ms-flex-order: 10;
+ order: 10;
+}
+
+.order-11 {
+ -ms-flex-order: 11;
+ order: 11;
+}
+
+.order-12 {
+ -ms-flex-order: 12;
+ order: 12;
+}
+
+.offset-1 {
+ margin-right: 8.333333%;
+}
+
+.offset-2 {
+ margin-right: 16.666667%;
+}
+
+.offset-3 {
+ margin-right: 25%;
+}
+
+.offset-4 {
+ margin-right: 33.333333%;
+}
+
+.offset-5 {
+ margin-right: 41.666667%;
+}
+
+.offset-6 {
+ margin-right: 50%;
+}
+
+.offset-7 {
+ margin-right: 58.333333%;
+}
+
+.offset-8 {
+ margin-right: 66.666667%;
+}
+
+.offset-9 {
+ margin-right: 75%;
+}
+
+.offset-10 {
+ margin-right: 83.333333%;
+}
+
+.offset-11 {
+ margin-right: 91.666667%;
+}
+
+@media (min-width: 480px) {
+ .col-sm {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-sm-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-sm-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-sm-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-sm-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-sm-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-sm-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-sm-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-sm-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-sm-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-sm-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-sm-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-sm-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-sm-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-sm-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-sm-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-sm-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-sm-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-sm-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-sm-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-sm-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-sm-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-sm-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-sm-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-sm-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-sm-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-sm-0 {
+ margin-right: 0;
+ }
+ .offset-sm-1 {
+ margin-right: 8.333333%;
+ }
+ .offset-sm-2 {
+ margin-right: 16.666667%;
+ }
+ .offset-sm-3 {
+ margin-right: 25%;
+ }
+ .offset-sm-4 {
+ margin-right: 33.333333%;
+ }
+ .offset-sm-5 {
+ margin-right: 41.666667%;
+ }
+ .offset-sm-6 {
+ margin-right: 50%;
+ }
+ .offset-sm-7 {
+ margin-right: 58.333333%;
+ }
+ .offset-sm-8 {
+ margin-right: 66.666667%;
+ }
+ .offset-sm-9 {
+ margin-right: 75%;
+ }
+ .offset-sm-10 {
+ margin-right: 83.333333%;
+ }
+ .offset-sm-11 {
+ margin-right: 91.666667%;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-md {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-md-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-md-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-md-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-md-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-md-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-md-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-md-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-md-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-md-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-md-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-md-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-md-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-md-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-md-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-md-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-md-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-md-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-md-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-md-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-md-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-md-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-md-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-md-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-md-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-md-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-md-0 {
+ margin-right: 0;
+ }
+ .offset-md-1 {
+ margin-right: 8.333333%;
+ }
+ .offset-md-2 {
+ margin-right: 16.666667%;
+ }
+ .offset-md-3 {
+ margin-right: 25%;
+ }
+ .offset-md-4 {
+ margin-right: 33.333333%;
+ }
+ .offset-md-5 {
+ margin-right: 41.666667%;
+ }
+ .offset-md-6 {
+ margin-right: 50%;
+ }
+ .offset-md-7 {
+ margin-right: 58.333333%;
+ }
+ .offset-md-8 {
+ margin-right: 66.666667%;
+ }
+ .offset-md-9 {
+ margin-right: 75%;
+ }
+ .offset-md-10 {
+ margin-right: 83.333333%;
+ }
+ .offset-md-11 {
+ margin-right: 91.666667%;
+ }
+}
+
+@media (min-width: 980px) {
+ .col-lg {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-lg-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-lg-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-lg-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-lg-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-lg-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-lg-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-lg-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-lg-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-lg-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-lg-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-lg-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-lg-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-lg-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-lg-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-lg-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-lg-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-lg-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-lg-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-lg-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-lg-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-lg-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-lg-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-lg-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-lg-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-lg-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-lg-0 {
+ margin-right: 0;
+ }
+ .offset-lg-1 {
+ margin-right: 8.333333%;
+ }
+ .offset-lg-2 {
+ margin-right: 16.666667%;
+ }
+ .offset-lg-3 {
+ margin-right: 25%;
+ }
+ .offset-lg-4 {
+ margin-right: 33.333333%;
+ }
+ .offset-lg-5 {
+ margin-right: 41.666667%;
+ }
+ .offset-lg-6 {
+ margin-right: 50%;
+ }
+ .offset-lg-7 {
+ margin-right: 58.333333%;
+ }
+ .offset-lg-8 {
+ margin-right: 66.666667%;
+ }
+ .offset-lg-9 {
+ margin-right: 75%;
+ }
+ .offset-lg-10 {
+ margin-right: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-right: 91.666667%;
+ }
+}
+
+@media (min-width: 1220px) {
+ .col-xl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xl-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xl-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xl-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xl-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xl-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xl-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xl-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xl-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xl-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xl-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xl-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xl-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xl-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-xl-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-xl-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-xl-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-xl-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-xl-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-xl-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-xl-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-xl-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-xl-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-xl-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-xl-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-xl-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-xl-0 {
+ margin-right: 0;
+ }
+ .offset-xl-1 {
+ margin-right: 8.333333%;
+ }
+ .offset-xl-2 {
+ margin-right: 16.666667%;
+ }
+ .offset-xl-3 {
+ margin-right: 25%;
+ }
+ .offset-xl-4 {
+ margin-right: 33.333333%;
+ }
+ .offset-xl-5 {
+ margin-right: 41.666667%;
+ }
+ .offset-xl-6 {
+ margin-right: 50%;
+ }
+ .offset-xl-7 {
+ margin-right: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-right: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-right: 75%;
+ }
+ .offset-xl-10 {
+ margin-right: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-right: 91.666667%;
+ }
+}
+
+@media (min-width: 1380px) {
+ .col-xxl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xxl-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xxl-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xxl-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xxl-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xxl-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xxl-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xxl-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xxl-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xxl-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xxl-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xxl-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xxl-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xxl-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xxl-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xxl-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-xxl-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-xxl-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xxl-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-xxl-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-xxl-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-xxl-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-xxl-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-xxl-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-xxl-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-xxl-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-xxl-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-xxl-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-xxl-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-xxl-0 {
+ margin-right: 0;
+ }
+ .offset-xxl-1 {
+ margin-right: 8.333333%;
+ }
+ .offset-xxl-2 {
+ margin-right: 16.666667%;
+ }
+ .offset-xxl-3 {
+ margin-right: 25%;
+ }
+ .offset-xxl-4 {
+ margin-right: 33.333333%;
+ }
+ .offset-xxl-5 {
+ margin-right: 41.666667%;
+ }
+ .offset-xxl-6 {
+ margin-right: 50%;
+ }
+ .offset-xxl-7 {
+ margin-right: 58.333333%;
+ }
+ .offset-xxl-8 {
+ margin-right: 66.666667%;
+ }
+ .offset-xxl-9 {
+ margin-right: 75%;
+ }
+ .offset-xxl-10 {
+ margin-right: 83.333333%;
+ }
+ .offset-xxl-11 {
+ margin-right: 91.666667%;
+ }
+}
+
+.table {
+ width: 100%;
+ margin-bottom: 1.25rem;
+ color: #000;
+ background-color: #fff;
+}
+
+.table th,
+.table td {
+ padding: 0.625rem 0 0.625rem 0.625rem;
+ vertical-align: top;
+ border-top: 1px solid #ccc;
+}
+
+.table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ccc;
+}
+
+.table tbody + tbody {
+ border-top: 2px solid #ccc;
+}
+
+.table-sm th,
+.table-sm td {
+ padding: 0.3125rem 0 0.3125rem 0.3125rem;
+}
+
+.table-bordered {
+ border: 1px solid #ccc;
+}
+
+.table-bordered th,
+.table-bordered td {
+ border: 1px solid #ccc;
+}
+
+.table-bordered thead th,
+.table-bordered thead td {
+ border-bottom-width: 2px;
+}
+
+.table-borderless th,
+.table-borderless td,
+.table-borderless thead th,
+.table-borderless tbody + tbody {
+ border: 0;
+}
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #f6f6f6;
+}
+
+.table-hover tbody tr:hover {
+ color: #000;
+ background-color: #eee;
+}
+
+.table-primary,
+.table-primary > th,
+.table-primary > td {
+ background-color: #f16e00;
+}
+
+.table-hover .table-primary:hover {
+ background-color: #d86200;
+}
+
+.table-hover .table-primary:hover > td,
+.table-hover .table-primary:hover > th {
+ background-color: #d86200;
+}
+
+.table-secondary,
+.table-secondary > th,
+.table-secondary > td {
+ background-color: black;
+ color: #fff;
+}
+
+.table-hover .table-secondary:hover {
+ background-color: black;
+}
+
+.table-hover .table-secondary:hover > td,
+.table-hover .table-secondary:hover > th {
+ background-color: black;
+}
+
+.table-success,
+.table-success > th,
+.table-success > td {
+ background-color: #32c832;
+}
+
+.table-hover .table-success:hover {
+ background-color: #2db42d;
+}
+
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
+ background-color: #2db42d;
+}
+
+.table-info,
+.table-info > th,
+.table-info > td {
+ background-color: #527edb;
+}
+
+.table-hover .table-info:hover {
+ background-color: #3d6ed7;
+}
+
+.table-hover .table-info:hover > td,
+.table-hover .table-info:hover > th {
+ background-color: #3d6ed7;
+}
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
+ background-color: #ffcc00;
+}
+
+.table-hover .table-warning:hover {
+ background-color: #e6b800;
+}
+
+.table-hover .table-warning:hover > td,
+.table-hover .table-warning:hover > th {
+ background-color: #e6b800;
+}
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
+ background-color: #cd3c14;
+ color: #fff;
+}
+
+.table-hover .table-danger:hover {
+ background-color: #b63512;
+}
+
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
+ background-color: #b63512;
+}
+
+.table-light,
+.table-light > th,
+.table-light > td {
+ background-color: #dddddd;
+}
+
+.table-hover .table-light:hover {
+ background-color: #d0d0d0;
+}
+
+.table-hover .table-light:hover > td,
+.table-hover .table-light:hover > th {
+ background-color: #d0d0d0;
+}
+
+.table-dark,
+.table-dark > th,
+.table-dark > td {
+ background-color: black;
+ color: #fff;
+}
+
+.table-hover .table-dark:hover {
+ background-color: black;
+}
+
+.table-hover .table-dark:hover > td,
+.table-hover .table-dark:hover > th {
+ background-color: black;
+}
+
+.table-active,
+.table-active > th,
+.table-active > td {
+ background-color: #ddd;
+}
+
+.table-hover .table-active:hover {
+ background-color: #d0d0d0;
+}
+
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+ background-color: #d0d0d0;
+}
+
+.table .thead-dark th {
+ color: #fff;
+ background-color: #000;
+ border-color: #ccc;
+}
+
+.table .thead-light th {
+ color: #000;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.table-dark {
+ color: #fff;
+ background-color: #000;
+}
+
+.table-dark th,
+.table-dark td,
+.table-dark thead th {
+ border-color: #ccc;
+}
+
+.table-dark.table-bordered {
+ border: 0;
+}
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #333;
+}
+
+.table-dark.table-hover tbody tr:hover {
+ color: #fff;
+ background-color: #666;
+}
+
+@media (max-width: 479.98px) {
+ .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-sm > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-md > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-lg > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 1219.98px) {
+ .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-xl > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 1379.98px) {
+ .table-responsive-xxl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-xxl > .table-bordered {
+ border: 0;
+ }
+}
+
+.table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.table-responsive > .table-bordered {
+ border: 0;
+}
+
+label {
+ font-weight: 700;
+}
+
+label.disabled {
+ color: #767676;
+}
+
+label.is-required::after {
+ margin-right: 6px;
+ font-weight: 700;
+ color: #f16e00;
+ content: "*";
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ padding: 0.5rem 0.625rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 2px solid #ccc;
+ border-radius: 0;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .form-control {
+ transition: none;
+ }
+}
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0;
+}
+
+.form-control:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+ outline: 0;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control::-moz-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control::-ms-input-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control::placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control:disabled, .form-control[readonly] {
+ color: #666;
+ background-color: #eee;
+ opacity: 1;
+}
+
+select.form-control:focus::-ms-value {
+ color: #000;
+ background-color: #fff;
+}
+
+.form-control-file,
+.form-control-range {
+ display: block;
+ width: 100%;
+}
+
+.col-form-label {
+ padding-top: calc(0.5rem + 2px);
+ padding-bottom: calc(0.5rem + 2px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.25;
+}
+
+.col-form-label-lg {
+ padding-top: calc(0.594rem + 2px);
+ padding-bottom: calc(0.594rem + 2px);
+ font-size: 1.125rem;
+ line-height: 1.5;
+}
+
+.col-form-label-sm {
+ padding-top: calc(0.157rem + 2px);
+ padding-bottom: calc(0.157rem + 2px);
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ margin-bottom: 0;
+ line-height: 1.25;
+ color: #000;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 2px 0;
+}
+
+.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.form-control-sm {
+ height: calc(1.6265rem + 4px);
+ padding: 0.157rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.form-control-lg {
+ height: calc(2.8755rem + 4px);
+ padding: 0.594rem 1.25rem;
+ font-size: 1.125rem;
+ line-height: 1.5;
+}
+
+select.form-control[size], select.form-control[multiple] {
+ height: auto;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+.form-group {
+ margin-bottom: 1.25rem;
+}
+
+.form-text {
+ display: block;
+ margin-top: 0.625rem;
+}
+
+.form-row {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-left: -5px;
+ margin-right: -5px;
+}
+
+.form-row > .col,
+.form-row > [class*="col-"] {
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+.form-check {
+ position: relative;
+ display: block;
+ padding-right: 1.25rem;
+ margin-bottom: 0.625rem;
+}
+
+.form-check-input {
+ position: absolute;
+ margin-top: 0.3rem;
+ margin-right: -1.25rem;
+}
+
+.form-check-input:disabled ~ .form-check-label {
+ color: #666;
+}
+
+.form-check-label {
+ margin-bottom: 0;
+}
+
+.form-check-inline {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding-right: 0;
+ margin-left: 0.75rem;
+}
+
+.form-check-inline .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-left: 0.3125rem;
+ margin-right: 0;
+}
+
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.625rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+}
+
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.625rem 0.625rem;
+ margin-top: .1rem;
+ font-size: 0.875rem;
+ line-height: 1.25;
+ color: #000;
+ background-color: rgba(50, 200, 50, 0.9);
+}
+
+.was-validated .form-control:valid, .form-control.is-valid {
+ border-color: #32c832;
+}
+
+.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
+ border-color: #32c832;
+}
+
+.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {
+ position: relative;
+ display: block;
+ padding-right: 1.625rem;
+}
+
+.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {
+ position: absolute;
+ top: -.1rem;
+ right: 0;
+ width: 1.125rem;
+ height: 1.125rem;
+ content: "";
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
+ padding-left: 2.25rem;
+ background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);
+}
+
+.was-validated .custom-select:valid, .custom-select.is-valid {
+ border-color: #32c832;
+ padding-left: 3.1875rem;
+ background: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat left 0.5rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;
+}
+
+.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
+ border-color: #32c832;
+}
+
+.was-validated .custom-select:valid ~ .valid-feedback,
+.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,
+.custom-select.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .form-control-file:valid ~ .valid-feedback,
+.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
+.form-control-file.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
+ color: #32c832;
+}
+
+.was-validated .form-check-input:valid ~ .valid-feedback,
+.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
+.form-check-input.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
+ color: #32c832;
+}
+
+.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
+ border-color: #32c832;
+}
+
+.was-validated .custom-control-input:valid ~ .valid-feedback,
+.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
+.custom-control-input.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
+ border-color: #58d558;
+ background-color: #58d558;
+}
+
+.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
+ border-color: #32c832;
+}
+
+.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
+ border-color: #32c832;
+}
+
+.was-validated .custom-file-input:valid ~ .valid-feedback,
+.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
+.custom-file-input.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
+ border-color: #32c832;
+}
+
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.625rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+}
+
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.625rem 0.625rem;
+ margin-top: .1rem;
+ font-size: 0.875rem;
+ line-height: 1.25;
+ color: #fff;
+ background-color: rgba(205, 60, 20, 0.9);
+}
+
+.was-validated .form-control:invalid, .form-control.is-invalid {
+ border-color: #cd3c14;
+}
+
+.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
+ border-color: #cd3c14;
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {
+ position: relative;
+ display: block;
+ padding-right: 1.625rem;
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {
+ position: absolute;
+ top: -.1rem;
+ right: 0;
+ width: 1.125rem;
+ height: 1.125rem;
+ content: "";
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
+ padding-left: 2.25rem;
+ background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);
+}
+
+.was-validated .custom-select:invalid, .custom-select.is-invalid {
+ border-color: #cd3c14;
+ padding-left: 3.1875rem;
+ background: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat left 0.5rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;
+}
+
+.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-select:invalid ~ .invalid-feedback,
+.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,
+.custom-select.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .form-control-file:invalid ~ .invalid-feedback,
+.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
+.form-control-file.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
+ color: #cd3c14;
+}
+
+.was-validated .form-check-input:invalid ~ .invalid-feedback,
+.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
+.form-check-input.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
+ color: #cd3c14;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-control-input:invalid ~ .invalid-feedback,
+.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
+.custom-control-input.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
+ border-color: #ea532a;
+ background-color: #ea532a;
+}
+
+.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-file-input:invalid ~ .invalid-feedback,
+.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
+.custom-file-input.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
+ border-color: #cd3c14;
+}
+
+.form-inline {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.form-inline .form-check {
+ width: 100%;
+}
+
+@media (min-width: 480px) {
+ .form-inline label {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-plaintext {
+ display: inline-block;
+ }
+ .form-inline .input-group,
+ .form-inline .custom-select {
+ width: auto;
+ }
+ .form-inline .form-check {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: auto;
+ padding-right: 0;
+ }
+ .form-inline .form-check-input {
+ position: relative;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ margin-top: 0;
+ margin-left: 0.25rem;
+ margin-right: 0;
+ }
+ .form-inline .custom-control {
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ }
+ .form-inline .custom-control-label {
+ margin-bottom: 0;
+ }
+}
+
+.btn {
+ display: inline-block;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-weight: 700;
+ color: #000;
+ text-align: center;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: transparent;
+ border: 2px solid transparent;
+ padding: 0.5rem 1.125rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .btn {
+ transition: none;
+ }
+}
+
+.btn:hover {
+ color: #000;
+ text-decoration: none;
+}
+
+.btn:focus, .btn.focus {
+ outline: 0;
+ box-shadow: none;
+}
+
+.btn.disabled, .btn:disabled {
+ opacity: 1;
+}
+
+a.btn {
+ text-decoration: none;
+}
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+ pointer-events: none;
+}
+
+.btn-primary,
+.btn-warning {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-primary:hover, .btn-primary:focus,
+.btn-warning:hover,
+.btn-warning:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-primary.disabled, .btn-primary:disabled,
+.btn-warning.disabled,
+.btn-warning:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
+.show > .btn-primary.dropdown-toggle,
+.btn-warning:not(:disabled):not(.disabled):active,
+.btn-warning:not(:disabled):not(.disabled).active,
+.show >
+.btn-warning.dropdown-toggle {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+}
+
+.btn-primary.btn-inverse,
+.btn-warning.btn-inverse {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,
+.btn-warning.btn-inverse:hover,
+.btn-warning.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,
+.btn-warning.btn-inverse.disabled,
+.btn-warning.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-primary.btn-inverse.dropdown-toggle,
+.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,
+.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,
+.show >
+.btn-warning.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #000;
+ border-color: #fff;
+}
+
+.btn-secondary,
+.btn-light {
+ color: #000;
+ background-color: transparent;
+ border-color: #000;
+}
+
+.btn-secondary:hover, .btn-secondary:focus,
+.btn-light:hover,
+.btn-light:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-secondary.disabled, .btn-secondary:disabled,
+.btn-light.disabled,
+.btn-light:disabled {
+ color: #ccc;
+ background-color: transparent;
+ border-color: #ccc;
+}
+
+.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-secondary.dropdown-toggle,
+.btn-light:not(:disabled):not(.disabled):active,
+.btn-light:not(:disabled):not(.disabled).active,
+.show >
+.btn-light.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-secondary.btn-inverse,
+.btn-light.btn-inverse {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,
+.btn-light.btn-inverse:hover,
+.btn-light.btn-inverse:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #fff;
+}
+
+.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,
+.btn-light.btn-inverse.disabled,
+.btn-light.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-secondary.btn-inverse.dropdown-toggle,
+.btn-light.btn-inverse:not(:disabled):not(.disabled):active,
+.btn-light.btn-inverse:not(:disabled):not(.disabled).active,
+.show >
+.btn-light.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-success {
+ color: #000;
+ background-color: #32c832;
+ border-color: #32c832;
+}
+
+.btn-success:hover, .btn-success:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-success.disabled, .btn-success:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
+.show > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-success.btn-inverse {
+ color: #000;
+ background-color: #32c832;
+ border-color: #32c832;
+}
+
+.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-success.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-info,
+.btn-dark {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-info:hover, .btn-info:focus,
+.btn-dark:hover,
+.btn-dark:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+}
+
+.btn-info.disabled, .btn-info:disabled,
+.btn-dark.disabled,
+.btn-dark:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
+.show > .btn-info.dropdown-toggle,
+.btn-dark:not(:disabled):not(.disabled):active,
+.btn-dark:not(:disabled):not(.disabled).active,
+.show >
+.btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-info.btn-inverse,
+.btn-dark.btn-inverse {
+ color: #fff;
+ background-color: transparent;
+ border-color: #fff;
+}
+
+.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,
+.btn-dark.btn-inverse:hover,
+.btn-dark.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,
+.btn-dark.btn-inverse.disabled,
+.btn-dark.btn-inverse:disabled {
+ color: #666;
+ background-color: transparent;
+ border-color: #666;
+}
+
+.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-info.btn-inverse.dropdown-toggle,
+.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,
+.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,
+.show >
+.btn-dark.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.btn-danger:hover, .btn-danger:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-danger.disabled, .btn-danger:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
+.show > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-danger.btn-inverse {
+ color: #fff;
+ background-color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-danger.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-primary {
+ color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-primary:hover, .btn-outline-primary:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+ color: #f16e00;
+ background-color: transparent;
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-primary.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-secondary {
+ color: #000;
+ border-color: #000;
+}
+
+.btn-outline-secondary:hover, .btn-outline-secondary:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+ color: #000;
+ background-color: transparent;
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-secondary.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-success {
+ color: #32c832;
+ border-color: #32c832;
+}
+
+.btn-outline-success:hover, .btn-outline-success:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+ color: #32c832;
+ background-color: transparent;
+}
+
+.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
+.show > .btn-outline-success.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-info {
+ color: #000;
+ border-color: #000;
+}
+
+.btn-outline-info:hover, .btn-outline-info:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+ color: #000;
+ background-color: transparent;
+}
+
+.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
+.show > .btn-outline-info.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-warning {
+ color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-warning:hover, .btn-outline-warning:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+ color: #f16e00;
+ background-color: transparent;
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
+.show > .btn-outline-warning.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-danger {
+ color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.btn-outline-danger:hover, .btn-outline-danger:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
+ color: #cd3c14;
+ background-color: transparent;
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
+.show > .btn-outline-danger.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-light {
+ color: #ddd;
+ border-color: #ddd;
+}
+
+.btn-outline-light:hover, .btn-outline-light:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-light.disabled, .btn-outline-light:disabled {
+ color: #ddd;
+ background-color: transparent;
+}
+
+.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
+.show > .btn-outline-light.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-dark {
+ color: #000;
+ border-color: #000;
+}
+
+.btn-outline-dark:hover, .btn-outline-dark:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-dark.disabled, .btn-outline-dark:disabled {
+ color: #000;
+ background-color: transparent;
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
+.show > .btn-outline-dark.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-link {
+ color: #000;
+}
+
+.btn-link.btn-inverse {
+ color: #fff;
+}
+
+.btn-link:hover {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+.btn-link:focus, .btn-link.focus {
+ text-decoration: none;
+ box-shadow: none;
+}
+
+.btn-link:disabled, .btn-link.disabled {
+ color: #ccc;
+ pointer-events: none;
+}
+
+.btn-xlg {
+ padding: 0.8125rem 1.25rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: 0;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 0.594rem 1.25rem;
+ font-size: 1.125rem;
+ line-height: 1.5;
+ border-radius: 0;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 0.157rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ border-radius: 0;
+}
+
+.btn-mail {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-mail:hover, .btn-mail:focus {
+ outline: none;
+}
+
+.btn-mail-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-mail-inverse:hover, .btn-mail-inverse:focus {
+ outline: none;
+}
+
+.btn-lin {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-lin:hover, .btn-lin:focus {
+ outline: none;
+}
+
+.btn-lin-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-lin-inverse:hover, .btn-lin-inverse:focus {
+ outline: none;
+}
+
+.btn-gplus {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-gplus:hover, .btn-gplus:focus {
+ outline: none;
+}
+
+.btn-gplus-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {
+ outline: none;
+}
+
+.btn-tw {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-tw:hover, .btn-tw:focus {
+ outline: none;
+}
+
+.btn-tw-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-tw-inverse:hover, .btn-tw-inverse:focus {
+ outline: none;
+}
+
+.btn-fbk {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-fbk:hover, .btn-fbk:focus {
+ outline: none;
+}
+
+.btn-fbk-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {
+ outline: none;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+.btn-block + .btn-block {
+ margin-top: 0.5rem;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .fade {
+ transition: none;
+ }
+}
+
+.fade:not(.show) {
+ opacity: 0;
+}
+
+.collapse:not(.show) {
+ display: none;
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .collapsing {
+ transition: none;
+ }
+}
+
+.dropup,
+.dropright,
+.dropdown,
+.dropleft {
+ position: relative;
+}
+
+.dropdown-toggle {
+ white-space: nowrap;
+}
+
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-right: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0.4375rem solid;
+ border-left: 0.4375rem solid transparent;
+ border-bottom: 0;
+ border-right: 0.4375rem solid transparent;
+}
+
+.dropdown-toggle:empty::after {
+ margin-right: 0;
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ right: 0;
+ z-index: 1000;
+ display: none;
+ float: right;
+ min-width: 10rem;
+ padding: 0 0;
+ margin: -2px 0 0;
+ font-size: 1rem;
+ color: #000;
+ text-align: right;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 2px solid #000;
+}
+
+.dropdown-menu-left {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu-right {
+ left: 0;
+ right: auto;
+}
+
+@media (min-width: 480px) {
+ .dropdown-menu-sm-left {
+ left: auto;
+ right: 0;
+ }
+ .dropdown-menu-sm-right {
+ left: 0;
+ right: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .dropdown-menu-md-left {
+ left: auto;
+ right: 0;
+ }
+ .dropdown-menu-md-right {
+ left: 0;
+ right: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .dropdown-menu-lg-left {
+ left: auto;
+ right: 0;
+ }
+ .dropdown-menu-lg-right {
+ left: 0;
+ right: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .dropdown-menu-xl-left {
+ left: auto;
+ right: 0;
+ }
+ .dropdown-menu-xl-right {
+ left: 0;
+ right: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .dropdown-menu-xxl-left {
+ left: auto;
+ right: 0;
+ }
+ .dropdown-menu-xxl-right {
+ left: 0;
+ right: auto;
+ }
+}
+
+.dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: -2px;
+}
+
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-right: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0;
+ border-left: 0.4375rem solid transparent;
+ border-bottom: 0.4375rem solid;
+ border-right: 0.4375rem solid transparent;
+}
+
+.dropup .dropdown-toggle:empty::after {
+ margin-right: 0;
+}
+
+.dropright .dropdown-menu {
+ top: 0;
+ left: auto;
+ right: 100%;
+ margin-top: 0;
+ margin-right: -2px;
+}
+
+.dropright .dropdown-toggle::after {
+ display: inline-block;
+ margin-right: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0.4375rem solid transparent;
+ border-left: 0;
+ border-bottom: 0.4375rem solid transparent;
+ border-right: 0.4375rem solid;
+}
+
+.dropright .dropdown-toggle:empty::after {
+ margin-right: 0;
+}
+
+.dropright .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.dropleft .dropdown-menu {
+ top: 0;
+ left: 100%;
+ right: auto;
+ margin-top: 0;
+ margin-left: -2px;
+}
+
+.dropleft .dropdown-toggle::after {
+ display: inline-block;
+ margin-right: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+}
+
+.dropleft .dropdown-toggle::after {
+ display: none;
+}
+
+.dropleft .dropdown-toggle::before {
+ display: inline-block;
+ margin-left: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0.4375rem solid transparent;
+ border-left: 0.4375rem solid;
+ border-bottom: 0.4375rem solid transparent;
+}
+
+.dropleft .dropdown-toggle:empty::after {
+ margin-right: 0;
+}
+
+.dropleft .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
+ left: auto;
+ bottom: auto;
+}
+
+.dropdown-divider {
+ height: 0;
+ margin: 0.625rem 0;
+ overflow: hidden;
+ border-top: 1px solid #eee;
+}
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: 0.625rem 0.625rem;
+ clear: both;
+ font-weight: 400;
+ color: #000;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.dropdown-item:hover, .dropdown-item:focus {
+ color: #fff;
+ text-decoration: none;
+ background-color: #000;
+}
+
+.dropdown-item.active, .dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #000;
+}
+
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: #666;
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.dropdown-menu.show {
+ display: block;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 0 0.625rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #000;
+ white-space: nowrap;
+}
+
+.dropdown-item-text {
+ display: block;
+ padding: 0.625rem 0.625rem;
+ color: #000;
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+}
+
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover {
+ z-index: 1;
+}
+
+.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.btn-toolbar {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+
+.btn-toolbar .input-group {
+ width: auto;
+}
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) {
+ margin-right: -2px;
+}
+
+.dropdown-toggle-split {
+ padding-left: 0.84375rem;
+ padding-right: 0.84375rem;
+}
+
+.dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after,
+.dropright .dropdown-toggle-split::after {
+ margin-right: 0;
+}
+
+.dropleft .dropdown-toggle-split::before {
+ margin-left: 0;
+}
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-left: 0.46875rem;
+ padding-right: 0.46875rem;
+}
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-left: 0.9375rem;
+ padding-right: 0.9375rem;
+}
+
+.btn-group-vertical {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+ width: 100%;
+}
+
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -2px;
+}
+
+.btn-group-toggle > .btn,
+.btn-group-toggle > .btn-group > .btn {
+ margin-bottom: 0;
+}
+
+.btn-group-toggle > .btn input[type="radio"],
+.btn-group-toggle > .btn input[type="checkbox"],
+.btn-group-toggle > .btn-group > .btn input[type="radio"],
+.btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.input-group {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ width: 100%;
+}
+
+.input-group > .form-control,
+.input-group > .form-control-plaintext,
+.input-group > .custom-select,
+.input-group > .custom-file {
+ position: relative;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0;
+}
+
+.input-group > .form-control + .form-control,
+.input-group > .form-control + .custom-select,
+.input-group > .form-control + .custom-file,
+.input-group > .form-control-plaintext + .form-control,
+.input-group > .form-control-plaintext + .custom-select,
+.input-group > .form-control-plaintext + .custom-file,
+.input-group > .custom-select + .form-control,
+.input-group > .custom-select + .custom-select,
+.input-group > .custom-select + .custom-file,
+.input-group > .custom-file + .form-control,
+.input-group > .custom-file + .custom-select,
+.input-group > .custom-file + .custom-file {
+ margin-right: -2px;
+}
+
+.input-group > .form-control:focus,
+.input-group > .custom-select:focus,
+.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
+ z-index: 3;
+}
+
+.input-group > .custom-file .custom-file-input:focus {
+ z-index: 4;
+}
+
+.input-group > .custom-file {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.input-group-prepend,
+.input-group-append {
+ display: -ms-flexbox;
+ display: flex;
+}
+
+.input-group-prepend .btn,
+.input-group-append .btn {
+ position: relative;
+ z-index: 2;
+}
+
+.input-group-prepend .btn:focus,
+.input-group-append .btn:focus {
+ z-index: 3;
+}
+
+.input-group-prepend .btn + .btn,
+.input-group-prepend .btn + .input-group-text,
+.input-group-prepend .input-group-text + .input-group-text,
+.input-group-prepend .input-group-text + .btn,
+.input-group-append .btn + .btn,
+.input-group-append .btn + .input-group-text,
+.input-group-append .input-group-text + .input-group-text,
+.input-group-append .input-group-text + .btn {
+ margin-right: -2px;
+}
+
+.input-group-prepend {
+ margin-left: -2px;
+}
+
+.input-group-append {
+ margin-right: -2px;
+}
+
+.input-group-prepend + .form-control {
+ border-right-color: transparent;
+}
+
+.form-control:focus + .input-group-append,
+.custom-select:focus + .input-group-append {
+ position: relative;
+ z-index: 5;
+}
+
+.input-group-text {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 0.5rem 0.625rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #000;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #eee;
+ border: 2px solid #ccc;
+}
+
+.input-group-text input[type="radio"],
+.input-group-text input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group-lg > .form-control:not(textarea),
+.input-group-lg > .custom-select {
+ height: calc(2.8755rem + 4px);
+}
+
+.input-group-lg > .form-control,
+.input-group-lg > .custom-select,
+.input-group-lg > .input-group-prepend > .input-group-text,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-append > .btn {
+ padding: 0.594rem 1.25rem;
+ font-size: 1.125rem;
+ line-height: 1.5;
+}
+
+.input-group-sm > .form-control:not(textarea),
+.input-group-sm > .custom-select {
+ height: calc(1.6265rem + 4px);
+}
+
+.input-group-sm > .form-control,
+.input-group-sm > .custom-select,
+.input-group-sm > .input-group-prepend > .input-group-text,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-append > .btn {
+ padding: 0.157rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.input-group-lg > .custom-select,
+.input-group-sm > .custom-select {
+ padding-left: 1.5rem;
+}
+
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: 1.25rem;
+ padding-right: 1.875rem;
+ margin-bottom: 0.625rem;
+}
+
+.custom-control-inline {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ margin-left: 1.25rem;
+}
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
+}
+
+.custom-control-input:checked ~ .custom-control-label::before {
+ color: #fff;
+ border-color: #f16e00;
+ background-color: #f16e00;
+}
+
+.custom-control-input:checked ~ .custom-control-label::before::before {
+ background-color: #f16e00;
+}
+
+.custom-control-input:focus ~ .custom-control-label::before {
+ outline: dotted 1px #000;
+ box-shadow: none;
+}
+
+.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.custom-control-input:disabled ~ .custom-control-label {
+ color: #767676;
+}
+
+.custom-control-input:disabled ~ .custom-control-label::before {
+ border-color: #ccc;
+}
+
+.custom-control-input:disabled:checked ~ .custom-control-label::before {
+ background-color: #ccc;
+}
+
+.custom-control-label {
+ margin-bottom: 0;
+ vertical-align: top;
+}
+
+.custom-control-label::before {
+ position: absolute;
+ top: 0rem;
+ right: 0;
+ display: block;
+ width: 1.25rem;
+ height: 1.25rem;
+ content: "";
+ background-color: #fff;
+ border: #666 solid 2px;
+}
+
+.custom-control-label::after {
+ position: absolute;
+ top: 0rem;
+ right: 0;
+ display: block;
+ width: 1.25rem;
+ height: 1.25rem;
+ pointer-events: none;
+ content: "";
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 1rem;
+}
+
+.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {
+ border: 2px solid #f16e00;
+}
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
+ top: .4rem;
+ right: .2585rem;
+ width: .8272rem;
+ height: .3619rem;
+ border: 3px solid #fff;
+ border-top: none;
+ border-right: none;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
+
+.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {
+ outline-color: #000;
+}
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
+ border-color: #f16e00;
+ background-color: #f16e00;
+}
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
+ border: 3px solid #fff;
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ -webkit-transform: scaleX(0.5) translateY(-0.5rem);
+ transform: scaleX(0.5) translateY(-0.5rem);
+}
+
+.custom-radio .custom-control-label::before {
+ border-radius: 50%;
+}
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
+ border: 6px solid #f16e00;
+ border-radius: 50%;
+}
+
+.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {
+ border-color: #ccc;
+}
+
+.custom-switch {
+ padding-right: 4.375rem;
+}
+
+.custom-switch .custom-control-input:focus ~ .custom-control-label::after {
+ outline: 1px dotted #fff;
+}
+
+.custom-switch .custom-control-label {
+ padding-top: .3125rem;
+}
+
+.custom-switch .custom-control-label::before {
+ right: 0;
+ width: 3.75rem;
+ height: 1.875rem;
+ pointer-events: all;
+ background-color: #666;
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: 1.975rem;
+ border-radius: 0;
+}
+
+.custom-switch .custom-control-label::after {
+ top: calc(0rem + 2px);
+ right: 2px;
+ width: calc(3.75rem / 2 - 4px);
+ height: calc(1.875rem - 4px);
+ background-color: #fff;
+ border-radius: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+ transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-switch .custom-control-label::after {
+ transition: none;
+ }
+}
+
+.custom-switch.right {
+ padding-left: 4.375rem;
+ padding-right: 0;
+}
+
+.custom-switch.right .custom-control-label::before {
+ left: 0;
+ right: auto;
+}
+
+.custom-switch.right .custom-control-label::after {
+ left: calc(1.875rem + 2px);
+ right: auto;
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: .25rem;
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+ background-color: #fff;
+ -webkit-transform: translateX(-1.875rem);
+ transform: translateX(-1.875rem);
+}
+
+.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
+ background-color: #ccc;
+}
+
+.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {
+ background-color: #ccc;
+}
+
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ padding: 0.4375rem 0.5rem 0.4375rem 1.5rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ vertical-align: middle;
+ background: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat left 0.5rem center/8px 10px;
+ background-color: #fff;
+ border: 2px solid #ccc;
+ border-radius: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.custom-select:focus {
+ border-color: #000;
+ outline: 0;
+ box-shadow: none;
+}
+
+.custom-select:focus::-ms-value {
+ color: #000;
+ background-color: #fff;
+}
+
+.custom-select[multiple], .custom-select[size]:not([size="1"]) {
+ height: auto;
+ padding-left: 0.5rem;
+ background-image: none;
+}
+
+.custom-select:disabled {
+ color: #999;
+ background-color: #eee;
+}
+
+.custom-select::-ms-expand {
+ display: none;
+}
+
+.custom-select-sm {
+ height: calc(1.6265rem + 4px);
+ padding-top: 0.157rem;
+ padding-bottom: 0.157rem;
+ padding-right: 0.625rem;
+ font-size: 0.875rem;
+}
+
+.custom-select-lg {
+ height: calc(2.8755rem + 4px);
+ padding-top: 0.594rem;
+ padding-bottom: 0.594rem;
+ padding-right: 1.25rem;
+ font-size: 1.125rem;
+}
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ margin-bottom: 0;
+}
+
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ margin: 0;
+ opacity: 0;
+}
+
+.custom-file-input:focus ~ .custom-file-label {
+ border-color: #000;
+ box-shadow: none;
+}
+
+.custom-file-input:disabled ~ .custom-file-label {
+ background-color: #eee;
+}
+
+.custom-file-input:lang(en) ~ .custom-file-label::after {
+ content: "Browse";
+}
+
+.custom-file-input ~ .custom-file-label[data-browse]::after {
+ content: attr(data-browse);
+}
+
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 1;
+ height: calc(2.25rem + 4px);
+ padding: 0.5rem 0.625rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ background-color: #fff;
+ border: 2px solid #ccc;
+}
+
+.custom-file-label::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: 2.25rem;
+ padding: 0.5rem 0.625rem;
+ line-height: 1.25;
+ color: #000;
+ content: "Browse";
+ background-color: #eee;
+ border-right: inherit;
+}
+
+.custom-range {
+ width: 100%;
+ height: calc(1rem + 0.25rem);
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.custom-range:focus {
+ outline: none;
+}
+
+.custom-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;
+}
+
+.custom-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;
+}
+
+.custom-range:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;
+}
+
+.custom-range::-moz-focus-outer {
+ border: 0;
+}
+
+.custom-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #000;
+ border: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-webkit-slider-thumb {
+ transition: none;
+ }
+}
+
+.custom-range::-webkit-slider-thumb:active {
+ background-color: #f16e00;
+}
+
+.custom-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #999;
+ border-color: transparent;
+}
+
+.custom-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #000;
+ border: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-moz-range-thumb {
+ transition: none;
+ }
+}
+
+.custom-range::-moz-range-thumb:active {
+ background-color: #f16e00;
+}
+
+.custom-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #999;
+ border-color: transparent;
+}
+
+.custom-range::-ms-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: 0;
+ margin-left: 0.125rem;
+ margin-right: 0.125rem;
+ background-color: #000;
+ border: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-ms-thumb {
+ transition: none;
+ }
+}
+
+.custom-range::-ms-thumb:active {
+ background-color: #f16e00;
+}
+
+.custom-range::-ms-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: transparent;
+ border-color: transparent;
+ border-width: 0.5rem;
+}
+
+.custom-range::-ms-fill-lower {
+ background-color: #999;
+}
+
+.custom-range::-ms-fill-upper {
+ margin-left: 15px;
+ background-color: #999;
+}
+
+.custom-range:disabled::-webkit-slider-thumb {
+ background-color: #ccc;
+}
+
+.custom-range:disabled::-webkit-slider-runnable-track {
+ cursor: default;
+}
+
+.custom-range:disabled::-moz-range-thumb {
+ background-color: #ccc;
+}
+
+.custom-range:disabled::-moz-range-track {
+ cursor: default;
+}
+
+.custom-range:disabled::-ms-thumb {
+ background-color: #ccc;
+}
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-control-label::before,
+ .custom-file-label,
+ .custom-select {
+ transition: none;
+ }
+}
+
+.nav {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding-right: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.nav-link {
+ display: block;
+ padding: 0.625rem 1.25rem;
+ font-weight: 700;
+}
+
+.nav-link:hover, .nav-link:focus {
+ text-decoration: none;
+}
+
+.nav-link.disabled {
+ color: #666;
+ pointer-events: none;
+ cursor: default;
+}
+
+.nav-tabs {
+ border-bottom: 2px solid #000;
+}
+
+.nav-tabs .nav-item {
+ margin-bottom: -2px;
+}
+
+.nav-tabs .nav-link {
+ padding: 0.625rem calc(1.25rem - 2px);
+ line-height: 1rem;
+ border: 2px solid transparent;
+ border-bottom-width: 0;
+}
+
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.nav-tabs .nav-link.disabled {
+ color: #666;
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -2px;
+}
+
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #000;
+}
+
+.nav-fill .nav-item {
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.nav-justified .nav-item {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.navbar {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 0 0;
+ font-weight: 700;
+}
+
+.navbar > .container,
+.navbar > .container-fluid {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.navbar-brand {
+ display: inline-block;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin: .625rem .3125rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+ line-height: inherit;
+ white-space: nowrap;
+}
+
+.navbar-brand:hover, .navbar-brand:focus {
+ text-decoration: none;
+}
+
+.navbar-brand + .navbar-brand {
+ margin-left: 0;
+ margin-right: 1.25rem;
+}
+
+.navbar-brand:focus {
+ outline: 1px dotted #fff;
+ outline-offset: .625rem;
+}
+
+.navbar-brand img {
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ width: 1.875rem;
+ height: 1.875rem;
+ margin-top: 0;
+ margin-bottom: .25rem;
+}
+
+.navbar-nav {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-right: 0;
+ margin-top: auto;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.navbar-nav .nav-link {
+ padding-top: .875rem;
+ padding-left: .625rem;
+ padding-bottom: .875rem;
+ padding-right: .625rem;
+ margin-top: 0;
+}
+
+.navbar-nav .nav-link.active::before {
+ display: none;
+}
+
+.navbar-nav .nav-link.icon {
+ padding: .78125rem .625rem;
+ margin-top: 0;
+}
+
+.navbar-nav .nav-link[class^="svg-"] {
+ margin: .625rem;
+}
+
+.navbar-nav .nav-link[role="menuitem"]::before {
+ float: left;
+ margin-left: 1rem;
+ font-family: icon-orange;
+ font-size: 1rem;
+ font-weight: 400;
+ color: #fff;
+ content: "\e93e";
+}
+
+.navbar-nav .nav-link:focus {
+ outline-offset: .625rem;
+}
+
+.navbar-nav .dropdown-menu {
+ position: static;
+ top: 2rem;
+ float: none;
+}
+
+.navbar-nav .nav-item {
+ margin-right: 0;
+ font-size: 1.125rem;
+ border-top: 1px solid #333;
+}
+
+.navbar-nav .dropdown {
+ padding: 0;
+}
+
+.navbar-nav .dropdown .dropdown-toggle,
+.navbar-nav .dropdown .dropdown-item {
+ padding: .875rem .625rem .875rem 0;
+}
+
+.navbar-nav .dropdown.show .dropdown-toggle::after {
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+}
+
+.navbar-nav .dropdown .dropdown-item {
+ color: #fff;
+ white-space: normal;
+ background-color: #000;
+ border-top: 1px solid #333;
+}
+
+.navbar-nav .dropdown .dropdown-item:focus {
+ color: #f16e00;
+}
+
+.navbar-text {
+ display: inline-block;
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.navbar-collapse {
+ -ms-flex-preferred-size: 100%;
+ flex-basis: 100%;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+}
+
+.navbar-collapse .navbar-nav {
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+
+.navbar-toggler {
+ padding: 0.5rem 0.5rem;
+ margin: 0.3125rem 0;
+ font-size: 1rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 2px solid transparent;
+}
+
+.navbar-toggler:hover, .navbar-toggler:focus {
+ text-decoration: none;
+ background-color: #fff;
+}
+
+.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-toggler:active {
+ background-color: #f16e00;
+}
+
+.navbar-toggler:active .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-toggler:focus {
+ outline: 0;
+}
+
+.navbar-toggler:not(:disabled):not(.disabled) {
+ cursor: pointer;
+}
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.25rem;
+ height: 1.25rem;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%;
+}
+
+@media (min-width: 480px) {
+ .navbar-expand-sm {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-sm .navbar-brand {
+ margin: 0 0 0 .625rem;
+ }
+ .navbar-expand-sm .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-sm.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-sm.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-sm .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-sm .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-sm .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-left: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ margin-right: 1.25rem;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-md .navbar-brand {
+ margin: 0 0 0 .625rem;
+ }
+ .navbar-expand-md .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-md.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-md.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-md .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-md .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-md .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-left: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ margin-right: 1.25rem;
+ }
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 980px) {
+ .navbar-expand-lg {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-lg .navbar-brand {
+ margin: 0 0 0 .625rem;
+ }
+ .navbar-expand-lg .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-lg.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-lg.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-lg .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-lg .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-lg .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-left: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ margin-right: 1.25rem;
+ }
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 1220px) {
+ .navbar-expand-xl {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-xl .navbar-brand {
+ margin: 0 0 0 .625rem;
+ }
+ .navbar-expand-xl .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-xl.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-xl.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-xl .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-xl .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-xl .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-left: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ margin-right: 1.25rem;
+ }
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 1380px) {
+ .navbar-expand-xxl {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-xxl .navbar-brand {
+ margin: 0 0 0 .625rem;
+ }
+ .navbar-expand-xxl .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-xxl.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-xxl.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-xxl .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-left: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ margin-right: 1.25rem;
+ }
+ .navbar-expand-xxl > .container,
+ .navbar-expand-xxl > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ .navbar-expand-xxl .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+}
+
+.navbar-expand {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+}
+
+.navbar-expand .navbar-brand {
+ margin: 0 0 0 .625rem;
+}
+
+.navbar-expand .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+}
+
+.navbar-expand.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+}
+
+.navbar-expand.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+}
+
+.navbar-expand .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.navbar-expand .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+}
+
+.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+}
+
+.navbar-expand .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+}
+
+.navbar-expand .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+}
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-left: 0;
+ padding-bottom: 0;
+ padding-right: 0;
+ margin-right: 1.25rem;
+}
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.navbar-expand .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+}
+
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.navbar-light .navbar-brand {
+ color: #000;
+}
+
+.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-nav .nav-link {
+ color: #000;
+}
+
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: #ddd;
+}
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-toggler {
+ color: #000;
+ border-color: rgba(0, 0, 0, 0.1);
+}
+
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-light .navbar-text {
+ color: #000;
+}
+
+.navbar-light .navbar-text a {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-brand {
+ color: #fff;
+}
+
+.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-nav .nav-link {
+ color: #fff;
+}
+
+.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: #ddd;
+}
+
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .active > .nav-link,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .nav-link.active {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-toggler {
+ color: #fff;
+ border-color: rgba(255, 255, 255, 0.1);
+}
+
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-dark .navbar-text {
+ color: #fff;
+}
+
+.navbar-dark .navbar-text a {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
+ color: #f16e00;
+}
+
+.card {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 2px solid #000;
+}
+
+.card > hr {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.card-body {
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 1.25rem;
+ color: #000;
+}
+
+.card-title {
+ margin-bottom: 0.75rem;
+}
+
+.card-subtitle {
+ margin-top: -0.375rem;
+ margin-bottom: 0;
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link:hover {
+ text-decoration: none;
+}
+
+.card-link + .card-link {
+ margin-right: 1.25rem;
+}
+
+.card-header {
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 0;
+ font-weight: 700;
+ color: #fff;
+ background-color: #000;
+ border-bottom: 2px solid #000;
+}
+
+.card-header + .list-group .list-group-item:first-child {
+ border-top: 0;
+}
+
+.card-footer {
+ padding: 0.75rem 1.25rem;
+ background-color: #fff;
+ border-top: 2px solid #000;
+}
+
+.card-header-tabs {
+ margin-left: -0.625rem;
+ margin-bottom: -0.75rem;
+ margin-right: -0.625rem;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-left: -0.625rem;
+ margin-right: -0.625rem;
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ padding: 1.25rem;
+}
+
+.card-img {
+ width: 100%;
+}
+
+.card-img-top {
+ width: 100%;
+}
+
+.card-img-bottom {
+ width: 100%;
+}
+
+.card-deck {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.card-deck .card {
+ margin-bottom: 2.5rem;
+}
+
+@media (min-width: 480px) {
+ .card-deck {
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ margin-left: -2.5rem;
+ margin-right: -2.5rem;
+ }
+ .card-deck .card {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-left: 2.5rem;
+ margin-bottom: 0;
+ margin-right: 2.5rem;
+ }
+}
+
+.card-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.card-group > .card {
+ margin-bottom: 10px;
+}
+
+@media (min-width: 480px) {
+ .card-group {
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ }
+ .card-group > .card {
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+ .card-group > .card + .card {
+ margin-right: 0;
+ border-right: 0;
+ }
+}
+
+.card-columns .card {
+ margin-bottom: 2.5rem;
+}
+
+@media (min-width: 480px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem;
+ orphans: 1;
+ widows: 1;
+ }
+ .card-columns .card {
+ display: inline-block;
+ width: 100%;
+ }
+}
+
+.accordion {
+ /* boosted mod */
+}
+
+.accordion .card {
+ margin-bottom: 0;
+ border: 0;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+}
+
+.accordion .card ~ .card {
+ border-top: 0;
+}
+
+.accordion .card-header {
+ padding: 0;
+ background-color: #fff;
+ border: 0;
+}
+
+.accordion .card-header,
+.accordion .card-header h5 {
+ margin: 0;
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.accordion .card-header button,
+.accordion .card-header a {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 1rem 0 1rem 2.125rem;
+ line-height: 1.125rem;
+ text-align: right;
+ border: 0;
+}
+
+.accordion .card-header button::after,
+.accordion .card-header a::after {
+ position: absolute;
+ top: 1.3125rem;
+ left: .625rem;
+ width: .875rem;
+ height: .4375rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");
+}
+
+.accordion .card-header button[aria-expanded="true"]::after,
+.accordion .card-header a[aria-expanded="true"]::after {
+ -webkit-transform: rotate(-180deg);
+ transform: rotate(-180deg);
+}
+
+.accordion .card-body {
+ padding: 0 0 0 1.5rem;
+ margin: 0 0 1.25rem;
+}
+
+@media (max-width: 767.98px) {
+ .accordion .card {
+ border-top-width: 2px;
+ border-bottom-width: 2px;
+ }
+ .accordion .card ~ .card {
+ border-top: 0;
+ }
+}
+
+.breadcrumb {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding: 0.625rem 0;
+ font-size: 0.875rem;
+ font-weight: 700;
+ line-height: 1.428571;
+ list-style: none;
+ background-color: #fff;
+}
+
+.breadcrumb-item + .breadcrumb-item::before {
+ display: inline-block;
+ padding-left: 0.625rem;
+ padding-right: 0.625rem;
+ font-family: icon-orange;
+ font-size: 0.625rem;
+ line-height: 1;
+ color: #000;
+ content: "";
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: underline;
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: none;
+}
+
+.breadcrumb-item.active {
+ color: #f16e00;
+}
+
+.pagination {
+ display: -ms-flexbox;
+ display: flex;
+ padding-right: 0;
+ list-style: none;
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ min-width: 2.5rem;
+ min-height: 2.5rem;
+ padding: 0.625rem 0.8rem;
+ margin-right: 0;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ background-color: #fff;
+ border: 2px solid transparent;
+}
+
+.page-link:hover, .page-link:focus {
+ z-index: 2;
+ color: #000;
+ text-decoration: none;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.page-link:hover span, .page-link:focus span {
+ color: #000;
+}
+
+.page-link:focus {
+ z-index: 2;
+ outline: 0;
+ box-shadow: none;
+}
+
+.page-link span {
+ color: #fff;
+}
+
+.page-link:not(:disabled):not(.disabled) {
+ cursor: pointer;
+}
+
+.page-item.presentation {
+ padding: .625rem 0;
+ font-weight: 700;
+}
+
+.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {
+ margin-right: 0;
+ border-color: #000;
+}
+
+.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {
+ position: absolute;
+ top: .6875rem;
+ right: .8125rem;
+ width: .5625rem;
+ height: .875rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+}
+
+.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {
+ padding-left: 1.125rem;
+ padding-right: 2rem;
+}
+
+.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {
+ z-index: 1;
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.page-item:last-child .page-link {
+ border-color: #000;
+}
+
+.page-item:last-child .page-link::before {
+ position: absolute;
+ top: .6875rem;
+ left: .8125rem;
+ width: .5625rem;
+ height: .875rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+}
+
+.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item:last-child .page-link.has-label {
+ padding-left: 2rem;
+ padding-right: 1.125rem;
+}
+
+.page-item.active .page-link {
+ z-index: 1;
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.page-item .page-link:active {
+ z-index: 1;
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.page-item.active:first-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item.active:last-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item.disabled .page-link {
+ color: #ccc;
+ pointer-events: none;
+ cursor: auto;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.page-item.disabled:first-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e");
+}
+
+.page-item.disabled:last-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e");
+}
+
+.page-item + .page-item {
+ margin-right: .625rem;
+}
+
+.pagination-lg .page-link {
+ min-width: 3.125rem;
+ min-height: 3.125rem;
+ padding: 0.875rem 1.125rem;
+ font-size: 1.125rem;
+ line-height: 1.111111;
+}
+
+.pagination-lg .page-item:first-child .page-link::before,
+.pagination-lg .page-item:last-child .page-link::before {
+ top: 1.03125rem;
+}
+
+.pagination-sm .page-link {
+ min-width: 1.875rem;
+ min-height: 1.875rem;
+ padding: 0.375rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.428571;
+}
+
+.pagination-sm .page-item:first-child .page-link::before,
+.pagination-sm .page-item:last-child .page-link::before {
+ top: .53125rem;
+}
+
+.badge {
+ display: inline-block;
+ padding: 0.1875rem 0.625rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .badge {
+ transition: none;
+ }
+}
+
+a.badge:hover, a.badge:focus {
+ text-decoration: none;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.badge-pill {
+ padding-left: 0.625rem;
+ padding-right: 0.625rem;
+}
+
+.badge-primary {
+ color: #fff;
+ background-color: #f16e00;
+}
+
+a.badge-primary:hover, a.badge-primary:focus {
+ color: #fff;
+ background-color: #be5700;
+}
+
+.badge-secondary {
+ color: #fff;
+ background-color: #000;
+}
+
+a.badge-secondary:hover, a.badge-secondary:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.badge-success {
+ color: #000;
+ background-color: #32c832;
+}
+
+a.badge-success:hover, a.badge-success:focus {
+ color: #000;
+ background-color: #289f28;
+}
+
+.badge-info {
+ color: #000;
+ background-color: #527edb;
+}
+
+a.badge-info:hover, a.badge-info:focus {
+ color: #000;
+ background-color: #2b60cf;
+}
+
+.badge-warning {
+ color: #000;
+ background-color: #fc0;
+}
+
+a.badge-warning:hover, a.badge-warning:focus {
+ color: #000;
+ background-color: #cca300;
+}
+
+.badge-danger {
+ color: #fff;
+ background-color: #cd3c14;
+}
+
+a.badge-danger:hover, a.badge-danger:focus {
+ color: #fff;
+ background-color: #9f2e0f;
+}
+
+.badge-light {
+ color: #000;
+ background-color: #ddd;
+}
+
+a.badge-light:hover, a.badge-light:focus {
+ color: #000;
+ background-color: #c4c4c4;
+}
+
+.badge-dark {
+ color: #fff;
+ background-color: #000;
+}
+
+a.badge-dark:hover, a.badge-dark:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.badge[href]:focus {
+ outline-color: #fff;
+ outline-offset: -1px;
+}
+
+.badge[href]:focus.badge-light {
+ outline-color: #000;
+}
+
+.jumbotron {
+ padding: 2.5rem 1.25rem;
+ margin-bottom: 2.5rem;
+ color: #000;
+ background-color: #fff;
+}
+
+@media (min-width: 480px) {
+ .jumbotron {
+ padding: 5rem 2.5rem;
+ }
+}
+
+.jumbotron-fluid {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.alert {
+ position: relative;
+ padding: 0.8125rem 1.25rem;
+ margin-bottom: 1.25rem;
+ border: 0 solid transparent;
+}
+
+.alert .alert-icon {
+ position: absolute;
+ top: .625rem;
+}
+
+.alert .alert-icon::after {
+ width: 1.76rem;
+ height: 1.76rem;
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.alert-sm {
+ padding: 0.3125rem 1.25rem;
+}
+
+.alert-sm .alert-icon {
+ top: .4375rem;
+}
+
+.alert-sm .alert-icon::after {
+ width: 1rem;
+ height: 1rem;
+}
+
+.alert-lg {
+ padding: 1rem 1.25rem;
+}
+
+.alert-lg .alert-icon {
+ top: .625rem;
+}
+
+.alert-lg .alert-icon::after {
+ width: 2rem;
+ height: 2rem;
+}
+
+.alert-heading {
+ color: inherit;
+}
+
+.alert-link {
+ font-weight: 700;
+}
+
+.alert-dismissible {
+ padding-left: 4rem;
+}
+
+.alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: 0.8125rem 1.25rem;
+ line-height: 0.8125rem;
+ color: inherit;
+}
+
+.alert-primary {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.alert-primary hr {
+ border-top-color: #d86200;
+}
+
+.alert-primary .alert-link {
+ color: black;
+}
+
+.alert-secondary {
+ color: #fff;
+ background-color: black;
+ border-color: black;
+}
+
+.alert-secondary hr {
+ border-top-color: black;
+}
+
+.alert-secondary .alert-link {
+ color: #e6e6e6;
+}
+
+.alert-success {
+ color: #000;
+ background-color: #32c832;
+ border-color: #32c832;
+}
+
+.alert-success hr {
+ border-top-color: #2db42d;
+}
+
+.alert-success .alert-link {
+ color: black;
+}
+
+.alert-info {
+ color: #000;
+ background-color: #527edb;
+ border-color: #527edb;
+}
+
+.alert-info hr {
+ border-top-color: #3d6ed7;
+}
+
+.alert-info .alert-link {
+ color: black;
+}
+
+.alert-warning {
+ color: #000;
+ background-color: #ffcc00;
+ border-color: #ffcc00;
+}
+
+.alert-warning hr {
+ border-top-color: #e6b800;
+}
+
+.alert-warning .alert-link {
+ color: black;
+}
+
+.alert-danger {
+ color: #fff;
+ background-color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.alert-danger hr {
+ border-top-color: #b63512;
+}
+
+.alert-danger .alert-link {
+ color: #e6e6e6;
+}
+
+.alert-light {
+ color: #000;
+ background-color: #dddddd;
+ border-color: #dddddd;
+}
+
+.alert-light hr {
+ border-top-color: #d0d0d0;
+}
+
+.alert-light .alert-link {
+ color: black;
+}
+
+.alert-dark {
+ color: #fff;
+ background-color: black;
+ border-color: black;
+}
+
+.alert-dark hr {
+ border-top-color: black;
+}
+
+.alert-dark .alert-link {
+ color: #e6e6e6;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 1.25rem 0;
+ }
+ to {
+ background-position: 100% 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1.25rem 0;
+ }
+ to {
+ background-position: 100% 0;
+ }
+}
+
+.progress {
+ display: -ms-flexbox;
+ display: flex;
+ height: 1.25rem;
+ overflow: hidden;
+ font-size: 1rem;
+ background-color: #ccc;
+}
+
+.progress-bar {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-pack: center;
+ justify-content: center;
+ color: #000;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #f16e00;
+ transition: width 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar {
+ transition: none;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .progress {
+ width: 100%;
+ height: 0.625rem;
+ line-height: 0.625rem;
+ }
+ .progress-bar {
+ font-size: 0.875rem;
+ line-height: 0.625rem;
+ }
+}
+
+.progress-bar-striped {
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 1.25rem 1.25rem;
+}
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.media {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: start;
+ align-items: flex-start;
+}
+
+.media-body {
+ -ms-flex: 1;
+ flex: 1;
+}
+
+.list-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-right: 0;
+ margin-bottom: 0;
+}
+
+.list-group-item-action {
+ width: 100%;
+ color: #000;
+ text-align: inherit;
+}
+
+.list-group-item-action:hover, .list-group-item-action:focus {
+ z-index: 1;
+ color: #f16e00;
+ text-decoration: none;
+ background-color: #f6f6f6;
+}
+
+.list-group-item-action:active {
+ color: #000;
+ background-color: #eee;
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 0.625rem 0.625rem;
+ margin-bottom: -2px;
+ color: #000;
+ background-color: #fff;
+ border: 2px solid #000;
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+}
+
+.list-group-item.disabled, .list-group-item:disabled {
+ color: #ccc;
+ pointer-events: none;
+ background-color: #fff;
+}
+
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-horizontal {
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.list-group-horizontal .list-group-item {
+ margin-left: -2px;
+ margin-bottom: 0;
+}
+
+.list-group-horizontal .list-group-item:last-child {
+ margin-left: 0;
+}
+
+@media (min-width: 480px) {
+ .list-group-horizontal-sm {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-sm .list-group-item {
+ margin-left: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-sm .list-group-item:last-child {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-md .list-group-item {
+ margin-left: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-md .list-group-item:last-child {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 980px) {
+ .list-group-horizontal-lg {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-lg .list-group-item {
+ margin-left: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-lg .list-group-item:last-child {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 1220px) {
+ .list-group-horizontal-xl {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-xl .list-group-item {
+ margin-left: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-xl .list-group-item:last-child {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 1380px) {
+ .list-group-horizontal-xxl {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-xxl .list-group-item {
+ margin-left: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-xxl .list-group-item:last-child {
+ margin-left: 0;
+ }
+}
+
+.list-group-flush .list-group-item {
+ border-left: 0;
+ border-right: 0;
+}
+
+.list-group-flush .list-group-item:last-child {
+ margin-bottom: -2px;
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0;
+}
+
+.list-group-flush:last-child .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom: 0;
+}
+
+.list-group-item-primary {
+ color: #000;
+ background-color: #f16e00;
+}
+
+.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
+ color: #000;
+ background-color: #d86200;
+}
+
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-secondary {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-success {
+ color: #000;
+ background-color: #32c832;
+}
+
+.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
+ color: #000;
+ background-color: #2db42d;
+}
+
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-info {
+ color: #000;
+ background-color: #527edb;
+}
+
+.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
+ color: #000;
+ background-color: #3d6ed7;
+}
+
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-warning {
+ color: #000;
+ background-color: #ffcc00;
+}
+
+.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
+ color: #000;
+ background-color: #e6b800;
+}
+
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-danger {
+ color: #000;
+ background-color: #cd3c14;
+}
+
+.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
+ color: #000;
+ background-color: #b63512;
+}
+
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-light {
+ color: #000;
+ background-color: #dddddd;
+}
+
+.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
+ color: #000;
+ background-color: #d0d0d0;
+}
+
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-dark {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.close {
+ float: left;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 1;
+}
+
+.close:hover {
+ color: #000;
+ text-decoration: none;
+}
+
+.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
+ opacity: 1;
+}
+
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+a.close.disabled {
+ pointer-events: none;
+}
+
+.toast {
+ max-width: 350px;
+ overflow: hidden;
+ font-size: 0.875rem;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: none;
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ opacity: 0;
+}
+
+.toast:not(:last-child) {
+ margin-bottom: 0.625rem;
+}
+
+.toast.showing {
+ opacity: 1;
+}
+
+.toast.show {
+ display: block;
+ opacity: 1;
+}
+
+.toast.hide {
+ display: none;
+}
+
+.toast-header {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 0.3125rem 0.625rem;
+ color: #999;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+}
+
+.toast-body {
+ padding: 0.625rem;
+}
+
+.modal-open {
+ overflow: hidden;
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1050;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ outline: 0;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.625rem;
+ pointer-events: none;
+}
+
+.modal.fade .modal-dialog {
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
+ -webkit-transform: translate(0, -50px);
+ transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.modal.show .modal-dialog {
+ -webkit-transform: none;
+ transform: none;
+}
+
+.modal-dialog-scrollable {
+ display: -ms-flexbox;
+ display: flex;
+ max-height: calc(100% - 1.25rem);
+}
+
+.modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 1.25rem);
+ overflow: hidden;
+}
+
+.modal-dialog-scrollable .modal-header,
+.modal-dialog-scrollable .modal-footer {
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.modal-dialog-centered {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ min-height: calc(100% - 1.25rem);
+}
+
+.modal-dialog-centered::before {
+ display: block;
+ height: calc(100vh - 1.25rem);
+ content: "";
+}
+
+.modal-dialog-centered.modal-dialog-scrollable {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-pack: center;
+ justify-content: center;
+ height: 100%;
+}
+
+.modal-dialog-centered.modal-dialog-scrollable .modal-content {
+ max-height: none;
+}
+
+.modal-dialog-centered.modal-dialog-scrollable::before {
+ content: none;
+}
+
+.modal-content {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ width: 100%;
+ color: #000;
+ pointer-events: auto;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 2px solid #000;
+ outline: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #333;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+}
+
+.modal-backdrop.show {
+ opacity: 0.5;
+}
+
+.modal-header {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 0.625rem 0.625rem;
+ border-bottom: 2px solid #000;
+}
+
+.modal-header .close {
+ padding: 0.625rem 0.625rem;
+ margin: -0.625rem auto -0.625rem -0.625rem;
+}
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.25;
+}
+
+.modal-body {
+ position: relative;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 0.625rem;
+}
+
+.modal-footer {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ padding: 0.625rem;
+ border-top: 2px solid #000;
+}
+
+.modal-footer > :not(:first-child) {
+ margin-right: .25rem;
+}
+
+.modal-footer > :not(:last-child) {
+ margin-left: .25rem;
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+@media (min-width: 480px) {
+ .modal-dialog {
+ max-width: 700px;
+ margin: 1.875rem auto;
+ }
+ .modal-dialog-scrollable {
+ max-height: calc(100% - 3.75rem);
+ }
+ .modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 3.75rem);
+ }
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.75rem);
+ }
+ .modal-dialog-centered::before {
+ height: calc(100vh - 3.75rem);
+ }
+ .modal-sm {
+ max-width: 300px;
+ }
+}
+
+@media (min-width: 980px) {
+ .modal-lg,
+ .modal-xl {
+ max-width: 700px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .modal-xl {
+ max-width: 700px;
+ }
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0.3125rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.25;
+ text-align: right;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ font-weight: 700;
+ word-wrap: break-word;
+ opacity: 0;
+}
+
+.tooltip.show {
+ opacity: 0.9;
+}
+
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: 0.625rem;
+ height: 0.625rem;
+}
+
+.tooltip .arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
+ padding: 0.625rem 0;
+}
+
+.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
+ bottom: 0;
+}
+
+.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
+ top: 0;
+ border-width: 0.625rem 0.3125rem 0;
+ border-top-color: #ddd;
+}
+
+.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
+ padding: 0 0.625rem;
+}
+
+.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
+ right: 0;
+ width: 0.625rem;
+ height: 0.625rem;
+}
+
+.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
+ left: 0;
+ border-width: 0.3125rem 0 0.3125rem 0.625rem;
+ border-left-color: #ddd;
+}
+
+.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
+ padding: 0.625rem 0;
+}
+
+.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
+ top: 0;
+}
+
+.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+ bottom: 0;
+ border-width: 0 0.3125rem 0.625rem;
+ border-bottom-color: #ddd;
+}
+
+.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
+ padding: 0 0.625rem;
+}
+
+.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
+ left: 0;
+ width: 0.625rem;
+ height: 0.625rem;
+}
+
+.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
+ right: 0;
+ border-width: 0.3125rem 0.625rem 0.3125rem 0;
+ border-right-color: #ddd;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 1.25rem 1.25rem;
+ color: #000;
+ text-align: center;
+ background-color: #ddd;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.25;
+ text-align: right;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ font-weight: 700;
+ word-wrap: break-word;
+ background-color: #ddd;
+ background-clip: padding-box;
+ border: 2px solid #ddd;
+}
+
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 0.625rem;
+ height: 0.3125rem;
+ margin: 0 0.3rem;
+}
+
+.popover .arrow::before, .popover .arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
+ margin-bottom: 0.3125rem;
+}
+
+.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
+ bottom: calc((0.3125rem + 2px) * -1);
+}
+
+.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
+ bottom: 0;
+ border-width: 0.3125rem 0.3125rem 0;
+ border-top-color: #ddd;
+}
+
+.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after {
+ bottom: 2px;
+ border-width: 0.3125rem 0.3125rem 0;
+ border-top-color: #ddd;
+}
+
+.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
+ margin-right: 0.3125rem;
+}
+
+.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
+ right: calc((0.3125rem + 2px) * -1);
+ width: 0.3125rem;
+ height: 0.625rem;
+ margin: 0.3rem 0;
+}
+
+.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before {
+ right: 0;
+ border-width: 0.3125rem 0 0.3125rem 0.3125rem;
+ border-left-color: #ddd;
+}
+
+.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after {
+ right: 2px;
+ border-width: 0.3125rem 0 0.3125rem 0.3125rem;
+ border-left-color: #ddd;
+}
+
+.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
+ margin-top: 0.3125rem;
+}
+
+.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
+ top: calc((0.3125rem + 2px) * -1);
+}
+
+.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
+ top: 0;
+ border-width: 0 0.3125rem 0.3125rem 0.3125rem;
+ border-bottom-color: #ddd;
+}
+
+.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after {
+ top: 2px;
+ border-width: 0 0.3125rem 0.3125rem 0.3125rem;
+ border-bottom-color: #ddd;
+}
+
+.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
+ position: absolute;
+ top: 0;
+ right: 50%;
+ display: block;
+ width: 0.625rem;
+ margin-right: -0.3125rem;
+ content: "";
+ border-bottom: 2px solid #ddd;
+}
+
+.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
+ margin-left: 0.3125rem;
+}
+
+.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
+ left: calc((0.3125rem + 2px) * -1);
+ width: 0.3125rem;
+ height: 0.625rem;
+ margin: 0.3rem 0;
+}
+
+.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before {
+ left: 0;
+ border-width: 0.3125rem 0.3125rem 0.3125rem 0;
+ border-right-color: #ddd;
+}
+
+.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after {
+ left: 2px;
+ border-width: 0.3125rem 0.3125rem 0.3125rem 0;
+ border-right-color: #ddd;
+}
+
+.popover-header {
+ padding: 0.625rem 0.625rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ color: inherit;
+ background-color: #ddd;
+ border-bottom: 2px solid #d0d0d0;
+}
+
+.popover-header:empty {
+ display: none;
+}
+
+.popover-body {
+ padding: 0.625rem 0.625rem;
+ color: #000;
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel.pointer-event {
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.carousel-item {
+ position: relative;
+ display: none;
+ float: right;
+ width: 100%;
+ margin-left: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-item {
+ transition: none;
+ }
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: block;
+}
+
+.carousel-item-next:not(.carousel-item-left),
+.active.carousel-item-right {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+}
+
+.carousel-item-prev:not(.carousel-item-right),
+.active.carousel-item-left {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+}
+
+.carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ -webkit-transform: none;
+ transform: none;
+}
+
+.carousel-fade .carousel-item.active,
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right {
+ z-index: 1;
+ opacity: 1;
+}
+
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+ z-index: 0;
+ opacity: 0;
+ transition: 0s 0.6s opacity;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-fade .active.carousel-item-left,
+ .carousel-fade .active.carousel-item-right {
+ transition: none;
+ }
+}
+
+.carousel-control-prev,
+.carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: 1.875rem;
+ color: #000;
+ text-align: center;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-control-prev,
+ .carousel-control-next {
+ transition: none;
+ }
+}
+
+.carousel-control-prev:hover, .carousel-control-prev:focus,
+.carousel-control-next:hover,
+.carousel-control-next:focus {
+ color: #000;
+ text-decoration: none;
+ outline: 2px dotted #000;
+ opacity: 0.9;
+}
+
+.carousel-control-prev {
+ right: 0;
+}
+
+.carousel-control-next {
+ left: 0;
+}
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: no-repeat 50% / 100% 100%;
+}
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e");
+}
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e");
+}
+
+.carousel-indicators {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ z-index: 15;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding-right: 0;
+ margin-left: 1.875rem;
+ margin-right: 1.875rem;
+ list-style: none;
+}
+
+.carousel-indicators li {
+ box-sizing: content-box;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-left: 3px;
+ margin-right: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #f16e00;
+ background-clip: padding-box;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: .5;
+ transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-indicators li {
+ transition: none;
+ }
+}
+
+.carousel-indicators .active {
+ opacity: 1;
+}
+
+.carousel-caption {
+ position: absolute;
+ left: 15%;
+ bottom: 20px;
+ right: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #000;
+ text-align: center;
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(-360deg);
+ transform: rotate(-360deg);
+ }
+}
+
+@keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(-360deg);
+ transform: rotate(-360deg);
+ }
+}
+
+.spinner-border {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ border: 0.25em solid currentColor;
+ border-left-color: transparent;
+ border-radius: 50%;
+ -webkit-animation: spinner-border .75s linear infinite;
+ animation: spinner-border .75s linear infinite;
+}
+
+.spinner-border-sm {
+ width: 1rem;
+ height: 1rem;
+ border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ }
+}
+
+@keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ }
+}
+
+.spinner-grow {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ background-color: currentColor;
+ border-radius: 50%;
+ opacity: 0;
+ -webkit-animation: spinner-grow .75s linear infinite;
+ animation: spinner-grow .75s linear infinite;
+}
+
+.spinner-grow-sm {
+ width: 1rem;
+ height: 1rem;
+}
+
+.align-baseline {
+ vertical-align: baseline !important;
+}
+
+.align-top {
+ vertical-align: top !important;
+}
+
+.align-middle {
+ vertical-align: middle !important;
+}
+
+.align-bottom {
+ vertical-align: bottom !important;
+}
+
+.align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+
+.align-text-top {
+ vertical-align: text-top !important;
+}
+
+.bg-primary {
+ background-color: #f16e00 !important;
+}
+
+a.bg-primary:hover, a.bg-primary:focus,
+button.bg-primary:hover,
+button.bg-primary:focus {
+ background-color: #be5700 !important;
+}
+
+.bg-secondary {
+ background-color: #000 !important;
+}
+
+a.bg-secondary:hover, a.bg-secondary:focus,
+button.bg-secondary:hover,
+button.bg-secondary:focus {
+ background-color: black !important;
+}
+
+.bg-success {
+ background-color: #32c832 !important;
+}
+
+a.bg-success:hover, a.bg-success:focus,
+button.bg-success:hover,
+button.bg-success:focus {
+ background-color: #289f28 !important;
+}
+
+.bg-info {
+ background-color: #527edb !important;
+}
+
+a.bg-info:hover, a.bg-info:focus,
+button.bg-info:hover,
+button.bg-info:focus {
+ background-color: #2b60cf !important;
+}
+
+.bg-warning {
+ background-color: #fc0 !important;
+}
+
+a.bg-warning:hover, a.bg-warning:focus,
+button.bg-warning:hover,
+button.bg-warning:focus {
+ background-color: #cca300 !important;
+}
+
+.bg-danger {
+ background-color: #cd3c14 !important;
+}
+
+a.bg-danger:hover, a.bg-danger:focus,
+button.bg-danger:hover,
+button.bg-danger:focus {
+ background-color: #9f2e0f !important;
+}
+
+.bg-light {
+ background-color: #ddd !important;
+}
+
+a.bg-light:hover, a.bg-light:focus,
+button.bg-light:hover,
+button.bg-light:focus {
+ background-color: #c4c4c4 !important;
+}
+
+.bg-dark {
+ background-color: #000 !important;
+}
+
+a.bg-dark:hover, a.bg-dark:focus,
+button.bg-dark:hover,
+button.bg-dark:focus {
+ background-color: black !important;
+}
+
+.bg-white {
+ background-color: #fff !important;
+}
+
+.bg-transparent {
+ background-color: transparent !important;
+}
+
+.border {
+ border: 2px solid #000 !important;
+}
+
+.border-top {
+ border-top: 2px solid #000 !important;
+}
+
+.border-right {
+ border-left: 2px solid #000 !important;
+}
+
+.border-bottom {
+ border-bottom: 2px solid #000 !important;
+}
+
+.border-left {
+ border-right: 2px solid #000 !important;
+}
+
+.border-0 {
+ border: 0 !important;
+}
+
+.border-top-0 {
+ border-top: 0 !important;
+}
+
+.border-right-0 {
+ border-left: 0 !important;
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.border-left-0 {
+ border-right: 0 !important;
+}
+
+.border-primary {
+ border-color: #f16e00 !important;
+}
+
+.border-secondary {
+ border-color: #000 !important;
+}
+
+.border-success {
+ border-color: #32c832 !important;
+}
+
+.border-info {
+ border-color: #527edb !important;
+}
+
+.border-warning {
+ border-color: #fc0 !important;
+}
+
+.border-danger {
+ border-color: #cd3c14 !important;
+}
+
+.border-light {
+ border-color: #ddd !important;
+}
+
+.border-dark {
+ border-color: #000 !important;
+}
+
+.border-white {
+ border-color: #fff !important;
+}
+
+.rounded-sm {
+ border-radius: 0.2rem !important;
+}
+
+.rounded {
+ border-radius: 0.25rem !important;
+}
+
+.rounded-top {
+ border-top-right-radius: 0.25rem !important;
+ border-top-left-radius: 0.25rem !important;
+}
+
+.rounded-right {
+ border-top-left-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
+}
+
+.rounded-bottom {
+ border-bottom-left-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important;
+}
+
+.rounded-left {
+ border-top-right-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important;
+}
+
+.rounded-lg {
+ border-radius: 0.3rem !important;
+}
+
+.rounded-circle {
+ border-radius: 50% !important;
+}
+
+.rounded-pill {
+ border-radius: 50rem !important;
+}
+
+.rounded-0 {
+ border-radius: 0 !important;
+}
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.d-none {
+ display: none !important;
+}
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-table {
+ display: table !important;
+}
+
+.d-table-row {
+ display: table-row !important;
+}
+
+.d-table-cell {
+ display: table-cell !important;
+}
+
+.d-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+}
+
+.d-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+}
+
+@media (min-width: 480px) {
+ .d-sm-none {
+ display: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
+ display: block !important;
+ }
+ .d-sm-table {
+ display: table !important;
+ }
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+ .d-sm-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important;
+ }
+ .d-md-inline {
+ display: inline !important;
+ }
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .d-md-block {
+ display: block !important;
+ }
+ .d-md-table {
+ display: table !important;
+ }
+ .d-md-table-row {
+ display: table-row !important;
+ }
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+ .d-md-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-inline {
+ display: inline !important;
+ }
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+ .d-lg-table {
+ display: table !important;
+ }
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+ .d-lg-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .d-xl-none {
+ display: none !important;
+ }
+ .d-xl-inline {
+ display: inline !important;
+ }
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xl-block {
+ display: block !important;
+ }
+ .d-xl-table {
+ display: table !important;
+ }
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xl-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .d-xxl-none {
+ display: none !important;
+ }
+ .d-xxl-inline {
+ display: inline !important;
+ }
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xxl-block {
+ display: block !important;
+ }
+ .d-xxl-table {
+ display: table !important;
+ }
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xxl-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xxl-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media print {
+ .d-print-none {
+ display: none !important;
+ }
+ .d-print-inline {
+ display: inline !important;
+ }
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+ .d-print-block {
+ display: block !important;
+ }
+ .d-print-table {
+ display: table !important;
+ }
+ .d-print-table-row {
+ display: table-row !important;
+ }
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+ .d-print-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-print-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
+}
+
+.embed-responsive::before {
+ display: block;
+ content: "";
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.857143%;
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%;
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%;
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%;
+}
+
+.flex-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.flex-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+}
+
+.flex-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+}
+
+.flex-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+}
+
+.flex-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+}
+
+.flex-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+}
+
+.justify-content-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 480px) {
+ .flex-sm-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-sm-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-sm-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-sm-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-sm-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-sm-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-sm-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .flex-md-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-md-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-md-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-md-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-md-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-md-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-md-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .flex-lg-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-lg-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-lg-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-lg-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-lg-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-lg-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-lg-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .flex-xl-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xl-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-xl-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-xl-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-xl-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-xl-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xl-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .flex-xxl-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xxl-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xxl-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xxl-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xxl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xxl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xxl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xxl-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-xxl-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-xxl-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-xxl-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-xxl-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xxl-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xxl-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xxl-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xxl-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xxl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xxl-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xxl-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xxl-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xxl-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xxl-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xxl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xxl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xxl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xxl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xxl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xxl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xxl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xxl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xxl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xxl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xxl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xxl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+.float-left {
+ float: right !important;
+}
+
+.float-right {
+ float: left !important;
+}
+
+.float-none {
+ float: none !important;
+}
+
+@media (min-width: 480px) {
+ .float-sm-left {
+ float: right !important;
+ }
+ .float-sm-right {
+ float: left !important;
+ }
+ .float-sm-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .float-md-left {
+ float: right !important;
+ }
+ .float-md-right {
+ float: left !important;
+ }
+ .float-md-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .float-lg-left {
+ float: right !important;
+ }
+ .float-lg-right {
+ float: left !important;
+ }
+ .float-lg-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .float-xl-left {
+ float: right !important;
+ }
+ .float-xl-right {
+ float: left !important;
+ }
+ .float-xl-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .float-xxl-left {
+ float: right !important;
+ }
+ .float-xxl-right {
+ float: left !important;
+ }
+ .float-xxl-none {
+ float: none !important;
+ }
+}
+
+.overflow-auto {
+ overflow: auto !important;
+}
+
+.overflow-hidden {
+ overflow: hidden !important;
+}
+
+.position-static {
+ position: static !important;
+}
+
+.position-relative {
+ position: relative !important;
+}
+
+.position-absolute {
+ position: absolute !important;
+}
+
+.position-fixed {
+ position: fixed !important;
+}
+
+.position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
+}
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 1030;
+}
+
+.fixed-bottom {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ z-index: 1030;
+}
+
+@supports ((position: -webkit-sticky) or (position: sticky)) {
+ .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+}
+
+.shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.shadow-none {
+ box-shadow: none !important;
+}
+
+.w-25 {
+ width: 25% !important;
+}
+
+.w-50 {
+ width: 50% !important;
+}
+
+.w-75 {
+ width: 75% !important;
+}
+
+.w-100 {
+ width: 100% !important;
+}
+
+.w-auto {
+ width: auto !important;
+}
+
+.h-25 {
+ height: 25% !important;
+}
+
+.h-50 {
+ height: 50% !important;
+}
+
+.h-75 {
+ height: 75% !important;
+}
+
+.h-100 {
+ height: 100% !important;
+}
+
+.h-auto {
+ height: auto !important;
+}
+
+.mw-100 {
+ max-width: 100% !important;
+}
+
+.mh-100 {
+ max-height: 100% !important;
+}
+
+.min-vw-100 {
+ min-width: 100vw !important;
+}
+
+.min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.vw-100 {
+ width: 100vw !important;
+}
+
+.vh-100 {
+ height: 100vh !important;
+}
+
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ z-index: 1;
+ pointer-events: auto;
+ content: "";
+ background-color: rgba(0, 0, 0, 0);
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.mt-0,
+.my-0 {
+ margin-top: 0 !important;
+}
+
+.mr-0,
+.mx-0 {
+ margin-left: 0 !important;
+}
+
+.mb-0,
+.my-0 {
+ margin-bottom: 0 !important;
+}
+
+.ml-0,
+.mx-0 {
+ margin-right: 0 !important;
+}
+
+.m-1 {
+ margin: 0.3125rem !important;
+}
+
+.mt-1,
+.my-1 {
+ margin-top: 0.3125rem !important;
+}
+
+.mr-1,
+.mx-1 {
+ margin-left: 0.3125rem !important;
+}
+
+.mb-1,
+.my-1 {
+ margin-bottom: 0.3125rem !important;
+}
+
+.ml-1,
+.mx-1 {
+ margin-right: 0.3125rem !important;
+}
+
+.m-2 {
+ margin: 0.625rem !important;
+}
+
+.mt-2,
+.my-2 {
+ margin-top: 0.625rem !important;
+}
+
+.mr-2,
+.mx-2 {
+ margin-left: 0.625rem !important;
+}
+
+.mb-2,
+.my-2 {
+ margin-bottom: 0.625rem !important;
+}
+
+.ml-2,
+.mx-2 {
+ margin-right: 0.625rem !important;
+}
+
+.m-3 {
+ margin: 1.25rem !important;
+}
+
+.mt-3,
+.my-3 {
+ margin-top: 1.25rem !important;
+}
+
+.mr-3,
+.mx-3 {
+ margin-left: 1.25rem !important;
+}
+
+.mb-3,
+.my-3 {
+ margin-bottom: 1.25rem !important;
+}
+
+.ml-3,
+.mx-3 {
+ margin-right: 1.25rem !important;
+}
+
+.m-4 {
+ margin: 1.875rem !important;
+}
+
+.mt-4,
+.my-4 {
+ margin-top: 1.875rem !important;
+}
+
+.mr-4,
+.mx-4 {
+ margin-left: 1.875rem !important;
+}
+
+.mb-4,
+.my-4 {
+ margin-bottom: 1.875rem !important;
+}
+
+.ml-4,
+.mx-4 {
+ margin-right: 1.875rem !important;
+}
+
+.m-5 {
+ margin: 3.75rem !important;
+}
+
+.mt-5,
+.my-5 {
+ margin-top: 3.75rem !important;
+}
+
+.mr-5,
+.mx-5 {
+ margin-left: 3.75rem !important;
+}
+
+.mb-5,
+.my-5 {
+ margin-bottom: 3.75rem !important;
+}
+
+.ml-5,
+.mx-5 {
+ margin-right: 3.75rem !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.pt-0,
+.py-0 {
+ padding-top: 0 !important;
+}
+
+.pr-0,
+.px-0 {
+ padding-left: 0 !important;
+}
+
+.pb-0,
+.py-0 {
+ padding-bottom: 0 !important;
+}
+
+.pl-0,
+.px-0 {
+ padding-right: 0 !important;
+}
+
+.p-1 {
+ padding: 0.3125rem !important;
+}
+
+.pt-1,
+.py-1 {
+ padding-top: 0.3125rem !important;
+}
+
+.pr-1,
+.px-1 {
+ padding-left: 0.3125rem !important;
+}
+
+.pb-1,
+.py-1 {
+ padding-bottom: 0.3125rem !important;
+}
+
+.pl-1,
+.px-1 {
+ padding-right: 0.3125rem !important;
+}
+
+.p-2 {
+ padding: 0.625rem !important;
+}
+
+.pt-2,
+.py-2 {
+ padding-top: 0.625rem !important;
+}
+
+.pr-2,
+.px-2 {
+ padding-left: 0.625rem !important;
+}
+
+.pb-2,
+.py-2 {
+ padding-bottom: 0.625rem !important;
+}
+
+.pl-2,
+.px-2 {
+ padding-right: 0.625rem !important;
+}
+
+.p-3 {
+ padding: 1.25rem !important;
+}
+
+.pt-3,
+.py-3 {
+ padding-top: 1.25rem !important;
+}
+
+.pr-3,
+.px-3 {
+ padding-left: 1.25rem !important;
+}
+
+.pb-3,
+.py-3 {
+ padding-bottom: 1.25rem !important;
+}
+
+.pl-3,
+.px-3 {
+ padding-right: 1.25rem !important;
+}
+
+.p-4 {
+ padding: 1.875rem !important;
+}
+
+.pt-4,
+.py-4 {
+ padding-top: 1.875rem !important;
+}
+
+.pr-4,
+.px-4 {
+ padding-left: 1.875rem !important;
+}
+
+.pb-4,
+.py-4 {
+ padding-bottom: 1.875rem !important;
+}
+
+.pl-4,
+.px-4 {
+ padding-right: 1.875rem !important;
+}
+
+.p-5 {
+ padding: 3.75rem !important;
+}
+
+.pt-5,
+.py-5 {
+ padding-top: 3.75rem !important;
+}
+
+.pr-5,
+.px-5 {
+ padding-left: 3.75rem !important;
+}
+
+.pb-5,
+.py-5 {
+ padding-bottom: 3.75rem !important;
+}
+
+.pl-5,
+.px-5 {
+ padding-right: 3.75rem !important;
+}
+
+.m-n1 {
+ margin: -0.3125rem !important;
+}
+
+.mt-n1,
+.my-n1 {
+ margin-top: -0.3125rem !important;
+}
+
+.mr-n1,
+.mx-n1 {
+ margin-left: -0.3125rem !important;
+}
+
+.mb-n1,
+.my-n1 {
+ margin-bottom: -0.3125rem !important;
+}
+
+.ml-n1,
+.mx-n1 {
+ margin-right: -0.3125rem !important;
+}
+
+.m-n2 {
+ margin: -0.625rem !important;
+}
+
+.mt-n2,
+.my-n2 {
+ margin-top: -0.625rem !important;
+}
+
+.mr-n2,
+.mx-n2 {
+ margin-left: -0.625rem !important;
+}
+
+.mb-n2,
+.my-n2 {
+ margin-bottom: -0.625rem !important;
+}
+
+.ml-n2,
+.mx-n2 {
+ margin-right: -0.625rem !important;
+}
+
+.m-n3 {
+ margin: -1.25rem !important;
+}
+
+.mt-n3,
+.my-n3 {
+ margin-top: -1.25rem !important;
+}
+
+.mr-n3,
+.mx-n3 {
+ margin-left: -1.25rem !important;
+}
+
+.mb-n3,
+.my-n3 {
+ margin-bottom: -1.25rem !important;
+}
+
+.ml-n3,
+.mx-n3 {
+ margin-right: -1.25rem !important;
+}
+
+.m-n4 {
+ margin: -1.875rem !important;
+}
+
+.mt-n4,
+.my-n4 {
+ margin-top: -1.875rem !important;
+}
+
+.mr-n4,
+.mx-n4 {
+ margin-left: -1.875rem !important;
+}
+
+.mb-n4,
+.my-n4 {
+ margin-bottom: -1.875rem !important;
+}
+
+.ml-n4,
+.mx-n4 {
+ margin-right: -1.875rem !important;
+}
+
+.m-n5 {
+ margin: -3.75rem !important;
+}
+
+.mt-n5,
+.my-n5 {
+ margin-top: -3.75rem !important;
+}
+
+.mr-n5,
+.mx-n5 {
+ margin-left: -3.75rem !important;
+}
+
+.mb-n5,
+.my-n5 {
+ margin-bottom: -3.75rem !important;
+}
+
+.ml-n5,
+.mx-n5 {
+ margin-right: -3.75rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mt-auto,
+.my-auto {
+ margin-top: auto !important;
+}
+
+.mr-auto,
+.mx-auto {
+ margin-left: auto !important;
+}
+
+.mb-auto,
+.my-auto {
+ margin-bottom: auto !important;
+}
+
+.ml-auto,
+.mx-auto {
+ margin-right: auto !important;
+}
+
+@media (min-width: 480px) {
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .mt-sm-0,
+ .my-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mr-sm-0,
+ .mx-sm-0 {
+ margin-left: 0 !important;
+ }
+ .mb-sm-0,
+ .my-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-sm-0,
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-sm-1,
+ .my-sm-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-sm-1,
+ .mx-sm-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .mb-sm-1,
+ .my-sm-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-sm-1,
+ .mx-sm-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-sm-2,
+ .my-sm-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-sm-2,
+ .mx-sm-2 {
+ margin-left: 0.625rem !important;
+ }
+ .mb-sm-2,
+ .my-sm-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-sm-2,
+ .mx-sm-2 {
+ margin-right: 0.625rem !important;
+ }
+ .m-sm-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-sm-3,
+ .my-sm-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-sm-3,
+ .mx-sm-3 {
+ margin-left: 1.25rem !important;
+ }
+ .mb-sm-3,
+ .my-sm-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-sm-3,
+ .mx-sm-3 {
+ margin-right: 1.25rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-sm-4,
+ .my-sm-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-sm-4,
+ .mx-sm-4 {
+ margin-left: 1.875rem !important;
+ }
+ .mb-sm-4,
+ .my-sm-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-sm-4,
+ .mx-sm-4 {
+ margin-right: 1.875rem !important;
+ }
+ .m-sm-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-sm-5,
+ .my-sm-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-sm-5,
+ .mx-sm-5 {
+ margin-left: 3.75rem !important;
+ }
+ .mb-sm-5,
+ .my-sm-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-sm-5,
+ .mx-sm-5 {
+ margin-right: 3.75rem !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .pt-sm-0,
+ .py-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pr-sm-0,
+ .px-sm-0 {
+ padding-left: 0 !important;
+ }
+ .pb-sm-0,
+ .py-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-sm-0,
+ .px-sm-0 {
+ padding-right: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-sm-1,
+ .py-sm-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-sm-1,
+ .px-sm-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .pb-sm-1,
+ .py-sm-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-sm-1,
+ .px-sm-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-sm-2,
+ .py-sm-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-sm-2,
+ .px-sm-2 {
+ padding-left: 0.625rem !important;
+ }
+ .pb-sm-2,
+ .py-sm-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-sm-2,
+ .px-sm-2 {
+ padding-right: 0.625rem !important;
+ }
+ .p-sm-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-sm-3,
+ .py-sm-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-sm-3,
+ .px-sm-3 {
+ padding-left: 1.25rem !important;
+ }
+ .pb-sm-3,
+ .py-sm-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-sm-3,
+ .px-sm-3 {
+ padding-right: 1.25rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-sm-4,
+ .py-sm-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-sm-4,
+ .px-sm-4 {
+ padding-left: 1.875rem !important;
+ }
+ .pb-sm-4,
+ .py-sm-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-sm-4,
+ .px-sm-4 {
+ padding-right: 1.875rem !important;
+ }
+ .p-sm-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-sm-5,
+ .py-sm-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-sm-5,
+ .px-sm-5 {
+ padding-left: 3.75rem !important;
+ }
+ .pb-sm-5,
+ .py-sm-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-sm-5,
+ .px-sm-5 {
+ padding-right: 3.75rem !important;
+ }
+ .m-sm-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-sm-n1,
+ .my-sm-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-sm-n1,
+ .mx-sm-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .mb-sm-n1,
+ .my-sm-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-sm-n1,
+ .mx-sm-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .m-sm-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-sm-n2,
+ .my-sm-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-sm-n2,
+ .mx-sm-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .mb-sm-n2,
+ .my-sm-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-sm-n2,
+ .mx-sm-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .m-sm-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-sm-n3,
+ .my-sm-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-sm-n3,
+ .mx-sm-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .mb-sm-n3,
+ .my-sm-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-sm-n3,
+ .mx-sm-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .m-sm-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-sm-n4,
+ .my-sm-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-sm-n4,
+ .mx-sm-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .mb-sm-n4,
+ .my-sm-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-sm-n4,
+ .mx-sm-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .m-sm-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-sm-n5,
+ .my-sm-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-sm-n5,
+ .mx-sm-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .mb-sm-n5,
+ .my-sm-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-sm-n5,
+ .mx-sm-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mt-sm-auto,
+ .my-sm-auto {
+ margin-top: auto !important;
+ }
+ .mr-sm-auto,
+ .mx-sm-auto {
+ margin-left: auto !important;
+ }
+ .mb-sm-auto,
+ .my-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-sm-auto,
+ .mx-sm-auto {
+ margin-right: auto !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .mt-md-0,
+ .my-md-0 {
+ margin-top: 0 !important;
+ }
+ .mr-md-0,
+ .mx-md-0 {
+ margin-left: 0 !important;
+ }
+ .mb-md-0,
+ .my-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-md-0,
+ .mx-md-0 {
+ margin-right: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-md-1,
+ .my-md-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-md-1,
+ .mx-md-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .mb-md-1,
+ .my-md-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-md-1,
+ .mx-md-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .m-md-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-md-2,
+ .my-md-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-md-2,
+ .mx-md-2 {
+ margin-left: 0.625rem !important;
+ }
+ .mb-md-2,
+ .my-md-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-md-2,
+ .mx-md-2 {
+ margin-right: 0.625rem !important;
+ }
+ .m-md-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-md-3,
+ .my-md-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-md-3,
+ .mx-md-3 {
+ margin-left: 1.25rem !important;
+ }
+ .mb-md-3,
+ .my-md-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-md-3,
+ .mx-md-3 {
+ margin-right: 1.25rem !important;
+ }
+ .m-md-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-md-4,
+ .my-md-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-md-4,
+ .mx-md-4 {
+ margin-left: 1.875rem !important;
+ }
+ .mb-md-4,
+ .my-md-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-md-4,
+ .mx-md-4 {
+ margin-right: 1.875rem !important;
+ }
+ .m-md-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-md-5,
+ .my-md-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-md-5,
+ .mx-md-5 {
+ margin-left: 3.75rem !important;
+ }
+ .mb-md-5,
+ .my-md-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-md-5,
+ .mx-md-5 {
+ margin-right: 3.75rem !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .pt-md-0,
+ .py-md-0 {
+ padding-top: 0 !important;
+ }
+ .pr-md-0,
+ .px-md-0 {
+ padding-left: 0 !important;
+ }
+ .pb-md-0,
+ .py-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-md-0,
+ .px-md-0 {
+ padding-right: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-md-1,
+ .py-md-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-md-1,
+ .px-md-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .pb-md-1,
+ .py-md-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-md-1,
+ .px-md-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .p-md-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-md-2,
+ .py-md-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-md-2,
+ .px-md-2 {
+ padding-left: 0.625rem !important;
+ }
+ .pb-md-2,
+ .py-md-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-md-2,
+ .px-md-2 {
+ padding-right: 0.625rem !important;
+ }
+ .p-md-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-md-3,
+ .py-md-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-md-3,
+ .px-md-3 {
+ padding-left: 1.25rem !important;
+ }
+ .pb-md-3,
+ .py-md-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-md-3,
+ .px-md-3 {
+ padding-right: 1.25rem !important;
+ }
+ .p-md-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-md-4,
+ .py-md-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-md-4,
+ .px-md-4 {
+ padding-left: 1.875rem !important;
+ }
+ .pb-md-4,
+ .py-md-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-md-4,
+ .px-md-4 {
+ padding-right: 1.875rem !important;
+ }
+ .p-md-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-md-5,
+ .py-md-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-md-5,
+ .px-md-5 {
+ padding-left: 3.75rem !important;
+ }
+ .pb-md-5,
+ .py-md-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-md-5,
+ .px-md-5 {
+ padding-right: 3.75rem !important;
+ }
+ .m-md-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-md-n1,
+ .my-md-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-md-n1,
+ .mx-md-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .mb-md-n1,
+ .my-md-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-md-n1,
+ .mx-md-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .m-md-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-md-n2,
+ .my-md-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-md-n2,
+ .mx-md-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .mb-md-n2,
+ .my-md-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-md-n2,
+ .mx-md-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .m-md-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-md-n3,
+ .my-md-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-md-n3,
+ .mx-md-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .mb-md-n3,
+ .my-md-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-md-n3,
+ .mx-md-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .m-md-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-md-n4,
+ .my-md-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-md-n4,
+ .mx-md-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .mb-md-n4,
+ .my-md-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-md-n4,
+ .mx-md-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .m-md-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-md-n5,
+ .my-md-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-md-n5,
+ .mx-md-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .mb-md-n5,
+ .my-md-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-md-n5,
+ .mx-md-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mt-md-auto,
+ .my-md-auto {
+ margin-top: auto !important;
+ }
+ .mr-md-auto,
+ .mx-md-auto {
+ margin-left: auto !important;
+ }
+ .mb-md-auto,
+ .my-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-md-auto,
+ .mx-md-auto {
+ margin-right: auto !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .mt-lg-0,
+ .my-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mr-lg-0,
+ .mx-lg-0 {
+ margin-left: 0 !important;
+ }
+ .mb-lg-0,
+ .my-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-lg-0,
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-lg-1,
+ .my-lg-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-lg-1,
+ .mx-lg-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .mb-lg-1,
+ .my-lg-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-lg-1,
+ .mx-lg-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-lg-2,
+ .my-lg-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-lg-2,
+ .mx-lg-2 {
+ margin-left: 0.625rem !important;
+ }
+ .mb-lg-2,
+ .my-lg-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-lg-2,
+ .mx-lg-2 {
+ margin-right: 0.625rem !important;
+ }
+ .m-lg-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-lg-3,
+ .my-lg-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-lg-3,
+ .mx-lg-3 {
+ margin-left: 1.25rem !important;
+ }
+ .mb-lg-3,
+ .my-lg-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-lg-3,
+ .mx-lg-3 {
+ margin-right: 1.25rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-lg-4,
+ .my-lg-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-lg-4,
+ .mx-lg-4 {
+ margin-left: 1.875rem !important;
+ }
+ .mb-lg-4,
+ .my-lg-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-lg-4,
+ .mx-lg-4 {
+ margin-right: 1.875rem !important;
+ }
+ .m-lg-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-lg-5,
+ .my-lg-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-lg-5,
+ .mx-lg-5 {
+ margin-left: 3.75rem !important;
+ }
+ .mb-lg-5,
+ .my-lg-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-lg-5,
+ .mx-lg-5 {
+ margin-right: 3.75rem !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .pt-lg-0,
+ .py-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pr-lg-0,
+ .px-lg-0 {
+ padding-left: 0 !important;
+ }
+ .pb-lg-0,
+ .py-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-lg-0,
+ .px-lg-0 {
+ padding-right: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-lg-1,
+ .py-lg-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-lg-1,
+ .px-lg-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .pb-lg-1,
+ .py-lg-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-lg-1,
+ .px-lg-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-lg-2,
+ .py-lg-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-lg-2,
+ .px-lg-2 {
+ padding-left: 0.625rem !important;
+ }
+ .pb-lg-2,
+ .py-lg-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-lg-2,
+ .px-lg-2 {
+ padding-right: 0.625rem !important;
+ }
+ .p-lg-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-lg-3,
+ .py-lg-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-lg-3,
+ .px-lg-3 {
+ padding-left: 1.25rem !important;
+ }
+ .pb-lg-3,
+ .py-lg-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-lg-3,
+ .px-lg-3 {
+ padding-right: 1.25rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-lg-4,
+ .py-lg-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-lg-4,
+ .px-lg-4 {
+ padding-left: 1.875rem !important;
+ }
+ .pb-lg-4,
+ .py-lg-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-lg-4,
+ .px-lg-4 {
+ padding-right: 1.875rem !important;
+ }
+ .p-lg-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-lg-5,
+ .py-lg-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-lg-5,
+ .px-lg-5 {
+ padding-left: 3.75rem !important;
+ }
+ .pb-lg-5,
+ .py-lg-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-lg-5,
+ .px-lg-5 {
+ padding-right: 3.75rem !important;
+ }
+ .m-lg-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-lg-n1,
+ .my-lg-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-lg-n1,
+ .mx-lg-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .mb-lg-n1,
+ .my-lg-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-lg-n1,
+ .mx-lg-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .m-lg-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-lg-n2,
+ .my-lg-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-lg-n2,
+ .mx-lg-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .mb-lg-n2,
+ .my-lg-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-lg-n2,
+ .mx-lg-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .m-lg-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-lg-n3,
+ .my-lg-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-lg-n3,
+ .mx-lg-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .mb-lg-n3,
+ .my-lg-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-lg-n3,
+ .mx-lg-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .m-lg-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-lg-n4,
+ .my-lg-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-lg-n4,
+ .mx-lg-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .mb-lg-n4,
+ .my-lg-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-lg-n4,
+ .mx-lg-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .m-lg-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-lg-n5,
+ .my-lg-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-lg-n5,
+ .mx-lg-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .mb-lg-n5,
+ .my-lg-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-lg-n5,
+ .mx-lg-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mt-lg-auto,
+ .my-lg-auto {
+ margin-top: auto !important;
+ }
+ .mr-lg-auto,
+ .mx-lg-auto {
+ margin-left: auto !important;
+ }
+ .mb-lg-auto,
+ .my-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-lg-auto,
+ .mx-lg-auto {
+ margin-right: auto !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .mt-xl-0,
+ .my-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xl-0,
+ .mx-xl-0 {
+ margin-left: 0 !important;
+ }
+ .mb-xl-0,
+ .my-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xl-0,
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-xl-1,
+ .my-xl-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-xl-1,
+ .mx-xl-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .mb-xl-1,
+ .my-xl-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-xl-1,
+ .mx-xl-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-xl-2,
+ .my-xl-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-xl-2,
+ .mx-xl-2 {
+ margin-left: 0.625rem !important;
+ }
+ .mb-xl-2,
+ .my-xl-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-xl-2,
+ .mx-xl-2 {
+ margin-right: 0.625rem !important;
+ }
+ .m-xl-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-xl-3,
+ .my-xl-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-xl-3,
+ .mx-xl-3 {
+ margin-left: 1.25rem !important;
+ }
+ .mb-xl-3,
+ .my-xl-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-xl-3,
+ .mx-xl-3 {
+ margin-right: 1.25rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-xl-4,
+ .my-xl-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-xl-4,
+ .mx-xl-4 {
+ margin-left: 1.875rem !important;
+ }
+ .mb-xl-4,
+ .my-xl-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-xl-4,
+ .mx-xl-4 {
+ margin-right: 1.875rem !important;
+ }
+ .m-xl-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-xl-5,
+ .my-xl-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-xl-5,
+ .mx-xl-5 {
+ margin-left: 3.75rem !important;
+ }
+ .mb-xl-5,
+ .my-xl-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-xl-5,
+ .mx-xl-5 {
+ margin-right: 3.75rem !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .pt-xl-0,
+ .py-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xl-0,
+ .px-xl-0 {
+ padding-left: 0 !important;
+ }
+ .pb-xl-0,
+ .py-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xl-0,
+ .px-xl-0 {
+ padding-right: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-xl-1,
+ .py-xl-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-xl-1,
+ .px-xl-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .pb-xl-1,
+ .py-xl-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-xl-1,
+ .px-xl-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-xl-2,
+ .py-xl-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-xl-2,
+ .px-xl-2 {
+ padding-left: 0.625rem !important;
+ }
+ .pb-xl-2,
+ .py-xl-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-xl-2,
+ .px-xl-2 {
+ padding-right: 0.625rem !important;
+ }
+ .p-xl-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-xl-3,
+ .py-xl-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-xl-3,
+ .px-xl-3 {
+ padding-left: 1.25rem !important;
+ }
+ .pb-xl-3,
+ .py-xl-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-xl-3,
+ .px-xl-3 {
+ padding-right: 1.25rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-xl-4,
+ .py-xl-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-xl-4,
+ .px-xl-4 {
+ padding-left: 1.875rem !important;
+ }
+ .pb-xl-4,
+ .py-xl-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-xl-4,
+ .px-xl-4 {
+ padding-right: 1.875rem !important;
+ }
+ .p-xl-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-xl-5,
+ .py-xl-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-xl-5,
+ .px-xl-5 {
+ padding-left: 3.75rem !important;
+ }
+ .pb-xl-5,
+ .py-xl-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-xl-5,
+ .px-xl-5 {
+ padding-right: 3.75rem !important;
+ }
+ .m-xl-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-xl-n1,
+ .my-xl-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-xl-n1,
+ .mx-xl-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .mb-xl-n1,
+ .my-xl-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-xl-n1,
+ .mx-xl-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .m-xl-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-xl-n2,
+ .my-xl-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-xl-n2,
+ .mx-xl-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .mb-xl-n2,
+ .my-xl-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-xl-n2,
+ .mx-xl-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .m-xl-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-xl-n3,
+ .my-xl-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-xl-n3,
+ .mx-xl-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .mb-xl-n3,
+ .my-xl-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-xl-n3,
+ .mx-xl-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .m-xl-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-xl-n4,
+ .my-xl-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-xl-n4,
+ .mx-xl-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .mb-xl-n4,
+ .my-xl-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-xl-n4,
+ .mx-xl-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .m-xl-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-xl-n5,
+ .my-xl-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-xl-n5,
+ .mx-xl-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .mb-xl-n5,
+ .my-xl-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-xl-n5,
+ .mx-xl-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mt-xl-auto,
+ .my-xl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xl-auto,
+ .mx-xl-auto {
+ margin-left: auto !important;
+ }
+ .mb-xl-auto,
+ .my-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xl-auto,
+ .mx-xl-auto {
+ margin-right: auto !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+ .mt-xxl-0,
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xxl-0,
+ .mx-xxl-0 {
+ margin-left: 0 !important;
+ }
+ .mb-xxl-0,
+ .my-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xxl-0,
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ }
+ .m-xxl-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-xxl-1,
+ .my-xxl-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-xxl-1,
+ .mx-xxl-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .mb-xxl-1,
+ .my-xxl-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-xxl-1,
+ .mx-xxl-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .m-xxl-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-xxl-2,
+ .my-xxl-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-xxl-2,
+ .mx-xxl-2 {
+ margin-left: 0.625rem !important;
+ }
+ .mb-xxl-2,
+ .my-xxl-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-xxl-2,
+ .mx-xxl-2 {
+ margin-right: 0.625rem !important;
+ }
+ .m-xxl-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-xxl-3,
+ .my-xxl-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-xxl-3,
+ .mx-xxl-3 {
+ margin-left: 1.25rem !important;
+ }
+ .mb-xxl-3,
+ .my-xxl-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-xxl-3,
+ .mx-xxl-3 {
+ margin-right: 1.25rem !important;
+ }
+ .m-xxl-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-xxl-4,
+ .my-xxl-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-xxl-4,
+ .mx-xxl-4 {
+ margin-left: 1.875rem !important;
+ }
+ .mb-xxl-4,
+ .my-xxl-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-xxl-4,
+ .mx-xxl-4 {
+ margin-right: 1.875rem !important;
+ }
+ .m-xxl-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-xxl-5,
+ .my-xxl-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-xxl-5,
+ .mx-xxl-5 {
+ margin-left: 3.75rem !important;
+ }
+ .mb-xxl-5,
+ .my-xxl-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-xxl-5,
+ .mx-xxl-5 {
+ margin-right: 3.75rem !important;
+ }
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+ .pt-xxl-0,
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xxl-0,
+ .px-xxl-0 {
+ padding-left: 0 !important;
+ }
+ .pb-xxl-0,
+ .py-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xxl-0,
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ }
+ .p-xxl-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-xxl-1,
+ .py-xxl-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-xxl-1,
+ .px-xxl-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .pb-xxl-1,
+ .py-xxl-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-xxl-1,
+ .px-xxl-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .p-xxl-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-xxl-2,
+ .py-xxl-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-xxl-2,
+ .px-xxl-2 {
+ padding-left: 0.625rem !important;
+ }
+ .pb-xxl-2,
+ .py-xxl-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-xxl-2,
+ .px-xxl-2 {
+ padding-right: 0.625rem !important;
+ }
+ .p-xxl-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-xxl-3,
+ .py-xxl-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-xxl-3,
+ .px-xxl-3 {
+ padding-left: 1.25rem !important;
+ }
+ .pb-xxl-3,
+ .py-xxl-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-xxl-3,
+ .px-xxl-3 {
+ padding-right: 1.25rem !important;
+ }
+ .p-xxl-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-xxl-4,
+ .py-xxl-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-xxl-4,
+ .px-xxl-4 {
+ padding-left: 1.875rem !important;
+ }
+ .pb-xxl-4,
+ .py-xxl-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-xxl-4,
+ .px-xxl-4 {
+ padding-right: 1.875rem !important;
+ }
+ .p-xxl-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-xxl-5,
+ .py-xxl-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-xxl-5,
+ .px-xxl-5 {
+ padding-left: 3.75rem !important;
+ }
+ .pb-xxl-5,
+ .py-xxl-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-xxl-5,
+ .px-xxl-5 {
+ padding-right: 3.75rem !important;
+ }
+ .m-xxl-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-xxl-n1,
+ .my-xxl-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-xxl-n1,
+ .mx-xxl-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .mb-xxl-n1,
+ .my-xxl-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-xxl-n1,
+ .mx-xxl-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .m-xxl-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-xxl-n2,
+ .my-xxl-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-xxl-n2,
+ .mx-xxl-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .mb-xxl-n2,
+ .my-xxl-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-xxl-n2,
+ .mx-xxl-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .m-xxl-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-xxl-n3,
+ .my-xxl-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-xxl-n3,
+ .mx-xxl-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .mb-xxl-n3,
+ .my-xxl-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-xxl-n3,
+ .mx-xxl-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .m-xxl-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-xxl-n4,
+ .my-xxl-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-xxl-n4,
+ .mx-xxl-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .mb-xxl-n4,
+ .my-xxl-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-xxl-n4,
+ .mx-xxl-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .m-xxl-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-xxl-n5,
+ .my-xxl-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-xxl-n5,
+ .mx-xxl-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .mb-xxl-n5,
+ .my-xxl-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-xxl-n5,
+ .mx-xxl-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+ .mt-xxl-auto,
+ .my-xxl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xxl-auto,
+ .mx-xxl-auto {
+ margin-left: auto !important;
+ }
+ .mb-xxl-auto,
+ .my-xxl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xxl-auto,
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ }
+}
+
+.text-monospace {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
+}
+
+.text-justify {
+ text-align: justify !important;
+}
+
+.text-wrap {
+ white-space: normal !important;
+}
+
+.text-nowrap {
+ white-space: nowrap !important;
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.text-left {
+ text-align: right !important;
+}
+
+.text-right {
+ text-align: left !important;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+@media (min-width: 480px) {
+ .text-sm-left {
+ text-align: right !important;
+ }
+ .text-sm-right {
+ text-align: left !important;
+ }
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .text-md-left {
+ text-align: right !important;
+ }
+ .text-md-right {
+ text-align: left !important;
+ }
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .text-lg-left {
+ text-align: right !important;
+ }
+ .text-lg-right {
+ text-align: left !important;
+ }
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .text-xl-left {
+ text-align: right !important;
+ }
+ .text-xl-right {
+ text-align: left !important;
+ }
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .text-xxl-left {
+ text-align: right !important;
+ }
+ .text-xxl-right {
+ text-align: left !important;
+ }
+ .text-xxl-center {
+ text-align: center !important;
+ }
+}
+
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.font-weight-light {
+ font-weight: 300 !important;
+}
+
+.font-weight-lighter {
+ font-weight: lighter !important;
+}
+
+.font-weight-normal {
+ font-weight: 400 !important;
+}
+
+.font-weight-bold {
+ font-weight: 700 !important;
+}
+
+.font-weight-bolder {
+ font-weight: bolder !important;
+}
+
+.font-italic {
+ font-style: italic !important;
+}
+
+.text-white {
+ color: #fff !important;
+}
+
+.text-primary {
+ color: #f16e00 !important;
+}
+
+a.text-primary:hover, a.text-primary:focus {
+ color: #a54b00 !important;
+}
+
+.text-secondary {
+ color: #000 !important;
+}
+
+a.text-secondary:hover, a.text-secondary:focus {
+ color: black !important;
+}
+
+.text-success {
+ color: #32c832 !important;
+}
+
+a.text-success:hover, a.text-success:focus {
+ color: #238b23 !important;
+}
+
+.text-info {
+ color: #527edb !important;
+}
+
+a.text-info:hover, a.text-info:focus {
+ color: #2756ba !important;
+}
+
+.text-warning {
+ color: #fc0 !important;
+}
+
+a.text-warning:hover, a.text-warning:focus {
+ color: #b38f00 !important;
+}
+
+.text-danger {
+ color: #cd3c14 !important;
+}
+
+a.text-danger:hover, a.text-danger:focus {
+ color: #87280d !important;
+}
+
+.text-light {
+ color: #ddd !important;
+}
+
+a.text-light:hover, a.text-light:focus {
+ color: #b7b7b7 !important;
+}
+
+.text-dark {
+ color: #000 !important;
+}
+
+a.text-dark:hover, a.text-dark:focus {
+ color: black !important;
+}
+
+.text-body {
+ color: #000 !important;
+}
+
+.text-muted {
+ color: #666 !important;
+}
+
+.text-black-50 {
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.text-white-50 {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.text-decoration-none {
+ text-decoration: none !important;
+}
+
+.text-break {
+ word-break: break-word !important;
+ overflow-wrap: break-word !important;
+}
+
+.text-reset {
+ color: inherit !important;
+}
+
+.visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden !important;
+}
+
+@media print {
+ *,
+ *::before,
+ *::after {
+ text-shadow: none !important;
+ box-shadow: none !important;
+ }
+ a:not(.btn) {
+ text-decoration: underline;
+ }
+ abbr[title]::after {
+ content: " (" attr(title) ")";
+ }
+ pre {
+ white-space: pre-wrap !important;
+ }
+ pre,
+ blockquote {
+ border: 2px solid #ccc;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ @page {
+ size: a3;
+ }
+ body {
+ min-width: 980px !important;
+ }
+ .container {
+ min-width: 980px !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .badge {
+ border: 2px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #eee !important;
+ }
+ .table-dark {
+ color: inherit;
+ }
+ .table-dark th,
+ .table-dark td,
+ .table-dark thead th,
+ .table-dark tbody + tbody {
+ border-color: #ccc;
+ }
+ .table .thead-dark th {
+ color: inherit;
+ border-color: #ccc;
+ }
+ .row,
+ .form-row {
+ display: block !important;
+ }
+}
+
+.card-deck .o-card-link {
+ margin: 0 1rem;
+}
+
+.o-card-link .card-title {
+ -ms-flex-item-align: center;
+ align-self: center;
+ width: 100%;
+ margin: auto 0;
+ font-weight: 700;
+ word-break: normal;
+}
+
+.o-card-link .card-img {
+ padding: 0;
+ text-align: center;
+}
+
+.o-card-link .card-img img {
+ width: 100%;
+ height: auto;
+}
+
+.o-card-link .card-body {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ text-align: center;
+}
+
+.card-deck {
+ margin: 0;
+}
+
+@media (max-width: 479.98px) {
+ .card.o-card-link {
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ margin: 1rem;
+ }
+ .card-deck {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+ .card-deck .o-card-link,
+ .o-card-link {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ height: 3.75rem;
+ margin: 0;
+ margin-bottom: .625rem;
+ border: 0;
+ }
+ .o-card-link .card-img {
+ -ms-flex-preferred-size: 20%;
+ flex-basis: 20%;
+ width: auto;
+ padding: 0;
+ }
+ .o-card-link .card-img img {
+ width: auto;
+ height: 3.75rem;
+ }
+ .o-card-link .card-body {
+ -ms-flex-preferred-size: 80%;
+ flex-basis: 80%;
+ -ms-flex-item-align: center;
+ align-self: center;
+ padding: 0 1rem;
+ text-align: right;
+ }
+ .o-card-link .card-title {
+ -ms-flex-item-align: start;
+ align-self: flex-start;
+ margin: 0;
+ }
+ .o-card-link .card-title::after {
+ position: absolute;
+ top: calc(50% - .5rem);
+ left: .25rem;
+ width: 1rem;
+ height: 1rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ }
+}
+
+@media (min-width: 480px) and (max-width: 767.98px) {
+ .card.o-card-link {
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ margin: 1rem;
+ }
+}
+
+.o-switch .toggle,
+.o-switch .toggle::before,
+.o-switch .toggle .on,
+.o-switch .toggle .off {
+ transition: .4s;
+}
+
+.o-switch .toggle {
+ position: relative;
+ display: block;
+ width: auto;
+ min-width: 3.75rem;
+ height: 1.875rem;
+ margin: .3125rem 0;
+ background: #666;
+ border: 2px solid #666;
+}
+
+.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {
+ border-radius: 1.625rem;
+}
+
+.o-switch .toggle .on,
+.o-switch .toggle .off {
+ display: none;
+ font-weight: 700;
+ line-height: 1.625rem;
+ color: #fff;
+ text-align: right;
+ cursor: default;
+ opacity: 0;
+}
+
+.o-switch .toggle .on.svg-checkbox-tick::after {
+ top: .1875rem;
+ right: -.125rem;
+}
+
+.o-switch .toggle .off {
+ display: block;
+ text-align: left;
+ opacity: 1;
+}
+
+.o-switch .toggle .off.svg-delete::after {
+ top: .1875rem;
+ left: -.125rem;
+ right: auto;
+}
+
+.o-switch .toggle::before {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1;
+ display: block;
+ width: 1.625rem;
+ height: 1.625rem;
+ content: "";
+ background: #fff;
+}
+
+.o-switch .checkbox:focus + .toggle::before {
+ outline: 1px dotted #fff;
+}
+
+.o-switch .checkbox:checked + .toggle {
+ background: #f16e00;
+ border-color: #f16e00;
+}
+
+.o-switch .checkbox:checked + .toggle .on {
+ display: block;
+ opacity: 1;
+}
+
+.o-switch .checkbox:checked + .toggle .off {
+ display: none;
+ opacity: 0;
+}
+
+.o-switch .checkbox:checked + .toggle::before {
+ left: 0;
+ right: auto;
+}
+
+.o-switch .checkbox.success:checked + .toggle {
+ background: #32c832;
+ border-color: #32c832;
+}
+
+.o-switch .checkbox.success:checked + .toggle .on {
+ color: #000;
+}
+
+.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {
+ color: #fff;
+}
+
+.form-group.row .o-switch .col-form-label.toggle {
+ padding: 0 .375rem;
+}
+
+.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {
+ padding: 0 .875rem;
+}
+
+.o-switch.btn-group-toggle {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ border: 2px solid #ccc;
+}
+
+.o-switch.btn-group-toggle .btn {
+ min-width: 2.5rem;
+ padding-left: 0;
+ padding-right: 0;
+ margin: -2px 0;
+ border: 2px solid transparent;
+}
+
+.o-switch.btn-group-toggle .btn:first-child {
+ margin-right: -2px;
+}
+
+.o-switch.btn-group-toggle .btn:last-child {
+ margin-left: -2px;
+}
+
+.o-switch.btn-group-toggle .btn.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.o-switch.btn-group-toggle .btn.focus {
+ outline: 1px dotted #fff;
+ outline-offset: -2px;
+}
+
+.o-switch.btn-group-toggle .btn:active {
+ border-color: #f16e00;
+}
+
+.o-switch.btn-group-toggle .btn:hover:not(:active) {
+ color: #f16e00;
+ background-color: transparent;
+}
+
+.o-switch.btn-group-toggle .btn:hover.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.o-switch.btn-group-toggle.no-outline {
+ border-color: transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn {
+ border-top: 2px solid transparent;
+ border-bottom: 2px solid transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:first-child {
+ border-right-color: transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:last-child {
+ border-left-color: transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn.active {
+ color: #f16e00;
+ background-color: #fff;
+ border-color: transparent;
+ outline-color: #000;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {
+ color: #000;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:hover.active {
+ color: #f16e00;
+ background-color: #fff;
+ border-color: transparent;
+ outline-color: #000;
+}
+
+.form-group input[type="radio"],
+.form-group input[type="checkbox"] {
+ width: auto;
+}
+
+.form-group .invalid-feedback {
+ margin-top: .8125rem;
+ font-weight: 700;
+}
+
+.form-group.top {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.form-group.top .col-form-label {
+ margin-bottom: 0;
+}
+
+.form-group.top .form-control {
+ -ms-flex-order: 2;
+ order: 2;
+}
+
+.form-group.top .invalid-feedback {
+ -ms-flex-order: 1;
+ order: 1;
+ margin-top: 0;
+ margin-bottom: .8125rem;
+ line-height: 1;
+}
+
+.form-group.right {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+}
+
+.form-group.right label,
+.form-group.right .col-form-label {
+ min-width: 100%;
+}
+
+.form-group.right .form-control-message,
+.form-group.right .invalid-feedback {
+ max-width: 50%;
+ margin-right: .625rem;
+}
+
+.form-group.row.top {
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.form-group.row.top label,
+.form-group.row.top .col-form-label {
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.form-group.row.top .form-control {
+ -ms-flex-order: 2;
+ order: 2;
+ margin-top: 0;
+}
+
+.form-group.row.top .invalid-feedback {
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.form-group.row.right label,
+.form-group.row.right .col-form-label {
+ min-width: auto;
+}
+
+.form-group.row.right .invalid-feedback {
+ -ms-flex-item-align: center;
+ align-self: center;
+ margin-top: 0;
+}
+
+.form-group.is-required label::after {
+ margin-right: 6px;
+ font-weight: 700;
+ color: #f16e00;
+ content: "*";
+}
+
+.form-group .form-control:invalid {
+ outline: none;
+ box-shadow: none;
+}
+
+select.form-control:not([size]):not([multiple]) {
+ height: auto;
+ padding-top: .4375rem;
+ padding-bottom: .4375rem;
+}
+
+select.form-control:not([size]):not([multiple]).form-control-lg {
+ padding-top: .65625rem;
+ padding-bottom: .65625rem;
+}
+
+select.form-control:not([size]):not([multiple]).form-control-sm {
+ padding-top: .1875rem;
+ padding-bottom: .1875rem;
+}
+
+.has-feedback label ~ .invalid-feedback {
+ top: 1.75;
+}
+
+.o-square-list {
+ padding-right: 0;
+ color: #f16e00;
+ text-align: right;
+}
+
+.o-square-list,
+.o-square-list ul * {
+ list-style-type: none;
+}
+
+.o-square-list li {
+ color: #000;
+}
+
+.o-square-list li::before {
+ margin-left: 1rem;
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ color: #f16e00;
+ vertical-align: text-top;
+ content: "\25A0";
+}
+
+.o-square-list li span {
+ display: inline-block;
+ margin-bottom: .625rem;
+}
+
+.o-square-list li > ul {
+ padding-right: 1rem;
+}
+
+.o-square-list ul > li::before {
+ color: #999;
+}
+
+.o-square-list ul ul > li::before {
+ color: #ccc;
+}
+
+.o-stepbar,
+.o-stepbar ol,
+.o-stepbar ul {
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(1) {
+ width: 100%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(2),
+.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {
+ width: 50%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(3),
+.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {
+ width: 33.3333%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(4),
+.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {
+ width: 25%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(5),
+.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {
+ width: 20%;
+}
+
+.o-stepbar .stepbar-item {
+ position: relative;
+ float: right;
+ padding: 0.625rem 1.25rem;
+ padding-right: 2rem;
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ text-align: center;
+ white-space: nowrap;
+ list-style: none;
+ background-color: #ddd;
+}
+
+.o-stepbar .stepbar-item::after {
+ position: absolute;
+ top: 0;
+ left: -1rem;
+ z-index: 500;
+ display: block;
+ width: 1rem;
+ height: 2.5rem;
+ content: "";
+ background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1rem 2.5rem;
+}
+
+.o-stepbar .stepbar-item:first-child {
+ padding-right: 1.25rem;
+}
+
+.o-stepbar .stepbar-item:last-child::after {
+ display: none;
+}
+
+.o-stepbar .stepbar-item.done {
+ background-color: #000;
+}
+
+.o-stepbar .stepbar-item.done::after {
+ position: absolute;
+ top: 0;
+ left: -1rem;
+ z-index: 500;
+ display: block;
+ width: 1rem;
+ height: 2.5rem;
+ content: "";
+ background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1rem 2.5rem;
+}
+
+.o-stepbar .stepbar-item.done .stepbar-link {
+ color: #fff;
+}
+
+.o-stepbar .stepbar-item.done:last-child::after {
+ display: none;
+}
+
+.o-stepbar .stepbar-item.current {
+ background-color: #f16e00;
+}
+
+.o-stepbar .stepbar-item.current::after {
+ position: absolute;
+ top: 0;
+ left: -1rem;
+ z-index: 500;
+ display: block;
+ width: 1rem;
+ height: 2.5rem;
+ content: "";
+ background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1rem 2.5rem;
+}
+
+.o-stepbar .stepbar-item.current .stepbar-link {
+ color: #fff;
+}
+
+.o-stepbar .stepbar-item.current:last-child::after {
+ display: none;
+}
+
+.o-stepbar .stepbar-item .stepbar-link {
+ text-decoration: none;
+}
+
+.o-stepbar .stepbar-item .stepbar-link .step-number::after {
+ content: ".";
+}
+
+@media (max-width: 479.98px) {
+ .o-stepbar .stepbar-item {
+ padding: 0.3125rem 2rem 0.3125rem 0.625rem;
+ line-height: 1.25;
+ }
+ .o-stepbar .stepbar-item::after,
+ .o-stepbar .stepbar-item.done::after,
+ .o-stepbar .stepbar-item.current::after,
+ .o-stepbar .stepbar-item.next::after {
+ left: -0.6875rem;
+ width: 0.75rem;
+ height: 1.875rem;
+ background-size: cover;
+ }
+ .o-stepbar.xs-numbers .step-number::after {
+ display: none;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {
+ width: 20%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {
+ width: 60%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {
+ width: 20%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {
+ width: 40%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item {
+ width: 20%;
+ padding-left: 0;
+ padding-right: 0.75rem;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child {
+ padding-right: 0;
+ }
+ .o-stepbar.xs-numbers .stepbar-item.current {
+ width: 60%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item.current .step-number {
+ display: none;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {
+ display: none;
+ }
+ .o-stepbar.xs-labels .step-number {
+ display: none;
+ }
+}
+
+.o-link-arrow {
+ font-size: 1rem;
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.o-link-arrow::after {
+ display: inline-block;
+ padding: 0 0.625rem;
+ font-family: icon-orange;
+ font-size: 0.625rem;
+ color: #000;
+ content: "\e93e";
+}
+
+.o-link-arrow:hover::after, .o-link-arrow:focus::after {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+.o-link-arrow.back::after {
+ padding: 0;
+ content: "";
+}
+
+.o-link-arrow.back::before {
+ display: inline-block;
+ padding: 0 0 0 0.625rem;
+ font-family: icon-orange;
+ font-size: 0.625rem;
+ color: #000;
+ content: "\e93f";
+}
+
+.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+.mega-menu {
+ overflow: hidden;
+}
+
+.mega-menu > .navbar-nav {
+ transition: -webkit-transform .5s;
+ transition: transform .5s;
+ transition: transform .5s, -webkit-transform .5s;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+}
+
+.mega-menu-panel > .navbar-nav,
+.mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.mega-menu-panel > .navbar-nav .navbar-nav,
+.mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: absolute;
+ top: 0;
+ right: 100%;
+ display: none;
+ width: 100%;
+}
+
+.navbar .nav-link.icon {
+ margin-top: 0;
+}
+
+.navbar .nav-link.icon span[class^="icon-"] {
+ font-size: 1.5rem;
+ font-weight: 400;
+}
+
+.navbar .nav-link.icon[class*="svg-"], .navbar .nav-link.icon[class*="svg-"]::after {
+ width: 1.875rem;
+ height: 1.875rem;
+}
+
+.navbar .nav-link:not(.icon)[class*="svg-"]::after {
+ top: 0;
+ left: 0;
+ right: auto;
+}
+
+.navbar.supra {
+ height: 2.5rem;
+ min-height: 2.5rem;
+ padding-top: 0;
+ padding-bottom: 0;
+ border-bottom: 1px solid #333;
+}
+
+@media (max-width: 479.98px) {
+ .navbar.supra {
+ display: none;
+ }
+}
+
+.navbar.supra > .container,
+.navbar.supra > .container .navbar-nav {
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.navbar.supra .navbar-brand {
+ display: none;
+}
+
+.navbar.supra .navbar-nav {
+ margin: 0;
+}
+
+.navbar.supra .navbar-nav > .nav-link:first-child,
+.navbar.supra .navbar-nav .nav-item:first-child .nav-link {
+ margin-right: 0;
+}
+
+.navbar.supra .nav-link,
+.navbar.supra .dropdown-toggle {
+ font-size: 0.875rem;
+ line-height: 1;
+}
+
+.navbar.supra .nav-link:focus,
+.navbar.supra .dropdown-toggle:focus {
+ outline-offset: .5rem;
+}
+
+.navbar.supra .nav-link span[class^="icon-"],
+.navbar.supra .dropdown-toggle span[class^="icon-"] {
+ font-size: 1.125rem;
+ font-weight: 400;
+}
+
+.navbar.supra .nav-link.icon span[class^="icon-"] {
+ font-size: 1rem;
+ font-weight: 400;
+}
+
+.navbar.supra .nav-link.icon[class*="svg-"], .navbar.supra .nav-link.icon[class*="svg-"]::after {
+ width: 1.25rem;
+ height: 1.25rem;
+}
+
+.navbar.supra .dropdown-menu {
+ left: 0;
+ right: auto;
+}
+
+@media (max-width: 479.98px) {
+ .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {
+ padding-left: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-sm .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-left: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-left: .4375em solid transparent;
+ border-right: .4375em solid transparent;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-sm .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {
+ float: right;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 480px) {
+ .navbar-expand-sm .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-sm .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-sm .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ right: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-sm .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: left;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-sm .mega-menu-panel .nav-link {
+ margin-right: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-left: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-right: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {
+ padding-left: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-md .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-left: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-left: .4375em solid transparent;
+ border-right: .4375em solid transparent;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-md .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {
+ float: right;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-expand-md .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-md .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-md .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ right: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-md .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: left;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-md .mega-menu-panel .nav-link {
+ margin-right: 0;
+ }
+ .navbar-expand-md .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-left: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-right: 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {
+ padding-left: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-lg .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-left: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-left: .4375em solid transparent;
+ border-right: .4375em solid transparent;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-lg .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {
+ float: right;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 980px) {
+ .navbar-expand-lg .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-lg .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-lg .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ right: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-lg .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: left;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-lg .mega-menu-panel .nav-link {
+ margin-right: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-left: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-right: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 1219.98px) {
+ .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {
+ padding-left: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-xl .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-left: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-left: .4375em solid transparent;
+ border-right: .4375em solid transparent;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-xl .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {
+ float: right;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 1220px) {
+ .navbar-expand-xl .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-xl .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-xl .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ right: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-xl .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: left;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-xl .mega-menu-panel .nav-link {
+ margin-right: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-left: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-right: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 1379.98px) {
+ .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {
+ padding-left: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-xxl .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-left: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-left: .4375em solid transparent;
+ border-right: .4375em solid transparent;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-xxl .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {
+ float: right;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 1380px) {
+ .navbar-expand-xxl .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-xxl .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-xxl .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ right: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-xxl .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: left;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-xxl .mega-menu-panel .nav-link {
+ margin-right: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-left: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-right: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {
+ padding-left: 0;
+ outline-offset: -1px;
+}
+
+.navbar-expand .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-left: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-left: .4375em solid transparent;
+ border-right: .4375em solid transparent;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+}
+
+.navbar-expand .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+}
+
+.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+}
+
+.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {
+ float: right;
+ -webkit-transform: rotateZ(-180deg);
+ transform: rotateZ(-180deg);
+}
+
+.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+}
+
+.navbar-expand .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+}
+
+.navbar-expand .mega-menu {
+ overflow: visible;
+}
+
+.navbar-expand .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+}
+
+.navbar-expand .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+}
+
+.navbar-expand .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ right: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+}
+
+.navbar-expand .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: left;
+ margin: 1.25rem;
+ color: #fff;
+}
+
+.navbar-expand .mega-menu-panel .nav-link {
+ margin-right: 0;
+}
+
+.navbar-expand .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-left: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-right: 0;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+}
+
+@media (max-width: 767.98px) {
+ .navbar-brand,
+ .navbar-brand + .navbar-brand {
+ -ms-flex-item-align: center;
+ align-self: center;
+ }
+}
+
+.table > thead > tr,
+.table > tbody > tr,
+.table > tfoot > tr {
+ border-bottom: 1px solid #ccc;
+}
+
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ vertical-align: middle;
+ border: 0;
+}
+
+.table > thead > tr > th:first-child,
+.table > thead > tr > td:first-child,
+.table > tbody > tr > th:first-child,
+.table > tbody > tr > td:first-child,
+.table > tfoot > tr > th:first-child,
+.table > tfoot > tr > td:first-child {
+ padding-right: .625rem;
+}
+
+.table > thead > tr [class^="icon-"],
+.table > thead > tr [class*=" icon-"],
+.table > tbody > tr [class^="icon-"],
+.table > tbody > tr [class*=" icon-"],
+.table > tfoot > tr [class^="icon-"],
+.table > tfoot > tr [class*=" icon-"] {
+ font-size: 1.8125rem;
+}
+
+.table > thead > tr [class^="svg-"],
+.table > tbody > tr [class^="svg-"],
+.table > tfoot > tr [class^="svg-"] {
+ display: block;
+ width: 1.8125rem;
+ height: 1.8125rem;
+ margin: 0 auto;
+}
+
+.table > thead > tr [class^="svg-"]::after,
+.table > tbody > tr [class^="svg-"]::after,
+.table > tfoot > tr [class^="svg-"]::after {
+ width: 1.8125rem;
+ height: 1.8125rem;
+}
+
+.table thead > tr {
+ border-bottom-width: 2px;
+}
+
+.table thead > tr > th {
+ font-size: 1rem;
+ font-weight: 700;
+}
+
+.table tbody > th {
+ font-weight: 400;
+}
+
+.table.has-checkbox tr.selected > td,
+.table.has-checkbox tr.selected > th {
+ background-color: #ddd;
+}
+
+.table.has-checkbox tr > th:first-child,
+.table.has-checkbox tr > td:first-child {
+ width: 1.25rem;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.table.has-icon tr > td,
+.table.has-icon tr > th {
+ height: 3.1875rem;
+ padding-top: .6875rem;
+ vertical-align: middle;
+}
+
+.table.has-icon tr > td span,
+.table.has-icon tr > td img,
+.table.has-icon tr > th span,
+.table.has-icon tr > th img {
+ vertical-align: middle;
+}
+
+.table.has-icon tr > td img,
+.table.has-icon tr > th img {
+ width: 1.875rem;
+ height: 1.875rem;
+ margin-left: .625rem;
+}
+
+.table.has-icon tr > td [class^="icon-"],
+.table.has-icon tr > th [class^="icon-"] {
+ width: 1.875rem;
+ margin-left: .375rem;
+ font-size: 1.8125rem;
+ line-height: 0;
+ vertical-align: middle;
+}
+
+.table.table-reflow thead > tr,
+.table.table-reflow tbody > tr {
+ border: 0;
+}
+
+.table.table-reflow thead > tr > td,
+.table.table-reflow tbody > tr > td {
+ line-height: 1.25rem;
+}
+
+.table.table-reflow thead > tr > th:first-child,
+.table.table-reflow tbody > tr > th:first-child {
+ border-bottom: 2px solid #ccc;
+}
+
+.table.table-reflow thead > tr > th,
+.table.table-reflow thead > tr > td,
+.table.table-reflow tbody > tr > th,
+.table.table-reflow tbody > tr > td {
+ border-bottom: 1px solid #ccc;
+}
+
+.table.table-reflow thead > tr > td:last-child,
+.table.table-reflow tbody > tr > td:last-child {
+ border-left: 0;
+}
+
+.table.table-reflow thead > tr {
+ border: 0;
+}
+
+.table.table-reflow thead > tr > th:not(:first-child) {
+ padding-right: .625rem;
+ border-bottom: 1px solid #ccc;
+}
+
+.table.table-reflow thead > tr > th:last-child {
+ border-left: 0;
+}
+
+.table.table-reflow tbody > tr > th:first-child {
+ padding-right: 0;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #32c832;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #2db42d;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #527edb;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #3d6ed7;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #fc0;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #e6b800;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #cd3c14;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #b63512;
+}
+
+caption {
+ padding: .75rem 0;
+ font-size: 2.125rem;
+ font-weight: 700;
+ color: #000;
+ caption-side: top;
+ background-color: #fff;
+}
+
+.tablesorter caption {
+ padding: .75rem 0;
+ font-size: 2.125rem;
+ font-weight: 700;
+ color: #000;
+ background-color: #fff;
+}
+
+.tablesorter th {
+ padding-left: 30px;
+ text-align: right;
+ cursor: pointer;
+}
+
+.tablesorter th.header {
+ position: relative;
+}
+
+.tablesorter th .tablesorter-header-inner span {
+ padding-left: 1.6875rem;
+}
+
+.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {
+ position: absolute;
+ top: 45%;
+ width: .875rem;
+ height: .4375rem;
+ margin-right: .625rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");
+ -webkit-transform: rotate(-180deg);
+ transform: rotate(-180deg);
+}
+
+.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {
+ position: absolute;
+ top: 45%;
+ width: .875rem;
+ height: .4375rem;
+ margin-right: .625rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");
+}
+
+.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,
+.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {
+ position: absolute;
+ top: 31%;
+ width: .875rem;
+ height: 1.0625rem;
+ margin-right: .625rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e");
+}
+
+.tablesorter th a {
+ color: #000;
+ text-decoration: none;
+}
+
+.tablesorter th a:hover, .tablesorter th a:focus {
+ color: #f16e00;
+ text-decoration: underline;
+}
+
+.tablesorter td {
+ text-align: right;
+}
+
+.modal .modal-content {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding: 2.5rem;
+ border: 0;
+}
+
+.modal .modal-header {
+ position: relative;
+ min-height: 1.25rem;
+ padding: 0;
+ margin-bottom: 2.5rem;
+ border: 0;
+}
+
+.modal .modal-header .btn {
+ position: absolute;
+ top: -.625rem;
+ left: -.625rem;
+ padding: .625rem;
+ background-color: transparent;
+ border: 0;
+}
+
+.modal .modal-header .btn .close {
+ width: 1.25rem;
+ height: 1.25rem;
+ margin: 0;
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1.25rem;
+ opacity: 1;
+}
+
+.modal .modal-body {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding: 0;
+ border: 0;
+}
+
+.modal .modal-body .card,
+.modal .modal-body .card {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ padding: 0;
+ border: 0;
+}
+
+.modal .modal-body .card-body {
+ padding: 0;
+}
+
+.modal .modal-body .card-icon {
+ margin-left: 1.25rem;
+}
+
+.modal .modal-body [class^="svg"],
+.modal .modal-body [class^="svg"]::after {
+ width: 2.875rem;
+ height: 2.875rem;
+}
+
+.modal .modal-body [class^="svg"] {
+ display: block;
+}
+
+.modal .modal-body [class^="svg"]::after {
+ top: auto;
+}
+
+.modal .modal-body .card-title {
+ margin-bottom: 1.25rem;
+ font-size: 1.5rem;
+}
+
+.modal .modal-footer {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ padding: 0;
+ margin-top: 2.5rem;
+ border: 0;
+}
+
+.modal .modal-footer .btn + .btn {
+ margin-right: 1.25rem;
+}
+
+@media (max-width: 479.98px) {
+ .modal .modal-content {
+ padding: 1.25rem;
+ }
+ .modal .modal-header {
+ margin: 0;
+ }
+ .modal .modal-body .card {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+ .modal .modal-body .card-icon {
+ -ms-flex-item-align: center;
+ align-self: center;
+ margin-left: 0;
+ }
+ .modal .modal-body .card-icon,
+ .modal .modal-body [class^="svg"]::after {
+ width: 4rem;
+ height: 4rem;
+ }
+ .modal .modal-body .card-title {
+ font-size: 1rem;
+ }
+ .modal .modal-body .card-body {
+ margin-top: 1.25rem;
+ }
+ .modal .modal-footer {
+ -ms-flex-item-align: center;
+ align-self: center;
+ }
+}
+
+.nav .nav-item:first-child {
+ margin-right: -0.625rem;
+}
+
+.nav.flex-column .nav-item:first-child {
+ margin-right: 0;
+}
+
+.nav .nav-link {
+ padding: 0.625rem 0.625rem;
+ line-height: 1.25rem;
+}
+
+.o-nav-light {
+ padding-right: inherit;
+ border-bottom: 1px solid #999;
+}
+
+.o-active {
+ color: #f16e00;
+ border-bottom: 3px solid #f16e00;
+}
+
+.nav-tabs .nav-item:first-child {
+ margin-right: 0;
+}
+
+.nav-tabs .nav-item + .nav-item {
+ margin-right: .5rem;
+}
+
+@media (max-width: 979.98px) {
+ .nav-tabs .nav-item + .nav-item {
+ margin-right: 0;
+ }
+}
+
+.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {
+ outline-width: 1px;
+ outline-style: dotted;
+ outline-offset: -6px;
+}
+
+.nav-tabs .nav-link:not(.disabled) + .nav-link {
+ margin-right: .5rem;
+}
+
+@media (max-width: 979.98px) {
+ .nav-tabs .nav-link:not(.disabled) + .nav-link {
+ margin-right: 0;
+ }
+}
+
+.o-tab-container {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+}
+
+.o-tab-container .o-tab-heading {
+ position: relative;
+ display: inline-block;
+ padding: .625rem 1.25rem;
+ margin-right: .5rem;
+ font-weight: 700;
+ color: #000;
+ text-align: center;
+ background-color: #fff;
+ border: 0;
+ border-bottom: 2px solid #000;
+}
+
+.o-tab-container .o-tab-heading:first-child {
+ margin-right: 0;
+ border-top: 0;
+}
+
+.o-tab-container .o-tab-heading[aria-expanded="false"] {
+ border-bottom: 2px solid #000;
+}
+
+.o-tab-container .o-tab-heading[aria-expanded="true"] {
+ padding-top: .5rem;
+ border: 2px solid #000;
+ border-bottom: 0;
+}
+
+.o-tab-container .o-tab-heading:focus {
+ outline-offset: -4px;
+}
+
+.o-tab-container .o-tab-heading:hover:not([aria-expanded="true"]) {
+ color: #fff;
+ background-color: #000;
+}
+
+.o-tab-container .o-tab-content {
+ display: none;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ -ms-flex-order: 1;
+ order: 1;
+ width: 100%;
+ padding: .625rem 1.25rem;
+ background-color: #fff;
+ box-shadow: 0 -2px 0 #000;
+}
+
+.o-tab-container .o-tab-content.show {
+ display: block;
+}
+
+@media (max-width: 767.98px) {
+ .o-tab-container .o-tab-heading {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ margin-right: 0;
+ text-align: center;
+ }
+ .o-tab-container .o-tab-heading[aria-expanded="false"] {
+ color: #fff;
+ background-color: #666;
+ }
+ .o-tab-container .o-tab-heading[aria-expanded="false"]:active {
+ color: #fff;
+ background-color: #f16e00;
+ }
+ .o-tab-container.accordion-layout {
+ display: block;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading {
+ position: relative;
+ display: block;
+ padding: .9375rem 0;
+ margin-right: 0;
+ font-weight: 700;
+ color: #000;
+ text-align: right;
+ background-color: #fff;
+ border: 0;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading:focus {
+ outline-offset: 0;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading:hover {
+ color: #f16e00;
+ background-color: #fff;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading[aria-expanded="false"] {
+ border-bottom: 1px #ccc solid;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading[aria-expanded="true"]::after {
+ -webkit-transform: rotate(-180deg);
+ transform: rotate(-180deg);
+ }
+ .o-tab-container.accordion-layout .o-tab-heading:first-child {
+ margin-right: 0;
+ border-top: 1px solid #ccc;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading::after {
+ position: absolute;
+ top: 1.375rem;
+ left: .625rem;
+ width: .875rem;
+ height: .4375rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E");
+ }
+ .o-tab-container.accordion-layout .o-tab-content {
+ padding-right: 0;
+ border-bottom: 1px #ccc solid;
+ box-shadow: none;
+ }
+}
+
+.nav-pills.nav-stacked .nav-item {
+ margin: 0;
+}
+
+.nav-pills.nav-stacked .nav-item + .nav-item {
+ margin-right: 0;
+}
+
+.nav-pills .nav-item:first-child {
+ margin-right: 0;
+}
+
+.nav-pills .nav-item + .nav-item {
+ margin-right: 5px;
+}
+
+.nav-pills .nav-link {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.nav-pills .nav-link:active {
+ background-color: #000;
+}
+
+.nav-pills .nav-link:hover {
+ color: #fff;
+ cursor: default;
+ background-color: #000;
+}
+
+.nav-pills .nav-link:hover.disabled {
+ color: #666;
+ background-color: transparent;
+}
+
+.nav-pills .nav-link:focus {
+ color: #fff;
+ background-color: #f16e00;
+ outline: none;
+}
+
+.nav-pills .nav-link:focus.disabled {
+ color: #666;
+ background-color: transparent;
+}
+
+.nav-pills .dropdown-menu {
+ left: 0;
+ right: auto;
+}
+
+.nav-pills .dropdown-menu .nav-item {
+ margin: 0;
+}
+
+.nav-pills .dropdown-menu .nav-item .nav-link {
+ display: block;
+ padding: .625rem 1.25rem .625rem .625rem;
+ margin: 0;
+ color: #000;
+ background: #fff;
+ border: 0;
+}
+
+.nav-pills .dropdown-menu .nav-item .nav-link:focus {
+ outline: 1px dotted #000;
+ outline-offset: -2px;
+}
+
+.nav-pills .dropdown-menu .nav-item .nav-link:hover {
+ color: #fff;
+ background: #000;
+}
+
+.tab-content {
+ padding: 1.125rem;
+ border-color: #000;
+ border-style: solid;
+ border-width: 0 2px 2px;
+}
+
+.tab-content .tab-pane p {
+ margin-bottom: 0;
+}
+
+.tab-content-clear {
+ border: 0;
+}
+
+.breadcrum {
+ line-height: 1;
+}
+
+.overflow-nav {
+ display: none;
+}
+
+.o-nav-local.resizing {
+ overflow: hidden;
+}
+
+.hide {
+ display: none !important;
+}
+
+.show-inline-block {
+ display: inline-block !important;
+}
+
+.overflow-nav-list .nav-link {
+ border: 0;
+}
+
+.overflow-nav-list .nav-link:focus {
+ outline-offset: -2px;
+}
+
+.overflow-nav-list .nav-item:last-child {
+ margin-bottom: 0;
+}
+
+.o-nav-local .overflow-nav-list {
+ margin-top: 1px;
+ border: 0;
+ box-shadow: 0 .3125rem .625rem -.375rem #999;
+}
+
+.o-nav-local {
+ margin-bottom: 2.5rem;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+}
+
+.o-nav-local > .container,
+.o-nav-local > .container-fluid {
+ display: -ms-flexbox;
+ display: flex;
+}
+
+.o-nav-local ul + ul {
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ margin-right: 1rem;
+}
+
+.o-nav-local .nav-item + .nav-item {
+ margin-right: 1rem;
+}
+
+.o-nav-local .nav.flex-column .nav-item {
+ margin-right: 0;
+}
+
+.o-nav-local .nav .nav-link,
+.o-nav-local .nav .dropdown-toggle {
+ display: inline-block;
+ padding: 1rem 0.625rem 1.125rem;
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.o-nav-local .nav .nav-link:focus,
+.o-nav-local .nav .dropdown-toggle:focus {
+ outline: 1px dotted;
+ outline-offset: -1px;
+}
+
+.o-nav-local .nav-link.active {
+ color: #f16e00;
+}
+
+.o-nav-local .dropdown-toggle.show {
+ color: #000;
+}
+
+.o-nav-local .dropdown-menu .nav-item,
+.o-nav-local .dropdown-menu .nav-item + .nav-item {
+ margin: 0;
+}
+
+.o-nav-local .dropdown-menu .nav-link {
+ display: block;
+ padding: .625rem 1.25rem .625rem .625rem;
+}
+
+.o-nav-local .dropdown-menu .nav-link:focus {
+ outline-offset: -2px;
+}
+
+.o-nav-local .dropdown-menu .nav-link:hover {
+ color: #fff;
+ background: #000;
+}
+
+.o-nav-local.inverse {
+ background-color: #000;
+ border-top-color: #333;
+ border-bottom-color: #333;
+}
+
+.o-nav-local.inverse .nav-link {
+ color: #fff;
+ background-color: #000;
+}
+
+.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {
+ color: #f16e00;
+}
+
+.o-nav-local.inverse .nav-link:focus {
+ outline-color: #fff;
+}
+
+.o-nav-local.inverse .nav-link.active {
+ color: #f16e00;
+}
+
+.skiplinks {
+ z-index: 99999;
+}
+
+.skiplinks .skiplinks-section li {
+ float: right;
+}
+
+.skiplinks .skiplinks-section a {
+ display: block;
+ padding: 10px;
+ font-weight: 700;
+ border-color: #999;
+ border-style: none none none solid;
+ border-width: 0 0 0 1px;
+}
+
+.skiplinks .skiplinks-section.skiplinks-show {
+ position: absolute;
+ top: 20px;
+ right: 50%;
+ z-index: 10000000;
+ width: auto;
+ height: auto;
+ margin-right: -175px;
+ overflow: hidden;
+ background: none repeat scroll 100% 0 #ccc;
+ border: 2px solid #000;
+ box-shadow: -2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);
+}
+
+.skiplinks .skiplinks-section a:hover {
+ cursor: pointer;
+}
+
+.skiplinks .skiplinks-section a:hover,
+.skiplinks .skiplinks-section a:focus {
+ color: #f16e00;
+ background-color: #fff;
+ outline: 0 none;
+}
+
+.skiplinks a,
+.skiplinks ul,
+.skiplinks li,
+.skiplinks div {
+ float: none;
+ padding: 0;
+ margin: 0;
+ font-size: .95em;
+ font-weight: 400;
+ line-height: normal;
+ color: #000;
+ text-decoration: none;
+ text-shadow: none;
+ list-style: none;
+ background: none repeat scroll 100% 0 transparent;
+ border: 0 none;
+}
+
+.o-footer {
+ margin-top: 2.5rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+ color: #fff;
+ background-color: #000;
+}
+
+.o-footer .nav-link {
+ padding: 0.625rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {
+ color: #fff;
+}
+
+.o-footer .o-footer-top,
+.o-footer .o-footer-body,
+.o-footer .o-footer-bottom {
+ padding-top: .625rem;
+ padding-bottom: .625rem;
+}
+
+.o-footer .o-footer-top {
+ border-bottom: 1px solid #333;
+}
+
+.o-footer .o-footer-body .row {
+ margin-bottom: .625rem;
+}
+
+.o-footer .o-footer-body h2 {
+ margin-top: .625rem;
+ font-size: 0.875rem;
+ color: #fff;
+}
+
+.o-footer .o-footer-body p,
+.o-footer .o-footer-body p a {
+ color: #fff;
+}
+
+.o-footer .o-footer-body .flex-column .nav-link {
+ padding: 0;
+ line-height: 1.25;
+}
+
+.o-footer .o-footer-bottom {
+ border-top: 1px solid #333;
+}
+
+@media (max-width: 979.98px) {
+ .o-responsive-table thead {
+ display: none;
+ }
+ .o-responsive-table tbody,
+ .o-responsive-table tr,
+ .o-responsive-table th,
+ .o-responsive-table td {
+ display: block;
+ }
+}
+
+@media (max-width: 979.98px) and (min-width: 768px) {
+ .o-responsive-table tr {
+ float: right;
+ width: 45%;
+ }
+ .o-responsive-table tr:nth-child(odd) {
+ margin-left: 10%;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .o-responsive-table th,
+ .o-responsive-table td {
+ vertical-align: middle;
+ }
+ .o-responsive-table td[data-title]::before {
+ float: right;
+ width: 50%;
+ font-weight: 700;
+ content: attr(data-title);
+ }
+ .o-responsive-table tr {
+ margin-bottom: 2em;
+ border-left: 0;
+ border-right: 0;
+ }
+ .o-responsive-table tbody th[scope="row"] {
+ font-weight: 700;
+ border-top: 0;
+ border-bottom: 2px solid #ccc;
+ }
+}
+
+.o-scroll-up {
+ position: fixed;
+ left: 0;
+ bottom: 2.5rem;
+ z-index: 1035;
+ display: none;
+ left: 1.25%;
+ bottom: .25rem;
+}
+
+.o-scroll-up .o-scroll-up-icon {
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ float: left;
+ width: 2.5rem;
+ height: 2.5rem;
+ color: #000;
+ text-align: center;
+ text-decoration: none;
+ background-color: #fff;
+ border-style: solid;
+ border-width: 2px;
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+
+.o-scroll-up .o-scroll-up-icon::before {
+ font-family: icon-orange;
+ font-size: 1.25rem;
+ line-height: 1.8;
+ content: "\e93f";
+}
+
+@media (min-width: 480px) {
+ .o-scroll-up {
+ left: 1.25%;
+ }
+}
+
+@media (min-width: 768px) {
+ .o-scroll-up {
+ left: 1.5625%;
+ }
+}
+
+@media (min-width: 980px) {
+ .o-scroll-up {
+ left: 3.125%;
+ }
+}
+
+@media (min-width: 1220px) {
+ .o-scroll-up {
+ left: 3.125%;
+ }
+}
+
+@media (min-width: 1380px) {
+ .o-scroll-up {
+ left: 4.16667%;
+ }
+}
+
+@media (min-width: 480px) {
+ .o-scroll-up {
+ bottom: .375rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .o-scroll-up {
+ bottom: .75rem;
+ }
+}
+
+@media (min-width: 980px) {
+ .o-scroll-up {
+ bottom: 2rem;
+ }
+}
+
+@media (min-width: 1220px) {
+ .o-scroll-up {
+ bottom: 2.5rem;
+ }
+}
+
+@media (min-width: 1380px) {
+ .o-scroll-up {
+ bottom: 3.75rem;
+ }
+}
+
+.o-scroll-up .o-scroll-up-text {
+ display: inline-block;
+ padding: 0.625rem 0.625rem;
+ font-weight: 700;
+ background-color: #fff;
+ opacity: .8;
+}
+
+.o-scroll-up.static {
+ position: static;
+ z-index: auto;
+ display: inline;
+ float: right;
+}
+
+.o-scroll-up.static .o-scroll-up-text {
+ float: right;
+}
+
+.o-scroll-up.static .o-scroll-up-icon {
+ position: relative;
+ display: inline-block;
+ float: none;
+}
+
+.o-scroll-up:hover, .o-scroll-up:focus {
+ color: #f16e00;
+}
+
+.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {
+ color: #fff;
+ background-color: #000;
+}
+
+.o-scroll-up:active .o-scroll-up-icon {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.dropdown-toggle::after {
+ margin-right: .625rem;
+ vertical-align: 10%;
+}
+
+.dropdown-item {
+ padding-right: 1.25rem;
+ font-weight: 700;
+}
+
+.dropdown-item:focus {
+ color: #000;
+ background-color: #fff;
+ outline: 1px dotted;
+}
+
+.dropdown-item:focus:hover {
+ color: #fff;
+ background-color: #000;
+}
+
+.carousel {
+ margin-bottom: 1.875rem;
+}
+
+.carousel .carousel-item img {
+ width: 100%;
+}
+
+.carousel-control-prev,
+.carousel-control-next {
+ top: auto;
+ bottom: calc(50% - 1.875rem);
+ width: 3.75rem;
+ height: 3.75rem;
+ text-decoration: none;
+ text-shadow: none;
+ background-color: transparent;
+ opacity: .8;
+ transition: width .5s ease;
+}
+
+.carousel-control-prev:focus,
+.carousel-control-next:focus {
+ outline: 2px dotted #000;
+ outline-offset: -1px;
+}
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ margin-top: -1.125rem;
+ font-size: 1.875rem;
+ color: #000;
+ text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;
+ background-image: none;
+ background-repeat: no-repeat;
+}
+
+.carousel-control-prev-icon::before,
+.carousel-control-next-icon::before {
+ font-family: icon-orange;
+}
+
+.carousel-control-prev-icon::before {
+ content: "\e93f";
+}
+
+.carousel-control-next-icon::before {
+ content: "\e93e";
+}
+
+.carousel-indicators {
+ bottom: 0;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.carousel-indicators:hover {
+ cursor: default;
+}
+
+.carousel-indicators li {
+ -ms-flex-positive: 0;
+ flex-grow: 0;
+ width: .625rem;
+ height: .625rem;
+ margin-left: .375rem;
+ background-color: #000;
+ border: 1px solid #fff;
+ border-radius: 50%;
+}
+
+.carousel-indicators li:hover {
+ cursor: pointer;
+}
+
+.carousel-indicators li.active {
+ background-color: #f16e00;
+}
+
+.swiper-button-prev,
+.swiper-button-next {
+ top: calc(50% - 10px);
+ width: auto;
+ height: auto;
+ text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;
+ cursor: pointer;
+ background-image: none;
+ background-size: 0;
+}
+
+.swiper-button-prev:focus,
+.swiper-button-next:focus {
+ outline: 2px dotted #000;
+ outline-offset: -1px;
+}
+
+.swiper-button-prev::before,
+.swiper-button-next::before {
+ font-family: icon-orange;
+ font-size: 1.875rem;
+ content: "\e93f";
+}
+
+.swiper-button-next::before {
+ content: "\e93e";
+}
+
+.swiper-pagination-bullet,
+.swiper-pagination-bullet-active {
+ width: .625rem;
+ height: .625rem;
+ border: 0;
+}
+
+.swiper-pagination-bullet {
+ opacity: 1;
+}
+
+.swiper-pagination-bullet-active {
+ background: #f16e00;
+}
+
+.swiper-container {
+ width: 100% !important;
+ margin-bottom: 30px;
+ overflow: hidden;
+}
+
+.swiper-wrapper {
+ margin-bottom: 30px;
+}
+
+.swiper-pagination {
+ bottom: 6px;
+}
+
+.swiper-slide .card {
+ border: 0;
+}
+
+.swiper-slide .card-img {
+ padding: 0;
+}
+
+.swiper-slide .card-img img {
+ width: 100%;
+ height: 40vh;
+}
+
+.swiper-slide .card-title {
+ margin: 0;
+ font-weight: 700;
+}
+
+.swiper-slide .card-body {
+ position: absolute;
+ bottom: 20px;
+ right: 40px;
+ background-color: #fff;
+}
+
+.swiper-slide .card-body p {
+ margin: 0;
+}
+
+@media (max-width: 979.98px) {
+ .swiper-button-prev,
+ .swiper-button-next {
+ display: none;
+ }
+ .swiper-container {
+ overflow-x: hidden;
+ overflow-y: visible;
+ /* used for displaying pagination outside of container */
+ }
+ .swiper-slide {
+ width: 80%;
+ }
+ .swiper-slide .card-img img {
+ height: auto;
+ }
+ .swiper-slide .card-body {
+ position: static;
+ }
+ .swiper-container-horizontal > .swiper-pagination-bullets {
+ bottom: 0;
+ }
+ .swiper-pagination-bullet {
+ width: 8px;
+ height: 8px;
+ border: 0;
+ }
+}
+
+div.active:focus {
+ outline: dotted 1px;
+}
+
+a:focus {
+ color: #f16e00;
+ outline: dotted 1px;
+}
+
+.close:hover,
+.close:focus {
+ outline: dotted 1px;
+}
+
+.progress.progress-default[value]::-webkit-progress-value {
+ background-color: #f16e00;
+}
+
+.progress.progress-default[value]::-moz-progress-bar {
+ background-color: #f16e00;
+}
+
+.hero-container .frame {
+ position: absolute;
+ top: 0;
+ right: 0;
+ max-width: 15%;
+ margin: 30px;
+}
+
+.hero-container .caption {
+ margin: 50px 30px;
+}
+
+.hero-container .category {
+ font-size: 1.25rem;
+ color: #f16e00;
+}.svg-arrow-previous::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-next::after {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.stepbar-item::after {
+ -webkit-transform: rotateY(180deg);
+ transform: rotateY(180deg);
+}
+
+.page-item:last-child .page-link::before,
+.page-item:first-child .page-link::before,
+.page-item.presentation + .page-item .page-link::before,
+.swiper-button-prev,
+.swiper-button-next,
+.doc-link::after,
+.breadcrumb-item + .breadcrumb-item::before,
+.o-link-arrow::after,
+.o-link-arrow.back::before {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.alert .alert-icon::after,
+.alert-sm .alert-icon::after {
+ right: 2%;
+}
+
+.o-stepbar .stepbar-item::after,
+.page-item:last-child .page-link::before,
+.o-stepbar .stepbar-item.current::after,
+.o-stepbar .stepbar-item.done::after {
+ right: unset;
+}
+
+.custom-switch.right .custom-control-label::before {
+ right: auto;
+ left: 0;
+}
+
+.custom-switch .custom-control-label::before {
+ background-position: .2rem;
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::before {
+ background-position: 2rem;
+}
+
+.o-link-arrow.back::before {
+ padding: 0 .625rem 0 0;
+}
+
+.popover {
+ right: auto;
+ left: 0;
+}
+/*# sourceMappingURL=boosted-rtl.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted-rtl.css.map b/dashboard/public/css/boosted-rtl.css.map
new file mode 100644
index 00000000..8f1a8267
--- /dev/null
+++ b/dashboard/public/css/boosted-rtl.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["boosted.css","../../scss/boosted.scss","../../scss/_root.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_functions.scss","../../scss/_forms.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_orangeIcons.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss","../../scss/_o-card.scss","../../scss/_o-switches.scss","../../scss/_o-forms.scss","../../scss/_o-bullet_points.scss","../../scss/_o-step_bar.scss","../../scss/_o-link-arrow.scss","../../scss/_o-megamenu.scss","../../scss/_o-navbar.scss","../../scss/_o-tables.scss","../../scss/_o-modal.scss","../../scss/_o-nav.scss","../../scss/_o-nav-local.scss","../../scss/_o-skiplinks.scss","../../scss/_o-footer.scss","../../scss/_o-responsive_table.scss","../../scss/_o-scroll-up.scss","../../scss/_o-dropdown.scss","../../scss/_o-carousel.scss","../../scss/_orange-css.scss","boosted-rtl.css"],"names":[],"mappings":"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yBAAwB;CACzB;;AHvGD;EG8GE,yBAAwB;CACzB;;AAOD;EACE,cAAa;EACb,2BAA0B;CAC3B;;AAMD;EACE,sBAAqB;CACtB;;AAED;EACE,mBAAkB;EAClB,gBAAe;CAChB;;AAED;EACE,cAAa;CACd;;AHpHD;EGyHE,yBAAwB;CACzB;;AIteD;;EAEE,uBHwIc;EGvId,qBH2VmC;EG1VnC,iBH2V+B;EG1V/B,iBH2V+B;EG1V/B,eH2VmC;CG1VpC;;AAED;EFgHM,oBAtCY;CE1E6B;;AAC/C;EF+GM,oBAtCY;CEzE6B;;AAC/C;EF8GM,kBAtCY;CExE6B;;AAC/C;EF6GM,mBAtCY;CEvE6B;;AAC/C;EF4GM,oBAtCY;CEtE6B;;AAC/C;EF2GM,gBAtCY;CErE6B;;ACqD3C;ED1DJ;IFgHM,mBAtCY;GEhEsC;EATxD;IF+GM,oBAtCY;GE/DsC;EATxD;IF8GM,gBAtCY;GE9DsC;EATxD;IF6GM,oBAtCY;GE7DsC;EATxD;IF4GM,oBAtCY;GE5DsC;EATxD;IF2GM,oBAtCY;GE3DsC;CP4YvD;;AOzYD;EF8FM,mBAtCY;EEtDhB,iBHkV+B;CGjVhC;;AAGD;EFwFM,mBAtCY;EEhDhB,iBHqU+B;EGpU/B,iBH4T+B;CG3ThC;;AACD;EFmFM,oBAtCY;EE3ChB,iBHiU+B;EGhU/B,iBHuT+B;CGtThC;;AACD;EF8EM,kBAtCY;EEtChB,iBH6T+B;EG5T/B,iBHkT+B;CGjThC;;AACD;EFyEM,oBAtCY;EEjChB,iBHyT+B;EGxT/B,iBH6S+B;CG5ShC;;AJaD;EILE,oBH8Ec;EG7Ed,uBH6Ec;EG5Ed,UAAS;EACT,2BH3Da;CG4Dd;;AAOD;;EFkDM,oBAtCY;EEThB,iBH8P+B;CG7PhC;;AAED;;EAEE,eH6SgC;EG5ShC,0BH5Ce;CG6ChB;;AAOD;EE1FE,iBAAe;EACf,iBAAgB;CF2FjB;;AAGD;EE/FE,iBAAe;EACf,iBAAgB;CFgGjB;;AACD;EACE,sBAAqB;CAKtB;;AAND;EAII,uBH+RkC;CG9RnC;;AASH;EF5CI,eAAW;EE8Cb,0BAAyB;CAC1B;;AAGD;EACE,uBHqBc;ECjBV,mBAtCY;CEoCjB;;AAED;EACE,eAAc;EFDV,oBAtCY;EEyChB,YHpHa;CGyHd;;AARD;EAMI,sBAAqB;CACtB;;AG/HH;ECIE,gBAAe;EAGf,aAAY;CDLb;;AAID;EACE,kBNylCyC;EMxlCzC,uBNRa;EMSb,uBN0lCsC;EO/lCtC,gBAAe;EAGf,aAAY;CDQb;;AAMD;EAEE,sBAAqB;CACtB;;AAED;EACE,wBAA0B;EAC1B,eAAc;CACf;;AAED;ELkCI,eAAW;EKhCb,YNxBa;CMyBd;;AExCD;EPuEI,iBAAW;EOrEb,YRaa;EQZb,uBAAsB;CAMvB;;AAHC;EACE,eAAc;CACf;;AAIH;EACE,6BR+qC0C;ECrnCxC,iBAAW;EOxDb,YR+qCsC;EQ9qCtC,uBRPa;CQiBd;;AAdD;EASI,WAAU;EPkDV,gBAAW;EOhDX,iBRuT6B;CQrT9B;;ATiNH;ES5ME,eAAc;EPyCZ,iBAAW;EOvCb,YRjBa;CQyBd;;AAXD;EP0CI,mBAAW;EOlCX,eAAc;EACd,mBAAkB;CACnB;;AAIH;EACE,kBRspCuC;EQrpCvC,mBAAkB;CACnB;;AC1CC;ECAA,kBAAkB;EAClB,mBAAiB;EAKb,kBAA0B;EAC1B,mBAAyB;EAQzB,mBVsOK;EUrOL,oBVqOK;EUrNL,iBVwMO;EUtMP,kBAAkB;EAClB,mBAAiB;EDhCnB,YAAW;CACZ;;ALmDC;EKvDF;ICMI,kBAA0B;IAC1B,mBAAyB;GDH5B;Cb8kBF;;AQ3hBG;EKvDF;ICMI,mBAA0B;IAC1B,oBAAyB;GDH5B;CbqlBF;;AQliBG;EKvDF;ICMI,mBAA0B;IAC1B,oBAAyB;GDH5B;Cb4lBF;;AQziBG;EKvDF;ICMI,mBAA0B;IAC1B,oBAAyB;GDH5B;CbmmBF;;AQhjBG;EKvDF;ICMI,mBAA0B;IAC1B,oBAAyB;GDH5B;Cb0mBF;;Ac5lBK;EACE,kBAAkB;EAClB,mBAAiB;CAClB;;ANkCH;EKvDF;ICeI,mBVuOK;IUtOL,oBVsOK;GSlPR;ECcG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;CdymBN;;AQvkBG;EKvDF;ICeI,qBVwOO;IUvOP,sBVuOO;GSnPV;ECcG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;CdonBN;;AQllBG;EKvDF;ICeI,oBVyOM;IUxON,qBVwOM;GSpPT;ECcG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;Cd+nBN;;AQ7lBG;EKvDF;ICeI,oBV0OM;IUzON,qBVyOM;GSrPT;ECcG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;Cd0oBN;;AQxmBG;EKvDF;ICeI,sBV2OS;IU1OT,uBV0OS;GStPZ;ECcG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;CdqpBN;;AQnnBG;EKvDF;ICgCI,iBVyMO;IUvMP,kBAAkB;IAClB,mBAAiB;GD/BpB;Cb8qBF;;AQ3nBG;EKvDF;ICgCI,iBV0MO;IUxMP,kBAAkB;IAClB,mBAAiB;GD/BpB;CbsrBF;;AQnoBG;EKvDF;ICgCI,iBV2MO;IUzMP,kBAAkB;IAClB,mBAAiB;GD/BpB;Cb8rBF;;AQ3oBG;EKvDF;ICgCI,kBV4MQ;IU1MR,kBAAkB;IAClB,mBAAiB;GD/BpB;CbssBF;;AQnpBG;EKvDF;ICgCI,kBV6MS;IU3MT,kBAAkB;IAClB,mBAAiB;GD/BpB;Cb8sBF;;AarsBC;ECbA,kBAAkB;EAClB,mBAAiB;EAKb,kBAA0B;EAC1B,mBAAyB;EAQzB,mBVsOK;EUrOL,oBVqOK;EStOP,YAAW;CACZ;;ALuCC;EK1CF;ICPI,kBAA0B;IAC1B,mBAAyB;GDS5B;CbmtBF;;AQ5qBG;EK1CF;ICPI,mBAA0B;IAC1B,oBAAyB;GDS5B;Cb0tBF;;AQnrBG;EK1CF;ICPI,mBAA0B;IAC1B,oBAAyB;GDS5B;CbiuBF;;AQ1rBG;EK1CF;ICPI,mBAA0B;IAC1B,oBAAyB;GDS5B;CbwuBF;;AQjsBG;EK1CF;ICPI,mBAA0B;IAC1B,oBAAyB;GDS5B;Cb+uBF;;Ac7uBK;EACE,kBAAkB;EAClB,mBAAiB;CAClB;;ANkCH;EK1CF;ICEI,mBVuOK;IUtOL,oBVsOK;GStOR;ECEG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;Cd0vBN;;AQxtBG;EK1CF;ICEI,qBVwOO;IUvOP,sBVuOO;GSvOV;ECEG;IACE,kBAAkB;IAClB,mBAAiB;GAClB;CdqwBN;;AQnuBG;EK1CF;ICEI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ACjB,8BAA6B;EAC7B,8BAA2C;EC0F3C,yBtBgVoC;EC1ThC,gBAtCY;EqBkBhB,kBtBwOgC;EgB3U9B,iBMqGsC;ELvGpC,sIjBwf6I;CqBjdlJ;;AJlCG;EILJ;IJMM,iBAAgB;GIiCrB;CzB8kFA;;AM/mFC;EmBQE,YrBHW;EqBIX,sBAAqB;CnBTD;;AmBNxB;EAoBI,WAAU;EACV,iBrBqa8B;CqBpa/B;;AAtBH;EA2BI,WrBgd2B;CqB9c5B;;AAaH;EACE,sBAAqB;CACtB;;AAID;;EAEE,qBAAoB;CACrB;;AASD;;EC5DE,YtBCa;EoBDX,0BpBoCa;EsBlCf,sBtBkCe;CqB8BhB;;AnBxDC;;;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;;;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;;;;;EAGE,YtB1BW;EsB2BX,uBtBrCW;EsByCX,mBtB/BW;CsB0CZ;;ADOH;;EC5DE,YtBCa;EoBDX,0BpBoCa;EsBlCf,sBtBkCe;CqB6Bd;;AnBvDD;;;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;;;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;;;;;EAGE,YtBpCW;EsBqCX,uBtB3BW;EsB+BX,mBtBzCW;CsBoDZ;;ADcH;;ECnEE,YtBWa;EoBXX,8BCqEiC;ECnEnC,mBtBSa;CqB8Dd;;AnB/DC;;;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;;;EAEE,YtBnBW;EsBoBX,8BD2CsH;EC1CtH,mBtBrBW;CsB0BZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADcH;;ECnEE,YtBWa;EoBXX,uBpBCW;EsBCb,mBtBDa;CqBuEZ;;AnB9DD;;;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBPW;CEYZ;;AoBUD;;;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADqBH;EC1EE,YtBWa;EoBXX,0BpBsCa;EsBpCf,sBtBoCe;CqByChB;;AnBrEC;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADqBH;EC1EE,YtBWa;EoBXX,0BpBsCa;EsBpCf,sBtBoCe;CqBwCd;;AnBpED;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;AD2BH;;EChFE,YtBCa;EoBDX,uBpBWW;EsBTb,mBtBSa;CqB2Ed;;AnB5EC;;;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBGW;CEEZ;;AoBUD;;;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;AD2BH;;EChFE,YtBCa;EoBDX,8BCoFmC;EClFrC,mBtBDa;CqBoFZ;;AnB3ED;;;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;;;EAEE,YtBjBW;EsBkBX,8BD0DwH;ECzDxH,mBtBnBW;CsBwBZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADkCH;ECvFE,YtBCa;EoBDX,0BpBmCa;EsBjCf,sBtBiCe;CqByDhB;;AnBlFC;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADkCH;ECvFE,YtBCa;EoBDX,0BpBmCa;EsBjCf,sBtBiCe;CqBwDd;;AnBjFD;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;EAEE,YtBdW;EsBeX,uBtBlBW;E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4G4F;E6B3G5F,yB7BmE6C;E6BlE7C,yP7BlIuQ;E6BmIvQ,iB7BtH+B;E6BuH/B,kB7BnHgC;E6BoHhC,Y7Btba;E6Bubb,uB7B8E0C;E6B7E1C,uB7B7ba;C6Bidd;;AAjCD;EAkBI,mBAAkB;EAClB,OAAM;EACN,QAAQ;EACR,UAAS;EACT,WAAU;EACV,eAAc;EACd,gB7ByFgH;E6BxFhH,yB7BiD2C;E6BhD3C,kB7BnI8B;E6BoI9B,Y7BtcW;E6BucX,kBAAiB;ETldjB,uBpBIW;E6BgdX,sBAAoB;CAErB;;AASH;EACE,YAAW;EACX,6BAA+F;EAC/F,WAAU;EACV,8BAA6B;EAC7B,yBAAgB;EAAhB,sBAAgB;EAAhB,iBAAgB;CAkIjB;;AAvID;EAQI,cAAa;CAOd;;AAfH;EAY8B,gD7Bhef;C6BgemE;;AAZlF;EAa8B,gD7Bjef;C6BiemE;;AAblF;EAc8B,gD7Blef;C6BkemE;;AAdlF;EAkBI,UAAS;CACV;;AAnBH;EAsBI,Y7B4K6C;E6B3K7C,a7B2K6C;E6B1K7C,qBAAyE;ETvfzE,uBpBWW;E6B8eX,U7B2K0C;EiBpqBxC,6GjBkkB+H;E6BrEjI,yBAAgB;EAAhB,iBAAgB;CAKjB;;AZ7fC;EY0dJ;IZzdM,iBAAgB;GY4fnB;CjC0pHF;;AiC7rHD;ET/dI,0BpBoCa;C6B6dZ;;AAlCL;EAsCI,Y7BqJoC;E6BpJpC,e7BqJqC;E6BpJrC,mBAAkB;EAClB,gB7BoJuC;E6BnJvC,uB7BlgBW;E6BmgBX,0BAAyB;CAG1B;;AA9CH;EAiDI,Y7BiJ6C;E6BhJ7C,a7BgJ6C;EoBjqB7C,uBpBWW;E6BwgBX,U7BiJ0C;EiBpqBxC,6GjBkkB+H;E6B3CjI,sBAAgB;EAAhB,iBAAgB;CAKjB;;AZvhBC;EY0dJ;IZzdM,iBAAgB;GYshBnB;CjC4pHF;;AiCztHD;ET/dI,0BpBoCa;C6BufZ;;AA5DL;EAgEI,Y7B2HoC;E6B1HpC,e7B2HqC;E6B1HrC,mBAAkB;EAClB,gB7B0HuC;E6BzHvC,uB7B5hBW;E6B6hBX,0BAAyB;CAG1B;;AAxEH;EA2EI,Y7BuH6C;E6BtH7C,a7BsH6C;E6BrH7C,cAAa;EAC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rJW;EkCsJX,qBAAoB;EAEpB,aAAY;EACZ,uBlC9JW;EkC+JX,mBlC1JW;CkC2JZ;;AAhHH;EAoHI,+LAAkB;CACnB;;AArHH;EAwHI,+LAAkB;CACnB;;AAzHH;EA4HI,sBAAoB;CACrB;;ACjLD;EACE,oBnCy4BwC;EmCx4BxC,qBnCw4BwC;EmCv4BxC,2BnCo2BwC;EC3uBtC,oBAtCY;EkCjFd,sBnC6Q6B;CmC5Q9B;;ADmLH;;EAII,gBAAe;CAChB;;AC9LD;EACE,oBnC04BwC;EmCz4BxC,qBnCy4BwC;EmCx4BxC,2BnCk2BuC;ECzuBrC,oBAtCY;EkCjFd,sBnC8Q6B;CmC7Q9B;;AD2LH;;EAII,eAAc;CACf;;AEpMH;EACE,sBAAqB;EACrB,4BpCm/ByC;EC33BrC,oBAtCY;EmChFhB,iBpCsU+B;EoCrU/B,eAAc;EACd,mBAAkB;EAClB,oBAAmB;EACnB,yBAAwB;EnBPpB,sIjBwf6I;CoCnelJ;;AnBhBG;EmBNJ;InBOM,iBAAgB;GmBerB;CxCu9KA;;AMl+KC;EkCGI,sBAAqB;ClCAxB;;AkCdH;EAoBI,cAAa;CACd;;AAIH;EACE,mBAAkB;EAClB,UAAS;CACV;;AAMD;EACE,uBpCu9ByC;EoCt9BzC,wBpCs9ByC;CoCp9B1C;;AAOC;ECjDA,YvBoDc;EuBnDd,0BrCwCe;CoCUd;;AlCpCD;EmCVI,YvB+CU;EuB9CV,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCMa;EqCLb,uBrCea;CoCmCZ;;AlCpCD;EmCVI,YrCCS;EqCAT,wBAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,0BrC0Ce;CoCQd;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,0BrCmCe;CoCed;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,uBrCyCY;CoCSX;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCMa;EqCLb,0BrCuCe;CoCWd;;AlCpCD;EmCVI,YrCCS;EqCAT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,uBrCSa;CoCyCZ;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCMa;EqCLb,uBrCea;CoCmCZ;;AlCpCD;EmCVI,YrCCS;EqCAT,wBAAkC;CnCYrC;;AF0wCD;EoCnuCE,oBAAmB;EACnB,qBAAoB;CpCouCrB;;AoCvuCH;EAMM,oBAAmB;CACpB;;AE/DL;EACE,wBAAoD;EACpD,sBtCg5B6C;EsC/4B7C,YtCca;EsCbb,uBtCGa;CsCGd;;AlCkDG;EkC5DJ;IAQI,qBtC04B2C;GsCx4B9C;C1CgmLA;;A0C9lLD;EACE,gBAAgB;EAChB,iBAAe;CAEhB;;ACXD;EACE,mBAAkB;EAClB,2BvCyiCyC;EuCxiCzC,uBvCwIc;EuCvId,4BAA6C;CAY9C;;AAhBD;EAOI,mBAAkB;EAClB,aAAY;CAOb;;AAfH;EAUM,evCqFW;EuCpFX,gBvCoFW;EuCnFX,6BAA4B;EAC5B,uBAAsB;CACvB;;AAKL;EACE,2BvCyhCyC;CuCjhC1C;;AATD;EAGI,cAAa;CAKd;;AARH;EAKM,YvCsEQ;EuCrER,avCqEQ;CuCpET;;AAIL;EACE,sBvCghCyC;CuCxgC1C;;AATD;EAGI,aAAY;CAKb;;AARH;EAKM,YvC6DQ;EuC5DR,avC4DQ;CuC3DT;;AAML;EAEE,eAAc;CACf;;AAGD;EACE,iBvCwR+B;CuCvRhC;;AAOD;EACE,mBAAsD;CAWvD;;AAZD;EAKI,mBAAkB;EAClB,OAAM;EACN,QAAQ;EACR,2BvCy+BuC;EuCx+BvC,uBvCu+BwC;EuCt+BxC,eAAc;CACf;;AASD;EClFA,YxCgBa;EoBXX,0BNgG8D;E0BnGhE,sB1BmGgE;CyBX/D;;ACtFD;EACE,0BAAqC;CACtC;;AAED;EACE,aAA0B;CAC3B;;ADwED;EClFA,YxCMa;EoBDX,wBNgG8D;E0BnGhE,oB1BmGgE;CyBX/D;;ACtFD;EACE,wBAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADwED;EClFA,YxCgBa;EoBXX,0BNgG8D;E0BnGhE,sB1BmGgE;CyBX/D;;ACtFD;EACE,0BAAqC;CACtC;;AAED;EACE,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A;IACE,wBAAmB;IAAnB,oBAAmB;GAiBpB;EAlBD;IAII,kB3C6LyB;I2C5LzB,iBAAgB;GAYjB;EAjBH;IAaM,eAAe;GAGhB;C/Ck4LR;;A+Ct3LD;EAEI,eAAe;EACf,gBAAc;CAMf;;AATH;EAOM,oB3C8J2B;C2C7J5B;;AARL;EAaM,cAAa;CACd;;AAdL;EAmBM,iBAAgB;EAChB,iBAAgB;CACjB;;ACrIH;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAGI,Y5CCS;E4CIX,wB9B2F8D;C8BvE/D;;A1CfD;E0CCQ,Y5CVK;E4CeP,wBAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAGI,Y5CCS;E4CIX,wB9B2F8D;C8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","file":"boosted-rtl.css","sourcesContent":["@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0.625rem 0.625rem 0;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0.3125rem 0.3125rem 0;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0;\n border-bottom: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -2px;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.84375rem;\n padding-left: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.46875rem;\n padding-left: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.9375rem;\n padding-left: 0.9375rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -2px;\n}\n\n.input-group-prepend {\n margin-right: -2px;\n}\n\n.input-group-append {\n margin-left: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-left: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n /* rtl:begin:ignore */\n top: .4rem;\n /* rtl:end:ignore */\n left: .2585rem;\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n /* rtl:end:ignore */\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-left: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n left: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-right: 4.375rem;\n padding-left: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: 0;\n left: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n right: calc(1.875rem + 2px);\n left: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 1.5rem 0.4375rem 0.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-left: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-left: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-left: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.125rem;\n margin-left: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-left: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 .625rem 0 0;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -2.5rem;\n margin-left: -2.5rem;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 2.5rem;\n margin-bottom: 0;\n margin-left: 2.5rem;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n}\n\n.accordion .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-left: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-left: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-left: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem -0.625rem -0.625rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 0.625rem;\n margin-left: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 1.875rem;\n margin-left: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-right: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-left: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: left !important;\n }\n .float-xxl-right {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: left !important;\n }\n .text-xxl-right {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n .o-card-link .card-title {\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: right;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n right: 0;\n left: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: flex;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n}\n\n.form-group.row.top {\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n order: 1;\n}\n\n.form-group.row.top .form-control {\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-left: 0;\n color: #f16e00;\n text-align: left;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-left: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: left;\n padding: 0.625rem 1.25rem;\n padding-left: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-left: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 0.625rem 0.3125rem 2rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n right: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-left: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0.625rem 0 0;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-left: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-left: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-right: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-right: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-left: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n transform: rotate(180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: left;\n}\n\n.modal .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-right: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-left: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n align-self: center;\n margin-right: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-left: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-left: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: 0;\n }\n}\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: 700;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-left: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: flex;\n}\n\n.o-nav-local ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-left: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-left: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: left;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 #ccc;\n border: 2px solid #000;\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: left;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-right: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n right: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n align-items: center;\n justify-content: center;\n float: right;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n /* rtl:ignore */\n transform: rotate(90deg);\n /* rtl:ignore */\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n right: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n right: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n right: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n\n/*# sourceMappingURL=boosted.css.map */","/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n\n// boosted mod\n@import \"o-card\";\n@import \"o-switches\";\n@import \"o-forms\";\n@import \"o-bullet_points\";\n@import \"o-step_bar\";\n@import \"o-link-arrow\";\n@import \"o-megamenu\";\n@import \"o-navbar\";\n@import \"o-tables\";\n@import \"o-modal\";\n@import \"o-nav\";\n@import \"o-nav-local\";\n@import \"o-skiplinks\";\n@import \"o-footer\";\n@import \"o-responsive_table\";\n@import \"o-scroll-up\";\n@import \"o-dropdown\";\n@import \"o-carousel\";\n@import \"orange-css\";\n// end mod\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// Boosted Mod\np a {\n text-decoration: underline;\n\n @include hover-focus {\n text-decoration: underline;\n }\n}\n// End mod\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n// Boosted mod\n// reduce the size of titles for mobile display\n@include media-breakpoint-down(sm) {\n h1, .h1 { @include font-size($h1-font-size-mobile); }\n h2, .h2 { @include font-size($h2-font-size-mobile); }\n h3, .h3 { @include font-size($h3-font-size-mobile); }\n h4, .h4 { @include font-size($h4-font-size-mobile); }\n h5, .h5 { @include font-size($h5-font-size-mobile); }\n h6, .h6 { @include font-size($h6-font-size-mobile); }\n}\n// end mod\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n width: 100%; // Boosted mod\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n width: auto; // Boosted mod\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n@mixin make-container($gutters: $grid-gutter-widths) {\n margin-right: auto;\n margin-left: auto;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n // width: 100%; //Boosted mod our fluid is not 100% width\n }\n }\n\n // boosted mod\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n margin-right: $container-margin;\n margin-left: $container-margin;\n // reset margin for second level container\n .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n }\n }\n // end mod\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n // boosted mod\n margin-right: auto;\n margin-left: auto;\n // end mod\n }\n }\n}\n\n@mixin make-gutters($gutters: $grid-gutter-widths) {\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n }\n}\n\n@mixin make-row($gutters: $grid-gutter-widths) {\n display: flex;\n flex-wrap: wrap;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n }\n }\n}\n\n@mixin make-col-ready($gutters: $grid-gutter-widths) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n }\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n\n@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n @include make-gutters($gutters);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, 0)); // Boosted mod let color as is\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n // Boosted mod adapt color with background\n @if ($state == \"secondary\" or $state == \"danger\" or $state == \"dark\") {\n color: $white;\n }\n // end mod\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n@import \"node_modules/sass-math-pow/sass/math-pow\";\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n @if ($color == #F16E00) {\n @return #fff;\n }\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n // get the relative lum for each color\n $luminositecouleur: relativelum($r / 255, $g / 255, $b / 255);\n $luminositeblanc: relativelum(1, 1, 1);\n // if luminosite doesn't fit with white color return black\n @if ((($luminositeblanc + .05) / ($luminositecouleur + .05)) < $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// apply Wcag contrast algo : http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n// Convert from HTMLCS JS algo\n@function relativelum($r, $g, $b) {\n @return ((transform($r) * .2126) + (transform($g) * .7152) + (transform($b) * .0722));\n}\n\n@function transform($x) {\n @if ($x <= .03928) {\n @return $x / 12.92;\n } @else {\n @return poly-pow((($x + .055) / 1.055), 2.4);\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n@function alert-logo-size($key: \"md\") {\n @return map-get($alert-logo-sizes, $key);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Boosted mod\n// Orange brand, labels are always bold\nlabel {\n font-weight: $font-weight-bold;\n &.disabled {\n color: $custom-control-label-disabled-color;\n }\n &.is-required::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n}\n// end mod\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n color: #666; // boosted mod\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n &[size],\n &[multiple] {\n height: auto;\n }\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$form-grid-gutter-width / 2;\n margin-left: -$form-grid-gutter-width / 2;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: $form-grid-gutter-width / 2;\n padding-left: $form-grid-gutter-width / 2;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// stylelint-disable property-blacklist\n@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @if $enable-prefers-reduced-motion-media-query {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n // Boosted mod, remove box shadow!\n // box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-weight: $font-weight-bold; // Boosted Mod\n // color: $color; // Boosted Mod\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n .form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n // Boosted Mod\n // @if $enable-validation-icons {\n // padding-right: $input-height-inner;\n // background-image: $icon;\n // background-repeat: no-repeat;\n // background-position: center right $input-height-inner-quarter;\n // background-size: $input-height-inner-half $input-height-inner-half;\n // }\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n // Boosted Mod\n ~ .#{$state}-feedback {\n @if $enable-validation-icons {\n @if $state == \"valid\" {\n @include svg-success();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n } @else {\n @include svg-error();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n }\n position: relative;\n display: block;\n padding-left: 1.625rem;\n }\n\n ~ .#{$state}-tooltip {\n display: block;\n }\n // End Mod\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right;\n background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\n }\n\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25); // Boosted mod, remove box shadow!\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n // Boosted mod, remove box shadow!\n // ~ .custom-control-label::before {\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n // }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n }\n }\n }\n}\n","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n color: $body-color;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n @include hover {\n color: $body-color;\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Boosted mod\na.btn {\n text-decoration: none; // Boosted mod remove underline for a.btn\n}\n// End mod\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n// boosted mod custom buttons\n// @mixin button-variant($background, $border, $hover-background, $hover-border, $active-background, $active-border, $disabled-background, $disabled-border, $disabled-color, $color) {\n.btn-primary,\n.btn-warning {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $black, $black, $white, $black, $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $white, $white, $black, $white, $gray-700, $gray-700, $black, $white);\n }\n}\n.btn-secondary,\n.btn-light {\n @include button-variant(transparent, $black, $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-500, $gray-500, $black);\n &.btn-inverse {\n @include button-variant($white, $white, $black, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-success {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $black);\n &.btn-inverse {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-info,\n.btn-dark {\n @include button-variant($black, $black, $white, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(transparent, $white, $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-700, $gray-700, $white);\n }\n}\n.btn-danger {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black);\n }\n}\n\n// Boosted mod custom outline buttons values\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @if $color == \"light\" {\n @include button-outline-variant($value, $gray-900);\n } @else {\n @if $color == \"warning\" {\n @include button-outline-variant(theme-color(\"primary\"), $black);\n } @else {\n @if $color == \"info\" {\n @include button-outline-variant(theme-color(\"secondary\"), $black);\n } @else {\n @include button-outline-variant($value, $black);\n }\n }\n }\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n // font-weight: $font-weight-normal; // Boosted mod font-weight stay bold\n color: $link-color;\n\n // Boosted mod\n &.btn-inverse {\n color: #fff;\n }\n // end mod\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-xlg {\n @include button-size($btn-padding-y-xlg, $btn-padding-x-xlg, $font-size-xlg, $btn-line-height-xlg, $btn-border-radius-xlg);\n}\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n// Social Media\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n// boosted mod add default color, disable-background and disabled-border and disabled-color option\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%), $disabled-background: $background, $disabled-border: border, $disabled-color: color-yiq($background), $color: color-yiq($background)) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover-focus { // Boosted mod replace hover by hover focus cause we remove box-shadow\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: $disabled-color; // Boosted mod\n background-color: $disabled-background; // Boosted var disabled\n border-color: $disabled-border; // Boosted var disabled\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover-focus { //Boosted mod focus has same as hover\n color: #fff; // Boosted mod\n background-color: #000; // Boosted mod\n border-color: #000 // Boosted mod\n }\n\n // &:focus,\n // &.focus {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n // }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: #000; // Boosted mod\n background-color: #f16e00; // Boosted mod\n border-color: #f16e00; // Boosted mod\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-control-plaintext,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .custom-select:focus,\n > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n }\n\n // Bring the custom file input above the label\n > .custom-file .custom-file-input:focus {\n z-index: 4;\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n// Boosted mod\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n// End mod\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n @include font-size($input-font-size); // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: $font-size-base * $line-height-base;\n padding-left: $custom-control-gutter + $custom-control-indicator-size;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n // Boosted mod our custom control have a border\n border-color: $custom-control-indicator-checked-border-color;\n // end mod\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n // Boosted mod move gradient to global settings, to change the color for disabled checked elements\n &::before {\n @include gradient-bg($custom-control-indicator-checked-bg);\n }\n // end mod\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n outline: dotted 1px $black; // Boosted mod no box-shadow, replaced by outline\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n }\n\n // &:focus:not(:checked) ~ .custom-control-label::before {\n // border-color: $custom-control-indicator-focus-border-color;\n // }\n\n &:not(:disabled):active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n border-color: $custom-control-indicator-active-border-color;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n // Boosted mod\n // our custom control have a border\n border-color: $custom-control-indicator-disabled-bg;\n // end mod\n }\n }\n // Boosted mod disable bg only for checked elements\n &:checked ~ .custom-control-label {\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n //position: relative; // boosted mod checkbox in table are misaligned\n margin-bottom: 0;\n vertical-align: top;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background-color: $custom-control-indicator-bg;\n border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n // Boosted Mod\n .custom-control-input:not(:disabled):checked ~ .custom-control-label {\n &::before {\n border: 2px solid $primary;\n }\n }\n // End Mod\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n //Boosted mod\n\n /* rtl:begin:ignore */\n top: .4rem;\n\n /* rtl:end:ignore */\n left: .2585rem;\n\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n\n /* rtl:end:ignore */\n //End mod\n }\n }\n\n // Boosted mod\n .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: $black; // Boosted mod no box-shadow, replaced by outline\n }\n //end mod\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n border-color: $custom-checkbox-indicator-indeterminate-border-color;\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n //Accessiblity issue DO NOT remove\n //boosted mod\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(.5) translateY(-.5rem);\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // &:indeterminate ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n //}\n // end mod\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n // stylelint-disable-next-line property-blacklist\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::before {\n //boosted mod\n background-color: $white;\n border-color: $white;\n //end mod\n }\n\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border: 6px solid $primary;\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n //end mod\n }\n }\n\n .custom-control-input:disabled:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border-color: $custom-control-indicator-disabled-bg;\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // }\n // end mod\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n padding-left: $custom-switch-width + $custom-control-gutter;\n\n .custom-control-input {\n @include focus {\n ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n }\n }\n }\n\n .custom-control-label {\n padding-top: .3125rem; // Boosted mod vertical align fix for label\n &::before {\n left: 0; // boosted mod\n width: $custom-switch-width;\n height: $custom-switch-height; // boosted mod\n pointer-events: all;\n background-color: $custom-control-indicator-border-color; // boosted mod\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\"); // boosted mod\n background-repeat: no-repeat; // boosted mod\n background-position: 1.975rem; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n }\n\n &::after {\n top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width}); // boosted mod\n left: $custom-control-indicator-border-width; // boosted mod\n width: $custom-switch-indicator-width; // boosted mod\n height: $custom-switch-indicator-height; // boosted mod\n background-color: $custom-switch-indicator-bg-color; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n @include transition(transform .15s ease-in-out, $custom-forms-transition);\n }\n }\n // boosted mod create a right aligned switch\n &.right {\n padding-right: $custom-switch-width + $custom-control-gutter;\n padding-left: 0;\n .custom-control-label {\n &::before {\n right: 0;\n left: auto;\n }\n\n &::after {\n right: calc(#{($custom-switch-width / 2)} + #{$custom-control-indicator-border-width});\n left: auto;\n }\n }\n }\n // end mod\n .custom-control-input:checked ~ .custom-control-label {\n // boosted mod\n &::before {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n background-repeat: no-repeat;\n background-position: .25rem;\n }\n // end mod\n &::after {\n background-color: $custom-control-indicator-bg;\n transform: translateX($custom-switch-width / 2); // boosted mod change the indicator size\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n ~ .custom-control-label::before {\n background-color: $custom-control-indicator-disabled-bg; // boosted mod\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n font-family: $custom-select-font-family;\n @include font-size($custom-select-font-size);\n font-weight: $custom-select-font-weight;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-background;\n background-color: $custom-select-bg;\n border: $custom-select-border-width solid $custom-select-border-color;\n @include border-radius($custom-select-border-radius, 0);\n // @include box-shadow($custom-select-box-shadow); //boosted mod no box-shadow\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\n } @else {\n box-shadow: $custom-select-focus-box-shadow;\n }\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n display: none;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y-sm;\n padding-bottom: $custom-select-padding-y-sm;\n padding-left: $custom-select-padding-x-sm;\n @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y-lg;\n padding-bottom: $custom-select-padding-y-lg;\n padding-left: $custom-select-padding-x-lg;\n @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n }\n\n &:disabled ~ .custom-file-label {\n background-color: $custom-file-disabled-bg;\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n\n ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n font-family: $custom-file-font-family;\n font-weight: $custom-file-font-weight;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: inherit;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: 0; // Edge specific\n margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: $custom-range-thumb-height / 2;\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &:disabled {\n &::-webkit-slider-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: default;\n }\n\n &::-moz-range-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-moz-range-track {\n cursor: default;\n }\n\n &::-ms-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n @include transition($custom-forms-transition);\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n // Boosted mod\n font-weight: $font-weight-bold;\n // end mod\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n // Boosted mod\n // remove border from nav-link padding in tabs\n padding: $nav-link-padding-y calc(#{$nav-link-padding-x} - #{$nav-tabs-border-width});\n line-height: 1rem;\n // end mod\n border: $nav-tabs-border-width solid transparent;\n\n // Boosted mod\n // Border bottom width to 0 for display\n border-bottom-width: 0;\n // end mod\n\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n color: $nav-tabs-link-hover-color; // boosted mod\n background-color: $nav-tabs-link-hover-bg; // boosted mod\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n font-weight: $font-weight-bold; // Boosted mod\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1; // booosted mod\n align-items: center;\n justify-content: space-between;\n padding-right: 0; // boosted mod\n padding-left: 0; // boosted mod\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end; // boosted mod\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin: .625rem .3125rem; // boosted mod\n @include font-size($navbar-brand-font-size);\n font-weight: $font-weight-bold; // boosted mod\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Boosted mod\n + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n }\n\n @include focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n }\n\n img {\n flex-wrap: wrap;\n width: $navbar-brand-logo-height;\n height: $navbar-brand-logo-height;\n margin-top: 0;\n margin-bottom: .25rem;\n }\n // end mod\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-top: auto; // boosted mod\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n //Boosted mod\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n\n &.active::before {\n display: none;\n }\n\n &.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n }\n\n &[class^=\"svg-\"] {\n margin: .625rem;\n }\n\n &[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: $font-size-base;\n font-weight: $font-weight-normal;\n color: #fff;\n content: \"\\e93e\";\n }\n\n @include focus {\n outline-offset: .625rem;\n }\n // end mod\n }\n\n .dropdown-menu {\n position: static;\n top: 2rem; // boosted mod\n float: none;\n }\n\n // boosted mod\n .nav-item {\n margin-left: 0;\n font-size: $h5-font-size;\n border-top: 1px solid $gray-900;\n }\n\n .dropdown {\n padding: 0;\n\n .dropdown-toggle,\n .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n }\n\n &.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n }\n\n .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid $gray-900;\n\n @include focus {\n color: $primary;\n }\n }\n }\n // end mod\n}\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n // align-items: center; // boosted mod\n align-self: flex-end; // boosted mod\n // Boosted mod\n .navbar-nav {\n align-items: stretch;\n }\n // end mod\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n margin: ($spacer / 4) 0; // boosted mod\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n // Boosted mod\n background-color: #fff;\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-hover-bg;\n }\n // end mod\n }\n // Boosted mod\n &:active {\n background-color: theme-color(\"primary\");\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n }\n\n &:focus {\n outline: 0;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .navbar-toggler elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n height: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n // Boosted mod\n // > .container,\n // > .container-fluid {\n // padding-right: 0;\n // padding-left: 0;\n // }\n // boosted mod\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: $navbar-expanded-padding-y $navbar-expanded-padding-x 1.3125rem; // boosted mod\n\n // Boosted mod\n .navbar-brand {\n margin: 0 .625rem 0 0;\n\n img {\n width: $navbar-brand-logo-expanded-height;\n height: $navbar-brand-logo-expanded-height;\n }\n }\n\n &.minimized {\n padding-top: $navbar-expanded-minimized-padding-y;\n padding-bottom: 1rem;\n\n .navbar-brand {\n img {\n width: $navbar-brand-logo-minimized-height;\n height: $navbar-brand-logo-minimized-height;\n }\n }\n }\n // end mod\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n // Boosted mod\n .dropdown-item {\n color: $black;\n background-color: $white;\n border: 0;\n\n &.active,\n &:hover {\n color: $white;\n background-color: $black;\n }\n }\n\n .nav-item {\n font-size: $font-size-base;\n border: 0;\n\n &.dropdown {\n align-self: flex-end;\n }\n }\n // end mod\n\n .nav-link {\n padding-top: 0; // boosted mod\n padding-right: $navbar-nav-link-padding-x;\n padding-bottom: 0; // boosted mod\n padding-left: $navbar-nav-link-padding-x;\n margin-left: 1.25rem; // boosted mod\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n padding-right: $grid-gutter-width / 2; // boosted mod\n padding-left: $grid-gutter-width / 2; // boosted mod\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n @include hover-focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n @include hover-focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-spacer-y / 2;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n font-weight: $font-weight-bold; // boosted mod\n color: $card-cap-color;\n background-color: $black; // boosted mod\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-spacer-x / 2;\n margin-bottom: -$card-spacer-y;\n margin-left: -$card-spacer-x / 2;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -$card-spacer-x / 2;\n margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n /* boosted mod */\n\n .card {\n margin-bottom: 0;\n border: 0;\n // border 1px for first child only\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n\n .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n\n &,\n h5 {\n margin: 0;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n button,\n a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n\n &::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &[aria-expanded=\"true\"]::after { // stylelint-disable-line selector-no-qualifying-type\n transform: rotate(180deg);\n }\n }\n }\n\n .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n }\n}\n// For mobile display emphase the border\n@include media-breakpoint-down(sm) {\n .accordion .card {\n // border 1px for first child only\n border-top-width: 2px;\n border-bottom-width: 2px;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n // boosted mod\n // margin-bottom: $breadcrumb-margin-bottom;\n font-size: $breadcrumb-font-size;\n font-weight: $font-weight-bold;\n line-height: $breadcrumb-line-height;\n // end mod\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n padding-left: $breadcrumb-item-padding;\n // boosted mod\n font-family: $breadcrumb-font-family;\n font-size: $breadcrumb-divider-font-size;\n line-height: 1;\n // end mod\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n// stylelint-disable selector-max-class\n\n.page-link {\n position: relative;\n display: block;\n // Boosted mod\n min-width: $pagination-min-width;\n min-height: $pagination-min-width;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: 0;\n font-weight: $font-weight-bold;\n // End mod\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover,\n &:focus {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border; // Boosted mod\n\n // Boosted mod\n span {\n color: $pagination-color;\n }\n // end mod\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n\n // Boosted mod\n span {\n color: $pagination-bg;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .page-link elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n.page-item {\n // Boosted mod\n &.presentation {\n padding: .625rem 0;\n font-weight: $font-weight-bold;\n }\n &.presentation + .page-item,\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-prev};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-prev-active};\n }\n }\n &.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n }\n }\n }\n\n &.presentation + .page-item,\n &:first-child,\n &:last-child {\n .page-link {\n @include hover-focus {\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n &:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n }\n }\n\n // End mod\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n // Boosted mod\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-next};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-next-active};\n }\n }\n &.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n }\n // End mod\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n .page-link:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n\n // Boosted mod\n &.active:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-active};\n }\n\n &.active:last-child .page-link::before {\n background-image: #{$pagination-icon-next-active};\n }\n // end mod\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n\n // Boosted mod\n &.disabled:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-disabled};\n }\n\n &.disabled:last-child .page-link::before {\n background-image: #{$pagination-icon-next-disabled};\n }\n\n + .page-item {\n margin-left: .625rem;\n }\n // End mod\n}\n\n//\n// Sizing\n//\n// Boosted mod add a min size param\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg, $pagination-min-width-lg);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: 1.03125rem;\n }\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm, $pagination-min-width-sm);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: .53125rem;\n }\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius, $pagination-min-width) {\n .page-link {\n min-width: $pagination-min-width; // Boosted mod\n min-height: $pagination-min-width; // Boosted mod\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include transition($badge-transition);\n\n @at-root a#{&} {\n @include hover-focus {\n text-decoration: none;\n }\n }\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n\n// Boosted mod\n.badge[href] {\n @include focus {\n outline-color: #fff;\n outline-offset: -1px;\n\n &.badge-light {\n outline-color: #000;\n }\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n// stylelint-disable declaration-no-important\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n .alert-icon {\n position: absolute;\n top: .625rem;\n &::after {\n width: alert-logo-size(\"md\");\n height: alert-logo-size(\"md\");\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n}\n\n// boosted mod\n.alert-sm {\n padding: $alert-padding-y-sm $alert-padding-x-sm;\n .alert-icon {\n top: .4375rem;\n &::after {\n width: alert-logo-size(\"sm\");\n height: alert-logo-size(\"sm\");\n }\n }\n}\n\n.alert-lg {\n padding: $alert-padding-y-lg $alert-padding-x-lg;\n .alert-icon {\n top: .625rem;\n &::after {\n width: alert-logo-size(\"lg\");\n height: alert-logo-size(\"lg\");\n }\n }\n}\n//end mode\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $close-font-size + $alert-padding-x * 2;\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n line-height: $alert-padding-y; // boosted mod\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n // Boosted mod adapt color with background, and keep initial brand color value for background\n @if ($color == \"secondary\" or $color == \"danger\" or $color == \"dark\") {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $white);\n } @else {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $black);\n }\n // end mod\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n// BOOSTED MOD progress is half height on mobile\n@include media-breakpoint-down(md) {\n .progress {\n width: 100%;\n height: ($progress-height / 2);\n line-height: ($progress-height / 2);\n }\n .progress-bar {\n font-size: $font-size-sm;\n line-height: ($progress-height / 2);\n }\n}\n// end mod\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n color: $list-group-color;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n .list-group-item {\n margin-right: -$list-group-border-width;\n margin-bottom: 0;\n\n &:first-child {\n @include border-left-radius($list-group-border-radius);\n @include border-top-right-radius(0);\n }\n\n &:last-child {\n margin-right: 0;\n @include border-right-radius($list-group-border-radius);\n @include border-bottom-left-radius(0);\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:last-child {\n margin-bottom: -$list-group-border-width;\n }\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, 0), $black); // boosted mod\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: 1; // boosted mod\n\n // Override <a>'s hover style\n @include hover {\n color: $close-color;\n text-decoration: none;\n }\n\n &:not(:disabled):not(.disabled) {\n @include hover-focus {\n opacity: 1; // boosted mod\n }\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n pointer-events: none;\n}\n",".toast {\n max-width: $toast-max-width;\n overflow: hidden; // cheap rounded corners on nested items\n @include font-size($toast-font-size);\n color: $toast-color;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n backdrop-filter: blur(10px);\n opacity: 0;\n @include border-radius($toast-border-radius);\n\n &:not(:last-child) {\n margin-bottom: $toast-padding-x;\n }\n\n &.showing {\n opacity: 1;\n }\n\n &.show {\n display: block;\n opacity: 1;\n }\n\n &.hide {\n display: none;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n // Kill the scroll on the body\n overflow: hidden;\n\n .modal {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n}\n\n.modal-dialog-scrollable {\n display: flex; // IE10/11\n max-height: calc(100% - #{$modal-dialog-margin * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\n overflow: hidden;\n }\n\n .modal-header,\n .modal-footer {\n flex-shrink: 0;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - #{$modal-dialog-margin * 2});\n\n // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n &::before {\n display: block; // IE10\n height: calc(100vh - #{$modal-dialog-margin * 2});\n content: \"\";\n }\n\n // Ensure `.modal-body` shows scrollbar (IE10/11)\n &.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n\n .modal-content {\n max-height: none;\n }\n\n &::before {\n content: none;\n }\n }\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n width: 100vw;\n height: 100vh;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-border-radius);\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n &::before {\n height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // boosted mod\n font-weight: $tooltip-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // boosted mod\n font-weight: $popover-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n > .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n > .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n > .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width / 2;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n > .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n @include transition(0s $carousel-transition-duration opacity);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 2px dotted $input-focus-border-color; //boosted mod\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: no-repeat 50% / 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: .5;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: 1;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) / 2;\n bottom: 20px;\n left: (100% - $carousel-caption-width) / 2;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n background-color: currentColor;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable property-blacklist, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n border-radius: $border-radius !important;\n}\n\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n &::before {\n padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { float: left !important; }\n .float#{$infix}-right { float: right !important; }\n .float#{$infix}-none { float: none !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !important; }\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n // Just in case `pointer-events: none` is set on a parent\n pointer-events: auto;\n content: \"\";\n // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n background-color: rgba(0, 0, 0, 0);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-wrap { white-space: normal !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-weight-bolder { font-weight: $font-weight-bolder !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n word-break: break-word !important; // IE & < Edge 18\n overflow-wrap: break-word !important;\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n // boosted mod try to fix print errors\n // https://github.com/twbs/bootstrap/issues/26781\n .row,\n .form-row {\n display: block !important;\n }\n }\n}\n","//\n// Cards\n//\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link {\n .card-title {\n align-self: center;\n width: 100%; // IE fix\n margin: auto 0;\n font-weight: $font-weight-bold;\n word-break: normal;\n }\n\n .card-img {\n padding: 0;\n text-align: center;\n\n img {\n width: 100%;\n height: auto;\n }\n }\n\n .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n }\n}\n\n@include media-breakpoint-up(xs) {\n .card-deck {\n margin: 0;\n }\n}\n\n@include media-breakpoint-down(xs) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n\n .card-deck {\n flex-direction: column;\n }\n\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n\n .o-card-link {\n .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n\n img {\n width: auto;\n height: 3.75rem;\n }\n }\n\n .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n\n .card-title {\n align-self: flex-start;\n margin: 0;\n\n &::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n }\n }\n}\n\n@include media-breakpoint-only(sm) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n","// Orange switches\n//\n//\n// stylelint-disable selector-max-class\n// stylelint-disable property-blacklist\n\n.o-switch {\n .toggle,\n .toggle::before,\n .toggle .on,\n .toggle .off {\n transition: .4s;\n }\n\n .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: $gray-700;\n border: 2px solid $gray-700;\n\n &.toggle-rounded,\n &.toggle-rounded::before {\n border-radius: 1.625rem;\n }\n\n .on,\n .off {\n display: none;\n font-weight: $font-weight-bold;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n }\n\n .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n }\n\n .off {\n display: block;\n text-align: right;\n opacity: 1;\n\n &.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n }\n }\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n }\n }\n}\n\n.o-switch .checkbox {\n @include focus {\n + .toggle::before {\n outline: 1px dotted #fff;\n }\n }\n\n &:checked {\n + .toggle {\n background: theme-color(\"primary\");\n border-color: theme-color(\"primary\");\n\n .on {\n display: block;\n opacity: 1;\n }\n .off {\n display: none;\n opacity: 0;\n }\n\n &::before {\n right: 0;\n left: auto;\n }\n }\n }\n\n &.success:checked {\n + .toggle {\n background: theme-color(\"success\");\n border-color: theme-color(\"success\");\n\n .on {\n color: #000;\n }\n\n .on.icon-checkbox-tick {\n color: #fff;\n }\n }\n }\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n\n &.toggle-rounded {\n padding: 0 .875rem;\n }\n}\n\n// 3 way toggles\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n\n .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n\n &:first-child {\n margin-left: -2px;\n }\n\n &:last-child {\n margin-right: -2px;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n\n &.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n }\n\n &:active {\n border-color: theme-color(\"primary\");\n }\n\n @include hover {\n &:not(:active) {\n color: theme-color(\"primary\");\n background-color: transparent;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n }\n }\n\n &.no-outline {\n border-color: transparent;\n\n .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n\n &:first-child {\n border-left-color: transparent;\n }\n\n &:last-child {\n border-right-color: transparent;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n\n @include hover {\n &:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n }\n }\n }\n}\n","//\n// Orange forms\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n\n.form-group {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n width: auto;\n }\n\n .invalid-feedback {\n margin-top: .8125rem;\n font-weight: $font-weight-bold;\n }\n\n &.top {\n display: flex;\n flex-direction: column;\n\n .col-form-label {\n margin-bottom: 0;\n }\n\n .form-control {\n order: 2;\n }\n .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n }\n }\n\n &.right {\n display: flex;\n flex-flow: row wrap;\n\n label,\n .col-form-label {\n min-width: 100%;\n }\n\n .form-control-message,\n .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n }\n }\n\n &.row {\n &.top {\n flex-direction: row;\n\n label,\n .col-form-label {\n order: 1;\n }\n\n .form-control {\n order: 2;\n margin-top: 0;\n }\n\n .invalid-feedback {\n order: 0;\n }\n }\n\n &.right {\n label,\n .col-form-label {\n min-width: auto;\n }\n\n .invalid-feedback {\n align-self: center;\n margin-top: 0;\n }\n }\n }\n\n &.is-required label::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n\n // browser reset\n .form-control:invalid {\n outline: none;\n box-shadow: none;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n\n &.form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n }\n\n &.form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n }\n }\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n ~ .invalid-feedback {\n top: ($line-height-base + .5); // Height of the `label` and its margin\n }\n}\n","// Bullet point\n//\n//\n\n.o-square-list {\n padding-left: 0;\n color: theme-color(\"primary\");\n text-align: left;\n\n &,\n ul * {\n list-style-type: none;\n }\n\n li {\n color: #000;\n\n &::before {\n margin-right: 1rem;\n font-size: $font-size-sm;\n line-height: 1.25rem;\n color: theme-color(\"primary\");\n vertical-align: text-top;\n content: \"\\25A0\";\n }\n\n span {\n display: inline-block;\n margin-bottom: .625rem;\n }\n\n > ul {\n padding-left: 1rem;\n }\n }\n\n ul > li::before {\n color: $gray-600;\n }\n\n ul ul > li::before { // stylelint-disable-line selector-max-type\n color: $gray-500;\n }\n}\n","//\n// Orange stepbar\n//\n// stylelint-disable selector-max-class\n\n// url encoded colors\n$arrow-black: \"000000\" !default;\n$arrow-gray: \"dddddd\" !default;\n$arrow-orange: \"f16e00\" !default;\n\n// generate url encoded svg with color\n@function arrow-svg($color) {\n @return \"%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23#{$color}%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\";\n}\n\n@mixin stepbar-arrow($color) {\n &::after {\n position: absolute;\n top: 0;\n right: -$o-stepbar-arrow-width;\n z-index: 500;\n display: block;\n width: $o-stepbar-arrow-width;\n height: $o-stepbar-height;\n content: \"\";\n $arrow-svg: arrow-svg($color);\n background-image: url(\"data:image/svg+xml,#{$arrow-svg}\");\n background-size: $o-stepbar-arrow-width $o-stepbar-height;\n }\n}\n\n.o-stepbar {\n &,\n ol,\n ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n }\n\n // one item\n .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n }\n\n // two items\n .stepbar-item:first-child:nth-last-child(2),\n .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n }\n\n // four items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n }\n\n // five items\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n\n .stepbar-item {\n @include stepbar-arrow($arrow-gray);\n position: relative;\n float: left;\n padding: ($spacer / 2) $spacer;\n padding-left: 2rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: $line-height-base;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: $gray-400;\n\n &:first-child {\n padding-left: $spacer;\n }\n\n &:last-child {\n &::after {\n display: none;\n }\n }\n\n &.done {\n @include stepbar-arrow($arrow-black);\n background-color: #000;\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n &.current {\n @include stepbar-arrow($arrow-orange);\n background-color: theme-color(\"primary\");\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n .stepbar-link {\n text-decoration: none;\n\n .step-number::after {\n content: \".\";\n }\n }\n }\n}\n\n// For mobile display in any case, reduce the padding and the height\n@include media-breakpoint-down(xs) {\n .o-stepbar {\n .stepbar-item {\n padding: $o-stepbar-mobile-padding-vertical ($spacer / 2) $o-stepbar-mobile-padding-vertical ($spacer + $o-stepbar-mobile-arrow-width);\n line-height: $input-btn-line-height;\n }\n\n .stepbar-item::after,\n .stepbar-item.done::after,\n .stepbar-item.current::after,\n .stepbar-item.next::after {\n right: -($o-stepbar-mobile-arrow-width - .0625); // remove 1px for mobile display error\n width: $o-stepbar-mobile-arrow-width;\n height: $o-stepbar-mobile-arrow-height;\n background-size: cover;\n }\n\n &.xs-numbers {\n .step-number::after {\n display: none;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 60%;\n }\n }\n\n // four and five items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 40%;\n }\n }\n\n .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: $o-stepbar-mobile-arrow-width;\n\n &:first-child {\n padding-left: 0;\n }\n\n &.current {\n width: 60%;\n }\n\n &.current .step-number {\n display: none;\n }\n\n &:not(.current) .step-title {\n display: none;\n }\n }\n }\n\n &.xs-labels {\n .step-number {\n display: none;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n//\n// o-link-arrow\n// --------------------------------------------------\n\n.o-link-arrow {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n text-decoration: none;\n\n &::after {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93e\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::after {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n // previous link\n &.back {\n &::after {\n padding: 0;\n content: \"\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &::before {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal $o-link-arrow-separator-padding-vertical 0;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93f\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::before {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n }\n}\n","// stylelint-disable property-blacklist\n//\n// Mega menu\n//\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n","// Orange navbar\n//\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n// stylelint-disable selector-max-compound-selectors\n// stylelint-disable selector-max-combinators\n// stylelint-disable property-blacklist\n\n.navbar {\n .nav-link.icon {\n margin-top: 0;\n\n span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n }\n }\n\n .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n }\n}\n\n.navbar.supra {\n @include media-breakpoint-down(xs) {\n display: none;\n }\n\n height: $navbar-supra-height; // IE flex support\n min-height: $navbar-supra-height;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid $gray-900;\n\n > .container,\n > .container .navbar-nav {\n align-items: center;\n }\n\n .navbar-brand {\n display: none;\n }\n\n .navbar-nav {\n margin: 0;\n\n > .nav-link:first-child,\n .nav-item:first-child .nav-link {\n margin-left: 0;\n }\n }\n\n .nav-link,\n .dropdown-toggle {\n @include focus {\n outline-offset: .5rem;\n }\n\n font-size: $font-size-sm;\n line-height: 1;\n\n span[class^=\"icon-\"] {\n font-size: $h5-font-size;\n font-weight: $font-weight-normal;\n }\n }\n\n .nav-link.icon {\n span[class^=\"icon-\"] {\n font-size: $h6-font-size;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n .dropdown-menu {\n right: 0;\n left: auto;\n }\n}\n\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n &,\n &.minimized {\n .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n\n &[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n\n &[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n }\n\n .mega-menu-panel .nav-link.back {\n display: block;\n\n &::before {\n float: left;\n transform: rotateZ(180deg);\n }\n }\n\n .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n\n a[data-toggle=\"collapse\"] {\n display: none;\n }\n\n > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n\n > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n }\n }\n }\n\n @include media-breakpoint-up($next) {\n .mega-menu {\n overflow: visible;\n\n > .navbar-nav {\n transition: none;\n transform: none;\n\n .nav-link::before {\n display: none;\n }\n }\n }\n\n .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: $zindex-fixed;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n\n a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n\n .nav-link {\n margin-left: 0;\n }\n\n .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n\n > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n\n > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n\n > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important; // stylelint-disable-line declaration-no-important\n flex-direction: column;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n\n > .container > .navbar-nav .nav-item:first-child,\n > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n\n > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n }\n }\n }\n }\n}\n\n@include media-breakpoint-down(sm) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n","//\n// Tables\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-type\n// stylelint-disable selector-class-pattern\n\n// Change the table states color\n@mixin table-row-variant-border($state, $color) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $color;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($color, 5%);\n }\n }\n}\n\n.table {\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n border-bottom: 1px solid $table-border-color;\n\n > th,\n > td {\n font-size: $font-size-sm;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n }\n\n > th:first-child,\n > td:first-child {\n padding-left: .625rem;\n }\n\n [class^=\"icon-\"],\n [class*=\" icon-\"] {\n font-size: 1.8125rem;\n }\n\n [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n }\n\n [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n }\n }\n }\n\n thead {\n\n\n > tr {\n border-bottom-width: 2px;\n\n > th {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n }\n }\n }\n\n tbody > th {\n font-weight: $font-weight-normal;\n }\n\n &.has-checkbox {\n tr.selected {\n > td,\n > th {\n background-color: $gray-400;\n }\n }\n\n tr > th:first-child,\n tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n }\n }\n\n &.has-icon {\n tr > td,\n tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n\n span,\n img {\n vertical-align: middle;\n }\n\n img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n }\n\n [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n }\n }\n }\n\n // &.has-status {\n // thead th:not(:first-child),\n // tr > td {\n // text-align: center;\n // }\n // }\n\n &.table-reflow {\n thead,\n tbody, {\n > tr {\n border: 0;\n }\n\n > tr > td {\n line-height: 1.25rem;\n }\n\n > tr > th:first-child {\n border-bottom: 2px solid $table-border-color;\n }\n\n > tr > th,\n > tr > td {\n border-bottom: 1px solid $table-border-color;\n }\n\n > tr > td:last-child {\n border-right: 0;\n }\n }\n\n thead > tr {\n border: 0;\n\n > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid $table-border-color;\n }\n\n > th:last-child {\n border-right: 0;\n }\n }\n\n tbody {\n > tr > th:first-child {\n padding-left: 0;\n }\n }\n }\n}\n\n@include table-row-variant-border(success, theme-color(\"success\"));\n@include table-row-variant-border(info, theme-color(\"info\"));\n@include table-row-variant-border(warning, theme-color(\"warning\"));\n@include table-row-variant-border(danger, theme-color(\"danger\"));\n\n\n// force caption for tables\ncaption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n// Style jquery tablesorter ext\n// scss-lint:disable SelectorFormat\n//\n// Table sorter\n//\n\n.tablesorter {\n caption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n background-color: #fff;\n }\n\n th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n\n &.header {\n position: relative;\n }\n\n .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n }\n\n &.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n transform: rotate(180deg);\n }\n\n &.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &.tablesorter-headerUnSorted {\n .tablesorter-header-inner:hover span::after,\n .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $o-sortable-hover-icon;\n }\n }\n\n a {\n color: #000;\n text-decoration: none;\n\n @include hover-focus {\n color: theme-color(\"primary\");\n text-decoration: underline;\n }\n }\n }\n\n td {\n text-align: left;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n.modal {\n\n .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n }\n\n .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n\n .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n\n\n .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n }\n }\n }\n\n .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n\n .card,\n .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n }\n\n .card-body {\n padding: 0;\n }\n\n .card-icon {\n margin-right: 1.25rem;\n }\n\n [class^=\"svg\"],\n [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n }\n\n [class^=\"svg\"] {\n display: block;\n }\n\n [class^=\"svg\"]::after {\n top: auto;\n }\n\n .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n }\n }\n\n .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n\n .btn + .btn {\n margin-left: 1.25rem;\n }\n }\n}\n\n@include media-breakpoint-down(xs) {\n .modal {\n .modal-content {\n padding: 1.25rem;\n }\n\n .modal-header {\n margin: 0;\n }\n\n .modal-body {\n .card {\n flex-direction: column;\n }\n\n .card-icon {\n align-self: center;\n margin-right: 0;\n }\n\n .card-icon,\n [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n\n .card-title {\n font-size: 1rem;\n }\n\n .card-body {\n margin-top: 1.25rem;\n }\n }\n\n .modal-footer {\n align-self: center;\n }\n }\n}\n","// Base nav\n.nav {\n .nav-item:first-child {\n margin-left: - ($spacer * .5);\n }\n\n &.flex-column .nav-item:first-child {\n margin-left: 0;\n }\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n line-height: 1.25rem;\n }\n}\n\n// Boosted Mod\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid $gray-600;\n}\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n// End mod\n\n//\n// classic tab\n//\n\n.nav-tabs {\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n\n .nav-link:not(.disabled) {\n &,\n &.dropdown-toggle {\n @include focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n }\n }\n\n + .nav-link {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n}\n\n// Responsive tabs\n//\n//\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n\n .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n\n &:first-child {\n margin-left: 0;\n border-top: 0;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n }\n\n &[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n }\n\n &:focus {\n outline-offset: -4px;\n }\n\n &:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n }\n }\n\n .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n\n &.show {\n display: block;\n }\n }\n\n @include media-breakpoint-down(sm) {\n .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n\n &[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n\n &:active {\n color: #fff;\n background-color: #f16e00;\n }\n }\n }\n\n &.accordion-layout {\n display: block;\n\n .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n\n &:focus {\n outline-offset: 0;\n }\n\n &:hover {\n color: #f16e00;\n background-color: #fff;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n\n &[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n\n &:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n\n &::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n }\n\n .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n }\n }\n}\n\n// Pills\n// -------------------------\n.nav-pills {\n &.nav-stacked .nav-item {\n margin: 0;\n\n + .nav-item {\n margin-left: 0;\n }\n }\n\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: ($grid-gutter-width / 4);\n }\n }\n\n .nav-link {\n @include active {\n background-color: $nav-pills-link-active-bg;\n }\n\n @include hover {\n color: $nav-pills-link-active-color;\n cursor: default;\n background-color: $nav-pills-link-active-bg;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n @include focus {\n color: $nav-pills-focus-link-color;\n background-color: $nav-pills-focus-link-bg;\n outline: none;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n padding-top: $spacer;\n padding-bottom: $spacer;\n }\n .dropdown-menu {\n right: 0;\n left: auto;\n\n .nav-item {\n margin: 0;\n\n .nav-link {\n @include focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n }\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n\n .tab-pane p {\n margin-bottom: 0;\n }\n}\n\n.tab-content-clear {\n // padding: 1.125rem;\n border: 0;\n}\n\n// breadcrums\n\n.breadcrum {\n line-height: 1;\n}\n\n// priority nav\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important; // stylelint-disable-line declaration-no-important\n}\n\n.show-inline-block {\n display: inline-block !important; // stylelint-disable-line declaration-no-important\n}\n\n.overflow-nav-list {\n .nav-link {\n border: 0;\n &:focus {\n outline-offset: -2px;\n }\n }\n\n .nav-item:last-child {\n margin-bottom: 0;\n }\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n","//\n// Nav local\n//\n\n.o-nav-local {\n margin-bottom: ($spacer * 2);\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n\n > .container,\n > .container-fluid {\n display: flex;\n }\n\n ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n }\n\n .nav-item + .nav-item {\n margin-left: 1rem;\n }\n\n .nav.flex-column .nav-item {\n margin-left: 0;\n }\n\n .nav .nav-link,\n .nav .dropdown-toggle {\n @include focus {\n outline: 1px dotted;\n outline-offset: -1px;\n }\n display: inline-block;\n padding: 1rem ($nav-link-padding-x * .5) 1.125rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n .nav-link.active {\n color: theme-color(\"primary\");\n }\n\n .dropdown-toggle.show {\n color: #000;\n }\n\n .dropdown-menu {\n .nav-item,\n .nav-item + .nav-item {\n margin: 0;\n }\n\n .nav-link {\n @include focus {\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: $gray-900;\n border-bottom-color: $gray-900;\n\n .nav-link {\n @include hover-focus {\n color: theme-color(\"primary\");\n }\n\n &:focus {\n outline-color: #fff;\n }\n\n color: #fff;\n background-color: #000;\n\n &.active {\n color: theme-color(\"primary\");\n }\n }\n}\n\n",".skiplinks {\n z-index: 99999;\n}\n.skiplinks .skiplinks-section li {\n float: left;\n}\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: $font-weight-bold;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 $gray-500;\n border: 2px solid #000;\n @include border-radius(0);\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, .3);\n}\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: $font-weight-normal;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n","//\n// Footer\n//\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: $font-size-sm;\n font-weight: $font-weight-bold;\n color: #fff;\n background-color: #000;\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n font-size: $font-size-sm;\n line-height: 1.25rem;\n\n &:not(:hover),\n &:not([href]) {\n color: #fff;\n }\n }\n\n .o-footer-top,\n .o-footer-body,\n .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n }\n\n .o-footer-top {\n border-bottom: 1px solid $gray-900;\n }\n\n .o-footer-body {\n .row {\n margin-bottom: .625rem;\n }\n\n h2 {\n margin-top: .625rem;\n font-size: $font-size-sm;\n color: #fff;\n }\n\n p {\n &,\n a {\n color: #fff;\n }\n }\n\n .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n }\n }\n\n .o-footer-bottom {\n border-top: 1px solid $gray-900;\n }\n}\n","// small device display as card\n// stylelint-disable selector-no-qualifying-type\n@include media-breakpoint-down(md) {\n .o-responsive-table {\n thead {\n display: none;\n }\n tbody,\n tr,\n th,\n td {\n display: block;\n }\n // for tablet, display 2 cards by rows\n @include media-breakpoint-up(md) {\n tr {\n float: left;\n width: 45%;\n }\n tr:nth-child(odd) {\n margin-right: 10%;\n }\n }\n th,\n td {\n vertical-align: middle;\n }\n td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: $font-weight-bold;\n content: attr(data-title);\n }\n tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n tbody {\n th[scope=\"row\"] {\n font-weight: $font-weight-bold;\n border-top: 0;\n border-bottom: 2px solid $gray-500;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// o-scroll-up\n//\n//\n\n.o-scroll-up {\n .o-scroll-up-icon {\n &::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n }\n align-items: center;\n justify-content: center;\n float: right;\n width: $o-scroll-up-width;\n height: $o-scroll-up-height;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n\n /* rtl:ignore */\n transform: rotate(90deg);\n\n /* rtl:ignore */\n }\n\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: $zindex-o-scroll-up;\n display: none;\n // put a safety space between the right of the screen and the scroll link\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n right: $container-margin;\n }\n }\n @include media-breakpoint-up(xs) {\n bottom: .25rem;\n }\n @include media-breakpoint-up(sm) {\n bottom: .375rem;\n }\n @include media-breakpoint-up(md) {\n bottom: .75rem;\n }\n @include media-breakpoint-up(lg) {\n bottom: 2rem;\n }\n @include media-breakpoint-up(xl) {\n bottom: 2.5rem;\n }\n @include media-breakpoint-up(xxl) {\n bottom: 3.75rem;\n }\n\n .o-scroll-up-text {\n display: inline-block;\n padding: (($o-scroll-up-height - 1.25) / 2) .625rem;\n font-weight: $font-weight-bold;\n background-color: #fff;\n opacity: .8;\n }\n // custom class to allow a fixed position\n &.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n .o-scroll-up-text {\n float: left;\n }\n .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n }\n }\n\n @include hover-focus {\n color: $primary;\n .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n }\n }\n\n &:active .o-scroll-up-icon {\n color: #fff;\n background-color: $primary;\n border-color: $primary;\n }\n}\n","//\n// dropdown\n//\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: $font-weight-bold;\n\n &:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n }\n\n &:focus:hover {\n color: #fff;\n background-color: #000;\n }\n}\n","// stylelint-disable property-blacklist, font-family-no-missing-generic-family-keyword\n//\n// Carousel\n// --------------------------------------------------\n\n// native boostrap\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item {\n img {\n width: 100%;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n\n // Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n\n &::before {\n font-family: icon-orange;\n }\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n\n &:hover {\n cursor: default;\n }\n\n li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n\n &:hover {\n cursor: pointer;\n }\n\n &.active {\n background-color: theme-color(\"primary\"); // stylelint-disable-line selector-no-qualifying-type\n }\n }\n}\n\n// swiper\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n //Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important; // stylelint-disable-line declaration-no-important\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide {\n .card {\n border: 0;\n }\n\n .card-img {\n padding: 0;\n\n img {\n width: 100%;\n height: 40vh;\n }\n }\n\n .card-title {\n margin: 0;\n font-weight: $font-weight-bold;\n }\n\n .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n\n p {\n margin: 0;\n }\n }\n}\n\n@include media-breakpoint-down(md) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;/* used for displaying pagination outside of container */\n }\n\n .swiper-slide {\n width: 80%;\n\n // .card-link .card-body {\n // padding: 20px;\n // text-align: left;\n // }\n\n .card-img img {\n height: auto;\n }\n\n .card-body {\n position: static;\n }\n }\n\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n//\n\n// back from accessibility plugin css\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: theme-color(\"primary\");\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n//\n// Progress bar\n//\n\n.progress.progress-default {\n &[value]::-webkit-progress-value {\n background-color: theme-color(\"primary\");\n }\n\n &[value]::-moz-progress-bar {\n background-color: theme-color(\"primary\");\n }\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: ($grid-gutter-width * 1.5);\n}\n\n.hero-container .caption {\n margin: ($grid-gutter-width * 2.5) ($grid-gutter-width * 1.5);\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: theme-color(\"primary\");\n}\n\n","@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: right;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-right: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: right;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-right: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-right: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-left: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-left: auto;\n margin-right: auto;\n padding-left: 5px;\n padding-right: 5px;\n margin-left: 1.25%;\n margin-right: 1.25%;\n max-width: 312px;\n margin-left: auto;\n margin-right: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-left: 1.25%;\n margin-right: 1.25%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-left: 1.5625%;\n margin-right: 1.5625%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-left: 4.16667%;\n margin-right: 4.16667%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.container-fluid {\n margin-left: auto;\n margin-right: auto;\n padding-left: 5px;\n padding-right: 5px;\n margin-left: 1.25%;\n margin-right: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-left: 1.25%;\n margin-right: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-left: 1.5625%;\n margin-right: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-left: 4.16667%;\n margin-right: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-left: -5px;\n margin-right: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-left: -5px;\n margin-right: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n.no-gutters {\n margin-left: 0;\n margin-right: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-left: 0;\n padding-right: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-left: 5px;\n padding-right: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-right: 8.333333%;\n}\n\n.offset-2 {\n margin-right: 16.666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.333333%;\n}\n\n.offset-5 {\n margin-right: 41.666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.333333%;\n}\n\n.offset-8 {\n margin-right: 66.666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.333333%;\n}\n\n.offset-11 {\n margin-right: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.333333%;\n }\n .offset-sm-2 {\n margin-right: 16.666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.333333%;\n }\n .offset-sm-5 {\n margin-right: 41.666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.333333%;\n }\n .offset-sm-8 {\n margin-right: 66.666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.333333%;\n }\n .offset-sm-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.333333%;\n }\n .offset-md-2 {\n margin-right: 16.666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.333333%;\n }\n .offset-md-5 {\n margin-right: 41.666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.333333%;\n }\n .offset-md-8 {\n margin-right: 66.666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.333333%;\n }\n .offset-md-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.333333%;\n }\n .offset-lg-2 {\n margin-right: 16.666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.333333%;\n }\n .offset-lg-5 {\n margin-right: 41.666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.333333%;\n }\n .offset-lg-8 {\n margin-right: 66.666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.333333%;\n }\n .offset-lg-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.333333%;\n }\n .offset-xl-2 {\n margin-right: 16.666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.333333%;\n }\n .offset-xl-5 {\n margin-right: 41.666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.333333%;\n }\n .offset-xl-8 {\n margin-right: 66.666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.333333%;\n }\n .offset-xl-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0 0.625rem 0.625rem;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0 0.3125rem 0.3125rem;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-right: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-left: 0;\n padding-right: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-left: -5px;\n margin-right: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-right: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-right: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-right: 0;\n margin-left: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-left: 0.3125rem;\n margin-right: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-right: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n right: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-left: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-left: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-right: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n right: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-left: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-left: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-right: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-left: 0.25rem;\n margin-right: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n border-bottom: 0;\n border-right: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n right: 0;\n z-index: 1000;\n display: none;\n float: right;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: right;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n left: auto;\n right: 0;\n}\n\n.dropdown-menu-right {\n left: 0;\n right: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-sm-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-md-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-lg-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-xl-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-xxl-right {\n left: 0;\n right: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-left: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n left: auto;\n right: 100%;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-left: 0;\n border-bottom: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n left: 100%;\n right: auto;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n left: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-right: -2px;\n}\n\n.dropdown-toggle-split {\n padding-left: 0.84375rem;\n padding-right: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-right: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-left: 0.46875rem;\n padding-right: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-left: 0.9375rem;\n padding-right: 0.9375rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-right: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-right: -2px;\n}\n\n.input-group-prepend {\n margin-left: -2px;\n}\n\n.input-group-append {\n margin-right: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-right-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-left: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-right: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-left: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n right: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n right: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n top: .4rem;\n right: .2585rem;\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-left: none;\n border-right: none;\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-right: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n right: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n right: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-left: 4.375rem;\n padding-right: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n left: 0;\n right: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n left: calc(1.875rem + 2px);\n right: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(-1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 0.5rem 0.4375rem 1.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-left: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-right: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-right: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-right: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-left: 0.125rem;\n margin-right: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-left: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-right: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n padding-left: 0;\n padding-right: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-left: 0;\n margin-right: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-right: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-left: .625rem;\n padding-bottom: .875rem;\n padding-right: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: left;\n margin-left: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-right: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem .625rem .875rem 0;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n transform: rotateZ(-180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 0 0 .625rem;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-left: 0;\n margin-right: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-right: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-left: -0.625rem;\n margin-bottom: -0.75rem;\n margin-right: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-left: -0.625rem;\n margin-right: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n flex-flow: row wrap;\n margin-left: -2.5rem;\n margin-right: -2.5rem;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-left: 2.5rem;\n margin-bottom: 0;\n margin-right: 2.5rem;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-right: 0;\n border-right: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 0 1rem 2.125rem;\n line-height: 1.125rem;\n text-align: right;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n left: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n transform: rotate(-180deg);\n}\n\n.accordion .card-body {\n padding: 0 0 0 1.5rem;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: flex;\n padding-right: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-right: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-right: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-left: 1.125rem;\n padding-right: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-left: 2rem;\n padding-right: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-right: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-left: 0;\n padding-right: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-left: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n left: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 100% 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-right: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-left: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-left: 0;\n border-right: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: left;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem auto -0.625rem -0.625rem;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-right: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-left: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: right;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: right;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n right: 50%;\n display: block;\n width: 0.625rem;\n margin-right: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: right;\n width: 100%;\n margin-left: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(-100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n right: 0;\n}\n\n.carousel-control-next {\n left: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-right: 0;\n margin-left: 1.875rem;\n margin-right: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-left: 3px;\n margin-right: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n bottom: 20px;\n right: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(-360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-left-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-left: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-right: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-left: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-right: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-right-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-left-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: right !important;\n}\n\n.float-right {\n float: left !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: right !important;\n }\n .float-sm-right {\n float: left !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: right !important;\n }\n .float-md-right {\n float: left !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: right !important;\n }\n .float-lg-right {\n float: left !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: right !important;\n }\n .float-xl-right {\n float: left !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: right !important;\n }\n .float-xxl-right {\n float: left !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: right !important;\n}\n\n.text-right {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: right !important;\n }\n .text-sm-right {\n text-align: left !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: right !important;\n }\n .text-md-right {\n text-align: left !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: right !important;\n }\n .text-lg-right {\n text-align: left !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: right !important;\n }\n .text-xl-right {\n text-align: left !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: right !important;\n }\n .text-xxl-right {\n text-align: left !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: right;\n }\n .o-card-link .card-title {\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n left: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: right;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n right: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: left;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n left: -.125rem;\n right: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n left: 0;\n right: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-left: 0;\n padding-right: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: flex;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-right: .625rem;\n}\n\n.form-group.row.top {\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n order: 1;\n}\n\n.form-group.row.top .form-control {\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-right: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-right: 0;\n color: #f16e00;\n text-align: right;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-left: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-right: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: right;\n padding: 0.625rem 1.25rem;\n padding-right: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-right: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 2rem 0.3125rem 0.625rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n left: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-left: 0;\n padding-right: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-right: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n right: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n left: 0;\n right: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-right: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n left: 0;\n right: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-right: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-right: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-left: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-left: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-left: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-right: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-left: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-right: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-left: 30px;\n text-align: right;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-left: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n transform: rotate(-180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: right;\n}\n\n.modal .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n left: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-left: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-right: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n align-self: center;\n margin-left: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-right: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-right: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-right: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-right: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-right: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-right: 0;\n }\n}\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-right: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-right: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n flex-grow: 1;\n margin-right: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-right: 0;\n font-weight: 700;\n color: #000;\n text-align: right;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n transform: rotate(-180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-right: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n left: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-right: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-right: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-right: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n left: 0;\n right: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem 1.25rem .625rem .625rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: flex;\n}\n\n.o-nav-local ul + ul {\n flex-shrink: 0;\n margin-right: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-right: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-right: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem 1.25rem .625rem .625rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: right;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none none none solid;\n border-width: 0 0 0 1px;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n right: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-right: -175px;\n overflow: hidden;\n background: none repeat scroll 100% 0 #ccc;\n border: 2px solid #000;\n box-shadow: -2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 100% 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: right;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-left: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: right;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-left: 0;\n border-right: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n left: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n left: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n align-items: center;\n justify-content: center;\n float: left;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n transform: rotate(90deg);\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n left: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n left: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n left: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n left: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n left: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: right;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: right;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-right: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-right: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-left: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n right: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n right: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n/*# sourceMappingURL=boosted-rtl.css.map */.svg-arrow-previous::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.stepbar-item::after {\n transform: rotateY(180deg);\n}\n\n.page-item:last-child .page-link::before,\n.page-item:first-child .page-link::before,\n.page-item.presentation + .page-item .page-link::before,\n.swiper-button-prev,\n.swiper-button-next,\n.doc-link::after,\n.breadcrumb-item + .breadcrumb-item::before,\n.o-link-arrow::after,\n.o-link-arrow.back::before {\n transform: rotate(180deg);\n}\n\n.alert .alert-icon::after,\n.alert-sm .alert-icon::after {\n right: 2%;\n}\n\n.o-stepbar .stepbar-item::after,\n.page-item:last-child .page-link::before,\n.o-stepbar .stepbar-item.current::after,\n.o-stepbar .stepbar-item.done::after {\n right: unset;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: auto;\n left: 0;\n}\n\n.custom-switch .custom-control-label::before {\n background-position: .2rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-position: 2rem;\n}\n\n.o-link-arrow.back::before {\n padding: 0 .625rem 0 0;\n}\n\n.popover {\n right: auto;\n left: 0;\n}\n\n/*# sourceMappingURL=o-rtl.css.map */"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted-rtl.min.css b/dashboard/public/css/boosted-rtl.min.css
new file mode 100644
index 00000000..ee47eae5
--- /dev/null
+++ b/dashboard/public/css/boosted-rtl.min.css
@@ -0,0 +1,12 @@
+@charset "UTF-8";/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */:root{--blue:#527edb;--indigo:#6610f2;--purple:#a885d8;--pink:#ffb4e6;--red:#cd3c14;--orange:#f16e00;--yellow:#fc0;--green:#32c832;--teal:#50be87;--cyan:#4bb4e6;--white:#fff;--gray:#999;--gray-dark:#595959;--primary:#f16e00;--secondary:#000;--success:#32c832;--info:#527edb;--warning:#fc0;--danger:#cd3c14;--light:#ddd;--dark:#000;--breakpoint-xs:0;--breakpoint-sm:480px;--breakpoint-md:768px;--breakpoint-lg:980px;--breakpoint-xl:1220px;--breakpoint-xxl:1380px;--font-family-sans-serif:"HelvNeueOrange","Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.25;color:#000;text-align:right;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:1.25rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#000;text-decoration:none;background-color:transparent}a:hover{color:#f16e00;text-decoration:none}p a{text-decoration:underline}p a:focus,p a:hover{text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.625rem .625rem .625rem 0;padding-bottom:.625rem .625rem .625rem 0;color:#666;text-align:right;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.625rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:1.25rem;font-family:inherit;font-weight:700;line-height:1.1;color:inherit}.h1,h1{font-size:2.125rem}.h2,h2{font-size:1.875rem}.h3,h3{font-size:1.5rem}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:1rem}@media (max-width:767.98px){.h1,h1{font-size:1.25rem}.h2,h2{font-size:1.125rem}.h3,h3{font-size:1rem}.h4,h4{font-size:.875rem}.h5,h5{font-size:.875rem}.h6,h6{font-size:.875rem}}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:3.75rem;font-weight:700;line-height:1.1}.display-2{font-size:3.125rem;font-weight:700;line-height:1.1}.display-3{font-size:2.5rem;font-weight:700;line-height:1.1}.display-4{font-size:2.125rem;font-weight:700;line-height:1.1}hr{margin-top:1.25rem;margin-bottom:1.25rem;border:0;border-top:1px solid #eee}.small,small{font-size:.875rem;font-weight:400}.mark,mark{padding:.2em;background-color:#f16e00}.list-unstyled{padding-right:0;list-style:none}.list-inline{padding-right:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-left:.3125rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1.25rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875rem;color:#666}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.625rem;background-color:#fff;border:2px solid #000;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.625rem;line-height:1}.figure-caption{font-size:90%;color:#333}code{font-size:87.5%;color:#333;word-break:break-word}a>code{color:inherit}kbd{padding:.0625rem .0625rem;font-size:87.5%;color:#000;background-color:#eee}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#333}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-left:auto;margin-right:auto;padding-left:5px;padding-right:5px;margin-left:1.25%;margin-right:1.25%;max-width:312px;margin-left:auto;margin-right:auto;width:100%}@media (min-width:480px){.container{padding-left:5px;padding-right:5px}}@media (min-width:768px){.container{padding-left:10px;padding-right:10px}}@media (min-width:980px){.container{padding-left:10px;padding-right:10px}}@media (min-width:1220px){.container{padding-left:10px;padding-right:10px}}@media (min-width:1380px){.container{padding-left:10px;padding-right:10px}}.container .container-fluid{margin-left:auto;margin-right:auto}@media (min-width:480px){.container{margin-left:1.25%;margin-right:1.25%}.container .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:768px){.container{margin-left:1.5625%;margin-right:1.5625%}.container .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:980px){.container{margin-left:3.125%;margin-right:3.125%}.container .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:1220px){.container{margin-left:3.125%;margin-right:3.125%}.container .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:1380px){.container{margin-left:4.16667%;margin-right:4.16667%}.container .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:480px){.container{max-width:468px;margin-left:auto;margin-right:auto}}@media (min-width:768px){.container{max-width:744px;margin-left:auto;margin-right:auto}}@media (min-width:980px){.container{max-width:960px;margin-left:auto;margin-right:auto}}@media (min-width:1220px){.container{max-width:1200px;margin-left:auto;margin-right:auto}}@media (min-width:1380px){.container{max-width:1320px;margin-left:auto;margin-right:auto}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:5px;padding-right:5px;margin-left:1.25%;margin-right:1.25%;width:auto}@media (min-width:480px){.container-fluid{padding-left:5px;padding-right:5px}}@media (min-width:768px){.container-fluid{padding-left:10px;padding-right:10px}}@media (min-width:980px){.container-fluid{padding-left:10px;padding-right:10px}}@media (min-width:1220px){.container-fluid{padding-left:10px;padding-right:10px}}@media (min-width:1380px){.container-fluid{padding-left:10px;padding-right:10px}}.container-fluid .container-fluid{margin-left:auto;margin-right:auto}@media (min-width:480px){.container-fluid{margin-left:1.25%;margin-right:1.25%}.container-fluid .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:768px){.container-fluid{margin-left:1.5625%;margin-right:1.5625%}.container-fluid .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:980px){.container-fluid{margin-left:3.125%;margin-right:3.125%}.container-fluid .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:1220px){.container-fluid{margin-left:3.125%;margin-right:3.125%}.container-fluid .container-fluid{margin-left:auto;margin-right:auto}}@media (min-width:1380px){.container-fluid{margin-left:4.16667%;margin-right:4.16667%}.container-fluid .container-fluid{margin-left:auto;margin-right:auto}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}@media (min-width:480px){.row{margin-left:-5px;margin-right:-5px}}@media (min-width:768px){.row{margin-left:-10px;margin-right:-10px}}@media (min-width:980px){.row{margin-left:-10px;margin-right:-10px}}@media (min-width:1220px){.row{margin-left:-10px;margin-right:-10px}}@media (min-width:1380px){.row{margin-left:-10px;margin-right:-10px}}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{position:relative;width:100%;padding-left:5px;padding-right:5px}@media (min-width:480px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-left:5px;padding-right:5px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-left:10px;padding-right:10px}}@media (min-width:980px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-left:10px;padding-right:10px}}@media (min-width:1220px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-left:10px;padding-right:10px}}@media (min-width:1380px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-left:10px;padding-right:10px}}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-right:8.333333%}.offset-2{margin-right:16.666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.333333%}.offset-5{margin-right:41.666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.333333%}.offset-8{margin-right:66.666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.333333%}.offset-11{margin-right:91.666667%}@media (min-width:480px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.333333%}.offset-sm-2{margin-right:16.666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.333333%}.offset-sm-5{margin-right:41.666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.333333%}.offset-sm-8{margin-right:66.666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.333333%}.offset-sm-11{margin-right:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.333333%}.offset-md-2{margin-right:16.666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.333333%}.offset-md-5{margin-right:41.666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.333333%}.offset-md-8{margin-right:66.666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.333333%}.offset-md-11{margin-right:91.666667%}}@media (min-width:980px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.333333%}.offset-lg-2{margin-right:16.666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.333333%}.offset-lg-5{margin-right:41.666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.333333%}.offset-lg-8{margin-right:66.666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.333333%}.offset-lg-11{margin-right:91.666667%}}@media (min-width:1220px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.333333%}.offset-xl-2{margin-right:16.666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.333333%}.offset-xl-5{margin-right:41.666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.333333%}.offset-xl-8{margin-right:66.666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.333333%}.offset-xl-11{margin-right:91.666667%}}@media (min-width:1380px){.col-xxl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xxl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xxl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xxl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xxl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xxl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xxl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xxl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xxl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xxl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xxl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xxl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xxl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xxl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xxl-first{-ms-flex-order:-1;order:-1}.order-xxl-last{-ms-flex-order:13;order:13}.order-xxl-0{-ms-flex-order:0;order:0}.order-xxl-1{-ms-flex-order:1;order:1}.order-xxl-2{-ms-flex-order:2;order:2}.order-xxl-3{-ms-flex-order:3;order:3}.order-xxl-4{-ms-flex-order:4;order:4}.order-xxl-5{-ms-flex-order:5;order:5}.order-xxl-6{-ms-flex-order:6;order:6}.order-xxl-7{-ms-flex-order:7;order:7}.order-xxl-8{-ms-flex-order:8;order:8}.order-xxl-9{-ms-flex-order:9;order:9}.order-xxl-10{-ms-flex-order:10;order:10}.order-xxl-11{-ms-flex-order:11;order:11}.order-xxl-12{-ms-flex-order:12;order:12}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.333333%}.offset-xxl-2{margin-right:16.666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.333333%}.offset-xxl-5{margin-right:41.666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.333333%}.offset-xxl-8{margin-right:66.666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.333333%}.offset-xxl-11{margin-right:91.666667%}}.table{width:100%;margin-bottom:1.25rem;color:#000;background-color:#fff}.table td,.table th{padding:.625rem 0 .625rem .625rem;vertical-align:top;border-top:1px solid #ccc}.table thead th{vertical-align:bottom;border-bottom:2px solid #ccc}.table tbody+tbody{border-top:2px solid #ccc}.table-sm td,.table-sm th{padding:.3125rem 0 .3125rem .3125rem}.table-bordered{border:1px solid #ccc}.table-bordered td,.table-bordered th{border:1px solid #ccc}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:#f6f6f6}.table-hover tbody tr:hover{color:#000;background-color:#eee}.table-primary,.table-primary>td,.table-primary>th{background-color:#f16e00}.table-hover .table-primary:hover{background-color:#d86200}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#d86200}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#000;color:#fff}.table-hover .table-secondary:hover{background-color:#000}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#000}.table-success,.table-success>td,.table-success>th{background-color:#32c832}.table-hover .table-success:hover{background-color:#2db42d}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#2db42d}.table-info,.table-info>td,.table-info>th{background-color:#527edb}.table-hover .table-info:hover{background-color:#3d6ed7}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#3d6ed7}.table-warning,.table-warning>td,.table-warning>th{background-color:#fc0}.table-hover .table-warning:hover{background-color:#e6b800}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#e6b800}.table-danger,.table-danger>td,.table-danger>th{background-color:#cd3c14;color:#fff}.table-hover .table-danger:hover{background-color:#b63512}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#b63512}.table-light,.table-light>td,.table-light>th{background-color:#ddd}.table-hover .table-light:hover{background-color:#d0d0d0}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#d0d0d0}.table-dark,.table-dark>td,.table-dark>th{background-color:#000;color:#fff}.table-hover .table-dark:hover{background-color:#000}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#000}.table-active,.table-active>td,.table-active>th{background-color:#ddd}.table-hover .table-active:hover{background-color:#d0d0d0}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#d0d0d0}.table .thead-dark th{color:#fff;background-color:#000;border-color:#ccc}.table .thead-light th{color:#000;background-color:#fff;border-color:#ccc}.table-dark{color:#fff;background-color:#000}.table-dark td,.table-dark th,.table-dark thead th{border-color:#ccc}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:#333}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:#666}@media (max-width:479.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:979.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1219.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}@media (max-width:1379.98px){.table-responsive-xxl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xxl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}label{font-weight:700}label.disabled{color:#767676}label.is-required::after{margin-right:6px;font-weight:700;color:#f16e00;content:"*"}.form-control{display:block;width:100%;height:calc(2.25rem + 4px);padding:.5rem .625rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:700;line-height:1.25;color:#000;background-color:#fff;background-clip:padding-box;border:2px solid #ccc;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#000;background-color:#fff;border-color:#000;outline:0}.form-control::-webkit-input-placeholder{color:#666;opacity:1}.form-control::-moz-placeholder{color:#666;opacity:1}.form-control:-ms-input-placeholder{color:#666;opacity:1}.form-control::-ms-input-placeholder{color:#666;opacity:1}.form-control::placeholder{color:#666;opacity:1}.form-control:disabled,.form-control[readonly]{color:#666;background-color:#eee;opacity:1}select.form-control:focus::-ms-value{color:#000;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.5rem + 2px);padding-bottom:calc(.5rem + 2px);margin-bottom:0;font-size:inherit;line-height:1.25}.col-form-label-lg{padding-top:calc(.594rem + 2px);padding-bottom:calc(.594rem + 2px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.157rem + 2px);padding-bottom:calc(.157rem + 2px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;color:#000;background-color:transparent;border:solid transparent;border-width:2px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{height:calc(1.6265rem + 4px);padding:.157rem .625rem;font-size:.875rem;line-height:1.5}.form-control-lg{height:calc(2.8755rem + 4px);padding:.594rem 1.25rem;font-size:1.125rem;line-height:1.5}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1.25rem}.form-text{display:block;margin-top:.625rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{position:relative;display:block;padding-right:1.25rem;margin-bottom:.625rem}.form-check-input{position:absolute;margin-top:.3rem;margin-right:-1.25rem}.form-check-input:disabled~.form-check-label{color:#666}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-right:0;margin-left:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-left:.3125rem;margin-right:0}.valid-feedback{display:none;width:100%;margin-top:.625rem;font-size:.875rem;font-weight:700}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.625rem .625rem;margin-top:.1rem;font-size:.875rem;line-height:1.25;color:#000;background-color:rgba(50,200,50,.9)}.form-control.is-valid,.was-validated .form-control:valid{border-color:#32c832}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#32c832}.form-control.is-valid~.valid-feedback,.was-validated .form-control:valid~.valid-feedback{position:relative;display:block;padding-right:1.625rem}.form-control.is-valid~.valid-feedback::after,.was-validated .form-control:valid~.valid-feedback::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E")}.form-control.is-valid~.valid-feedback::after,.was-validated .form-control:valid~.valid-feedback::after{position:absolute;top:-.1rem;right:0;width:1.125rem;height:1.125rem;content:"";background-repeat:no-repeat;background-size:cover}.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-left:2.25rem;background-position:top calc(.3125em + .25rem) left calc(.3125em + .25rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#32c832;padding-left:3.1875rem;background:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat left .5rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.5rem/1.125rem 1.125rem}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#32c832}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#32c832}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#32c832}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#32c832}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#58d558;background-color:#58d558}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#32c832}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#32c832}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#32c832}.invalid-feedback{display:none;width:100%;margin-top:.625rem;font-size:.875rem;font-weight:700}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.625rem .625rem;margin-top:.1rem;font-size:.875rem;line-height:1.25;color:#fff;background-color:rgba(205,60,20,.9)}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#cd3c14}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#cd3c14}.form-control.is-invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-feedback{position:relative;display:block;padding-right:1.625rem}.form-control.is-invalid~.invalid-feedback::after,.was-validated .form-control:invalid~.invalid-feedback::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E")}.form-control.is-invalid~.invalid-feedback::after,.was-validated .form-control:invalid~.invalid-feedback::after{position:absolute;top:-.1rem;right:0;width:1.125rem;height:1.125rem;content:"";background-repeat:no-repeat;background-size:cover}.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-left:2.25rem;background-position:top calc(.3125em + .25rem) left calc(.3125em + .25rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#cd3c14;padding-left:3.1875rem;background:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat left .5rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.5rem/1.125rem 1.125rem}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#cd3c14}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#cd3c14}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#cd3c14}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#cd3c14}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#ea532a;background-color:#ea532a}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#cd3c14}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#cd3c14}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#cd3c14}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:480px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-right:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-left:.25rem;margin-right:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:700;color:#000;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:2px solid transparent;padding:.5rem 1.125rem;font-size:1rem;line-height:1.25;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#000;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:1}a.btn{text-decoration:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary,.btn-warning{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-primary:focus,.btn-primary:hover,.btn-warning:focus,.btn-warning:hover{color:#fff;background-color:#000;border-color:#000}.btn-primary.disabled,.btn-primary:disabled,.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#fff;border-color:#000}.btn-primary.btn-inverse,.btn-warning.btn-inverse{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-primary.btn-inverse:focus,.btn-primary.btn-inverse:hover,.btn-warning.btn-inverse:focus,.btn-warning.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-primary.btn-inverse.disabled,.btn-primary.btn-inverse:disabled,.btn-warning.btn-inverse.disabled,.btn-warning.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-primary.btn-inverse:not(:disabled):not(.disabled).active,.btn-primary.btn-inverse:not(:disabled):not(.disabled):active,.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-primary.btn-inverse.dropdown-toggle,.show>.btn-warning.btn-inverse.dropdown-toggle{color:#fff;background-color:#000;border-color:#fff}.btn-light,.btn-secondary{color:#000;background-color:transparent;border-color:#000}.btn-light:focus,.btn-light:hover,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#000;border-color:#000}.btn-light.disabled,.btn-light:disabled,.btn-secondary.disabled,.btn-secondary:disabled{color:#ccc;background-color:transparent;border-color:#ccc}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-light.btn-inverse,.btn-secondary.btn-inverse{color:#000;background-color:#fff;border-color:#fff}.btn-light.btn-inverse:focus,.btn-light.btn-inverse:hover,.btn-secondary.btn-inverse:focus,.btn-secondary.btn-inverse:hover{color:#fff;background-color:#000;border-color:#fff}.btn-light.btn-inverse.disabled,.btn-light.btn-inverse:disabled,.btn-secondary.btn-inverse.disabled,.btn-secondary.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-light.btn-inverse:not(:disabled):not(.disabled).active,.btn-light.btn-inverse:not(:disabled):not(.disabled):active,.btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-light.btn-inverse.dropdown-toggle,.show>.btn-secondary.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-success{color:#000;background-color:#32c832;border-color:#32c832}.btn-success:focus,.btn-success:hover{color:#fff;background-color:#000;border-color:#000}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-success.btn-inverse{color:#000;background-color:#32c832;border-color:#32c832}.btn-success.btn-inverse:focus,.btn-success.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-success.btn-inverse.disabled,.btn-success.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-success.btn-inverse:not(:disabled):not(.disabled).active,.btn-success.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-success.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-dark,.btn-info{color:#fff;background-color:#000;border-color:#000}.btn-dark:focus,.btn-dark:hover,.btn-info:focus,.btn-info:hover{color:#000;background-color:#fff;border-color:#000}.btn-dark.disabled,.btn-dark:disabled,.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-dark.btn-inverse,.btn-info.btn-inverse{color:#fff;background-color:transparent;border-color:#fff}.btn-dark.btn-inverse:focus,.btn-dark.btn-inverse:hover,.btn-info.btn-inverse:focus,.btn-info.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-dark.btn-inverse.disabled,.btn-dark.btn-inverse:disabled,.btn-info.btn-inverse.disabled,.btn-info.btn-inverse:disabled{color:#666;background-color:transparent;border-color:#666}.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,.btn-info.btn-inverse:not(:disabled):not(.disabled).active,.btn-info.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-dark.btn-inverse.dropdown-toggle,.show>.btn-info.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-danger{color:#fff;background-color:#cd3c14;border-color:#cd3c14}.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#000;border-color:#000}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-danger.btn-inverse{color:#fff;background-color:#cd3c14;border-color:#cd3c14}.btn-danger.btn-inverse:focus,.btn-danger.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-danger.btn-inverse.disabled,.btn-danger.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-danger.btn-inverse:not(:disabled):not(.disabled).active,.btn-danger.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-danger.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-outline-primary{color:#f16e00;border-color:#f16e00}.btn-outline-primary:focus,.btn-outline-primary:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#f16e00;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-secondary{color:#000;border-color:#000}.btn-outline-secondary:focus,.btn-outline-secondary:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#000;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-success{color:#32c832;border-color:#32c832}.btn-outline-success:focus,.btn-outline-success:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#32c832;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-info{color:#000;border-color:#000}.btn-outline-info:focus,.btn-outline-info:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#000;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-warning{color:#f16e00;border-color:#f16e00}.btn-outline-warning:focus,.btn-outline-warning:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f16e00;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-danger{color:#cd3c14;border-color:#cd3c14}.btn-outline-danger:focus,.btn-outline-danger:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#cd3c14;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-light{color:#ddd;border-color:#ddd}.btn-outline-light:focus,.btn-outline-light:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#ddd;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-dark{color:#000;border-color:#000}.btn-outline-dark:focus,.btn-outline-dark:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#000;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-link{color:#000}.btn-link.btn-inverse{color:#fff}.btn-link:hover{color:#f16e00;text-decoration:none}.btn-link.focus,.btn-link:focus{text-decoration:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#ccc;pointer-events:none}.btn-xlg{padding:.8125rem 1.25rem;font-size:1.25rem;line-height:1.5;border-radius:0}.btn-group-lg>.btn,.btn-lg{padding:.594rem 1.25rem;font-size:1.125rem;line-height:1.5;border-radius:0}.btn-group-sm>.btn,.btn-sm{padding:.157rem .625rem;font-size:.875rem;line-height:1.5;border-radius:0}.btn-mail{height:2.5rem;background-repeat:no-repeat}.btn-mail:focus,.btn-mail:hover{outline:0}.btn-mail-inverse{height:2.5rem;background-repeat:no-repeat}.btn-mail-inverse:focus,.btn-mail-inverse:hover{outline:0}.btn-lin{height:2.5rem;background-repeat:no-repeat}.btn-lin:focus,.btn-lin:hover{outline:0}.btn-lin-inverse{height:2.5rem;background-repeat:no-repeat}.btn-lin-inverse:focus,.btn-lin-inverse:hover{outline:0}.btn-gplus{height:2.5rem;background-repeat:no-repeat}.btn-gplus:focus,.btn-gplus:hover{outline:0}.btn-gplus-inverse{height:2.5rem;background-repeat:no-repeat}.btn-gplus-inverse:focus,.btn-gplus-inverse:hover{outline:0}.btn-tw{height:2.5rem;background-repeat:no-repeat}.btn-tw:focus,.btn-tw:hover{outline:0}.btn-tw-inverse{height:2.5rem;background-repeat:no-repeat}.btn-tw-inverse:focus,.btn-tw-inverse:hover{outline:0}.btn-fbk{height:2.5rem;background-repeat:no-repeat}.btn-fbk:focus,.btn-fbk:hover{outline:0}.btn-fbk-inverse{height:2.5rem;background-repeat:no-repeat}.btn-fbk-inverse:focus,.btn-fbk-inverse:hover{outline:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-right:.4375rem;vertical-align:.21875rem;content:"";border-top:.4375rem solid;border-left:.4375rem solid transparent;border-bottom:0;border-right:.4375rem solid transparent}.dropdown-toggle:empty::after{margin-right:0}.dropdown-menu{position:absolute;top:100%;right:0;z-index:1000;display:none;float:right;min-width:10rem;padding:0 0;margin:-2px 0 0;font-size:1rem;color:#000;text-align:right;list-style:none;background-color:#fff;background-clip:padding-box;border:2px solid #000}.dropdown-menu-left{left:auto;right:0}.dropdown-menu-right{left:0;right:auto}@media (min-width:480px){.dropdown-menu-sm-left{left:auto;right:0}.dropdown-menu-sm-right{left:0;right:auto}}@media (min-width:768px){.dropdown-menu-md-left{left:auto;right:0}.dropdown-menu-md-right{left:0;right:auto}}@media (min-width:980px){.dropdown-menu-lg-left{left:auto;right:0}.dropdown-menu-lg-right{left:0;right:auto}}@media (min-width:1220px){.dropdown-menu-xl-left{left:auto;right:0}.dropdown-menu-xl-right{left:0;right:auto}}@media (min-width:1380px){.dropdown-menu-xxl-left{left:auto;right:0}.dropdown-menu-xxl-right{left:0;right:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:-2px}.dropup .dropdown-toggle::after{display:inline-block;margin-right:.4375rem;vertical-align:.21875rem;content:"";border-top:0;border-left:.4375rem solid transparent;border-bottom:.4375rem solid;border-right:.4375rem solid transparent}.dropup .dropdown-toggle:empty::after{margin-right:0}.dropright .dropdown-menu{top:0;left:auto;right:100%;margin-top:0;margin-right:-2px}.dropright .dropdown-toggle::after{display:inline-block;margin-right:.4375rem;vertical-align:.21875rem;content:"";border-top:.4375rem solid transparent;border-left:0;border-bottom:.4375rem solid transparent;border-right:.4375rem solid}.dropright .dropdown-toggle:empty::after{margin-right:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;left:100%;right:auto;margin-top:0;margin-left:-2px}.dropleft .dropdown-toggle::after{display:inline-block;margin-right:.4375rem;vertical-align:.21875rem;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-left:.4375rem;vertical-align:.21875rem;content:"";border-top:.4375rem solid transparent;border-left:.4375rem solid;border-bottom:.4375rem solid transparent}.dropleft .dropdown-toggle:empty::after{margin-right:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{left:auto;bottom:auto}.dropdown-divider{height:0;margin:.625rem 0;overflow:hidden;border-top:1px solid #eee}.dropdown-item{display:block;width:100%;padding:.625rem .625rem;clear:both;font-weight:400;color:#000;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#fff;text-decoration:none;background-color:#000}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#000}.dropdown-item.disabled,.dropdown-item:disabled{color:#666;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0 .625rem;margin-bottom:0;font-size:.875rem;color:#000;white-space:nowrap}.dropdown-item-text{display:block;padding:.625rem .625rem;color:#000}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-right:-2px}.dropdown-toggle-split{padding-left:.84375rem;padding-right:.84375rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-right:0}.dropleft .dropdown-toggle-split::before{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.46875rem;padding-right:.46875rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.9375rem;padding-right:.9375rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-2px}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-right:-2px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-right:-2px}.input-group-prepend{margin-left:-2px}.input-group-append{margin-right:-2px}.input-group-prepend+.form-control{border-right-color:transparent}.custom-select:focus+.input-group-append,.form-control:focus+.input-group-append{position:relative;z-index:5}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.5rem .625rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#000;text-align:center;white-space:nowrap;background-color:#eee;border:2px solid #ccc}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.8755rem + 4px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.594rem 1.25rem;font-size:1.125rem;line-height:1.5}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.6265rem + 4px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.157rem .625rem;font-size:.875rem;line-height:1.5}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-left:1.5rem}.custom-control{position:relative;display:block;min-height:1.25rem;padding-right:1.875rem;margin-bottom:.625rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-left:1.25rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#f16e00;background-color:#f16e00}.custom-control-input:checked~.custom-control-label::before::before{background-color:#f16e00}.custom-control-input:focus~.custom-control-label::before{outline:dotted 1px #000;box-shadow:none}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#f16e00;border-color:#f16e00}.custom-control-input:disabled~.custom-control-label{color:#767676}.custom-control-input:disabled~.custom-control-label::before{border-color:#ccc}.custom-control-input:disabled:checked~.custom-control-label::before{background-color:#ccc}.custom-control-label{margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:0;right:0;display:block;width:1.25rem;height:1.25rem;content:"";background-color:#fff;border:#666 solid 2px}.custom-control-label::after{position:absolute;top:0;right:0;display:block;width:1.25rem;height:1.25rem;pointer-events:none;content:"";background-repeat:no-repeat;background-position:center center;background-size:1rem}.custom-checkbox .custom-control-input:not(:disabled):checked~.custom-control-label::before{border:2px solid #f16e00}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{top:.4rem;right:.2585rem;width:.8272rem;height:.3619rem;border:3px solid #fff;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-checkbox .custom-control-input:checked:focus~.custom-control-label::before{outline-color:#000}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#f16e00;background-color:#f16e00}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{border:3px solid #fff;border-top:none;border-left:none;border-right:none;-webkit-transform:scaleX(.5) translateY(-.5rem);transform:scaleX(.5) translateY(-.5rem)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#fff;border-color:#fff}.custom-radio .custom-control-input:checked~.custom-control-label::after{border:6px solid #f16e00;border-radius:50%}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::after{border-color:#ccc}.custom-switch{padding-right:4.375rem}.custom-switch .custom-control-input:focus~.custom-control-label::after{outline:1px dotted #fff}.custom-switch .custom-control-label{padding-top:.3125rem}.custom-switch .custom-control-label::before{right:0;width:3.75rem;height:1.875rem;pointer-events:all;background-color:#666;background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:1.975rem;border-radius:0}.custom-switch .custom-control-label::after{top:calc(0rem + 2px);right:2px;width:calc(3.75rem / 2 - 4px);height:calc(1.875rem - 4px);background-color:#fff;border-radius:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch.right{padding-left:4.375rem;padding-right:0}.custom-switch.right .custom-control-label::before{left:0;right:auto}.custom-switch.right .custom-control-label::after{left:calc(1.875rem + 2px);right:auto}.custom-switch .custom-control-input:checked~.custom-control-label::before{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:.25rem}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(-1.875rem);transform:translateX(-1.875rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#ccc}.custom-switch .custom-control-input:disabled~.custom-control-label::before{background-color:#ccc}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 4px);padding:.4375rem .5rem .4375rem 1.5rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:700;line-height:1.25;color:#000;vertical-align:middle;background:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat left .5rem center/8px 10px;background-color:#fff;border:2px solid #ccc;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#000;outline:0;box-shadow:none}.custom-select:focus::-ms-value{color:#000;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-left:.5rem;background-image:none}.custom-select:disabled{color:#999;background-color:#eee}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.6265rem + 4px);padding-top:.157rem;padding-bottom:.157rem;padding-right:.625rem;font-size:.875rem}.custom-select-lg{height:calc(2.8755rem + 4px);padding-top:.594rem;padding-bottom:.594rem;padding-right:1.25rem;font-size:1.125rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 4px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 4px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#000;box-shadow:none}.custom-file-input:disabled~.custom-file-label{background-color:#eee}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;left:0;right:0;z-index:1;height:calc(2.25rem + 4px);padding:.5rem .625rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:700;line-height:1.25;color:#000;background-color:#fff;border:2px solid #ccc}.custom-file-label::after{position:absolute;top:0;left:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.5rem .625rem;line-height:1.25;color:#000;content:"Browse";background-color:#eee;border-right:inherit}.custom-range{width:100%;height:calc(1rem + .25rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .125rem #000}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .125rem #000}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .125rem #000}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#000;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#f16e00}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#999;border-color:transparent}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#000;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#f16e00}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#999;border-color:transparent}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-left:.125rem;margin-right:.125rem;background-color:#000;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#f16e00}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#999}.custom-range::-ms-fill-upper{margin-left:15px;background-color:#999}.custom-range:disabled::-webkit-slider-thumb{background-color:#ccc}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#ccc}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#ccc}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-right:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.625rem 1.25rem;font-weight:700}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#666;pointer-events:none;cursor:default}.nav-tabs{border-bottom:2px solid #000}.nav-tabs .nav-item{margin-bottom:-2px}.nav-tabs .nav-link{padding:.625rem calc(1.25rem - 2px);line-height:1rem;border:2px solid transparent;border-bottom-width:0}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{color:#fff;background-color:#000;border-color:#000}.nav-tabs .nav-link.disabled{color:#666;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#000;background-color:#fff;border-color:#000}.nav-tabs .dropdown-menu{margin-top:-2px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#000}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:0 0;font-weight:700}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding-left:0;padding-right:0}.navbar-brand{display:inline-block;-ms-flex-item-align:end;align-self:flex-end;padding-top:0;padding-bottom:0;margin:.625rem .3125rem;font-size:.875rem;font-weight:700;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand+.navbar-brand{margin-left:0;margin-right:1.25rem}.navbar-brand:focus{outline:1px dotted #fff;outline-offset:.625rem}.navbar-brand img{-ms-flex-wrap:wrap;flex-wrap:wrap;width:1.875rem;height:1.875rem;margin-top:0;margin-bottom:.25rem}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-right:0;margin-top:auto;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-top:.875rem;padding-left:.625rem;padding-bottom:.875rem;padding-right:.625rem;margin-top:0}.navbar-nav .nav-link.active::before{display:none}.navbar-nav .nav-link.icon{padding:.78125rem .625rem;margin-top:0}.navbar-nav .nav-link[class^=svg-]{margin:.625rem}.navbar-nav .nav-link[role=menuitem]::before{float:left;margin-left:1rem;font-family:icon-orange;font-size:1rem;font-weight:400;color:#fff;content:"\e93e"}.navbar-nav .nav-link:focus{outline-offset:.625rem}.navbar-nav .dropdown-menu{position:static;top:2rem;float:none}.navbar-nav .nav-item{margin-right:0;font-size:1.125rem;border-top:1px solid #333}.navbar-nav .dropdown{padding:0}.navbar-nav .dropdown .dropdown-item,.navbar-nav .dropdown .dropdown-toggle{padding:.875rem .625rem .875rem 0}.navbar-nav .dropdown.show .dropdown-toggle::after{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-nav .dropdown .dropdown-item{color:#fff;white-space:normal;background-color:#000;border-top:1px solid #333}.navbar-nav .dropdown .dropdown-item:focus{color:#f16e00}.navbar-text{display:inline-block;padding-top:.625rem;padding-bottom:.625rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-item-align:end;align-self:flex-end}.navbar-collapse .navbar-nav{-ms-flex-align:stretch;align-items:stretch}.navbar-toggler{padding:.5rem .5rem;margin:.3125rem 0;font-size:1rem;line-height:1;background-color:transparent;border:2px solid transparent}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none;background-color:#fff}.navbar-toggler:focus .navbar-toggler-icon,.navbar-toggler:hover .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-toggler:active{background-color:#f16e00}.navbar-toggler:active .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-toggler:focus{outline:0}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.25rem;height:1.25rem;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (min-width:480px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-sm .navbar-brand{margin:0 0 0 .625rem}.navbar-expand-sm .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-sm.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-sm.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-sm .navbar-nav .dropdown-item.active,.navbar-expand-sm .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-sm .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-sm .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-sm .navbar-nav .nav-link{padding-top:0;padding-left:0;padding-bottom:0;padding-right:0;margin-right:1.25rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:10px;padding-right:10px}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-md .navbar-brand{margin:0 0 0 .625rem}.navbar-expand-md .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-md.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-md.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-md .navbar-nav .dropdown-item.active,.navbar-expand-md .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-md .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-md .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-md .navbar-nav .nav-link{padding-top:0;padding-left:0;padding-bottom:0;padding-right:0;margin-right:1.25rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:10px;padding-right:10px}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:980px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-lg .navbar-brand{margin:0 0 0 .625rem}.navbar-expand-lg .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-lg.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-lg.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-lg .navbar-nav .dropdown-item.active,.navbar-expand-lg .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-lg .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-lg .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-lg .navbar-nav .nav-link{padding-top:0;padding-left:0;padding-bottom:0;padding-right:0;margin-right:1.25rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:10px;padding-right:10px}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1220px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-xl .navbar-brand{margin:0 0 0 .625rem}.navbar-expand-xl .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-xl.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-xl.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-xl .navbar-nav .dropdown-item.active,.navbar-expand-xl .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-xl .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-xl .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-xl .navbar-nav .nav-link{padding-top:0;padding-left:0;padding-bottom:0;padding-right:0;margin-right:1.25rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:10px;padding-right:10px}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1380px){.navbar-expand-xxl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-xxl .navbar-brand{margin:0 0 0 .625rem}.navbar-expand-xxl .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-xxl.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-xxl.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-xxl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-xxl .navbar-nav .dropdown-item.active,.navbar-expand-xxl .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-xxl .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-xxl .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-xxl .navbar-nav .nav-link{padding-top:0;padding-left:0;padding-bottom:0;padding-right:0;margin-right:1.25rem}.navbar-expand-xxl>.container,.navbar-expand-xxl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:10px;padding-right:10px}.navbar-expand-xxl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand .navbar-brand{margin:0 0 0 .625rem}.navbar-expand .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand .navbar-nav .dropdown-item.active,.navbar-expand .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand .navbar-nav .nav-link{padding-top:0;padding-left:0;padding-bottom:0;padding-right:0;margin-right:1.25rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:10px;padding-right:10px}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:#000}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:#f16e00}.navbar-light .navbar-nav .nav-link{color:#000}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:#f16e00}.navbar-light .navbar-nav .nav-link.disabled{color:#ddd}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:#f16e00}.navbar-light .navbar-toggler{color:#000;border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#000}.navbar-light .navbar-text a{color:#f16e00}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:#f16e00}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#f16e00}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#f16e00}.navbar-dark .navbar-nav .nav-link.disabled{color:#ddd}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#f16e00}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#f16e00}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#f16e00}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:2px solid #000}.card>hr{margin-left:0;margin-right:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem;color:#000}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-right:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;font-weight:700;color:#fff;background-color:#000;border-bottom:2px solid #000}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:#fff;border-top:2px solid #000}.card-header-tabs{margin-left:-.625rem;margin-bottom:-.75rem;margin-right:-.625rem;border-bottom:0}.card-header-pills{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{position:absolute;top:0;left:0;bottom:0;right:0;padding:1.25rem}.card-img{width:100%}.card-img-top{width:100%}.card-img-bottom{width:100%}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:2.5rem}@media (min-width:480px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-left:-2.5rem;margin-right:-2.5rem}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-left:2.5rem;margin-bottom:0;margin-right:2.5rem}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:10px}@media (min-width:480px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-right:0;border-right:0}}.card-columns .card{margin-bottom:2.5rem}@media (min-width:480px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card{margin-bottom:0;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc}.accordion .card~.card{border-top:0}.accordion .card-header{padding:0;background-color:#fff;border:0}.accordion .card-header,.accordion .card-header h5{margin:0;font-size:1rem;font-weight:700;line-height:1}.accordion .card-header a,.accordion .card-header button{position:relative;display:block;width:100%;padding:1rem 0 1rem 2.125rem;line-height:1.125rem;text-align:right;border:0}.accordion .card-header a::after,.accordion .card-header button::after{position:absolute;top:1.3125rem;left:.625rem;width:.875rem;height:.4375rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e")}.accordion .card-header a[aria-expanded=true]::after,.accordion .card-header button[aria-expanded=true]::after{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.accordion .card-body{padding:0 0 0 1.5rem;margin:0 0 1.25rem}@media (max-width:767.98px){.accordion .card{border-top-width:2px;border-bottom-width:2px}.accordion .card~.card{border-top:0}}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.625rem 0;font-size:.875rem;font-weight:700;line-height:1.428571;list-style:none;background-color:#fff}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-left:.625rem;padding-right:.625rem;font-family:icon-orange;font-size:.625rem;line-height:1;color:#000;content:""}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#f16e00}.pagination{display:-ms-flexbox;display:flex;padding-right:0;list-style:none}.page-link{position:relative;display:block;min-width:2.5rem;min-height:2.5rem;padding:.625rem .8rem;margin-right:0;font-weight:700;line-height:1;color:#000;background-color:#fff;border:2px solid transparent}.page-link:focus,.page-link:hover{z-index:2;color:#000;text-decoration:none;background-color:#fff;border-color:#ccc}.page-link:focus span,.page-link:hover span{color:#000}.page-link:focus{z-index:2;outline:0;box-shadow:none}.page-link span{color:#fff}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item.presentation{padding:.625rem 0;font-weight:700}.page-item.presentation+.page-item .page-link,.page-item:first-child .page-link{margin-right:0;border-color:#000}.page-item.presentation+.page-item .page-link::before,.page-item:first-child .page-link::before{position:absolute;top:.6875rem;right:.8125rem;width:.5625rem;height:.875rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e");background-repeat:no-repeat}.page-item.presentation+.page-item .page-link:focus::before,.page-item.presentation+.page-item .page-link:hover::before,.page-item:first-child .page-link:focus::before,.page-item:first-child .page-link:hover::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item.presentation+.page-item .page-link.has-label,.page-item:first-child .page-link.has-label{padding-left:1.125rem;padding-right:2rem}.page-item.presentation+.page-item .page-link:focus,.page-item.presentation+.page-item .page-link:hover,.page-item:first-child .page-link:focus,.page-item:first-child .page-link:hover,.page-item:last-child .page-link:focus,.page-item:last-child .page-link:hover{color:#fff;background-color:#000;border-color:#000}.page-item.presentation+.page-item .page-link:active,.page-item:first-child .page-link:active,.page-item:last-child .page-link:active{z-index:1;color:#fff;background-color:#f16e00;border-color:#f16e00}.page-item:last-child .page-link{border-color:#000}.page-item:last-child .page-link::before{position:absolute;top:.6875rem;left:.8125rem;width:.5625rem;height:.875rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e");background-repeat:no-repeat}.page-item:last-child .page-link:focus::before,.page-item:last-child .page-link:hover::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item:last-child .page-link.has-label{padding-left:2rem;padding-right:1.125rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#000;border-color:#000}.page-item .page-link:active{z-index:1;color:#fff;background-color:#f16e00;border-color:#f16e00}.page-item.active:first-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item.active:last-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item.disabled .page-link{color:#ccc;pointer-events:none;cursor:auto;background-color:#fff;border-color:#ccc}.page-item.disabled:first-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e")}.page-item.disabled:last-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e")}.page-item+.page-item{margin-right:.625rem}.pagination-lg .page-link{min-width:3.125rem;min-height:3.125rem;padding:.875rem 1.125rem;font-size:1.125rem;line-height:1.111111}.pagination-lg .page-item:first-child .page-link::before,.pagination-lg .page-item:last-child .page-link::before{top:1.03125rem}.pagination-sm .page-link{min-width:1.875rem;min-height:1.875rem;padding:.375rem .625rem;font-size:.875rem;line-height:1.428571}.pagination-sm .page-item:first-child .page-link::before,.pagination-sm .page-item:last-child .page-link::before{top:.53125rem}.badge{display:inline-block;padding:.1875rem .625rem;font-size:.875rem;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-left:.625rem;padding-right:.625rem}.badge-primary{color:#fff;background-color:#f16e00}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#be5700}.badge-secondary{color:#fff;background-color:#000}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#000}.badge-success{color:#000;background-color:#32c832}a.badge-success:focus,a.badge-success:hover{color:#000;background-color:#289f28}.badge-info{color:#000;background-color:#527edb}a.badge-info:focus,a.badge-info:hover{color:#000;background-color:#2b60cf}.badge-warning{color:#000;background-color:#fc0}a.badge-warning:focus,a.badge-warning:hover{color:#000;background-color:#cca300}.badge-danger{color:#fff;background-color:#cd3c14}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#9f2e0f}.badge-light{color:#000;background-color:#ddd}a.badge-light:focus,a.badge-light:hover{color:#000;background-color:#c4c4c4}.badge-dark{color:#fff;background-color:#000}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#000}.badge[href]:focus{outline-color:#fff;outline-offset:-1px}.badge[href]:focus.badge-light{outline-color:#000}.jumbotron{padding:2.5rem 1.25rem;margin-bottom:2.5rem;color:#000;background-color:#fff}@media (min-width:480px){.jumbotron{padding:5rem 2.5rem}}.jumbotron-fluid{padding-left:0;padding-right:0}.alert{position:relative;padding:.8125rem 1.25rem;margin-bottom:1.25rem;border:0 solid transparent}.alert .alert-icon{position:absolute;top:.625rem}.alert .alert-icon::after{width:1.76rem;height:1.76rem;background-repeat:no-repeat;background-size:cover}.alert-sm{padding:.3125rem 1.25rem}.alert-sm .alert-icon{top:.4375rem}.alert-sm .alert-icon::after{width:1rem;height:1rem}.alert-lg{padding:1rem 1.25rem}.alert-lg .alert-icon{top:.625rem}.alert-lg .alert-icon::after{width:2rem;height:2rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-left:4rem}.alert-dismissible .close{position:absolute;top:0;left:0;padding:.8125rem 1.25rem;line-height:.8125rem;color:inherit}.alert-primary{color:#000;background-color:#f16e00;border-color:#f16e00}.alert-primary hr{border-top-color:#d86200}.alert-primary .alert-link{color:#000}.alert-secondary{color:#fff;background-color:#000;border-color:#000}.alert-secondary hr{border-top-color:#000}.alert-secondary .alert-link{color:#e6e6e6}.alert-success{color:#000;background-color:#32c832;border-color:#32c832}.alert-success hr{border-top-color:#2db42d}.alert-success .alert-link{color:#000}.alert-info{color:#000;background-color:#527edb;border-color:#527edb}.alert-info hr{border-top-color:#3d6ed7}.alert-info .alert-link{color:#000}.alert-warning{color:#000;background-color:#fc0;border-color:#fc0}.alert-warning hr{border-top-color:#e6b800}.alert-warning .alert-link{color:#000}.alert-danger{color:#fff;background-color:#cd3c14;border-color:#cd3c14}.alert-danger hr{border-top-color:#b63512}.alert-danger .alert-link{color:#e6e6e6}.alert-light{color:#000;background-color:#ddd;border-color:#ddd}.alert-light hr{border-top-color:#d0d0d0}.alert-light .alert-link{color:#000}.alert-dark{color:#fff;background-color:#000;border-color:#000}.alert-dark hr{border-top-color:#000}.alert-dark .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:1.25rem 0}to{background-position:100% 0}}@keyframes progress-bar-stripes{from{background-position:1.25rem 0}to{background-position:100% 0}}.progress{display:-ms-flexbox;display:flex;height:1.25rem;overflow:hidden;font-size:1rem;background-color:#ccc}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#000;text-align:center;white-space:nowrap;background-color:#f16e00;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}@media (max-width:979.98px){.progress{width:100%;height:.625rem;line-height:.625rem}.progress-bar{font-size:.875rem;line-height:.625rem}}.progress-bar-striped{background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1.25rem 1.25rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-right:0;margin-bottom:0}.list-group-item-action{width:100%;color:#000;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#f16e00;text-decoration:none;background-color:#f6f6f6}.list-group-item-action:active{color:#000;background-color:#eee}.list-group-item{position:relative;display:block;padding:.625rem .625rem;margin-bottom:-2px;color:#000;background-color:#fff;border:2px solid #000}.list-group-item:last-child{margin-bottom:0}.list-group-item.disabled,.list-group-item:disabled{color:#ccc;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#000;border-color:#000}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-left:-2px;margin-bottom:0}.list-group-horizontal .list-group-item:last-child{margin-left:0}@media (min-width:480px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-left:-2px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:last-child{margin-left:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-left:-2px;margin-bottom:0}.list-group-horizontal-md .list-group-item:last-child{margin-left:0}}@media (min-width:980px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-left:-2px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:last-child{margin-left:0}}@media (min-width:1220px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-left:-2px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:last-child{margin-left:0}}@media (min-width:1380px){.list-group-horizontal-xxl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xxl .list-group-item{margin-left:-2px;margin-bottom:0}.list-group-horizontal-xxl .list-group-item:last-child{margin-left:0}}.list-group-flush .list-group-item{border-left:0;border-right:0}.list-group-flush .list-group-item:last-child{margin-bottom:-2px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#000;background-color:#f16e00}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#000;background-color:#d86200}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-secondary{color:#fff;background-color:#000}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#fff;background-color:#000}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-success{color:#000;background-color:#32c832}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#000;background-color:#2db42d}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-info{color:#000;background-color:#527edb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#000;background-color:#3d6ed7}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-warning{color:#000;background-color:#fc0}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#000;background-color:#e6b800}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-danger{color:#000;background-color:#cd3c14}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#000;background-color:#b63512}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-light{color:#000;background-color:#ddd}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#000;background-color:#d0d0d0}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-dark{color:#fff;background-color:#000}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#fff;background-color:#000}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.close{float:left;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:1}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:1}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:none;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0}.toast:not(:last-child){margin-bottom:.625rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.3125rem .625rem;color:#999;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.625rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.625rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1.25rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1.25rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1.25rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1.25rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;color:#000;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:2px solid #000;outline:0}.modal-backdrop{position:fixed;top:0;right:0;z-index:1040;width:100vw;height:100vh;background-color:#333}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:.625rem .625rem;border-bottom:2px solid #000}.modal-header .close{padding:.625rem .625rem;margin:-.625rem auto -.625rem -.625rem}.modal-title{margin-bottom:0;line-height:1.25}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:.625rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.625rem;border-top:2px solid #000}.modal-footer>:not(:first-child){margin-right:.25rem}.modal-footer>:not(:last-child){margin-left:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:480px){.modal-dialog{max-width:700px;margin:1.875rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.75rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.75rem)}.modal-dialog-centered{min-height:calc(100% - 3.75rem)}.modal-dialog-centered::before{height:calc(100vh - 3.75rem)}.modal-sm{max-width:300px}}@media (min-width:980px){.modal-lg,.modal-xl{max-width:700px}}@media (min-width:1220px){.modal-xl{max-width:700px}}.tooltip{position:absolute;z-index:1070;display:block;margin:.3125rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.25;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;font-weight:700;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.625rem;height:.625rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.625rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.625rem .3125rem 0;border-top-color:#ddd}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .625rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{right:0;width:.625rem;height:.625rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{left:0;border-width:.3125rem 0 .3125rem .625rem;border-left-color:#ddd}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.625rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .3125rem .625rem;border-bottom-color:#ddd}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .625rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{left:0;width:.625rem;height:.625rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{right:0;border-width:.3125rem .625rem .3125rem 0;border-right-color:#ddd}.tooltip-inner{max-width:200px;padding:1.25rem 1.25rem;color:#000;text-align:center;background-color:#ddd}.popover{position:absolute;top:0;right:0;z-index:1060;display:block;max-width:276px;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.25;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;font-weight:700;word-wrap:break-word;background-color:#ddd;background-clip:padding-box;border:2px solid #ddd}.popover .arrow{position:absolute;display:block;width:.625rem;height:.3125rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.3125rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.3125rem + 2px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.3125rem .3125rem 0;border-top-color:#ddd}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:2px;border-width:.3125rem .3125rem 0;border-top-color:#ddd}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-right:.3125rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{right:calc((.3125rem + 2px) * -1);width:.3125rem;height:.625rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{right:0;border-width:.3125rem 0 .3125rem .3125rem;border-left-color:#ddd}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{right:2px;border-width:.3125rem 0 .3125rem .3125rem;border-left-color:#ddd}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.3125rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.3125rem + 2px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .3125rem .3125rem .3125rem;border-bottom-color:#ddd}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:2px;border-width:0 .3125rem .3125rem .3125rem;border-bottom-color:#ddd}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;right:50%;display:block;width:.625rem;margin-right:-.3125rem;content:"";border-bottom:2px solid #ddd}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-left:.3125rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{left:calc((.3125rem + 2px) * -1);width:.3125rem;height:.625rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{left:0;border-width:.3125rem .3125rem .3125rem 0;border-right-color:#ddd}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{left:2px;border-width:.3125rem .3125rem .3125rem 0;border-right-color:#ddd}.popover-header{padding:.625rem .625rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#ddd;border-bottom:2px solid #d0d0d0}.popover-header:empty{display:none}.popover-body{padding:.625rem .625rem;color:#000}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:right;width:100%;margin-left:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(100%);transform:translateX(100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:1.875rem;color:#000;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#000;text-decoration:none;outline:2px dotted #000;opacity:.9}.carousel-control-prev{right:0}.carousel-control-next{left:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;left:0;bottom:0;right:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-right:0;margin-left:1.875rem;margin-right:1.875rem;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-left:3px;margin-right:3px;text-indent:-999px;cursor:pointer;background-color:#f16e00;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;left:15%;bottom:20px;right:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#000;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-left-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#f16e00!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#be5700!important}.bg-secondary{background-color:#000!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#000!important}.bg-success{background-color:#32c832!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#289f28!important}.bg-info{background-color:#527edb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#2b60cf!important}.bg-warning{background-color:#fc0!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#cca300!important}.bg-danger{background-color:#cd3c14!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#9f2e0f!important}.bg-light{background-color:#ddd!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#c4c4c4!important}.bg-dark{background-color:#000!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#000!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:2px solid #000!important}.border-top{border-top:2px solid #000!important}.border-right{border-left:2px solid #000!important}.border-bottom{border-bottom:2px solid #000!important}.border-left{border-right:2px solid #000!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-left:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-right:0!important}.border-primary{border-color:#f16e00!important}.border-secondary{border-color:#000!important}.border-success{border-color:#32c832!important}.border-info{border-color:#527edb!important}.border-warning{border-color:#fc0!important}.border-danger{border-color:#cd3c14!important}.border-light{border-color:#ddd!important}.border-dark{border-color:#000!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-right-radius:.25rem!important;border-top-left-radius:.25rem!important}.rounded-right{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-bottom{border-bottom-left-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-left{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:480px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:980px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1220px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1380px){.d-xxl-none{display:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:-ms-flexbox!important;display:flex!important}.d-xxl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;right:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:480px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:980px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1220px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1380px){.flex-xxl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xxl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xxl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xxl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xxl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xxl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xxl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xxl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xxl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xxl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xxl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xxl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xxl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xxl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xxl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xxl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xxl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xxl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xxl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xxl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xxl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xxl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xxl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xxl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xxl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xxl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xxl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xxl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xxl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xxl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xxl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xxl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xxl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:right!important}.float-right{float:left!important}.float-none{float:none!important}@media (min-width:480px){.float-sm-left{float:right!important}.float-sm-right{float:left!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:right!important}.float-md-right{float:left!important}.float-md-none{float:none!important}}@media (min-width:980px){.float-lg-left{float:right!important}.float-lg-right{float:left!important}.float-lg-none{float:none!important}}@media (min-width:1220px){.float-xl-left{float:right!important}.float-xl-right{float:left!important}.float-xl-none{float:none!important}}@media (min-width:1380px){.float-xxl-left{float:right!important}.float-xxl-right{float:left!important}.float-xxl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;left:0;right:0;z-index:1030}.fixed-bottom{position:fixed;left:0;bottom:0;right:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-left:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-right:0!important}.m-1{margin:.3125rem!important}.mt-1,.my-1{margin-top:.3125rem!important}.mr-1,.mx-1{margin-left:.3125rem!important}.mb-1,.my-1{margin-bottom:.3125rem!important}.ml-1,.mx-1{margin-right:.3125rem!important}.m-2{margin:.625rem!important}.mt-2,.my-2{margin-top:.625rem!important}.mr-2,.mx-2{margin-left:.625rem!important}.mb-2,.my-2{margin-bottom:.625rem!important}.ml-2,.mx-2{margin-right:.625rem!important}.m-3{margin:1.25rem!important}.mt-3,.my-3{margin-top:1.25rem!important}.mr-3,.mx-3{margin-left:1.25rem!important}.mb-3,.my-3{margin-bottom:1.25rem!important}.ml-3,.mx-3{margin-right:1.25rem!important}.m-4{margin:1.875rem!important}.mt-4,.my-4{margin-top:1.875rem!important}.mr-4,.mx-4{margin-left:1.875rem!important}.mb-4,.my-4{margin-bottom:1.875rem!important}.ml-4,.mx-4{margin-right:1.875rem!important}.m-5{margin:3.75rem!important}.mt-5,.my-5{margin-top:3.75rem!important}.mr-5,.mx-5{margin-left:3.75rem!important}.mb-5,.my-5{margin-bottom:3.75rem!important}.ml-5,.mx-5{margin-right:3.75rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-left:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-right:0!important}.p-1{padding:.3125rem!important}.pt-1,.py-1{padding-top:.3125rem!important}.pr-1,.px-1{padding-left:.3125rem!important}.pb-1,.py-1{padding-bottom:.3125rem!important}.pl-1,.px-1{padding-right:.3125rem!important}.p-2{padding:.625rem!important}.pt-2,.py-2{padding-top:.625rem!important}.pr-2,.px-2{padding-left:.625rem!important}.pb-2,.py-2{padding-bottom:.625rem!important}.pl-2,.px-2{padding-right:.625rem!important}.p-3{padding:1.25rem!important}.pt-3,.py-3{padding-top:1.25rem!important}.pr-3,.px-3{padding-left:1.25rem!important}.pb-3,.py-3{padding-bottom:1.25rem!important}.pl-3,.px-3{padding-right:1.25rem!important}.p-4{padding:1.875rem!important}.pt-4,.py-4{padding-top:1.875rem!important}.pr-4,.px-4{padding-left:1.875rem!important}.pb-4,.py-4{padding-bottom:1.875rem!important}.pl-4,.px-4{padding-right:1.875rem!important}.p-5{padding:3.75rem!important}.pt-5,.py-5{padding-top:3.75rem!important}.pr-5,.px-5{padding-left:3.75rem!important}.pb-5,.py-5{padding-bottom:3.75rem!important}.pl-5,.px-5{padding-right:3.75rem!important}.m-n1{margin:-.3125rem!important}.mt-n1,.my-n1{margin-top:-.3125rem!important}.mr-n1,.mx-n1{margin-left:-.3125rem!important}.mb-n1,.my-n1{margin-bottom:-.3125rem!important}.ml-n1,.mx-n1{margin-right:-.3125rem!important}.m-n2{margin:-.625rem!important}.mt-n2,.my-n2{margin-top:-.625rem!important}.mr-n2,.mx-n2{margin-left:-.625rem!important}.mb-n2,.my-n2{margin-bottom:-.625rem!important}.ml-n2,.mx-n2{margin-right:-.625rem!important}.m-n3{margin:-1.25rem!important}.mt-n3,.my-n3{margin-top:-1.25rem!important}.mr-n3,.mx-n3{margin-left:-1.25rem!important}.mb-n3,.my-n3{margin-bottom:-1.25rem!important}.ml-n3,.mx-n3{margin-right:-1.25rem!important}.m-n4{margin:-1.875rem!important}.mt-n4,.my-n4{margin-top:-1.875rem!important}.mr-n4,.mx-n4{margin-left:-1.875rem!important}.mb-n4,.my-n4{margin-bottom:-1.875rem!important}.ml-n4,.mx-n4{margin-right:-1.875rem!important}.m-n5{margin:-3.75rem!important}.mt-n5,.my-n5{margin-top:-3.75rem!important}.mr-n5,.mx-n5{margin-left:-3.75rem!important}.mb-n5,.my-n5{margin-bottom:-3.75rem!important}.ml-n5,.mx-n5{margin-right:-3.75rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-left:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-right:auto!important}@media (min-width:480px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-left:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-right:0!important}.m-sm-1{margin:.3125rem!important}.mt-sm-1,.my-sm-1{margin-top:.3125rem!important}.mr-sm-1,.mx-sm-1{margin-left:.3125rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.3125rem!important}.ml-sm-1,.mx-sm-1{margin-right:.3125rem!important}.m-sm-2{margin:.625rem!important}.mt-sm-2,.my-sm-2{margin-top:.625rem!important}.mr-sm-2,.mx-sm-2{margin-left:.625rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.625rem!important}.ml-sm-2,.mx-sm-2{margin-right:.625rem!important}.m-sm-3{margin:1.25rem!important}.mt-sm-3,.my-sm-3{margin-top:1.25rem!important}.mr-sm-3,.mx-sm-3{margin-left:1.25rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1.25rem!important}.ml-sm-3,.mx-sm-3{margin-right:1.25rem!important}.m-sm-4{margin:1.875rem!important}.mt-sm-4,.my-sm-4{margin-top:1.875rem!important}.mr-sm-4,.mx-sm-4{margin-left:1.875rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.875rem!important}.ml-sm-4,.mx-sm-4{margin-right:1.875rem!important}.m-sm-5{margin:3.75rem!important}.mt-sm-5,.my-sm-5{margin-top:3.75rem!important}.mr-sm-5,.mx-sm-5{margin-left:3.75rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3.75rem!important}.ml-sm-5,.mx-sm-5{margin-right:3.75rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-left:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-right:0!important}.p-sm-1{padding:.3125rem!important}.pt-sm-1,.py-sm-1{padding-top:.3125rem!important}.pr-sm-1,.px-sm-1{padding-left:.3125rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.3125rem!important}.pl-sm-1,.px-sm-1{padding-right:.3125rem!important}.p-sm-2{padding:.625rem!important}.pt-sm-2,.py-sm-2{padding-top:.625rem!important}.pr-sm-2,.px-sm-2{padding-left:.625rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.625rem!important}.pl-sm-2,.px-sm-2{padding-right:.625rem!important}.p-sm-3{padding:1.25rem!important}.pt-sm-3,.py-sm-3{padding-top:1.25rem!important}.pr-sm-3,.px-sm-3{padding-left:1.25rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1.25rem!important}.pl-sm-3,.px-sm-3{padding-right:1.25rem!important}.p-sm-4{padding:1.875rem!important}.pt-sm-4,.py-sm-4{padding-top:1.875rem!important}.pr-sm-4,.px-sm-4{padding-left:1.875rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.875rem!important}.pl-sm-4,.px-sm-4{padding-right:1.875rem!important}.p-sm-5{padding:3.75rem!important}.pt-sm-5,.py-sm-5{padding-top:3.75rem!important}.pr-sm-5,.px-sm-5{padding-left:3.75rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3.75rem!important}.pl-sm-5,.px-sm-5{padding-right:3.75rem!important}.m-sm-n1{margin:-.3125rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.3125rem!important}.mr-sm-n1,.mx-sm-n1{margin-left:-.3125rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.3125rem!important}.ml-sm-n1,.mx-sm-n1{margin-right:-.3125rem!important}.m-sm-n2{margin:-.625rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.625rem!important}.mr-sm-n2,.mx-sm-n2{margin-left:-.625rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.625rem!important}.ml-sm-n2,.mx-sm-n2{margin-right:-.625rem!important}.m-sm-n3{margin:-1.25rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1.25rem!important}.mr-sm-n3,.mx-sm-n3{margin-left:-1.25rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1.25rem!important}.ml-sm-n3,.mx-sm-n3{margin-right:-1.25rem!important}.m-sm-n4{margin:-1.875rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.875rem!important}.mr-sm-n4,.mx-sm-n4{margin-left:-1.875rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.875rem!important}.ml-sm-n4,.mx-sm-n4{margin-right:-1.875rem!important}.m-sm-n5{margin:-3.75rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3.75rem!important}.mr-sm-n5,.mx-sm-n5{margin-left:-3.75rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3.75rem!important}.ml-sm-n5,.mx-sm-n5{margin-right:-3.75rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-left:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-right:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-left:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-right:0!important}.m-md-1{margin:.3125rem!important}.mt-md-1,.my-md-1{margin-top:.3125rem!important}.mr-md-1,.mx-md-1{margin-left:.3125rem!important}.mb-md-1,.my-md-1{margin-bottom:.3125rem!important}.ml-md-1,.mx-md-1{margin-right:.3125rem!important}.m-md-2{margin:.625rem!important}.mt-md-2,.my-md-2{margin-top:.625rem!important}.mr-md-2,.mx-md-2{margin-left:.625rem!important}.mb-md-2,.my-md-2{margin-bottom:.625rem!important}.ml-md-2,.mx-md-2{margin-right:.625rem!important}.m-md-3{margin:1.25rem!important}.mt-md-3,.my-md-3{margin-top:1.25rem!important}.mr-md-3,.mx-md-3{margin-left:1.25rem!important}.mb-md-3,.my-md-3{margin-bottom:1.25rem!important}.ml-md-3,.mx-md-3{margin-right:1.25rem!important}.m-md-4{margin:1.875rem!important}.mt-md-4,.my-md-4{margin-top:1.875rem!important}.mr-md-4,.mx-md-4{margin-left:1.875rem!important}.mb-md-4,.my-md-4{margin-bottom:1.875rem!important}.ml-md-4,.mx-md-4{margin-right:1.875rem!important}.m-md-5{margin:3.75rem!important}.mt-md-5,.my-md-5{margin-top:3.75rem!important}.mr-md-5,.mx-md-5{margin-left:3.75rem!important}.mb-md-5,.my-md-5{margin-bottom:3.75rem!important}.ml-md-5,.mx-md-5{margin-right:3.75rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-left:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-right:0!important}.p-md-1{padding:.3125rem!important}.pt-md-1,.py-md-1{padding-top:.3125rem!important}.pr-md-1,.px-md-1{padding-left:.3125rem!important}.pb-md-1,.py-md-1{padding-bottom:.3125rem!important}.pl-md-1,.px-md-1{padding-right:.3125rem!important}.p-md-2{padding:.625rem!important}.pt-md-2,.py-md-2{padding-top:.625rem!important}.pr-md-2,.px-md-2{padding-left:.625rem!important}.pb-md-2,.py-md-2{padding-bottom:.625rem!important}.pl-md-2,.px-md-2{padding-right:.625rem!important}.p-md-3{padding:1.25rem!important}.pt-md-3,.py-md-3{padding-top:1.25rem!important}.pr-md-3,.px-md-3{padding-left:1.25rem!important}.pb-md-3,.py-md-3{padding-bottom:1.25rem!important}.pl-md-3,.px-md-3{padding-right:1.25rem!important}.p-md-4{padding:1.875rem!important}.pt-md-4,.py-md-4{padding-top:1.875rem!important}.pr-md-4,.px-md-4{padding-left:1.875rem!important}.pb-md-4,.py-md-4{padding-bottom:1.875rem!important}.pl-md-4,.px-md-4{padding-right:1.875rem!important}.p-md-5{padding:3.75rem!important}.pt-md-5,.py-md-5{padding-top:3.75rem!important}.pr-md-5,.px-md-5{padding-left:3.75rem!important}.pb-md-5,.py-md-5{padding-bottom:3.75rem!important}.pl-md-5,.px-md-5{padding-right:3.75rem!important}.m-md-n1{margin:-.3125rem!important}.mt-md-n1,.my-md-n1{margin-top:-.3125rem!important}.mr-md-n1,.mx-md-n1{margin-left:-.3125rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.3125rem!important}.ml-md-n1,.mx-md-n1{margin-right:-.3125rem!important}.m-md-n2{margin:-.625rem!important}.mt-md-n2,.my-md-n2{margin-top:-.625rem!important}.mr-md-n2,.mx-md-n2{margin-left:-.625rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.625rem!important}.ml-md-n2,.mx-md-n2{margin-right:-.625rem!important}.m-md-n3{margin:-1.25rem!important}.mt-md-n3,.my-md-n3{margin-top:-1.25rem!important}.mr-md-n3,.mx-md-n3{margin-left:-1.25rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1.25rem!important}.ml-md-n3,.mx-md-n3{margin-right:-1.25rem!important}.m-md-n4{margin:-1.875rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.875rem!important}.mr-md-n4,.mx-md-n4{margin-left:-1.875rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.875rem!important}.ml-md-n4,.mx-md-n4{margin-right:-1.875rem!important}.m-md-n5{margin:-3.75rem!important}.mt-md-n5,.my-md-n5{margin-top:-3.75rem!important}.mr-md-n5,.mx-md-n5{margin-left:-3.75rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3.75rem!important}.ml-md-n5,.mx-md-n5{margin-right:-3.75rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-left:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-right:auto!important}}@media (min-width:980px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-left:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-right:0!important}.m-lg-1{margin:.3125rem!important}.mt-lg-1,.my-lg-1{margin-top:.3125rem!important}.mr-lg-1,.mx-lg-1{margin-left:.3125rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.3125rem!important}.ml-lg-1,.mx-lg-1{margin-right:.3125rem!important}.m-lg-2{margin:.625rem!important}.mt-lg-2,.my-lg-2{margin-top:.625rem!important}.mr-lg-2,.mx-lg-2{margin-left:.625rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.625rem!important}.ml-lg-2,.mx-lg-2{margin-right:.625rem!important}.m-lg-3{margin:1.25rem!important}.mt-lg-3,.my-lg-3{margin-top:1.25rem!important}.mr-lg-3,.mx-lg-3{margin-left:1.25rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1.25rem!important}.ml-lg-3,.mx-lg-3{margin-right:1.25rem!important}.m-lg-4{margin:1.875rem!important}.mt-lg-4,.my-lg-4{margin-top:1.875rem!important}.mr-lg-4,.mx-lg-4{margin-left:1.875rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.875rem!important}.ml-lg-4,.mx-lg-4{margin-right:1.875rem!important}.m-lg-5{margin:3.75rem!important}.mt-lg-5,.my-lg-5{margin-top:3.75rem!important}.mr-lg-5,.mx-lg-5{margin-left:3.75rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3.75rem!important}.ml-lg-5,.mx-lg-5{margin-right:3.75rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-left:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-right:0!important}.p-lg-1{padding:.3125rem!important}.pt-lg-1,.py-lg-1{padding-top:.3125rem!important}.pr-lg-1,.px-lg-1{padding-left:.3125rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.3125rem!important}.pl-lg-1,.px-lg-1{padding-right:.3125rem!important}.p-lg-2{padding:.625rem!important}.pt-lg-2,.py-lg-2{padding-top:.625rem!important}.pr-lg-2,.px-lg-2{padding-left:.625rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.625rem!important}.pl-lg-2,.px-lg-2{padding-right:.625rem!important}.p-lg-3{padding:1.25rem!important}.pt-lg-3,.py-lg-3{padding-top:1.25rem!important}.pr-lg-3,.px-lg-3{padding-left:1.25rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1.25rem!important}.pl-lg-3,.px-lg-3{padding-right:1.25rem!important}.p-lg-4{padding:1.875rem!important}.pt-lg-4,.py-lg-4{padding-top:1.875rem!important}.pr-lg-4,.px-lg-4{padding-left:1.875rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.875rem!important}.pl-lg-4,.px-lg-4{padding-right:1.875rem!important}.p-lg-5{padding:3.75rem!important}.pt-lg-5,.py-lg-5{padding-top:3.75rem!important}.pr-lg-5,.px-lg-5{padding-left:3.75rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3.75rem!important}.pl-lg-5,.px-lg-5{padding-right:3.75rem!important}.m-lg-n1{margin:-.3125rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.3125rem!important}.mr-lg-n1,.mx-lg-n1{margin-left:-.3125rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.3125rem!important}.ml-lg-n1,.mx-lg-n1{margin-right:-.3125rem!important}.m-lg-n2{margin:-.625rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.625rem!important}.mr-lg-n2,.mx-lg-n2{margin-left:-.625rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.625rem!important}.ml-lg-n2,.mx-lg-n2{margin-right:-.625rem!important}.m-lg-n3{margin:-1.25rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1.25rem!important}.mr-lg-n3,.mx-lg-n3{margin-left:-1.25rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1.25rem!important}.ml-lg-n3,.mx-lg-n3{margin-right:-1.25rem!important}.m-lg-n4{margin:-1.875rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.875rem!important}.mr-lg-n4,.mx-lg-n4{margin-left:-1.875rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.875rem!important}.ml-lg-n4,.mx-lg-n4{margin-right:-1.875rem!important}.m-lg-n5{margin:-3.75rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3.75rem!important}.mr-lg-n5,.mx-lg-n5{margin-left:-3.75rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3.75rem!important}.ml-lg-n5,.mx-lg-n5{margin-right:-3.75rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-left:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-right:auto!important}}@media (min-width:1220px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-left:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-right:0!important}.m-xl-1{margin:.3125rem!important}.mt-xl-1,.my-xl-1{margin-top:.3125rem!important}.mr-xl-1,.mx-xl-1{margin-left:.3125rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.3125rem!important}.ml-xl-1,.mx-xl-1{margin-right:.3125rem!important}.m-xl-2{margin:.625rem!important}.mt-xl-2,.my-xl-2{margin-top:.625rem!important}.mr-xl-2,.mx-xl-2{margin-left:.625rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.625rem!important}.ml-xl-2,.mx-xl-2{margin-right:.625rem!important}.m-xl-3{margin:1.25rem!important}.mt-xl-3,.my-xl-3{margin-top:1.25rem!important}.mr-xl-3,.mx-xl-3{margin-left:1.25rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1.25rem!important}.ml-xl-3,.mx-xl-3{margin-right:1.25rem!important}.m-xl-4{margin:1.875rem!important}.mt-xl-4,.my-xl-4{margin-top:1.875rem!important}.mr-xl-4,.mx-xl-4{margin-left:1.875rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.875rem!important}.ml-xl-4,.mx-xl-4{margin-right:1.875rem!important}.m-xl-5{margin:3.75rem!important}.mt-xl-5,.my-xl-5{margin-top:3.75rem!important}.mr-xl-5,.mx-xl-5{margin-left:3.75rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3.75rem!important}.ml-xl-5,.mx-xl-5{margin-right:3.75rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-left:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-right:0!important}.p-xl-1{padding:.3125rem!important}.pt-xl-1,.py-xl-1{padding-top:.3125rem!important}.pr-xl-1,.px-xl-1{padding-left:.3125rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.3125rem!important}.pl-xl-1,.px-xl-1{padding-right:.3125rem!important}.p-xl-2{padding:.625rem!important}.pt-xl-2,.py-xl-2{padding-top:.625rem!important}.pr-xl-2,.px-xl-2{padding-left:.625rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.625rem!important}.pl-xl-2,.px-xl-2{padding-right:.625rem!important}.p-xl-3{padding:1.25rem!important}.pt-xl-3,.py-xl-3{padding-top:1.25rem!important}.pr-xl-3,.px-xl-3{padding-left:1.25rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1.25rem!important}.pl-xl-3,.px-xl-3{padding-right:1.25rem!important}.p-xl-4{padding:1.875rem!important}.pt-xl-4,.py-xl-4{padding-top:1.875rem!important}.pr-xl-4,.px-xl-4{padding-left:1.875rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.875rem!important}.pl-xl-4,.px-xl-4{padding-right:1.875rem!important}.p-xl-5{padding:3.75rem!important}.pt-xl-5,.py-xl-5{padding-top:3.75rem!important}.pr-xl-5,.px-xl-5{padding-left:3.75rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3.75rem!important}.pl-xl-5,.px-xl-5{padding-right:3.75rem!important}.m-xl-n1{margin:-.3125rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.3125rem!important}.mr-xl-n1,.mx-xl-n1{margin-left:-.3125rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.3125rem!important}.ml-xl-n1,.mx-xl-n1{margin-right:-.3125rem!important}.m-xl-n2{margin:-.625rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.625rem!important}.mr-xl-n2,.mx-xl-n2{margin-left:-.625rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.625rem!important}.ml-xl-n2,.mx-xl-n2{margin-right:-.625rem!important}.m-xl-n3{margin:-1.25rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1.25rem!important}.mr-xl-n3,.mx-xl-n3{margin-left:-1.25rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1.25rem!important}.ml-xl-n3,.mx-xl-n3{margin-right:-1.25rem!important}.m-xl-n4{margin:-1.875rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.875rem!important}.mr-xl-n4,.mx-xl-n4{margin-left:-1.875rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.875rem!important}.ml-xl-n4,.mx-xl-n4{margin-right:-1.875rem!important}.m-xl-n5{margin:-3.75rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3.75rem!important}.mr-xl-n5,.mx-xl-n5{margin-left:-3.75rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3.75rem!important}.ml-xl-n5,.mx-xl-n5{margin-right:-3.75rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-left:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-right:auto!important}}@media (min-width:1380px){.m-xxl-0{margin:0!important}.mt-xxl-0,.my-xxl-0{margin-top:0!important}.mr-xxl-0,.mx-xxl-0{margin-left:0!important}.mb-xxl-0,.my-xxl-0{margin-bottom:0!important}.ml-xxl-0,.mx-xxl-0{margin-right:0!important}.m-xxl-1{margin:.3125rem!important}.mt-xxl-1,.my-xxl-1{margin-top:.3125rem!important}.mr-xxl-1,.mx-xxl-1{margin-left:.3125rem!important}.mb-xxl-1,.my-xxl-1{margin-bottom:.3125rem!important}.ml-xxl-1,.mx-xxl-1{margin-right:.3125rem!important}.m-xxl-2{margin:.625rem!important}.mt-xxl-2,.my-xxl-2{margin-top:.625rem!important}.mr-xxl-2,.mx-xxl-2{margin-left:.625rem!important}.mb-xxl-2,.my-xxl-2{margin-bottom:.625rem!important}.ml-xxl-2,.mx-xxl-2{margin-right:.625rem!important}.m-xxl-3{margin:1.25rem!important}.mt-xxl-3,.my-xxl-3{margin-top:1.25rem!important}.mr-xxl-3,.mx-xxl-3{margin-left:1.25rem!important}.mb-xxl-3,.my-xxl-3{margin-bottom:1.25rem!important}.ml-xxl-3,.mx-xxl-3{margin-right:1.25rem!important}.m-xxl-4{margin:1.875rem!important}.mt-xxl-4,.my-xxl-4{margin-top:1.875rem!important}.mr-xxl-4,.mx-xxl-4{margin-left:1.875rem!important}.mb-xxl-4,.my-xxl-4{margin-bottom:1.875rem!important}.ml-xxl-4,.mx-xxl-4{margin-right:1.875rem!important}.m-xxl-5{margin:3.75rem!important}.mt-xxl-5,.my-xxl-5{margin-top:3.75rem!important}.mr-xxl-5,.mx-xxl-5{margin-left:3.75rem!important}.mb-xxl-5,.my-xxl-5{margin-bottom:3.75rem!important}.ml-xxl-5,.mx-xxl-5{margin-right:3.75rem!important}.p-xxl-0{padding:0!important}.pt-xxl-0,.py-xxl-0{padding-top:0!important}.pr-xxl-0,.px-xxl-0{padding-left:0!important}.pb-xxl-0,.py-xxl-0{padding-bottom:0!important}.pl-xxl-0,.px-xxl-0{padding-right:0!important}.p-xxl-1{padding:.3125rem!important}.pt-xxl-1,.py-xxl-1{padding-top:.3125rem!important}.pr-xxl-1,.px-xxl-1{padding-left:.3125rem!important}.pb-xxl-1,.py-xxl-1{padding-bottom:.3125rem!important}.pl-xxl-1,.px-xxl-1{padding-right:.3125rem!important}.p-xxl-2{padding:.625rem!important}.pt-xxl-2,.py-xxl-2{padding-top:.625rem!important}.pr-xxl-2,.px-xxl-2{padding-left:.625rem!important}.pb-xxl-2,.py-xxl-2{padding-bottom:.625rem!important}.pl-xxl-2,.px-xxl-2{padding-right:.625rem!important}.p-xxl-3{padding:1.25rem!important}.pt-xxl-3,.py-xxl-3{padding-top:1.25rem!important}.pr-xxl-3,.px-xxl-3{padding-left:1.25rem!important}.pb-xxl-3,.py-xxl-3{padding-bottom:1.25rem!important}.pl-xxl-3,.px-xxl-3{padding-right:1.25rem!important}.p-xxl-4{padding:1.875rem!important}.pt-xxl-4,.py-xxl-4{padding-top:1.875rem!important}.pr-xxl-4,.px-xxl-4{padding-left:1.875rem!important}.pb-xxl-4,.py-xxl-4{padding-bottom:1.875rem!important}.pl-xxl-4,.px-xxl-4{padding-right:1.875rem!important}.p-xxl-5{padding:3.75rem!important}.pt-xxl-5,.py-xxl-5{padding-top:3.75rem!important}.pr-xxl-5,.px-xxl-5{padding-left:3.75rem!important}.pb-xxl-5,.py-xxl-5{padding-bottom:3.75rem!important}.pl-xxl-5,.px-xxl-5{padding-right:3.75rem!important}.m-xxl-n1{margin:-.3125rem!important}.mt-xxl-n1,.my-xxl-n1{margin-top:-.3125rem!important}.mr-xxl-n1,.mx-xxl-n1{margin-left:-.3125rem!important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-.3125rem!important}.ml-xxl-n1,.mx-xxl-n1{margin-right:-.3125rem!important}.m-xxl-n2{margin:-.625rem!important}.mt-xxl-n2,.my-xxl-n2{margin-top:-.625rem!important}.mr-xxl-n2,.mx-xxl-n2{margin-left:-.625rem!important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-.625rem!important}.ml-xxl-n2,.mx-xxl-n2{margin-right:-.625rem!important}.m-xxl-n3{margin:-1.25rem!important}.mt-xxl-n3,.my-xxl-n3{margin-top:-1.25rem!important}.mr-xxl-n3,.mx-xxl-n3{margin-left:-1.25rem!important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-1.25rem!important}.ml-xxl-n3,.mx-xxl-n3{margin-right:-1.25rem!important}.m-xxl-n4{margin:-1.875rem!important}.mt-xxl-n4,.my-xxl-n4{margin-top:-1.875rem!important}.mr-xxl-n4,.mx-xxl-n4{margin-left:-1.875rem!important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-1.875rem!important}.ml-xxl-n4,.mx-xxl-n4{margin-right:-1.875rem!important}.m-xxl-n5{margin:-3.75rem!important}.mt-xxl-n5,.my-xxl-n5{margin-top:-3.75rem!important}.mr-xxl-n5,.mx-xxl-n5{margin-left:-3.75rem!important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-3.75rem!important}.ml-xxl-n5,.mx-xxl-n5{margin-right:-3.75rem!important}.m-xxl-auto{margin:auto!important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto!important}.mr-xxl-auto,.mx-xxl-auto{margin-left:auto!important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto!important}.ml-xxl-auto,.mx-xxl-auto{margin-right:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:right!important}.text-right{text-align:left!important}.text-center{text-align:center!important}@media (min-width:480px){.text-sm-left{text-align:right!important}.text-sm-right{text-align:left!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:right!important}.text-md-right{text-align:left!important}.text-md-center{text-align:center!important}}@media (min-width:980px){.text-lg-left{text-align:right!important}.text-lg-right{text-align:left!important}.text-lg-center{text-align:center!important}}@media (min-width:1220px){.text-xl-left{text-align:right!important}.text-xl-right{text-align:left!important}.text-xl-center{text-align:center!important}}@media (min-width:1380px){.text-xxl-left{text-align:right!important}.text-xxl-right{text-align:left!important}.text-xxl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#f16e00!important}a.text-primary:focus,a.text-primary:hover{color:#a54b00!important}.text-secondary{color:#000!important}a.text-secondary:focus,a.text-secondary:hover{color:#000!important}.text-success{color:#32c832!important}a.text-success:focus,a.text-success:hover{color:#238b23!important}.text-info{color:#527edb!important}a.text-info:focus,a.text-info:hover{color:#2756ba!important}.text-warning{color:#fc0!important}a.text-warning:focus,a.text-warning:hover{color:#b38f00!important}.text-danger{color:#cd3c14!important}a.text-danger:focus,a.text-danger:hover{color:#87280d!important}.text-light{color:#ddd!important}a.text-light:focus,a.text-light:hover{color:#b7b7b7!important}.text-dark{color:#000!important}a.text-dark:focus,a.text-dark:hover{color:#000!important}.text-body{color:#000!important}.text-muted{color:#666!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:2px solid #ccc;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:980px!important}.container{min-width:980px!important}.navbar{display:none}.badge{border:2px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #eee!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#ccc}.table .thead-dark th{color:inherit;border-color:#ccc}.form-row,.row{display:block!important}}.card-deck .o-card-link{margin:0 1rem}.o-card-link .card-title{-ms-flex-item-align:center;align-self:center;width:100%;margin:auto 0;font-weight:700;word-break:normal}.o-card-link .card-img{padding:0;text-align:center}.o-card-link .card-img img{width:100%;height:auto}.o-card-link .card-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;text-align:center}.card-deck{margin:0}@media (max-width:479.98px){.card.o-card-link{-ms-flex-preferred-size:auto;flex-basis:auto;margin:1rem}.card-deck{-ms-flex-direction:column;flex-direction:column}.card-deck .o-card-link,.o-card-link{-ms-flex-direction:row;flex-direction:row;height:3.75rem;margin:0;margin-bottom:.625rem;border:0}.o-card-link .card-img{-ms-flex-preferred-size:20%;flex-basis:20%;width:auto;padding:0}.o-card-link .card-img img{width:auto;height:3.75rem}.o-card-link .card-body{-ms-flex-preferred-size:80%;flex-basis:80%;-ms-flex-item-align:center;align-self:center;padding:0 1rem;text-align:right}.o-card-link .card-title{-ms-flex-item-align:start;align-self:flex-start;margin:0}.o-card-link .card-title::after{position:absolute;top:calc(50% - .5rem);left:.25rem;width:1rem;height:1rem;content:"";background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E");background-repeat:no-repeat}}@media (min-width:480px) and (max-width:767.98px){.card.o-card-link{-ms-flex-preferred-size:auto;flex-basis:auto;margin:1rem}}.o-switch .toggle,.o-switch .toggle .off,.o-switch .toggle .on,.o-switch .toggle::before{transition:.4s}.o-switch .toggle{position:relative;display:block;width:auto;min-width:3.75rem;height:1.875rem;margin:.3125rem 0;background:#666;border:2px solid #666}.o-switch .toggle.toggle-rounded,.o-switch .toggle.toggle-rounded::before{border-radius:1.625rem}.o-switch .toggle .off,.o-switch .toggle .on{display:none;font-weight:700;line-height:1.625rem;color:#fff;text-align:right;cursor:default;opacity:0}.o-switch .toggle .on.svg-checkbox-tick::after{top:.1875rem;right:-.125rem}.o-switch .toggle .off{display:block;text-align:left;opacity:1}.o-switch .toggle .off.svg-delete::after{top:.1875rem;left:-.125rem;right:auto}.o-switch .toggle::before{position:absolute;top:0;right:0;z-index:1;display:block;width:1.625rem;height:1.625rem;content:"";background:#fff}.o-switch .checkbox:focus+.toggle::before{outline:1px dotted #fff}.o-switch .checkbox:checked+.toggle{background:#f16e00;border-color:#f16e00}.o-switch .checkbox:checked+.toggle .on{display:block;opacity:1}.o-switch .checkbox:checked+.toggle .off{display:none;opacity:0}.o-switch .checkbox:checked+.toggle::before{left:0;right:auto}.o-switch .checkbox.success:checked+.toggle{background:#32c832;border-color:#32c832}.o-switch .checkbox.success:checked+.toggle .on{color:#000}.o-switch .checkbox.success:checked+.toggle .on.icon-checkbox-tick{color:#fff}.form-group.row .o-switch .col-form-label.toggle{padding:0 .375rem}.form-group.row .o-switch .col-form-label.toggle.toggle-rounded{padding:0 .875rem}.o-switch.btn-group-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:start;justify-content:flex-start;border:2px solid #ccc}.o-switch.btn-group-toggle .btn{min-width:2.5rem;padding-left:0;padding-right:0;margin:-2px 0;border:2px solid transparent}.o-switch.btn-group-toggle .btn:first-child{margin-right:-2px}.o-switch.btn-group-toggle .btn:last-child{margin-left:-2px}.o-switch.btn-group-toggle .btn.active{color:#fff;background-color:#000;border-color:#000}.o-switch.btn-group-toggle .btn.focus{outline:1px dotted #fff;outline-offset:-2px}.o-switch.btn-group-toggle .btn:active{border-color:#f16e00}.o-switch.btn-group-toggle .btn:hover:not(:active){color:#f16e00;background-color:transparent}.o-switch.btn-group-toggle .btn:hover.active{color:#fff;background-color:#000;border-color:#000}.o-switch.btn-group-toggle.no-outline{border-color:transparent}.o-switch.btn-group-toggle.no-outline .btn{border-top:2px solid transparent;border-bottom:2px solid transparent}.o-switch.btn-group-toggle.no-outline .btn:first-child{border-right-color:transparent}.o-switch.btn-group-toggle.no-outline .btn:last-child{border-left-color:transparent}.o-switch.btn-group-toggle.no-outline .btn.active{color:#f16e00;background-color:#fff;border-color:transparent;outline-color:#000}.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active){color:#000;background-color:#fff;border-color:#ccc}.o-switch.btn-group-toggle.no-outline .btn:hover.active{color:#f16e00;background-color:#fff;border-color:transparent;outline-color:#000}.form-group input[type=checkbox],.form-group input[type=radio]{width:auto}.form-group .invalid-feedback{margin-top:.8125rem;font-weight:700}.form-group.top{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.form-group.top .col-form-label{margin-bottom:0}.form-group.top .form-control{-ms-flex-order:2;order:2}.form-group.top .invalid-feedback{-ms-flex-order:1;order:1;margin-top:0;margin-bottom:.8125rem;line-height:1}.form-group.right{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.form-group.right .col-form-label,.form-group.right label{min-width:100%}.form-group.right .form-control-message,.form-group.right .invalid-feedback{max-width:50%;margin-right:.625rem}.form-group.row.top{-ms-flex-direction:row;flex-direction:row}.form-group.row.top .col-form-label,.form-group.row.top label{-ms-flex-order:1;order:1}.form-group.row.top .form-control{-ms-flex-order:2;order:2;margin-top:0}.form-group.row.top .invalid-feedback{-ms-flex-order:0;order:0}.form-group.row.right .col-form-label,.form-group.row.right label{min-width:auto}.form-group.row.right .invalid-feedback{-ms-flex-item-align:center;align-self:center;margin-top:0}.form-group.is-required label::after{margin-right:6px;font-weight:700;color:#f16e00;content:"*"}.form-group .form-control:invalid{outline:0;box-shadow:none}select.form-control:not([size]):not([multiple]){height:auto;padding-top:.4375rem;padding-bottom:.4375rem}select.form-control:not([size]):not([multiple]).form-control-lg{padding-top:.65625rem;padding-bottom:.65625rem}select.form-control:not([size]):not([multiple]).form-control-sm{padding-top:.1875rem;padding-bottom:.1875rem}.has-feedback label~.invalid-feedback{top:1.75}.o-square-list{padding-right:0;color:#f16e00;text-align:right}.o-square-list,.o-square-list ul *{list-style-type:none}.o-square-list li{color:#000}.o-square-list li::before{margin-left:1rem;font-size:.875rem;line-height:1.25rem;color:#f16e00;vertical-align:text-top;content:"\25A0"}.o-square-list li span{display:inline-block;margin-bottom:.625rem}.o-square-list li>ul{padding-right:1rem}.o-square-list ul>li::before{color:#999}.o-square-list ul ul>li::before{color:#ccc}.o-stepbar,.o-stepbar ol,.o-stepbar ul{padding:0;margin:0;overflow:hidden}.o-stepbar .stepbar-item:first-child:nth-last-child(1){width:100%}.o-stepbar .stepbar-item:first-child:nth-last-child(2),.o-stepbar .stepbar-item:first-child:nth-last-child(2)~.stepbar-item{width:50%}.o-stepbar .stepbar-item:first-child:nth-last-child(3),.o-stepbar .stepbar-item:first-child:nth-last-child(3)~.stepbar-item{width:33.3333%}.o-stepbar .stepbar-item:first-child:nth-last-child(4),.o-stepbar .stepbar-item:first-child:nth-last-child(4)~.stepbar-item{width:25%}.o-stepbar .stepbar-item:first-child:nth-last-child(5),.o-stepbar .stepbar-item:first-child:nth-last-child(5)~.stepbar-item{width:20%}.o-stepbar .stepbar-item{position:relative;float:right;padding:.625rem 1.25rem;padding-right:2rem;font-size:1rem;font-weight:700;line-height:1.25;color:#000;text-align:center;white-space:nowrap;list-style:none;background-color:#ddd}.o-stepbar .stepbar-item::after{position:absolute;top:0;left:-1rem;z-index:500;display:block;width:1rem;height:2.5rem;content:"";background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E);background-size:1rem 2.5rem}.o-stepbar .stepbar-item:first-child{padding-right:1.25rem}.o-stepbar .stepbar-item:last-child::after{display:none}.o-stepbar .stepbar-item.done{background-color:#000}.o-stepbar .stepbar-item.done::after{position:absolute;top:0;left:-1rem;z-index:500;display:block;width:1rem;height:2.5rem;content:"";background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E);background-size:1rem 2.5rem}.o-stepbar .stepbar-item.done .stepbar-link{color:#fff}.o-stepbar .stepbar-item.done:last-child::after{display:none}.o-stepbar .stepbar-item.current{background-color:#f16e00}.o-stepbar .stepbar-item.current::after{position:absolute;top:0;left:-1rem;z-index:500;display:block;width:1rem;height:2.5rem;content:"";background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E);background-size:1rem 2.5rem}.o-stepbar .stepbar-item.current .stepbar-link{color:#fff}.o-stepbar .stepbar-item.current:last-child::after{display:none}.o-stepbar .stepbar-item .stepbar-link{text-decoration:none}.o-stepbar .stepbar-item .stepbar-link .step-number::after{content:"."}@media (max-width:479.98px){.o-stepbar .stepbar-item{padding:.3125rem 2rem .3125rem .625rem;line-height:1.25}.o-stepbar .stepbar-item.current::after,.o-stepbar .stepbar-item.done::after,.o-stepbar .stepbar-item.next::after,.o-stepbar .stepbar-item::after{left:-.6875rem;width:.75rem;height:1.875rem;background-size:cover}.o-stepbar.xs-numbers .step-number::after{display:none}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3)~.stepbar-item{width:20%}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3)~.stepbar-item.current{width:60%}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4)~.stepbar-item,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5)~.stepbar-item{width:20%}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4)~.stepbar-item.current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5)~.stepbar-item.current{width:40%}.o-stepbar.xs-numbers .stepbar-item{width:20%;padding-left:0;padding-right:.75rem}.o-stepbar.xs-numbers .stepbar-item:first-child{padding-right:0}.o-stepbar.xs-numbers .stepbar-item.current{width:60%}.o-stepbar.xs-numbers .stepbar-item.current .step-number{display:none}.o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title{display:none}.o-stepbar.xs-labels .step-number{display:none}}.o-link-arrow{font-size:1rem;font-weight:700;text-decoration:none}.o-link-arrow::after{display:inline-block;padding:0 .625rem;font-family:icon-orange;font-size:.625rem;color:#000;content:"\e93e"}.o-link-arrow:focus::after,.o-link-arrow:hover::after{color:#f16e00;text-decoration:none}.o-link-arrow.back::after{padding:0;content:""}.o-link-arrow.back::before{display:inline-block;padding:0 0 0 .625rem;font-family:icon-orange;font-size:.625rem;color:#000;content:"\e93f"}.o-link-arrow.back:focus::before,.o-link-arrow.back:hover::before{color:#f16e00;text-decoration:none}.mega-menu{overflow:hidden}.mega-menu>.navbar-nav{transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;-webkit-transform:translateX(0);transform:translateX(0)}.mega-menu-panel>.container>.navbar-nav,.mega-menu-panel>.navbar-nav{-ms-flex-direction:column;flex-direction:column}.mega-menu-panel>.container>.navbar-nav .navbar-nav,.mega-menu-panel>.navbar-nav .navbar-nav{position:absolute;top:0;right:100%;display:none;width:100%}.navbar .nav-link.icon{margin-top:0}.navbar .nav-link.icon span[class^=icon-]{font-size:1.5rem;font-weight:400}.navbar .nav-link.icon[class*=svg-],.navbar .nav-link.icon[class*=svg-]::after{width:1.875rem;height:1.875rem}.navbar .nav-link:not(.icon)[class*=svg-]::after{top:0;left:0;right:auto}.navbar.supra{height:2.5rem;min-height:2.5rem;padding-top:0;padding-bottom:0;border-bottom:1px solid #333}@media (max-width:479.98px){.navbar.supra{display:none}}.navbar.supra>.container,.navbar.supra>.container .navbar-nav{-ms-flex-align:center;align-items:center}.navbar.supra .navbar-brand{display:none}.navbar.supra .navbar-nav{margin:0}.navbar.supra .navbar-nav .nav-item:first-child .nav-link,.navbar.supra .navbar-nav>.nav-link:first-child{margin-right:0}.navbar.supra .dropdown-toggle,.navbar.supra .nav-link{font-size:.875rem;line-height:1}.navbar.supra .dropdown-toggle:focus,.navbar.supra .nav-link:focus{outline-offset:.5rem}.navbar.supra .dropdown-toggle span[class^=icon-],.navbar.supra .nav-link span[class^=icon-]{font-size:1.125rem;font-weight:400}.navbar.supra .nav-link.icon span[class^=icon-]{font-size:1rem;font-weight:400}.navbar.supra .nav-link.icon[class*=svg-],.navbar.supra .nav-link.icon[class*=svg-]::after{width:1.25rem;height:1.25rem}.navbar.supra .dropdown-menu{left:0;right:auto}@media (max-width:479.98px){.navbar-expand-sm .mega-menu .nav-link,.navbar-expand-sm.minimized .mega-menu .nav-link{padding-left:0;outline-offset:-1px}.navbar-expand-sm .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-left:.9375rem;content:"";border-top:.4375em solid;border-left:.4375em solid transparent;border-right:.4375em solid transparent;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-sm .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-sm .mega-menu-panel .nav-link.back,.navbar-expand-sm.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-sm .mega-menu-panel .nav-link.back::before,.navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before{float:right;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-sm .mega-menu-panel>.container,.navbar-expand-sm.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-sm .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-sm.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-sm.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-sm.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:480px){.navbar-expand-sm .mega-menu{overflow:visible}.navbar-expand-sm .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-sm .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-sm .mega-menu-panel{position:absolute;top:100px;right:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-sm .mega-menu-panel a[data-toggle=collapse]{display:block;float:left;margin:1.25rem;color:#fff}.navbar-expand-sm .mega-menu-panel .nav-link{margin-right:0}.navbar-expand-sm .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-left:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-right:0}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:767.98px){.navbar-expand-md .mega-menu .nav-link,.navbar-expand-md.minimized .mega-menu .nav-link{padding-left:0;outline-offset:-1px}.navbar-expand-md .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-left:.9375rem;content:"";border-top:.4375em solid;border-left:.4375em solid transparent;border-right:.4375em solid transparent;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-md .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-md .mega-menu-panel .nav-link.back,.navbar-expand-md.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-md .mega-menu-panel .nav-link.back::before,.navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before{float:right;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-md .mega-menu-panel>.container,.navbar-expand-md.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-md .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-md.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-md.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-md.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:768px){.navbar-expand-md .mega-menu{overflow:visible}.navbar-expand-md .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-md .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-md .mega-menu-panel{position:absolute;top:100px;right:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-md .mega-menu-panel a[data-toggle=collapse]{display:block;float:left;margin:1.25rem;color:#fff}.navbar-expand-md .mega-menu-panel .nav-link{margin-right:0}.navbar-expand-md .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-left:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-right:0}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:979.98px){.navbar-expand-lg .mega-menu .nav-link,.navbar-expand-lg.minimized .mega-menu .nav-link{padding-left:0;outline-offset:-1px}.navbar-expand-lg .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-left:.9375rem;content:"";border-top:.4375em solid;border-left:.4375em solid transparent;border-right:.4375em solid transparent;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-lg .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-lg .mega-menu-panel .nav-link.back,.navbar-expand-lg.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-lg .mega-menu-panel .nav-link.back::before,.navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before{float:right;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-lg .mega-menu-panel>.container,.navbar-expand-lg.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-lg .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-lg.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-lg.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-lg.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:980px){.navbar-expand-lg .mega-menu{overflow:visible}.navbar-expand-lg .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-lg .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-lg .mega-menu-panel{position:absolute;top:100px;right:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-lg .mega-menu-panel a[data-toggle=collapse]{display:block;float:left;margin:1.25rem;color:#fff}.navbar-expand-lg .mega-menu-panel .nav-link{margin-right:0}.navbar-expand-lg .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-left:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-right:0}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:1219.98px){.navbar-expand-xl .mega-menu .nav-link,.navbar-expand-xl.minimized .mega-menu .nav-link{padding-left:0;outline-offset:-1px}.navbar-expand-xl .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-left:.9375rem;content:"";border-top:.4375em solid;border-left:.4375em solid transparent;border-right:.4375em solid transparent;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-xl .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-xl .mega-menu-panel .nav-link.back,.navbar-expand-xl.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-xl .mega-menu-panel .nav-link.back::before,.navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before{float:right;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-xl .mega-menu-panel>.container,.navbar-expand-xl.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-xl .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-xl.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-xl.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-xl.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:1220px){.navbar-expand-xl .mega-menu{overflow:visible}.navbar-expand-xl .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-xl .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-xl .mega-menu-panel{position:absolute;top:100px;right:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-xl .mega-menu-panel a[data-toggle=collapse]{display:block;float:left;margin:1.25rem;color:#fff}.navbar-expand-xl .mega-menu-panel .nav-link{margin-right:0}.navbar-expand-xl .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-left:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-right:0}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:1379.98px){.navbar-expand-xxl .mega-menu .nav-link,.navbar-expand-xxl.minimized .mega-menu .nav-link{padding-left:0;outline-offset:-1px}.navbar-expand-xxl .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-left:.9375rem;content:"";border-top:.4375em solid;border-left:.4375em solid transparent;border-right:.4375em solid transparent;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-xxl .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-xxl .mega-menu-panel .nav-link.back,.navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-xxl .mega-menu-panel .nav-link.back::before,.navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before{float:right;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand-xxl .mega-menu-panel>.container,.navbar-expand-xxl.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-xxl .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-xxl.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-xxl.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-xxl.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:1380px){.navbar-expand-xxl .mega-menu{overflow:visible}.navbar-expand-xxl .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-xxl .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-xxl .mega-menu-panel{position:absolute;top:100px;right:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-xxl .mega-menu-panel a[data-toggle=collapse]{display:block;float:left;margin:1.25rem;color:#fff}.navbar-expand-xxl .mega-menu-panel .nav-link{margin-right:0}.navbar-expand-xxl .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-left:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-right:0}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}.navbar-expand .mega-menu .nav-link,.navbar-expand.minimized .mega-menu .nav-link{padding-left:0;outline-offset:-1px}.navbar-expand .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-left:.9375rem;content:"";border-top:.4375em solid;border-left:.4375em solid transparent;border-right:.4375em solid transparent;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand .mega-menu-panel .nav-link.back,.navbar-expand.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand .mega-menu-panel .nav-link.back::before,.navbar-expand.minimized .mega-menu-panel .nav-link.back::before{float:right;-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}.navbar-expand .mega-menu-panel>.container,.navbar-expand.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}.navbar-expand .mega-menu{overflow:visible}.navbar-expand .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand .mega-menu-panel{position:absolute;top:100px;right:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand .mega-menu-panel a[data-toggle=collapse]{display:block;float:left;margin:1.25rem;color:#fff}.navbar-expand .mega-menu-panel .nav-link{margin-right:0}.navbar-expand .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-left:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-right:0}.navbar-expand .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}@media (max-width:767.98px){.navbar-brand,.navbar-brand+.navbar-brand{-ms-flex-item-align:center;align-self:center}}.table>tbody>tr,.table>tfoot>tr,.table>thead>tr{border-bottom:1px solid #ccc}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{font-size:.875rem;line-height:1.25rem;vertical-align:middle;border:0}.table>tbody>tr>td:first-child,.table>tbody>tr>th:first-child,.table>tfoot>tr>td:first-child,.table>tfoot>tr>th:first-child,.table>thead>tr>td:first-child,.table>thead>tr>th:first-child{padding-right:.625rem}.table>tbody>tr [class*=" icon-"],.table>tbody>tr [class^=icon-],.table>tfoot>tr [class*=" icon-"],.table>tfoot>tr [class^=icon-],.table>thead>tr [class*=" icon-"],.table>thead>tr [class^=icon-]{font-size:1.8125rem}.table>tbody>tr [class^=svg-],.table>tfoot>tr [class^=svg-],.table>thead>tr [class^=svg-]{display:block;width:1.8125rem;height:1.8125rem;margin:0 auto}.table>tbody>tr [class^=svg-]::after,.table>tfoot>tr [class^=svg-]::after,.table>thead>tr [class^=svg-]::after{width:1.8125rem;height:1.8125rem}.table thead>tr{border-bottom-width:2px}.table thead>tr>th{font-size:1rem;font-weight:700}.table tbody>th{font-weight:400}.table.has-checkbox tr.selected>td,.table.has-checkbox tr.selected>th{background-color:#ddd}.table.has-checkbox tr>td:first-child,.table.has-checkbox tr>th:first-child{width:1.25rem;padding-top:0;padding-bottom:0}.table.has-icon tr>td,.table.has-icon tr>th{height:3.1875rem;padding-top:.6875rem;vertical-align:middle}.table.has-icon tr>td img,.table.has-icon tr>td span,.table.has-icon tr>th img,.table.has-icon tr>th span{vertical-align:middle}.table.has-icon tr>td img,.table.has-icon tr>th img{width:1.875rem;height:1.875rem;margin-left:.625rem}.table.has-icon tr>td [class^=icon-],.table.has-icon tr>th [class^=icon-]{width:1.875rem;margin-left:.375rem;font-size:1.8125rem;line-height:0;vertical-align:middle}.table.table-reflow tbody>tr,.table.table-reflow thead>tr{border:0}.table.table-reflow tbody>tr>td,.table.table-reflow thead>tr>td{line-height:1.25rem}.table.table-reflow tbody>tr>th:first-child,.table.table-reflow thead>tr>th:first-child{border-bottom:2px solid #ccc}.table.table-reflow tbody>tr>td,.table.table-reflow tbody>tr>th,.table.table-reflow thead>tr>td,.table.table-reflow thead>tr>th{border-bottom:1px solid #ccc}.table.table-reflow tbody>tr>td:last-child,.table.table-reflow thead>tr>td:last-child{border-left:0}.table.table-reflow thead>tr{border:0}.table.table-reflow thead>tr>th:not(:first-child){padding-right:.625rem;border-bottom:1px solid #ccc}.table.table-reflow thead>tr>th:last-child{border-left:0}.table.table-reflow tbody>tr>th:first-child{padding-right:0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#32c832}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#2db42d}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#527edb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#3d6ed7}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fc0}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#e6b800}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#cd3c14}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#b63512}caption{padding:.75rem 0;font-size:2.125rem;font-weight:700;color:#000;caption-side:top;background-color:#fff}.tablesorter caption{padding:.75rem 0;font-size:2.125rem;font-weight:700;color:#000;background-color:#fff}.tablesorter th{padding-left:30px;text-align:right;cursor:pointer}.tablesorter th.header{position:relative}.tablesorter th .tablesorter-header-inner span{padding-left:1.6875rem}.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after{position:absolute;top:45%;width:.875rem;height:.4375rem;margin-right:.625rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after{position:absolute;top:45%;width:.875rem;height:.4375rem;margin-right:.625rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e")}.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after,.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after{position:absolute;top:31%;width:.875rem;height:1.0625rem;margin-right:.625rem;content:"";background-image:url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e")}.tablesorter th a{color:#000;text-decoration:none}.tablesorter th a:focus,.tablesorter th a:hover{color:#f16e00;text-decoration:underline}.tablesorter td{text-align:right}.modal .modal-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:2.5rem;border:0}.modal .modal-header{position:relative;min-height:1.25rem;padding:0;margin-bottom:2.5rem;border:0}.modal .modal-header .btn{position:absolute;top:-.625rem;left:-.625rem;padding:.625rem;background-color:transparent;border:0}.modal .modal-header .btn .close{width:1.25rem;height:1.25rem;margin:0;background-image:url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E");background-size:1.25rem;opacity:1}.modal .modal-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0;border:0}.modal .modal-body .card{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:0;border:0}.modal .modal-body .card-body{padding:0}.modal .modal-body .card-icon{margin-left:1.25rem}.modal .modal-body [class^=svg],.modal .modal-body [class^=svg]::after{width:2.875rem;height:2.875rem}.modal .modal-body [class^=svg]{display:block}.modal .modal-body [class^=svg]::after{top:auto}.modal .modal-body .card-title{margin-bottom:1.25rem;font-size:1.5rem}.modal .modal-footer{-ms-flex-item-align:end;align-self:flex-end;padding:0;margin-top:2.5rem;border:0}.modal .modal-footer .btn+.btn{margin-right:1.25rem}@media (max-width:479.98px){.modal .modal-content{padding:1.25rem}.modal .modal-header{margin:0}.modal .modal-body .card{-ms-flex-direction:column;flex-direction:column}.modal .modal-body .card-icon{-ms-flex-item-align:center;align-self:center;margin-left:0}.modal .modal-body .card-icon,.modal .modal-body [class^=svg]::after{width:4rem;height:4rem}.modal .modal-body .card-title{font-size:1rem}.modal .modal-body .card-body{margin-top:1.25rem}.modal .modal-footer{-ms-flex-item-align:center;align-self:center}}.nav .nav-item:first-child{margin-right:-.625rem}.nav.flex-column .nav-item:first-child{margin-right:0}.nav .nav-link{padding:.625rem .625rem;line-height:1.25rem}.o-nav-light{padding-right:inherit;border-bottom:1px solid #999}.o-active{color:#f16e00;border-bottom:3px solid #f16e00}.nav-tabs .nav-item:first-child{margin-right:0}.nav-tabs .nav-item+.nav-item{margin-right:.5rem}@media (max-width:979.98px){.nav-tabs .nav-item+.nav-item{margin-right:0}}.nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus,.nav-tabs .nav-link:not(.disabled):focus{outline-width:1px;outline-style:dotted;outline-offset:-6px}.nav-tabs .nav-link:not(.disabled)+.nav-link{margin-right:.5rem}@media (max-width:979.98px){.nav-tabs .nav-link:not(.disabled)+.nav-link{margin-right:0}}.o-tab-container{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.o-tab-container .o-tab-heading{position:relative;display:inline-block;padding:.625rem 1.25rem;margin-right:.5rem;font-weight:700;color:#000;text-align:center;background-color:#fff;border:0;border-bottom:2px solid #000}.o-tab-container .o-tab-heading:first-child{margin-right:0;border-top:0}.o-tab-container .o-tab-heading[aria-expanded=false]{border-bottom:2px solid #000}.o-tab-container .o-tab-heading[aria-expanded=true]{padding-top:.5rem;border:2px solid #000;border-bottom:0}.o-tab-container .o-tab-heading:focus{outline-offset:-4px}.o-tab-container .o-tab-heading:hover:not([aria-expanded=true]){color:#fff;background-color:#000}.o-tab-container .o-tab-content{display:none;-ms-flex-item-align:end;align-self:flex-end;-ms-flex-order:1;order:1;width:100%;padding:.625rem 1.25rem;background-color:#fff;box-shadow:0 -2px 0 #000}.o-tab-container .o-tab-content.show{display:block}@media (max-width:767.98px){.o-tab-container .o-tab-heading{-ms-flex-positive:1;flex-grow:1;margin-right:0;text-align:center}.o-tab-container .o-tab-heading[aria-expanded=false]{color:#fff;background-color:#666}.o-tab-container .o-tab-heading[aria-expanded=false]:active{color:#fff;background-color:#f16e00}.o-tab-container.accordion-layout{display:block}.o-tab-container.accordion-layout .o-tab-heading{position:relative;display:block;padding:.9375rem 0;margin-right:0;font-weight:700;color:#000;text-align:right;background-color:#fff;border:0}.o-tab-container.accordion-layout .o-tab-heading:focus{outline-offset:0}.o-tab-container.accordion-layout .o-tab-heading:hover{color:#f16e00;background-color:#fff}.o-tab-container.accordion-layout .o-tab-heading[aria-expanded=false]{border-bottom:1px #ccc solid}.o-tab-container.accordion-layout .o-tab-heading[aria-expanded=true]::after{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.o-tab-container.accordion-layout .o-tab-heading:first-child{margin-right:0;border-top:1px solid #ccc}.o-tab-container.accordion-layout .o-tab-heading::after{position:absolute;top:1.375rem;left:.625rem;width:.875rem;height:.4375rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E")}.o-tab-container.accordion-layout .o-tab-content{padding-right:0;border-bottom:1px #ccc solid;box-shadow:none}}.nav-pills.nav-stacked .nav-item{margin:0}.nav-pills.nav-stacked .nav-item+.nav-item{margin-right:0}.nav-pills .nav-item:first-child{margin-right:0}.nav-pills .nav-item+.nav-item{margin-right:5px}.nav-pills .nav-link{padding-top:1.25rem;padding-bottom:1.25rem}.nav-pills .nav-link:active{background-color:#000}.nav-pills .nav-link:hover{color:#fff;cursor:default;background-color:#000}.nav-pills .nav-link:hover.disabled{color:#666;background-color:transparent}.nav-pills .nav-link:focus{color:#fff;background-color:#f16e00;outline:0}.nav-pills .nav-link:focus.disabled{color:#666;background-color:transparent}.nav-pills .dropdown-menu{left:0;right:auto}.nav-pills .dropdown-menu .nav-item{margin:0}.nav-pills .dropdown-menu .nav-item .nav-link{display:block;padding:.625rem 1.25rem .625rem .625rem;margin:0;color:#000;background:#fff;border:0}.nav-pills .dropdown-menu .nav-item .nav-link:focus{outline:1px dotted #000;outline-offset:-2px}.nav-pills .dropdown-menu .nav-item .nav-link:hover{color:#fff;background:#000}.tab-content{padding:1.125rem;border-color:#000;border-style:solid;border-width:0 2px 2px}.tab-content .tab-pane p{margin-bottom:0}.tab-content-clear{border:0}.breadcrum{line-height:1}.overflow-nav{display:none}.o-nav-local.resizing{overflow:hidden}.hide{display:none!important}.show-inline-block{display:inline-block!important}.overflow-nav-list .nav-link{border:0}.overflow-nav-list .nav-link:focus{outline-offset:-2px}.overflow-nav-list .nav-item:last-child{margin-bottom:0}.o-nav-local .overflow-nav-list{margin-top:1px;border:0;box-shadow:0 .3125rem .625rem -.375rem #999}.o-nav-local{margin-bottom:2.5rem;border-top:1px solid #ccc;border-bottom:1px solid #ccc}.o-nav-local>.container,.o-nav-local>.container-fluid{display:-ms-flexbox;display:flex}.o-nav-local ul+ul{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.o-nav-local .nav-item+.nav-item{margin-right:1rem}.o-nav-local .nav.flex-column .nav-item{margin-right:0}.o-nav-local .nav .dropdown-toggle,.o-nav-local .nav .nav-link{display:inline-block;padding:1rem .625rem 1.125rem;font-size:1rem;font-weight:700;line-height:1}.o-nav-local .nav .dropdown-toggle:focus,.o-nav-local .nav .nav-link:focus{outline:1px dotted;outline-offset:-1px}.o-nav-local .nav-link.active{color:#f16e00}.o-nav-local .dropdown-toggle.show{color:#000}.o-nav-local .dropdown-menu .nav-item,.o-nav-local .dropdown-menu .nav-item+.nav-item{margin:0}.o-nav-local .dropdown-menu .nav-link{display:block;padding:.625rem 1.25rem .625rem .625rem}.o-nav-local .dropdown-menu .nav-link:focus{outline-offset:-2px}.o-nav-local .dropdown-menu .nav-link:hover{color:#fff;background:#000}.o-nav-local.inverse{background-color:#000;border-top-color:#333;border-bottom-color:#333}.o-nav-local.inverse .nav-link{color:#fff;background-color:#000}.o-nav-local.inverse .nav-link:focus,.o-nav-local.inverse .nav-link:hover{color:#f16e00}.o-nav-local.inverse .nav-link:focus{outline-color:#fff}.o-nav-local.inverse .nav-link.active{color:#f16e00}.skiplinks{z-index:99999}.skiplinks .skiplinks-section li{float:right}.skiplinks .skiplinks-section a{display:block;padding:10px;font-weight:700;border-color:#999;border-style:none none none solid;border-width:0 0 0 1px}.skiplinks .skiplinks-section.skiplinks-show{position:absolute;top:20px;right:50%;z-index:10000000;width:auto;height:auto;margin-right:-175px;overflow:hidden;background:none repeat scroll 100% 0 #ccc;border:2px solid #000;box-shadow:-2px 2px 1634px 1604px rgba(0,0,0,.3)}.skiplinks .skiplinks-section a:hover{cursor:pointer}.skiplinks .skiplinks-section a:focus,.skiplinks .skiplinks-section a:hover{color:#f16e00;background-color:#fff;outline:0 none}.skiplinks a,.skiplinks div,.skiplinks li,.skiplinks ul{float:none;padding:0;margin:0;font-size:.95em;font-weight:400;line-height:normal;color:#000;text-decoration:none;text-shadow:none;list-style:none;background:none repeat scroll 100% 0 transparent;border:0 none}.o-footer{margin-top:2.5rem;font-size:.875rem;font-weight:700;color:#fff;background-color:#000}.o-footer .nav-link{padding:.625rem .625rem;font-size:.875rem;line-height:1.25rem}.o-footer .nav-link:not(:hover),.o-footer .nav-link:not([href]){color:#fff}.o-footer .o-footer-body,.o-footer .o-footer-bottom,.o-footer .o-footer-top{padding-top:.625rem;padding-bottom:.625rem}.o-footer .o-footer-top{border-bottom:1px solid #333}.o-footer .o-footer-body .row{margin-bottom:.625rem}.o-footer .o-footer-body h2{margin-top:.625rem;font-size:.875rem;color:#fff}.o-footer .o-footer-body p,.o-footer .o-footer-body p a{color:#fff}.o-footer .o-footer-body .flex-column .nav-link{padding:0;line-height:1.25}.o-footer .o-footer-bottom{border-top:1px solid #333}@media (max-width:979.98px){.o-responsive-table thead{display:none}.o-responsive-table tbody,.o-responsive-table td,.o-responsive-table th,.o-responsive-table tr{display:block}}@media (max-width:979.98px) and (min-width:768px){.o-responsive-table tr{float:right;width:45%}.o-responsive-table tr:nth-child(odd){margin-left:10%}}@media (max-width:979.98px){.o-responsive-table td,.o-responsive-table th{vertical-align:middle}.o-responsive-table td[data-title]::before{float:right;width:50%;font-weight:700;content:attr(data-title)}.o-responsive-table tr{margin-bottom:2em;border-left:0;border-right:0}.o-responsive-table tbody th[scope=row]{font-weight:700;border-top:0;border-bottom:2px solid #ccc}}.o-scroll-up{position:fixed;left:0;bottom:2.5rem;z-index:1035;display:none;left:1.25%;bottom:.25rem}.o-scroll-up .o-scroll-up-icon{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;float:left;width:2.5rem;height:2.5rem;color:#000;text-align:center;text-decoration:none;background-color:#fff;border-style:solid;border-width:2px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.o-scroll-up .o-scroll-up-icon::before{font-family:icon-orange;font-size:1.25rem;line-height:1.8;content:"\e93f"}@media (min-width:480px){.o-scroll-up{left:1.25%}}@media (min-width:768px){.o-scroll-up{left:1.5625%}}@media (min-width:980px){.o-scroll-up{left:3.125%}}@media (min-width:1220px){.o-scroll-up{left:3.125%}}@media (min-width:1380px){.o-scroll-up{left:4.16667%}}@media (min-width:480px){.o-scroll-up{bottom:.375rem}}@media (min-width:768px){.o-scroll-up{bottom:.75rem}}@media (min-width:980px){.o-scroll-up{bottom:2rem}}@media (min-width:1220px){.o-scroll-up{bottom:2.5rem}}@media (min-width:1380px){.o-scroll-up{bottom:3.75rem}}.o-scroll-up .o-scroll-up-text{display:inline-block;padding:.625rem .625rem;font-weight:700;background-color:#fff;opacity:.8}.o-scroll-up.static{position:static;z-index:auto;display:inline;float:right}.o-scroll-up.static .o-scroll-up-text{float:right}.o-scroll-up.static .o-scroll-up-icon{position:relative;display:inline-block;float:none}.o-scroll-up:focus,.o-scroll-up:hover{color:#f16e00}.o-scroll-up:focus .o-scroll-up-icon,.o-scroll-up:hover .o-scroll-up-icon{color:#fff;background-color:#000}.o-scroll-up:active .o-scroll-up-icon{color:#fff;background-color:#f16e00;border-color:#f16e00}.dropdown-toggle::after{margin-right:.625rem;vertical-align:10%}.dropdown-item{padding-right:1.25rem;font-weight:700}.dropdown-item:focus{color:#000;background-color:#fff;outline:1px dotted}.dropdown-item:focus:hover{color:#fff;background-color:#000}.carousel{margin-bottom:1.875rem}.carousel .carousel-item img{width:100%}.carousel-control-next,.carousel-control-prev{top:auto;bottom:calc(50% - 1.875rem);width:3.75rem;height:3.75rem;text-decoration:none;text-shadow:none;background-color:transparent;opacity:.8;transition:width .5s ease}.carousel-control-next:focus,.carousel-control-prev:focus{outline:2px dotted #000;outline-offset:-1px}.carousel-control-next-icon,.carousel-control-prev-icon{margin-top:-1.125rem;font-size:1.875rem;color:#000;text-shadow:-1px 0 0 #fff,0 1px 0 #fff,1px 0 0 #fff,0 -1px 0 #fff;background-image:none;background-repeat:no-repeat}.carousel-control-next-icon::before,.carousel-control-prev-icon::before{font-family:icon-orange}.carousel-control-prev-icon::before{content:"\e93f"}.carousel-control-next-icon::before{content:"\e93e"}.carousel-indicators{bottom:0;-ms-flex-align:center;align-items:center}.carousel-indicators:hover{cursor:default}.carousel-indicators li{-ms-flex-positive:0;flex-grow:0;width:.625rem;height:.625rem;margin-left:.375rem;background-color:#000;border:1px solid #fff;border-radius:50%}.carousel-indicators li:hover{cursor:pointer}.carousel-indicators li.active{background-color:#f16e00}.swiper-button-next,.swiper-button-prev{top:calc(50% - 10px);width:auto;height:auto;text-shadow:-1px 0 0 #fff,0 1px 0 #fff,1px 0 0 #fff,0 -1px 0 #fff;cursor:pointer;background-image:none;background-size:0}.swiper-button-next:focus,.swiper-button-prev:focus{outline:2px dotted #000;outline-offset:-1px}.swiper-button-next::before,.swiper-button-prev::before{font-family:icon-orange;font-size:1.875rem;content:"\e93f"}.swiper-button-next::before{content:"\e93e"}.swiper-pagination-bullet,.swiper-pagination-bullet-active{width:.625rem;height:.625rem;border:0}.swiper-pagination-bullet{opacity:1}.swiper-pagination-bullet-active{background:#f16e00}.swiper-container{width:100%!important;margin-bottom:30px;overflow:hidden}.swiper-wrapper{margin-bottom:30px}.swiper-pagination{bottom:6px}.swiper-slide .card{border:0}.swiper-slide .card-img{padding:0}.swiper-slide .card-img img{width:100%;height:40vh}.swiper-slide .card-title{margin:0;font-weight:700}.swiper-slide .card-body{position:absolute;bottom:20px;right:40px;background-color:#fff}.swiper-slide .card-body p{margin:0}@media (max-width:979.98px){.swiper-button-next,.swiper-button-prev{display:none}.swiper-container{overflow-x:hidden;overflow-y:visible}.swiper-slide{width:80%}.swiper-slide .card-img img{height:auto}.swiper-slide .card-body{position:static}.swiper-container-horizontal>.swiper-pagination-bullets{bottom:0}.swiper-pagination-bullet{width:8px;height:8px;border:0}}div.active:focus{outline:dotted 1px}a:focus{color:#f16e00;outline:dotted 1px}.close:focus,.close:hover{outline:dotted 1px}.progress.progress-default[value]::-webkit-progress-value{background-color:#f16e00}.progress.progress-default[value]::-moz-progress-bar{background-color:#f16e00}.hero-container .frame{position:absolute;top:0;right:0;max-width:15%;margin:30px}.hero-container .caption{margin:50px 30px}.hero-container .category{font-size:1.25rem;color:#f16e00}.svg-arrow-previous::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E")}.svg-arrow-next::after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E")}.stepbar-item::after{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.breadcrumb-item+.breadcrumb-item::before,.doc-link::after,.o-link-arrow.back::before,.o-link-arrow::after,.page-item.presentation+.page-item .page-link::before,.page-item:first-child .page-link::before,.page-item:last-child .page-link::before,.swiper-button-next,.swiper-button-prev{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.alert .alert-icon::after,.alert-sm .alert-icon::after{right:2%}.o-stepbar .stepbar-item.current::after,.o-stepbar .stepbar-item.done::after,.o-stepbar .stepbar-item::after,.page-item:last-child .page-link::before{right:unset}.custom-switch.right .custom-control-label::before{right:auto;left:0}.custom-switch .custom-control-label::before{background-position:.2rem}.custom-switch .custom-control-input:checked~.custom-control-label::before{background-position:2rem}.o-link-arrow.back::before{padding:0 .625rem 0 0}.popover{right:auto;left:0}
+/*# sourceMappingURL=boosted-rtl.min.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted-rtl.min.css.map b/dashboard/public/css/boosted-rtl.min.css.map
new file mode 100644
index 00000000..4167663a
--- /dev/null
+++ b/dashboard/public/css/boosted-rtl.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["..\\..\\scss\\boosted.scss","..\\..\\scss\\_root.scss","..\\..\\scss\\_reboot.scss","dist\\css\\boosted-rtl.css","..\\..\\scss\\vendor\\_rfs.scss","boosted.css","..\\..\\scss\\mixins\\_hover.scss","..\\..\\scss\\_type.scss","..\\..\\scss\\mixins\\_breakpoints.scss","..\\..\\scss\\mixins\\_lists.scss","..\\..\\scss\\_images.scss","..\\..\\scss\\mixins\\_image.scss","..\\..\\scss\\_code.scss","..\\..\\scss\\_grid.scss","..\\..\\scss\\mixins\\_grid.scss","..\\..\\scss\\mixins\\_grid-framework.scss","..\\..\\scss\\_tables.scss","..\\..\\scss\\mixins\\_table-row.scss","..\\..\\scss\\_forms.scss","..\\..\\scss\\mixins\\_border-radius.scss","..\\..\\scss\\mixins\\_transition.scss","..\\..\\scss\\mixins\\_forms.scss","..\\..\\scss\\mixins\\_orangeIcons.scss","..\\..\\scss\\mixins\\_gradients.scss","..\\..\\scss\\_buttons.scss","..\\..\\scss\\mixins\\_buttons.scss","..\\..\\scss\\_transitions.scss","..\\..\\scss\\_dropdown.scss","..\\..\\scss\\mixins\\_caret.scss","..\\..\\scss\\mixins\\_nav-divider.scss","..\\..\\scss\\_button-group.scss","..\\..\\scss\\_input-group.scss","..\\..\\scss\\_custom-forms.scss","..\\..\\scss\\_nav.scss","..\\..\\scss\\_navbar.scss","..\\..\\scss\\_variables.scss","..\\..\\scss\\_card.scss","..\\..\\scss\\_breadcrumb.scss","..\\..\\scss\\_pagination.scss","..\\..\\scss\\mixins\\_pagination.scss","..\\..\\scss\\_badge.scss","..\\..\\scss\\mixins\\_badge.scss","..\\..\\scss\\_jumbotron.scss","..\\..\\scss\\_alert.scss","..\\..\\scss\\mixins\\_alert.scss","..\\..\\scss\\_progress.scss","..\\..\\scss\\_media.scss","..\\..\\scss\\_list-group.scss","..\\..\\scss\\mixins\\_list-group.scss","..\\..\\scss\\_close.scss","..\\..\\scss\\_toasts.scss","..\\..\\scss\\_modal.scss","..\\..\\scss\\_tooltip.scss","..\\..\\scss\\mixins\\_reset-text.scss","..\\..\\scss\\_popover.scss","..\\..\\scss\\_carousel.scss","..\\..\\scss\\mixins\\_clearfix.scss","..\\..\\scss\\_spinners.scss","..\\..\\scss\\utilities\\_align.scss","..\\..\\scss\\mixins\\_background-variant.scss","..\\..\\scss\\utilities\\_background.scss","..\\..\\scss\\utilities\\_borders.scss","..\\..\\scss\\utilities\\_display.scss","..\\..\\scss\\utilities\\_embed.scss","..\\..\\scss\\utilities\\_flex.scss","..\\..\\scss\\utilities\\_float.scss","..\\..\\scss\\utilities\\_overflow.scss","..\\..\\scss\\utilities\\_position.scss","..\\..\\scss\\utilities\\_screenreaders.scss","..\\..\\scss\\mixins\\_screen-reader.scss","..\\..\\scss\\utilities\\_shadows.scss","..\\..\\scss\\utilities\\_sizing.scss","..\\..\\scss\\utilities\\_stretched-link.scss","..\\..\\scss\\utilities\\_spacing.scss","..\\..\\scss\\utilities\\_text.scss","..\\..\\scss\\mixins\\_text-truncate.scss","..\\..\\scss\\mixins\\_text-emphasis.scss","..\\..\\scss\\mixins\\_text-hide.scss","..\\..\\scss\\utilities\\_visibility.scss","..\\..\\scss\\_print.scss","..\\..\\scss\\_o-card.scss","..\\..\\scss\\_o-switches.scss","..\\..\\scss\\_o-forms.scss","..\\..\\scss\\_o-bullet_points.scss","..\\..\\scss\\_o-step_bar.scss","..\\..\\scss\\_o-link-arrow.scss","..\\..\\scss\\_o-megamenu.scss","..\\..\\scss\\_o-navbar.scss","..\\..\\scss\\_o-tables.scss","..\\..\\scss\\_o-modal.scss","..\\..\\scss\\_o-nav.scss","..\\..\\scss\\_o-nav-local.scss","..\\..\\scss\\_o-skiplinks.scss","..\\..\\scss\\_o-footer.scss","..\\..\\scss\\_o-responsive_table.scss","..\\..\\scss\\_o-scroll-up.scss","..\\..\\scss\\_o-dropdown.scss","..\\..\\scss\\_o-carousel.scss","..\\..\\scss\\_orange-css.scss","boosted-rtl.css"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n\n// boosted mod\n@import \"o-card\";\n@import \"o-switches\";\n@import \"o-forms\";\n@import \"o-bullet_points\";\n@import \"o-step_bar\";\n@import \"o-link-arrow\";\n@import \"o-megamenu\";\n@import \"o-navbar\";\n@import \"o-tables\";\n@import \"o-modal\";\n@import \"o-nav\";\n@import \"o-nav-local\";\n@import \"o-skiplinks\";\n@import \"o-footer\";\n@import \"o-responsive_table\";\n@import \"o-scroll-up\";\n@import \"o-dropdown\";\n@import \"o-carousel\";\n@import \"orange-css\";\n// end mod\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// Boosted Mod\np a {\n text-decoration: underline;\n\n @include hover-focus {\n text-decoration: underline;\n }\n}\n// End mod\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: right;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-right: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: right;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-right: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-right: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-left: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-left: auto;\n margin-right: auto;\n padding-left: 5px;\n padding-right: 5px;\n margin-left: 1.25%;\n margin-right: 1.25%;\n max-width: 312px;\n margin-left: auto;\n margin-right: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-left: 1.25%;\n margin-right: 1.25%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-left: 1.5625%;\n margin-right: 1.5625%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-left: 4.16667%;\n margin-right: 4.16667%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.container-fluid {\n margin-left: auto;\n margin-right: auto;\n padding-left: 5px;\n padding-right: 5px;\n margin-left: 1.25%;\n margin-right: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-left: 1.25%;\n margin-right: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-left: 1.5625%;\n margin-right: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-left: 4.16667%;\n margin-right: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-left: -5px;\n margin-right: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-left: -5px;\n margin-right: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n.no-gutters {\n margin-left: 0;\n margin-right: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-left: 0;\n padding-right: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-left: 5px;\n padding-right: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-right: 8.333333%;\n}\n\n.offset-2 {\n margin-right: 16.666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.333333%;\n}\n\n.offset-5 {\n margin-right: 41.666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.333333%;\n}\n\n.offset-8 {\n margin-right: 66.666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.333333%;\n}\n\n.offset-11 {\n margin-right: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.333333%;\n }\n .offset-sm-2 {\n margin-right: 16.666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.333333%;\n }\n .offset-sm-5 {\n margin-right: 41.666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.333333%;\n }\n .offset-sm-8 {\n margin-right: 66.666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.333333%;\n }\n .offset-sm-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.333333%;\n }\n .offset-md-2 {\n margin-right: 16.666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.333333%;\n }\n .offset-md-5 {\n margin-right: 41.666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.333333%;\n }\n .offset-md-8 {\n margin-right: 66.666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.333333%;\n }\n .offset-md-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.333333%;\n }\n .offset-lg-2 {\n margin-right: 16.666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.333333%;\n }\n .offset-lg-5 {\n margin-right: 41.666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.333333%;\n }\n .offset-lg-8 {\n margin-right: 66.666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.333333%;\n }\n .offset-lg-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.333333%;\n }\n .offset-xl-2 {\n margin-right: 16.666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.333333%;\n }\n .offset-xl-5 {\n margin-right: 41.666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.333333%;\n }\n .offset-xl-8 {\n margin-right: 66.666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.333333%;\n }\n .offset-xl-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xxl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xxl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xxl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xxl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xxl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xxl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xxl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xxl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xxl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xxl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xxl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xxl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xxl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xxl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0 0.625rem 0.625rem;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0 0.3125rem 0.3125rem;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-right: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::-webkit-input-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-left: 0;\n padding-right: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-left: -5px;\n margin-right: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-right: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-right: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-right: 0;\n margin-left: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-left: 0.3125rem;\n margin-right: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-right: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n right: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-left: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-left: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-right: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n right: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-left: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-left: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-right: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-top: 0;\n margin-left: 0.25rem;\n margin-right: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n border-bottom: 0;\n border-right: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n right: 0;\n z-index: 1000;\n display: none;\n float: right;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: right;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n left: auto;\n right: 0;\n}\n\n.dropdown-menu-right {\n left: 0;\n right: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-sm-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-md-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-lg-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-xl-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-xxl-right {\n left: 0;\n right: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-left: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n left: auto;\n right: 100%;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-left: 0;\n border-bottom: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n left: 100%;\n right: auto;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n left: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-right: -2px;\n}\n\n.dropdown-toggle-split {\n padding-left: 0.84375rem;\n padding-right: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-right: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-left: 0.46875rem;\n padding-right: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-left: 0.9375rem;\n padding-right: 0.9375rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-right: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-right: -2px;\n}\n\n.input-group-prepend {\n margin-left: -2px;\n}\n\n.input-group-append {\n margin-right: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-right-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-left: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-right: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-left: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n right: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n right: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n top: .4rem;\n right: .2585rem;\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n -webkit-transform: rotate(-45deg);\n transform: rotate(-45deg);\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-left: none;\n border-right: none;\n -webkit-transform: scaleX(0.5) translateY(-0.5rem);\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-right: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n right: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n right: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-left: 4.375rem;\n padding-right: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n left: 0;\n right: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n left: calc(1.875rem + 2px);\n right: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n -webkit-transform: translateX(-1.875rem);\n transform: translateX(-1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 0.5rem 0.4375rem 1.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-left: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-right: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-right: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-right: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-left: 0.125rem;\n margin-right: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-left: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-right: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding-left: 0;\n padding-right: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n -ms-flex-item-align: end;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-left: 0;\n margin-right: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-right: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-left: .625rem;\n padding-bottom: .875rem;\n padding-right: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: left;\n margin-left: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-right: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem .625rem .875rem 0;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-item-align: end;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n -ms-flex-align: stretch;\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 0 0 .625rem;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-left: 0;\n margin-right: 0;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-right: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-left: -0.625rem;\n margin-bottom: -0.75rem;\n margin-right: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-left: -0.625rem;\n margin-right: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-left: -2.5rem;\n margin-right: -2.5rem;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-left: 2.5rem;\n margin-bottom: 0;\n margin-right: 2.5rem;\n }\n}\n\n.card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-right: 0;\n border-right: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 0 1rem 2.125rem;\n line-height: 1.125rem;\n text-align: right;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n left: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n -webkit-transform: rotate(-180deg);\n transform: rotate(-180deg);\n}\n\n.accordion .card-body {\n padding: 0 0 0 1.5rem;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-right: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-right: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-right: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-left: 1.125rem;\n padding-right: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-left: 2rem;\n padding-right: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-right: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-left: 0;\n padding-right: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-left: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n left: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 100% 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 100% 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-right: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-left: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-left: 0;\n border-right: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: left;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -50px);\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: none;\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: -ms-flexbox;\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem auto -0.625rem -0.625rem;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-right: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-left: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: right;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: right;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n right: 50%;\n display: block;\n width: 0.625rem;\n margin-right: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: right;\n width: 100%;\n margin-left: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n -webkit-transform: none;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n right: 0;\n}\n\n.carousel-control-next {\n left: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-right: 0;\n margin-left: 1.875rem;\n margin-right: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-left: 3px;\n margin-right: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n bottom: 20px;\n right: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n -webkit-transform: rotate(-360deg);\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spinner-border {\n to {\n -webkit-transform: rotate(-360deg);\n transform: rotate(-360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-left-color: transparent;\n border-radius: 50%;\n -webkit-animation: spinner-border .75s linear infinite;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: spinner-grow .75s linear infinite;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-left: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-right: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-left: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-right: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-right-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-left-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xxl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xxl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xxl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: right !important;\n}\n\n.float-right {\n float: left !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: right !important;\n }\n .float-sm-right {\n float: left !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: right !important;\n }\n .float-md-right {\n float: left !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: right !important;\n }\n .float-lg-right {\n float: left !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: right !important;\n }\n .float-xl-right {\n float: left !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: right !important;\n }\n .float-xxl-right {\n float: left !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: right !important;\n}\n\n.text-right {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: right !important;\n }\n .text-sm-right {\n text-align: left !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: right !important;\n }\n .text-md-right {\n text-align: left !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: right !important;\n }\n .text-lg-right {\n text-align: left !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: right !important;\n }\n .text-xl-right {\n text-align: left !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: right !important;\n }\n .text-xxl-right {\n text-align: left !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n -ms-flex-item-align: center;\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n -ms-flex-direction: column;\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n -ms-flex-direction: row;\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n -ms-flex-preferred-size: 20%;\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n -ms-flex-preferred-size: 80%;\n flex-basis: 80%;\n -ms-flex-item-align: center;\n align-self: center;\n padding: 0 1rem;\n text-align: right;\n }\n .o-card-link .card-title {\n -ms-flex-item-align: start;\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n left: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: right;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n right: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: left;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n left: -.125rem;\n right: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n left: 0;\n right: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-pack: start;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-left: 0;\n padding-right: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n -ms-flex-order: 1;\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-right: .625rem;\n}\n\n.form-group.row.top {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.form-group.row.top .form-control {\n -ms-flex-order: 2;\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n -ms-flex-item-align: center;\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-right: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-right: 0;\n color: #f16e00;\n text-align: right;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-left: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-right: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: right;\n padding: 0.625rem 1.25rem;\n padding-right: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-right: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 2rem 0.3125rem 0.625rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n left: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-left: 0;\n padding-right: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-right: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: -webkit-transform .5s;\n transition: transform .5s;\n transition: transform .5s, -webkit-transform .5s;\n -webkit-transform: translateX(0);\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n right: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n left: 0;\n right: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-right: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n left: 0;\n right: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n -webkit-transform: rotateZ(-180deg);\n transform: rotateZ(-180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-right: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n -ms-flex-item-align: center;\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-right: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-left: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-left: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-left: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-right: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-left: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-right: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-left: 30px;\n text-align: right;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-left: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n -webkit-transform: rotate(-180deg);\n transform: rotate(-180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: right;\n}\n\n.modal .modal-content {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n left: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: row;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-left: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n -ms-flex-item-align: end;\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-right: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n -ms-flex-direction: column;\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n -ms-flex-item-align: center;\n align-self: center;\n margin-left: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n -ms-flex-item-align: center;\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-right: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-right: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-right: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-right: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-right: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-right: 0;\n }\n}\n\n.o-tab-container {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-right: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-right: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n -ms-flex-item-align: end;\n align-self: flex-end;\n -ms-flex-order: 1;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n -ms-flex-positive: 1;\n flex-grow: 1;\n margin-right: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-right: 0;\n font-weight: 700;\n color: #000;\n text-align: right;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n -webkit-transform: rotate(-180deg);\n transform: rotate(-180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-right: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n left: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-right: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-right: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-right: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n left: 0;\n right: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem 1.25rem .625rem .625rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n}\n\n.o-nav-local ul + ul {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-right: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-right: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-right: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem 1.25rem .625rem .625rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: right;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none none none solid;\n border-width: 0 0 0 1px;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n right: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-right: -175px;\n overflow: hidden;\n background: none repeat scroll 100% 0 #ccc;\n border: 2px solid #000;\n box-shadow: -2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 100% 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: right;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-left: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: right;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-left: 0;\n border-right: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n left: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n left: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n float: left;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n left: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n left: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n left: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n left: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n left: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: right;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: right;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-right: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-right: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n -ms-flex-positive: 0;\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-left: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n right: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n right: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}.svg-arrow-previous::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.stepbar-item::after {\n -webkit-transform: rotateY(180deg);\n transform: rotateY(180deg);\n}\n\n.page-item:last-child .page-link::before,\n.page-item:first-child .page-link::before,\n.page-item.presentation + .page-item .page-link::before,\n.swiper-button-prev,\n.swiper-button-next,\n.doc-link::after,\n.breadcrumb-item + .breadcrumb-item::before,\n.o-link-arrow::after,\n.o-link-arrow.back::before {\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.alert .alert-icon::after,\n.alert-sm .alert-icon::after {\n right: 2%;\n}\n\n.o-stepbar .stepbar-item::after,\n.page-item:last-child .page-link::before,\n.o-stepbar .stepbar-item.current::after,\n.o-stepbar .stepbar-item.done::after {\n right: unset;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: auto;\n left: 0;\n}\n\n.custom-switch .custom-control-label::before {\n background-position: .2rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-position: 2rem;\n}\n\n.o-link-arrow.back::before {\n padding: 0 .625rem 0 0;\n}\n\n.popover {\n right: auto;\n left: 0;\n}\n/*# sourceMappingURL=boosted-rtl.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0.625rem 0.625rem 0;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0.3125rem 0.3125rem 0;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0;\n border-bottom: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -2px;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.84375rem;\n padding-left: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.46875rem;\n padding-left: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.9375rem;\n padding-left: 0.9375rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -2px;\n}\n\n.input-group-prepend {\n margin-right: -2px;\n}\n\n.input-group-append {\n margin-left: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-left: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n /* rtl:begin:ignore */\n top: .4rem;\n /* rtl:end:ignore */\n left: .2585rem;\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n /* rtl:end:ignore */\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-left: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n left: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-right: 4.375rem;\n padding-left: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: 0;\n left: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n right: calc(1.875rem + 2px);\n left: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 1.5rem 0.4375rem 0.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-left: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-left: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-left: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.125rem;\n margin-left: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-left: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 .625rem 0 0;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -2.5rem;\n margin-left: -2.5rem;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 2.5rem;\n margin-bottom: 0;\n margin-left: 2.5rem;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n}\n\n.accordion .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-left: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-left: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-left: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem -0.625rem -0.625rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 0.625rem;\n margin-left: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 1.875rem;\n margin-left: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-right: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-left: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: left !important;\n }\n .float-xxl-right {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: left !important;\n }\n .text-xxl-right {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n .o-card-link .card-title {\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: right;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n right: 0;\n left: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: flex;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n}\n\n.form-group.row.top {\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n order: 1;\n}\n\n.form-group.row.top .form-control {\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-left: 0;\n color: #f16e00;\n text-align: left;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-left: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: left;\n padding: 0.625rem 1.25rem;\n padding-left: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-left: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 0.625rem 0.3125rem 2rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n right: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-left: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0.625rem 0 0;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-left: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-left: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-right: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-right: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-left: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n transform: rotate(180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: left;\n}\n\n.modal .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-right: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-left: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n align-self: center;\n margin-right: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-left: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-left: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: 0;\n }\n}\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: 700;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-left: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: flex;\n}\n\n.o-nav-local ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-left: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-left: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: left;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 #ccc;\n border: 2px solid #000;\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: left;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-right: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n right: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n align-items: center;\n justify-content: center;\n float: right;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n /* rtl:ignore */\n transform: rotate(90deg);\n /* rtl:ignore */\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n right: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n right: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n right: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n\n/*# sourceMappingURL=boosted.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n// Boosted mod\n// reduce the size of titles for mobile display\n@include media-breakpoint-down(sm) {\n h1, .h1 { @include font-size($h1-font-size-mobile); }\n h2, .h2 { @include font-size($h2-font-size-mobile); }\n h3, .h3 { @include font-size($h3-font-size-mobile); }\n h4, .h4 { @include font-size($h4-font-size-mobile); }\n h5, .h5 { @include font-size($h5-font-size-mobile); }\n h6, .h6 { @include font-size($h6-font-size-mobile); }\n}\n// end mod\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n width: 100%; // Boosted mod\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n width: auto; // Boosted mod\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n@mixin make-container($gutters: $grid-gutter-widths) {\n margin-right: auto;\n margin-left: auto;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n // width: 100%; //Boosted mod our fluid is not 100% width\n }\n }\n\n // boosted mod\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n margin-right: $container-margin;\n margin-left: $container-margin;\n // reset margin for second level container\n .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n }\n }\n // end mod\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n // boosted mod\n margin-right: auto;\n margin-left: auto;\n // end mod\n }\n }\n}\n\n@mixin make-gutters($gutters: $grid-gutter-widths) {\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n }\n}\n\n@mixin make-row($gutters: $grid-gutter-widths) {\n display: flex;\n flex-wrap: wrap;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n }\n }\n}\n\n@mixin make-col-ready($gutters: $grid-gutter-widths) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n }\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n\n@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n @include make-gutters($gutters);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, 0)); // Boosted mod let color as is\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n // Boosted mod adapt color with background\n @if ($state == \"secondary\" or $state == \"danger\" or $state == \"dark\") {\n color: $white;\n }\n // end mod\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Boosted mod\n// Orange brand, labels are always bold\nlabel {\n font-weight: $font-weight-bold;\n &.disabled {\n color: $custom-control-label-disabled-color;\n }\n &.is-required::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n}\n// end mod\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n color: #666; // boosted mod\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n &[size],\n &[multiple] {\n height: auto;\n }\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$form-grid-gutter-width / 2;\n margin-left: -$form-grid-gutter-width / 2;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: $form-grid-gutter-width / 2;\n padding-left: $form-grid-gutter-width / 2;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// stylelint-disable property-blacklist\n@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @if $enable-prefers-reduced-motion-media-query {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n // Boosted mod, remove box shadow!\n // box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-weight: $font-weight-bold; // Boosted Mod\n // color: $color; // Boosted Mod\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n .form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n // Boosted Mod\n // @if $enable-validation-icons {\n // padding-right: $input-height-inner;\n // background-image: $icon;\n // background-repeat: no-repeat;\n // background-position: center right $input-height-inner-quarter;\n // background-size: $input-height-inner-half $input-height-inner-half;\n // }\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n // Boosted Mod\n ~ .#{$state}-feedback {\n @if $enable-validation-icons {\n @if $state == \"valid\" {\n @include svg-success();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n } @else {\n @include svg-error();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n }\n position: relative;\n display: block;\n padding-left: 1.625rem;\n }\n\n ~ .#{$state}-tooltip {\n display: block;\n }\n // End Mod\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right;\n background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\n }\n\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25); // Boosted mod, remove box shadow!\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n // Boosted mod, remove box shadow!\n // ~ .custom-control-label::before {\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n // }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n }\n }\n }\n}\n","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n color: $body-color;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n @include hover {\n color: $body-color;\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Boosted mod\na.btn {\n text-decoration: none; // Boosted mod remove underline for a.btn\n}\n// End mod\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n// boosted mod custom buttons\n// @mixin button-variant($background, $border, $hover-background, $hover-border, $active-background, $active-border, $disabled-background, $disabled-border, $disabled-color, $color) {\n.btn-primary,\n.btn-warning {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $black, $black, $white, $black, $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $white, $white, $black, $white, $gray-700, $gray-700, $black, $white);\n }\n}\n.btn-secondary,\n.btn-light {\n @include button-variant(transparent, $black, $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-500, $gray-500, $black);\n &.btn-inverse {\n @include button-variant($white, $white, $black, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-success {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $black);\n &.btn-inverse {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-info,\n.btn-dark {\n @include button-variant($black, $black, $white, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(transparent, $white, $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-700, $gray-700, $white);\n }\n}\n.btn-danger {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black);\n }\n}\n\n// Boosted mod custom outline buttons values\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @if $color == \"light\" {\n @include button-outline-variant($value, $gray-900);\n } @else {\n @if $color == \"warning\" {\n @include button-outline-variant(theme-color(\"primary\"), $black);\n } @else {\n @if $color == \"info\" {\n @include button-outline-variant(theme-color(\"secondary\"), $black);\n } @else {\n @include button-outline-variant($value, $black);\n }\n }\n }\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n // font-weight: $font-weight-normal; // Boosted mod font-weight stay bold\n color: $link-color;\n\n // Boosted mod\n &.btn-inverse {\n color: #fff;\n }\n // end mod\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-xlg {\n @include button-size($btn-padding-y-xlg, $btn-padding-x-xlg, $font-size-xlg, $btn-line-height-xlg, $btn-border-radius-xlg);\n}\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n// Social Media\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n// boosted mod add default color, disable-background and disabled-border and disabled-color option\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%), $disabled-background: $background, $disabled-border: border, $disabled-color: color-yiq($background), $color: color-yiq($background)) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover-focus { // Boosted mod replace hover by hover focus cause we remove box-shadow\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: $disabled-color; // Boosted mod\n background-color: $disabled-background; // Boosted var disabled\n border-color: $disabled-border; // Boosted var disabled\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover-focus { //Boosted mod focus has same as hover\n color: #fff; // Boosted mod\n background-color: #000; // Boosted mod\n border-color: #000 // Boosted mod\n }\n\n // &:focus,\n // &.focus {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n // }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: #000; // Boosted mod\n background-color: #f16e00; // Boosted mod\n border-color: #f16e00; // Boosted mod\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-control-plaintext,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .custom-select:focus,\n > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n }\n\n // Bring the custom file input above the label\n > .custom-file .custom-file-input:focus {\n z-index: 4;\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n// Boosted mod\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n// End mod\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n @include font-size($input-font-size); // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: $font-size-base * $line-height-base;\n padding-left: $custom-control-gutter + $custom-control-indicator-size;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n // Boosted mod our custom control have a border\n border-color: $custom-control-indicator-checked-border-color;\n // end mod\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n // Boosted mod move gradient to global settings, to change the color for disabled checked elements\n &::before {\n @include gradient-bg($custom-control-indicator-checked-bg);\n }\n // end mod\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n outline: dotted 1px $black; // Boosted mod no box-shadow, replaced by outline\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n }\n\n // &:focus:not(:checked) ~ .custom-control-label::before {\n // border-color: $custom-control-indicator-focus-border-color;\n // }\n\n &:not(:disabled):active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n border-color: $custom-control-indicator-active-border-color;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n // Boosted mod\n // our custom control have a border\n border-color: $custom-control-indicator-disabled-bg;\n // end mod\n }\n }\n // Boosted mod disable bg only for checked elements\n &:checked ~ .custom-control-label {\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n //position: relative; // boosted mod checkbox in table are misaligned\n margin-bottom: 0;\n vertical-align: top;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background-color: $custom-control-indicator-bg;\n border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n // Boosted Mod\n .custom-control-input:not(:disabled):checked ~ .custom-control-label {\n &::before {\n border: 2px solid $primary;\n }\n }\n // End Mod\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n //Boosted mod\n\n /* rtl:begin:ignore */\n top: .4rem;\n\n /* rtl:end:ignore */\n left: .2585rem;\n\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n\n /* rtl:end:ignore */\n //End mod\n }\n }\n\n // Boosted mod\n .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: $black; // Boosted mod no box-shadow, replaced by outline\n }\n //end mod\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n border-color: $custom-checkbox-indicator-indeterminate-border-color;\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n //Accessiblity issue DO NOT remove\n //boosted mod\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(.5) translateY(-.5rem);\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // &:indeterminate ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n //}\n // end mod\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n // stylelint-disable-next-line property-blacklist\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::before {\n //boosted mod\n background-color: $white;\n border-color: $white;\n //end mod\n }\n\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border: 6px solid $primary;\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n //end mod\n }\n }\n\n .custom-control-input:disabled:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border-color: $custom-control-indicator-disabled-bg;\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // }\n // end mod\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n padding-left: $custom-switch-width + $custom-control-gutter;\n\n .custom-control-input {\n @include focus {\n ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n }\n }\n }\n\n .custom-control-label {\n padding-top: .3125rem; // Boosted mod vertical align fix for label\n &::before {\n left: 0; // boosted mod\n width: $custom-switch-width;\n height: $custom-switch-height; // boosted mod\n pointer-events: all;\n background-color: $custom-control-indicator-border-color; // boosted mod\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\"); // boosted mod\n background-repeat: no-repeat; // boosted mod\n background-position: 1.975rem; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n }\n\n &::after {\n top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width}); // boosted mod\n left: $custom-control-indicator-border-width; // boosted mod\n width: $custom-switch-indicator-width; // boosted mod\n height: $custom-switch-indicator-height; // boosted mod\n background-color: $custom-switch-indicator-bg-color; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n @include transition(transform .15s ease-in-out, $custom-forms-transition);\n }\n }\n // boosted mod create a right aligned switch\n &.right {\n padding-right: $custom-switch-width + $custom-control-gutter;\n padding-left: 0;\n .custom-control-label {\n &::before {\n right: 0;\n left: auto;\n }\n\n &::after {\n right: calc(#{($custom-switch-width / 2)} + #{$custom-control-indicator-border-width});\n left: auto;\n }\n }\n }\n // end mod\n .custom-control-input:checked ~ .custom-control-label {\n // boosted mod\n &::before {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n background-repeat: no-repeat;\n background-position: .25rem;\n }\n // end mod\n &::after {\n background-color: $custom-control-indicator-bg;\n transform: translateX($custom-switch-width / 2); // boosted mod change the indicator size\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n ~ .custom-control-label::before {\n background-color: $custom-control-indicator-disabled-bg; // boosted mod\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n font-family: $custom-select-font-family;\n @include font-size($custom-select-font-size);\n font-weight: $custom-select-font-weight;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-background;\n background-color: $custom-select-bg;\n border: $custom-select-border-width solid $custom-select-border-color;\n @include border-radius($custom-select-border-radius, 0);\n // @include box-shadow($custom-select-box-shadow); //boosted mod no box-shadow\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\n } @else {\n box-shadow: $custom-select-focus-box-shadow;\n }\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n display: none;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y-sm;\n padding-bottom: $custom-select-padding-y-sm;\n padding-left: $custom-select-padding-x-sm;\n @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y-lg;\n padding-bottom: $custom-select-padding-y-lg;\n padding-left: $custom-select-padding-x-lg;\n @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n }\n\n &:disabled ~ .custom-file-label {\n background-color: $custom-file-disabled-bg;\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n\n ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n font-family: $custom-file-font-family;\n font-weight: $custom-file-font-weight;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: inherit;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: 0; // Edge specific\n margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: $custom-range-thumb-height / 2;\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &:disabled {\n &::-webkit-slider-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: default;\n }\n\n &::-moz-range-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-moz-range-track {\n cursor: default;\n }\n\n &::-ms-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n @include transition($custom-forms-transition);\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n // Boosted mod\n font-weight: $font-weight-bold;\n // end mod\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n // Boosted mod\n // remove border from nav-link padding in tabs\n padding: $nav-link-padding-y calc(#{$nav-link-padding-x} - #{$nav-tabs-border-width});\n line-height: 1rem;\n // end mod\n border: $nav-tabs-border-width solid transparent;\n\n // Boosted mod\n // Border bottom width to 0 for display\n border-bottom-width: 0;\n // end mod\n\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n color: $nav-tabs-link-hover-color; // boosted mod\n background-color: $nav-tabs-link-hover-bg; // boosted mod\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n font-weight: $font-weight-bold; // Boosted mod\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1; // booosted mod\n align-items: center;\n justify-content: space-between;\n padding-right: 0; // boosted mod\n padding-left: 0; // boosted mod\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end; // boosted mod\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin: .625rem .3125rem; // boosted mod\n @include font-size($navbar-brand-font-size);\n font-weight: $font-weight-bold; // boosted mod\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Boosted mod\n + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n }\n\n @include focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n }\n\n img {\n flex-wrap: wrap;\n width: $navbar-brand-logo-height;\n height: $navbar-brand-logo-height;\n margin-top: 0;\n margin-bottom: .25rem;\n }\n // end mod\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-top: auto; // boosted mod\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n //Boosted mod\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n\n &.active::before {\n display: none;\n }\n\n &.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n }\n\n &[class^=\"svg-\"] {\n margin: .625rem;\n }\n\n &[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: $font-size-base;\n font-weight: $font-weight-normal;\n color: #fff;\n content: \"\\e93e\";\n }\n\n @include focus {\n outline-offset: .625rem;\n }\n // end mod\n }\n\n .dropdown-menu {\n position: static;\n top: 2rem; // boosted mod\n float: none;\n }\n\n // boosted mod\n .nav-item {\n margin-left: 0;\n font-size: $h5-font-size;\n border-top: 1px solid $gray-900;\n }\n\n .dropdown {\n padding: 0;\n\n .dropdown-toggle,\n .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n }\n\n &.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n }\n\n .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid $gray-900;\n\n @include focus {\n color: $primary;\n }\n }\n }\n // end mod\n}\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n // align-items: center; // boosted mod\n align-self: flex-end; // boosted mod\n // Boosted mod\n .navbar-nav {\n align-items: stretch;\n }\n // end mod\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n margin: ($spacer / 4) 0; // boosted mod\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n // Boosted mod\n background-color: #fff;\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-hover-bg;\n }\n // end mod\n }\n // Boosted mod\n &:active {\n background-color: theme-color(\"primary\");\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n }\n\n &:focus {\n outline: 0;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .navbar-toggler elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n height: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n // Boosted mod\n // > .container,\n // > .container-fluid {\n // padding-right: 0;\n // padding-left: 0;\n // }\n // boosted mod\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: $navbar-expanded-padding-y $navbar-expanded-padding-x 1.3125rem; // boosted mod\n\n // Boosted mod\n .navbar-brand {\n margin: 0 .625rem 0 0;\n\n img {\n width: $navbar-brand-logo-expanded-height;\n height: $navbar-brand-logo-expanded-height;\n }\n }\n\n &.minimized {\n padding-top: $navbar-expanded-minimized-padding-y;\n padding-bottom: 1rem;\n\n .navbar-brand {\n img {\n width: $navbar-brand-logo-minimized-height;\n height: $navbar-brand-logo-minimized-height;\n }\n }\n }\n // end mod\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n // Boosted mod\n .dropdown-item {\n color: $black;\n background-color: $white;\n border: 0;\n\n &.active,\n &:hover {\n color: $white;\n background-color: $black;\n }\n }\n\n .nav-item {\n font-size: $font-size-base;\n border: 0;\n\n &.dropdown {\n align-self: flex-end;\n }\n }\n // end mod\n\n .nav-link {\n padding-top: 0; // boosted mod\n padding-right: $navbar-nav-link-padding-x;\n padding-bottom: 0; // boosted mod\n padding-left: $navbar-nav-link-padding-x;\n margin-left: 1.25rem; // boosted mod\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n padding-right: $grid-gutter-width / 2; // boosted mod\n padding-left: $grid-gutter-width / 2; // boosted mod\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n @include hover-focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n @include hover-focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-spacer-y / 2;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n font-weight: $font-weight-bold; // boosted mod\n color: $card-cap-color;\n background-color: $black; // boosted mod\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-spacer-x / 2;\n margin-bottom: -$card-spacer-y;\n margin-left: -$card-spacer-x / 2;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -$card-spacer-x / 2;\n margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n /* boosted mod */\n\n .card {\n margin-bottom: 0;\n border: 0;\n // border 1px for first child only\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n\n .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n\n &,\n h5 {\n margin: 0;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n button,\n a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n\n &::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &[aria-expanded=\"true\"]::after { // stylelint-disable-line selector-no-qualifying-type\n transform: rotate(180deg);\n }\n }\n }\n\n .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n }\n}\n// For mobile display emphase the border\n@include media-breakpoint-down(sm) {\n .accordion .card {\n // border 1px for first child only\n border-top-width: 2px;\n border-bottom-width: 2px;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n // boosted mod\n // margin-bottom: $breadcrumb-margin-bottom;\n font-size: $breadcrumb-font-size;\n font-weight: $font-weight-bold;\n line-height: $breadcrumb-line-height;\n // end mod\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n padding-left: $breadcrumb-item-padding;\n // boosted mod\n font-family: $breadcrumb-font-family;\n font-size: $breadcrumb-divider-font-size;\n line-height: 1;\n // end mod\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n// stylelint-disable selector-max-class\n\n.page-link {\n position: relative;\n display: block;\n // Boosted mod\n min-width: $pagination-min-width;\n min-height: $pagination-min-width;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: 0;\n font-weight: $font-weight-bold;\n // End mod\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover,\n &:focus {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border; // Boosted mod\n\n // Boosted mod\n span {\n color: $pagination-color;\n }\n // end mod\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n\n // Boosted mod\n span {\n color: $pagination-bg;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .page-link elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n.page-item {\n // Boosted mod\n &.presentation {\n padding: .625rem 0;\n font-weight: $font-weight-bold;\n }\n &.presentation + .page-item,\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-prev};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-prev-active};\n }\n }\n &.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n }\n }\n }\n\n &.presentation + .page-item,\n &:first-child,\n &:last-child {\n .page-link {\n @include hover-focus {\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n &:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n }\n }\n\n // End mod\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n // Boosted mod\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-next};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-next-active};\n }\n }\n &.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n }\n // End mod\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n .page-link:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n\n // Boosted mod\n &.active:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-active};\n }\n\n &.active:last-child .page-link::before {\n background-image: #{$pagination-icon-next-active};\n }\n // end mod\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n\n // Boosted mod\n &.disabled:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-disabled};\n }\n\n &.disabled:last-child .page-link::before {\n background-image: #{$pagination-icon-next-disabled};\n }\n\n + .page-item {\n margin-left: .625rem;\n }\n // End mod\n}\n\n//\n// Sizing\n//\n// Boosted mod add a min size param\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg, $pagination-min-width-lg);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: 1.03125rem;\n }\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm, $pagination-min-width-sm);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: .53125rem;\n }\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius, $pagination-min-width) {\n .page-link {\n min-width: $pagination-min-width; // Boosted mod\n min-height: $pagination-min-width; // Boosted mod\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include transition($badge-transition);\n\n @at-root a#{&} {\n @include hover-focus {\n text-decoration: none;\n }\n }\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n\n// Boosted mod\n.badge[href] {\n @include focus {\n outline-color: #fff;\n outline-offset: -1px;\n\n &.badge-light {\n outline-color: #000;\n }\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n// stylelint-disable declaration-no-important\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n .alert-icon {\n position: absolute;\n top: .625rem;\n &::after {\n width: alert-logo-size(\"md\");\n height: alert-logo-size(\"md\");\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n}\n\n// boosted mod\n.alert-sm {\n padding: $alert-padding-y-sm $alert-padding-x-sm;\n .alert-icon {\n top: .4375rem;\n &::after {\n width: alert-logo-size(\"sm\");\n height: alert-logo-size(\"sm\");\n }\n }\n}\n\n.alert-lg {\n padding: $alert-padding-y-lg $alert-padding-x-lg;\n .alert-icon {\n top: .625rem;\n &::after {\n width: alert-logo-size(\"lg\");\n height: alert-logo-size(\"lg\");\n }\n }\n}\n//end mode\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $close-font-size + $alert-padding-x * 2;\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n line-height: $alert-padding-y; // boosted mod\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n // Boosted mod adapt color with background, and keep initial brand color value for background\n @if ($color == \"secondary\" or $color == \"danger\" or $color == \"dark\") {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $white);\n } @else {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $black);\n }\n // end mod\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n// BOOSTED MOD progress is half height on mobile\n@include media-breakpoint-down(md) {\n .progress {\n width: 100%;\n height: ($progress-height / 2);\n line-height: ($progress-height / 2);\n }\n .progress-bar {\n font-size: $font-size-sm;\n line-height: ($progress-height / 2);\n }\n}\n// end mod\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n color: $list-group-color;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n .list-group-item {\n margin-right: -$list-group-border-width;\n margin-bottom: 0;\n\n &:first-child {\n @include border-left-radius($list-group-border-radius);\n @include border-top-right-radius(0);\n }\n\n &:last-child {\n margin-right: 0;\n @include border-right-radius($list-group-border-radius);\n @include border-bottom-left-radius(0);\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:last-child {\n margin-bottom: -$list-group-border-width;\n }\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, 0), $black); // boosted mod\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: 1; // boosted mod\n\n // Override <a>'s hover style\n @include hover {\n color: $close-color;\n text-decoration: none;\n }\n\n &:not(:disabled):not(.disabled) {\n @include hover-focus {\n opacity: 1; // boosted mod\n }\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n pointer-events: none;\n}\n",".toast {\n max-width: $toast-max-width;\n overflow: hidden; // cheap rounded corners on nested items\n @include font-size($toast-font-size);\n color: $toast-color;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n backdrop-filter: blur(10px);\n opacity: 0;\n @include border-radius($toast-border-radius);\n\n &:not(:last-child) {\n margin-bottom: $toast-padding-x;\n }\n\n &.showing {\n opacity: 1;\n }\n\n &.show {\n display: block;\n opacity: 1;\n }\n\n &.hide {\n display: none;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n // Kill the scroll on the body\n overflow: hidden;\n\n .modal {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n}\n\n.modal-dialog-scrollable {\n display: flex; // IE10/11\n max-height: calc(100% - #{$modal-dialog-margin * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\n overflow: hidden;\n }\n\n .modal-header,\n .modal-footer {\n flex-shrink: 0;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - #{$modal-dialog-margin * 2});\n\n // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n &::before {\n display: block; // IE10\n height: calc(100vh - #{$modal-dialog-margin * 2});\n content: \"\";\n }\n\n // Ensure `.modal-body` shows scrollbar (IE10/11)\n &.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n\n .modal-content {\n max-height: none;\n }\n\n &::before {\n content: none;\n }\n }\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n width: 100vw;\n height: 100vh;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-border-radius);\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n &::before {\n height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // boosted mod\n font-weight: $tooltip-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // boosted mod\n font-weight: $popover-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n > .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n > .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n > .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width / 2;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n > .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n @include transition(0s $carousel-transition-duration opacity);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 2px dotted $input-focus-border-color; //boosted mod\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: no-repeat 50% / 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: .5;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: 1;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) / 2;\n bottom: 20px;\n left: (100% - $carousel-caption-width) / 2;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n background-color: currentColor;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable property-blacklist, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n border-radius: $border-radius !important;\n}\n\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n &::before {\n padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { float: left !important; }\n .float#{$infix}-right { float: right !important; }\n .float#{$infix}-none { float: none !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !important; }\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n // Just in case `pointer-events: none` is set on a parent\n pointer-events: auto;\n content: \"\";\n // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n background-color: rgba(0, 0, 0, 0);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-wrap { white-space: normal !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-weight-bolder { font-weight: $font-weight-bolder !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n word-break: break-word !important; // IE & < Edge 18\n overflow-wrap: break-word !important;\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n // boosted mod try to fix print errors\n // https://github.com/twbs/bootstrap/issues/26781\n .row,\n .form-row {\n display: block !important;\n }\n }\n}\n","//\n// Cards\n//\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link {\n .card-title {\n align-self: center;\n width: 100%; // IE fix\n margin: auto 0;\n font-weight: $font-weight-bold;\n word-break: normal;\n }\n\n .card-img {\n padding: 0;\n text-align: center;\n\n img {\n width: 100%;\n height: auto;\n }\n }\n\n .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n }\n}\n\n@include media-breakpoint-up(xs) {\n .card-deck {\n margin: 0;\n }\n}\n\n@include media-breakpoint-down(xs) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n\n .card-deck {\n flex-direction: column;\n }\n\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n\n .o-card-link {\n .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n\n img {\n width: auto;\n height: 3.75rem;\n }\n }\n\n .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n\n .card-title {\n align-self: flex-start;\n margin: 0;\n\n &::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n }\n }\n}\n\n@include media-breakpoint-only(sm) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n","// Orange switches\n//\n//\n// stylelint-disable selector-max-class\n// stylelint-disable property-blacklist\n\n.o-switch {\n .toggle,\n .toggle::before,\n .toggle .on,\n .toggle .off {\n transition: .4s;\n }\n\n .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: $gray-700;\n border: 2px solid $gray-700;\n\n &.toggle-rounded,\n &.toggle-rounded::before {\n border-radius: 1.625rem;\n }\n\n .on,\n .off {\n display: none;\n font-weight: $font-weight-bold;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n }\n\n .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n }\n\n .off {\n display: block;\n text-align: right;\n opacity: 1;\n\n &.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n }\n }\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n }\n }\n}\n\n.o-switch .checkbox {\n @include focus {\n + .toggle::before {\n outline: 1px dotted #fff;\n }\n }\n\n &:checked {\n + .toggle {\n background: theme-color(\"primary\");\n border-color: theme-color(\"primary\");\n\n .on {\n display: block;\n opacity: 1;\n }\n .off {\n display: none;\n opacity: 0;\n }\n\n &::before {\n right: 0;\n left: auto;\n }\n }\n }\n\n &.success:checked {\n + .toggle {\n background: theme-color(\"success\");\n border-color: theme-color(\"success\");\n\n .on {\n color: #000;\n }\n\n .on.icon-checkbox-tick {\n color: #fff;\n }\n }\n }\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n\n &.toggle-rounded {\n padding: 0 .875rem;\n }\n}\n\n// 3 way toggles\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n\n .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n\n &:first-child {\n margin-left: -2px;\n }\n\n &:last-child {\n margin-right: -2px;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n\n &.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n }\n\n &:active {\n border-color: theme-color(\"primary\");\n }\n\n @include hover {\n &:not(:active) {\n color: theme-color(\"primary\");\n background-color: transparent;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n }\n }\n\n &.no-outline {\n border-color: transparent;\n\n .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n\n &:first-child {\n border-left-color: transparent;\n }\n\n &:last-child {\n border-right-color: transparent;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n\n @include hover {\n &:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n }\n }\n }\n}\n","//\n// Orange forms\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n\n.form-group {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n width: auto;\n }\n\n .invalid-feedback {\n margin-top: .8125rem;\n font-weight: $font-weight-bold;\n }\n\n &.top {\n display: flex;\n flex-direction: column;\n\n .col-form-label {\n margin-bottom: 0;\n }\n\n .form-control {\n order: 2;\n }\n .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n }\n }\n\n &.right {\n display: flex;\n flex-flow: row wrap;\n\n label,\n .col-form-label {\n min-width: 100%;\n }\n\n .form-control-message,\n .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n }\n }\n\n &.row {\n &.top {\n flex-direction: row;\n\n label,\n .col-form-label {\n order: 1;\n }\n\n .form-control {\n order: 2;\n margin-top: 0;\n }\n\n .invalid-feedback {\n order: 0;\n }\n }\n\n &.right {\n label,\n .col-form-label {\n min-width: auto;\n }\n\n .invalid-feedback {\n align-self: center;\n margin-top: 0;\n }\n }\n }\n\n &.is-required label::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n\n // browser reset\n .form-control:invalid {\n outline: none;\n box-shadow: none;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n\n &.form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n }\n\n &.form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n }\n }\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n ~ .invalid-feedback {\n top: ($line-height-base + .5); // Height of the `label` and its margin\n }\n}\n","// Bullet point\n//\n//\n\n.o-square-list {\n padding-left: 0;\n color: theme-color(\"primary\");\n text-align: left;\n\n &,\n ul * {\n list-style-type: none;\n }\n\n li {\n color: #000;\n\n &::before {\n margin-right: 1rem;\n font-size: $font-size-sm;\n line-height: 1.25rem;\n color: theme-color(\"primary\");\n vertical-align: text-top;\n content: \"\\25A0\";\n }\n\n span {\n display: inline-block;\n margin-bottom: .625rem;\n }\n\n > ul {\n padding-left: 1rem;\n }\n }\n\n ul > li::before {\n color: $gray-600;\n }\n\n ul ul > li::before { // stylelint-disable-line selector-max-type\n color: $gray-500;\n }\n}\n","//\n// Orange stepbar\n//\n// stylelint-disable selector-max-class\n\n// url encoded colors\n$arrow-black: \"000000\" !default;\n$arrow-gray: \"dddddd\" !default;\n$arrow-orange: \"f16e00\" !default;\n\n// generate url encoded svg with color\n@function arrow-svg($color) {\n @return \"%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23#{$color}%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\";\n}\n\n@mixin stepbar-arrow($color) {\n &::after {\n position: absolute;\n top: 0;\n right: -$o-stepbar-arrow-width;\n z-index: 500;\n display: block;\n width: $o-stepbar-arrow-width;\n height: $o-stepbar-height;\n content: \"\";\n $arrow-svg: arrow-svg($color);\n background-image: url(\"data:image/svg+xml,#{$arrow-svg}\");\n background-size: $o-stepbar-arrow-width $o-stepbar-height;\n }\n}\n\n.o-stepbar {\n &,\n ol,\n ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n }\n\n // one item\n .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n }\n\n // two items\n .stepbar-item:first-child:nth-last-child(2),\n .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n }\n\n // four items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n }\n\n // five items\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n\n .stepbar-item {\n @include stepbar-arrow($arrow-gray);\n position: relative;\n float: left;\n padding: ($spacer / 2) $spacer;\n padding-left: 2rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: $line-height-base;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: $gray-400;\n\n &:first-child {\n padding-left: $spacer;\n }\n\n &:last-child {\n &::after {\n display: none;\n }\n }\n\n &.done {\n @include stepbar-arrow($arrow-black);\n background-color: #000;\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n &.current {\n @include stepbar-arrow($arrow-orange);\n background-color: theme-color(\"primary\");\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n .stepbar-link {\n text-decoration: none;\n\n .step-number::after {\n content: \".\";\n }\n }\n }\n}\n\n// For mobile display in any case, reduce the padding and the height\n@include media-breakpoint-down(xs) {\n .o-stepbar {\n .stepbar-item {\n padding: $o-stepbar-mobile-padding-vertical ($spacer / 2) $o-stepbar-mobile-padding-vertical ($spacer + $o-stepbar-mobile-arrow-width);\n line-height: $input-btn-line-height;\n }\n\n .stepbar-item::after,\n .stepbar-item.done::after,\n .stepbar-item.current::after,\n .stepbar-item.next::after {\n right: -($o-stepbar-mobile-arrow-width - .0625); // remove 1px for mobile display error\n width: $o-stepbar-mobile-arrow-width;\n height: $o-stepbar-mobile-arrow-height;\n background-size: cover;\n }\n\n &.xs-numbers {\n .step-number::after {\n display: none;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 60%;\n }\n }\n\n // four and five items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 40%;\n }\n }\n\n .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: $o-stepbar-mobile-arrow-width;\n\n &:first-child {\n padding-left: 0;\n }\n\n &.current {\n width: 60%;\n }\n\n &.current .step-number {\n display: none;\n }\n\n &:not(.current) .step-title {\n display: none;\n }\n }\n }\n\n &.xs-labels {\n .step-number {\n display: none;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n//\n// o-link-arrow\n// --------------------------------------------------\n\n.o-link-arrow {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n text-decoration: none;\n\n &::after {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93e\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::after {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n // previous link\n &.back {\n &::after {\n padding: 0;\n content: \"\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &::before {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal $o-link-arrow-separator-padding-vertical 0;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93f\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::before {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n }\n}\n","// stylelint-disable property-blacklist\n//\n// Mega menu\n//\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n","// Orange navbar\n//\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n// stylelint-disable selector-max-compound-selectors\n// stylelint-disable selector-max-combinators\n// stylelint-disable property-blacklist\n\n.navbar {\n .nav-link.icon {\n margin-top: 0;\n\n span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n }\n }\n\n .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n }\n}\n\n.navbar.supra {\n @include media-breakpoint-down(xs) {\n display: none;\n }\n\n height: $navbar-supra-height; // IE flex support\n min-height: $navbar-supra-height;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid $gray-900;\n\n > .container,\n > .container .navbar-nav {\n align-items: center;\n }\n\n .navbar-brand {\n display: none;\n }\n\n .navbar-nav {\n margin: 0;\n\n > .nav-link:first-child,\n .nav-item:first-child .nav-link {\n margin-left: 0;\n }\n }\n\n .nav-link,\n .dropdown-toggle {\n @include focus {\n outline-offset: .5rem;\n }\n\n font-size: $font-size-sm;\n line-height: 1;\n\n span[class^=\"icon-\"] {\n font-size: $h5-font-size;\n font-weight: $font-weight-normal;\n }\n }\n\n .nav-link.icon {\n span[class^=\"icon-\"] {\n font-size: $h6-font-size;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n .dropdown-menu {\n right: 0;\n left: auto;\n }\n}\n\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n &,\n &.minimized {\n .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n\n &[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n\n &[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n }\n\n .mega-menu-panel .nav-link.back {\n display: block;\n\n &::before {\n float: left;\n transform: rotateZ(180deg);\n }\n }\n\n .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n\n a[data-toggle=\"collapse\"] {\n display: none;\n }\n\n > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n\n > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n }\n }\n }\n\n @include media-breakpoint-up($next) {\n .mega-menu {\n overflow: visible;\n\n > .navbar-nav {\n transition: none;\n transform: none;\n\n .nav-link::before {\n display: none;\n }\n }\n }\n\n .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: $zindex-fixed;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n\n a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n\n .nav-link {\n margin-left: 0;\n }\n\n .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n\n > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n\n > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n\n > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important; // stylelint-disable-line declaration-no-important\n flex-direction: column;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n\n > .container > .navbar-nav .nav-item:first-child,\n > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n\n > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n }\n }\n }\n }\n}\n\n@include media-breakpoint-down(sm) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n","//\n// Tables\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-type\n// stylelint-disable selector-class-pattern\n\n// Change the table states color\n@mixin table-row-variant-border($state, $color) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $color;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($color, 5%);\n }\n }\n}\n\n.table {\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n border-bottom: 1px solid $table-border-color;\n\n > th,\n > td {\n font-size: $font-size-sm;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n }\n\n > th:first-child,\n > td:first-child {\n padding-left: .625rem;\n }\n\n [class^=\"icon-\"],\n [class*=\" icon-\"] {\n font-size: 1.8125rem;\n }\n\n [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n }\n\n [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n }\n }\n }\n\n thead {\n\n\n > tr {\n border-bottom-width: 2px;\n\n > th {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n }\n }\n }\n\n tbody > th {\n font-weight: $font-weight-normal;\n }\n\n &.has-checkbox {\n tr.selected {\n > td,\n > th {\n background-color: $gray-400;\n }\n }\n\n tr > th:first-child,\n tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n }\n }\n\n &.has-icon {\n tr > td,\n tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n\n span,\n img {\n vertical-align: middle;\n }\n\n img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n }\n\n [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n }\n }\n }\n\n // &.has-status {\n // thead th:not(:first-child),\n // tr > td {\n // text-align: center;\n // }\n // }\n\n &.table-reflow {\n thead,\n tbody, {\n > tr {\n border: 0;\n }\n\n > tr > td {\n line-height: 1.25rem;\n }\n\n > tr > th:first-child {\n border-bottom: 2px solid $table-border-color;\n }\n\n > tr > th,\n > tr > td {\n border-bottom: 1px solid $table-border-color;\n }\n\n > tr > td:last-child {\n border-right: 0;\n }\n }\n\n thead > tr {\n border: 0;\n\n > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid $table-border-color;\n }\n\n > th:last-child {\n border-right: 0;\n }\n }\n\n tbody {\n > tr > th:first-child {\n padding-left: 0;\n }\n }\n }\n}\n\n@include table-row-variant-border(success, theme-color(\"success\"));\n@include table-row-variant-border(info, theme-color(\"info\"));\n@include table-row-variant-border(warning, theme-color(\"warning\"));\n@include table-row-variant-border(danger, theme-color(\"danger\"));\n\n\n// force caption for tables\ncaption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n// Style jquery tablesorter ext\n// scss-lint:disable SelectorFormat\n//\n// Table sorter\n//\n\n.tablesorter {\n caption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n background-color: #fff;\n }\n\n th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n\n &.header {\n position: relative;\n }\n\n .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n }\n\n &.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n transform: rotate(180deg);\n }\n\n &.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &.tablesorter-headerUnSorted {\n .tablesorter-header-inner:hover span::after,\n .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $o-sortable-hover-icon;\n }\n }\n\n a {\n color: #000;\n text-decoration: none;\n\n @include hover-focus {\n color: theme-color(\"primary\");\n text-decoration: underline;\n }\n }\n }\n\n td {\n text-align: left;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n.modal {\n\n .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n }\n\n .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n\n .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n\n\n .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n }\n }\n }\n\n .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n\n .card,\n .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n }\n\n .card-body {\n padding: 0;\n }\n\n .card-icon {\n margin-right: 1.25rem;\n }\n\n [class^=\"svg\"],\n [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n }\n\n [class^=\"svg\"] {\n display: block;\n }\n\n [class^=\"svg\"]::after {\n top: auto;\n }\n\n .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n }\n }\n\n .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n\n .btn + .btn {\n margin-left: 1.25rem;\n }\n }\n}\n\n@include media-breakpoint-down(xs) {\n .modal {\n .modal-content {\n padding: 1.25rem;\n }\n\n .modal-header {\n margin: 0;\n }\n\n .modal-body {\n .card {\n flex-direction: column;\n }\n\n .card-icon {\n align-self: center;\n margin-right: 0;\n }\n\n .card-icon,\n [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n\n .card-title {\n font-size: 1rem;\n }\n\n .card-body {\n margin-top: 1.25rem;\n }\n }\n\n .modal-footer {\n align-self: center;\n }\n }\n}\n","// Base nav\n.nav {\n .nav-item:first-child {\n margin-left: - ($spacer * .5);\n }\n\n &.flex-column .nav-item:first-child {\n margin-left: 0;\n }\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n line-height: 1.25rem;\n }\n}\n\n// Boosted Mod\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid $gray-600;\n}\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n// End mod\n\n//\n// classic tab\n//\n\n.nav-tabs {\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n\n .nav-link:not(.disabled) {\n &,\n &.dropdown-toggle {\n @include focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n }\n }\n\n + .nav-link {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n}\n\n// Responsive tabs\n//\n//\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n\n .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n\n &:first-child {\n margin-left: 0;\n border-top: 0;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n }\n\n &[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n }\n\n &:focus {\n outline-offset: -4px;\n }\n\n &:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n }\n }\n\n .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n\n &.show {\n display: block;\n }\n }\n\n @include media-breakpoint-down(sm) {\n .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n\n &[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n\n &:active {\n color: #fff;\n background-color: #f16e00;\n }\n }\n }\n\n &.accordion-layout {\n display: block;\n\n .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n\n &:focus {\n outline-offset: 0;\n }\n\n &:hover {\n color: #f16e00;\n background-color: #fff;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n\n &[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n\n &:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n\n &::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n }\n\n .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n }\n }\n}\n\n// Pills\n// -------------------------\n.nav-pills {\n &.nav-stacked .nav-item {\n margin: 0;\n\n + .nav-item {\n margin-left: 0;\n }\n }\n\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: ($grid-gutter-width / 4);\n }\n }\n\n .nav-link {\n @include active {\n background-color: $nav-pills-link-active-bg;\n }\n\n @include hover {\n color: $nav-pills-link-active-color;\n cursor: default;\n background-color: $nav-pills-link-active-bg;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n @include focus {\n color: $nav-pills-focus-link-color;\n background-color: $nav-pills-focus-link-bg;\n outline: none;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n padding-top: $spacer;\n padding-bottom: $spacer;\n }\n .dropdown-menu {\n right: 0;\n left: auto;\n\n .nav-item {\n margin: 0;\n\n .nav-link {\n @include focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n }\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n\n .tab-pane p {\n margin-bottom: 0;\n }\n}\n\n.tab-content-clear {\n // padding: 1.125rem;\n border: 0;\n}\n\n// breadcrums\n\n.breadcrum {\n line-height: 1;\n}\n\n// priority nav\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important; // stylelint-disable-line declaration-no-important\n}\n\n.show-inline-block {\n display: inline-block !important; // stylelint-disable-line declaration-no-important\n}\n\n.overflow-nav-list {\n .nav-link {\n border: 0;\n &:focus {\n outline-offset: -2px;\n }\n }\n\n .nav-item:last-child {\n margin-bottom: 0;\n }\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n","//\n// Nav local\n//\n\n.o-nav-local {\n margin-bottom: ($spacer * 2);\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n\n > .container,\n > .container-fluid {\n display: flex;\n }\n\n ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n }\n\n .nav-item + .nav-item {\n margin-left: 1rem;\n }\n\n .nav.flex-column .nav-item {\n margin-left: 0;\n }\n\n .nav .nav-link,\n .nav .dropdown-toggle {\n @include focus {\n outline: 1px dotted;\n outline-offset: -1px;\n }\n display: inline-block;\n padding: 1rem ($nav-link-padding-x * .5) 1.125rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n .nav-link.active {\n color: theme-color(\"primary\");\n }\n\n .dropdown-toggle.show {\n color: #000;\n }\n\n .dropdown-menu {\n .nav-item,\n .nav-item + .nav-item {\n margin: 0;\n }\n\n .nav-link {\n @include focus {\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: $gray-900;\n border-bottom-color: $gray-900;\n\n .nav-link {\n @include hover-focus {\n color: theme-color(\"primary\");\n }\n\n &:focus {\n outline-color: #fff;\n }\n\n color: #fff;\n background-color: #000;\n\n &.active {\n color: theme-color(\"primary\");\n }\n }\n}\n\n",".skiplinks {\n z-index: 99999;\n}\n.skiplinks .skiplinks-section li {\n float: left;\n}\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: $font-weight-bold;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 $gray-500;\n border: 2px solid #000;\n @include border-radius(0);\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, .3);\n}\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: $font-weight-normal;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n","//\n// Footer\n//\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: $font-size-sm;\n font-weight: $font-weight-bold;\n color: #fff;\n background-color: #000;\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n font-size: $font-size-sm;\n line-height: 1.25rem;\n\n &:not(:hover),\n &:not([href]) {\n color: #fff;\n }\n }\n\n .o-footer-top,\n .o-footer-body,\n .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n }\n\n .o-footer-top {\n border-bottom: 1px solid $gray-900;\n }\n\n .o-footer-body {\n .row {\n margin-bottom: .625rem;\n }\n\n h2 {\n margin-top: .625rem;\n font-size: $font-size-sm;\n color: #fff;\n }\n\n p {\n &,\n a {\n color: #fff;\n }\n }\n\n .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n }\n }\n\n .o-footer-bottom {\n border-top: 1px solid $gray-900;\n }\n}\n","// small device display as card\n// stylelint-disable selector-no-qualifying-type\n@include media-breakpoint-down(md) {\n .o-responsive-table {\n thead {\n display: none;\n }\n tbody,\n tr,\n th,\n td {\n display: block;\n }\n // for tablet, display 2 cards by rows\n @include media-breakpoint-up(md) {\n tr {\n float: left;\n width: 45%;\n }\n tr:nth-child(odd) {\n margin-right: 10%;\n }\n }\n th,\n td {\n vertical-align: middle;\n }\n td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: $font-weight-bold;\n content: attr(data-title);\n }\n tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n tbody {\n th[scope=\"row\"] {\n font-weight: $font-weight-bold;\n border-top: 0;\n border-bottom: 2px solid $gray-500;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// o-scroll-up\n//\n//\n\n.o-scroll-up {\n .o-scroll-up-icon {\n &::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n }\n align-items: center;\n justify-content: center;\n float: right;\n width: $o-scroll-up-width;\n height: $o-scroll-up-height;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n\n /* rtl:ignore */\n transform: rotate(90deg);\n\n /* rtl:ignore */\n }\n\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: $zindex-o-scroll-up;\n display: none;\n // put a safety space between the right of the screen and the scroll link\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n right: $container-margin;\n }\n }\n @include media-breakpoint-up(xs) {\n bottom: .25rem;\n }\n @include media-breakpoint-up(sm) {\n bottom: .375rem;\n }\n @include media-breakpoint-up(md) {\n bottom: .75rem;\n }\n @include media-breakpoint-up(lg) {\n bottom: 2rem;\n }\n @include media-breakpoint-up(xl) {\n bottom: 2.5rem;\n }\n @include media-breakpoint-up(xxl) {\n bottom: 3.75rem;\n }\n\n .o-scroll-up-text {\n display: inline-block;\n padding: (($o-scroll-up-height - 1.25) / 2) .625rem;\n font-weight: $font-weight-bold;\n background-color: #fff;\n opacity: .8;\n }\n // custom class to allow a fixed position\n &.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n .o-scroll-up-text {\n float: left;\n }\n .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n }\n }\n\n @include hover-focus {\n color: $primary;\n .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n }\n }\n\n &:active .o-scroll-up-icon {\n color: #fff;\n background-color: $primary;\n border-color: $primary;\n }\n}\n","//\n// dropdown\n//\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: $font-weight-bold;\n\n &:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n }\n\n &:focus:hover {\n color: #fff;\n background-color: #000;\n }\n}\n","// stylelint-disable property-blacklist, font-family-no-missing-generic-family-keyword\n//\n// Carousel\n// --------------------------------------------------\n\n// native boostrap\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item {\n img {\n width: 100%;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n\n // Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n\n &::before {\n font-family: icon-orange;\n }\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n\n &:hover {\n cursor: default;\n }\n\n li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n\n &:hover {\n cursor: pointer;\n }\n\n &.active {\n background-color: theme-color(\"primary\"); // stylelint-disable-line selector-no-qualifying-type\n }\n }\n}\n\n// swiper\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n //Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important; // stylelint-disable-line declaration-no-important\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide {\n .card {\n border: 0;\n }\n\n .card-img {\n padding: 0;\n\n img {\n width: 100%;\n height: 40vh;\n }\n }\n\n .card-title {\n margin: 0;\n font-weight: $font-weight-bold;\n }\n\n .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n\n p {\n margin: 0;\n }\n }\n}\n\n@include media-breakpoint-down(md) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;/* used for displaying pagination outside of container */\n }\n\n .swiper-slide {\n width: 80%;\n\n // .card-link .card-body {\n // padding: 20px;\n // text-align: left;\n // }\n\n .card-img img {\n height: auto;\n }\n\n .card-body {\n position: static;\n }\n }\n\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n//\n\n// back from accessibility plugin css\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: theme-color(\"primary\");\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n//\n// Progress bar\n//\n\n.progress.progress-default {\n &[value]::-webkit-progress-value {\n background-color: theme-color(\"primary\");\n }\n\n &[value]::-moz-progress-bar {\n background-color: theme-color(\"primary\");\n }\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: ($grid-gutter-width * 1.5);\n}\n\n.hero-container .caption {\n margin: ($grid-gutter-width * 2.5) ($grid-gutter-width * 1.5);\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: theme-color(\"primary\");\n}\n\n","@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: right;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-right: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: right;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-right: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-right: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-left: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-left: auto;\n margin-right: auto;\n padding-left: 5px;\n padding-right: 5px;\n margin-left: 1.25%;\n margin-right: 1.25%;\n max-width: 312px;\n margin-left: auto;\n margin-right: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-left: 1.25%;\n margin-right: 1.25%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-left: 1.5625%;\n margin-right: 1.5625%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-left: 4.16667%;\n margin-right: 4.16667%;\n }\n .container .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.container-fluid {\n margin-left: auto;\n margin-right: auto;\n padding-left: 5px;\n padding-right: 5px;\n margin-left: 1.25%;\n margin-right: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-left: 1.25%;\n margin-right: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-left: 1.5625%;\n margin-right: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-left: 3.125%;\n margin-right: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-left: 4.16667%;\n margin-right: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-left: -5px;\n margin-right: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-left: -5px;\n margin-right: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-left: -10px;\n margin-right: -10px;\n }\n}\n\n.no-gutters {\n margin-left: 0;\n margin-right: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-left: 0;\n padding-right: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-left: 5px;\n padding-right: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-left: 10px;\n padding-right: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-right: 8.333333%;\n}\n\n.offset-2 {\n margin-right: 16.666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.333333%;\n}\n\n.offset-5 {\n margin-right: 41.666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.333333%;\n}\n\n.offset-8 {\n margin-right: 66.666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.333333%;\n}\n\n.offset-11 {\n margin-right: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.333333%;\n }\n .offset-sm-2 {\n margin-right: 16.666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.333333%;\n }\n .offset-sm-5 {\n margin-right: 41.666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.333333%;\n }\n .offset-sm-8 {\n margin-right: 66.666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.333333%;\n }\n .offset-sm-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.333333%;\n }\n .offset-md-2 {\n margin-right: 16.666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.333333%;\n }\n .offset-md-5 {\n margin-right: 41.666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.333333%;\n }\n .offset-md-8 {\n margin-right: 66.666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.333333%;\n }\n .offset-md-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.333333%;\n }\n .offset-lg-2 {\n margin-right: 16.666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.333333%;\n }\n .offset-lg-5 {\n margin-right: 41.666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.333333%;\n }\n .offset-lg-8 {\n margin-right: 66.666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.333333%;\n }\n .offset-lg-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.333333%;\n }\n .offset-xl-2 {\n margin-right: 16.666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.333333%;\n }\n .offset-xl-5 {\n margin-right: 41.666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.333333%;\n }\n .offset-xl-8 {\n margin-right: 66.666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.333333%;\n }\n .offset-xl-11 {\n margin-right: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0 0.625rem 0.625rem;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0 0.3125rem 0.3125rem;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-right: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-left: 0;\n padding-right: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-left: -5px;\n margin-right: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-right: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-right: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-right: 0;\n margin-left: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-left: 0.3125rem;\n margin-right: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-right: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n right: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-left: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-left: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-right: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n right: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-left: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) left calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-left: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-right: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-left: 0.25rem;\n margin-right: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n border-bottom: 0;\n border-right: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n right: 0;\n z-index: 1000;\n display: none;\n float: right;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: right;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n left: auto;\n right: 0;\n}\n\n.dropdown-menu-right {\n left: 0;\n right: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-sm-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-md-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-lg-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-xl-right {\n left: 0;\n right: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n left: auto;\n right: 0;\n }\n .dropdown-menu-xxl-right {\n left: 0;\n right: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-left: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n left: auto;\n right: 100%;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-left: 0;\n border-bottom: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n left: 100%;\n right: auto;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-right: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n left: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-right: -2px;\n}\n\n.dropdown-toggle-split {\n padding-left: 0.84375rem;\n padding-right: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-right: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-left: 0.46875rem;\n padding-right: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-left: 0.9375rem;\n padding-right: 0.9375rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-right: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-right: -2px;\n}\n\n.input-group-prepend {\n margin-left: -2px;\n}\n\n.input-group-append {\n margin-right: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-right-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-left: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-right: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-left: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n right: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n right: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n top: .4rem;\n right: .2585rem;\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-left: none;\n border-right: none;\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-right: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n right: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n right: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-left: 4.375rem;\n padding-right: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n left: 0;\n right: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n left: calc(1.875rem + 2px);\n right: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(-1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 0.5rem 0.4375rem 1.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat left 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-left: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-right: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-right: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-right: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-left: 0.125rem;\n margin-right: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-left: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-right: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n padding-left: 0;\n padding-right: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-left: 0;\n margin-right: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-right: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-left: .625rem;\n padding-bottom: .875rem;\n padding-right: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: left;\n margin-left: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-right: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem .625rem .875rem 0;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n transform: rotateZ(-180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 0 0 .625rem;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 0 0 .625rem;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-left: 0;\n padding-bottom: 0;\n padding-right: 0;\n margin-right: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n padding-left: 10px;\n padding-right: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-left: 0;\n margin-right: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-right: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-left: -0.625rem;\n margin-bottom: -0.75rem;\n margin-right: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-left: -0.625rem;\n margin-right: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n flex-flow: row wrap;\n margin-left: -2.5rem;\n margin-right: -2.5rem;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-left: 2.5rem;\n margin-bottom: 0;\n margin-right: 2.5rem;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-right: 0;\n border-right: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 0 1rem 2.125rem;\n line-height: 1.125rem;\n text-align: right;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n left: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n transform: rotate(-180deg);\n}\n\n.accordion .card-body {\n padding: 0 0 0 1.5rem;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: flex;\n padding-right: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-right: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-right: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-left: 1.125rem;\n padding-right: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-left: 2rem;\n padding-right: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-right: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-left: 0;\n padding-right: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-left: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n left: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 100% 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-right: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-left: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-left: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-left: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-left: 0;\n border-right: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: left;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem auto -0.625rem -0.625rem;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-right: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-left: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: right;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: right;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n right: 50%;\n display: block;\n width: 0.625rem;\n margin-right: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: right;\n width: 100%;\n margin-left: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(-100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n right: 0;\n}\n\n.carousel-control-next {\n left: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-right: 0;\n margin-left: 1.875rem;\n margin-right: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-left: 3px;\n margin-right: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n bottom: 20px;\n right: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(-360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-left-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-left: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-right: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-left: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-right: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-right-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-left-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: right !important;\n}\n\n.float-right {\n float: left !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: right !important;\n }\n .float-sm-right {\n float: left !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: right !important;\n }\n .float-md-right {\n float: left !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: right !important;\n }\n .float-lg-right {\n float: left !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: right !important;\n }\n .float-xl-right {\n float: left !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: right !important;\n }\n .float-xxl-right {\n float: left !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: right !important;\n}\n\n.text-right {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: right !important;\n }\n .text-sm-right {\n text-align: left !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: right !important;\n }\n .text-md-right {\n text-align: left !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: right !important;\n }\n .text-lg-right {\n text-align: left !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: right !important;\n }\n .text-xl-right {\n text-align: left !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: right !important;\n }\n .text-xxl-right {\n text-align: left !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: right;\n }\n .o-card-link .card-title {\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n left: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: right;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n right: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: left;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n left: -.125rem;\n right: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n left: 0;\n right: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-left: 0;\n padding-right: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: flex;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-right: .625rem;\n}\n\n.form-group.row.top {\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n order: 1;\n}\n\n.form-group.row.top .form-control {\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-right: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-right: 0;\n color: #f16e00;\n text-align: right;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-left: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-right: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: right;\n padding: 0.625rem 1.25rem;\n padding-right: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-right: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n left: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 2rem 0.3125rem 0.625rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n left: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-left: 0;\n padding-right: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-right: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n right: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n left: 0;\n right: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-right: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n left: 0;\n right: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-right: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-left: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-left: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-left: .4375em solid transparent;\n border-right: .4375em solid transparent;\n transform: rotateZ(-180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: right;\n transform: rotateZ(-180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n right: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: left;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-right: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-left: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-right: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-right: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-left: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-left: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-left: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-right: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-left: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-right: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-left: 30px;\n text-align: right;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-left: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n transform: rotate(-180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-right: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: right;\n}\n\n.modal .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n left: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-left: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-right: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n align-self: center;\n margin-left: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-right: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-right: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-right: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-right: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-right: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-right: 0;\n }\n}\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-right: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-right: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n flex-grow: 1;\n margin-right: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-right: 0;\n font-weight: 700;\n color: #000;\n text-align: right;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n transform: rotate(-180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-right: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n left: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-right: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-right: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-right: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-right: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n left: 0;\n right: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem 1.25rem .625rem .625rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: flex;\n}\n\n.o-nav-local ul + ul {\n flex-shrink: 0;\n margin-right: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-right: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-right: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem 1.25rem .625rem .625rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: right;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none none none solid;\n border-width: 0 0 0 1px;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n right: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-right: -175px;\n overflow: hidden;\n background: none repeat scroll 100% 0 #ccc;\n border: 2px solid #000;\n box-shadow: -2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 100% 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: right;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-left: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: right;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-left: 0;\n border-right: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n left: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n left: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n align-items: center;\n justify-content: center;\n float: left;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n transform: rotate(90deg);\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n left: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n left: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n left: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n left: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n left: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: right;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: right;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-right: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-right: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-left: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: -1px 0 0 #fff, 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n right: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n right: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n/*# sourceMappingURL=boosted-rtl.css.map */.svg-arrow-previous::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.stepbar-item::after {\n transform: rotateY(180deg);\n}\n\n.page-item:last-child .page-link::before,\n.page-item:first-child .page-link::before,\n.page-item.presentation + .page-item .page-link::before,\n.swiper-button-prev,\n.swiper-button-next,\n.doc-link::after,\n.breadcrumb-item + .breadcrumb-item::before,\n.o-link-arrow::after,\n.o-link-arrow.back::before {\n transform: rotate(180deg);\n}\n\n.alert .alert-icon::after,\n.alert-sm .alert-icon::after {\n right: 2%;\n}\n\n.o-stepbar .stepbar-item::after,\n.page-item:last-child .page-link::before,\n.o-stepbar .stepbar-item.current::after,\n.o-stepbar .stepbar-item.done::after {\n right: unset;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: auto;\n left: 0;\n}\n\n.custom-switch .custom-control-label::before {\n background-position: .2rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-position: 2rem;\n}\n\n.o-link-arrow.back::before {\n padding: 0 .625rem 0 0;\n}\n\n.popover {\n right: auto;\n left: 0;\n}\n\n/*# sourceMappingURL=o-rtl.css.map */"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted.css b/dashboard/public/css/boosted.css
new file mode 100644
index 00000000..0ef3c855
--- /dev/null
+++ b/dashboard/public/css/boosted.css
@@ -0,0 +1,14485 @@
+@charset "UTF-8";
+/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+ --blue: #527edb;
+ --indigo: #6610f2;
+ --purple: #a885d8;
+ --pink: #ffb4e6;
+ --red: #cd3c14;
+ --orangeRed: #ff4500;
+ --orange: #f16e00;
+ --yellow: #fc0;
+ --green: #32c832;
+ --teal: #50be87;
+ --cyan: #4bb4e6;
+ --white: #fff;
+ --gray: #999;
+ --gray-dark: #595959;
+ --primary: #f16e00;
+ --secondary: #000;
+ --success: #32c832;
+ --info: #527edb;
+ --warning: #fc0;
+ --danger: #cd3c14;
+ --light: #ddd;
+ --dark: #000;
+ --breakpoint-xs: 0;
+ --breakpoint-sm: 480px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 980px;
+ --breakpoint-xl: 1220px;
+ --breakpoint-xxl: 1380px;
+ --font-family-sans-serif: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block;
+}
+
+body {
+ margin: 0;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #000;
+ text-align: left;
+ background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+ outline: 0 !important;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: 1.25rem;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: 700;
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -.25em;
+}
+
+sup {
+ top: -.5em;
+}
+
+a {
+ color: #000;
+ text-decoration: none;
+ background-color: transparent;
+}
+
+a:hover {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+p a {
+ text-decoration: underline;
+}
+
+p a:hover, p a:focus {
+ text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-size: 1em;
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
+
+figure {
+ margin: 0 0 1rem;
+}
+
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+
+svg {
+ overflow: hidden;
+ vertical-align: middle;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.625rem 0.625rem 0.625rem 0;
+ padding-bottom: 0.625rem 0.625rem 0.625rem 0;
+ color: #666;
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ text-align: inherit;
+}
+
+label {
+ display: inline-block;
+ margin-bottom: 0.625rem;
+}
+
+button {
+ border-radius: 0;
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+select {
+ word-wrap: normal;
+}
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled) {
+ cursor: pointer;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ margin-bottom: 1.25rem;
+ font-family: inherit;
+ font-weight: 700;
+ line-height: 1.1;
+ color: inherit;
+}
+
+h1, .h1 {
+ font-size: 2.125rem;
+}
+
+h2, .h2 {
+ font-size: 1.875rem;
+}
+
+h3, .h3 {
+ font-size: 1.5rem;
+}
+
+h4, .h4 {
+ font-size: 1.25rem;
+}
+
+h5, .h5 {
+ font-size: 1.125rem;
+}
+
+h6, .h6 {
+ font-size: 1rem;
+}
+
+@media (max-width: 767.98px) {
+ h1, .h1 {
+ font-size: 1.25rem;
+ }
+ h2, .h2 {
+ font-size: 1.125rem;
+ }
+ h3, .h3 {
+ font-size: 1rem;
+ }
+ h4, .h4 {
+ font-size: 0.875rem;
+ }
+ h5, .h5 {
+ font-size: 0.875rem;
+ }
+ h6, .h6 {
+ font-size: 0.875rem;
+ }
+}
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.display-1 {
+ font-size: 3.75rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+.display-2 {
+ font-size: 3.125rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+.display-3 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+.display-4 {
+ font-size: 2.125rem;
+ font-weight: 700;
+ line-height: 1.1;
+}
+
+hr {
+ margin-top: 1.25rem;
+ margin-bottom: 1.25rem;
+ border: 0;
+ border-top: 1px solid #eee;
+}
+
+small,
+.small {
+ font-size: 0.875rem;
+ font-weight: 400;
+}
+
+mark,
+.mark {
+ padding: 0.2em;
+ background-color: #f16e00;
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline-item {
+ display: inline-block;
+}
+
+.list-inline-item:not(:last-child) {
+ margin-right: 0.3125rem;
+}
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+.blockquote {
+ margin-bottom: 1.25rem;
+ font-size: 1.25rem;
+}
+
+.blockquote-footer {
+ display: block;
+ font-size: 0.875rem;
+ color: #666;
+}
+
+.blockquote-footer::before {
+ content: "\2014\00A0";
+}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.img-thumbnail {
+ padding: 0.625rem;
+ background-color: #fff;
+ border: 2px solid #000;
+ max-width: 100%;
+ height: auto;
+}
+
+.figure {
+ display: inline-block;
+}
+
+.figure-img {
+ margin-bottom: 0.625rem;
+ line-height: 1;
+}
+
+.figure-caption {
+ font-size: 90%;
+ color: #333;
+}
+
+code {
+ font-size: 87.5%;
+ color: #333;
+ word-break: break-word;
+}
+
+a > code {
+ color: inherit;
+}
+
+kbd {
+ padding: 0.0625rem 0.0625rem;
+ font-size: 87.5%;
+ color: #000;
+ background-color: #eee;
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700;
+}
+
+pre {
+ display: block;
+ font-size: 87.5%;
+ color: #333;
+}
+
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 5px;
+ padding-left: 5px;
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ max-width: 312px;
+ margin-right: auto;
+ margin-left: auto;
+ width: 100%;
+}
+
+@media (min-width: 480px) {
+ .container {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+.container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 480px) {
+ .container {
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ margin-right: 1.5625%;
+ margin-left: 1.5625%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ margin-right: 4.16667%;
+ margin-left: 4.16667%;
+ }
+ .container .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 480px) {
+ .container {
+ max-width: 468px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 744px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container {
+ max-width: 960px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container {
+ max-width: 1200px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container {
+ max-width: 1320px;
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 5px;
+ padding-left: 5px;
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ width: auto;
+}
+
+@media (min-width: 480px) {
+ .container-fluid {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container-fluid {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+.container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 480px) {
+ .container-fluid {
+ margin-right: 1.25%;
+ margin-left: 1.25%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ margin-right: 1.5625%;
+ margin-left: 1.5625%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .container-fluid {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .container-fluid {
+ margin-right: 3.125%;
+ margin-left: 3.125%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .container-fluid {
+ margin-right: 4.16667%;
+ margin-left: 4.16667%;
+ }
+ .container-fluid .container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ }
+}
+
+.row {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px;
+}
+
+@media (min-width: 480px) {
+ .row {
+ margin-right: -5px;
+ margin-left: -5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .row {
+ margin-right: -10px;
+ margin-left: -10px;
+ }
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+.col-xxl-auto {
+ position: relative;
+ width: 100%;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
+@media (min-width: 480px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 1380px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,
+ .col-xxl-auto {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+.col {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.col-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+}
+
+.col-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+}
+
+.col-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+}
+
+.col-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+
+.col-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+}
+
+.col-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+}
+
+.col-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+
+.col-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+}
+
+.col-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+}
+
+.col-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+
+.col-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+}
+
+.col-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+}
+
+.col-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+}
+
+.order-first {
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -ms-flex-order: 13;
+ order: 13;
+}
+
+.order-0 {
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.order-1 {
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-2 {
+ -ms-flex-order: 2;
+ order: 2;
+}
+
+.order-3 {
+ -ms-flex-order: 3;
+ order: 3;
+}
+
+.order-4 {
+ -ms-flex-order: 4;
+ order: 4;
+}
+
+.order-5 {
+ -ms-flex-order: 5;
+ order: 5;
+}
+
+.order-6 {
+ -ms-flex-order: 6;
+ order: 6;
+}
+
+.order-7 {
+ -ms-flex-order: 7;
+ order: 7;
+}
+
+.order-8 {
+ -ms-flex-order: 8;
+ order: 8;
+}
+
+.order-9 {
+ -ms-flex-order: 9;
+ order: 9;
+}
+
+.order-10 {
+ -ms-flex-order: 10;
+ order: 10;
+}
+
+.order-11 {
+ -ms-flex-order: 11;
+ order: 11;
+}
+
+.order-12 {
+ -ms-flex-order: 12;
+ order: 12;
+}
+
+.offset-1 {
+ margin-left: 8.333333%;
+}
+
+.offset-2 {
+ margin-left: 16.666667%;
+}
+
+.offset-3 {
+ margin-left: 25%;
+}
+
+.offset-4 {
+ margin-left: 33.333333%;
+}
+
+.offset-5 {
+ margin-left: 41.666667%;
+}
+
+.offset-6 {
+ margin-left: 50%;
+}
+
+.offset-7 {
+ margin-left: 58.333333%;
+}
+
+.offset-8 {
+ margin-left: 66.666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.333333%;
+}
+
+.offset-11 {
+ margin-left: 91.666667%;
+}
+
+@media (min-width: 480px) {
+ .col-sm {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-sm-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-sm-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-sm-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-sm-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-sm-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-sm-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-sm-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-sm-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-sm-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-sm-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-sm-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-sm-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-sm-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-sm-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-sm-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-sm-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-sm-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-sm-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-sm-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-sm-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-sm-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-sm-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-sm-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-sm-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-sm-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+ .offset-sm-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-md {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-md-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-md-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-md-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-md-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-md-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-md-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-md-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-md-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-md-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-md-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-md-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-md-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-md-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-md-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-md-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-md-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-md-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-md-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-md-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-md-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-md-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-md-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-md-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-md-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-md-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-md-0 {
+ margin-left: 0;
+ }
+ .offset-md-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 980px) {
+ .col-lg {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-lg-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-lg-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-lg-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-lg-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-lg-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-lg-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-lg-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-lg-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-lg-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-lg-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-lg-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-lg-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-lg-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-lg-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-lg-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-lg-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-lg-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-lg-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-lg-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-lg-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-lg-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-lg-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-lg-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-lg-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-lg-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+ .offset-lg-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1220px) {
+ .col-xl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xl-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xl-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xl-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xl-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xl-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xl-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xl-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xl-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xl-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xl-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xl-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xl-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xl-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-xl-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-xl-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-xl-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-xl-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-xl-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-xl-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-xl-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-xl-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-xl-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-xl-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-xl-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-xl-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+ .offset-xl-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1380px) {
+ .col-xxl {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xxl-auto {
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xxl-1 {
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xxl-2 {
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xxl-3 {
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xxl-4 {
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xxl-5 {
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xxl-6 {
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xxl-7 {
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xxl-8 {
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xxl-9 {
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xxl-10 {
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xxl-11 {
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xxl-12 {
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xxl-first {
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xxl-last {
+ -ms-flex-order: 13;
+ order: 13;
+ }
+ .order-xxl-0 {
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .order-xxl-1 {
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xxl-2 {
+ -ms-flex-order: 2;
+ order: 2;
+ }
+ .order-xxl-3 {
+ -ms-flex-order: 3;
+ order: 3;
+ }
+ .order-xxl-4 {
+ -ms-flex-order: 4;
+ order: 4;
+ }
+ .order-xxl-5 {
+ -ms-flex-order: 5;
+ order: 5;
+ }
+ .order-xxl-6 {
+ -ms-flex-order: 6;
+ order: 6;
+ }
+ .order-xxl-7 {
+ -ms-flex-order: 7;
+ order: 7;
+ }
+ .order-xxl-8 {
+ -ms-flex-order: 8;
+ order: 8;
+ }
+ .order-xxl-9 {
+ -ms-flex-order: 9;
+ order: 9;
+ }
+ .order-xxl-10 {
+ -ms-flex-order: 10;
+ order: 10;
+ }
+ .order-xxl-11 {
+ -ms-flex-order: 11;
+ order: 11;
+ }
+ .order-xxl-12 {
+ -ms-flex-order: 12;
+ order: 12;
+ }
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
+ .offset-xxl-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-xxl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+ .offset-xxl-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-xxl-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+ .offset-xxl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xxl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+ .offset-xxl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xxl-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+.table {
+ width: 100%;
+ margin-bottom: 1.25rem;
+ color: #000;
+ background-color: #fff;
+}
+
+.table th,
+.table td {
+ padding: 0.625rem 0.625rem 0.625rem 0;
+ vertical-align: top;
+ border-top: 1px solid #ccc;
+}
+
+.table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ccc;
+}
+
+.table tbody + tbody {
+ border-top: 2px solid #ccc;
+}
+
+.table-sm th,
+.table-sm td {
+ padding: 0.3125rem 0.3125rem 0.3125rem 0;
+}
+
+.table-bordered {
+ border: 1px solid #ccc;
+}
+
+.table-bordered th,
+.table-bordered td {
+ border: 1px solid #ccc;
+}
+
+.table-bordered thead th,
+.table-bordered thead td {
+ border-bottom-width: 2px;
+}
+
+.table-borderless th,
+.table-borderless td,
+.table-borderless thead th,
+.table-borderless tbody + tbody {
+ border: 0;
+}
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #f6f6f6;
+}
+
+.table-hover tbody tr:hover {
+ color: #000;
+ background-color: #eee;
+}
+
+.table-primary,
+.table-primary > th,
+.table-primary > td {
+ background-color: #f16e00;
+}
+
+.table-hover .table-primary:hover {
+ background-color: #d86200;
+}
+
+.table-hover .table-primary:hover > td,
+.table-hover .table-primary:hover > th {
+ background-color: #d86200;
+}
+
+.table-secondary,
+.table-secondary > th,
+.table-secondary > td {
+ background-color: black;
+ color: #fff;
+}
+
+.table-hover .table-secondary:hover {
+ background-color: black;
+}
+
+.table-hover .table-secondary:hover > td,
+.table-hover .table-secondary:hover > th {
+ background-color: black;
+}
+
+.table-success,
+.table-success > th,
+.table-success > td {
+ background-color: #32c832;
+}
+
+.table-hover .table-success:hover {
+ background-color: #2db42d;
+}
+
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
+ background-color: #2db42d;
+}
+
+.table-info,
+.table-info > th,
+.table-info > td {
+ background-color: #527edb;
+}
+
+.table-hover .table-info:hover {
+ background-color: #3d6ed7;
+}
+
+.table-hover .table-info:hover > td,
+.table-hover .table-info:hover > th {
+ background-color: #3d6ed7;
+}
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
+ background-color: #ffcc00;
+}
+
+.table-hover .table-warning:hover {
+ background-color: #e6b800;
+}
+
+.table-hover .table-warning:hover > td,
+.table-hover .table-warning:hover > th {
+ background-color: #e6b800;
+}
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
+ background-color: #cd3c14;
+ color: #fff;
+}
+
+.table-hover .table-danger:hover {
+ background-color: #b63512;
+}
+
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
+ background-color: #b63512;
+}
+
+.table-light,
+.table-light > th,
+.table-light > td {
+ background-color: #dddddd;
+}
+
+.table-hover .table-light:hover {
+ background-color: #d0d0d0;
+}
+
+.table-hover .table-light:hover > td,
+.table-hover .table-light:hover > th {
+ background-color: #d0d0d0;
+}
+
+.table-dark,
+.table-dark > th,
+.table-dark > td {
+ background-color: black;
+ color: #fff;
+}
+
+.table-hover .table-dark:hover {
+ background-color: black;
+}
+
+.table-hover .table-dark:hover > td,
+.table-hover .table-dark:hover > th {
+ background-color: black;
+}
+
+.table-active,
+.table-active > th,
+.table-active > td {
+ background-color: #ddd;
+}
+
+.table-hover .table-active:hover {
+ background-color: #d0d0d0;
+}
+
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+ background-color: #d0d0d0;
+}
+
+.table .thead-dark th {
+ color: #fff;
+ background-color: #000;
+ border-color: #ccc;
+}
+
+.table .thead-light th {
+ color: #000;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.table-dark {
+ color: #fff;
+ background-color: #000;
+}
+
+.table-dark th,
+.table-dark td,
+.table-dark thead th {
+ border-color: #ccc;
+}
+
+.table-dark.table-bordered {
+ border: 0;
+}
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #333;
+}
+
+.table-dark.table-hover tbody tr:hover {
+ color: #fff;
+ background-color: #666;
+}
+
+@media (max-width: 479.98px) {
+ .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-sm > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-md > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-lg > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 1219.98px) {
+ .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-xl > .table-bordered {
+ border: 0;
+ }
+}
+
+@media (max-width: 1379.98px) {
+ .table-responsive-xxl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-xxl > .table-bordered {
+ border: 0;
+ }
+}
+
+.table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.table-responsive > .table-bordered {
+ border: 0;
+}
+
+label {
+ font-weight: 700;
+}
+
+label.disabled {
+ color: #767676;
+}
+
+label.is-required::after {
+ margin-left: 6px;
+ font-weight: 700;
+ color: #f16e00;
+ content: "*";
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ padding: 0.5rem 0.625rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 2px solid #ccc;
+ border-radius: 0;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .form-control {
+ transition: none;
+ }
+}
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0;
+}
+
+.form-control:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+ outline: 0;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control::-moz-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control::-ms-input-placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control::placeholder {
+ color: #666;
+ opacity: 1;
+}
+
+.form-control:disabled, .form-control[readonly] {
+ color: #666;
+ background-color: #eee;
+ opacity: 1;
+}
+
+select.form-control:focus::-ms-value {
+ color: #000;
+ background-color: #fff;
+}
+
+.form-control-file,
+.form-control-range {
+ display: block;
+ width: 100%;
+}
+
+.col-form-label {
+ padding-top: calc(0.5rem + 2px);
+ padding-bottom: calc(0.5rem + 2px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.25;
+}
+
+.col-form-label-lg {
+ padding-top: calc(0.594rem + 2px);
+ padding-bottom: calc(0.594rem + 2px);
+ font-size: 1.125rem;
+ line-height: 1.5;
+}
+
+.col-form-label-sm {
+ padding-top: calc(0.157rem + 2px);
+ padding-bottom: calc(0.157rem + 2px);
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ margin-bottom: 0;
+ line-height: 1.25;
+ color: #000;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 2px 0;
+}
+
+.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.form-control-sm {
+ height: calc(1.6265rem + 4px);
+ padding: 0.157rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.form-control-lg {
+ height: calc(2.8755rem + 4px);
+ padding: 0.594rem 1.25rem;
+ font-size: 1.125rem;
+ line-height: 1.5;
+}
+
+select.form-control[size], select.form-control[multiple] {
+ height: auto;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+.form-group {
+ margin-bottom: 1.25rem;
+}
+
+.form-text {
+ display: block;
+ margin-top: 0.625rem;
+}
+
+.form-row {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px;
+}
+
+.form-row > .col,
+.form-row > [class*="col-"] {
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
+.form-check {
+ position: relative;
+ display: block;
+ padding-left: 1.25rem;
+ margin-bottom: 0.625rem;
+}
+
+.form-check-input {
+ position: absolute;
+ margin-top: 0.3rem;
+ margin-left: -1.25rem;
+}
+
+.form-check-input:disabled ~ .form-check-label {
+ color: #666;
+}
+
+.form-check-label {
+ margin-bottom: 0;
+}
+
+.form-check-inline {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding-left: 0;
+ margin-right: 0.75rem;
+}
+
+.form-check-inline .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-right: 0.3125rem;
+ margin-left: 0;
+}
+
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.625rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+}
+
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.625rem 0.625rem;
+ margin-top: .1rem;
+ font-size: 0.875rem;
+ line-height: 1.25;
+ color: #000;
+ background-color: rgba(50, 200, 50, 0.9);
+}
+
+.was-validated .form-control:valid, .form-control.is-valid {
+ border-color: #32c832;
+}
+
+.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
+ border-color: #32c832;
+}
+
+.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {
+ position: relative;
+ display: block;
+ padding-left: 1.625rem;
+}
+
+.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {
+ position: absolute;
+ top: -.1rem;
+ left: 0;
+ width: 1.125rem;
+ height: 1.125rem;
+ content: "";
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
+ padding-right: 2.25rem;
+ background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);
+}
+
+.was-validated .custom-select:valid, .custom-select.is-valid {
+ border-color: #32c832;
+ padding-right: 3.1875rem;
+ background: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat right 0.5rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;
+}
+
+.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
+ border-color: #32c832;
+}
+
+.was-validated .custom-select:valid ~ .valid-feedback,
+.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,
+.custom-select.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .form-control-file:valid ~ .valid-feedback,
+.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
+.form-control-file.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
+ color: #32c832;
+}
+
+.was-validated .form-check-input:valid ~ .valid-feedback,
+.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
+.form-check-input.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
+ color: #32c832;
+}
+
+.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
+ border-color: #32c832;
+}
+
+.was-validated .custom-control-input:valid ~ .valid-feedback,
+.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
+.custom-control-input.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
+ border-color: #58d558;
+ background-color: #58d558;
+}
+
+.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
+ border-color: #32c832;
+}
+
+.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
+ border-color: #32c832;
+}
+
+.was-validated .custom-file-input:valid ~ .valid-feedback,
+.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
+.custom-file-input.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
+ border-color: #32c832;
+}
+
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.625rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+}
+
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.625rem 0.625rem;
+ margin-top: .1rem;
+ font-size: 0.875rem;
+ line-height: 1.25;
+ color: #fff;
+ background-color: rgba(205, 60, 20, 0.9);
+}
+
+.was-validated .form-control:invalid, .form-control.is-invalid {
+ border-color: #cd3c14;
+}
+
+.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
+ border-color: #cd3c14;
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {
+ position: relative;
+ display: block;
+ padding-left: 1.625rem;
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {
+ position: absolute;
+ top: -.1rem;
+ left: 0;
+ width: 1.125rem;
+ height: 1.125rem;
+ content: "";
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
+ padding-right: 2.25rem;
+ background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);
+}
+
+.was-validated .custom-select:invalid, .custom-select.is-invalid {
+ border-color: #cd3c14;
+ padding-right: 3.1875rem;
+ background: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat right 0.5rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;
+}
+
+.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-select:invalid ~ .invalid-feedback,
+.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,
+.custom-select.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .form-control-file:invalid ~ .invalid-feedback,
+.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
+.form-control-file.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
+ color: #cd3c14;
+}
+
+.was-validated .form-check-input:invalid ~ .invalid-feedback,
+.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
+.form-check-input.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
+ color: #cd3c14;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-control-input:invalid ~ .invalid-feedback,
+.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
+.custom-control-input.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
+ border-color: #ea532a;
+ background-color: #ea532a;
+}
+
+.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
+ border-color: #cd3c14;
+}
+
+.was-validated .custom-file-input:invalid ~ .invalid-feedback,
+.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
+.custom-file-input.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
+ border-color: #cd3c14;
+}
+
+.form-inline {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.form-inline .form-check {
+ width: 100%;
+}
+
+@media (min-width: 480px) {
+ .form-inline label {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-plaintext {
+ display: inline-block;
+ }
+ .form-inline .input-group,
+ .form-inline .custom-select {
+ width: auto;
+ }
+ .form-inline .form-check {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: auto;
+ padding-left: 0;
+ }
+ .form-inline .form-check-input {
+ position: relative;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ margin-top: 0;
+ margin-right: 0.25rem;
+ margin-left: 0;
+ }
+ .form-inline .custom-control {
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ }
+ .form-inline .custom-control-label {
+ margin-bottom: 0;
+ }
+}
+
+.btn {
+ display: inline-block;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-weight: 700;
+ color: #000;
+ text-align: center;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: transparent;
+ border: 2px solid transparent;
+ padding: 0.5rem 1.125rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .btn {
+ transition: none;
+ }
+}
+
+.btn:hover {
+ color: #000;
+ text-decoration: none;
+}
+
+.btn:focus, .btn.focus {
+ outline: 0;
+ box-shadow: none;
+}
+
+.btn.disabled, .btn:disabled {
+ opacity: 1;
+}
+
+a.btn {
+ text-decoration: none;
+}
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+ pointer-events: none;
+}
+
+.btn-primary,
+.btn-warning {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-primary:hover, .btn-primary:focus,
+.btn-warning:hover,
+.btn-warning:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-primary.disabled, .btn-primary:disabled,
+.btn-warning.disabled,
+.btn-warning:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
+.show > .btn-primary.dropdown-toggle,
+.btn-warning:not(:disabled):not(.disabled):active,
+.btn-warning:not(:disabled):not(.disabled).active,
+.show >
+.btn-warning.dropdown-toggle {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+}
+
+.btn-primary.btn-inverse,
+.btn-warning.btn-inverse {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,
+.btn-warning.btn-inverse:hover,
+.btn-warning.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,
+.btn-warning.btn-inverse.disabled,
+.btn-warning.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-primary.btn-inverse.dropdown-toggle,
+.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,
+.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,
+.show >
+.btn-warning.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #000;
+ border-color: #fff;
+}
+
+.btn-secondary,
+.btn-light {
+ color: #000;
+ background-color: transparent;
+ border-color: #000;
+}
+
+.btn-secondary:hover, .btn-secondary:focus,
+.btn-light:hover,
+.btn-light:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-secondary.disabled, .btn-secondary:disabled,
+.btn-light.disabled,
+.btn-light:disabled {
+ color: #ccc;
+ background-color: transparent;
+ border-color: #ccc;
+}
+
+.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-secondary.dropdown-toggle,
+.btn-light:not(:disabled):not(.disabled):active,
+.btn-light:not(:disabled):not(.disabled).active,
+.show >
+.btn-light.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-secondary.btn-inverse,
+.btn-light.btn-inverse {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,
+.btn-light.btn-inverse:hover,
+.btn-light.btn-inverse:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #fff;
+}
+
+.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,
+.btn-light.btn-inverse.disabled,
+.btn-light.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-secondary.btn-inverse.dropdown-toggle,
+.btn-light.btn-inverse:not(:disabled):not(.disabled):active,
+.btn-light.btn-inverse:not(:disabled):not(.disabled).active,
+.show >
+.btn-light.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-success {
+ color: #000;
+ background-color: #32c832;
+ border-color: #32c832;
+}
+
+.btn-success:hover, .btn-success:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-success.disabled, .btn-success:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
+.show > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-success.btn-inverse {
+ color: #000;
+ background-color: #32c832;
+ border-color: #32c832;
+}
+
+.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-success.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-info,
+.btn-dark {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-info:hover, .btn-info:focus,
+.btn-dark:hover,
+.btn-dark:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+}
+
+.btn-info.disabled, .btn-info:disabled,
+.btn-dark.disabled,
+.btn-dark:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
+.show > .btn-info.dropdown-toggle,
+.btn-dark:not(:disabled):not(.disabled):active,
+.btn-dark:not(:disabled):not(.disabled).active,
+.show >
+.btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-info.btn-inverse,
+.btn-dark.btn-inverse {
+ color: #fff;
+ background-color: transparent;
+ border-color: #fff;
+}
+
+.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,
+.btn-dark.btn-inverse:hover,
+.btn-dark.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,
+.btn-dark.btn-inverse.disabled,
+.btn-dark.btn-inverse:disabled {
+ color: #666;
+ background-color: transparent;
+ border-color: #666;
+}
+
+.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-info.btn-inverse.dropdown-toggle,
+.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,
+.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,
+.show >
+.btn-dark.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.btn-danger:hover, .btn-danger:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-danger.disabled, .btn-danger:disabled {
+ color: #fff;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
+.show > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-danger.btn-inverse {
+ color: #fff;
+ background-color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {
+ color: #000;
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {
+ color: #000;
+ background-color: #666;
+ border-color: #666;
+}
+
+.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,
+.show > .btn-danger.btn-inverse.dropdown-toggle {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-primary {
+ color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-primary:hover, .btn-outline-primary:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+ color: #f16e00;
+ background-color: transparent;
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-primary.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-secondary {
+ color: #000;
+ border-color: #000;
+}
+
+.btn-outline-secondary:hover, .btn-outline-secondary:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+ color: #000;
+ background-color: transparent;
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-secondary.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-success {
+ color: #32c832;
+ border-color: #32c832;
+}
+
+.btn-outline-success:hover, .btn-outline-success:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+ color: #32c832;
+ background-color: transparent;
+}
+
+.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
+.show > .btn-outline-success.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-info {
+ color: #000;
+ border-color: #000;
+}
+
+.btn-outline-info:hover, .btn-outline-info:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+ color: #000;
+ background-color: transparent;
+}
+
+.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
+.show > .btn-outline-info.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-warning {
+ color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-warning:hover, .btn-outline-warning:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+ color: #f16e00;
+ background-color: transparent;
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
+.show > .btn-outline-warning.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-danger {
+ color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.btn-outline-danger:hover, .btn-outline-danger:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
+ color: #cd3c14;
+ background-color: transparent;
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
+.show > .btn-outline-danger.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-light {
+ color: #ddd;
+ border-color: #ddd;
+}
+
+.btn-outline-light:hover, .btn-outline-light:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-light.disabled, .btn-outline-light:disabled {
+ color: #ddd;
+ background-color: transparent;
+}
+
+.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
+.show > .btn-outline-light.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-outline-dark {
+ color: #000;
+ border-color: #000;
+}
+
+.btn-outline-dark:hover, .btn-outline-dark:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.btn-outline-dark.disabled, .btn-outline-dark:disabled {
+ color: #000;
+ background-color: transparent;
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
+.show > .btn-outline-dark.dropdown-toggle {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.btn-link {
+ color: #000;
+}
+
+.btn-link.btn-inverse {
+ color: #fff;
+}
+
+.btn-link:hover {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+.btn-link:focus, .btn-link.focus {
+ text-decoration: none;
+ box-shadow: none;
+}
+
+.btn-link:disabled, .btn-link.disabled {
+ color: #ccc;
+ pointer-events: none;
+}
+
+.btn-xlg {
+ padding: 0.8125rem 1.25rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: 0;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 0.594rem 1.25rem;
+ font-size: 1.125rem;
+ line-height: 1.5;
+ border-radius: 0;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 0.157rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ border-radius: 0;
+}
+
+.btn-mail {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-mail:hover, .btn-mail:focus {
+ outline: none;
+}
+
+.btn-mail-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-mail-inverse:hover, .btn-mail-inverse:focus {
+ outline: none;
+}
+
+.btn-lin {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-lin:hover, .btn-lin:focus {
+ outline: none;
+}
+
+.btn-lin-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-lin-inverse:hover, .btn-lin-inverse:focus {
+ outline: none;
+}
+
+.btn-gplus {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-gplus:hover, .btn-gplus:focus {
+ outline: none;
+}
+
+.btn-gplus-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {
+ outline: none;
+}
+
+.btn-tw {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-tw:hover, .btn-tw:focus {
+ outline: none;
+}
+
+.btn-tw-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-tw-inverse:hover, .btn-tw-inverse:focus {
+ outline: none;
+}
+
+.btn-fbk {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-fbk:hover, .btn-fbk:focus {
+ outline: none;
+}
+
+.btn-fbk-inverse {
+ height: 2.5rem;
+ background-repeat: no-repeat;
+}
+
+.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {
+ outline: none;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+.btn-block + .btn-block {
+ margin-top: 0.5rem;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .fade {
+ transition: none;
+ }
+}
+
+.fade:not(.show) {
+ opacity: 0;
+}
+
+.collapse:not(.show) {
+ display: none;
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .collapsing {
+ transition: none;
+ }
+}
+
+.dropup,
+.dropright,
+.dropdown,
+.dropleft {
+ position: relative;
+}
+
+.dropdown-toggle {
+ white-space: nowrap;
+}
+
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0.4375rem solid;
+ border-right: 0.4375rem solid transparent;
+ border-bottom: 0;
+ border-left: 0.4375rem solid transparent;
+}
+
+.dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: 0 0;
+ margin: -2px 0 0;
+ font-size: 1rem;
+ color: #000;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 2px solid #000;
+}
+
+.dropdown-menu-left {
+ right: auto;
+ left: 0;
+}
+
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+
+@media (min-width: 480px) {
+ .dropdown-menu-sm-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-sm-right {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 768px) {
+ .dropdown-menu-md-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-md-right {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 980px) {
+ .dropdown-menu-lg-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-lg-right {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1220px) {
+ .dropdown-menu-xl-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xl-right {
+ right: 0;
+ left: auto;
+ }
+}
+
+@media (min-width: 1380px) {
+ .dropdown-menu-xxl-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xxl-right {
+ right: 0;
+ left: auto;
+ }
+}
+
+.dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: -2px;
+}
+
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0;
+ border-right: 0.4375rem solid transparent;
+ border-bottom: 0.4375rem solid;
+ border-left: 0.4375rem solid transparent;
+}
+
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropright .dropdown-menu {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: -2px;
+}
+
+.dropright .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0.4375rem solid transparent;
+ border-right: 0;
+ border-bottom: 0.4375rem solid transparent;
+ border-left: 0.4375rem solid;
+}
+
+.dropright .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropright .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.dropleft .dropdown-menu {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: -2px;
+}
+
+.dropleft .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+}
+
+.dropleft .dropdown-toggle::after {
+ display: none;
+}
+
+.dropleft .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.4375rem;
+ vertical-align: 0.21875rem;
+ content: "";
+ border-top: 0.4375rem solid transparent;
+ border-right: 0.4375rem solid;
+ border-bottom: 0.4375rem solid transparent;
+}
+
+.dropleft .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropleft .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
+ right: auto;
+ bottom: auto;
+}
+
+.dropdown-divider {
+ height: 0;
+ margin: 0.625rem 0;
+ overflow: hidden;
+ border-top: 1px solid #eee;
+}
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: 0.625rem 0.625rem;
+ clear: both;
+ font-weight: 400;
+ color: #000;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.dropdown-item:hover, .dropdown-item:focus {
+ color: #fff;
+ text-decoration: none;
+ background-color: #000;
+}
+
+.dropdown-item.active, .dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #000;
+}
+
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: #666;
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.dropdown-menu.show {
+ display: block;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 0 0.625rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #000;
+ white-space: nowrap;
+}
+
+.dropdown-item-text {
+ display: block;
+ padding: 0.625rem 0.625rem;
+ color: #000;
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+}
+
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover {
+ z-index: 1;
+}
+
+.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.btn-toolbar {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+
+.btn-toolbar .input-group {
+ width: auto;
+}
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) {
+ margin-left: -2px;
+}
+
+.dropdown-toggle-split {
+ padding-right: 0.84375rem;
+ padding-left: 0.84375rem;
+}
+
+.dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after,
+.dropright .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+
+.dropleft .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.46875rem;
+ padding-left: 0.46875rem;
+}
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.9375rem;
+ padding-left: 0.9375rem;
+}
+
+.btn-group-vertical {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+ width: 100%;
+}
+
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -2px;
+}
+
+.btn-group-toggle > .btn,
+.btn-group-toggle > .btn-group > .btn {
+ margin-bottom: 0;
+}
+
+.btn-group-toggle > .btn input[type="radio"],
+.btn-group-toggle > .btn input[type="checkbox"],
+.btn-group-toggle > .btn-group > .btn input[type="radio"],
+.btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+
+.input-group {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ width: 100%;
+}
+
+.input-group > .form-control,
+.input-group > .form-control-plaintext,
+.input-group > .custom-select,
+.input-group > .custom-file {
+ position: relative;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0;
+}
+
+.input-group > .form-control + .form-control,
+.input-group > .form-control + .custom-select,
+.input-group > .form-control + .custom-file,
+.input-group > .form-control-plaintext + .form-control,
+.input-group > .form-control-plaintext + .custom-select,
+.input-group > .form-control-plaintext + .custom-file,
+.input-group > .custom-select + .form-control,
+.input-group > .custom-select + .custom-select,
+.input-group > .custom-select + .custom-file,
+.input-group > .custom-file + .form-control,
+.input-group > .custom-file + .custom-select,
+.input-group > .custom-file + .custom-file {
+ margin-left: -2px;
+}
+
+.input-group > .form-control:focus,
+.input-group > .custom-select:focus,
+.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
+ z-index: 3;
+}
+
+.input-group > .custom-file .custom-file-input:focus {
+ z-index: 4;
+}
+
+.input-group > .custom-file {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.input-group-prepend,
+.input-group-append {
+ display: -ms-flexbox;
+ display: flex;
+}
+
+.input-group-prepend .btn,
+.input-group-append .btn {
+ position: relative;
+ z-index: 2;
+}
+
+.input-group-prepend .btn:focus,
+.input-group-append .btn:focus {
+ z-index: 3;
+}
+
+.input-group-prepend .btn + .btn,
+.input-group-prepend .btn + .input-group-text,
+.input-group-prepend .input-group-text + .input-group-text,
+.input-group-prepend .input-group-text + .btn,
+.input-group-append .btn + .btn,
+.input-group-append .btn + .input-group-text,
+.input-group-append .input-group-text + .input-group-text,
+.input-group-append .input-group-text + .btn {
+ margin-left: -2px;
+}
+
+.input-group-prepend {
+ margin-right: -2px;
+}
+
+.input-group-append {
+ margin-left: -2px;
+}
+
+.input-group-prepend + .form-control {
+ border-left-color: transparent;
+}
+
+.form-control:focus + .input-group-append,
+.custom-select:focus + .input-group-append {
+ position: relative;
+ z-index: 5;
+}
+
+.input-group-text {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 0.5rem 0.625rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #000;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #eee;
+ border: 2px solid #ccc;
+}
+
+.input-group-text input[type="radio"],
+.input-group-text input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group-lg > .form-control:not(textarea),
+.input-group-lg > .custom-select {
+ height: calc(2.8755rem + 4px);
+}
+
+.input-group-lg > .form-control,
+.input-group-lg > .custom-select,
+.input-group-lg > .input-group-prepend > .input-group-text,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-append > .btn {
+ padding: 0.594rem 1.25rem;
+ font-size: 1.125rem;
+ line-height: 1.5;
+}
+
+.input-group-sm > .form-control:not(textarea),
+.input-group-sm > .custom-select {
+ height: calc(1.6265rem + 4px);
+}
+
+.input-group-sm > .form-control,
+.input-group-sm > .custom-select,
+.input-group-sm > .input-group-prepend > .input-group-text,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-append > .btn {
+ padding: 0.157rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.input-group-lg > .custom-select,
+.input-group-sm > .custom-select {
+ padding-right: 1.5rem;
+}
+
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: 1.25rem;
+ padding-left: 1.875rem;
+ margin-bottom: 0.625rem;
+}
+
+.custom-control-inline {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ margin-right: 1.25rem;
+}
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
+}
+
+.custom-control-input:checked ~ .custom-control-label::before {
+ color: #fff;
+ border-color: #f16e00;
+ background-color: #f16e00;
+}
+
+.custom-control-input:checked ~ .custom-control-label::before::before {
+ background-color: #f16e00;
+}
+
+.custom-control-input:focus ~ .custom-control-label::before {
+ outline: dotted 1px #000;
+ box-shadow: none;
+}
+
+.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.custom-control-input:disabled ~ .custom-control-label {
+ color: #767676;
+}
+
+.custom-control-input:disabled ~ .custom-control-label::before {
+ border-color: #ccc;
+}
+
+.custom-control-input:disabled:checked ~ .custom-control-label::before {
+ background-color: #ccc;
+}
+
+.custom-control-label {
+ margin-bottom: 0;
+ vertical-align: top;
+}
+
+.custom-control-label::before {
+ position: absolute;
+ top: 0rem;
+ left: 0;
+ display: block;
+ width: 1.25rem;
+ height: 1.25rem;
+ content: "";
+ background-color: #fff;
+ border: #666 solid 2px;
+}
+
+.custom-control-label::after {
+ position: absolute;
+ top: 0rem;
+ left: 0;
+ display: block;
+ width: 1.25rem;
+ height: 1.25rem;
+ pointer-events: none;
+ content: "";
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 1rem;
+}
+
+.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {
+ border: 2px solid #f16e00;
+}
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
+ /* rtl:begin:ignore */
+ top: .4rem;
+ /* rtl:end:ignore */
+ left: .2585rem;
+ /* rtl:begin:ignore */
+ width: .8272rem;
+ height: .3619rem;
+ border: 3px solid #fff;
+ border-top: none;
+ border-right: none;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ /* rtl:end:ignore */
+}
+
+.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {
+ outline-color: #000;
+}
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
+ border-color: #f16e00;
+ background-color: #f16e00;
+}
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
+ border: 3px solid #fff;
+ border-top: none;
+ border-right: none;
+ border-left: none;
+ -webkit-transform: scaleX(0.5) translateY(-0.5rem);
+ transform: scaleX(0.5) translateY(-0.5rem);
+}
+
+.custom-radio .custom-control-label::before {
+ border-radius: 50%;
+}
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
+ background-color: #fff;
+ border-color: #fff;
+}
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
+ border: 6px solid #f16e00;
+ border-radius: 50%;
+}
+
+.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {
+ border-color: #ccc;
+}
+
+.custom-switch {
+ padding-left: 4.375rem;
+}
+
+.custom-switch .custom-control-input:focus ~ .custom-control-label::after {
+ outline: 1px dotted #fff;
+}
+
+.custom-switch .custom-control-label {
+ padding-top: .3125rem;
+}
+
+.custom-switch .custom-control-label::before {
+ left: 0;
+ width: 3.75rem;
+ height: 1.875rem;
+ pointer-events: all;
+ background-color: #666;
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: 1.975rem;
+ border-radius: 0;
+}
+
+.custom-switch .custom-control-label::after {
+ top: calc(0rem + 2px);
+ left: 2px;
+ width: calc(3.75rem / 2 - 4px);
+ height: calc(1.875rem - 4px);
+ background-color: #fff;
+ border-radius: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+ transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-switch .custom-control-label::after {
+ transition: none;
+ }
+}
+
+.custom-switch.right {
+ padding-right: 4.375rem;
+ padding-left: 0;
+}
+
+.custom-switch.right .custom-control-label::before {
+ right: 0;
+ left: auto;
+}
+
+.custom-switch.right .custom-control-label::after {
+ right: calc(1.875rem + 2px);
+ left: auto;
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: .25rem;
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+ background-color: #fff;
+ -webkit-transform: translateX(1.875rem);
+ transform: translateX(1.875rem);
+}
+
+.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
+ background-color: #ccc;
+}
+
+.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {
+ background-color: #ccc;
+}
+
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ padding: 0.4375rem 1.5rem 0.4375rem 0.5rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ vertical-align: middle;
+ background: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat right 0.5rem center/8px 10px;
+ background-color: #fff;
+ border: 2px solid #ccc;
+ border-radius: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.custom-select:focus {
+ border-color: #000;
+ outline: 0;
+ box-shadow: none;
+}
+
+.custom-select:focus::-ms-value {
+ color: #000;
+ background-color: #fff;
+}
+
+.custom-select[multiple], .custom-select[size]:not([size="1"]) {
+ height: auto;
+ padding-right: 0.5rem;
+ background-image: none;
+}
+
+.custom-select:disabled {
+ color: #999;
+ background-color: #eee;
+}
+
+.custom-select::-ms-expand {
+ display: none;
+}
+
+.custom-select-sm {
+ height: calc(1.6265rem + 4px);
+ padding-top: 0.157rem;
+ padding-bottom: 0.157rem;
+ padding-left: 0.625rem;
+ font-size: 0.875rem;
+}
+
+.custom-select-lg {
+ height: calc(2.8755rem + 4px);
+ padding-top: 0.594rem;
+ padding-bottom: 0.594rem;
+ padding-left: 1.25rem;
+ font-size: 1.125rem;
+}
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ margin-bottom: 0;
+}
+
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: calc(2.25rem + 4px);
+ margin: 0;
+ opacity: 0;
+}
+
+.custom-file-input:focus ~ .custom-file-label {
+ border-color: #000;
+ box-shadow: none;
+}
+
+.custom-file-input:disabled ~ .custom-file-label {
+ background-color: #eee;
+}
+
+.custom-file-input:lang(en) ~ .custom-file-label::after {
+ content: "Browse";
+}
+
+.custom-file-input ~ .custom-file-label[data-browse]::after {
+ content: attr(data-browse);
+}
+
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: calc(2.25rem + 4px);
+ padding: 0.5rem 0.625rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ background-color: #fff;
+ border: 2px solid #ccc;
+}
+
+.custom-file-label::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: 2.25rem;
+ padding: 0.5rem 0.625rem;
+ line-height: 1.25;
+ color: #000;
+ content: "Browse";
+ background-color: #eee;
+ border-left: inherit;
+}
+
+.custom-range {
+ width: 100%;
+ height: calc(1rem + 0.25rem);
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.custom-range:focus {
+ outline: none;
+}
+
+.custom-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;
+}
+
+.custom-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;
+}
+
+.custom-range:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;
+}
+
+.custom-range::-moz-focus-outer {
+ border: 0;
+}
+
+.custom-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #000;
+ border: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-webkit-slider-thumb {
+ transition: none;
+ }
+}
+
+.custom-range::-webkit-slider-thumb:active {
+ background-color: #f16e00;
+}
+
+.custom-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #999;
+ border-color: transparent;
+}
+
+.custom-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #000;
+ border: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-moz-range-thumb {
+ transition: none;
+ }
+}
+
+.custom-range::-moz-range-thumb:active {
+ background-color: #f16e00;
+}
+
+.custom-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #999;
+ border-color: transparent;
+}
+
+.custom-range::-ms-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: 0;
+ margin-right: 0.125rem;
+ margin-left: 0.125rem;
+ background-color: #000;
+ border: 0;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-ms-thumb {
+ transition: none;
+ }
+}
+
+.custom-range::-ms-thumb:active {
+ background-color: #f16e00;
+}
+
+.custom-range::-ms-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: transparent;
+ border-color: transparent;
+ border-width: 0.5rem;
+}
+
+.custom-range::-ms-fill-lower {
+ background-color: #999;
+}
+
+.custom-range::-ms-fill-upper {
+ margin-right: 15px;
+ background-color: #999;
+}
+
+.custom-range:disabled::-webkit-slider-thumb {
+ background-color: #ccc;
+}
+
+.custom-range:disabled::-webkit-slider-runnable-track {
+ cursor: default;
+}
+
+.custom-range:disabled::-moz-range-thumb {
+ background-color: #ccc;
+}
+
+.custom-range:disabled::-moz-range-track {
+ cursor: default;
+}
+
+.custom-range:disabled::-ms-thumb {
+ background-color: #ccc;
+}
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .custom-control-label::before,
+ .custom-file-label,
+ .custom-select {
+ transition: none;
+ }
+}
+
+.nav {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.nav-link {
+ display: block;
+ padding: 0.625rem 1.25rem;
+ font-weight: 700;
+}
+
+.nav-link:hover, .nav-link:focus {
+ text-decoration: none;
+}
+
+.nav-link.disabled {
+ color: #666;
+ pointer-events: none;
+ cursor: default;
+}
+
+.nav-tabs {
+ border-bottom: 2px solid #000;
+}
+
+.nav-tabs .nav-item {
+ margin-bottom: -2px;
+}
+
+.nav-tabs .nav-link {
+ padding: 0.625rem calc(1.25rem - 2px);
+ line-height: 1rem;
+ border: 2px solid transparent;
+ border-bottom-width: 0;
+}
+
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.nav-tabs .nav-link.disabled {
+ color: #666;
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #000;
+ background-color: #fff;
+ border-color: #000;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -2px;
+}
+
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #000;
+}
+
+.nav-fill .nav-item {
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.nav-justified .nav-item {
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.navbar {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 0 0;
+ font-weight: 700;
+}
+
+.navbar > .container,
+.navbar > .container-fluid {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.navbar-brand {
+ display: inline-block;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin: .625rem .3125rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+ line-height: inherit;
+ white-space: nowrap;
+}
+
+.navbar-brand:hover, .navbar-brand:focus {
+ text-decoration: none;
+}
+
+.navbar-brand + .navbar-brand {
+ margin-right: 0;
+ margin-left: 1.25rem;
+}
+
+.navbar-brand:focus {
+ outline: 1px dotted #fff;
+ outline-offset: .625rem;
+}
+
+.navbar-brand img {
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ width: 1.875rem;
+ height: 1.875rem;
+ margin-top: 0;
+ margin-bottom: .25rem;
+}
+
+.navbar-nav {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
+ margin-top: auto;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.navbar-nav .nav-link {
+ padding-top: .875rem;
+ padding-right: .625rem;
+ padding-bottom: .875rem;
+ padding-left: .625rem;
+ margin-top: 0;
+}
+
+.navbar-nav .nav-link.active::before {
+ display: none;
+}
+
+.navbar-nav .nav-link.icon {
+ padding: .78125rem .625rem;
+ margin-top: 0;
+}
+
+.navbar-nav .nav-link[class^="svg-"] {
+ margin: .625rem;
+}
+
+.navbar-nav .nav-link[role="menuitem"]::before {
+ float: right;
+ margin-right: 1rem;
+ font-family: icon-orange;
+ font-size: 1rem;
+ font-weight: 400;
+ color: #fff;
+ content: "\e93e";
+}
+
+.navbar-nav .nav-link:focus {
+ outline-offset: .625rem;
+}
+
+.navbar-nav .dropdown-menu {
+ position: static;
+ top: 2rem;
+ float: none;
+}
+
+.navbar-nav .nav-item {
+ margin-left: 0;
+ font-size: 1.125rem;
+ border-top: 1px solid #333;
+}
+
+.navbar-nav .dropdown {
+ padding: 0;
+}
+
+.navbar-nav .dropdown .dropdown-toggle,
+.navbar-nav .dropdown .dropdown-item {
+ padding: .875rem 0 .875rem .625rem;
+}
+
+.navbar-nav .dropdown.show .dropdown-toggle::after {
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+}
+
+.navbar-nav .dropdown .dropdown-item {
+ color: #fff;
+ white-space: normal;
+ background-color: #000;
+ border-top: 1px solid #333;
+}
+
+.navbar-nav .dropdown .dropdown-item:focus {
+ color: #f16e00;
+}
+
+.navbar-text {
+ display: inline-block;
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.navbar-collapse {
+ -ms-flex-preferred-size: 100%;
+ flex-basis: 100%;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+}
+
+.navbar-collapse .navbar-nav {
+ -ms-flex-align: stretch;
+ align-items: stretch;
+}
+
+.navbar-toggler {
+ padding: 0.5rem 0.5rem;
+ margin: 0.3125rem 0;
+ font-size: 1rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 2px solid transparent;
+}
+
+.navbar-toggler:hover, .navbar-toggler:focus {
+ text-decoration: none;
+ background-color: #fff;
+}
+
+.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-toggler:active {
+ background-color: #f16e00;
+}
+
+.navbar-toggler:active .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-toggler:focus {
+ outline: 0;
+}
+
+.navbar-toggler:not(:disabled):not(.disabled) {
+ cursor: pointer;
+}
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.25rem;
+ height: 1.25rem;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%;
+}
+
+@media (min-width: 480px) {
+ .navbar-expand-sm {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-sm .navbar-brand {
+ margin: 0 .625rem 0 0;
+ }
+ .navbar-expand-sm .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-sm.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-sm.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-sm .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-sm .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-sm .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ margin-left: 1.25rem;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-md .navbar-brand {
+ margin: 0 .625rem 0 0;
+ }
+ .navbar-expand-md .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-md.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-md.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-md .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-md .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-md .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ margin-left: 1.25rem;
+ }
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 980px) {
+ .navbar-expand-lg {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-lg .navbar-brand {
+ margin: 0 .625rem 0 0;
+ }
+ .navbar-expand-lg .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-lg.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-lg.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-lg .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-lg .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-lg .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ margin-left: 1.25rem;
+ }
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 1220px) {
+ .navbar-expand-xl {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-xl .navbar-brand {
+ margin: 0 .625rem 0 0;
+ }
+ .navbar-expand-xl .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-xl.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-xl.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-xl .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-xl .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-xl .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ margin-left: 1.25rem;
+ }
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+}
+
+@media (min-width: 1380px) {
+ .navbar-expand-xxl {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+ }
+ .navbar-expand-xxl .navbar-brand {
+ margin: 0 .625rem 0 0;
+ }
+ .navbar-expand-xxl .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+ }
+ .navbar-expand-xxl.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+ }
+ .navbar-expand-xxl.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+ .navbar-expand-xxl .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ margin-left: 1.25rem;
+ }
+ .navbar-expand-xxl > .container,
+ .navbar-expand-xxl > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .navbar-expand-xxl .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ }
+ .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+}
+
+.navbar-expand {
+ -ms-flex-flow: row nowrap;
+ flex-flow: row nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ padding: 1.5625rem 0 1.3125rem;
+}
+
+.navbar-expand .navbar-brand {
+ margin: 0 .625rem 0 0;
+}
+
+.navbar-expand .navbar-brand img {
+ width: 3.125rem;
+ height: 3.125rem;
+}
+
+.navbar-expand.minimized {
+ padding-top: 1.25rem;
+ padding-bottom: 1rem;
+}
+
+.navbar-expand.minimized .navbar-brand img {
+ width: 2.5rem;
+ height: 2.5rem;
+}
+
+.navbar-expand .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.navbar-expand .navbar-nav .dropdown-item {
+ color: #000;
+ background-color: #fff;
+ border: 0;
+}
+
+.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {
+ color: #fff;
+ background-color: #000;
+}
+
+.navbar-expand .navbar-nav .nav-item {
+ font-size: 1rem;
+ border: 0;
+}
+
+.navbar-expand .navbar-nav .nav-item.dropdown {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+}
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-top: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ margin-left: 1.25rem;
+}
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ padding-right: 10px;
+ padding-left: 10px;
+}
+
+.navbar-expand .navbar-collapse {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+}
+
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.navbar-light .navbar-brand {
+ color: #000;
+}
+
+.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-nav .nav-link {
+ color: #000;
+}
+
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: #ddd;
+}
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-toggler {
+ color: #000;
+ border-color: rgba(0, 0, 0, 0.1);
+}
+
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-light .navbar-text {
+ color: #000;
+}
+
+.navbar-light .navbar-text a {
+ color: #f16e00;
+}
+
+.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-brand {
+ color: #fff;
+}
+
+.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-nav .nav-link {
+ color: #fff;
+}
+
+.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: #ddd;
+}
+
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .active > .nav-link,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .nav-link.active {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-toggler {
+ color: #fff;
+ border-color: rgba(255, 255, 255, 0.1);
+}
+
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e");
+}
+
+.navbar-dark .navbar-text {
+ color: #fff;
+}
+
+.navbar-dark .navbar-text a {
+ color: #f16e00;
+}
+
+.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
+ color: #f16e00;
+}
+
+.card {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 2px solid #000;
+}
+
+.card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.card-body {
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 1.25rem;
+ color: #000;
+}
+
+.card-title {
+ margin-bottom: 0.75rem;
+}
+
+.card-subtitle {
+ margin-top: -0.375rem;
+ margin-bottom: 0;
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link:hover {
+ text-decoration: none;
+}
+
+.card-link + .card-link {
+ margin-left: 1.25rem;
+}
+
+.card-header {
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 0;
+ font-weight: 700;
+ color: #fff;
+ background-color: #000;
+ border-bottom: 2px solid #000;
+}
+
+.card-header + .list-group .list-group-item:first-child {
+ border-top: 0;
+}
+
+.card-footer {
+ padding: 0.75rem 1.25rem;
+ background-color: #fff;
+ border-top: 2px solid #000;
+}
+
+.card-header-tabs {
+ margin-right: -0.625rem;
+ margin-bottom: -0.75rem;
+ margin-left: -0.625rem;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -0.625rem;
+ margin-left: -0.625rem;
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem;
+}
+
+.card-img {
+ width: 100%;
+}
+
+.card-img-top {
+ width: 100%;
+}
+
+.card-img-bottom {
+ width: 100%;
+}
+
+.card-deck {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.card-deck .card {
+ margin-bottom: 2.5rem;
+}
+
+@media (min-width: 480px) {
+ .card-deck {
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ margin-right: -2.5rem;
+ margin-left: -2.5rem;
+ }
+ .card-deck .card {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-right: 2.5rem;
+ margin-bottom: 0;
+ margin-left: 2.5rem;
+ }
+}
+
+.card-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.card-group > .card {
+ margin-bottom: 10px;
+}
+
+@media (min-width: 480px) {
+ .card-group {
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ }
+ .card-group > .card {
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+ .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+}
+
+.card-columns .card {
+ margin-bottom: 2.5rem;
+}
+
+@media (min-width: 480px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem;
+ orphans: 1;
+ widows: 1;
+ }
+ .card-columns .card {
+ display: inline-block;
+ width: 100%;
+ }
+}
+
+.accordion {
+ /* boosted mod */
+}
+
+.accordion .card {
+ margin-bottom: 0;
+ border: 0;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+}
+
+.accordion .card ~ .card {
+ border-top: 0;
+}
+
+.accordion .card-header {
+ padding: 0;
+ background-color: #fff;
+ border: 0;
+}
+
+.accordion .card-header,
+.accordion .card-header h5 {
+ margin: 0;
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.accordion .card-header button,
+.accordion .card-header a {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 1rem 2.125rem 1rem 0;
+ line-height: 1.125rem;
+ text-align: left;
+ border: 0;
+}
+
+.accordion .card-header button::after,
+.accordion .card-header a::after {
+ position: absolute;
+ top: 1.3125rem;
+ right: .625rem;
+ width: .875rem;
+ height: .4375rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");
+}
+
+.accordion .card-header button[aria-expanded="true"]::after,
+.accordion .card-header a[aria-expanded="true"]::after {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.accordion .card-body {
+ padding: 0 1.5rem 0 0;
+ margin: 0 0 1.25rem;
+}
+
+@media (max-width: 767.98px) {
+ .accordion .card {
+ border-top-width: 2px;
+ border-bottom-width: 2px;
+ }
+ .accordion .card ~ .card {
+ border-top: 0;
+ }
+}
+
+.breadcrumb {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding: 0.625rem 0;
+ font-size: 0.875rem;
+ font-weight: 700;
+ line-height: 1.428571;
+ list-style: none;
+ background-color: #fff;
+}
+
+.breadcrumb-item + .breadcrumb-item::before {
+ display: inline-block;
+ padding-right: 0.625rem;
+ padding-left: 0.625rem;
+ font-family: icon-orange;
+ font-size: 0.625rem;
+ line-height: 1;
+ color: #000;
+ content: "";
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: underline;
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: none;
+}
+
+.breadcrumb-item.active {
+ color: #f16e00;
+}
+
+.pagination {
+ display: -ms-flexbox;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ min-width: 2.5rem;
+ min-height: 2.5rem;
+ padding: 0.625rem 0.8rem;
+ margin-left: 0;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ background-color: #fff;
+ border: 2px solid transparent;
+}
+
+.page-link:hover, .page-link:focus {
+ z-index: 2;
+ color: #000;
+ text-decoration: none;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.page-link:hover span, .page-link:focus span {
+ color: #000;
+}
+
+.page-link:focus {
+ z-index: 2;
+ outline: 0;
+ box-shadow: none;
+}
+
+.page-link span {
+ color: #fff;
+}
+
+.page-link:not(:disabled):not(.disabled) {
+ cursor: pointer;
+}
+
+.page-item.presentation {
+ padding: .625rem 0;
+ font-weight: 700;
+}
+
+.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {
+ margin-left: 0;
+ border-color: #000;
+}
+
+.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {
+ position: absolute;
+ top: .6875rem;
+ left: .8125rem;
+ width: .5625rem;
+ height: .875rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+}
+
+.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {
+ padding-right: 1.125rem;
+ padding-left: 2rem;
+}
+
+.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {
+ z-index: 1;
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.page-item:last-child .page-link {
+ border-color: #000;
+}
+
+.page-item:last-child .page-link::before {
+ position: absolute;
+ top: .6875rem;
+ right: .8125rem;
+ width: .5625rem;
+ height: .875rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+}
+
+.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item:last-child .page-link.has-label {
+ padding-right: 2rem;
+ padding-left: 1.125rem;
+}
+
+.page-item.active .page-link {
+ z-index: 1;
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.page-item .page-link:active {
+ z-index: 1;
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.page-item.active:first-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item.active:last-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.page-item.disabled .page-link {
+ color: #ccc;
+ pointer-events: none;
+ cursor: auto;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.page-item.disabled:first-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e");
+}
+
+.page-item.disabled:last-child .page-link::before {
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e");
+}
+
+.page-item + .page-item {
+ margin-left: .625rem;
+}
+
+.pagination-lg .page-link {
+ min-width: 3.125rem;
+ min-height: 3.125rem;
+ padding: 0.875rem 1.125rem;
+ font-size: 1.125rem;
+ line-height: 1.111111;
+}
+
+.pagination-lg .page-item:first-child .page-link::before,
+.pagination-lg .page-item:last-child .page-link::before {
+ top: 1.03125rem;
+}
+
+.pagination-sm .page-link {
+ min-width: 1.875rem;
+ min-height: 1.875rem;
+ padding: 0.375rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.428571;
+}
+
+.pagination-sm .page-item:first-child .page-link::before,
+.pagination-sm .page-item:last-child .page-link::before {
+ top: .53125rem;
+}
+
+.badge {
+ display: inline-block;
+ padding: 0.1875rem 0.625rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .badge {
+ transition: none;
+ }
+}
+
+a.badge:hover, a.badge:focus {
+ text-decoration: none;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.badge-pill {
+ padding-right: 0.625rem;
+ padding-left: 0.625rem;
+}
+
+.badge-primary {
+ color: #fff;
+ background-color: #f16e00;
+}
+
+a.badge-primary:hover, a.badge-primary:focus {
+ color: #fff;
+ background-color: #be5700;
+}
+
+.badge-secondary {
+ color: #fff;
+ background-color: #000;
+}
+
+a.badge-secondary:hover, a.badge-secondary:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.badge-success {
+ color: #000;
+ background-color: #32c832;
+}
+
+a.badge-success:hover, a.badge-success:focus {
+ color: #000;
+ background-color: #289f28;
+}
+
+.badge-info {
+ color: #000;
+ background-color: #527edb;
+}
+
+a.badge-info:hover, a.badge-info:focus {
+ color: #000;
+ background-color: #2b60cf;
+}
+
+.badge-warning {
+ color: #000;
+ background-color: #fc0;
+}
+
+a.badge-warning:hover, a.badge-warning:focus {
+ color: #000;
+ background-color: #cca300;
+}
+
+.badge-danger {
+ color: #fff;
+ background-color: #cd3c14;
+}
+
+a.badge-danger:hover, a.badge-danger:focus {
+ color: #fff;
+ background-color: #9f2e0f;
+}
+
+.badge-light {
+ color: #000;
+ background-color: #ddd;
+}
+
+a.badge-light:hover, a.badge-light:focus {
+ color: #000;
+ background-color: #c4c4c4;
+}
+
+.badge-dark {
+ color: #fff;
+ background-color: #000;
+}
+
+a.badge-dark:hover, a.badge-dark:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.badge[href]:focus {
+ outline-color: #fff;
+ outline-offset: -1px;
+}
+
+.badge[href]:focus.badge-light {
+ outline-color: #000;
+}
+
+.jumbotron {
+ padding: 2.5rem 1.25rem;
+ margin-bottom: 2.5rem;
+ color: #000;
+ background-color: #fff;
+}
+
+@media (min-width: 480px) {
+ .jumbotron {
+ padding: 5rem 2.5rem;
+ }
+}
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.alert {
+ position: relative;
+ padding: 0.8125rem 1.25rem;
+ margin-bottom: 1.25rem;
+ border: 0 solid transparent;
+}
+
+.alert .alert-icon {
+ position: absolute;
+ top: .625rem;
+}
+
+.alert .alert-icon::after {
+ width: 1.76rem;
+ height: 1.76rem;
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.alert-sm {
+ padding: 0.3125rem 1.25rem;
+}
+
+.alert-sm .alert-icon {
+ top: .4375rem;
+}
+
+.alert-sm .alert-icon::after {
+ width: 1rem;
+ height: 1rem;
+}
+
+.alert-lg {
+ padding: 1rem 1.25rem;
+}
+
+.alert-lg .alert-icon {
+ top: .625rem;
+}
+
+.alert-lg .alert-icon::after {
+ width: 2rem;
+ height: 2rem;
+}
+
+.alert-heading {
+ color: inherit;
+}
+
+.alert-link {
+ font-weight: 700;
+}
+
+.alert-dismissible {
+ padding-right: 4rem;
+}
+
+.alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 0.8125rem 1.25rem;
+ line-height: 0.8125rem;
+ color: inherit;
+}
+
+.alert-primary {
+ color: #000;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.alert-primary hr {
+ border-top-color: #d86200;
+}
+
+.alert-primary .alert-link {
+ color: black;
+}
+
+.alert-secondary {
+ color: #fff;
+ background-color: black;
+ border-color: black;
+}
+
+.alert-secondary hr {
+ border-top-color: black;
+}
+
+.alert-secondary .alert-link {
+ color: #e6e6e6;
+}
+
+.alert-success {
+ color: #000;
+ background-color: #32c832;
+ border-color: #32c832;
+}
+
+.alert-success hr {
+ border-top-color: #2db42d;
+}
+
+.alert-success .alert-link {
+ color: black;
+}
+
+.alert-info {
+ color: #000;
+ background-color: #527edb;
+ border-color: #527edb;
+}
+
+.alert-info hr {
+ border-top-color: #3d6ed7;
+}
+
+.alert-info .alert-link {
+ color: black;
+}
+
+.alert-warning {
+ color: #000;
+ background-color: #ffcc00;
+ border-color: #ffcc00;
+}
+
+.alert-warning hr {
+ border-top-color: #e6b800;
+}
+
+.alert-warning .alert-link {
+ color: black;
+}
+
+.alert-danger {
+ color: #fff;
+ background-color: #cd3c14;
+ border-color: #cd3c14;
+}
+
+.alert-danger hr {
+ border-top-color: #b63512;
+}
+
+.alert-danger .alert-link {
+ color: #e6e6e6;
+}
+
+.alert-light {
+ color: #000;
+ background-color: #dddddd;
+ border-color: #dddddd;
+}
+
+.alert-light hr {
+ border-top-color: #d0d0d0;
+}
+
+.alert-light .alert-link {
+ color: black;
+}
+
+.alert-dark {
+ color: #fff;
+ background-color: black;
+ border-color: black;
+}
+
+.alert-dark hr {
+ border-top-color: black;
+}
+
+.alert-dark .alert-link {
+ color: #e6e6e6;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 1.25rem 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1.25rem 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+.progress {
+ display: -ms-flexbox;
+ display: flex;
+ height: 1.25rem;
+ overflow: hidden;
+ font-size: 1rem;
+ background-color: #ccc;
+}
+
+.progress-bar {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-pack: center;
+ justify-content: center;
+ color: #000;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #f16e00;
+ transition: width 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar {
+ transition: none;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .progress {
+ width: 100%;
+ height: 0.625rem;
+ line-height: 0.625rem;
+ }
+ .progress-bar {
+ font-size: 0.875rem;
+ line-height: 0.625rem;
+ }
+}
+
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 1.25rem 1.25rem;
+}
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.media {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: start;
+ align-items: flex-start;
+}
+
+.media-body {
+ -ms-flex: 1;
+ flex: 1;
+}
+
+.list-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+}
+
+.list-group-item-action {
+ width: 100%;
+ color: #000;
+ text-align: inherit;
+}
+
+.list-group-item-action:hover, .list-group-item-action:focus {
+ z-index: 1;
+ color: #f16e00;
+ text-decoration: none;
+ background-color: #f6f6f6;
+}
+
+.list-group-item-action:active {
+ color: #000;
+ background-color: #eee;
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 0.625rem 0.625rem;
+ margin-bottom: -2px;
+ color: #000;
+ background-color: #fff;
+ border: 2px solid #000;
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+}
+
+.list-group-item.disabled, .list-group-item:disabled {
+ color: #ccc;
+ pointer-events: none;
+ background-color: #fff;
+}
+
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-horizontal {
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.list-group-horizontal .list-group-item {
+ margin-right: -2px;
+ margin-bottom: 0;
+}
+
+.list-group-horizontal .list-group-item:last-child {
+ margin-right: 0;
+}
+
+@media (min-width: 480px) {
+ .list-group-horizontal-sm {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-sm .list-group-item {
+ margin-right: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-sm .list-group-item:last-child {
+ margin-right: 0;
+ }
+}
+
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-md .list-group-item {
+ margin-right: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-md .list-group-item:last-child {
+ margin-right: 0;
+ }
+}
+
+@media (min-width: 980px) {
+ .list-group-horizontal-lg {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-lg .list-group-item {
+ margin-right: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-lg .list-group-item:last-child {
+ margin-right: 0;
+ }
+}
+
+@media (min-width: 1220px) {
+ .list-group-horizontal-xl {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-xl .list-group-item {
+ margin-right: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-xl .list-group-item:last-child {
+ margin-right: 0;
+ }
+}
+
+@media (min-width: 1380px) {
+ .list-group-horizontal-xxl {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .list-group-horizontal-xxl .list-group-item {
+ margin-right: -2px;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-xxl .list-group-item:last-child {
+ margin-right: 0;
+ }
+}
+
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+}
+
+.list-group-flush .list-group-item:last-child {
+ margin-bottom: -2px;
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0;
+}
+
+.list-group-flush:last-child .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom: 0;
+}
+
+.list-group-item-primary {
+ color: #000;
+ background-color: #f16e00;
+}
+
+.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
+ color: #000;
+ background-color: #d86200;
+}
+
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-secondary {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-success {
+ color: #000;
+ background-color: #32c832;
+}
+
+.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
+ color: #000;
+ background-color: #2db42d;
+}
+
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-info {
+ color: #000;
+ background-color: #527edb;
+}
+
+.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
+ color: #000;
+ background-color: #3d6ed7;
+}
+
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-warning {
+ color: #000;
+ background-color: #ffcc00;
+}
+
+.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
+ color: #000;
+ background-color: #e6b800;
+}
+
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-danger {
+ color: #000;
+ background-color: #cd3c14;
+}
+
+.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
+ color: #000;
+ background-color: #b63512;
+}
+
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-light {
+ color: #000;
+ background-color: #dddddd;
+}
+
+.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
+ color: #000;
+ background-color: #d0d0d0;
+}
+
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.list-group-item-dark {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
+ color: #fff;
+ background-color: black;
+}
+
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 1;
+}
+
+.close:hover {
+ color: #000;
+ text-decoration: none;
+}
+
+.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
+ opacity: 1;
+}
+
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+a.close.disabled {
+ pointer-events: none;
+}
+
+.toast {
+ max-width: 350px;
+ overflow: hidden;
+ font-size: 0.875rem;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: none;
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ opacity: 0;
+}
+
+.toast:not(:last-child) {
+ margin-bottom: 0.625rem;
+}
+
+.toast.showing {
+ opacity: 1;
+}
+
+.toast.show {
+ display: block;
+ opacity: 1;
+}
+
+.toast.hide {
+ display: none;
+}
+
+.toast-header {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 0.3125rem 0.625rem;
+ color: #999;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+}
+
+.toast-body {
+ padding: 0.625rem;
+}
+
+.modal-open {
+ overflow: hidden;
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ outline: 0;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.625rem;
+ pointer-events: none;
+}
+
+.modal.fade .modal-dialog {
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
+ -webkit-transform: translate(0, -50px);
+ transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.modal.show .modal-dialog {
+ -webkit-transform: none;
+ transform: none;
+}
+
+.modal-dialog-scrollable {
+ display: -ms-flexbox;
+ display: flex;
+ max-height: calc(100% - 1.25rem);
+}
+
+.modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 1.25rem);
+ overflow: hidden;
+}
+
+.modal-dialog-scrollable .modal-header,
+.modal-dialog-scrollable .modal-footer {
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+}
+
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.modal-dialog-centered {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ min-height: calc(100% - 1.25rem);
+}
+
+.modal-dialog-centered::before {
+ display: block;
+ height: calc(100vh - 1.25rem);
+ content: "";
+}
+
+.modal-dialog-centered.modal-dialog-scrollable {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-pack: center;
+ justify-content: center;
+ height: 100%;
+}
+
+.modal-dialog-centered.modal-dialog-scrollable .modal-content {
+ max-height: none;
+}
+
+.modal-dialog-centered.modal-dialog-scrollable::before {
+ content: none;
+}
+
+.modal-content {
+ position: relative;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ width: 100%;
+ color: #000;
+ pointer-events: auto;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 2px solid #000;
+ outline: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #333;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+}
+
+.modal-backdrop.show {
+ opacity: 0.5;
+}
+
+.modal-header {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 0.625rem 0.625rem;
+ border-bottom: 2px solid #000;
+}
+
+.modal-header .close {
+ padding: 0.625rem 0.625rem;
+ margin: -0.625rem -0.625rem -0.625rem auto;
+}
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.25;
+}
+
+.modal-body {
+ position: relative;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 0.625rem;
+}
+
+.modal-footer {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ padding: 0.625rem;
+ border-top: 2px solid #000;
+}
+
+.modal-footer > :not(:first-child) {
+ margin-left: .25rem;
+}
+
+.modal-footer > :not(:last-child) {
+ margin-right: .25rem;
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+@media (min-width: 480px) {
+ .modal-dialog {
+ max-width: 700px;
+ margin: 1.875rem auto;
+ }
+ .modal-dialog-scrollable {
+ max-height: calc(100% - 3.75rem);
+ }
+ .modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 3.75rem);
+ }
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.75rem);
+ }
+ .modal-dialog-centered::before {
+ height: calc(100vh - 3.75rem);
+ }
+ .modal-sm {
+ max-width: 300px;
+ }
+}
+
+@media (min-width: 980px) {
+ .modal-lg,
+ .modal-xl {
+ max-width: 700px;
+ }
+}
+
+@media (min-width: 1220px) {
+ .modal-xl {
+ max-width: 700px;
+ }
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0.3125rem;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.25;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ font-weight: 700;
+ word-wrap: break-word;
+ opacity: 0;
+}
+
+.tooltip.show {
+ opacity: 0.9;
+}
+
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: 0.625rem;
+ height: 0.625rem;
+}
+
+.tooltip .arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
+ padding: 0.625rem 0;
+}
+
+.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
+ bottom: 0;
+}
+
+.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
+ top: 0;
+ border-width: 0.625rem 0.3125rem 0;
+ border-top-color: #ddd;
+}
+
+.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
+ padding: 0 0.625rem;
+}
+
+.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
+ left: 0;
+ width: 0.625rem;
+ height: 0.625rem;
+}
+
+.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
+ right: 0;
+ border-width: 0.3125rem 0.625rem 0.3125rem 0;
+ border-right-color: #ddd;
+}
+
+.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
+ padding: 0.625rem 0;
+}
+
+.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
+ top: 0;
+}
+
+.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+ bottom: 0;
+ border-width: 0 0.3125rem 0.625rem;
+ border-bottom-color: #ddd;
+}
+
+.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
+ padding: 0 0.625rem;
+}
+
+.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
+ right: 0;
+ width: 0.625rem;
+ height: 0.625rem;
+}
+
+.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
+ left: 0;
+ border-width: 0.3125rem 0 0.3125rem 0.625rem;
+ border-left-color: #ddd;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 1.25rem 1.25rem;
+ color: #000;
+ text-align: center;
+ background-color: #ddd;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: "HelvNeueOrange", "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.25;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ font-weight: 700;
+ word-wrap: break-word;
+ background-color: #ddd;
+ background-clip: padding-box;
+ border: 2px solid #ddd;
+}
+
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 0.625rem;
+ height: 0.3125rem;
+ margin: 0 0.3rem;
+}
+
+.popover .arrow::before, .popover .arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
+ margin-bottom: 0.3125rem;
+}
+
+.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
+ bottom: calc((0.3125rem + 2px) * -1);
+}
+
+.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
+ bottom: 0;
+ border-width: 0.3125rem 0.3125rem 0;
+ border-top-color: #ddd;
+}
+
+.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after {
+ bottom: 2px;
+ border-width: 0.3125rem 0.3125rem 0;
+ border-top-color: #ddd;
+}
+
+.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
+ margin-left: 0.3125rem;
+}
+
+.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
+ left: calc((0.3125rem + 2px) * -1);
+ width: 0.3125rem;
+ height: 0.625rem;
+ margin: 0.3rem 0;
+}
+
+.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before {
+ left: 0;
+ border-width: 0.3125rem 0.3125rem 0.3125rem 0;
+ border-right-color: #ddd;
+}
+
+.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after {
+ left: 2px;
+ border-width: 0.3125rem 0.3125rem 0.3125rem 0;
+ border-right-color: #ddd;
+}
+
+.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
+ margin-top: 0.3125rem;
+}
+
+.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
+ top: calc((0.3125rem + 2px) * -1);
+}
+
+.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
+ top: 0;
+ border-width: 0 0.3125rem 0.3125rem 0.3125rem;
+ border-bottom-color: #ddd;
+}
+
+.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after {
+ top: 2px;
+ border-width: 0 0.3125rem 0.3125rem 0.3125rem;
+ border-bottom-color: #ddd;
+}
+
+.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 0.625rem;
+ margin-left: -0.3125rem;
+ content: "";
+ border-bottom: 2px solid #ddd;
+}
+
+.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
+ margin-right: 0.3125rem;
+}
+
+.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
+ right: calc((0.3125rem + 2px) * -1);
+ width: 0.3125rem;
+ height: 0.625rem;
+ margin: 0.3rem 0;
+}
+
+.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before {
+ right: 0;
+ border-width: 0.3125rem 0 0.3125rem 0.3125rem;
+ border-left-color: #ddd;
+}
+
+.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after {
+ right: 2px;
+ border-width: 0.3125rem 0 0.3125rem 0.3125rem;
+ border-left-color: #ddd;
+}
+
+.popover-header {
+ padding: 0.625rem 0.625rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ color: inherit;
+ background-color: #ddd;
+ border-bottom: 2px solid #d0d0d0;
+}
+
+.popover-header:empty {
+ display: none;
+}
+
+.popover-body {
+ padding: 0.625rem 0.625rem;
+ color: #000;
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel.pointer-event {
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-item {
+ transition: none;
+ }
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: block;
+}
+
+.carousel-item-next:not(.carousel-item-left),
+.active.carousel-item-right {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+}
+
+.carousel-item-prev:not(.carousel-item-right),
+.active.carousel-item-left {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+}
+
+.carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ -webkit-transform: none;
+ transform: none;
+}
+
+.carousel-fade .carousel-item.active,
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right {
+ z-index: 1;
+ opacity: 1;
+}
+
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+ z-index: 0;
+ opacity: 0;
+ transition: 0s 0.6s opacity;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-fade .active.carousel-item-left,
+ .carousel-fade .active.carousel-item-right {
+ transition: none;
+ }
+}
+
+.carousel-control-prev,
+.carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: 1.875rem;
+ color: #000;
+ text-align: center;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-control-prev,
+ .carousel-control-next {
+ transition: none;
+ }
+}
+
+.carousel-control-prev:hover, .carousel-control-prev:focus,
+.carousel-control-next:hover,
+.carousel-control-next:focus {
+ color: #000;
+ text-decoration: none;
+ outline: 2px dotted #000;
+ opacity: 0.9;
+}
+
+.carousel-control-prev {
+ left: 0;
+}
+
+.carousel-control-next {
+ right: 0;
+}
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: no-repeat 50% / 100% 100%;
+}
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e");
+}
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e");
+}
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 15;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding-left: 0;
+ margin-right: 1.875rem;
+ margin-left: 1.875rem;
+ list-style: none;
+}
+
+.carousel-indicators li {
+ box-sizing: content-box;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #f16e00;
+ background-clip: padding-box;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: .5;
+ transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .carousel-indicators li {
+ transition: none;
+ }
+}
+
+.carousel-indicators .active {
+ opacity: 1;
+}
+
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #000;
+ text-align: center;
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+.spinner-border {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ border: 0.25em solid currentColor;
+ border-right-color: transparent;
+ border-radius: 50%;
+ -webkit-animation: spinner-border .75s linear infinite;
+ animation: spinner-border .75s linear infinite;
+}
+
+.spinner-border-sm {
+ width: 1rem;
+ height: 1rem;
+ border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ }
+}
+
+@keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ }
+}
+
+.spinner-grow {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ background-color: currentColor;
+ border-radius: 50%;
+ opacity: 0;
+ -webkit-animation: spinner-grow .75s linear infinite;
+ animation: spinner-grow .75s linear infinite;
+}
+
+.spinner-grow-sm {
+ width: 1rem;
+ height: 1rem;
+}
+
+.align-baseline {
+ vertical-align: baseline !important;
+}
+
+.align-top {
+ vertical-align: top !important;
+}
+
+.align-middle {
+ vertical-align: middle !important;
+}
+
+.align-bottom {
+ vertical-align: bottom !important;
+}
+
+.align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+
+.align-text-top {
+ vertical-align: text-top !important;
+}
+
+.bg-primary {
+ background-color: #f16e00 !important;
+}
+
+a.bg-primary:hover, a.bg-primary:focus,
+button.bg-primary:hover,
+button.bg-primary:focus {
+ background-color: #be5700 !important;
+}
+
+.bg-secondary {
+ background-color: #000 !important;
+}
+
+a.bg-secondary:hover, a.bg-secondary:focus,
+button.bg-secondary:hover,
+button.bg-secondary:focus {
+ background-color: black !important;
+}
+
+.bg-success {
+ background-color: #32c832 !important;
+}
+
+a.bg-success:hover, a.bg-success:focus,
+button.bg-success:hover,
+button.bg-success:focus {
+ background-color: #289f28 !important;
+}
+
+.bg-info {
+ background-color: #527edb !important;
+}
+
+a.bg-info:hover, a.bg-info:focus,
+button.bg-info:hover,
+button.bg-info:focus {
+ background-color: #2b60cf !important;
+}
+
+.bg-warning {
+ background-color: #fc0 !important;
+}
+
+a.bg-warning:hover, a.bg-warning:focus,
+button.bg-warning:hover,
+button.bg-warning:focus {
+ background-color: #cca300 !important;
+}
+
+.bg-danger {
+ background-color: #cd3c14 !important;
+}
+
+a.bg-danger:hover, a.bg-danger:focus,
+button.bg-danger:hover,
+button.bg-danger:focus {
+ background-color: #9f2e0f !important;
+}
+
+.bg-light {
+ background-color: #ddd !important;
+}
+
+a.bg-light:hover, a.bg-light:focus,
+button.bg-light:hover,
+button.bg-light:focus {
+ background-color: #c4c4c4 !important;
+}
+
+.bg-dark {
+ background-color: #000 !important;
+}
+
+a.bg-dark:hover, a.bg-dark:focus,
+button.bg-dark:hover,
+button.bg-dark:focus {
+ background-color: black !important;
+}
+
+.bg-white {
+ background-color: #fff !important;
+}
+
+.bg-transparent {
+ background-color: transparent !important;
+}
+
+.border {
+ border: 2px solid #000 !important;
+}
+
+.border-top {
+ border-top: 2px solid #000 !important;
+}
+
+.border-right {
+ border-right: 2px solid #000 !important;
+}
+
+.border-bottom {
+ border-bottom: 2px solid #000 !important;
+}
+
+.border-left {
+ border-left: 2px solid #000 !important;
+}
+
+.border-0 {
+ border: 0 !important;
+}
+
+.border-top-0 {
+ border-top: 0 !important;
+}
+
+.border-right-0 {
+ border-right: 0 !important;
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.border-left-0 {
+ border-left: 0 !important;
+}
+
+.border-primary {
+ border-color: #f16e00 !important;
+}
+
+.border-secondary {
+ border-color: #000 !important;
+}
+
+.border-success {
+ border-color: #32c832 !important;
+}
+
+.border-info {
+ border-color: #527edb !important;
+}
+
+.border-warning {
+ border-color: #fc0 !important;
+}
+
+.border-danger {
+ border-color: #cd3c14 !important;
+}
+
+.border-light {
+ border-color: #ddd !important;
+}
+
+.border-dark {
+ border-color: #000 !important;
+}
+
+.border-white {
+ border-color: #fff !important;
+}
+
+.rounded-sm {
+ border-radius: 0.2rem !important;
+}
+
+.rounded {
+ border-radius: 0.25rem !important;
+}
+
+.rounded-top {
+ border-top-left-radius: 0.25rem !important;
+ border-top-right-radius: 0.25rem !important;
+}
+
+.rounded-right {
+ border-top-right-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important;
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
+}
+
+.rounded-left {
+ border-top-left-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
+}
+
+.rounded-lg {
+ border-radius: 0.3rem !important;
+}
+
+.rounded-circle {
+ border-radius: 50% !important;
+}
+
+.rounded-pill {
+ border-radius: 50rem !important;
+}
+
+.rounded-0 {
+ border-radius: 0 !important;
+}
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.d-none {
+ display: none !important;
+}
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-table {
+ display: table !important;
+}
+
+.d-table-row {
+ display: table-row !important;
+}
+
+.d-table-cell {
+ display: table-cell !important;
+}
+
+.d-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+}
+
+.d-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+}
+
+@media (min-width: 480px) {
+ .d-sm-none {
+ display: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
+ display: block !important;
+ }
+ .d-sm-table {
+ display: table !important;
+ }
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+ .d-sm-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important;
+ }
+ .d-md-inline {
+ display: inline !important;
+ }
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .d-md-block {
+ display: block !important;
+ }
+ .d-md-table {
+ display: table !important;
+ }
+ .d-md-table-row {
+ display: table-row !important;
+ }
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+ .d-md-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-inline {
+ display: inline !important;
+ }
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+ .d-lg-table {
+ display: table !important;
+ }
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+ .d-lg-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .d-xl-none {
+ display: none !important;
+ }
+ .d-xl-inline {
+ display: inline !important;
+ }
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xl-block {
+ display: block !important;
+ }
+ .d-xl-table {
+ display: table !important;
+ }
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xl-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .d-xxl-none {
+ display: none !important;
+ }
+ .d-xxl-inline {
+ display: inline !important;
+ }
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xxl-block {
+ display: block !important;
+ }
+ .d-xxl-table {
+ display: table !important;
+ }
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xxl-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xxl-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+@media print {
+ .d-print-none {
+ display: none !important;
+ }
+ .d-print-inline {
+ display: inline !important;
+ }
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+ .d-print-block {
+ display: block !important;
+ }
+ .d-print-table {
+ display: table !important;
+ }
+ .d-print-table-row {
+ display: table-row !important;
+ }
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+ .d-print-flex {
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-print-inline-flex {
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
+}
+
+.embed-responsive::before {
+ display: block;
+ content: "";
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.857143%;
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%;
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%;
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%;
+}
+
+.flex-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.flex-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+}
+
+.flex-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+}
+
+.flex-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+}
+
+.flex-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+}
+
+.flex-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+}
+
+.justify-content-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 480px) {
+ .flex-sm-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-sm-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-sm-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-sm-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-sm-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-sm-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-sm-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .flex-md-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-md-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-md-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-md-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-md-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-md-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-md-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .flex-lg-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-lg-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-lg-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-lg-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-lg-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-lg-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-lg-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .flex-xl-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xl-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-xl-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-xl-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-xl-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-xl-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xl-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .flex-xxl-row {
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xxl-column {
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xxl-row-reverse {
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xxl-column-reverse {
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xxl-wrap {
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xxl-nowrap {
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xxl-wrap-reverse {
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xxl-fill {
+ -ms-flex: 1 1 auto !important;
+ flex: 1 1 auto !important;
+ }
+ .flex-xxl-grow-0 {
+ -ms-flex-positive: 0 !important;
+ flex-grow: 0 !important;
+ }
+ .flex-xxl-grow-1 {
+ -ms-flex-positive: 1 !important;
+ flex-grow: 1 !important;
+ }
+ .flex-xxl-shrink-0 {
+ -ms-flex-negative: 0 !important;
+ flex-shrink: 0 !important;
+ }
+ .flex-xxl-shrink-1 {
+ -ms-flex-negative: 1 !important;
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xxl-start {
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xxl-end {
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xxl-center {
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xxl-between {
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xxl-around {
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xxl-start {
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xxl-end {
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xxl-center {
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xxl-baseline {
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xxl-stretch {
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xxl-start {
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xxl-end {
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xxl-center {
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xxl-between {
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xxl-around {
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xxl-stretch {
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xxl-auto {
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xxl-start {
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xxl-end {
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xxl-center {
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xxl-baseline {
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xxl-stretch {
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+.float-left {
+ float: left !important;
+}
+
+.float-right {
+ float: right !important;
+}
+
+.float-none {
+ float: none !important;
+}
+
+@media (min-width: 480px) {
+ .float-sm-left {
+ float: left !important;
+ }
+ .float-sm-right {
+ float: right !important;
+ }
+ .float-sm-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .float-md-left {
+ float: left !important;
+ }
+ .float-md-right {
+ float: right !important;
+ }
+ .float-md-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .float-lg-left {
+ float: left !important;
+ }
+ .float-lg-right {
+ float: right !important;
+ }
+ .float-lg-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .float-xl-left {
+ float: left !important;
+ }
+ .float-xl-right {
+ float: right !important;
+ }
+ .float-xl-none {
+ float: none !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .float-xxl-left {
+ float: left !important;
+ }
+ .float-xxl-right {
+ float: right !important;
+ }
+ .float-xxl-none {
+ float: none !important;
+ }
+}
+
+.overflow-auto {
+ overflow: auto !important;
+}
+
+.overflow-hidden {
+ overflow: hidden !important;
+}
+
+.position-static {
+ position: static !important;
+}
+
+.position-relative {
+ position: relative !important;
+}
+
+.position-absolute {
+ position: absolute !important;
+}
+
+.position-fixed {
+ position: fixed !important;
+}
+
+.position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
+}
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+@supports ((position: -webkit-sticky) or (position: sticky)) {
+ .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+}
+
+.shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.shadow-none {
+ box-shadow: none !important;
+}
+
+.w-25 {
+ width: 25% !important;
+}
+
+.w-50 {
+ width: 50% !important;
+}
+
+.w-75 {
+ width: 75% !important;
+}
+
+.w-100 {
+ width: 100% !important;
+}
+
+.w-auto {
+ width: auto !important;
+}
+
+.h-25 {
+ height: 25% !important;
+}
+
+.h-50 {
+ height: 50% !important;
+}
+
+.h-75 {
+ height: 75% !important;
+}
+
+.h-100 {
+ height: 100% !important;
+}
+
+.h-auto {
+ height: auto !important;
+}
+
+.mw-100 {
+ max-width: 100% !important;
+}
+
+.mh-100 {
+ max-height: 100% !important;
+}
+
+.min-vw-100 {
+ min-width: 100vw !important;
+}
+
+.min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.vw-100 {
+ width: 100vw !important;
+}
+
+.vh-100 {
+ height: 100vh !important;
+}
+
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ pointer-events: auto;
+ content: "";
+ background-color: rgba(0, 0, 0, 0);
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.mt-0,
+.my-0 {
+ margin-top: 0 !important;
+}
+
+.mr-0,
+.mx-0 {
+ margin-right: 0 !important;
+}
+
+.mb-0,
+.my-0 {
+ margin-bottom: 0 !important;
+}
+
+.ml-0,
+.mx-0 {
+ margin-left: 0 !important;
+}
+
+.m-1 {
+ margin: 0.3125rem !important;
+}
+
+.mt-1,
+.my-1 {
+ margin-top: 0.3125rem !important;
+}
+
+.mr-1,
+.mx-1 {
+ margin-right: 0.3125rem !important;
+}
+
+.mb-1,
+.my-1 {
+ margin-bottom: 0.3125rem !important;
+}
+
+.ml-1,
+.mx-1 {
+ margin-left: 0.3125rem !important;
+}
+
+.m-2 {
+ margin: 0.625rem !important;
+}
+
+.mt-2,
+.my-2 {
+ margin-top: 0.625rem !important;
+}
+
+.mr-2,
+.mx-2 {
+ margin-right: 0.625rem !important;
+}
+
+.mb-2,
+.my-2 {
+ margin-bottom: 0.625rem !important;
+}
+
+.ml-2,
+.mx-2 {
+ margin-left: 0.625rem !important;
+}
+
+.m-3 {
+ margin: 1.25rem !important;
+}
+
+.mt-3,
+.my-3 {
+ margin-top: 1.25rem !important;
+}
+
+.mr-3,
+.mx-3 {
+ margin-right: 1.25rem !important;
+}
+
+.mb-3,
+.my-3 {
+ margin-bottom: 1.25rem !important;
+}
+
+.ml-3,
+.mx-3 {
+ margin-left: 1.25rem !important;
+}
+
+.m-4 {
+ margin: 1.875rem !important;
+}
+
+.mt-4,
+.my-4 {
+ margin-top: 1.875rem !important;
+}
+
+.mr-4,
+.mx-4 {
+ margin-right: 1.875rem !important;
+}
+
+.mb-4,
+.my-4 {
+ margin-bottom: 1.875rem !important;
+}
+
+.ml-4,
+.mx-4 {
+ margin-left: 1.875rem !important;
+}
+
+.m-5 {
+ margin: 3.75rem !important;
+}
+
+.mt-5,
+.my-5 {
+ margin-top: 3.75rem !important;
+}
+
+.mr-5,
+.mx-5 {
+ margin-right: 3.75rem !important;
+}
+
+.mb-5,
+.my-5 {
+ margin-bottom: 3.75rem !important;
+}
+
+.ml-5,
+.mx-5 {
+ margin-left: 3.75rem !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.pt-0,
+.py-0 {
+ padding-top: 0 !important;
+}
+
+.pr-0,
+.px-0 {
+ padding-right: 0 !important;
+}
+
+.pb-0,
+.py-0 {
+ padding-bottom: 0 !important;
+}
+
+.pl-0,
+.px-0 {
+ padding-left: 0 !important;
+}
+
+.p-1 {
+ padding: 0.3125rem !important;
+}
+
+.pt-1,
+.py-1 {
+ padding-top: 0.3125rem !important;
+}
+
+.pr-1,
+.px-1 {
+ padding-right: 0.3125rem !important;
+}
+
+.pb-1,
+.py-1 {
+ padding-bottom: 0.3125rem !important;
+}
+
+.pl-1,
+.px-1 {
+ padding-left: 0.3125rem !important;
+}
+
+.p-2 {
+ padding: 0.625rem !important;
+}
+
+.pt-2,
+.py-2 {
+ padding-top: 0.625rem !important;
+}
+
+.pr-2,
+.px-2 {
+ padding-right: 0.625rem !important;
+}
+
+.pb-2,
+.py-2 {
+ padding-bottom: 0.625rem !important;
+}
+
+.pl-2,
+.px-2 {
+ padding-left: 0.625rem !important;
+}
+
+.p-3 {
+ padding: 1.25rem !important;
+}
+
+.pt-3,
+.py-3 {
+ padding-top: 1.25rem !important;
+}
+
+.pr-3,
+.px-3 {
+ padding-right: 1.25rem !important;
+}
+
+.pb-3,
+.py-3 {
+ padding-bottom: 1.25rem !important;
+}
+
+.pl-3,
+.px-3 {
+ padding-left: 1.25rem !important;
+}
+
+.p-4 {
+ padding: 1.875rem !important;
+}
+
+.pt-4,
+.py-4 {
+ padding-top: 1.875rem !important;
+}
+
+.pr-4,
+.px-4 {
+ padding-right: 1.875rem !important;
+}
+
+.pb-4,
+.py-4 {
+ padding-bottom: 1.875rem !important;
+}
+
+.pl-4,
+.px-4 {
+ padding-left: 1.875rem !important;
+}
+
+.p-5 {
+ padding: 3.75rem !important;
+}
+
+.pt-5,
+.py-5 {
+ padding-top: 3.75rem !important;
+}
+
+.pr-5,
+.px-5 {
+ padding-right: 3.75rem !important;
+}
+
+.pb-5,
+.py-5 {
+ padding-bottom: 3.75rem !important;
+}
+
+.pl-5,
+.px-5 {
+ padding-left: 3.75rem !important;
+}
+
+.m-n1 {
+ margin: -0.3125rem !important;
+}
+
+.mt-n1,
+.my-n1 {
+ margin-top: -0.3125rem !important;
+}
+
+.mr-n1,
+.mx-n1 {
+ margin-right: -0.3125rem !important;
+}
+
+.mb-n1,
+.my-n1 {
+ margin-bottom: -0.3125rem !important;
+}
+
+.ml-n1,
+.mx-n1 {
+ margin-left: -0.3125rem !important;
+}
+
+.m-n2 {
+ margin: -0.625rem !important;
+}
+
+.mt-n2,
+.my-n2 {
+ margin-top: -0.625rem !important;
+}
+
+.mr-n2,
+.mx-n2 {
+ margin-right: -0.625rem !important;
+}
+
+.mb-n2,
+.my-n2 {
+ margin-bottom: -0.625rem !important;
+}
+
+.ml-n2,
+.mx-n2 {
+ margin-left: -0.625rem !important;
+}
+
+.m-n3 {
+ margin: -1.25rem !important;
+}
+
+.mt-n3,
+.my-n3 {
+ margin-top: -1.25rem !important;
+}
+
+.mr-n3,
+.mx-n3 {
+ margin-right: -1.25rem !important;
+}
+
+.mb-n3,
+.my-n3 {
+ margin-bottom: -1.25rem !important;
+}
+
+.ml-n3,
+.mx-n3 {
+ margin-left: -1.25rem !important;
+}
+
+.m-n4 {
+ margin: -1.875rem !important;
+}
+
+.mt-n4,
+.my-n4 {
+ margin-top: -1.875rem !important;
+}
+
+.mr-n4,
+.mx-n4 {
+ margin-right: -1.875rem !important;
+}
+
+.mb-n4,
+.my-n4 {
+ margin-bottom: -1.875rem !important;
+}
+
+.ml-n4,
+.mx-n4 {
+ margin-left: -1.875rem !important;
+}
+
+.m-n5 {
+ margin: -3.75rem !important;
+}
+
+.mt-n5,
+.my-n5 {
+ margin-top: -3.75rem !important;
+}
+
+.mr-n5,
+.mx-n5 {
+ margin-right: -3.75rem !important;
+}
+
+.mb-n5,
+.my-n5 {
+ margin-bottom: -3.75rem !important;
+}
+
+.ml-n5,
+.mx-n5 {
+ margin-left: -3.75rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mt-auto,
+.my-auto {
+ margin-top: auto !important;
+}
+
+.mr-auto,
+.mx-auto {
+ margin-right: auto !important;
+}
+
+.mb-auto,
+.my-auto {
+ margin-bottom: auto !important;
+}
+
+.ml-auto,
+.mx-auto {
+ margin-left: auto !important;
+}
+
+@media (min-width: 480px) {
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .mt-sm-0,
+ .my-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mr-sm-0,
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ }
+ .mb-sm-0,
+ .my-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-sm-0,
+ .mx-sm-0 {
+ margin-left: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-sm-1,
+ .my-sm-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-sm-1,
+ .mx-sm-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-sm-1,
+ .my-sm-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-sm-1,
+ .mx-sm-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-sm-2,
+ .my-sm-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-sm-2,
+ .mx-sm-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-sm-2,
+ .my-sm-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-sm-2,
+ .mx-sm-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-sm-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-sm-3,
+ .my-sm-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-sm-3,
+ .mx-sm-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-sm-3,
+ .my-sm-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-sm-3,
+ .mx-sm-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-sm-4,
+ .my-sm-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-sm-4,
+ .mx-sm-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-sm-4,
+ .my-sm-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-sm-4,
+ .mx-sm-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-sm-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-sm-5,
+ .my-sm-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-sm-5,
+ .mx-sm-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-sm-5,
+ .my-sm-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-sm-5,
+ .mx-sm-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .pt-sm-0,
+ .py-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pr-sm-0,
+ .px-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pb-sm-0,
+ .py-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-sm-0,
+ .px-sm-0 {
+ padding-left: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-sm-1,
+ .py-sm-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-sm-1,
+ .px-sm-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-sm-1,
+ .py-sm-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-sm-1,
+ .px-sm-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-sm-2,
+ .py-sm-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-sm-2,
+ .px-sm-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-sm-2,
+ .py-sm-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-sm-2,
+ .px-sm-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-sm-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-sm-3,
+ .py-sm-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-sm-3,
+ .px-sm-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-sm-3,
+ .py-sm-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-sm-3,
+ .px-sm-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-sm-4,
+ .py-sm-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-sm-4,
+ .px-sm-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-sm-4,
+ .py-sm-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-sm-4,
+ .px-sm-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-sm-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-sm-5,
+ .py-sm-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-sm-5,
+ .px-sm-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-sm-5,
+ .py-sm-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-sm-5,
+ .px-sm-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-sm-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-sm-n1,
+ .my-sm-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-sm-n1,
+ .mx-sm-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-sm-n1,
+ .my-sm-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-sm-n1,
+ .mx-sm-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-sm-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-sm-n2,
+ .my-sm-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-sm-n2,
+ .mx-sm-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-sm-n2,
+ .my-sm-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-sm-n2,
+ .mx-sm-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-sm-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-sm-n3,
+ .my-sm-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-sm-n3,
+ .mx-sm-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-sm-n3,
+ .my-sm-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-sm-n3,
+ .mx-sm-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-sm-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-sm-n4,
+ .my-sm-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-sm-n4,
+ .mx-sm-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-sm-n4,
+ .my-sm-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-sm-n4,
+ .mx-sm-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-sm-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-sm-n5,
+ .my-sm-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-sm-n5,
+ .mx-sm-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-sm-n5,
+ .my-sm-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-sm-n5,
+ .mx-sm-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mt-sm-auto,
+ .my-sm-auto {
+ margin-top: auto !important;
+ }
+ .mr-sm-auto,
+ .mx-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-auto,
+ .my-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-sm-auto,
+ .mx-sm-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .mt-md-0,
+ .my-md-0 {
+ margin-top: 0 !important;
+ }
+ .mr-md-0,
+ .mx-md-0 {
+ margin-right: 0 !important;
+ }
+ .mb-md-0,
+ .my-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-md-0,
+ .mx-md-0 {
+ margin-left: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-md-1,
+ .my-md-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-md-1,
+ .mx-md-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-md-1,
+ .my-md-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-md-1,
+ .mx-md-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-md-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-md-2,
+ .my-md-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-md-2,
+ .mx-md-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-md-2,
+ .my-md-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-md-2,
+ .mx-md-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-md-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-md-3,
+ .my-md-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-md-3,
+ .mx-md-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-md-3,
+ .my-md-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-md-3,
+ .mx-md-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-md-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-md-4,
+ .my-md-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-md-4,
+ .mx-md-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-md-4,
+ .my-md-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-md-4,
+ .mx-md-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-md-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-md-5,
+ .my-md-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-md-5,
+ .mx-md-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-md-5,
+ .my-md-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-md-5,
+ .mx-md-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .pt-md-0,
+ .py-md-0 {
+ padding-top: 0 !important;
+ }
+ .pr-md-0,
+ .px-md-0 {
+ padding-right: 0 !important;
+ }
+ .pb-md-0,
+ .py-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-md-0,
+ .px-md-0 {
+ padding-left: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-md-1,
+ .py-md-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-md-1,
+ .px-md-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-md-1,
+ .py-md-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-md-1,
+ .px-md-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-md-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-md-2,
+ .py-md-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-md-2,
+ .px-md-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-md-2,
+ .py-md-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-md-2,
+ .px-md-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-md-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-md-3,
+ .py-md-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-md-3,
+ .px-md-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-md-3,
+ .py-md-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-md-3,
+ .px-md-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-md-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-md-4,
+ .py-md-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-md-4,
+ .px-md-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-md-4,
+ .py-md-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-md-4,
+ .px-md-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-md-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-md-5,
+ .py-md-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-md-5,
+ .px-md-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-md-5,
+ .py-md-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-md-5,
+ .px-md-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-md-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-md-n1,
+ .my-md-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-md-n1,
+ .mx-md-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-md-n1,
+ .my-md-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-md-n1,
+ .mx-md-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-md-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-md-n2,
+ .my-md-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-md-n2,
+ .mx-md-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-md-n2,
+ .my-md-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-md-n2,
+ .mx-md-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-md-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-md-n3,
+ .my-md-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-md-n3,
+ .mx-md-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-md-n3,
+ .my-md-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-md-n3,
+ .mx-md-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-md-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-md-n4,
+ .my-md-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-md-n4,
+ .mx-md-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-md-n4,
+ .my-md-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-md-n4,
+ .mx-md-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-md-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-md-n5,
+ .my-md-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-md-n5,
+ .mx-md-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-md-n5,
+ .my-md-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-md-n5,
+ .mx-md-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mt-md-auto,
+ .my-md-auto {
+ margin-top: auto !important;
+ }
+ .mr-md-auto,
+ .mx-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-auto,
+ .my-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-md-auto,
+ .mx-md-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .mt-lg-0,
+ .my-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mr-lg-0,
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ }
+ .mb-lg-0,
+ .my-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-lg-0,
+ .mx-lg-0 {
+ margin-left: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-lg-1,
+ .my-lg-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-lg-1,
+ .mx-lg-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-lg-1,
+ .my-lg-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-lg-1,
+ .mx-lg-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-lg-2,
+ .my-lg-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-lg-2,
+ .mx-lg-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-lg-2,
+ .my-lg-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-lg-2,
+ .mx-lg-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-lg-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-lg-3,
+ .my-lg-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-lg-3,
+ .mx-lg-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-lg-3,
+ .my-lg-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-lg-3,
+ .mx-lg-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-lg-4,
+ .my-lg-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-lg-4,
+ .mx-lg-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-lg-4,
+ .my-lg-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-lg-4,
+ .mx-lg-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-lg-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-lg-5,
+ .my-lg-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-lg-5,
+ .mx-lg-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-lg-5,
+ .my-lg-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-lg-5,
+ .mx-lg-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .pt-lg-0,
+ .py-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pr-lg-0,
+ .px-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pb-lg-0,
+ .py-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-lg-0,
+ .px-lg-0 {
+ padding-left: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-lg-1,
+ .py-lg-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-lg-1,
+ .px-lg-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-lg-1,
+ .py-lg-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-lg-1,
+ .px-lg-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-lg-2,
+ .py-lg-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-lg-2,
+ .px-lg-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-lg-2,
+ .py-lg-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-lg-2,
+ .px-lg-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-lg-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-lg-3,
+ .py-lg-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-lg-3,
+ .px-lg-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-lg-3,
+ .py-lg-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-lg-3,
+ .px-lg-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-lg-4,
+ .py-lg-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-lg-4,
+ .px-lg-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-lg-4,
+ .py-lg-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-lg-4,
+ .px-lg-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-lg-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-lg-5,
+ .py-lg-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-lg-5,
+ .px-lg-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-lg-5,
+ .py-lg-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-lg-5,
+ .px-lg-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-lg-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-lg-n1,
+ .my-lg-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-lg-n1,
+ .mx-lg-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-lg-n1,
+ .my-lg-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-lg-n1,
+ .mx-lg-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-lg-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-lg-n2,
+ .my-lg-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-lg-n2,
+ .mx-lg-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-lg-n2,
+ .my-lg-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-lg-n2,
+ .mx-lg-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-lg-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-lg-n3,
+ .my-lg-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-lg-n3,
+ .mx-lg-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-lg-n3,
+ .my-lg-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-lg-n3,
+ .mx-lg-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-lg-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-lg-n4,
+ .my-lg-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-lg-n4,
+ .mx-lg-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-lg-n4,
+ .my-lg-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-lg-n4,
+ .mx-lg-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-lg-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-lg-n5,
+ .my-lg-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-lg-n5,
+ .mx-lg-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-lg-n5,
+ .my-lg-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-lg-n5,
+ .mx-lg-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mt-lg-auto,
+ .my-lg-auto {
+ margin-top: auto !important;
+ }
+ .mr-lg-auto,
+ .mx-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-auto,
+ .my-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-lg-auto,
+ .mx-lg-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .mt-xl-0,
+ .my-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xl-0,
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xl-0,
+ .my-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xl-0,
+ .mx-xl-0 {
+ margin-left: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-xl-1,
+ .my-xl-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-xl-1,
+ .mx-xl-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-xl-1,
+ .my-xl-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-xl-1,
+ .mx-xl-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-xl-2,
+ .my-xl-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-xl-2,
+ .mx-xl-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-xl-2,
+ .my-xl-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-xl-2,
+ .mx-xl-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-xl-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-xl-3,
+ .my-xl-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-xl-3,
+ .mx-xl-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-xl-3,
+ .my-xl-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-xl-3,
+ .mx-xl-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-xl-4,
+ .my-xl-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-xl-4,
+ .mx-xl-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-xl-4,
+ .my-xl-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-xl-4,
+ .mx-xl-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-xl-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-xl-5,
+ .my-xl-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-xl-5,
+ .mx-xl-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-xl-5,
+ .my-xl-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-xl-5,
+ .mx-xl-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .pt-xl-0,
+ .py-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xl-0,
+ .px-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xl-0,
+ .py-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xl-0,
+ .px-xl-0 {
+ padding-left: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-xl-1,
+ .py-xl-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-xl-1,
+ .px-xl-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-xl-1,
+ .py-xl-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-xl-1,
+ .px-xl-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-xl-2,
+ .py-xl-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-xl-2,
+ .px-xl-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-xl-2,
+ .py-xl-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-xl-2,
+ .px-xl-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-xl-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-xl-3,
+ .py-xl-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-xl-3,
+ .px-xl-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-xl-3,
+ .py-xl-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-xl-3,
+ .px-xl-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-xl-4,
+ .py-xl-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-xl-4,
+ .px-xl-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-xl-4,
+ .py-xl-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-xl-4,
+ .px-xl-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-xl-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-xl-5,
+ .py-xl-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-xl-5,
+ .px-xl-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-xl-5,
+ .py-xl-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-xl-5,
+ .px-xl-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-xl-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-xl-n1,
+ .my-xl-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-xl-n1,
+ .mx-xl-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-xl-n1,
+ .my-xl-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-xl-n1,
+ .mx-xl-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-xl-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-xl-n2,
+ .my-xl-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-xl-n2,
+ .mx-xl-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-xl-n2,
+ .my-xl-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-xl-n2,
+ .mx-xl-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-xl-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-xl-n3,
+ .my-xl-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-xl-n3,
+ .mx-xl-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-xl-n3,
+ .my-xl-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-xl-n3,
+ .mx-xl-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-xl-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-xl-n4,
+ .my-xl-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-xl-n4,
+ .mx-xl-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-xl-n4,
+ .my-xl-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-xl-n4,
+ .mx-xl-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-xl-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-xl-n5,
+ .my-xl-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-xl-n5,
+ .mx-xl-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-xl-n5,
+ .my-xl-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-xl-n5,
+ .mx-xl-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mt-xl-auto,
+ .my-xl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xl-auto,
+ .mx-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-auto,
+ .my-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xl-auto,
+ .mx-xl-auto {
+ margin-left: auto !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+ .mt-xxl-0,
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xxl-0,
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xxl-0,
+ .my-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xxl-0,
+ .mx-xxl-0 {
+ margin-left: 0 !important;
+ }
+ .m-xxl-1 {
+ margin: 0.3125rem !important;
+ }
+ .mt-xxl-1,
+ .my-xxl-1 {
+ margin-top: 0.3125rem !important;
+ }
+ .mr-xxl-1,
+ .mx-xxl-1 {
+ margin-right: 0.3125rem !important;
+ }
+ .mb-xxl-1,
+ .my-xxl-1 {
+ margin-bottom: 0.3125rem !important;
+ }
+ .ml-xxl-1,
+ .mx-xxl-1 {
+ margin-left: 0.3125rem !important;
+ }
+ .m-xxl-2 {
+ margin: 0.625rem !important;
+ }
+ .mt-xxl-2,
+ .my-xxl-2 {
+ margin-top: 0.625rem !important;
+ }
+ .mr-xxl-2,
+ .mx-xxl-2 {
+ margin-right: 0.625rem !important;
+ }
+ .mb-xxl-2,
+ .my-xxl-2 {
+ margin-bottom: 0.625rem !important;
+ }
+ .ml-xxl-2,
+ .mx-xxl-2 {
+ margin-left: 0.625rem !important;
+ }
+ .m-xxl-3 {
+ margin: 1.25rem !important;
+ }
+ .mt-xxl-3,
+ .my-xxl-3 {
+ margin-top: 1.25rem !important;
+ }
+ .mr-xxl-3,
+ .mx-xxl-3 {
+ margin-right: 1.25rem !important;
+ }
+ .mb-xxl-3,
+ .my-xxl-3 {
+ margin-bottom: 1.25rem !important;
+ }
+ .ml-xxl-3,
+ .mx-xxl-3 {
+ margin-left: 1.25rem !important;
+ }
+ .m-xxl-4 {
+ margin: 1.875rem !important;
+ }
+ .mt-xxl-4,
+ .my-xxl-4 {
+ margin-top: 1.875rem !important;
+ }
+ .mr-xxl-4,
+ .mx-xxl-4 {
+ margin-right: 1.875rem !important;
+ }
+ .mb-xxl-4,
+ .my-xxl-4 {
+ margin-bottom: 1.875rem !important;
+ }
+ .ml-xxl-4,
+ .mx-xxl-4 {
+ margin-left: 1.875rem !important;
+ }
+ .m-xxl-5 {
+ margin: 3.75rem !important;
+ }
+ .mt-xxl-5,
+ .my-xxl-5 {
+ margin-top: 3.75rem !important;
+ }
+ .mr-xxl-5,
+ .mx-xxl-5 {
+ margin-right: 3.75rem !important;
+ }
+ .mb-xxl-5,
+ .my-xxl-5 {
+ margin-bottom: 3.75rem !important;
+ }
+ .ml-xxl-5,
+ .mx-xxl-5 {
+ margin-left: 3.75rem !important;
+ }
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+ .pt-xxl-0,
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xxl-0,
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xxl-0,
+ .py-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xxl-0,
+ .px-xxl-0 {
+ padding-left: 0 !important;
+ }
+ .p-xxl-1 {
+ padding: 0.3125rem !important;
+ }
+ .pt-xxl-1,
+ .py-xxl-1 {
+ padding-top: 0.3125rem !important;
+ }
+ .pr-xxl-1,
+ .px-xxl-1 {
+ padding-right: 0.3125rem !important;
+ }
+ .pb-xxl-1,
+ .py-xxl-1 {
+ padding-bottom: 0.3125rem !important;
+ }
+ .pl-xxl-1,
+ .px-xxl-1 {
+ padding-left: 0.3125rem !important;
+ }
+ .p-xxl-2 {
+ padding: 0.625rem !important;
+ }
+ .pt-xxl-2,
+ .py-xxl-2 {
+ padding-top: 0.625rem !important;
+ }
+ .pr-xxl-2,
+ .px-xxl-2 {
+ padding-right: 0.625rem !important;
+ }
+ .pb-xxl-2,
+ .py-xxl-2 {
+ padding-bottom: 0.625rem !important;
+ }
+ .pl-xxl-2,
+ .px-xxl-2 {
+ padding-left: 0.625rem !important;
+ }
+ .p-xxl-3 {
+ padding: 1.25rem !important;
+ }
+ .pt-xxl-3,
+ .py-xxl-3 {
+ padding-top: 1.25rem !important;
+ }
+ .pr-xxl-3,
+ .px-xxl-3 {
+ padding-right: 1.25rem !important;
+ }
+ .pb-xxl-3,
+ .py-xxl-3 {
+ padding-bottom: 1.25rem !important;
+ }
+ .pl-xxl-3,
+ .px-xxl-3 {
+ padding-left: 1.25rem !important;
+ }
+ .p-xxl-4 {
+ padding: 1.875rem !important;
+ }
+ .pt-xxl-4,
+ .py-xxl-4 {
+ padding-top: 1.875rem !important;
+ }
+ .pr-xxl-4,
+ .px-xxl-4 {
+ padding-right: 1.875rem !important;
+ }
+ .pb-xxl-4,
+ .py-xxl-4 {
+ padding-bottom: 1.875rem !important;
+ }
+ .pl-xxl-4,
+ .px-xxl-4 {
+ padding-left: 1.875rem !important;
+ }
+ .p-xxl-5 {
+ padding: 3.75rem !important;
+ }
+ .pt-xxl-5,
+ .py-xxl-5 {
+ padding-top: 3.75rem !important;
+ }
+ .pr-xxl-5,
+ .px-xxl-5 {
+ padding-right: 3.75rem !important;
+ }
+ .pb-xxl-5,
+ .py-xxl-5 {
+ padding-bottom: 3.75rem !important;
+ }
+ .pl-xxl-5,
+ .px-xxl-5 {
+ padding-left: 3.75rem !important;
+ }
+ .m-xxl-n1 {
+ margin: -0.3125rem !important;
+ }
+ .mt-xxl-n1,
+ .my-xxl-n1 {
+ margin-top: -0.3125rem !important;
+ }
+ .mr-xxl-n1,
+ .mx-xxl-n1 {
+ margin-right: -0.3125rem !important;
+ }
+ .mb-xxl-n1,
+ .my-xxl-n1 {
+ margin-bottom: -0.3125rem !important;
+ }
+ .ml-xxl-n1,
+ .mx-xxl-n1 {
+ margin-left: -0.3125rem !important;
+ }
+ .m-xxl-n2 {
+ margin: -0.625rem !important;
+ }
+ .mt-xxl-n2,
+ .my-xxl-n2 {
+ margin-top: -0.625rem !important;
+ }
+ .mr-xxl-n2,
+ .mx-xxl-n2 {
+ margin-right: -0.625rem !important;
+ }
+ .mb-xxl-n2,
+ .my-xxl-n2 {
+ margin-bottom: -0.625rem !important;
+ }
+ .ml-xxl-n2,
+ .mx-xxl-n2 {
+ margin-left: -0.625rem !important;
+ }
+ .m-xxl-n3 {
+ margin: -1.25rem !important;
+ }
+ .mt-xxl-n3,
+ .my-xxl-n3 {
+ margin-top: -1.25rem !important;
+ }
+ .mr-xxl-n3,
+ .mx-xxl-n3 {
+ margin-right: -1.25rem !important;
+ }
+ .mb-xxl-n3,
+ .my-xxl-n3 {
+ margin-bottom: -1.25rem !important;
+ }
+ .ml-xxl-n3,
+ .mx-xxl-n3 {
+ margin-left: -1.25rem !important;
+ }
+ .m-xxl-n4 {
+ margin: -1.875rem !important;
+ }
+ .mt-xxl-n4,
+ .my-xxl-n4 {
+ margin-top: -1.875rem !important;
+ }
+ .mr-xxl-n4,
+ .mx-xxl-n4 {
+ margin-right: -1.875rem !important;
+ }
+ .mb-xxl-n4,
+ .my-xxl-n4 {
+ margin-bottom: -1.875rem !important;
+ }
+ .ml-xxl-n4,
+ .mx-xxl-n4 {
+ margin-left: -1.875rem !important;
+ }
+ .m-xxl-n5 {
+ margin: -3.75rem !important;
+ }
+ .mt-xxl-n5,
+ .my-xxl-n5 {
+ margin-top: -3.75rem !important;
+ }
+ .mr-xxl-n5,
+ .mx-xxl-n5 {
+ margin-right: -3.75rem !important;
+ }
+ .mb-xxl-n5,
+ .my-xxl-n5 {
+ margin-bottom: -3.75rem !important;
+ }
+ .ml-xxl-n5,
+ .mx-xxl-n5 {
+ margin-left: -3.75rem !important;
+ }
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+ .mt-xxl-auto,
+ .my-xxl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xxl-auto,
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xxl-auto,
+ .my-xxl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xxl-auto,
+ .mx-xxl-auto {
+ margin-left: auto !important;
+ }
+}
+
+.text-monospace {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
+}
+
+.text-justify {
+ text-align: justify !important;
+}
+
+.text-wrap {
+ white-space: normal !important;
+}
+
+.text-nowrap {
+ white-space: nowrap !important;
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.text-left {
+ text-align: left !important;
+}
+
+.text-right {
+ text-align: right !important;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+@media (min-width: 480px) {
+ .text-sm-left {
+ text-align: left !important;
+ }
+ .text-sm-right {
+ text-align: right !important;
+ }
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .text-md-left {
+ text-align: left !important;
+ }
+ .text-md-right {
+ text-align: right !important;
+ }
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 980px) {
+ .text-lg-left {
+ text-align: left !important;
+ }
+ .text-lg-right {
+ text-align: right !important;
+ }
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1220px) {
+ .text-xl-left {
+ text-align: left !important;
+ }
+ .text-xl-right {
+ text-align: right !important;
+ }
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1380px) {
+ .text-xxl-left {
+ text-align: left !important;
+ }
+ .text-xxl-right {
+ text-align: right !important;
+ }
+ .text-xxl-center {
+ text-align: center !important;
+ }
+}
+
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.font-weight-light {
+ font-weight: 300 !important;
+}
+
+.font-weight-lighter {
+ font-weight: lighter !important;
+}
+
+.font-weight-normal {
+ font-weight: 400 !important;
+}
+
+.font-weight-bold {
+ font-weight: 700 !important;
+}
+
+.font-weight-bolder {
+ font-weight: bolder !important;
+}
+
+.font-italic {
+ font-style: italic !important;
+}
+
+.text-white {
+ color: #fff !important;
+}
+
+.text-primary {
+ color: #f16e00 !important;
+}
+
+a.text-primary:hover, a.text-primary:focus {
+ color: #a54b00 !important;
+}
+
+.text-secondary {
+ color: #000 !important;
+}
+
+a.text-secondary:hover, a.text-secondary:focus {
+ color: black !important;
+}
+
+.text-success {
+ color: #32c832 !important;
+}
+
+a.text-success:hover, a.text-success:focus {
+ color: #238b23 !important;
+}
+
+.text-info {
+ color: #527edb !important;
+}
+
+a.text-info:hover, a.text-info:focus {
+ color: #2756ba !important;
+}
+
+.text-warning {
+ color: #fc0 !important;
+}
+
+a.text-warning:hover, a.text-warning:focus {
+ color: #b38f00 !important;
+}
+
+.text-danger {
+ color: #cd3c14 !important;
+}
+
+a.text-danger:hover, a.text-danger:focus {
+ color: #87280d !important;
+}
+
+.text-light {
+ color: #ddd !important;
+}
+
+a.text-light:hover, a.text-light:focus {
+ color: #b7b7b7 !important;
+}
+
+.text-dark {
+ color: #000 !important;
+}
+
+a.text-dark:hover, a.text-dark:focus {
+ color: black !important;
+}
+
+.text-body {
+ color: #000 !important;
+}
+
+.text-muted {
+ color: #666 !important;
+}
+
+.text-black-50 {
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.text-white-50 {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.text-decoration-none {
+ text-decoration: none !important;
+}
+
+.text-break {
+ word-break: break-word !important;
+ overflow-wrap: break-word !important;
+}
+
+.text-reset {
+ color: inherit !important;
+}
+
+.visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden !important;
+}
+
+@media print {
+ *,
+ *::before,
+ *::after {
+ text-shadow: none !important;
+ box-shadow: none !important;
+ }
+ a:not(.btn) {
+ text-decoration: underline;
+ }
+ abbr[title]::after {
+ content: " (" attr(title) ")";
+ }
+ pre {
+ white-space: pre-wrap !important;
+ }
+ pre,
+ blockquote {
+ border: 2px solid #ccc;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ @page {
+ size: a3;
+ }
+ body {
+ min-width: 980px !important;
+ }
+ .container {
+ min-width: 980px !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .badge {
+ border: 2px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #eee !important;
+ }
+ .table-dark {
+ color: inherit;
+ }
+ .table-dark th,
+ .table-dark td,
+ .table-dark thead th,
+ .table-dark tbody + tbody {
+ border-color: #ccc;
+ }
+ .table .thead-dark th {
+ color: inherit;
+ border-color: #ccc;
+ }
+ .row,
+ .form-row {
+ display: block !important;
+ }
+}
+
+.card-deck .o-card-link {
+ margin: 0 1rem;
+}
+
+.o-card-link .card-title {
+ -ms-flex-item-align: center;
+ align-self: center;
+ width: 100%;
+ margin: auto 0;
+ font-weight: 700;
+ word-break: normal;
+}
+
+.o-card-link .card-img {
+ padding: 0;
+ text-align: center;
+}
+
+.o-card-link .card-img img {
+ width: 100%;
+ height: auto;
+}
+
+.o-card-link .card-body {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ text-align: center;
+}
+
+.card-deck {
+ margin: 0;
+}
+
+@media (max-width: 479.98px) {
+ .card.o-card-link {
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ margin: 1rem;
+ }
+ .card-deck {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+ .card-deck .o-card-link,
+ .o-card-link {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ height: 3.75rem;
+ margin: 0;
+ margin-bottom: .625rem;
+ border: 0;
+ }
+ .o-card-link .card-img {
+ -ms-flex-preferred-size: 20%;
+ flex-basis: 20%;
+ width: auto;
+ padding: 0;
+ }
+ .o-card-link .card-img img {
+ width: auto;
+ height: 3.75rem;
+ }
+ .o-card-link .card-body {
+ -ms-flex-preferred-size: 80%;
+ flex-basis: 80%;
+ -ms-flex-item-align: center;
+ align-self: center;
+ padding: 0 1rem;
+ text-align: left;
+ }
+ .o-card-link .card-title {
+ -ms-flex-item-align: start;
+ align-self: flex-start;
+ margin: 0;
+ }
+ .o-card-link .card-title::after {
+ position: absolute;
+ top: calc(50% - .5rem);
+ right: .25rem;
+ width: 1rem;
+ height: 1rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ }
+}
+
+@media (min-width: 480px) and (max-width: 767.98px) {
+ .card.o-card-link {
+ -ms-flex-preferred-size: auto;
+ flex-basis: auto;
+ margin: 1rem;
+ }
+}
+
+.o-switch .toggle,
+.o-switch .toggle::before,
+.o-switch .toggle .on,
+.o-switch .toggle .off {
+ transition: .4s;
+}
+
+.o-switch .toggle {
+ position: relative;
+ display: block;
+ width: auto;
+ min-width: 3.75rem;
+ height: 1.875rem;
+ margin: .3125rem 0;
+ background: #666;
+ border: 2px solid #666;
+}
+
+.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {
+ border-radius: 1.625rem;
+}
+
+.o-switch .toggle .on,
+.o-switch .toggle .off {
+ display: none;
+ font-weight: 700;
+ line-height: 1.625rem;
+ color: #fff;
+ text-align: left;
+ cursor: default;
+ opacity: 0;
+}
+
+.o-switch .toggle .on.svg-checkbox-tick::after {
+ top: .1875rem;
+ left: -.125rem;
+}
+
+.o-switch .toggle .off {
+ display: block;
+ text-align: right;
+ opacity: 1;
+}
+
+.o-switch .toggle .off.svg-delete::after {
+ top: .1875rem;
+ right: -.125rem;
+ left: auto;
+}
+
+.o-switch .toggle::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ display: block;
+ width: 1.625rem;
+ height: 1.625rem;
+ content: "";
+ background: #fff;
+}
+
+.o-switch .checkbox:focus + .toggle::before {
+ outline: 1px dotted #fff;
+}
+
+.o-switch .checkbox:checked + .toggle {
+ background: #f16e00;
+ border-color: #f16e00;
+}
+
+.o-switch .checkbox:checked + .toggle .on {
+ display: block;
+ opacity: 1;
+}
+
+.o-switch .checkbox:checked + .toggle .off {
+ display: none;
+ opacity: 0;
+}
+
+.o-switch .checkbox:checked + .toggle::before {
+ right: 0;
+ left: auto;
+}
+
+.o-switch .checkbox.success:checked + .toggle {
+ background: #32c832;
+ border-color: #32c832;
+}
+
+.o-switch .checkbox.success:checked + .toggle .on {
+ color: #000;
+}
+
+.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {
+ color: #fff;
+}
+
+.form-group.row .o-switch .col-form-label.toggle {
+ padding: 0 .375rem;
+}
+
+.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {
+ padding: 0 .875rem;
+}
+
+.o-switch.btn-group-toggle {
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ border: 2px solid #ccc;
+}
+
+.o-switch.btn-group-toggle .btn {
+ min-width: 2.5rem;
+ padding-right: 0;
+ padding-left: 0;
+ margin: -2px 0;
+ border: 2px solid transparent;
+}
+
+.o-switch.btn-group-toggle .btn:first-child {
+ margin-left: -2px;
+}
+
+.o-switch.btn-group-toggle .btn:last-child {
+ margin-right: -2px;
+}
+
+.o-switch.btn-group-toggle .btn.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.o-switch.btn-group-toggle .btn.focus {
+ outline: 1px dotted #fff;
+ outline-offset: -2px;
+}
+
+.o-switch.btn-group-toggle .btn:active {
+ border-color: #f16e00;
+}
+
+.o-switch.btn-group-toggle .btn:hover:not(:active) {
+ color: #f16e00;
+ background-color: transparent;
+}
+
+.o-switch.btn-group-toggle .btn:hover.active {
+ color: #fff;
+ background-color: #000;
+ border-color: #000;
+}
+
+.o-switch.btn-group-toggle.no-outline {
+ border-color: transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn {
+ border-top: 2px solid transparent;
+ border-bottom: 2px solid transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:first-child {
+ border-left-color: transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:last-child {
+ border-right-color: transparent;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn.active {
+ color: #f16e00;
+ background-color: #fff;
+ border-color: transparent;
+ outline-color: #000;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {
+ color: #000;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.o-switch.btn-group-toggle.no-outline .btn:hover.active {
+ color: #f16e00;
+ background-color: #fff;
+ border-color: transparent;
+ outline-color: #000;
+}
+
+.form-group input[type="radio"],
+.form-group input[type="checkbox"] {
+ width: auto;
+}
+
+.form-group .invalid-feedback {
+ margin-top: .8125rem;
+ font-weight: 700;
+}
+
+.form-group.top {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.form-group.top .col-form-label {
+ margin-bottom: 0;
+}
+
+.form-group.top .form-control {
+ -ms-flex-order: 2;
+ order: 2;
+}
+
+.form-group.top .invalid-feedback {
+ -ms-flex-order: 1;
+ order: 1;
+ margin-top: 0;
+ margin-bottom: .8125rem;
+ line-height: 1;
+}
+
+.form-group.right {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+}
+
+.form-group.right label,
+.form-group.right .col-form-label {
+ min-width: 100%;
+}
+
+.form-group.right .form-control-message,
+.form-group.right .invalid-feedback {
+ max-width: 50%;
+ margin-left: .625rem;
+}
+
+.form-group.row.top {
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.form-group.row.top label,
+.form-group.row.top .col-form-label {
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.form-group.row.top .form-control {
+ -ms-flex-order: 2;
+ order: 2;
+ margin-top: 0;
+}
+
+.form-group.row.top .invalid-feedback {
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.form-group.row.right label,
+.form-group.row.right .col-form-label {
+ min-width: auto;
+}
+
+.form-group.row.right .invalid-feedback {
+ -ms-flex-item-align: center;
+ align-self: center;
+ margin-top: 0;
+}
+
+.form-group.is-required label::after {
+ margin-left: 6px;
+ font-weight: 700;
+ color: #f16e00;
+ content: "*";
+}
+
+.form-group .form-control:invalid {
+ outline: none;
+ box-shadow: none;
+}
+
+select.form-control:not([size]):not([multiple]) {
+ height: auto;
+ padding-top: .4375rem;
+ padding-bottom: .4375rem;
+}
+
+select.form-control:not([size]):not([multiple]).form-control-lg {
+ padding-top: .65625rem;
+ padding-bottom: .65625rem;
+}
+
+select.form-control:not([size]):not([multiple]).form-control-sm {
+ padding-top: .1875rem;
+ padding-bottom: .1875rem;
+}
+
+.has-feedback label ~ .invalid-feedback {
+ top: 1.75;
+}
+
+.o-square-list {
+ padding-left: 0;
+ color: #f16e00;
+ text-align: left;
+}
+
+.o-square-list,
+.o-square-list ul * {
+ list-style-type: none;
+}
+
+.o-square-list li {
+ color: #000;
+}
+
+.o-square-list li::before {
+ margin-right: 1rem;
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ color: #f16e00;
+ vertical-align: text-top;
+ content: "\25A0";
+}
+
+.o-square-list li span {
+ display: inline-block;
+ margin-bottom: .625rem;
+}
+
+.o-square-list li > ul {
+ padding-left: 1rem;
+}
+
+.o-square-list ul > li::before {
+ color: #999;
+}
+
+.o-square-list ul ul > li::before {
+ color: #ccc;
+}
+
+.o-stepbar,
+.o-stepbar ol,
+.o-stepbar ul {
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(1) {
+ width: 100%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(2),
+.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {
+ width: 50%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(3),
+.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {
+ width: 33.3333%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(4),
+.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {
+ width: 25%;
+}
+
+.o-stepbar .stepbar-item:first-child:nth-last-child(5),
+.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {
+ width: 20%;
+}
+
+.o-stepbar .stepbar-item {
+ position: relative;
+ float: left;
+ padding: 0.625rem 1.25rem;
+ padding-left: 2rem;
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1.25;
+ color: #000;
+ text-align: center;
+ white-space: nowrap;
+ list-style: none;
+ background-color: #ddd;
+}
+
+.o-stepbar .stepbar-item::after {
+ position: absolute;
+ top: 0;
+ right: -1rem;
+ z-index: 500;
+ display: block;
+ width: 1rem;
+ height: 2.5rem;
+ content: "";
+ background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1rem 2.5rem;
+}
+
+.o-stepbar .stepbar-item:first-child {
+ padding-left: 1.25rem;
+}
+
+.o-stepbar .stepbar-item:last-child::after {
+ display: none;
+}
+
+.o-stepbar .stepbar-item.done {
+ background-color: #000;
+}
+
+.o-stepbar .stepbar-item.done::after {
+ position: absolute;
+ top: 0;
+ right: -1rem;
+ z-index: 500;
+ display: block;
+ width: 1rem;
+ height: 2.5rem;
+ content: "";
+ background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1rem 2.5rem;
+}
+
+.o-stepbar .stepbar-item.done .stepbar-link {
+ color: #fff;
+}
+
+.o-stepbar .stepbar-item.done:last-child::after {
+ display: none;
+}
+
+.o-stepbar .stepbar-item.current {
+ background-color: #f16e00;
+}
+
+.o-stepbar .stepbar-item.current::after {
+ position: absolute;
+ top: 0;
+ right: -1rem;
+ z-index: 500;
+ display: block;
+ width: 1rem;
+ height: 2.5rem;
+ content: "";
+ background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1rem 2.5rem;
+}
+
+.o-stepbar .stepbar-item.current .stepbar-link {
+ color: #fff;
+}
+
+.o-stepbar .stepbar-item.current:last-child::after {
+ display: none;
+}
+
+.o-stepbar .stepbar-item .stepbar-link {
+ text-decoration: none;
+}
+
+.o-stepbar .stepbar-item .stepbar-link .step-number::after {
+ content: ".";
+}
+
+@media (max-width: 479.98px) {
+ .o-stepbar .stepbar-item {
+ padding: 0.3125rem 0.625rem 0.3125rem 2rem;
+ line-height: 1.25;
+ }
+ .o-stepbar .stepbar-item::after,
+ .o-stepbar .stepbar-item.done::after,
+ .o-stepbar .stepbar-item.current::after,
+ .o-stepbar .stepbar-item.next::after {
+ right: -0.6875rem;
+ width: 0.75rem;
+ height: 1.875rem;
+ background-size: cover;
+ }
+ .o-stepbar.xs-numbers .step-number::after {
+ display: none;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {
+ width: 20%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {
+ width: 60%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {
+ width: 20%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,
+ .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {
+ width: 40%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item {
+ width: 20%;
+ padding-right: 0;
+ padding-left: 0.75rem;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:first-child {
+ padding-left: 0;
+ }
+ .o-stepbar.xs-numbers .stepbar-item.current {
+ width: 60%;
+ }
+ .o-stepbar.xs-numbers .stepbar-item.current .step-number {
+ display: none;
+ }
+ .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {
+ display: none;
+ }
+ .o-stepbar.xs-labels .step-number {
+ display: none;
+ }
+}
+
+.o-link-arrow {
+ font-size: 1rem;
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.o-link-arrow::after {
+ display: inline-block;
+ padding: 0 0.625rem;
+ font-family: icon-orange;
+ font-size: 0.625rem;
+ color: #000;
+ content: "\e93e";
+}
+
+.o-link-arrow:hover::after, .o-link-arrow:focus::after {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+.o-link-arrow.back::after {
+ padding: 0;
+ content: "";
+}
+
+.o-link-arrow.back::before {
+ display: inline-block;
+ padding: 0 0.625rem 0 0;
+ font-family: icon-orange;
+ font-size: 0.625rem;
+ color: #000;
+ content: "\e93f";
+}
+
+.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {
+ color: #f16e00;
+ text-decoration: none;
+}
+
+.mega-menu {
+ overflow: hidden;
+}
+
+.mega-menu > .navbar-nav {
+ transition: -webkit-transform .5s;
+ transition: transform .5s;
+ transition: transform .5s, -webkit-transform .5s;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+}
+
+.mega-menu-panel > .navbar-nav,
+.mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+.mega-menu-panel > .navbar-nav .navbar-nav,
+.mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: absolute;
+ top: 0;
+ left: 100%;
+ display: none;
+ width: 100%;
+}
+
+.navbar .nav-link.icon {
+ margin-top: 0;
+}
+
+.navbar .nav-link.icon span[class^="icon-"] {
+ font-size: 1.5rem;
+ font-weight: 400;
+}
+
+.navbar .nav-link.icon[class*="svg-"], .navbar .nav-link.icon[class*="svg-"]::after {
+ width: 1.875rem;
+ height: 1.875rem;
+}
+
+.navbar .nav-link:not(.icon)[class*="svg-"]::after {
+ top: 0;
+ right: 0;
+ left: auto;
+}
+
+.navbar.supra {
+ height: 2.5rem;
+ min-height: 2.5rem;
+ padding-top: 0;
+ padding-bottom: 0;
+ border-bottom: 1px solid #333;
+}
+
+@media (max-width: 479.98px) {
+ .navbar.supra {
+ display: none;
+ }
+}
+
+.navbar.supra > .container,
+.navbar.supra > .container .navbar-nav {
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.navbar.supra .navbar-brand {
+ display: none;
+}
+
+.navbar.supra .navbar-nav {
+ margin: 0;
+}
+
+.navbar.supra .navbar-nav > .nav-link:first-child,
+.navbar.supra .navbar-nav .nav-item:first-child .nav-link {
+ margin-left: 0;
+}
+
+.navbar.supra .nav-link,
+.navbar.supra .dropdown-toggle {
+ font-size: 0.875rem;
+ line-height: 1;
+}
+
+.navbar.supra .nav-link:focus,
+.navbar.supra .dropdown-toggle:focus {
+ outline-offset: .5rem;
+}
+
+.navbar.supra .nav-link span[class^="icon-"],
+.navbar.supra .dropdown-toggle span[class^="icon-"] {
+ font-size: 1.125rem;
+ font-weight: 400;
+}
+
+.navbar.supra .nav-link.icon span[class^="icon-"] {
+ font-size: 1rem;
+ font-weight: 400;
+}
+
+.navbar.supra .nav-link.icon[class*="svg-"], .navbar.supra .nav-link.icon[class*="svg-"]::after {
+ width: 1.25rem;
+ height: 1.25rem;
+}
+
+.navbar.supra .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+@media (max-width: 479.98px) {
+ .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {
+ padding-right: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-sm .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-right: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-right: .4375em solid transparent;
+ border-left: .4375em solid transparent;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-sm .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {
+ float: left;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 480px) {
+ .navbar-expand-sm .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-sm .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-sm .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-sm .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: right;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-sm .mega-menu-panel .nav-link {
+ margin-left: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-right: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-left: 0;
+ }
+ .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {
+ padding-right: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-md .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-right: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-right: .4375em solid transparent;
+ border-left: .4375em solid transparent;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-md .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {
+ float: left;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-expand-md .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-md .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-md .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-md .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: right;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-md .mega-menu-panel .nav-link {
+ margin-left: 0;
+ }
+ .navbar-expand-md .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-right: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-left: 0;
+ }
+ .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {
+ padding-right: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-lg .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-right: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-right: .4375em solid transparent;
+ border-left: .4375em solid transparent;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-lg .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {
+ float: left;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 980px) {
+ .navbar-expand-lg .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-lg .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-lg .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-lg .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: right;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-lg .mega-menu-panel .nav-link {
+ margin-left: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-right: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-left: 0;
+ }
+ .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 1219.98px) {
+ .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {
+ padding-right: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-xl .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-right: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-right: .4375em solid transparent;
+ border-left: .4375em solid transparent;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-xl .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {
+ float: left;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 1220px) {
+ .navbar-expand-xl .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-xl .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-xl .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-xl .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: right;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-xl .mega-menu-panel .nav-link {
+ margin-left: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-right: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-left: 0;
+ }
+ .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+@media (max-width: 1379.98px) {
+ .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {
+ padding-right: 0;
+ outline-offset: -1px;
+ }
+ .navbar-expand-xxl .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-right: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-right: .4375em solid transparent;
+ border-left: .4375em solid transparent;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-xxl .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+ }
+ .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+ }
+ .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {
+ float: left;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+ }
+}
+
+@media (min-width: 1380px) {
+ .navbar-expand-xxl .mega-menu {
+ overflow: visible;
+ }
+ .navbar-expand-xxl .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+ }
+ .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+ }
+ .navbar-expand-xxl .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+ }
+ .navbar-expand-xxl .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: right;
+ margin: 1.25rem;
+ color: #fff;
+ }
+ .navbar-expand-xxl .mega-menu-panel .nav-link {
+ margin-left: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-right: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-left: 0;
+ }
+ .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+ }
+}
+
+.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {
+ padding-right: 0;
+ outline-offset: -1px;
+}
+
+.navbar-expand .mega-menu .nav-link[data-toggle="collapse"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle="collapse"]::before {
+ margin-top: .3125rem;
+ margin-right: .9375rem;
+ content: "";
+ border-top: .4375em solid;
+ border-right: .4375em solid transparent;
+ border-left: .4375em solid transparent;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+}
+
+.navbar-expand .mega-menu .nav-link[data-toggle="collapse"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle="collapse"].collapsed::before {
+ -webkit-transform: rotateZ(0deg);
+ transform: rotateZ(0deg);
+}
+
+.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {
+ display: block;
+}
+
+.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {
+ float: left;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+}
+
+.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+}
+
+.navbar-expand .mega-menu-panel > .container a[data-toggle="collapse"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle="collapse"] {
+ display: none;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ padding: 0;
+ border: 0;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {
+ border-bottom: 1px solid #333;
+}
+
+.navbar-expand .mega-menu {
+ overflow: visible;
+}
+
+.navbar-expand .mega-menu > .navbar-nav {
+ transition: none;
+ -webkit-transform: none;
+ transform: none;
+}
+
+.navbar-expand .mega-menu > .navbar-nav .nav-link::before {
+ display: none;
+}
+
+.navbar-expand .mega-menu-panel {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ z-index: 1030;
+ width: 100%;
+ padding: 1rem 0;
+ background-color: #000;
+ border-top: 1px solid #333;
+}
+
+.navbar-expand .mega-menu-panel a[data-toggle="collapse"] {
+ display: block;
+ float: right;
+ margin: 1.25rem;
+ color: #fff;
+}
+
+.navbar-expand .mega-menu-panel .nav-link {
+ margin-left: 0;
+}
+
+.navbar-expand .mega-menu-panel .svg-delete {
+ width: 1.25rem;
+ height: 1.25rem;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav {
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-align: start;
+ align-items: flex-start;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ padding: 1rem 0;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {
+ padding: 0;
+ margin-right: .625rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {
+ position: static;
+ display: block !important;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {
+ padding: 0;
+ line-height: 1.25rem;
+ outline-offset: 1px;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {
+ margin-left: 0;
+}
+
+.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {
+ display: none;
+}
+
+@media (max-width: 767.98px) {
+ .navbar-brand,
+ .navbar-brand + .navbar-brand {
+ -ms-flex-item-align: center;
+ align-self: center;
+ }
+}
+
+.table > thead > tr,
+.table > tbody > tr,
+.table > tfoot > tr {
+ border-bottom: 1px solid #ccc;
+}
+
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ vertical-align: middle;
+ border: 0;
+}
+
+.table > thead > tr > th:first-child,
+.table > thead > tr > td:first-child,
+.table > tbody > tr > th:first-child,
+.table > tbody > tr > td:first-child,
+.table > tfoot > tr > th:first-child,
+.table > tfoot > tr > td:first-child {
+ padding-left: .625rem;
+}
+
+.table > thead > tr [class^="icon-"],
+.table > thead > tr [class*=" icon-"],
+.table > tbody > tr [class^="icon-"],
+.table > tbody > tr [class*=" icon-"],
+.table > tfoot > tr [class^="icon-"],
+.table > tfoot > tr [class*=" icon-"] {
+ font-size: 1.8125rem;
+}
+
+.table > thead > tr [class^="svg-"],
+.table > tbody > tr [class^="svg-"],
+.table > tfoot > tr [class^="svg-"] {
+ display: block;
+ width: 1.8125rem;
+ height: 1.8125rem;
+ margin: 0 auto;
+}
+
+.table > thead > tr [class^="svg-"]::after,
+.table > tbody > tr [class^="svg-"]::after,
+.table > tfoot > tr [class^="svg-"]::after {
+ width: 1.8125rem;
+ height: 1.8125rem;
+}
+
+.table thead > tr {
+ border-bottom-width: 2px;
+}
+
+.table thead > tr > th {
+ font-size: 1rem;
+ font-weight: 700;
+}
+
+.table tbody > th {
+ font-weight: 400;
+}
+
+.table.has-checkbox tr.selected > td,
+.table.has-checkbox tr.selected > th {
+ background-color: #ddd;
+}
+
+.table.has-checkbox tr > th:first-child,
+.table.has-checkbox tr > td:first-child {
+ width: 1.25rem;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.table.has-icon tr > td,
+.table.has-icon tr > th {
+ height: 3.1875rem;
+ padding-top: .6875rem;
+ vertical-align: middle;
+}
+
+.table.has-icon tr > td span,
+.table.has-icon tr > td img,
+.table.has-icon tr > th span,
+.table.has-icon tr > th img {
+ vertical-align: middle;
+}
+
+.table.has-icon tr > td img,
+.table.has-icon tr > th img {
+ width: 1.875rem;
+ height: 1.875rem;
+ margin-right: .625rem;
+}
+
+.table.has-icon tr > td [class^="icon-"],
+.table.has-icon tr > th [class^="icon-"] {
+ width: 1.875rem;
+ margin-right: .375rem;
+ font-size: 1.8125rem;
+ line-height: 0;
+ vertical-align: middle;
+}
+
+.table.table-reflow thead > tr,
+.table.table-reflow tbody > tr {
+ border: 0;
+}
+
+.table.table-reflow thead > tr > td,
+.table.table-reflow tbody > tr > td {
+ line-height: 1.25rem;
+}
+
+.table.table-reflow thead > tr > th:first-child,
+.table.table-reflow tbody > tr > th:first-child {
+ border-bottom: 2px solid #ccc;
+}
+
+.table.table-reflow thead > tr > th,
+.table.table-reflow thead > tr > td,
+.table.table-reflow tbody > tr > th,
+.table.table-reflow tbody > tr > td {
+ border-bottom: 1px solid #ccc;
+}
+
+.table.table-reflow thead > tr > td:last-child,
+.table.table-reflow tbody > tr > td:last-child {
+ border-right: 0;
+}
+
+.table.table-reflow thead > tr {
+ border: 0;
+}
+
+.table.table-reflow thead > tr > th:not(:first-child) {
+ padding-left: .625rem;
+ border-bottom: 1px solid #ccc;
+}
+
+.table.table-reflow thead > tr > th:last-child {
+ border-right: 0;
+}
+
+.table.table-reflow tbody > tr > th:first-child {
+ padding-left: 0;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #32c832;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #2db42d;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #527edb;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #3d6ed7;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #fc0;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #e6b800;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #cd3c14;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #b63512;
+}
+
+caption {
+ padding: .75rem 0;
+ font-size: 2.125rem;
+ font-weight: 700;
+ color: #000;
+ caption-side: top;
+ background-color: #fff;
+}
+
+.tablesorter caption {
+ padding: .75rem 0;
+ font-size: 2.125rem;
+ font-weight: 700;
+ color: #000;
+ background-color: #fff;
+}
+
+.tablesorter th {
+ padding-right: 30px;
+ text-align: left;
+ cursor: pointer;
+}
+
+.tablesorter th.header {
+ position: relative;
+}
+
+.tablesorter th .tablesorter-header-inner span {
+ padding-right: 1.6875rem;
+}
+
+.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {
+ position: absolute;
+ top: 45%;
+ width: .875rem;
+ height: .4375rem;
+ margin-left: .625rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {
+ position: absolute;
+ top: 45%;
+ width: .875rem;
+ height: .4375rem;
+ margin-left: .625rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");
+}
+
+.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,
+.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {
+ position: absolute;
+ top: 31%;
+ width: .875rem;
+ height: 1.0625rem;
+ margin-left: .625rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e");
+}
+
+.tablesorter th a {
+ color: #000;
+ text-decoration: none;
+}
+
+.tablesorter th a:hover, .tablesorter th a:focus {
+ color: #f16e00;
+ text-decoration: underline;
+}
+
+.tablesorter td {
+ text-align: left;
+}
+
+.modal .modal-content {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding: 2.5rem;
+ border: 0;
+}
+
+.modal .modal-header {
+ position: relative;
+ min-height: 1.25rem;
+ padding: 0;
+ margin-bottom: 2.5rem;
+ border: 0;
+}
+
+.modal .modal-header .btn {
+ position: absolute;
+ top: -.625rem;
+ right: -.625rem;
+ padding: .625rem;
+ background-color: transparent;
+ border: 0;
+}
+
+.modal .modal-header .btn .close {
+ width: 1.25rem;
+ height: 1.25rem;
+ margin: 0;
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E");
+ background-size: 1.25rem;
+ opacity: 1;
+}
+
+.modal .modal-body {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding: 0;
+ border: 0;
+}
+
+.modal .modal-body .card,
+.modal .modal-body .card {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ padding: 0;
+ border: 0;
+}
+
+.modal .modal-body .card-body {
+ padding: 0;
+}
+
+.modal .modal-body .card-icon {
+ margin-right: 1.25rem;
+}
+
+.modal .modal-body [class^="svg"],
+.modal .modal-body [class^="svg"]::after {
+ width: 2.875rem;
+ height: 2.875rem;
+}
+
+.modal .modal-body [class^="svg"] {
+ display: block;
+}
+
+.modal .modal-body [class^="svg"]::after {
+ top: auto;
+}
+
+.modal .modal-body .card-title {
+ margin-bottom: 1.25rem;
+ font-size: 1.5rem;
+}
+
+.modal .modal-footer {
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ padding: 0;
+ margin-top: 2.5rem;
+ border: 0;
+}
+
+.modal .modal-footer .btn + .btn {
+ margin-left: 1.25rem;
+}
+
+@media (max-width: 479.98px) {
+ .modal .modal-content {
+ padding: 1.25rem;
+ }
+ .modal .modal-header {
+ margin: 0;
+ }
+ .modal .modal-body .card {
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+ .modal .modal-body .card-icon {
+ -ms-flex-item-align: center;
+ align-self: center;
+ margin-right: 0;
+ }
+ .modal .modal-body .card-icon,
+ .modal .modal-body [class^="svg"]::after {
+ width: 4rem;
+ height: 4rem;
+ }
+ .modal .modal-body .card-title {
+ font-size: 1rem;
+ }
+ .modal .modal-body .card-body {
+ margin-top: 1.25rem;
+ }
+ .modal .modal-footer {
+ -ms-flex-item-align: center;
+ align-self: center;
+ }
+}
+
+.nav .nav-item:first-child {
+ margin-left: -0.625rem;
+}
+
+.nav.flex-column .nav-item:first-child {
+ margin-left: 0;
+}
+
+.nav .nav-link {
+ padding: 0.625rem 0.625rem;
+ line-height: 1.25rem;
+}
+
+.o-nav-light {
+ padding-left: inherit;
+ border-bottom: 1px solid #999;
+}
+
+.o-active {
+ color: #f16e00;
+ border-bottom: 3px solid #f16e00;
+}
+
+.nav-tabs .nav-item:first-child {
+ margin-left: 0;
+}
+
+.nav-tabs .nav-item + .nav-item {
+ margin-left: .5rem;
+}
+
+@media (max-width: 979.98px) {
+ .nav-tabs .nav-item + .nav-item {
+ margin-left: 0;
+ }
+}
+
+.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {
+ outline-width: 1px;
+ outline-style: dotted;
+ outline-offset: -6px;
+}
+
+.nav-tabs .nav-link:not(.disabled) + .nav-link {
+ margin-left: .5rem;
+}
+
+@media (max-width: 979.98px) {
+ .nav-tabs .nav-link:not(.disabled) + .nav-link {
+ margin-left: 0;
+ }
+}
+
+.o-tab-container {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+}
+
+.o-tab-container .o-tab-heading {
+ position: relative;
+ display: inline-block;
+ padding: .625rem 1.25rem;
+ margin-left: .5rem;
+ font-weight: 700;
+ color: #000;
+ text-align: center;
+ background-color: #fff;
+ border: 0;
+ border-bottom: 2px solid #000;
+}
+
+.o-tab-container .o-tab-heading:first-child {
+ margin-left: 0;
+ border-top: 0;
+}
+
+.o-tab-container .o-tab-heading[aria-expanded="false"] {
+ border-bottom: 2px solid #000;
+}
+
+.o-tab-container .o-tab-heading[aria-expanded="true"] {
+ padding-top: .5rem;
+ border: 2px solid #000;
+ border-bottom: 0;
+}
+
+.o-tab-container .o-tab-heading:focus {
+ outline-offset: -4px;
+}
+
+.o-tab-container .o-tab-heading:hover:not([aria-expanded="true"]) {
+ color: #fff;
+ background-color: #000;
+}
+
+.o-tab-container .o-tab-content {
+ display: none;
+ -ms-flex-item-align: end;
+ align-self: flex-end;
+ -ms-flex-order: 1;
+ order: 1;
+ width: 100%;
+ padding: .625rem 1.25rem;
+ background-color: #fff;
+ box-shadow: 0 -2px 0 #000;
+}
+
+.o-tab-container .o-tab-content.show {
+ display: block;
+}
+
+@media (max-width: 767.98px) {
+ .o-tab-container .o-tab-heading {
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ margin-left: 0;
+ text-align: center;
+ }
+ .o-tab-container .o-tab-heading[aria-expanded="false"] {
+ color: #fff;
+ background-color: #666;
+ }
+ .o-tab-container .o-tab-heading[aria-expanded="false"]:active {
+ color: #fff;
+ background-color: #f16e00;
+ }
+ .o-tab-container.accordion-layout {
+ display: block;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading {
+ position: relative;
+ display: block;
+ padding: .9375rem 0;
+ margin-left: 0;
+ font-weight: 700;
+ color: #000;
+ text-align: left;
+ background-color: #fff;
+ border: 0;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading:focus {
+ outline-offset: 0;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading:hover {
+ color: #f16e00;
+ background-color: #fff;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading[aria-expanded="false"] {
+ border-bottom: 1px #ccc solid;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading[aria-expanded="true"]::after {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+ }
+ .o-tab-container.accordion-layout .o-tab-heading:first-child {
+ margin-left: 0;
+ border-top: 1px solid #ccc;
+ }
+ .o-tab-container.accordion-layout .o-tab-heading::after {
+ position: absolute;
+ top: 1.375rem;
+ right: .625rem;
+ width: .875rem;
+ height: .4375rem;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E");
+ }
+ .o-tab-container.accordion-layout .o-tab-content {
+ padding-left: 0;
+ border-bottom: 1px #ccc solid;
+ box-shadow: none;
+ }
+}
+
+.nav-pills.nav-stacked .nav-item {
+ margin: 0;
+}
+
+.nav-pills.nav-stacked .nav-item + .nav-item {
+ margin-left: 0;
+}
+
+.nav-pills .nav-item:first-child {
+ margin-left: 0;
+}
+
+.nav-pills .nav-item + .nav-item {
+ margin-left: 5px;
+}
+
+.nav-pills .nav-link {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.nav-pills .nav-link:active {
+ background-color: #000;
+}
+
+.nav-pills .nav-link:hover {
+ color: #fff;
+ cursor: default;
+ background-color: #000;
+}
+
+.nav-pills .nav-link:hover.disabled {
+ color: #666;
+ background-color: transparent;
+}
+
+.nav-pills .nav-link:focus {
+ color: #fff;
+ background-color: #f16e00;
+ outline: none;
+}
+
+.nav-pills .nav-link:focus.disabled {
+ color: #666;
+ background-color: transparent;
+}
+
+.nav-pills .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.nav-pills .dropdown-menu .nav-item {
+ margin: 0;
+}
+
+.nav-pills .dropdown-menu .nav-item .nav-link {
+ display: block;
+ padding: .625rem .625rem .625rem 1.25rem;
+ margin: 0;
+ color: #000;
+ background: #fff;
+ border: 0;
+}
+
+.nav-pills .dropdown-menu .nav-item .nav-link:focus {
+ outline: 1px dotted #000;
+ outline-offset: -2px;
+}
+
+.nav-pills .dropdown-menu .nav-item .nav-link:hover {
+ color: #fff;
+ background: #000;
+}
+
+.tab-content {
+ padding: 1.125rem;
+ border-color: #000;
+ border-style: solid;
+ border-width: 0 2px 2px;
+}
+
+.tab-content .tab-pane p {
+ margin-bottom: 0;
+}
+
+.tab-content-clear {
+ border: 0;
+}
+
+.breadcrum {
+ line-height: 1;
+}
+
+.overflow-nav {
+ display: none;
+}
+
+.o-nav-local.resizing {
+ overflow: hidden;
+}
+
+.hide {
+ display: none !important;
+}
+
+.show-inline-block {
+ display: inline-block !important;
+}
+
+.overflow-nav-list .nav-link {
+ border: 0;
+}
+
+.overflow-nav-list .nav-link:focus {
+ outline-offset: -2px;
+}
+
+.overflow-nav-list .nav-item:last-child {
+ margin-bottom: 0;
+}
+
+.o-nav-local .overflow-nav-list {
+ margin-top: 1px;
+ border: 0;
+ box-shadow: 0 .3125rem .625rem -.375rem #999;
+}
+
+.o-nav-local {
+ margin-bottom: 2.5rem;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+}
+
+.o-nav-local > .container,
+.o-nav-local > .container-fluid {
+ display: -ms-flexbox;
+ display: flex;
+}
+
+.o-nav-local ul + ul {
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ margin-left: 1rem;
+}
+
+.o-nav-local .nav-item + .nav-item {
+ margin-left: 1rem;
+}
+
+.o-nav-local .nav.flex-column .nav-item {
+ margin-left: 0;
+}
+
+.o-nav-local .nav .nav-link,
+.o-nav-local .nav .dropdown-toggle {
+ display: inline-block;
+ padding: 1rem 0.625rem 1.125rem;
+ font-size: 1rem;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.o-nav-local .nav .nav-link:focus,
+.o-nav-local .nav .dropdown-toggle:focus {
+ outline: 1px dotted;
+ outline-offset: -1px;
+}
+
+.o-nav-local .nav-link.active {
+ color: #f16e00;
+}
+
+.o-nav-local .dropdown-toggle.show {
+ color: #000;
+}
+
+.o-nav-local .dropdown-menu .nav-item,
+.o-nav-local .dropdown-menu .nav-item + .nav-item {
+ margin: 0;
+}
+
+.o-nav-local .dropdown-menu .nav-link {
+ display: block;
+ padding: .625rem .625rem .625rem 1.25rem;
+}
+
+.o-nav-local .dropdown-menu .nav-link:focus {
+ outline-offset: -2px;
+}
+
+.o-nav-local .dropdown-menu .nav-link:hover {
+ color: #fff;
+ background: #000;
+}
+
+.o-nav-local.inverse {
+ background-color: #000;
+ border-top-color: #333;
+ border-bottom-color: #333;
+}
+
+.o-nav-local.inverse .nav-link {
+ color: #fff;
+ background-color: #000;
+}
+
+.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {
+ color: #f16e00;
+}
+
+.o-nav-local.inverse .nav-link:focus {
+ outline-color: #fff;
+}
+
+.o-nav-local.inverse .nav-link.active {
+ color: #f16e00;
+}
+
+.skiplinks {
+ z-index: 99999;
+}
+
+.skiplinks .skiplinks-section li {
+ float: left;
+}
+
+.skiplinks .skiplinks-section a {
+ display: block;
+ padding: 10px;
+ font-weight: 700;
+ border-color: #999;
+ border-style: none solid none none;
+ border-width: 0 1px 0 0;
+}
+
+.skiplinks .skiplinks-section.skiplinks-show {
+ position: absolute;
+ top: 20px;
+ left: 50%;
+ z-index: 10000000;
+ width: auto;
+ height: auto;
+ margin-left: -175px;
+ overflow: hidden;
+ background: none repeat scroll 0 0 #ccc;
+ border: 2px solid #000;
+ box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);
+}
+
+.skiplinks .skiplinks-section a:hover {
+ cursor: pointer;
+}
+
+.skiplinks .skiplinks-section a:hover,
+.skiplinks .skiplinks-section a:focus {
+ color: #f16e00;
+ background-color: #fff;
+ outline: 0 none;
+}
+
+.skiplinks a,
+.skiplinks ul,
+.skiplinks li,
+.skiplinks div {
+ float: none;
+ padding: 0;
+ margin: 0;
+ font-size: .95em;
+ font-weight: 400;
+ line-height: normal;
+ color: #000;
+ text-decoration: none;
+ text-shadow: none;
+ list-style: none;
+ background: none repeat scroll 0 0 transparent;
+ border: 0 none;
+}
+
+.o-footer {
+ margin-top: 2.5rem;
+ font-size: 0.875rem;
+ font-weight: 700;
+ color: #fff;
+ background-color: #000;
+}
+
+.o-footer .nav-link {
+ padding: 0.625rem 0.625rem;
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {
+ color: #fff;
+}
+
+.o-footer .o-footer-top,
+.o-footer .o-footer-body,
+.o-footer .o-footer-bottom {
+ padding-top: .625rem;
+ padding-bottom: .625rem;
+}
+
+.o-footer .o-footer-top {
+ border-bottom: 1px solid #333;
+}
+
+.o-footer .o-footer-body .row {
+ margin-bottom: .625rem;
+}
+
+.o-footer .o-footer-body h2 {
+ margin-top: .625rem;
+ font-size: 0.875rem;
+ color: #fff;
+}
+
+.o-footer .o-footer-body p,
+.o-footer .o-footer-body p a {
+ color: #fff;
+}
+
+.o-footer .o-footer-body .flex-column .nav-link {
+ padding: 0;
+ line-height: 1.25;
+}
+
+.o-footer .o-footer-bottom {
+ border-top: 1px solid #333;
+}
+
+@media (max-width: 979.98px) {
+ .o-responsive-table thead {
+ display: none;
+ }
+ .o-responsive-table tbody,
+ .o-responsive-table tr,
+ .o-responsive-table th,
+ .o-responsive-table td {
+ display: block;
+ }
+}
+
+@media (max-width: 979.98px) and (min-width: 768px) {
+ .o-responsive-table tr {
+ float: left;
+ width: 45%;
+ }
+ .o-responsive-table tr:nth-child(odd) {
+ margin-right: 10%;
+ }
+}
+
+@media (max-width: 979.98px) {
+ .o-responsive-table th,
+ .o-responsive-table td {
+ vertical-align: middle;
+ }
+ .o-responsive-table td[data-title]::before {
+ float: left;
+ width: 50%;
+ font-weight: 700;
+ content: attr(data-title);
+ }
+ .o-responsive-table tr {
+ margin-bottom: 2em;
+ border-right: 0;
+ border-left: 0;
+ }
+ .o-responsive-table tbody th[scope="row"] {
+ font-weight: 700;
+ border-top: 0;
+ border-bottom: 2px solid #ccc;
+ }
+}
+
+.o-scroll-up {
+ position: fixed;
+ right: 0;
+ bottom: 2.5rem;
+ z-index: 1035;
+ display: none;
+ right: 1.25%;
+ bottom: .25rem;
+}
+
+.o-scroll-up .o-scroll-up-icon {
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ float: right;
+ width: 2.5rem;
+ height: 2.5rem;
+ color: #000;
+ text-align: center;
+ text-decoration: none;
+ background-color: #fff;
+ border-style: solid;
+ border-width: 2px;
+ /* rtl:ignore */
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg);
+ /* rtl:ignore */
+}
+
+.o-scroll-up .o-scroll-up-icon::before {
+ font-family: icon-orange;
+ font-size: 1.25rem;
+ line-height: 1.8;
+ content: "\e93f";
+}
+
+@media (min-width: 480px) {
+ .o-scroll-up {
+ right: 1.25%;
+ }
+}
+
+@media (min-width: 768px) {
+ .o-scroll-up {
+ right: 1.5625%;
+ }
+}
+
+@media (min-width: 980px) {
+ .o-scroll-up {
+ right: 3.125%;
+ }
+}
+
+@media (min-width: 1220px) {
+ .o-scroll-up {
+ right: 3.125%;
+ }
+}
+
+@media (min-width: 1380px) {
+ .o-scroll-up {
+ right: 4.16667%;
+ }
+}
+
+@media (min-width: 480px) {
+ .o-scroll-up {
+ bottom: .375rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .o-scroll-up {
+ bottom: .75rem;
+ }
+}
+
+@media (min-width: 980px) {
+ .o-scroll-up {
+ bottom: 2rem;
+ }
+}
+
+@media (min-width: 1220px) {
+ .o-scroll-up {
+ bottom: 2.5rem;
+ }
+}
+
+@media (min-width: 1380px) {
+ .o-scroll-up {
+ bottom: 3.75rem;
+ }
+}
+
+.o-scroll-up .o-scroll-up-text {
+ display: inline-block;
+ padding: 0.625rem 0.625rem;
+ font-weight: 700;
+ background-color: #fff;
+ opacity: .8;
+}
+
+.o-scroll-up.static {
+ position: static;
+ z-index: auto;
+ display: inline;
+ float: left;
+}
+
+.o-scroll-up.static .o-scroll-up-text {
+ float: left;
+}
+
+.o-scroll-up.static .o-scroll-up-icon {
+ position: relative;
+ display: inline-block;
+ float: none;
+}
+
+.o-scroll-up:hover, .o-scroll-up:focus {
+ color: #f16e00;
+}
+
+.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {
+ color: #fff;
+ background-color: #000;
+}
+
+.o-scroll-up:active .o-scroll-up-icon {
+ color: #fff;
+ background-color: #f16e00;
+ border-color: #f16e00;
+}
+
+.dropdown-toggle::after {
+ margin-left: .625rem;
+ vertical-align: 10%;
+}
+
+.dropdown-item {
+ padding-left: 1.25rem;
+ font-weight: 700;
+}
+
+.dropdown-item:focus {
+ color: #000;
+ background-color: #fff;
+ outline: 1px dotted;
+}
+
+.dropdown-item:focus:hover {
+ color: #fff;
+ background-color: #000;
+}
+
+.carousel {
+ margin-bottom: 1.875rem;
+}
+
+.carousel .carousel-item img {
+ width: 100%;
+}
+
+.carousel-control-prev,
+.carousel-control-next {
+ top: auto;
+ bottom: calc(50% - 1.875rem);
+ width: 3.75rem;
+ height: 3.75rem;
+ text-decoration: none;
+ text-shadow: none;
+ background-color: transparent;
+ opacity: .8;
+ transition: width .5s ease;
+}
+
+.carousel-control-prev:focus,
+.carousel-control-next:focus {
+ outline: 2px dotted #000;
+ outline-offset: -1px;
+}
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ margin-top: -1.125rem;
+ font-size: 1.875rem;
+ color: #000;
+ text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
+ background-image: none;
+ background-repeat: no-repeat;
+}
+
+.carousel-control-prev-icon::before,
+.carousel-control-next-icon::before {
+ font-family: icon-orange;
+}
+
+.carousel-control-prev-icon::before {
+ content: "\e93f";
+}
+
+.carousel-control-next-icon::before {
+ content: "\e93e";
+}
+
+.carousel-indicators {
+ bottom: 0;
+ -ms-flex-align: center;
+ align-items: center;
+}
+
+.carousel-indicators:hover {
+ cursor: default;
+}
+
+.carousel-indicators li {
+ -ms-flex-positive: 0;
+ flex-grow: 0;
+ width: .625rem;
+ height: .625rem;
+ margin-right: .375rem;
+ background-color: #000;
+ border: 1px solid #fff;
+ border-radius: 50%;
+}
+
+.carousel-indicators li:hover {
+ cursor: pointer;
+}
+
+.carousel-indicators li.active {
+ background-color: #f16e00;
+}
+
+.swiper-button-prev,
+.swiper-button-next {
+ top: calc(50% - 10px);
+ width: auto;
+ height: auto;
+ text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
+ cursor: pointer;
+ background-image: none;
+ background-size: 0;
+}
+
+.swiper-button-prev:focus,
+.swiper-button-next:focus {
+ outline: 2px dotted #000;
+ outline-offset: -1px;
+}
+
+.swiper-button-prev::before,
+.swiper-button-next::before {
+ font-family: icon-orange;
+ font-size: 1.875rem;
+ content: "\e93f";
+}
+
+.swiper-button-next::before {
+ content: "\e93e";
+}
+
+.swiper-pagination-bullet,
+.swiper-pagination-bullet-active {
+ width: .625rem;
+ height: .625rem;
+ border: 0;
+}
+
+.swiper-pagination-bullet {
+ opacity: 1;
+}
+
+.swiper-pagination-bullet-active {
+ background: #f16e00;
+}
+
+.swiper-container {
+ width: 100% !important;
+ margin-bottom: 30px;
+ overflow: hidden;
+}
+
+.swiper-wrapper {
+ margin-bottom: 30px;
+}
+
+.swiper-pagination {
+ bottom: 6px;
+}
+
+.swiper-slide .card {
+ border: 0;
+}
+
+.swiper-slide .card-img {
+ padding: 0;
+}
+
+.swiper-slide .card-img img {
+ width: 100%;
+ height: 40vh;
+}
+
+.swiper-slide .card-title {
+ margin: 0;
+ font-weight: 700;
+}
+
+.swiper-slide .card-body {
+ position: absolute;
+ bottom: 20px;
+ left: 40px;
+ background-color: #fff;
+}
+
+.swiper-slide .card-body p {
+ margin: 0;
+}
+
+@media (max-width: 979.98px) {
+ .swiper-button-prev,
+ .swiper-button-next {
+ display: none;
+ }
+ .swiper-container {
+ overflow-x: hidden;
+ overflow-y: visible;
+ /* used for displaying pagination outside of container */
+ }
+ .swiper-slide {
+ width: 80%;
+ }
+ .swiper-slide .card-img img {
+ height: auto;
+ }
+ .swiper-slide .card-body {
+ position: static;
+ }
+ .swiper-container-horizontal > .swiper-pagination-bullets {
+ bottom: 0;
+ }
+ .swiper-pagination-bullet {
+ width: 8px;
+ height: 8px;
+ border: 0;
+ }
+}
+
+div.active:focus {
+ outline: dotted 1px;
+}
+
+a:focus {
+ color: #f16e00;
+ outline: dotted 1px;
+}
+
+.close:hover,
+.close:focus {
+ outline: dotted 1px;
+}
+
+.progress.progress-default[value]::-webkit-progress-value {
+ background-color: #f16e00;
+}
+
+.progress.progress-default[value]::-moz-progress-bar {
+ background-color: #f16e00;
+}
+
+.hero-container .frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ max-width: 15%;
+ margin: 30px;
+}
+
+.hero-container .caption {
+ margin: 50px 30px;
+}
+
+.hero-container .category {
+ font-size: 1.25rem;
+ color: #f16e00;
+}
+/*# sourceMappingURL=boosted.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted.css.map b/dashboard/public/css/boosted.css.map
new file mode 100644
index 00000000..db08c2ce
--- /dev/null
+++ b/dashboard/public/css/boosted.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["boosted.css","../../scss/boosted.scss","../../scss/_root.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_functions.scss","../../scss/_forms.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_orangeIcons.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss","../../scss/_o-card.scss","../../scss/_o-switches.scss","../../scss/_o-forms.scss","../../scss/_o-bullet_points.scss","../../scss/_o-step_bar.scss","../../scss/_o-link-arrow.scss","../../scss/_o-megamenu.scss","../../scss/_o-navbar.scss","../../scss/_o-tables.scss","../../scss/_o-modal.scss","../../scss/_o-nav.scss","../../scss/_o-nav-local.scss","../../scss/_o-skiplinks.scss","../../scss/_o-footer.scss","../../scss/_o-responsive_table.scss","../../scss/_o-scroll-up.scss","../../scss/_o-dropdown.scss","../../scss/_o-carousel.scss","../../scss/_orange-css.scss"],"names":[],"mappings":"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BAAwB;CACzB;;AHvGD;EG8GE,yBAAwB;CACzB;;AAOD;EACE,cAAa;EACb,2BAA0B;CAC3B;;AAMD;EACE,sBAAqB;CACtB;;AAED;EACE,mBAAkB;EAClB,gBAAe;CAChB;;AAED;EACE,cAAa;CACd;;AHpHD;EGyHE,yBAAwB;CACzB;;AIteD;;EAEE,uBHwIc;EGvId,qBH2VmC;EG1VnC,iBH2V+B;EG1V/B,iBH2V+B;EG1V/B,eH2VmC;CG1VpC;;AAED;EFgHM,oBAtCY;CE1E6B;;AAC/C;EF+GM,oBAtCY;CEzE6B;;AAC/C;EF8GM,kBAtCY;CExE6B;;AAC/C;EF6GM,mBAtCY;CEvE6B;;AAC/C;EF4GM,oBAtCY;CEtE6B;;AAC/C;EF2GM,gBAtCY;CErE6B;;ACqD3C;ED1DJ;IFgHM,mBAtCY;GEhEsC;EATxD;IF+GM,oBAtCY;GE/DsC;EATxD;IF8GM,gBAtCY;GE9DsC;EATxD;IF6GM,oBAtCY;GE7DsC;EATxD;IF4GM,oBAtCY;GE5DsC;EATxD;IF2GM,oBAtCY;GE3DsC;CP4YvD;;AOzYD;EF8FM,mBAtCY;EEtDhB,iBHkV+B;CGjVhC;;AAGD;EFwFM,mBAtCY;EEhDhB,iBHqU+B;EGpU/B,iBH4T+B;CG3ThC;;AACD;EFmFM,oBAtCY;EE3ChB,iBHiU+B;EGhU/B,iBHuT+B;CGtThC;;AACD;EF8EM,kBAtCY;EEtChB,iBH6T+B;EG5T/B,iBHkT+B;CGjThC;;AACD;EFyEM,oBAtCY;EEjChB,iBHyT+B;EGxT/B,iBH6S+B;CG5ShC;;AJaD;EILE,oBH8Ec;EG7Ed,uBH6Ec;EG5Ed,UAAS;EACT,2BH3Da;CG4Dd;;AAOD;;EFkDM,oBAtCY;EEThB,iBH8P+B;CG7PhC;;AAED;;EAEE,eH6SgC;EG5ShC,0BH5Ce;CG6ChB;;AAOD;EE1FE,gBAAe;EACf,iBAAgB;CF2FjB;;AAGD;EE/FE,gBAAe;EACf,iBAAgB;CFgGjB;;AACD;EACE,sBAAqB;CAKtB;;AAND;EAII,wBH+RkC;CG9RnC;;AASH;EF5CI,eAAW;EE8Cb,0BAAyB;CAC1B;;AAGD;EACE,uBHqBc;ECjBV,mBAtCY;CEoCjB;;AAED;EACE,eAAc;EFDV,oBAtCY;EEyChB,YHpHa;CGyHd;;AARD;EAMI,sBAAqB;CACtB;;AG/HH;ECIE,gBAAe;EAGf,aAAY;CDLb;;AAID;EACE,kBNylCyC;EMxlCzC,uBNRa;EMSb,uBN0lCsC;EO/lCtC,gBAAe;EAGf,aAAY;CDQb;;AAMD;EAEE,sBAAqB;CACtB;;AAED;EACE,wBAA0B;EAC1B,eAAc;CACf;;AAED;ELkCI,eAAW;EKhCb,YNxBa;CMyBd;;AExCD;EPuEI,iBAAW;EOrEb,YRaa;EQZb,uBAAsB;CAMvB;;AAHC;EACE,eAAc;CACf;;AAIH;EACE,6BR+qC0C;ECrnCxC,iBAAW;EOxDb,YR+qCsC;EQ9qCtC,uBRPa;CQiBd;;AAdD;EASI,WAAU;EPkDV,gBAAW;EOhDX,iBRuT6B;CQrT9B;;ATiNH;ES5ME,eAAc;EPyCZ,iBAAW;EOvCb,YRjBa;CQyBd;;AAXD;EP0CI,mBAAW;EOlCX,eAAc;EACd,mBAAkB;CACnB;;AAIH;EACE,kBRspCuC;EQrpCvC,mBAAkB;CACnB;;AC1CC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,mBAA0B;EAC1B,kBAAyB;EAQzB,oBVsOK;EUrOL,mBVqOK;EUrNL,iBVwMO;EUtMP,mBAAkB;EAClB,kBAAiB;EDhCnB,YAAW;CACZ;;ALmDC;EKvDF;ICMI,mBAA0B;IAC1B,kBAAyB;GDH5B;Cb8kBF;;AQ3hBG;EKvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;CbqlBF;;AQliBG;EKvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;Cb4lBF;;AQziBG;EKvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;CbmmBF;;AQhjBG;EKvDF;ICMI,oBAA0B;IAC1B,mBAAyB;GDH5B;Cb0mBF;;Ac5lBK;EACE,mBAAkB;EAClB,kBAAiB;CAClB;;ANkCH;EKvDF;ICeI,oBVuOK;IUtOL,mBVsOK;GSlPR;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CdymBN;;AQvkBG;EKvDF;ICeI,sBVwOO;IUvOP,qBVuOO;GSnPV;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CdonBN;;AQllBG;EKvDF;ICeI,qBVyOM;IUxON,oBVwOM;GSpPT;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;Cd+nBN;;AQ7lBG;EKvDF;ICeI,qBV0OM;IUzON,oBVyOM;GSrPT;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;Cd0oBN;;AQxmBG;EKvDF;ICeI,uBV2OS;IU1OT,sBV0OS;GStPZ;ECcG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CdqpBN;;AQnnBG;EKvDF;ICgCI,iBVyMO;IUvMP,mBAAkB;IAClB,kBAAiB;GD/BpB;Cb8qBF;;AQ3nBG;EKvDF;ICgCI,iBV0MO;IUxMP,mBAAkB;IAClB,kBAAiB;GD/BpB;CbsrBF;;AQnoBG;EKvDF;ICgCI,iBV2MO;IUzMP,mBAAkB;IAClB,kBAAiB;GD/BpB;Cb8rBF;;AQ3oBG;EKvDF;ICgCI,kBV4MQ;IU1MR,mBAAkB;IAClB,kBAAiB;GD/BpB;CbssBF;;AQnpBG;EKvDF;ICgCI,kBV6MS;IU3MT,mBAAkB;IAClB,kBAAiB;GD/BpB;Cb8sBF;;AarsBC;ECbA,mBAAkB;EAClB,kBAAiB;EAKb,mBAA0B;EAC1B,kBAAyB;EAQzB,oBVsOK;EUrOL,mBVqOK;EStOP,YAAW;CACZ;;ALuCC;EK1CF;ICPI,mBAA0B;IAC1B,kBAAyB;GDS5B;CbmtBF;;AQ5qBG;EK1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;Cb0tBF;;AQnrBG;EK1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;CbiuBF;;AQ1rBG;EK1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;CbwuBF;;AQjsBG;EK1CF;ICPI,oBAA0B;IAC1B,mBAAyB;GDS5B;Cb+uBF;;Ac7uBK;EACE,mBAAkB;EAClB,kBAAiB;CAClB;;ANkCH;EK1CF;ICEI,oBVuOK;IUtOL,mBVsOK;GStOR;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;Cd0vBN;;AQxtBG;EK1CF;ICEI,sBVwOO;IUvOP,qBVuOO;GSvOV;ECEG;IACE,mBAAkB;IAClB,kBAAiB;GAClB;CdqwBN;;AQnuBG;EK1CF;ICEI,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A6B;EAC7B,8BAA2C;EC0F3C,yBtBgVoC;EC1ThC,gBAtCY;EqBkBhB,kBtBwOgC;EgB3U9B,iBMqGsC;ELvGpC,sIjBwf6I;CqBjdlJ;;AJlCG;EILJ;IJMM,iBAAgB;GIiCrB;CzB8kFA;;AM/mFC;EmBQE,YrBHW;EqBIX,sBAAqB;CnBTD;;AmBNxB;EAoBI,WAAU;EACV,iBrBqa8B;CqBpa/B;;AAtBH;EA2BI,WrBgd2B;CqB9c5B;;AAaH;EACE,sBAAqB;CACtB;;AAID;;EAEE,qBAAoB;CACrB;;AASD;;EC5DE,YtBCa;EoBDX,0BpBoCa;EsBlCf,sBtBkCe;CqB8BhB;;AnBxDC;;;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;;;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;;;;;EAGE,YtB1BW;EsB2BX,uBtBrCW;EsByCX,mBtB/BW;CsB0CZ;;ADOH;;EC5DE,YtBCa;EoBDX,0BpBoCa;EsBlCf,sBtBkCe;CqB6Bd;;AnBvDD;;;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;;;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;;;;;EAGE,YtBpCW;EsBqCX,uBtB3BW;EsB+BX,mBtBzCW;CsBoDZ;;ADcH;;ECnEE,YtBWa;EoBXX,8BCqEiC;ECnEnC,mBtBSa;CqB8Dd;;AnB/DC;;;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;;;EAEE,YtBnBW;EsBoBX,8BD2CsH;EC1CtH,mBtBrBW;CsB0BZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADcH;;ECnEE,YtBWa;EoBXX,uBpBCW;EsBCb,mBtBDa;CqBuEZ;;AnB9DD;;;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBPW;CEYZ;;AoBUD;;;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADqBH;EC1EE,YtBWa;EoBXX,0BpBsCa;EsBpCf,sBtBoCe;CqByChB;;AnBrEC;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADqBH;EC1EE,YtBWa;EoBXX,0BpBsCa;EsBpCf,sBtBoCe;CqBwCd;;AnBpED;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;AD2BH;;EChFE,YtBCa;EoBDX,uBpBWW;EsBTb,mBtBSa;CqB2Ed;;AnB5EC;;;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBGW;CEEZ;;AoBUD;;;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;AD2BH;;EChFE,YtBCa;EoBDX,8BCoFmC;EClFrC,mBtBDa;CqBoFZ;;AnB3ED;;;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;;;EAEE,YtBjBW;EsBkBX,8BD0DwH;ECzDxH,mBtBnBW;CsBwBZ;;AAED;;;;;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADkCH;ECvFE,YtBCa;EoBDX,0BpBmCa;EsBjCf,sBtBiCe;CqByDhB;;AnBlFC;EoBJE,YtBLW;EoBDX,uBpBWW;EsBHX,mBtBGW;CEEZ;;AoBUD;EAEE,YtBxBW;EsByBX,uBtBpBW;EsBqBX,mBtBrBW;CsB0BZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;ADkCH;ECvFE,YtBCa;EoBDX,0BpBmCa;EsBjCf,sBtBiCe;CqBwDd;;AnBjFD;EoBJE,YtBKW;EoBXX,uBpBCW;EsBOX,mBtBPW;CEYZ;;AoBUD;EAEE,YtBdW;EsBeX,uBtBlBW;EsBmBX,mBtBnBW;CsBwBZ;;AAED;;EAGE,YRUY;EQTZ,0BtBFa;EsBMb,sBtBNa;CsBiBd;;AD2CD;ECvCA,etBrBe;EsBsBf,sBtBtBe;CqB0Ed;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,etBtCa;EsBuCb,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,YtB9Ca;EsB+Cb,mBtB/Ca;CqBmGZ;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,YtB/DW;EsBgEX,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,etBnBe;EsBoBf,sBtBpBe;CqBwEd;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,etBpCa;EsBqCb,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,YtB9Ca;EsB+Cb,mBtB/Ca;CqBmGZ;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,YtB/DW;EsBgEX,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,etBrBe;EsBsBf,sBtBtBe;CqB0Ed;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,etBtCa;EsBuCb,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,etBtBe;EsBuBf,sBtBvBe;CqB2Ed;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,etBvCa;EsBwCb,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,YtBpDa;EsBqDb,mBtBrDa;CqByGZ;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,YtBrEW;EsBsEX,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADED;ECvCA,YtB9Ca;EsB+Cb,mBtB/Ca;CqBmGZ;;AnBpGD;EoBmDE,YAAW;EACX,uBAAsB;EACtB,mBAAkB;CpBlDnB;;AoB2DD;EAEE,YtB/DW;EsBgEX,8BAA6B;CAC9B;;AAED;;EAGE,YAAW;EACX,0BAAyB;EACzB,sBAAqB;CAWtB;;ADyBH;EAEE,YrB9Ga;CqBwId;;AA5BD;EAMI,YAAW;CACZ;;AnBxHD;EmB4HE,erB9Fa;EqB+Fb,sBrBoD0C;CEjLtB;;AmBiHxB;EAiBI,sBrB+C0C;EqB9C1C,iBAAgB;CACjB;;AAnBH;EAuBI,YrBxIW;EqByIX,qBAAoB;CACrB;;AAUH;ECvDE,2BtBoWmC;EC9U/B,mBAtCY;EqBkBhB,iBtBmW+B;EgBtc7B,iBMqGsC;CDqDzC;;AAED;EC3DE,0BtB+VmC;ECzU/B,oBAtCY;EqBkBhB,iBtB+V+B;EgBlc7B,iBMqGsC;CDyDzC;;AAED;EC/DE,2BtB0VmC;ECpU/B,oBAtCY;EqBkBhB,iBtB0V+B;EgB7b7B,iBMqGsC;CD6DzC;;AAGD;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAGH;EACE,eAAc;EACd,6BAA4B;CAK7B;;AAPD;EAKI,cAAa;CACd;;AAOH;EACE,eAAc;EACd,YAAW;CAMZ;;AARD;EAMI,mBrBqO+B;CqBpOhC;;AAIH;;;EAII,YAAW;CACZ;;AE3RH;ENMM,iCjBwS2C;CuBxShD;;ANKG;EMXJ;INYM,iBAAgB;GMNrB;C3BmxGA;;A2BzxGD;EAII,WAAU;CACX;;AAGH;EAEI,cAAa;CACd;;AAGH;EACE,mBAAkB;EAClB,UAAS;EACT,iBAAgB;ENXZ,8BjBySwC;CuB5R7C;;ANRG;EMGJ;INFM,iBAAgB;GMOrB;C3B2xGA;;A4B7yGD;;;;EAIE,mBAAkB;CACnB;;AAED;EACE,oBAAmB;CAIpB;;ACgBG;EACE,sBAAqB;EACrB,uBzB0QgC;EyBzQhC,2BzB0QyC;EyBzQzC,YAAW;EAhCf,4BAA8B;EAC9B,0CAA4C;EAC5C,iBAAgB;EAChB,yCAA2C;CAqCxC;;AAgBD;EACE,eAAc;CACf;;AD3CL;EACE,mBAAkB;EAClB,UAAS;EACT,QAAO;EACP,cxButBsC;EwBttBtC,cAAa;EACb,YAAW;EACX,iBxB+yBuC;EwB9yBvC,aAA8B;EAC9B,iBAA4B;EvBsGxB,gBAtCY;EuB9DhB,YxBVa;EwBWb,iBAAgB;EAChB,iBAAgB;EAChB,uBxBvBa;EwBwBb,6BAA4B;EAC5B,uBxBfa;CwBkBd;;AAMG;EACE,YAAW;EACX,QAAO;CACR;;AAED;EACE,SAAQ;EACR,WAAU;CACX;;ApBWD;EoBnBA;IACE,YAAW;IACX,QAAO;GACR;EAED;IACE,SAAQ;IACR,WAAU;GACX;C5B+zGJ;;AQpzGG;EoBnBA;IACE,YAAW;IACX,QAAO;GACR;EAED;IACE,SAAQ;IACR,WAAU;GACX;C5B00GJ;;AQ/zGG;EoBnBA;IACE,YAAW;IACX,QAAO;GACR;EAED;IACE,SAAQ;IACR,WAAU;GACX;C5Bq1GJ;;AQ10GG;EoBnBA;IACE,YAAW;IACX,QAAO;GACR;EAED;IACE,SAAQ;IACR,WAAU;GACX;C5Bg2GJ;;AQr1GG;EoBnBA;IACE,YAAW;IACX,QAAO;GACR;EAED;IACE,SAAQ;IACR,WAAU;GACX;C5B22GJ;;A4Br2GD;EAEI,UAAS;EACT,aAAY;EACZ,cAAa;EACb,oBxB4wBoC;CwB3wBrC;;AChCC;EACE,sBAAqB;EACrB,uBzB0QgC;EyBzQhC,2BzB0QyC;EyBzQzC,YAAW;EAzBf,cAAa;EACb,0CAA4C;EAC5C,+BAAiC;EACjC,yCAA2C;CA8BxC;;AAgBD;EACE,eAAc;CACf;;ADSL;EAEI,OAAM;EACN,YAAW;EACX,WAAU;EACV,cAAa;EACb,kBxB8vBoC;CwB7vBrC;;AC9CC;EACE,sBAAqB;EACrB,uBzB0QgC;EyBzQhC,2BzB0QyC;EyBzQzC,YAAW;EAlBf,wCAA0C;EAC1C,gBAAe;EACf,2CAA6C;EAC7C,6BAA+B;CAuB5B;;AAgBD;EACE,eAAc;CACf;;AA9BD;EDmDE,kBAAiB;CAClB;;AAIL;EAEI,OAAM;EACN,YAAW;EACX,WAAU;EACV,cAAa;EACb,mBxB6uBoC;CwB5uBrC;;AC/DC;EACE,sBAAqB;EACrB,uBzB0QgC;EyBzQhC,2BzB0QyC;EyBzQzC,YAAW;CAQZ;;AAZD;EAgBI,cAAa;CACd;;AAED;EACE,sBAAqB;EACrB,wBzBuP8B;EyBtP9B,2BzBuPuC;EyBtPvC,YAAW;EA9BjB,wCAA0C;EAC1C,8BAAgC;EAChC,2CAA6C;CA8BxC;;AAGH;EACE,eAAc;CACf;;AAXC;EDiDA,kBAAiB;CAClB;;AAML;EAKI,YAAW;EACX,aAAY;CACb;;AAIH;EE9GE,UAAS;EACT,mBAAmB;EACnB,iBAAgB;EAChB,2B1BEa;CwB2Gd;;AAKD;EACE,eAAc;EACd,YAAW;EACX,2BxBiuByC;EwBhuBzC,YAAW;EACX,iBxB+M+B;EwB9M/B,YxB/Ga;EwBgHb,oBAAmB;EACnB,oBAAmB;EACnB,8BAA6B;EAC7B,UAAS;CAqCV;;AtBzJC;EsBmIE,YxB5IW;EwB6IX,sBAAqB;EJ9IrB,uBpBWW;CEEZ;;AsBuGH;EAgCI,YxBnJW;EwBoJX,sBAAqB;EJrJrB,uBpBWW;CwB4IZ;;AAnCH;EAuCI,YxBnJW;EwBoJX,qBAAoB;EACpB,8BAA6B;CAK9B;;AAGH;EACE,eAAc;CACf;;AAGD;EACE,eAAc;EACd,oBxB4qByC;EwB3qBzC,iBAAgB;EvBpDZ,oBAtCY;EuB4FhB,YxBpKa;EwBqKb,oBAAmB;CACpB;;AAGD;EACE,eAAc;EACd,2BxBkqByC;EwBjqBzC,YxB5Ka;CwB6Kd;;AG3LD;;EAEE,mBAAkB;EAClB,4BAAoB;EAApB,qBAAoB;EACpB,uBAAsB;CAiBvB;;AArBD;;EAOI,mBAAkB;EAClB,mBAAc;EAAd,eAAc;CAYf;;AzBXD;;EyBII,WAAU;CzBJQ;;AyBTxB;;;;EAkBM,WAAU;CACX;;AAKL;EACE,qBAAa;EAAb,cAAa;EACb,oBAAe;EAAf,gBAAe;EACf,qBAA2B;EAA3B,4BAA2B;CAK5B;;AARD;EAMI,YAAW;CACZ;;AAGH;;EAII,kB3B+O6B;C2B9O9B;;AA0BH;EACE,0BAAmC;EACnC,yBAAkC;CAWnC;;AAbD;;;EAOI,eAAc;CACf;;AAED;EACE,gBAAe;CAChB;;AAGH;EACE,0BAAsC;EACtC,yBAAqC;CACtC;;AAED;EACE,yBAAsC;EACtC,wBAAqC;CACtC;;AAmBD;EACE,2BAAsB;EAAtB,uBAAsB;EACtB,sBAAuB;EAAvB,wBAAuB;EACvB,sBAAuB;EAAvB,wBAAuB;CAsBxB;;AAzBD;;EAOI,YAAW;CACZ;;AARH;;EAYI,iB3B8J6B;C2B7J9B;;AA2BH;;EAGI,iBAAgB;CAQjB;;AAXH;;;;EAOM,mBAAkB;EAClB,uBAAsB;EACtB,qBAAoB;CACrB;;AC1JL;EACE,mBAAkB;EAClB,qBAAa;EAAb,cAAa;EACb,oBAAe;EAAf,gBAAe;EACf,wBAAoB;EAApB,qBAAoB;EACpB,YAAW;CAgDZ;;AArDD;;;;EAWI,mBAAkB;EAClB,mBAAc;EAAd,eAAc;EAGd,UAAS;EACT,iBAAgB;CAOjB;;AAvBH;;;;;;;;;;;;EAqBM,kB5B6P2B;C4B5P5B;;AAtBL;;;EA6BI,WAAU;CACX;;AA9BH;EAkCI,WAAU;CACX;;AAnCH;EA8CI,qBAAa;EAAb,cAAa;EACb,uBAAmB;EAAnB,oBAAmB;CAKpB;;AAUH;;EAEE,qBAAa;EAAb,cAAa;CAoBd;;AAtBD;;EAQI,mBAAkB;EAClB,WAAU;CAKX;;AAdH;;EAYM,WAAU;CACX;;AAbL;;;;;;;;EAoBI,kB5BgM6B;C4B/L9B;;AAGH;EAAuB,mB5B4LU;C4B5L4B;;AAC7D;EAAsB,kB5B2LW;C4B3L0B;;AAG3D;EACE,+BAA8B;CAC/B;;AAED;;EAEE,mBAAkB;EAClB,WAAU;CACX;;AAQD;EACE,qBAAa;EAAb,cAAa;EACb,uBAAmB;EAAnB,oBAAmB;EACnB,yB5BmZ6C;E4BlZ7C,iBAAgB;E3BWZ,gBAtCY;E2B6BhB,iB5BwN+B;E4BvN/B,kB5B4NgC;E4B3NhC,Y5BvGa;E4BwGb,mBAAkB;EAClB,oBAAmB;EACnB,uB5BjHa;E4BkHb,uB5BhHa;C4BwHd;;AApBD;;EAkBI,cAAa;CACd;;AASH;;EAEE,8B5Bsa+F;C4BrahG;;AAED;;;;;;EAME,0B5BiTmC;ECzU/B,oBAtCY;E2BgEhB,iB5BiT+B;C4B/ShC;;AAED;;EAEE,8B5BkZ+F;C4BjZhG;;AAED;;;;;;EAME,2B5B2RmC;ECpU/B,oBAtCY;E2BiFhB,iB5B2R+B;C4BzRhC;;AAED;;EAEE,sBAA0E;CAC3E;;ACxKD;EACE,mBAAkB;EAClB,eAAc;EACd,oBAA+C;EAC/C,uBAAqE;EACrE,wBAA4B;CAC7B;;AAED;EACE,4BAAoB;EAApB,qBAAoB;EACpB,sB7B6Hc;C6B5Hf;;AAED;EACE,mBAAkB;EAClB,YAAW;EACX,WAAU;CAuDX;;AA1DD;EAMI,Y7BrBW;E6BuBX,sB7BYa;EoBpCb,0BpBoCa;C6BHd;;AAjBH;EThBI,0BpBoCa;C6BLZ;;AAfL;EAqBI,yB7B1BW;E6B8BT,iB7B8iB8C;C6B5iBjD;;AA3BH;EAkCI,Y7BjDW;E6BkDX,0B7Bfa;E6BgBb,sB7BhBa;C6BkBd;;AAtCH;EA0CM,e7BqhBiD;C6B7gBlD;;AAlDL;EA+CQ,mB7BzDO;C6B2DR;;AAjDP;EAsDQ,uB7BhEO;C6BiER;;AASP;EAEE,iBAAgB;EAChB,oBAAmB;CA8BpB;;AAjCD;EAOI,mBAAkB;EAClB,UAA+E;EAC/E,QAAO;EACP,eAAc;EACd,e7B4e2C;E6B3e3C,gB7B2e2C;E6B1e3C,YAAW;EACX,uB7B7FW;E6B8FX,uB7BmL6B;C6BjL9B;;AAjBH;EAqBI,mBAAkB;EAClB,UAA+E;EAC/E,QAAO;EACP,eAAc;EACd,e7B8d2C;E6B7d3C,gB7B6d2C;E6B5d3C,qBAAoB;EACpB,YAAW;EACX,6BAA4B;EAC5B,mCAAkC;EAClC,sB7B0dwC;C6BzdzC;;AAQH;EAQM,0B7B5FW;C6B6FZ;;AATL;EAgBM,sBAAsB;EACtB,WAAU;EAEV,oBAAoB;EACpB,eAAc;EAEd,sBAAsB;EACtB,gBAAe;EACf,iBAAgB;EAChB,uB7BhJS;E6BiJT,iBAAgB;EAChB,mBAAkB;EAClB,kCAAyB;EAAzB,0BAAyB;EAEzB,oBAAoB;CAErB;;AAhCL;EAqCI,oB7BlJW;C6BmJZ;;AAtCH;EA2CM,sB7B/HW;EoBpCb,0BpBoCa;C6BkIZ;;AA9CL;EAkDM,uB7BzKS;E6B0KT,iBAAgB;EAChB,mBAAkB;EAClB,kBAAiB;EACjB,mDAAwC;EAAxC,2CAAwC;CAEzC;;AAmBL;EbjMI,mBhBsmB+C;C6BjahD;;AAJH;EAUM,uB7B5MS;E6B6MT,mB7B7MS;C6B+MV;;AAbL;EAkBM,0B7BjLW;EgBlCb,mBhBsmB+C;C6BhZ9C;;AArBL;EA4BM,mB7BzNS;C6B2NV;;AAiBL;EACE,uBAA2D;CAyE5D;;AA1ED;EAMQ,yBAAwB;CACzB;;AAPP;EAYI,sBAAqB;CAsBtB;;AAlCH;EAcM,QAAO;EACP,e7B0W4E;E6BzW5E,iB7B0W8E;E6BzW9E,oBAAmB;EACnB,uB7B5PS;E6B6PT,mmCf/NqI;EegOrI,6BAA4B;EAC5B,8BAA6B;EbrQ/B,iBhB2mB6C;C6BpW5C;;AAvBL;EA0BM,sBAAsI;EACtI,U7BK2B;E6BJ3B,+B7BgW2H;E6B/V3H,6B7BgWwH;E6B/VxH,uB7B/QS;EgBCX,iBhB2mB6C;EiB7mB3C,kJjBkkB+H;EiBlkB/H,0IjBkkB+H;EiBlkB/H,+KjBkkB+H;C6B/ShI;;AZ9QD;EY6OJ;IZ5OM,iBAAgB;GY6QjB;CjC6rHJ;;AiC9tHD;EAqCI,wBAA4D;EAC5D,gBAAe;CAYhB;;AAlDH;EAyCQ,SAAQ;EACR,WAAU;CACX;;AA3CP;EA8CQ,4BAAsF;EACtF,WAAU;CACX;;AAhDP;EAuDM,gOfnQqI;EeoQrI,6BAA4B;EAC5B,4BAA2B;CAC5B;;AA1DL;EA6DM,uB7B9SS;E6B+ST,wCAA+C;EAA/C,gCAA+C;CAChD;;AA/DL;EAoEM,uB7BhTS;C6BiTV;;AArEL;EAuEM,uB7BnTS;C6BoTV;;AAWL;EACE,sBAAqB;EACrB,YAAW;EACX,4B7BgO4F;E6B/N5F,2C7B0SuC;E6BzSvC,yP7BduQ;ECnMnQ,gBAtCY;E4ByPhB,iB7BH+B;E6BI/B,kB7BAgC;E6BChC,Y7BnUa;E6BoUb,uBAAsB;EACtB,qM7BiTmI;E6BhTnI,uB7BhVa;E6BiVb,uB7B5Ua;EgBJX,iBaiVoD;EAEtD,yBAAgB;EAAhB,sBAAgB;EAAhB,iBAAgB;CAsCjB;;AAtDD;EAmBI,mB7B7UW;E6B8UX,WAAU;EAIR,iB7BiTkC;C6BrSrC;;AApCH;EAiCM,Y7B3VS;E6B4VT,uB7ByKsC;C6BxKvC;;AAnCL;EAwCI,aAAY;EACZ,sB7BqQqC;E6BpQrC,uBAAsB;CACvB;;AA3CH;EA8CI,Y7B5WW;E6B6WX,uB7BhXW;C6BiXZ;;AAhDH;EAoDI,cAAa;CACd;;AAGH;EACE,8B7B6K+F;E6B5K/F,sB7B6DmC;E6B5DnC,yB7B4DmC;E6B3DnC,uB7B4DmC;ECpU/B,oBAtCY;C4BgTjB;;AAED;EACE,8B7BwK+F;E6BvK/F,sB7B0DmC;E6BzDnC,yB7ByDmC;E6BxDnC,sB7ByDmC;ECzU/B,oBAtCY;C4BwTjB;;AAOD;EACE,mBAAkB;EAClB,sBAAqB;EACrB,YAAW;EACX,4B7BkJ4F;E6BjJ5F,iBAAgB;CACjB;;AAED;EACE,mBAAkB;EAClB,WAAU;EACV,YAAW;EACX,4B7B0I4F;E6BzI5F,UAAS;EACT,WAAU;CAoBX;;AA1BD;EASI,mB7BxZW;E6ByZX,iB7BsB8B;C6BrB/B;;AAXH;EAcI,uB7BpaW;C6BqaZ;;AAfH;EAmBM,kB7BmRQ;C6BlRT;;AApBL;EAwBI,2BAA0B;CAC3B;;AAGH;EACE,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,QAAO;EACP,WAAU;EACV,4B7B4G4F;E6B3G5F,yB7BmE6C;E6BlE7C,yP7BlIuQ;E6BmIvQ,iB7BtH+B;E6BuH/B,kB7BnHgC;E6BoHhC,Y7Btba;E6Bubb,uB7B8E0C;E6B7E1C,uB7B7ba;C6Bidd;;AAjCD;EAkBI,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,UAAS;EACT,WAAU;EACV,eAAc;EACd,gB7ByFgH;E6BxFhH,yB7BiD2C;E6BhD3C,kB7BnI8B;E6BoI9B,Y7BtcW;E6BucX,kBAAiB;ETldjB,uBpBIW;E6BgdX,qBAAoB;CAErB;;AASH;EACE,YAAW;EACX,6BAA+F;EAC/F,WAAU;EACV,8BAA6B;EAC7B,yBAAgB;EAAhB,sBAAgB;EAAhB,iBAAgB;CAkIjB;;AAvID;EAQI,cAAa;CAOd;;AAfH;EAY8B,gD7Bhef;C6BgemE;;AAZlF;EAa8B,gD7Bjef;C6BiemE;;AAblF;EAc8B,gD7Blef;C6BkemE;;AAdlF;EAkBI,UAAS;CACV;;AAnBH;EAsBI,Y7B4K6C;E6B3K7C,a7B2K6C;E6B1K7C,qBAAyE;ETvfzE,uBpBWW;E6B8eX,U7B2K0C;EiBpqBxC,6GjBkkB+H;E6BrEjI,yBAAgB;EAAhB,iBAAgB;CAKjB;;AZ7fC;EY0dJ;IZzdM,iBAAgB;GY4fnB;CjC0pHF;;AiC7rHD;ET/dI,0BpBoCa;C6B6dZ;;AAlCL;EAsCI,Y7BqJoC;E6BpJpC,e7BqJqC;E6BpJrC,mBAAkB;EAClB,gB7BoJuC;E6BnJvC,uB7BlgBW;E6BmgBX,0BAAyB;CAG1B;;AA9CH;EAiDI,Y7BiJ6C;E6BhJ7C,a7BgJ6C;EoBjqB7C,uBpBWW;E6BwgBX,U7BiJ0C;EiBpqBxC,6GjBkkB+H;E6B3CjI,sBAAgB;EAAhB,iBAAgB;CAKjB;;AZvhBC;EY0dJ;IZzdM,iBAAgB;GYshBnB;CjC4pHF;;AiCztHD;ET/dI,0BpBoCa;C6BufZ;;AA5DL;EAgEI,Y7B2HoC;E6B1HpC,e7B2HqC;E6B1HrC,mBAAkB;EAClB,gB7B0HuC;E6BzHvC,uB7B5hBW;E6B6hBX,0BAAyB;CAG1B;;AAxEH;EA2EI,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;EAqGI,+LAAkB;CACnB;;AAtGH;EA0GI,YlCrJW;EkCsJX,qBAAoB;EAEpB,aAAY;EACZ,uBlC9JW;EkC+JX,mBlC1JW;CkC2JZ;;AAhHH;EAoHI,+LAAkB;CACnB;;AArHH;EAwHI,+LAAkB;CACnB;;AAzHH;EA4HI,qBAAoB;CACrB;;ACjLD;EACE,oBnCy4BwC;EmCx4BxC,qBnCw4BwC;EmCv4BxC,2BnCo2BwC;EC3uBtC,oBAtCY;EkCjFd,sBnC6Q6B;CmC5Q9B;;ADmLH;;EAII,gBAAe;CAChB;;AC9LD;EACE,oBnC04BwC;EmCz4BxC,qBnCy4BwC;EmCx4BxC,2BnCk2BuC;ECzuBrC,oBAtCY;EkCjFd,sBnC8Q6B;CmC7Q9B;;AD2LH;;EAII,eAAc;CACf;;AEpMH;EACE,sBAAqB;EACrB,4BpCm/ByC;EC33BrC,oBAtCY;EmChFhB,iBpCsU+B;EoCrU/B,eAAc;EACd,mBAAkB;EAClB,oBAAmB;EACnB,yBAAwB;EnBPpB,sIjBwf6I;CoCnelJ;;AnBhBG;EmBNJ;InBOM,iBAAgB;GmBerB;CxCu9KA;;AMl+KC;EkCGI,sBAAqB;ClCAxB;;AkCdH;EAoBI,cAAa;CACd;;AAIH;EACE,mBAAkB;EAClB,UAAS;CACV;;AAMD;EACE,wBpCu9ByC;EoCt9BzC,uBpCs9ByC;CoCp9B1C;;AAOC;ECjDA,YvBoDc;EuBnDd,0BrCwCe;CoCUd;;AlCpCD;EmCVI,YvB+CU;EuB9CV,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCMa;EqCLb,uBrCea;CoCmCZ;;AlCpCD;EmCVI,YrCCS;EqCAT,wBAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,0BrC0Ce;CoCQd;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,0BrCmCe;CoCed;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,uBrCyCY;CoCSX;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCMa;EqCLb,0BrCuCe;CoCWd;;AlCpCD;EmCVI,YrCCS;EqCAT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCgBa;EqCfb,uBrCSa;CoCyCZ;;AlCpCD;EmCVI,YrCWS;EqCVT,0BAAkC;CnCYrC;;AkC+BD;ECjDA,YrCMa;EqCLb,uBrCea;CoCmCZ;;AlCpCD;EmCVI,YrCCS;EqCAT,wBAAkC;CnCYrC;;AF0wCD;EoCnuCE,oBAAmB;EACnB,qBAAoB;CpCouCrB;;AoCvuCH;EAMM,oBAAmB;CACpB;;AE/DL;EACE,wBAAoD;EACpD,sBtCg5B6C;EsC/4B7C,YtCca;EsCbb,uBtCGa;CsCGd;;AlCkDG;EkC5DJ;IAQI,qBtC04B2C;GsCx4B9C;C1CgmLA;;A0C9lLD;EACE,iBAAgB;EAChB,gBAAe;CAEhB;;ACXD;EACE,mBAAkB;EAClB,2BvCyiCyC;EuCxiCzC,uBvCwIc;EuCvId,4BAA6C;CAY9C;;AAhBD;EAOI,mBAAkB;EAClB,aAAY;CAOb;;AAfH;EAUM,evCqFW;EuCpFX,gBvCoFW;EuCnFX,6BAA4B;EAC5B,uBAAsB;CACvB;;AAKL;EACE,2BvCyhCyC;CuCjhC1C;;AATD;EAGI,cAAa;CAKd;;AARH;EAKM,YvCsEQ;EuCrER,avCqEQ;CuCpET;;AAIL;EACE,sBvCghCyC;CuCxgC1C;;AATD;EAGI,aAAY;CAKb;;AARH;EAKM,YvC6DQ;EuC5DR,avC4DQ;CuC3DT;;AAML;EAEE,eAAc;CACf;;AAGD;EACE,iBvCwR+B;CuCvRhC;;AAOD;EACE,oBAAsD;CAWvD;;AAZD;EAKI,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,2BvCy+BuC;EuCx+BvC,uBvCu+BwC;EuCt+BxC,eAAc;CACf;;AASD;EClFA,YxCgBa;EoBXX,0BNgG8D;E0BnGhE,sB1BmGgE;CyBX/D;;ACtFD;EACE,0BAAqC;CACtC;;AAED;EACE,aAA0B;CAC3B;;ADwED;EClFA,YxCMa;EoBDX,wBNgG8D;E0BnGhE,oB1BmGgE;CyBX/D;;ACtFD;EACE,wBAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADwED;EClFA,YxCgBa;EoBXX,0BNgG8D;E0BnGhE,sB1BmGgE;CyBX/D;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BH;IAaM,gBAAe;GAGhB;C/Cq3LR;;AQh6LG;EuC2BA;IACE,wBAAmB;IAAnB,oBAAmB;GAiBpB;EAlBD;IAII,mB3C6LyB;I2C5LzB,iBAAgB;GAYjB;EAjBH;IAaM,gBAAe;GAGhB;C/Ck4LR;;A+Ct3LD;EAEI,gBAAe;EACf,eAAc;CAMf;;AATH;EAOM,oB3C8J2B;C2C7J5B;;AARL;EAaM,cAAa;CACd;;AAdL;EAmBM,iBAAgB;EAChB,iBAAgB;CACjB;;ACrIH;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAGI,Y5CCS;E4CIX,wB9B2F8D;C8BvE/D;;A1CfD;E0CCQ,Y5CVK;E4CeP,wBAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO;C4CYR;;AA1BL;EAKI,Y5CSS;E4CNX,0B9B2F8D;C8BvE/D;;A1CfD;E0CGQ,Y5CFK;E4CKP,0BAAyC;C1CH9C;;A0ChBD;EAuBM,Y5CnBO;E4CoBP,uB5CVO;E4CWP,mB5CXO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","file":"boosted.css","sourcesContent":["@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0.625rem 0.625rem 0;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0.3125rem 0.3125rem 0;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0;\n border-bottom: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -2px;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.84375rem;\n padding-left: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.46875rem;\n padding-left: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.9375rem;\n padding-left: 0.9375rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -2px;\n}\n\n.input-group-prepend {\n margin-right: -2px;\n}\n\n.input-group-append {\n margin-left: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-left: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n /* rtl:begin:ignore */\n top: .4rem;\n /* rtl:end:ignore */\n left: .2585rem;\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n /* rtl:end:ignore */\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-left: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n left: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-right: 4.375rem;\n padding-left: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: 0;\n left: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n right: calc(1.875rem + 2px);\n left: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 1.5rem 0.4375rem 0.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-left: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-left: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-left: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.125rem;\n margin-left: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-left: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 .625rem 0 0;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -2.5rem;\n margin-left: -2.5rem;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 2.5rem;\n margin-bottom: 0;\n margin-left: 2.5rem;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n}\n\n.accordion .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-left: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-left: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-left: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem -0.625rem -0.625rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 0.625rem;\n margin-left: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 1.875rem;\n margin-left: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-right: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-left: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: left !important;\n }\n .float-xxl-right {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: left !important;\n }\n .text-xxl-right {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n .o-card-link .card-title {\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: right;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n right: 0;\n left: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: flex;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n}\n\n.form-group.row.top {\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n order: 1;\n}\n\n.form-group.row.top .form-control {\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-left: 0;\n color: #f16e00;\n text-align: left;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-left: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: left;\n padding: 0.625rem 1.25rem;\n padding-left: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-left: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 0.625rem 0.3125rem 2rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n right: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-left: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0.625rem 0 0;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-left: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-left: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-right: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-right: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-left: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n transform: rotate(180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: left;\n}\n\n.modal .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-right: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-left: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n align-self: center;\n margin-right: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-left: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-left: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: 0;\n }\n}\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: 700;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-left: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: flex;\n}\n\n.o-nav-local ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-left: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-left: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: left;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 #ccc;\n border: 2px solid #000;\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: left;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-right: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n right: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n align-items: center;\n justify-content: center;\n float: right;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n /* rtl:ignore */\n transform: rotate(90deg);\n /* rtl:ignore */\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n right: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n right: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n right: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n\n/*# sourceMappingURL=boosted.css.map */","/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n\n// boosted mod\n@import \"o-card\";\n@import \"o-switches\";\n@import \"o-forms\";\n@import \"o-bullet_points\";\n@import \"o-step_bar\";\n@import \"o-link-arrow\";\n@import \"o-megamenu\";\n@import \"o-navbar\";\n@import \"o-tables\";\n@import \"o-modal\";\n@import \"o-nav\";\n@import \"o-nav-local\";\n@import \"o-skiplinks\";\n@import \"o-footer\";\n@import \"o-responsive_table\";\n@import \"o-scroll-up\";\n@import \"o-dropdown\";\n@import \"o-carousel\";\n@import \"orange-css\";\n// end mod\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// Boosted Mod\np a {\n text-decoration: underline;\n\n @include hover-focus {\n text-decoration: underline;\n }\n}\n// End mod\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n// Boosted mod\n// reduce the size of titles for mobile display\n@include media-breakpoint-down(sm) {\n h1, .h1 { @include font-size($h1-font-size-mobile); }\n h2, .h2 { @include font-size($h2-font-size-mobile); }\n h3, .h3 { @include font-size($h3-font-size-mobile); }\n h4, .h4 { @include font-size($h4-font-size-mobile); }\n h5, .h5 { @include font-size($h5-font-size-mobile); }\n h6, .h6 { @include font-size($h6-font-size-mobile); }\n}\n// end mod\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n width: 100%; // Boosted mod\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n width: auto; // Boosted mod\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n@mixin make-container($gutters: $grid-gutter-widths) {\n margin-right: auto;\n margin-left: auto;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n // width: 100%; //Boosted mod our fluid is not 100% width\n }\n }\n\n // boosted mod\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n margin-right: $container-margin;\n margin-left: $container-margin;\n // reset margin for second level container\n .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n }\n }\n // end mod\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n // boosted mod\n margin-right: auto;\n margin-left: auto;\n // end mod\n }\n }\n}\n\n@mixin make-gutters($gutters: $grid-gutter-widths) {\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n }\n}\n\n@mixin make-row($gutters: $grid-gutter-widths) {\n display: flex;\n flex-wrap: wrap;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n }\n }\n}\n\n@mixin make-col-ready($gutters: $grid-gutter-widths) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n }\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n\n@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n @include make-gutters($gutters);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, 0)); // Boosted mod let color as is\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n // Boosted mod adapt color with background\n @if ($state == \"secondary\" or $state == \"danger\" or $state == \"dark\") {\n color: $white;\n }\n // end mod\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n@import \"node_modules/sass-math-pow/sass/math-pow\";\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n @if ($color == #F16E00) {\n @return #fff;\n }\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n // get the relative lum for each color\n $luminositecouleur: relativelum($r / 255, $g / 255, $b / 255);\n $luminositeblanc: relativelum(1, 1, 1);\n // if luminosite doesn't fit with white color return black\n @if ((($luminositeblanc + .05) / ($luminositecouleur + .05)) < $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// apply Wcag contrast algo : http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n// Convert from HTMLCS JS algo\n@function relativelum($r, $g, $b) {\n @return ((transform($r) * .2126) + (transform($g) * .7152) + (transform($b) * .0722));\n}\n\n@function transform($x) {\n @if ($x <= .03928) {\n @return $x / 12.92;\n } @else {\n @return poly-pow((($x + .055) / 1.055), 2.4);\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n@function alert-logo-size($key: \"md\") {\n @return map-get($alert-logo-sizes, $key);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Boosted mod\n// Orange brand, labels are always bold\nlabel {\n font-weight: $font-weight-bold;\n &.disabled {\n color: $custom-control-label-disabled-color;\n }\n &.is-required::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n}\n// end mod\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n color: #666; // boosted mod\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n &[size],\n &[multiple] {\n height: auto;\n }\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$form-grid-gutter-width / 2;\n margin-left: -$form-grid-gutter-width / 2;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: $form-grid-gutter-width / 2;\n padding-left: $form-grid-gutter-width / 2;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// stylelint-disable property-blacklist\n@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @if $enable-prefers-reduced-motion-media-query {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n // Boosted mod, remove box shadow!\n // box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-weight: $font-weight-bold; // Boosted Mod\n // color: $color; // Boosted Mod\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n .form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n // Boosted Mod\n // @if $enable-validation-icons {\n // padding-right: $input-height-inner;\n // background-image: $icon;\n // background-repeat: no-repeat;\n // background-position: center right $input-height-inner-quarter;\n // background-size: $input-height-inner-half $input-height-inner-half;\n // }\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n // Boosted Mod\n ~ .#{$state}-feedback {\n @if $enable-validation-icons {\n @if $state == \"valid\" {\n @include svg-success();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n } @else {\n @include svg-error();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n }\n position: relative;\n display: block;\n padding-left: 1.625rem;\n }\n\n ~ .#{$state}-tooltip {\n display: block;\n }\n // End Mod\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right;\n background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\n }\n\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25); // Boosted mod, remove box shadow!\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n // Boosted mod, remove box shadow!\n // ~ .custom-control-label::before {\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n // }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n }\n }\n }\n}\n","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n color: $body-color;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n @include hover {\n color: $body-color;\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Boosted mod\na.btn {\n text-decoration: none; // Boosted mod remove underline for a.btn\n}\n// End mod\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n// boosted mod custom buttons\n// @mixin button-variant($background, $border, $hover-background, $hover-border, $active-background, $active-border, $disabled-background, $disabled-border, $disabled-color, $color) {\n.btn-primary,\n.btn-warning {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $black, $black, $white, $black, $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $white, $white, $black, $white, $gray-700, $gray-700, $black, $white);\n }\n}\n.btn-secondary,\n.btn-light {\n @include button-variant(transparent, $black, $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-500, $gray-500, $black);\n &.btn-inverse {\n @include button-variant($white, $white, $black, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-success {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $black);\n &.btn-inverse {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-info,\n.btn-dark {\n @include button-variant($black, $black, $white, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(transparent, $white, $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-700, $gray-700, $white);\n }\n}\n.btn-danger {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black);\n }\n}\n\n// Boosted mod custom outline buttons values\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @if $color == \"light\" {\n @include button-outline-variant($value, $gray-900);\n } @else {\n @if $color == \"warning\" {\n @include button-outline-variant(theme-color(\"primary\"), $black);\n } @else {\n @if $color == \"info\" {\n @include button-outline-variant(theme-color(\"secondary\"), $black);\n } @else {\n @include button-outline-variant($value, $black);\n }\n }\n }\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n // font-weight: $font-weight-normal; // Boosted mod font-weight stay bold\n color: $link-color;\n\n // Boosted mod\n &.btn-inverse {\n color: #fff;\n }\n // end mod\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-xlg {\n @include button-size($btn-padding-y-xlg, $btn-padding-x-xlg, $font-size-xlg, $btn-line-height-xlg, $btn-border-radius-xlg);\n}\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n// Social Media\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n// boosted mod add default color, disable-background and disabled-border and disabled-color option\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%), $disabled-background: $background, $disabled-border: border, $disabled-color: color-yiq($background), $color: color-yiq($background)) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover-focus { // Boosted mod replace hover by hover focus cause we remove box-shadow\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: $disabled-color; // Boosted mod\n background-color: $disabled-background; // Boosted var disabled\n border-color: $disabled-border; // Boosted var disabled\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover-focus { //Boosted mod focus has same as hover\n color: #fff; // Boosted mod\n background-color: #000; // Boosted mod\n border-color: #000 // Boosted mod\n }\n\n // &:focus,\n // &.focus {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n // }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: #000; // Boosted mod\n background-color: #f16e00; // Boosted mod\n border-color: #f16e00; // Boosted mod\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-control-plaintext,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .custom-select:focus,\n > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n }\n\n // Bring the custom file input above the label\n > .custom-file .custom-file-input:focus {\n z-index: 4;\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n// Boosted mod\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n// End mod\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n @include font-size($input-font-size); // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: $font-size-base * $line-height-base;\n padding-left: $custom-control-gutter + $custom-control-indicator-size;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n // Boosted mod our custom control have a border\n border-color: $custom-control-indicator-checked-border-color;\n // end mod\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n // Boosted mod move gradient to global settings, to change the color for disabled checked elements\n &::before {\n @include gradient-bg($custom-control-indicator-checked-bg);\n }\n // end mod\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n outline: dotted 1px $black; // Boosted mod no box-shadow, replaced by outline\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n }\n\n // &:focus:not(:checked) ~ .custom-control-label::before {\n // border-color: $custom-control-indicator-focus-border-color;\n // }\n\n &:not(:disabled):active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n border-color: $custom-control-indicator-active-border-color;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n // Boosted mod\n // our custom control have a border\n border-color: $custom-control-indicator-disabled-bg;\n // end mod\n }\n }\n // Boosted mod disable bg only for checked elements\n &:checked ~ .custom-control-label {\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n //position: relative; // boosted mod checkbox in table are misaligned\n margin-bottom: 0;\n vertical-align: top;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background-color: $custom-control-indicator-bg;\n border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n // Boosted Mod\n .custom-control-input:not(:disabled):checked ~ .custom-control-label {\n &::before {\n border: 2px solid $primary;\n }\n }\n // End Mod\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n //Boosted mod\n\n /* rtl:begin:ignore */\n top: .4rem;\n\n /* rtl:end:ignore */\n left: .2585rem;\n\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n\n /* rtl:end:ignore */\n //End mod\n }\n }\n\n // Boosted mod\n .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: $black; // Boosted mod no box-shadow, replaced by outline\n }\n //end mod\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n border-color: $custom-checkbox-indicator-indeterminate-border-color;\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n //Accessiblity issue DO NOT remove\n //boosted mod\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(.5) translateY(-.5rem);\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // &:indeterminate ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n //}\n // end mod\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n // stylelint-disable-next-line property-blacklist\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::before {\n //boosted mod\n background-color: $white;\n border-color: $white;\n //end mod\n }\n\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border: 6px solid $primary;\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n //end mod\n }\n }\n\n .custom-control-input:disabled:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border-color: $custom-control-indicator-disabled-bg;\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // }\n // end mod\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n padding-left: $custom-switch-width + $custom-control-gutter;\n\n .custom-control-input {\n @include focus {\n ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n }\n }\n }\n\n .custom-control-label {\n padding-top: .3125rem; // Boosted mod vertical align fix for label\n &::before {\n left: 0; // boosted mod\n width: $custom-switch-width;\n height: $custom-switch-height; // boosted mod\n pointer-events: all;\n background-color: $custom-control-indicator-border-color; // boosted mod\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\"); // boosted mod\n background-repeat: no-repeat; // boosted mod\n background-position: 1.975rem; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n }\n\n &::after {\n top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width}); // boosted mod\n left: $custom-control-indicator-border-width; // boosted mod\n width: $custom-switch-indicator-width; // boosted mod\n height: $custom-switch-indicator-height; // boosted mod\n background-color: $custom-switch-indicator-bg-color; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n @include transition(transform .15s ease-in-out, $custom-forms-transition);\n }\n }\n // boosted mod create a right aligned switch\n &.right {\n padding-right: $custom-switch-width + $custom-control-gutter;\n padding-left: 0;\n .custom-control-label {\n &::before {\n right: 0;\n left: auto;\n }\n\n &::after {\n right: calc(#{($custom-switch-width / 2)} + #{$custom-control-indicator-border-width});\n left: auto;\n }\n }\n }\n // end mod\n .custom-control-input:checked ~ .custom-control-label {\n // boosted mod\n &::before {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n background-repeat: no-repeat;\n background-position: .25rem;\n }\n // end mod\n &::after {\n background-color: $custom-control-indicator-bg;\n transform: translateX($custom-switch-width / 2); // boosted mod change the indicator size\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n ~ .custom-control-label::before {\n background-color: $custom-control-indicator-disabled-bg; // boosted mod\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n font-family: $custom-select-font-family;\n @include font-size($custom-select-font-size);\n font-weight: $custom-select-font-weight;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-background;\n background-color: $custom-select-bg;\n border: $custom-select-border-width solid $custom-select-border-color;\n @include border-radius($custom-select-border-radius, 0);\n // @include box-shadow($custom-select-box-shadow); //boosted mod no box-shadow\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\n } @else {\n box-shadow: $custom-select-focus-box-shadow;\n }\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n display: none;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y-sm;\n padding-bottom: $custom-select-padding-y-sm;\n padding-left: $custom-select-padding-x-sm;\n @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y-lg;\n padding-bottom: $custom-select-padding-y-lg;\n padding-left: $custom-select-padding-x-lg;\n @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n }\n\n &:disabled ~ .custom-file-label {\n background-color: $custom-file-disabled-bg;\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n\n ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n font-family: $custom-file-font-family;\n font-weight: $custom-file-font-weight;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: inherit;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: 0; // Edge specific\n margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: $custom-range-thumb-height / 2;\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &:disabled {\n &::-webkit-slider-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: default;\n }\n\n &::-moz-range-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-moz-range-track {\n cursor: default;\n }\n\n &::-ms-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n @include transition($custom-forms-transition);\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n // Boosted mod\n font-weight: $font-weight-bold;\n // end mod\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n // Boosted mod\n // remove border from nav-link padding in tabs\n padding: $nav-link-padding-y calc(#{$nav-link-padding-x} - #{$nav-tabs-border-width});\n line-height: 1rem;\n // end mod\n border: $nav-tabs-border-width solid transparent;\n\n // Boosted mod\n // Border bottom width to 0 for display\n border-bottom-width: 0;\n // end mod\n\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n color: $nav-tabs-link-hover-color; // boosted mod\n background-color: $nav-tabs-link-hover-bg; // boosted mod\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n font-weight: $font-weight-bold; // Boosted mod\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1; // booosted mod\n align-items: center;\n justify-content: space-between;\n padding-right: 0; // boosted mod\n padding-left: 0; // boosted mod\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end; // boosted mod\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin: .625rem .3125rem; // boosted mod\n @include font-size($navbar-brand-font-size);\n font-weight: $font-weight-bold; // boosted mod\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Boosted mod\n + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n }\n\n @include focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n }\n\n img {\n flex-wrap: wrap;\n width: $navbar-brand-logo-height;\n height: $navbar-brand-logo-height;\n margin-top: 0;\n margin-bottom: .25rem;\n }\n // end mod\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-top: auto; // boosted mod\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n //Boosted mod\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n\n &.active::before {\n display: none;\n }\n\n &.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n }\n\n &[class^=\"svg-\"] {\n margin: .625rem;\n }\n\n &[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: $font-size-base;\n font-weight: $font-weight-normal;\n color: #fff;\n content: \"\\e93e\";\n }\n\n @include focus {\n outline-offset: .625rem;\n }\n // end mod\n }\n\n .dropdown-menu {\n position: static;\n top: 2rem; // boosted mod\n float: none;\n }\n\n // boosted mod\n .nav-item {\n margin-left: 0;\n font-size: $h5-font-size;\n border-top: 1px solid $gray-900;\n }\n\n .dropdown {\n padding: 0;\n\n .dropdown-toggle,\n .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n }\n\n &.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n }\n\n .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid $gray-900;\n\n @include focus {\n color: $primary;\n }\n }\n }\n // end mod\n}\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n // align-items: center; // boosted mod\n align-self: flex-end; // boosted mod\n // Boosted mod\n .navbar-nav {\n align-items: stretch;\n }\n // end mod\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n margin: ($spacer / 4) 0; // boosted mod\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n // Boosted mod\n background-color: #fff;\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-hover-bg;\n }\n // end mod\n }\n // Boosted mod\n &:active {\n background-color: theme-color(\"primary\");\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n }\n\n &:focus {\n outline: 0;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .navbar-toggler elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n height: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n // Boosted mod\n // > .container,\n // > .container-fluid {\n // padding-right: 0;\n // padding-left: 0;\n // }\n // boosted mod\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: $navbar-expanded-padding-y $navbar-expanded-padding-x 1.3125rem; // boosted mod\n\n // Boosted mod\n .navbar-brand {\n margin: 0 .625rem 0 0;\n\n img {\n width: $navbar-brand-logo-expanded-height;\n height: $navbar-brand-logo-expanded-height;\n }\n }\n\n &.minimized {\n padding-top: $navbar-expanded-minimized-padding-y;\n padding-bottom: 1rem;\n\n .navbar-brand {\n img {\n width: $navbar-brand-logo-minimized-height;\n height: $navbar-brand-logo-minimized-height;\n }\n }\n }\n // end mod\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n // Boosted mod\n .dropdown-item {\n color: $black;\n background-color: $white;\n border: 0;\n\n &.active,\n &:hover {\n color: $white;\n background-color: $black;\n }\n }\n\n .nav-item {\n font-size: $font-size-base;\n border: 0;\n\n &.dropdown {\n align-self: flex-end;\n }\n }\n // end mod\n\n .nav-link {\n padding-top: 0; // boosted mod\n padding-right: $navbar-nav-link-padding-x;\n padding-bottom: 0; // boosted mod\n padding-left: $navbar-nav-link-padding-x;\n margin-left: 1.25rem; // boosted mod\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n padding-right: $grid-gutter-width / 2; // boosted mod\n padding-left: $grid-gutter-width / 2; // boosted mod\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n @include hover-focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n @include hover-focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-spacer-y / 2;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n font-weight: $font-weight-bold; // boosted mod\n color: $card-cap-color;\n background-color: $black; // boosted mod\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-spacer-x / 2;\n margin-bottom: -$card-spacer-y;\n margin-left: -$card-spacer-x / 2;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -$card-spacer-x / 2;\n margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n /* boosted mod */\n\n .card {\n margin-bottom: 0;\n border: 0;\n // border 1px for first child only\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n\n .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n\n &,\n h5 {\n margin: 0;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n button,\n a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n\n &::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &[aria-expanded=\"true\"]::after { // stylelint-disable-line selector-no-qualifying-type\n transform: rotate(180deg);\n }\n }\n }\n\n .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n }\n}\n// For mobile display emphase the border\n@include media-breakpoint-down(sm) {\n .accordion .card {\n // border 1px for first child only\n border-top-width: 2px;\n border-bottom-width: 2px;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n // boosted mod\n // margin-bottom: $breadcrumb-margin-bottom;\n font-size: $breadcrumb-font-size;\n font-weight: $font-weight-bold;\n line-height: $breadcrumb-line-height;\n // end mod\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n padding-left: $breadcrumb-item-padding;\n // boosted mod\n font-family: $breadcrumb-font-family;\n font-size: $breadcrumb-divider-font-size;\n line-height: 1;\n // end mod\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n// stylelint-disable selector-max-class\n\n.page-link {\n position: relative;\n display: block;\n // Boosted mod\n min-width: $pagination-min-width;\n min-height: $pagination-min-width;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: 0;\n font-weight: $font-weight-bold;\n // End mod\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover,\n &:focus {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border; // Boosted mod\n\n // Boosted mod\n span {\n color: $pagination-color;\n }\n // end mod\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n\n // Boosted mod\n span {\n color: $pagination-bg;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .page-link elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n.page-item {\n // Boosted mod\n &.presentation {\n padding: .625rem 0;\n font-weight: $font-weight-bold;\n }\n &.presentation + .page-item,\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-prev};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-prev-active};\n }\n }\n &.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n }\n }\n }\n\n &.presentation + .page-item,\n &:first-child,\n &:last-child {\n .page-link {\n @include hover-focus {\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n &:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n }\n }\n\n // End mod\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n // Boosted mod\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-next};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-next-active};\n }\n }\n &.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n }\n // End mod\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n .page-link:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n\n // Boosted mod\n &.active:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-active};\n }\n\n &.active:last-child .page-link::before {\n background-image: #{$pagination-icon-next-active};\n }\n // end mod\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n\n // Boosted mod\n &.disabled:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-disabled};\n }\n\n &.disabled:last-child .page-link::before {\n background-image: #{$pagination-icon-next-disabled};\n }\n\n + .page-item {\n margin-left: .625rem;\n }\n // End mod\n}\n\n//\n// Sizing\n//\n// Boosted mod add a min size param\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg, $pagination-min-width-lg);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: 1.03125rem;\n }\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm, $pagination-min-width-sm);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: .53125rem;\n }\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius, $pagination-min-width) {\n .page-link {\n min-width: $pagination-min-width; // Boosted mod\n min-height: $pagination-min-width; // Boosted mod\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include transition($badge-transition);\n\n @at-root a#{&} {\n @include hover-focus {\n text-decoration: none;\n }\n }\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n\n// Boosted mod\n.badge[href] {\n @include focus {\n outline-color: #fff;\n outline-offset: -1px;\n\n &.badge-light {\n outline-color: #000;\n }\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n// stylelint-disable declaration-no-important\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n .alert-icon {\n position: absolute;\n top: .625rem;\n &::after {\n width: alert-logo-size(\"md\");\n height: alert-logo-size(\"md\");\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n}\n\n// boosted mod\n.alert-sm {\n padding: $alert-padding-y-sm $alert-padding-x-sm;\n .alert-icon {\n top: .4375rem;\n &::after {\n width: alert-logo-size(\"sm\");\n height: alert-logo-size(\"sm\");\n }\n }\n}\n\n.alert-lg {\n padding: $alert-padding-y-lg $alert-padding-x-lg;\n .alert-icon {\n top: .625rem;\n &::after {\n width: alert-logo-size(\"lg\");\n height: alert-logo-size(\"lg\");\n }\n }\n}\n//end mode\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $close-font-size + $alert-padding-x * 2;\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n line-height: $alert-padding-y; // boosted mod\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n // Boosted mod adapt color with background, and keep initial brand color value for background\n @if ($color == \"secondary\" or $color == \"danger\" or $color == \"dark\") {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $white);\n } @else {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $black);\n }\n // end mod\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n// BOOSTED MOD progress is half height on mobile\n@include media-breakpoint-down(md) {\n .progress {\n width: 100%;\n height: ($progress-height / 2);\n line-height: ($progress-height / 2);\n }\n .progress-bar {\n font-size: $font-size-sm;\n line-height: ($progress-height / 2);\n }\n}\n// end mod\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n color: $list-group-color;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n .list-group-item {\n margin-right: -$list-group-border-width;\n margin-bottom: 0;\n\n &:first-child {\n @include border-left-radius($list-group-border-radius);\n @include border-top-right-radius(0);\n }\n\n &:last-child {\n margin-right: 0;\n @include border-right-radius($list-group-border-radius);\n @include border-bottom-left-radius(0);\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:last-child {\n margin-bottom: -$list-group-border-width;\n }\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, 0), $black); // boosted mod\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: 1; // boosted mod\n\n // Override <a>'s hover style\n @include hover {\n color: $close-color;\n text-decoration: none;\n }\n\n &:not(:disabled):not(.disabled) {\n @include hover-focus {\n opacity: 1; // boosted mod\n }\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n pointer-events: none;\n}\n",".toast {\n max-width: $toast-max-width;\n overflow: hidden; // cheap rounded corners on nested items\n @include font-size($toast-font-size);\n color: $toast-color;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n backdrop-filter: blur(10px);\n opacity: 0;\n @include border-radius($toast-border-radius);\n\n &:not(:last-child) {\n margin-bottom: $toast-padding-x;\n }\n\n &.showing {\n opacity: 1;\n }\n\n &.show {\n display: block;\n opacity: 1;\n }\n\n &.hide {\n display: none;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n // Kill the scroll on the body\n overflow: hidden;\n\n .modal {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n}\n\n.modal-dialog-scrollable {\n display: flex; // IE10/11\n max-height: calc(100% - #{$modal-dialog-margin * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\n overflow: hidden;\n }\n\n .modal-header,\n .modal-footer {\n flex-shrink: 0;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - #{$modal-dialog-margin * 2});\n\n // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n &::before {\n display: block; // IE10\n height: calc(100vh - #{$modal-dialog-margin * 2});\n content: \"\";\n }\n\n // Ensure `.modal-body` shows scrollbar (IE10/11)\n &.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n\n .modal-content {\n max-height: none;\n }\n\n &::before {\n content: none;\n }\n }\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n width: 100vw;\n height: 100vh;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-border-radius);\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n &::before {\n height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // boosted mod\n font-weight: $tooltip-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // boosted mod\n font-weight: $popover-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n > .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n > .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n > .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width / 2;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n > .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n @include transition(0s $carousel-transition-duration opacity);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 2px dotted $input-focus-border-color; //boosted mod\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: no-repeat 50% / 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: .5;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: 1;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) / 2;\n bottom: 20px;\n left: (100% - $carousel-caption-width) / 2;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n background-color: currentColor;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable property-blacklist, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n border-radius: $border-radius !important;\n}\n\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n &::before {\n padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { float: left !important; }\n .float#{$infix}-right { float: right !important; }\n .float#{$infix}-none { float: none !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !important; }\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n // Just in case `pointer-events: none` is set on a parent\n pointer-events: auto;\n content: \"\";\n // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n background-color: rgba(0, 0, 0, 0);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-wrap { white-space: normal !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-weight-bolder { font-weight: $font-weight-bolder !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n word-break: break-word !important; // IE & < Edge 18\n overflow-wrap: break-word !important;\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n // boosted mod try to fix print errors\n // https://github.com/twbs/bootstrap/issues/26781\n .row,\n .form-row {\n display: block !important;\n }\n }\n}\n","//\n// Cards\n//\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link {\n .card-title {\n align-self: center;\n width: 100%; // IE fix\n margin: auto 0;\n font-weight: $font-weight-bold;\n word-break: normal;\n }\n\n .card-img {\n padding: 0;\n text-align: center;\n\n img {\n width: 100%;\n height: auto;\n }\n }\n\n .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n }\n}\n\n@include media-breakpoint-up(xs) {\n .card-deck {\n margin: 0;\n }\n}\n\n@include media-breakpoint-down(xs) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n\n .card-deck {\n flex-direction: column;\n }\n\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n\n .o-card-link {\n .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n\n img {\n width: auto;\n height: 3.75rem;\n }\n }\n\n .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n\n .card-title {\n align-self: flex-start;\n margin: 0;\n\n &::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n }\n }\n}\n\n@include media-breakpoint-only(sm) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n","// Orange switches\n//\n//\n// stylelint-disable selector-max-class\n// stylelint-disable property-blacklist\n\n.o-switch {\n .toggle,\n .toggle::before,\n .toggle .on,\n .toggle .off {\n transition: .4s;\n }\n\n .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: $gray-700;\n border: 2px solid $gray-700;\n\n &.toggle-rounded,\n &.toggle-rounded::before {\n border-radius: 1.625rem;\n }\n\n .on,\n .off {\n display: none;\n font-weight: $font-weight-bold;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n }\n\n .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n }\n\n .off {\n display: block;\n text-align: right;\n opacity: 1;\n\n &.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n }\n }\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n }\n }\n}\n\n.o-switch .checkbox {\n @include focus {\n + .toggle::before {\n outline: 1px dotted #fff;\n }\n }\n\n &:checked {\n + .toggle {\n background: theme-color(\"primary\");\n border-color: theme-color(\"primary\");\n\n .on {\n display: block;\n opacity: 1;\n }\n .off {\n display: none;\n opacity: 0;\n }\n\n &::before {\n right: 0;\n left: auto;\n }\n }\n }\n\n &.success:checked {\n + .toggle {\n background: theme-color(\"success\");\n border-color: theme-color(\"success\");\n\n .on {\n color: #000;\n }\n\n .on.icon-checkbox-tick {\n color: #fff;\n }\n }\n }\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n\n &.toggle-rounded {\n padding: 0 .875rem;\n }\n}\n\n// 3 way toggles\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n\n .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n\n &:first-child {\n margin-left: -2px;\n }\n\n &:last-child {\n margin-right: -2px;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n\n &.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n }\n\n &:active {\n border-color: theme-color(\"primary\");\n }\n\n @include hover {\n &:not(:active) {\n color: theme-color(\"primary\");\n background-color: transparent;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n }\n }\n\n &.no-outline {\n border-color: transparent;\n\n .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n\n &:first-child {\n border-left-color: transparent;\n }\n\n &:last-child {\n border-right-color: transparent;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n\n @include hover {\n &:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n }\n }\n }\n}\n","//\n// Orange forms\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n\n.form-group {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n width: auto;\n }\n\n .invalid-feedback {\n margin-top: .8125rem;\n font-weight: $font-weight-bold;\n }\n\n &.top {\n display: flex;\n flex-direction: column;\n\n .col-form-label {\n margin-bottom: 0;\n }\n\n .form-control {\n order: 2;\n }\n .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n }\n }\n\n &.right {\n display: flex;\n flex-flow: row wrap;\n\n label,\n .col-form-label {\n min-width: 100%;\n }\n\n .form-control-message,\n .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n }\n }\n\n &.row {\n &.top {\n flex-direction: row;\n\n label,\n .col-form-label {\n order: 1;\n }\n\n .form-control {\n order: 2;\n margin-top: 0;\n }\n\n .invalid-feedback {\n order: 0;\n }\n }\n\n &.right {\n label,\n .col-form-label {\n min-width: auto;\n }\n\n .invalid-feedback {\n align-self: center;\n margin-top: 0;\n }\n }\n }\n\n &.is-required label::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n\n // browser reset\n .form-control:invalid {\n outline: none;\n box-shadow: none;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n\n &.form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n }\n\n &.form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n }\n }\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n ~ .invalid-feedback {\n top: ($line-height-base + .5); // Height of the `label` and its margin\n }\n}\n","// Bullet point\n//\n//\n\n.o-square-list {\n padding-left: 0;\n color: theme-color(\"primary\");\n text-align: left;\n\n &,\n ul * {\n list-style-type: none;\n }\n\n li {\n color: #000;\n\n &::before {\n margin-right: 1rem;\n font-size: $font-size-sm;\n line-height: 1.25rem;\n color: theme-color(\"primary\");\n vertical-align: text-top;\n content: \"\\25A0\";\n }\n\n span {\n display: inline-block;\n margin-bottom: .625rem;\n }\n\n > ul {\n padding-left: 1rem;\n }\n }\n\n ul > li::before {\n color: $gray-600;\n }\n\n ul ul > li::before { // stylelint-disable-line selector-max-type\n color: $gray-500;\n }\n}\n","//\n// Orange stepbar\n//\n// stylelint-disable selector-max-class\n\n// url encoded colors\n$arrow-black: \"000000\" !default;\n$arrow-gray: \"dddddd\" !default;\n$arrow-orange: \"f16e00\" !default;\n\n// generate url encoded svg with color\n@function arrow-svg($color) {\n @return \"%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23#{$color}%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\";\n}\n\n@mixin stepbar-arrow($color) {\n &::after {\n position: absolute;\n top: 0;\n right: -$o-stepbar-arrow-width;\n z-index: 500;\n display: block;\n width: $o-stepbar-arrow-width;\n height: $o-stepbar-height;\n content: \"\";\n $arrow-svg: arrow-svg($color);\n background-image: url(\"data:image/svg+xml,#{$arrow-svg}\");\n background-size: $o-stepbar-arrow-width $o-stepbar-height;\n }\n}\n\n.o-stepbar {\n &,\n ol,\n ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n }\n\n // one item\n .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n }\n\n // two items\n .stepbar-item:first-child:nth-last-child(2),\n .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n }\n\n // four items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n }\n\n // five items\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n\n .stepbar-item {\n @include stepbar-arrow($arrow-gray);\n position: relative;\n float: left;\n padding: ($spacer / 2) $spacer;\n padding-left: 2rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: $line-height-base;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: $gray-400;\n\n &:first-child {\n padding-left: $spacer;\n }\n\n &:last-child {\n &::after {\n display: none;\n }\n }\n\n &.done {\n @include stepbar-arrow($arrow-black);\n background-color: #000;\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n &.current {\n @include stepbar-arrow($arrow-orange);\n background-color: theme-color(\"primary\");\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n .stepbar-link {\n text-decoration: none;\n\n .step-number::after {\n content: \".\";\n }\n }\n }\n}\n\n// For mobile display in any case, reduce the padding and the height\n@include media-breakpoint-down(xs) {\n .o-stepbar {\n .stepbar-item {\n padding: $o-stepbar-mobile-padding-vertical ($spacer / 2) $o-stepbar-mobile-padding-vertical ($spacer + $o-stepbar-mobile-arrow-width);\n line-height: $input-btn-line-height;\n }\n\n .stepbar-item::after,\n .stepbar-item.done::after,\n .stepbar-item.current::after,\n .stepbar-item.next::after {\n right: -($o-stepbar-mobile-arrow-width - .0625); // remove 1px for mobile display error\n width: $o-stepbar-mobile-arrow-width;\n height: $o-stepbar-mobile-arrow-height;\n background-size: cover;\n }\n\n &.xs-numbers {\n .step-number::after {\n display: none;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 60%;\n }\n }\n\n // four and five items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 40%;\n }\n }\n\n .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: $o-stepbar-mobile-arrow-width;\n\n &:first-child {\n padding-left: 0;\n }\n\n &.current {\n width: 60%;\n }\n\n &.current .step-number {\n display: none;\n }\n\n &:not(.current) .step-title {\n display: none;\n }\n }\n }\n\n &.xs-labels {\n .step-number {\n display: none;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n//\n// o-link-arrow\n// --------------------------------------------------\n\n.o-link-arrow {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n text-decoration: none;\n\n &::after {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93e\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::after {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n // previous link\n &.back {\n &::after {\n padding: 0;\n content: \"\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &::before {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal $o-link-arrow-separator-padding-vertical 0;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93f\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::before {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n }\n}\n","// stylelint-disable property-blacklist\n//\n// Mega menu\n//\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n","// Orange navbar\n//\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n// stylelint-disable selector-max-compound-selectors\n// stylelint-disable selector-max-combinators\n// stylelint-disable property-blacklist\n\n.navbar {\n .nav-link.icon {\n margin-top: 0;\n\n span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n }\n }\n\n .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n }\n}\n\n.navbar.supra {\n @include media-breakpoint-down(xs) {\n display: none;\n }\n\n height: $navbar-supra-height; // IE flex support\n min-height: $navbar-supra-height;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid $gray-900;\n\n > .container,\n > .container .navbar-nav {\n align-items: center;\n }\n\n .navbar-brand {\n display: none;\n }\n\n .navbar-nav {\n margin: 0;\n\n > .nav-link:first-child,\n .nav-item:first-child .nav-link {\n margin-left: 0;\n }\n }\n\n .nav-link,\n .dropdown-toggle {\n @include focus {\n outline-offset: .5rem;\n }\n\n font-size: $font-size-sm;\n line-height: 1;\n\n span[class^=\"icon-\"] {\n font-size: $h5-font-size;\n font-weight: $font-weight-normal;\n }\n }\n\n .nav-link.icon {\n span[class^=\"icon-\"] {\n font-size: $h6-font-size;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n .dropdown-menu {\n right: 0;\n left: auto;\n }\n}\n\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n &,\n &.minimized {\n .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n\n &[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n\n &[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n }\n\n .mega-menu-panel .nav-link.back {\n display: block;\n\n &::before {\n float: left;\n transform: rotateZ(180deg);\n }\n }\n\n .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n\n a[data-toggle=\"collapse\"] {\n display: none;\n }\n\n > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n\n > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n }\n }\n }\n\n @include media-breakpoint-up($next) {\n .mega-menu {\n overflow: visible;\n\n > .navbar-nav {\n transition: none;\n transform: none;\n\n .nav-link::before {\n display: none;\n }\n }\n }\n\n .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: $zindex-fixed;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n\n a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n\n .nav-link {\n margin-left: 0;\n }\n\n .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n\n > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n\n > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n\n > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important; // stylelint-disable-line declaration-no-important\n flex-direction: column;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n\n > .container > .navbar-nav .nav-item:first-child,\n > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n\n > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n }\n }\n }\n }\n}\n\n@include media-breakpoint-down(sm) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n","//\n// Tables\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-type\n// stylelint-disable selector-class-pattern\n\n// Change the table states color\n@mixin table-row-variant-border($state, $color) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $color;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($color, 5%);\n }\n }\n}\n\n.table {\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n border-bottom: 1px solid $table-border-color;\n\n > th,\n > td {\n font-size: $font-size-sm;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n }\n\n > th:first-child,\n > td:first-child {\n padding-left: .625rem;\n }\n\n [class^=\"icon-\"],\n [class*=\" icon-\"] {\n font-size: 1.8125rem;\n }\n\n [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n }\n\n [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n }\n }\n }\n\n thead {\n\n\n > tr {\n border-bottom-width: 2px;\n\n > th {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n }\n }\n }\n\n tbody > th {\n font-weight: $font-weight-normal;\n }\n\n &.has-checkbox {\n tr.selected {\n > td,\n > th {\n background-color: $gray-400;\n }\n }\n\n tr > th:first-child,\n tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n }\n }\n\n &.has-icon {\n tr > td,\n tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n\n span,\n img {\n vertical-align: middle;\n }\n\n img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n }\n\n [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n }\n }\n }\n\n // &.has-status {\n // thead th:not(:first-child),\n // tr > td {\n // text-align: center;\n // }\n // }\n\n &.table-reflow {\n thead,\n tbody, {\n > tr {\n border: 0;\n }\n\n > tr > td {\n line-height: 1.25rem;\n }\n\n > tr > th:first-child {\n border-bottom: 2px solid $table-border-color;\n }\n\n > tr > th,\n > tr > td {\n border-bottom: 1px solid $table-border-color;\n }\n\n > tr > td:last-child {\n border-right: 0;\n }\n }\n\n thead > tr {\n border: 0;\n\n > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid $table-border-color;\n }\n\n > th:last-child {\n border-right: 0;\n }\n }\n\n tbody {\n > tr > th:first-child {\n padding-left: 0;\n }\n }\n }\n}\n\n@include table-row-variant-border(success, theme-color(\"success\"));\n@include table-row-variant-border(info, theme-color(\"info\"));\n@include table-row-variant-border(warning, theme-color(\"warning\"));\n@include table-row-variant-border(danger, theme-color(\"danger\"));\n\n\n// force caption for tables\ncaption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n// Style jquery tablesorter ext\n// scss-lint:disable SelectorFormat\n//\n// Table sorter\n//\n\n.tablesorter {\n caption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n background-color: #fff;\n }\n\n th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n\n &.header {\n position: relative;\n }\n\n .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n }\n\n &.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n transform: rotate(180deg);\n }\n\n &.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &.tablesorter-headerUnSorted {\n .tablesorter-header-inner:hover span::after,\n .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $o-sortable-hover-icon;\n }\n }\n\n a {\n color: #000;\n text-decoration: none;\n\n @include hover-focus {\n color: theme-color(\"primary\");\n text-decoration: underline;\n }\n }\n }\n\n td {\n text-align: left;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n.modal {\n\n .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n }\n\n .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n\n .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n\n\n .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n }\n }\n }\n\n .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n\n .card,\n .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n }\n\n .card-body {\n padding: 0;\n }\n\n .card-icon {\n margin-right: 1.25rem;\n }\n\n [class^=\"svg\"],\n [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n }\n\n [class^=\"svg\"] {\n display: block;\n }\n\n [class^=\"svg\"]::after {\n top: auto;\n }\n\n .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n }\n }\n\n .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n\n .btn + .btn {\n margin-left: 1.25rem;\n }\n }\n}\n\n@include media-breakpoint-down(xs) {\n .modal {\n .modal-content {\n padding: 1.25rem;\n }\n\n .modal-header {\n margin: 0;\n }\n\n .modal-body {\n .card {\n flex-direction: column;\n }\n\n .card-icon {\n align-self: center;\n margin-right: 0;\n }\n\n .card-icon,\n [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n\n .card-title {\n font-size: 1rem;\n }\n\n .card-body {\n margin-top: 1.25rem;\n }\n }\n\n .modal-footer {\n align-self: center;\n }\n }\n}\n","// Base nav\n.nav {\n .nav-item:first-child {\n margin-left: - ($spacer * .5);\n }\n\n &.flex-column .nav-item:first-child {\n margin-left: 0;\n }\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n line-height: 1.25rem;\n }\n}\n\n// Boosted Mod\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid $gray-600;\n}\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n// End mod\n\n//\n// classic tab\n//\n\n.nav-tabs {\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n\n .nav-link:not(.disabled) {\n &,\n &.dropdown-toggle {\n @include focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n }\n }\n\n + .nav-link {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n}\n\n// Responsive tabs\n//\n//\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n\n .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n\n &:first-child {\n margin-left: 0;\n border-top: 0;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n }\n\n &[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n }\n\n &:focus {\n outline-offset: -4px;\n }\n\n &:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n }\n }\n\n .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n\n &.show {\n display: block;\n }\n }\n\n @include media-breakpoint-down(sm) {\n .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n\n &[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n\n &:active {\n color: #fff;\n background-color: #f16e00;\n }\n }\n }\n\n &.accordion-layout {\n display: block;\n\n .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n\n &:focus {\n outline-offset: 0;\n }\n\n &:hover {\n color: #f16e00;\n background-color: #fff;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n\n &[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n\n &:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n\n &::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n }\n\n .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n }\n }\n}\n\n// Pills\n// -------------------------\n.nav-pills {\n &.nav-stacked .nav-item {\n margin: 0;\n\n + .nav-item {\n margin-left: 0;\n }\n }\n\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: ($grid-gutter-width / 4);\n }\n }\n\n .nav-link {\n @include active {\n background-color: $nav-pills-link-active-bg;\n }\n\n @include hover {\n color: $nav-pills-link-active-color;\n cursor: default;\n background-color: $nav-pills-link-active-bg;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n @include focus {\n color: $nav-pills-focus-link-color;\n background-color: $nav-pills-focus-link-bg;\n outline: none;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n padding-top: $spacer;\n padding-bottom: $spacer;\n }\n .dropdown-menu {\n right: 0;\n left: auto;\n\n .nav-item {\n margin: 0;\n\n .nav-link {\n @include focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n }\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n\n .tab-pane p {\n margin-bottom: 0;\n }\n}\n\n.tab-content-clear {\n // padding: 1.125rem;\n border: 0;\n}\n\n// breadcrums\n\n.breadcrum {\n line-height: 1;\n}\n\n// priority nav\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important; // stylelint-disable-line declaration-no-important\n}\n\n.show-inline-block {\n display: inline-block !important; // stylelint-disable-line declaration-no-important\n}\n\n.overflow-nav-list {\n .nav-link {\n border: 0;\n &:focus {\n outline-offset: -2px;\n }\n }\n\n .nav-item:last-child {\n margin-bottom: 0;\n }\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n","//\n// Nav local\n//\n\n.o-nav-local {\n margin-bottom: ($spacer * 2);\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n\n > .container,\n > .container-fluid {\n display: flex;\n }\n\n ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n }\n\n .nav-item + .nav-item {\n margin-left: 1rem;\n }\n\n .nav.flex-column .nav-item {\n margin-left: 0;\n }\n\n .nav .nav-link,\n .nav .dropdown-toggle {\n @include focus {\n outline: 1px dotted;\n outline-offset: -1px;\n }\n display: inline-block;\n padding: 1rem ($nav-link-padding-x * .5) 1.125rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n .nav-link.active {\n color: theme-color(\"primary\");\n }\n\n .dropdown-toggle.show {\n color: #000;\n }\n\n .dropdown-menu {\n .nav-item,\n .nav-item + .nav-item {\n margin: 0;\n }\n\n .nav-link {\n @include focus {\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: $gray-900;\n border-bottom-color: $gray-900;\n\n .nav-link {\n @include hover-focus {\n color: theme-color(\"primary\");\n }\n\n &:focus {\n outline-color: #fff;\n }\n\n color: #fff;\n background-color: #000;\n\n &.active {\n color: theme-color(\"primary\");\n }\n }\n}\n\n",".skiplinks {\n z-index: 99999;\n}\n.skiplinks .skiplinks-section li {\n float: left;\n}\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: $font-weight-bold;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 $gray-500;\n border: 2px solid #000;\n @include border-radius(0);\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, .3);\n}\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: $font-weight-normal;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n","//\n// Footer\n//\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: $font-size-sm;\n font-weight: $font-weight-bold;\n color: #fff;\n background-color: #000;\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n font-size: $font-size-sm;\n line-height: 1.25rem;\n\n &:not(:hover),\n &:not([href]) {\n color: #fff;\n }\n }\n\n .o-footer-top,\n .o-footer-body,\n .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n }\n\n .o-footer-top {\n border-bottom: 1px solid $gray-900;\n }\n\n .o-footer-body {\n .row {\n margin-bottom: .625rem;\n }\n\n h2 {\n margin-top: .625rem;\n font-size: $font-size-sm;\n color: #fff;\n }\n\n p {\n &,\n a {\n color: #fff;\n }\n }\n\n .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n }\n }\n\n .o-footer-bottom {\n border-top: 1px solid $gray-900;\n }\n}\n","// small device display as card\n// stylelint-disable selector-no-qualifying-type\n@include media-breakpoint-down(md) {\n .o-responsive-table {\n thead {\n display: none;\n }\n tbody,\n tr,\n th,\n td {\n display: block;\n }\n // for tablet, display 2 cards by rows\n @include media-breakpoint-up(md) {\n tr {\n float: left;\n width: 45%;\n }\n tr:nth-child(odd) {\n margin-right: 10%;\n }\n }\n th,\n td {\n vertical-align: middle;\n }\n td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: $font-weight-bold;\n content: attr(data-title);\n }\n tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n tbody {\n th[scope=\"row\"] {\n font-weight: $font-weight-bold;\n border-top: 0;\n border-bottom: 2px solid $gray-500;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// o-scroll-up\n//\n//\n\n.o-scroll-up {\n .o-scroll-up-icon {\n &::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n }\n align-items: center;\n justify-content: center;\n float: right;\n width: $o-scroll-up-width;\n height: $o-scroll-up-height;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n\n /* rtl:ignore */\n transform: rotate(90deg);\n\n /* rtl:ignore */\n }\n\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: $zindex-o-scroll-up;\n display: none;\n // put a safety space between the right of the screen and the scroll link\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n right: $container-margin;\n }\n }\n @include media-breakpoint-up(xs) {\n bottom: .25rem;\n }\n @include media-breakpoint-up(sm) {\n bottom: .375rem;\n }\n @include media-breakpoint-up(md) {\n bottom: .75rem;\n }\n @include media-breakpoint-up(lg) {\n bottom: 2rem;\n }\n @include media-breakpoint-up(xl) {\n bottom: 2.5rem;\n }\n @include media-breakpoint-up(xxl) {\n bottom: 3.75rem;\n }\n\n .o-scroll-up-text {\n display: inline-block;\n padding: (($o-scroll-up-height - 1.25) / 2) .625rem;\n font-weight: $font-weight-bold;\n background-color: #fff;\n opacity: .8;\n }\n // custom class to allow a fixed position\n &.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n .o-scroll-up-text {\n float: left;\n }\n .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n }\n }\n\n @include hover-focus {\n color: $primary;\n .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n }\n }\n\n &:active .o-scroll-up-icon {\n color: #fff;\n background-color: $primary;\n border-color: $primary;\n }\n}\n","//\n// dropdown\n//\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: $font-weight-bold;\n\n &:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n }\n\n &:focus:hover {\n color: #fff;\n background-color: #000;\n }\n}\n","// stylelint-disable property-blacklist, font-family-no-missing-generic-family-keyword\n//\n// Carousel\n// --------------------------------------------------\n\n// native boostrap\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item {\n img {\n width: 100%;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n\n // Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n\n &::before {\n font-family: icon-orange;\n }\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n\n &:hover {\n cursor: default;\n }\n\n li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n\n &:hover {\n cursor: pointer;\n }\n\n &.active {\n background-color: theme-color(\"primary\"); // stylelint-disable-line selector-no-qualifying-type\n }\n }\n}\n\n// swiper\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n //Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important; // stylelint-disable-line declaration-no-important\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide {\n .card {\n border: 0;\n }\n\n .card-img {\n padding: 0;\n\n img {\n width: 100%;\n height: 40vh;\n }\n }\n\n .card-title {\n margin: 0;\n font-weight: $font-weight-bold;\n }\n\n .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n\n p {\n margin: 0;\n }\n }\n}\n\n@include media-breakpoint-down(md) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;/* used for displaying pagination outside of container */\n }\n\n .swiper-slide {\n width: 80%;\n\n // .card-link .card-body {\n // padding: 20px;\n // text-align: left;\n // }\n\n .card-img img {\n height: auto;\n }\n\n .card-body {\n position: static;\n }\n }\n\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n//\n\n// back from accessibility plugin css\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: theme-color(\"primary\");\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n//\n// Progress bar\n//\n\n.progress.progress-default {\n &[value]::-webkit-progress-value {\n background-color: theme-color(\"primary\");\n }\n\n &[value]::-moz-progress-bar {\n background-color: theme-color(\"primary\");\n }\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: ($grid-gutter-width * 1.5);\n}\n\n.hero-container .caption {\n margin: ($grid-gutter-width * 2.5) ($grid-gutter-width * 1.5);\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: theme-color(\"primary\");\n}\n\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/boosted.min.css b/dashboard/public/css/boosted.min.css
new file mode 100644
index 00000000..3f4910b8
--- /dev/null
+++ b/dashboard/public/css/boosted.min.css
@@ -0,0 +1,12 @@
+@charset "UTF-8";/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://getbootstrap.com)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */:root{--blue:#527edb;--indigo:#6610f2;--purple:#a885d8;--pink:#ffb4e6;--red:#cd3c14;--orange:#f16e00;--yellow:#fc0;--green:#32c832;--teal:#50be87;--cyan:#4bb4e6;--white:#fff;--gray:#999;--gray-dark:#595959;--primary:#f16e00;--secondary:#000;--success:#32c832;--info:#527edb;--warning:#fc0;--danger:#cd3c14;--light:#ddd;--dark:#000;--breakpoint-xs:0;--breakpoint-sm:480px;--breakpoint-md:768px;--breakpoint-lg:980px;--breakpoint-xl:1220px;--breakpoint-xxl:1380px;--font-family-sans-serif:"HelvNeueOrange","Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.25;color:#000;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:1.25rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#000;text-decoration:none;background-color:transparent}a:hover{color:#f16e00;text-decoration:none}p a{text-decoration:underline}p a:focus,p a:hover{text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.625rem .625rem .625rem 0;padding-bottom:.625rem .625rem .625rem 0;color:#666;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.625rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:1.25rem;font-family:inherit;font-weight:700;line-height:1.1;color:inherit}.h1,h1{font-size:2.125rem}.h2,h2{font-size:1.875rem}.h3,h3{font-size:1.5rem}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:1rem}@media (max-width:767.98px){.h1,h1{font-size:1.25rem}.h2,h2{font-size:1.125rem}.h3,h3{font-size:1rem}.h4,h4{font-size:.875rem}.h5,h5{font-size:.875rem}.h6,h6{font-size:.875rem}}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:3.75rem;font-weight:700;line-height:1.1}.display-2{font-size:3.125rem;font-weight:700;line-height:1.1}.display-3{font-size:2.5rem;font-weight:700;line-height:1.1}.display-4{font-size:2.125rem;font-weight:700;line-height:1.1}hr{margin-top:1.25rem;margin-bottom:1.25rem;border:0;border-top:1px solid #eee}.small,small{font-size:.875rem;font-weight:400}.mark,mark{padding:.2em;background-color:#f16e00}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.3125rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1.25rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875rem;color:#666}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.625rem;background-color:#fff;border:2px solid #000;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.625rem;line-height:1}.figure-caption{font-size:90%;color:#333}code{font-size:87.5%;color:#333;word-break:break-word}a>code{color:inherit}kbd{padding:.0625rem .0625rem;font-size:87.5%;color:#000;background-color:#eee}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#333}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:5px;padding-left:5px;margin-right:1.25%;margin-left:1.25%;max-width:312px;margin-right:auto;margin-left:auto;width:100%}@media (min-width:480px){.container{padding-right:5px;padding-left:5px}}@media (min-width:768px){.container{padding-right:10px;padding-left:10px}}@media (min-width:980px){.container{padding-right:10px;padding-left:10px}}@media (min-width:1220px){.container{padding-right:10px;padding-left:10px}}@media (min-width:1380px){.container{padding-right:10px;padding-left:10px}}.container .container-fluid{margin-right:auto;margin-left:auto}@media (min-width:480px){.container{margin-right:1.25%;margin-left:1.25%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:768px){.container{margin-right:1.5625%;margin-left:1.5625%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:980px){.container{margin-right:3.125%;margin-left:3.125%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1220px){.container{margin-right:3.125%;margin-left:3.125%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1380px){.container{margin-right:4.16667%;margin-left:4.16667%}.container .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:480px){.container{max-width:468px;margin-right:auto;margin-left:auto}}@media (min-width:768px){.container{max-width:744px;margin-right:auto;margin-left:auto}}@media (min-width:980px){.container{max-width:960px;margin-right:auto;margin-left:auto}}@media (min-width:1220px){.container{max-width:1200px;margin-right:auto;margin-left:auto}}@media (min-width:1380px){.container{max-width:1320px;margin-right:auto;margin-left:auto}}.container-fluid{margin-right:auto;margin-left:auto;padding-right:5px;padding-left:5px;margin-right:1.25%;margin-left:1.25%;width:auto}@media (min-width:480px){.container-fluid{padding-right:5px;padding-left:5px}}@media (min-width:768px){.container-fluid{padding-right:10px;padding-left:10px}}@media (min-width:980px){.container-fluid{padding-right:10px;padding-left:10px}}@media (min-width:1220px){.container-fluid{padding-right:10px;padding-left:10px}}@media (min-width:1380px){.container-fluid{padding-right:10px;padding-left:10px}}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}@media (min-width:480px){.container-fluid{margin-right:1.25%;margin-left:1.25%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:768px){.container-fluid{margin-right:1.5625%;margin-left:1.5625%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:980px){.container-fluid{margin-right:3.125%;margin-left:3.125%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1220px){.container-fluid{margin-right:3.125%;margin-left:3.125%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}@media (min-width:1380px){.container-fluid{margin-right:4.16667%;margin-left:4.16667%}.container-fluid .container-fluid{margin-right:auto;margin-left:auto}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}@media (min-width:480px){.row{margin-right:-5px;margin-left:-5px}}@media (min-width:768px){.row{margin-right:-10px;margin-left:-10px}}@media (min-width:980px){.row{margin-right:-10px;margin-left:-10px}}@media (min-width:1220px){.row{margin-right:-10px;margin-left:-10px}}@media (min-width:1380px){.row{margin-right:-10px;margin-left:-10px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{position:relative;width:100%;padding-right:5px;padding-left:5px}@media (min-width:480px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:5px;padding-left:5px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}@media (min-width:980px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}@media (min-width:1220px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}@media (min-width:1380px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto,.col-xxl,.col-xxl-1,.col-xxl-10,.col-xxl-11,.col-xxl-12,.col-xxl-2,.col-xxl-3,.col-xxl-4,.col-xxl-5,.col-xxl-6,.col-xxl-7,.col-xxl-8,.col-xxl-9,.col-xxl-auto{padding-right:10px;padding-left:10px}}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:480px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:980px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1220px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}@media (min-width:1380px){.col-xxl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xxl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xxl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xxl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xxl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xxl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xxl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xxl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xxl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xxl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xxl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xxl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xxl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xxl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xxl-first{-ms-flex-order:-1;order:-1}.order-xxl-last{-ms-flex-order:13;order:13}.order-xxl-0{-ms-flex-order:0;order:0}.order-xxl-1{-ms-flex-order:1;order:1}.order-xxl-2{-ms-flex-order:2;order:2}.order-xxl-3{-ms-flex-order:3;order:3}.order-xxl-4{-ms-flex-order:4;order:4}.order-xxl-5{-ms-flex-order:5;order:5}.order-xxl-6{-ms-flex-order:6;order:6}.order-xxl-7{-ms-flex-order:7;order:7}.order-xxl-8{-ms-flex-order:8;order:8}.order-xxl-9{-ms-flex-order:9;order:9}.order-xxl-10{-ms-flex-order:10;order:10}.order-xxl-11{-ms-flex-order:11;order:11}.order-xxl-12{-ms-flex-order:12;order:12}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.333333%}.offset-xxl-2{margin-left:16.666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.333333%}.offset-xxl-5{margin-left:41.666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.333333%}.offset-xxl-8{margin-left:66.666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.333333%}.offset-xxl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1.25rem;color:#000;background-color:#fff}.table td,.table th{padding:.625rem .625rem .625rem 0;vertical-align:top;border-top:1px solid #ccc}.table thead th{vertical-align:bottom;border-bottom:2px solid #ccc}.table tbody+tbody{border-top:2px solid #ccc}.table-sm td,.table-sm th{padding:.3125rem .3125rem .3125rem 0}.table-bordered{border:1px solid #ccc}.table-bordered td,.table-bordered th{border:1px solid #ccc}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:#f6f6f6}.table-hover tbody tr:hover{color:#000;background-color:#eee}.table-primary,.table-primary>td,.table-primary>th{background-color:#f16e00}.table-hover .table-primary:hover{background-color:#d86200}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#d86200}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#000;color:#fff}.table-hover .table-secondary:hover{background-color:#000}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#000}.table-success,.table-success>td,.table-success>th{background-color:#32c832}.table-hover .table-success:hover{background-color:#2db42d}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#2db42d}.table-info,.table-info>td,.table-info>th{background-color:#527edb}.table-hover .table-info:hover{background-color:#3d6ed7}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#3d6ed7}.table-warning,.table-warning>td,.table-warning>th{background-color:#fc0}.table-hover .table-warning:hover{background-color:#e6b800}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#e6b800}.table-danger,.table-danger>td,.table-danger>th{background-color:#cd3c14;color:#fff}.table-hover .table-danger:hover{background-color:#b63512}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#b63512}.table-light,.table-light>td,.table-light>th{background-color:#ddd}.table-hover .table-light:hover{background-color:#d0d0d0}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#d0d0d0}.table-dark,.table-dark>td,.table-dark>th{background-color:#000;color:#fff}.table-hover .table-dark:hover{background-color:#000}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#000}.table-active,.table-active>td,.table-active>th{background-color:#ddd}.table-hover .table-active:hover{background-color:#d0d0d0}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#d0d0d0}.table .thead-dark th{color:#fff;background-color:#000;border-color:#ccc}.table .thead-light th{color:#000;background-color:#fff;border-color:#ccc}.table-dark{color:#fff;background-color:#000}.table-dark td,.table-dark th,.table-dark thead th{border-color:#ccc}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:#333}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:#666}@media (max-width:479.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:979.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1219.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}@media (max-width:1379.98px){.table-responsive-xxl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xxl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}label{font-weight:700}label.disabled{color:#767676}label.is-required::after{margin-left:6px;font-weight:700;color:#f16e00;content:"*"}.form-control{display:block;width:100%;height:calc(2.25rem + 4px);padding:.5rem .625rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:700;line-height:1.25;color:#000;background-color:#fff;background-clip:padding-box;border:2px solid #ccc;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#000;background-color:#fff;border-color:#000;outline:0}.form-control::-webkit-input-placeholder{color:#666;opacity:1}.form-control::-moz-placeholder{color:#666;opacity:1}.form-control:-ms-input-placeholder{color:#666;opacity:1}.form-control::-ms-input-placeholder{color:#666;opacity:1}.form-control::placeholder{color:#666;opacity:1}.form-control:disabled,.form-control[readonly]{color:#666;background-color:#eee;opacity:1}select.form-control:focus::-ms-value{color:#000;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.5rem + 2px);padding-bottom:calc(.5rem + 2px);margin-bottom:0;font-size:inherit;line-height:1.25}.col-form-label-lg{padding-top:calc(.594rem + 2px);padding-bottom:calc(.594rem + 2px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.157rem + 2px);padding-bottom:calc(.157rem + 2px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;color:#000;background-color:transparent;border:solid transparent;border-width:2px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.6265rem + 4px);padding:.157rem .625rem;font-size:.875rem;line-height:1.5}.form-control-lg{height:calc(2.8755rem + 4px);padding:.594rem 1.25rem;font-size:1.125rem;line-height:1.5}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1.25rem}.form-text{display:block;margin-top:.625rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem;margin-bottom:.625rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#666}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.625rem;font-size:.875rem;font-weight:700}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.625rem .625rem;margin-top:.1rem;font-size:.875rem;line-height:1.25;color:#000;background-color:rgba(50,200,50,.9)}.form-control.is-valid,.was-validated .form-control:valid{border-color:#32c832}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#32c832}.form-control.is-valid~.valid-feedback,.was-validated .form-control:valid~.valid-feedback{position:relative;display:block;padding-left:1.625rem}.form-control.is-valid~.valid-feedback::after,.was-validated .form-control:valid~.valid-feedback::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E")}.form-control.is-valid~.valid-feedback::after,.was-validated .form-control:valid~.valid-feedback::after{position:absolute;top:-.1rem;left:0;width:1.125rem;height:1.125rem;content:"";background-repeat:no-repeat;background-size:cover}.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top calc(.3125em + .25rem) right calc(.3125em + .25rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#32c832;padding-right:3.1875rem;background:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat right .5rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.5rem/1.125rem 1.125rem}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#32c832}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#32c832}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#32c832}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#32c832}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#58d558;background-color:#58d558}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#32c832}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#32c832}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#32c832}.invalid-feedback{display:none;width:100%;margin-top:.625rem;font-size:.875rem;font-weight:700}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.625rem .625rem;margin-top:.1rem;font-size:.875rem;line-height:1.25;color:#fff;background-color:rgba(205,60,20,.9)}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#cd3c14}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#cd3c14}.form-control.is-invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-feedback{position:relative;display:block;padding-left:1.625rem}.form-control.is-invalid~.invalid-feedback::after,.was-validated .form-control:invalid~.invalid-feedback::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E")}.form-control.is-invalid~.invalid-feedback::after,.was-validated .form-control:invalid~.invalid-feedback::after{position:absolute;top:-.1rem;left:0;width:1.125rem;height:1.125rem;content:"";background-repeat:no-repeat;background-size:cover}.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top calc(.3125em + .25rem) right calc(.3125em + .25rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#cd3c14;padding-right:3.1875rem;background:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat right .5rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.5rem/1.125rem 1.125rem}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#cd3c14}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#cd3c14}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#cd3c14}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#cd3c14}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#ea532a;background-color:#ea532a}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#cd3c14}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#cd3c14}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#cd3c14}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:480px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:700;color:#000;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:2px solid transparent;padding:.5rem 1.125rem;font-size:1rem;line-height:1.25;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#000;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:1}a.btn{text-decoration:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary,.btn-warning{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-primary:focus,.btn-primary:hover,.btn-warning:focus,.btn-warning:hover{color:#fff;background-color:#000;border-color:#000}.btn-primary.disabled,.btn-primary:disabled,.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#fff;border-color:#000}.btn-primary.btn-inverse,.btn-warning.btn-inverse{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-primary.btn-inverse:focus,.btn-primary.btn-inverse:hover,.btn-warning.btn-inverse:focus,.btn-warning.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-primary.btn-inverse.disabled,.btn-primary.btn-inverse:disabled,.btn-warning.btn-inverse.disabled,.btn-warning.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-primary.btn-inverse:not(:disabled):not(.disabled).active,.btn-primary.btn-inverse:not(:disabled):not(.disabled):active,.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-primary.btn-inverse.dropdown-toggle,.show>.btn-warning.btn-inverse.dropdown-toggle{color:#fff;background-color:#000;border-color:#fff}.btn-light,.btn-secondary{color:#000;background-color:transparent;border-color:#000}.btn-light:focus,.btn-light:hover,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#000;border-color:#000}.btn-light.disabled,.btn-light:disabled,.btn-secondary.disabled,.btn-secondary:disabled{color:#ccc;background-color:transparent;border-color:#ccc}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-light.btn-inverse,.btn-secondary.btn-inverse{color:#000;background-color:#fff;border-color:#fff}.btn-light.btn-inverse:focus,.btn-light.btn-inverse:hover,.btn-secondary.btn-inverse:focus,.btn-secondary.btn-inverse:hover{color:#fff;background-color:#000;border-color:#fff}.btn-light.btn-inverse.disabled,.btn-light.btn-inverse:disabled,.btn-secondary.btn-inverse.disabled,.btn-secondary.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-light.btn-inverse:not(:disabled):not(.disabled).active,.btn-light.btn-inverse:not(:disabled):not(.disabled):active,.btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-light.btn-inverse.dropdown-toggle,.show>.btn-secondary.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-success{color:#000;background-color:#32c832;border-color:#32c832}.btn-success:focus,.btn-success:hover{color:#fff;background-color:#000;border-color:#000}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-success.btn-inverse{color:#000;background-color:#32c832;border-color:#32c832}.btn-success.btn-inverse:focus,.btn-success.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-success.btn-inverse.disabled,.btn-success.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-success.btn-inverse:not(:disabled):not(.disabled).active,.btn-success.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-success.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-dark,.btn-info{color:#fff;background-color:#000;border-color:#000}.btn-dark:focus,.btn-dark:hover,.btn-info:focus,.btn-info:hover{color:#000;background-color:#fff;border-color:#000}.btn-dark.disabled,.btn-dark:disabled,.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-dark.btn-inverse,.btn-info.btn-inverse{color:#fff;background-color:transparent;border-color:#fff}.btn-dark.btn-inverse:focus,.btn-dark.btn-inverse:hover,.btn-info.btn-inverse:focus,.btn-info.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-dark.btn-inverse.disabled,.btn-dark.btn-inverse:disabled,.btn-info.btn-inverse.disabled,.btn-info.btn-inverse:disabled{color:#666;background-color:transparent;border-color:#666}.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,.btn-info.btn-inverse:not(:disabled):not(.disabled).active,.btn-info.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-dark.btn-inverse.dropdown-toggle,.show>.btn-info.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-danger{color:#fff;background-color:#cd3c14;border-color:#cd3c14}.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#000;border-color:#000}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ccc;border-color:#ccc}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-danger.btn-inverse{color:#fff;background-color:#cd3c14;border-color:#cd3c14}.btn-danger.btn-inverse:focus,.btn-danger.btn-inverse:hover{color:#000;background-color:#fff;border-color:#fff}.btn-danger.btn-inverse.disabled,.btn-danger.btn-inverse:disabled{color:#000;background-color:#666;border-color:#666}.btn-danger.btn-inverse:not(:disabled):not(.disabled).active,.btn-danger.btn-inverse:not(:disabled):not(.disabled):active,.show>.btn-danger.btn-inverse.dropdown-toggle{color:#fff;background-color:#f16e00;border-color:#f16e00}.btn-outline-primary{color:#f16e00;border-color:#f16e00}.btn-outline-primary:focus,.btn-outline-primary:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#f16e00;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-secondary{color:#000;border-color:#000}.btn-outline-secondary:focus,.btn-outline-secondary:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#000;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-success{color:#32c832;border-color:#32c832}.btn-outline-success:focus,.btn-outline-success:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#32c832;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-info{color:#000;border-color:#000}.btn-outline-info:focus,.btn-outline-info:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#000;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-warning{color:#f16e00;border-color:#f16e00}.btn-outline-warning:focus,.btn-outline-warning:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f16e00;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-danger{color:#cd3c14;border-color:#cd3c14}.btn-outline-danger:focus,.btn-outline-danger:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#cd3c14;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-light{color:#ddd;border-color:#ddd}.btn-outline-light:focus,.btn-outline-light:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#ddd;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-outline-dark{color:#000;border-color:#000}.btn-outline-dark:focus,.btn-outline-dark:hover{color:#fff;background-color:#000;border-color:#000}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#000;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#000;background-color:#f16e00;border-color:#f16e00}.btn-link{color:#000}.btn-link.btn-inverse{color:#fff}.btn-link:hover{color:#f16e00;text-decoration:none}.btn-link.focus,.btn-link:focus{text-decoration:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#ccc;pointer-events:none}.btn-xlg{padding:.8125rem 1.25rem;font-size:1.25rem;line-height:1.5;border-radius:0}.btn-group-lg>.btn,.btn-lg{padding:.594rem 1.25rem;font-size:1.125rem;line-height:1.5;border-radius:0}.btn-group-sm>.btn,.btn-sm{padding:.157rem .625rem;font-size:.875rem;line-height:1.5;border-radius:0}.btn-mail{height:2.5rem;background-repeat:no-repeat}.btn-mail:focus,.btn-mail:hover{outline:0}.btn-mail-inverse{height:2.5rem;background-repeat:no-repeat}.btn-mail-inverse:focus,.btn-mail-inverse:hover{outline:0}.btn-lin{height:2.5rem;background-repeat:no-repeat}.btn-lin:focus,.btn-lin:hover{outline:0}.btn-lin-inverse{height:2.5rem;background-repeat:no-repeat}.btn-lin-inverse:focus,.btn-lin-inverse:hover{outline:0}.btn-gplus{height:2.5rem;background-repeat:no-repeat}.btn-gplus:focus,.btn-gplus:hover{outline:0}.btn-gplus-inverse{height:2.5rem;background-repeat:no-repeat}.btn-gplus-inverse:focus,.btn-gplus-inverse:hover{outline:0}.btn-tw{height:2.5rem;background-repeat:no-repeat}.btn-tw:focus,.btn-tw:hover{outline:0}.btn-tw-inverse{height:2.5rem;background-repeat:no-repeat}.btn-tw-inverse:focus,.btn-tw-inverse:hover{outline:0}.btn-fbk{height:2.5rem;background-repeat:no-repeat}.btn-fbk:focus,.btn-fbk:hover{outline:0}.btn-fbk-inverse{height:2.5rem;background-repeat:no-repeat}.btn-fbk-inverse:focus,.btn-fbk-inverse:hover{outline:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.4375rem;vertical-align:.21875rem;content:"";border-top:.4375rem solid;border-right:.4375rem solid transparent;border-bottom:0;border-left:.4375rem solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0 0;margin:-2px 0 0;font-size:1rem;color:#000;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:2px solid #000}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:480px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:980px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1220px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}@media (min-width:1380px){.dropdown-menu-xxl-left{right:auto;left:0}.dropdown-menu-xxl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:-2px}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.4375rem;vertical-align:.21875rem;content:"";border-top:0;border-right:.4375rem solid transparent;border-bottom:.4375rem solid;border-left:.4375rem solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:-2px}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.4375rem;vertical-align:.21875rem;content:"";border-top:.4375rem solid transparent;border-right:0;border-bottom:.4375rem solid transparent;border-left:.4375rem solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:-2px}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.4375rem;vertical-align:.21875rem;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.4375rem;vertical-align:.21875rem;content:"";border-top:.4375rem solid transparent;border-right:.4375rem solid;border-bottom:.4375rem solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.625rem 0;overflow:hidden;border-top:1px solid #eee}.dropdown-item{display:block;width:100%;padding:.625rem .625rem;clear:both;font-weight:400;color:#000;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#fff;text-decoration:none;background-color:#000}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#000}.dropdown-item.disabled,.dropdown-item:disabled{color:#666;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0 .625rem;margin-bottom:0;font-size:.875rem;color:#000;white-space:nowrap}.dropdown-item-text{display:block;padding:.625rem .625rem;color:#000}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-2px}.dropdown-toggle-split{padding-right:.84375rem;padding-left:.84375rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.46875rem;padding-left:.46875rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.9375rem;padding-left:.9375rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-2px}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-2px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-2px}.input-group-prepend{margin-right:-2px}.input-group-append{margin-left:-2px}.input-group-prepend+.form-control{border-left-color:transparent}.custom-select:focus+.input-group-append,.form-control:focus+.input-group-append{position:relative;z-index:5}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.5rem .625rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#000;text-align:center;white-space:nowrap;background-color:#eee;border:2px solid #ccc}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.8755rem + 4px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.594rem 1.25rem;font-size:1.125rem;line-height:1.5}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.6265rem + 4px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.157rem .625rem;font-size:.875rem;line-height:1.5}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.5rem}.custom-control{position:relative;display:block;min-height:1.25rem;padding-left:1.875rem;margin-bottom:.625rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1.25rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#f16e00;background-color:#f16e00}.custom-control-input:checked~.custom-control-label::before::before{background-color:#f16e00}.custom-control-input:focus~.custom-control-label::before{outline:dotted 1px #000;box-shadow:none}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#f16e00;border-color:#f16e00}.custom-control-input:disabled~.custom-control-label{color:#767676}.custom-control-input:disabled~.custom-control-label::before{border-color:#ccc}.custom-control-input:disabled:checked~.custom-control-label::before{background-color:#ccc}.custom-control-label{margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:0;left:0;display:block;width:1.25rem;height:1.25rem;content:"";background-color:#fff;border:#666 solid 2px}.custom-control-label::after{position:absolute;top:0;left:0;display:block;width:1.25rem;height:1.25rem;pointer-events:none;content:"";background-repeat:no-repeat;background-position:center center;background-size:1rem}.custom-checkbox .custom-control-input:not(:disabled):checked~.custom-control-label::before{border:2px solid #f16e00}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{top:.4rem;left:.2585rem;width:.8272rem;height:.3619rem;border:3px solid #fff;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-checkbox .custom-control-input:checked:focus~.custom-control-label::before{outline-color:#000}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#f16e00;background-color:#f16e00}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{border:3px solid #fff;border-top:none;border-right:none;border-left:none;-webkit-transform:scaleX(.5) translateY(-.5rem);transform:scaleX(.5) translateY(-.5rem)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#fff;border-color:#fff}.custom-radio .custom-control-input:checked~.custom-control-label::after{border:6px solid #f16e00;border-radius:50%}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::after{border-color:#ccc}.custom-switch{padding-left:4.375rem}.custom-switch .custom-control-input:focus~.custom-control-label::after{outline:1px dotted #fff}.custom-switch .custom-control-label{padding-top:.3125rem}.custom-switch .custom-control-label::before{left:0;width:3.75rem;height:1.875rem;pointer-events:all;background-color:#666;background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:1.975rem;border-radius:0}.custom-switch .custom-control-label::after{top:calc(0rem + 2px);left:2px;width:calc(3.75rem / 2 - 4px);height:calc(1.875rem - 4px);background-color:#fff;border-radius:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch.right{padding-right:4.375rem;padding-left:0}.custom-switch.right .custom-control-label::before{right:0;left:auto}.custom-switch.right .custom-control-label::after{right:calc(1.875rem + 2px);left:auto}.custom-switch .custom-control-input:checked~.custom-control-label::before{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:.25rem}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(1.875rem);transform:translateX(1.875rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#ccc}.custom-switch .custom-control-input:disabled~.custom-control-label::before{background-color:#ccc}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 4px);padding:.4375rem 1.5rem .4375rem .5rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:700;line-height:1.25;color:#000;vertical-align:middle;background:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e") no-repeat right .5rem center/8px 10px;background-color:#fff;border:2px solid #ccc;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#000;outline:0;box-shadow:none}.custom-select:focus::-ms-value{color:#000;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.5rem;background-image:none}.custom-select:disabled{color:#999;background-color:#eee}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.6265rem + 4px);padding-top:.157rem;padding-bottom:.157rem;padding-left:.625rem;font-size:.875rem}.custom-select-lg{height:calc(2.8755rem + 4px);padding-top:.594rem;padding-bottom:.594rem;padding-left:1.25rem;font-size:1.125rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 4px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 4px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#000;box-shadow:none}.custom-file-input:disabled~.custom-file-label{background-color:#eee}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 4px);padding:.5rem .625rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:700;line-height:1.25;color:#000;background-color:#fff;border:2px solid #ccc}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.5rem .625rem;line-height:1.25;color:#000;content:"Browse";background-color:#eee;border-left:inherit}.custom-range{width:100%;height:calc(1rem + .25rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .125rem #000}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .125rem #000}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .125rem #000}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#000;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#f16e00}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#999;border-color:transparent}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#000;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#f16e00}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#999;border-color:transparent}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.125rem;margin-left:.125rem;background-color:#000;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#f16e00}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#999}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#999}.custom-range:disabled::-webkit-slider-thumb{background-color:#ccc}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#ccc}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#ccc}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.625rem 1.25rem;font-weight:700}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#666;pointer-events:none;cursor:default}.nav-tabs{border-bottom:2px solid #000}.nav-tabs .nav-item{margin-bottom:-2px}.nav-tabs .nav-link{padding:.625rem calc(1.25rem - 2px);line-height:1rem;border:2px solid transparent;border-bottom-width:0}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{color:#fff;background-color:#000;border-color:#000}.nav-tabs .nav-link.disabled{color:#666;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#000;background-color:#fff;border-color:#000}.nav-tabs .dropdown-menu{margin-top:-2px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#000}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:0 0;font-weight:700}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding-right:0;padding-left:0}.navbar-brand{display:inline-block;-ms-flex-item-align:end;align-self:flex-end;padding-top:0;padding-bottom:0;margin:.625rem .3125rem;font-size:.875rem;font-weight:700;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand+.navbar-brand{margin-right:0;margin-left:1.25rem}.navbar-brand:focus{outline:1px dotted #fff;outline-offset:.625rem}.navbar-brand img{-ms-flex-wrap:wrap;flex-wrap:wrap;width:1.875rem;height:1.875rem;margin-top:0;margin-bottom:.25rem}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-top:auto;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-top:.875rem;padding-right:.625rem;padding-bottom:.875rem;padding-left:.625rem;margin-top:0}.navbar-nav .nav-link.active::before{display:none}.navbar-nav .nav-link.icon{padding:.78125rem .625rem;margin-top:0}.navbar-nav .nav-link[class^=svg-]{margin:.625rem}.navbar-nav .nav-link[role=menuitem]::before{float:right;margin-right:1rem;font-family:icon-orange;font-size:1rem;font-weight:400;color:#fff;content:"\e93e"}.navbar-nav .nav-link:focus{outline-offset:.625rem}.navbar-nav .dropdown-menu{position:static;top:2rem;float:none}.navbar-nav .nav-item{margin-left:0;font-size:1.125rem;border-top:1px solid #333}.navbar-nav .dropdown{padding:0}.navbar-nav .dropdown .dropdown-item,.navbar-nav .dropdown .dropdown-toggle{padding:.875rem 0 .875rem .625rem}.navbar-nav .dropdown.show .dropdown-toggle::after{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-nav .dropdown .dropdown-item{color:#fff;white-space:normal;background-color:#000;border-top:1px solid #333}.navbar-nav .dropdown .dropdown-item:focus{color:#f16e00}.navbar-text{display:inline-block;padding-top:.625rem;padding-bottom:.625rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-item-align:end;align-self:flex-end}.navbar-collapse .navbar-nav{-ms-flex-align:stretch;align-items:stretch}.navbar-toggler{padding:.5rem .5rem;margin:.3125rem 0;font-size:1rem;line-height:1;background-color:transparent;border:2px solid transparent}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none;background-color:#fff}.navbar-toggler:focus .navbar-toggler-icon,.navbar-toggler:hover .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-toggler:active{background-color:#f16e00}.navbar-toggler:active .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-toggler:focus{outline:0}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.25rem;height:1.25rem;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (min-width:480px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-sm .navbar-brand{margin:0 .625rem 0 0}.navbar-expand-sm .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-sm.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-sm.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-sm .navbar-nav .dropdown-item.active,.navbar-expand-sm .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-sm .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-sm .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-sm .navbar-nav .nav-link{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-left:1.25rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:10px;padding-left:10px}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-md .navbar-brand{margin:0 .625rem 0 0}.navbar-expand-md .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-md.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-md.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-md .navbar-nav .dropdown-item.active,.navbar-expand-md .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-md .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-md .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-md .navbar-nav .nav-link{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-left:1.25rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:10px;padding-left:10px}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:980px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-lg .navbar-brand{margin:0 .625rem 0 0}.navbar-expand-lg .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-lg.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-lg.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-lg .navbar-nav .dropdown-item.active,.navbar-expand-lg .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-lg .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-lg .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-lg .navbar-nav .nav-link{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-left:1.25rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:10px;padding-left:10px}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1220px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-xl .navbar-brand{margin:0 .625rem 0 0}.navbar-expand-xl .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-xl.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-xl.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-xl .navbar-nav .dropdown-item.active,.navbar-expand-xl .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-xl .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-xl .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-xl .navbar-nav .nav-link{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-left:1.25rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:10px;padding-left:10px}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1380px){.navbar-expand-xxl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand-xxl .navbar-brand{margin:0 .625rem 0 0}.navbar-expand-xxl .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand-xxl.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand-xxl.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand-xxl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand-xxl .navbar-nav .dropdown-item.active,.navbar-expand-xxl .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand-xxl .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand-xxl .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand-xxl .navbar-nav .nav-link{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-left:1.25rem}.navbar-expand-xxl>.container,.navbar-expand-xxl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:10px;padding-left:10px}.navbar-expand-xxl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;padding:1.5625rem 0 1.3125rem}.navbar-expand .navbar-brand{margin:0 .625rem 0 0}.navbar-expand .navbar-brand img{width:3.125rem;height:3.125rem}.navbar-expand.minimized{padding-top:1.25rem;padding-bottom:1rem}.navbar-expand.minimized .navbar-brand img{width:2.5rem;height:2.5rem}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-item{color:#000;background-color:#fff;border:0}.navbar-expand .navbar-nav .dropdown-item.active,.navbar-expand .navbar-nav .dropdown-item:hover{color:#fff;background-color:#000}.navbar-expand .navbar-nav .nav-item{font-size:1rem;border:0}.navbar-expand .navbar-nav .nav-item.dropdown{-ms-flex-item-align:end;align-self:flex-end}.navbar-expand .navbar-nav .nav-link{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;margin-left:1.25rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:10px;padding-left:10px}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:#000}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:#f16e00}.navbar-light .navbar-nav .nav-link{color:#000}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:#f16e00}.navbar-light .navbar-nav .nav-link.disabled{color:#ddd}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:#f16e00}.navbar-light .navbar-toggler{color:#000;border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#000}.navbar-light .navbar-text a{color:#f16e00}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:#f16e00}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#f16e00}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#f16e00}.navbar-dark .navbar-nav .nav-link.disabled{color:#ddd}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#f16e00}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#f16e00}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#f16e00}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:2px solid #000}.card>hr{margin-right:0;margin-left:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem;color:#000}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;font-weight:700;color:#fff;background-color:#000;border-bottom:2px solid #000}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:#fff;border-top:2px solid #000}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%}.card-img-top{width:100%}.card-img-bottom{width:100%}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:2.5rem}@media (min-width:480px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-2.5rem;margin-left:-2.5rem}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:2.5rem;margin-bottom:0;margin-left:2.5rem}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:10px}@media (min-width:480px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.card-columns .card{margin-bottom:2.5rem}@media (min-width:480px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card{margin-bottom:0;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc}.accordion .card~.card{border-top:0}.accordion .card-header{padding:0;background-color:#fff;border:0}.accordion .card-header,.accordion .card-header h5{margin:0;font-size:1rem;font-weight:700;line-height:1}.accordion .card-header a,.accordion .card-header button{position:relative;display:block;width:100%;padding:1rem 2.125rem 1rem 0;line-height:1.125rem;text-align:left;border:0}.accordion .card-header a::after,.accordion .card-header button::after{position:absolute;top:1.3125rem;right:.625rem;width:.875rem;height:.4375rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e")}.accordion .card-header a[aria-expanded=true]::after,.accordion .card-header button[aria-expanded=true]::after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.accordion .card-body{padding:0 1.5rem 0 0;margin:0 0 1.25rem}@media (max-width:767.98px){.accordion .card{border-top-width:2px;border-bottom-width:2px}.accordion .card~.card{border-top:0}}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.625rem 0;font-size:.875rem;font-weight:700;line-height:1.428571;list-style:none;background-color:#fff}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.625rem;padding-left:.625rem;font-family:icon-orange;font-size:.625rem;line-height:1;color:#000;content:""}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#f16e00}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;min-width:2.5rem;min-height:2.5rem;padding:.625rem .8rem;margin-left:0;font-weight:700;line-height:1;color:#000;background-color:#fff;border:2px solid transparent}.page-link:focus,.page-link:hover{z-index:2;color:#000;text-decoration:none;background-color:#fff;border-color:#ccc}.page-link:focus span,.page-link:hover span{color:#000}.page-link:focus{z-index:2;outline:0;box-shadow:none}.page-link span{color:#fff}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item.presentation{padding:.625rem 0;font-weight:700}.page-item.presentation+.page-item .page-link,.page-item:first-child .page-link{margin-left:0;border-color:#000}.page-item.presentation+.page-item .page-link::before,.page-item:first-child .page-link::before{position:absolute;top:.6875rem;left:.8125rem;width:.5625rem;height:.875rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e");background-repeat:no-repeat}.page-item.presentation+.page-item .page-link:focus::before,.page-item.presentation+.page-item .page-link:hover::before,.page-item:first-child .page-link:focus::before,.page-item:first-child .page-link:hover::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item.presentation+.page-item .page-link.has-label,.page-item:first-child .page-link.has-label{padding-right:1.125rem;padding-left:2rem}.page-item.presentation+.page-item .page-link:focus,.page-item.presentation+.page-item .page-link:hover,.page-item:first-child .page-link:focus,.page-item:first-child .page-link:hover,.page-item:last-child .page-link:focus,.page-item:last-child .page-link:hover{color:#fff;background-color:#000;border-color:#000}.page-item.presentation+.page-item .page-link:active,.page-item:first-child .page-link:active,.page-item:last-child .page-link:active{z-index:1;color:#fff;background-color:#f16e00;border-color:#f16e00}.page-item:last-child .page-link{border-color:#000}.page-item:last-child .page-link::before{position:absolute;top:.6875rem;right:.8125rem;width:.5625rem;height:.875rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e");background-repeat:no-repeat}.page-item:last-child .page-link:focus::before,.page-item:last-child .page-link:hover::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item:last-child .page-link.has-label{padding-right:2rem;padding-left:1.125rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#000;border-color:#000}.page-item .page-link:active{z-index:1;color:#fff;background-color:#f16e00;border-color:#f16e00}.page-item.active:first-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item.active:last-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e")}.page-item.disabled .page-link{color:#ccc;pointer-events:none;cursor:auto;background-color:#fff;border-color:#ccc}.page-item.disabled:first-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e")}.page-item.disabled:last-child .page-link::before{background-image:url("data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e")}.page-item+.page-item{margin-left:.625rem}.pagination-lg .page-link{min-width:3.125rem;min-height:3.125rem;padding:.875rem 1.125rem;font-size:1.125rem;line-height:1.111111}.pagination-lg .page-item:first-child .page-link::before,.pagination-lg .page-item:last-child .page-link::before{top:1.03125rem}.pagination-sm .page-link{min-width:1.875rem;min-height:1.875rem;padding:.375rem .625rem;font-size:.875rem;line-height:1.428571}.pagination-sm .page-item:first-child .page-link::before,.pagination-sm .page-item:last-child .page-link::before{top:.53125rem}.badge{display:inline-block;padding:.1875rem .625rem;font-size:.875rem;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.625rem;padding-left:.625rem}.badge-primary{color:#fff;background-color:#f16e00}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#be5700}.badge-secondary{color:#fff;background-color:#000}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#000}.badge-success{color:#000;background-color:#32c832}a.badge-success:focus,a.badge-success:hover{color:#000;background-color:#289f28}.badge-info{color:#000;background-color:#527edb}a.badge-info:focus,a.badge-info:hover{color:#000;background-color:#2b60cf}.badge-warning{color:#000;background-color:#fc0}a.badge-warning:focus,a.badge-warning:hover{color:#000;background-color:#cca300}.badge-danger{color:#fff;background-color:#cd3c14}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#9f2e0f}.badge-light{color:#000;background-color:#ddd}a.badge-light:focus,a.badge-light:hover{color:#000;background-color:#c4c4c4}.badge-dark{color:#fff;background-color:#000}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#000}.badge[href]:focus{outline-color:#fff;outline-offset:-1px}.badge[href]:focus.badge-light{outline-color:#000}.jumbotron{padding:2.5rem 1.25rem;margin-bottom:2.5rem;color:#000;background-color:#fff}@media (min-width:480px){.jumbotron{padding:5rem 2.5rem}}.jumbotron-fluid{padding-right:0;padding-left:0}.alert{position:relative;padding:.8125rem 1.25rem;margin-bottom:1.25rem;border:0 solid transparent}.alert .alert-icon{position:absolute;top:.625rem}.alert .alert-icon::after{width:1.76rem;height:1.76rem;background-repeat:no-repeat;background-size:cover}.alert-sm{padding:.3125rem 1.25rem}.alert-sm .alert-icon{top:.4375rem}.alert-sm .alert-icon::after{width:1rem;height:1rem}.alert-lg{padding:1rem 1.25rem}.alert-lg .alert-icon{top:.625rem}.alert-lg .alert-icon::after{width:2rem;height:2rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.8125rem 1.25rem;line-height:.8125rem;color:inherit}.alert-primary{color:#000;background-color:#f16e00;border-color:#f16e00}.alert-primary hr{border-top-color:#d86200}.alert-primary .alert-link{color:#000}.alert-secondary{color:#fff;background-color:#000;border-color:#000}.alert-secondary hr{border-top-color:#000}.alert-secondary .alert-link{color:#e6e6e6}.alert-success{color:#000;background-color:#32c832;border-color:#32c832}.alert-success hr{border-top-color:#2db42d}.alert-success .alert-link{color:#000}.alert-info{color:#000;background-color:#527edb;border-color:#527edb}.alert-info hr{border-top-color:#3d6ed7}.alert-info .alert-link{color:#000}.alert-warning{color:#000;background-color:#fc0;border-color:#fc0}.alert-warning hr{border-top-color:#e6b800}.alert-warning .alert-link{color:#000}.alert-danger{color:#fff;background-color:#cd3c14;border-color:#cd3c14}.alert-danger hr{border-top-color:#b63512}.alert-danger .alert-link{color:#e6e6e6}.alert-light{color:#000;background-color:#ddd;border-color:#ddd}.alert-light hr{border-top-color:#d0d0d0}.alert-light .alert-link{color:#000}.alert-dark{color:#fff;background-color:#000;border-color:#000}.alert-dark hr{border-top-color:#000}.alert-dark .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:1.25rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1.25rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1.25rem;overflow:hidden;font-size:1rem;background-color:#ccc}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#000;text-align:center;white-space:nowrap;background-color:#f16e00;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}@media (max-width:979.98px){.progress{width:100%;height:.625rem;line-height:.625rem}.progress-bar{font-size:.875rem;line-height:.625rem}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1.25rem 1.25rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#000;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#f16e00;text-decoration:none;background-color:#f6f6f6}.list-group-item-action:active{color:#000;background-color:#eee}.list-group-item{position:relative;display:block;padding:.625rem .625rem;margin-bottom:-2px;color:#000;background-color:#fff;border:2px solid #000}.list-group-item:last-child{margin-bottom:0}.list-group-item.disabled,.list-group-item:disabled{color:#ccc;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#000;border-color:#000}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-2px;margin-bottom:0}.list-group-horizontal .list-group-item:last-child{margin-right:0}@media (min-width:480px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-2px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-2px;margin-bottom:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0}}@media (min-width:980px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-2px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0}}@media (min-width:1220px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-2px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0}}@media (min-width:1380px){.list-group-horizontal-xxl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xxl .list-group-item{margin-right:-2px;margin-bottom:0}.list-group-horizontal-xxl .list-group-item:last-child{margin-right:0}}.list-group-flush .list-group-item{border-right:0;border-left:0}.list-group-flush .list-group-item:last-child{margin-bottom:-2px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#000;background-color:#f16e00}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#000;background-color:#d86200}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-secondary{color:#fff;background-color:#000}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#fff;background-color:#000}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-success{color:#000;background-color:#32c832}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#000;background-color:#2db42d}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-info{color:#000;background-color:#527edb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#000;background-color:#3d6ed7}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-warning{color:#000;background-color:#fc0}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#000;background-color:#e6b800}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-danger{color:#000;background-color:#cd3c14}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#000;background-color:#b63512}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-light{color:#000;background-color:#ddd}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#000;background-color:#d0d0d0}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-dark{color:#fff;background-color:#000}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#fff;background-color:#000}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:1}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:1}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:none;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0}.toast:not(:last-child){margin-bottom:.625rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.3125rem .625rem;color:#999;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.625rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.625rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1.25rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1.25rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1.25rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1.25rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;color:#000;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:2px solid #000;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#333}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:.625rem .625rem;border-bottom:2px solid #000}.modal-header .close{padding:.625rem .625rem;margin:-.625rem -.625rem -.625rem auto}.modal-title{margin-bottom:0;line-height:1.25}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:.625rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.625rem;border-top:2px solid #000}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:480px){.modal-dialog{max-width:700px;margin:1.875rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.75rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.75rem)}.modal-dialog-centered{min-height:calc(100% - 3.75rem)}.modal-dialog-centered::before{height:calc(100vh - 3.75rem)}.modal-sm{max-width:300px}}@media (min-width:980px){.modal-lg,.modal-xl{max-width:700px}}@media (min-width:1220px){.modal-xl{max-width:700px}}.tooltip{position:absolute;z-index:1070;display:block;margin:.3125rem;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.25;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;font-weight:700;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.625rem;height:.625rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.625rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.625rem .3125rem 0;border-top-color:#ddd}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .625rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.625rem;height:.625rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.3125rem .625rem .3125rem 0;border-right-color:#ddd}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.625rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .3125rem .625rem;border-bottom-color:#ddd}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .625rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.625rem;height:.625rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.3125rem 0 .3125rem .625rem;border-left-color:#ddd}.tooltip-inner{max-width:200px;padding:1.25rem 1.25rem;color:#000;text-align:center;background-color:#ddd}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:HelvNeueOrange,"Helvetica Neue",Helvetica,Arial,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.25;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;font-weight:700;word-wrap:break-word;background-color:#ddd;background-clip:padding-box;border:2px solid #ddd}.popover .arrow{position:absolute;display:block;width:.625rem;height:.3125rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.3125rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.3125rem + 2px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.3125rem .3125rem 0;border-top-color:#ddd}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:2px;border-width:.3125rem .3125rem 0;border-top-color:#ddd}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.3125rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.3125rem + 2px) * -1);width:.3125rem;height:.625rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.3125rem .3125rem .3125rem 0;border-right-color:#ddd}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:2px;border-width:.3125rem .3125rem .3125rem 0;border-right-color:#ddd}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.3125rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.3125rem + 2px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .3125rem .3125rem .3125rem;border-bottom-color:#ddd}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:2px;border-width:0 .3125rem .3125rem .3125rem;border-bottom-color:#ddd}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:.625rem;margin-left:-.3125rem;content:"";border-bottom:2px solid #ddd}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.3125rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.3125rem + 2px) * -1);width:.3125rem;height:.625rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.3125rem 0 .3125rem .3125rem;border-left-color:#ddd}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:2px;border-width:.3125rem 0 .3125rem .3125rem;border-left-color:#ddd}.popover-header{padding:.625rem .625rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#ddd;border-bottom:2px solid #d0d0d0}.popover-header:empty{display:none}.popover-body{padding:.625rem .625rem;color:#000}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:1.875rem;color:#000;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#000;text-decoration:none;outline:2px dotted #000;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:1.875rem;margin-left:1.875rem;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#f16e00;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#000;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#f16e00!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#be5700!important}.bg-secondary{background-color:#000!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#000!important}.bg-success{background-color:#32c832!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#289f28!important}.bg-info{background-color:#527edb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#2b60cf!important}.bg-warning{background-color:#fc0!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#cca300!important}.bg-danger{background-color:#cd3c14!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#9f2e0f!important}.bg-light{background-color:#ddd!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#c4c4c4!important}.bg-dark{background-color:#000!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#000!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:2px solid #000!important}.border-top{border-top:2px solid #000!important}.border-right{border-right:2px solid #000!important}.border-bottom{border-bottom:2px solid #000!important}.border-left{border-left:2px solid #000!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#f16e00!important}.border-secondary{border-color:#000!important}.border-success{border-color:#32c832!important}.border-info{border-color:#527edb!important}.border-warning{border-color:#fc0!important}.border-danger{border-color:#cd3c14!important}.border-light{border-color:#ddd!important}.border-dark{border-color:#000!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:480px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:980px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1220px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1380px){.d-xxl-none{display:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:-ms-flexbox!important;display:flex!important}.d-xxl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:480px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:980px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1220px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1380px){.flex-xxl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xxl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xxl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xxl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xxl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xxl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xxl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xxl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xxl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xxl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xxl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xxl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xxl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xxl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xxl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xxl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xxl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xxl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xxl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xxl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xxl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xxl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xxl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xxl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xxl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xxl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xxl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xxl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xxl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xxl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xxl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xxl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xxl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:480px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:980px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1220px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}@media (min-width:1380px){.float-xxl-left{float:left!important}.float-xxl-right{float:right!important}.float-xxl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.3125rem!important}.mt-1,.my-1{margin-top:.3125rem!important}.mr-1,.mx-1{margin-right:.3125rem!important}.mb-1,.my-1{margin-bottom:.3125rem!important}.ml-1,.mx-1{margin-left:.3125rem!important}.m-2{margin:.625rem!important}.mt-2,.my-2{margin-top:.625rem!important}.mr-2,.mx-2{margin-right:.625rem!important}.mb-2,.my-2{margin-bottom:.625rem!important}.ml-2,.mx-2{margin-left:.625rem!important}.m-3{margin:1.25rem!important}.mt-3,.my-3{margin-top:1.25rem!important}.mr-3,.mx-3{margin-right:1.25rem!important}.mb-3,.my-3{margin-bottom:1.25rem!important}.ml-3,.mx-3{margin-left:1.25rem!important}.m-4{margin:1.875rem!important}.mt-4,.my-4{margin-top:1.875rem!important}.mr-4,.mx-4{margin-right:1.875rem!important}.mb-4,.my-4{margin-bottom:1.875rem!important}.ml-4,.mx-4{margin-left:1.875rem!important}.m-5{margin:3.75rem!important}.mt-5,.my-5{margin-top:3.75rem!important}.mr-5,.mx-5{margin-right:3.75rem!important}.mb-5,.my-5{margin-bottom:3.75rem!important}.ml-5,.mx-5{margin-left:3.75rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.3125rem!important}.pt-1,.py-1{padding-top:.3125rem!important}.pr-1,.px-1{padding-right:.3125rem!important}.pb-1,.py-1{padding-bottom:.3125rem!important}.pl-1,.px-1{padding-left:.3125rem!important}.p-2{padding:.625rem!important}.pt-2,.py-2{padding-top:.625rem!important}.pr-2,.px-2{padding-right:.625rem!important}.pb-2,.py-2{padding-bottom:.625rem!important}.pl-2,.px-2{padding-left:.625rem!important}.p-3{padding:1.25rem!important}.pt-3,.py-3{padding-top:1.25rem!important}.pr-3,.px-3{padding-right:1.25rem!important}.pb-3,.py-3{padding-bottom:1.25rem!important}.pl-3,.px-3{padding-left:1.25rem!important}.p-4{padding:1.875rem!important}.pt-4,.py-4{padding-top:1.875rem!important}.pr-4,.px-4{padding-right:1.875rem!important}.pb-4,.py-4{padding-bottom:1.875rem!important}.pl-4,.px-4{padding-left:1.875rem!important}.p-5{padding:3.75rem!important}.pt-5,.py-5{padding-top:3.75rem!important}.pr-5,.px-5{padding-right:3.75rem!important}.pb-5,.py-5{padding-bottom:3.75rem!important}.pl-5,.px-5{padding-left:3.75rem!important}.m-n1{margin:-.3125rem!important}.mt-n1,.my-n1{margin-top:-.3125rem!important}.mr-n1,.mx-n1{margin-right:-.3125rem!important}.mb-n1,.my-n1{margin-bottom:-.3125rem!important}.ml-n1,.mx-n1{margin-left:-.3125rem!important}.m-n2{margin:-.625rem!important}.mt-n2,.my-n2{margin-top:-.625rem!important}.mr-n2,.mx-n2{margin-right:-.625rem!important}.mb-n2,.my-n2{margin-bottom:-.625rem!important}.ml-n2,.mx-n2{margin-left:-.625rem!important}.m-n3{margin:-1.25rem!important}.mt-n3,.my-n3{margin-top:-1.25rem!important}.mr-n3,.mx-n3{margin-right:-1.25rem!important}.mb-n3,.my-n3{margin-bottom:-1.25rem!important}.ml-n3,.mx-n3{margin-left:-1.25rem!important}.m-n4{margin:-1.875rem!important}.mt-n4,.my-n4{margin-top:-1.875rem!important}.mr-n4,.mx-n4{margin-right:-1.875rem!important}.mb-n4,.my-n4{margin-bottom:-1.875rem!important}.ml-n4,.mx-n4{margin-left:-1.875rem!important}.m-n5{margin:-3.75rem!important}.mt-n5,.my-n5{margin-top:-3.75rem!important}.mr-n5,.mx-n5{margin-right:-3.75rem!important}.mb-n5,.my-n5{margin-bottom:-3.75rem!important}.ml-n5,.mx-n5{margin-left:-3.75rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:480px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.3125rem!important}.mt-sm-1,.my-sm-1{margin-top:.3125rem!important}.mr-sm-1,.mx-sm-1{margin-right:.3125rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.3125rem!important}.ml-sm-1,.mx-sm-1{margin-left:.3125rem!important}.m-sm-2{margin:.625rem!important}.mt-sm-2,.my-sm-2{margin-top:.625rem!important}.mr-sm-2,.mx-sm-2{margin-right:.625rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.625rem!important}.ml-sm-2,.mx-sm-2{margin-left:.625rem!important}.m-sm-3{margin:1.25rem!important}.mt-sm-3,.my-sm-3{margin-top:1.25rem!important}.mr-sm-3,.mx-sm-3{margin-right:1.25rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1.25rem!important}.ml-sm-3,.mx-sm-3{margin-left:1.25rem!important}.m-sm-4{margin:1.875rem!important}.mt-sm-4,.my-sm-4{margin-top:1.875rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.875rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.875rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.875rem!important}.m-sm-5{margin:3.75rem!important}.mt-sm-5,.my-sm-5{margin-top:3.75rem!important}.mr-sm-5,.mx-sm-5{margin-right:3.75rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3.75rem!important}.ml-sm-5,.mx-sm-5{margin-left:3.75rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.3125rem!important}.pt-sm-1,.py-sm-1{padding-top:.3125rem!important}.pr-sm-1,.px-sm-1{padding-right:.3125rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.3125rem!important}.pl-sm-1,.px-sm-1{padding-left:.3125rem!important}.p-sm-2{padding:.625rem!important}.pt-sm-2,.py-sm-2{padding-top:.625rem!important}.pr-sm-2,.px-sm-2{padding-right:.625rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.625rem!important}.pl-sm-2,.px-sm-2{padding-left:.625rem!important}.p-sm-3{padding:1.25rem!important}.pt-sm-3,.py-sm-3{padding-top:1.25rem!important}.pr-sm-3,.px-sm-3{padding-right:1.25rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1.25rem!important}.pl-sm-3,.px-sm-3{padding-left:1.25rem!important}.p-sm-4{padding:1.875rem!important}.pt-sm-4,.py-sm-4{padding-top:1.875rem!important}.pr-sm-4,.px-sm-4{padding-right:1.875rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.875rem!important}.pl-sm-4,.px-sm-4{padding-left:1.875rem!important}.p-sm-5{padding:3.75rem!important}.pt-sm-5,.py-sm-5{padding-top:3.75rem!important}.pr-sm-5,.px-sm-5{padding-right:3.75rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3.75rem!important}.pl-sm-5,.px-sm-5{padding-left:3.75rem!important}.m-sm-n1{margin:-.3125rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.3125rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.3125rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.3125rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.3125rem!important}.m-sm-n2{margin:-.625rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.625rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.625rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.625rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.625rem!important}.m-sm-n3{margin:-1.25rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1.25rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1.25rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1.25rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1.25rem!important}.m-sm-n4{margin:-1.875rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.875rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.875rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.875rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.875rem!important}.m-sm-n5{margin:-3.75rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3.75rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3.75rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3.75rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3.75rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.3125rem!important}.mt-md-1,.my-md-1{margin-top:.3125rem!important}.mr-md-1,.mx-md-1{margin-right:.3125rem!important}.mb-md-1,.my-md-1{margin-bottom:.3125rem!important}.ml-md-1,.mx-md-1{margin-left:.3125rem!important}.m-md-2{margin:.625rem!important}.mt-md-2,.my-md-2{margin-top:.625rem!important}.mr-md-2,.mx-md-2{margin-right:.625rem!important}.mb-md-2,.my-md-2{margin-bottom:.625rem!important}.ml-md-2,.mx-md-2{margin-left:.625rem!important}.m-md-3{margin:1.25rem!important}.mt-md-3,.my-md-3{margin-top:1.25rem!important}.mr-md-3,.mx-md-3{margin-right:1.25rem!important}.mb-md-3,.my-md-3{margin-bottom:1.25rem!important}.ml-md-3,.mx-md-3{margin-left:1.25rem!important}.m-md-4{margin:1.875rem!important}.mt-md-4,.my-md-4{margin-top:1.875rem!important}.mr-md-4,.mx-md-4{margin-right:1.875rem!important}.mb-md-4,.my-md-4{margin-bottom:1.875rem!important}.ml-md-4,.mx-md-4{margin-left:1.875rem!important}.m-md-5{margin:3.75rem!important}.mt-md-5,.my-md-5{margin-top:3.75rem!important}.mr-md-5,.mx-md-5{margin-right:3.75rem!important}.mb-md-5,.my-md-5{margin-bottom:3.75rem!important}.ml-md-5,.mx-md-5{margin-left:3.75rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.3125rem!important}.pt-md-1,.py-md-1{padding-top:.3125rem!important}.pr-md-1,.px-md-1{padding-right:.3125rem!important}.pb-md-1,.py-md-1{padding-bottom:.3125rem!important}.pl-md-1,.px-md-1{padding-left:.3125rem!important}.p-md-2{padding:.625rem!important}.pt-md-2,.py-md-2{padding-top:.625rem!important}.pr-md-2,.px-md-2{padding-right:.625rem!important}.pb-md-2,.py-md-2{padding-bottom:.625rem!important}.pl-md-2,.px-md-2{padding-left:.625rem!important}.p-md-3{padding:1.25rem!important}.pt-md-3,.py-md-3{padding-top:1.25rem!important}.pr-md-3,.px-md-3{padding-right:1.25rem!important}.pb-md-3,.py-md-3{padding-bottom:1.25rem!important}.pl-md-3,.px-md-3{padding-left:1.25rem!important}.p-md-4{padding:1.875rem!important}.pt-md-4,.py-md-4{padding-top:1.875rem!important}.pr-md-4,.px-md-4{padding-right:1.875rem!important}.pb-md-4,.py-md-4{padding-bottom:1.875rem!important}.pl-md-4,.px-md-4{padding-left:1.875rem!important}.p-md-5{padding:3.75rem!important}.pt-md-5,.py-md-5{padding-top:3.75rem!important}.pr-md-5,.px-md-5{padding-right:3.75rem!important}.pb-md-5,.py-md-5{padding-bottom:3.75rem!important}.pl-md-5,.px-md-5{padding-left:3.75rem!important}.m-md-n1{margin:-.3125rem!important}.mt-md-n1,.my-md-n1{margin-top:-.3125rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.3125rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.3125rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.3125rem!important}.m-md-n2{margin:-.625rem!important}.mt-md-n2,.my-md-n2{margin-top:-.625rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.625rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.625rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.625rem!important}.m-md-n3{margin:-1.25rem!important}.mt-md-n3,.my-md-n3{margin-top:-1.25rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1.25rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1.25rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1.25rem!important}.m-md-n4{margin:-1.875rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.875rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.875rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.875rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.875rem!important}.m-md-n5{margin:-3.75rem!important}.mt-md-n5,.my-md-n5{margin-top:-3.75rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3.75rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3.75rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3.75rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:980px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.3125rem!important}.mt-lg-1,.my-lg-1{margin-top:.3125rem!important}.mr-lg-1,.mx-lg-1{margin-right:.3125rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.3125rem!important}.ml-lg-1,.mx-lg-1{margin-left:.3125rem!important}.m-lg-2{margin:.625rem!important}.mt-lg-2,.my-lg-2{margin-top:.625rem!important}.mr-lg-2,.mx-lg-2{margin-right:.625rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.625rem!important}.ml-lg-2,.mx-lg-2{margin-left:.625rem!important}.m-lg-3{margin:1.25rem!important}.mt-lg-3,.my-lg-3{margin-top:1.25rem!important}.mr-lg-3,.mx-lg-3{margin-right:1.25rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1.25rem!important}.ml-lg-3,.mx-lg-3{margin-left:1.25rem!important}.m-lg-4{margin:1.875rem!important}.mt-lg-4,.my-lg-4{margin-top:1.875rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.875rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.875rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.875rem!important}.m-lg-5{margin:3.75rem!important}.mt-lg-5,.my-lg-5{margin-top:3.75rem!important}.mr-lg-5,.mx-lg-5{margin-right:3.75rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3.75rem!important}.ml-lg-5,.mx-lg-5{margin-left:3.75rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.3125rem!important}.pt-lg-1,.py-lg-1{padding-top:.3125rem!important}.pr-lg-1,.px-lg-1{padding-right:.3125rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.3125rem!important}.pl-lg-1,.px-lg-1{padding-left:.3125rem!important}.p-lg-2{padding:.625rem!important}.pt-lg-2,.py-lg-2{padding-top:.625rem!important}.pr-lg-2,.px-lg-2{padding-right:.625rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.625rem!important}.pl-lg-2,.px-lg-2{padding-left:.625rem!important}.p-lg-3{padding:1.25rem!important}.pt-lg-3,.py-lg-3{padding-top:1.25rem!important}.pr-lg-3,.px-lg-3{padding-right:1.25rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1.25rem!important}.pl-lg-3,.px-lg-3{padding-left:1.25rem!important}.p-lg-4{padding:1.875rem!important}.pt-lg-4,.py-lg-4{padding-top:1.875rem!important}.pr-lg-4,.px-lg-4{padding-right:1.875rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.875rem!important}.pl-lg-4,.px-lg-4{padding-left:1.875rem!important}.p-lg-5{padding:3.75rem!important}.pt-lg-5,.py-lg-5{padding-top:3.75rem!important}.pr-lg-5,.px-lg-5{padding-right:3.75rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3.75rem!important}.pl-lg-5,.px-lg-5{padding-left:3.75rem!important}.m-lg-n1{margin:-.3125rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.3125rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.3125rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.3125rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.3125rem!important}.m-lg-n2{margin:-.625rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.625rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.625rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.625rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.625rem!important}.m-lg-n3{margin:-1.25rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1.25rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1.25rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1.25rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1.25rem!important}.m-lg-n4{margin:-1.875rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.875rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.875rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.875rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.875rem!important}.m-lg-n5{margin:-3.75rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3.75rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3.75rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3.75rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3.75rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1220px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.3125rem!important}.mt-xl-1,.my-xl-1{margin-top:.3125rem!important}.mr-xl-1,.mx-xl-1{margin-right:.3125rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.3125rem!important}.ml-xl-1,.mx-xl-1{margin-left:.3125rem!important}.m-xl-2{margin:.625rem!important}.mt-xl-2,.my-xl-2{margin-top:.625rem!important}.mr-xl-2,.mx-xl-2{margin-right:.625rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.625rem!important}.ml-xl-2,.mx-xl-2{margin-left:.625rem!important}.m-xl-3{margin:1.25rem!important}.mt-xl-3,.my-xl-3{margin-top:1.25rem!important}.mr-xl-3,.mx-xl-3{margin-right:1.25rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1.25rem!important}.ml-xl-3,.mx-xl-3{margin-left:1.25rem!important}.m-xl-4{margin:1.875rem!important}.mt-xl-4,.my-xl-4{margin-top:1.875rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.875rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.875rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.875rem!important}.m-xl-5{margin:3.75rem!important}.mt-xl-5,.my-xl-5{margin-top:3.75rem!important}.mr-xl-5,.mx-xl-5{margin-right:3.75rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3.75rem!important}.ml-xl-5,.mx-xl-5{margin-left:3.75rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.3125rem!important}.pt-xl-1,.py-xl-1{padding-top:.3125rem!important}.pr-xl-1,.px-xl-1{padding-right:.3125rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.3125rem!important}.pl-xl-1,.px-xl-1{padding-left:.3125rem!important}.p-xl-2{padding:.625rem!important}.pt-xl-2,.py-xl-2{padding-top:.625rem!important}.pr-xl-2,.px-xl-2{padding-right:.625rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.625rem!important}.pl-xl-2,.px-xl-2{padding-left:.625rem!important}.p-xl-3{padding:1.25rem!important}.pt-xl-3,.py-xl-3{padding-top:1.25rem!important}.pr-xl-3,.px-xl-3{padding-right:1.25rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1.25rem!important}.pl-xl-3,.px-xl-3{padding-left:1.25rem!important}.p-xl-4{padding:1.875rem!important}.pt-xl-4,.py-xl-4{padding-top:1.875rem!important}.pr-xl-4,.px-xl-4{padding-right:1.875rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.875rem!important}.pl-xl-4,.px-xl-4{padding-left:1.875rem!important}.p-xl-5{padding:3.75rem!important}.pt-xl-5,.py-xl-5{padding-top:3.75rem!important}.pr-xl-5,.px-xl-5{padding-right:3.75rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3.75rem!important}.pl-xl-5,.px-xl-5{padding-left:3.75rem!important}.m-xl-n1{margin:-.3125rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.3125rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.3125rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.3125rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.3125rem!important}.m-xl-n2{margin:-.625rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.625rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.625rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.625rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.625rem!important}.m-xl-n3{margin:-1.25rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1.25rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1.25rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1.25rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1.25rem!important}.m-xl-n4{margin:-1.875rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.875rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.875rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.875rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.875rem!important}.m-xl-n5{margin:-3.75rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3.75rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3.75rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3.75rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3.75rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}@media (min-width:1380px){.m-xxl-0{margin:0!important}.mt-xxl-0,.my-xxl-0{margin-top:0!important}.mr-xxl-0,.mx-xxl-0{margin-right:0!important}.mb-xxl-0,.my-xxl-0{margin-bottom:0!important}.ml-xxl-0,.mx-xxl-0{margin-left:0!important}.m-xxl-1{margin:.3125rem!important}.mt-xxl-1,.my-xxl-1{margin-top:.3125rem!important}.mr-xxl-1,.mx-xxl-1{margin-right:.3125rem!important}.mb-xxl-1,.my-xxl-1{margin-bottom:.3125rem!important}.ml-xxl-1,.mx-xxl-1{margin-left:.3125rem!important}.m-xxl-2{margin:.625rem!important}.mt-xxl-2,.my-xxl-2{margin-top:.625rem!important}.mr-xxl-2,.mx-xxl-2{margin-right:.625rem!important}.mb-xxl-2,.my-xxl-2{margin-bottom:.625rem!important}.ml-xxl-2,.mx-xxl-2{margin-left:.625rem!important}.m-xxl-3{margin:1.25rem!important}.mt-xxl-3,.my-xxl-3{margin-top:1.25rem!important}.mr-xxl-3,.mx-xxl-3{margin-right:1.25rem!important}.mb-xxl-3,.my-xxl-3{margin-bottom:1.25rem!important}.ml-xxl-3,.mx-xxl-3{margin-left:1.25rem!important}.m-xxl-4{margin:1.875rem!important}.mt-xxl-4,.my-xxl-4{margin-top:1.875rem!important}.mr-xxl-4,.mx-xxl-4{margin-right:1.875rem!important}.mb-xxl-4,.my-xxl-4{margin-bottom:1.875rem!important}.ml-xxl-4,.mx-xxl-4{margin-left:1.875rem!important}.m-xxl-5{margin:3.75rem!important}.mt-xxl-5,.my-xxl-5{margin-top:3.75rem!important}.mr-xxl-5,.mx-xxl-5{margin-right:3.75rem!important}.mb-xxl-5,.my-xxl-5{margin-bottom:3.75rem!important}.ml-xxl-5,.mx-xxl-5{margin-left:3.75rem!important}.p-xxl-0{padding:0!important}.pt-xxl-0,.py-xxl-0{padding-top:0!important}.pr-xxl-0,.px-xxl-0{padding-right:0!important}.pb-xxl-0,.py-xxl-0{padding-bottom:0!important}.pl-xxl-0,.px-xxl-0{padding-left:0!important}.p-xxl-1{padding:.3125rem!important}.pt-xxl-1,.py-xxl-1{padding-top:.3125rem!important}.pr-xxl-1,.px-xxl-1{padding-right:.3125rem!important}.pb-xxl-1,.py-xxl-1{padding-bottom:.3125rem!important}.pl-xxl-1,.px-xxl-1{padding-left:.3125rem!important}.p-xxl-2{padding:.625rem!important}.pt-xxl-2,.py-xxl-2{padding-top:.625rem!important}.pr-xxl-2,.px-xxl-2{padding-right:.625rem!important}.pb-xxl-2,.py-xxl-2{padding-bottom:.625rem!important}.pl-xxl-2,.px-xxl-2{padding-left:.625rem!important}.p-xxl-3{padding:1.25rem!important}.pt-xxl-3,.py-xxl-3{padding-top:1.25rem!important}.pr-xxl-3,.px-xxl-3{padding-right:1.25rem!important}.pb-xxl-3,.py-xxl-3{padding-bottom:1.25rem!important}.pl-xxl-3,.px-xxl-3{padding-left:1.25rem!important}.p-xxl-4{padding:1.875rem!important}.pt-xxl-4,.py-xxl-4{padding-top:1.875rem!important}.pr-xxl-4,.px-xxl-4{padding-right:1.875rem!important}.pb-xxl-4,.py-xxl-4{padding-bottom:1.875rem!important}.pl-xxl-4,.px-xxl-4{padding-left:1.875rem!important}.p-xxl-5{padding:3.75rem!important}.pt-xxl-5,.py-xxl-5{padding-top:3.75rem!important}.pr-xxl-5,.px-xxl-5{padding-right:3.75rem!important}.pb-xxl-5,.py-xxl-5{padding-bottom:3.75rem!important}.pl-xxl-5,.px-xxl-5{padding-left:3.75rem!important}.m-xxl-n1{margin:-.3125rem!important}.mt-xxl-n1,.my-xxl-n1{margin-top:-.3125rem!important}.mr-xxl-n1,.mx-xxl-n1{margin-right:-.3125rem!important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-.3125rem!important}.ml-xxl-n1,.mx-xxl-n1{margin-left:-.3125rem!important}.m-xxl-n2{margin:-.625rem!important}.mt-xxl-n2,.my-xxl-n2{margin-top:-.625rem!important}.mr-xxl-n2,.mx-xxl-n2{margin-right:-.625rem!important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-.625rem!important}.ml-xxl-n2,.mx-xxl-n2{margin-left:-.625rem!important}.m-xxl-n3{margin:-1.25rem!important}.mt-xxl-n3,.my-xxl-n3{margin-top:-1.25rem!important}.mr-xxl-n3,.mx-xxl-n3{margin-right:-1.25rem!important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-1.25rem!important}.ml-xxl-n3,.mx-xxl-n3{margin-left:-1.25rem!important}.m-xxl-n4{margin:-1.875rem!important}.mt-xxl-n4,.my-xxl-n4{margin-top:-1.875rem!important}.mr-xxl-n4,.mx-xxl-n4{margin-right:-1.875rem!important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-1.875rem!important}.ml-xxl-n4,.mx-xxl-n4{margin-left:-1.875rem!important}.m-xxl-n5{margin:-3.75rem!important}.mt-xxl-n5,.my-xxl-n5{margin-top:-3.75rem!important}.mr-xxl-n5,.mx-xxl-n5{margin-right:-3.75rem!important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-3.75rem!important}.ml-xxl-n5,.mx-xxl-n5{margin-left:-3.75rem!important}.m-xxl-auto{margin:auto!important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto!important}.mr-xxl-auto,.mx-xxl-auto{margin-right:auto!important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto!important}.ml-xxl-auto,.mx-xxl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:480px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:980px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1220px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1380px){.text-xxl-left{text-align:left!important}.text-xxl-right{text-align:right!important}.text-xxl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#f16e00!important}a.text-primary:focus,a.text-primary:hover{color:#a54b00!important}.text-secondary{color:#000!important}a.text-secondary:focus,a.text-secondary:hover{color:#000!important}.text-success{color:#32c832!important}a.text-success:focus,a.text-success:hover{color:#238b23!important}.text-info{color:#527edb!important}a.text-info:focus,a.text-info:hover{color:#2756ba!important}.text-warning{color:#fc0!important}a.text-warning:focus,a.text-warning:hover{color:#b38f00!important}.text-danger{color:#cd3c14!important}a.text-danger:focus,a.text-danger:hover{color:#87280d!important}.text-light{color:#ddd!important}a.text-light:focus,a.text-light:hover{color:#b7b7b7!important}.text-dark{color:#000!important}a.text-dark:focus,a.text-dark:hover{color:#000!important}.text-body{color:#000!important}.text-muted{color:#666!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:2px solid #ccc;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:980px!important}.container{min-width:980px!important}.navbar{display:none}.badge{border:2px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #eee!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#ccc}.table .thead-dark th{color:inherit;border-color:#ccc}.form-row,.row{display:block!important}}.card-deck .o-card-link{margin:0 1rem}.o-card-link .card-title{-ms-flex-item-align:center;align-self:center;width:100%;margin:auto 0;font-weight:700;word-break:normal}.o-card-link .card-img{padding:0;text-align:center}.o-card-link .card-img img{width:100%;height:auto}.o-card-link .card-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;text-align:center}.card-deck{margin:0}@media (max-width:479.98px){.card.o-card-link{-ms-flex-preferred-size:auto;flex-basis:auto;margin:1rem}.card-deck{-ms-flex-direction:column;flex-direction:column}.card-deck .o-card-link,.o-card-link{-ms-flex-direction:row;flex-direction:row;height:3.75rem;margin:0;margin-bottom:.625rem;border:0}.o-card-link .card-img{-ms-flex-preferred-size:20%;flex-basis:20%;width:auto;padding:0}.o-card-link .card-img img{width:auto;height:3.75rem}.o-card-link .card-body{-ms-flex-preferred-size:80%;flex-basis:80%;-ms-flex-item-align:center;align-self:center;padding:0 1rem;text-align:left}.o-card-link .card-title{-ms-flex-item-align:start;align-self:flex-start;margin:0}.o-card-link .card-title::after{position:absolute;top:calc(50% - .5rem);right:.25rem;width:1rem;height:1rem;content:"";background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E");background-repeat:no-repeat}}@media (min-width:480px) and (max-width:767.98px){.card.o-card-link{-ms-flex-preferred-size:auto;flex-basis:auto;margin:1rem}}.o-switch .toggle,.o-switch .toggle .off,.o-switch .toggle .on,.o-switch .toggle::before{transition:.4s}.o-switch .toggle{position:relative;display:block;width:auto;min-width:3.75rem;height:1.875rem;margin:.3125rem 0;background:#666;border:2px solid #666}.o-switch .toggle.toggle-rounded,.o-switch .toggle.toggle-rounded::before{border-radius:1.625rem}.o-switch .toggle .off,.o-switch .toggle .on{display:none;font-weight:700;line-height:1.625rem;color:#fff;text-align:left;cursor:default;opacity:0}.o-switch .toggle .on.svg-checkbox-tick::after{top:.1875rem;left:-.125rem}.o-switch .toggle .off{display:block;text-align:right;opacity:1}.o-switch .toggle .off.svg-delete::after{top:.1875rem;right:-.125rem;left:auto}.o-switch .toggle::before{position:absolute;top:0;left:0;z-index:1;display:block;width:1.625rem;height:1.625rem;content:"";background:#fff}.o-switch .checkbox:focus+.toggle::before{outline:1px dotted #fff}.o-switch .checkbox:checked+.toggle{background:#f16e00;border-color:#f16e00}.o-switch .checkbox:checked+.toggle .on{display:block;opacity:1}.o-switch .checkbox:checked+.toggle .off{display:none;opacity:0}.o-switch .checkbox:checked+.toggle::before{right:0;left:auto}.o-switch .checkbox.success:checked+.toggle{background:#32c832;border-color:#32c832}.o-switch .checkbox.success:checked+.toggle .on{color:#000}.o-switch .checkbox.success:checked+.toggle .on.icon-checkbox-tick{color:#fff}.form-group.row .o-switch .col-form-label.toggle{padding:0 .375rem}.form-group.row .o-switch .col-form-label.toggle.toggle-rounded{padding:0 .875rem}.o-switch.btn-group-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:start;justify-content:flex-start;border:2px solid #ccc}.o-switch.btn-group-toggle .btn{min-width:2.5rem;padding-right:0;padding-left:0;margin:-2px 0;border:2px solid transparent}.o-switch.btn-group-toggle .btn:first-child{margin-left:-2px}.o-switch.btn-group-toggle .btn:last-child{margin-right:-2px}.o-switch.btn-group-toggle .btn.active{color:#fff;background-color:#000;border-color:#000}.o-switch.btn-group-toggle .btn.focus{outline:1px dotted #fff;outline-offset:-2px}.o-switch.btn-group-toggle .btn:active{border-color:#f16e00}.o-switch.btn-group-toggle .btn:hover:not(:active){color:#f16e00;background-color:transparent}.o-switch.btn-group-toggle .btn:hover.active{color:#fff;background-color:#000;border-color:#000}.o-switch.btn-group-toggle.no-outline{border-color:transparent}.o-switch.btn-group-toggle.no-outline .btn{border-top:2px solid transparent;border-bottom:2px solid transparent}.o-switch.btn-group-toggle.no-outline .btn:first-child{border-left-color:transparent}.o-switch.btn-group-toggle.no-outline .btn:last-child{border-right-color:transparent}.o-switch.btn-group-toggle.no-outline .btn.active{color:#f16e00;background-color:#fff;border-color:transparent;outline-color:#000}.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active){color:#000;background-color:#fff;border-color:#ccc}.o-switch.btn-group-toggle.no-outline .btn:hover.active{color:#f16e00;background-color:#fff;border-color:transparent;outline-color:#000}.form-group input[type=checkbox],.form-group input[type=radio]{width:auto}.form-group .invalid-feedback{margin-top:.8125rem;font-weight:700}.form-group.top{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.form-group.top .col-form-label{margin-bottom:0}.form-group.top .form-control{-ms-flex-order:2;order:2}.form-group.top .invalid-feedback{-ms-flex-order:1;order:1;margin-top:0;margin-bottom:.8125rem;line-height:1}.form-group.right{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.form-group.right .col-form-label,.form-group.right label{min-width:100%}.form-group.right .form-control-message,.form-group.right .invalid-feedback{max-width:50%;margin-left:.625rem}.form-group.row.top{-ms-flex-direction:row;flex-direction:row}.form-group.row.top .col-form-label,.form-group.row.top label{-ms-flex-order:1;order:1}.form-group.row.top .form-control{-ms-flex-order:2;order:2;margin-top:0}.form-group.row.top .invalid-feedback{-ms-flex-order:0;order:0}.form-group.row.right .col-form-label,.form-group.row.right label{min-width:auto}.form-group.row.right .invalid-feedback{-ms-flex-item-align:center;align-self:center;margin-top:0}.form-group.is-required label::after{margin-left:6px;font-weight:700;color:#f16e00;content:"*"}.form-group .form-control:invalid{outline:0;box-shadow:none}select.form-control:not([size]):not([multiple]){height:auto;padding-top:.4375rem;padding-bottom:.4375rem}select.form-control:not([size]):not([multiple]).form-control-lg{padding-top:.65625rem;padding-bottom:.65625rem}select.form-control:not([size]):not([multiple]).form-control-sm{padding-top:.1875rem;padding-bottom:.1875rem}.has-feedback label~.invalid-feedback{top:1.75}.o-square-list{padding-left:0;color:#f16e00;text-align:left}.o-square-list,.o-square-list ul *{list-style-type:none}.o-square-list li{color:#000}.o-square-list li::before{margin-right:1rem;font-size:.875rem;line-height:1.25rem;color:#f16e00;vertical-align:text-top;content:"\25A0"}.o-square-list li span{display:inline-block;margin-bottom:.625rem}.o-square-list li>ul{padding-left:1rem}.o-square-list ul>li::before{color:#999}.o-square-list ul ul>li::before{color:#ccc}.o-stepbar,.o-stepbar ol,.o-stepbar ul{padding:0;margin:0;overflow:hidden}.o-stepbar .stepbar-item:first-child:nth-last-child(1){width:100%}.o-stepbar .stepbar-item:first-child:nth-last-child(2),.o-stepbar .stepbar-item:first-child:nth-last-child(2)~.stepbar-item{width:50%}.o-stepbar .stepbar-item:first-child:nth-last-child(3),.o-stepbar .stepbar-item:first-child:nth-last-child(3)~.stepbar-item{width:33.3333%}.o-stepbar .stepbar-item:first-child:nth-last-child(4),.o-stepbar .stepbar-item:first-child:nth-last-child(4)~.stepbar-item{width:25%}.o-stepbar .stepbar-item:first-child:nth-last-child(5),.o-stepbar .stepbar-item:first-child:nth-last-child(5)~.stepbar-item{width:20%}.o-stepbar .stepbar-item{position:relative;float:left;padding:.625rem 1.25rem;padding-left:2rem;font-size:1rem;font-weight:700;line-height:1.25;color:#000;text-align:center;white-space:nowrap;list-style:none;background-color:#ddd}.o-stepbar .stepbar-item::after{position:absolute;top:0;right:-1rem;z-index:500;display:block;width:1rem;height:2.5rem;content:"";background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E);background-size:1rem 2.5rem}.o-stepbar .stepbar-item:first-child{padding-left:1.25rem}.o-stepbar .stepbar-item:last-child::after{display:none}.o-stepbar .stepbar-item.done{background-color:#000}.o-stepbar .stepbar-item.done::after{position:absolute;top:0;right:-1rem;z-index:500;display:block;width:1rem;height:2.5rem;content:"";background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E);background-size:1rem 2.5rem}.o-stepbar .stepbar-item.done .stepbar-link{color:#fff}.o-stepbar .stepbar-item.done:last-child::after{display:none}.o-stepbar .stepbar-item.current{background-color:#f16e00}.o-stepbar .stepbar-item.current::after{position:absolute;top:0;right:-1rem;z-index:500;display:block;width:1rem;height:2.5rem;content:"";background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E);background-size:1rem 2.5rem}.o-stepbar .stepbar-item.current .stepbar-link{color:#fff}.o-stepbar .stepbar-item.current:last-child::after{display:none}.o-stepbar .stepbar-item .stepbar-link{text-decoration:none}.o-stepbar .stepbar-item .stepbar-link .step-number::after{content:"."}@media (max-width:479.98px){.o-stepbar .stepbar-item{padding:.3125rem .625rem .3125rem 2rem;line-height:1.25}.o-stepbar .stepbar-item.current::after,.o-stepbar .stepbar-item.done::after,.o-stepbar .stepbar-item.next::after,.o-stepbar .stepbar-item::after{right:-.6875rem;width:.75rem;height:1.875rem;background-size:cover}.o-stepbar.xs-numbers .step-number::after{display:none}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3)~.stepbar-item{width:20%}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3)~.stepbar-item.current{width:60%}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4)~.stepbar-item,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5)~.stepbar-item{width:20%}.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4)~.stepbar-item.current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,.o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5)~.stepbar-item.current{width:40%}.o-stepbar.xs-numbers .stepbar-item{width:20%;padding-right:0;padding-left:.75rem}.o-stepbar.xs-numbers .stepbar-item:first-child{padding-left:0}.o-stepbar.xs-numbers .stepbar-item.current{width:60%}.o-stepbar.xs-numbers .stepbar-item.current .step-number{display:none}.o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title{display:none}.o-stepbar.xs-labels .step-number{display:none}}.o-link-arrow{font-size:1rem;font-weight:700;text-decoration:none}.o-link-arrow::after{display:inline-block;padding:0 .625rem;font-family:icon-orange;font-size:.625rem;color:#000;content:"\e93e"}.o-link-arrow:focus::after,.o-link-arrow:hover::after{color:#f16e00;text-decoration:none}.o-link-arrow.back::after{padding:0;content:""}.o-link-arrow.back::before{display:inline-block;padding:0 .625rem 0 0;font-family:icon-orange;font-size:.625rem;color:#000;content:"\e93f"}.o-link-arrow.back:focus::before,.o-link-arrow.back:hover::before{color:#f16e00;text-decoration:none}.mega-menu{overflow:hidden}.mega-menu>.navbar-nav{transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;-webkit-transform:translateX(0);transform:translateX(0)}.mega-menu-panel>.container>.navbar-nav,.mega-menu-panel>.navbar-nav{-ms-flex-direction:column;flex-direction:column}.mega-menu-panel>.container>.navbar-nav .navbar-nav,.mega-menu-panel>.navbar-nav .navbar-nav{position:absolute;top:0;left:100%;display:none;width:100%}.navbar .nav-link.icon{margin-top:0}.navbar .nav-link.icon span[class^=icon-]{font-size:1.5rem;font-weight:400}.navbar .nav-link.icon[class*=svg-],.navbar .nav-link.icon[class*=svg-]::after{width:1.875rem;height:1.875rem}.navbar .nav-link:not(.icon)[class*=svg-]::after{top:0;right:0;left:auto}.navbar.supra{height:2.5rem;min-height:2.5rem;padding-top:0;padding-bottom:0;border-bottom:1px solid #333}@media (max-width:479.98px){.navbar.supra{display:none}}.navbar.supra>.container,.navbar.supra>.container .navbar-nav{-ms-flex-align:center;align-items:center}.navbar.supra .navbar-brand{display:none}.navbar.supra .navbar-nav{margin:0}.navbar.supra .navbar-nav .nav-item:first-child .nav-link,.navbar.supra .navbar-nav>.nav-link:first-child{margin-left:0}.navbar.supra .dropdown-toggle,.navbar.supra .nav-link{font-size:.875rem;line-height:1}.navbar.supra .dropdown-toggle:focus,.navbar.supra .nav-link:focus{outline-offset:.5rem}.navbar.supra .dropdown-toggle span[class^=icon-],.navbar.supra .nav-link span[class^=icon-]{font-size:1.125rem;font-weight:400}.navbar.supra .nav-link.icon span[class^=icon-]{font-size:1rem;font-weight:400}.navbar.supra .nav-link.icon[class*=svg-],.navbar.supra .nav-link.icon[class*=svg-]::after{width:1.25rem;height:1.25rem}.navbar.supra .dropdown-menu{right:0;left:auto}@media (max-width:479.98px){.navbar-expand-sm .mega-menu .nav-link,.navbar-expand-sm.minimized .mega-menu .nav-link{padding-right:0;outline-offset:-1px}.navbar-expand-sm .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-right:.9375rem;content:"";border-top:.4375em solid;border-right:.4375em solid transparent;border-left:.4375em solid transparent;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-sm .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-sm .mega-menu-panel .nav-link.back,.navbar-expand-sm.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-sm .mega-menu-panel .nav-link.back::before,.navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before{float:left;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-sm .mega-menu-panel>.container,.navbar-expand-sm.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-sm .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-sm.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-sm.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-sm.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:480px){.navbar-expand-sm .mega-menu{overflow:visible}.navbar-expand-sm .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-sm .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-sm .mega-menu-panel{position:absolute;top:100px;left:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-sm .mega-menu-panel a[data-toggle=collapse]{display:block;float:right;margin:1.25rem;color:#fff}.navbar-expand-sm .mega-menu-panel .nav-link{margin-left:0}.navbar-expand-sm .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-right:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-left:0}.navbar-expand-sm .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:767.98px){.navbar-expand-md .mega-menu .nav-link,.navbar-expand-md.minimized .mega-menu .nav-link{padding-right:0;outline-offset:-1px}.navbar-expand-md .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-right:.9375rem;content:"";border-top:.4375em solid;border-right:.4375em solid transparent;border-left:.4375em solid transparent;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-md .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-md .mega-menu-panel .nav-link.back,.navbar-expand-md.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-md .mega-menu-panel .nav-link.back::before,.navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before{float:left;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-md .mega-menu-panel>.container,.navbar-expand-md.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-md .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-md.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-md.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-md.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:768px){.navbar-expand-md .mega-menu{overflow:visible}.navbar-expand-md .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-md .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-md .mega-menu-panel{position:absolute;top:100px;left:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-md .mega-menu-panel a[data-toggle=collapse]{display:block;float:right;margin:1.25rem;color:#fff}.navbar-expand-md .mega-menu-panel .nav-link{margin-left:0}.navbar-expand-md .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-right:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-left:0}.navbar-expand-md .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:979.98px){.navbar-expand-lg .mega-menu .nav-link,.navbar-expand-lg.minimized .mega-menu .nav-link{padding-right:0;outline-offset:-1px}.navbar-expand-lg .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-right:.9375rem;content:"";border-top:.4375em solid;border-right:.4375em solid transparent;border-left:.4375em solid transparent;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-lg .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-lg .mega-menu-panel .nav-link.back,.navbar-expand-lg.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-lg .mega-menu-panel .nav-link.back::before,.navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before{float:left;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-lg .mega-menu-panel>.container,.navbar-expand-lg.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-lg .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-lg.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-lg.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-lg.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:980px){.navbar-expand-lg .mega-menu{overflow:visible}.navbar-expand-lg .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-lg .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-lg .mega-menu-panel{position:absolute;top:100px;left:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-lg .mega-menu-panel a[data-toggle=collapse]{display:block;float:right;margin:1.25rem;color:#fff}.navbar-expand-lg .mega-menu-panel .nav-link{margin-left:0}.navbar-expand-lg .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-right:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-left:0}.navbar-expand-lg .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:1219.98px){.navbar-expand-xl .mega-menu .nav-link,.navbar-expand-xl.minimized .mega-menu .nav-link{padding-right:0;outline-offset:-1px}.navbar-expand-xl .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-right:.9375rem;content:"";border-top:.4375em solid;border-right:.4375em solid transparent;border-left:.4375em solid transparent;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-xl .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-xl .mega-menu-panel .nav-link.back,.navbar-expand-xl.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-xl .mega-menu-panel .nav-link.back::before,.navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before{float:left;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-xl .mega-menu-panel>.container,.navbar-expand-xl.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-xl .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-xl.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-xl.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-xl.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:1220px){.navbar-expand-xl .mega-menu{overflow:visible}.navbar-expand-xl .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-xl .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-xl .mega-menu-panel{position:absolute;top:100px;left:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-xl .mega-menu-panel a[data-toggle=collapse]{display:block;float:right;margin:1.25rem;color:#fff}.navbar-expand-xl .mega-menu-panel .nav-link{margin-left:0}.navbar-expand-xl .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-right:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-left:0}.navbar-expand-xl .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}@media (max-width:1379.98px){.navbar-expand-xxl .mega-menu .nav-link,.navbar-expand-xxl.minimized .mega-menu .nav-link{padding-right:0;outline-offset:-1px}.navbar-expand-xxl .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-right:.9375rem;content:"";border-top:.4375em solid;border-right:.4375em solid transparent;border-left:.4375em solid transparent;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-xxl .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand-xxl .mega-menu-panel .nav-link.back,.navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand-xxl .mega-menu-panel .nav-link.back::before,.navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before{float:left;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand-xxl .mega-menu-panel>.container,.navbar-expand-xxl.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand-xxl .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand-xxl.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand-xxl.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand-xxl.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}}@media (min-width:1380px){.navbar-expand-xxl .mega-menu{overflow:visible}.navbar-expand-xxl .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand-xxl .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand-xxl .mega-menu-panel{position:absolute;top:100px;left:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand-xxl .mega-menu-panel a[data-toggle=collapse]{display:block;float:right;margin:1.25rem;color:#fff}.navbar-expand-xxl .mega-menu-panel .nav-link{margin-left:0}.navbar-expand-xxl .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-right:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-left:0}.navbar-expand-xxl .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}}.navbar-expand .mega-menu .nav-link,.navbar-expand.minimized .mega-menu .nav-link{padding-right:0;outline-offset:-1px}.navbar-expand .mega-menu .nav-link[data-toggle=collapse]::before,.navbar-expand.minimized .mega-menu .nav-link[data-toggle=collapse]::before{margin-top:.3125rem;margin-right:.9375rem;content:"";border-top:.4375em solid;border-right:.4375em solid transparent;border-left:.4375em solid transparent;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand .mega-menu .nav-link[data-toggle=collapse].collapsed::before,.navbar-expand.minimized .mega-menu .nav-link[data-toggle=collapse].collapsed::before{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.navbar-expand .mega-menu-panel .nav-link.back,.navbar-expand.minimized .mega-menu-panel .nav-link.back{display:block}.navbar-expand .mega-menu-panel .nav-link.back::before,.navbar-expand.minimized .mega-menu-panel .nav-link.back::before{float:left;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.navbar-expand .mega-menu-panel>.container,.navbar-expand.minimized .mega-menu-panel>.container{width:100%;padding:0;margin:0}.navbar-expand .mega-menu-panel>.container a[data-toggle=collapse],.navbar-expand.minimized .mega-menu-panel>.container a[data-toggle=collapse]{display:none}.navbar-expand .mega-menu-panel>.container>.navbar-nav>.nav-item,.navbar-expand.minimized .mega-menu-panel>.container>.navbar-nav>.nav-item{padding:0;border:0}.navbar-expand .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child,.navbar-expand.minimized .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-item:last-child{border-bottom:1px solid #333}.navbar-expand .mega-menu{overflow:visible}.navbar-expand .mega-menu>.navbar-nav{transition:none;-webkit-transform:none;transform:none}.navbar-expand .mega-menu>.navbar-nav .nav-link::before{display:none}.navbar-expand .mega-menu-panel{position:absolute;top:100px;left:0;z-index:1030;width:100%;padding:1rem 0;background-color:#000;border-top:1px solid #333}.navbar-expand .mega-menu-panel a[data-toggle=collapse]{display:block;float:right;margin:1.25rem;color:#fff}.navbar-expand .mega-menu-panel .nav-link{margin-left:0}.navbar-expand .mega-menu-panel .svg-delete{width:1.25rem;height:1.25rem}.navbar-expand .mega-menu-panel>.container>.navbar-nav{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:start;align-items:flex-start}.navbar-expand .mega-menu-panel>.container>.navbar-nav>.nav-item{-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.navbar-expand .mega-menu-panel>.container>.navbar-nav>.nav-item>.nav-link{padding:0;margin-right:.625rem;margin-bottom:1rem;font-size:1.25rem}.navbar-expand .mega-menu-panel>.container>.navbar-nav .navbar-nav{position:static;display:block!important;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.navbar-expand .mega-menu-panel>.container>.navbar-nav .navbar-nav .nav-link{padding:0;line-height:1.25rem;outline-offset:1px}.navbar-expand .mega-menu-panel>.container>.navbar-nav .nav-item+.nav-item,.navbar-expand .mega-menu-panel>.container>.navbar-nav .nav-item:first-child{margin-left:0}.navbar-expand .mega-menu-panel>.container>.navbar-nav .nav-link.back{display:none}@media (max-width:767.98px){.navbar-brand,.navbar-brand+.navbar-brand{-ms-flex-item-align:center;align-self:center}}.table>tbody>tr,.table>tfoot>tr,.table>thead>tr{border-bottom:1px solid #ccc}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{font-size:.875rem;line-height:1.25rem;vertical-align:middle;border:0}.table>tbody>tr>td:first-child,.table>tbody>tr>th:first-child,.table>tfoot>tr>td:first-child,.table>tfoot>tr>th:first-child,.table>thead>tr>td:first-child,.table>thead>tr>th:first-child{padding-left:.625rem}.table>tbody>tr [class*=" icon-"],.table>tbody>tr [class^=icon-],.table>tfoot>tr [class*=" icon-"],.table>tfoot>tr [class^=icon-],.table>thead>tr [class*=" icon-"],.table>thead>tr [class^=icon-]{font-size:1.8125rem}.table>tbody>tr [class^=svg-],.table>tfoot>tr [class^=svg-],.table>thead>tr [class^=svg-]{display:block;width:1.8125rem;height:1.8125rem;margin:0 auto}.table>tbody>tr [class^=svg-]::after,.table>tfoot>tr [class^=svg-]::after,.table>thead>tr [class^=svg-]::after{width:1.8125rem;height:1.8125rem}.table thead>tr{border-bottom-width:2px}.table thead>tr>th{font-size:1rem;font-weight:700}.table tbody>th{font-weight:400}.table.has-checkbox tr.selected>td,.table.has-checkbox tr.selected>th{background-color:#ddd}.table.has-checkbox tr>td:first-child,.table.has-checkbox tr>th:first-child{width:1.25rem;padding-top:0;padding-bottom:0}.table.has-icon tr>td,.table.has-icon tr>th{height:3.1875rem;padding-top:.6875rem;vertical-align:middle}.table.has-icon tr>td img,.table.has-icon tr>td span,.table.has-icon tr>th img,.table.has-icon tr>th span{vertical-align:middle}.table.has-icon tr>td img,.table.has-icon tr>th img{width:1.875rem;height:1.875rem;margin-right:.625rem}.table.has-icon tr>td [class^=icon-],.table.has-icon tr>th [class^=icon-]{width:1.875rem;margin-right:.375rem;font-size:1.8125rem;line-height:0;vertical-align:middle}.table.table-reflow tbody>tr,.table.table-reflow thead>tr{border:0}.table.table-reflow tbody>tr>td,.table.table-reflow thead>tr>td{line-height:1.25rem}.table.table-reflow tbody>tr>th:first-child,.table.table-reflow thead>tr>th:first-child{border-bottom:2px solid #ccc}.table.table-reflow tbody>tr>td,.table.table-reflow tbody>tr>th,.table.table-reflow thead>tr>td,.table.table-reflow thead>tr>th{border-bottom:1px solid #ccc}.table.table-reflow tbody>tr>td:last-child,.table.table-reflow thead>tr>td:last-child{border-right:0}.table.table-reflow thead>tr{border:0}.table.table-reflow thead>tr>th:not(:first-child){padding-left:.625rem;border-bottom:1px solid #ccc}.table.table-reflow thead>tr>th:last-child{border-right:0}.table.table-reflow tbody>tr>th:first-child{padding-left:0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#32c832}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#2db42d}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#527edb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#3d6ed7}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fc0}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#e6b800}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#cd3c14}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#b63512}caption{padding:.75rem 0;font-size:2.125rem;font-weight:700;color:#000;caption-side:top;background-color:#fff}.tablesorter caption{padding:.75rem 0;font-size:2.125rem;font-weight:700;color:#000;background-color:#fff}.tablesorter th{padding-right:30px;text-align:left;cursor:pointer}.tablesorter th.header{position:relative}.tablesorter th .tablesorter-header-inner span{padding-right:1.6875rem}.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after{position:absolute;top:45%;width:.875rem;height:.4375rem;margin-left:.625rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e");-webkit-transform:rotate(180deg);transform:rotate(180deg)}.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after{position:absolute;top:45%;width:.875rem;height:.4375rem;margin-left:.625rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e")}.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after,.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after{position:absolute;top:31%;width:.875rem;height:1.0625rem;margin-left:.625rem;content:"";background-image:url("data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e")}.tablesorter th a{color:#000;text-decoration:none}.tablesorter th a:focus,.tablesorter th a:hover{color:#f16e00;text-decoration:underline}.tablesorter td{text-align:left}.modal .modal-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:2.5rem;border:0}.modal .modal-header{position:relative;min-height:1.25rem;padding:0;margin-bottom:2.5rem;border:0}.modal .modal-header .btn{position:absolute;top:-.625rem;right:-.625rem;padding:.625rem;background-color:transparent;border:0}.modal .modal-header .btn .close{width:1.25rem;height:1.25rem;margin:0;background-image:url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E");background-size:1.25rem;opacity:1}.modal .modal-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0;border:0}.modal .modal-body .card{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:0;border:0}.modal .modal-body .card-body{padding:0}.modal .modal-body .card-icon{margin-right:1.25rem}.modal .modal-body [class^=svg],.modal .modal-body [class^=svg]::after{width:2.875rem;height:2.875rem}.modal .modal-body [class^=svg]{display:block}.modal .modal-body [class^=svg]::after{top:auto}.modal .modal-body .card-title{margin-bottom:1.25rem;font-size:1.5rem}.modal .modal-footer{-ms-flex-item-align:end;align-self:flex-end;padding:0;margin-top:2.5rem;border:0}.modal .modal-footer .btn+.btn{margin-left:1.25rem}@media (max-width:479.98px){.modal .modal-content{padding:1.25rem}.modal .modal-header{margin:0}.modal .modal-body .card{-ms-flex-direction:column;flex-direction:column}.modal .modal-body .card-icon{-ms-flex-item-align:center;align-self:center;margin-right:0}.modal .modal-body .card-icon,.modal .modal-body [class^=svg]::after{width:4rem;height:4rem}.modal .modal-body .card-title{font-size:1rem}.modal .modal-body .card-body{margin-top:1.25rem}.modal .modal-footer{-ms-flex-item-align:center;align-self:center}}.nav .nav-item:first-child{margin-left:-.625rem}.nav.flex-column .nav-item:first-child{margin-left:0}.nav .nav-link{padding:.625rem .625rem;line-height:1.25rem}.o-nav-light{padding-left:inherit;border-bottom:1px solid #999}.o-active{color:#f16e00;border-bottom:3px solid #f16e00}.nav-tabs .nav-item:first-child{margin-left:0}.nav-tabs .nav-item+.nav-item{margin-left:.5rem}@media (max-width:979.98px){.nav-tabs .nav-item+.nav-item{margin-left:0}}.nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus,.nav-tabs .nav-link:not(.disabled):focus{outline-width:1px;outline-style:dotted;outline-offset:-6px}.nav-tabs .nav-link:not(.disabled)+.nav-link{margin-left:.5rem}@media (max-width:979.98px){.nav-tabs .nav-link:not(.disabled)+.nav-link{margin-left:0}}.o-tab-container{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.o-tab-container .o-tab-heading{position:relative;display:inline-block;padding:.625rem 1.25rem;margin-left:.5rem;font-weight:700;color:#000;text-align:center;background-color:#fff;border:0;border-bottom:2px solid #000}.o-tab-container .o-tab-heading:first-child{margin-left:0;border-top:0}.o-tab-container .o-tab-heading[aria-expanded=false]{border-bottom:2px solid #000}.o-tab-container .o-tab-heading[aria-expanded=true]{padding-top:.5rem;border:2px solid #000;border-bottom:0}.o-tab-container .o-tab-heading:focus{outline-offset:-4px}.o-tab-container .o-tab-heading:hover:not([aria-expanded=true]){color:#fff;background-color:#000}.o-tab-container .o-tab-content{display:none;-ms-flex-item-align:end;align-self:flex-end;-ms-flex-order:1;order:1;width:100%;padding:.625rem 1.25rem;background-color:#fff;box-shadow:0 -2px 0 #000}.o-tab-container .o-tab-content.show{display:block}@media (max-width:767.98px){.o-tab-container .o-tab-heading{-ms-flex-positive:1;flex-grow:1;margin-left:0;text-align:center}.o-tab-container .o-tab-heading[aria-expanded=false]{color:#fff;background-color:#666}.o-tab-container .o-tab-heading[aria-expanded=false]:active{color:#fff;background-color:#f16e00}.o-tab-container.accordion-layout{display:block}.o-tab-container.accordion-layout .o-tab-heading{position:relative;display:block;padding:.9375rem 0;margin-left:0;font-weight:700;color:#000;text-align:left;background-color:#fff;border:0}.o-tab-container.accordion-layout .o-tab-heading:focus{outline-offset:0}.o-tab-container.accordion-layout .o-tab-heading:hover{color:#f16e00;background-color:#fff}.o-tab-container.accordion-layout .o-tab-heading[aria-expanded=false]{border-bottom:1px #ccc solid}.o-tab-container.accordion-layout .o-tab-heading[aria-expanded=true]::after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.o-tab-container.accordion-layout .o-tab-heading:first-child{margin-left:0;border-top:1px solid #ccc}.o-tab-container.accordion-layout .o-tab-heading::after{position:absolute;top:1.375rem;right:.625rem;width:.875rem;height:.4375rem;content:"";background-image:url("data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E")}.o-tab-container.accordion-layout .o-tab-content{padding-left:0;border-bottom:1px #ccc solid;box-shadow:none}}.nav-pills.nav-stacked .nav-item{margin:0}.nav-pills.nav-stacked .nav-item+.nav-item{margin-left:0}.nav-pills .nav-item:first-child{margin-left:0}.nav-pills .nav-item+.nav-item{margin-left:5px}.nav-pills .nav-link{padding-top:1.25rem;padding-bottom:1.25rem}.nav-pills .nav-link:active{background-color:#000}.nav-pills .nav-link:hover{color:#fff;cursor:default;background-color:#000}.nav-pills .nav-link:hover.disabled{color:#666;background-color:transparent}.nav-pills .nav-link:focus{color:#fff;background-color:#f16e00;outline:0}.nav-pills .nav-link:focus.disabled{color:#666;background-color:transparent}.nav-pills .dropdown-menu{right:0;left:auto}.nav-pills .dropdown-menu .nav-item{margin:0}.nav-pills .dropdown-menu .nav-item .nav-link{display:block;padding:.625rem .625rem .625rem 1.25rem;margin:0;color:#000;background:#fff;border:0}.nav-pills .dropdown-menu .nav-item .nav-link:focus{outline:1px dotted #000;outline-offset:-2px}.nav-pills .dropdown-menu .nav-item .nav-link:hover{color:#fff;background:#000}.tab-content{padding:1.125rem;border-color:#000;border-style:solid;border-width:0 2px 2px}.tab-content .tab-pane p{margin-bottom:0}.tab-content-clear{border:0}.breadcrum{line-height:1}.overflow-nav{display:none}.o-nav-local.resizing{overflow:hidden}.hide{display:none!important}.show-inline-block{display:inline-block!important}.overflow-nav-list .nav-link{border:0}.overflow-nav-list .nav-link:focus{outline-offset:-2px}.overflow-nav-list .nav-item:last-child{margin-bottom:0}.o-nav-local .overflow-nav-list{margin-top:1px;border:0;box-shadow:0 .3125rem .625rem -.375rem #999}.o-nav-local{margin-bottom:2.5rem;border-top:1px solid #ccc;border-bottom:1px solid #ccc}.o-nav-local>.container,.o-nav-local>.container-fluid{display:-ms-flexbox;display:flex}.o-nav-local ul+ul{-ms-flex-negative:0;flex-shrink:0;margin-left:1rem}.o-nav-local .nav-item+.nav-item{margin-left:1rem}.o-nav-local .nav.flex-column .nav-item{margin-left:0}.o-nav-local .nav .dropdown-toggle,.o-nav-local .nav .nav-link{display:inline-block;padding:1rem .625rem 1.125rem;font-size:1rem;font-weight:700;line-height:1}.o-nav-local .nav .dropdown-toggle:focus,.o-nav-local .nav .nav-link:focus{outline:1px dotted;outline-offset:-1px}.o-nav-local .nav-link.active{color:#f16e00}.o-nav-local .dropdown-toggle.show{color:#000}.o-nav-local .dropdown-menu .nav-item,.o-nav-local .dropdown-menu .nav-item+.nav-item{margin:0}.o-nav-local .dropdown-menu .nav-link{display:block;padding:.625rem .625rem .625rem 1.25rem}.o-nav-local .dropdown-menu .nav-link:focus{outline-offset:-2px}.o-nav-local .dropdown-menu .nav-link:hover{color:#fff;background:#000}.o-nav-local.inverse{background-color:#000;border-top-color:#333;border-bottom-color:#333}.o-nav-local.inverse .nav-link{color:#fff;background-color:#000}.o-nav-local.inverse .nav-link:focus,.o-nav-local.inverse .nav-link:hover{color:#f16e00}.o-nav-local.inverse .nav-link:focus{outline-color:#fff}.o-nav-local.inverse .nav-link.active{color:#f16e00}.skiplinks{z-index:99999}.skiplinks .skiplinks-section li{float:left}.skiplinks .skiplinks-section a{display:block;padding:10px;font-weight:700;border-color:#999;border-style:none solid none none;border-width:0 1px 0 0}.skiplinks .skiplinks-section.skiplinks-show{position:absolute;top:20px;left:50%;z-index:10000000;width:auto;height:auto;margin-left:-175px;overflow:hidden;background:none repeat scroll 0 0 #ccc;border:2px solid #000;box-shadow:2px 2px 1634px 1604px rgba(0,0,0,.3)}.skiplinks .skiplinks-section a:hover{cursor:pointer}.skiplinks .skiplinks-section a:focus,.skiplinks .skiplinks-section a:hover{color:#f16e00;background-color:#fff;outline:0 none}.skiplinks a,.skiplinks div,.skiplinks li,.skiplinks ul{float:none;padding:0;margin:0;font-size:.95em;font-weight:400;line-height:normal;color:#000;text-decoration:none;text-shadow:none;list-style:none;background:none repeat scroll 0 0 transparent;border:0 none}.o-footer{margin-top:2.5rem;font-size:.875rem;font-weight:700;color:#fff;background-color:#000}.o-footer .nav-link{padding:.625rem .625rem;font-size:.875rem;line-height:1.25rem}.o-footer .nav-link:not(:hover),.o-footer .nav-link:not([href]){color:#fff}.o-footer .o-footer-body,.o-footer .o-footer-bottom,.o-footer .o-footer-top{padding-top:.625rem;padding-bottom:.625rem}.o-footer .o-footer-top{border-bottom:1px solid #333}.o-footer .o-footer-body .row{margin-bottom:.625rem}.o-footer .o-footer-body h2{margin-top:.625rem;font-size:.875rem;color:#fff}.o-footer .o-footer-body p,.o-footer .o-footer-body p a{color:#fff}.o-footer .o-footer-body .flex-column .nav-link{padding:0;line-height:1.25}.o-footer .o-footer-bottom{border-top:1px solid #333}@media (max-width:979.98px){.o-responsive-table thead{display:none}.o-responsive-table tbody,.o-responsive-table td,.o-responsive-table th,.o-responsive-table tr{display:block}}@media (max-width:979.98px) and (min-width:768px){.o-responsive-table tr{float:left;width:45%}.o-responsive-table tr:nth-child(odd){margin-right:10%}}@media (max-width:979.98px){.o-responsive-table td,.o-responsive-table th{vertical-align:middle}.o-responsive-table td[data-title]::before{float:left;width:50%;font-weight:700;content:attr(data-title)}.o-responsive-table tr{margin-bottom:2em;border-right:0;border-left:0}.o-responsive-table tbody th[scope=row]{font-weight:700;border-top:0;border-bottom:2px solid #ccc}}.o-scroll-up{position:fixed;right:0;bottom:2.5rem;z-index:1035;display:none;right:1.25%;bottom:.25rem}.o-scroll-up .o-scroll-up-icon{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;float:right;width:2.5rem;height:2.5rem;color:#000;text-align:center;text-decoration:none;background-color:#fff;border-style:solid;border-width:2px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.o-scroll-up .o-scroll-up-icon::before{font-family:icon-orange;font-size:1.25rem;line-height:1.8;content:"\e93f"}@media (min-width:480px){.o-scroll-up{right:1.25%}}@media (min-width:768px){.o-scroll-up{right:1.5625%}}@media (min-width:980px){.o-scroll-up{right:3.125%}}@media (min-width:1220px){.o-scroll-up{right:3.125%}}@media (min-width:1380px){.o-scroll-up{right:4.16667%}}@media (min-width:480px){.o-scroll-up{bottom:.375rem}}@media (min-width:768px){.o-scroll-up{bottom:.75rem}}@media (min-width:980px){.o-scroll-up{bottom:2rem}}@media (min-width:1220px){.o-scroll-up{bottom:2.5rem}}@media (min-width:1380px){.o-scroll-up{bottom:3.75rem}}.o-scroll-up .o-scroll-up-text{display:inline-block;padding:.625rem .625rem;font-weight:700;background-color:#fff;opacity:.8}.o-scroll-up.static{position:static;z-index:auto;display:inline;float:left}.o-scroll-up.static .o-scroll-up-text{float:left}.o-scroll-up.static .o-scroll-up-icon{position:relative;display:inline-block;float:none}.o-scroll-up:focus,.o-scroll-up:hover{color:#f16e00}.o-scroll-up:focus .o-scroll-up-icon,.o-scroll-up:hover .o-scroll-up-icon{color:#fff;background-color:#000}.o-scroll-up:active .o-scroll-up-icon{color:#fff;background-color:#f16e00;border-color:#f16e00}.dropdown-toggle::after{margin-left:.625rem;vertical-align:10%}.dropdown-item{padding-left:1.25rem;font-weight:700}.dropdown-item:focus{color:#000;background-color:#fff;outline:1px dotted}.dropdown-item:focus:hover{color:#fff;background-color:#000}.carousel{margin-bottom:1.875rem}.carousel .carousel-item img{width:100%}.carousel-control-next,.carousel-control-prev{top:auto;bottom:calc(50% - 1.875rem);width:3.75rem;height:3.75rem;text-decoration:none;text-shadow:none;background-color:transparent;opacity:.8;transition:width .5s ease}.carousel-control-next:focus,.carousel-control-prev:focus{outline:2px dotted #000;outline-offset:-1px}.carousel-control-next-icon,.carousel-control-prev-icon{margin-top:-1.125rem;font-size:1.875rem;color:#000;text-shadow:1px 0 0 #fff,0 1px 0 #fff,-1px 0 0 #fff,0 -1px 0 #fff;background-image:none;background-repeat:no-repeat}.carousel-control-next-icon::before,.carousel-control-prev-icon::before{font-family:icon-orange}.carousel-control-prev-icon::before{content:"\e93f"}.carousel-control-next-icon::before{content:"\e93e"}.carousel-indicators{bottom:0;-ms-flex-align:center;align-items:center}.carousel-indicators:hover{cursor:default}.carousel-indicators li{-ms-flex-positive:0;flex-grow:0;width:.625rem;height:.625rem;margin-right:.375rem;background-color:#000;border:1px solid #fff;border-radius:50%}.carousel-indicators li:hover{cursor:pointer}.carousel-indicators li.active{background-color:#f16e00}.swiper-button-next,.swiper-button-prev{top:calc(50% - 10px);width:auto;height:auto;text-shadow:1px 0 0 #fff,0 1px 0 #fff,-1px 0 0 #fff,0 -1px 0 #fff;cursor:pointer;background-image:none;background-size:0}.swiper-button-next:focus,.swiper-button-prev:focus{outline:2px dotted #000;outline-offset:-1px}.swiper-button-next::before,.swiper-button-prev::before{font-family:icon-orange;font-size:1.875rem;content:"\e93f"}.swiper-button-next::before{content:"\e93e"}.swiper-pagination-bullet,.swiper-pagination-bullet-active{width:.625rem;height:.625rem;border:0}.swiper-pagination-bullet{opacity:1}.swiper-pagination-bullet-active{background:#f16e00}.swiper-container{width:100%!important;margin-bottom:30px;overflow:hidden}.swiper-wrapper{margin-bottom:30px}.swiper-pagination{bottom:6px}.swiper-slide .card{border:0}.swiper-slide .card-img{padding:0}.swiper-slide .card-img img{width:100%;height:40vh}.swiper-slide .card-title{margin:0;font-weight:700}.swiper-slide .card-body{position:absolute;bottom:20px;left:40px;background-color:#fff}.swiper-slide .card-body p{margin:0}@media (max-width:979.98px){.swiper-button-next,.swiper-button-prev{display:none}.swiper-container{overflow-x:hidden;overflow-y:visible}.swiper-slide{width:80%}.swiper-slide .card-img img{height:auto}.swiper-slide .card-body{position:static}.swiper-container-horizontal>.swiper-pagination-bullets{bottom:0}.swiper-pagination-bullet{width:8px;height:8px;border:0}}div.active:focus{outline:dotted 1px}a:focus{color:#f16e00;outline:dotted 1px}.close:focus,.close:hover{outline:dotted 1px}.progress.progress-default[value]::-webkit-progress-value{background-color:#f16e00}.progress.progress-default[value]::-moz-progress-bar{background-color:#f16e00}.hero-container .frame{position:absolute;top:0;left:0;max-width:15%;margin:30px}.hero-container .caption{margin:50px 30px}.hero-container .category{font-size:1.25rem;color:#f16e00}
+/*# sourceMappingURL=boosted.min.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/boosted.min.css.map b/dashboard/public/css/boosted.min.css.map
new file mode 100644
index 00000000..c5baf202
--- /dev/null
+++ b/dashboard/public/css/boosted.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["..\\..\\scss\\boosted.scss","..\\..\\scss\\_root.scss","..\\..\\scss\\_reboot.scss","dist\\css\\boosted.css","..\\..\\scss\\vendor\\_rfs.scss","boosted.css","..\\..\\scss\\mixins\\_hover.scss","..\\..\\scss\\_type.scss","..\\..\\scss\\mixins\\_breakpoints.scss","..\\..\\scss\\mixins\\_lists.scss","..\\..\\scss\\_images.scss","..\\..\\scss\\mixins\\_image.scss","..\\..\\scss\\_code.scss","..\\..\\scss\\_grid.scss","..\\..\\scss\\mixins\\_grid.scss","..\\..\\scss\\mixins\\_grid-framework.scss","..\\..\\scss\\_tables.scss","..\\..\\scss\\mixins\\_table-row.scss","..\\..\\scss\\_forms.scss","..\\..\\scss\\mixins\\_border-radius.scss","..\\..\\scss\\mixins\\_transition.scss","..\\..\\scss\\mixins\\_forms.scss","..\\..\\scss\\mixins\\_orangeIcons.scss","..\\..\\scss\\mixins\\_gradients.scss","..\\..\\scss\\_buttons.scss","..\\..\\scss\\mixins\\_buttons.scss","..\\..\\scss\\_transitions.scss","..\\..\\scss\\_dropdown.scss","..\\..\\scss\\mixins\\_caret.scss","..\\..\\scss\\mixins\\_nav-divider.scss","..\\..\\scss\\_button-group.scss","..\\..\\scss\\_input-group.scss","..\\..\\scss\\_custom-forms.scss","..\\..\\scss\\_nav.scss","..\\..\\scss\\_navbar.scss","..\\..\\scss\\_variables.scss","..\\..\\scss\\_card.scss","..\\..\\scss\\_breadcrumb.scss","..\\..\\scss\\_pagination.scss","..\\..\\scss\\mixins\\_pagination.scss","..\\..\\scss\\_badge.scss","..\\..\\scss\\mixins\\_badge.scss","..\\..\\scss\\_jumbotron.scss","..\\..\\scss\\_alert.scss","..\\..\\scss\\mixins\\_alert.scss","..\\..\\scss\\_progress.scss","..\\..\\scss\\_media.scss","..\\..\\scss\\_list-group.scss","..\\..\\scss\\mixins\\_list-group.scss","..\\..\\scss\\_close.scss","..\\..\\scss\\_toasts.scss","..\\..\\scss\\_modal.scss","..\\..\\scss\\_tooltip.scss","..\\..\\scss\\mixins\\_reset-text.scss","..\\..\\scss\\_popover.scss","..\\..\\scss\\_carousel.scss","..\\..\\scss\\mixins\\_clearfix.scss","..\\..\\scss\\_spinners.scss","..\\..\\scss\\utilities\\_align.scss","..\\..\\scss\\mixins\\_background-variant.scss","..\\..\\scss\\utilities\\_background.scss","..\\..\\scss\\utilities\\_borders.scss","..\\..\\scss\\utilities\\_display.scss","..\\..\\scss\\utilities\\_embed.scss","..\\..\\scss\\utilities\\_flex.scss","..\\..\\scss\\utilities\\_float.scss","..\\..\\scss\\utilities\\_overflow.scss","..\\..\\scss\\utilities\\_position.scss","..\\..\\scss\\utilities\\_screenreaders.scss","..\\..\\scss\\mixins\\_screen-reader.scss","..\\..\\scss\\utilities\\_shadows.scss","..\\..\\scss\\utilities\\_sizing.scss","..\\..\\scss\\utilities\\_stretched-link.scss","..\\..\\scss\\utilities\\_spacing.scss","..\\..\\scss\\utilities\\_text.scss","..\\..\\scss\\mixins\\_text-truncate.scss","..\\..\\scss\\mixins\\_text-emphasis.scss","..\\..\\scss\\mixins\\_text-hide.scss","..\\..\\scss\\utilities\\_visibility.scss","..\\..\\scss\\_print.scss","..\\..\\scss\\_o-card.scss","..\\..\\scss\\_o-switches.scss","..\\..\\scss\\_o-forms.scss","..\\..\\scss\\_o-bullet_points.scss","..\\..\\scss\\_o-step_bar.scss","..\\..\\scss\\_o-link-arrow.scss","..\\..\\scss\\_o-megamenu.scss","..\\..\\scss\\_o-navbar.scss","..\\..\\scss\\_o-tables.scss","..\\..\\scss\\_o-modal.scss","..\\..\\scss\\_o-nav.scss","..\\..\\scss\\_o-nav-local.scss","..\\..\\scss\\_o-skiplinks.scss","..\\..\\scss\\_o-footer.scss","..\\..\\scss\\_o-responsive_table.scss","..\\..\\scss\\_o-scroll-up.scss","..\\..\\scss\\_o-dropdown.scss","..\\..\\scss\\_o-carousel.scss","..\\..\\scss\\_orange-css.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n\n// boosted mod\n@import \"o-card\";\n@import \"o-switches\";\n@import \"o-forms\";\n@import \"o-bullet_points\";\n@import \"o-step_bar\";\n@import \"o-link-arrow\";\n@import \"o-megamenu\";\n@import \"o-navbar\";\n@import \"o-tables\";\n@import \"o-modal\";\n@import \"o-nav\";\n@import \"o-nav-local\";\n@import \"o-skiplinks\";\n@import \"o-footer\";\n@import \"o-responsive_table\";\n@import \"o-scroll-up\";\n@import \"o-dropdown\";\n@import \"o-carousel\";\n@import \"orange-css\";\n// end mod\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// Boosted Mod\np a {\n text-decoration: underline;\n\n @include hover-focus {\n text-decoration: underline;\n }\n}\n// End mod\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xxl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xxl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xxl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xxl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xxl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xxl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xxl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xxl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xxl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xxl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xxl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xxl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xxl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xxl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0.625rem 0.625rem 0;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0.3125rem 0.3125rem 0;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::-webkit-input-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0;\n border-bottom: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -2px;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.84375rem;\n padding-left: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.46875rem;\n padding-left: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.9375rem;\n padding-left: 0.9375rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -2px;\n}\n\n.input-group-prepend {\n margin-right: -2px;\n}\n\n.input-group-append {\n margin-left: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-left: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-right: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n /* rtl:begin:ignore */\n top: .4rem;\n /* rtl:end:ignore */\n left: .2585rem;\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n -webkit-transform: rotate(-45deg);\n transform: rotate(-45deg);\n /* rtl:end:ignore */\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n border-left: none;\n -webkit-transform: scaleX(0.5) translateY(-0.5rem);\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-left: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n left: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-right: 4.375rem;\n padding-left: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: 0;\n left: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n right: calc(1.875rem + 2px);\n left: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n -webkit-transform: translateX(1.875rem);\n transform: translateX(1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 1.5rem 0.4375rem 0.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-left: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-left: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-left: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.125rem;\n margin-left: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n -ms-flex-item-align: end;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-left: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-item-align: end;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n -ms-flex-align: stretch;\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 .625rem 0 0;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n -ms-flex-item-align: end;\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -2.5rem;\n margin-left: -2.5rem;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-right: 2.5rem;\n margin-bottom: 0;\n margin-left: 2.5rem;\n }\n}\n\n.card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.accordion .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-left: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-left: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-left: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -50px);\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: none;\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: -ms-flexbox;\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem -0.625rem -0.625rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 0.625rem;\n margin-left: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n -webkit-transform: none;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 1.875rem;\n margin-left: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: spinner-border .75s linear infinite;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: spinner-grow .75s linear infinite;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-right: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-left: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xxl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xxl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xxl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: left !important;\n }\n .float-xxl-right {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: left !important;\n }\n .text-xxl-right {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n -ms-flex-item-align: center;\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n -ms-flex-direction: column;\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n -ms-flex-direction: row;\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n -ms-flex-preferred-size: 20%;\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n -ms-flex-preferred-size: 80%;\n flex-basis: 80%;\n -ms-flex-item-align: center;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n .o-card-link .card-title {\n -ms-flex-item-align: start;\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: right;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n right: 0;\n left: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-pack: start;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n -ms-flex-order: 1;\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n}\n\n.form-group.row.top {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.form-group.row.top .form-control {\n -ms-flex-order: 2;\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n -ms-flex-item-align: center;\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-left: 0;\n color: #f16e00;\n text-align: left;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-left: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: left;\n padding: 0.625rem 1.25rem;\n padding-left: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-left: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 0.625rem 0.3125rem 2rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n right: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-left: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0.625rem 0 0;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: -webkit-transform .5s;\n transition: transform .5s;\n transition: transform .5s, -webkit-transform .5s;\n -webkit-transform: translateX(0);\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-left: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n -webkit-transform: rotateZ(0deg);\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n -webkit-transform: rotateZ(180deg);\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n -webkit-transform: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n -ms-flex-positive: 1;\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n -ms-flex-item-align: center;\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-left: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-right: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-right: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-left: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: left;\n}\n\n.modal .modal-content {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: row;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-right: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n -ms-flex-item-align: end;\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-left: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n -ms-flex-direction: column;\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n -ms-flex-item-align: center;\n align-self: center;\n margin-right: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n -ms-flex-item-align: center;\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-left: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-left: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: 0;\n }\n}\n\n.o-tab-container {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n -ms-flex-item-align: end;\n align-self: flex-end;\n -ms-flex-order: 1;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n -ms-flex-positive: 1;\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: 700;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-left: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n}\n\n.o-nav-local ul + ul {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-left: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-left: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-left: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: left;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 #ccc;\n border: 2px solid #000;\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: left;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-right: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n right: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n float: right;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n /* rtl:ignore */\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n /* rtl:ignore */\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n right: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n right: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n right: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n -ms-flex-positive: 0;\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n/*# sourceMappingURL=boosted.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","@charset \"UTF-8\";\n/*!\n * Boosted v4.3.1 (https://boosted.orange.com)\n * Copyright 2014-2019 The Boosted Authors\n * Copyright 2014-2019 Orange\n * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)\n * This a fork of Bootstrap : Initial license below\n * Bootstrap v4.3.1 (https://getbootstrap.com)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #527edb;\n --indigo: #6610f2;\n --purple: #a885d8;\n --pink: #ffb4e6;\n --red: #cd3c14;\n --orange: #f16e00;\n --yellow: #fc0;\n --green: #32c832;\n --teal: #50be87;\n --cyan: #4bb4e6;\n --white: #fff;\n --gray: #999;\n --gray-dark: #595959;\n --primary: #f16e00;\n --secondary: #000;\n --success: #32c832;\n --info: #527edb;\n --warning: #fc0;\n --danger: #cd3c14;\n --light: #ddd;\n --dark: #000;\n --breakpoint-xs: 0;\n --breakpoint-sm: 480px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 980px;\n --breakpoint-xl: 1220px;\n --breakpoint-xxl: 1380px;\n --font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 1.25rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #000;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\np a {\n text-decoration: underline;\n}\n\np a:hover, p a:focus {\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.625rem 0.625rem 0.625rem 0;\n padding-bottom: 0.625rem 0.625rem 0.625rem 0;\n color: #666;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.625rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 1.25rem;\n font-family: inherit;\n font-weight: 700;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.125rem;\n}\n\nh2, .h2 {\n font-size: 1.875rem;\n}\n\nh3, .h3 {\n font-size: 1.5rem;\n}\n\nh4, .h4 {\n font-size: 1.25rem;\n}\n\nh5, .h5 {\n font-size: 1.125rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n@media (max-width: 767.98px) {\n h1, .h1 {\n font-size: 1.25rem;\n }\n h2, .h2 {\n font-size: 1.125rem;\n }\n h3, .h3 {\n font-size: 1rem;\n }\n h4, .h4 {\n font-size: 0.875rem;\n }\n h5, .h5 {\n font-size: 0.875rem;\n }\n h6, .h6 {\n font-size: 0.875rem;\n }\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 3.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 3.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 2.125rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n border: 0;\n border-top: 1px solid #eee;\n}\n\nsmall,\n.small {\n font-size: 0.875rem;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #f16e00;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.3125rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1.25rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 0.875rem;\n color: #666;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.625rem;\n background-color: #fff;\n border: 2px solid #000;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.625rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #333;\n}\n\ncode {\n font-size: 87.5%;\n color: #333;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.0625rem 0.0625rem;\n font-size: 87.5%;\n color: #000;\n background-color: #eee;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #333;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n max-width: 312px;\n margin-right: auto;\n margin-left: auto;\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .container {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 480px) {\n .container {\n max-width: 468px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 744px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container {\n max-width: 960px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container {\n max-width: 1200px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container {\n max-width: 1320px;\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 5px;\n padding-left: 5px;\n margin-right: 1.25%;\n margin-left: 1.25%;\n width: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 480px) {\n .container-fluid {\n margin-right: 1.25%;\n margin-left: 1.25%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n margin-right: 1.5625%;\n margin-left: 1.5625%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .container-fluid {\n margin-right: 3.125%;\n margin-left: 3.125%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .container-fluid {\n margin-right: 4.16667%;\n margin-left: 4.16667%;\n }\n .container-fluid .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n@media (min-width: 480px) {\n .row {\n margin-right: -5px;\n margin-left: -5px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 980px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1220px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n@media (min-width: 1380px) {\n .row {\n margin-right: -10px;\n margin-left: -10px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n.col-xxl-auto {\n position: relative;\n width: 100%;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n@media (min-width: 480px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 980px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1220px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n@media (min-width: 1380px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl,\n .col-xxl-auto {\n padding-right: 10px;\n padding-left: 10px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 480px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 980px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1220px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1380px) {\n .col-xxl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xxl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xxl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xxl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xxl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xxl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xxl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xxl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xxl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xxl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xxl-first {\n order: -1;\n }\n .order-xxl-last {\n order: 13;\n }\n .order-xxl-0 {\n order: 0;\n }\n .order-xxl-1 {\n order: 1;\n }\n .order-xxl-2 {\n order: 2;\n }\n .order-xxl-3 {\n order: 3;\n }\n .order-xxl-4 {\n order: 4;\n }\n .order-xxl-5 {\n order: 5;\n }\n .order-xxl-6 {\n order: 6;\n }\n .order-xxl-7 {\n order: 7;\n }\n .order-xxl-8 {\n order: 8;\n }\n .order-xxl-9 {\n order: 9;\n }\n .order-xxl-10 {\n order: 10;\n }\n .order-xxl-11 {\n order: 11;\n }\n .order-xxl-12 {\n order: 12;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1.25rem;\n color: #000;\n background-color: #fff;\n}\n\n.table th,\n.table td {\n padding: 0.625rem 0.625rem 0.625rem 0;\n vertical-align: top;\n border-top: 1px solid #ccc;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #ccc;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #ccc;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3125rem 0.3125rem 0.3125rem 0;\n}\n\n.table-bordered {\n border: 1px solid #ccc;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #ccc;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: #f6f6f6;\n}\n\n.table-hover tbody tr:hover {\n color: #000;\n background-color: #eee;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #f16e00;\n}\n\n.table-hover .table-primary:hover {\n background-color: #d86200;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #d86200;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-secondary:hover {\n background-color: black;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: black;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #32c832;\n}\n\n.table-hover .table-success:hover {\n background-color: #2db42d;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #2db42d;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #527edb;\n}\n\n.table-hover .table-info:hover {\n background-color: #3d6ed7;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffcc00;\n}\n\n.table-hover .table-warning:hover {\n background-color: #e6b800;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #e6b800;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #cd3c14;\n color: #fff;\n}\n\n.table-hover .table-danger:hover {\n background-color: #b63512;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #b63512;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #dddddd;\n}\n\n.table-hover .table-light:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #d0d0d0;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: black;\n color: #fff;\n}\n\n.table-hover .table-dark:hover {\n background-color: black;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: black;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: #ddd;\n}\n\n.table-hover .table-active:hover {\n background-color: #d0d0d0;\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: #d0d0d0;\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #000;\n border-color: #ccc;\n}\n\n.table .thead-light th {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.table-dark {\n color: #fff;\n background-color: #000;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #ccc;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: #333;\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: #666;\n}\n\n@media (max-width: 479.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 979.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1219.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1379.98px) {\n .table-responsive-xxl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xxl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\nlabel {\n font-weight: 700;\n}\n\nlabel.disabled {\n color: #767676;\n}\n\nlabel.is-required::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #ccc;\n border-radius: 0;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n outline: 0;\n}\n\n.form-control::placeholder {\n color: #666;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n color: #666;\n background-color: #eee;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem + 2px);\n padding-bottom: calc(0.5rem + 2px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.25;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.594rem + 2px);\n padding-bottom: calc(0.594rem + 2px);\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.157rem + 2px);\n padding-bottom: calc(0.157rem + 2px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n color: #000;\n background-color: transparent;\n border: solid transparent;\n border-width: 2px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.6265rem + 4px);\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-lg {\n height: calc(2.8755rem + 4px);\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1.25rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.625rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n margin-bottom: 0.625rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #666;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #000;\n background-color: rgba(50, 200, 50, 0.9);\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:valid ~ .valid-feedback::after, .form-control.is-valid ~ .valid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #32c832;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332c832' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #32c832;\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #32c832;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #58d558;\n background-color: #58d558;\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #32c832;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.625rem 0.625rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.25;\n color: #fff;\n background-color: rgba(205, 60, 20, 0.9);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback {\n position: relative;\n display: block;\n padding-left: 1.625rem;\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback::after, .form-control.is-invalid ~ .invalid-feedback::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: 2.25rem;\n background-position: top calc(0.3125em + 0.25rem) right calc(0.3125em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #cd3c14;\n padding-right: 3.1875rem;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23cd3c14' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.5rem/1.125rem 1.125rem;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #cd3c14;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #ea532a;\n background-color: #ea532a;\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #cd3c14;\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 480px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n color: #000;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 2px solid transparent;\n padding: 0.5rem 1.125rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #000;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: none;\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 1;\n}\n\na.btn {\n text-decoration: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary,\n.btn-warning {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary:hover, .btn-primary:focus,\n.btn-warning:hover,\n.btn-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-primary.disabled, .btn-primary:disabled,\n.btn-warning.disabled,\n.btn-warning:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle,\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.dropdown-toggle {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-primary.btn-inverse,\n.btn-warning.btn-inverse {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-primary.btn-inverse:hover, .btn-primary.btn-inverse:focus,\n.btn-warning.btn-inverse:hover,\n.btn-warning.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-primary.btn-inverse.disabled, .btn-primary.btn-inverse:disabled,\n.btn-warning.btn-inverse.disabled,\n.btn-warning.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-primary.btn-inverse:not(:disabled):not(.disabled):active, .btn-primary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-primary.btn-inverse.dropdown-toggle,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-warning.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-warning.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary,\n.btn-light {\n color: #000;\n background-color: transparent;\n border-color: #000;\n}\n\n.btn-secondary:hover, .btn-secondary:focus,\n.btn-light:hover,\n.btn-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled,\n.btn-light.disabled,\n.btn-light:disabled {\n color: #ccc;\n background-color: transparent;\n border-color: #ccc;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle,\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-secondary.btn-inverse,\n.btn-light.btn-inverse {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse:hover, .btn-secondary.btn-inverse:focus,\n.btn-light.btn-inverse:hover,\n.btn-light.btn-inverse:focus {\n color: #fff;\n background-color: #000;\n border-color: #fff;\n}\n\n.btn-secondary.btn-inverse.disabled, .btn-secondary.btn-inverse:disabled,\n.btn-light.btn-inverse.disabled,\n.btn-light.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-secondary.btn-inverse:not(:disabled):not(.disabled):active, .btn-secondary.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.btn-inverse.dropdown-toggle,\n.btn-light.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-light.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-light.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success:hover, .btn-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-success.btn-inverse {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.btn-success.btn-inverse:hover, .btn-success.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-success.btn-inverse.disabled, .btn-success.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-success.btn-inverse:not(:disabled):not(.disabled):active, .btn-success.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-success.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info,\n.btn-dark {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-info:hover, .btn-info:focus,\n.btn-dark:hover,\n.btn-dark:focus {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.btn-info.disabled, .btn-info:disabled,\n.btn-dark.disabled,\n.btn-dark:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle,\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-info.btn-inverse,\n.btn-dark.btn-inverse {\n color: #fff;\n background-color: transparent;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse:hover, .btn-info.btn-inverse:focus,\n.btn-dark.btn-inverse:hover,\n.btn-dark.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-info.btn-inverse.disabled, .btn-info.btn-inverse:disabled,\n.btn-dark.btn-inverse.disabled,\n.btn-dark.btn-inverse:disabled {\n color: #666;\n background-color: transparent;\n border-color: #666;\n}\n\n.btn-info.btn-inverse:not(:disabled):not(.disabled):active, .btn-info.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-info.btn-inverse.dropdown-toggle,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled):active,\n.btn-dark.btn-inverse:not(:disabled):not(.disabled).active,\n.show >\n.btn-dark.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger:hover, .btn-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-danger.btn-inverse {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-danger.btn-inverse:hover, .btn-danger.btn-inverse:focus {\n color: #000;\n background-color: #fff;\n border-color: #fff;\n}\n\n.btn-danger.btn-inverse.disabled, .btn-danger.btn-inverse:disabled {\n color: #000;\n background-color: #666;\n border-color: #666;\n}\n\n.btn-danger.btn-inverse:not(:disabled):not(.disabled):active, .btn-danger.btn-inverse:not(:disabled):not(.disabled).active,\n.show > .btn-danger.btn-inverse.dropdown-toggle {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-primary:hover, .btn-outline-primary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-secondary {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary:hover, .btn-outline-secondary:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-success {\n color: #32c832;\n border-color: #32c832;\n}\n\n.btn-outline-success:hover, .btn-outline-success:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #32c832;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-info {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-info:hover, .btn-outline-info:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning {\n color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-warning:hover, .btn-outline-warning:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f16e00;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-danger {\n color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.btn-outline-danger:hover, .btn-outline-danger:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #cd3c14;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-light {\n color: #ddd;\n border-color: #ddd;\n}\n\n.btn-outline-light:hover, .btn-outline-light:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #ddd;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-outline-dark {\n color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark:hover, .btn-outline-dark:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #000;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.btn-link {\n color: #000;\n}\n\n.btn-link.btn-inverse {\n color: #fff;\n}\n\n.btn-link:hover {\n color: #f16e00;\n text-decoration: none;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: none;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #ccc;\n pointer-events: none;\n}\n\n.btn-xlg {\n padding: 0.8125rem 1.25rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0;\n}\n\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail:hover, .btn-mail:focus {\n outline: none;\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n outline: none;\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin:hover, .btn-lin:focus {\n outline: none;\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n outline: none;\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n outline: none;\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n outline: none;\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw:hover, .btn-tw:focus {\n outline: none;\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n outline: none;\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n outline: none;\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n outline: none;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0 0;\n margin: -2px 0 0;\n font-size: 1rem;\n color: #000;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 480px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 980px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1220px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1380px) {\n .dropdown-menu-xxl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: -2px;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0;\n border-right: 0.4375rem solid transparent;\n border-bottom: 0.4375rem solid;\n border-left: 0.4375rem solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: -2px;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0;\n border-bottom: 0.4375rem solid transparent;\n border-left: 0.4375rem solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: -2px;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.4375rem;\n vertical-align: 0.21875rem;\n content: \"\";\n border-top: 0.4375rem solid transparent;\n border-right: 0.4375rem solid;\n border-bottom: 0.4375rem solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.625rem 0;\n overflow: hidden;\n border-top: 1px solid #eee;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.625rem 0.625rem;\n clear: both;\n font-weight: 400;\n color: #000;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #000;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #666;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0 0.625rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #000;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -2px;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.84375rem;\n padding-left: 0.84375rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.46875rem;\n padding-left: 0.46875rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.9375rem;\n padding-left: 0.9375rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -2px;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -2px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -2px;\n}\n\n.input-group-prepend {\n margin-right: -2px;\n}\n\n.input-group-append {\n margin-left: -2px;\n}\n\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #eee;\n border: 2px solid #ccc;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(2.8755rem + 4px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.594rem 1.25rem;\n font-size: 1.125rem;\n line-height: 1.5;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.6265rem + 4px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.157rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.5rem;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.25rem;\n padding-left: 1.875rem;\n margin-bottom: 0.625rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1.25rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before::before {\n background-color: #f16e00;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n outline: dotted 1px #000;\n box-shadow: none;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #767676;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n border-color: #ccc;\n}\n\n.custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-control-label {\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-color: #fff;\n border: #666 solid 2px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0rem;\n left: 0;\n display: block;\n width: 1.25rem;\n height: 1.25rem;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 1rem;\n}\n\n.custom-checkbox .custom-control-input:not(:disabled):checked ~ .custom-control-label::before {\n border: 2px solid #f16e00;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n /* rtl:begin:ignore */\n top: .4rem;\n /* rtl:end:ignore */\n left: .2585rem;\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n /* rtl:end:ignore */\n}\n\n.custom-checkbox .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: #000;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #f16e00;\n background-color: #f16e00;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n border: 3px solid #fff;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(0.5) translateY(-0.5rem);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #fff;\n border-color: #fff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n border: 6px solid #f16e00;\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::after {\n border-color: #ccc;\n}\n\n.custom-switch {\n padding-left: 4.375rem;\n}\n\n.custom-switch .custom-control-input:focus ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n}\n\n.custom-switch .custom-control-label {\n padding-top: .3125rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: 0;\n width: 3.75rem;\n height: 1.875rem;\n pointer-events: all;\n background-color: #666;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 1.975rem;\n border-radius: 0;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0rem + 2px);\n left: 2px;\n width: calc(3.75rem / 2 - 4px);\n height: calc(1.875rem - 4px);\n background-color: #fff;\n border-radius: 0;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch.right {\n padding-right: 4.375rem;\n padding-left: 0;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: 0;\n left: auto;\n}\n\n.custom-switch.right .custom-control-label::after {\n right: calc(1.875rem + 2px);\n left: auto;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: .25rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(1.875rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-switch .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #ccc;\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n padding: 0.4375rem 1.5rem 0.4375rem 0.5rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n vertical-align: middle;\n background: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") no-repeat right 0.5rem center/8px 10px;\n background-color: #fff;\n border: 2px solid #ccc;\n border-radius: 0;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #000;\n outline: 0;\n box-shadow: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #000;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.5rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #999;\n background-color: #eee;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.6265rem + 4px);\n padding-top: 0.157rem;\n padding-bottom: 0.157rem;\n padding-left: 0.625rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(2.8755rem + 4px);\n padding-top: 0.594rem;\n padding-bottom: 0.594rem;\n padding-left: 1.25rem;\n font-size: 1.125rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 4px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #000;\n box-shadow: none;\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #eee;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 4px);\n padding: 0.5rem 0.625rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n background-color: #fff;\n border: 2px solid #ccc;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.5rem 0.625rem;\n line-height: 1.25;\n color: #000;\n content: \"Browse\";\n background-color: #eee;\n border-left: inherit;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.25rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.125rem #000;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #999;\n border-color: transparent;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.125rem;\n margin-left: 0.125rem;\n background-color: #000;\n border: 0;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #f16e00;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #999;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #999;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #ccc;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #ccc;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.625rem 1.25rem;\n font-weight: 700;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #666;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 2px solid #000;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -2px;\n}\n\n.nav-tabs .nav-link {\n padding: 0.625rem calc(1.25rem - 2px);\n line-height: 1rem;\n border: 2px solid transparent;\n border-bottom-width: 0;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #666;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #000;\n background-color: #fff;\n border-color: #000;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -2px;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0 0;\n font-weight: 700;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end;\n padding-top: 0;\n padding-bottom: 0;\n margin: .625rem .3125rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-brand + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-brand:focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n}\n\n.navbar-brand img {\n flex-wrap: wrap;\n width: 1.875rem;\n height: 1.875rem;\n margin-top: 0;\n margin-bottom: .25rem;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-top: auto;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link.active::before {\n display: none;\n}\n\n.navbar-nav .nav-link.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n}\n\n.navbar-nav .nav-link[class^=\"svg-\"] {\n margin: .625rem;\n}\n\n.navbar-nav .nav-link[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: 1rem;\n font-weight: 400;\n color: #fff;\n content: \"\\e93e\";\n}\n\n.navbar-nav .nav-link:focus {\n outline-offset: .625rem;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n top: 2rem;\n float: none;\n}\n\n.navbar-nav .nav-item {\n margin-left: 0;\n font-size: 1.125rem;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown {\n padding: 0;\n}\n\n.navbar-nav .dropdown .dropdown-toggle,\n.navbar-nav .dropdown .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n}\n\n.navbar-nav .dropdown.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n}\n\n.navbar-nav .dropdown .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-nav .dropdown .dropdown-item:focus {\n color: #f16e00;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-self: flex-end;\n}\n\n.navbar-collapse .navbar-nav {\n align-items: stretch;\n}\n\n.navbar-toggler {\n padding: 0.5rem 0.5rem;\n margin: 0.3125rem 0;\n font-size: 1rem;\n line-height: 1;\n background-color: transparent;\n border: 2px solid transparent;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n background-color: #fff;\n}\n\n.navbar-toggler:hover .navbar-toggler-icon, .navbar-toggler:focus .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:active {\n background-color: #f16e00;\n}\n\n.navbar-toggler:active .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-toggler:focus {\n outline: 0;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-sm .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-sm .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-sm.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-sm.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .dropdown-item.active, .navbar-expand-sm .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-sm .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-sm .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-md .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-md .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-md.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-md.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .dropdown-item.active, .navbar-expand-md .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-md .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-md .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-lg .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-lg .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-lg.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-lg.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .dropdown-item.active, .navbar-expand-lg .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-lg .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-lg .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .dropdown-item.active, .navbar-expand-xl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n }\n .navbar-expand-xxl .navbar-brand {\n margin: 0 .625rem 0 0;\n }\n .navbar-expand-xxl .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n }\n .navbar-expand-xxl.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n }\n .navbar-expand-xxl.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-item.active, .navbar-expand-xxl .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n }\n .navbar-expand-xxl .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n }\n .navbar-expand-xxl .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n }\n .navbar-expand-xxl > .container,\n .navbar-expand-xxl > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: 1.5625rem 0 1.3125rem;\n}\n\n.navbar-expand .navbar-brand {\n margin: 0 .625rem 0 0;\n}\n\n.navbar-expand .navbar-brand img {\n width: 3.125rem;\n height: 3.125rem;\n}\n\n.navbar-expand.minimized {\n padding-top: 1.25rem;\n padding-bottom: 1rem;\n}\n\n.navbar-expand.minimized .navbar-brand img {\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-item {\n color: #000;\n background-color: #fff;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .dropdown-item.active, .navbar-expand .navbar-nav .dropdown-item:hover {\n color: #fff;\n background-color: #000;\n}\n\n.navbar-expand .navbar-nav .nav-item {\n font-size: 1rem;\n border: 0;\n}\n\n.navbar-expand .navbar-nav .nav-item.dropdown {\n align-self: flex-end;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 0;\n margin-left: 1.25rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n padding-right: 10px;\n padding-left: 10px;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: #000;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: #000;\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-light .navbar-toggler {\n color: #000;\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: #000;\n}\n\n.navbar-light .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: #ddd;\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-toggler {\n color: #fff;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='%23fff' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a {\n color: #f16e00;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #f16e00;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 2px solid #000;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n color: #000;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n border-bottom: 2px solid #000;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border-top: 2px solid #000;\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n}\n\n.card-img-top {\n width: 100%;\n}\n\n.card-img-bottom {\n width: 100%;\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -2.5rem;\n margin-left: -2.5rem;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 2.5rem;\n margin-bottom: 0;\n margin-left: 2.5rem;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 10px;\n}\n\n@media (min-width: 480px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 2.5rem;\n}\n\n@media (min-width: 480px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n /* boosted mod */\n}\n\n.accordion .card {\n margin-bottom: 0;\n border: 0;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.accordion .card ~ .card {\n border-top: 0;\n}\n\n.accordion .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n}\n\n.accordion .card-header,\n.accordion .card-header h5 {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.accordion .card-header button,\n.accordion .card-header a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n}\n\n.accordion .card-header button::after,\n.accordion .card-header a::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.accordion .card-header button[aria-expanded=\"true\"]::after,\n.accordion .card-header a[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n}\n\n.accordion .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n}\n\n@media (max-width: 767.98px) {\n .accordion .card {\n border-top-width: 2px;\n border-bottom-width: 2px;\n }\n .accordion .card ~ .card {\n border-top: 0;\n }\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.625rem 0;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1.428571;\n list-style: none;\n background-color: #fff;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n line-height: 1;\n color: #000;\n content: \"\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #f16e00;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n min-width: 2.5rem;\n min-height: 2.5rem;\n padding: 0.625rem 0.8rem;\n margin-left: 0;\n font-weight: 700;\n line-height: 1;\n color: #000;\n background-color: #fff;\n border: 2px solid transparent;\n}\n\n.page-link:hover, .page-link:focus {\n z-index: 2;\n color: #000;\n text-decoration: none;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-link:hover span, .page-link:focus span {\n color: #000;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: none;\n}\n\n.page-link span {\n color: #fff;\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item.presentation {\n padding: .625rem 0;\n font-weight: 700;\n}\n\n.page-item.presentation + .page-item .page-link, .page-item:first-child .page-link {\n margin-left: 0;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link::before, .page-item:first-child .page-link::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item.presentation + .page-item .page-link:hover::before, .page-item.presentation + .page-item .page-link:focus::before, .page-item:first-child .page-link:hover::before, .page-item:first-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.presentation + .page-item .page-link.has-label, .page-item:first-child .page-link.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n}\n\n.page-item.presentation + .page-item .page-link:hover, .page-item.presentation + .page-item .page-link:focus, .page-item:first-child .page-link:hover, .page-item:first-child .page-link:focus, .page-item:last-child .page-link:hover, .page-item:last-child .page-link:focus {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item.presentation + .page-item .page-link:active, .page-item:first-child .page-link:active, .page-item:last-child .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item:last-child .page-link {\n border-color: #000;\n}\n\n.page-item:last-child .page-link::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n}\n\n.page-item:last-child .page-link:hover::before, .page-item:last-child .page-link:focus::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item:last-child .page-link.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.page-item .page-link:active {\n z-index: 1;\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.page-item.active:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.active:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled .page-link {\n color: #ccc;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.page-item.disabled:first-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item.disabled:last-child .page-link::before {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\");\n}\n\n.page-item + .page-item {\n margin-left: .625rem;\n}\n\n.pagination-lg .page-link {\n min-width: 3.125rem;\n min-height: 3.125rem;\n padding: 0.875rem 1.125rem;\n font-size: 1.125rem;\n line-height: 1.111111;\n}\n\n.pagination-lg .page-item:first-child .page-link::before,\n.pagination-lg .page-item:last-child .page-link::before {\n top: 1.03125rem;\n}\n\n.pagination-sm .page-link {\n min-width: 1.875rem;\n min-height: 1.875rem;\n padding: 0.375rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.428571;\n}\n\n.pagination-sm .page-item:first-child .page-link::before,\n.pagination-sm .page-item:last-child .page-link::before {\n top: .53125rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.1875rem 0.625rem;\n font-size: 0.875rem;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.625rem;\n padding-left: 0.625rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #f16e00;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #be5700;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #000;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge-success {\n color: #000;\n background-color: #32c832;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #000;\n background-color: #289f28;\n}\n\n.badge-info {\n color: #000;\n background-color: #527edb;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #000;\n background-color: #2b60cf;\n}\n\n.badge-warning {\n color: #000;\n background-color: #fc0;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #000;\n background-color: #cca300;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #cd3c14;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #9f2e0f;\n}\n\n.badge-light {\n color: #000;\n background-color: #ddd;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #000;\n background-color: #c4c4c4;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #000;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: black;\n}\n\n.badge[href]:focus {\n outline-color: #fff;\n outline-offset: -1px;\n}\n\n.badge[href]:focus.badge-light {\n outline-color: #000;\n}\n\n.jumbotron {\n padding: 2.5rem 1.25rem;\n margin-bottom: 2.5rem;\n color: #000;\n background-color: #fff;\n}\n\n@media (min-width: 480px) {\n .jumbotron {\n padding: 5rem 2.5rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.8125rem 1.25rem;\n margin-bottom: 1.25rem;\n border: 0 solid transparent;\n}\n\n.alert .alert-icon {\n position: absolute;\n top: .625rem;\n}\n\n.alert .alert-icon::after {\n width: 1.76rem;\n height: 1.76rem;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.alert-sm {\n padding: 0.3125rem 1.25rem;\n}\n\n.alert-sm .alert-icon {\n top: .4375rem;\n}\n\n.alert-sm .alert-icon::after {\n width: 1rem;\n height: 1rem;\n}\n\n.alert-lg {\n padding: 1rem 1.25rem;\n}\n\n.alert-lg .alert-icon {\n top: .625rem;\n}\n\n.alert-lg .alert-icon::after {\n width: 2rem;\n height: 2rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.8125rem 1.25rem;\n line-height: 0.8125rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #000;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.alert-primary hr {\n border-top-color: #d86200;\n}\n\n.alert-primary .alert-link {\n color: black;\n}\n\n.alert-secondary {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-secondary hr {\n border-top-color: black;\n}\n\n.alert-secondary .alert-link {\n color: #e6e6e6;\n}\n\n.alert-success {\n color: #000;\n background-color: #32c832;\n border-color: #32c832;\n}\n\n.alert-success hr {\n border-top-color: #2db42d;\n}\n\n.alert-success .alert-link {\n color: black;\n}\n\n.alert-info {\n color: #000;\n background-color: #527edb;\n border-color: #527edb;\n}\n\n.alert-info hr {\n border-top-color: #3d6ed7;\n}\n\n.alert-info .alert-link {\n color: black;\n}\n\n.alert-warning {\n color: #000;\n background-color: #ffcc00;\n border-color: #ffcc00;\n}\n\n.alert-warning hr {\n border-top-color: #e6b800;\n}\n\n.alert-warning .alert-link {\n color: black;\n}\n\n.alert-danger {\n color: #fff;\n background-color: #cd3c14;\n border-color: #cd3c14;\n}\n\n.alert-danger hr {\n border-top-color: #b63512;\n}\n\n.alert-danger .alert-link {\n color: #e6e6e6;\n}\n\n.alert-light {\n color: #000;\n background-color: #dddddd;\n border-color: #dddddd;\n}\n\n.alert-light hr {\n border-top-color: #d0d0d0;\n}\n\n.alert-light .alert-link {\n color: black;\n}\n\n.alert-dark {\n color: #fff;\n background-color: black;\n border-color: black;\n}\n\n.alert-dark hr {\n border-top-color: black;\n}\n\n.alert-dark .alert-link {\n color: #e6e6e6;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1.25rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1.25rem;\n overflow: hidden;\n font-size: 1rem;\n background-color: #ccc;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #000;\n text-align: center;\n white-space: nowrap;\n background-color: #f16e00;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .progress {\n width: 100%;\n height: 0.625rem;\n line-height: 0.625rem;\n }\n .progress-bar {\n font-size: 0.875rem;\n line-height: 0.625rem;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1.25rem 1.25rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #000;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #f16e00;\n text-decoration: none;\n background-color: #f6f6f6;\n}\n\n.list-group-item-action:active {\n color: #000;\n background-color: #eee;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.625rem 0.625rem;\n margin-bottom: -2px;\n color: #000;\n background-color: #fff;\n border: 2px solid #000;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #ccc;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n}\n\n@media (min-width: 480px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 980px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1220px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n@media (min-width: 1380px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl .list-group-item {\n margin-right: -2px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xxl .list-group-item:last-child {\n margin-right: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -2px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #000;\n background-color: #f16e00;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #000;\n background-color: #d86200;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-secondary {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-success {\n color: #000;\n background-color: #32c832;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #000;\n background-color: #2db42d;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-info {\n color: #000;\n background-color: #527edb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #000;\n background-color: #3d6ed7;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-warning {\n color: #000;\n background-color: #ffcc00;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #000;\n background-color: #e6b800;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-danger {\n color: #000;\n background-color: #cd3c14;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #000;\n background-color: #b63512;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-light {\n color: #000;\n background-color: #dddddd;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #000;\n background-color: #d0d0d0;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.list-group-item-dark {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #fff;\n background-color: black;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 1;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: 1;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: none;\n backdrop-filter: blur(10px);\n opacity: 0;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.625rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.3125rem 0.625rem;\n color: #999;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.625rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.625rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1.25rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1.25rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1.25rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: #000;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 2px solid #000;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #333;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 0.625rem 0.625rem;\n border-bottom: 2px solid #000;\n}\n\n.modal-header .close {\n padding: 0.625rem 0.625rem;\n margin: -0.625rem -0.625rem -0.625rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.25;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 0.625rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0.625rem;\n border-top: 2px solid #000;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 480px) {\n .modal-dialog {\n max-width: 700px;\n margin: 1.875rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.75rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.75rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.75rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.75rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 980px) {\n .modal-lg,\n .modal-xl {\n max-width: 700px;\n }\n}\n\n@media (min-width: 1220px) {\n .modal-xl {\n max-width: 700px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0.3125rem;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.625rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.3125rem 0.625rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.625rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.3125rem 0.625rem;\n border-bottom-color: #ddd;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.625rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.3125rem 0 0.3125rem 0.625rem;\n border-left-color: #ddd;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 1.25rem 1.25rem;\n color: #000;\n text-align: center;\n background-color: #ddd;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.25;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n font-weight: 700;\n word-wrap: break-word;\n background-color: #ddd;\n background-clip: padding-box;\n border: 2px solid #ddd;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 0.625rem;\n height: 0.3125rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.3125rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 2px;\n border-width: 0.3125rem 0.3125rem 0;\n border-top-color: #ddd;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.3125rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 2px;\n border-width: 0.3125rem 0.3125rem 0.3125rem 0;\n border-right-color: #ddd;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.3125rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.3125rem + 2px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 2px;\n border-width: 0 0.3125rem 0.3125rem 0.3125rem;\n border-bottom-color: #ddd;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 0.625rem;\n margin-left: -0.3125rem;\n content: \"\";\n border-bottom: 2px solid #ddd;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.3125rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.3125rem + 2px) * -1);\n width: 0.3125rem;\n height: 0.625rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 2px;\n border-width: 0.3125rem 0 0.3125rem 0.3125rem;\n border-left-color: #ddd;\n}\n\n.popover-header {\n padding: 0.625rem 0.625rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #ddd;\n border-bottom: 2px solid #d0d0d0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.625rem 0.625rem;\n color: #000;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.875rem;\n color: #000;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #000;\n text-decoration: none;\n outline: 2px dotted #000;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 1.875rem;\n margin-left: 1.875rem;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #f16e00;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #000;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #f16e00 !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #be5700 !important;\n}\n\n.bg-secondary {\n background-color: #000 !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: black !important;\n}\n\n.bg-success {\n background-color: #32c832 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #289f28 !important;\n}\n\n.bg-info {\n background-color: #527edb !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #2b60cf !important;\n}\n\n.bg-warning {\n background-color: #fc0 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #cca300 !important;\n}\n\n.bg-danger {\n background-color: #cd3c14 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #9f2e0f !important;\n}\n\n.bg-light {\n background-color: #ddd !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #c4c4c4 !important;\n}\n\n.bg-dark {\n background-color: #000 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: black !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 2px solid #000 !important;\n}\n\n.border-top {\n border-top: 2px solid #000 !important;\n}\n\n.border-right {\n border-right: 2px solid #000 !important;\n}\n\n.border-bottom {\n border-bottom: 2px solid #000 !important;\n}\n\n.border-left {\n border-left: 2px solid #000 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #f16e00 !important;\n}\n\n.border-secondary {\n border-color: #000 !important;\n}\n\n.border-success {\n border-color: #32c832 !important;\n}\n\n.border-info {\n border-color: #527edb !important;\n}\n\n.border-warning {\n border-color: #fc0 !important;\n}\n\n.border-danger {\n border-color: #cd3c14 !important;\n}\n\n.border-light {\n border-color: #ddd !important;\n}\n\n.border-dark {\n border-color: #000 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 480px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 980px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1220px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1380px) {\n .d-xxl-none {\n display: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 480px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 980px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1220px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1380px) {\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 480px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 980px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1220px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1380px) {\n .float-xxl-left {\n float: left !important;\n }\n .float-xxl-right {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.3125rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.3125rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.3125rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.3125rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.3125rem !important;\n}\n\n.m-2 {\n margin: 0.625rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.625rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.625rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.625rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.625rem !important;\n}\n\n.m-3 {\n margin: 1.25rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1.25rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1.25rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1.25rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1.25rem !important;\n}\n\n.m-4 {\n margin: 1.875rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.875rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.875rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.875rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.875rem !important;\n}\n\n.m-5 {\n margin: 3.75rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3.75rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3.75rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3.75rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3.75rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.3125rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.3125rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.3125rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.3125rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.3125rem !important;\n}\n\n.p-2 {\n padding: 0.625rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.625rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.625rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.625rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.625rem !important;\n}\n\n.p-3 {\n padding: 1.25rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1.25rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1.25rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1.25rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1.25rem !important;\n}\n\n.p-4 {\n padding: 1.875rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.875rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.875rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.875rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.875rem !important;\n}\n\n.p-5 {\n padding: 3.75rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3.75rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3.75rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3.75rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3.75rem !important;\n}\n\n.m-n1 {\n margin: -0.3125rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.3125rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.3125rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.3125rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.3125rem !important;\n}\n\n.m-n2 {\n margin: -0.625rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.625rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.625rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.625rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.625rem !important;\n}\n\n.m-n3 {\n margin: -1.25rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1.25rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1.25rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1.25rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1.25rem !important;\n}\n\n.m-n4 {\n margin: -1.875rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.875rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.875rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.875rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.875rem !important;\n}\n\n.m-n5 {\n margin: -3.75rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3.75rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3.75rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3.75rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3.75rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 480px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.3125rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.3125rem !important;\n }\n .m-sm-2 {\n margin: 0.625rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.625rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.625rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.625rem !important;\n }\n .m-sm-3 {\n margin: 1.25rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1.25rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1.25rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1.25rem !important;\n }\n .m-sm-4 {\n margin: 1.875rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.875rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.875rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.875rem !important;\n }\n .m-sm-5 {\n margin: 3.75rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3.75rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3.75rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3.75rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.3125rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.3125rem !important;\n }\n .p-sm-2 {\n padding: 0.625rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.625rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.625rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.625rem !important;\n }\n .p-sm-3 {\n padding: 1.25rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1.25rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1.25rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1.25rem !important;\n }\n .p-sm-4 {\n padding: 1.875rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.875rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.875rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.875rem !important;\n }\n .p-sm-5 {\n padding: 3.75rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3.75rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3.75rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3.75rem !important;\n }\n .m-sm-n1 {\n margin: -0.3125rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-sm-n2 {\n margin: -0.625rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.625rem !important;\n }\n .m-sm-n3 {\n margin: -1.25rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1.25rem !important;\n }\n .m-sm-n4 {\n margin: -1.875rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.875rem !important;\n }\n .m-sm-n5 {\n margin: -3.75rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3.75rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.3125rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.3125rem !important;\n }\n .m-md-2 {\n margin: 0.625rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.625rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.625rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.625rem !important;\n }\n .m-md-3 {\n margin: 1.25rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1.25rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1.25rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1.25rem !important;\n }\n .m-md-4 {\n margin: 1.875rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.875rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.875rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.875rem !important;\n }\n .m-md-5 {\n margin: 3.75rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3.75rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3.75rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3.75rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.3125rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.3125rem !important;\n }\n .p-md-2 {\n padding: 0.625rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.625rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.625rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.625rem !important;\n }\n .p-md-3 {\n padding: 1.25rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1.25rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1.25rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1.25rem !important;\n }\n .p-md-4 {\n padding: 1.875rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.875rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.875rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.875rem !important;\n }\n .p-md-5 {\n padding: 3.75rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3.75rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3.75rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3.75rem !important;\n }\n .m-md-n1 {\n margin: -0.3125rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-md-n2 {\n margin: -0.625rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.625rem !important;\n }\n .m-md-n3 {\n margin: -1.25rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1.25rem !important;\n }\n .m-md-n4 {\n margin: -1.875rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.875rem !important;\n }\n .m-md-n5 {\n margin: -3.75rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3.75rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 980px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.3125rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.3125rem !important;\n }\n .m-lg-2 {\n margin: 0.625rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.625rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.625rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.625rem !important;\n }\n .m-lg-3 {\n margin: 1.25rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1.25rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1.25rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1.25rem !important;\n }\n .m-lg-4 {\n margin: 1.875rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.875rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.875rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.875rem !important;\n }\n .m-lg-5 {\n margin: 3.75rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3.75rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3.75rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3.75rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.3125rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.3125rem !important;\n }\n .p-lg-2 {\n padding: 0.625rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.625rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.625rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.625rem !important;\n }\n .p-lg-3 {\n padding: 1.25rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1.25rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1.25rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1.25rem !important;\n }\n .p-lg-4 {\n padding: 1.875rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.875rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.875rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.875rem !important;\n }\n .p-lg-5 {\n padding: 3.75rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3.75rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3.75rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3.75rem !important;\n }\n .m-lg-n1 {\n margin: -0.3125rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-lg-n2 {\n margin: -0.625rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.625rem !important;\n }\n .m-lg-n3 {\n margin: -1.25rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1.25rem !important;\n }\n .m-lg-n4 {\n margin: -1.875rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.875rem !important;\n }\n .m-lg-n5 {\n margin: -3.75rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3.75rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1220px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xl-2 {\n margin: 0.625rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xl-3 {\n margin: 1.25rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xl-4 {\n margin: 1.875rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xl-5 {\n margin: 3.75rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xl-2 {\n padding: 0.625rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xl-3 {\n padding: 1.25rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xl-4 {\n padding: 1.875rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xl-5 {\n padding: 3.75rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1380px) {\n .m-xxl-0 {\n margin: 0 !important;\n }\n .mt-xxl-0,\n .my-xxl-0 {\n margin-top: 0 !important;\n }\n .mr-xxl-0,\n .mx-xxl-0 {\n margin-right: 0 !important;\n }\n .mb-xxl-0,\n .my-xxl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xxl-0,\n .mx-xxl-0 {\n margin-left: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.3125rem !important;\n }\n .mt-xxl-1,\n .my-xxl-1 {\n margin-top: 0.3125rem !important;\n }\n .mr-xxl-1,\n .mx-xxl-1 {\n margin-right: 0.3125rem !important;\n }\n .mb-xxl-1,\n .my-xxl-1 {\n margin-bottom: 0.3125rem !important;\n }\n .ml-xxl-1,\n .mx-xxl-1 {\n margin-left: 0.3125rem !important;\n }\n .m-xxl-2 {\n margin: 0.625rem !important;\n }\n .mt-xxl-2,\n .my-xxl-2 {\n margin-top: 0.625rem !important;\n }\n .mr-xxl-2,\n .mx-xxl-2 {\n margin-right: 0.625rem !important;\n }\n .mb-xxl-2,\n .my-xxl-2 {\n margin-bottom: 0.625rem !important;\n }\n .ml-xxl-2,\n .mx-xxl-2 {\n margin-left: 0.625rem !important;\n }\n .m-xxl-3 {\n margin: 1.25rem !important;\n }\n .mt-xxl-3,\n .my-xxl-3 {\n margin-top: 1.25rem !important;\n }\n .mr-xxl-3,\n .mx-xxl-3 {\n margin-right: 1.25rem !important;\n }\n .mb-xxl-3,\n .my-xxl-3 {\n margin-bottom: 1.25rem !important;\n }\n .ml-xxl-3,\n .mx-xxl-3 {\n margin-left: 1.25rem !important;\n }\n .m-xxl-4 {\n margin: 1.875rem !important;\n }\n .mt-xxl-4,\n .my-xxl-4 {\n margin-top: 1.875rem !important;\n }\n .mr-xxl-4,\n .mx-xxl-4 {\n margin-right: 1.875rem !important;\n }\n .mb-xxl-4,\n .my-xxl-4 {\n margin-bottom: 1.875rem !important;\n }\n .ml-xxl-4,\n .mx-xxl-4 {\n margin-left: 1.875rem !important;\n }\n .m-xxl-5 {\n margin: 3.75rem !important;\n }\n .mt-xxl-5,\n .my-xxl-5 {\n margin-top: 3.75rem !important;\n }\n .mr-xxl-5,\n .mx-xxl-5 {\n margin-right: 3.75rem !important;\n }\n .mb-xxl-5,\n .my-xxl-5 {\n margin-bottom: 3.75rem !important;\n }\n .ml-xxl-5,\n .mx-xxl-5 {\n margin-left: 3.75rem !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .pt-xxl-0,\n .py-xxl-0 {\n padding-top: 0 !important;\n }\n .pr-xxl-0,\n .px-xxl-0 {\n padding-right: 0 !important;\n }\n .pb-xxl-0,\n .py-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xxl-0,\n .px-xxl-0 {\n padding-left: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.3125rem !important;\n }\n .pt-xxl-1,\n .py-xxl-1 {\n padding-top: 0.3125rem !important;\n }\n .pr-xxl-1,\n .px-xxl-1 {\n padding-right: 0.3125rem !important;\n }\n .pb-xxl-1,\n .py-xxl-1 {\n padding-bottom: 0.3125rem !important;\n }\n .pl-xxl-1,\n .px-xxl-1 {\n padding-left: 0.3125rem !important;\n }\n .p-xxl-2 {\n padding: 0.625rem !important;\n }\n .pt-xxl-2,\n .py-xxl-2 {\n padding-top: 0.625rem !important;\n }\n .pr-xxl-2,\n .px-xxl-2 {\n padding-right: 0.625rem !important;\n }\n .pb-xxl-2,\n .py-xxl-2 {\n padding-bottom: 0.625rem !important;\n }\n .pl-xxl-2,\n .px-xxl-2 {\n padding-left: 0.625rem !important;\n }\n .p-xxl-3 {\n padding: 1.25rem !important;\n }\n .pt-xxl-3,\n .py-xxl-3 {\n padding-top: 1.25rem !important;\n }\n .pr-xxl-3,\n .px-xxl-3 {\n padding-right: 1.25rem !important;\n }\n .pb-xxl-3,\n .py-xxl-3 {\n padding-bottom: 1.25rem !important;\n }\n .pl-xxl-3,\n .px-xxl-3 {\n padding-left: 1.25rem !important;\n }\n .p-xxl-4 {\n padding: 1.875rem !important;\n }\n .pt-xxl-4,\n .py-xxl-4 {\n padding-top: 1.875rem !important;\n }\n .pr-xxl-4,\n .px-xxl-4 {\n padding-right: 1.875rem !important;\n }\n .pb-xxl-4,\n .py-xxl-4 {\n padding-bottom: 1.875rem !important;\n }\n .pl-xxl-4,\n .px-xxl-4 {\n padding-left: 1.875rem !important;\n }\n .p-xxl-5 {\n padding: 3.75rem !important;\n }\n .pt-xxl-5,\n .py-xxl-5 {\n padding-top: 3.75rem !important;\n }\n .pr-xxl-5,\n .px-xxl-5 {\n padding-right: 3.75rem !important;\n }\n .pb-xxl-5,\n .py-xxl-5 {\n padding-bottom: 3.75rem !important;\n }\n .pl-xxl-5,\n .px-xxl-5 {\n padding-left: 3.75rem !important;\n }\n .m-xxl-n1 {\n margin: -0.3125rem !important;\n }\n .mt-xxl-n1,\n .my-xxl-n1 {\n margin-top: -0.3125rem !important;\n }\n .mr-xxl-n1,\n .mx-xxl-n1 {\n margin-right: -0.3125rem !important;\n }\n .mb-xxl-n1,\n .my-xxl-n1 {\n margin-bottom: -0.3125rem !important;\n }\n .ml-xxl-n1,\n .mx-xxl-n1 {\n margin-left: -0.3125rem !important;\n }\n .m-xxl-n2 {\n margin: -0.625rem !important;\n }\n .mt-xxl-n2,\n .my-xxl-n2 {\n margin-top: -0.625rem !important;\n }\n .mr-xxl-n2,\n .mx-xxl-n2 {\n margin-right: -0.625rem !important;\n }\n .mb-xxl-n2,\n .my-xxl-n2 {\n margin-bottom: -0.625rem !important;\n }\n .ml-xxl-n2,\n .mx-xxl-n2 {\n margin-left: -0.625rem !important;\n }\n .m-xxl-n3 {\n margin: -1.25rem !important;\n }\n .mt-xxl-n3,\n .my-xxl-n3 {\n margin-top: -1.25rem !important;\n }\n .mr-xxl-n3,\n .mx-xxl-n3 {\n margin-right: -1.25rem !important;\n }\n .mb-xxl-n3,\n .my-xxl-n3 {\n margin-bottom: -1.25rem !important;\n }\n .ml-xxl-n3,\n .mx-xxl-n3 {\n margin-left: -1.25rem !important;\n }\n .m-xxl-n4 {\n margin: -1.875rem !important;\n }\n .mt-xxl-n4,\n .my-xxl-n4 {\n margin-top: -1.875rem !important;\n }\n .mr-xxl-n4,\n .mx-xxl-n4 {\n margin-right: -1.875rem !important;\n }\n .mb-xxl-n4,\n .my-xxl-n4 {\n margin-bottom: -1.875rem !important;\n }\n .ml-xxl-n4,\n .mx-xxl-n4 {\n margin-left: -1.875rem !important;\n }\n .m-xxl-n5 {\n margin: -3.75rem !important;\n }\n .mt-xxl-n5,\n .my-xxl-n5 {\n margin-top: -3.75rem !important;\n }\n .mr-xxl-n5,\n .mx-xxl-n5 {\n margin-right: -3.75rem !important;\n }\n .mb-xxl-n5,\n .my-xxl-n5 {\n margin-bottom: -3.75rem !important;\n }\n .ml-xxl-n5,\n .mx-xxl-n5 {\n margin-left: -3.75rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mt-xxl-auto,\n .my-xxl-auto {\n margin-top: auto !important;\n }\n .mr-xxl-auto,\n .mx-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-auto,\n .my-xxl-auto {\n margin-bottom: auto !important;\n }\n .ml-xxl-auto,\n .mx-xxl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 480px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 980px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1220px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1380px) {\n .text-xxl-left {\n text-align: left !important;\n }\n .text-xxl-right {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #f16e00 !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #a54b00 !important;\n}\n\n.text-secondary {\n color: #000 !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: black !important;\n}\n\n.text-success {\n color: #32c832 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #238b23 !important;\n}\n\n.text-info {\n color: #527edb !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #2756ba !important;\n}\n\n.text-warning {\n color: #fc0 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #b38f00 !important;\n}\n\n.text-danger {\n color: #cd3c14 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #87280d !important;\n}\n\n.text-light {\n color: #ddd !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #b7b7b7 !important;\n}\n\n.text-dark {\n color: #000 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: black !important;\n}\n\n.text-body {\n color: #000 !important;\n}\n\n.text-muted {\n color: #666 !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 2px solid #ccc;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 980px !important;\n }\n .container {\n min-width: 980px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 2px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #eee !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #ccc;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #ccc;\n }\n .row,\n .form-row {\n display: block !important;\n }\n}\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link .card-title {\n align-self: center;\n width: 100%;\n margin: auto 0;\n font-weight: 700;\n word-break: normal;\n}\n\n.o-card-link .card-img {\n padding: 0;\n text-align: center;\n}\n\n.o-card-link .card-img img {\n width: 100%;\n height: auto;\n}\n\n.o-card-link .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n}\n\n.card-deck {\n margin: 0;\n}\n\n@media (max-width: 479.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n .card-deck {\n flex-direction: column;\n }\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n .o-card-link .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n }\n .o-card-link .card-img img {\n width: auto;\n height: 3.75rem;\n }\n .o-card-link .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n .o-card-link .card-title {\n align-self: flex-start;\n margin: 0;\n }\n .o-card-link .card-title::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n}\n\n@media (min-width: 480px) and (max-width: 767.98px) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n\n.o-switch .toggle,\n.o-switch .toggle::before,\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n transition: .4s;\n}\n\n.o-switch .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: #666;\n border: 2px solid #666;\n}\n\n.o-switch .toggle.toggle-rounded, .o-switch .toggle.toggle-rounded::before {\n border-radius: 1.625rem;\n}\n\n.o-switch .toggle .on,\n.o-switch .toggle .off {\n display: none;\n font-weight: 700;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n}\n\n.o-switch .toggle .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n}\n\n.o-switch .toggle .off {\n display: block;\n text-align: right;\n opacity: 1;\n}\n\n.o-switch .toggle .off.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n}\n\n.o-switch .toggle::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n}\n\n.o-switch .checkbox:focus + .toggle::before {\n outline: 1px dotted #fff;\n}\n\n.o-switch .checkbox:checked + .toggle {\n background: #f16e00;\n border-color: #f16e00;\n}\n\n.o-switch .checkbox:checked + .toggle .on {\n display: block;\n opacity: 1;\n}\n\n.o-switch .checkbox:checked + .toggle .off {\n display: none;\n opacity: 0;\n}\n\n.o-switch .checkbox:checked + .toggle::before {\n right: 0;\n left: auto;\n}\n\n.o-switch .checkbox.success:checked + .toggle {\n background: #32c832;\n border-color: #32c832;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on {\n color: #000;\n}\n\n.o-switch .checkbox.success:checked + .toggle .on.icon-checkbox-tick {\n color: #fff;\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n}\n\n.form-group.row .o-switch .col-form-label.toggle.toggle-rounded {\n padding: 0 .875rem;\n}\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n}\n\n.o-switch.btn-group-toggle .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle .btn:first-child {\n margin-left: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:last-child {\n margin-right: -2px;\n}\n\n.o-switch.btn-group-toggle .btn.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle .btn.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n}\n\n.o-switch.btn-group-toggle .btn:active {\n border-color: #f16e00;\n}\n\n.o-switch.btn-group-toggle .btn:hover:not(:active) {\n color: #f16e00;\n background-color: transparent;\n}\n\n.o-switch.btn-group-toggle .btn:hover.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline {\n border-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:first-child {\n border-left-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:last-child {\n border-right-color: transparent;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.o-switch.btn-group-toggle.no-outline .btn:hover.active {\n color: #f16e00;\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n}\n\n.form-group input[type=\"radio\"],\n.form-group input[type=\"checkbox\"] {\n width: auto;\n}\n\n.form-group .invalid-feedback {\n margin-top: .8125rem;\n font-weight: 700;\n}\n\n.form-group.top {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.top .col-form-label {\n margin-bottom: 0;\n}\n\n.form-group.top .form-control {\n order: 2;\n}\n\n.form-group.top .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n}\n\n.form-group.right {\n display: flex;\n flex-flow: row wrap;\n}\n\n.form-group.right label,\n.form-group.right .col-form-label {\n min-width: 100%;\n}\n\n.form-group.right .form-control-message,\n.form-group.right .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n}\n\n.form-group.row.top {\n flex-direction: row;\n}\n\n.form-group.row.top label,\n.form-group.row.top .col-form-label {\n order: 1;\n}\n\n.form-group.row.top .form-control {\n order: 2;\n margin-top: 0;\n}\n\n.form-group.row.top .invalid-feedback {\n order: 0;\n}\n\n.form-group.row.right label,\n.form-group.row.right .col-form-label {\n min-width: auto;\n}\n\n.form-group.row.right .invalid-feedback {\n align-self: center;\n margin-top: 0;\n}\n\n.form-group.is-required label::after {\n margin-left: 6px;\n font-weight: 700;\n color: #f16e00;\n content: \"*\";\n}\n\n.form-group .form-control:invalid {\n outline: none;\n box-shadow: none;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n}\n\nselect.form-control:not([size]):not([multiple]).form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n}\n\n.has-feedback label ~ .invalid-feedback {\n top: 1.75;\n}\n\n.o-square-list {\n padding-left: 0;\n color: #f16e00;\n text-align: left;\n}\n\n.o-square-list,\n.o-square-list ul * {\n list-style-type: none;\n}\n\n.o-square-list li {\n color: #000;\n}\n\n.o-square-list li::before {\n margin-right: 1rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #f16e00;\n vertical-align: text-top;\n content: \"\\25A0\";\n}\n\n.o-square-list li span {\n display: inline-block;\n margin-bottom: .625rem;\n}\n\n.o-square-list li > ul {\n padding-left: 1rem;\n}\n\n.o-square-list ul > li::before {\n color: #999;\n}\n\n.o-square-list ul ul > li::before {\n color: #ccc;\n}\n\n.o-stepbar,\n.o-stepbar ol,\n.o-stepbar ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(2),\n.o-stepbar .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(3),\n.o-stepbar .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(4),\n.o-stepbar .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n}\n\n.o-stepbar .stepbar-item:first-child:nth-last-child(5),\n.o-stepbar .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n}\n\n.o-stepbar .stepbar-item {\n position: relative;\n float: left;\n padding: 0.625rem 1.25rem;\n padding-left: 2rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.25;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: #ddd;\n}\n\n.o-stepbar .stepbar-item::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23dddddd%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item:first-child {\n padding-left: 1.25rem;\n}\n\n.o-stepbar .stepbar-item:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.done {\n background-color: #000;\n}\n\n.o-stepbar .stepbar-item.done::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23000000%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.done .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.done:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item.current {\n background-color: #f16e00;\n}\n\n.o-stepbar .stepbar-item.current::after {\n position: absolute;\n top: 0;\n right: -1rem;\n z-index: 500;\n display: block;\n width: 1rem;\n height: 2.5rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23f16e00%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1rem 2.5rem;\n}\n\n.o-stepbar .stepbar-item.current .stepbar-link {\n color: #fff;\n}\n\n.o-stepbar .stepbar-item.current:last-child::after {\n display: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link {\n text-decoration: none;\n}\n\n.o-stepbar .stepbar-item .stepbar-link .step-number::after {\n content: \".\";\n}\n\n@media (max-width: 479.98px) {\n .o-stepbar .stepbar-item {\n padding: 0.3125rem 0.625rem 0.3125rem 2rem;\n line-height: 1.25;\n }\n .o-stepbar .stepbar-item::after,\n .o-stepbar .stepbar-item.done::after,\n .o-stepbar .stepbar-item.current::after,\n .o-stepbar .stepbar-item.next::after {\n right: -0.6875rem;\n width: 0.75rem;\n height: 1.875rem;\n background-size: cover;\n }\n .o-stepbar.xs-numbers .step-number::after {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5),\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item.current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5).current,\n .o-stepbar.xs-numbers .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item.current {\n width: 40%;\n }\n .o-stepbar.xs-numbers .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: 0.75rem;\n }\n .o-stepbar.xs-numbers .stepbar-item:first-child {\n padding-left: 0;\n }\n .o-stepbar.xs-numbers .stepbar-item.current {\n width: 60%;\n }\n .o-stepbar.xs-numbers .stepbar-item.current .step-number {\n display: none;\n }\n .o-stepbar.xs-numbers .stepbar-item:not(.current) .step-title {\n display: none;\n }\n .o-stepbar.xs-labels .step-number {\n display: none;\n }\n}\n\n.o-link-arrow {\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n}\n\n.o-link-arrow::after {\n display: inline-block;\n padding: 0 0.625rem;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93e\";\n}\n\n.o-link-arrow:hover::after, .o-link-arrow:focus::after {\n color: #f16e00;\n text-decoration: none;\n}\n\n.o-link-arrow.back::after {\n padding: 0;\n content: \"\";\n}\n\n.o-link-arrow.back::before {\n display: inline-block;\n padding: 0 0.625rem 0 0;\n font-family: icon-orange;\n font-size: 0.625rem;\n color: #000;\n content: \"\\e93f\";\n}\n\n.o-link-arrow.back:hover::before, .o-link-arrow.back:focus::before {\n color: #f16e00;\n text-decoration: none;\n}\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n\n.navbar .nav-link.icon {\n margin-top: 0;\n}\n\n.navbar .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: 400;\n}\n\n.navbar .nav-link.icon[class*=\"svg-\"], .navbar .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n}\n\n.navbar .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n}\n\n.navbar.supra {\n height: 2.5rem;\n min-height: 2.5rem;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid #333;\n}\n\n@media (max-width: 479.98px) {\n .navbar.supra {\n display: none;\n }\n}\n\n.navbar.supra > .container,\n.navbar.supra > .container .navbar-nav {\n align-items: center;\n}\n\n.navbar.supra .navbar-brand {\n display: none;\n}\n\n.navbar.supra .navbar-nav {\n margin: 0;\n}\n\n.navbar.supra .navbar-nav > .nav-link:first-child,\n.navbar.supra .navbar-nav .nav-item:first-child .nav-link {\n margin-left: 0;\n}\n\n.navbar.supra .nav-link,\n.navbar.supra .dropdown-toggle {\n font-size: 0.875rem;\n line-height: 1;\n}\n\n.navbar.supra .nav-link:focus,\n.navbar.supra .dropdown-toggle:focus {\n outline-offset: .5rem;\n}\n\n.navbar.supra .nav-link span[class^=\"icon-\"],\n.navbar.supra .dropdown-toggle span[class^=\"icon-\"] {\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon span[class^=\"icon-\"] {\n font-size: 1rem;\n font-weight: 400;\n}\n\n.navbar.supra .nav-link.icon[class*=\"svg-\"], .navbar.supra .nav-link.icon[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar.supra .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n@media (max-width: 479.98px) {\n .navbar-expand-sm .mega-menu .nav-link, .navbar-expand-sm.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-sm.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link.back::before, .navbar-expand-sm.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-sm .mega-menu-panel > .container, .navbar-expand-sm.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-sm.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-sm.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 480px) {\n .navbar-expand-sm .mega-menu {\n overflow: visible;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-sm .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-sm .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-sm .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-sm .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md .mega-menu .nav-link, .navbar-expand-md.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-md.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-md .mega-menu-panel .nav-link.back::before, .navbar-expand-md.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-md .mega-menu-panel > .container, .navbar-expand-md.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-md.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-md.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md .mega-menu {\n overflow: visible;\n }\n .navbar-expand-md .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-md .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-md .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-md .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-md .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-md .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 979.98px) {\n .navbar-expand-lg .mega-menu .nav-link, .navbar-expand-lg.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-lg.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link.back::before, .navbar-expand-lg.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-lg .mega-menu-panel > .container, .navbar-expand-lg.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-lg.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-lg.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 980px) {\n .navbar-expand-lg .mega-menu {\n overflow: visible;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-lg .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-lg .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-lg .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-lg .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1219.98px) {\n .navbar-expand-xl .mega-menu .nav-link, .navbar-expand-xl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link.back::before, .navbar-expand-xl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xl .mega-menu-panel > .container, .navbar-expand-xl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1220px) {\n .navbar-expand-xl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n@media (max-width: 1379.98px) {\n .navbar-expand-xxl .mega-menu .nav-link, .navbar-expand-xxl.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand-xxl.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back {\n display: block;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link.back::before, .navbar-expand-xxl.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n }\n .navbar-expand-xxl .mega-menu-panel > .container, .navbar-expand-xxl.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand-xxl.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand-xxl.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n}\n\n@media (min-width: 1380px) {\n .navbar-expand-xxl .mega-menu {\n overflow: visible;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n }\n .navbar-expand-xxl .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n }\n .navbar-expand-xxl .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n .navbar-expand-xxl .mega-menu-panel .nav-link {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n .navbar-expand-xxl .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n}\n\n.navbar-expand .mega-menu .nav-link, .navbar-expand.minimized .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"]::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before, .navbar-expand.minimized .mega-menu .nav-link[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back, .navbar-expand.minimized .mega-menu-panel .nav-link.back {\n display: block;\n}\n\n.navbar-expand .mega-menu-panel .nav-link.back::before, .navbar-expand.minimized .mega-menu-panel .nav-link.back::before {\n float: left;\n transform: rotateZ(180deg);\n}\n\n.navbar-expand .mega-menu-panel > .container, .navbar-expand.minimized .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container a[data-toggle=\"collapse\"], .navbar-expand.minimized .mega-menu-panel > .container a[data-toggle=\"collapse\"] {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child, .navbar-expand.minimized .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n}\n\n.navbar-expand .mega-menu {\n overflow: visible;\n}\n\n.navbar-expand .mega-menu > .navbar-nav {\n transition: none;\n transform: none;\n}\n\n.navbar-expand .mega-menu > .navbar-nav .nav-link::before {\n display: none;\n}\n\n.navbar-expand .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: 1030;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n}\n\n.navbar-expand .mega-menu-panel a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n}\n\n.navbar-expand .mega-menu-panel .nav-link {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item:first-child,\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.navbar-expand .mega-menu-panel > .container > .navbar-nav .nav-link.back {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n border-bottom: 1px solid #ccc;\n}\n\n.table > thead > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > th,\n.table > tbody > tr > td,\n.table > tfoot > tr > th,\n.table > tfoot > tr > td {\n font-size: 0.875rem;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n}\n\n.table > thead > tr > th:first-child,\n.table > thead > tr > td:first-child,\n.table > tbody > tr > th:first-child,\n.table > tbody > tr > td:first-child,\n.table > tfoot > tr > th:first-child,\n.table > tfoot > tr > td:first-child {\n padding-left: .625rem;\n}\n\n.table > thead > tr [class^=\"icon-\"],\n.table > thead > tr [class*=\" icon-\"],\n.table > tbody > tr [class^=\"icon-\"],\n.table > tbody > tr [class*=\" icon-\"],\n.table > tfoot > tr [class^=\"icon-\"],\n.table > tfoot > tr [class*=\" icon-\"] {\n font-size: 1.8125rem;\n}\n\n.table > thead > tr [class^=\"svg-\"],\n.table > tbody > tr [class^=\"svg-\"],\n.table > tfoot > tr [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n}\n\n.table > thead > tr [class^=\"svg-\"]::after,\n.table > tbody > tr [class^=\"svg-\"]::after,\n.table > tfoot > tr [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n}\n\n.table thead > tr {\n border-bottom-width: 2px;\n}\n\n.table thead > tr > th {\n font-size: 1rem;\n font-weight: 700;\n}\n\n.table tbody > th {\n font-weight: 400;\n}\n\n.table.has-checkbox tr.selected > td,\n.table.has-checkbox tr.selected > th {\n background-color: #ddd;\n}\n\n.table.has-checkbox tr > th:first-child,\n.table.has-checkbox tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.table.has-icon tr > td,\n.table.has-icon tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n}\n\n.table.has-icon tr > td span,\n.table.has-icon tr > td img,\n.table.has-icon tr > th span,\n.table.has-icon tr > th img {\n vertical-align: middle;\n}\n\n.table.has-icon tr > td img,\n.table.has-icon tr > th img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n}\n\n.table.has-icon tr > td [class^=\"icon-\"],\n.table.has-icon tr > th [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n}\n\n.table.table-reflow thead > tr,\n.table.table-reflow tbody > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > td {\n line-height: 1.25rem;\n}\n\n.table.table-reflow thead > tr > th:first-child,\n.table.table-reflow tbody > tr > th:first-child {\n border-bottom: 2px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th,\n.table.table-reflow thead > tr > td,\n.table.table-reflow tbody > tr > th,\n.table.table-reflow tbody > tr > td {\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > td:last-child,\n.table.table-reflow tbody > tr > td:last-child {\n border-right: 0;\n}\n\n.table.table-reflow thead > tr {\n border: 0;\n}\n\n.table.table-reflow thead > tr > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid #ccc;\n}\n\n.table.table-reflow thead > tr > th:last-child {\n border-right: 0;\n}\n\n.table.table-reflow tbody > tr > th:first-child {\n padding-left: 0;\n}\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #32c832;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #2db42d;\n}\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #527edb;\n}\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #3d6ed7;\n}\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fc0;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #e6b800;\n}\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #cd3c14;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #b63512;\n}\n\ncaption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n.tablesorter caption {\n padding: .75rem 0;\n font-size: 2.125rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n}\n\n.tablesorter th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n}\n\n.tablesorter th.header {\n position: relative;\n}\n\n.tablesorter th .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n}\n\n.tablesorter th.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n transform: rotate(180deg);\n}\n\n.tablesorter th.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:hover span::after,\n.tablesorter th.tablesorter-headerUnSorted .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\");\n}\n\n.tablesorter th a {\n color: #000;\n text-decoration: none;\n}\n\n.tablesorter th a:hover, .tablesorter th a:focus {\n color: #f16e00;\n text-decoration: underline;\n}\n\n.tablesorter td {\n text-align: left;\n}\n\n.modal .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n}\n\n.modal .modal-header .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n}\n\n.modal .modal-header .btn .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n}\n\n.modal .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card,\n.modal .modal-body .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n}\n\n.modal .modal-body .card-body {\n padding: 0;\n}\n\n.modal .modal-body .card-icon {\n margin-right: 1.25rem;\n}\n\n.modal .modal-body [class^=\"svg\"],\n.modal .modal-body [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n}\n\n.modal .modal-body [class^=\"svg\"] {\n display: block;\n}\n\n.modal .modal-body [class^=\"svg\"]::after {\n top: auto;\n}\n\n.modal .modal-body .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n}\n\n.modal .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n}\n\n.modal .modal-footer .btn + .btn {\n margin-left: 1.25rem;\n}\n\n@media (max-width: 479.98px) {\n .modal .modal-content {\n padding: 1.25rem;\n }\n .modal .modal-header {\n margin: 0;\n }\n .modal .modal-body .card {\n flex-direction: column;\n }\n .modal .modal-body .card-icon {\n align-self: center;\n margin-right: 0;\n }\n .modal .modal-body .card-icon,\n .modal .modal-body [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n .modal .modal-body .card-title {\n font-size: 1rem;\n }\n .modal .modal-body .card-body {\n margin-top: 1.25rem;\n }\n .modal .modal-footer {\n align-self: center;\n }\n}\n\n.nav .nav-item:first-child {\n margin-left: -0.625rem;\n}\n\n.nav.flex-column .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav .nav-link {\n padding: 0.625rem 0.625rem;\n line-height: 1.25rem;\n}\n\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid #999;\n}\n\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n.nav-tabs .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-tabs .nav-item + .nav-item {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-item + .nav-item {\n margin-left: 0;\n }\n}\n\n.nav-tabs .nav-link:not(.disabled):focus, .nav-tabs .nav-link:not(.disabled).dropdown-toggle:focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n}\n\n.nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: .5rem;\n}\n\n@media (max-width: 979.98px) {\n .nav-tabs .nav-link:not(.disabled) + .nav-link {\n margin-left: 0;\n }\n}\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n}\n\n.o-tab-container .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: 700;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 0;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n}\n\n.o-tab-container .o-tab-heading[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n}\n\n.o-tab-container .o-tab-heading:focus {\n outline-offset: -4px;\n}\n\n.o-tab-container .o-tab-heading:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n}\n\n.o-tab-container .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n}\n\n.o-tab-container .o-tab-content.show {\n display: block;\n}\n\n@media (max-width: 767.98px) {\n .o-tab-container .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n }\n .o-tab-container .o-tab-heading[aria-expanded=\"false\"]:active {\n color: #fff;\n background-color: #f16e00;\n }\n .o-tab-container.accordion-layout {\n display: block;\n }\n .o-tab-container.accordion-layout .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: 700;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:focus {\n outline-offset: 0;\n }\n .o-tab-container.accordion-layout .o-tab-heading:hover {\n color: #f16e00;\n background-color: #fff;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n .o-tab-container.accordion-layout .o-tab-heading[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n .o-tab-container.accordion-layout .o-tab-heading:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n .o-tab-container.accordion-layout .o-tab-heading::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n .o-tab-container.accordion-layout .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n}\n\n.nav-pills.nav-stacked .nav-item {\n margin: 0;\n}\n\n.nav-pills.nav-stacked .nav-item + .nav-item {\n margin-left: 0;\n}\n\n.nav-pills .nav-item:first-child {\n margin-left: 0;\n}\n\n.nav-pills .nav-item + .nav-item {\n margin-left: 5px;\n}\n\n.nav-pills .nav-link {\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n}\n\n.nav-pills .nav-link:active {\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover {\n color: #fff;\n cursor: default;\n background-color: #000;\n}\n\n.nav-pills .nav-link:hover.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .nav-link:focus {\n color: #fff;\n background-color: #f16e00;\n outline: none;\n}\n\n.nav-pills .nav-link:focus.disabled {\n color: #666;\n background-color: transparent;\n}\n\n.nav-pills .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n.nav-pills .dropdown-menu .nav-item {\n margin: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n}\n\n.nav-pills .dropdown-menu .nav-item .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n}\n\n.tab-content .tab-pane p {\n margin-bottom: 0;\n}\n\n.tab-content-clear {\n border: 0;\n}\n\n.breadcrum {\n line-height: 1;\n}\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important;\n}\n\n.show-inline-block {\n display: inline-block !important;\n}\n\n.overflow-nav-list .nav-link {\n border: 0;\n}\n\n.overflow-nav-list .nav-link:focus {\n outline-offset: -2px;\n}\n\n.overflow-nav-list .nav-item:last-child {\n margin-bottom: 0;\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n\n.o-nav-local {\n margin-bottom: 2.5rem;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n\n.o-nav-local > .container,\n.o-nav-local > .container-fluid {\n display: flex;\n}\n\n.o-nav-local ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n}\n\n.o-nav-local .nav-item + .nav-item {\n margin-left: 1rem;\n}\n\n.o-nav-local .nav.flex-column .nav-item {\n margin-left: 0;\n}\n\n.o-nav-local .nav .nav-link,\n.o-nav-local .nav .dropdown-toggle {\n display: inline-block;\n padding: 1rem 0.625rem 1.125rem;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.o-nav-local .nav .nav-link:focus,\n.o-nav-local .nav .dropdown-toggle:focus {\n outline: 1px dotted;\n outline-offset: -1px;\n}\n\n.o-nav-local .nav-link.active {\n color: #f16e00;\n}\n\n.o-nav-local .dropdown-toggle.show {\n color: #000;\n}\n\n.o-nav-local .dropdown-menu .nav-item,\n.o-nav-local .dropdown-menu .nav-item + .nav-item {\n margin: 0;\n}\n\n.o-nav-local .dropdown-menu .nav-link {\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n}\n\n.o-nav-local .dropdown-menu .nav-link:focus {\n outline-offset: -2px;\n}\n\n.o-nav-local .dropdown-menu .nav-link:hover {\n color: #fff;\n background: #000;\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: #333;\n border-bottom-color: #333;\n}\n\n.o-nav-local.inverse .nav-link {\n color: #fff;\n background-color: #000;\n}\n\n.o-nav-local.inverse .nav-link:hover, .o-nav-local.inverse .nav-link:focus {\n color: #f16e00;\n}\n\n.o-nav-local.inverse .nav-link:focus {\n outline-color: #fff;\n}\n\n.o-nav-local.inverse .nav-link.active {\n color: #f16e00;\n}\n\n.skiplinks {\n z-index: 99999;\n}\n\n.skiplinks .skiplinks-section li {\n float: left;\n}\n\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: 700;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 #ccc;\n border: 2px solid #000;\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, 0.3);\n}\n\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: 400;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: 0.875rem;\n font-weight: 700;\n color: #fff;\n background-color: #000;\n}\n\n.o-footer .nav-link {\n padding: 0.625rem 0.625rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.o-footer .nav-link:not(:hover), .o-footer .nav-link:not([href]) {\n color: #fff;\n}\n\n.o-footer .o-footer-top,\n.o-footer .o-footer-body,\n.o-footer .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n}\n\n.o-footer .o-footer-top {\n border-bottom: 1px solid #333;\n}\n\n.o-footer .o-footer-body .row {\n margin-bottom: .625rem;\n}\n\n.o-footer .o-footer-body h2 {\n margin-top: .625rem;\n font-size: 0.875rem;\n color: #fff;\n}\n\n.o-footer .o-footer-body p,\n.o-footer .o-footer-body p a {\n color: #fff;\n}\n\n.o-footer .o-footer-body .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n}\n\n.o-footer .o-footer-bottom {\n border-top: 1px solid #333;\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table thead {\n display: none;\n }\n .o-responsive-table tbody,\n .o-responsive-table tr,\n .o-responsive-table th,\n .o-responsive-table td {\n display: block;\n }\n}\n\n@media (max-width: 979.98px) and (min-width: 768px) {\n .o-responsive-table tr {\n float: left;\n width: 45%;\n }\n .o-responsive-table tr:nth-child(odd) {\n margin-right: 10%;\n }\n}\n\n@media (max-width: 979.98px) {\n .o-responsive-table th,\n .o-responsive-table td {\n vertical-align: middle;\n }\n .o-responsive-table td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: 700;\n content: attr(data-title);\n }\n .o-responsive-table tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n .o-responsive-table tbody th[scope=\"row\"] {\n font-weight: 700;\n border-top: 0;\n border-bottom: 2px solid #ccc;\n }\n}\n\n.o-scroll-up {\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: 1035;\n display: none;\n right: 1.25%;\n bottom: .25rem;\n}\n\n.o-scroll-up .o-scroll-up-icon {\n align-items: center;\n justify-content: center;\n float: right;\n width: 2.5rem;\n height: 2.5rem;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n /* rtl:ignore */\n transform: rotate(90deg);\n /* rtl:ignore */\n}\n\n.o-scroll-up .o-scroll-up-icon::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n right: 1.25%;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n right: 1.5625%;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n right: 3.125%;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n right: 4.16667%;\n }\n}\n\n@media (min-width: 480px) {\n .o-scroll-up {\n bottom: .375rem;\n }\n}\n\n@media (min-width: 768px) {\n .o-scroll-up {\n bottom: .75rem;\n }\n}\n\n@media (min-width: 980px) {\n .o-scroll-up {\n bottom: 2rem;\n }\n}\n\n@media (min-width: 1220px) {\n .o-scroll-up {\n bottom: 2.5rem;\n }\n}\n\n@media (min-width: 1380px) {\n .o-scroll-up {\n bottom: 3.75rem;\n }\n}\n\n.o-scroll-up .o-scroll-up-text {\n display: inline-block;\n padding: 0.625rem 0.625rem;\n font-weight: 700;\n background-color: #fff;\n opacity: .8;\n}\n\n.o-scroll-up.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-text {\n float: left;\n}\n\n.o-scroll-up.static .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n}\n\n.o-scroll-up:hover, .o-scroll-up:focus {\n color: #f16e00;\n}\n\n.o-scroll-up:hover .o-scroll-up-icon, .o-scroll-up:focus .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n}\n\n.o-scroll-up:active .o-scroll-up-icon {\n color: #fff;\n background-color: #f16e00;\n border-color: #f16e00;\n}\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: 700;\n}\n\n.dropdown-item:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n}\n\n.dropdown-item:focus:hover {\n color: #fff;\n background-color: #000;\n}\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item img {\n width: 100%;\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n}\n\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n}\n\n.carousel-control-prev-icon::before,\n.carousel-control-next-icon::before {\n font-family: icon-orange;\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n}\n\n.carousel-indicators:hover {\n cursor: default;\n}\n\n.carousel-indicators li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n}\n\n.carousel-indicators li:hover {\n cursor: pointer;\n}\n\n.carousel-indicators li.active {\n background-color: #f16e00;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n}\n\n.swiper-button-prev:focus,\n.swiper-button-next:focus {\n outline: 2px dotted #000;\n outline-offset: -1px;\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important;\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide .card {\n border: 0;\n}\n\n.swiper-slide .card-img {\n padding: 0;\n}\n\n.swiper-slide .card-img img {\n width: 100%;\n height: 40vh;\n}\n\n.swiper-slide .card-title {\n margin: 0;\n font-weight: 700;\n}\n\n.swiper-slide .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n}\n\n.swiper-slide .card-body p {\n margin: 0;\n}\n\n@media (max-width: 979.98px) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;\n /* used for displaying pagination outside of container */\n }\n .swiper-slide {\n width: 80%;\n }\n .swiper-slide .card-img img {\n height: auto;\n }\n .swiper-slide .card-body {\n position: static;\n }\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: #f16e00;\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n.progress.progress-default[value]::-webkit-progress-value {\n background-color: #f16e00;\n}\n\n.progress.progress-default[value]::-moz-progress-bar {\n background-color: #f16e00;\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: 30px;\n}\n\n.hero-container .caption {\n margin: 50px 30px;\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: #f16e00;\n}\n\n/*# sourceMappingURL=boosted.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n// Boosted mod\n// reduce the size of titles for mobile display\n@include media-breakpoint-down(sm) {\n h1, .h1 { @include font-size($h1-font-size-mobile); }\n h2, .h2 { @include font-size($h2-font-size-mobile); }\n h3, .h3 { @include font-size($h3-font-size-mobile); }\n h4, .h4 { @include font-size($h4-font-size-mobile); }\n h5, .h5 { @include font-size($h5-font-size-mobile); }\n h6, .h6 { @include font-size($h6-font-size-mobile); }\n}\n// end mod\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n width: 100%; // Boosted mod\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n width: auto; // Boosted mod\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n@mixin make-container($gutters: $grid-gutter-widths) {\n margin-right: auto;\n margin-left: auto;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n // width: 100%; //Boosted mod our fluid is not 100% width\n }\n }\n\n // boosted mod\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n margin-right: $container-margin;\n margin-left: $container-margin;\n // reset margin for second level container\n .container-fluid {\n margin-right: auto;\n margin-left: auto;\n }\n }\n }\n // end mod\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n // boosted mod\n margin-right: auto;\n margin-left: auto;\n // end mod\n }\n }\n}\n\n@mixin make-gutters($gutters: $grid-gutter-widths) {\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n }\n}\n\n@mixin make-row($gutters: $grid-gutter-widths) {\n display: flex;\n flex-wrap: wrap;\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n }\n }\n}\n\n@mixin make-col-ready($gutters: $grid-gutter-widths) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n\n @each $breakpoint in map-keys($gutters) {\n @include media-breakpoint-up($breakpoint) {\n $gutter: map-get($gutters, $breakpoint);\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n }\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n// BOOSTED MOD : keep variable gutter width (removed from bootstrap)\n\n@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n @include make-gutters($gutters);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, 0)); // Boosted mod let color as is\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n // Boosted mod adapt color with background\n @if ($state == \"secondary\" or $state == \"danger\" or $state == \"dark\") {\n color: $white;\n }\n // end mod\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Boosted mod\n// Orange brand, labels are always bold\nlabel {\n font-weight: $font-weight-bold;\n &.disabled {\n color: $custom-control-label-disabled-color;\n }\n &.is-required::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n}\n// end mod\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n color: #666; // boosted mod\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n &[size],\n &[multiple] {\n height: auto;\n }\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$form-grid-gutter-width / 2;\n margin-left: -$form-grid-gutter-width / 2;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: $form-grid-gutter-width / 2;\n padding-left: $form-grid-gutter-width / 2;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// stylelint-disable property-blacklist\n@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @if $enable-prefers-reduced-motion-media-query {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n // Boosted mod, remove box shadow!\n // box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-weight: $font-weight-bold; // Boosted Mod\n // color: $color; // Boosted Mod\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n .form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n // Boosted Mod\n // @if $enable-validation-icons {\n // padding-right: $input-height-inner;\n // background-image: $icon;\n // background-repeat: no-repeat;\n // background-position: center right $input-height-inner-quarter;\n // background-size: $input-height-inner-half $input-height-inner-half;\n // }\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n // Boosted Mod\n ~ .#{$state}-feedback {\n @if $enable-validation-icons {\n @if $state == \"valid\" {\n @include svg-success();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n } @else {\n @include svg-error();\n &::after {\n position: absolute;\n top: -.1rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n }\n position: relative;\n display: block;\n padding-left: 1.625rem;\n }\n\n ~ .#{$state}-tooltip {\n display: block;\n }\n // End Mod\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right;\n background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\n }\n\n &:focus {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25); // Boosted mod, remove box shadow!\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n // Boosted mod, remove box shadow!\n // ~ .custom-control-label::before {\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n // }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n // box-shadow: 0 0 0 $input-focus-width rgba($color, .25);// Boosted mod, remove box shadow!\n }\n }\n }\n }\n}\n","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n color: $body-color;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n @include hover {\n color: $body-color;\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Boosted mod\na.btn {\n text-decoration: none; // Boosted mod remove underline for a.btn\n}\n// End mod\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n// boosted mod custom buttons\n// @mixin button-variant($background, $border, $hover-background, $hover-border, $active-background, $active-border, $disabled-background, $disabled-border, $disabled-color, $color) {\n.btn-primary,\n.btn-warning {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $black, $black, $white, $black, $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"primary\"), theme-color(\"primary\"), $white, $white, $black, $white, $gray-700, $gray-700, $black, $white);\n }\n}\n.btn-secondary,\n.btn-light {\n @include button-variant(transparent, $black, $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-500, $gray-500, $black);\n &.btn-inverse {\n @include button-variant($white, $white, $black, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-success {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $black);\n &.btn-inverse {\n @include button-variant(theme-color(\"success\"), theme-color(\"success\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black, $black);\n }\n}\n.btn-info,\n.btn-dark {\n @include button-variant($black, $black, $white, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white, $white);\n &.btn-inverse {\n @include button-variant(transparent, $white, $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), transparent, $gray-700, $gray-700, $white);\n }\n}\n.btn-danger {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $black, $black, theme-color(\"primary\"), theme-color(\"primary\"), $gray-500, $gray-500, $white);\n &.btn-inverse {\n @include button-variant(theme-color(\"danger\"), theme-color(\"danger\"), $white, $white, theme-color(\"primary\"), theme-color(\"primary\"), $gray-700, $gray-700, $black);\n }\n}\n\n// Boosted mod custom outline buttons values\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @if $color == \"light\" {\n @include button-outline-variant($value, $gray-900);\n } @else {\n @if $color == \"warning\" {\n @include button-outline-variant(theme-color(\"primary\"), $black);\n } @else {\n @if $color == \"info\" {\n @include button-outline-variant(theme-color(\"secondary\"), $black);\n } @else {\n @include button-outline-variant($value, $black);\n }\n }\n }\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n // font-weight: $font-weight-normal; // Boosted mod font-weight stay bold\n color: $link-color;\n\n // Boosted mod\n &.btn-inverse {\n color: #fff;\n }\n // end mod\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-xlg {\n @include button-size($btn-padding-y-xlg, $btn-padding-x-xlg, $font-size-xlg, $btn-line-height-xlg, $btn-border-radius-xlg);\n}\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n// Social Media\n.btn-mail {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-mail-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-lin-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-gplus-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-tw-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n.btn-fbk-inverse {\n height: 2.5rem;\n background-repeat: no-repeat;\n &:hover,\n &:focus {\n outline: none;\n }\n}\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n// boosted mod add default color, disable-background and disabled-border and disabled-color option\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%), $disabled-background: $background, $disabled-border: border, $disabled-color: color-yiq($background), $color: color-yiq($background)) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover-focus { // Boosted mod replace hover by hover focus cause we remove box-shadow\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: $disabled-color; // Boosted mod\n background-color: $disabled-background; // Boosted var disabled\n border-color: $disabled-border; // Boosted var disabled\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover-focus { //Boosted mod focus has same as hover\n color: #fff; // Boosted mod\n background-color: #000; // Boosted mod\n border-color: #000 // Boosted mod\n }\n\n // &:focus,\n // &.focus {\n // Boosted mod disable box-shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n // }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: #000; // Boosted mod\n background-color: #f16e00; // Boosted mod\n border-color: #f16e00; // Boosted mod\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n // Boosted mod disable shadow\n // box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-control-plaintext,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .custom-select:focus,\n > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n }\n\n // Bring the custom file input above the label\n > .custom-file .custom-file-input:focus {\n z-index: 4;\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n// Boosted mod\n.input-group-prepend + .form-control {\n border-left-color: transparent;\n}\n\n.form-control:focus + .input-group-append,\n.custom-select:focus + .input-group-append {\n position: relative;\n z-index: 5;\n}\n// End mod\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n @include font-size($input-font-size); // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: $font-size-base * $line-height-base;\n padding-left: $custom-control-gutter + $custom-control-indicator-size;\n margin-bottom: ($spacer / 2); // Boosted mod ensure that there's at least 10px\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n // Boosted mod our custom control have a border\n border-color: $custom-control-indicator-checked-border-color;\n // end mod\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n // Boosted mod move gradient to global settings, to change the color for disabled checked elements\n &::before {\n @include gradient-bg($custom-control-indicator-checked-bg);\n }\n // end mod\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n outline: dotted 1px $black; // Boosted mod no box-shadow, replaced by outline\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n }\n\n // &:focus:not(:checked) ~ .custom-control-label::before {\n // border-color: $custom-control-indicator-focus-border-color;\n // }\n\n &:not(:disabled):active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n border-color: $custom-control-indicator-active-border-color;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n // Boosted mod\n // our custom control have a border\n border-color: $custom-control-indicator-disabled-bg;\n // end mod\n }\n }\n // Boosted mod disable bg only for checked elements\n &:checked ~ .custom-control-label {\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n //position: relative; // boosted mod checkbox in table are misaligned\n margin-bottom: 0;\n vertical-align: top;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background-color: $custom-control-indicator-bg;\n border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: 0; // boosted mod checkbox in tables are misaligned\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n // Boosted Mod\n .custom-control-input:not(:disabled):checked ~ .custom-control-label {\n &::before {\n border: 2px solid $primary;\n }\n }\n // End Mod\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n //Boosted mod\n\n /* rtl:begin:ignore */\n top: .4rem;\n\n /* rtl:end:ignore */\n left: .2585rem;\n\n /* rtl:begin:ignore */\n width: .8272rem;\n height: .3619rem;\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n transform: rotate(-45deg);\n\n /* rtl:end:ignore */\n //End mod\n }\n }\n\n // Boosted mod\n .custom-control-input:checked:focus ~ .custom-control-label::before {\n outline-color: $black; // Boosted mod no box-shadow, replaced by outline\n }\n //end mod\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n border-color: $custom-checkbox-indicator-indeterminate-border-color;\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n //Accessiblity issue DO NOT remove\n //boosted mod\n border: 3px solid $white;\n border-top: none;\n border-right: none;\n border-left: none;\n transform: scaleX(.5) translateY(-.5rem);\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // &:indeterminate ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n //}\n // end mod\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n // stylelint-disable-next-line property-blacklist\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::before {\n //boosted mod\n background-color: $white;\n border-color: $white;\n //end mod\n }\n\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border: 6px solid $primary;\n @include border-radius($custom-radio-indicator-border-radius, $custom-radio-indicator-border-radius);\n //end mod\n }\n }\n\n .custom-control-input:disabled:checked ~ .custom-control-label {\n // Boosted mod move ::before gradient to global definition\n &::after {\n //boosted mod\n border-color: $custom-control-indicator-disabled-bg;\n //end mod\n }\n }\n\n // Boosted mod disable state manage globaly\n // .custom-control-input:disabled {\n // &:checked ~ .custom-control-label::before {\n // background-color: $custom-control-indicator-checked-disabled-bg;\n // }\n // }\n // end mod\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n padding-left: $custom-switch-width + $custom-control-gutter;\n\n .custom-control-input {\n @include focus {\n ~ .custom-control-label::after {\n outline: 1px dotted #fff;\n }\n }\n }\n\n .custom-control-label {\n padding-top: .3125rem; // Boosted mod vertical align fix for label\n &::before {\n left: 0; // boosted mod\n width: $custom-switch-width;\n height: $custom-switch-height; // boosted mod\n pointer-events: all;\n background-color: $custom-control-indicator-border-color; // boosted mod\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 1250 1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\"); // boosted mod\n background-repeat: no-repeat; // boosted mod\n background-position: 1.975rem; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n }\n\n &::after {\n top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width}); // boosted mod\n left: $custom-control-indicator-border-width; // boosted mod\n width: $custom-switch-indicator-width; // boosted mod\n height: $custom-switch-indicator-height; // boosted mod\n background-color: $custom-switch-indicator-bg-color; // boosted mod\n @include border-radius($custom-switch-indicator-border-radius, $custom-switch-indicator-border-radius);\n @include transition(transform .15s ease-in-out, $custom-forms-transition);\n }\n }\n // boosted mod create a right aligned switch\n &.right {\n padding-right: $custom-switch-width + $custom-control-gutter;\n padding-left: 0;\n .custom-control-label {\n &::before {\n right: 0;\n left: auto;\n }\n\n &::after {\n right: calc(#{($custom-switch-width / 2)} + #{$custom-control-indicator-border-width});\n left: auto;\n }\n }\n }\n // end mod\n .custom-control-input:checked ~ .custom-control-label {\n // boosted mod\n &::before {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n background-repeat: no-repeat;\n background-position: .25rem;\n }\n // end mod\n &::after {\n background-color: $custom-control-indicator-bg;\n transform: translateX($custom-switch-width / 2); // boosted mod change the indicator size\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n ~ .custom-control-label::before {\n background-color: $custom-control-indicator-disabled-bg; // boosted mod\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n font-family: $custom-select-font-family;\n @include font-size($custom-select-font-size);\n font-weight: $custom-select-font-weight;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-background;\n background-color: $custom-select-bg;\n border: $custom-select-border-width solid $custom-select-border-color;\n @include border-radius($custom-select-border-radius, 0);\n // @include box-shadow($custom-select-box-shadow); //boosted mod no box-shadow\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\n } @else {\n box-shadow: $custom-select-focus-box-shadow;\n }\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n display: none;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y-sm;\n padding-bottom: $custom-select-padding-y-sm;\n padding-left: $custom-select-padding-x-sm;\n @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y-lg;\n padding-bottom: $custom-select-padding-y-lg;\n padding-left: $custom-select-padding-x-lg;\n @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n }\n\n &:disabled ~ .custom-file-label {\n background-color: $custom-file-disabled-bg;\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n\n ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n font-family: $custom-file-font-family;\n font-weight: $custom-file-font-weight;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: inherit;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: 0; // Edge specific\n margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: $custom-range-thumb-height / 2;\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &:disabled {\n &::-webkit-slider-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: default;\n }\n\n &::-moz-range-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-moz-range-track {\n cursor: default;\n }\n\n &::-ms-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n @include transition($custom-forms-transition);\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n // Boosted mod\n font-weight: $font-weight-bold;\n // end mod\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n // Boosted mod\n // remove border from nav-link padding in tabs\n padding: $nav-link-padding-y calc(#{$nav-link-padding-x} - #{$nav-tabs-border-width});\n line-height: 1rem;\n // end mod\n border: $nav-tabs-border-width solid transparent;\n\n // Boosted mod\n // Border bottom width to 0 for display\n border-bottom-width: 0;\n // end mod\n\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n color: $nav-tabs-link-hover-color; // boosted mod\n background-color: $nav-tabs-link-hover-bg; // boosted mod\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n font-weight: $font-weight-bold; // Boosted mod\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n flex-grow: 1; // booosted mod\n align-items: center;\n justify-content: space-between;\n padding-right: 0; // boosted mod\n padding-left: 0; // boosted mod\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-end; // boosted mod\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin: .625rem .3125rem; // boosted mod\n @include font-size($navbar-brand-font-size);\n font-weight: $font-weight-bold; // boosted mod\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Boosted mod\n + .navbar-brand {\n margin-right: 0;\n margin-left: 1.25rem;\n }\n\n @include focus {\n outline: 1px dotted #fff;\n outline-offset: .625rem;\n }\n\n img {\n flex-wrap: wrap;\n width: $navbar-brand-logo-height;\n height: $navbar-brand-logo-height;\n margin-top: 0;\n margin-bottom: .25rem;\n }\n // end mod\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-top: auto; // boosted mod\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n //Boosted mod\n padding-top: .875rem;\n padding-right: .625rem;\n padding-bottom: .875rem;\n padding-left: .625rem;\n margin-top: 0;\n\n &.active::before {\n display: none;\n }\n\n &.icon {\n padding: .78125rem .625rem;\n margin-top: 0;\n }\n\n &[class^=\"svg-\"] {\n margin: .625rem;\n }\n\n &[role=\"menuitem\"]::before {\n float: right;\n margin-right: 1rem;\n font-family: icon-orange;\n font-size: $font-size-base;\n font-weight: $font-weight-normal;\n color: #fff;\n content: \"\\e93e\";\n }\n\n @include focus {\n outline-offset: .625rem;\n }\n // end mod\n }\n\n .dropdown-menu {\n position: static;\n top: 2rem; // boosted mod\n float: none;\n }\n\n // boosted mod\n .nav-item {\n margin-left: 0;\n font-size: $h5-font-size;\n border-top: 1px solid $gray-900;\n }\n\n .dropdown {\n padding: 0;\n\n .dropdown-toggle,\n .dropdown-item {\n padding: .875rem 0 .875rem .625rem;\n }\n\n &.show .dropdown-toggle::after {\n transform: rotateZ(180deg);\n }\n\n .dropdown-item {\n color: #fff;\n white-space: normal;\n background-color: #000;\n border-top: 1px solid $gray-900;\n\n @include focus {\n color: $primary;\n }\n }\n }\n // end mod\n}\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n // align-items: center; // boosted mod\n align-self: flex-end; // boosted mod\n // Boosted mod\n .navbar-nav {\n align-items: stretch;\n }\n // end mod\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n margin: ($spacer / 4) 0; // boosted mod\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n // Boosted mod\n background-color: #fff;\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-hover-bg;\n }\n // end mod\n }\n // Boosted mod\n &:active {\n background-color: theme-color(\"primary\");\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n }\n\n &:focus {\n outline: 0;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .navbar-toggler elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n height: $navbar-toggler-icon-size; // Boosted mod create a var for the toggler size\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n // Boosted mod\n // > .container,\n // > .container-fluid {\n // padding-right: 0;\n // padding-left: 0;\n // }\n // boosted mod\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n padding: $navbar-expanded-padding-y $navbar-expanded-padding-x 1.3125rem; // boosted mod\n\n // Boosted mod\n .navbar-brand {\n margin: 0 .625rem 0 0;\n\n img {\n width: $navbar-brand-logo-expanded-height;\n height: $navbar-brand-logo-expanded-height;\n }\n }\n\n &.minimized {\n padding-top: $navbar-expanded-minimized-padding-y;\n padding-bottom: 1rem;\n\n .navbar-brand {\n img {\n width: $navbar-brand-logo-minimized-height;\n height: $navbar-brand-logo-minimized-height;\n }\n }\n }\n // end mod\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n // Boosted mod\n .dropdown-item {\n color: $black;\n background-color: $white;\n border: 0;\n\n &.active,\n &:hover {\n color: $white;\n background-color: $black;\n }\n }\n\n .nav-item {\n font-size: $font-size-base;\n border: 0;\n\n &.dropdown {\n align-self: flex-end;\n }\n }\n // end mod\n\n .nav-link {\n padding-top: 0; // boosted mod\n padding-right: $navbar-nav-link-padding-x;\n padding-bottom: 0; // boosted mod\n padding-left: $navbar-nav-link-padding-x;\n margin-left: 1.25rem; // boosted mod\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n padding-right: $grid-gutter-width / 2; // boosted mod\n padding-left: $grid-gutter-width / 2; // boosted mod\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n @include hover-focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n @include hover-focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-spacer-y / 2;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n font-weight: $font-weight-bold; // boosted mod\n color: $card-cap-color;\n background-color: $black; // boosted mod\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-spacer-x / 2;\n margin-bottom: -$card-spacer-y;\n margin-left: -$card-spacer-x / 2;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -$card-spacer-x / 2;\n margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n /* boosted mod */\n\n .card {\n margin-bottom: 0;\n border: 0;\n // border 1px for first child only\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n\n .card-header {\n padding: 0;\n background-color: #fff;\n border: 0;\n\n &,\n h5 {\n margin: 0;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n button,\n a {\n position: relative;\n display: block;\n width: 100%;\n padding: 1rem 2.125rem 1rem 0;\n line-height: 1.125rem;\n text-align: left;\n border: 0;\n\n &::after {\n position: absolute;\n top: 1.3125rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &[aria-expanded=\"true\"]::after { // stylelint-disable-line selector-no-qualifying-type\n transform: rotate(180deg);\n }\n }\n }\n\n .card-body {\n padding: 0 1.5rem 0 0;\n margin: 0 0 1.25rem;\n }\n}\n// For mobile display emphase the border\n@include media-breakpoint-down(sm) {\n .accordion .card {\n // border 1px for first child only\n border-top-width: 2px;\n border-bottom-width: 2px;\n // remove border for card other than the first one\n ~ .card {\n border-top: 0;\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n // boosted mod\n // margin-bottom: $breadcrumb-margin-bottom;\n font-size: $breadcrumb-font-size;\n font-weight: $font-weight-bold;\n line-height: $breadcrumb-line-height;\n // end mod\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n padding-left: $breadcrumb-item-padding;\n // boosted mod\n font-family: $breadcrumb-font-family;\n font-size: $breadcrumb-divider-font-size;\n line-height: 1;\n // end mod\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n// stylelint-disable selector-max-class\n\n.page-link {\n position: relative;\n display: block;\n // Boosted mod\n min-width: $pagination-min-width;\n min-height: $pagination-min-width;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: 0;\n font-weight: $font-weight-bold;\n // End mod\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover,\n &:focus {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border; // Boosted mod\n\n // Boosted mod\n span {\n color: $pagination-color;\n }\n // end mod\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n\n // Boosted mod\n span {\n color: $pagination-bg;\n }\n // end mod\n\n // Opinionated: add \"hand\" cursor to non-disabled .page-link elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n.page-item {\n // Boosted mod\n &.presentation {\n padding: .625rem 0;\n font-weight: $font-weight-bold;\n }\n &.presentation + .page-item,\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n left: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-prev};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-prev-active};\n }\n }\n &.has-label {\n padding-right: 1.125rem;\n padding-left: 2rem;\n }\n }\n }\n\n &.presentation + .page-item,\n &:first-child,\n &:last-child {\n .page-link {\n @include hover-focus {\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n &:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n }\n }\n\n // End mod\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n // Boosted mod\n border-color: $pagination-hover-border-color;\n &::before {\n position: absolute;\n top: .6875rem;\n right: .8125rem;\n width: .5625rem;\n height: .875rem;\n content: \"\";\n background-image: #{$pagination-icon-next};\n background-repeat: no-repeat;\n }\n @include hover-focus {\n &::before {\n background-image: #{$pagination-icon-next-active};\n }\n }\n &.has-label {\n padding-right: 2rem;\n padding-left: 1.125rem;\n }\n // End mod\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n .page-link:active {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-item-bg;\n border-color: $pagination-active-item-border-color;\n }\n\n // Boosted mod\n &.active:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-active};\n }\n\n &.active:last-child .page-link::before {\n background-image: #{$pagination-icon-next-active};\n }\n // end mod\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n\n // Boosted mod\n &.disabled:first-child .page-link::before {\n background-image: #{$pagination-icon-prev-disabled};\n }\n\n &.disabled:last-child .page-link::before {\n background-image: #{$pagination-icon-next-disabled};\n }\n\n + .page-item {\n margin-left: .625rem;\n }\n // End mod\n}\n\n//\n// Sizing\n//\n// Boosted mod add a min size param\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg, $pagination-min-width-lg);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: 1.03125rem;\n }\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm, $pagination-min-width-sm);\n .page-item:first-child .page-link::before,\n .page-item:last-child .page-link::before {\n top: .53125rem;\n }\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius, $pagination-min-width) {\n .page-link {\n min-width: $pagination-min-width; // Boosted mod\n min-height: $pagination-min-width; // Boosted mod\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include transition($badge-transition);\n\n @at-root a#{&} {\n @include hover-focus {\n text-decoration: none;\n }\n }\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n\n// Boosted mod\n.badge[href] {\n @include focus {\n outline-color: #fff;\n outline-offset: -1px;\n\n &.badge-light {\n outline-color: #000;\n }\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n// stylelint-disable declaration-no-important\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n .alert-icon {\n position: absolute;\n top: .625rem;\n &::after {\n width: alert-logo-size(\"md\");\n height: alert-logo-size(\"md\");\n background-repeat: no-repeat;\n background-size: cover;\n }\n }\n}\n\n// boosted mod\n.alert-sm {\n padding: $alert-padding-y-sm $alert-padding-x-sm;\n .alert-icon {\n top: .4375rem;\n &::after {\n width: alert-logo-size(\"sm\");\n height: alert-logo-size(\"sm\");\n }\n }\n}\n\n.alert-lg {\n padding: $alert-padding-y-lg $alert-padding-x-lg;\n .alert-icon {\n top: .625rem;\n &::after {\n width: alert-logo-size(\"lg\");\n height: alert-logo-size(\"lg\");\n }\n }\n}\n//end mode\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $close-font-size + $alert-padding-x * 2;\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n line-height: $alert-padding-y; // boosted mod\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n // Boosted mod adapt color with background, and keep initial brand color value for background\n @if ($color == \"secondary\" or $color == \"danger\" or $color == \"dark\") {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $white);\n } @else {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), $black);\n }\n // end mod\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n// BOOSTED MOD progress is half height on mobile\n@include media-breakpoint-down(md) {\n .progress {\n width: 100%;\n height: ($progress-height / 2);\n line-height: ($progress-height / 2);\n }\n .progress-bar {\n font-size: $font-size-sm;\n line-height: ($progress-height / 2);\n }\n}\n// end mod\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n color: $list-group-color;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n .list-group-item {\n margin-right: -$list-group-border-width;\n margin-bottom: 0;\n\n &:first-child {\n @include border-left-radius($list-group-border-radius);\n @include border-top-right-radius(0);\n }\n\n &:last-child {\n margin-right: 0;\n @include border-right-radius($list-group-border-radius);\n @include border-bottom-left-radius(0);\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:last-child {\n margin-bottom: -$list-group-border-width;\n }\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, 0), $black); // boosted mod\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n // boosted mod\n @if $state == \"secondary\" or $state == \"dark\" {\n color: $white;\n } @else {\n color: $color;\n }\n // end mod\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: 1; // boosted mod\n\n // Override <a>'s hover style\n @include hover {\n color: $close-color;\n text-decoration: none;\n }\n\n &:not(:disabled):not(.disabled) {\n @include hover-focus {\n opacity: 1; // boosted mod\n }\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n pointer-events: none;\n}\n",".toast {\n max-width: $toast-max-width;\n overflow: hidden; // cheap rounded corners on nested items\n @include font-size($toast-font-size);\n color: $toast-color;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n backdrop-filter: blur(10px);\n opacity: 0;\n @include border-radius($toast-border-radius);\n\n &:not(:last-child) {\n margin-bottom: $toast-padding-x;\n }\n\n &.showing {\n opacity: 1;\n }\n\n &.show {\n display: block;\n opacity: 1;\n }\n\n &.hide {\n display: none;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n // Kill the scroll on the body\n overflow: hidden;\n\n .modal {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n}\n\n.modal-dialog-scrollable {\n display: flex; // IE10/11\n max-height: calc(100% - #{$modal-dialog-margin * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\n overflow: hidden;\n }\n\n .modal-header,\n .modal-footer {\n flex-shrink: 0;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - #{$modal-dialog-margin * 2});\n\n // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n &::before {\n display: block; // IE10\n height: calc(100vh - #{$modal-dialog-margin * 2});\n content: \"\";\n }\n\n // Ensure `.modal-body` shows scrollbar (IE10/11)\n &.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n\n .modal-content {\n max-height: none;\n }\n\n &::before {\n content: none;\n }\n }\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n width: 100vw;\n height: 100vh;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-border-radius);\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n &::before {\n height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // boosted mod\n font-weight: $tooltip-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // boosted mod\n font-weight: $popover-font-weight;\n // end mod\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n > .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n > .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n > .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width / 2;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n > .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n @include transition(0s $carousel-transition-duration opacity);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 2px dotted $input-focus-border-color; //boosted mod\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: no-repeat 50% / 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: .5;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: 1;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) / 2;\n bottom: 20px;\n left: (100% - $carousel-caption-width) / 2;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n background-color: currentColor;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable property-blacklist, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n border-radius: $border-radius !important;\n}\n\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n &::before {\n padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { float: left !important; }\n .float#{$infix}-right { float: right !important; }\n .float#{$infix}-none { float: none !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !important; }\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n // Just in case `pointer-events: none` is set on a parent\n pointer-events: auto;\n content: \"\";\n // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n background-color: rgba(0, 0, 0, 0);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-wrap { white-space: normal !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-weight-bolder { font-weight: $font-weight-bolder !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n word-break: break-word !important; // IE & < Edge 18\n overflow-wrap: break-word !important;\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n // boosted mod try to fix print errors\n // https://github.com/twbs/bootstrap/issues/26781\n .row,\n .form-row {\n display: block !important;\n }\n }\n}\n","//\n// Cards\n//\n\n.card-deck .o-card-link {\n margin: 0 1rem;\n}\n\n.o-card-link {\n .card-title {\n align-self: center;\n width: 100%; // IE fix\n margin: auto 0;\n font-weight: $font-weight-bold;\n word-break: normal;\n }\n\n .card-img {\n padding: 0;\n text-align: center;\n\n img {\n width: 100%;\n height: auto;\n }\n }\n\n .card-body {\n display: flex;\n flex-direction: column;\n text-align: center;\n }\n}\n\n@include media-breakpoint-up(xs) {\n .card-deck {\n margin: 0;\n }\n}\n\n@include media-breakpoint-down(xs) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n\n .card-deck {\n flex-direction: column;\n }\n\n .card-deck .o-card-link,\n .o-card-link {\n flex-direction: row;\n height: 3.75rem;\n margin: 0;\n margin-bottom: .625rem;\n border: 0;\n }\n\n .o-card-link {\n .card-img {\n flex-basis: 20%;\n width: auto;\n padding: 0;\n\n img {\n width: auto;\n height: 3.75rem;\n }\n }\n\n .card-body {\n flex-basis: 80%;\n align-self: center;\n padding: 0 1rem;\n text-align: left;\n }\n\n .card-title {\n align-self: flex-start;\n margin: 0;\n\n &::after {\n position: absolute;\n top: calc(50% - .5rem);\n right: .25rem;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23999'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n }\n }\n }\n}\n\n@include media-breakpoint-only(sm) {\n .card.o-card-link {\n flex-basis: auto;\n margin: 1rem;\n }\n}\n","// Orange switches\n//\n//\n// stylelint-disable selector-max-class\n// stylelint-disable property-blacklist\n\n.o-switch {\n .toggle,\n .toggle::before,\n .toggle .on,\n .toggle .off {\n transition: .4s;\n }\n\n .toggle {\n position: relative;\n display: block;\n width: auto;\n min-width: 3.75rem;\n height: 1.875rem;\n margin: .3125rem 0;\n background: $gray-700;\n border: 2px solid $gray-700;\n\n &.toggle-rounded,\n &.toggle-rounded::before {\n border-radius: 1.625rem;\n }\n\n .on,\n .off {\n display: none;\n font-weight: $font-weight-bold;\n line-height: 1.625rem;\n color: #fff;\n text-align: left;\n cursor: default;\n opacity: 0;\n }\n\n .on.svg-checkbox-tick::after {\n top: .1875rem;\n left: -.125rem;\n }\n\n .off {\n display: block;\n text-align: right;\n opacity: 1;\n\n &.svg-delete::after {\n top: .1875rem;\n right: -.125rem;\n left: auto;\n }\n }\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: block;\n width: 1.625rem;\n height: 1.625rem;\n content: \"\";\n background: #fff;\n }\n }\n}\n\n.o-switch .checkbox {\n @include focus {\n + .toggle::before {\n outline: 1px dotted #fff;\n }\n }\n\n &:checked {\n + .toggle {\n background: theme-color(\"primary\");\n border-color: theme-color(\"primary\");\n\n .on {\n display: block;\n opacity: 1;\n }\n .off {\n display: none;\n opacity: 0;\n }\n\n &::before {\n right: 0;\n left: auto;\n }\n }\n }\n\n &.success:checked {\n + .toggle {\n background: theme-color(\"success\");\n border-color: theme-color(\"success\");\n\n .on {\n color: #000;\n }\n\n .on.icon-checkbox-tick {\n color: #fff;\n }\n }\n }\n}\n\n.form-group.row .o-switch .col-form-label.toggle {\n padding: 0 .375rem;\n\n &.toggle-rounded {\n padding: 0 .875rem;\n }\n}\n\n// 3 way toggles\n\n.o-switch.btn-group-toggle {\n display: inline-flex;\n justify-content: flex-start;\n border: 2px solid #ccc;\n\n .btn {\n min-width: 2.5rem;\n padding-right: 0;\n padding-left: 0;\n margin: -2px 0;\n border: 2px solid transparent;\n\n &:first-child {\n margin-left: -2px;\n }\n\n &:last-child {\n margin-right: -2px;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n\n &.focus {\n outline: 1px dotted #fff;\n outline-offset: -2px;\n }\n\n &:active {\n border-color: theme-color(\"primary\");\n }\n\n @include hover {\n &:not(:active) {\n color: theme-color(\"primary\");\n background-color: transparent;\n }\n\n &.active {\n color: #fff;\n background-color: #000;\n border-color: #000;\n }\n }\n }\n\n &.no-outline {\n border-color: transparent;\n\n .btn {\n border-top: 2px solid transparent;\n border-bottom: 2px solid transparent;\n\n &:first-child {\n border-left-color: transparent;\n }\n\n &:last-child {\n border-right-color: transparent;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n\n @include hover {\n &:not(:active) {\n color: #000;\n background-color: #fff;\n border-color: #ccc;\n }\n\n &.active {\n color: theme-color(\"primary\");\n background-color: #fff;\n border-color: transparent;\n outline-color: #000;\n }\n }\n }\n }\n}\n","//\n// Orange forms\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n\n.form-group {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n width: auto;\n }\n\n .invalid-feedback {\n margin-top: .8125rem;\n font-weight: $font-weight-bold;\n }\n\n &.top {\n display: flex;\n flex-direction: column;\n\n .col-form-label {\n margin-bottom: 0;\n }\n\n .form-control {\n order: 2;\n }\n .invalid-feedback {\n order: 1;\n margin-top: 0;\n margin-bottom: .8125rem;\n line-height: 1;\n }\n }\n\n &.right {\n display: flex;\n flex-flow: row wrap;\n\n label,\n .col-form-label {\n min-width: 100%;\n }\n\n .form-control-message,\n .invalid-feedback {\n max-width: 50%;\n margin-left: .625rem;\n }\n }\n\n &.row {\n &.top {\n flex-direction: row;\n\n label,\n .col-form-label {\n order: 1;\n }\n\n .form-control {\n order: 2;\n margin-top: 0;\n }\n\n .invalid-feedback {\n order: 0;\n }\n }\n\n &.right {\n label,\n .col-form-label {\n min-width: auto;\n }\n\n .invalid-feedback {\n align-self: center;\n margin-top: 0;\n }\n }\n }\n\n &.is-required label::after {\n margin-left: 6px;\n font-weight: $font-weight-bold;\n color: theme-color(\"primary\");\n content: \"*\";\n }\n\n // browser reset\n .form-control:invalid {\n outline: none;\n box-shadow: none;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: auto;\n padding-top: .4375rem;\n padding-bottom: .4375rem;\n\n &.form-control-lg {\n padding-top: .65625rem;\n padding-bottom: .65625rem;\n }\n\n &.form-control-sm {\n padding-top: .1875rem;\n padding-bottom: .1875rem;\n }\n }\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n ~ .invalid-feedback {\n top: ($line-height-base + .5); // Height of the `label` and its margin\n }\n}\n","// Bullet point\n//\n//\n\n.o-square-list {\n padding-left: 0;\n color: theme-color(\"primary\");\n text-align: left;\n\n &,\n ul * {\n list-style-type: none;\n }\n\n li {\n color: #000;\n\n &::before {\n margin-right: 1rem;\n font-size: $font-size-sm;\n line-height: 1.25rem;\n color: theme-color(\"primary\");\n vertical-align: text-top;\n content: \"\\25A0\";\n }\n\n span {\n display: inline-block;\n margin-bottom: .625rem;\n }\n\n > ul {\n padding-left: 1rem;\n }\n }\n\n ul > li::before {\n color: $gray-600;\n }\n\n ul ul > li::before { // stylelint-disable-line selector-max-type\n color: $gray-500;\n }\n}\n","//\n// Orange stepbar\n//\n// stylelint-disable selector-max-class\n\n// url encoded colors\n$arrow-black: \"000000\" !default;\n$arrow-gray: \"dddddd\" !default;\n$arrow-orange: \"f16e00\" !default;\n\n// generate url encoded svg with color\n@function arrow-svg($color) {\n @return \"%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2240%22%20viewBox%3D%220%200%2016%2040%22%3E%3Cpath%20d%3D%22M0%200l14%2020L0%2040z%22%20fill%3D%22%23#{$color}%22%2F%3E%3Cpath%20d%3D%22M2%200H0l14%2020L0%2040h2l14-20z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E\";\n}\n\n@mixin stepbar-arrow($color) {\n &::after {\n position: absolute;\n top: 0;\n right: -$o-stepbar-arrow-width;\n z-index: 500;\n display: block;\n width: $o-stepbar-arrow-width;\n height: $o-stepbar-height;\n content: \"\";\n $arrow-svg: arrow-svg($color);\n background-image: url(\"data:image/svg+xml,#{$arrow-svg}\");\n background-size: $o-stepbar-arrow-width $o-stepbar-height;\n }\n}\n\n.o-stepbar {\n &,\n ol,\n ul {\n padding: 0;\n margin: 0;\n overflow: hidden;\n }\n\n // one item\n .stepbar-item:first-child:nth-last-child(1) {\n width: 100%;\n }\n\n // two items\n .stepbar-item:first-child:nth-last-child(2),\n .stepbar-item:first-child:nth-last-child(2) ~ .stepbar-item {\n width: 50%;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 33.3333%;\n }\n\n // four items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item {\n width: 25%;\n }\n\n // five items\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n }\n\n .stepbar-item {\n @include stepbar-arrow($arrow-gray);\n position: relative;\n float: left;\n padding: ($spacer / 2) $spacer;\n padding-left: 2rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: $line-height-base;\n color: #000;\n text-align: center;\n white-space: nowrap;\n list-style: none;\n background-color: $gray-400;\n\n &:first-child {\n padding-left: $spacer;\n }\n\n &:last-child {\n &::after {\n display: none;\n }\n }\n\n &.done {\n @include stepbar-arrow($arrow-black);\n background-color: #000;\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n &.current {\n @include stepbar-arrow($arrow-orange);\n background-color: theme-color(\"primary\");\n .stepbar-link {\n color: #fff;\n }\n\n &:last-child::after {\n display: none;\n }\n }\n\n .stepbar-link {\n text-decoration: none;\n\n .step-number::after {\n content: \".\";\n }\n }\n }\n}\n\n// For mobile display in any case, reduce the padding and the height\n@include media-breakpoint-down(xs) {\n .o-stepbar {\n .stepbar-item {\n padding: $o-stepbar-mobile-padding-vertical ($spacer / 2) $o-stepbar-mobile-padding-vertical ($spacer + $o-stepbar-mobile-arrow-width);\n line-height: $input-btn-line-height;\n }\n\n .stepbar-item::after,\n .stepbar-item.done::after,\n .stepbar-item.current::after,\n .stepbar-item.next::after {\n right: -($o-stepbar-mobile-arrow-width - .0625); // remove 1px for mobile display error\n width: $o-stepbar-mobile-arrow-width;\n height: $o-stepbar-mobile-arrow-height;\n background-size: cover;\n }\n\n &.xs-numbers {\n .step-number::after {\n display: none;\n }\n\n // three items\n .stepbar-item:first-child:nth-last-child(3),\n .stepbar-item:first-child:nth-last-child(3) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 60%;\n }\n }\n\n // four and five items\n .stepbar-item:first-child:nth-last-child(4),\n .stepbar-item:first-child:nth-last-child(4) ~ .stepbar-item,\n .stepbar-item:first-child:nth-last-child(5),\n .stepbar-item:first-child:nth-last-child(5) ~ .stepbar-item {\n width: 20%;\n\n &.current {\n width: 40%;\n }\n }\n\n .stepbar-item {\n width: 20%;\n padding-right: 0;\n padding-left: $o-stepbar-mobile-arrow-width;\n\n &:first-child {\n padding-left: 0;\n }\n\n &.current {\n width: 60%;\n }\n\n &.current .step-number {\n display: none;\n }\n\n &:not(.current) .step-title {\n display: none;\n }\n }\n }\n\n &.xs-labels {\n .step-number {\n display: none;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n//\n// o-link-arrow\n// --------------------------------------------------\n\n.o-link-arrow {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n text-decoration: none;\n\n &::after {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93e\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::after {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n // previous link\n &.back {\n &::after {\n padding: 0;\n content: \"\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &::before {\n display: inline-block;\n padding: $o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal $o-link-arrow-separator-padding-vertical 0;//$o-link-arrow-separator-padding-vertical $o-link-arrow-separator-padding-horizontal;\n font-family: icon-orange;\n font-size: $o-link-arrow-separator-size;\n color: $o-link-arrow-color;\n content: \"\\e93f\"; // Unicode space added since inline-block means non-collapsing white-space\n }\n &:hover,\n &:focus {\n &::before {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n }\n }\n}\n","// stylelint-disable property-blacklist\n//\n// Mega menu\n//\n\n.mega-menu {\n overflow: hidden;\n}\n\n.mega-menu > .navbar-nav {\n transition: transform .5s;\n transform: translateX(0);\n}\n\n.mega-menu-panel > .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav {\n flex-direction: column;\n}\n\n.mega-menu-panel > .navbar-nav .navbar-nav,\n.mega-menu-panel > .container > .navbar-nav .navbar-nav {\n position: absolute;\n top: 0;\n left: 100%;\n display: none;\n width: 100%;\n}\n","// Orange navbar\n//\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-class\n// stylelint-disable selector-max-compound-selectors\n// stylelint-disable selector-max-combinators\n// stylelint-disable property-blacklist\n\n.navbar {\n .nav-link.icon {\n margin-top: 0;\n\n span[class^=\"icon-\"] {\n font-size: 1.5rem;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.875rem;\n height: 1.875rem;\n }\n }\n\n .nav-link:not(.icon)[class*=\"svg-\"]::after {\n top: 0;\n right: 0;\n left: auto;\n }\n}\n\n.navbar.supra {\n @include media-breakpoint-down(xs) {\n display: none;\n }\n\n height: $navbar-supra-height; // IE flex support\n min-height: $navbar-supra-height;\n padding-top: 0;\n padding-bottom: 0;\n border-bottom: 1px solid $gray-900;\n\n > .container,\n > .container .navbar-nav {\n align-items: center;\n }\n\n .navbar-brand {\n display: none;\n }\n\n .navbar-nav {\n margin: 0;\n\n > .nav-link:first-child,\n .nav-item:first-child .nav-link {\n margin-left: 0;\n }\n }\n\n .nav-link,\n .dropdown-toggle {\n @include focus {\n outline-offset: .5rem;\n }\n\n font-size: $font-size-sm;\n line-height: 1;\n\n span[class^=\"icon-\"] {\n font-size: $h5-font-size;\n font-weight: $font-weight-normal;\n }\n }\n\n .nav-link.icon {\n span[class^=\"icon-\"] {\n font-size: $h6-font-size;\n font-weight: $font-weight-normal;\n }\n\n &[class*=\"svg-\"],\n &[class*=\"svg-\"]::after {\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n .dropdown-menu {\n right: 0;\n left: auto;\n }\n}\n\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n &,\n &.minimized {\n .mega-menu .nav-link {\n padding-right: 0;\n outline-offset: -1px;\n\n &[data-toggle=\"collapse\"]::before {\n margin-top: .3125rem;\n margin-right: .9375rem;\n content: \"\";\n border-top: .4375em solid;\n border-right: .4375em solid transparent;\n border-left: .4375em solid transparent;\n transform: rotateZ(180deg);\n }\n\n &[data-toggle=\"collapse\"].collapsed::before {\n transform: rotateZ(0deg);\n }\n }\n\n .mega-menu-panel .nav-link.back {\n display: block;\n\n &::before {\n float: left;\n transform: rotateZ(180deg);\n }\n }\n\n .mega-menu-panel > .container {\n width: 100%;\n padding: 0;\n margin: 0;\n\n a[data-toggle=\"collapse\"] {\n display: none;\n }\n\n > .navbar-nav > .nav-item {\n padding: 0;\n border: 0;\n }\n\n > .navbar-nav .navbar-nav .nav-item:last-child {\n border-bottom: 1px solid #333;\n }\n }\n }\n }\n\n @include media-breakpoint-up($next) {\n .mega-menu {\n overflow: visible;\n\n > .navbar-nav {\n transition: none;\n transform: none;\n\n .nav-link::before {\n display: none;\n }\n }\n }\n\n .mega-menu-panel {\n position: absolute;\n top: 100px;\n left: 0;\n z-index: $zindex-fixed;\n width: 100%;\n padding: 1rem 0;\n background-color: #000;\n border-top: 1px solid #333;\n\n a[data-toggle=\"collapse\"] {\n display: block;\n float: right;\n margin: 1.25rem;\n color: #fff;\n }\n\n .nav-link {\n margin-left: 0;\n }\n\n .svg-delete {\n width: 1.25rem;\n height: 1.25rem;\n }\n\n > .container > .navbar-nav {\n flex-direction: row;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav > .nav-item {\n flex-grow: 1;\n padding: 1rem 0;\n }\n\n > .container > .navbar-nav > .nav-item > .nav-link {\n padding: 0;\n margin-right: .625rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n }\n\n > .container > .navbar-nav .navbar-nav {\n position: static;\n display: block !important; // stylelint-disable-line declaration-no-important\n flex-direction: column;\n align-items: flex-start;\n }\n\n > .container > .navbar-nav .navbar-nav .nav-link {\n padding: 0;\n line-height: 1.25rem;\n outline-offset: 1px;\n }\n\n > .container > .navbar-nav .nav-item:first-child,\n > .container > .navbar-nav .nav-item + .nav-item {\n margin-left: 0;\n }\n\n > .container > .navbar-nav .nav-link.back {\n display: none;\n }\n }\n }\n }\n }\n}\n\n@include media-breakpoint-down(sm) {\n .navbar-brand,\n .navbar-brand + .navbar-brand {\n align-self: center;\n }\n}\n","//\n// Tables\n//\n// stylelint-disable selector-no-qualifying-type\n// stylelint-disable selector-max-type\n// stylelint-disable selector-class-pattern\n\n// Change the table states color\n@mixin table-row-variant-border($state, $color) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $color;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($color, 5%);\n }\n }\n}\n\n.table {\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n border-bottom: 1px solid $table-border-color;\n\n > th,\n > td {\n font-size: $font-size-sm;\n line-height: 1.25rem;\n vertical-align: middle;\n border: 0;\n }\n\n > th:first-child,\n > td:first-child {\n padding-left: .625rem;\n }\n\n [class^=\"icon-\"],\n [class*=\" icon-\"] {\n font-size: 1.8125rem;\n }\n\n [class^=\"svg-\"] {\n display: block;\n width: 1.8125rem;\n height: 1.8125rem;\n margin: 0 auto;\n }\n\n [class^=\"svg-\"]::after {\n width: 1.8125rem;\n height: 1.8125rem;\n }\n }\n }\n\n thead {\n\n\n > tr {\n border-bottom-width: 2px;\n\n > th {\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n }\n }\n }\n\n tbody > th {\n font-weight: $font-weight-normal;\n }\n\n &.has-checkbox {\n tr.selected {\n > td,\n > th {\n background-color: $gray-400;\n }\n }\n\n tr > th:first-child,\n tr > td:first-child {\n width: 1.25rem;\n padding-top: 0;\n padding-bottom: 0;\n }\n }\n\n &.has-icon {\n tr > td,\n tr > th {\n height: 3.1875rem;\n padding-top: .6875rem;\n vertical-align: middle;\n\n span,\n img {\n vertical-align: middle;\n }\n\n img {\n width: 1.875rem;\n height: 1.875rem;\n margin-right: .625rem;\n }\n\n [class^=\"icon-\"] {\n width: 1.875rem;\n margin-right: .375rem;\n font-size: 1.8125rem;\n line-height: 0;\n vertical-align: middle;\n }\n }\n }\n\n // &.has-status {\n // thead th:not(:first-child),\n // tr > td {\n // text-align: center;\n // }\n // }\n\n &.table-reflow {\n thead,\n tbody, {\n > tr {\n border: 0;\n }\n\n > tr > td {\n line-height: 1.25rem;\n }\n\n > tr > th:first-child {\n border-bottom: 2px solid $table-border-color;\n }\n\n > tr > th,\n > tr > td {\n border-bottom: 1px solid $table-border-color;\n }\n\n > tr > td:last-child {\n border-right: 0;\n }\n }\n\n thead > tr {\n border: 0;\n\n > th:not(:first-child) {\n padding-left: .625rem;\n border-bottom: 1px solid $table-border-color;\n }\n\n > th:last-child {\n border-right: 0;\n }\n }\n\n tbody {\n > tr > th:first-child {\n padding-left: 0;\n }\n }\n }\n}\n\n@include table-row-variant-border(success, theme-color(\"success\"));\n@include table-row-variant-border(info, theme-color(\"info\"));\n@include table-row-variant-border(warning, theme-color(\"warning\"));\n@include table-row-variant-border(danger, theme-color(\"danger\"));\n\n\n// force caption for tables\ncaption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n caption-side: top;\n background-color: #fff;\n}\n\n// Style jquery tablesorter ext\n// scss-lint:disable SelectorFormat\n//\n// Table sorter\n//\n\n.tablesorter {\n caption {\n padding: .75rem 0;\n font-size: $h1-font-size;\n font-weight: $font-weight-bold;\n color: #000;\n background-color: #fff;\n }\n\n th {\n padding-right: 30px;\n text-align: left;\n cursor: pointer;\n\n &.header {\n position: relative;\n }\n\n .tablesorter-header-inner span {\n padding-right: 1.6875rem;\n }\n\n &.tablesorter-headerDesc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n transform: rotate(180deg);\n }\n\n &.tablesorter-headerAsc .tablesorter-header-inner span::after {\n position: absolute;\n top: 45%;\n width: .875rem;\n height: .4375rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $accordion-arrow-icon;\n }\n\n &.tablesorter-headerUnSorted {\n .tablesorter-header-inner:hover span::after,\n .tablesorter-header-inner:focus span::after {\n position: absolute;\n top: 31%;\n width: .875rem;\n height: 1.0625rem;\n margin-left: .625rem;\n content: \"\";\n background-image: $o-sortable-hover-icon;\n }\n }\n\n a {\n color: #000;\n text-decoration: none;\n\n @include hover-focus {\n color: theme-color(\"primary\");\n text-decoration: underline;\n }\n }\n }\n\n td {\n text-align: left;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n.modal {\n\n .modal-content {\n display: flex;\n flex-direction: column;\n padding: 2.5rem;\n border: 0;\n }\n\n .modal-header {\n position: relative;\n min-height: 1.25rem;\n padding: 0;\n margin-bottom: 2.5rem;\n border: 0;\n\n .btn {\n position: absolute;\n top: -.625rem;\n right: -.625rem;\n padding: .625rem;\n background-color: transparent;\n border: 0;\n\n\n .close {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0;\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22852.063%22%20height%3D%22852.063%22%20viewBox%3D%220%200%20852.063%20852.063%22%3E%3Cpath%20id%3D%22closing_cross.svg%22%20data-name%3D%22closing%20cross.svg%22%20class%3D%22cls-1%22%20d%3D%22M.987%2057.125L57.125.987%20851.048%20794.91l-56.138%2056.138zM794.91.987l56.138%2056.138L57.125%20851.048.987%20794.91z%22%20fill%3D%22%23666%22%2F%3E%3C%2Fsvg%3E\");\n background-size: 1.25rem;\n opacity: 1;\n }\n }\n }\n\n .modal-body {\n display: flex;\n flex-direction: column;\n padding: 0;\n border: 0;\n\n .card,\n .card {\n display: flex;\n flex-direction: row;\n padding: 0;\n border: 0;\n }\n\n .card-body {\n padding: 0;\n }\n\n .card-icon {\n margin-right: 1.25rem;\n }\n\n [class^=\"svg\"],\n [class^=\"svg\"]::after {\n width: 2.875rem;\n height: 2.875rem;\n }\n\n [class^=\"svg\"] {\n display: block;\n }\n\n [class^=\"svg\"]::after {\n top: auto;\n }\n\n .card-title {\n margin-bottom: 1.25rem;\n font-size: 1.5rem;\n }\n }\n\n .modal-footer {\n align-self: flex-end;\n padding: 0;\n margin-top: 2.5rem;\n border: 0;\n\n .btn + .btn {\n margin-left: 1.25rem;\n }\n }\n}\n\n@include media-breakpoint-down(xs) {\n .modal {\n .modal-content {\n padding: 1.25rem;\n }\n\n .modal-header {\n margin: 0;\n }\n\n .modal-body {\n .card {\n flex-direction: column;\n }\n\n .card-icon {\n align-self: center;\n margin-right: 0;\n }\n\n .card-icon,\n [class^=\"svg\"]::after {\n width: 4rem;\n height: 4rem;\n }\n\n .card-title {\n font-size: 1rem;\n }\n\n .card-body {\n margin-top: 1.25rem;\n }\n }\n\n .modal-footer {\n align-self: center;\n }\n }\n}\n","// Base nav\n.nav {\n .nav-item:first-child {\n margin-left: - ($spacer * .5);\n }\n\n &.flex-column .nav-item:first-child {\n margin-left: 0;\n }\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n line-height: 1.25rem;\n }\n}\n\n// Boosted Mod\n.o-nav-light {\n padding-left: inherit;\n border-bottom: 1px solid $gray-600;\n}\n.o-active {\n color: #f16e00;\n border-bottom: 3px solid #f16e00;\n}\n\n// End mod\n\n//\n// classic tab\n//\n\n.nav-tabs {\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n\n .nav-link:not(.disabled) {\n &,\n &.dropdown-toggle {\n @include focus {\n outline-width: 1px;\n outline-style: dotted;\n outline-offset: -6px;\n }\n }\n\n + .nav-link {\n margin-left: .5rem;\n // On mobile no margin between tabs\n @include media-breakpoint-down(md) {\n margin-left: 0;\n }\n }\n }\n}\n\n// Responsive tabs\n//\n//\n\n.o-tab-container {\n display: flex;\n flex-flow: row wrap;\n\n .o-tab-heading {\n position: relative;\n display: inline-block;\n padding: .625rem 1.25rem;\n margin-left: .5rem;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: center;\n background-color: #fff;\n border: 0;\n border-bottom: 2px solid #000;\n\n &:first-child {\n margin-left: 0;\n border-top: 0;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 2px solid #000;\n }\n\n &[aria-expanded=\"true\"] {\n padding-top: .5rem;\n border: 2px solid #000;\n border-bottom: 0;\n }\n\n &:focus {\n outline-offset: -4px;\n }\n\n &:hover:not([aria-expanded=\"true\"]) {\n color: #fff;\n background-color: #000;\n }\n }\n\n .o-tab-content {\n display: none;\n align-self: flex-end;\n order: 1;\n width: 100%;\n padding: .625rem 1.25rem;\n background-color: #fff;\n box-shadow: 0 -2px 0 #000;\n\n &.show {\n display: block;\n }\n }\n\n @include media-breakpoint-down(sm) {\n .o-tab-heading {\n flex-grow: 1;\n margin-left: 0;\n text-align: center;\n\n &[aria-expanded=\"false\"] {\n color: #fff;\n background-color: #666;\n\n &:active {\n color: #fff;\n background-color: #f16e00;\n }\n }\n }\n\n &.accordion-layout {\n display: block;\n\n .o-tab-heading {\n position: relative;\n display: block;\n padding: .9375rem 0;\n margin-left: 0;\n font-weight: $font-weight-bold;\n color: #000;\n text-align: left;\n background-color: #fff;\n border: 0;\n\n &:focus {\n outline-offset: 0;\n }\n\n &:hover {\n color: #f16e00;\n background-color: #fff;\n }\n\n &[aria-expanded=\"false\"] {\n border-bottom: 1px #ccc solid;\n }\n\n &[aria-expanded=\"true\"]::after {\n transform: rotate(180deg);\n }\n\n &:first-child {\n margin-left: 0;\n border-top: 1px solid #ccc;\n }\n\n &::after {\n position: absolute;\n top: 1.375rem;\n right: .625rem;\n width: .875rem;\n height: .4375rem;\n content: \"\";\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2014%207%22%3E%3Cpath%20d%3D%22M7%207L0%200h14L7%207z%22%2F%3E%3C%2Fsvg%3E\");\n }\n }\n\n .o-tab-content {\n padding-left: 0;\n border-bottom: 1px #ccc solid;\n box-shadow: none;\n }\n }\n }\n}\n\n// Pills\n// -------------------------\n.nav-pills {\n &.nav-stacked .nav-item {\n margin: 0;\n\n + .nav-item {\n margin-left: 0;\n }\n }\n\n .nav-item {\n &:first-child {\n margin-left: 0;\n }\n\n + .nav-item {\n margin-left: ($grid-gutter-width / 4);\n }\n }\n\n .nav-link {\n @include active {\n background-color: $nav-pills-link-active-bg;\n }\n\n @include hover {\n color: $nav-pills-link-active-color;\n cursor: default;\n background-color: $nav-pills-link-active-bg;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n @include focus {\n color: $nav-pills-focus-link-color;\n background-color: $nav-pills-focus-link-bg;\n outline: none;\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: $nav-link-disabled-hover-bg;\n }\n }\n\n padding-top: $spacer;\n padding-bottom: $spacer;\n }\n .dropdown-menu {\n right: 0;\n left: auto;\n\n .nav-item {\n margin: 0;\n\n .nav-link {\n @include focus {\n outline: 1px dotted #000;\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n margin: 0;\n color: #000;\n background: #fff;\n border: 0;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n }\n}\n\n.tab-content {\n padding: 1.125rem;\n border-color: #000;\n border-style: solid;\n border-width: 0 2px 2px;\n\n .tab-pane p {\n margin-bottom: 0;\n }\n}\n\n.tab-content-clear {\n // padding: 1.125rem;\n border: 0;\n}\n\n// breadcrums\n\n.breadcrum {\n line-height: 1;\n}\n\n// priority nav\n\n.overflow-nav {\n display: none;\n}\n\n.o-nav-local.resizing {\n overflow: hidden;\n}\n\n.hide {\n display: none !important; // stylelint-disable-line declaration-no-important\n}\n\n.show-inline-block {\n display: inline-block !important; // stylelint-disable-line declaration-no-important\n}\n\n.overflow-nav-list {\n .nav-link {\n border: 0;\n &:focus {\n outline-offset: -2px;\n }\n }\n\n .nav-item:last-child {\n margin-bottom: 0;\n }\n}\n\n.o-nav-local .overflow-nav-list {\n margin-top: 1px;\n border: 0;\n box-shadow: 0 .3125rem .625rem -.375rem #999;\n}\n","//\n// Nav local\n//\n\n.o-nav-local {\n margin-bottom: ($spacer * 2);\n border-top: 1px solid $gray-500;\n border-bottom: 1px solid $gray-500;\n\n > .container,\n > .container-fluid {\n display: flex;\n }\n\n ul + ul {\n flex-shrink: 0;\n margin-left: 1rem;\n }\n\n .nav-item + .nav-item {\n margin-left: 1rem;\n }\n\n .nav.flex-column .nav-item {\n margin-left: 0;\n }\n\n .nav .nav-link,\n .nav .dropdown-toggle {\n @include focus {\n outline: 1px dotted;\n outline-offset: -1px;\n }\n display: inline-block;\n padding: 1rem ($nav-link-padding-x * .5) 1.125rem;\n font-size: $font-size-base;\n font-weight: $font-weight-bold;\n line-height: 1;\n }\n\n .nav-link.active {\n color: theme-color(\"primary\");\n }\n\n .dropdown-toggle.show {\n color: #000;\n }\n\n .dropdown-menu {\n .nav-item,\n .nav-item + .nav-item {\n margin: 0;\n }\n\n .nav-link {\n @include focus {\n outline-offset: -2px;\n }\n display: block;\n padding: .625rem .625rem .625rem 1.25rem;\n }\n\n .nav-link:hover {\n color: #fff;\n background: #000;\n }\n }\n}\n\n.o-nav-local.inverse {\n background-color: #000;\n border-top-color: $gray-900;\n border-bottom-color: $gray-900;\n\n .nav-link {\n @include hover-focus {\n color: theme-color(\"primary\");\n }\n\n &:focus {\n outline-color: #fff;\n }\n\n color: #fff;\n background-color: #000;\n\n &.active {\n color: theme-color(\"primary\");\n }\n }\n}\n\n",".skiplinks {\n z-index: 99999;\n}\n.skiplinks .skiplinks-section li {\n float: left;\n}\n.skiplinks .skiplinks-section a {\n display: block;\n padding: 10px;\n font-weight: $font-weight-bold;\n border-color: #999;\n border-style: none solid none none;\n border-width: 0 1px 0 0;\n}\n.skiplinks .skiplinks-section.skiplinks-show {\n position: absolute;\n top: 20px;\n left: 50%;\n z-index: 10000000;\n width: auto;\n height: auto;\n margin-left: -175px;\n overflow: hidden;\n background: none repeat scroll 0 0 $gray-500;\n border: 2px solid #000;\n @include border-radius(0);\n box-shadow: 2px 2px 1634px 1604px rgba(0, 0, 0, .3);\n}\n.skiplinks .skiplinks-section a:hover {\n cursor: pointer;\n}\n\n.skiplinks .skiplinks-section a:hover,\n.skiplinks .skiplinks-section a:focus {\n color: #f16e00;\n background-color: #fff;\n outline: 0 none;\n}\n\n.skiplinks a,\n.skiplinks ul,\n.skiplinks li,\n.skiplinks div {\n float: none;\n padding: 0;\n margin: 0;\n font-size: .95em;\n font-weight: $font-weight-normal;\n line-height: normal;\n color: #000;\n text-decoration: none;\n text-shadow: none;\n list-style: none;\n background: none repeat scroll 0 0 transparent;\n border: 0 none;\n}\n","//\n// Footer\n//\n\n.o-footer {\n margin-top: 2.5rem;\n font-size: $font-size-sm;\n font-weight: $font-weight-bold;\n color: #fff;\n background-color: #000;\n\n .nav-link {\n padding: $nav-link-padding-y ($nav-link-padding-x * .5);\n font-size: $font-size-sm;\n line-height: 1.25rem;\n\n &:not(:hover),\n &:not([href]) {\n color: #fff;\n }\n }\n\n .o-footer-top,\n .o-footer-body,\n .o-footer-bottom {\n padding-top: .625rem;\n padding-bottom: .625rem;\n }\n\n .o-footer-top {\n border-bottom: 1px solid $gray-900;\n }\n\n .o-footer-body {\n .row {\n margin-bottom: .625rem;\n }\n\n h2 {\n margin-top: .625rem;\n font-size: $font-size-sm;\n color: #fff;\n }\n\n p {\n &,\n a {\n color: #fff;\n }\n }\n\n .flex-column .nav-link {\n padding: 0;\n line-height: 1.25;\n }\n }\n\n .o-footer-bottom {\n border-top: 1px solid $gray-900;\n }\n}\n","// small device display as card\n// stylelint-disable selector-no-qualifying-type\n@include media-breakpoint-down(md) {\n .o-responsive-table {\n thead {\n display: none;\n }\n tbody,\n tr,\n th,\n td {\n display: block;\n }\n // for tablet, display 2 cards by rows\n @include media-breakpoint-up(md) {\n tr {\n float: left;\n width: 45%;\n }\n tr:nth-child(odd) {\n margin-right: 10%;\n }\n }\n th,\n td {\n vertical-align: middle;\n }\n td[data-title]::before {\n float: left;\n width: 50%;\n font-weight: $font-weight-bold;\n content: attr(data-title);\n }\n tr {\n margin-bottom: 2em;\n border-right: 0;\n border-left: 0;\n }\n tbody {\n th[scope=\"row\"] {\n font-weight: $font-weight-bold;\n border-top: 0;\n border-bottom: 2px solid $gray-500;\n }\n }\n }\n}\n","// stylelint-disable font-family-no-missing-generic-family-keyword\n// o-scroll-up\n//\n//\n\n.o-scroll-up {\n .o-scroll-up-icon {\n &::before {\n font-family: icon-orange;\n font-size: 1.25rem;\n line-height: 1.8;\n content: \"\\e93f\";\n }\n align-items: center;\n justify-content: center;\n float: right;\n width: $o-scroll-up-width;\n height: $o-scroll-up-height;\n color: #000;\n text-align: center;\n text-decoration: none;\n background-color: #fff;\n border-style: solid;\n border-width: 2px;\n\n /* rtl:ignore */\n transform: rotate(90deg);\n\n /* rtl:ignore */\n }\n\n position: fixed;\n right: 0;\n bottom: 2.5rem;\n z-index: $zindex-o-scroll-up;\n display: none;\n // put a safety space between the right of the screen and the scroll link\n @each $breakpoint, $container-margin in $container-fluid-margin-widths {\n @include media-breakpoint-up($breakpoint) {\n right: $container-margin;\n }\n }\n @include media-breakpoint-up(xs) {\n bottom: .25rem;\n }\n @include media-breakpoint-up(sm) {\n bottom: .375rem;\n }\n @include media-breakpoint-up(md) {\n bottom: .75rem;\n }\n @include media-breakpoint-up(lg) {\n bottom: 2rem;\n }\n @include media-breakpoint-up(xl) {\n bottom: 2.5rem;\n }\n @include media-breakpoint-up(xxl) {\n bottom: 3.75rem;\n }\n\n .o-scroll-up-text {\n display: inline-block;\n padding: (($o-scroll-up-height - 1.25) / 2) .625rem;\n font-weight: $font-weight-bold;\n background-color: #fff;\n opacity: .8;\n }\n // custom class to allow a fixed position\n &.static {\n position: static;\n z-index: auto;\n display: inline;\n float: left;\n .o-scroll-up-text {\n float: left;\n }\n .o-scroll-up-icon {\n position: relative;\n display: inline-block;\n float: none;\n }\n }\n\n @include hover-focus {\n color: $primary;\n .o-scroll-up-icon {\n color: #fff;\n background-color: #000;\n }\n }\n\n &:active .o-scroll-up-icon {\n color: #fff;\n background-color: $primary;\n border-color: $primary;\n }\n}\n","//\n// dropdown\n//\n\n.dropdown-toggle::after {\n margin-left: .625rem;\n vertical-align: 10%;\n}\n\n.dropdown-item {\n padding-left: 1.25rem;\n font-weight: $font-weight-bold;\n\n &:focus {\n color: #000;\n background-color: #fff;\n outline: 1px dotted;\n }\n\n &:focus:hover {\n color: #fff;\n background-color: #000;\n }\n}\n","// stylelint-disable property-blacklist, font-family-no-missing-generic-family-keyword\n//\n// Carousel\n// --------------------------------------------------\n\n// native boostrap\n\n.carousel {\n margin-bottom: 1.875rem;\n}\n\n.carousel .carousel-item {\n img {\n width: 100%;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n top: auto;\n bottom: calc(50% - 1.875rem);\n width: 3.75rem;\n height: 3.75rem;\n text-decoration: none;\n text-shadow: none;\n background-color: transparent;\n opacity: .8;\n transition: width .5s ease;\n\n // Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n margin-top: -1.125rem;\n font-size: 1.875rem;\n color: #000;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n background-image: none;\n background-repeat: no-repeat;\n\n &::before {\n font-family: icon-orange;\n }\n}\n\n.carousel-control-prev-icon::before {\n content: \"\\e93f\";\n}\n\n.carousel-control-next-icon::before {\n content: \"\\e93e\";\n}\n\n.carousel-indicators {\n bottom: 0;\n align-items: center;\n\n &:hover {\n cursor: default;\n }\n\n li {\n flex-grow: 0;\n width: .625rem;\n height: .625rem;\n margin-right: .375rem;\n background-color: #000;\n border: 1px solid #fff;\n border-radius: 50%;\n\n &:hover {\n cursor: pointer;\n }\n\n &.active {\n background-color: theme-color(\"primary\"); // stylelint-disable-line selector-no-qualifying-type\n }\n }\n}\n\n// swiper\n.swiper-button-prev,\n.swiper-button-next {\n top: calc(50% - 10px);\n width: auto;\n height: auto;\n text-shadow: 1px 0 0 #fff, 0 1px 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;\n cursor: pointer;\n background-image: none;\n background-size: 0;\n //Boosted mod\n &:focus {\n outline: 2px dotted $input-focus-border-color;\n outline-offset: -1px;\n }\n // end mod\n}\n\n.swiper-button-prev::before,\n.swiper-button-next::before {\n font-family: icon-orange;\n font-size: 1.875rem;\n content: \"\\e93f\";\n}\n\n.swiper-button-next::before {\n content: \"\\e93e\";\n}\n\n.swiper-pagination-bullet,\n.swiper-pagination-bullet-active {\n width: .625rem;\n height: .625rem;\n border: 0;\n}\n\n.swiper-pagination-bullet {\n opacity: 1;\n}\n\n.swiper-pagination-bullet-active {\n background: #f16e00;\n}\n\n.swiper-container {\n width: 100% !important; // stylelint-disable-line declaration-no-important\n margin-bottom: 30px;\n overflow: hidden;\n}\n\n.swiper-wrapper {\n margin-bottom: 30px;\n}\n\n.swiper-pagination {\n bottom: 6px;\n}\n\n.swiper-slide {\n .card {\n border: 0;\n }\n\n .card-img {\n padding: 0;\n\n img {\n width: 100%;\n height: 40vh;\n }\n }\n\n .card-title {\n margin: 0;\n font-weight: $font-weight-bold;\n }\n\n .card-body {\n position: absolute;\n bottom: 20px;\n left: 40px;\n background-color: #fff;\n\n p {\n margin: 0;\n }\n }\n}\n\n@include media-breakpoint-down(md) {\n .swiper-button-prev,\n .swiper-button-next {\n display: none;\n }\n\n .swiper-container {\n overflow-x: hidden;\n overflow-y: visible;/* used for displaying pagination outside of container */\n }\n\n .swiper-slide {\n width: 80%;\n\n // .card-link .card-body {\n // padding: 20px;\n // text-align: left;\n // }\n\n .card-img img {\n height: auto;\n }\n\n .card-body {\n position: static;\n }\n }\n\n .swiper-container-horizontal > .swiper-pagination-bullets {\n bottom: 0;\n }\n\n .swiper-pagination-bullet {\n width: 8px;\n height: 8px;\n border: 0;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n//\n\n// back from accessibility plugin css\ndiv.active:focus {\n outline: dotted 1px;\n}\n\na:focus {\n color: theme-color(\"primary\");\n outline: dotted 1px;\n}\n\n.close:hover,\n.close:focus {\n outline: dotted 1px;\n}\n\n//\n// Progress bar\n//\n\n.progress.progress-default {\n &[value]::-webkit-progress-value {\n background-color: theme-color(\"primary\");\n }\n\n &[value]::-moz-progress-bar {\n background-color: theme-color(\"primary\");\n }\n}\n\n.hero-container .frame {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 15%;\n margin: ($grid-gutter-width * 1.5);\n}\n\n.hero-container .caption {\n margin: ($grid-gutter-width * 2.5) ($grid-gutter-width * 1.5);\n}\n\n.hero-container .category {\n font-size: 1.25rem;\n color: theme-color(\"primary\");\n}\n\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/font-awesome.css b/dashboard/public/css/font-awesome.css
new file mode 100644
index 00000000..ee906a81
--- /dev/null
+++ b/dashboard/public/css/font-awesome.css
@@ -0,0 +1,2337 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+.fa-2x {
+ font-size: 2em;
+}
+.fa-3x {
+ font-size: 3em;
+}
+.fa-4x {
+ font-size: 4em;
+}
+.fa-5x {
+ font-size: 5em;
+}
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center;
+}
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none;
+}
+.fa-ul > li {
+ position: relative;
+}
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: 0.14285714em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.85714286em;
+}
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eeeeee;
+ border-radius: .1em;
+}
+.fa-pull-left {
+ float: left;
+}
+.fa-pull-right {
+ float: right;
+}
+.fa.fa-pull-left {
+ margin-right: .3em;
+}
+.fa.fa-pull-right {
+ margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.fa.pull-left {
+ margin-right: .3em;
+}
+.fa.pull-right {
+ margin-left: .3em;
+}
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none;
+}
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.fa-stack-1x {
+ line-height: inherit;
+}
+.fa-stack-2x {
+ font-size: 2em;
+}
+.fa-inverse {
+ color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000";
+}
+.fa-music:before {
+ content: "\f001";
+}
+.fa-search:before {
+ content: "\f002";
+}
+.fa-envelope-o:before {
+ content: "\f003";
+}
+.fa-heart:before {
+ content: "\f004";
+}
+.fa-star:before {
+ content: "\f005";
+}
+.fa-star-o:before {
+ content: "\f006";
+}
+.fa-user:before {
+ content: "\f007";
+}
+.fa-film:before {
+ content: "\f008";
+}
+.fa-th-large:before {
+ content: "\f009";
+}
+.fa-th:before {
+ content: "\f00a";
+}
+.fa-th-list:before {
+ content: "\f00b";
+}
+.fa-check:before {
+ content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d";
+}
+.fa-search-plus:before {
+ content: "\f00e";
+}
+.fa-search-minus:before {
+ content: "\f010";
+}
+.fa-power-off:before {
+ content: "\f011";
+}
+.fa-signal:before {
+ content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013";
+}
+.fa-trash-o:before {
+ content: "\f014";
+}
+.fa-home:before {
+ content: "\f015";
+}
+.fa-file-o:before {
+ content: "\f016";
+}
+.fa-clock-o:before {
+ content: "\f017";
+}
+.fa-road:before {
+ content: "\f018";
+}
+.fa-download:before {
+ content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+ content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+ content: "\f01b";
+}
+.fa-inbox:before {
+ content: "\f01c";
+}
+.fa-play-circle-o:before {
+ content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e";
+}
+.fa-refresh:before {
+ content: "\f021";
+}
+.fa-list-alt:before {
+ content: "\f022";
+}
+.fa-lock:before {
+ content: "\f023";
+}
+.fa-flag:before {
+ content: "\f024";
+}
+.fa-headphones:before {
+ content: "\f025";
+}
+.fa-volume-off:before {
+ content: "\f026";
+}
+.fa-volume-down:before {
+ content: "\f027";
+}
+.fa-volume-up:before {
+ content: "\f028";
+}
+.fa-qrcode:before {
+ content: "\f029";
+}
+.fa-barcode:before {
+ content: "\f02a";
+}
+.fa-tag:before {
+ content: "\f02b";
+}
+.fa-tags:before {
+ content: "\f02c";
+}
+.fa-book:before {
+ content: "\f02d";
+}
+.fa-bookmark:before {
+ content: "\f02e";
+}
+.fa-print:before {
+ content: "\f02f";
+}
+.fa-camera:before {
+ content: "\f030";
+}
+.fa-font:before {
+ content: "\f031";
+}
+.fa-bold:before {
+ content: "\f032";
+}
+.fa-italic:before {
+ content: "\f033";
+}
+.fa-text-height:before {
+ content: "\f034";
+}
+.fa-text-width:before {
+ content: "\f035";
+}
+.fa-align-left:before {
+ content: "\f036";
+}
+.fa-align-center:before {
+ content: "\f037";
+}
+.fa-align-right:before {
+ content: "\f038";
+}
+.fa-align-justify:before {
+ content: "\f039";
+}
+.fa-list:before {
+ content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b";
+}
+.fa-indent:before {
+ content: "\f03c";
+}
+.fa-video-camera:before {
+ content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e";
+}
+.fa-pencil:before {
+ content: "\f040";
+}
+.fa-map-marker:before {
+ content: "\f041";
+}
+.fa-adjust:before {
+ content: "\f042";
+}
+.fa-tint:before {
+ content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044";
+}
+.fa-share-square-o:before {
+ content: "\f045";
+}
+.fa-check-square-o:before {
+ content: "\f046";
+}
+.fa-arrows:before {
+ content: "\f047";
+}
+.fa-step-backward:before {
+ content: "\f048";
+}
+.fa-fast-backward:before {
+ content: "\f049";
+}
+.fa-backward:before {
+ content: "\f04a";
+}
+.fa-play:before {
+ content: "\f04b";
+}
+.fa-pause:before {
+ content: "\f04c";
+}
+.fa-stop:before {
+ content: "\f04d";
+}
+.fa-forward:before {
+ content: "\f04e";
+}
+.fa-fast-forward:before {
+ content: "\f050";
+}
+.fa-step-forward:before {
+ content: "\f051";
+}
+.fa-eject:before {
+ content: "\f052";
+}
+.fa-chevron-left:before {
+ content: "\f053";
+}
+.fa-chevron-right:before {
+ content: "\f054";
+}
+.fa-plus-circle:before {
+ content: "\f055";
+}
+.fa-minus-circle:before {
+ content: "\f056";
+}
+.fa-times-circle:before {
+ content: "\f057";
+}
+.fa-check-circle:before {
+ content: "\f058";
+}
+.fa-question-circle:before {
+ content: "\f059";
+}
+.fa-info-circle:before {
+ content: "\f05a";
+}
+.fa-crosshairs:before {
+ content: "\f05b";
+}
+.fa-times-circle-o:before {
+ content: "\f05c";
+}
+.fa-check-circle-o:before {
+ content: "\f05d";
+}
+.fa-ban:before {
+ content: "\f05e";
+}
+.fa-arrow-left:before {
+ content: "\f060";
+}
+.fa-arrow-right:before {
+ content: "\f061";
+}
+.fa-arrow-up:before {
+ content: "\f062";
+}
+.fa-arrow-down:before {
+ content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064";
+}
+.fa-expand:before {
+ content: "\f065";
+}
+.fa-compress:before {
+ content: "\f066";
+}
+.fa-plus:before {
+ content: "\f067";
+}
+.fa-minus:before {
+ content: "\f068";
+}
+.fa-asterisk:before {
+ content: "\f069";
+}
+.fa-exclamation-circle:before {
+ content: "\f06a";
+}
+.fa-gift:before {
+ content: "\f06b";
+}
+.fa-leaf:before {
+ content: "\f06c";
+}
+.fa-fire:before {
+ content: "\f06d";
+}
+.fa-eye:before {
+ content: "\f06e";
+}
+.fa-eye-slash:before {
+ content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071";
+}
+.fa-plane:before {
+ content: "\f072";
+}
+.fa-calendar:before {
+ content: "\f073";
+}
+.fa-random:before {
+ content: "\f074";
+}
+.fa-comment:before {
+ content: "\f075";
+}
+.fa-magnet:before {
+ content: "\f076";
+}
+.fa-chevron-up:before {
+ content: "\f077";
+}
+.fa-chevron-down:before {
+ content: "\f078";
+}
+.fa-retweet:before {
+ content: "\f079";
+}
+.fa-shopping-cart:before {
+ content: "\f07a";
+}
+.fa-folder:before {
+ content: "\f07b";
+}
+.fa-folder-open:before {
+ content: "\f07c";
+}
+.fa-arrows-v:before {
+ content: "\f07d";
+}
+.fa-arrows-h:before {
+ content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080";
+}
+.fa-twitter-square:before {
+ content: "\f081";
+}
+.fa-facebook-square:before {
+ content: "\f082";
+}
+.fa-camera-retro:before {
+ content: "\f083";
+}
+.fa-key:before {
+ content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085";
+}
+.fa-comments:before {
+ content: "\f086";
+}
+.fa-thumbs-o-up:before {
+ content: "\f087";
+}
+.fa-thumbs-o-down:before {
+ content: "\f088";
+}
+.fa-star-half:before {
+ content: "\f089";
+}
+.fa-heart-o:before {
+ content: "\f08a";
+}
+.fa-sign-out:before {
+ content: "\f08b";
+}
+.fa-linkedin-square:before {
+ content: "\f08c";
+}
+.fa-thumb-tack:before {
+ content: "\f08d";
+}
+.fa-external-link:before {
+ content: "\f08e";
+}
+.fa-sign-in:before {
+ content: "\f090";
+}
+.fa-trophy:before {
+ content: "\f091";
+}
+.fa-github-square:before {
+ content: "\f092";
+}
+.fa-upload:before {
+ content: "\f093";
+}
+.fa-lemon-o:before {
+ content: "\f094";
+}
+.fa-phone:before {
+ content: "\f095";
+}
+.fa-square-o:before {
+ content: "\f096";
+}
+.fa-bookmark-o:before {
+ content: "\f097";
+}
+.fa-phone-square:before {
+ content: "\f098";
+}
+.fa-twitter:before {
+ content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "\f09a";
+}
+.fa-github:before {
+ content: "\f09b";
+}
+.fa-unlock:before {
+ content: "\f09c";
+}
+.fa-credit-card:before {
+ content: "\f09d";
+}
+.fa-feed:before,
+.fa-rss:before {
+ content: "\f09e";
+}
+.fa-hdd-o:before {
+ content: "\f0a0";
+}
+.fa-bullhorn:before {
+ content: "\f0a1";
+}
+.fa-bell:before {
+ content: "\f0f3";
+}
+.fa-certificate:before {
+ content: "\f0a3";
+}
+.fa-hand-o-right:before {
+ content: "\f0a4";
+}
+.fa-hand-o-left:before {
+ content: "\f0a5";
+}
+.fa-hand-o-up:before {
+ content: "\f0a6";
+}
+.fa-hand-o-down:before {
+ content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+ content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+ content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+ content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+ content: "\f0ab";
+}
+.fa-globe:before {
+ content: "\f0ac";
+}
+.fa-wrench:before {
+ content: "\f0ad";
+}
+.fa-tasks:before {
+ content: "\f0ae";
+}
+.fa-filter:before {
+ content: "\f0b0";
+}
+.fa-briefcase:before {
+ content: "\f0b1";
+}
+.fa-arrows-alt:before {
+ content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1";
+}
+.fa-cloud:before {
+ content: "\f0c2";
+}
+.fa-flask:before {
+ content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5";
+}
+.fa-paperclip:before {
+ content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7";
+}
+.fa-square:before {
+ content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9";
+}
+.fa-list-ul:before {
+ content: "\f0ca";
+}
+.fa-list-ol:before {
+ content: "\f0cb";
+}
+.fa-strikethrough:before {
+ content: "\f0cc";
+}
+.fa-underline:before {
+ content: "\f0cd";
+}
+.fa-table:before {
+ content: "\f0ce";
+}
+.fa-magic:before {
+ content: "\f0d0";
+}
+.fa-truck:before {
+ content: "\f0d1";
+}
+.fa-pinterest:before {
+ content: "\f0d2";
+}
+.fa-pinterest-square:before {
+ content: "\f0d3";
+}
+.fa-google-plus-square:before {
+ content: "\f0d4";
+}
+.fa-google-plus:before {
+ content: "\f0d5";
+}
+.fa-money:before {
+ content: "\f0d6";
+}
+.fa-caret-down:before {
+ content: "\f0d7";
+}
+.fa-caret-up:before {
+ content: "\f0d8";
+}
+.fa-caret-left:before {
+ content: "\f0d9";
+}
+.fa-caret-right:before {
+ content: "\f0da";
+}
+.fa-columns:before {
+ content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de";
+}
+.fa-envelope:before {
+ content: "\f0e0";
+}
+.fa-linkedin:before {
+ content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4";
+}
+.fa-comment-o:before {
+ content: "\f0e5";
+}
+.fa-comments-o:before {
+ content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7";
+}
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+.fa-umbrella:before {
+ content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+ content: "\f0eb";
+}
+.fa-exchange:before {
+ content: "\f0ec";
+}
+.fa-cloud-download:before {
+ content: "\f0ed";
+}
+.fa-cloud-upload:before {
+ content: "\f0ee";
+}
+.fa-user-md:before {
+ content: "\f0f0";
+}
+.fa-stethoscope:before {
+ content: "\f0f1";
+}
+.fa-suitcase:before {
+ content: "\f0f2";
+}
+.fa-bell-o:before {
+ content: "\f0a2";
+}
+.fa-coffee:before {
+ content: "\f0f4";
+}
+.fa-cutlery:before {
+ content: "\f0f5";
+}
+.fa-file-text-o:before {
+ content: "\f0f6";
+}
+.fa-building-o:before {
+ content: "\f0f7";
+}
+.fa-hospital-o:before {
+ content: "\f0f8";
+}
+.fa-ambulance:before {
+ content: "\f0f9";
+}
+.fa-medkit:before {
+ content: "\f0fa";
+}
+.fa-fighter-jet:before {
+ content: "\f0fb";
+}
+.fa-beer:before {
+ content: "\f0fc";
+}
+.fa-h-square:before {
+ content: "\f0fd";
+}
+.fa-plus-square:before {
+ content: "\f0fe";
+}
+.fa-angle-double-left:before {
+ content: "\f100";
+}
+.fa-angle-double-right:before {
+ content: "\f101";
+}
+.fa-angle-double-up:before {
+ content: "\f102";
+}
+.fa-angle-double-down:before {
+ content: "\f103";
+}
+.fa-angle-left:before {
+ content: "\f104";
+}
+.fa-angle-right:before {
+ content: "\f105";
+}
+.fa-angle-up:before {
+ content: "\f106";
+}
+.fa-angle-down:before {
+ content: "\f107";
+}
+.fa-desktop:before {
+ content: "\f108";
+}
+.fa-laptop:before {
+ content: "\f109";
+}
+.fa-tablet:before {
+ content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b";
+}
+.fa-circle-o:before {
+ content: "\f10c";
+}
+.fa-quote-left:before {
+ content: "\f10d";
+}
+.fa-quote-right:before {
+ content: "\f10e";
+}
+.fa-spinner:before {
+ content: "\f110";
+}
+.fa-circle:before {
+ content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112";
+}
+.fa-github-alt:before {
+ content: "\f113";
+}
+.fa-folder-o:before {
+ content: "\f114";
+}
+.fa-folder-open-o:before {
+ content: "\f115";
+}
+.fa-smile-o:before {
+ content: "\f118";
+}
+.fa-frown-o:before {
+ content: "\f119";
+}
+.fa-meh-o:before {
+ content: "\f11a";
+}
+.fa-gamepad:before {
+ content: "\f11b";
+}
+.fa-keyboard-o:before {
+ content: "\f11c";
+}
+.fa-flag-o:before {
+ content: "\f11d";
+}
+.fa-flag-checkered:before {
+ content: "\f11e";
+}
+.fa-terminal:before {
+ content: "\f120";
+}
+.fa-code:before {
+ content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123";
+}
+.fa-location-arrow:before {
+ content: "\f124";
+}
+.fa-crop:before {
+ content: "\f125";
+}
+.fa-code-fork:before {
+ content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127";
+}
+.fa-question:before {
+ content: "\f128";
+}
+.fa-info:before {
+ content: "\f129";
+}
+.fa-exclamation:before {
+ content: "\f12a";
+}
+.fa-superscript:before {
+ content: "\f12b";
+}
+.fa-subscript:before {
+ content: "\f12c";
+}
+.fa-eraser:before {
+ content: "\f12d";
+}
+.fa-puzzle-piece:before {
+ content: "\f12e";
+}
+.fa-microphone:before {
+ content: "\f130";
+}
+.fa-microphone-slash:before {
+ content: "\f131";
+}
+.fa-shield:before {
+ content: "\f132";
+}
+.fa-calendar-o:before {
+ content: "\f133";
+}
+.fa-fire-extinguisher:before {
+ content: "\f134";
+}
+.fa-rocket:before {
+ content: "\f135";
+}
+.fa-maxcdn:before {
+ content: "\f136";
+}
+.fa-chevron-circle-left:before {
+ content: "\f137";
+}
+.fa-chevron-circle-right:before {
+ content: "\f138";
+}
+.fa-chevron-circle-up:before {
+ content: "\f139";
+}
+.fa-chevron-circle-down:before {
+ content: "\f13a";
+}
+.fa-html5:before {
+ content: "\f13b";
+}
+.fa-css3:before {
+ content: "\f13c";
+}
+.fa-anchor:before {
+ content: "\f13d";
+}
+.fa-unlock-alt:before {
+ content: "\f13e";
+}
+.fa-bullseye:before {
+ content: "\f140";
+}
+.fa-ellipsis-h:before {
+ content: "\f141";
+}
+.fa-ellipsis-v:before {
+ content: "\f142";
+}
+.fa-rss-square:before {
+ content: "\f143";
+}
+.fa-play-circle:before {
+ content: "\f144";
+}
+.fa-ticket:before {
+ content: "\f145";
+}
+.fa-minus-square:before {
+ content: "\f146";
+}
+.fa-minus-square-o:before {
+ content: "\f147";
+}
+.fa-level-up:before {
+ content: "\f148";
+}
+.fa-level-down:before {
+ content: "\f149";
+}
+.fa-check-square:before {
+ content: "\f14a";
+}
+.fa-pencil-square:before {
+ content: "\f14b";
+}
+.fa-external-link-square:before {
+ content: "\f14c";
+}
+.fa-share-square:before {
+ content: "\f14d";
+}
+.fa-compass:before {
+ content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153";
+}
+.fa-gbp:before {
+ content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a";
+}
+.fa-file:before {
+ content: "\f15b";
+}
+.fa-file-text:before {
+ content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+ content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+ content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+ content: "\f160";
+}
+.fa-sort-amount-desc:before {
+ content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+ content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+ content: "\f163";
+}
+.fa-thumbs-up:before {
+ content: "\f164";
+}
+.fa-thumbs-down:before {
+ content: "\f165";
+}
+.fa-youtube-square:before {
+ content: "\f166";
+}
+.fa-youtube:before {
+ content: "\f167";
+}
+.fa-xing:before {
+ content: "\f168";
+}
+.fa-xing-square:before {
+ content: "\f169";
+}
+.fa-youtube-play:before {
+ content: "\f16a";
+}
+.fa-dropbox:before {
+ content: "\f16b";
+}
+.fa-stack-overflow:before {
+ content: "\f16c";
+}
+.fa-instagram:before {
+ content: "\f16d";
+}
+.fa-flickr:before {
+ content: "\f16e";
+}
+.fa-adn:before {
+ content: "\f170";
+}
+.fa-bitbucket:before {
+ content: "\f171";
+}
+.fa-bitbucket-square:before {
+ content: "\f172";
+}
+.fa-tumblr:before {
+ content: "\f173";
+}
+.fa-tumblr-square:before {
+ content: "\f174";
+}
+.fa-long-arrow-down:before {
+ content: "\f175";
+}
+.fa-long-arrow-up:before {
+ content: "\f176";
+}
+.fa-long-arrow-left:before {
+ content: "\f177";
+}
+.fa-long-arrow-right:before {
+ content: "\f178";
+}
+.fa-apple:before {
+ content: "\f179";
+}
+.fa-windows:before {
+ content: "\f17a";
+}
+.fa-android:before {
+ content: "\f17b";
+}
+.fa-linux:before {
+ content: "\f17c";
+}
+.fa-dribbble:before {
+ content: "\f17d";
+}
+.fa-skype:before {
+ content: "\f17e";
+}
+.fa-foursquare:before {
+ content: "\f180";
+}
+.fa-trello:before {
+ content: "\f181";
+}
+.fa-female:before {
+ content: "\f182";
+}
+.fa-male:before {
+ content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "\f184";
+}
+.fa-sun-o:before {
+ content: "\f185";
+}
+.fa-moon-o:before {
+ content: "\f186";
+}
+.fa-archive:before {
+ content: "\f187";
+}
+.fa-bug:before {
+ content: "\f188";
+}
+.fa-vk:before {
+ content: "\f189";
+}
+.fa-weibo:before {
+ content: "\f18a";
+}
+.fa-renren:before {
+ content: "\f18b";
+}
+.fa-pagelines:before {
+ content: "\f18c";
+}
+.fa-stack-exchange:before {
+ content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+ content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+ content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191";
+}
+.fa-dot-circle-o:before {
+ content: "\f192";
+}
+.fa-wheelchair:before {
+ content: "\f193";
+}
+.fa-vimeo-square:before {
+ content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195";
+}
+.fa-plus-square-o:before {
+ content: "\f196";
+}
+.fa-space-shuttle:before {
+ content: "\f197";
+}
+.fa-slack:before {
+ content: "\f198";
+}
+.fa-envelope-square:before {
+ content: "\f199";
+}
+.fa-wordpress:before {
+ content: "\f19a";
+}
+.fa-openid:before {
+ content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d";
+}
+.fa-yahoo:before {
+ content: "\f19e";
+}
+.fa-google:before {
+ content: "\f1a0";
+}
+.fa-reddit:before {
+ content: "\f1a1";
+}
+.fa-reddit-square:before {
+ content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+ content: "\f1a3";
+}
+.fa-stumbleupon:before {
+ content: "\f1a4";
+}
+.fa-delicious:before {
+ content: "\f1a5";
+}
+.fa-digg:before {
+ content: "\f1a6";
+}
+.fa-pied-piper-pp:before {
+ content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+ content: "\f1a8";
+}
+.fa-drupal:before {
+ content: "\f1a9";
+}
+.fa-joomla:before {
+ content: "\f1aa";
+}
+.fa-language:before {
+ content: "\f1ab";
+}
+.fa-fax:before {
+ content: "\f1ac";
+}
+.fa-building:before {
+ content: "\f1ad";
+}
+.fa-child:before {
+ content: "\f1ae";
+}
+.fa-paw:before {
+ content: "\f1b0";
+}
+.fa-spoon:before {
+ content: "\f1b1";
+}
+.fa-cube:before {
+ content: "\f1b2";
+}
+.fa-cubes:before {
+ content: "\f1b3";
+}
+.fa-behance:before {
+ content: "\f1b4";
+}
+.fa-behance-square:before {
+ content: "\f1b5";
+}
+.fa-steam:before {
+ content: "\f1b6";
+}
+.fa-steam-square:before {
+ content: "\f1b7";
+}
+.fa-recycle:before {
+ content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba";
+}
+.fa-tree:before {
+ content: "\f1bb";
+}
+.fa-spotify:before {
+ content: "\f1bc";
+}
+.fa-deviantart:before {
+ content: "\f1bd";
+}
+.fa-soundcloud:before {
+ content: "\f1be";
+}
+.fa-database:before {
+ content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+ content: "\f1c1";
+}
+.fa-file-word-o:before {
+ content: "\f1c2";
+}
+.fa-file-excel-o:before {
+ content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+ content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8";
+}
+.fa-file-code-o:before {
+ content: "\f1c9";
+}
+.fa-vine:before {
+ content: "\f1ca";
+}
+.fa-codepen:before {
+ content: "\f1cb";
+}
+.fa-jsfiddle:before {
+ content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+ content: "\f1ce";
+}
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+ content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1";
+}
+.fa-git-square:before {
+ content: "\f1d2";
+}
+.fa-git:before {
+ content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+ content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+ content: "\f1d5";
+}
+.fa-qq:before {
+ content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9";
+}
+.fa-history:before {
+ content: "\f1da";
+}
+.fa-circle-thin:before {
+ content: "\f1db";
+}
+.fa-header:before {
+ content: "\f1dc";
+}
+.fa-paragraph:before {
+ content: "\f1dd";
+}
+.fa-sliders:before {
+ content: "\f1de";
+}
+.fa-share-alt:before {
+ content: "\f1e0";
+}
+.fa-share-alt-square:before {
+ content: "\f1e1";
+}
+.fa-bomb:before {
+ content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3";
+}
+.fa-tty:before {
+ content: "\f1e4";
+}
+.fa-binoculars:before {
+ content: "\f1e5";
+}
+.fa-plug:before {
+ content: "\f1e6";
+}
+.fa-slideshare:before {
+ content: "\f1e7";
+}
+.fa-twitch:before {
+ content: "\f1e8";
+}
+.fa-yelp:before {
+ content: "\f1e9";
+}
+.fa-newspaper-o:before {
+ content: "\f1ea";
+}
+.fa-wifi:before {
+ content: "\f1eb";
+}
+.fa-calculator:before {
+ content: "\f1ec";
+}
+.fa-paypal:before {
+ content: "\f1ed";
+}
+.fa-google-wallet:before {
+ content: "\f1ee";
+}
+.fa-cc-visa:before {
+ content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+ content: "\f1f1";
+}
+.fa-cc-discover:before {
+ content: "\f1f2";
+}
+.fa-cc-amex:before {
+ content: "\f1f3";
+}
+.fa-cc-paypal:before {
+ content: "\f1f4";
+}
+.fa-cc-stripe:before {
+ content: "\f1f5";
+}
+.fa-bell-slash:before {
+ content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+ content: "\f1f7";
+}
+.fa-trash:before {
+ content: "\f1f8";
+}
+.fa-copyright:before {
+ content: "\f1f9";
+}
+.fa-at:before {
+ content: "\f1fa";
+}
+.fa-eyedropper:before {
+ content: "\f1fb";
+}
+.fa-paint-brush:before {
+ content: "\f1fc";
+}
+.fa-birthday-cake:before {
+ content: "\f1fd";
+}
+.fa-area-chart:before {
+ content: "\f1fe";
+}
+.fa-pie-chart:before {
+ content: "\f200";
+}
+.fa-line-chart:before {
+ content: "\f201";
+}
+.fa-lastfm:before {
+ content: "\f202";
+}
+.fa-lastfm-square:before {
+ content: "\f203";
+}
+.fa-toggle-off:before {
+ content: "\f204";
+}
+.fa-toggle-on:before {
+ content: "\f205";
+}
+.fa-bicycle:before {
+ content: "\f206";
+}
+.fa-bus:before {
+ content: "\f207";
+}
+.fa-ioxhost:before {
+ content: "\f208";
+}
+.fa-angellist:before {
+ content: "\f209";
+}
+.fa-cc:before {
+ content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b";
+}
+.fa-meanpath:before {
+ content: "\f20c";
+}
+.fa-buysellads:before {
+ content: "\f20d";
+}
+.fa-connectdevelop:before {
+ content: "\f20e";
+}
+.fa-dashcube:before {
+ content: "\f210";
+}
+.fa-forumbee:before {
+ content: "\f211";
+}
+.fa-leanpub:before {
+ content: "\f212";
+}
+.fa-sellsy:before {
+ content: "\f213";
+}
+.fa-shirtsinbulk:before {
+ content: "\f214";
+}
+.fa-simplybuilt:before {
+ content: "\f215";
+}
+.fa-skyatlas:before {
+ content: "\f216";
+}
+.fa-cart-plus:before {
+ content: "\f217";
+}
+.fa-cart-arrow-down:before {
+ content: "\f218";
+}
+.fa-diamond:before {
+ content: "\f219";
+}
+.fa-ship:before {
+ content: "\f21a";
+}
+.fa-user-secret:before {
+ content: "\f21b";
+}
+.fa-motorcycle:before {
+ content: "\f21c";
+}
+.fa-street-view:before {
+ content: "\f21d";
+}
+.fa-heartbeat:before {
+ content: "\f21e";
+}
+.fa-venus:before {
+ content: "\f221";
+}
+.fa-mars:before {
+ content: "\f222";
+}
+.fa-mercury:before {
+ content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+ content: "\f224";
+}
+.fa-transgender-alt:before {
+ content: "\f225";
+}
+.fa-venus-double:before {
+ content: "\f226";
+}
+.fa-mars-double:before {
+ content: "\f227";
+}
+.fa-venus-mars:before {
+ content: "\f228";
+}
+.fa-mars-stroke:before {
+ content: "\f229";
+}
+.fa-mars-stroke-v:before {
+ content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+ content: "\f22b";
+}
+.fa-neuter:before {
+ content: "\f22c";
+}
+.fa-genderless:before {
+ content: "\f22d";
+}
+.fa-facebook-official:before {
+ content: "\f230";
+}
+.fa-pinterest-p:before {
+ content: "\f231";
+}
+.fa-whatsapp:before {
+ content: "\f232";
+}
+.fa-server:before {
+ content: "\f233";
+}
+.fa-user-plus:before {
+ content: "\f234";
+}
+.fa-user-times:before {
+ content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236";
+}
+.fa-viacoin:before {
+ content: "\f237";
+}
+.fa-train:before {
+ content: "\f238";
+}
+.fa-subway:before {
+ content: "\f239";
+}
+.fa-medium:before {
+ content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: "\f23b";
+}
+.fa-optin-monster:before {
+ content: "\f23c";
+}
+.fa-opencart:before {
+ content: "\f23d";
+}
+.fa-expeditedssl:before {
+ content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: "\f244";
+}
+.fa-mouse-pointer:before {
+ content: "\f245";
+}
+.fa-i-cursor:before {
+ content: "\f246";
+}
+.fa-object-group:before {
+ content: "\f247";
+}
+.fa-object-ungroup:before {
+ content: "\f248";
+}
+.fa-sticky-note:before {
+ content: "\f249";
+}
+.fa-sticky-note-o:before {
+ content: "\f24a";
+}
+.fa-cc-jcb:before {
+ content: "\f24b";
+}
+.fa-cc-diners-club:before {
+ content: "\f24c";
+}
+.fa-clone:before {
+ content: "\f24d";
+}
+.fa-balance-scale:before {
+ content: "\f24e";
+}
+.fa-hourglass-o:before {
+ content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: "\f253";
+}
+.fa-hourglass:before {
+ content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: "\f256";
+}
+.fa-hand-scissors-o:before {
+ content: "\f257";
+}
+.fa-hand-lizard-o:before {
+ content: "\f258";
+}
+.fa-hand-spock-o:before {
+ content: "\f259";
+}
+.fa-hand-pointer-o:before {
+ content: "\f25a";
+}
+.fa-hand-peace-o:before {
+ content: "\f25b";
+}
+.fa-trademark:before {
+ content: "\f25c";
+}
+.fa-registered:before {
+ content: "\f25d";
+}
+.fa-creative-commons:before {
+ content: "\f25e";
+}
+.fa-gg:before {
+ content: "\f260";
+}
+.fa-gg-circle:before {
+ content: "\f261";
+}
+.fa-tripadvisor:before {
+ content: "\f262";
+}
+.fa-odnoklassniki:before {
+ content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+ content: "\f264";
+}
+.fa-get-pocket:before {
+ content: "\f265";
+}
+.fa-wikipedia-w:before {
+ content: "\f266";
+}
+.fa-safari:before {
+ content: "\f267";
+}
+.fa-chrome:before {
+ content: "\f268";
+}
+.fa-firefox:before {
+ content: "\f269";
+}
+.fa-opera:before {
+ content: "\f26a";
+}
+.fa-internet-explorer:before {
+ content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+ content: "\f26c";
+}
+.fa-contao:before {
+ content: "\f26d";
+}
+.fa-500px:before {
+ content: "\f26e";
+}
+.fa-amazon:before {
+ content: "\f270";
+}
+.fa-calendar-plus-o:before {
+ content: "\f271";
+}
+.fa-calendar-minus-o:before {
+ content: "\f272";
+}
+.fa-calendar-times-o:before {
+ content: "\f273";
+}
+.fa-calendar-check-o:before {
+ content: "\f274";
+}
+.fa-industry:before {
+ content: "\f275";
+}
+.fa-map-pin:before {
+ content: "\f276";
+}
+.fa-map-signs:before {
+ content: "\f277";
+}
+.fa-map-o:before {
+ content: "\f278";
+}
+.fa-map:before {
+ content: "\f279";
+}
+.fa-commenting:before {
+ content: "\f27a";
+}
+.fa-commenting-o:before {
+ content: "\f27b";
+}
+.fa-houzz:before {
+ content: "\f27c";
+}
+.fa-vimeo:before {
+ content: "\f27d";
+}
+.fa-black-tie:before {
+ content: "\f27e";
+}
+.fa-fonticons:before {
+ content: "\f280";
+}
+.fa-reddit-alien:before {
+ content: "\f281";
+}
+.fa-edge:before {
+ content: "\f282";
+}
+.fa-credit-card-alt:before {
+ content: "\f283";
+}
+.fa-codiepie:before {
+ content: "\f284";
+}
+.fa-modx:before {
+ content: "\f285";
+}
+.fa-fort-awesome:before {
+ content: "\f286";
+}
+.fa-usb:before {
+ content: "\f287";
+}
+.fa-product-hunt:before {
+ content: "\f288";
+}
+.fa-mixcloud:before {
+ content: "\f289";
+}
+.fa-scribd:before {
+ content: "\f28a";
+}
+.fa-pause-circle:before {
+ content: "\f28b";
+}
+.fa-pause-circle-o:before {
+ content: "\f28c";
+}
+.fa-stop-circle:before {
+ content: "\f28d";
+}
+.fa-stop-circle-o:before {
+ content: "\f28e";
+}
+.fa-shopping-bag:before {
+ content: "\f290";
+}
+.fa-shopping-basket:before {
+ content: "\f291";
+}
+.fa-hashtag:before {
+ content: "\f292";
+}
+.fa-bluetooth:before {
+ content: "\f293";
+}
+.fa-bluetooth-b:before {
+ content: "\f294";
+}
+.fa-percent:before {
+ content: "\f295";
+}
+.fa-gitlab:before {
+ content: "\f296";
+}
+.fa-wpbeginner:before {
+ content: "\f297";
+}
+.fa-wpforms:before {
+ content: "\f298";
+}
+.fa-envira:before {
+ content: "\f299";
+}
+.fa-universal-access:before {
+ content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+ content: "\f29b";
+}
+.fa-question-circle-o:before {
+ content: "\f29c";
+}
+.fa-blind:before {
+ content: "\f29d";
+}
+.fa-audio-description:before {
+ content: "\f29e";
+}
+.fa-volume-control-phone:before {
+ content: "\f2a0";
+}
+.fa-braille:before {
+ content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+ content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: "\f2a4";
+}
+.fa-glide:before {
+ content: "\f2a5";
+}
+.fa-glide-g:before {
+ content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+ content: "\f2a7";
+}
+.fa-low-vision:before {
+ content: "\f2a8";
+}
+.fa-viadeo:before {
+ content: "\f2a9";
+}
+.fa-viadeo-square:before {
+ content: "\f2aa";
+}
+.fa-snapchat:before {
+ content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+ content: "\f2ac";
+}
+.fa-snapchat-square:before {
+ content: "\f2ad";
+}
+.fa-pied-piper:before {
+ content: "\f2ae";
+}
+.fa-first-order:before {
+ content: "\f2b0";
+}
+.fa-yoast:before {
+ content: "\f2b1";
+}
+.fa-themeisle:before {
+ content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: "\f2b4";
+}
+.fa-handshake-o:before {
+ content: "\f2b5";
+}
+.fa-envelope-open:before {
+ content: "\f2b6";
+}
+.fa-envelope-open-o:before {
+ content: "\f2b7";
+}
+.fa-linode:before {
+ content: "\f2b8";
+}
+.fa-address-book:before {
+ content: "\f2b9";
+}
+.fa-address-book-o:before {
+ content: "\f2ba";
+}
+.fa-vcard:before,
+.fa-address-card:before {
+ content: "\f2bb";
+}
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: "\f2bc";
+}
+.fa-user-circle:before {
+ content: "\f2bd";
+}
+.fa-user-circle-o:before {
+ content: "\f2be";
+}
+.fa-user-o:before {
+ content: "\f2c0";
+}
+.fa-id-badge:before {
+ content: "\f2c1";
+}
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: "\f2c2";
+}
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: "\f2c3";
+}
+.fa-quora:before {
+ content: "\f2c4";
+}
+.fa-free-code-camp:before {
+ content: "\f2c5";
+}
+.fa-telegram:before {
+ content: "\f2c6";
+}
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: "\f2c7";
+}
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8";
+}
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: "\f2c9";
+}
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: "\f2ca";
+}
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: "\f2cb";
+}
+.fa-shower:before {
+ content: "\f2cc";
+}
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: "\f2cd";
+}
+.fa-podcast:before {
+ content: "\f2ce";
+}
+.fa-window-maximize:before {
+ content: "\f2d0";
+}
+.fa-window-minimize:before {
+ content: "\f2d1";
+}
+.fa-window-restore:before {
+ content: "\f2d2";
+}
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: "\f2d3";
+}
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: "\f2d4";
+}
+.fa-bandcamp:before {
+ content: "\f2d5";
+}
+.fa-grav:before {
+ content: "\f2d6";
+}
+.fa-etsy:before {
+ content: "\f2d7";
+}
+.fa-imdb:before {
+ content: "\f2d8";
+}
+.fa-ravelry:before {
+ content: "\f2d9";
+}
+.fa-eercast:before {
+ content: "\f2da";
+}
+.fa-microchip:before {
+ content: "\f2db";
+}
+.fa-snowflake-o:before {
+ content: "\f2dc";
+}
+.fa-superpowers:before {
+ content: "\f2dd";
+}
+.fa-wpexplorer:before {
+ content: "\f2de";
+}
+.fa-meetup:before {
+ content: "\f2e0";
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
diff --git a/dashboard/public/css/font-awesome.min.css b/dashboard/public/css/font-awesome.min.css
new file mode 100644
index 00000000..540440ce
--- /dev/null
+++ b/dashboard/public/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/dashboard/public/css/moon.css b/dashboard/public/css/moon.css
new file mode 100644
index 00000000..ef8983e7
--- /dev/null
+++ b/dashboard/public/css/moon.css
@@ -0,0 +1,98 @@
+.navbar .nav-item:first-child {
+ margin-left: 0 !important;
+}
+
+.inline {
+ display: inline;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+summary{
+ outline:none;
+ margin-bottom: 10px;
+}
+
+details {
+ cursor: default;
+}
+
+.filter {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+}
+
+.categories {
+ min-height: 130px;
+}
+
+.categories td {
+ width: 33%;
+ vertical-align: top !important;
+}
+
+.width-200 {
+ width: 200px;
+}
+
+.height-200 {
+ height: 200px;
+}
+
+.mh-100 {
+ min-height: 100px;
+}
+
+.border {
+ border: 1px #DDD solid;
+}
+
+.padding-10 {
+ padding: 10px;
+}
+
+.scroll {
+ overflow-y: auto;
+}
+
+.input-file {
+ display: none !important;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.selected-data {
+ background-color: #f16e00;
+ padding: 10px;
+ display: block;
+}
+
+.selected-data > span {
+ font-weight: bold;
+ color: #FFFFFF;
+}
+
+.nav, .pagination, .carousel, .panel-title a {
+ cursor: pointer;
+}
+
+.toast-background {
+ background: none !important;
+ border: 0 !important;
+ box-shadow: none !important;
+ color: #444 !important;
+}
+
+.toast-body {
+ min-width: 600px;
+}
+
+.assignments-details, .icon-helpstring {
+ margin-left: 2%;
+}
+
diff --git a/dashboard/public/css/o-rtl.css b/dashboard/public/css/o-rtl.css
new file mode 100644
index 00000000..069a0fc0
--- /dev/null
+++ b/dashboard/public/css/o-rtl.css
@@ -0,0 +1,60 @@
+.svg-arrow-previous::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-next::after {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.stepbar-item::after {
+ -webkit-transform: rotateY(180deg);
+ transform: rotateY(180deg);
+}
+
+.page-item:last-child .page-link::before,
+.page-item:first-child .page-link::before,
+.page-item.presentation + .page-item .page-link::before,
+.swiper-button-prev,
+.swiper-button-next,
+.doc-link::after,
+.breadcrumb-item + .breadcrumb-item::before,
+.o-link-arrow::after,
+.o-link-arrow.back::before {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.alert .alert-icon::after,
+.alert-sm .alert-icon::after {
+ right: 2%;
+}
+
+.o-stepbar .stepbar-item::after,
+.page-item:last-child .page-link::before,
+.o-stepbar .stepbar-item.current::after,
+.o-stepbar .stepbar-item.done::after {
+ right: unset;
+}
+
+.custom-switch.right .custom-control-label::before {
+ right: auto;
+ left: 0;
+}
+
+.custom-switch .custom-control-label::before {
+ background-position: .2rem;
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::before {
+ background-position: 2rem;
+}
+
+.o-link-arrow.back::before {
+ padding: 0 .625rem 0 0;
+}
+
+.popover {
+ right: auto;
+ left: 0;
+}
+/*# sourceMappingURL=o-rtl.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/o-rtl.css.map b/dashboard/public/css/o-rtl.css.map
new file mode 100644
index 00000000..d0cbfe0d
--- /dev/null
+++ b/dashboard/public/css/o-rtl.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/o-rtl.scss","../../scss/mixins/_orangeIcons.scss","../../scss/_functions.scss"],"names":[],"mappings":"AASA;EC6BI,4LCMuI;CDLxI;;AD1BH;ECLI,kLCoCuI;CDnCxI;;ADSH;EACE,mCAA0B;EAA1B,2BAA0B;CAC3B;;AAED;;;;;;;;;EASE,kCAAyB;EAAzB,0BAAyB;CAC1B;;AAED;;EAEE,UAAS;CACV;;AAED;;;;EAKE,aAAY;CACb;;AAED;EACE,YAAW;EACX,QAAO;CACR;;AAED;EACE,2BAA0B;CAC3B;;AAED;EACE,0BAAyB;CAC1B;;AAED;EACE,uBAAsB;CACvB;;AAED;EACE,YAAW;EACX,QAAO;CACR","file":"o-rtl.css","sourcesContent":["// Orange rtl overrides\n//\n//\n\n@import \"mixins\";\n@import \"functions\";\n\n// invert chevrons\n\n.svg-arrow-previous {\n @include svg-arrow-next(\"#000\");\n}\n\n.svg-arrow-next {\n @include svg-arrow-previous(\"#000\");\n}\n\n// rotate stepbar chevrons\n.stepbar-item::after {\n transform: rotateY(180deg);\n}\n\n.page-item:last-child .page-link::before,\n.page-item:first-child .page-link::before,\n.page-item.presentation + .page-item .page-link::before,\n.swiper-button-prev,\n.swiper-button-next,\n.doc-link::after,\n.breadcrumb-item + .breadcrumb-item::before,\n.o-link-arrow::after,\n.o-link-arrow.back::before {\n transform: rotate(180deg);\n}\n\n.alert .alert-icon::after,\n.alert-sm .alert-icon::after, {\n right: 2%;\n}\n\n.o-stepbar .stepbar-item::after,\n.page-item:last-child .page-link::before,\n.o-stepbar .stepbar-item.current::after,\n.o-stepbar .stepbar-item.done::after\n {\n right: unset;\n}\n\n.custom-switch.right .custom-control-label::before {\n right: auto;\n left: 0;\n}\n\n.custom-switch .custom-control-label::before {\n background-position: .2rem;\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::before {\n background-position: 2rem;\n}\n\n.o-link-arrow.back::before {\n padding: 0 .625rem 0 0;\n}\n\n.popover {\n right: auto;\n left: 0;\n}\n","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n@import \"node_modules/sass-math-pow/sass/math-pow\";\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n @if ($color == #F16E00) {\n @return #fff;\n }\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n // get the relative lum for each color\n $luminositecouleur: relativelum($r / 255, $g / 255, $b / 255);\n $luminositeblanc: relativelum(1, 1, 1);\n // if luminosite doesn't fit with white color return black\n @if ((($luminositeblanc + .05) / ($luminositecouleur + .05)) < $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// apply Wcag contrast algo : http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n// Convert from HTMLCS JS algo\n@function relativelum($r, $g, $b) {\n @return ((transform($r) * .2126) + (transform($g) * .7152) + (transform($b) * .0722));\n}\n\n@function transform($x) {\n @if ($x <= .03928) {\n @return $x / 12.92;\n } @else {\n @return poly-pow((($x + .055) / 1.055), 2.4);\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n@function alert-logo-size($key: \"md\") {\n @return map-get($alert-logo-sizes, $key);\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/orangeHelvetica.css b/dashboard/public/css/orangeHelvetica.css
new file mode 100644
index 00000000..1ab91525
--- /dev/null
+++ b/dashboard/public/css/orangeHelvetica.css
@@ -0,0 +1,16 @@
+@font-face {
+ font-family: HelvNeueOrange;
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("../fonts/HelvNeue55_W1G.woff2") format("woff2"), url("../fonts/HelvNeue55_W1G.woff") format("woff");
+}
+
+@font-face {
+ font-family: HelvNeueOrange;
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url("../fonts/HelvNeue75_W1G.woff2") format("woff2"), url("../fonts/HelvNeue75_W1G.woff") format("woff");
+}
+/*# sourceMappingURL=orangeHelvetica.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/orangeHelvetica.css.map b/dashboard/public/css/orangeHelvetica.css.map
new file mode 100644
index 00000000..907d9d39
--- /dev/null
+++ b/dashboard/public/css/orangeHelvetica.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/orangeHelvetica.scss","orangeHelvetica.css"],"names":[],"mappings":"AAmBA;EACE,4BAA2B;EAC3B,mBAAkB;EAClB,iBAAgB;EAChB,mBAAkB;EAClB,8GAA+H;CClBhI;;ADoBD;EACE,4BAA2B;EAC3B,mBAAkB;EAClB,iBAAgB;EAChB,mBAAkB;EAClB,8GAA+H;CCjBhI","file":"orangeHelvetica.css","sourcesContent":["// Orange Boosted with Bootstrap\n// Helvetica Neue LT W07 55 Roman\n// <version>1.0</version>\n// <vendor>Monotype Imaging Inc.</vendor>\n// <credits>\n// <name>Fonts.com WebFonts</name>\n// <URL>http://webfonts.fonts.com</URL>\n// </credits>\n// <license>\n// <URL>http://webfonts.fonts.com/Legal</URL>\n// </license>\n// <copyright>Copyright © 2014 Monotype Imaging Inc. All rights reserved.\n// <trademark>Neue Helvetica is a trademark of Monotype Imaging Inc. registered in the U.S. Patent and Trademark Office and may be registered in certain other jurisdictions.\n// Orange Company had buy the right for used Helvetica onto digital applications.\n// Don't use and distribute Helvetica font family if you're not explicitly authorized by Monotype Imaging Inc\n\n\n@import \"functions\";\n@import \"variables\";\n@font-face {\n font-family: HelvNeueOrange;\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"#{$icon-font-path}HelvNeue55_W1G.woff2\") format(\"woff2\"), url(\"#{$icon-font-path}HelvNeue55_W1G.woff\") format(\"woff\");\n}\n@font-face {\n font-family: HelvNeueOrange;\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(\"#{$icon-font-path}HelvNeue75_W1G.woff2\") format(\"woff2\"), url(\"#{$icon-font-path}HelvNeue75_W1G.woff\") format(\"woff\");\n}\n","@font-face {\n font-family: HelvNeueOrange;\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"../fonts/HelvNeue55_W1G.woff2\") format(\"woff2\"), url(\"../fonts/HelvNeue55_W1G.woff\") format(\"woff\");\n}\n\n@font-face {\n font-family: HelvNeueOrange;\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(\"../fonts/HelvNeue75_W1G.woff2\") format(\"woff2\"), url(\"../fonts/HelvNeue75_W1G.woff\") format(\"woff\");\n}\n\n/*# sourceMappingURL=orangeHelvetica.css.map */"]} \ No newline at end of file
diff --git a/dashboard/public/css/orangeHelvetica.min.css b/dashboard/public/css/orangeHelvetica.min.css
new file mode 100644
index 00000000..40846879
--- /dev/null
+++ b/dashboard/public/css/orangeHelvetica.min.css
@@ -0,0 +1,2 @@
+@font-face{font-family:HelvNeueOrange;font-style:normal;font-weight:400;font-display:swap;src:url(../fonts/HelvNeue55_W1G.woff2) format("woff2"),url(../fonts/HelvNeue55_W1G.woff) format("woff")}@font-face{font-family:HelvNeueOrange;font-style:normal;font-weight:700;font-display:swap;src:url(../fonts/HelvNeue75_W1G.woff2) format("woff2"),url(../fonts/HelvNeue75_W1G.woff) format("woff")}
+/*# sourceMappingURL=orangeHelvetica.min.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/orangeHelvetica.min.css.map b/dashboard/public/css/orangeHelvetica.min.css.map
new file mode 100644
index 00000000..137db3e4
--- /dev/null
+++ b/dashboard/public/css/orangeHelvetica.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["..\\..\\scss\\orangeHelvetica.scss"],"names":[],"mappings":"AAmBA,WACE,YAAA,eACA,WAAA,OACA,YAAA,IACA,aAAA,KACA,IAAA,mCAAA,eAAA,CAAA,kCAAA,eAEF,WACE,YAAA,eACA,WAAA,OACA,YAAA,IACA,aAAA,KACA,IAAA,mCAAA,eAAA,CAAA,kCAAA","sourcesContent":["// Orange Boosted with Bootstrap\n// Helvetica Neue LT W07 55 Roman\n// <version>1.0</version>\n// <vendor>Monotype Imaging Inc.</vendor>\n// <credits>\n// <name>Fonts.com WebFonts</name>\n// <URL>http://webfonts.fonts.com</URL>\n// </credits>\n// <license>\n// <URL>http://webfonts.fonts.com/Legal</URL>\n// </license>\n// <copyright>Copyright © 2014 Monotype Imaging Inc. All rights reserved.\n// <trademark>Neue Helvetica is a trademark of Monotype Imaging Inc. registered in the U.S. Patent and Trademark Office and may be registered in certain other jurisdictions.\n// Orange Company had buy the right for used Helvetica onto digital applications.\n// Don't use and distribute Helvetica font family if you're not explicitly authorized by Monotype Imaging Inc\n\n\n@import \"functions\";\n@import \"variables\";\n@font-face {\n font-family: HelvNeueOrange;\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"#{$icon-font-path}HelvNeue55_W1G.woff2\") format(\"woff2\"), url(\"#{$icon-font-path}HelvNeue55_W1G.woff\") format(\"woff\");\n}\n@font-face {\n font-family: HelvNeueOrange;\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(\"#{$icon-font-path}HelvNeue75_W1G.woff2\") format(\"woff2\"), url(\"#{$icon-font-path}HelvNeue75_W1G.woff\") format(\"woff\");\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/orangeIcons.css b/dashboard/public/css/orangeIcons.css
new file mode 100644
index 00000000..a127c45f
--- /dev/null
+++ b/dashboard/public/css/orangeIcons.css
@@ -0,0 +1,3681 @@
+@font-face {
+ font-family: icon-orange;
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../fonts/icon-orange.woff2") format("woff2"), url("../fonts/icon-orange.woff") format("woff");
+}
+
+.icon-checkbox-tick,
+.icon-2for1cinematicket,
+.icon-3g,
+.icon-4g,
+.icon-4g-cam,
+.icon-4G-Cam--Live-80,
+.icon-4G-Cam-Camera-80,
+.icon-4G-Cam-Inbox80,
+.icon-4G-Cam-Outbox-80,
+.icon-4G-Cam-Rec-80,
+.icon-4g-plus,
+.icon-4G-Cam-Compact,
+.icon-1013-Reseau,
+.icon-about-event,
+.icon-Accessability,
+.icon-accessibility-cognition,
+.icon-accessibility-dexterity,
+.icon-accessibility-hearing,
+.icon-accessibility-mobility,
+.icon-accessibility-speech,
+.icon-accessibility-vision,
+.icon-accessory-headphones,
+.icon-accessory-shop,
+.icon-Add,
+.icon-add-more,
+.icon-Add-person,
+.icon-address-book,
+.icon-administrator,
+.icon-Adultcode,
+.icon-Adult,
+.icon-advertising,
+.icon-aeroplane,
+.icon-Age-rating-3,
+.icon-Age-rating-4,
+.icon-Age-rating-7,
+.icon-Age-rating-9,
+.icon-Age-rating-12,
+.icon-Age-rating-16,
+.icon-Age-rating-17,
+.icon-Age-rating-18,
+.icon-age-rating-mono-3,
+.icon-age-rating-mono-4,
+.icon-age-rating-mono-7,
+.icon-age-rating-mono-9,
+.icon-age-rating-mono-12,
+.icon-age-rating-mono-16,
+.icon-age-rating-mono-17,
+.icon-age-rating-mono-18,
+.icon-agriculture,
+.icon-airbox-auto,
+.icon-alarm-clock,
+.icon-alarm-off,
+.icon-Alias-numbers,
+.icon-all-channels,
+.icon-antenna,
+.icon-anti-spam,
+.icon-antivirus,
+.icon-Apartment-building,
+.icon-Apps,
+.icon-Apps-disabled,
+.icon-Archive,
+.icon-arrow-down,
+.icon-arrow-up,
+.icon-arrow-next,
+.icon-arrow-previous,
+.icon-Art,
+.icon-assistance,
+.icon-attachment,
+.icon-Auditorium,
+.icon-avatar,
+.icon-Baby,
+.icon-backup,
+.icon-banking,
+.icon-battery-1-bar,
+.icon-battery-2-bar,
+.icon-battery-charging,
+.icon-battery-empty,
+.icon-battery-full,
+.icon-battery-full-2,
+.icon-Betting,
+.icon-bill-euro,
+.icon-billboard,
+.icon-birthday,
+.icon-bluetooth,
+.icon-Book-award,
+.icon-book-download,
+.icon-bookmark,
+.icon-bookmark-smart,
+.icon-Boxes,
+.icon-broadcast,
+.icon-burst-mode,
+.icon-Business-everywhere,
+.icon-business-invoices,
+.icon-business-lounge,
+.icon-business-telephonie,
+.icon-buy,
+.icon-buy-back-euro,
+.icon-buzz,
+.icon-Calculator,
+.icon-calendaralarm,
+.icon-calendar-30,
+.icon-calendar-day,
+.icon-Calendar-fixtures-results,
+.icon-Calendar-football-match,
+.icon-calendar-month,
+.icon-calendar-week,
+.icon-call,
+.icon-call-forward,
+.icon-call-invite,
+.icon-call-log,
+.icon-camera,
+.icon-Car-park,
+.icon-Car-pooling,
+.icon-Casting,
+.icon-Categories,
+.icon-CD,
+.icon-change-wallpaper,
+.icon-Change-wallpaper-1,
+.icon-charger,
+.icon-check-your-balance,
+.icon-Child,
+.icon-child-protection,
+.icon-Children-channel,
+.icon-cineday-silhouette,
+.icon-clock,
+.icon-cloud-backup,
+.icon-Coat-hanger,
+.icon-Collective-class-training,
+.icon-Colour-Call,
+.icon-Comedy-channel,
+.icon-Comic,
+.icon-Comments,
+.icon-commercial-representitive,
+.icon-community-sms,
+.icon-Concierge-bell,
+.icon-conference-call,
+.icon-connected-object,
+.icon-connection,
+.icon-construction,
+.icon-contact-card,
+.icon-control-centre,
+.icon-control-mydata,
+.icon-copy,
+.icon-Courier,
+.icon-CPU,
+.icon-crane,
+.icon-Crop,
+.icon-Currency-brazilian-real,
+.icon-currency-converter,
+.icon-Currency-dollar,
+.icon-currency-euro,
+.icon-Currency-sterling,
+.icon-Currency-yen,
+.icon-data-protection,
+.icon-data-services,
+.icon-decoder,
+.icon-Decrease-test-size,
+.icon-Defibrillator,
+.icon-delete,
+.icon-device-desktop-computer,
+.icon-device-desktop-computer-connected,
+.icon-device-fixed-line-phone,
+.icon-device-laptop-computer,
+.icon-device-laptop-computer-connected,
+.icon-device-smart-phone,
+.icon-device-status,
+.icon-device-tablet,
+.icon-device-tablet-connected,
+.icon-device-tv,
+.icon-device-connected-printer,
+.icon-device-manager,
+.icon-device-managment-express,
+.icon-dialler,
+.icon-Digital-frame,
+.icon-disable-apps,
+.icon-Discovery-offer,
+.icon-Discussion-author,
+.icon-Discussion-more,
+.icon-Doctor,
+.icon-Doctors-bag,
+.icon-Doctors-communicating,
+.icon-Document-compose,
+.icon-document-stack,
+.icon-document-word,
+.icon-document-zip,
+.icon-Documentary,
+.icon-done-modifier,
+.icon-download,
+.icon-draft,
+.icon-dual-sim-packaging,
+.icon-easy-internet,
+.icon-ebook,
+.icon-Eco-mode,
+.icon-edashboard,
+.icon-edit-draft,
+.icon-edit-email,
+.icon-edit-image,
+.icon-Elderly-person,
+.icon-electric-car,
+.icon-electric-car-charging,
+.icon-electricity-provider,
+.icon-elevator,
+.icon-email,
+.icon-email-forwarded,
+.icon-Email-replied,
+.icon-emap,
+.icon-emergency-firemen,
+.icon-emergency-police,
+.icon-emergency-sos,
+.icon-emergency-service,
+.icon-employees-1,
+.icon-Empty-trash,
+.icon-End-call,
+.icon-Entertainment-channel,
+.icon-epg,
+.icon-erase,
+.icon-error-severe,
+.icon-Ethenet,
+.icon-event-agenda,
+.icon-event-organiser,
+.icon-event-speaker,
+.icon-Excel,
+.icon-Expand-screen,
+.icon-expert,
+.icon-external-drive,
+.icon-Factory,
+.icon-family-place,
+.icon-Fast-delivery,
+.icon-Favorite-music,
+.icon-favourite,
+.icon-Featured,
+.icon-filter,
+.icon-Filter-effects,
+.icon-finance,
+.icon-fire,
+.icon-Fire-extinguisher,
+.icon-Firewall,
+.icon-flexible-storage,
+.icon-folder-camera,
+.icon-folder-document,
+.icon-folder-favourite,
+.icon-folder-sd,
+.icon-football,
+.icon-Football-match,
+.icon-Football-quiz,
+.icon-Forward,
+.icon-Forward-curved-arrow,
+.icon-forward-the-number,
+.icon-free-tag,
+.icon-Free-up-space,
+.icon-front-end-dashboard,
+.icon-Full-screen-view,
+.icon-Gallery,
+.icon-games,
+.icon-Gas-tank,
+.icon-gaugecapacity,
+.icon-gauge-counter,
+.icon-gauge-rate,
+.icon-gauge-mon-reseau,
+.icon-generic-document,
+.icon-geolocation,
+.icon-hands-free,
+.icon-HDMI-Card,
+.icon-health,
+.icon-health-monitor,
+.icon-Health-patient,
+.icon-Heart-rate,
+.icon-Heartbeats,
+.icon-help-guide,
+.icon-history,
+.icon-home,
+.icon-Home-1,
+.icon-home-alarm,
+.icon-Homelive,
+.icon-homescreen,
+.icon-Horoscopes,
+.icon-hospital,
+.icon-hotel,
+.icon-Hourglass,
+.icon-Im-driving,
+.icon-image,
+.icon-image-file,
+.icon-improvement,
+.icon-inbox,
+.icon-Incoming-call-curved-arrow,
+.icon-Increase-test-size,
+.icon-info,
+.icon-Information-data,
+.icon-internationaltv,
+.icon-international-globe,
+.icon-internet,
+.icon-internet-browser,
+.icon-Internet-security-desktop,
+.icon-Internet-security-mobile,
+.icon-Internet-security-password,
+.icon-Internet-security-server,
+.icon-internet-usage,
+.icon-Interventions,
+.icon-IT-infrastructure,
+.icon-keeper,
+.icon-keyboard,
+.icon-Keypad,
+.icon-La-Cle,
+.icon-Language,
+.icon-Latest,
+.icon-Le-Bloc,
+.icon-Leave-session,
+.icon-lightbulb-sh,
+.icon-ligue-1,
+.icon-Link,
+.icon-live,
+.icon-livebox,
+.icon-livebox-info,
+.icon-livebox-phone,
+.icon-location-pin-compass,
+.icon-lock,
+.icon-Lock-screen-settings,
+.icon-logistics,
+.icon-logout,
+.icon-Maintenance-man,
+.icon-manage-android,
+.icon-managing-equipment,
+.icon-Map,
+.icon-map-pin,
+.icon-Medal,
+.icon-Medical-app,
+.icon-Medical-app-phone,
+.icon-medical-chart,
+.icon-Medical-files,
+.icon-menu,
+.icon-Message-download,
+.icon-messaging,
+.icon-messaging-compose-sms,
+.icon-messaging-unified,
+.icon-messaging-untitled-compose,
+.icon-microphone,
+.icon-Microscope,
+.icon-mini-games,
+.icon-mirroring,
+.icon-Missed-call-boxed-arrow,
+.icon-Missed-call-curved-arrow,
+.icon-mobile-applications,
+.icon-Mobile-backup-restore,
+.icon-mobile-box,
+.icon-mobile-data-toggle,
+.icon-mobile-insurance,
+.icon-mobile-network-coverage,
+.icon-mobile-security,
+.icon-mobile-setup,
+.icon-Modem,
+.icon-modifier-add,
+.icon-Modifier-delete,
+.icon-Modifier-favorite,
+.icon-modifier-new,
+.icon-modifier-no-access,
+.icon-modifier-synchro,
+.icon-modifier-upload,
+.icon-modifier-wizard,
+.icon-Modifier-download,
+.icon-mon-reseau,
+.icon-money,
+.icon-More-dots,
+.icon-move-to-folder,
+.icon-multi-sim,
+.icon-multiple-timezone,
+.icon-Music-artist,
+.icon-music-file,
+.icon-Music-genre,
+.icon-music-player,
+.icon-Mute-microphone,
+.icon-my-account,
+.icon-my-bill-uk,
+.icon-my-boutique,
+.icon-my-essential,
+.icon-my-essential-tablet,
+.icon-my-livebox,
+.icon-my-media,
+.icon-My-Office-Phone,
+.icon-my-orange,
+.icon-my-plug,
+.icon-my-services,
+.icon-my-travels,
+.icon-Nature,
+.icon-Network-add,
+.icon-Network-livebox,
+.icon-networks,
+.icon-new,
+.icon-newspaper,
+.icon-nfc,
+.icon-NFC-tag,
+.icon-no-sim,
+.icon-Notification,
+.icon-Notification-Bell,
+.icon-nouveau-contract-social,
+.icon-numero-unique,
+.icon-office,
+.icon-oil-and-gas,
+.icon-On-board-unit,
+.icon-online-help,
+.icon-orangewallet,
+.icon-orange-assistant,
+.icon-orange-cash,
+.icon-orange-corporate,
+.icon-Orange-Detente,
+.icon-orange-events,
+.icon-Orange-Experts-Class-Training,
+.icon-Orange-Experts-Copy-Keep,
+.icon-orange-experts-expert,
+.icon-orange-experts-insurance,
+.icon-Orange-Experts-One2One-Coach,
+.icon-orange-experts-orange-business-consultant,
+.icon-orange-experts-orange-startup-smartphone,
+.icon-orange-experts-recycle,
+.icon-orange-experts-repair,
+.icon-orange-experts-tranquil,
+.icon-Orange-Football-Club,
+.icon-orange-foundation,
+.icon-Orange-garden,
+.icon-orange-gesture,
+.icon-orange-jobs,
+.icon-orange-messenger,
+.icon-Orange-Messenger-1,
+.icon-orange-money,
+.icon-orange-Photography,
+.icon-orange-pro,
+.icon-orange-protect,
+.icon-orange-radio,
+.icon-orange-reflections,
+.icon-Orange-rewards,
+.icon-Orange-security-suite,
+.icon-orange-travel,
+.icon-orange-tv,
+.icon-orange-wallet,
+.icon-orange-wifi,
+.icon-Orange-Guest,
+.icon-organisation,
+.icon-outbox,
+.icon-outdoor-sports-mountain-biking,
+.icon-outdoor-sports-skiing,
+.icon-Package,
+.icon-Package-content,
+.icon-parabole-tv,
+.icon-parental-control,
+.icon-Parrasol,
+.icon-pass-video,
+.icon-Pause,
+.icon-Payment-euro,
+.icon-pda-device,
+.icon-pdf-file,
+.icon-Pencil,
+.icon-personal-smartphone-trainer,
+.icon-phone-advisor,
+.icon-phone-fund,
+.icon-phone-protection,
+.icon-Photo-dialer,
+.icon-picture-messaging,
+.icon-Pills,
+.icon-pioneering,
+.icon-Play,
+.icon-play-and-win,
+.icon-playmode-random,
+.icon-polls,
+.icon-portfolio,
+.icon-POS-payment,
+.icon-power,
+.icon-powerpoint-file,
+.icon-presentation,
+.icon-previous,
+.icon-printer,
+.icon-profileringtone,
+.icon-public-transport,
+.icon-publish,
+.icon-Quirky-stories,
+.icon-Quiz,
+.icon-Radiography,
+.icon-ratings-stars,
+.icon-Real-time,
+.icon-recommend,
+.icon-record,
+.icon-Record-1,
+.icon-recycle-device,
+.icon-Redo,
+.icon-relationship,
+.icon-reload,
+.icon-remote-control,
+.icon-Remote-control-1,
+.icon-remove-modifier,
+.icon-Replay-boxed-arrow,
+.icon-Reply-boxed-arrow,
+.icon-Reply-curved-arrow,
+.icon-report,
+.icon-responsible,
+.icon-Restaurant,
+.icon-restore-to-phone,
+.icon-Restrictied-content,
+.icon-rewards,
+.icon-ringtones,
+.icon-running,
+.icon-Scales,
+.icon-scan-ticket,
+.icon-School,
+.icon-Science,
+.icon-Scissors,
+.icon-sd-card,
+.icon-SD-card-1,
+.icon-search,
+.icon-Send,
+.icon-Send-to-person,
+.icon-Server,
+.icon-servers,
+.icon-settings,
+.icon-setup-and-repair,
+.icon-setup-and-repair-cog,
+.icon-setup-internet,
+.icon-share,
+.icon-Share-wifi,
+.icon-shipping,
+.icon-Shop,
+.icon-shop-pin,
+.icon-shop-subscriptions,
+.icon-Shopping,
+.icon-Show-front-back-camera,
+.icon-Shower,
+.icon-showroom-mobile-pro,
+.icon-signal-1-5,
+.icon-signal-2-5,
+.icon-signal-3-5,
+.icon-signal-4-5,
+.icon-signal-5-5,
+.icon-signal-boost,
+.icon-Silent,
+.icon-sim,
+.icon-simple-mode,
+.icon-Simplicity,
+.icon-Skip-backward,
+.icon-Skip-forward,
+.icon-Sleep,
+.icon-Smart-electric-meter,
+.icon-Smart-heating-switch,
+.icon-smart-home,
+.icon-smart-lightswitch,
+.icon-smart-powerstation,
+.icon-Smart-Sensor,
+.icon-smart-tap,
+.icon-smart-watch,
+.icon-social-network,
+.icon-software-update,
+.icon-Sport-channel,
+.icon-Start-services,
+.icon-startup-wizard,
+.icon-stocks,
+.icon-stop-secret,
+.icon-Stop-video,
+.icon-Storage-cloud,
+.icon-store-locator,
+.icon-Street,
+.icon-Stretcher,
+.icon-subscription-package,
+.icon-Sudoku,
+.icon-support,
+.icon-surveillance-camera,
+.icon-Syncronise,
+.icon-target-location,
+.icon-tarif,
+.icon-tariff,
+.icon-task-list,
+.icon-Taxi,
+.icon-team-connect,
+.icon-temperature,
+.icon-terms-conditions,
+.icon-text-alerts,
+.icon-Thumb-down,
+.icon-Thumb-up,
+.icon-tick,
+.icon-tick-circle,
+.icon-tickets,
+.icon-Top-10,
+.icon-top-up-dollar,
+.icon-top-up-euro,
+.icon-top-up-uk-bank,
+.icon-touch-screen,
+.icon-town,
+.icon-townhall,
+.icon-track-your-delivery,
+.icon-track-your-order,
+.icon-Trading,
+.icon-trash,
+.icon-tv-plus,
+.icon-TV-series,
+.icon-Undo,
+.icon-unique,
+.icon-unknown-file,
+.icon-unlimited-calls,
+.icon-unlocked,
+.icon-Unmissable,
+.icon-upload,
+.icon-USB,
+.icon-usb-key,
+.icon-Value,
+.icon-vehicle,
+.icon-video,
+.icon-video-file,
+.icon-video-phone,
+.icon-video-meeting2,
+.icon-Vinyl,
+.icon-vip-contact,
+.icon-virtual-gamepad,
+.icon-visual-voicemail,
+.icon-vod-portrait,
+.icon-volte,
+.icon-volume-high,
+.icon-volume-low,
+.icon-volume-mid,
+.icon-volume-none,
+.icon-vowifi,
+.icon-vvm-message-read-full,
+.icon-Warehouse,
+.icon-Warningimportant,
+.icon-Warning-important,
+.icon-web-cam,
+.icon-web-fax-widget,
+.icon-Wholesale-retail,
+.icon-Widget,
+.icon-widget-tour,
+.icon-wifi,
+.icon-wifi-0,
+.icon-wifi-1,
+.icon-wifi-2,
+.icon-wps-pairing,
+.icon-WPT,
+.icon-zoom-in,
+.icon-zoom-out,
+.icon-popout-tech,
+.icon-frame-care,
+.icon-frame-family,
+.icon-frame-fun,
+.icon-frame-home,
+.icon-frame-money,
+.icon-frame-on-the-move,
+.icon-frame-tariff,
+.icon-frame-tech,
+.icon-frame-wellbeing,
+.icon-frame-work,
+.icon-popout-care,
+.icon-popout-family,
+.icon-popout-fun,
+.icon-popout-home,
+.icon-popout-money,
+.icon-popout-on-the-move,
+.icon-popout-tariff,
+.icon-popout-wellbeing,
+.icon-popout-work,
+.icon-frame-connectivity,
+.icon-frame-my-customers,
+.icon-frame-performance,
+.icon-frame-security,
+.icon-frame-teamwork,
+.icon-popout-connectivity,
+.icon-popout-my-customers,
+.icon-popout-performance,
+.icon-popout-security,
+.icon-popout-teamwork {
+ font-family: icon-orange !important;
+ font-style: normal;
+ font-variant: normal;
+ line-height: 1;
+ text-transform: none;
+ speak: none;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-popout-care,
+.icon-popout-family,
+.icon-popout-fun,
+.icon-popout-home,
+.icon-popout-money,
+.icon-popout-on-the-move,
+.icon-popout-tariff,
+.icon-popout-tech,
+.icon-popout-wellbeing,
+.icon-popout-work,
+.icon-frame-family,
+.icon-frame-fun,
+.icon-frame-home,
+.icon-frame-money,
+.icon-frame-on-the-move,
+.icon-frame-tariff,
+.icon-frame-tech,
+.icon-frame-wellbeing,
+.icon-frame-work,
+.icon-frame-care,
+.icon-frame-connectivity,
+.icon-frame-my-customers,
+.icon-frame-performance,
+.icon-frame-security,
+.icon-frame-teamwork,
+.icon-popout-connectivity,
+.icon-popout-my-customers,
+.icon-popout-performance,
+.icon-popout-security,
+.icon-popout-teamwork {
+ color: #f16e00;
+}
+
+.icon-checkbox-tick::before {
+ content: "\eb77";
+}
+
+.icon-2for1cinematicket::before {
+ content: "\e900";
+}
+
+.icon-3g::before {
+ content: "\e901";
+}
+
+.icon-4g::before {
+ content: "\e902";
+}
+
+.icon-4g-cam::before {
+ content: "\e903";
+}
+
+.icon-4G-Cam--Live-80::before {
+ content: "\e904";
+}
+
+.icon-4G-Cam-Camera-80::before {
+ content: "\e905";
+}
+
+.icon-4G-Cam-Inbox80::before {
+ content: "\e906";
+}
+
+.icon-4G-Cam-Outbox-80::before {
+ content: "\e907";
+}
+
+.icon-4G-Cam-Rec-80::before {
+ content: "\e908";
+}
+
+.icon-4g-plus::before {
+ content: "\e909";
+}
+
+.icon-4G-Cam-Compact::before {
+ content: "\e90a";
+}
+
+.icon-1013-Reseau::before {
+ content: "\e90b";
+}
+
+.icon-about-event::before {
+ content: "\e90c";
+}
+
+.icon-Accessability::before {
+ content: "\e90d";
+}
+
+.icon-accessibility-cognition::before {
+ content: "\e90e";
+}
+
+.icon-accessibility-dexterity::before {
+ content: "\e90f";
+}
+
+.icon-accessibility-hearing::before {
+ content: "\e910";
+}
+
+.icon-accessibility-mobility::before {
+ content: "\e911";
+}
+
+.icon-accessibility-speech::before {
+ content: "\e912";
+}
+
+.icon-accessibility-vision::before {
+ content: "\e913";
+}
+
+.icon-accessory-headphones::before {
+ content: "\e914";
+}
+
+.icon-accessory-shop::before {
+ content: "\e915";
+}
+
+.icon-Add::before {
+ content: "\e916";
+}
+
+.icon-add-more::before {
+ content: "\e917";
+}
+
+.icon-Add-person::before {
+ content: "\e918";
+}
+
+.icon-address-book::before {
+ content: "\e919";
+}
+
+.icon-administrator::before {
+ content: "\e91a";
+}
+
+.icon-Adultcode::before {
+ content: "\e91b";
+}
+
+.icon-Adult::before {
+ content: "\e91c";
+}
+
+.icon-advertising::before {
+ content: "\e91d";
+}
+
+.icon-aeroplane::before {
+ content: "\e91e";
+}
+
+.icon-Age-rating-3::before {
+ content: "\e91f";
+}
+
+.icon-Age-rating-4::before {
+ content: "\e920";
+}
+
+.icon-Age-rating-7::before {
+ content: "\e921";
+}
+
+.icon-Age-rating-9::before {
+ content: "\e922";
+}
+
+.icon-Age-rating-12::before {
+ content: "\e923";
+}
+
+.icon-Age-rating-16::before {
+ content: "\e924";
+}
+
+.icon-Age-rating-17::before {
+ content: "\e925";
+}
+
+.icon-Age-rating-18::before {
+ content: "\e926";
+}
+
+.icon-age-rating-mono-3::before {
+ content: "\e927";
+}
+
+.icon-age-rating-mono-4::before {
+ content: "\e928";
+}
+
+.icon-age-rating-mono-7::before {
+ content: "\e929";
+}
+
+.icon-age-rating-mono-9::before {
+ content: "\e92a";
+}
+
+.icon-age-rating-mono-12::before {
+ content: "\e92b";
+}
+
+.icon-age-rating-mono-16::before {
+ content: "\e92c";
+}
+
+.icon-age-rating-mono-17::before {
+ content: "\e92d";
+}
+
+.icon-age-rating-mono-18::before {
+ content: "\e92e";
+}
+
+.icon-agriculture::before {
+ content: "\e92f";
+}
+
+.icon-airbox-auto::before {
+ content: "\e930";
+}
+
+.icon-alarm-clock::before {
+ content: "\e931";
+}
+
+.icon-alarm-off::before {
+ content: "\e932";
+}
+
+.icon-Alias-numbers::before {
+ content: "\e933";
+}
+
+.icon-all-channels::before {
+ content: "\e934";
+}
+
+.icon-antenna::before {
+ content: "\e935";
+}
+
+.icon-anti-spam::before {
+ content: "\e936";
+}
+
+.icon-antivirus::before {
+ content: "\e937";
+}
+
+.icon-Apartment-building::before {
+ content: "\e938";
+}
+
+.icon-Apps::before {
+ content: "\e939";
+}
+
+.icon-Apps-disabled::before {
+ content: "\e93a";
+}
+
+.icon-Archive::before {
+ content: "\e93b";
+}
+
+.icon-arrow-down::before {
+ content: "\e93c";
+}
+
+.icon-arrow-up::before {
+ content: "\e93d";
+}
+
+.icon-arrow-next::before {
+ content: "\e93e";
+}
+
+.icon-arrow-previous::before {
+ content: "\e93f";
+}
+
+.icon-Art::before {
+ content: "\e940";
+}
+
+.icon-assistance::before {
+ content: "\e941";
+}
+
+.icon-attachment::before {
+ content: "\e942";
+}
+
+.icon-Auditorium::before {
+ content: "\e943";
+}
+
+.icon-avatar::before {
+ content: "\e944";
+}
+
+.icon-Baby::before {
+ content: "\e945";
+}
+
+.icon-backup::before {
+ content: "\e946";
+}
+
+.icon-banking::before {
+ content: "\e947";
+}
+
+.icon-battery-1-bar::before {
+ content: "\e948";
+}
+
+.icon-battery-2-bar::before {
+ content: "\e949";
+}
+
+.icon-battery-charging::before {
+ content: "\e94a";
+}
+
+.icon-battery-empty::before {
+ content: "\e94b";
+}
+
+.icon-battery-full::before {
+ content: "\e94c";
+}
+
+.icon-battery-full-2::before {
+ content: "\e94d";
+}
+
+.icon-Betting::before {
+ content: "\e94e";
+}
+
+.icon-bill-euro::before {
+ content: "\e94f";
+}
+
+.icon-billboard::before {
+ content: "\e950";
+}
+
+.icon-birthday::before {
+ content: "\e951";
+}
+
+.icon-bluetooth::before {
+ content: "\e952";
+}
+
+.icon-Book-award::before {
+ content: "\e953";
+}
+
+.icon-book-download::before {
+ content: "\e954";
+}
+
+.icon-bookmark::before {
+ content: "\e955";
+}
+
+.icon-bookmark-smart::before {
+ content: "\e956";
+}
+
+.icon-Boxes::before {
+ content: "\e957";
+}
+
+.icon-broadcast::before {
+ content: "\e958";
+}
+
+.icon-burst-mode::before {
+ content: "\e959";
+}
+
+.icon-Business-everywhere::before {
+ content: "\e95a";
+}
+
+.icon-business-invoices::before {
+ content: "\e95b";
+}
+
+.icon-business-lounge::before {
+ content: "\e95c";
+}
+
+.icon-business-telephonie::before {
+ content: "\e95d";
+}
+
+.icon-buy::before {
+ content: "\e95e";
+}
+
+.icon-buy-back-euro::before {
+ content: "\e95f";
+}
+
+.icon-buzz::before {
+ content: "\e960";
+}
+
+.icon-Calculator::before {
+ content: "\e961";
+}
+
+.icon-calendaralarm::before {
+ content: "\e962";
+}
+
+.icon-calendar-30::before {
+ content: "\e963";
+}
+
+.icon-calendar-day::before {
+ content: "\e964";
+}
+
+.icon-Calendar-fixtures-results::before {
+ content: "\e965";
+}
+
+.icon-Calendar-football-match::before {
+ content: "\e966";
+}
+
+.icon-calendar-month::before {
+ content: "\e967";
+}
+
+.icon-calendar-week::before {
+ content: "\e968";
+}
+
+.icon-call::before {
+ content: "\e969";
+}
+
+.icon-call-forward::before {
+ content: "\e96a";
+}
+
+.icon-call-invite::before {
+ content: "\e96b";
+}
+
+.icon-call-log::before {
+ content: "\e96c";
+}
+
+.icon-camera::before {
+ content: "\e96d";
+}
+
+.icon-Car-park::before {
+ content: "\e96e";
+}
+
+.icon-Car-pooling::before {
+ content: "\e96f";
+}
+
+.icon-Casting::before {
+ content: "\e970";
+}
+
+.icon-Categories::before {
+ content: "\e971";
+}
+
+.icon-CD::before {
+ content: "\e972";
+}
+
+.icon-change-wallpaper::before {
+ content: "\e973";
+}
+
+.icon-Change-wallpaper-1::before {
+ content: "\e974";
+}
+
+.icon-charger::before {
+ content: "\e975";
+}
+
+.icon-check-your-balance::before {
+ content: "\e976";
+}
+
+.icon-Child::before {
+ content: "\e977";
+}
+
+.icon-child-protection::before {
+ content: "\e978";
+}
+
+.icon-Children-channel::before {
+ content: "\e979";
+}
+
+.icon-cineday-silhouette::before {
+ content: "\e97a";
+}
+
+.icon-clock::before {
+ content: "\e97b";
+}
+
+.icon-cloud-backup::before {
+ content: "\e97c";
+}
+
+.icon-Coat-hanger::before {
+ content: "\e97d";
+}
+
+.icon-Collective-class-training::before {
+ content: "\e97e";
+}
+
+.icon-Colour-Call::before {
+ content: "\e97f";
+}
+
+.icon-Comedy-channel::before {
+ content: "\e980";
+}
+
+.icon-Comic::before {
+ content: "\e981";
+}
+
+.icon-Comments::before {
+ content: "\e982";
+}
+
+.icon-commercial-representitive::before {
+ content: "\e983";
+}
+
+.icon-community-sms::before {
+ content: "\e984";
+}
+
+.icon-Concierge-bell::before {
+ content: "\e985";
+}
+
+.icon-conference-call::before {
+ content: "\e986";
+}
+
+.icon-connected-object::before {
+ content: "\e987";
+}
+
+.icon-connection::before {
+ content: "\e988";
+}
+
+.icon-construction::before {
+ content: "\e989";
+}
+
+.icon-contact-card::before {
+ content: "\e98a";
+}
+
+.icon-control-centre::before {
+ content: "\e98b";
+}
+
+.icon-control-mydata::before {
+ content: "\e98c";
+}
+
+.icon-copy::before {
+ content: "\e98d";
+}
+
+.icon-Courier::before {
+ content: "\e98e";
+}
+
+.icon-CPU::before {
+ content: "\e98f";
+}
+
+.icon-crane::before {
+ content: "\e990";
+}
+
+.icon-Crop::before {
+ content: "\e991";
+}
+
+.icon-Currency-brazilian-real::before {
+ content: "\e992";
+}
+
+.icon-currency-converter::before {
+ content: "\e993";
+}
+
+.icon-Currency-dollar::before {
+ content: "\e994";
+}
+
+.icon-currency-euro::before {
+ content: "\e995";
+}
+
+.icon-Currency-sterling::before {
+ content: "\e996";
+}
+
+.icon-Currency-yen::before {
+ content: "\e997";
+}
+
+.icon-data-protection::before {
+ content: "\e998";
+}
+
+.icon-data-services::before {
+ content: "\e999";
+}
+
+.icon-decoder::before {
+ content: "\e99a";
+}
+
+.icon-Decrease-test-size::before {
+ content: "\e99b";
+}
+
+.icon-Defibrillator::before {
+ content: "\e99c";
+}
+
+.icon-delete::before {
+ content: "\e99d";
+}
+
+.icon-device-desktop-computer::before {
+ content: "\e99e";
+}
+
+.icon-device-desktop-computer-connected::before {
+ content: "\e99f";
+}
+
+.icon-device-fixed-line-phone::before {
+ content: "\e9a0";
+}
+
+.icon-device-laptop-computer::before {
+ content: "\e9a1";
+}
+
+.icon-device-laptop-computer-connected::before {
+ content: "\e9a2";
+}
+
+.icon-device-smart-phone::before {
+ content: "\e9a3";
+}
+
+.icon-device-status::before {
+ content: "\e9a4";
+}
+
+.icon-device-tablet::before {
+ content: "\e9a5";
+}
+
+.icon-device-tablet-connected::before {
+ content: "\e9a6";
+}
+
+.icon-device-tv::before {
+ content: "\e9a7";
+}
+
+.icon-device-connected-printer::before {
+ content: "\e9a8";
+}
+
+.icon-device-manager::before {
+ content: "\e9a9";
+}
+
+.icon-device-managment-express::before {
+ content: "\e9aa";
+}
+
+.icon-dialler::before {
+ content: "\e9ab";
+}
+
+.icon-Digital-frame::before {
+ content: "\e9ac";
+}
+
+.icon-disable-apps::before {
+ content: "\e9ad";
+}
+
+.icon-Discovery-offer::before {
+ content: "\e9ae";
+}
+
+.icon-Discussion-author::before {
+ content: "\e9af";
+}
+
+.icon-Discussion-more::before {
+ content: "\e9b0";
+}
+
+.icon-Doctor::before {
+ content: "\e9b1";
+}
+
+.icon-Doctors-bag::before {
+ content: "\e9b2";
+}
+
+.icon-Doctors-communicating::before {
+ content: "\e9b3";
+}
+
+.icon-Document-compose::before {
+ content: "\e9b4";
+}
+
+.icon-document-stack::before {
+ content: "\e9b5";
+}
+
+.icon-document-word::before {
+ content: "\e9b6";
+}
+
+.icon-document-zip::before {
+ content: "\e9b7";
+}
+
+.icon-Documentary::before {
+ content: "\e9b8";
+}
+
+.icon-done-modifier::before {
+ content: "\e9b9";
+}
+
+.icon-download::before {
+ content: "\e9ba";
+}
+
+.icon-draft::before {
+ content: "\e9bb";
+}
+
+.icon-dual-sim-packaging::before {
+ content: "\e9bc";
+}
+
+.icon-easy-internet::before {
+ content: "\e9bd";
+}
+
+.icon-ebook::before {
+ content: "\e9be";
+}
+
+.icon-Eco-mode::before {
+ content: "\e9bf";
+}
+
+.icon-edashboard::before {
+ content: "\e9c0";
+}
+
+.icon-edit-draft::before {
+ content: "\e9c1";
+}
+
+.icon-edit-email::before {
+ content: "\e9c2";
+}
+
+.icon-edit-image::before {
+ content: "\e9c3";
+}
+
+.icon-Elderly-person::before {
+ content: "\e9c4";
+}
+
+.icon-electric-car::before {
+ content: "\e9c5";
+}
+
+.icon-electric-car-charging::before {
+ content: "\e9c6";
+}
+
+.icon-electricity-provider::before {
+ content: "\e9c7";
+}
+
+.icon-elevator::before {
+ content: "\e9c8";
+}
+
+.icon-email::before {
+ content: "\e9c9";
+}
+
+.icon-email-forwarded::before {
+ content: "\e9ca";
+}
+
+.icon-Email-replied::before {
+ content: "\e9cb";
+}
+
+.icon-emap::before {
+ content: "\e9cc";
+}
+
+.icon-emergency-firemen::before {
+ content: "\e9cd";
+}
+
+.icon-emergency-police::before {
+ content: "\e9ce";
+}
+
+.icon-emergency-sos::before {
+ content: "\e9cf";
+}
+
+.icon-emergency-service::before {
+ content: "\e9d0";
+}
+
+.icon-employees-1::before {
+ content: "\e9d1";
+}
+
+.icon-Empty-trash::before {
+ content: "\e9d2";
+}
+
+.icon-End-call::before {
+ content: "\e9d3";
+}
+
+.icon-Entertainment-channel::before {
+ content: "\e9d4";
+}
+
+.icon-epg::before {
+ content: "\e9d5";
+}
+
+.icon-erase::before {
+ content: "\e9d6";
+}
+
+.icon-error-severe::before {
+ content: "\e9d7";
+}
+
+.icon-Ethenet::before {
+ content: "\e9d8";
+}
+
+.icon-event-agenda::before {
+ content: "\e9d9";
+}
+
+.icon-event-organiser::before {
+ content: "\e9da";
+}
+
+.icon-event-speaker::before {
+ content: "\e9db";
+}
+
+.icon-Excel::before {
+ content: "\e9dc";
+}
+
+.icon-Expand-screen::before {
+ content: "\e9dd";
+}
+
+.icon-expert::before {
+ content: "\e9de";
+}
+
+.icon-external-drive::before {
+ content: "\e9df";
+}
+
+.icon-Factory::before {
+ content: "\e9e0";
+}
+
+.icon-family-place::before {
+ content: "\e9e1";
+}
+
+.icon-Fast-delivery::before {
+ content: "\e9e2";
+}
+
+.icon-Favorite-music::before {
+ content: "\e9e3";
+}
+
+.icon-favourite::before {
+ content: "\e9e4";
+}
+
+.icon-Featured::before {
+ content: "\e9e5";
+}
+
+.icon-filter::before {
+ content: "\e9e6";
+}
+
+.icon-Filter-effects::before {
+ content: "\e9e7";
+}
+
+.icon-finance::before {
+ content: "\e9e8";
+}
+
+.icon-fire::before {
+ content: "\e9e9";
+}
+
+.icon-Fire-extinguisher::before {
+ content: "\e9ea";
+}
+
+.icon-Firewall::before {
+ content: "\e9eb";
+}
+
+.icon-flexible-storage::before {
+ content: "\e9ec";
+}
+
+.icon-folder-camera::before {
+ content: "\e9ed";
+}
+
+.icon-folder-document::before {
+ content: "\e9ee";
+}
+
+.icon-folder-favourite::before {
+ content: "\e9ef";
+}
+
+.icon-folder-sd::before {
+ content: "\e9f0";
+}
+
+.icon-football::before {
+ content: "\e9f1";
+}
+
+.icon-Football-match::before {
+ content: "\e9f2";
+}
+
+.icon-Football-quiz::before {
+ content: "\e9f3";
+}
+
+.icon-Forward::before {
+ content: "\e9f4";
+}
+
+.icon-Forward-curved-arrow::before {
+ content: "\e9f5";
+}
+
+.icon-forward-the-number::before {
+ content: "\e9f6";
+}
+
+.icon-free-tag::before {
+ content: "\e9f7";
+}
+
+.icon-Free-up-space::before {
+ content: "\e9f8";
+}
+
+.icon-front-end-dashboard::before {
+ content: "\e9f9";
+}
+
+.icon-Full-screen-view::before {
+ content: "\e9fa";
+}
+
+.icon-Gallery::before {
+ content: "\e9fb";
+}
+
+.icon-games::before {
+ content: "\e9fc";
+}
+
+.icon-Gas-tank::before {
+ content: "\e9fd";
+}
+
+.icon-gaugecapacity::before {
+ content: "\e9fe";
+}
+
+.icon-gauge-counter::before {
+ content: "\e9ff";
+}
+
+.icon-gauge-rate::before {
+ content: "\ea00";
+}
+
+.icon-gauge-mon-reseau::before {
+ content: "\ea01";
+}
+
+.icon-generic-document::before {
+ content: "\ea02";
+}
+
+.icon-geolocation::before {
+ content: "\ea03";
+}
+
+.icon-hands-free::before {
+ content: "\ea04";
+}
+
+.icon-HDMI-Card::before {
+ content: "\ea05";
+}
+
+.icon-health::before {
+ content: "\ea06";
+}
+
+.icon-health-monitor::before {
+ content: "\ea07";
+}
+
+.icon-Health-patient::before {
+ content: "\ea08";
+}
+
+.icon-Heart-rate::before {
+ content: "\ea09";
+}
+
+.icon-Heartbeats::before {
+ content: "\ea0a";
+}
+
+.icon-help-guide::before {
+ content: "\ea0b";
+}
+
+.icon-history::before {
+ content: "\ea0c";
+}
+
+.icon-home::before {
+ content: "\ea0d";
+}
+
+.icon-Home-1::before {
+ content: "\ea0e";
+}
+
+.icon-home-alarm::before {
+ content: "\ea0f";
+}
+
+.icon-Homelive::before {
+ content: "\ea10";
+}
+
+.icon-homescreen::before {
+ content: "\ea11";
+}
+
+.icon-Horoscopes::before {
+ content: "\ea12";
+}
+
+.icon-hospital::before {
+ content: "\ea13";
+}
+
+.icon-hotel::before {
+ content: "\ea14";
+}
+
+.icon-Hourglass::before {
+ content: "\ea15";
+}
+
+.icon-Im-driving::before {
+ content: "\ea16";
+}
+
+.icon-image::before {
+ content: "\ea17";
+}
+
+.icon-image-file::before {
+ content: "\ea18";
+}
+
+.icon-improvement::before {
+ content: "\ea19";
+}
+
+.icon-inbox::before {
+ content: "\ea1a";
+}
+
+.icon-Incoming-call-curved-arrow::before {
+ content: "\ea1b";
+}
+
+.icon-Increase-test-size::before {
+ content: "\ea1c";
+}
+
+.icon-info::before {
+ content: "\ea1d";
+}
+
+.icon-Information-data::before {
+ content: "\ea1e";
+}
+
+.icon-internationaltv::before {
+ content: "\ea1f";
+}
+
+.icon-international-globe::before {
+ content: "\ea20";
+}
+
+.icon-internet::before {
+ content: "\ea21";
+}
+
+.icon-internet-browser::before {
+ content: "\ea22";
+}
+
+.icon-Internet-security-desktop::before {
+ content: "\ea23";
+}
+
+.icon-Internet-security-mobile::before {
+ content: "\ea24";
+}
+
+.icon-Internet-security-password::before {
+ content: "\ea25";
+}
+
+.icon-Internet-security-server::before {
+ content: "\ea26";
+}
+
+.icon-internet-usage::before {
+ content: "\ea27";
+}
+
+.icon-Interventions::before {
+ content: "\ea28";
+}
+
+.icon-IT-infrastructure::before {
+ content: "\ea29";
+}
+
+.icon-keeper::before {
+ content: "\ea2a";
+}
+
+.icon-keyboard::before {
+ content: "\ea2b";
+}
+
+.icon-Keypad::before {
+ content: "\ea2c";
+}
+
+.icon-La-Cle::before {
+ content: "\ea2d";
+}
+
+.icon-Language::before {
+ content: "\ea2e";
+}
+
+.icon-Latest::before {
+ content: "\ea2f";
+}
+
+.icon-Le-Bloc::before {
+ content: "\ea30";
+}
+
+.icon-Leave-session::before {
+ content: "\ea31";
+}
+
+.icon-lightbulb-sh::before {
+ content: "\ea32";
+}
+
+.icon-ligue-1::before {
+ content: "\ea33";
+}
+
+.icon-Link::before {
+ content: "\ea34";
+}
+
+.icon-live::before {
+ content: "\ea35";
+}
+
+.icon-livebox::before {
+ content: "\ea36";
+}
+
+.icon-livebox-info::before {
+ content: "\ea37";
+}
+
+.icon-livebox-phone::before {
+ content: "\ea38";
+}
+
+.icon-location-pin-compass::before {
+ content: "\ea39";
+}
+
+.icon-lock::before {
+ content: "\ea3a";
+}
+
+.icon-Lock-screen-settings::before {
+ content: "\ea3b";
+}
+
+.icon-logistics::before {
+ content: "\ea3c";
+}
+
+.icon-logout::before {
+ content: "\ea3d";
+}
+
+.icon-Maintenance-man::before {
+ content: "\ea3e";
+}
+
+.icon-manage-android::before {
+ content: "\ea3f";
+}
+
+.icon-managing-equipment::before {
+ content: "\ea40";
+}
+
+.icon-Map::before {
+ content: "\ea41";
+}
+
+.icon-map-pin::before {
+ content: "\ea42";
+}
+
+.icon-Medal::before {
+ content: "\ea43";
+}
+
+.icon-Medical-app::before {
+ content: "\ea44";
+}
+
+.icon-Medical-app-phone::before {
+ content: "\ea45";
+}
+
+.icon-medical-chart::before {
+ content: "\ea46";
+}
+
+.icon-Medical-files::before {
+ content: "\ea47";
+}
+
+.icon-menu::before {
+ content: "\ea48";
+}
+
+.icon-Message-download::before {
+ content: "\ea49";
+}
+
+.icon-messaging::before {
+ content: "\ea4a";
+}
+
+.icon-messaging-compose-sms::before {
+ content: "\ea4b";
+}
+
+.icon-messaging-unified::before {
+ content: "\ea4c";
+}
+
+.icon-messaging-untitled-compose::before {
+ content: "\ea4d";
+}
+
+.icon-microphone::before {
+ content: "\ea4e";
+}
+
+.icon-Microscope::before {
+ content: "\ea4f";
+}
+
+.icon-mini-games::before {
+ content: "\ea50";
+}
+
+.icon-mirroring::before {
+ content: "\ea51";
+}
+
+.icon-Missed-call-boxed-arrow::before {
+ content: "\ea52";
+}
+
+.icon-Missed-call-curved-arrow::before {
+ content: "\ea53";
+}
+
+.icon-mobile-applications::before {
+ content: "\ea54";
+}
+
+.icon-Mobile-backup-restore::before {
+ content: "\ea55";
+}
+
+.icon-mobile-box::before {
+ content: "\ea56";
+}
+
+.icon-mobile-data-toggle::before {
+ content: "\ea57";
+}
+
+.icon-mobile-insurance::before {
+ content: "\ea58";
+}
+
+.icon-mobile-network-coverage::before {
+ content: "\ea59";
+}
+
+.icon-mobile-security::before {
+ content: "\ea5a";
+}
+
+.icon-mobile-setup::before {
+ content: "\ea5b";
+}
+
+.icon-Modem::before {
+ content: "\ea5c";
+}
+
+.icon-modifier-add::before {
+ content: "\ea5d";
+}
+
+.icon-Modifier-delete::before {
+ content: "\ea5e";
+}
+
+.icon-Modifier-favorite::before {
+ content: "\ea5f";
+}
+
+.icon-modifier-new::before {
+ content: "\ea60";
+}
+
+.icon-modifier-no-access::before {
+ content: "\ea61";
+}
+
+.icon-modifier-synchro::before {
+ content: "\ea62";
+}
+
+.icon-modifier-upload::before {
+ content: "\ea63";
+}
+
+.icon-modifier-wizard::before {
+ content: "\ea64";
+}
+
+.icon-Modifier-download::before {
+ content: "\ea65";
+}
+
+.icon-mon-reseau::before {
+ content: "\ea66";
+}
+
+.icon-money::before {
+ content: "\ea67";
+}
+
+.icon-More-dots::before {
+ content: "\ea68";
+}
+
+.icon-move-to-folder::before {
+ content: "\ea69";
+}
+
+.icon-multi-sim::before {
+ content: "\ea6a";
+}
+
+.icon-multiple-timezone::before {
+ content: "\ea6b";
+}
+
+.icon-Music-artist::before {
+ content: "\ea6c";
+}
+
+.icon-music-file::before {
+ content: "\ea6d";
+}
+
+.icon-Music-genre::before {
+ content: "\ea6e";
+}
+
+.icon-music-player::before {
+ content: "\ea6f";
+}
+
+.icon-Mute-microphone::before {
+ content: "\ea70";
+}
+
+.icon-my-account::before {
+ content: "\ea71";
+}
+
+.icon-my-bill-uk::before {
+ content: "\ea72";
+}
+
+.icon-my-boutique::before {
+ content: "\ea73";
+}
+
+.icon-my-essential::before {
+ content: "\ea74";
+}
+
+.icon-my-essential-tablet::before {
+ content: "\ea75";
+}
+
+.icon-my-livebox::before {
+ content: "\ea76";
+}
+
+.icon-my-media::before {
+ content: "\ea77";
+}
+
+.icon-My-Office-Phone::before {
+ content: "\ea78";
+}
+
+.icon-my-orange::before {
+ content: "\ea79";
+}
+
+.icon-my-plug::before {
+ content: "\ea7a";
+}
+
+.icon-my-services::before {
+ content: "\ea7b";
+}
+
+.icon-my-travels::before {
+ content: "\ea7c";
+}
+
+.icon-Nature::before {
+ content: "\ea7d";
+}
+
+.icon-Network-add::before {
+ content: "\ea7e";
+}
+
+.icon-Network-livebox::before {
+ content: "\ea7f";
+}
+
+.icon-networks::before {
+ content: "\ea80";
+}
+
+.icon-new::before {
+ content: "\ea81";
+}
+
+.icon-newspaper::before {
+ content: "\ea82";
+}
+
+.icon-nfc::before {
+ content: "\ea83";
+}
+
+.icon-NFC-tag::before {
+ content: "\ea84";
+}
+
+.icon-no-sim::before {
+ content: "\ea85";
+}
+
+.icon-Notification::before {
+ content: "\ea86";
+}
+
+.icon-Notification-Bell::before {
+ content: "\ea87";
+}
+
+.icon-nouveau-contract-social::before {
+ content: "\ea88";
+}
+
+.icon-numero-unique::before {
+ content: "\ea89";
+}
+
+.icon-office::before {
+ content: "\ea8a";
+}
+
+.icon-oil-and-gas::before {
+ content: "\ea8b";
+}
+
+.icon-On-board-unit::before {
+ content: "\ea8c";
+}
+
+.icon-online-help::before {
+ content: "\ea8d";
+}
+
+.icon-orangewallet::before {
+ content: "\ea8e";
+}
+
+.icon-orange-assistant::before {
+ content: "\ea8f";
+}
+
+.icon-orange-cash::before {
+ content: "\ea90";
+}
+
+.icon-orange-corporate::before {
+ content: "\ea91";
+}
+
+.icon-Orange-Detente::before {
+ content: "\ea92";
+}
+
+.icon-orange-events::before {
+ content: "\ea93";
+}
+
+.icon-Orange-Experts-Class-Training::before {
+ content: "\ea94";
+}
+
+.icon-Orange-Experts-Copy-Keep::before {
+ content: "\ea95";
+}
+
+.icon-orange-experts-expert::before {
+ content: "\ea96";
+}
+
+.icon-orange-experts-insurance::before {
+ content: "\ea97";
+}
+
+.icon-Orange-Experts-One2One-Coach::before {
+ content: "\ea98";
+}
+
+.icon-orange-experts-orange-business-consultant::before {
+ content: "\ea99";
+}
+
+.icon-orange-experts-orange-startup-smartphone::before {
+ content: "\ea9a";
+}
+
+.icon-orange-experts-recycle::before {
+ content: "\ea9b";
+}
+
+.icon-orange-experts-repair::before {
+ content: "\ea9c";
+}
+
+.icon-orange-experts-tranquil::before {
+ content: "\ea9d";
+}
+
+.icon-Orange-Football-Club::before {
+ content: "\ea9e";
+}
+
+.icon-orange-foundation::before {
+ content: "\ea9f";
+}
+
+.icon-Orange-garden::before {
+ content: "\eaa0";
+}
+
+.icon-orange-gesture::before {
+ content: "\eaa1";
+}
+
+.icon-orange-jobs::before {
+ content: "\eaa2";
+}
+
+.icon-orange-messenger::before {
+ content: "\eaa3";
+}
+
+.icon-Orange-Messenger-1::before {
+ content: "\eaa4";
+}
+
+.icon-orange-money::before {
+ content: "\eaa5";
+}
+
+.icon-orange-Photography::before {
+ content: "\eaa6";
+}
+
+.icon-orange-pro::before {
+ content: "\eaa7";
+}
+
+.icon-orange-protect::before {
+ content: "\eaa8";
+}
+
+.icon-orange-radio::before {
+ content: "\eaa9";
+}
+
+.icon-orange-reflections::before {
+ content: "\eaaa";
+}
+
+.icon-Orange-rewards::before {
+ content: "\eaab";
+}
+
+.icon-Orange-security-suite::before {
+ content: "\eaac";
+}
+
+.icon-orange-travel::before {
+ content: "\eaad";
+}
+
+.icon-orange-tv::before {
+ content: "\eaae";
+}
+
+.icon-orange-wallet::before {
+ content: "\eaaf";
+}
+
+.icon-orange-wifi::before {
+ content: "\eab0";
+}
+
+.icon-Orange-Guest::before {
+ content: "\eab1";
+}
+
+.icon-organisation::before {
+ content: "\eab2";
+}
+
+.icon-outbox::before {
+ content: "\eab3";
+}
+
+.icon-outdoor-sports-mountain-biking::before {
+ content: "\eab4";
+}
+
+.icon-outdoor-sports-skiing::before {
+ content: "\eab5";
+}
+
+.icon-Package::before {
+ content: "\eab6";
+}
+
+.icon-Package-content::before {
+ content: "\eab7";
+}
+
+.icon-parabole-tv::before {
+ content: "\eab8";
+}
+
+.icon-parental-control::before {
+ content: "\eab9";
+}
+
+.icon-Parrasol::before {
+ content: "\eaba";
+}
+
+.icon-pass-video::before {
+ content: "\eabb";
+}
+
+.icon-Pause::before {
+ content: "\eabc";
+}
+
+.icon-Payment-euro::before {
+ content: "\eabd";
+}
+
+.icon-pda-device::before {
+ content: "\eabe";
+}
+
+.icon-pdf-file::before {
+ content: "\eabf";
+}
+
+.icon-Pencil::before {
+ content: "\eac0";
+}
+
+.icon-personal-smartphone-trainer::before {
+ content: "\eac1";
+}
+
+.icon-phone-advisor::before {
+ content: "\eac2";
+}
+
+.icon-phone-fund::before {
+ content: "\eac3";
+}
+
+.icon-phone-protection::before {
+ content: "\eac4";
+}
+
+.icon-Photo-dialer::before {
+ content: "\eac5";
+}
+
+.icon-picture-messaging::before {
+ content: "\eac6";
+}
+
+.icon-Pills::before {
+ content: "\eac7";
+}
+
+.icon-pioneering::before {
+ content: "\eac8";
+}
+
+.icon-Play::before {
+ content: "\eac9";
+}
+
+.icon-play-and-win::before {
+ content: "\eaca";
+}
+
+.icon-playmode-random::before {
+ content: "\eacb";
+}
+
+.icon-polls::before {
+ content: "\eacc";
+}
+
+.icon-portfolio::before {
+ content: "\eacd";
+}
+
+.icon-POS-payment::before {
+ content: "\eace";
+}
+
+.icon-power::before {
+ content: "\eacf";
+}
+
+.icon-powerpoint-file::before {
+ content: "\ead0";
+}
+
+.icon-presentation::before {
+ content: "\ead1";
+}
+
+.icon-previous::before {
+ content: "\ead2";
+}
+
+.icon-printer::before {
+ content: "\ead3";
+}
+
+.icon-profileringtone::before {
+ content: "\ead4";
+}
+
+.icon-public-transport::before {
+ content: "\ead5";
+}
+
+.icon-publish::before {
+ content: "\ead6";
+}
+
+.icon-Quirky-stories::before {
+ content: "\ead7";
+}
+
+.icon-Quiz::before {
+ content: "\ead8";
+}
+
+.icon-Radiography::before {
+ content: "\ead9";
+}
+
+.icon-ratings-stars::before {
+ content: "\eada";
+}
+
+.icon-Real-time::before {
+ content: "\eadb";
+}
+
+.icon-recommend::before {
+ content: "\eadc";
+}
+
+.icon-record::before {
+ content: "\eadd";
+}
+
+.icon-Record-1::before {
+ content: "\eade";
+}
+
+.icon-recycle-device::before {
+ content: "\eadf";
+}
+
+.icon-Redo::before {
+ content: "\eae0";
+}
+
+.icon-relationship::before {
+ content: "\eae1";
+}
+
+.icon-reload::before {
+ content: "\eae2";
+}
+
+.icon-remote-control::before {
+ content: "\eae3";
+}
+
+.icon-Remote-control-1::before {
+ content: "\eae4";
+}
+
+.icon-remove-modifier::before {
+ content: "\eae5";
+}
+
+.icon-Replay-boxed-arrow::before {
+ content: "\eae6";
+}
+
+.icon-Reply-boxed-arrow::before {
+ content: "\eae7";
+}
+
+.icon-Reply-curved-arrow::before {
+ content: "\eae8";
+}
+
+.icon-report::before {
+ content: "\eae9";
+}
+
+.icon-responsible::before {
+ content: "\eaea";
+}
+
+.icon-Restaurant::before {
+ content: "\eaeb";
+}
+
+.icon-restore-to-phone::before {
+ content: "\eaec";
+}
+
+.icon-Restrictied-content::before {
+ content: "\eaed";
+}
+
+.icon-rewards::before {
+ content: "\eaee";
+}
+
+.icon-ringtones::before {
+ content: "\eaef";
+}
+
+.icon-running::before {
+ content: "\eaf0";
+}
+
+.icon-Scales::before {
+ content: "\eaf1";
+}
+
+.icon-scan-ticket::before {
+ content: "\eaf2";
+}
+
+.icon-School::before {
+ content: "\eaf3";
+}
+
+.icon-Science::before {
+ content: "\eaf4";
+}
+
+.icon-Scissors::before {
+ content: "\eaf5";
+}
+
+.icon-sd-card::before {
+ content: "\eaf6";
+}
+
+.icon-SD-card-1::before {
+ content: "\eaf7";
+}
+
+.icon-search::before {
+ content: "\eaf8";
+}
+
+.icon-Send::before {
+ content: "\eaf9";
+}
+
+.icon-Send-to-person::before {
+ content: "\eafa";
+}
+
+.icon-Server::before {
+ content: "\eafb";
+}
+
+.icon-servers::before {
+ content: "\eafc";
+}
+
+.icon-settings::before {
+ content: "\eafd";
+}
+
+.icon-setup-and-repair::before {
+ content: "\eafe";
+}
+
+.icon-setup-and-repair-cog::before {
+ content: "\eaff";
+}
+
+.icon-setup-internet::before {
+ content: "\eb00";
+}
+
+.icon-share::before {
+ content: "\eb01";
+}
+
+.icon-Share-wifi::before {
+ content: "\eb02";
+}
+
+.icon-shipping::before {
+ content: "\eb03";
+}
+
+.icon-Shop::before {
+ content: "\eb04";
+}
+
+.icon-shop-pin::before {
+ content: "\eb05";
+}
+
+.icon-shop-subscriptions::before {
+ content: "\eb06";
+}
+
+.icon-Shopping::before {
+ content: "\eb07";
+}
+
+.icon-Show-front-back-camera::before {
+ content: "\eb08";
+}
+
+.icon-Shower::before {
+ content: "\eb09";
+}
+
+.icon-showroom-mobile-pro::before {
+ content: "\eb0a";
+}
+
+.icon-signal-1-5::before {
+ content: "\eb0b";
+}
+
+.icon-signal-2-5::before {
+ content: "\eb0c";
+}
+
+.icon-signal-3-5::before {
+ content: "\eb0d";
+}
+
+.icon-signal-4-5::before {
+ content: "\eb0e";
+}
+
+.icon-signal-5-5::before {
+ content: "\eb0f";
+}
+
+.icon-signal-boost::before {
+ content: "\eb10";
+}
+
+.icon-Silent::before {
+ content: "\eb11";
+}
+
+.icon-sim::before {
+ content: "\eb12";
+}
+
+.icon-simple-mode::before {
+ content: "\eb13";
+}
+
+.icon-Simplicity::before {
+ content: "\eb14";
+}
+
+.icon-Skip-backward::before {
+ content: "\eb15";
+}
+
+.icon-Skip-forward::before {
+ content: "\eb16";
+}
+
+.icon-Sleep::before {
+ content: "\eb17";
+}
+
+.icon-Smart-electric-meter::before {
+ content: "\eb18";
+}
+
+.icon-Smart-heating-switch::before {
+ content: "\eb19";
+}
+
+.icon-smart-home::before {
+ content: "\eb1a";
+}
+
+.icon-smart-lightswitch::before {
+ content: "\eb1b";
+}
+
+.icon-smart-powerstation::before {
+ content: "\eb1c";
+}
+
+.icon-Smart-Sensor::before {
+ content: "\eb1d";
+}
+
+.icon-smart-tap::before {
+ content: "\eb1e";
+}
+
+.icon-smart-watch::before {
+ content: "\eb1f";
+}
+
+.icon-social-network::before {
+ content: "\eb20";
+}
+
+.icon-software-update::before {
+ content: "\eb21";
+}
+
+.icon-Sport-channel::before {
+ content: "\eb22";
+}
+
+.icon-Start-services::before {
+ content: "\eb23";
+}
+
+.icon-startup-wizard::before {
+ content: "\eb24";
+}
+
+.icon-stocks::before {
+ content: "\eb25";
+}
+
+.icon-stop-secret::before {
+ content: "\eb26";
+}
+
+.icon-Stop-video::before {
+ content: "\eb27";
+}
+
+.icon-Storage-cloud::before {
+ content: "\eb28";
+}
+
+.icon-store-locator::before {
+ content: "\eb29";
+}
+
+.icon-Street::before {
+ content: "\eb2a";
+}
+
+.icon-Stretcher::before {
+ content: "\eb2b";
+}
+
+.icon-subscription-package::before {
+ content: "\eb2c";
+}
+
+.icon-Sudoku::before {
+ content: "\eb2d";
+}
+
+.icon-support::before {
+ content: "\eb2e";
+}
+
+.icon-surveillance-camera::before {
+ content: "\eb2f";
+}
+
+.icon-Syncronise::before {
+ content: "\eb30";
+}
+
+.icon-target-location::before {
+ content: "\eb31";
+}
+
+.icon-tarif::before {
+ content: "\eb32";
+}
+
+.icon-tariff::before {
+ content: "\eb33";
+}
+
+.icon-task-list::before {
+ content: "\eb34";
+}
+
+.icon-Taxi::before {
+ content: "\eb35";
+}
+
+.icon-team-connect::before {
+ content: "\eb36";
+}
+
+.icon-temperature::before {
+ content: "\eb37";
+}
+
+.icon-terms-conditions::before {
+ content: "\eb38";
+}
+
+.icon-text-alerts::before {
+ content: "\eb39";
+}
+
+.icon-Thumb-down::before {
+ content: "\eb3a";
+}
+
+.icon-Thumb-up::before {
+ content: "\eb3b";
+}
+
+.icon-tick::before {
+ content: "\eb3c";
+}
+
+.icon-tick-circle::before {
+ content: "\eb3d";
+}
+
+.icon-tickets::before {
+ content: "\eb3e";
+}
+
+.icon-Top-10::before {
+ content: "\eb3f";
+}
+
+.icon-top-up-dollar::before {
+ content: "\eb40";
+}
+
+.icon-top-up-euro::before {
+ content: "\eb41";
+}
+
+.icon-top-up-uk-bank::before {
+ content: "\eb42";
+}
+
+.icon-touch-screen::before {
+ content: "\eb43";
+}
+
+.icon-town::before {
+ content: "\eb44";
+}
+
+.icon-townhall::before {
+ content: "\eb45";
+}
+
+.icon-track-your-delivery::before {
+ content: "\eb46";
+}
+
+.icon-track-your-order::before {
+ content: "\eb47";
+}
+
+.icon-Trading::before {
+ content: "\eb48";
+}
+
+.icon-trash::before {
+ content: "\eb49";
+}
+
+.icon-tv-plus::before {
+ content: "\eb4a";
+}
+
+.icon-TV-series::before {
+ content: "\eb4b";
+}
+
+.icon-Undo::before {
+ content: "\eb4c";
+}
+
+.icon-unique::before {
+ content: "\eb4d";
+}
+
+.icon-unknown-file::before {
+ content: "\eb4e";
+}
+
+.icon-unlimited-calls::before {
+ content: "\eb4f";
+}
+
+.icon-unlocked::before {
+ content: "\eb50";
+}
+
+.icon-Unmissable::before {
+ content: "\eb51";
+}
+
+.icon-upload::before {
+ content: "\eb52";
+}
+
+.icon-USB::before {
+ content: "\eb53";
+}
+
+.icon-usb-key::before {
+ content: "\eb54";
+}
+
+.icon-Value::before {
+ content: "\eb55";
+}
+
+.icon-vehicle::before {
+ content: "\eb56";
+}
+
+.icon-video::before {
+ content: "\eb57";
+}
+
+.icon-video-file::before {
+ content: "\eb58";
+}
+
+.icon-video-phone::before {
+ content: "\eb59";
+}
+
+.icon-video-meeting2::before {
+ content: "\eb5a";
+}
+
+.icon-Vinyl::before {
+ content: "\eb5b";
+}
+
+.icon-vip-contact::before {
+ content: "\eb5c";
+}
+
+.icon-virtual-gamepad::before {
+ content: "\eb5d";
+}
+
+.icon-visual-voicemail::before {
+ content: "\eb5e";
+}
+
+.icon-vod-portrait::before {
+ content: "\eb5f";
+}
+
+.icon-volte::before {
+ content: "\eb60";
+}
+
+.icon-volume-high::before {
+ content: "\eb61";
+}
+
+.icon-volume-low::before {
+ content: "\eb62";
+}
+
+.icon-volume-mid::before {
+ content: "\eb63";
+}
+
+.icon-volume-none::before {
+ content: "\eb64";
+}
+
+.icon-vowifi::before {
+ content: "\eb65";
+}
+
+.icon-vvm-message-read-full::before {
+ content: "\eb66";
+}
+
+.icon-Warehouse::before {
+ content: "\eb67";
+}
+
+.icon-Warningimportant::before {
+ content: "\eb68";
+}
+
+.icon-Warning-important::before {
+ content: "\eb69";
+}
+
+.icon-web-cam::before {
+ content: "\eb6a";
+}
+
+.icon-web-fax-widget::before {
+ content: "\eb6b";
+}
+
+.icon-Wholesale-retail::before {
+ content: "\eb6c";
+}
+
+.icon-Widget::before {
+ content: "\eb6d";
+}
+
+.icon-widget-tour::before {
+ content: "\eb6e";
+}
+
+.icon-wifi::before {
+ content: "\eb6f";
+}
+
+.icon-wifi-0::before {
+ content: "\eb70";
+}
+
+.icon-wifi-1::before {
+ content: "\eb71";
+}
+
+.icon-wifi-2::before {
+ content: "\eb72";
+}
+
+.icon-wps-pairing::before {
+ content: "\eb73";
+}
+
+.icon-WPT::before {
+ content: "\eb74";
+}
+
+.icon-zoom-in::before {
+ content: "\eb75";
+}
+
+.icon-zoom-out::before {
+ content: "\eb76";
+}
+
+.icon-popout-tech::before {
+ content: "\e634";
+}
+
+.icon-frame-care::before {
+ content: "\e640";
+}
+
+.icon-frame-family::before {
+ content: "\e637";
+}
+
+.icon-frame-fun::before {
+ content: "\e638";
+}
+
+.icon-frame-home::before {
+ content: "\e639";
+}
+
+.icon-frame-money::before {
+ content: "\e63a";
+}
+
+.icon-frame-on-the-move::before {
+ content: "\e63b";
+}
+
+.icon-frame-tariff::before {
+ content: "\e63c";
+}
+
+.icon-frame-tech::before {
+ content: "\e63d";
+}
+
+.icon-frame-wellbeing::before {
+ content: "\e63e";
+}
+
+.icon-frame-work::before {
+ content: "\e63f";
+}
+
+.icon-popout-care::before {
+ content: "\e62d";
+}
+
+.icon-popout-family::before {
+ content: "\e62e";
+}
+
+.icon-popout-fun::before {
+ content: "\e62f";
+}
+
+.icon-popout-home::before {
+ content: "\e630";
+}
+
+.icon-popout-money::before {
+ content: "\e631";
+}
+
+.icon-popout-on-the-move::before {
+ content: "\e632";
+}
+
+.icon-popout-tariff::before {
+ content: "\e633";
+}
+
+.icon-popout-wellbeing::before {
+ content: "\e635";
+}
+
+.icon-popout-work::before {
+ content: "\e636";
+}
+
+.icon-frame-connectivity::before {
+ content: "\eb78";
+}
+
+.icon-frame-my-customers::before {
+ content: "\eb79";
+}
+
+.icon-frame-performance::before {
+ content: "\eb7a";
+}
+
+.icon-frame-security::before {
+ content: "\eb7b";
+}
+
+.icon-frame-teamwork::before {
+ content: "\eb7c";
+}
+
+.icon-popout-connectivity::before {
+ content: "\eb7d";
+}
+
+.icon-popout-my-customers::before {
+ content: "\eb7e";
+}
+
+.icon-popout-performance::before {
+ content: "\eb7f";
+}
+
+.icon-popout-security::before {
+ content: "\eb80";
+}
+
+.icon-popout-teamwork::before {
+ content: "\eb81";
+}
+
+.svg-delete,
+.svg-checkbox-tick,
+.svg-warning-circle,
+.svg-menu,
+.svg-tick,
+.svg-success,
+.svg-warning,
+.svg-info,
+.svg-error,
+.svg-arrow-previous,
+.svg-arrow-next,
+.svg-settings,
+.svg-search,
+.svg-avatar,
+.svg-buy {
+ position: relative;
+}
+
+.svg-delete::after,
+.svg-checkbox-tick::after,
+.svg-warning-circle::after,
+.svg-menu::after,
+.svg-tick::after,
+.svg-arrow-previous::after,
+.svg-arrow-next::after,
+.svg-settings::after,
+.svg-search::after,
+.svg-avatar::after,
+.svg-buy::after,
+.svg-success::after,
+.svg-warning::after,
+.svg-info::after,
+.svg-error::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 1.25rem;
+ height: 1.25rem;
+ content: "";
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.svg-delete::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-checkbox-tick::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-warning-circle::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='%23527edb'/%3E%3C/svg%3E");
+}
+
+.svg-menu::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-menu:hover::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.svg-tick::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='%2332c832'/%3E%3C/svg%3E");
+}
+
+.svg-success::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-warning::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='%23fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E");
+}
+
+.svg-error::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-info::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%23527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-previous::after {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-previous:hover::after,
+.svg-arrow-previous:focus::after,
+.svg-arrow-previous:active::after {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-next::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-next.btn-primary::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-arrow-next.btn-primary:active::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E");
+}
+
+.svg-settings::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-settings:hover::after,
+.svg-settings:focus::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23f16e00'/%3E%3C/svg%3E");
+}
+
+.svg-search::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-search:hover::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23f16e00'/%3E%3C/svg%3E");
+}
+
+.svg-avatar::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23fff'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-avatar:hover::after,
+.svg-avatar:active::after {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23f16e00'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23f16e00'/%3E%3C/svg%3E");
+}
+
+.svg-buy::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23fff'/%3E%3C/svg%3E");
+}
+
+.svg-buy:hover::after,
+.svg-buy:active::after {
+ background-image: url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23f16e00'/%3E%3C/svg%3E");
+}
+
+.btn-mail {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+.btn-mail:hover, .btn-mail:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-mail:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-mail {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E");
+ }
+}
+
+.btn-mail-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-mail-inverse:hover, .btn-mail-inverse:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-mail-inverse:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-mail-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-lin {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+.btn-lin:hover, .btn-lin:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E ");
+}
+
+.btn-lin:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-lin {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-lin-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-lin-inverse:hover, .btn-lin-inverse:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E ");
+}
+
+.btn-lin-inverse:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-lin-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-gplus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+.btn-gplus:hover, .btn-gplus:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-gplus:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-gplus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-gplus-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-gplus-inverse:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-gplus-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-tw {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+.btn-tw:hover, .btn-tw:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-tw:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-tw {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-tw-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-tw-inverse:hover, .btn-tw-inverse:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-tw-inverse:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-tw-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-fbk {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+.btn-fbk:hover, .btn-fbk:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-fbk:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-fbk {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A");
+ }
+}
+
+.btn-fbk-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A");
+}
+
+.btn-fbk-inverse:active {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A");
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .btn-fbk-inverse {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A");
+ }
+}
+/*# sourceMappingURL=orangeIcons.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/orangeIcons.css.map b/dashboard/public/css/orangeIcons.css.map
new file mode 100644
index 00000000..8602f2f6
--- /dev/null
+++ b/dashboard/public/css/orangeIcons.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/orangeIcons.scss","../../scss/_variables.scss","orangeIcons.css","../../scss/mixins/_orangeIcons.scss","../../scss/_functions.scss"],"names":[],"mappings":"AAUA;EACE,yBAAwB;EACxB,mBAAkB;EAClB,iBCiU+B;EDhU/B,oBAAmB;EACnB,wGAAyH;CET1H;;AFYD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAupBE,oCAAmC;EACnC,mBAAkB;EAClB,qBAAoB;EACpB,eAAc;EACd,qBAAoB;EACpB,YAAW;EAGX,oCAAmC;EACnC,mCAAkC;CACnC;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BE,eCzqBe;CD0qBhB;;AAGD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AACD;EACE,iBAAgB;CACjB;;AAID;;;;;;;;;;;;;;;EAeE,mBAAkB;CACnB;;AAED;;;;;;;;;;;;;;;EAeE,mBAAkB;EAClB,OAAM;EACN,QAAO;EACP,eAAc;EACd,gBAAe;EACf,YAAW;EACX,6BAA4B;EAC5B,uBAAsB;CACvB;;AAED;EGrsFI,+kCC0CuI;CDzCxI;;AHwsFH;EG7rFI,gOC8BuI;CD7BxI;;AHgsFH;EG3rFI,43FCwBuI;CDvBxI;;AH8rFH;EGzrFI,kqCCkBuI;CDjBxI;;AH4rFH;EG7rFI,kqCCkBuI;CDjBxI;;AHgsFH;EG3rFI,u1CCYuI;CDXxI;;AH8rFH;EG3pFI,2rBCxBuI;CDyBxI;;AH8pFH;EGzpFI,svBC9BuI;CD+BxI;;AH4pFH;EGvpFI,k2BCpCuI;CDqCxI;;AH0pFH;EGrpFI,kwBC1CuI;CD2CxI;;AHwpFH;EGvuFI,kLCoCuI;CDnCxI;;AH0uFH;;;EG3uFI,kLCoCuI;CDnCxI;;AHgvFH;EGntFI,4LCMuI;CDLxI;;AHstFH;EGvtFI,4LCMuI;CDLxI;;AH0tFH;EG3tFI,4LCMuI;CDLxI;;AH8tFH;EGztFI,ynGCAuI;CDCxI;;AH4tFH;;EG7tFI,4nGCAuI;CDCxI;;AHiuFH;EG5tFI,28CCNuI;CDOxI;;AH+tFH;EGhuFI,88CCNuI;CDOxI;;AHmuFH;EG9tFI,w2CCZuI;CDaxI;;AHiuFH;;EGluFI,82CCZuI;CDaxI;;AHsuFH;EGjuFI,8+HClBuI;CDmBxI;;AHouFH;;EGruFI,i/HClBuI;CDmBxI;;AHyuFH;EG7sFE,unCAAsnC;CH+sFvnC;;AAFD;EG1sFI,86BAA66B;CAC96B;;AHysFH;EGvsFI,q5BAAo5B;CACr5B;;AACD;EHqsFF;IGpsFI,q5BAAo5B;GHssFv5B;CEmpBA;;AFjpBD;EGnsFE,knCAAinC;CHqsFlnC;;AAFD;EGhsFI,86BAA66B;CAC96B;;AH+rFH;EG7rFI,k5BAAi5B;CACl5B;;AACD;EH2rFF;IG1rFI,k5BAAi5B;GH4rFp5B;CEiqBA;;AF/pBD;EGzrFE,gqCAA+pC;CH2rFhqC;;AAFD;EGtrFI,m9BAAk9B;CACn9B;;AHqrFH;EGnrFI,08BAAy8B;CAC18B;;AACD;EHirFF;IGhrFI,08BAAy8B;GHkrF58B;CE+qBA;;AF7qBD;EG/qFE,sqCAAqqC;CHirFtqC;;AAFD;EG5qFI,m9BAAk9B;CACn9B;;AH2qFH;EGzqFI,w8BAAu8B;CACx8B;;AACD;EHuqFF;IGtqFI,08BAAy8B;GHwqF58B;CE6rBA;;AF3rBD;EGrqFE,guCAA+tC;CHuqFhuC;;AAFD;EGlqFI,0hCAAyhC;CAC1hC;;AHiqFH;EG/pFI,ggCAA+/B;CAChgC;;AACD;EH6pFF;IG5pFI,ggCAA+/B;GH8pFlgC;CE2sBA;;AFzsBD;EG3pFE,2uCAA0uC;CH6pF3uC;;AAFD;EGxpFI,0hCAAyhC;CAC1hC;;AHupFH;EGrpFI,ogCAAmgC;CACpgC;;AACD;EHmpFF;IGlpFI,ogCAAmgC;GHopFtgC;CEytBA;;AFvtBD;EGjpFE,onDAAmnD;CHmpFpnD;;AAFD;EG9oFI,66CAA46C;CAC76C;;AH6oFH;EG3oFI,85CAA65C;CAC95C;;AACD;EHyoFF;IGxoFI,85CAA65C;GH0oFh6C;CEuuBA;;AFruBD;EGvoFE,wnDAAunD;CHyoFxnD;;AAFD;EGpoFI,66CAA46C;CAC76C;;AHmoFH;EGjoFI,85CAA65C;CAC95C;;AACD;EH+nFF;IG9nFI,85CAA65C;GHgoFh6C;CEqvBA;;AFnvBD;EG7nFE,q4BAAo4B;CH+nFr4B;;AAFD;EG1nFI,8rBAA6rB;CAC9rB;;AHynFH;EGvnFI,yqBAAwqB;CACzqB;;AACD;EHqnFF;IGpnFI,yqBAAwqB;GHsnF3qB;CEmwBA;;AFjwBD;EGnnFE,64BAA44B;CHqnF74B;;AAFD;EGhnFI,8rBAA6rB;CAC9rB;;AH+mFH;EG7mFI,uqBAAsqB;CACvqB;;AACD;EH2mFF;IG1mFI,uqBAAsqB;GH4mFzqB;CEixBA","file":"orangeIcons.css","sourcesContent":["// stylelint-disable selector-class-pattern\n// Orange Boosted with Bootstrap\n// Orange Icons\n// Copyright (C) 2016 Orange SA All rights reserved\n// See NOTICE.txt for more informations\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins/orangeIcons\";\n\n@font-face {\n font-family: icon-orange;\n font-style: normal;\n font-weight: $font-weight-normal;\n font-display: block;\n src: url(\"#{$icon-font-path}icon-orange.woff2\") format(\"woff2\"), url(\"#{$icon-font-path}icon-orange.woff\") format(\"woff\");\n}\n\n.icon-checkbox-tick,\n.icon-2for1cinematicket,\n.icon-3g,\n.icon-4g,\n.icon-4g-cam,\n.icon-4G-Cam--Live-80,\n.icon-4G-Cam-Camera-80,\n.icon-4G-Cam-Inbox80,\n.icon-4G-Cam-Outbox-80,\n.icon-4G-Cam-Rec-80,\n.icon-4g-plus,\n.icon-4G-Cam-Compact,\n.icon-1013-Reseau,\n.icon-about-event,\n.icon-Accessability,\n.icon-accessibility-cognition,\n.icon-accessibility-dexterity,\n.icon-accessibility-hearing,\n.icon-accessibility-mobility,\n.icon-accessibility-speech,\n.icon-accessibility-vision,\n.icon-accessory-headphones,\n.icon-accessory-shop,\n.icon-Add,\n.icon-add-more,\n.icon-Add-person,\n.icon-address-book,\n.icon-administrator,\n.icon-Adultcode,\n.icon-Adult,\n.icon-advertising,\n.icon-aeroplane,\n.icon-Age-rating-3,\n.icon-Age-rating-4,\n.icon-Age-rating-7,\n.icon-Age-rating-9,\n.icon-Age-rating-12,\n.icon-Age-rating-16,\n.icon-Age-rating-17,\n.icon-Age-rating-18,\n.icon-age-rating-mono-3,\n.icon-age-rating-mono-4,\n.icon-age-rating-mono-7,\n.icon-age-rating-mono-9,\n.icon-age-rating-mono-12,\n.icon-age-rating-mono-16,\n.icon-age-rating-mono-17,\n.icon-age-rating-mono-18,\n.icon-agriculture,\n.icon-airbox-auto,\n.icon-alarm-clock,\n.icon-alarm-off,\n.icon-Alias-numbers,\n.icon-all-channels,\n.icon-antenna,\n.icon-anti-spam,\n.icon-antivirus,\n.icon-Apartment-building,\n.icon-Apps,\n.icon-Apps-disabled,\n.icon-Archive,\n.icon-arrow-down,\n.icon-arrow-up,\n.icon-arrow-next,\n.icon-arrow-previous,\n.icon-Art,\n.icon-assistance,\n.icon-attachment,\n.icon-Auditorium,\n.icon-avatar,\n.icon-Baby,\n.icon-backup,\n.icon-banking,\n.icon-battery-1-bar,\n.icon-battery-2-bar,\n.icon-battery-charging,\n.icon-battery-empty,\n.icon-battery-full,\n.icon-battery-full-2,\n.icon-Betting,\n.icon-bill-euro,\n.icon-billboard,\n.icon-birthday,\n.icon-bluetooth,\n.icon-Book-award,\n.icon-book-download,\n.icon-bookmark,\n.icon-bookmark-smart,\n.icon-Boxes,\n.icon-broadcast,\n.icon-burst-mode,\n.icon-Business-everywhere,\n.icon-business-invoices,\n.icon-business-lounge,\n.icon-business-telephonie,\n.icon-buy,\n.icon-buy-back-euro,\n.icon-buzz,\n.icon-Calculator,\n.icon-calendaralarm,\n.icon-calendar-30,\n.icon-calendar-day,\n.icon-Calendar-fixtures-results,\n.icon-Calendar-football-match,\n.icon-calendar-month,\n.icon-calendar-week,\n.icon-call,\n.icon-call-forward,\n.icon-call-invite,\n.icon-call-log,\n.icon-camera,\n.icon-Car-park,\n.icon-Car-pooling,\n.icon-Casting,\n.icon-Categories,\n.icon-CD,\n.icon-change-wallpaper,\n.icon-Change-wallpaper-1,\n.icon-charger,\n.icon-check-your-balance,\n.icon-Child,\n.icon-child-protection,\n.icon-Children-channel,\n.icon-cineday-silhouette,\n.icon-clock,\n.icon-cloud-backup,\n.icon-Coat-hanger,\n.icon-Collective-class-training,\n.icon-Colour-Call,\n.icon-Comedy-channel,\n.icon-Comic,\n.icon-Comments,\n.icon-commercial-representitive,\n.icon-community-sms,\n.icon-Concierge-bell,\n.icon-conference-call,\n.icon-connected-object,\n.icon-connection,\n.icon-construction,\n.icon-contact-card,\n.icon-control-centre,\n.icon-control-mydata,\n.icon-copy,\n.icon-Courier,\n.icon-CPU,\n.icon-crane,\n.icon-Crop,\n.icon-Currency-brazilian-real,\n.icon-currency-converter,\n.icon-Currency-dollar,\n.icon-currency-euro,\n.icon-Currency-sterling,\n.icon-Currency-yen,\n.icon-data-protection,\n.icon-data-services,\n.icon-decoder,\n.icon-Decrease-test-size,\n.icon-Defibrillator,\n.icon-delete,\n.icon-device-desktop-computer,\n.icon-device-desktop-computer-connected,\n.icon-device-fixed-line-phone,\n.icon-device-laptop-computer,\n.icon-device-laptop-computer-connected,\n.icon-device-smart-phone,\n.icon-device-status,\n.icon-device-tablet,\n.icon-device-tablet-connected,\n.icon-device-tv,\n.icon-device-connected-printer,\n.icon-device-manager,\n.icon-device-managment-express,\n.icon-dialler,\n.icon-Digital-frame,\n.icon-disable-apps,\n.icon-Discovery-offer,\n.icon-Discussion-author,\n.icon-Discussion-more,\n.icon-Doctor,\n.icon-Doctors-bag,\n.icon-Doctors-communicating,\n.icon-Document-compose,\n.icon-document-stack,\n.icon-document-word,\n.icon-document-zip,\n.icon-Documentary,\n.icon-done-modifier,\n.icon-download,\n.icon-draft,\n.icon-dual-sim-packaging,\n.icon-easy-internet,\n.icon-ebook,\n.icon-Eco-mode,\n.icon-edashboard,\n.icon-edit-draft,\n.icon-edit-email,\n.icon-edit-image,\n.icon-Elderly-person,\n.icon-electric-car,\n.icon-electric-car-charging,\n.icon-electricity-provider,\n.icon-elevator,\n.icon-email,\n.icon-email-forwarded,\n.icon-Email-replied,\n.icon-emap,\n.icon-emergency-firemen,\n.icon-emergency-police,\n.icon-emergency-sos,\n.icon-emergency-service,\n.icon-employees-1,\n.icon-Empty-trash,\n.icon-End-call,\n.icon-Entertainment-channel,\n.icon-epg,\n.icon-erase,\n.icon-error-severe,\n.icon-Ethenet,\n.icon-event-agenda,\n.icon-event-organiser,\n.icon-event-speaker,\n.icon-Excel,\n.icon-Expand-screen,\n.icon-expert,\n.icon-external-drive,\n.icon-Factory,\n.icon-family-place,\n.icon-Fast-delivery,\n.icon-Favorite-music,\n.icon-favourite,\n.icon-Featured,\n.icon-filter,\n.icon-Filter-effects,\n.icon-finance,\n.icon-fire,\n.icon-Fire-extinguisher,\n.icon-Firewall,\n.icon-flexible-storage,\n.icon-folder-camera,\n.icon-folder-document,\n.icon-folder-favourite,\n.icon-folder-sd,\n.icon-football,\n.icon-Football-match,\n.icon-Football-quiz,\n.icon-Forward,\n.icon-Forward-curved-arrow,\n.icon-forward-the-number,\n.icon-free-tag,\n.icon-Free-up-space,\n.icon-front-end-dashboard,\n.icon-Full-screen-view,\n.icon-Gallery,\n.icon-games,\n.icon-Gas-tank,\n.icon-gaugecapacity,\n.icon-gauge-counter,\n.icon-gauge-rate,\n.icon-gauge-mon-reseau,\n.icon-generic-document,\n.icon-geolocation,\n.icon-hands-free,\n.icon-HDMI-Card,\n.icon-health,\n.icon-health-monitor,\n.icon-Health-patient,\n.icon-Heart-rate,\n.icon-Heartbeats,\n.icon-help-guide,\n.icon-history,\n.icon-home,\n.icon-Home-1,\n.icon-home-alarm,\n.icon-Homelive,\n.icon-homescreen,\n.icon-Horoscopes,\n.icon-hospital,\n.icon-hotel,\n.icon-Hourglass,\n.icon-Im-driving,\n.icon-image,\n.icon-image-file,\n.icon-improvement,\n.icon-inbox,\n.icon-Incoming-call-curved-arrow,\n.icon-Increase-test-size,\n.icon-info,\n.icon-Information-data,\n.icon-internationaltv,\n.icon-international-globe,\n.icon-internet,\n.icon-internet-browser,\n.icon-Internet-security-desktop,\n.icon-Internet-security-mobile,\n.icon-Internet-security-password,\n.icon-Internet-security-server,\n.icon-internet-usage,\n.icon-Interventions,\n.icon-IT-infrastructure,\n.icon-keeper,\n.icon-keyboard,\n.icon-Keypad,\n.icon-La-Cle,\n.icon-Language,\n.icon-Latest,\n.icon-Le-Bloc,\n.icon-Leave-session,\n.icon-lightbulb-sh,\n.icon-ligue-1,\n.icon-Link,\n.icon-live,\n.icon-livebox,\n.icon-livebox-info,\n.icon-livebox-phone,\n.icon-location-pin-compass,\n.icon-lock,\n.icon-Lock-screen-settings,\n.icon-logistics,\n.icon-logout,\n.icon-Maintenance-man,\n.icon-manage-android,\n.icon-managing-equipment,\n.icon-Map,\n.icon-map-pin,\n.icon-Medal,\n.icon-Medical-app,\n.icon-Medical-app-phone,\n.icon-medical-chart,\n.icon-Medical-files,\n.icon-menu,\n.icon-Message-download,\n.icon-messaging,\n.icon-messaging-compose-sms,\n.icon-messaging-unified,\n.icon-messaging-untitled-compose,\n.icon-microphone,\n.icon-Microscope,\n.icon-mini-games,\n.icon-mirroring,\n.icon-Missed-call-boxed-arrow,\n.icon-Missed-call-curved-arrow,\n.icon-mobile-applications,\n.icon-Mobile-backup-restore,\n.icon-mobile-box,\n.icon-mobile-data-toggle,\n.icon-mobile-insurance,\n.icon-mobile-network-coverage,\n.icon-mobile-security,\n.icon-mobile-setup,\n.icon-Modem,\n.icon-modifier-add,\n.icon-Modifier-delete,\n.icon-Modifier-favorite,\n.icon-modifier-new,\n.icon-modifier-no-access,\n.icon-modifier-synchro,\n.icon-modifier-upload,\n.icon-modifier-wizard,\n.icon-Modifier-download,\n.icon-mon-reseau,\n.icon-money,\n.icon-More-dots,\n.icon-move-to-folder,\n.icon-multi-sim,\n.icon-multiple-timezone,\n.icon-Music-artist,\n.icon-music-file,\n.icon-Music-genre,\n.icon-music-player,\n.icon-Mute-microphone,\n.icon-my-account,\n.icon-my-bill-uk,\n.icon-my-boutique,\n.icon-my-essential,\n.icon-my-essential-tablet,\n.icon-my-livebox,\n.icon-my-media,\n.icon-My-Office-Phone,\n.icon-my-orange,\n.icon-my-plug,\n.icon-my-services,\n.icon-my-travels,\n.icon-Nature,\n.icon-Network-add,\n.icon-Network-livebox,\n.icon-networks,\n.icon-new,\n.icon-newspaper,\n.icon-nfc,\n.icon-NFC-tag,\n.icon-no-sim,\n.icon-Notification,\n.icon-Notification-Bell,\n.icon-nouveau-contract-social,\n.icon-numero-unique,\n.icon-office,\n.icon-oil-and-gas,\n.icon-On-board-unit,\n.icon-online-help,\n.icon-orangewallet,\n.icon-orange-assistant,\n.icon-orange-cash,\n.icon-orange-corporate,\n.icon-Orange-Detente,\n.icon-orange-events,\n.icon-Orange-Experts-Class-Training,\n.icon-Orange-Experts-Copy-Keep,\n.icon-orange-experts-expert,\n.icon-orange-experts-insurance,\n.icon-Orange-Experts-One2One-Coach,\n.icon-orange-experts-orange-business-consultant,\n.icon-orange-experts-orange-startup-smartphone,\n.icon-orange-experts-recycle,\n.icon-orange-experts-repair,\n.icon-orange-experts-tranquil,\n.icon-Orange-Football-Club,\n.icon-orange-foundation,\n.icon-Orange-garden,\n.icon-orange-gesture,\n.icon-orange-jobs,\n.icon-orange-messenger,\n.icon-Orange-Messenger-1,\n.icon-orange-money,\n.icon-orange-Photography,\n.icon-orange-pro,\n.icon-orange-protect,\n.icon-orange-radio,\n.icon-orange-reflections,\n.icon-Orange-rewards,\n.icon-Orange-security-suite,\n.icon-orange-travel,\n.icon-orange-tv,\n.icon-orange-wallet,\n.icon-orange-wifi,\n.icon-Orange-Guest,\n.icon-organisation,\n.icon-outbox,\n.icon-outdoor-sports-mountain-biking,\n.icon-outdoor-sports-skiing,\n.icon-Package,\n.icon-Package-content,\n.icon-parabole-tv,\n.icon-parental-control,\n.icon-Parrasol,\n.icon-pass-video,\n.icon-Pause,\n.icon-Payment-euro,\n.icon-pda-device,\n.icon-pdf-file,\n.icon-Pencil,\n.icon-personal-smartphone-trainer,\n.icon-phone-advisor,\n.icon-phone-fund,\n.icon-phone-protection,\n.icon-Photo-dialer,\n.icon-picture-messaging,\n.icon-Pills,\n.icon-pioneering,\n.icon-Play,\n.icon-play-and-win,\n.icon-playmode-random,\n.icon-polls,\n.icon-portfolio,\n.icon-POS-payment,\n.icon-power,\n.icon-powerpoint-file,\n.icon-presentation,\n.icon-previous,\n.icon-printer,\n.icon-profileringtone,\n.icon-public-transport,\n.icon-publish,\n.icon-Quirky-stories,\n.icon-Quiz,\n.icon-Radiography,\n.icon-ratings-stars,\n.icon-Real-time,\n.icon-recommend,\n.icon-record,\n.icon-Record-1,\n.icon-recycle-device,\n.icon-Redo,\n.icon-relationship,\n.icon-reload,\n.icon-remote-control,\n.icon-Remote-control-1,\n.icon-remove-modifier,\n.icon-Replay-boxed-arrow,\n.icon-Reply-boxed-arrow,\n.icon-Reply-curved-arrow,\n.icon-report,\n.icon-responsible,\n.icon-Restaurant,\n.icon-restore-to-phone,\n.icon-Restrictied-content,\n.icon-rewards,\n.icon-ringtones,\n.icon-running,\n.icon-Scales,\n.icon-scan-ticket,\n.icon-School,\n.icon-Science,\n.icon-Scissors,\n.icon-sd-card,\n.icon-SD-card-1,\n.icon-search,\n.icon-Send,\n.icon-Send-to-person,\n.icon-Server,\n.icon-servers,\n.icon-settings,\n.icon-setup-and-repair,\n.icon-setup-and-repair-cog,\n.icon-setup-internet,\n.icon-share,\n.icon-Share-wifi,\n.icon-shipping,\n.icon-Shop,\n.icon-shop-pin,\n.icon-shop-subscriptions,\n.icon-Shopping,\n.icon-Show-front-back-camera,\n.icon-Shower,\n.icon-showroom-mobile-pro,\n.icon-signal-1-5,\n.icon-signal-2-5,\n.icon-signal-3-5,\n.icon-signal-4-5,\n.icon-signal-5-5,\n.icon-signal-boost,\n.icon-Silent,\n.icon-sim,\n.icon-simple-mode,\n.icon-Simplicity,\n.icon-Skip-backward,\n.icon-Skip-forward,\n.icon-Sleep,\n.icon-Smart-electric-meter,\n.icon-Smart-heating-switch,\n.icon-smart-home,\n.icon-smart-lightswitch,\n.icon-smart-powerstation,\n.icon-Smart-Sensor,\n.icon-smart-tap,\n.icon-smart-watch,\n.icon-social-network,\n.icon-software-update,\n.icon-Sport-channel,\n.icon-Start-services,\n.icon-startup-wizard,\n.icon-stocks,\n.icon-stop-secret,\n.icon-Stop-video,\n.icon-Storage-cloud,\n.icon-store-locator,\n.icon-Street,\n.icon-Stretcher,\n.icon-subscription-package,\n.icon-Sudoku,\n.icon-support,\n.icon-surveillance-camera,\n.icon-Syncronise,\n.icon-target-location,\n.icon-tarif,\n.icon-tariff,\n.icon-task-list,\n.icon-Taxi,\n.icon-team-connect,\n.icon-temperature,\n.icon-terms-conditions,\n.icon-text-alerts,\n.icon-Thumb-down,\n.icon-Thumb-up,\n.icon-tick,\n.icon-tick-circle,\n.icon-tickets,\n.icon-Top-10,\n.icon-top-up-dollar,\n.icon-top-up-euro,\n.icon-top-up-uk-bank,\n.icon-touch-screen,\n.icon-town,\n.icon-townhall,\n.icon-track-your-delivery,\n.icon-track-your-order,\n.icon-Trading,\n.icon-trash,\n.icon-tv-plus,\n.icon-TV-series,\n.icon-Undo,\n.icon-unique,\n.icon-unknown-file,\n.icon-unlimited-calls,\n.icon-unlocked,\n.icon-Unmissable,\n.icon-upload,\n.icon-USB,\n.icon-usb-key,\n.icon-Value,\n.icon-vehicle,\n.icon-video,\n.icon-video-file,\n.icon-video-phone,\n.icon-video-meeting2,\n.icon-Vinyl,\n.icon-vip-contact,\n.icon-virtual-gamepad,\n.icon-visual-voicemail,\n.icon-vod-portrait,\n.icon-volte,\n.icon-volume-high,\n.icon-volume-low,\n.icon-volume-mid,\n.icon-volume-none,\n.icon-vowifi,\n.icon-vvm-message-read-full,\n.icon-Warehouse,\n.icon-Warningimportant,\n.icon-Warning-important,\n.icon-web-cam,\n.icon-web-fax-widget,\n.icon-Wholesale-retail,\n.icon-Widget,\n.icon-widget-tour,\n.icon-wifi,\n.icon-wifi-0,\n.icon-wifi-1,\n.icon-wifi-2,\n.icon-wps-pairing,\n.icon-WPT,\n.icon-zoom-in,\n.icon-zoom-out,\n.icon-popout-tech,\n.icon-frame-care,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n // use !important to prevent issues with browser extensions that change fonts //\n font-family: icon-orange !important; // stylelint-disable-line declaration-no-important, font-family-no-missing-generic-family-keyword\n font-style: normal;\n font-variant: normal;\n line-height: 1;\n text-transform: none;\n speak: none;\n\n // Better Font Rendering =========== //\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-tech,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-frame-care,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n color: theme-color(\"primary\");\n}\n\n\n.icon-checkbox-tick::before {\n content: \"\\eb77\";\n}\n.icon-2for1cinematicket::before {\n content: \"\\e900\";\n}\n.icon-3g::before {\n content: \"\\e901\";\n}\n.icon-4g::before {\n content: \"\\e902\";\n}\n.icon-4g-cam::before {\n content: \"\\e903\";\n}\n.icon-4G-Cam--Live-80::before {\n content: \"\\e904\";\n}\n.icon-4G-Cam-Camera-80::before {\n content: \"\\e905\";\n}\n.icon-4G-Cam-Inbox80::before {\n content: \"\\e906\";\n}\n.icon-4G-Cam-Outbox-80::before {\n content: \"\\e907\";\n}\n.icon-4G-Cam-Rec-80::before {\n content: \"\\e908\";\n}\n.icon-4g-plus::before {\n content: \"\\e909\";\n}\n.icon-4G-Cam-Compact::before {\n content: \"\\e90a\";\n}\n.icon-1013-Reseau::before {\n content: \"\\e90b\";\n}\n.icon-about-event::before {\n content: \"\\e90c\";\n}\n.icon-Accessability::before {\n content: \"\\e90d\";\n}\n.icon-accessibility-cognition::before {\n content: \"\\e90e\";\n}\n.icon-accessibility-dexterity::before {\n content: \"\\e90f\";\n}\n.icon-accessibility-hearing::before {\n content: \"\\e910\";\n}\n.icon-accessibility-mobility::before {\n content: \"\\e911\";\n}\n.icon-accessibility-speech::before {\n content: \"\\e912\";\n}\n.icon-accessibility-vision::before {\n content: \"\\e913\";\n}\n.icon-accessory-headphones::before {\n content: \"\\e914\";\n}\n.icon-accessory-shop::before {\n content: \"\\e915\";\n}\n.icon-Add::before {\n content: \"\\e916\";\n}\n.icon-add-more::before {\n content: \"\\e917\";\n}\n.icon-Add-person::before {\n content: \"\\e918\";\n}\n.icon-address-book::before {\n content: \"\\e919\";\n}\n.icon-administrator::before {\n content: \"\\e91a\";\n}\n.icon-Adultcode::before {\n content: \"\\e91b\";\n}\n.icon-Adult::before {\n content: \"\\e91c\";\n}\n.icon-advertising::before {\n content: \"\\e91d\";\n}\n.icon-aeroplane::before {\n content: \"\\e91e\";\n}\n.icon-Age-rating-3::before {\n content: \"\\e91f\";\n}\n.icon-Age-rating-4::before {\n content: \"\\e920\";\n}\n.icon-Age-rating-7::before {\n content: \"\\e921\";\n}\n.icon-Age-rating-9::before {\n content: \"\\e922\";\n}\n.icon-Age-rating-12::before {\n content: \"\\e923\";\n}\n.icon-Age-rating-16::before {\n content: \"\\e924\";\n}\n.icon-Age-rating-17::before {\n content: \"\\e925\";\n}\n.icon-Age-rating-18::before {\n content: \"\\e926\";\n}\n.icon-age-rating-mono-3::before {\n content: \"\\e927\";\n}\n.icon-age-rating-mono-4::before {\n content: \"\\e928\";\n}\n.icon-age-rating-mono-7::before {\n content: \"\\e929\";\n}\n.icon-age-rating-mono-9::before {\n content: \"\\e92a\";\n}\n.icon-age-rating-mono-12::before {\n content: \"\\e92b\";\n}\n.icon-age-rating-mono-16::before {\n content: \"\\e92c\";\n}\n.icon-age-rating-mono-17::before {\n content: \"\\e92d\";\n}\n.icon-age-rating-mono-18::before {\n content: \"\\e92e\";\n}\n.icon-agriculture::before {\n content: \"\\e92f\";\n}\n.icon-airbox-auto::before {\n content: \"\\e930\";\n}\n.icon-alarm-clock::before {\n content: \"\\e931\";\n}\n.icon-alarm-off::before {\n content: \"\\e932\";\n}\n.icon-Alias-numbers::before {\n content: \"\\e933\";\n}\n.icon-all-channels::before {\n content: \"\\e934\";\n}\n.icon-antenna::before {\n content: \"\\e935\";\n}\n.icon-anti-spam::before {\n content: \"\\e936\";\n}\n.icon-antivirus::before {\n content: \"\\e937\";\n}\n.icon-Apartment-building::before {\n content: \"\\e938\";\n}\n.icon-Apps::before {\n content: \"\\e939\";\n}\n.icon-Apps-disabled::before {\n content: \"\\e93a\";\n}\n.icon-Archive::before {\n content: \"\\e93b\";\n}\n.icon-arrow-down::before {\n content: \"\\e93c\";\n}\n.icon-arrow-up::before {\n content: \"\\e93d\";\n}\n.icon-arrow-next::before {\n content: \"\\e93e\";\n}\n.icon-arrow-previous::before {\n content: \"\\e93f\";\n}\n.icon-Art::before {\n content: \"\\e940\";\n}\n.icon-assistance::before {\n content: \"\\e941\";\n}\n.icon-attachment::before {\n content: \"\\e942\";\n}\n.icon-Auditorium::before {\n content: \"\\e943\";\n}\n.icon-avatar::before {\n content: \"\\e944\";\n}\n.icon-Baby::before {\n content: \"\\e945\";\n}\n.icon-backup::before {\n content: \"\\e946\";\n}\n.icon-banking::before {\n content: \"\\e947\";\n}\n.icon-battery-1-bar::before {\n content: \"\\e948\";\n}\n.icon-battery-2-bar::before {\n content: \"\\e949\";\n}\n.icon-battery-charging::before {\n content: \"\\e94a\";\n}\n.icon-battery-empty::before {\n content: \"\\e94b\";\n}\n.icon-battery-full::before {\n content: \"\\e94c\";\n}\n.icon-battery-full-2::before {\n content: \"\\e94d\";\n}\n.icon-Betting::before {\n content: \"\\e94e\";\n}\n.icon-bill-euro::before {\n content: \"\\e94f\";\n}\n.icon-billboard::before {\n content: \"\\e950\";\n}\n.icon-birthday::before {\n content: \"\\e951\";\n}\n.icon-bluetooth::before {\n content: \"\\e952\";\n}\n.icon-Book-award::before {\n content: \"\\e953\";\n}\n.icon-book-download::before {\n content: \"\\e954\";\n}\n.icon-bookmark::before {\n content: \"\\e955\";\n}\n.icon-bookmark-smart::before {\n content: \"\\e956\";\n}\n.icon-Boxes::before {\n content: \"\\e957\";\n}\n.icon-broadcast::before {\n content: \"\\e958\";\n}\n.icon-burst-mode::before {\n content: \"\\e959\";\n}\n.icon-Business-everywhere::before {\n content: \"\\e95a\";\n}\n.icon-business-invoices::before {\n content: \"\\e95b\";\n}\n.icon-business-lounge::before {\n content: \"\\e95c\";\n}\n.icon-business-telephonie::before {\n content: \"\\e95d\";\n}\n.icon-buy::before {\n content: \"\\e95e\";\n}\n.icon-buy-back-euro::before {\n content: \"\\e95f\";\n}\n.icon-buzz::before {\n content: \"\\e960\";\n}\n.icon-Calculator::before {\n content: \"\\e961\";\n}\n.icon-calendaralarm::before {\n content: \"\\e962\";\n}\n.icon-calendar-30::before {\n content: \"\\e963\";\n}\n.icon-calendar-day::before {\n content: \"\\e964\";\n}\n.icon-Calendar-fixtures-results::before {\n content: \"\\e965\";\n}\n.icon-Calendar-football-match::before {\n content: \"\\e966\";\n}\n.icon-calendar-month::before {\n content: \"\\e967\";\n}\n.icon-calendar-week::before {\n content: \"\\e968\";\n}\n.icon-call::before {\n content: \"\\e969\";\n}\n.icon-call-forward::before {\n content: \"\\e96a\";\n}\n.icon-call-invite::before {\n content: \"\\e96b\";\n}\n.icon-call-log::before {\n content: \"\\e96c\";\n}\n.icon-camera::before {\n content: \"\\e96d\";\n}\n.icon-Car-park::before {\n content: \"\\e96e\";\n}\n.icon-Car-pooling::before {\n content: \"\\e96f\";\n}\n.icon-Casting::before {\n content: \"\\e970\";\n}\n.icon-Categories::before {\n content: \"\\e971\";\n}\n.icon-CD::before {\n content: \"\\e972\";\n}\n.icon-change-wallpaper::before {\n content: \"\\e973\";\n}\n.icon-Change-wallpaper-1::before {\n content: \"\\e974\";\n}\n.icon-charger::before {\n content: \"\\e975\";\n}\n.icon-check-your-balance::before {\n content: \"\\e976\";\n}\n.icon-Child::before {\n content: \"\\e977\";\n}\n.icon-child-protection::before {\n content: \"\\e978\";\n}\n.icon-Children-channel::before {\n content: \"\\e979\";\n}\n.icon-cineday-silhouette::before {\n content: \"\\e97a\";\n}\n.icon-clock::before {\n content: \"\\e97b\";\n}\n.icon-cloud-backup::before {\n content: \"\\e97c\";\n}\n.icon-Coat-hanger::before {\n content: \"\\e97d\";\n}\n.icon-Collective-class-training::before {\n content: \"\\e97e\";\n}\n.icon-Colour-Call::before {\n content: \"\\e97f\";\n}\n.icon-Comedy-channel::before {\n content: \"\\e980\";\n}\n.icon-Comic::before {\n content: \"\\e981\";\n}\n.icon-Comments::before {\n content: \"\\e982\";\n}\n.icon-commercial-representitive::before {\n content: \"\\e983\";\n}\n.icon-community-sms::before {\n content: \"\\e984\";\n}\n.icon-Concierge-bell::before {\n content: \"\\e985\";\n}\n.icon-conference-call::before {\n content: \"\\e986\";\n}\n.icon-connected-object::before {\n content: \"\\e987\";\n}\n.icon-connection::before {\n content: \"\\e988\";\n}\n.icon-construction::before {\n content: \"\\e989\";\n}\n.icon-contact-card::before {\n content: \"\\e98a\";\n}\n.icon-control-centre::before {\n content: \"\\e98b\";\n}\n.icon-control-mydata::before {\n content: \"\\e98c\";\n}\n.icon-copy::before {\n content: \"\\e98d\";\n}\n.icon-Courier::before {\n content: \"\\e98e\";\n}\n.icon-CPU::before {\n content: \"\\e98f\";\n}\n.icon-crane::before {\n content: \"\\e990\";\n}\n.icon-Crop::before {\n content: \"\\e991\";\n}\n.icon-Currency-brazilian-real::before {\n content: \"\\e992\";\n}\n.icon-currency-converter::before {\n content: \"\\e993\";\n}\n.icon-Currency-dollar::before {\n content: \"\\e994\";\n}\n.icon-currency-euro::before {\n content: \"\\e995\";\n}\n.icon-Currency-sterling::before {\n content: \"\\e996\";\n}\n.icon-Currency-yen::before {\n content: \"\\e997\";\n}\n.icon-data-protection::before {\n content: \"\\e998\";\n}\n.icon-data-services::before {\n content: \"\\e999\";\n}\n.icon-decoder::before {\n content: \"\\e99a\";\n}\n.icon-Decrease-test-size::before {\n content: \"\\e99b\";\n}\n.icon-Defibrillator::before {\n content: \"\\e99c\";\n}\n.icon-delete::before {\n content: \"\\e99d\";\n}\n.icon-device-desktop-computer::before {\n content: \"\\e99e\";\n}\n.icon-device-desktop-computer-connected::before {\n content: \"\\e99f\";\n}\n.icon-device-fixed-line-phone::before {\n content: \"\\e9a0\";\n}\n.icon-device-laptop-computer::before {\n content: \"\\e9a1\";\n}\n.icon-device-laptop-computer-connected::before {\n content: \"\\e9a2\";\n}\n.icon-device-smart-phone::before {\n content: \"\\e9a3\";\n}\n.icon-device-status::before {\n content: \"\\e9a4\";\n}\n.icon-device-tablet::before {\n content: \"\\e9a5\";\n}\n.icon-device-tablet-connected::before {\n content: \"\\e9a6\";\n}\n.icon-device-tv::before {\n content: \"\\e9a7\";\n}\n.icon-device-connected-printer::before {\n content: \"\\e9a8\";\n}\n.icon-device-manager::before {\n content: \"\\e9a9\";\n}\n.icon-device-managment-express::before {\n content: \"\\e9aa\";\n}\n.icon-dialler::before {\n content: \"\\e9ab\";\n}\n.icon-Digital-frame::before {\n content: \"\\e9ac\";\n}\n.icon-disable-apps::before {\n content: \"\\e9ad\";\n}\n.icon-Discovery-offer::before {\n content: \"\\e9ae\";\n}\n.icon-Discussion-author::before {\n content: \"\\e9af\";\n}\n.icon-Discussion-more::before {\n content: \"\\e9b0\";\n}\n.icon-Doctor::before {\n content: \"\\e9b1\";\n}\n.icon-Doctors-bag::before {\n content: \"\\e9b2\";\n}\n.icon-Doctors-communicating::before {\n content: \"\\e9b3\";\n}\n.icon-Document-compose::before {\n content: \"\\e9b4\";\n}\n.icon-document-stack::before {\n content: \"\\e9b5\";\n}\n.icon-document-word::before {\n content: \"\\e9b6\";\n}\n.icon-document-zip::before {\n content: \"\\e9b7\";\n}\n.icon-Documentary::before {\n content: \"\\e9b8\";\n}\n.icon-done-modifier::before {\n content: \"\\e9b9\";\n}\n.icon-download::before {\n content: \"\\e9ba\";\n}\n.icon-draft::before {\n content: \"\\e9bb\";\n}\n.icon-dual-sim-packaging::before {\n content: \"\\e9bc\";\n}\n.icon-easy-internet::before {\n content: \"\\e9bd\";\n}\n.icon-ebook::before {\n content: \"\\e9be\";\n}\n.icon-Eco-mode::before {\n content: \"\\e9bf\";\n}\n.icon-edashboard::before {\n content: \"\\e9c0\";\n}\n.icon-edit-draft::before {\n content: \"\\e9c1\";\n}\n.icon-edit-email::before {\n content: \"\\e9c2\";\n}\n.icon-edit-image::before {\n content: \"\\e9c3\";\n}\n.icon-Elderly-person::before {\n content: \"\\e9c4\";\n}\n.icon-electric-car::before {\n content: \"\\e9c5\";\n}\n.icon-electric-car-charging::before {\n content: \"\\e9c6\";\n}\n.icon-electricity-provider::before {\n content: \"\\e9c7\";\n}\n.icon-elevator::before {\n content: \"\\e9c8\";\n}\n.icon-email::before {\n content: \"\\e9c9\";\n}\n.icon-email-forwarded::before {\n content: \"\\e9ca\";\n}\n.icon-Email-replied::before {\n content: \"\\e9cb\";\n}\n.icon-emap::before {\n content: \"\\e9cc\";\n}\n.icon-emergency-firemen::before {\n content: \"\\e9cd\";\n}\n.icon-emergency-police::before {\n content: \"\\e9ce\";\n}\n.icon-emergency-sos::before {\n content: \"\\e9cf\";\n}\n.icon-emergency-service::before {\n content: \"\\e9d0\";\n}\n.icon-employees-1::before {\n content: \"\\e9d1\";\n}\n.icon-Empty-trash::before {\n content: \"\\e9d2\";\n}\n.icon-End-call::before {\n content: \"\\e9d3\";\n}\n.icon-Entertainment-channel::before {\n content: \"\\e9d4\";\n}\n.icon-epg::before {\n content: \"\\e9d5\";\n}\n.icon-erase::before {\n content: \"\\e9d6\";\n}\n.icon-error-severe::before {\n content: \"\\e9d7\";\n}\n.icon-Ethenet::before {\n content: \"\\e9d8\";\n}\n.icon-event-agenda::before {\n content: \"\\e9d9\";\n}\n.icon-event-organiser::before {\n content: \"\\e9da\";\n}\n.icon-event-speaker::before {\n content: \"\\e9db\";\n}\n.icon-Excel::before {\n content: \"\\e9dc\";\n}\n.icon-Expand-screen::before {\n content: \"\\e9dd\";\n}\n.icon-expert::before {\n content: \"\\e9de\";\n}\n.icon-external-drive::before {\n content: \"\\e9df\";\n}\n.icon-Factory::before {\n content: \"\\e9e0\";\n}\n.icon-family-place::before {\n content: \"\\e9e1\";\n}\n.icon-Fast-delivery::before {\n content: \"\\e9e2\";\n}\n.icon-Favorite-music::before {\n content: \"\\e9e3\";\n}\n.icon-favourite::before {\n content: \"\\e9e4\";\n}\n.icon-Featured::before {\n content: \"\\e9e5\";\n}\n.icon-filter::before {\n content: \"\\e9e6\";\n}\n.icon-Filter-effects::before {\n content: \"\\e9e7\";\n}\n.icon-finance::before {\n content: \"\\e9e8\";\n}\n.icon-fire::before {\n content: \"\\e9e9\";\n}\n.icon-Fire-extinguisher::before {\n content: \"\\e9ea\";\n}\n.icon-Firewall::before {\n content: \"\\e9eb\";\n}\n.icon-flexible-storage::before {\n content: \"\\e9ec\";\n}\n.icon-folder-camera::before {\n content: \"\\e9ed\";\n}\n.icon-folder-document::before {\n content: \"\\e9ee\";\n}\n.icon-folder-favourite::before {\n content: \"\\e9ef\";\n}\n.icon-folder-sd::before {\n content: \"\\e9f0\";\n}\n.icon-football::before {\n content: \"\\e9f1\";\n}\n.icon-Football-match::before {\n content: \"\\e9f2\";\n}\n.icon-Football-quiz::before {\n content: \"\\e9f3\";\n}\n.icon-Forward::before {\n content: \"\\e9f4\";\n}\n.icon-Forward-curved-arrow::before {\n content: \"\\e9f5\";\n}\n.icon-forward-the-number::before {\n content: \"\\e9f6\";\n}\n.icon-free-tag::before {\n content: \"\\e9f7\";\n}\n.icon-Free-up-space::before {\n content: \"\\e9f8\";\n}\n.icon-front-end-dashboard::before {\n content: \"\\e9f9\";\n}\n.icon-Full-screen-view::before {\n content: \"\\e9fa\";\n}\n.icon-Gallery::before {\n content: \"\\e9fb\";\n}\n.icon-games::before {\n content: \"\\e9fc\";\n}\n.icon-Gas-tank::before {\n content: \"\\e9fd\";\n}\n.icon-gaugecapacity::before {\n content: \"\\e9fe\";\n}\n.icon-gauge-counter::before {\n content: \"\\e9ff\";\n}\n.icon-gauge-rate::before {\n content: \"\\ea00\";\n}\n.icon-gauge-mon-reseau::before {\n content: \"\\ea01\";\n}\n.icon-generic-document::before {\n content: \"\\ea02\";\n}\n.icon-geolocation::before {\n content: \"\\ea03\";\n}\n.icon-hands-free::before {\n content: \"\\ea04\";\n}\n.icon-HDMI-Card::before {\n content: \"\\ea05\";\n}\n.icon-health::before {\n content: \"\\ea06\";\n}\n.icon-health-monitor::before {\n content: \"\\ea07\";\n}\n.icon-Health-patient::before {\n content: \"\\ea08\";\n}\n.icon-Heart-rate::before {\n content: \"\\ea09\";\n}\n.icon-Heartbeats::before {\n content: \"\\ea0a\";\n}\n.icon-help-guide::before {\n content: \"\\ea0b\";\n}\n.icon-history::before {\n content: \"\\ea0c\";\n}\n.icon-home::before {\n content: \"\\ea0d\";\n}\n.icon-Home-1::before {\n content: \"\\ea0e\";\n}\n.icon-home-alarm::before {\n content: \"\\ea0f\";\n}\n.icon-Homelive::before {\n content: \"\\ea10\";\n}\n.icon-homescreen::before {\n content: \"\\ea11\";\n}\n.icon-Horoscopes::before {\n content: \"\\ea12\";\n}\n.icon-hospital::before {\n content: \"\\ea13\";\n}\n.icon-hotel::before {\n content: \"\\ea14\";\n}\n.icon-Hourglass::before {\n content: \"\\ea15\";\n}\n.icon-Im-driving::before {\n content: \"\\ea16\";\n}\n.icon-image::before {\n content: \"\\ea17\";\n}\n.icon-image-file::before {\n content: \"\\ea18\";\n}\n.icon-improvement::before {\n content: \"\\ea19\";\n}\n.icon-inbox::before {\n content: \"\\ea1a\";\n}\n.icon-Incoming-call-curved-arrow::before {\n content: \"\\ea1b\";\n}\n.icon-Increase-test-size::before {\n content: \"\\ea1c\";\n}\n.icon-info::before {\n content: \"\\ea1d\";\n}\n.icon-Information-data::before {\n content: \"\\ea1e\";\n}\n.icon-internationaltv::before {\n content: \"\\ea1f\";\n}\n.icon-international-globe::before {\n content: \"\\ea20\";\n}\n.icon-internet::before {\n content: \"\\ea21\";\n}\n.icon-internet-browser::before {\n content: \"\\ea22\";\n}\n.icon-Internet-security-desktop::before {\n content: \"\\ea23\";\n}\n.icon-Internet-security-mobile::before {\n content: \"\\ea24\";\n}\n.icon-Internet-security-password::before {\n content: \"\\ea25\";\n}\n.icon-Internet-security-server::before {\n content: \"\\ea26\";\n}\n.icon-internet-usage::before {\n content: \"\\ea27\";\n}\n.icon-Interventions::before {\n content: \"\\ea28\";\n}\n.icon-IT-infrastructure::before {\n content: \"\\ea29\";\n}\n.icon-keeper::before {\n content: \"\\ea2a\";\n}\n.icon-keyboard::before {\n content: \"\\ea2b\";\n}\n.icon-Keypad::before {\n content: \"\\ea2c\";\n}\n.icon-La-Cle::before {\n content: \"\\ea2d\";\n}\n.icon-Language::before {\n content: \"\\ea2e\";\n}\n.icon-Latest::before {\n content: \"\\ea2f\";\n}\n.icon-Le-Bloc::before {\n content: \"\\ea30\";\n}\n.icon-Leave-session::before {\n content: \"\\ea31\";\n}\n.icon-lightbulb-sh::before {\n content: \"\\ea32\";\n}\n.icon-ligue-1::before {\n content: \"\\ea33\";\n}\n.icon-Link::before {\n content: \"\\ea34\";\n}\n.icon-live::before {\n content: \"\\ea35\";\n}\n.icon-livebox::before {\n content: \"\\ea36\";\n}\n.icon-livebox-info::before {\n content: \"\\ea37\";\n}\n.icon-livebox-phone::before {\n content: \"\\ea38\";\n}\n.icon-location-pin-compass::before {\n content: \"\\ea39\";\n}\n.icon-lock::before {\n content: \"\\ea3a\";\n}\n.icon-Lock-screen-settings::before {\n content: \"\\ea3b\";\n}\n.icon-logistics::before {\n content: \"\\ea3c\";\n}\n.icon-logout::before {\n content: \"\\ea3d\";\n}\n.icon-Maintenance-man::before {\n content: \"\\ea3e\";\n}\n.icon-manage-android::before {\n content: \"\\ea3f\";\n}\n.icon-managing-equipment::before {\n content: \"\\ea40\";\n}\n.icon-Map::before {\n content: \"\\ea41\";\n}\n.icon-map-pin::before {\n content: \"\\ea42\";\n}\n.icon-Medal::before {\n content: \"\\ea43\";\n}\n.icon-Medical-app::before {\n content: \"\\ea44\";\n}\n.icon-Medical-app-phone::before {\n content: \"\\ea45\";\n}\n.icon-medical-chart::before {\n content: \"\\ea46\";\n}\n.icon-Medical-files::before {\n content: \"\\ea47\";\n}\n.icon-menu::before {\n content: \"\\ea48\";\n}\n.icon-Message-download::before {\n content: \"\\ea49\";\n}\n.icon-messaging::before {\n content: \"\\ea4a\";\n}\n.icon-messaging-compose-sms::before {\n content: \"\\ea4b\";\n}\n.icon-messaging-unified::before {\n content: \"\\ea4c\";\n}\n.icon-messaging-untitled-compose::before {\n content: \"\\ea4d\";\n}\n.icon-microphone::before {\n content: \"\\ea4e\";\n}\n.icon-Microscope::before {\n content: \"\\ea4f\";\n}\n.icon-mini-games::before {\n content: \"\\ea50\";\n}\n.icon-mirroring::before {\n content: \"\\ea51\";\n}\n.icon-Missed-call-boxed-arrow::before {\n content: \"\\ea52\";\n}\n.icon-Missed-call-curved-arrow::before {\n content: \"\\ea53\";\n}\n.icon-mobile-applications::before {\n content: \"\\ea54\";\n}\n.icon-Mobile-backup-restore::before {\n content: \"\\ea55\";\n}\n.icon-mobile-box::before {\n content: \"\\ea56\";\n}\n.icon-mobile-data-toggle::before {\n content: \"\\ea57\";\n}\n.icon-mobile-insurance::before {\n content: \"\\ea58\";\n}\n.icon-mobile-network-coverage::before {\n content: \"\\ea59\";\n}\n.icon-mobile-security::before {\n content: \"\\ea5a\";\n}\n.icon-mobile-setup::before {\n content: \"\\ea5b\";\n}\n.icon-Modem::before {\n content: \"\\ea5c\";\n}\n.icon-modifier-add::before {\n content: \"\\ea5d\";\n}\n.icon-Modifier-delete::before {\n content: \"\\ea5e\";\n}\n.icon-Modifier-favorite::before {\n content: \"\\ea5f\";\n}\n.icon-modifier-new::before {\n content: \"\\ea60\";\n}\n.icon-modifier-no-access::before {\n content: \"\\ea61\";\n}\n.icon-modifier-synchro::before {\n content: \"\\ea62\";\n}\n.icon-modifier-upload::before {\n content: \"\\ea63\";\n}\n.icon-modifier-wizard::before {\n content: \"\\ea64\";\n}\n.icon-Modifier-download::before {\n content: \"\\ea65\";\n}\n.icon-mon-reseau::before {\n content: \"\\ea66\";\n}\n.icon-money::before {\n content: \"\\ea67\";\n}\n.icon-More-dots::before {\n content: \"\\ea68\";\n}\n.icon-move-to-folder::before {\n content: \"\\ea69\";\n}\n.icon-multi-sim::before {\n content: \"\\ea6a\";\n}\n.icon-multiple-timezone::before {\n content: \"\\ea6b\";\n}\n.icon-Music-artist::before {\n content: \"\\ea6c\";\n}\n.icon-music-file::before {\n content: \"\\ea6d\";\n}\n.icon-Music-genre::before {\n content: \"\\ea6e\";\n}\n.icon-music-player::before {\n content: \"\\ea6f\";\n}\n.icon-Mute-microphone::before {\n content: \"\\ea70\";\n}\n.icon-my-account::before {\n content: \"\\ea71\";\n}\n.icon-my-bill-uk::before {\n content: \"\\ea72\";\n}\n.icon-my-boutique::before {\n content: \"\\ea73\";\n}\n.icon-my-essential::before {\n content: \"\\ea74\";\n}\n.icon-my-essential-tablet::before {\n content: \"\\ea75\";\n}\n.icon-my-livebox::before {\n content: \"\\ea76\";\n}\n.icon-my-media::before {\n content: \"\\ea77\";\n}\n.icon-My-Office-Phone::before {\n content: \"\\ea78\";\n}\n.icon-my-orange::before {\n content: \"\\ea79\";\n}\n.icon-my-plug::before {\n content: \"\\ea7a\";\n}\n.icon-my-services::before {\n content: \"\\ea7b\";\n}\n.icon-my-travels::before {\n content: \"\\ea7c\";\n}\n.icon-Nature::before {\n content: \"\\ea7d\";\n}\n.icon-Network-add::before {\n content: \"\\ea7e\";\n}\n.icon-Network-livebox::before {\n content: \"\\ea7f\";\n}\n.icon-networks::before {\n content: \"\\ea80\";\n}\n.icon-new::before {\n content: \"\\ea81\";\n}\n.icon-newspaper::before {\n content: \"\\ea82\";\n}\n.icon-nfc::before {\n content: \"\\ea83\";\n}\n.icon-NFC-tag::before {\n content: \"\\ea84\";\n}\n.icon-no-sim::before {\n content: \"\\ea85\";\n}\n.icon-Notification::before {\n content: \"\\ea86\";\n}\n.icon-Notification-Bell::before {\n content: \"\\ea87\";\n}\n.icon-nouveau-contract-social::before {\n content: \"\\ea88\";\n}\n.icon-numero-unique::before {\n content: \"\\ea89\";\n}\n.icon-office::before {\n content: \"\\ea8a\";\n}\n.icon-oil-and-gas::before {\n content: \"\\ea8b\";\n}\n.icon-On-board-unit::before {\n content: \"\\ea8c\";\n}\n.icon-online-help::before {\n content: \"\\ea8d\";\n}\n.icon-orangewallet::before {\n content: \"\\ea8e\";\n}\n.icon-orange-assistant::before {\n content: \"\\ea8f\";\n}\n.icon-orange-cash::before {\n content: \"\\ea90\";\n}\n.icon-orange-corporate::before {\n content: \"\\ea91\";\n}\n.icon-Orange-Detente::before {\n content: \"\\ea92\";\n}\n.icon-orange-events::before {\n content: \"\\ea93\";\n}\n.icon-Orange-Experts-Class-Training::before {\n content: \"\\ea94\";\n}\n.icon-Orange-Experts-Copy-Keep::before {\n content: \"\\ea95\";\n}\n.icon-orange-experts-expert::before {\n content: \"\\ea96\";\n}\n.icon-orange-experts-insurance::before {\n content: \"\\ea97\";\n}\n.icon-Orange-Experts-One2One-Coach::before {\n content: \"\\ea98\";\n}\n.icon-orange-experts-orange-business-consultant::before {\n content: \"\\ea99\";\n}\n.icon-orange-experts-orange-startup-smartphone::before {\n content: \"\\ea9a\";\n}\n.icon-orange-experts-recycle::before {\n content: \"\\ea9b\";\n}\n.icon-orange-experts-repair::before {\n content: \"\\ea9c\";\n}\n.icon-orange-experts-tranquil::before {\n content: \"\\ea9d\";\n}\n.icon-Orange-Football-Club::before {\n content: \"\\ea9e\";\n}\n.icon-orange-foundation::before {\n content: \"\\ea9f\";\n}\n.icon-Orange-garden::before {\n content: \"\\eaa0\";\n}\n.icon-orange-gesture::before {\n content: \"\\eaa1\";\n}\n.icon-orange-jobs::before {\n content: \"\\eaa2\";\n}\n.icon-orange-messenger::before {\n content: \"\\eaa3\";\n}\n.icon-Orange-Messenger-1::before {\n content: \"\\eaa4\";\n}\n.icon-orange-money::before {\n content: \"\\eaa5\";\n}\n.icon-orange-Photography::before {\n content: \"\\eaa6\";\n}\n.icon-orange-pro::before {\n content: \"\\eaa7\";\n}\n.icon-orange-protect::before {\n content: \"\\eaa8\";\n}\n.icon-orange-radio::before {\n content: \"\\eaa9\";\n}\n.icon-orange-reflections::before {\n content: \"\\eaaa\";\n}\n.icon-Orange-rewards::before {\n content: \"\\eaab\";\n}\n.icon-Orange-security-suite::before {\n content: \"\\eaac\";\n}\n.icon-orange-travel::before {\n content: \"\\eaad\";\n}\n.icon-orange-tv::before {\n content: \"\\eaae\";\n}\n.icon-orange-wallet::before {\n content: \"\\eaaf\";\n}\n.icon-orange-wifi::before {\n content: \"\\eab0\";\n}\n.icon-Orange-Guest::before {\n content: \"\\eab1\";\n}\n.icon-organisation::before {\n content: \"\\eab2\";\n}\n.icon-outbox::before {\n content: \"\\eab3\";\n}\n.icon-outdoor-sports-mountain-biking::before {\n content: \"\\eab4\";\n}\n.icon-outdoor-sports-skiing::before {\n content: \"\\eab5\";\n}\n.icon-Package::before {\n content: \"\\eab6\";\n}\n.icon-Package-content::before {\n content: \"\\eab7\";\n}\n.icon-parabole-tv::before {\n content: \"\\eab8\";\n}\n.icon-parental-control::before {\n content: \"\\eab9\";\n}\n.icon-Parrasol::before {\n content: \"\\eaba\";\n}\n.icon-pass-video::before {\n content: \"\\eabb\";\n}\n.icon-Pause::before {\n content: \"\\eabc\";\n}\n.icon-Payment-euro::before {\n content: \"\\eabd\";\n}\n.icon-pda-device::before {\n content: \"\\eabe\";\n}\n.icon-pdf-file::before {\n content: \"\\eabf\";\n}\n.icon-Pencil::before {\n content: \"\\eac0\";\n}\n.icon-personal-smartphone-trainer::before {\n content: \"\\eac1\";\n}\n.icon-phone-advisor::before {\n content: \"\\eac2\";\n}\n.icon-phone-fund::before {\n content: \"\\eac3\";\n}\n.icon-phone-protection::before {\n content: \"\\eac4\";\n}\n.icon-Photo-dialer::before {\n content: \"\\eac5\";\n}\n.icon-picture-messaging::before {\n content: \"\\eac6\";\n}\n.icon-Pills::before {\n content: \"\\eac7\";\n}\n.icon-pioneering::before {\n content: \"\\eac8\";\n}\n.icon-Play::before {\n content: \"\\eac9\";\n}\n.icon-play-and-win::before {\n content: \"\\eaca\";\n}\n.icon-playmode-random::before {\n content: \"\\eacb\";\n}\n.icon-polls::before {\n content: \"\\eacc\";\n}\n.icon-portfolio::before {\n content: \"\\eacd\";\n}\n.icon-POS-payment::before {\n content: \"\\eace\";\n}\n.icon-power::before {\n content: \"\\eacf\";\n}\n.icon-powerpoint-file::before {\n content: \"\\ead0\";\n}\n.icon-presentation::before {\n content: \"\\ead1\";\n}\n.icon-previous::before {\n content: \"\\ead2\";\n}\n.icon-printer::before {\n content: \"\\ead3\";\n}\n.icon-profileringtone::before {\n content: \"\\ead4\";\n}\n.icon-public-transport::before {\n content: \"\\ead5\";\n}\n.icon-publish::before {\n content: \"\\ead6\";\n}\n.icon-Quirky-stories::before {\n content: \"\\ead7\";\n}\n.icon-Quiz::before {\n content: \"\\ead8\";\n}\n.icon-Radiography::before {\n content: \"\\ead9\";\n}\n.icon-ratings-stars::before {\n content: \"\\eada\";\n}\n.icon-Real-time::before {\n content: \"\\eadb\";\n}\n.icon-recommend::before {\n content: \"\\eadc\";\n}\n.icon-record::before {\n content: \"\\eadd\";\n}\n.icon-Record-1::before {\n content: \"\\eade\";\n}\n.icon-recycle-device::before {\n content: \"\\eadf\";\n}\n.icon-Redo::before {\n content: \"\\eae0\";\n}\n.icon-relationship::before {\n content: \"\\eae1\";\n}\n.icon-reload::before {\n content: \"\\eae2\";\n}\n.icon-remote-control::before {\n content: \"\\eae3\";\n}\n.icon-Remote-control-1::before {\n content: \"\\eae4\";\n}\n.icon-remove-modifier::before {\n content: \"\\eae5\";\n}\n.icon-Replay-boxed-arrow::before {\n content: \"\\eae6\";\n}\n.icon-Reply-boxed-arrow::before {\n content: \"\\eae7\";\n}\n.icon-Reply-curved-arrow::before {\n content: \"\\eae8\";\n}\n.icon-report::before {\n content: \"\\eae9\";\n}\n.icon-responsible::before {\n content: \"\\eaea\";\n}\n.icon-Restaurant::before {\n content: \"\\eaeb\";\n}\n.icon-restore-to-phone::before {\n content: \"\\eaec\";\n}\n.icon-Restrictied-content::before {\n content: \"\\eaed\";\n}\n.icon-rewards::before {\n content: \"\\eaee\";\n}\n.icon-ringtones::before {\n content: \"\\eaef\";\n}\n.icon-running::before {\n content: \"\\eaf0\";\n}\n.icon-Scales::before {\n content: \"\\eaf1\";\n}\n.icon-scan-ticket::before {\n content: \"\\eaf2\";\n}\n.icon-School::before {\n content: \"\\eaf3\";\n}\n.icon-Science::before {\n content: \"\\eaf4\";\n}\n.icon-Scissors::before {\n content: \"\\eaf5\";\n}\n.icon-sd-card::before {\n content: \"\\eaf6\";\n}\n.icon-SD-card-1::before {\n content: \"\\eaf7\";\n}\n.icon-search::before {\n content: \"\\eaf8\";\n}\n.icon-Send::before {\n content: \"\\eaf9\";\n}\n.icon-Send-to-person::before {\n content: \"\\eafa\";\n}\n.icon-Server::before {\n content: \"\\eafb\";\n}\n.icon-servers::before {\n content: \"\\eafc\";\n}\n.icon-settings::before {\n content: \"\\eafd\";\n}\n.icon-setup-and-repair::before {\n content: \"\\eafe\";\n}\n.icon-setup-and-repair-cog::before {\n content: \"\\eaff\";\n}\n.icon-setup-internet::before {\n content: \"\\eb00\";\n}\n.icon-share::before {\n content: \"\\eb01\";\n}\n.icon-Share-wifi::before {\n content: \"\\eb02\";\n}\n.icon-shipping::before {\n content: \"\\eb03\";\n}\n.icon-Shop::before {\n content: \"\\eb04\";\n}\n.icon-shop-pin::before {\n content: \"\\eb05\";\n}\n.icon-shop-subscriptions::before {\n content: \"\\eb06\";\n}\n.icon-Shopping::before {\n content: \"\\eb07\";\n}\n.icon-Show-front-back-camera::before {\n content: \"\\eb08\";\n}\n.icon-Shower::before {\n content: \"\\eb09\";\n}\n.icon-showroom-mobile-pro::before {\n content: \"\\eb0a\";\n}\n.icon-signal-1-5::before {\n content: \"\\eb0b\";\n}\n.icon-signal-2-5::before {\n content: \"\\eb0c\";\n}\n.icon-signal-3-5::before {\n content: \"\\eb0d\";\n}\n.icon-signal-4-5::before {\n content: \"\\eb0e\";\n}\n.icon-signal-5-5::before {\n content: \"\\eb0f\";\n}\n.icon-signal-boost::before {\n content: \"\\eb10\";\n}\n.icon-Silent::before {\n content: \"\\eb11\";\n}\n.icon-sim::before {\n content: \"\\eb12\";\n}\n.icon-simple-mode::before {\n content: \"\\eb13\";\n}\n.icon-Simplicity::before {\n content: \"\\eb14\";\n}\n.icon-Skip-backward::before {\n content: \"\\eb15\";\n}\n.icon-Skip-forward::before {\n content: \"\\eb16\";\n}\n.icon-Sleep::before {\n content: \"\\eb17\";\n}\n.icon-Smart-electric-meter::before {\n content: \"\\eb18\";\n}\n.icon-Smart-heating-switch::before {\n content: \"\\eb19\";\n}\n.icon-smart-home::before {\n content: \"\\eb1a\";\n}\n.icon-smart-lightswitch::before {\n content: \"\\eb1b\";\n}\n.icon-smart-powerstation::before {\n content: \"\\eb1c\";\n}\n.icon-Smart-Sensor::before {\n content: \"\\eb1d\";\n}\n.icon-smart-tap::before {\n content: \"\\eb1e\";\n}\n.icon-smart-watch::before {\n content: \"\\eb1f\";\n}\n.icon-social-network::before {\n content: \"\\eb20\";\n}\n.icon-software-update::before {\n content: \"\\eb21\";\n}\n.icon-Sport-channel::before {\n content: \"\\eb22\";\n}\n.icon-Start-services::before {\n content: \"\\eb23\";\n}\n.icon-startup-wizard::before {\n content: \"\\eb24\";\n}\n.icon-stocks::before {\n content: \"\\eb25\";\n}\n.icon-stop-secret::before {\n content: \"\\eb26\";\n}\n.icon-Stop-video::before {\n content: \"\\eb27\";\n}\n.icon-Storage-cloud::before {\n content: \"\\eb28\";\n}\n.icon-store-locator::before {\n content: \"\\eb29\";\n}\n.icon-Street::before {\n content: \"\\eb2a\";\n}\n.icon-Stretcher::before {\n content: \"\\eb2b\";\n}\n.icon-subscription-package::before {\n content: \"\\eb2c\";\n}\n.icon-Sudoku::before {\n content: \"\\eb2d\";\n}\n.icon-support::before {\n content: \"\\eb2e\";\n}\n.icon-surveillance-camera::before {\n content: \"\\eb2f\";\n}\n.icon-Syncronise::before {\n content: \"\\eb30\";\n}\n.icon-target-location::before {\n content: \"\\eb31\";\n}\n.icon-tarif::before {\n content: \"\\eb32\";\n}\n.icon-tariff::before {\n content: \"\\eb33\";\n}\n.icon-task-list::before {\n content: \"\\eb34\";\n}\n.icon-Taxi::before {\n content: \"\\eb35\";\n}\n.icon-team-connect::before {\n content: \"\\eb36\";\n}\n.icon-temperature::before {\n content: \"\\eb37\";\n}\n.icon-terms-conditions::before {\n content: \"\\eb38\";\n}\n.icon-text-alerts::before {\n content: \"\\eb39\";\n}\n.icon-Thumb-down::before {\n content: \"\\eb3a\";\n}\n.icon-Thumb-up::before {\n content: \"\\eb3b\";\n}\n.icon-tick::before {\n content: \"\\eb3c\";\n}\n.icon-tick-circle::before {\n content: \"\\eb3d\";\n}\n.icon-tickets::before {\n content: \"\\eb3e\";\n}\n.icon-Top-10::before {\n content: \"\\eb3f\";\n}\n.icon-top-up-dollar::before {\n content: \"\\eb40\";\n}\n.icon-top-up-euro::before {\n content: \"\\eb41\";\n}\n.icon-top-up-uk-bank::before {\n content: \"\\eb42\";\n}\n.icon-touch-screen::before {\n content: \"\\eb43\";\n}\n.icon-town::before {\n content: \"\\eb44\";\n}\n.icon-townhall::before {\n content: \"\\eb45\";\n}\n.icon-track-your-delivery::before {\n content: \"\\eb46\";\n}\n.icon-track-your-order::before {\n content: \"\\eb47\";\n}\n.icon-Trading::before {\n content: \"\\eb48\";\n}\n.icon-trash::before {\n content: \"\\eb49\";\n}\n.icon-tv-plus::before {\n content: \"\\eb4a\";\n}\n.icon-TV-series::before {\n content: \"\\eb4b\";\n}\n.icon-Undo::before {\n content: \"\\eb4c\";\n}\n.icon-unique::before {\n content: \"\\eb4d\";\n}\n.icon-unknown-file::before {\n content: \"\\eb4e\";\n}\n.icon-unlimited-calls::before {\n content: \"\\eb4f\";\n}\n.icon-unlocked::before {\n content: \"\\eb50\";\n}\n.icon-Unmissable::before {\n content: \"\\eb51\";\n}\n.icon-upload::before {\n content: \"\\eb52\";\n}\n.icon-USB::before {\n content: \"\\eb53\";\n}\n.icon-usb-key::before {\n content: \"\\eb54\";\n}\n.icon-Value::before {\n content: \"\\eb55\";\n}\n.icon-vehicle::before {\n content: \"\\eb56\";\n}\n.icon-video::before {\n content: \"\\eb57\";\n}\n.icon-video-file::before {\n content: \"\\eb58\";\n}\n.icon-video-phone::before {\n content: \"\\eb59\";\n}\n.icon-video-meeting2::before {\n content: \"\\eb5a\";\n}\n.icon-Vinyl::before {\n content: \"\\eb5b\";\n}\n.icon-vip-contact::before {\n content: \"\\eb5c\";\n}\n.icon-virtual-gamepad::before {\n content: \"\\eb5d\";\n}\n.icon-visual-voicemail::before {\n content: \"\\eb5e\";\n}\n.icon-vod-portrait::before {\n content: \"\\eb5f\";\n}\n.icon-volte::before {\n content: \"\\eb60\";\n}\n.icon-volume-high::before {\n content: \"\\eb61\";\n}\n.icon-volume-low::before {\n content: \"\\eb62\";\n}\n.icon-volume-mid::before {\n content: \"\\eb63\";\n}\n.icon-volume-none::before {\n content: \"\\eb64\";\n}\n.icon-vowifi::before {\n content: \"\\eb65\";\n}\n.icon-vvm-message-read-full::before {\n content: \"\\eb66\";\n}\n.icon-Warehouse::before {\n content: \"\\eb67\";\n}\n.icon-Warningimportant::before {\n content: \"\\eb68\";\n}\n.icon-Warning-important::before {\n content: \"\\eb69\";\n}\n.icon-web-cam::before {\n content: \"\\eb6a\";\n}\n.icon-web-fax-widget::before {\n content: \"\\eb6b\";\n}\n.icon-Wholesale-retail::before {\n content: \"\\eb6c\";\n}\n.icon-Widget::before {\n content: \"\\eb6d\";\n}\n.icon-widget-tour::before {\n content: \"\\eb6e\";\n}\n.icon-wifi::before {\n content: \"\\eb6f\";\n}\n.icon-wifi-0::before {\n content: \"\\eb70\";\n}\n.icon-wifi-1::before {\n content: \"\\eb71\";\n}\n.icon-wifi-2::before {\n content: \"\\eb72\";\n}\n.icon-wps-pairing::before {\n content: \"\\eb73\";\n}\n.icon-WPT::before {\n content: \"\\eb74\";\n}\n.icon-zoom-in::before {\n content: \"\\eb75\";\n}\n.icon-zoom-out::before {\n content: \"\\eb76\";\n}\n.icon-popout-tech::before {\n content: \"\\e634\";\n}\n.icon-frame-care::before {\n content: \"\\e640\";\n}\n.icon-frame-family::before {\n content: \"\\e637\";\n}\n.icon-frame-fun::before {\n content: \"\\e638\";\n}\n.icon-frame-home::before {\n content: \"\\e639\";\n}\n.icon-frame-money::before {\n content: \"\\e63a\";\n}\n.icon-frame-on-the-move::before {\n content: \"\\e63b\";\n}\n.icon-frame-tariff::before {\n content: \"\\e63c\";\n}\n.icon-frame-tech::before {\n content: \"\\e63d\";\n}\n.icon-frame-wellbeing::before {\n content: \"\\e63e\";\n}\n.icon-frame-work::before {\n content: \"\\e63f\";\n}\n.icon-popout-care::before {\n content: \"\\e62d\";\n}\n.icon-popout-family::before {\n content: \"\\e62e\";\n}\n.icon-popout-fun::before {\n content: \"\\e62f\";\n}\n.icon-popout-home::before {\n content: \"\\e630\";\n}\n.icon-popout-money::before {\n content: \"\\e631\";\n}\n.icon-popout-on-the-move::before {\n content: \"\\e632\";\n}\n.icon-popout-tariff::before {\n content: \"\\e633\";\n}\n.icon-popout-wellbeing::before {\n content: \"\\e635\";\n}\n.icon-popout-work::before {\n content: \"\\e636\";\n}\n.icon-frame-connectivity::before {\n content: \"\\eb78\";\n}\n.icon-frame-my-customers::before {\n content: \"\\eb79\";\n}\n.icon-frame-performance::before {\n content: \"\\eb7a\";\n}\n.icon-frame-security::before {\n content: \"\\eb7b\";\n}\n.icon-frame-teamwork::before {\n content: \"\\eb7c\";\n}\n.icon-popout-connectivity::before {\n content: \"\\eb7d\";\n}\n.icon-popout-my-customers::before {\n content: \"\\eb7e\";\n}\n.icon-popout-performance::before {\n content: \"\\eb7f\";\n}\n.icon-popout-security::before {\n content: \"\\eb80\";\n}\n.icon-popout-teamwork::before {\n content: \"\\eb81\";\n}\n\n// Using svg\n\n.svg-delete,\n.svg-checkbox-tick,\n.svg-warning-circle,\n.svg-menu,\n.svg-tick,\n.svg-success,\n.svg-warning,\n.svg-info,\n.svg-error,\n.svg-arrow-previous,\n.svg-arrow-next,\n.svg-settings,\n.svg-search,\n.svg-avatar,\n.svg-buy {\n position: relative;\n}\n\n.svg-delete::after,\n.svg-checkbox-tick::after,\n.svg-warning-circle::after,\n.svg-menu::after,\n.svg-tick::after,\n.svg-arrow-previous::after,\n.svg-arrow-next::after,\n.svg-settings::after,\n.svg-search::after,\n.svg-avatar::after,\n.svg-buy::after,\n.svg-success::after,\n.svg-warning::after,\n.svg-info::after,\n.svg-error::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.svg-delete {\n @include svg-delete(\"#fff\");\n}\n\n.svg-checkbox-tick {\n @include svg-checkbox-tick(\"#fff\");\n}\n\n.svg-warning-circle {\n @include svg-warning-circle(theme-color(\"info\"));\n}\n\n.svg-menu {\n @include svg-menu(\"#fff\");\n}\n\n.svg-menu:hover {\n @include svg-menu(\"#000\");\n}\n\n.svg-tick {\n @include svg-tick(theme-color(\"success\"));\n}\n\n.svg-success {\n @include svg-success();\n}\n\n.svg-warning {\n @include svg-warning();\n}\n\n.svg-error {\n @include svg-error();\n}\n\n.svg-info {\n @include svg-info();\n}\n\n.svg-arrow-previous {\n @include svg-arrow-previous(\"#000\");\n}\n\n.svg-arrow-previous:hover,\n.svg-arrow-previous:focus,\n.svg-arrow-previous:active, {\n @include svg-arrow-previous(\"#fff\");\n}\n\n.svg-arrow-next {\n @include svg-arrow-next(\"#000\");\n}\n\n.svg-arrow-next.btn-primary {\n @include svg-arrow-next(\"#fff\");\n}\n\n.svg-arrow-next.btn-primary:active {\n @include svg-arrow-next(\"#000\");\n}\n\n.svg-settings {\n @include svg-settings(\"#fff\");\n}\n\n.svg-settings:hover,\n.svg-settings:focus {\n @include svg-settings(theme-color(\"primary\"));\n}\n\n.svg-search {\n @include svg-search(\"#fff\");\n}\n\n.svg-search:hover {\n @include svg-search(theme-color(\"primary\"));\n}\n\n.svg-avatar {\n @include svg-avatar(\"#fff\");\n}\n\n.svg-avatar:hover,\n.svg-avatar:active {\n @include svg-avatar(theme-color(\"primary\"));\n}\n\n.svg-buy {\n @include svg-buy(\"#fff\");\n}\n\n.svg-buy:hover,\n.svg-buy:active {\n @include svg-buy(theme-color(\"primary\"));\n}\n\n.btn-mail {\n @include btn-mail();\n}\n\n.btn-mail-inverse {\n @include btn-mail-inverse();\n}\n\n.btn-lin {\n @include btn-lin();\n}\n\n.btn-lin-inverse {\n @include btn-lin-inverse();\n}\n\n.btn-gplus {\n @include btn-gplus();\n}\n\n.btn-gplus-inverse {\n @include btn-gplus-inverse();\n}\n\n.btn-tw {\n @include btn-tw();\n}\n\n.btn-tw-inverse {\n @include btn-tw-inverse();\n}\n\n.btn-fbk {\n @include btn-fbk();\n}\n\n.btn-fbk-inverse {\n @include btn-fbk-inverse();\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #fafafa !default; // gray-lightest-o\n$gray-200: #f6f6f6 !default; // gray-lightest\n$gray-300: #eee !default; // gray-lighter\n$gray-400: #ddd !default; // gray-lighter-o\n$gray-500: #ccc !default; // gray-light-o\n$gray-600: #999 !default; // gray-light\n$gray-700: #666 !default; // gray\n$gray-800: #595959 !default; // gray-obs\n$gray-900: #333 !default; // gray-dark\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #527edb !default; // Boosted Functionnal\n$indigo: #6610f2 !default;\n$purple: #a885d8 !default; // Boosted illustration color\n$pink: #ffb4e6 !default; // Boosted illustration color\n$red: #cd3c14 !default; // Boosted Functionnal\n$orange: #f16e00 !default; // Boosted\n$yellow: #fc0 !default; // Boosted Functionnal\n$green: #32c832 !default; // Boosted Functionnal\n$teal: #50be87 !default; // Boosted illustration color\n$cyan: #4bb4e6 !default; // Boosted illustration color\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $orange !default;\n$secondary: $black !default;\n$success: $green !default;\n$info: $blue !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-400 !default;\n$dark: $black !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n//boosted mod\n$alert-logo-sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$alert-logo-sizes: map-merge(\n (\n \"sm\": 1rem,\n \"md\": 1.76rem,\n \"lg\": 2rem\n ),\n $alert-logo-sizes\n);\n\n// end mod\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 4.5 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $black !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: false !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1.25rem !default; // 20px\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $black !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"dark\") !default;\n$link-decoration: none !default;\n$link-hover-color: theme-color(\"primary\") !default;\n$link-hover-decoration: none !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grid-breakpoints: map-merge(\n (\n // Extra small screen / phone\n xs: 0,\n // Small screen / phone\n sm: 480px,\n // Medium screen / tablet\n md: 768px,\n // Large screen / desktop (target 1024 screen resolutions)\n lg: 980px,\n // Extra large screen / wide desktop (target 1280 screen resolutions)\n xl: 1220px,\n // Extra large screen / wide desktop (target 1440 screen resolutions)\n xxl: 1380px\n ),\n $grid-breakpoints\n);\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$container-max-widths: map-merge(\n (\n xs: 312px,\n sm: 468px,\n md: 744px,\n lg: 960px,\n xl: 1200px,\n xxl: 1320px\n ),\n $container-max-widths\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n$container-fluid-margin-widths: (\n xs: 1.25%,\n sm: 1.25%,\n md: 1.5625%,\n lg: 3.125%,\n xl: 3.125%,\n xxl: 4.16667%\n) !default;\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 20px !default;\n$grid-gutter-widths: (\n xs: 10px,\n sm: 10px,\n md: $grid-gutter-width,\n lg: $grid-gutter-width,\n xl: $grid-gutter-width,\n xxl: $grid-gutter-width\n) !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: (20 / 18) !default;\n$line-height-sm: (20 / 14) !default;\n\n$border-width: 2px !default;\n$border-color: theme-color(\"dark\") !default;\n\n$border-radius: .25rem !default;\n$border-radius-xlg: .4rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"dark\") !default;\n\n$caret-width: .4375rem !default;\n$caret-vertical-align: $caret-width * .5 !default;\n$caret-spacing: $caret-width !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"HelvNeueOrange\", \"Helvetica Neue\", Helvetica, Arial, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.125 !default; // 18px\n$font-size-xlg: $font-size-base * 1.25 !default; // 20px\n$font-size-sm: $font-size-base * .875 !default; // 14px\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.25 !default; // 20px\n\n$h1-font-size: $font-size-base * 2.125 !default; // 34px\n$h2-font-size: $font-size-base * 1.875 !default; // 30px\n$h3-font-size: $font-size-base * 1.5 !default; // 24px\n$h4-font-size: $font-size-base * 1.25 !default; // 20px\n$h5-font-size: $font-size-base * 1.125 !default; // 18px\n$h6-font-size: $font-size-base !default; // 16px\n\n$h1-font-size-mobile: $font-size-base * 1.25 !default; // 20px\n$h2-font-size-mobile: $font-size-base * 1.125 !default; // 18px\n$h3-font-size-mobile: $font-size-base !default; // 16px\n$h4-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h5-font-size-mobile: $font-size-base * .875 !default; // 14px\n$h6-font-size-mobile: $font-size-base * .875 !default; // 14px\n\n$headings-margin-bottom: $spacer !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 700 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 3.75rem !default; // 60px\n$display2-size: 3.125rem !default; // 50px\n$display3-size: 2.5rem !default; // 40px\n$display4-size: 2.125rem !default; // 34px\n\n$display1-weight: 700 !default;\n$display2-weight: 700 !default;\n$display3-weight: 700 !default;\n$display4-weight: 700 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875rem !default; // 14px\n\n$text-muted: $gray-700 !default;\n\n$blockquote-small-color: $gray-700 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: $gray-300 !default;\n$hr-border-width: $border-width / 2 !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: none !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .3125rem !default;\n\n$mark-bg: theme-color(\"primary\") !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .625rem .625rem .625rem 0 !default;//10px;\n$table-cell-padding-sm: .3125rem .3125rem .3125rem 0 !default;//5px;\n\n$table-color: $body-color !default;\n$table-bg: $white !default;\n$table-accent-bg: $gray-200 !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: $gray-300 !default; // #eee on white bg\n$table-active-bg: $gray-400 !default;\n\n$table-border-width: $border-width / 2 !default; // 1px\n$table-border-color: $gray-500 !default;\n\n$table-head-bg: $white !default;\n$table-head-color: $black !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $black !default;\n$table-dark-accent-bg: $gray-900 !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: $gray-700 !default;\n$table-dark-border-color: $gray-500 !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// $table-bg-level: -9 !default; // disable in boosted\n// $table-border-level: -6 !default; // disable in boosted\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: 1.125rem !default;\n$input-btn-font-family: $font-family-sans-serif !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .125rem !default;\n//$input-btn-focus-color: rgba(theme-color(\"primary\"), .25) !default;\n$input-btn-focus-box-shadow: none !default;\n\n$input-btn-padding-y-sm: .157rem !default;\n$input-btn-padding-x-sm: .625rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .594rem !default;\n$input-btn-padding-x-lg: 1.25rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$input-btn-padding-y-xlg: .8125rem !default;\n$input-btn-padding-x-xlg: 1.25rem !default;\n$input-btn-line-height-xlg: 1.5 !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-padding-y-xlg: $input-btn-padding-y-xlg !default;\n$btn-padding-x-xlg: $input-btn-padding-x-xlg !default;\n$btn-line-height-xlg: $input-btn-line-height-xlg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-bold !default;\n$btn-box-shadow: none !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: 1 !default;\n$btn-active-box-shadow: none !default;\n\n$btn-link-disabled-color: $gray-500 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-xlg: $border-radius-xlg !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .625rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: .625rem !default; // Boosted mod input padding x is not the same as buttons padding-x!\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-bold !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: #fff !default;\n$input-disabled-bg: $gray-300 !default;\n\n$input-color: theme-color(\"dark\") !default;\n$input-border-color: $gray-500 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: none !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: $black !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-700 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n$input-height-inner-sm: ($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($input-btn-font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: $spacer * .5 !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: $spacer !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-300 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .625rem !default;\n$custom-control-spacer-x: $spacer !default;\n\n$custom-control-indicator-size: 1.25rem !default;\n$custom-control-indicator-bg: $white !default;\n$custom-control-indicator-bg-size: 1rem !default;\n$custom-control-indicator-box-shadow: none !default;\n$custom-control-indicator-border-color: $gray-700 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $gray-500 !default;\n$custom-control-label-disabled-color: #767676 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-disabled-bg: $gray-500 !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: theme-color(\"primary\") !default; // Boosted mod controls have border\n\n$custom-control-indicator-focus-box-shadow: none !default;\n// $custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n// $custom-checkbox-indicator-icon-checked: url('data:image/svg+xml;charset=utf8, %3csvg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"%3e%3cpath d=\"M14 2l-8 8-3-3-2 2 5 5L16 4l-2-2z\" fill=\"%23FFF\"/%3e%3c/svg%3e') !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n//$custom-checkbox-indicator-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n//$custom-checkbox-indicator-icon-indeterminate: url('data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath stroke=\"%23fff' d='M1 4h6'/%3e%3c/svg%3e') !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n//$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 3 !default;\n$custom-switch-height: $custom-control-indicator-size * 1.5 !default;\n$custom-switch-indicator-border-radius: 0 !default; // boosted is not rounded\n$custom-switch-indicator-width: calc(#{$custom-switch-width} / 2 - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-height: calc(#{$custom-switch-height} - #{$custom-control-indicator-border-width * 2}) !default;\n$custom-switch-indicator-bg-color: $white !default;\n\n$custom-select-padding-y: .4375rem !default;\n$custom-select-padding-x: .5rem !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-300 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n//$custom-select-indicator-color: $gray-900 !default;\n$custom-select-indicator: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M0 0h14L7 7 0 0z'/%3e%3c/svg%3e\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: $input-height-inner * 3 / 4 + $custom-select-padding-x + $custom-select-indicator-padding !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: ($input-height-inner / 2) ($input-height-inner / 2) !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: none !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n//$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: none !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-btn-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-btn-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-600 !default;\n$custom-range-track-border-radius: 0 !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 50% !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 .125rem $black !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: theme-color(\"primary\") !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-o-scroll-up: 1035 !default; // Boosted mod\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: $spacer * .5 !default;\n$nav-link-padding-x: $spacer !default;\n$nav-link-disabled-color: $gray-700 !default;\n$nav-link-disabled-hover-bg: transparent !default;\n\n$nav-tabs-border-color: $black !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $black !default;\n$nav-tabs-link-hover-color: $white !default;\n$nav-tabs-link-hover-bg: $black !default;\n$nav-tabs-link-active-color: $black !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $black !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: 0 !default;\n$navbar-padding-x: 0 !default;\n$navbar-expanded-padding-y: 1.5625rem !default;\n$navbar-expanded-padding-x: 0 !default;\n$navbar-expanded-minimized-padding-y: 1.25rem !default;\n\n// Boosted mod\n// adapt navbar padding when mobile view\n// $navbar-height: 6.25rem !default;\n$navbar-brand-logo-height: 1.875rem !default;\n$navbar-brand-logo-expanded-height: 3.125rem !default;\n$navbar-brand-logo-minimized-height: 2.5rem !default;\n$navbar-supra-height: 2.5rem !default;\n// end mod\n\n$navbar-nav-link-padding-x: 0 !default;\n\n$navbar-brand-font-size: $font-size-sm !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n//$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n//$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: 0 !default;\n\n$navbar-toggler-padding-y: .5rem !default;\n$navbar-toggler-padding-x: .5rem !default;\n$navbar-toggler-font-size: $font-size-base !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-icon-size: 1.25rem !default;\n\n$navbar-dark-color: $white !default;\n$navbar-dark-hover-color: theme-color(\"primary\") !default;\n$navbar-dark-active-color: $navbar-dark-hover-color !default;\n$navbar-dark-disabled-color: $gray-400 !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#{$navbar-dark-color}' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-icon-hover-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg viewBox='0 0 1024 1024' width='20px' height='20px' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='#000' d='M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$navbar-dark-toggler-border-color: rgba(255, 255, 255, .1) !default;\n\n$navbar-light-color: $black !default;\n$navbar-light-hover-color: $navbar-dark-hover-color !default;\n$navbar-light-active-color: $navbar-dark-active-color !default;\n$navbar-light-disabled-color: $navbar-dark-disabled-color !default;\n$navbar-light-toggler-icon-bg: $navbar-dark-toggler-icon-bg !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: 0 !default;\n$dropdown-spacer: -2px !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: $black !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: 0 !default;\n$dropdown-divider-bg: $gray-300 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: none !default;\n\n$dropdown-link-color: $black !default;\n$dropdown-link-hover-color: $white !default;\n$dropdown-link-hover-bg: $black !default;\n\n$dropdown-link-active-color: $white !default;\n$dropdown-link-active-bg: $black !default;\n\n$dropdown-link-disabled-color: $gray-700 !default;\n\n$dropdown-item-padding-y: .625rem !default;\n$dropdown-item-padding-x: .625rem !default;\n\n$dropdown-header-color: $black !default;\n\n\n// Pagination\n\n$pagination-padding-y: $spacer / 2 !default;\n$pagination-padding-x: .8rem !default;\n$pagination-padding-y-sm: .375rem !default;\n$pagination-padding-x-sm: .625rem !default;\n$pagination-padding-y-lg: .875rem !default;\n$pagination-padding-x-lg: 1.125rem !default;\n$pagination-line-height: 1 !default;\n\n$pagination-color: #000 !default;\n$pagination-bg: #fff !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: transparent !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; // Boosted mod not used\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $black !default;\n$pagination-hover-bg: $white !default;\n$pagination-hover-border: $gray-500 !default;\n$pagination-hover-border-color: $black !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: $black !default;\n$pagination-active-border-color: $black !default;\n\n$pagination-active-item-bg: $orange !default;\n$pagination-active-item-border-color: $orange !default;\n\n$pagination-disabled-color: $gray-500 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-500 !default;\n\n$pagination-icon-prev: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-prev-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M9 2L7 0 0 7l7 7 2-2-5-5 5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-disabled: url(\"data:image/svg+xml;charset=utf8, %3csvg viewBox='0 0 9 14' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23DDD'/%3e%3c/svg%3e\") !default;\n$pagination-icon-next-active: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3e%3cpath d='M0 2l2-2 7 7-7 7-2-2 5-5-5-5z' fill='%23fff'/%3e%3c/svg%3e\") !default;\n// Boosted Var\n$pagination-min-width: 2.5rem !default;\n$pagination-min-width-lg: 3.125rem !default;\n$pagination-min-width-sm: 1.875rem !default;\n\n// Jumbotron\n\n$jumbotron-padding: $spacer * 2 !default;\n$jumbotron-color: $black !default;\n$jumbotron-bg: $white !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: $black !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: $white !default;\n$card-cap-color: $white !default;\n$card-color: $black !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $spacer * 2 !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $spacer * 2 !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: #000 !default;\n$tooltip-bg: $gray-400 !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer !default;\n$tooltip-padding-x: $spacer !default;\n$tooltip-margin: .3125rem !default;\n$tooltip-font-weight: $font-weight-bold !default;\n\n$tooltip-arrow-width: .625rem !default;\n$tooltip-arrow-height: .625rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y / 2 !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x / 2 !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $gray-400 !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: $gray-400 !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: none !default;\n$popover-font-weight: $font-weight-bold !default;\n\n$popover-header-bg: $popover-bg !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .625rem !default;\n$popover-header-padding-x: .625rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: .625rem !default;\n$popover-arrow-height: .3125rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: $popover-border-color !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .625rem !default;\n$toast-padding-y: .3125rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: none !default;\n$toast-box-shadow: none !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: .875rem !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .1875rem !default;\n$badge-padding-x: .625rem !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n// $badge-focus-width: $input-btn-focus-width !default;\n$badge-pill-padding-x: .625rem !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: $border-radius !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: .625rem !default;\n\n$modal-dialog-margin: .625rem !default;\n$modal-dialog-margin-y-sm-up: 1.875rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: $black !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: $black !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: none !default;\n$modal-content-box-shadow-sm-up: none !default;\n\n$modal-backdrop-bg: $gray-900 !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: #000 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: .625rem !default;\n$modal-header-padding-x: .625rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 700px !default;\n$modal-lg: 700px !default;\n$modal-md: 700px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .8125rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-padding-y-sm: .3125rem !default;\n$alert-padding-x-sm: 1.25rem !default;\n$alert-padding-y-lg: 1rem !default;\n$alert-padding-x-lg: 1.25rem !default;\n$alert-margin-bottom: $spacer !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: 0 !default;\n\n$alert-bg-level: 0 !default;\n$alert-border-level: 0 !default;\n// $alert-color-level: 0 !default; // Not used by boosted\n\n// Progress bars\n\n$progress-height: $spacer !default;\n$progress-font-size: $font-size-base !default;\n$progress-bg: $gray-500 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: none !default;\n$progress-bar-color: #000 !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: $black !default;\n$list-group-bg: $white !default;\n$list-group-border-color: $black !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .625rem !default;\n$list-group-item-padding-x: .625rem !default;\n\n$list-group-hover-bg: $gray-200 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-500 !default;\n$list-group-disabled-bg: #fff !default;\n\n$list-group-action-color: #000 !default;\n$list-group-action-hover-color: theme-color(\"primary\") !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-300 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .625rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #000 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: none !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-900 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .625rem !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding: .625rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: #fff !default;\n$breadcrumb-divider-color: #000 !default;\n$breadcrumb-active-color: theme-color(\"primary\") !default;\n$breadcrumb-divider: \"\\e93e\" !default;\n$breadcrumb-font-family: icon-orange !default;\n$breadcrumb-divider-font-size: .625rem !default;\n$breadcrumb-font-size: $font-size-sm !default;\n$breadcrumb-line-height: $line-height-sm !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: #000 !default;\n$carousel-control-width: 1.875rem !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: theme-color(\"primary\") !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: #000 !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $gray-900 !default;\n\n$kbd-padding-y: .0625rem !default;\n$kbd-padding-x: .0625rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: #000 !default;\n$kbd-bg: $gray-300 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n\n//////// BOOSTED SPECIFIC ////////\n// Accordions\n\n$accordion-arrow-icon: url(\"data:image/svg+xml;charset=utf8, %3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 7'%3e%3cpath d='M7 7L0 0h14L7 7z'/%3e%3c/svg%3e\") !default;\n$o-sortable-hover-icon: url(\"data:image/svg+xml;charset=utf8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 17'%3e%3cpath d='M 7%2C17 0%2C10 h 14 l -7%2C7 z'/%3e%3cpath d='M 7%2C0 14%2C7 0%2C7 7%2C0 z'/%3e%3c/svg%3e\") !default;\n\n// arrow Links\n\n$o-link-arrow-separator-padding-vertical: 0 !default;\n$o-link-arrow-separator-padding-horizontal: .625rem !default;\n$o-link-arrow-color: #000 !default;\n$o-link-arrow-separator-size: .625rem !default;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n// For REM size\n\n// Iconography\n//\n// Load fonts from this directory.\n$icon-font-path: \"../fonts/\" !default;\n\n// o-scroll-up\n//\n//\n$o-scroll-up-height: 2.5rem !default; //30px\n$o-scroll-up-width: $o-scroll-up-height !default; // 30px\n//$o-scroll-up-font-size: 1.25rem !default; // 20px\n\n// Navbar\n//\n//\n\n\n// Mega-Menu\n//\n//\n\n//$megamenu-border: 1px solid $gray-900 !default;\n//$megamenu-hover-color: theme-color(\"primary\") !default;\n//$megamenu-position: fixed !default;\n\n// Navs\n//\n\n// Tabs\n\n\n// Pills\n$nav-pills-focus-link-bg: theme-color(\"primary\") !default;\n$nav-pills-focus-link-color: #fff !default;\n\n\n// Local navigation\n//$nav-local-arrow-color: #fff !default;\n$nav-local-arrow-width: 10px !default;\n$nav-local-border-color: $gray-500 !default;\n\n//$nav-local-arrow-outer-width: ($nav-local-arrow-width + 1) !default;\n//$nav-local-arrow-outer-color: $nav-local-border-color !default;\n\n// Step process bar\n$o-stepbar-height: 2.5rem !default;\n$o-stepbar-arrow-width: 1rem !default;\n//$o-stepbar-arrow-ratio: 3 / 8 !default;\n\n$o-stepbar-mobile-padding-vertical: .3125rem !default;\n$o-stepbar-mobile-arrow-width: .75rem !default;\n$o-stepbar-mobile-arrow-height: 1.875rem !default;\n\n// focus state mixin\n@mixin focus {\n &:focus {\n @content;\n }\n}\n\n@mixin active {\n &:active {\n @content;\n }\n}\n","@font-face {\n font-family: icon-orange;\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(\"../fonts/icon-orange.woff2\") format(\"woff2\"), url(\"../fonts/icon-orange.woff\") format(\"woff\");\n}\n\n.icon-checkbox-tick,\n.icon-2for1cinematicket,\n.icon-3g,\n.icon-4g,\n.icon-4g-cam,\n.icon-4G-Cam--Live-80,\n.icon-4G-Cam-Camera-80,\n.icon-4G-Cam-Inbox80,\n.icon-4G-Cam-Outbox-80,\n.icon-4G-Cam-Rec-80,\n.icon-4g-plus,\n.icon-4G-Cam-Compact,\n.icon-1013-Reseau,\n.icon-about-event,\n.icon-Accessability,\n.icon-accessibility-cognition,\n.icon-accessibility-dexterity,\n.icon-accessibility-hearing,\n.icon-accessibility-mobility,\n.icon-accessibility-speech,\n.icon-accessibility-vision,\n.icon-accessory-headphones,\n.icon-accessory-shop,\n.icon-Add,\n.icon-add-more,\n.icon-Add-person,\n.icon-address-book,\n.icon-administrator,\n.icon-Adultcode,\n.icon-Adult,\n.icon-advertising,\n.icon-aeroplane,\n.icon-Age-rating-3,\n.icon-Age-rating-4,\n.icon-Age-rating-7,\n.icon-Age-rating-9,\n.icon-Age-rating-12,\n.icon-Age-rating-16,\n.icon-Age-rating-17,\n.icon-Age-rating-18,\n.icon-age-rating-mono-3,\n.icon-age-rating-mono-4,\n.icon-age-rating-mono-7,\n.icon-age-rating-mono-9,\n.icon-age-rating-mono-12,\n.icon-age-rating-mono-16,\n.icon-age-rating-mono-17,\n.icon-age-rating-mono-18,\n.icon-agriculture,\n.icon-airbox-auto,\n.icon-alarm-clock,\n.icon-alarm-off,\n.icon-Alias-numbers,\n.icon-all-channels,\n.icon-antenna,\n.icon-anti-spam,\n.icon-antivirus,\n.icon-Apartment-building,\n.icon-Apps,\n.icon-Apps-disabled,\n.icon-Archive,\n.icon-arrow-down,\n.icon-arrow-up,\n.icon-arrow-next,\n.icon-arrow-previous,\n.icon-Art,\n.icon-assistance,\n.icon-attachment,\n.icon-Auditorium,\n.icon-avatar,\n.icon-Baby,\n.icon-backup,\n.icon-banking,\n.icon-battery-1-bar,\n.icon-battery-2-bar,\n.icon-battery-charging,\n.icon-battery-empty,\n.icon-battery-full,\n.icon-battery-full-2,\n.icon-Betting,\n.icon-bill-euro,\n.icon-billboard,\n.icon-birthday,\n.icon-bluetooth,\n.icon-Book-award,\n.icon-book-download,\n.icon-bookmark,\n.icon-bookmark-smart,\n.icon-Boxes,\n.icon-broadcast,\n.icon-burst-mode,\n.icon-Business-everywhere,\n.icon-business-invoices,\n.icon-business-lounge,\n.icon-business-telephonie,\n.icon-buy,\n.icon-buy-back-euro,\n.icon-buzz,\n.icon-Calculator,\n.icon-calendaralarm,\n.icon-calendar-30,\n.icon-calendar-day,\n.icon-Calendar-fixtures-results,\n.icon-Calendar-football-match,\n.icon-calendar-month,\n.icon-calendar-week,\n.icon-call,\n.icon-call-forward,\n.icon-call-invite,\n.icon-call-log,\n.icon-camera,\n.icon-Car-park,\n.icon-Car-pooling,\n.icon-Casting,\n.icon-Categories,\n.icon-CD,\n.icon-change-wallpaper,\n.icon-Change-wallpaper-1,\n.icon-charger,\n.icon-check-your-balance,\n.icon-Child,\n.icon-child-protection,\n.icon-Children-channel,\n.icon-cineday-silhouette,\n.icon-clock,\n.icon-cloud-backup,\n.icon-Coat-hanger,\n.icon-Collective-class-training,\n.icon-Colour-Call,\n.icon-Comedy-channel,\n.icon-Comic,\n.icon-Comments,\n.icon-commercial-representitive,\n.icon-community-sms,\n.icon-Concierge-bell,\n.icon-conference-call,\n.icon-connected-object,\n.icon-connection,\n.icon-construction,\n.icon-contact-card,\n.icon-control-centre,\n.icon-control-mydata,\n.icon-copy,\n.icon-Courier,\n.icon-CPU,\n.icon-crane,\n.icon-Crop,\n.icon-Currency-brazilian-real,\n.icon-currency-converter,\n.icon-Currency-dollar,\n.icon-currency-euro,\n.icon-Currency-sterling,\n.icon-Currency-yen,\n.icon-data-protection,\n.icon-data-services,\n.icon-decoder,\n.icon-Decrease-test-size,\n.icon-Defibrillator,\n.icon-delete,\n.icon-device-desktop-computer,\n.icon-device-desktop-computer-connected,\n.icon-device-fixed-line-phone,\n.icon-device-laptop-computer,\n.icon-device-laptop-computer-connected,\n.icon-device-smart-phone,\n.icon-device-status,\n.icon-device-tablet,\n.icon-device-tablet-connected,\n.icon-device-tv,\n.icon-device-connected-printer,\n.icon-device-manager,\n.icon-device-managment-express,\n.icon-dialler,\n.icon-Digital-frame,\n.icon-disable-apps,\n.icon-Discovery-offer,\n.icon-Discussion-author,\n.icon-Discussion-more,\n.icon-Doctor,\n.icon-Doctors-bag,\n.icon-Doctors-communicating,\n.icon-Document-compose,\n.icon-document-stack,\n.icon-document-word,\n.icon-document-zip,\n.icon-Documentary,\n.icon-done-modifier,\n.icon-download,\n.icon-draft,\n.icon-dual-sim-packaging,\n.icon-easy-internet,\n.icon-ebook,\n.icon-Eco-mode,\n.icon-edashboard,\n.icon-edit-draft,\n.icon-edit-email,\n.icon-edit-image,\n.icon-Elderly-person,\n.icon-electric-car,\n.icon-electric-car-charging,\n.icon-electricity-provider,\n.icon-elevator,\n.icon-email,\n.icon-email-forwarded,\n.icon-Email-replied,\n.icon-emap,\n.icon-emergency-firemen,\n.icon-emergency-police,\n.icon-emergency-sos,\n.icon-emergency-service,\n.icon-employees-1,\n.icon-Empty-trash,\n.icon-End-call,\n.icon-Entertainment-channel,\n.icon-epg,\n.icon-erase,\n.icon-error-severe,\n.icon-Ethenet,\n.icon-event-agenda,\n.icon-event-organiser,\n.icon-event-speaker,\n.icon-Excel,\n.icon-Expand-screen,\n.icon-expert,\n.icon-external-drive,\n.icon-Factory,\n.icon-family-place,\n.icon-Fast-delivery,\n.icon-Favorite-music,\n.icon-favourite,\n.icon-Featured,\n.icon-filter,\n.icon-Filter-effects,\n.icon-finance,\n.icon-fire,\n.icon-Fire-extinguisher,\n.icon-Firewall,\n.icon-flexible-storage,\n.icon-folder-camera,\n.icon-folder-document,\n.icon-folder-favourite,\n.icon-folder-sd,\n.icon-football,\n.icon-Football-match,\n.icon-Football-quiz,\n.icon-Forward,\n.icon-Forward-curved-arrow,\n.icon-forward-the-number,\n.icon-free-tag,\n.icon-Free-up-space,\n.icon-front-end-dashboard,\n.icon-Full-screen-view,\n.icon-Gallery,\n.icon-games,\n.icon-Gas-tank,\n.icon-gaugecapacity,\n.icon-gauge-counter,\n.icon-gauge-rate,\n.icon-gauge-mon-reseau,\n.icon-generic-document,\n.icon-geolocation,\n.icon-hands-free,\n.icon-HDMI-Card,\n.icon-health,\n.icon-health-monitor,\n.icon-Health-patient,\n.icon-Heart-rate,\n.icon-Heartbeats,\n.icon-help-guide,\n.icon-history,\n.icon-home,\n.icon-Home-1,\n.icon-home-alarm,\n.icon-Homelive,\n.icon-homescreen,\n.icon-Horoscopes,\n.icon-hospital,\n.icon-hotel,\n.icon-Hourglass,\n.icon-Im-driving,\n.icon-image,\n.icon-image-file,\n.icon-improvement,\n.icon-inbox,\n.icon-Incoming-call-curved-arrow,\n.icon-Increase-test-size,\n.icon-info,\n.icon-Information-data,\n.icon-internationaltv,\n.icon-international-globe,\n.icon-internet,\n.icon-internet-browser,\n.icon-Internet-security-desktop,\n.icon-Internet-security-mobile,\n.icon-Internet-security-password,\n.icon-Internet-security-server,\n.icon-internet-usage,\n.icon-Interventions,\n.icon-IT-infrastructure,\n.icon-keeper,\n.icon-keyboard,\n.icon-Keypad,\n.icon-La-Cle,\n.icon-Language,\n.icon-Latest,\n.icon-Le-Bloc,\n.icon-Leave-session,\n.icon-lightbulb-sh,\n.icon-ligue-1,\n.icon-Link,\n.icon-live,\n.icon-livebox,\n.icon-livebox-info,\n.icon-livebox-phone,\n.icon-location-pin-compass,\n.icon-lock,\n.icon-Lock-screen-settings,\n.icon-logistics,\n.icon-logout,\n.icon-Maintenance-man,\n.icon-manage-android,\n.icon-managing-equipment,\n.icon-Map,\n.icon-map-pin,\n.icon-Medal,\n.icon-Medical-app,\n.icon-Medical-app-phone,\n.icon-medical-chart,\n.icon-Medical-files,\n.icon-menu,\n.icon-Message-download,\n.icon-messaging,\n.icon-messaging-compose-sms,\n.icon-messaging-unified,\n.icon-messaging-untitled-compose,\n.icon-microphone,\n.icon-Microscope,\n.icon-mini-games,\n.icon-mirroring,\n.icon-Missed-call-boxed-arrow,\n.icon-Missed-call-curved-arrow,\n.icon-mobile-applications,\n.icon-Mobile-backup-restore,\n.icon-mobile-box,\n.icon-mobile-data-toggle,\n.icon-mobile-insurance,\n.icon-mobile-network-coverage,\n.icon-mobile-security,\n.icon-mobile-setup,\n.icon-Modem,\n.icon-modifier-add,\n.icon-Modifier-delete,\n.icon-Modifier-favorite,\n.icon-modifier-new,\n.icon-modifier-no-access,\n.icon-modifier-synchro,\n.icon-modifier-upload,\n.icon-modifier-wizard,\n.icon-Modifier-download,\n.icon-mon-reseau,\n.icon-money,\n.icon-More-dots,\n.icon-move-to-folder,\n.icon-multi-sim,\n.icon-multiple-timezone,\n.icon-Music-artist,\n.icon-music-file,\n.icon-Music-genre,\n.icon-music-player,\n.icon-Mute-microphone,\n.icon-my-account,\n.icon-my-bill-uk,\n.icon-my-boutique,\n.icon-my-essential,\n.icon-my-essential-tablet,\n.icon-my-livebox,\n.icon-my-media,\n.icon-My-Office-Phone,\n.icon-my-orange,\n.icon-my-plug,\n.icon-my-services,\n.icon-my-travels,\n.icon-Nature,\n.icon-Network-add,\n.icon-Network-livebox,\n.icon-networks,\n.icon-new,\n.icon-newspaper,\n.icon-nfc,\n.icon-NFC-tag,\n.icon-no-sim,\n.icon-Notification,\n.icon-Notification-Bell,\n.icon-nouveau-contract-social,\n.icon-numero-unique,\n.icon-office,\n.icon-oil-and-gas,\n.icon-On-board-unit,\n.icon-online-help,\n.icon-orangewallet,\n.icon-orange-assistant,\n.icon-orange-cash,\n.icon-orange-corporate,\n.icon-Orange-Detente,\n.icon-orange-events,\n.icon-Orange-Experts-Class-Training,\n.icon-Orange-Experts-Copy-Keep,\n.icon-orange-experts-expert,\n.icon-orange-experts-insurance,\n.icon-Orange-Experts-One2One-Coach,\n.icon-orange-experts-orange-business-consultant,\n.icon-orange-experts-orange-startup-smartphone,\n.icon-orange-experts-recycle,\n.icon-orange-experts-repair,\n.icon-orange-experts-tranquil,\n.icon-Orange-Football-Club,\n.icon-orange-foundation,\n.icon-Orange-garden,\n.icon-orange-gesture,\n.icon-orange-jobs,\n.icon-orange-messenger,\n.icon-Orange-Messenger-1,\n.icon-orange-money,\n.icon-orange-Photography,\n.icon-orange-pro,\n.icon-orange-protect,\n.icon-orange-radio,\n.icon-orange-reflections,\n.icon-Orange-rewards,\n.icon-Orange-security-suite,\n.icon-orange-travel,\n.icon-orange-tv,\n.icon-orange-wallet,\n.icon-orange-wifi,\n.icon-Orange-Guest,\n.icon-organisation,\n.icon-outbox,\n.icon-outdoor-sports-mountain-biking,\n.icon-outdoor-sports-skiing,\n.icon-Package,\n.icon-Package-content,\n.icon-parabole-tv,\n.icon-parental-control,\n.icon-Parrasol,\n.icon-pass-video,\n.icon-Pause,\n.icon-Payment-euro,\n.icon-pda-device,\n.icon-pdf-file,\n.icon-Pencil,\n.icon-personal-smartphone-trainer,\n.icon-phone-advisor,\n.icon-phone-fund,\n.icon-phone-protection,\n.icon-Photo-dialer,\n.icon-picture-messaging,\n.icon-Pills,\n.icon-pioneering,\n.icon-Play,\n.icon-play-and-win,\n.icon-playmode-random,\n.icon-polls,\n.icon-portfolio,\n.icon-POS-payment,\n.icon-power,\n.icon-powerpoint-file,\n.icon-presentation,\n.icon-previous,\n.icon-printer,\n.icon-profileringtone,\n.icon-public-transport,\n.icon-publish,\n.icon-Quirky-stories,\n.icon-Quiz,\n.icon-Radiography,\n.icon-ratings-stars,\n.icon-Real-time,\n.icon-recommend,\n.icon-record,\n.icon-Record-1,\n.icon-recycle-device,\n.icon-Redo,\n.icon-relationship,\n.icon-reload,\n.icon-remote-control,\n.icon-Remote-control-1,\n.icon-remove-modifier,\n.icon-Replay-boxed-arrow,\n.icon-Reply-boxed-arrow,\n.icon-Reply-curved-arrow,\n.icon-report,\n.icon-responsible,\n.icon-Restaurant,\n.icon-restore-to-phone,\n.icon-Restrictied-content,\n.icon-rewards,\n.icon-ringtones,\n.icon-running,\n.icon-Scales,\n.icon-scan-ticket,\n.icon-School,\n.icon-Science,\n.icon-Scissors,\n.icon-sd-card,\n.icon-SD-card-1,\n.icon-search,\n.icon-Send,\n.icon-Send-to-person,\n.icon-Server,\n.icon-servers,\n.icon-settings,\n.icon-setup-and-repair,\n.icon-setup-and-repair-cog,\n.icon-setup-internet,\n.icon-share,\n.icon-Share-wifi,\n.icon-shipping,\n.icon-Shop,\n.icon-shop-pin,\n.icon-shop-subscriptions,\n.icon-Shopping,\n.icon-Show-front-back-camera,\n.icon-Shower,\n.icon-showroom-mobile-pro,\n.icon-signal-1-5,\n.icon-signal-2-5,\n.icon-signal-3-5,\n.icon-signal-4-5,\n.icon-signal-5-5,\n.icon-signal-boost,\n.icon-Silent,\n.icon-sim,\n.icon-simple-mode,\n.icon-Simplicity,\n.icon-Skip-backward,\n.icon-Skip-forward,\n.icon-Sleep,\n.icon-Smart-electric-meter,\n.icon-Smart-heating-switch,\n.icon-smart-home,\n.icon-smart-lightswitch,\n.icon-smart-powerstation,\n.icon-Smart-Sensor,\n.icon-smart-tap,\n.icon-smart-watch,\n.icon-social-network,\n.icon-software-update,\n.icon-Sport-channel,\n.icon-Start-services,\n.icon-startup-wizard,\n.icon-stocks,\n.icon-stop-secret,\n.icon-Stop-video,\n.icon-Storage-cloud,\n.icon-store-locator,\n.icon-Street,\n.icon-Stretcher,\n.icon-subscription-package,\n.icon-Sudoku,\n.icon-support,\n.icon-surveillance-camera,\n.icon-Syncronise,\n.icon-target-location,\n.icon-tarif,\n.icon-tariff,\n.icon-task-list,\n.icon-Taxi,\n.icon-team-connect,\n.icon-temperature,\n.icon-terms-conditions,\n.icon-text-alerts,\n.icon-Thumb-down,\n.icon-Thumb-up,\n.icon-tick,\n.icon-tick-circle,\n.icon-tickets,\n.icon-Top-10,\n.icon-top-up-dollar,\n.icon-top-up-euro,\n.icon-top-up-uk-bank,\n.icon-touch-screen,\n.icon-town,\n.icon-townhall,\n.icon-track-your-delivery,\n.icon-track-your-order,\n.icon-Trading,\n.icon-trash,\n.icon-tv-plus,\n.icon-TV-series,\n.icon-Undo,\n.icon-unique,\n.icon-unknown-file,\n.icon-unlimited-calls,\n.icon-unlocked,\n.icon-Unmissable,\n.icon-upload,\n.icon-USB,\n.icon-usb-key,\n.icon-Value,\n.icon-vehicle,\n.icon-video,\n.icon-video-file,\n.icon-video-phone,\n.icon-video-meeting2,\n.icon-Vinyl,\n.icon-vip-contact,\n.icon-virtual-gamepad,\n.icon-visual-voicemail,\n.icon-vod-portrait,\n.icon-volte,\n.icon-volume-high,\n.icon-volume-low,\n.icon-volume-mid,\n.icon-volume-none,\n.icon-vowifi,\n.icon-vvm-message-read-full,\n.icon-Warehouse,\n.icon-Warningimportant,\n.icon-Warning-important,\n.icon-web-cam,\n.icon-web-fax-widget,\n.icon-Wholesale-retail,\n.icon-Widget,\n.icon-widget-tour,\n.icon-wifi,\n.icon-wifi-0,\n.icon-wifi-1,\n.icon-wifi-2,\n.icon-wps-pairing,\n.icon-WPT,\n.icon-zoom-in,\n.icon-zoom-out,\n.icon-popout-tech,\n.icon-frame-care,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n font-family: icon-orange !important;\n font-style: normal;\n font-variant: normal;\n line-height: 1;\n text-transform: none;\n speak: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-tech,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-frame-care,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n color: #f16e00;\n}\n\n.icon-checkbox-tick::before {\n content: \"\\eb77\";\n}\n\n.icon-2for1cinematicket::before {\n content: \"\\e900\";\n}\n\n.icon-3g::before {\n content: \"\\e901\";\n}\n\n.icon-4g::before {\n content: \"\\e902\";\n}\n\n.icon-4g-cam::before {\n content: \"\\e903\";\n}\n\n.icon-4G-Cam--Live-80::before {\n content: \"\\e904\";\n}\n\n.icon-4G-Cam-Camera-80::before {\n content: \"\\e905\";\n}\n\n.icon-4G-Cam-Inbox80::before {\n content: \"\\e906\";\n}\n\n.icon-4G-Cam-Outbox-80::before {\n content: \"\\e907\";\n}\n\n.icon-4G-Cam-Rec-80::before {\n content: \"\\e908\";\n}\n\n.icon-4g-plus::before {\n content: \"\\e909\";\n}\n\n.icon-4G-Cam-Compact::before {\n content: \"\\e90a\";\n}\n\n.icon-1013-Reseau::before {\n content: \"\\e90b\";\n}\n\n.icon-about-event::before {\n content: \"\\e90c\";\n}\n\n.icon-Accessability::before {\n content: \"\\e90d\";\n}\n\n.icon-accessibility-cognition::before {\n content: \"\\e90e\";\n}\n\n.icon-accessibility-dexterity::before {\n content: \"\\e90f\";\n}\n\n.icon-accessibility-hearing::before {\n content: \"\\e910\";\n}\n\n.icon-accessibility-mobility::before {\n content: \"\\e911\";\n}\n\n.icon-accessibility-speech::before {\n content: \"\\e912\";\n}\n\n.icon-accessibility-vision::before {\n content: \"\\e913\";\n}\n\n.icon-accessory-headphones::before {\n content: \"\\e914\";\n}\n\n.icon-accessory-shop::before {\n content: \"\\e915\";\n}\n\n.icon-Add::before {\n content: \"\\e916\";\n}\n\n.icon-add-more::before {\n content: \"\\e917\";\n}\n\n.icon-Add-person::before {\n content: \"\\e918\";\n}\n\n.icon-address-book::before {\n content: \"\\e919\";\n}\n\n.icon-administrator::before {\n content: \"\\e91a\";\n}\n\n.icon-Adultcode::before {\n content: \"\\e91b\";\n}\n\n.icon-Adult::before {\n content: \"\\e91c\";\n}\n\n.icon-advertising::before {\n content: \"\\e91d\";\n}\n\n.icon-aeroplane::before {\n content: \"\\e91e\";\n}\n\n.icon-Age-rating-3::before {\n content: \"\\e91f\";\n}\n\n.icon-Age-rating-4::before {\n content: \"\\e920\";\n}\n\n.icon-Age-rating-7::before {\n content: \"\\e921\";\n}\n\n.icon-Age-rating-9::before {\n content: \"\\e922\";\n}\n\n.icon-Age-rating-12::before {\n content: \"\\e923\";\n}\n\n.icon-Age-rating-16::before {\n content: \"\\e924\";\n}\n\n.icon-Age-rating-17::before {\n content: \"\\e925\";\n}\n\n.icon-Age-rating-18::before {\n content: \"\\e926\";\n}\n\n.icon-age-rating-mono-3::before {\n content: \"\\e927\";\n}\n\n.icon-age-rating-mono-4::before {\n content: \"\\e928\";\n}\n\n.icon-age-rating-mono-7::before {\n content: \"\\e929\";\n}\n\n.icon-age-rating-mono-9::before {\n content: \"\\e92a\";\n}\n\n.icon-age-rating-mono-12::before {\n content: \"\\e92b\";\n}\n\n.icon-age-rating-mono-16::before {\n content: \"\\e92c\";\n}\n\n.icon-age-rating-mono-17::before {\n content: \"\\e92d\";\n}\n\n.icon-age-rating-mono-18::before {\n content: \"\\e92e\";\n}\n\n.icon-agriculture::before {\n content: \"\\e92f\";\n}\n\n.icon-airbox-auto::before {\n content: \"\\e930\";\n}\n\n.icon-alarm-clock::before {\n content: \"\\e931\";\n}\n\n.icon-alarm-off::before {\n content: \"\\e932\";\n}\n\n.icon-Alias-numbers::before {\n content: \"\\e933\";\n}\n\n.icon-all-channels::before {\n content: \"\\e934\";\n}\n\n.icon-antenna::before {\n content: \"\\e935\";\n}\n\n.icon-anti-spam::before {\n content: \"\\e936\";\n}\n\n.icon-antivirus::before {\n content: \"\\e937\";\n}\n\n.icon-Apartment-building::before {\n content: \"\\e938\";\n}\n\n.icon-Apps::before {\n content: \"\\e939\";\n}\n\n.icon-Apps-disabled::before {\n content: \"\\e93a\";\n}\n\n.icon-Archive::before {\n content: \"\\e93b\";\n}\n\n.icon-arrow-down::before {\n content: \"\\e93c\";\n}\n\n.icon-arrow-up::before {\n content: \"\\e93d\";\n}\n\n.icon-arrow-next::before {\n content: \"\\e93e\";\n}\n\n.icon-arrow-previous::before {\n content: \"\\e93f\";\n}\n\n.icon-Art::before {\n content: \"\\e940\";\n}\n\n.icon-assistance::before {\n content: \"\\e941\";\n}\n\n.icon-attachment::before {\n content: \"\\e942\";\n}\n\n.icon-Auditorium::before {\n content: \"\\e943\";\n}\n\n.icon-avatar::before {\n content: \"\\e944\";\n}\n\n.icon-Baby::before {\n content: \"\\e945\";\n}\n\n.icon-backup::before {\n content: \"\\e946\";\n}\n\n.icon-banking::before {\n content: \"\\e947\";\n}\n\n.icon-battery-1-bar::before {\n content: \"\\e948\";\n}\n\n.icon-battery-2-bar::before {\n content: \"\\e949\";\n}\n\n.icon-battery-charging::before {\n content: \"\\e94a\";\n}\n\n.icon-battery-empty::before {\n content: \"\\e94b\";\n}\n\n.icon-battery-full::before {\n content: \"\\e94c\";\n}\n\n.icon-battery-full-2::before {\n content: \"\\e94d\";\n}\n\n.icon-Betting::before {\n content: \"\\e94e\";\n}\n\n.icon-bill-euro::before {\n content: \"\\e94f\";\n}\n\n.icon-billboard::before {\n content: \"\\e950\";\n}\n\n.icon-birthday::before {\n content: \"\\e951\";\n}\n\n.icon-bluetooth::before {\n content: \"\\e952\";\n}\n\n.icon-Book-award::before {\n content: \"\\e953\";\n}\n\n.icon-book-download::before {\n content: \"\\e954\";\n}\n\n.icon-bookmark::before {\n content: \"\\e955\";\n}\n\n.icon-bookmark-smart::before {\n content: \"\\e956\";\n}\n\n.icon-Boxes::before {\n content: \"\\e957\";\n}\n\n.icon-broadcast::before {\n content: \"\\e958\";\n}\n\n.icon-burst-mode::before {\n content: \"\\e959\";\n}\n\n.icon-Business-everywhere::before {\n content: \"\\e95a\";\n}\n\n.icon-business-invoices::before {\n content: \"\\e95b\";\n}\n\n.icon-business-lounge::before {\n content: \"\\e95c\";\n}\n\n.icon-business-telephonie::before {\n content: \"\\e95d\";\n}\n\n.icon-buy::before {\n content: \"\\e95e\";\n}\n\n.icon-buy-back-euro::before {\n content: \"\\e95f\";\n}\n\n.icon-buzz::before {\n content: \"\\e960\";\n}\n\n.icon-Calculator::before {\n content: \"\\e961\";\n}\n\n.icon-calendaralarm::before {\n content: \"\\e962\";\n}\n\n.icon-calendar-30::before {\n content: \"\\e963\";\n}\n\n.icon-calendar-day::before {\n content: \"\\e964\";\n}\n\n.icon-Calendar-fixtures-results::before {\n content: \"\\e965\";\n}\n\n.icon-Calendar-football-match::before {\n content: \"\\e966\";\n}\n\n.icon-calendar-month::before {\n content: \"\\e967\";\n}\n\n.icon-calendar-week::before {\n content: \"\\e968\";\n}\n\n.icon-call::before {\n content: \"\\e969\";\n}\n\n.icon-call-forward::before {\n content: \"\\e96a\";\n}\n\n.icon-call-invite::before {\n content: \"\\e96b\";\n}\n\n.icon-call-log::before {\n content: \"\\e96c\";\n}\n\n.icon-camera::before {\n content: \"\\e96d\";\n}\n\n.icon-Car-park::before {\n content: \"\\e96e\";\n}\n\n.icon-Car-pooling::before {\n content: \"\\e96f\";\n}\n\n.icon-Casting::before {\n content: \"\\e970\";\n}\n\n.icon-Categories::before {\n content: \"\\e971\";\n}\n\n.icon-CD::before {\n content: \"\\e972\";\n}\n\n.icon-change-wallpaper::before {\n content: \"\\e973\";\n}\n\n.icon-Change-wallpaper-1::before {\n content: \"\\e974\";\n}\n\n.icon-charger::before {\n content: \"\\e975\";\n}\n\n.icon-check-your-balance::before {\n content: \"\\e976\";\n}\n\n.icon-Child::before {\n content: \"\\e977\";\n}\n\n.icon-child-protection::before {\n content: \"\\e978\";\n}\n\n.icon-Children-channel::before {\n content: \"\\e979\";\n}\n\n.icon-cineday-silhouette::before {\n content: \"\\e97a\";\n}\n\n.icon-clock::before {\n content: \"\\e97b\";\n}\n\n.icon-cloud-backup::before {\n content: \"\\e97c\";\n}\n\n.icon-Coat-hanger::before {\n content: \"\\e97d\";\n}\n\n.icon-Collective-class-training::before {\n content: \"\\e97e\";\n}\n\n.icon-Colour-Call::before {\n content: \"\\e97f\";\n}\n\n.icon-Comedy-channel::before {\n content: \"\\e980\";\n}\n\n.icon-Comic::before {\n content: \"\\e981\";\n}\n\n.icon-Comments::before {\n content: \"\\e982\";\n}\n\n.icon-commercial-representitive::before {\n content: \"\\e983\";\n}\n\n.icon-community-sms::before {\n content: \"\\e984\";\n}\n\n.icon-Concierge-bell::before {\n content: \"\\e985\";\n}\n\n.icon-conference-call::before {\n content: \"\\e986\";\n}\n\n.icon-connected-object::before {\n content: \"\\e987\";\n}\n\n.icon-connection::before {\n content: \"\\e988\";\n}\n\n.icon-construction::before {\n content: \"\\e989\";\n}\n\n.icon-contact-card::before {\n content: \"\\e98a\";\n}\n\n.icon-control-centre::before {\n content: \"\\e98b\";\n}\n\n.icon-control-mydata::before {\n content: \"\\e98c\";\n}\n\n.icon-copy::before {\n content: \"\\e98d\";\n}\n\n.icon-Courier::before {\n content: \"\\e98e\";\n}\n\n.icon-CPU::before {\n content: \"\\e98f\";\n}\n\n.icon-crane::before {\n content: \"\\e990\";\n}\n\n.icon-Crop::before {\n content: \"\\e991\";\n}\n\n.icon-Currency-brazilian-real::before {\n content: \"\\e992\";\n}\n\n.icon-currency-converter::before {\n content: \"\\e993\";\n}\n\n.icon-Currency-dollar::before {\n content: \"\\e994\";\n}\n\n.icon-currency-euro::before {\n content: \"\\e995\";\n}\n\n.icon-Currency-sterling::before {\n content: \"\\e996\";\n}\n\n.icon-Currency-yen::before {\n content: \"\\e997\";\n}\n\n.icon-data-protection::before {\n content: \"\\e998\";\n}\n\n.icon-data-services::before {\n content: \"\\e999\";\n}\n\n.icon-decoder::before {\n content: \"\\e99a\";\n}\n\n.icon-Decrease-test-size::before {\n content: \"\\e99b\";\n}\n\n.icon-Defibrillator::before {\n content: \"\\e99c\";\n}\n\n.icon-delete::before {\n content: \"\\e99d\";\n}\n\n.icon-device-desktop-computer::before {\n content: \"\\e99e\";\n}\n\n.icon-device-desktop-computer-connected::before {\n content: \"\\e99f\";\n}\n\n.icon-device-fixed-line-phone::before {\n content: \"\\e9a0\";\n}\n\n.icon-device-laptop-computer::before {\n content: \"\\e9a1\";\n}\n\n.icon-device-laptop-computer-connected::before {\n content: \"\\e9a2\";\n}\n\n.icon-device-smart-phone::before {\n content: \"\\e9a3\";\n}\n\n.icon-device-status::before {\n content: \"\\e9a4\";\n}\n\n.icon-device-tablet::before {\n content: \"\\e9a5\";\n}\n\n.icon-device-tablet-connected::before {\n content: \"\\e9a6\";\n}\n\n.icon-device-tv::before {\n content: \"\\e9a7\";\n}\n\n.icon-device-connected-printer::before {\n content: \"\\e9a8\";\n}\n\n.icon-device-manager::before {\n content: \"\\e9a9\";\n}\n\n.icon-device-managment-express::before {\n content: \"\\e9aa\";\n}\n\n.icon-dialler::before {\n content: \"\\e9ab\";\n}\n\n.icon-Digital-frame::before {\n content: \"\\e9ac\";\n}\n\n.icon-disable-apps::before {\n content: \"\\e9ad\";\n}\n\n.icon-Discovery-offer::before {\n content: \"\\e9ae\";\n}\n\n.icon-Discussion-author::before {\n content: \"\\e9af\";\n}\n\n.icon-Discussion-more::before {\n content: \"\\e9b0\";\n}\n\n.icon-Doctor::before {\n content: \"\\e9b1\";\n}\n\n.icon-Doctors-bag::before {\n content: \"\\e9b2\";\n}\n\n.icon-Doctors-communicating::before {\n content: \"\\e9b3\";\n}\n\n.icon-Document-compose::before {\n content: \"\\e9b4\";\n}\n\n.icon-document-stack::before {\n content: \"\\e9b5\";\n}\n\n.icon-document-word::before {\n content: \"\\e9b6\";\n}\n\n.icon-document-zip::before {\n content: \"\\e9b7\";\n}\n\n.icon-Documentary::before {\n content: \"\\e9b8\";\n}\n\n.icon-done-modifier::before {\n content: \"\\e9b9\";\n}\n\n.icon-download::before {\n content: \"\\e9ba\";\n}\n\n.icon-draft::before {\n content: \"\\e9bb\";\n}\n\n.icon-dual-sim-packaging::before {\n content: \"\\e9bc\";\n}\n\n.icon-easy-internet::before {\n content: \"\\e9bd\";\n}\n\n.icon-ebook::before {\n content: \"\\e9be\";\n}\n\n.icon-Eco-mode::before {\n content: \"\\e9bf\";\n}\n\n.icon-edashboard::before {\n content: \"\\e9c0\";\n}\n\n.icon-edit-draft::before {\n content: \"\\e9c1\";\n}\n\n.icon-edit-email::before {\n content: \"\\e9c2\";\n}\n\n.icon-edit-image::before {\n content: \"\\e9c3\";\n}\n\n.icon-Elderly-person::before {\n content: \"\\e9c4\";\n}\n\n.icon-electric-car::before {\n content: \"\\e9c5\";\n}\n\n.icon-electric-car-charging::before {\n content: \"\\e9c6\";\n}\n\n.icon-electricity-provider::before {\n content: \"\\e9c7\";\n}\n\n.icon-elevator::before {\n content: \"\\e9c8\";\n}\n\n.icon-email::before {\n content: \"\\e9c9\";\n}\n\n.icon-email-forwarded::before {\n content: \"\\e9ca\";\n}\n\n.icon-Email-replied::before {\n content: \"\\e9cb\";\n}\n\n.icon-emap::before {\n content: \"\\e9cc\";\n}\n\n.icon-emergency-firemen::before {\n content: \"\\e9cd\";\n}\n\n.icon-emergency-police::before {\n content: \"\\e9ce\";\n}\n\n.icon-emergency-sos::before {\n content: \"\\e9cf\";\n}\n\n.icon-emergency-service::before {\n content: \"\\e9d0\";\n}\n\n.icon-employees-1::before {\n content: \"\\e9d1\";\n}\n\n.icon-Empty-trash::before {\n content: \"\\e9d2\";\n}\n\n.icon-End-call::before {\n content: \"\\e9d3\";\n}\n\n.icon-Entertainment-channel::before {\n content: \"\\e9d4\";\n}\n\n.icon-epg::before {\n content: \"\\e9d5\";\n}\n\n.icon-erase::before {\n content: \"\\e9d6\";\n}\n\n.icon-error-severe::before {\n content: \"\\e9d7\";\n}\n\n.icon-Ethenet::before {\n content: \"\\e9d8\";\n}\n\n.icon-event-agenda::before {\n content: \"\\e9d9\";\n}\n\n.icon-event-organiser::before {\n content: \"\\e9da\";\n}\n\n.icon-event-speaker::before {\n content: \"\\e9db\";\n}\n\n.icon-Excel::before {\n content: \"\\e9dc\";\n}\n\n.icon-Expand-screen::before {\n content: \"\\e9dd\";\n}\n\n.icon-expert::before {\n content: \"\\e9de\";\n}\n\n.icon-external-drive::before {\n content: \"\\e9df\";\n}\n\n.icon-Factory::before {\n content: \"\\e9e0\";\n}\n\n.icon-family-place::before {\n content: \"\\e9e1\";\n}\n\n.icon-Fast-delivery::before {\n content: \"\\e9e2\";\n}\n\n.icon-Favorite-music::before {\n content: \"\\e9e3\";\n}\n\n.icon-favourite::before {\n content: \"\\e9e4\";\n}\n\n.icon-Featured::before {\n content: \"\\e9e5\";\n}\n\n.icon-filter::before {\n content: \"\\e9e6\";\n}\n\n.icon-Filter-effects::before {\n content: \"\\e9e7\";\n}\n\n.icon-finance::before {\n content: \"\\e9e8\";\n}\n\n.icon-fire::before {\n content: \"\\e9e9\";\n}\n\n.icon-Fire-extinguisher::before {\n content: \"\\e9ea\";\n}\n\n.icon-Firewall::before {\n content: \"\\e9eb\";\n}\n\n.icon-flexible-storage::before {\n content: \"\\e9ec\";\n}\n\n.icon-folder-camera::before {\n content: \"\\e9ed\";\n}\n\n.icon-folder-document::before {\n content: \"\\e9ee\";\n}\n\n.icon-folder-favourite::before {\n content: \"\\e9ef\";\n}\n\n.icon-folder-sd::before {\n content: \"\\e9f0\";\n}\n\n.icon-football::before {\n content: \"\\e9f1\";\n}\n\n.icon-Football-match::before {\n content: \"\\e9f2\";\n}\n\n.icon-Football-quiz::before {\n content: \"\\e9f3\";\n}\n\n.icon-Forward::before {\n content: \"\\e9f4\";\n}\n\n.icon-Forward-curved-arrow::before {\n content: \"\\e9f5\";\n}\n\n.icon-forward-the-number::before {\n content: \"\\e9f6\";\n}\n\n.icon-free-tag::before {\n content: \"\\e9f7\";\n}\n\n.icon-Free-up-space::before {\n content: \"\\e9f8\";\n}\n\n.icon-front-end-dashboard::before {\n content: \"\\e9f9\";\n}\n\n.icon-Full-screen-view::before {\n content: \"\\e9fa\";\n}\n\n.icon-Gallery::before {\n content: \"\\e9fb\";\n}\n\n.icon-games::before {\n content: \"\\e9fc\";\n}\n\n.icon-Gas-tank::before {\n content: \"\\e9fd\";\n}\n\n.icon-gaugecapacity::before {\n content: \"\\e9fe\";\n}\n\n.icon-gauge-counter::before {\n content: \"\\e9ff\";\n}\n\n.icon-gauge-rate::before {\n content: \"\\ea00\";\n}\n\n.icon-gauge-mon-reseau::before {\n content: \"\\ea01\";\n}\n\n.icon-generic-document::before {\n content: \"\\ea02\";\n}\n\n.icon-geolocation::before {\n content: \"\\ea03\";\n}\n\n.icon-hands-free::before {\n content: \"\\ea04\";\n}\n\n.icon-HDMI-Card::before {\n content: \"\\ea05\";\n}\n\n.icon-health::before {\n content: \"\\ea06\";\n}\n\n.icon-health-monitor::before {\n content: \"\\ea07\";\n}\n\n.icon-Health-patient::before {\n content: \"\\ea08\";\n}\n\n.icon-Heart-rate::before {\n content: \"\\ea09\";\n}\n\n.icon-Heartbeats::before {\n content: \"\\ea0a\";\n}\n\n.icon-help-guide::before {\n content: \"\\ea0b\";\n}\n\n.icon-history::before {\n content: \"\\ea0c\";\n}\n\n.icon-home::before {\n content: \"\\ea0d\";\n}\n\n.icon-Home-1::before {\n content: \"\\ea0e\";\n}\n\n.icon-home-alarm::before {\n content: \"\\ea0f\";\n}\n\n.icon-Homelive::before {\n content: \"\\ea10\";\n}\n\n.icon-homescreen::before {\n content: \"\\ea11\";\n}\n\n.icon-Horoscopes::before {\n content: \"\\ea12\";\n}\n\n.icon-hospital::before {\n content: \"\\ea13\";\n}\n\n.icon-hotel::before {\n content: \"\\ea14\";\n}\n\n.icon-Hourglass::before {\n content: \"\\ea15\";\n}\n\n.icon-Im-driving::before {\n content: \"\\ea16\";\n}\n\n.icon-image::before {\n content: \"\\ea17\";\n}\n\n.icon-image-file::before {\n content: \"\\ea18\";\n}\n\n.icon-improvement::before {\n content: \"\\ea19\";\n}\n\n.icon-inbox::before {\n content: \"\\ea1a\";\n}\n\n.icon-Incoming-call-curved-arrow::before {\n content: \"\\ea1b\";\n}\n\n.icon-Increase-test-size::before {\n content: \"\\ea1c\";\n}\n\n.icon-info::before {\n content: \"\\ea1d\";\n}\n\n.icon-Information-data::before {\n content: \"\\ea1e\";\n}\n\n.icon-internationaltv::before {\n content: \"\\ea1f\";\n}\n\n.icon-international-globe::before {\n content: \"\\ea20\";\n}\n\n.icon-internet::before {\n content: \"\\ea21\";\n}\n\n.icon-internet-browser::before {\n content: \"\\ea22\";\n}\n\n.icon-Internet-security-desktop::before {\n content: \"\\ea23\";\n}\n\n.icon-Internet-security-mobile::before {\n content: \"\\ea24\";\n}\n\n.icon-Internet-security-password::before {\n content: \"\\ea25\";\n}\n\n.icon-Internet-security-server::before {\n content: \"\\ea26\";\n}\n\n.icon-internet-usage::before {\n content: \"\\ea27\";\n}\n\n.icon-Interventions::before {\n content: \"\\ea28\";\n}\n\n.icon-IT-infrastructure::before {\n content: \"\\ea29\";\n}\n\n.icon-keeper::before {\n content: \"\\ea2a\";\n}\n\n.icon-keyboard::before {\n content: \"\\ea2b\";\n}\n\n.icon-Keypad::before {\n content: \"\\ea2c\";\n}\n\n.icon-La-Cle::before {\n content: \"\\ea2d\";\n}\n\n.icon-Language::before {\n content: \"\\ea2e\";\n}\n\n.icon-Latest::before {\n content: \"\\ea2f\";\n}\n\n.icon-Le-Bloc::before {\n content: \"\\ea30\";\n}\n\n.icon-Leave-session::before {\n content: \"\\ea31\";\n}\n\n.icon-lightbulb-sh::before {\n content: \"\\ea32\";\n}\n\n.icon-ligue-1::before {\n content: \"\\ea33\";\n}\n\n.icon-Link::before {\n content: \"\\ea34\";\n}\n\n.icon-live::before {\n content: \"\\ea35\";\n}\n\n.icon-livebox::before {\n content: \"\\ea36\";\n}\n\n.icon-livebox-info::before {\n content: \"\\ea37\";\n}\n\n.icon-livebox-phone::before {\n content: \"\\ea38\";\n}\n\n.icon-location-pin-compass::before {\n content: \"\\ea39\";\n}\n\n.icon-lock::before {\n content: \"\\ea3a\";\n}\n\n.icon-Lock-screen-settings::before {\n content: \"\\ea3b\";\n}\n\n.icon-logistics::before {\n content: \"\\ea3c\";\n}\n\n.icon-logout::before {\n content: \"\\ea3d\";\n}\n\n.icon-Maintenance-man::before {\n content: \"\\ea3e\";\n}\n\n.icon-manage-android::before {\n content: \"\\ea3f\";\n}\n\n.icon-managing-equipment::before {\n content: \"\\ea40\";\n}\n\n.icon-Map::before {\n content: \"\\ea41\";\n}\n\n.icon-map-pin::before {\n content: \"\\ea42\";\n}\n\n.icon-Medal::before {\n content: \"\\ea43\";\n}\n\n.icon-Medical-app::before {\n content: \"\\ea44\";\n}\n\n.icon-Medical-app-phone::before {\n content: \"\\ea45\";\n}\n\n.icon-medical-chart::before {\n content: \"\\ea46\";\n}\n\n.icon-Medical-files::before {\n content: \"\\ea47\";\n}\n\n.icon-menu::before {\n content: \"\\ea48\";\n}\n\n.icon-Message-download::before {\n content: \"\\ea49\";\n}\n\n.icon-messaging::before {\n content: \"\\ea4a\";\n}\n\n.icon-messaging-compose-sms::before {\n content: \"\\ea4b\";\n}\n\n.icon-messaging-unified::before {\n content: \"\\ea4c\";\n}\n\n.icon-messaging-untitled-compose::before {\n content: \"\\ea4d\";\n}\n\n.icon-microphone::before {\n content: \"\\ea4e\";\n}\n\n.icon-Microscope::before {\n content: \"\\ea4f\";\n}\n\n.icon-mini-games::before {\n content: \"\\ea50\";\n}\n\n.icon-mirroring::before {\n content: \"\\ea51\";\n}\n\n.icon-Missed-call-boxed-arrow::before {\n content: \"\\ea52\";\n}\n\n.icon-Missed-call-curved-arrow::before {\n content: \"\\ea53\";\n}\n\n.icon-mobile-applications::before {\n content: \"\\ea54\";\n}\n\n.icon-Mobile-backup-restore::before {\n content: \"\\ea55\";\n}\n\n.icon-mobile-box::before {\n content: \"\\ea56\";\n}\n\n.icon-mobile-data-toggle::before {\n content: \"\\ea57\";\n}\n\n.icon-mobile-insurance::before {\n content: \"\\ea58\";\n}\n\n.icon-mobile-network-coverage::before {\n content: \"\\ea59\";\n}\n\n.icon-mobile-security::before {\n content: \"\\ea5a\";\n}\n\n.icon-mobile-setup::before {\n content: \"\\ea5b\";\n}\n\n.icon-Modem::before {\n content: \"\\ea5c\";\n}\n\n.icon-modifier-add::before {\n content: \"\\ea5d\";\n}\n\n.icon-Modifier-delete::before {\n content: \"\\ea5e\";\n}\n\n.icon-Modifier-favorite::before {\n content: \"\\ea5f\";\n}\n\n.icon-modifier-new::before {\n content: \"\\ea60\";\n}\n\n.icon-modifier-no-access::before {\n content: \"\\ea61\";\n}\n\n.icon-modifier-synchro::before {\n content: \"\\ea62\";\n}\n\n.icon-modifier-upload::before {\n content: \"\\ea63\";\n}\n\n.icon-modifier-wizard::before {\n content: \"\\ea64\";\n}\n\n.icon-Modifier-download::before {\n content: \"\\ea65\";\n}\n\n.icon-mon-reseau::before {\n content: \"\\ea66\";\n}\n\n.icon-money::before {\n content: \"\\ea67\";\n}\n\n.icon-More-dots::before {\n content: \"\\ea68\";\n}\n\n.icon-move-to-folder::before {\n content: \"\\ea69\";\n}\n\n.icon-multi-sim::before {\n content: \"\\ea6a\";\n}\n\n.icon-multiple-timezone::before {\n content: \"\\ea6b\";\n}\n\n.icon-Music-artist::before {\n content: \"\\ea6c\";\n}\n\n.icon-music-file::before {\n content: \"\\ea6d\";\n}\n\n.icon-Music-genre::before {\n content: \"\\ea6e\";\n}\n\n.icon-music-player::before {\n content: \"\\ea6f\";\n}\n\n.icon-Mute-microphone::before {\n content: \"\\ea70\";\n}\n\n.icon-my-account::before {\n content: \"\\ea71\";\n}\n\n.icon-my-bill-uk::before {\n content: \"\\ea72\";\n}\n\n.icon-my-boutique::before {\n content: \"\\ea73\";\n}\n\n.icon-my-essential::before {\n content: \"\\ea74\";\n}\n\n.icon-my-essential-tablet::before {\n content: \"\\ea75\";\n}\n\n.icon-my-livebox::before {\n content: \"\\ea76\";\n}\n\n.icon-my-media::before {\n content: \"\\ea77\";\n}\n\n.icon-My-Office-Phone::before {\n content: \"\\ea78\";\n}\n\n.icon-my-orange::before {\n content: \"\\ea79\";\n}\n\n.icon-my-plug::before {\n content: \"\\ea7a\";\n}\n\n.icon-my-services::before {\n content: \"\\ea7b\";\n}\n\n.icon-my-travels::before {\n content: \"\\ea7c\";\n}\n\n.icon-Nature::before {\n content: \"\\ea7d\";\n}\n\n.icon-Network-add::before {\n content: \"\\ea7e\";\n}\n\n.icon-Network-livebox::before {\n content: \"\\ea7f\";\n}\n\n.icon-networks::before {\n content: \"\\ea80\";\n}\n\n.icon-new::before {\n content: \"\\ea81\";\n}\n\n.icon-newspaper::before {\n content: \"\\ea82\";\n}\n\n.icon-nfc::before {\n content: \"\\ea83\";\n}\n\n.icon-NFC-tag::before {\n content: \"\\ea84\";\n}\n\n.icon-no-sim::before {\n content: \"\\ea85\";\n}\n\n.icon-Notification::before {\n content: \"\\ea86\";\n}\n\n.icon-Notification-Bell::before {\n content: \"\\ea87\";\n}\n\n.icon-nouveau-contract-social::before {\n content: \"\\ea88\";\n}\n\n.icon-numero-unique::before {\n content: \"\\ea89\";\n}\n\n.icon-office::before {\n content: \"\\ea8a\";\n}\n\n.icon-oil-and-gas::before {\n content: \"\\ea8b\";\n}\n\n.icon-On-board-unit::before {\n content: \"\\ea8c\";\n}\n\n.icon-online-help::before {\n content: \"\\ea8d\";\n}\n\n.icon-orangewallet::before {\n content: \"\\ea8e\";\n}\n\n.icon-orange-assistant::before {\n content: \"\\ea8f\";\n}\n\n.icon-orange-cash::before {\n content: \"\\ea90\";\n}\n\n.icon-orange-corporate::before {\n content: \"\\ea91\";\n}\n\n.icon-Orange-Detente::before {\n content: \"\\ea92\";\n}\n\n.icon-orange-events::before {\n content: \"\\ea93\";\n}\n\n.icon-Orange-Experts-Class-Training::before {\n content: \"\\ea94\";\n}\n\n.icon-Orange-Experts-Copy-Keep::before {\n content: \"\\ea95\";\n}\n\n.icon-orange-experts-expert::before {\n content: \"\\ea96\";\n}\n\n.icon-orange-experts-insurance::before {\n content: \"\\ea97\";\n}\n\n.icon-Orange-Experts-One2One-Coach::before {\n content: \"\\ea98\";\n}\n\n.icon-orange-experts-orange-business-consultant::before {\n content: \"\\ea99\";\n}\n\n.icon-orange-experts-orange-startup-smartphone::before {\n content: \"\\ea9a\";\n}\n\n.icon-orange-experts-recycle::before {\n content: \"\\ea9b\";\n}\n\n.icon-orange-experts-repair::before {\n content: \"\\ea9c\";\n}\n\n.icon-orange-experts-tranquil::before {\n content: \"\\ea9d\";\n}\n\n.icon-Orange-Football-Club::before {\n content: \"\\ea9e\";\n}\n\n.icon-orange-foundation::before {\n content: \"\\ea9f\";\n}\n\n.icon-Orange-garden::before {\n content: \"\\eaa0\";\n}\n\n.icon-orange-gesture::before {\n content: \"\\eaa1\";\n}\n\n.icon-orange-jobs::before {\n content: \"\\eaa2\";\n}\n\n.icon-orange-messenger::before {\n content: \"\\eaa3\";\n}\n\n.icon-Orange-Messenger-1::before {\n content: \"\\eaa4\";\n}\n\n.icon-orange-money::before {\n content: \"\\eaa5\";\n}\n\n.icon-orange-Photography::before {\n content: \"\\eaa6\";\n}\n\n.icon-orange-pro::before {\n content: \"\\eaa7\";\n}\n\n.icon-orange-protect::before {\n content: \"\\eaa8\";\n}\n\n.icon-orange-radio::before {\n content: \"\\eaa9\";\n}\n\n.icon-orange-reflections::before {\n content: \"\\eaaa\";\n}\n\n.icon-Orange-rewards::before {\n content: \"\\eaab\";\n}\n\n.icon-Orange-security-suite::before {\n content: \"\\eaac\";\n}\n\n.icon-orange-travel::before {\n content: \"\\eaad\";\n}\n\n.icon-orange-tv::before {\n content: \"\\eaae\";\n}\n\n.icon-orange-wallet::before {\n content: \"\\eaaf\";\n}\n\n.icon-orange-wifi::before {\n content: \"\\eab0\";\n}\n\n.icon-Orange-Guest::before {\n content: \"\\eab1\";\n}\n\n.icon-organisation::before {\n content: \"\\eab2\";\n}\n\n.icon-outbox::before {\n content: \"\\eab3\";\n}\n\n.icon-outdoor-sports-mountain-biking::before {\n content: \"\\eab4\";\n}\n\n.icon-outdoor-sports-skiing::before {\n content: \"\\eab5\";\n}\n\n.icon-Package::before {\n content: \"\\eab6\";\n}\n\n.icon-Package-content::before {\n content: \"\\eab7\";\n}\n\n.icon-parabole-tv::before {\n content: \"\\eab8\";\n}\n\n.icon-parental-control::before {\n content: \"\\eab9\";\n}\n\n.icon-Parrasol::before {\n content: \"\\eaba\";\n}\n\n.icon-pass-video::before {\n content: \"\\eabb\";\n}\n\n.icon-Pause::before {\n content: \"\\eabc\";\n}\n\n.icon-Payment-euro::before {\n content: \"\\eabd\";\n}\n\n.icon-pda-device::before {\n content: \"\\eabe\";\n}\n\n.icon-pdf-file::before {\n content: \"\\eabf\";\n}\n\n.icon-Pencil::before {\n content: \"\\eac0\";\n}\n\n.icon-personal-smartphone-trainer::before {\n content: \"\\eac1\";\n}\n\n.icon-phone-advisor::before {\n content: \"\\eac2\";\n}\n\n.icon-phone-fund::before {\n content: \"\\eac3\";\n}\n\n.icon-phone-protection::before {\n content: \"\\eac4\";\n}\n\n.icon-Photo-dialer::before {\n content: \"\\eac5\";\n}\n\n.icon-picture-messaging::before {\n content: \"\\eac6\";\n}\n\n.icon-Pills::before {\n content: \"\\eac7\";\n}\n\n.icon-pioneering::before {\n content: \"\\eac8\";\n}\n\n.icon-Play::before {\n content: \"\\eac9\";\n}\n\n.icon-play-and-win::before {\n content: \"\\eaca\";\n}\n\n.icon-playmode-random::before {\n content: \"\\eacb\";\n}\n\n.icon-polls::before {\n content: \"\\eacc\";\n}\n\n.icon-portfolio::before {\n content: \"\\eacd\";\n}\n\n.icon-POS-payment::before {\n content: \"\\eace\";\n}\n\n.icon-power::before {\n content: \"\\eacf\";\n}\n\n.icon-powerpoint-file::before {\n content: \"\\ead0\";\n}\n\n.icon-presentation::before {\n content: \"\\ead1\";\n}\n\n.icon-previous::before {\n content: \"\\ead2\";\n}\n\n.icon-printer::before {\n content: \"\\ead3\";\n}\n\n.icon-profileringtone::before {\n content: \"\\ead4\";\n}\n\n.icon-public-transport::before {\n content: \"\\ead5\";\n}\n\n.icon-publish::before {\n content: \"\\ead6\";\n}\n\n.icon-Quirky-stories::before {\n content: \"\\ead7\";\n}\n\n.icon-Quiz::before {\n content: \"\\ead8\";\n}\n\n.icon-Radiography::before {\n content: \"\\ead9\";\n}\n\n.icon-ratings-stars::before {\n content: \"\\eada\";\n}\n\n.icon-Real-time::before {\n content: \"\\eadb\";\n}\n\n.icon-recommend::before {\n content: \"\\eadc\";\n}\n\n.icon-record::before {\n content: \"\\eadd\";\n}\n\n.icon-Record-1::before {\n content: \"\\eade\";\n}\n\n.icon-recycle-device::before {\n content: \"\\eadf\";\n}\n\n.icon-Redo::before {\n content: \"\\eae0\";\n}\n\n.icon-relationship::before {\n content: \"\\eae1\";\n}\n\n.icon-reload::before {\n content: \"\\eae2\";\n}\n\n.icon-remote-control::before {\n content: \"\\eae3\";\n}\n\n.icon-Remote-control-1::before {\n content: \"\\eae4\";\n}\n\n.icon-remove-modifier::before {\n content: \"\\eae5\";\n}\n\n.icon-Replay-boxed-arrow::before {\n content: \"\\eae6\";\n}\n\n.icon-Reply-boxed-arrow::before {\n content: \"\\eae7\";\n}\n\n.icon-Reply-curved-arrow::before {\n content: \"\\eae8\";\n}\n\n.icon-report::before {\n content: \"\\eae9\";\n}\n\n.icon-responsible::before {\n content: \"\\eaea\";\n}\n\n.icon-Restaurant::before {\n content: \"\\eaeb\";\n}\n\n.icon-restore-to-phone::before {\n content: \"\\eaec\";\n}\n\n.icon-Restrictied-content::before {\n content: \"\\eaed\";\n}\n\n.icon-rewards::before {\n content: \"\\eaee\";\n}\n\n.icon-ringtones::before {\n content: \"\\eaef\";\n}\n\n.icon-running::before {\n content: \"\\eaf0\";\n}\n\n.icon-Scales::before {\n content: \"\\eaf1\";\n}\n\n.icon-scan-ticket::before {\n content: \"\\eaf2\";\n}\n\n.icon-School::before {\n content: \"\\eaf3\";\n}\n\n.icon-Science::before {\n content: \"\\eaf4\";\n}\n\n.icon-Scissors::before {\n content: \"\\eaf5\";\n}\n\n.icon-sd-card::before {\n content: \"\\eaf6\";\n}\n\n.icon-SD-card-1::before {\n content: \"\\eaf7\";\n}\n\n.icon-search::before {\n content: \"\\eaf8\";\n}\n\n.icon-Send::before {\n content: \"\\eaf9\";\n}\n\n.icon-Send-to-person::before {\n content: \"\\eafa\";\n}\n\n.icon-Server::before {\n content: \"\\eafb\";\n}\n\n.icon-servers::before {\n content: \"\\eafc\";\n}\n\n.icon-settings::before {\n content: \"\\eafd\";\n}\n\n.icon-setup-and-repair::before {\n content: \"\\eafe\";\n}\n\n.icon-setup-and-repair-cog::before {\n content: \"\\eaff\";\n}\n\n.icon-setup-internet::before {\n content: \"\\eb00\";\n}\n\n.icon-share::before {\n content: \"\\eb01\";\n}\n\n.icon-Share-wifi::before {\n content: \"\\eb02\";\n}\n\n.icon-shipping::before {\n content: \"\\eb03\";\n}\n\n.icon-Shop::before {\n content: \"\\eb04\";\n}\n\n.icon-shop-pin::before {\n content: \"\\eb05\";\n}\n\n.icon-shop-subscriptions::before {\n content: \"\\eb06\";\n}\n\n.icon-Shopping::before {\n content: \"\\eb07\";\n}\n\n.icon-Show-front-back-camera::before {\n content: \"\\eb08\";\n}\n\n.icon-Shower::before {\n content: \"\\eb09\";\n}\n\n.icon-showroom-mobile-pro::before {\n content: \"\\eb0a\";\n}\n\n.icon-signal-1-5::before {\n content: \"\\eb0b\";\n}\n\n.icon-signal-2-5::before {\n content: \"\\eb0c\";\n}\n\n.icon-signal-3-5::before {\n content: \"\\eb0d\";\n}\n\n.icon-signal-4-5::before {\n content: \"\\eb0e\";\n}\n\n.icon-signal-5-5::before {\n content: \"\\eb0f\";\n}\n\n.icon-signal-boost::before {\n content: \"\\eb10\";\n}\n\n.icon-Silent::before {\n content: \"\\eb11\";\n}\n\n.icon-sim::before {\n content: \"\\eb12\";\n}\n\n.icon-simple-mode::before {\n content: \"\\eb13\";\n}\n\n.icon-Simplicity::before {\n content: \"\\eb14\";\n}\n\n.icon-Skip-backward::before {\n content: \"\\eb15\";\n}\n\n.icon-Skip-forward::before {\n content: \"\\eb16\";\n}\n\n.icon-Sleep::before {\n content: \"\\eb17\";\n}\n\n.icon-Smart-electric-meter::before {\n content: \"\\eb18\";\n}\n\n.icon-Smart-heating-switch::before {\n content: \"\\eb19\";\n}\n\n.icon-smart-home::before {\n content: \"\\eb1a\";\n}\n\n.icon-smart-lightswitch::before {\n content: \"\\eb1b\";\n}\n\n.icon-smart-powerstation::before {\n content: \"\\eb1c\";\n}\n\n.icon-Smart-Sensor::before {\n content: \"\\eb1d\";\n}\n\n.icon-smart-tap::before {\n content: \"\\eb1e\";\n}\n\n.icon-smart-watch::before {\n content: \"\\eb1f\";\n}\n\n.icon-social-network::before {\n content: \"\\eb20\";\n}\n\n.icon-software-update::before {\n content: \"\\eb21\";\n}\n\n.icon-Sport-channel::before {\n content: \"\\eb22\";\n}\n\n.icon-Start-services::before {\n content: \"\\eb23\";\n}\n\n.icon-startup-wizard::before {\n content: \"\\eb24\";\n}\n\n.icon-stocks::before {\n content: \"\\eb25\";\n}\n\n.icon-stop-secret::before {\n content: \"\\eb26\";\n}\n\n.icon-Stop-video::before {\n content: \"\\eb27\";\n}\n\n.icon-Storage-cloud::before {\n content: \"\\eb28\";\n}\n\n.icon-store-locator::before {\n content: \"\\eb29\";\n}\n\n.icon-Street::before {\n content: \"\\eb2a\";\n}\n\n.icon-Stretcher::before {\n content: \"\\eb2b\";\n}\n\n.icon-subscription-package::before {\n content: \"\\eb2c\";\n}\n\n.icon-Sudoku::before {\n content: \"\\eb2d\";\n}\n\n.icon-support::before {\n content: \"\\eb2e\";\n}\n\n.icon-surveillance-camera::before {\n content: \"\\eb2f\";\n}\n\n.icon-Syncronise::before {\n content: \"\\eb30\";\n}\n\n.icon-target-location::before {\n content: \"\\eb31\";\n}\n\n.icon-tarif::before {\n content: \"\\eb32\";\n}\n\n.icon-tariff::before {\n content: \"\\eb33\";\n}\n\n.icon-task-list::before {\n content: \"\\eb34\";\n}\n\n.icon-Taxi::before {\n content: \"\\eb35\";\n}\n\n.icon-team-connect::before {\n content: \"\\eb36\";\n}\n\n.icon-temperature::before {\n content: \"\\eb37\";\n}\n\n.icon-terms-conditions::before {\n content: \"\\eb38\";\n}\n\n.icon-text-alerts::before {\n content: \"\\eb39\";\n}\n\n.icon-Thumb-down::before {\n content: \"\\eb3a\";\n}\n\n.icon-Thumb-up::before {\n content: \"\\eb3b\";\n}\n\n.icon-tick::before {\n content: \"\\eb3c\";\n}\n\n.icon-tick-circle::before {\n content: \"\\eb3d\";\n}\n\n.icon-tickets::before {\n content: \"\\eb3e\";\n}\n\n.icon-Top-10::before {\n content: \"\\eb3f\";\n}\n\n.icon-top-up-dollar::before {\n content: \"\\eb40\";\n}\n\n.icon-top-up-euro::before {\n content: \"\\eb41\";\n}\n\n.icon-top-up-uk-bank::before {\n content: \"\\eb42\";\n}\n\n.icon-touch-screen::before {\n content: \"\\eb43\";\n}\n\n.icon-town::before {\n content: \"\\eb44\";\n}\n\n.icon-townhall::before {\n content: \"\\eb45\";\n}\n\n.icon-track-your-delivery::before {\n content: \"\\eb46\";\n}\n\n.icon-track-your-order::before {\n content: \"\\eb47\";\n}\n\n.icon-Trading::before {\n content: \"\\eb48\";\n}\n\n.icon-trash::before {\n content: \"\\eb49\";\n}\n\n.icon-tv-plus::before {\n content: \"\\eb4a\";\n}\n\n.icon-TV-series::before {\n content: \"\\eb4b\";\n}\n\n.icon-Undo::before {\n content: \"\\eb4c\";\n}\n\n.icon-unique::before {\n content: \"\\eb4d\";\n}\n\n.icon-unknown-file::before {\n content: \"\\eb4e\";\n}\n\n.icon-unlimited-calls::before {\n content: \"\\eb4f\";\n}\n\n.icon-unlocked::before {\n content: \"\\eb50\";\n}\n\n.icon-Unmissable::before {\n content: \"\\eb51\";\n}\n\n.icon-upload::before {\n content: \"\\eb52\";\n}\n\n.icon-USB::before {\n content: \"\\eb53\";\n}\n\n.icon-usb-key::before {\n content: \"\\eb54\";\n}\n\n.icon-Value::before {\n content: \"\\eb55\";\n}\n\n.icon-vehicle::before {\n content: \"\\eb56\";\n}\n\n.icon-video::before {\n content: \"\\eb57\";\n}\n\n.icon-video-file::before {\n content: \"\\eb58\";\n}\n\n.icon-video-phone::before {\n content: \"\\eb59\";\n}\n\n.icon-video-meeting2::before {\n content: \"\\eb5a\";\n}\n\n.icon-Vinyl::before {\n content: \"\\eb5b\";\n}\n\n.icon-vip-contact::before {\n content: \"\\eb5c\";\n}\n\n.icon-virtual-gamepad::before {\n content: \"\\eb5d\";\n}\n\n.icon-visual-voicemail::before {\n content: \"\\eb5e\";\n}\n\n.icon-vod-portrait::before {\n content: \"\\eb5f\";\n}\n\n.icon-volte::before {\n content: \"\\eb60\";\n}\n\n.icon-volume-high::before {\n content: \"\\eb61\";\n}\n\n.icon-volume-low::before {\n content: \"\\eb62\";\n}\n\n.icon-volume-mid::before {\n content: \"\\eb63\";\n}\n\n.icon-volume-none::before {\n content: \"\\eb64\";\n}\n\n.icon-vowifi::before {\n content: \"\\eb65\";\n}\n\n.icon-vvm-message-read-full::before {\n content: \"\\eb66\";\n}\n\n.icon-Warehouse::before {\n content: \"\\eb67\";\n}\n\n.icon-Warningimportant::before {\n content: \"\\eb68\";\n}\n\n.icon-Warning-important::before {\n content: \"\\eb69\";\n}\n\n.icon-web-cam::before {\n content: \"\\eb6a\";\n}\n\n.icon-web-fax-widget::before {\n content: \"\\eb6b\";\n}\n\n.icon-Wholesale-retail::before {\n content: \"\\eb6c\";\n}\n\n.icon-Widget::before {\n content: \"\\eb6d\";\n}\n\n.icon-widget-tour::before {\n content: \"\\eb6e\";\n}\n\n.icon-wifi::before {\n content: \"\\eb6f\";\n}\n\n.icon-wifi-0::before {\n content: \"\\eb70\";\n}\n\n.icon-wifi-1::before {\n content: \"\\eb71\";\n}\n\n.icon-wifi-2::before {\n content: \"\\eb72\";\n}\n\n.icon-wps-pairing::before {\n content: \"\\eb73\";\n}\n\n.icon-WPT::before {\n content: \"\\eb74\";\n}\n\n.icon-zoom-in::before {\n content: \"\\eb75\";\n}\n\n.icon-zoom-out::before {\n content: \"\\eb76\";\n}\n\n.icon-popout-tech::before {\n content: \"\\e634\";\n}\n\n.icon-frame-care::before {\n content: \"\\e640\";\n}\n\n.icon-frame-family::before {\n content: \"\\e637\";\n}\n\n.icon-frame-fun::before {\n content: \"\\e638\";\n}\n\n.icon-frame-home::before {\n content: \"\\e639\";\n}\n\n.icon-frame-money::before {\n content: \"\\e63a\";\n}\n\n.icon-frame-on-the-move::before {\n content: \"\\e63b\";\n}\n\n.icon-frame-tariff::before {\n content: \"\\e63c\";\n}\n\n.icon-frame-tech::before {\n content: \"\\e63d\";\n}\n\n.icon-frame-wellbeing::before {\n content: \"\\e63e\";\n}\n\n.icon-frame-work::before {\n content: \"\\e63f\";\n}\n\n.icon-popout-care::before {\n content: \"\\e62d\";\n}\n\n.icon-popout-family::before {\n content: \"\\e62e\";\n}\n\n.icon-popout-fun::before {\n content: \"\\e62f\";\n}\n\n.icon-popout-home::before {\n content: \"\\e630\";\n}\n\n.icon-popout-money::before {\n content: \"\\e631\";\n}\n\n.icon-popout-on-the-move::before {\n content: \"\\e632\";\n}\n\n.icon-popout-tariff::before {\n content: \"\\e633\";\n}\n\n.icon-popout-wellbeing::before {\n content: \"\\e635\";\n}\n\n.icon-popout-work::before {\n content: \"\\e636\";\n}\n\n.icon-frame-connectivity::before {\n content: \"\\eb78\";\n}\n\n.icon-frame-my-customers::before {\n content: \"\\eb79\";\n}\n\n.icon-frame-performance::before {\n content: \"\\eb7a\";\n}\n\n.icon-frame-security::before {\n content: \"\\eb7b\";\n}\n\n.icon-frame-teamwork::before {\n content: \"\\eb7c\";\n}\n\n.icon-popout-connectivity::before {\n content: \"\\eb7d\";\n}\n\n.icon-popout-my-customers::before {\n content: \"\\eb7e\";\n}\n\n.icon-popout-performance::before {\n content: \"\\eb7f\";\n}\n\n.icon-popout-security::before {\n content: \"\\eb80\";\n}\n\n.icon-popout-teamwork::before {\n content: \"\\eb81\";\n}\n\n.svg-delete,\n.svg-checkbox-tick,\n.svg-warning-circle,\n.svg-menu,\n.svg-tick,\n.svg-success,\n.svg-warning,\n.svg-info,\n.svg-error,\n.svg-arrow-previous,\n.svg-arrow-next,\n.svg-settings,\n.svg-search,\n.svg-avatar,\n.svg-buy {\n position: relative;\n}\n\n.svg-delete::after,\n.svg-checkbox-tick::after,\n.svg-warning-circle::after,\n.svg-menu::after,\n.svg-tick::after,\n.svg-arrow-previous::after,\n.svg-arrow-next::after,\n.svg-settings::after,\n.svg-search::after,\n.svg-avatar::after,\n.svg-buy::after,\n.svg-success::after,\n.svg-warning::after,\n.svg-info::after,\n.svg-error::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.svg-delete::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-checkbox-tick::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-warning-circle::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='%23527edb'/%3E%3C/svg%3E\");\n}\n\n.svg-menu::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-menu:hover::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-tick::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='%2332c832'/%3E%3C/svg%3E\");\n}\n\n.svg-success::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-warning::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='%23fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\");\n}\n\n.svg-error::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-info::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%23527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-previous::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-previous:hover::after,\n.svg-arrow-previous:focus::after,\n.svg-arrow-previous:active::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next.btn-primary::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next.btn-primary:active::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-settings::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-settings:hover::after,\n.svg-settings:focus::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.svg-search::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-search:hover::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.svg-avatar::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23fff'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-avatar:hover::after,\n.svg-avatar:active::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23f16e00'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.svg-buy::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-buy:hover::after,\n.svg-buy:active::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.btn-mail {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail:hover, .btn-mail:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-mail {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n.btn-mail-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-mail-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-lin {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-lin:hover, .btn-lin:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n}\n\n.btn-lin:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-lin {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-lin-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n}\n\n.btn-lin-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-lin-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-gplus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-gplus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-gplus-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-gplus-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-tw {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw:hover, .btn-tw:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-tw {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-tw-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-tw-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-fbk {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-fbk {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-fbk-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-fbk-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n/*# sourceMappingURL=orangeIcons.css.map */","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n@import \"node_modules/sass-math-pow/sass/math-pow\";\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n @if ($color == #F16E00) {\n @return #fff;\n }\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n // get the relative lum for each color\n $luminositecouleur: relativelum($r / 255, $g / 255, $b / 255);\n $luminositeblanc: relativelum(1, 1, 1);\n // if luminosite doesn't fit with white color return black\n @if ((($luminositeblanc + .05) / ($luminositecouleur + .05)) < $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// apply Wcag contrast algo : http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n// Convert from HTMLCS JS algo\n@function relativelum($r, $g, $b) {\n @return ((transform($r) * .2126) + (transform($g) * .7152) + (transform($b) * .0722));\n}\n\n@function transform($x) {\n @if ($x <= .03928) {\n @return $x / 12.92;\n } @else {\n @return poly-pow((($x + .055) / 1.055), 2.4);\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n@function alert-logo-size($key: \"md\") {\n @return map-get($alert-logo-sizes, $key);\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/css/orangeIcons.min.css b/dashboard/public/css/orangeIcons.min.css
new file mode 100644
index 00000000..734aeb34
--- /dev/null
+++ b/dashboard/public/css/orangeIcons.min.css
@@ -0,0 +1,2 @@
+@font-face{font-family:icon-orange;font-style:normal;font-weight:400;font-display:block;src:url(../fonts/icon-orange.woff2) format("woff2"),url(../fonts/icon-orange.woff) format("woff")}.icon-1013-Reseau,.icon-2for1cinematicket,.icon-3g,.icon-4G-Cam--Live-80,.icon-4G-Cam-Camera-80,.icon-4G-Cam-Compact,.icon-4G-Cam-Inbox80,.icon-4G-Cam-Outbox-80,.icon-4G-Cam-Rec-80,.icon-4g,.icon-4g-cam,.icon-4g-plus,.icon-Accessability,.icon-Add,.icon-Add-person,.icon-Adult,.icon-Adultcode,.icon-Age-rating-12,.icon-Age-rating-16,.icon-Age-rating-17,.icon-Age-rating-18,.icon-Age-rating-3,.icon-Age-rating-4,.icon-Age-rating-7,.icon-Age-rating-9,.icon-Alias-numbers,.icon-Apartment-building,.icon-Apps,.icon-Apps-disabled,.icon-Archive,.icon-Art,.icon-Auditorium,.icon-Baby,.icon-Betting,.icon-Book-award,.icon-Boxes,.icon-Business-everywhere,.icon-CD,.icon-CPU,.icon-Calculator,.icon-Calendar-fixtures-results,.icon-Calendar-football-match,.icon-Car-park,.icon-Car-pooling,.icon-Casting,.icon-Categories,.icon-Change-wallpaper-1,.icon-Child,.icon-Children-channel,.icon-Coat-hanger,.icon-Collective-class-training,.icon-Colour-Call,.icon-Comedy-channel,.icon-Comic,.icon-Comments,.icon-Concierge-bell,.icon-Courier,.icon-Crop,.icon-Currency-brazilian-real,.icon-Currency-dollar,.icon-Currency-sterling,.icon-Currency-yen,.icon-Decrease-test-size,.icon-Defibrillator,.icon-Digital-frame,.icon-Discovery-offer,.icon-Discussion-author,.icon-Discussion-more,.icon-Doctor,.icon-Doctors-bag,.icon-Doctors-communicating,.icon-Document-compose,.icon-Documentary,.icon-Eco-mode,.icon-Elderly-person,.icon-Email-replied,.icon-Empty-trash,.icon-End-call,.icon-Entertainment-channel,.icon-Ethenet,.icon-Excel,.icon-Expand-screen,.icon-Factory,.icon-Fast-delivery,.icon-Favorite-music,.icon-Featured,.icon-Filter-effects,.icon-Fire-extinguisher,.icon-Firewall,.icon-Football-match,.icon-Football-quiz,.icon-Forward,.icon-Forward-curved-arrow,.icon-Free-up-space,.icon-Full-screen-view,.icon-Gallery,.icon-Gas-tank,.icon-HDMI-Card,.icon-Health-patient,.icon-Heart-rate,.icon-Heartbeats,.icon-Home-1,.icon-Homelive,.icon-Horoscopes,.icon-Hourglass,.icon-IT-infrastructure,.icon-Im-driving,.icon-Incoming-call-curved-arrow,.icon-Increase-test-size,.icon-Information-data,.icon-Internet-security-desktop,.icon-Internet-security-mobile,.icon-Internet-security-password,.icon-Internet-security-server,.icon-Interventions,.icon-Keypad,.icon-La-Cle,.icon-Language,.icon-Latest,.icon-Le-Bloc,.icon-Leave-session,.icon-Link,.icon-Lock-screen-settings,.icon-Maintenance-man,.icon-Map,.icon-Medal,.icon-Medical-app,.icon-Medical-app-phone,.icon-Medical-files,.icon-Message-download,.icon-Microscope,.icon-Missed-call-boxed-arrow,.icon-Missed-call-curved-arrow,.icon-Mobile-backup-restore,.icon-Modem,.icon-Modifier-delete,.icon-Modifier-download,.icon-Modifier-favorite,.icon-More-dots,.icon-Music-artist,.icon-Music-genre,.icon-Mute-microphone,.icon-My-Office-Phone,.icon-NFC-tag,.icon-Nature,.icon-Network-add,.icon-Network-livebox,.icon-Notification,.icon-Notification-Bell,.icon-On-board-unit,.icon-Orange-Detente,.icon-Orange-Experts-Class-Training,.icon-Orange-Experts-Copy-Keep,.icon-Orange-Experts-One2One-Coach,.icon-Orange-Football-Club,.icon-Orange-Guest,.icon-Orange-Messenger-1,.icon-Orange-garden,.icon-Orange-rewards,.icon-Orange-security-suite,.icon-POS-payment,.icon-Package,.icon-Package-content,.icon-Parrasol,.icon-Pause,.icon-Payment-euro,.icon-Pencil,.icon-Photo-dialer,.icon-Pills,.icon-Play,.icon-Quirky-stories,.icon-Quiz,.icon-Radiography,.icon-Real-time,.icon-Record-1,.icon-Redo,.icon-Remote-control-1,.icon-Replay-boxed-arrow,.icon-Reply-boxed-arrow,.icon-Reply-curved-arrow,.icon-Restaurant,.icon-Restrictied-content,.icon-SD-card-1,.icon-Scales,.icon-School,.icon-Science,.icon-Scissors,.icon-Send,.icon-Send-to-person,.icon-Server,.icon-Share-wifi,.icon-Shop,.icon-Shopping,.icon-Show-front-back-camera,.icon-Shower,.icon-Silent,.icon-Simplicity,.icon-Skip-backward,.icon-Skip-forward,.icon-Sleep,.icon-Smart-Sensor,.icon-Smart-electric-meter,.icon-Smart-heating-switch,.icon-Sport-channel,.icon-Start-services,.icon-Stop-video,.icon-Storage-cloud,.icon-Street,.icon-Stretcher,.icon-Sudoku,.icon-Syncronise,.icon-TV-series,.icon-Taxi,.icon-Thumb-down,.icon-Thumb-up,.icon-Top-10,.icon-Trading,.icon-USB,.icon-Undo,.icon-Unmissable,.icon-Value,.icon-Vinyl,.icon-WPT,.icon-Warehouse,.icon-Warning-important,.icon-Warningimportant,.icon-Wholesale-retail,.icon-Widget,.icon-about-event,.icon-accessibility-cognition,.icon-accessibility-dexterity,.icon-accessibility-hearing,.icon-accessibility-mobility,.icon-accessibility-speech,.icon-accessibility-vision,.icon-accessory-headphones,.icon-accessory-shop,.icon-add-more,.icon-address-book,.icon-administrator,.icon-advertising,.icon-aeroplane,.icon-age-rating-mono-12,.icon-age-rating-mono-16,.icon-age-rating-mono-17,.icon-age-rating-mono-18,.icon-age-rating-mono-3,.icon-age-rating-mono-4,.icon-age-rating-mono-7,.icon-age-rating-mono-9,.icon-agriculture,.icon-airbox-auto,.icon-alarm-clock,.icon-alarm-off,.icon-all-channels,.icon-antenna,.icon-anti-spam,.icon-antivirus,.icon-arrow-down,.icon-arrow-next,.icon-arrow-previous,.icon-arrow-up,.icon-assistance,.icon-attachment,.icon-avatar,.icon-backup,.icon-banking,.icon-battery-1-bar,.icon-battery-2-bar,.icon-battery-charging,.icon-battery-empty,.icon-battery-full,.icon-battery-full-2,.icon-bill-euro,.icon-billboard,.icon-birthday,.icon-bluetooth,.icon-book-download,.icon-bookmark,.icon-bookmark-smart,.icon-broadcast,.icon-burst-mode,.icon-business-invoices,.icon-business-lounge,.icon-business-telephonie,.icon-buy,.icon-buy-back-euro,.icon-buzz,.icon-calendar-30,.icon-calendar-day,.icon-calendar-month,.icon-calendar-week,.icon-calendaralarm,.icon-call,.icon-call-forward,.icon-call-invite,.icon-call-log,.icon-camera,.icon-change-wallpaper,.icon-charger,.icon-check-your-balance,.icon-checkbox-tick,.icon-child-protection,.icon-cineday-silhouette,.icon-clock,.icon-cloud-backup,.icon-commercial-representitive,.icon-community-sms,.icon-conference-call,.icon-connected-object,.icon-connection,.icon-construction,.icon-contact-card,.icon-control-centre,.icon-control-mydata,.icon-copy,.icon-crane,.icon-currency-converter,.icon-currency-euro,.icon-data-protection,.icon-data-services,.icon-decoder,.icon-delete,.icon-device-connected-printer,.icon-device-desktop-computer,.icon-device-desktop-computer-connected,.icon-device-fixed-line-phone,.icon-device-laptop-computer,.icon-device-laptop-computer-connected,.icon-device-manager,.icon-device-managment-express,.icon-device-smart-phone,.icon-device-status,.icon-device-tablet,.icon-device-tablet-connected,.icon-device-tv,.icon-dialler,.icon-disable-apps,.icon-document-stack,.icon-document-word,.icon-document-zip,.icon-done-modifier,.icon-download,.icon-draft,.icon-dual-sim-packaging,.icon-easy-internet,.icon-ebook,.icon-edashboard,.icon-edit-draft,.icon-edit-email,.icon-edit-image,.icon-electric-car,.icon-electric-car-charging,.icon-electricity-provider,.icon-elevator,.icon-email,.icon-email-forwarded,.icon-emap,.icon-emergency-firemen,.icon-emergency-police,.icon-emergency-service,.icon-emergency-sos,.icon-employees-1,.icon-epg,.icon-erase,.icon-error-severe,.icon-event-agenda,.icon-event-organiser,.icon-event-speaker,.icon-expert,.icon-external-drive,.icon-family-place,.icon-favourite,.icon-filter,.icon-finance,.icon-fire,.icon-flexible-storage,.icon-folder-camera,.icon-folder-document,.icon-folder-favourite,.icon-folder-sd,.icon-football,.icon-forward-the-number,.icon-frame-care,.icon-frame-connectivity,.icon-frame-family,.icon-frame-fun,.icon-frame-home,.icon-frame-money,.icon-frame-my-customers,.icon-frame-on-the-move,.icon-frame-performance,.icon-frame-security,.icon-frame-tariff,.icon-frame-teamwork,.icon-frame-tech,.icon-frame-wellbeing,.icon-frame-work,.icon-free-tag,.icon-front-end-dashboard,.icon-games,.icon-gauge-counter,.icon-gauge-mon-reseau,.icon-gauge-rate,.icon-gaugecapacity,.icon-generic-document,.icon-geolocation,.icon-hands-free,.icon-health,.icon-health-monitor,.icon-help-guide,.icon-history,.icon-home,.icon-home-alarm,.icon-homescreen,.icon-hospital,.icon-hotel,.icon-image,.icon-image-file,.icon-improvement,.icon-inbox,.icon-info,.icon-international-globe,.icon-internationaltv,.icon-internet,.icon-internet-browser,.icon-internet-usage,.icon-keeper,.icon-keyboard,.icon-lightbulb-sh,.icon-ligue-1,.icon-live,.icon-livebox,.icon-livebox-info,.icon-livebox-phone,.icon-location-pin-compass,.icon-lock,.icon-logistics,.icon-logout,.icon-manage-android,.icon-managing-equipment,.icon-map-pin,.icon-medical-chart,.icon-menu,.icon-messaging,.icon-messaging-compose-sms,.icon-messaging-unified,.icon-messaging-untitled-compose,.icon-microphone,.icon-mini-games,.icon-mirroring,.icon-mobile-applications,.icon-mobile-box,.icon-mobile-data-toggle,.icon-mobile-insurance,.icon-mobile-network-coverage,.icon-mobile-security,.icon-mobile-setup,.icon-modifier-add,.icon-modifier-new,.icon-modifier-no-access,.icon-modifier-synchro,.icon-modifier-upload,.icon-modifier-wizard,.icon-mon-reseau,.icon-money,.icon-move-to-folder,.icon-multi-sim,.icon-multiple-timezone,.icon-music-file,.icon-music-player,.icon-my-account,.icon-my-bill-uk,.icon-my-boutique,.icon-my-essential,.icon-my-essential-tablet,.icon-my-livebox,.icon-my-media,.icon-my-orange,.icon-my-plug,.icon-my-services,.icon-my-travels,.icon-networks,.icon-new,.icon-newspaper,.icon-nfc,.icon-no-sim,.icon-nouveau-contract-social,.icon-numero-unique,.icon-office,.icon-oil-and-gas,.icon-online-help,.icon-orange-Photography,.icon-orange-assistant,.icon-orange-cash,.icon-orange-corporate,.icon-orange-events,.icon-orange-experts-expert,.icon-orange-experts-insurance,.icon-orange-experts-orange-business-consultant,.icon-orange-experts-orange-startup-smartphone,.icon-orange-experts-recycle,.icon-orange-experts-repair,.icon-orange-experts-tranquil,.icon-orange-foundation,.icon-orange-gesture,.icon-orange-jobs,.icon-orange-messenger,.icon-orange-money,.icon-orange-pro,.icon-orange-protect,.icon-orange-radio,.icon-orange-reflections,.icon-orange-travel,.icon-orange-tv,.icon-orange-wallet,.icon-orange-wifi,.icon-orangewallet,.icon-organisation,.icon-outbox,.icon-outdoor-sports-mountain-biking,.icon-outdoor-sports-skiing,.icon-parabole-tv,.icon-parental-control,.icon-pass-video,.icon-pda-device,.icon-pdf-file,.icon-personal-smartphone-trainer,.icon-phone-advisor,.icon-phone-fund,.icon-phone-protection,.icon-picture-messaging,.icon-pioneering,.icon-play-and-win,.icon-playmode-random,.icon-polls,.icon-popout-care,.icon-popout-connectivity,.icon-popout-family,.icon-popout-fun,.icon-popout-home,.icon-popout-money,.icon-popout-my-customers,.icon-popout-on-the-move,.icon-popout-performance,.icon-popout-security,.icon-popout-tariff,.icon-popout-teamwork,.icon-popout-tech,.icon-popout-wellbeing,.icon-popout-work,.icon-portfolio,.icon-power,.icon-powerpoint-file,.icon-presentation,.icon-previous,.icon-printer,.icon-profileringtone,.icon-public-transport,.icon-publish,.icon-ratings-stars,.icon-recommend,.icon-record,.icon-recycle-device,.icon-relationship,.icon-reload,.icon-remote-control,.icon-remove-modifier,.icon-report,.icon-responsible,.icon-restore-to-phone,.icon-rewards,.icon-ringtones,.icon-running,.icon-scan-ticket,.icon-sd-card,.icon-search,.icon-servers,.icon-settings,.icon-setup-and-repair,.icon-setup-and-repair-cog,.icon-setup-internet,.icon-share,.icon-shipping,.icon-shop-pin,.icon-shop-subscriptions,.icon-showroom-mobile-pro,.icon-signal-1-5,.icon-signal-2-5,.icon-signal-3-5,.icon-signal-4-5,.icon-signal-5-5,.icon-signal-boost,.icon-sim,.icon-simple-mode,.icon-smart-home,.icon-smart-lightswitch,.icon-smart-powerstation,.icon-smart-tap,.icon-smart-watch,.icon-social-network,.icon-software-update,.icon-startup-wizard,.icon-stocks,.icon-stop-secret,.icon-store-locator,.icon-subscription-package,.icon-support,.icon-surveillance-camera,.icon-target-location,.icon-tarif,.icon-tariff,.icon-task-list,.icon-team-connect,.icon-temperature,.icon-terms-conditions,.icon-text-alerts,.icon-tick,.icon-tick-circle,.icon-tickets,.icon-top-up-dollar,.icon-top-up-euro,.icon-top-up-uk-bank,.icon-touch-screen,.icon-town,.icon-townhall,.icon-track-your-delivery,.icon-track-your-order,.icon-trash,.icon-tv-plus,.icon-unique,.icon-unknown-file,.icon-unlimited-calls,.icon-unlocked,.icon-upload,.icon-usb-key,.icon-vehicle,.icon-video,.icon-video-file,.icon-video-meeting2,.icon-video-phone,.icon-vip-contact,.icon-virtual-gamepad,.icon-visual-voicemail,.icon-vod-portrait,.icon-volte,.icon-volume-high,.icon-volume-low,.icon-volume-mid,.icon-volume-none,.icon-vowifi,.icon-vvm-message-read-full,.icon-web-cam,.icon-web-fax-widget,.icon-widget-tour,.icon-wifi,.icon-wifi-0,.icon-wifi-1,.icon-wifi-2,.icon-wps-pairing,.icon-zoom-in,.icon-zoom-out{font-family:icon-orange!important;font-style:normal;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-frame-care,.icon-frame-connectivity,.icon-frame-family,.icon-frame-fun,.icon-frame-home,.icon-frame-money,.icon-frame-my-customers,.icon-frame-on-the-move,.icon-frame-performance,.icon-frame-security,.icon-frame-tariff,.icon-frame-teamwork,.icon-frame-tech,.icon-frame-wellbeing,.icon-frame-work,.icon-popout-care,.icon-popout-connectivity,.icon-popout-family,.icon-popout-fun,.icon-popout-home,.icon-popout-money,.icon-popout-my-customers,.icon-popout-on-the-move,.icon-popout-performance,.icon-popout-security,.icon-popout-tariff,.icon-popout-teamwork,.icon-popout-tech,.icon-popout-wellbeing,.icon-popout-work{color:#f16e00}.icon-checkbox-tick::before{content:"\eb77"}.icon-2for1cinematicket::before{content:"\e900"}.icon-3g::before{content:"\e901"}.icon-4g::before{content:"\e902"}.icon-4g-cam::before{content:"\e903"}.icon-4G-Cam--Live-80::before{content:"\e904"}.icon-4G-Cam-Camera-80::before{content:"\e905"}.icon-4G-Cam-Inbox80::before{content:"\e906"}.icon-4G-Cam-Outbox-80::before{content:"\e907"}.icon-4G-Cam-Rec-80::before{content:"\e908"}.icon-4g-plus::before{content:"\e909"}.icon-4G-Cam-Compact::before{content:"\e90a"}.icon-1013-Reseau::before{content:"\e90b"}.icon-about-event::before{content:"\e90c"}.icon-Accessability::before{content:"\e90d"}.icon-accessibility-cognition::before{content:"\e90e"}.icon-accessibility-dexterity::before{content:"\e90f"}.icon-accessibility-hearing::before{content:"\e910"}.icon-accessibility-mobility::before{content:"\e911"}.icon-accessibility-speech::before{content:"\e912"}.icon-accessibility-vision::before{content:"\e913"}.icon-accessory-headphones::before{content:"\e914"}.icon-accessory-shop::before{content:"\e915"}.icon-Add::before{content:"\e916"}.icon-add-more::before{content:"\e917"}.icon-Add-person::before{content:"\e918"}.icon-address-book::before{content:"\e919"}.icon-administrator::before{content:"\e91a"}.icon-Adultcode::before{content:"\e91b"}.icon-Adult::before{content:"\e91c"}.icon-advertising::before{content:"\e91d"}.icon-aeroplane::before{content:"\e91e"}.icon-Age-rating-3::before{content:"\e91f"}.icon-Age-rating-4::before{content:"\e920"}.icon-Age-rating-7::before{content:"\e921"}.icon-Age-rating-9::before{content:"\e922"}.icon-Age-rating-12::before{content:"\e923"}.icon-Age-rating-16::before{content:"\e924"}.icon-Age-rating-17::before{content:"\e925"}.icon-Age-rating-18::before{content:"\e926"}.icon-age-rating-mono-3::before{content:"\e927"}.icon-age-rating-mono-4::before{content:"\e928"}.icon-age-rating-mono-7::before{content:"\e929"}.icon-age-rating-mono-9::before{content:"\e92a"}.icon-age-rating-mono-12::before{content:"\e92b"}.icon-age-rating-mono-16::before{content:"\e92c"}.icon-age-rating-mono-17::before{content:"\e92d"}.icon-age-rating-mono-18::before{content:"\e92e"}.icon-agriculture::before{content:"\e92f"}.icon-airbox-auto::before{content:"\e930"}.icon-alarm-clock::before{content:"\e931"}.icon-alarm-off::before{content:"\e932"}.icon-Alias-numbers::before{content:"\e933"}.icon-all-channels::before{content:"\e934"}.icon-antenna::before{content:"\e935"}.icon-anti-spam::before{content:"\e936"}.icon-antivirus::before{content:"\e937"}.icon-Apartment-building::before{content:"\e938"}.icon-Apps::before{content:"\e939"}.icon-Apps-disabled::before{content:"\e93a"}.icon-Archive::before{content:"\e93b"}.icon-arrow-down::before{content:"\e93c"}.icon-arrow-up::before{content:"\e93d"}.icon-arrow-next::before{content:"\e93e"}.icon-arrow-previous::before{content:"\e93f"}.icon-Art::before{content:"\e940"}.icon-assistance::before{content:"\e941"}.icon-attachment::before{content:"\e942"}.icon-Auditorium::before{content:"\e943"}.icon-avatar::before{content:"\e944"}.icon-Baby::before{content:"\e945"}.icon-backup::before{content:"\e946"}.icon-banking::before{content:"\e947"}.icon-battery-1-bar::before{content:"\e948"}.icon-battery-2-bar::before{content:"\e949"}.icon-battery-charging::before{content:"\e94a"}.icon-battery-empty::before{content:"\e94b"}.icon-battery-full::before{content:"\e94c"}.icon-battery-full-2::before{content:"\e94d"}.icon-Betting::before{content:"\e94e"}.icon-bill-euro::before{content:"\e94f"}.icon-billboard::before{content:"\e950"}.icon-birthday::before{content:"\e951"}.icon-bluetooth::before{content:"\e952"}.icon-Book-award::before{content:"\e953"}.icon-book-download::before{content:"\e954"}.icon-bookmark::before{content:"\e955"}.icon-bookmark-smart::before{content:"\e956"}.icon-Boxes::before{content:"\e957"}.icon-broadcast::before{content:"\e958"}.icon-burst-mode::before{content:"\e959"}.icon-Business-everywhere::before{content:"\e95a"}.icon-business-invoices::before{content:"\e95b"}.icon-business-lounge::before{content:"\e95c"}.icon-business-telephonie::before{content:"\e95d"}.icon-buy::before{content:"\e95e"}.icon-buy-back-euro::before{content:"\e95f"}.icon-buzz::before{content:"\e960"}.icon-Calculator::before{content:"\e961"}.icon-calendaralarm::before{content:"\e962"}.icon-calendar-30::before{content:"\e963"}.icon-calendar-day::before{content:"\e964"}.icon-Calendar-fixtures-results::before{content:"\e965"}.icon-Calendar-football-match::before{content:"\e966"}.icon-calendar-month::before{content:"\e967"}.icon-calendar-week::before{content:"\e968"}.icon-call::before{content:"\e969"}.icon-call-forward::before{content:"\e96a"}.icon-call-invite::before{content:"\e96b"}.icon-call-log::before{content:"\e96c"}.icon-camera::before{content:"\e96d"}.icon-Car-park::before{content:"\e96e"}.icon-Car-pooling::before{content:"\e96f"}.icon-Casting::before{content:"\e970"}.icon-Categories::before{content:"\e971"}.icon-CD::before{content:"\e972"}.icon-change-wallpaper::before{content:"\e973"}.icon-Change-wallpaper-1::before{content:"\e974"}.icon-charger::before{content:"\e975"}.icon-check-your-balance::before{content:"\e976"}.icon-Child::before{content:"\e977"}.icon-child-protection::before{content:"\e978"}.icon-Children-channel::before{content:"\e979"}.icon-cineday-silhouette::before{content:"\e97a"}.icon-clock::before{content:"\e97b"}.icon-cloud-backup::before{content:"\e97c"}.icon-Coat-hanger::before{content:"\e97d"}.icon-Collective-class-training::before{content:"\e97e"}.icon-Colour-Call::before{content:"\e97f"}.icon-Comedy-channel::before{content:"\e980"}.icon-Comic::before{content:"\e981"}.icon-Comments::before{content:"\e982"}.icon-commercial-representitive::before{content:"\e983"}.icon-community-sms::before{content:"\e984"}.icon-Concierge-bell::before{content:"\e985"}.icon-conference-call::before{content:"\e986"}.icon-connected-object::before{content:"\e987"}.icon-connection::before{content:"\e988"}.icon-construction::before{content:"\e989"}.icon-contact-card::before{content:"\e98a"}.icon-control-centre::before{content:"\e98b"}.icon-control-mydata::before{content:"\e98c"}.icon-copy::before{content:"\e98d"}.icon-Courier::before{content:"\e98e"}.icon-CPU::before{content:"\e98f"}.icon-crane::before{content:"\e990"}.icon-Crop::before{content:"\e991"}.icon-Currency-brazilian-real::before{content:"\e992"}.icon-currency-converter::before{content:"\e993"}.icon-Currency-dollar::before{content:"\e994"}.icon-currency-euro::before{content:"\e995"}.icon-Currency-sterling::before{content:"\e996"}.icon-Currency-yen::before{content:"\e997"}.icon-data-protection::before{content:"\e998"}.icon-data-services::before{content:"\e999"}.icon-decoder::before{content:"\e99a"}.icon-Decrease-test-size::before{content:"\e99b"}.icon-Defibrillator::before{content:"\e99c"}.icon-delete::before{content:"\e99d"}.icon-device-desktop-computer::before{content:"\e99e"}.icon-device-desktop-computer-connected::before{content:"\e99f"}.icon-device-fixed-line-phone::before{content:"\e9a0"}.icon-device-laptop-computer::before{content:"\e9a1"}.icon-device-laptop-computer-connected::before{content:"\e9a2"}.icon-device-smart-phone::before{content:"\e9a3"}.icon-device-status::before{content:"\e9a4"}.icon-device-tablet::before{content:"\e9a5"}.icon-device-tablet-connected::before{content:"\e9a6"}.icon-device-tv::before{content:"\e9a7"}.icon-device-connected-printer::before{content:"\e9a8"}.icon-device-manager::before{content:"\e9a9"}.icon-device-managment-express::before{content:"\e9aa"}.icon-dialler::before{content:"\e9ab"}.icon-Digital-frame::before{content:"\e9ac"}.icon-disable-apps::before{content:"\e9ad"}.icon-Discovery-offer::before{content:"\e9ae"}.icon-Discussion-author::before{content:"\e9af"}.icon-Discussion-more::before{content:"\e9b0"}.icon-Doctor::before{content:"\e9b1"}.icon-Doctors-bag::before{content:"\e9b2"}.icon-Doctors-communicating::before{content:"\e9b3"}.icon-Document-compose::before{content:"\e9b4"}.icon-document-stack::before{content:"\e9b5"}.icon-document-word::before{content:"\e9b6"}.icon-document-zip::before{content:"\e9b7"}.icon-Documentary::before{content:"\e9b8"}.icon-done-modifier::before{content:"\e9b9"}.icon-download::before{content:"\e9ba"}.icon-draft::before{content:"\e9bb"}.icon-dual-sim-packaging::before{content:"\e9bc"}.icon-easy-internet::before{content:"\e9bd"}.icon-ebook::before{content:"\e9be"}.icon-Eco-mode::before{content:"\e9bf"}.icon-edashboard::before{content:"\e9c0"}.icon-edit-draft::before{content:"\e9c1"}.icon-edit-email::before{content:"\e9c2"}.icon-edit-image::before{content:"\e9c3"}.icon-Elderly-person::before{content:"\e9c4"}.icon-electric-car::before{content:"\e9c5"}.icon-electric-car-charging::before{content:"\e9c6"}.icon-electricity-provider::before{content:"\e9c7"}.icon-elevator::before{content:"\e9c8"}.icon-email::before{content:"\e9c9"}.icon-email-forwarded::before{content:"\e9ca"}.icon-Email-replied::before{content:"\e9cb"}.icon-emap::before{content:"\e9cc"}.icon-emergency-firemen::before{content:"\e9cd"}.icon-emergency-police::before{content:"\e9ce"}.icon-emergency-sos::before{content:"\e9cf"}.icon-emergency-service::before{content:"\e9d0"}.icon-employees-1::before{content:"\e9d1"}.icon-Empty-trash::before{content:"\e9d2"}.icon-End-call::before{content:"\e9d3"}.icon-Entertainment-channel::before{content:"\e9d4"}.icon-epg::before{content:"\e9d5"}.icon-erase::before{content:"\e9d6"}.icon-error-severe::before{content:"\e9d7"}.icon-Ethenet::before{content:"\e9d8"}.icon-event-agenda::before{content:"\e9d9"}.icon-event-organiser::before{content:"\e9da"}.icon-event-speaker::before{content:"\e9db"}.icon-Excel::before{content:"\e9dc"}.icon-Expand-screen::before{content:"\e9dd"}.icon-expert::before{content:"\e9de"}.icon-external-drive::before{content:"\e9df"}.icon-Factory::before{content:"\e9e0"}.icon-family-place::before{content:"\e9e1"}.icon-Fast-delivery::before{content:"\e9e2"}.icon-Favorite-music::before{content:"\e9e3"}.icon-favourite::before{content:"\e9e4"}.icon-Featured::before{content:"\e9e5"}.icon-filter::before{content:"\e9e6"}.icon-Filter-effects::before{content:"\e9e7"}.icon-finance::before{content:"\e9e8"}.icon-fire::before{content:"\e9e9"}.icon-Fire-extinguisher::before{content:"\e9ea"}.icon-Firewall::before{content:"\e9eb"}.icon-flexible-storage::before{content:"\e9ec"}.icon-folder-camera::before{content:"\e9ed"}.icon-folder-document::before{content:"\e9ee"}.icon-folder-favourite::before{content:"\e9ef"}.icon-folder-sd::before{content:"\e9f0"}.icon-football::before{content:"\e9f1"}.icon-Football-match::before{content:"\e9f2"}.icon-Football-quiz::before{content:"\e9f3"}.icon-Forward::before{content:"\e9f4"}.icon-Forward-curved-arrow::before{content:"\e9f5"}.icon-forward-the-number::before{content:"\e9f6"}.icon-free-tag::before{content:"\e9f7"}.icon-Free-up-space::before{content:"\e9f8"}.icon-front-end-dashboard::before{content:"\e9f9"}.icon-Full-screen-view::before{content:"\e9fa"}.icon-Gallery::before{content:"\e9fb"}.icon-games::before{content:"\e9fc"}.icon-Gas-tank::before{content:"\e9fd"}.icon-gaugecapacity::before{content:"\e9fe"}.icon-gauge-counter::before{content:"\e9ff"}.icon-gauge-rate::before{content:"\ea00"}.icon-gauge-mon-reseau::before{content:"\ea01"}.icon-generic-document::before{content:"\ea02"}.icon-geolocation::before{content:"\ea03"}.icon-hands-free::before{content:"\ea04"}.icon-HDMI-Card::before{content:"\ea05"}.icon-health::before{content:"\ea06"}.icon-health-monitor::before{content:"\ea07"}.icon-Health-patient::before{content:"\ea08"}.icon-Heart-rate::before{content:"\ea09"}.icon-Heartbeats::before{content:"\ea0a"}.icon-help-guide::before{content:"\ea0b"}.icon-history::before{content:"\ea0c"}.icon-home::before{content:"\ea0d"}.icon-Home-1::before{content:"\ea0e"}.icon-home-alarm::before{content:"\ea0f"}.icon-Homelive::before{content:"\ea10"}.icon-homescreen::before{content:"\ea11"}.icon-Horoscopes::before{content:"\ea12"}.icon-hospital::before{content:"\ea13"}.icon-hotel::before{content:"\ea14"}.icon-Hourglass::before{content:"\ea15"}.icon-Im-driving::before{content:"\ea16"}.icon-image::before{content:"\ea17"}.icon-image-file::before{content:"\ea18"}.icon-improvement::before{content:"\ea19"}.icon-inbox::before{content:"\ea1a"}.icon-Incoming-call-curved-arrow::before{content:"\ea1b"}.icon-Increase-test-size::before{content:"\ea1c"}.icon-info::before{content:"\ea1d"}.icon-Information-data::before{content:"\ea1e"}.icon-internationaltv::before{content:"\ea1f"}.icon-international-globe::before{content:"\ea20"}.icon-internet::before{content:"\ea21"}.icon-internet-browser::before{content:"\ea22"}.icon-Internet-security-desktop::before{content:"\ea23"}.icon-Internet-security-mobile::before{content:"\ea24"}.icon-Internet-security-password::before{content:"\ea25"}.icon-Internet-security-server::before{content:"\ea26"}.icon-internet-usage::before{content:"\ea27"}.icon-Interventions::before{content:"\ea28"}.icon-IT-infrastructure::before{content:"\ea29"}.icon-keeper::before{content:"\ea2a"}.icon-keyboard::before{content:"\ea2b"}.icon-Keypad::before{content:"\ea2c"}.icon-La-Cle::before{content:"\ea2d"}.icon-Language::before{content:"\ea2e"}.icon-Latest::before{content:"\ea2f"}.icon-Le-Bloc::before{content:"\ea30"}.icon-Leave-session::before{content:"\ea31"}.icon-lightbulb-sh::before{content:"\ea32"}.icon-ligue-1::before{content:"\ea33"}.icon-Link::before{content:"\ea34"}.icon-live::before{content:"\ea35"}.icon-livebox::before{content:"\ea36"}.icon-livebox-info::before{content:"\ea37"}.icon-livebox-phone::before{content:"\ea38"}.icon-location-pin-compass::before{content:"\ea39"}.icon-lock::before{content:"\ea3a"}.icon-Lock-screen-settings::before{content:"\ea3b"}.icon-logistics::before{content:"\ea3c"}.icon-logout::before{content:"\ea3d"}.icon-Maintenance-man::before{content:"\ea3e"}.icon-manage-android::before{content:"\ea3f"}.icon-managing-equipment::before{content:"\ea40"}.icon-Map::before{content:"\ea41"}.icon-map-pin::before{content:"\ea42"}.icon-Medal::before{content:"\ea43"}.icon-Medical-app::before{content:"\ea44"}.icon-Medical-app-phone::before{content:"\ea45"}.icon-medical-chart::before{content:"\ea46"}.icon-Medical-files::before{content:"\ea47"}.icon-menu::before{content:"\ea48"}.icon-Message-download::before{content:"\ea49"}.icon-messaging::before{content:"\ea4a"}.icon-messaging-compose-sms::before{content:"\ea4b"}.icon-messaging-unified::before{content:"\ea4c"}.icon-messaging-untitled-compose::before{content:"\ea4d"}.icon-microphone::before{content:"\ea4e"}.icon-Microscope::before{content:"\ea4f"}.icon-mini-games::before{content:"\ea50"}.icon-mirroring::before{content:"\ea51"}.icon-Missed-call-boxed-arrow::before{content:"\ea52"}.icon-Missed-call-curved-arrow::before{content:"\ea53"}.icon-mobile-applications::before{content:"\ea54"}.icon-Mobile-backup-restore::before{content:"\ea55"}.icon-mobile-box::before{content:"\ea56"}.icon-mobile-data-toggle::before{content:"\ea57"}.icon-mobile-insurance::before{content:"\ea58"}.icon-mobile-network-coverage::before{content:"\ea59"}.icon-mobile-security::before{content:"\ea5a"}.icon-mobile-setup::before{content:"\ea5b"}.icon-Modem::before{content:"\ea5c"}.icon-modifier-add::before{content:"\ea5d"}.icon-Modifier-delete::before{content:"\ea5e"}.icon-Modifier-favorite::before{content:"\ea5f"}.icon-modifier-new::before{content:"\ea60"}.icon-modifier-no-access::before{content:"\ea61"}.icon-modifier-synchro::before{content:"\ea62"}.icon-modifier-upload::before{content:"\ea63"}.icon-modifier-wizard::before{content:"\ea64"}.icon-Modifier-download::before{content:"\ea65"}.icon-mon-reseau::before{content:"\ea66"}.icon-money::before{content:"\ea67"}.icon-More-dots::before{content:"\ea68"}.icon-move-to-folder::before{content:"\ea69"}.icon-multi-sim::before{content:"\ea6a"}.icon-multiple-timezone::before{content:"\ea6b"}.icon-Music-artist::before{content:"\ea6c"}.icon-music-file::before{content:"\ea6d"}.icon-Music-genre::before{content:"\ea6e"}.icon-music-player::before{content:"\ea6f"}.icon-Mute-microphone::before{content:"\ea70"}.icon-my-account::before{content:"\ea71"}.icon-my-bill-uk::before{content:"\ea72"}.icon-my-boutique::before{content:"\ea73"}.icon-my-essential::before{content:"\ea74"}.icon-my-essential-tablet::before{content:"\ea75"}.icon-my-livebox::before{content:"\ea76"}.icon-my-media::before{content:"\ea77"}.icon-My-Office-Phone::before{content:"\ea78"}.icon-my-orange::before{content:"\ea79"}.icon-my-plug::before{content:"\ea7a"}.icon-my-services::before{content:"\ea7b"}.icon-my-travels::before{content:"\ea7c"}.icon-Nature::before{content:"\ea7d"}.icon-Network-add::before{content:"\ea7e"}.icon-Network-livebox::before{content:"\ea7f"}.icon-networks::before{content:"\ea80"}.icon-new::before{content:"\ea81"}.icon-newspaper::before{content:"\ea82"}.icon-nfc::before{content:"\ea83"}.icon-NFC-tag::before{content:"\ea84"}.icon-no-sim::before{content:"\ea85"}.icon-Notification::before{content:"\ea86"}.icon-Notification-Bell::before{content:"\ea87"}.icon-nouveau-contract-social::before{content:"\ea88"}.icon-numero-unique::before{content:"\ea89"}.icon-office::before{content:"\ea8a"}.icon-oil-and-gas::before{content:"\ea8b"}.icon-On-board-unit::before{content:"\ea8c"}.icon-online-help::before{content:"\ea8d"}.icon-orangewallet::before{content:"\ea8e"}.icon-orange-assistant::before{content:"\ea8f"}.icon-orange-cash::before{content:"\ea90"}.icon-orange-corporate::before{content:"\ea91"}.icon-Orange-Detente::before{content:"\ea92"}.icon-orange-events::before{content:"\ea93"}.icon-Orange-Experts-Class-Training::before{content:"\ea94"}.icon-Orange-Experts-Copy-Keep::before{content:"\ea95"}.icon-orange-experts-expert::before{content:"\ea96"}.icon-orange-experts-insurance::before{content:"\ea97"}.icon-Orange-Experts-One2One-Coach::before{content:"\ea98"}.icon-orange-experts-orange-business-consultant::before{content:"\ea99"}.icon-orange-experts-orange-startup-smartphone::before{content:"\ea9a"}.icon-orange-experts-recycle::before{content:"\ea9b"}.icon-orange-experts-repair::before{content:"\ea9c"}.icon-orange-experts-tranquil::before{content:"\ea9d"}.icon-Orange-Football-Club::before{content:"\ea9e"}.icon-orange-foundation::before{content:"\ea9f"}.icon-Orange-garden::before{content:"\eaa0"}.icon-orange-gesture::before{content:"\eaa1"}.icon-orange-jobs::before{content:"\eaa2"}.icon-orange-messenger::before{content:"\eaa3"}.icon-Orange-Messenger-1::before{content:"\eaa4"}.icon-orange-money::before{content:"\eaa5"}.icon-orange-Photography::before{content:"\eaa6"}.icon-orange-pro::before{content:"\eaa7"}.icon-orange-protect::before{content:"\eaa8"}.icon-orange-radio::before{content:"\eaa9"}.icon-orange-reflections::before{content:"\eaaa"}.icon-Orange-rewards::before{content:"\eaab"}.icon-Orange-security-suite::before{content:"\eaac"}.icon-orange-travel::before{content:"\eaad"}.icon-orange-tv::before{content:"\eaae"}.icon-orange-wallet::before{content:"\eaaf"}.icon-orange-wifi::before{content:"\eab0"}.icon-Orange-Guest::before{content:"\eab1"}.icon-organisation::before{content:"\eab2"}.icon-outbox::before{content:"\eab3"}.icon-outdoor-sports-mountain-biking::before{content:"\eab4"}.icon-outdoor-sports-skiing::before{content:"\eab5"}.icon-Package::before{content:"\eab6"}.icon-Package-content::before{content:"\eab7"}.icon-parabole-tv::before{content:"\eab8"}.icon-parental-control::before{content:"\eab9"}.icon-Parrasol::before{content:"\eaba"}.icon-pass-video::before{content:"\eabb"}.icon-Pause::before{content:"\eabc"}.icon-Payment-euro::before{content:"\eabd"}.icon-pda-device::before{content:"\eabe"}.icon-pdf-file::before{content:"\eabf"}.icon-Pencil::before{content:"\eac0"}.icon-personal-smartphone-trainer::before{content:"\eac1"}.icon-phone-advisor::before{content:"\eac2"}.icon-phone-fund::before{content:"\eac3"}.icon-phone-protection::before{content:"\eac4"}.icon-Photo-dialer::before{content:"\eac5"}.icon-picture-messaging::before{content:"\eac6"}.icon-Pills::before{content:"\eac7"}.icon-pioneering::before{content:"\eac8"}.icon-Play::before{content:"\eac9"}.icon-play-and-win::before{content:"\eaca"}.icon-playmode-random::before{content:"\eacb"}.icon-polls::before{content:"\eacc"}.icon-portfolio::before{content:"\eacd"}.icon-POS-payment::before{content:"\eace"}.icon-power::before{content:"\eacf"}.icon-powerpoint-file::before{content:"\ead0"}.icon-presentation::before{content:"\ead1"}.icon-previous::before{content:"\ead2"}.icon-printer::before{content:"\ead3"}.icon-profileringtone::before{content:"\ead4"}.icon-public-transport::before{content:"\ead5"}.icon-publish::before{content:"\ead6"}.icon-Quirky-stories::before{content:"\ead7"}.icon-Quiz::before{content:"\ead8"}.icon-Radiography::before{content:"\ead9"}.icon-ratings-stars::before{content:"\eada"}.icon-Real-time::before{content:"\eadb"}.icon-recommend::before{content:"\eadc"}.icon-record::before{content:"\eadd"}.icon-Record-1::before{content:"\eade"}.icon-recycle-device::before{content:"\eadf"}.icon-Redo::before{content:"\eae0"}.icon-relationship::before{content:"\eae1"}.icon-reload::before{content:"\eae2"}.icon-remote-control::before{content:"\eae3"}.icon-Remote-control-1::before{content:"\eae4"}.icon-remove-modifier::before{content:"\eae5"}.icon-Replay-boxed-arrow::before{content:"\eae6"}.icon-Reply-boxed-arrow::before{content:"\eae7"}.icon-Reply-curved-arrow::before{content:"\eae8"}.icon-report::before{content:"\eae9"}.icon-responsible::before{content:"\eaea"}.icon-Restaurant::before{content:"\eaeb"}.icon-restore-to-phone::before{content:"\eaec"}.icon-Restrictied-content::before{content:"\eaed"}.icon-rewards::before{content:"\eaee"}.icon-ringtones::before{content:"\eaef"}.icon-running::before{content:"\eaf0"}.icon-Scales::before{content:"\eaf1"}.icon-scan-ticket::before{content:"\eaf2"}.icon-School::before{content:"\eaf3"}.icon-Science::before{content:"\eaf4"}.icon-Scissors::before{content:"\eaf5"}.icon-sd-card::before{content:"\eaf6"}.icon-SD-card-1::before{content:"\eaf7"}.icon-search::before{content:"\eaf8"}.icon-Send::before{content:"\eaf9"}.icon-Send-to-person::before{content:"\eafa"}.icon-Server::before{content:"\eafb"}.icon-servers::before{content:"\eafc"}.icon-settings::before{content:"\eafd"}.icon-setup-and-repair::before{content:"\eafe"}.icon-setup-and-repair-cog::before{content:"\eaff"}.icon-setup-internet::before{content:"\eb00"}.icon-share::before{content:"\eb01"}.icon-Share-wifi::before{content:"\eb02"}.icon-shipping::before{content:"\eb03"}.icon-Shop::before{content:"\eb04"}.icon-shop-pin::before{content:"\eb05"}.icon-shop-subscriptions::before{content:"\eb06"}.icon-Shopping::before{content:"\eb07"}.icon-Show-front-back-camera::before{content:"\eb08"}.icon-Shower::before{content:"\eb09"}.icon-showroom-mobile-pro::before{content:"\eb0a"}.icon-signal-1-5::before{content:"\eb0b"}.icon-signal-2-5::before{content:"\eb0c"}.icon-signal-3-5::before{content:"\eb0d"}.icon-signal-4-5::before{content:"\eb0e"}.icon-signal-5-5::before{content:"\eb0f"}.icon-signal-boost::before{content:"\eb10"}.icon-Silent::before{content:"\eb11"}.icon-sim::before{content:"\eb12"}.icon-simple-mode::before{content:"\eb13"}.icon-Simplicity::before{content:"\eb14"}.icon-Skip-backward::before{content:"\eb15"}.icon-Skip-forward::before{content:"\eb16"}.icon-Sleep::before{content:"\eb17"}.icon-Smart-electric-meter::before{content:"\eb18"}.icon-Smart-heating-switch::before{content:"\eb19"}.icon-smart-home::before{content:"\eb1a"}.icon-smart-lightswitch::before{content:"\eb1b"}.icon-smart-powerstation::before{content:"\eb1c"}.icon-Smart-Sensor::before{content:"\eb1d"}.icon-smart-tap::before{content:"\eb1e"}.icon-smart-watch::before{content:"\eb1f"}.icon-social-network::before{content:"\eb20"}.icon-software-update::before{content:"\eb21"}.icon-Sport-channel::before{content:"\eb22"}.icon-Start-services::before{content:"\eb23"}.icon-startup-wizard::before{content:"\eb24"}.icon-stocks::before{content:"\eb25"}.icon-stop-secret::before{content:"\eb26"}.icon-Stop-video::before{content:"\eb27"}.icon-Storage-cloud::before{content:"\eb28"}.icon-store-locator::before{content:"\eb29"}.icon-Street::before{content:"\eb2a"}.icon-Stretcher::before{content:"\eb2b"}.icon-subscription-package::before{content:"\eb2c"}.icon-Sudoku::before{content:"\eb2d"}.icon-support::before{content:"\eb2e"}.icon-surveillance-camera::before{content:"\eb2f"}.icon-Syncronise::before{content:"\eb30"}.icon-target-location::before{content:"\eb31"}.icon-tarif::before{content:"\eb32"}.icon-tariff::before{content:"\eb33"}.icon-task-list::before{content:"\eb34"}.icon-Taxi::before{content:"\eb35"}.icon-team-connect::before{content:"\eb36"}.icon-temperature::before{content:"\eb37"}.icon-terms-conditions::before{content:"\eb38"}.icon-text-alerts::before{content:"\eb39"}.icon-Thumb-down::before{content:"\eb3a"}.icon-Thumb-up::before{content:"\eb3b"}.icon-tick::before{content:"\eb3c"}.icon-tick-circle::before{content:"\eb3d"}.icon-tickets::before{content:"\eb3e"}.icon-Top-10::before{content:"\eb3f"}.icon-top-up-dollar::before{content:"\eb40"}.icon-top-up-euro::before{content:"\eb41"}.icon-top-up-uk-bank::before{content:"\eb42"}.icon-touch-screen::before{content:"\eb43"}.icon-town::before{content:"\eb44"}.icon-townhall::before{content:"\eb45"}.icon-track-your-delivery::before{content:"\eb46"}.icon-track-your-order::before{content:"\eb47"}.icon-Trading::before{content:"\eb48"}.icon-trash::before{content:"\eb49"}.icon-tv-plus::before{content:"\eb4a"}.icon-TV-series::before{content:"\eb4b"}.icon-Undo::before{content:"\eb4c"}.icon-unique::before{content:"\eb4d"}.icon-unknown-file::before{content:"\eb4e"}.icon-unlimited-calls::before{content:"\eb4f"}.icon-unlocked::before{content:"\eb50"}.icon-Unmissable::before{content:"\eb51"}.icon-upload::before{content:"\eb52"}.icon-USB::before{content:"\eb53"}.icon-usb-key::before{content:"\eb54"}.icon-Value::before{content:"\eb55"}.icon-vehicle::before{content:"\eb56"}.icon-video::before{content:"\eb57"}.icon-video-file::before{content:"\eb58"}.icon-video-phone::before{content:"\eb59"}.icon-video-meeting2::before{content:"\eb5a"}.icon-Vinyl::before{content:"\eb5b"}.icon-vip-contact::before{content:"\eb5c"}.icon-virtual-gamepad::before{content:"\eb5d"}.icon-visual-voicemail::before{content:"\eb5e"}.icon-vod-portrait::before{content:"\eb5f"}.icon-volte::before{content:"\eb60"}.icon-volume-high::before{content:"\eb61"}.icon-volume-low::before{content:"\eb62"}.icon-volume-mid::before{content:"\eb63"}.icon-volume-none::before{content:"\eb64"}.icon-vowifi::before{content:"\eb65"}.icon-vvm-message-read-full::before{content:"\eb66"}.icon-Warehouse::before{content:"\eb67"}.icon-Warningimportant::before{content:"\eb68"}.icon-Warning-important::before{content:"\eb69"}.icon-web-cam::before{content:"\eb6a"}.icon-web-fax-widget::before{content:"\eb6b"}.icon-Wholesale-retail::before{content:"\eb6c"}.icon-Widget::before{content:"\eb6d"}.icon-widget-tour::before{content:"\eb6e"}.icon-wifi::before{content:"\eb6f"}.icon-wifi-0::before{content:"\eb70"}.icon-wifi-1::before{content:"\eb71"}.icon-wifi-2::before{content:"\eb72"}.icon-wps-pairing::before{content:"\eb73"}.icon-WPT::before{content:"\eb74"}.icon-zoom-in::before{content:"\eb75"}.icon-zoom-out::before{content:"\eb76"}.icon-popout-tech::before{content:"\e634"}.icon-frame-care::before{content:"\e640"}.icon-frame-family::before{content:"\e637"}.icon-frame-fun::before{content:"\e638"}.icon-frame-home::before{content:"\e639"}.icon-frame-money::before{content:"\e63a"}.icon-frame-on-the-move::before{content:"\e63b"}.icon-frame-tariff::before{content:"\e63c"}.icon-frame-tech::before{content:"\e63d"}.icon-frame-wellbeing::before{content:"\e63e"}.icon-frame-work::before{content:"\e63f"}.icon-popout-care::before{content:"\e62d"}.icon-popout-family::before{content:"\e62e"}.icon-popout-fun::before{content:"\e62f"}.icon-popout-home::before{content:"\e630"}.icon-popout-money::before{content:"\e631"}.icon-popout-on-the-move::before{content:"\e632"}.icon-popout-tariff::before{content:"\e633"}.icon-popout-wellbeing::before{content:"\e635"}.icon-popout-work::before{content:"\e636"}.icon-frame-connectivity::before{content:"\eb78"}.icon-frame-my-customers::before{content:"\eb79"}.icon-frame-performance::before{content:"\eb7a"}.icon-frame-security::before{content:"\eb7b"}.icon-frame-teamwork::before{content:"\eb7c"}.icon-popout-connectivity::before{content:"\eb7d"}.icon-popout-my-customers::before{content:"\eb7e"}.icon-popout-performance::before{content:"\eb7f"}.icon-popout-security::before{content:"\eb80"}.icon-popout-teamwork::before{content:"\eb81"}.svg-arrow-next,.svg-arrow-previous,.svg-avatar,.svg-buy,.svg-checkbox-tick,.svg-delete,.svg-error,.svg-info,.svg-menu,.svg-search,.svg-settings,.svg-success,.svg-tick,.svg-warning,.svg-warning-circle{position:relative}.svg-arrow-next::after,.svg-arrow-previous::after,.svg-avatar::after,.svg-buy::after,.svg-checkbox-tick::after,.svg-delete::after,.svg-error::after,.svg-info::after,.svg-menu::after,.svg-search::after,.svg-settings::after,.svg-success::after,.svg-tick::after,.svg-warning-circle::after,.svg-warning::after{position:absolute;top:0;left:0;width:1.25rem;height:1.25rem;content:"";background-repeat:no-repeat;background-size:cover}.svg-delete::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E")}.svg-checkbox-tick::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E")}.svg-warning-circle::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='%23527edb'/%3E%3C/svg%3E")}.svg-menu::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23fff'/%3E%3C/svg%3E")}.svg-menu:hover::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23000'/%3E%3C/svg%3E")}.svg-tick::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='%2332c832'/%3E%3C/svg%3E")}.svg-success::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E")}.svg-warning::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='%23fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E")}.svg-error::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E")}.svg-info::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%23527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='%23fff'/%3E%3C/svg%3E")}.svg-arrow-previous::after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E")}.svg-arrow-previous:active::after,.svg-arrow-previous:focus::after,.svg-arrow-previous:hover::after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23fff'/%3E%3C/svg%3E")}.svg-arrow-next::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E")}.svg-arrow-next.btn-primary::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23fff'/%3E%3C/svg%3E")}.svg-arrow-next.btn-primary:active::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E")}.svg-settings::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23fff'/%3E%3C/svg%3E")}.svg-settings:focus::after,.svg-settings:hover::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23f16e00'/%3E%3C/svg%3E")}.svg-search::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23fff'/%3E%3C/svg%3E")}.svg-search:hover::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23f16e00'/%3E%3C/svg%3E")}.svg-avatar::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23fff'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23fff'/%3E%3C/svg%3E")}.svg-avatar:active::after,.svg-avatar:hover::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23f16e00'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23f16e00'/%3E%3C/svg%3E")}.svg-buy::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23fff'/%3E%3C/svg%3E")}.svg-buy:active::after,.svg-buy:hover::after{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23f16e00'/%3E%3C/svg%3E")}.btn-mail{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A")}.btn-mail:focus,.btn-mail:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A")}.btn-mail:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E")}@media screen and (-ms-high-contrast:active){.btn-mail{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E")}}.btn-mail-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A")}.btn-mail-inverse:focus,.btn-mail-inverse:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A")}.btn-mail-inverse:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-mail-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A")}}.btn-lin{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A")}.btn-lin:focus,.btn-lin:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E")}.btn-lin:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-lin{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A")}}.btn-lin-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-lin-inverse:focus,.btn-lin-inverse:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E")}.btn-lin-inverse:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-lin-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A")}}.btn-gplus{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A")}.btn-gplus:focus,.btn-gplus:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-gplus:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-gplus{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A")}}.btn-gplus-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-gplus-inverse:focus,.btn-gplus-inverse:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-gplus-inverse:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-gplus-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A")}}.btn-tw{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A")}.btn-tw:focus,.btn-tw:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A")}.btn-tw:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-tw{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A")}}.btn-tw-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-tw-inverse:focus,.btn-tw-inverse:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A")}.btn-tw-inverse:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-tw-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A")}}.btn-fbk{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A")}.btn-fbk:focus,.btn-fbk:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-fbk:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-fbk{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A")}}.btn-fbk-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-fbk-inverse:focus,.btn-fbk-inverse:hover{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A")}.btn-fbk-inverse:active{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A")}@media screen and (-ms-high-contrast:active){.btn-fbk-inverse{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A")}}
+/*# sourceMappingURL=orangeIcons.min.css.map */ \ No newline at end of file
diff --git a/dashboard/public/css/orangeIcons.min.css.map b/dashboard/public/css/orangeIcons.min.css.map
new file mode 100644
index 00000000..81aa54c1
--- /dev/null
+++ b/dashboard/public/css/orangeIcons.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["..\\..\\scss\\orangeIcons.scss","dist\\css\\orangeIcons.css","..\\..\\scss\\mixins\\_orangeIcons.scss"],"names":[],"mappings":"AAUA,WACE,YAAA,YACA,WAAA,OACA,YAAA,IACA,aAAA,MACA,IAAA,gCAAA,eAAA,CAAA,+BAAA,eCKF,kBAXA,wBACA,SAGA,sBACA,uBAKA,qBAJA,qBACA,uBACA,oBANA,SACA,aAMA,cAIA,oBASA,UAEA,iBAIA,YADA,gBAQA,oBACA,oBACA,oBACA,oBAPA,mBACA,mBACA,mBACA,mBAiBA,oBAKA,yBACA,WACA,oBACA,cAKA,UAGA,iBAEA,WASA,cAKA,iBAIA,YAGA,0BAwBA,SA6BA,UA9CA,iBAIA,gCACA,8BAQA,eACA,kBACA,cACA,iBAGA,yBAGA,YAEA,uBAIA,kBACA,gCACA,kBACA,qBACA,YACA,eAGA,qBASA,cAGA,WACA,8BAEA,sBAEA,wBACA,mBAIA,yBACA,oBAgBA,oBAEA,sBACA,wBACA,sBACA,aACA,kBACA,4BACA,uBAIA,kBAOA,eAKA,qBAOA,oBAOA,kBACA,eACA,4BAIA,cAIA,YACA,oBAGA,cAEA,oBACA,qBAEA,eAEA,qBAGA,wBACA,eAOA,qBACA,oBACA,cACA,2BAGA,oBAEA,uBACA,cAEA,eAQA,gBAGA,qBACA,iBACA,iBAIA,aAEA,eAEA,iBAGA,gBAoBA,wBAnBA,iBAKA,iCACA,yBAEA,uBAKA,gCACA,+BACA,iCACA,+BAEA,oBAIA,aACA,aACA,eACA,aACA,cACA,oBAGA,WAOA,2BAGA,sBAGA,UAEA,YACA,kBACA,wBAEA,oBAEA,uBAMA,iBAGA,8BACA,+BAEA,4BAOA,YAEA,sBAOA,wBANA,wBASA,gBAIA,mBAEA,kBAEA,sBAQA,sBAYA,cAPA,aACA,kBACA,sBAOA,mBACA,wBAKA,oBAMA,qBAEA,oCACA,+BAGA,mCAMA,2BAmBA,mBAbA,yBAJA,oBAWA,qBACA,4BAkCA,kBAxBA,cACA,sBAGA,eAEA,YACA,mBAGA,aAKA,mBAEA,YAEA,WAcA,qBACA,WACA,kBAEA,gBAGA,eAEA,WAIA,uBAEA,yBACA,wBACA,yBAGA,iBAEA,0BAUA,gBANA,aAEA,aACA,cACA,eAIA,WACA,qBACA,aAOA,iBAEA,WAGA,eACA,6BACA,aAQA,aAGA,iBACA,oBACA,mBACA,YAMA,mBALA,2BACA,2BASA,oBACA,qBAIA,iBACA,oBAEA,aACA,gBAEA,aAGA,iBA2BA,gBAtBA,WAKA,iBACA,eAIA,aASA,cAWA,UAPA,WAKA,iBAIA,YAMA,YAyBA,UAbA,gBAEA,wBADA,uBAIA,uBACA,aAjmBA,kBAEA,8BACA,8BACA,4BACA,6BACA,2BACA,2BACA,2BACA,qBAEA,eAEA,mBACA,oBAGA,kBACA,gBAaA,yBACA,yBACA,yBACA,yBAPA,wBACA,wBACA,wBACA,wBAKA,kBACA,kBACA,kBACA,gBAEA,mBACA,cACA,gBACA,gBAKA,iBAEA,iBACA,qBAFA,eAIA,iBACA,iBAEA,aAEA,aACA,cACA,oBACA,oBACA,uBACA,oBACA,mBACA,qBAEA,gBACA,gBACA,eACA,gBAEA,oBACA,eACA,qBAEA,gBACA,iBAEA,wBACA,sBACA,0BACA,UACA,oBACA,WAGA,kBACA,mBAGA,qBACA,oBANA,oBAOA,WACA,mBACA,kBACA,eACA,aAMA,uBAEA,cACA,yBD7GA,oBC+GA,uBAEA,yBACA,YACA,mBAOA,gCACA,oBAEA,sBACA,uBACA,iBACA,mBACA,mBACA,qBACA,qBACA,WAGA,YAGA,yBAEA,oBAGA,sBACA,oBACA,cAGA,aAWA,+BAVA,8BACA,wCACA,8BACA,6BACA,uCAOA,qBACA,+BAPA,yBACA,oBACA,oBACA,8BACA,gBAIA,cAEA,mBAQA,qBACA,oBACA,mBAEA,oBACA,eACA,YACA,yBACA,oBACA,YAEA,iBACA,iBACA,iBACA,iBAEA,mBACA,4BACA,2BACA,eACA,YACA,sBAEA,WACA,wBACA,uBAEA,wBADA,oBAEA,kBAIA,UACA,YACA,mBAEA,mBACA,sBACA,oBAGA,aACA,qBAEA,mBAGA,gBAEA,aAEA,cACA,WAGA,uBACA,oBACA,sBACA,uBACA,gBACA,eAKA,yBAkYA,iBAmBA,yBAlBA,mBACA,gBACA,iBACA,kBAgBA,yBAfA,wBAgBA,wBACA,qBAhBA,mBAiBA,qBAhBA,iBACA,sBACA,iBA1YA,eAEA,0BAGA,YAGA,oBAEA,uBADA,iBAFA,oBAIA,uBACA,kBACA,iBAEA,aACA,qBAIA,iBACA,cACA,WAEA,iBAEA,iBAEA,eACA,YAGA,YACA,iBACA,kBACA,YAGA,WAGA,0BADA,sBAEA,eACA,uBAKA,qBAGA,aACA,eAOA,mBACA,cAEA,WACA,cACA,mBACA,oBACA,2BACA,WAEA,gBACA,aAEA,qBACA,yBAEA,cAIA,oBAEA,WAEA,gBACA,4BACA,wBACA,iCACA,iBAEA,iBACA,gBAGA,0BAEA,iBACA,yBACA,uBACA,8BACA,sBACA,mBAEA,mBAGA,mBACA,yBACA,uBACA,sBACA,sBAEA,iBACA,YAEA,qBACA,gBACA,wBAEA,iBAEA,mBAEA,iBACA,iBACA,kBACA,mBACA,0BACA,iBACA,eAEA,gBACA,cACA,kBACA,iBAIA,eACA,UACA,gBACA,UAEA,aAGA,8BACA,oBACA,aACA,kBAEA,kBAyBA,yBAvBA,uBACA,kBACA,uBAEA,oBAGA,4BACA,+BAEA,gDACA,+CACA,6BACA,4BACA,8BAEA,wBAEA,qBACA,kBACA,uBAEA,mBAEA,iBACA,qBACA,mBACA,yBAGA,oBACA,gBACA,oBACA,kBAlCA,mBAoCA,mBACA,aACA,qCACA,4BAGA,kBACA,uBAEA,iBAGA,iBACA,eAEA,kCACA,oBACA,iBACA,uBAEA,wBAEA,iBAEA,mBACA,sBACA,YAsLA,kBAcA,0BAbA,oBACA,iBACA,kBACA,mBAWA,0BAVA,yBAWA,yBACA,sBAXA,oBAYA,sBA7BA,kBAkBA,uBACA,kBA7LA,gBAEA,YACA,sBACA,mBACA,eACA,cACA,sBACA,uBACA,cAIA,oBAEA,gBACA,aAEA,qBAEA,mBACA,aACA,qBAEA,sBAIA,aACA,kBAEA,uBAEA,cACA,gBACA,cAEA,kBAIA,cAEA,aAIA,cACA,eACA,uBACA,2BACA,qBACA,YAEA,eAEA,eACA,yBAIA,0BACA,iBACA,iBACA,iBACA,iBACA,iBACA,mBAEA,UACA,kBAOA,iBACA,wBACA,yBAEA,gBACA,kBACA,qBACA,sBAGA,qBACA,aACA,kBAGA,oBAGA,2BAEA,c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I,iBAAA,+9HF0uFJ,UE7sFE,iBAAA,qmCF6sFF,gBAAA,gBE1sFI,iBAAA,45BF0sFJ,iBEvsFI,iBAAA,m4BAEF,6CFqsFF,UEpsFI,iBAAA,o4BFwsFJ,kBEnsFE,iBAAA,gmCFmsFF,wBAAA,wBEhsFI,iBAAA,45BFgsFJ,yBE7rFI,iBAAA,g4BAEF,6CF2rFF,kBE1rFI,iBAAA,i4BF8rFJ,SEzrFE,iBAAA,8oCFyrFF,eAAA,eEtrFI,iBAAA,g8BFsrFJ,gBEnrFI,iBAAA,w7BAEF,6CFirFF,SEhrFI,iBAAA,y7BForFJ,iBE/qFE,iBAAA,opCF+qFF,uBAAA,uBE5qFI,iBAAA,g8BF4qFJ,wBEzqFI,iBAAA,s7BAEF,6CFuqFF,iBEtqFI,iBAAA,y7BF0qFJ,WErqFE,iBAAA,8sCFqqFF,iBAAA,iBElqFI,iBAAA,wgCFkqFJ,kBE/pFI,iBAAA,8+BAEF,6CF6pFF,WE5pFI,iBAAA,++BFgqFJ,mBE3pFE,iBAAA,ytCF2pFF,yBAAA,yBExpFI,iBAAA,wgCFwpFJ,0BErpFI,iBAAA,k/BAEF,6CFmpFF,mBElpFI,iBAAA,m/BFspFJ,QEjpFE,iBAAA,kmDFipFF,cAAA,cE9oFI,iBAAA,25CF8oFJ,eE3oFI,iBAAA,44CAEF,6CFyoFF,QExoFI,iBAAA,64CF4oFJ,gBEvoFE,iBAAA,smDFuoFF,sBAAA,sBEpoFI,iBAAA,25CFooFJ,uBEjoFI,iBAAA,44CAEF,6CF+nFF,gBE9nFI,iBAAA,64CFkoFJ,SE7nFE,iBAAA,m3BF6nFF,eAAA,eE1nFI,iBAAA,4qBF0nFJ,gBEvnFI,iBAAA,upBAEF,6CFqnFF,SEpnFI,iBAAA,wpBFwnFJ,iBEnnFE,iBAAA,23BFmnFF,uBAAA,uBEhnFI,iBAAA,4qBFgnFJ,wBE7mFI,iBAAA,qpBAEF,6CF2mFF,iBE1mFI,iBAAA","sourcesContent":["// stylelint-disable selector-class-pattern\n// Orange Boosted with Bootstrap\n// Orange Icons\n// Copyright (C) 2016 Orange SA All rights reserved\n// See NOTICE.txt for more informations\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins/orangeIcons\";\n\n@font-face {\n font-family: icon-orange;\n font-style: normal;\n font-weight: $font-weight-normal;\n font-display: block;\n src: url(\"#{$icon-font-path}icon-orange.woff2\") format(\"woff2\"), url(\"#{$icon-font-path}icon-orange.woff\") format(\"woff\");\n}\n\n.icon-checkbox-tick,\n.icon-2for1cinematicket,\n.icon-3g,\n.icon-4g,\n.icon-4g-cam,\n.icon-4G-Cam--Live-80,\n.icon-4G-Cam-Camera-80,\n.icon-4G-Cam-Inbox80,\n.icon-4G-Cam-Outbox-80,\n.icon-4G-Cam-Rec-80,\n.icon-4g-plus,\n.icon-4G-Cam-Compact,\n.icon-1013-Reseau,\n.icon-about-event,\n.icon-Accessability,\n.icon-accessibility-cognition,\n.icon-accessibility-dexterity,\n.icon-accessibility-hearing,\n.icon-accessibility-mobility,\n.icon-accessibility-speech,\n.icon-accessibility-vision,\n.icon-accessory-headphones,\n.icon-accessory-shop,\n.icon-Add,\n.icon-add-more,\n.icon-Add-person,\n.icon-address-book,\n.icon-administrator,\n.icon-Adultcode,\n.icon-Adult,\n.icon-advertising,\n.icon-aeroplane,\n.icon-Age-rating-3,\n.icon-Age-rating-4,\n.icon-Age-rating-7,\n.icon-Age-rating-9,\n.icon-Age-rating-12,\n.icon-Age-rating-16,\n.icon-Age-rating-17,\n.icon-Age-rating-18,\n.icon-age-rating-mono-3,\n.icon-age-rating-mono-4,\n.icon-age-rating-mono-7,\n.icon-age-rating-mono-9,\n.icon-age-rating-mono-12,\n.icon-age-rating-mono-16,\n.icon-age-rating-mono-17,\n.icon-age-rating-mono-18,\n.icon-agriculture,\n.icon-airbox-auto,\n.icon-alarm-clock,\n.icon-alarm-off,\n.icon-Alias-numbers,\n.icon-all-channels,\n.icon-antenna,\n.icon-anti-spam,\n.icon-antivirus,\n.icon-Apartment-building,\n.icon-Apps,\n.icon-Apps-disabled,\n.icon-Archive,\n.icon-arrow-down,\n.icon-arrow-up,\n.icon-arrow-next,\n.icon-arrow-previous,\n.icon-Art,\n.icon-assistance,\n.icon-attachment,\n.icon-Auditorium,\n.icon-avatar,\n.icon-Baby,\n.icon-backup,\n.icon-banking,\n.icon-battery-1-bar,\n.icon-battery-2-bar,\n.icon-battery-charging,\n.icon-battery-empty,\n.icon-battery-full,\n.icon-battery-full-2,\n.icon-Betting,\n.icon-bill-euro,\n.icon-billboard,\n.icon-birthday,\n.icon-bluetooth,\n.icon-Book-award,\n.icon-book-download,\n.icon-bookmark,\n.icon-bookmark-smart,\n.icon-Boxes,\n.icon-broadcast,\n.icon-burst-mode,\n.icon-Business-everywhere,\n.icon-business-invoices,\n.icon-business-lounge,\n.icon-business-telephonie,\n.icon-buy,\n.icon-buy-back-euro,\n.icon-buzz,\n.icon-Calculator,\n.icon-calendaralarm,\n.icon-calendar-30,\n.icon-calendar-day,\n.icon-Calendar-fixtures-results,\n.icon-Calendar-football-match,\n.icon-calendar-month,\n.icon-calendar-week,\n.icon-call,\n.icon-call-forward,\n.icon-call-invite,\n.icon-call-log,\n.icon-camera,\n.icon-Car-park,\n.icon-Car-pooling,\n.icon-Casting,\n.icon-Categories,\n.icon-CD,\n.icon-change-wallpaper,\n.icon-Change-wallpaper-1,\n.icon-charger,\n.icon-check-your-balance,\n.icon-Child,\n.icon-child-protection,\n.icon-Children-channel,\n.icon-cineday-silhouette,\n.icon-clock,\n.icon-cloud-backup,\n.icon-Coat-hanger,\n.icon-Collective-class-training,\n.icon-Colour-Call,\n.icon-Comedy-channel,\n.icon-Comic,\n.icon-Comments,\n.icon-commercial-representitive,\n.icon-community-sms,\n.icon-Concierge-bell,\n.icon-conference-call,\n.icon-connected-object,\n.icon-connection,\n.icon-construction,\n.icon-contact-card,\n.icon-control-centre,\n.icon-control-mydata,\n.icon-copy,\n.icon-Courier,\n.icon-CPU,\n.icon-crane,\n.icon-Crop,\n.icon-Currency-brazilian-real,\n.icon-currency-converter,\n.icon-Currency-dollar,\n.icon-currency-euro,\n.icon-Currency-sterling,\n.icon-Currency-yen,\n.icon-data-protection,\n.icon-data-services,\n.icon-decoder,\n.icon-Decrease-test-size,\n.icon-Defibrillator,\n.icon-delete,\n.icon-device-desktop-computer,\n.icon-device-desktop-computer-connected,\n.icon-device-fixed-line-phone,\n.icon-device-laptop-computer,\n.icon-device-laptop-computer-connected,\n.icon-device-smart-phone,\n.icon-device-status,\n.icon-device-tablet,\n.icon-device-tablet-connected,\n.icon-device-tv,\n.icon-device-connected-printer,\n.icon-device-manager,\n.icon-device-managment-express,\n.icon-dialler,\n.icon-Digital-frame,\n.icon-disable-apps,\n.icon-Discovery-offer,\n.icon-Discussion-author,\n.icon-Discussion-more,\n.icon-Doctor,\n.icon-Doctors-bag,\n.icon-Doctors-communicating,\n.icon-Document-compose,\n.icon-document-stack,\n.icon-document-word,\n.icon-document-zip,\n.icon-Documentary,\n.icon-done-modifier,\n.icon-download,\n.icon-draft,\n.icon-dual-sim-packaging,\n.icon-easy-internet,\n.icon-ebook,\n.icon-Eco-mode,\n.icon-edashboard,\n.icon-edit-draft,\n.icon-edit-email,\n.icon-edit-image,\n.icon-Elderly-person,\n.icon-electric-car,\n.icon-electric-car-charging,\n.icon-electricity-provider,\n.icon-elevator,\n.icon-email,\n.icon-email-forwarded,\n.icon-Email-replied,\n.icon-emap,\n.icon-emergency-firemen,\n.icon-emergency-police,\n.icon-emergency-sos,\n.icon-emergency-service,\n.icon-employees-1,\n.icon-Empty-trash,\n.icon-End-call,\n.icon-Entertainment-channel,\n.icon-epg,\n.icon-erase,\n.icon-error-severe,\n.icon-Ethenet,\n.icon-event-agenda,\n.icon-event-organiser,\n.icon-event-speaker,\n.icon-Excel,\n.icon-Expand-screen,\n.icon-expert,\n.icon-external-drive,\n.icon-Factory,\n.icon-family-place,\n.icon-Fast-delivery,\n.icon-Favorite-music,\n.icon-favourite,\n.icon-Featured,\n.icon-filter,\n.icon-Filter-effects,\n.icon-finance,\n.icon-fire,\n.icon-Fire-extinguisher,\n.icon-Firewall,\n.icon-flexible-storage,\n.icon-folder-camera,\n.icon-folder-document,\n.icon-folder-favourite,\n.icon-folder-sd,\n.icon-football,\n.icon-Football-match,\n.icon-Football-quiz,\n.icon-Forward,\n.icon-Forward-curved-arrow,\n.icon-forward-the-number,\n.icon-free-tag,\n.icon-Free-up-space,\n.icon-front-end-dashboard,\n.icon-Full-screen-view,\n.icon-Gallery,\n.icon-games,\n.icon-Gas-tank,\n.icon-gaugecapacity,\n.icon-gauge-counter,\n.icon-gauge-rate,\n.icon-gauge-mon-reseau,\n.icon-generic-document,\n.icon-geolocation,\n.icon-hands-free,\n.icon-HDMI-Card,\n.icon-health,\n.icon-health-monitor,\n.icon-Health-patient,\n.icon-Heart-rate,\n.icon-Heartbeats,\n.icon-help-guide,\n.icon-history,\n.icon-home,\n.icon-Home-1,\n.icon-home-alarm,\n.icon-Homelive,\n.icon-homescreen,\n.icon-Horoscopes,\n.icon-hospital,\n.icon-hotel,\n.icon-Hourglass,\n.icon-Im-driving,\n.icon-image,\n.icon-image-file,\n.icon-improvement,\n.icon-inbox,\n.icon-Incoming-call-curved-arrow,\n.icon-Increase-test-size,\n.icon-info,\n.icon-Information-data,\n.icon-internationaltv,\n.icon-international-globe,\n.icon-internet,\n.icon-internet-browser,\n.icon-Internet-security-desktop,\n.icon-Internet-security-mobile,\n.icon-Internet-security-password,\n.icon-Internet-security-server,\n.icon-internet-usage,\n.icon-Interventions,\n.icon-IT-infrastructure,\n.icon-keeper,\n.icon-keyboard,\n.icon-Keypad,\n.icon-La-Cle,\n.icon-Language,\n.icon-Latest,\n.icon-Le-Bloc,\n.icon-Leave-session,\n.icon-lightbulb-sh,\n.icon-ligue-1,\n.icon-Link,\n.icon-live,\n.icon-livebox,\n.icon-livebox-info,\n.icon-livebox-phone,\n.icon-location-pin-compass,\n.icon-lock,\n.icon-Lock-screen-settings,\n.icon-logistics,\n.icon-logout,\n.icon-Maintenance-man,\n.icon-manage-android,\n.icon-managing-equipment,\n.icon-Map,\n.icon-map-pin,\n.icon-Medal,\n.icon-Medical-app,\n.icon-Medical-app-phone,\n.icon-medical-chart,\n.icon-Medical-files,\n.icon-menu,\n.icon-Message-download,\n.icon-messaging,\n.icon-messaging-compose-sms,\n.icon-messaging-unified,\n.icon-messaging-untitled-compose,\n.icon-microphone,\n.icon-Microscope,\n.icon-mini-games,\n.icon-mirroring,\n.icon-Missed-call-boxed-arrow,\n.icon-Missed-call-curved-arrow,\n.icon-mobile-applications,\n.icon-Mobile-backup-restore,\n.icon-mobile-box,\n.icon-mobile-data-toggle,\n.icon-mobile-insurance,\n.icon-mobile-network-coverage,\n.icon-mobile-security,\n.icon-mobile-setup,\n.icon-Modem,\n.icon-modifier-add,\n.icon-Modifier-delete,\n.icon-Modifier-favorite,\n.icon-modifier-new,\n.icon-modifier-no-access,\n.icon-modifier-synchro,\n.icon-modifier-upload,\n.icon-modifier-wizard,\n.icon-Modifier-download,\n.icon-mon-reseau,\n.icon-money,\n.icon-More-dots,\n.icon-move-to-folder,\n.icon-multi-sim,\n.icon-multiple-timezone,\n.icon-Music-artist,\n.icon-music-file,\n.icon-Music-genre,\n.icon-music-player,\n.icon-Mute-microphone,\n.icon-my-account,\n.icon-my-bill-uk,\n.icon-my-boutique,\n.icon-my-essential,\n.icon-my-essential-tablet,\n.icon-my-livebox,\n.icon-my-media,\n.icon-My-Office-Phone,\n.icon-my-orange,\n.icon-my-plug,\n.icon-my-services,\n.icon-my-travels,\n.icon-Nature,\n.icon-Network-add,\n.icon-Network-livebox,\n.icon-networks,\n.icon-new,\n.icon-newspaper,\n.icon-nfc,\n.icon-NFC-tag,\n.icon-no-sim,\n.icon-Notification,\n.icon-Notification-Bell,\n.icon-nouveau-contract-social,\n.icon-numero-unique,\n.icon-office,\n.icon-oil-and-gas,\n.icon-On-board-unit,\n.icon-online-help,\n.icon-orangewallet,\n.icon-orange-assistant,\n.icon-orange-cash,\n.icon-orange-corporate,\n.icon-Orange-Detente,\n.icon-orange-events,\n.icon-Orange-Experts-Class-Training,\n.icon-Orange-Experts-Copy-Keep,\n.icon-orange-experts-expert,\n.icon-orange-experts-insurance,\n.icon-Orange-Experts-One2One-Coach,\n.icon-orange-experts-orange-business-consultant,\n.icon-orange-experts-orange-startup-smartphone,\n.icon-orange-experts-recycle,\n.icon-orange-experts-repair,\n.icon-orange-experts-tranquil,\n.icon-Orange-Football-Club,\n.icon-orange-foundation,\n.icon-Orange-garden,\n.icon-orange-gesture,\n.icon-orange-jobs,\n.icon-orange-messenger,\n.icon-Orange-Messenger-1,\n.icon-orange-money,\n.icon-orange-Photography,\n.icon-orange-pro,\n.icon-orange-protect,\n.icon-orange-radio,\n.icon-orange-reflections,\n.icon-Orange-rewards,\n.icon-Orange-security-suite,\n.icon-orange-travel,\n.icon-orange-tv,\n.icon-orange-wallet,\n.icon-orange-wifi,\n.icon-Orange-Guest,\n.icon-organisation,\n.icon-outbox,\n.icon-outdoor-sports-mountain-biking,\n.icon-outdoor-sports-skiing,\n.icon-Package,\n.icon-Package-content,\n.icon-parabole-tv,\n.icon-parental-control,\n.icon-Parrasol,\n.icon-pass-video,\n.icon-Pause,\n.icon-Payment-euro,\n.icon-pda-device,\n.icon-pdf-file,\n.icon-Pencil,\n.icon-personal-smartphone-trainer,\n.icon-phone-advisor,\n.icon-phone-fund,\n.icon-phone-protection,\n.icon-Photo-dialer,\n.icon-picture-messaging,\n.icon-Pills,\n.icon-pioneering,\n.icon-Play,\n.icon-play-and-win,\n.icon-playmode-random,\n.icon-polls,\n.icon-portfolio,\n.icon-POS-payment,\n.icon-power,\n.icon-powerpoint-file,\n.icon-presentation,\n.icon-previous,\n.icon-printer,\n.icon-profileringtone,\n.icon-public-transport,\n.icon-publish,\n.icon-Quirky-stories,\n.icon-Quiz,\n.icon-Radiography,\n.icon-ratings-stars,\n.icon-Real-time,\n.icon-recommend,\n.icon-record,\n.icon-Record-1,\n.icon-recycle-device,\n.icon-Redo,\n.icon-relationship,\n.icon-reload,\n.icon-remote-control,\n.icon-Remote-control-1,\n.icon-remove-modifier,\n.icon-Replay-boxed-arrow,\n.icon-Reply-boxed-arrow,\n.icon-Reply-curved-arrow,\n.icon-report,\n.icon-responsible,\n.icon-Restaurant,\n.icon-restore-to-phone,\n.icon-Restrictied-content,\n.icon-rewards,\n.icon-ringtones,\n.icon-running,\n.icon-Scales,\n.icon-scan-ticket,\n.icon-School,\n.icon-Science,\n.icon-Scissors,\n.icon-sd-card,\n.icon-SD-card-1,\n.icon-search,\n.icon-Send,\n.icon-Send-to-person,\n.icon-Server,\n.icon-servers,\n.icon-settings,\n.icon-setup-and-repair,\n.icon-setup-and-repair-cog,\n.icon-setup-internet,\n.icon-share,\n.icon-Share-wifi,\n.icon-shipping,\n.icon-Shop,\n.icon-shop-pin,\n.icon-shop-subscriptions,\n.icon-Shopping,\n.icon-Show-front-back-camera,\n.icon-Shower,\n.icon-showroom-mobile-pro,\n.icon-signal-1-5,\n.icon-signal-2-5,\n.icon-signal-3-5,\n.icon-signal-4-5,\n.icon-signal-5-5,\n.icon-signal-boost,\n.icon-Silent,\n.icon-sim,\n.icon-simple-mode,\n.icon-Simplicity,\n.icon-Skip-backward,\n.icon-Skip-forward,\n.icon-Sleep,\n.icon-Smart-electric-meter,\n.icon-Smart-heating-switch,\n.icon-smart-home,\n.icon-smart-lightswitch,\n.icon-smart-powerstation,\n.icon-Smart-Sensor,\n.icon-smart-tap,\n.icon-smart-watch,\n.icon-social-network,\n.icon-software-update,\n.icon-Sport-channel,\n.icon-Start-services,\n.icon-startup-wizard,\n.icon-stocks,\n.icon-stop-secret,\n.icon-Stop-video,\n.icon-Storage-cloud,\n.icon-store-locator,\n.icon-Street,\n.icon-Stretcher,\n.icon-subscription-package,\n.icon-Sudoku,\n.icon-support,\n.icon-surveillance-camera,\n.icon-Syncronise,\n.icon-target-location,\n.icon-tarif,\n.icon-tariff,\n.icon-task-list,\n.icon-Taxi,\n.icon-team-connect,\n.icon-temperature,\n.icon-terms-conditions,\n.icon-text-alerts,\n.icon-Thumb-down,\n.icon-Thumb-up,\n.icon-tick,\n.icon-tick-circle,\n.icon-tickets,\n.icon-Top-10,\n.icon-top-up-dollar,\n.icon-top-up-euro,\n.icon-top-up-uk-bank,\n.icon-touch-screen,\n.icon-town,\n.icon-townhall,\n.icon-track-your-delivery,\n.icon-track-your-order,\n.icon-Trading,\n.icon-trash,\n.icon-tv-plus,\n.icon-TV-series,\n.icon-Undo,\n.icon-unique,\n.icon-unknown-file,\n.icon-unlimited-calls,\n.icon-unlocked,\n.icon-Unmissable,\n.icon-upload,\n.icon-USB,\n.icon-usb-key,\n.icon-Value,\n.icon-vehicle,\n.icon-video,\n.icon-video-file,\n.icon-video-phone,\n.icon-video-meeting2,\n.icon-Vinyl,\n.icon-vip-contact,\n.icon-virtual-gamepad,\n.icon-visual-voicemail,\n.icon-vod-portrait,\n.icon-volte,\n.icon-volume-high,\n.icon-volume-low,\n.icon-volume-mid,\n.icon-volume-none,\n.icon-vowifi,\n.icon-vvm-message-read-full,\n.icon-Warehouse,\n.icon-Warningimportant,\n.icon-Warning-important,\n.icon-web-cam,\n.icon-web-fax-widget,\n.icon-Wholesale-retail,\n.icon-Widget,\n.icon-widget-tour,\n.icon-wifi,\n.icon-wifi-0,\n.icon-wifi-1,\n.icon-wifi-2,\n.icon-wps-pairing,\n.icon-WPT,\n.icon-zoom-in,\n.icon-zoom-out,\n.icon-popout-tech,\n.icon-frame-care,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n // use !important to prevent issues with browser extensions that change fonts //\n font-family: icon-orange !important; // stylelint-disable-line declaration-no-important, font-family-no-missing-generic-family-keyword\n font-style: normal;\n font-variant: normal;\n line-height: 1;\n text-transform: none;\n speak: none;\n\n // Better Font Rendering =========== //\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-tech,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-frame-care,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n color: theme-color(\"primary\");\n}\n\n\n.icon-checkbox-tick::before {\n content: \"\\eb77\";\n}\n.icon-2for1cinematicket::before {\n content: \"\\e900\";\n}\n.icon-3g::before {\n content: \"\\e901\";\n}\n.icon-4g::before {\n content: \"\\e902\";\n}\n.icon-4g-cam::before {\n content: \"\\e903\";\n}\n.icon-4G-Cam--Live-80::before {\n content: \"\\e904\";\n}\n.icon-4G-Cam-Camera-80::before {\n content: \"\\e905\";\n}\n.icon-4G-Cam-Inbox80::before {\n content: \"\\e906\";\n}\n.icon-4G-Cam-Outbox-80::before {\n content: \"\\e907\";\n}\n.icon-4G-Cam-Rec-80::before {\n content: \"\\e908\";\n}\n.icon-4g-plus::before {\n content: \"\\e909\";\n}\n.icon-4G-Cam-Compact::before {\n content: \"\\e90a\";\n}\n.icon-1013-Reseau::before {\n content: \"\\e90b\";\n}\n.icon-about-event::before {\n content: \"\\e90c\";\n}\n.icon-Accessability::before {\n content: \"\\e90d\";\n}\n.icon-accessibility-cognition::before {\n content: \"\\e90e\";\n}\n.icon-accessibility-dexterity::before {\n content: \"\\e90f\";\n}\n.icon-accessibility-hearing::before {\n content: \"\\e910\";\n}\n.icon-accessibility-mobility::before {\n content: \"\\e911\";\n}\n.icon-accessibility-speech::before {\n content: \"\\e912\";\n}\n.icon-accessibility-vision::before {\n content: \"\\e913\";\n}\n.icon-accessory-headphones::before {\n content: \"\\e914\";\n}\n.icon-accessory-shop::before {\n content: \"\\e915\";\n}\n.icon-Add::before {\n content: \"\\e916\";\n}\n.icon-add-more::before {\n content: \"\\e917\";\n}\n.icon-Add-person::before {\n content: \"\\e918\";\n}\n.icon-address-book::before {\n content: \"\\e919\";\n}\n.icon-administrator::before {\n content: \"\\e91a\";\n}\n.icon-Adultcode::before {\n content: \"\\e91b\";\n}\n.icon-Adult::before {\n content: \"\\e91c\";\n}\n.icon-advertising::before {\n content: \"\\e91d\";\n}\n.icon-aeroplane::before {\n content: \"\\e91e\";\n}\n.icon-Age-rating-3::before {\n content: \"\\e91f\";\n}\n.icon-Age-rating-4::before {\n content: \"\\e920\";\n}\n.icon-Age-rating-7::before {\n content: \"\\e921\";\n}\n.icon-Age-rating-9::before {\n content: \"\\e922\";\n}\n.icon-Age-rating-12::before {\n content: \"\\e923\";\n}\n.icon-Age-rating-16::before {\n content: \"\\e924\";\n}\n.icon-Age-rating-17::before {\n content: \"\\e925\";\n}\n.icon-Age-rating-18::before {\n content: \"\\e926\";\n}\n.icon-age-rating-mono-3::before {\n content: \"\\e927\";\n}\n.icon-age-rating-mono-4::before {\n content: \"\\e928\";\n}\n.icon-age-rating-mono-7::before {\n content: \"\\e929\";\n}\n.icon-age-rating-mono-9::before {\n content: \"\\e92a\";\n}\n.icon-age-rating-mono-12::before {\n content: \"\\e92b\";\n}\n.icon-age-rating-mono-16::before {\n content: \"\\e92c\";\n}\n.icon-age-rating-mono-17::before {\n content: \"\\e92d\";\n}\n.icon-age-rating-mono-18::before {\n content: \"\\e92e\";\n}\n.icon-agriculture::before {\n content: \"\\e92f\";\n}\n.icon-airbox-auto::before {\n content: \"\\e930\";\n}\n.icon-alarm-clock::before {\n content: \"\\e931\";\n}\n.icon-alarm-off::before {\n content: \"\\e932\";\n}\n.icon-Alias-numbers::before {\n content: \"\\e933\";\n}\n.icon-all-channels::before {\n content: \"\\e934\";\n}\n.icon-antenna::before {\n content: \"\\e935\";\n}\n.icon-anti-spam::before {\n content: \"\\e936\";\n}\n.icon-antivirus::before {\n content: \"\\e937\";\n}\n.icon-Apartment-building::before {\n content: \"\\e938\";\n}\n.icon-Apps::before {\n content: \"\\e939\";\n}\n.icon-Apps-disabled::before {\n content: \"\\e93a\";\n}\n.icon-Archive::before {\n content: \"\\e93b\";\n}\n.icon-arrow-down::before {\n content: \"\\e93c\";\n}\n.icon-arrow-up::before {\n content: \"\\e93d\";\n}\n.icon-arrow-next::before {\n content: \"\\e93e\";\n}\n.icon-arrow-previous::before {\n content: \"\\e93f\";\n}\n.icon-Art::before {\n content: \"\\e940\";\n}\n.icon-assistance::before {\n content: \"\\e941\";\n}\n.icon-attachment::before {\n content: \"\\e942\";\n}\n.icon-Auditorium::before {\n content: \"\\e943\";\n}\n.icon-avatar::before {\n content: \"\\e944\";\n}\n.icon-Baby::before {\n content: \"\\e945\";\n}\n.icon-backup::before {\n content: \"\\e946\";\n}\n.icon-banking::before {\n content: \"\\e947\";\n}\n.icon-battery-1-bar::before {\n content: \"\\e948\";\n}\n.icon-battery-2-bar::before {\n content: \"\\e949\";\n}\n.icon-battery-charging::before {\n content: \"\\e94a\";\n}\n.icon-battery-empty::before {\n content: \"\\e94b\";\n}\n.icon-battery-full::before {\n content: \"\\e94c\";\n}\n.icon-battery-full-2::before {\n content: \"\\e94d\";\n}\n.icon-Betting::before {\n content: \"\\e94e\";\n}\n.icon-bill-euro::before {\n content: \"\\e94f\";\n}\n.icon-billboard::before {\n content: \"\\e950\";\n}\n.icon-birthday::before {\n content: \"\\e951\";\n}\n.icon-bluetooth::before {\n content: \"\\e952\";\n}\n.icon-Book-award::before {\n content: \"\\e953\";\n}\n.icon-book-download::before {\n content: \"\\e954\";\n}\n.icon-bookmark::before {\n content: \"\\e955\";\n}\n.icon-bookmark-smart::before {\n content: \"\\e956\";\n}\n.icon-Boxes::before {\n content: \"\\e957\";\n}\n.icon-broadcast::before {\n content: \"\\e958\";\n}\n.icon-burst-mode::before {\n content: \"\\e959\";\n}\n.icon-Business-everywhere::before {\n content: \"\\e95a\";\n}\n.icon-business-invoices::before {\n content: \"\\e95b\";\n}\n.icon-business-lounge::before {\n content: \"\\e95c\";\n}\n.icon-business-telephonie::before {\n content: \"\\e95d\";\n}\n.icon-buy::before {\n content: \"\\e95e\";\n}\n.icon-buy-back-euro::before {\n content: \"\\e95f\";\n}\n.icon-buzz::before {\n content: \"\\e960\";\n}\n.icon-Calculator::before {\n content: \"\\e961\";\n}\n.icon-calendaralarm::before {\n content: \"\\e962\";\n}\n.icon-calendar-30::before {\n content: \"\\e963\";\n}\n.icon-calendar-day::before {\n content: \"\\e964\";\n}\n.icon-Calendar-fixtures-results::before {\n content: \"\\e965\";\n}\n.icon-Calendar-football-match::before {\n content: \"\\e966\";\n}\n.icon-calendar-month::before {\n content: \"\\e967\";\n}\n.icon-calendar-week::before {\n content: \"\\e968\";\n}\n.icon-call::before {\n content: \"\\e969\";\n}\n.icon-call-forward::before {\n content: \"\\e96a\";\n}\n.icon-call-invite::before {\n content: \"\\e96b\";\n}\n.icon-call-log::before {\n content: \"\\e96c\";\n}\n.icon-camera::before {\n content: \"\\e96d\";\n}\n.icon-Car-park::before {\n content: \"\\e96e\";\n}\n.icon-Car-pooling::before {\n content: \"\\e96f\";\n}\n.icon-Casting::before {\n content: \"\\e970\";\n}\n.icon-Categories::before {\n content: \"\\e971\";\n}\n.icon-CD::before {\n content: \"\\e972\";\n}\n.icon-change-wallpaper::before {\n content: \"\\e973\";\n}\n.icon-Change-wallpaper-1::before {\n content: \"\\e974\";\n}\n.icon-charger::before {\n content: \"\\e975\";\n}\n.icon-check-your-balance::before {\n content: \"\\e976\";\n}\n.icon-Child::before {\n content: \"\\e977\";\n}\n.icon-child-protection::before {\n content: \"\\e978\";\n}\n.icon-Children-channel::before {\n content: \"\\e979\";\n}\n.icon-cineday-silhouette::before {\n content: \"\\e97a\";\n}\n.icon-clock::before {\n content: \"\\e97b\";\n}\n.icon-cloud-backup::before {\n content: \"\\e97c\";\n}\n.icon-Coat-hanger::before {\n content: \"\\e97d\";\n}\n.icon-Collective-class-training::before {\n content: \"\\e97e\";\n}\n.icon-Colour-Call::before {\n content: \"\\e97f\";\n}\n.icon-Comedy-channel::before {\n content: \"\\e980\";\n}\n.icon-Comic::before {\n content: \"\\e981\";\n}\n.icon-Comments::before {\n content: \"\\e982\";\n}\n.icon-commercial-representitive::before {\n content: \"\\e983\";\n}\n.icon-community-sms::before {\n content: \"\\e984\";\n}\n.icon-Concierge-bell::before {\n content: \"\\e985\";\n}\n.icon-conference-call::before {\n content: \"\\e986\";\n}\n.icon-connected-object::before {\n content: \"\\e987\";\n}\n.icon-connection::before {\n content: \"\\e988\";\n}\n.icon-construction::before {\n content: \"\\e989\";\n}\n.icon-contact-card::before {\n content: \"\\e98a\";\n}\n.icon-control-centre::before {\n content: \"\\e98b\";\n}\n.icon-control-mydata::before {\n content: \"\\e98c\";\n}\n.icon-copy::before {\n content: \"\\e98d\";\n}\n.icon-Courier::before {\n content: \"\\e98e\";\n}\n.icon-CPU::before {\n content: \"\\e98f\";\n}\n.icon-crane::before {\n content: \"\\e990\";\n}\n.icon-Crop::before {\n content: \"\\e991\";\n}\n.icon-Currency-brazilian-real::before {\n content: \"\\e992\";\n}\n.icon-currency-converter::before {\n content: \"\\e993\";\n}\n.icon-Currency-dollar::before {\n content: \"\\e994\";\n}\n.icon-currency-euro::before {\n content: \"\\e995\";\n}\n.icon-Currency-sterling::before {\n content: \"\\e996\";\n}\n.icon-Currency-yen::before {\n content: \"\\e997\";\n}\n.icon-data-protection::before {\n content: \"\\e998\";\n}\n.icon-data-services::before {\n content: \"\\e999\";\n}\n.icon-decoder::before {\n content: \"\\e99a\";\n}\n.icon-Decrease-test-size::before {\n content: \"\\e99b\";\n}\n.icon-Defibrillator::before {\n content: \"\\e99c\";\n}\n.icon-delete::before {\n content: \"\\e99d\";\n}\n.icon-device-desktop-computer::before {\n content: \"\\e99e\";\n}\n.icon-device-desktop-computer-connected::before {\n content: \"\\e99f\";\n}\n.icon-device-fixed-line-phone::before {\n content: \"\\e9a0\";\n}\n.icon-device-laptop-computer::before {\n content: \"\\e9a1\";\n}\n.icon-device-laptop-computer-connected::before {\n content: \"\\e9a2\";\n}\n.icon-device-smart-phone::before {\n content: \"\\e9a3\";\n}\n.icon-device-status::before {\n content: \"\\e9a4\";\n}\n.icon-device-tablet::before {\n content: \"\\e9a5\";\n}\n.icon-device-tablet-connected::before {\n content: \"\\e9a6\";\n}\n.icon-device-tv::before {\n content: \"\\e9a7\";\n}\n.icon-device-connected-printer::before {\n content: \"\\e9a8\";\n}\n.icon-device-manager::before {\n content: \"\\e9a9\";\n}\n.icon-device-managment-express::before {\n content: \"\\e9aa\";\n}\n.icon-dialler::before {\n content: \"\\e9ab\";\n}\n.icon-Digital-frame::before {\n content: \"\\e9ac\";\n}\n.icon-disable-apps::before {\n content: \"\\e9ad\";\n}\n.icon-Discovery-offer::before {\n content: \"\\e9ae\";\n}\n.icon-Discussion-author::before {\n content: \"\\e9af\";\n}\n.icon-Discussion-more::before {\n content: \"\\e9b0\";\n}\n.icon-Doctor::before {\n content: \"\\e9b1\";\n}\n.icon-Doctors-bag::before {\n content: \"\\e9b2\";\n}\n.icon-Doctors-communicating::before {\n content: \"\\e9b3\";\n}\n.icon-Document-compose::before {\n content: \"\\e9b4\";\n}\n.icon-document-stack::before {\n content: \"\\e9b5\";\n}\n.icon-document-word::before {\n content: \"\\e9b6\";\n}\n.icon-document-zip::before {\n content: \"\\e9b7\";\n}\n.icon-Documentary::before {\n content: \"\\e9b8\";\n}\n.icon-done-modifier::before {\n content: \"\\e9b9\";\n}\n.icon-download::before {\n content: \"\\e9ba\";\n}\n.icon-draft::before {\n content: \"\\e9bb\";\n}\n.icon-dual-sim-packaging::before {\n content: \"\\e9bc\";\n}\n.icon-easy-internet::before {\n content: \"\\e9bd\";\n}\n.icon-ebook::before {\n content: \"\\e9be\";\n}\n.icon-Eco-mode::before {\n content: \"\\e9bf\";\n}\n.icon-edashboard::before {\n content: \"\\e9c0\";\n}\n.icon-edit-draft::before {\n content: \"\\e9c1\";\n}\n.icon-edit-email::before {\n content: \"\\e9c2\";\n}\n.icon-edit-image::before {\n content: \"\\e9c3\";\n}\n.icon-Elderly-person::before {\n content: \"\\e9c4\";\n}\n.icon-electric-car::before {\n content: \"\\e9c5\";\n}\n.icon-electric-car-charging::before {\n content: \"\\e9c6\";\n}\n.icon-electricity-provider::before {\n content: \"\\e9c7\";\n}\n.icon-elevator::before {\n content: \"\\e9c8\";\n}\n.icon-email::before {\n content: \"\\e9c9\";\n}\n.icon-email-forwarded::before {\n content: \"\\e9ca\";\n}\n.icon-Email-replied::before {\n content: \"\\e9cb\";\n}\n.icon-emap::before {\n content: \"\\e9cc\";\n}\n.icon-emergency-firemen::before {\n content: \"\\e9cd\";\n}\n.icon-emergency-police::before {\n content: \"\\e9ce\";\n}\n.icon-emergency-sos::before {\n content: \"\\e9cf\";\n}\n.icon-emergency-service::before {\n content: \"\\e9d0\";\n}\n.icon-employees-1::before {\n content: \"\\e9d1\";\n}\n.icon-Empty-trash::before {\n content: \"\\e9d2\";\n}\n.icon-End-call::before {\n content: \"\\e9d3\";\n}\n.icon-Entertainment-channel::before {\n content: \"\\e9d4\";\n}\n.icon-epg::before {\n content: \"\\e9d5\";\n}\n.icon-erase::before {\n content: \"\\e9d6\";\n}\n.icon-error-severe::before {\n content: \"\\e9d7\";\n}\n.icon-Ethenet::before {\n content: \"\\e9d8\";\n}\n.icon-event-agenda::before {\n content: \"\\e9d9\";\n}\n.icon-event-organiser::before {\n content: \"\\e9da\";\n}\n.icon-event-speaker::before {\n content: \"\\e9db\";\n}\n.icon-Excel::before {\n content: \"\\e9dc\";\n}\n.icon-Expand-screen::before {\n content: \"\\e9dd\";\n}\n.icon-expert::before {\n content: \"\\e9de\";\n}\n.icon-external-drive::before {\n content: \"\\e9df\";\n}\n.icon-Factory::before {\n content: \"\\e9e0\";\n}\n.icon-family-place::before {\n content: \"\\e9e1\";\n}\n.icon-Fast-delivery::before {\n content: \"\\e9e2\";\n}\n.icon-Favorite-music::before {\n content: \"\\e9e3\";\n}\n.icon-favourite::before {\n content: \"\\e9e4\";\n}\n.icon-Featured::before {\n content: \"\\e9e5\";\n}\n.icon-filter::before {\n content: \"\\e9e6\";\n}\n.icon-Filter-effects::before {\n content: \"\\e9e7\";\n}\n.icon-finance::before {\n content: \"\\e9e8\";\n}\n.icon-fire::before {\n content: \"\\e9e9\";\n}\n.icon-Fire-extinguisher::before {\n content: \"\\e9ea\";\n}\n.icon-Firewall::before {\n content: \"\\e9eb\";\n}\n.icon-flexible-storage::before {\n content: \"\\e9ec\";\n}\n.icon-folder-camera::before {\n content: \"\\e9ed\";\n}\n.icon-folder-document::before {\n content: \"\\e9ee\";\n}\n.icon-folder-favourite::before {\n content: \"\\e9ef\";\n}\n.icon-folder-sd::before {\n content: \"\\e9f0\";\n}\n.icon-football::before {\n content: \"\\e9f1\";\n}\n.icon-Football-match::before {\n content: \"\\e9f2\";\n}\n.icon-Football-quiz::before {\n content: \"\\e9f3\";\n}\n.icon-Forward::before {\n content: \"\\e9f4\";\n}\n.icon-Forward-curved-arrow::before {\n content: \"\\e9f5\";\n}\n.icon-forward-the-number::before {\n content: \"\\e9f6\";\n}\n.icon-free-tag::before {\n content: \"\\e9f7\";\n}\n.icon-Free-up-space::before {\n content: \"\\e9f8\";\n}\n.icon-front-end-dashboard::before {\n content: \"\\e9f9\";\n}\n.icon-Full-screen-view::before {\n content: \"\\e9fa\";\n}\n.icon-Gallery::before {\n content: \"\\e9fb\";\n}\n.icon-games::before {\n content: \"\\e9fc\";\n}\n.icon-Gas-tank::before {\n content: \"\\e9fd\";\n}\n.icon-gaugecapacity::before {\n content: \"\\e9fe\";\n}\n.icon-gauge-counter::before {\n content: \"\\e9ff\";\n}\n.icon-gauge-rate::before {\n content: \"\\ea00\";\n}\n.icon-gauge-mon-reseau::before {\n content: \"\\ea01\";\n}\n.icon-generic-document::before {\n content: \"\\ea02\";\n}\n.icon-geolocation::before {\n content: \"\\ea03\";\n}\n.icon-hands-free::before {\n content: \"\\ea04\";\n}\n.icon-HDMI-Card::before {\n content: \"\\ea05\";\n}\n.icon-health::before {\n content: \"\\ea06\";\n}\n.icon-health-monitor::before {\n content: \"\\ea07\";\n}\n.icon-Health-patient::before {\n content: \"\\ea08\";\n}\n.icon-Heart-rate::before {\n content: \"\\ea09\";\n}\n.icon-Heartbeats::before {\n content: \"\\ea0a\";\n}\n.icon-help-guide::before {\n content: \"\\ea0b\";\n}\n.icon-history::before {\n content: \"\\ea0c\";\n}\n.icon-home::before {\n content: \"\\ea0d\";\n}\n.icon-Home-1::before {\n content: \"\\ea0e\";\n}\n.icon-home-alarm::before {\n content: \"\\ea0f\";\n}\n.icon-Homelive::before {\n content: \"\\ea10\";\n}\n.icon-homescreen::before {\n content: \"\\ea11\";\n}\n.icon-Horoscopes::before {\n content: \"\\ea12\";\n}\n.icon-hospital::before {\n content: \"\\ea13\";\n}\n.icon-hotel::before {\n content: \"\\ea14\";\n}\n.icon-Hourglass::before {\n content: \"\\ea15\";\n}\n.icon-Im-driving::before {\n content: \"\\ea16\";\n}\n.icon-image::before {\n content: \"\\ea17\";\n}\n.icon-image-file::before {\n content: \"\\ea18\";\n}\n.icon-improvement::before {\n content: \"\\ea19\";\n}\n.icon-inbox::before {\n content: \"\\ea1a\";\n}\n.icon-Incoming-call-curved-arrow::before {\n content: \"\\ea1b\";\n}\n.icon-Increase-test-size::before {\n content: \"\\ea1c\";\n}\n.icon-info::before {\n content: \"\\ea1d\";\n}\n.icon-Information-data::before {\n content: \"\\ea1e\";\n}\n.icon-internationaltv::before {\n content: \"\\ea1f\";\n}\n.icon-international-globe::before {\n content: \"\\ea20\";\n}\n.icon-internet::before {\n content: \"\\ea21\";\n}\n.icon-internet-browser::before {\n content: \"\\ea22\";\n}\n.icon-Internet-security-desktop::before {\n content: \"\\ea23\";\n}\n.icon-Internet-security-mobile::before {\n content: \"\\ea24\";\n}\n.icon-Internet-security-password::before {\n content: \"\\ea25\";\n}\n.icon-Internet-security-server::before {\n content: \"\\ea26\";\n}\n.icon-internet-usage::before {\n content: \"\\ea27\";\n}\n.icon-Interventions::before {\n content: \"\\ea28\";\n}\n.icon-IT-infrastructure::before {\n content: \"\\ea29\";\n}\n.icon-keeper::before {\n content: \"\\ea2a\";\n}\n.icon-keyboard::before {\n content: \"\\ea2b\";\n}\n.icon-Keypad::before {\n content: \"\\ea2c\";\n}\n.icon-La-Cle::before {\n content: \"\\ea2d\";\n}\n.icon-Language::before {\n content: \"\\ea2e\";\n}\n.icon-Latest::before {\n content: \"\\ea2f\";\n}\n.icon-Le-Bloc::before {\n content: \"\\ea30\";\n}\n.icon-Leave-session::before {\n content: \"\\ea31\";\n}\n.icon-lightbulb-sh::before {\n content: \"\\ea32\";\n}\n.icon-ligue-1::before {\n content: \"\\ea33\";\n}\n.icon-Link::before {\n content: \"\\ea34\";\n}\n.icon-live::before {\n content: \"\\ea35\";\n}\n.icon-livebox::before {\n content: \"\\ea36\";\n}\n.icon-livebox-info::before {\n content: \"\\ea37\";\n}\n.icon-livebox-phone::before {\n content: \"\\ea38\";\n}\n.icon-location-pin-compass::before {\n content: \"\\ea39\";\n}\n.icon-lock::before {\n content: \"\\ea3a\";\n}\n.icon-Lock-screen-settings::before {\n content: \"\\ea3b\";\n}\n.icon-logistics::before {\n content: \"\\ea3c\";\n}\n.icon-logout::before {\n content: \"\\ea3d\";\n}\n.icon-Maintenance-man::before {\n content: \"\\ea3e\";\n}\n.icon-manage-android::before {\n content: \"\\ea3f\";\n}\n.icon-managing-equipment::before {\n content: \"\\ea40\";\n}\n.icon-Map::before {\n content: \"\\ea41\";\n}\n.icon-map-pin::before {\n content: \"\\ea42\";\n}\n.icon-Medal::before {\n content: \"\\ea43\";\n}\n.icon-Medical-app::before {\n content: \"\\ea44\";\n}\n.icon-Medical-app-phone::before {\n content: \"\\ea45\";\n}\n.icon-medical-chart::before {\n content: \"\\ea46\";\n}\n.icon-Medical-files::before {\n content: \"\\ea47\";\n}\n.icon-menu::before {\n content: \"\\ea48\";\n}\n.icon-Message-download::before {\n content: \"\\ea49\";\n}\n.icon-messaging::before {\n content: \"\\ea4a\";\n}\n.icon-messaging-compose-sms::before {\n content: \"\\ea4b\";\n}\n.icon-messaging-unified::before {\n content: \"\\ea4c\";\n}\n.icon-messaging-untitled-compose::before {\n content: \"\\ea4d\";\n}\n.icon-microphone::before {\n content: \"\\ea4e\";\n}\n.icon-Microscope::before {\n content: \"\\ea4f\";\n}\n.icon-mini-games::before {\n content: \"\\ea50\";\n}\n.icon-mirroring::before {\n content: \"\\ea51\";\n}\n.icon-Missed-call-boxed-arrow::before {\n content: \"\\ea52\";\n}\n.icon-Missed-call-curved-arrow::before {\n content: \"\\ea53\";\n}\n.icon-mobile-applications::before {\n content: \"\\ea54\";\n}\n.icon-Mobile-backup-restore::before {\n content: \"\\ea55\";\n}\n.icon-mobile-box::before {\n content: \"\\ea56\";\n}\n.icon-mobile-data-toggle::before {\n content: \"\\ea57\";\n}\n.icon-mobile-insurance::before {\n content: \"\\ea58\";\n}\n.icon-mobile-network-coverage::before {\n content: \"\\ea59\";\n}\n.icon-mobile-security::before {\n content: \"\\ea5a\";\n}\n.icon-mobile-setup::before {\n content: \"\\ea5b\";\n}\n.icon-Modem::before {\n content: \"\\ea5c\";\n}\n.icon-modifier-add::before {\n content: \"\\ea5d\";\n}\n.icon-Modifier-delete::before {\n content: \"\\ea5e\";\n}\n.icon-Modifier-favorite::before {\n content: \"\\ea5f\";\n}\n.icon-modifier-new::before {\n content: \"\\ea60\";\n}\n.icon-modifier-no-access::before {\n content: \"\\ea61\";\n}\n.icon-modifier-synchro::before {\n content: \"\\ea62\";\n}\n.icon-modifier-upload::before {\n content: \"\\ea63\";\n}\n.icon-modifier-wizard::before {\n content: \"\\ea64\";\n}\n.icon-Modifier-download::before {\n content: \"\\ea65\";\n}\n.icon-mon-reseau::before {\n content: \"\\ea66\";\n}\n.icon-money::before {\n content: \"\\ea67\";\n}\n.icon-More-dots::before {\n content: \"\\ea68\";\n}\n.icon-move-to-folder::before {\n content: \"\\ea69\";\n}\n.icon-multi-sim::before {\n content: \"\\ea6a\";\n}\n.icon-multiple-timezone::before {\n content: \"\\ea6b\";\n}\n.icon-Music-artist::before {\n content: \"\\ea6c\";\n}\n.icon-music-file::before {\n content: \"\\ea6d\";\n}\n.icon-Music-genre::before {\n content: \"\\ea6e\";\n}\n.icon-music-player::before {\n content: \"\\ea6f\";\n}\n.icon-Mute-microphone::before {\n content: \"\\ea70\";\n}\n.icon-my-account::before {\n content: \"\\ea71\";\n}\n.icon-my-bill-uk::before {\n content: \"\\ea72\";\n}\n.icon-my-boutique::before {\n content: \"\\ea73\";\n}\n.icon-my-essential::before {\n content: \"\\ea74\";\n}\n.icon-my-essential-tablet::before {\n content: \"\\ea75\";\n}\n.icon-my-livebox::before {\n content: \"\\ea76\";\n}\n.icon-my-media::before {\n content: \"\\ea77\";\n}\n.icon-My-Office-Phone::before {\n content: \"\\ea78\";\n}\n.icon-my-orange::before {\n content: \"\\ea79\";\n}\n.icon-my-plug::before {\n content: \"\\ea7a\";\n}\n.icon-my-services::before {\n content: \"\\ea7b\";\n}\n.icon-my-travels::before {\n content: \"\\ea7c\";\n}\n.icon-Nature::before {\n content: \"\\ea7d\";\n}\n.icon-Network-add::before {\n content: \"\\ea7e\";\n}\n.icon-Network-livebox::before {\n content: \"\\ea7f\";\n}\n.icon-networks::before {\n content: \"\\ea80\";\n}\n.icon-new::before {\n content: \"\\ea81\";\n}\n.icon-newspaper::before {\n content: \"\\ea82\";\n}\n.icon-nfc::before {\n content: \"\\ea83\";\n}\n.icon-NFC-tag::before {\n content: \"\\ea84\";\n}\n.icon-no-sim::before {\n content: \"\\ea85\";\n}\n.icon-Notification::before {\n content: \"\\ea86\";\n}\n.icon-Notification-Bell::before {\n content: \"\\ea87\";\n}\n.icon-nouveau-contract-social::before {\n content: \"\\ea88\";\n}\n.icon-numero-unique::before {\n content: \"\\ea89\";\n}\n.icon-office::before {\n content: \"\\ea8a\";\n}\n.icon-oil-and-gas::before {\n content: \"\\ea8b\";\n}\n.icon-On-board-unit::before {\n content: \"\\ea8c\";\n}\n.icon-online-help::before {\n content: \"\\ea8d\";\n}\n.icon-orangewallet::before {\n content: \"\\ea8e\";\n}\n.icon-orange-assistant::before {\n content: \"\\ea8f\";\n}\n.icon-orange-cash::before {\n content: \"\\ea90\";\n}\n.icon-orange-corporate::before {\n content: \"\\ea91\";\n}\n.icon-Orange-Detente::before {\n content: \"\\ea92\";\n}\n.icon-orange-events::before {\n content: \"\\ea93\";\n}\n.icon-Orange-Experts-Class-Training::before {\n content: \"\\ea94\";\n}\n.icon-Orange-Experts-Copy-Keep::before {\n content: \"\\ea95\";\n}\n.icon-orange-experts-expert::before {\n content: \"\\ea96\";\n}\n.icon-orange-experts-insurance::before {\n content: \"\\ea97\";\n}\n.icon-Orange-Experts-One2One-Coach::before {\n content: \"\\ea98\";\n}\n.icon-orange-experts-orange-business-consultant::before {\n content: \"\\ea99\";\n}\n.icon-orange-experts-orange-startup-smartphone::before {\n content: \"\\ea9a\";\n}\n.icon-orange-experts-recycle::before {\n content: \"\\ea9b\";\n}\n.icon-orange-experts-repair::before {\n content: \"\\ea9c\";\n}\n.icon-orange-experts-tranquil::before {\n content: \"\\ea9d\";\n}\n.icon-Orange-Football-Club::before {\n content: \"\\ea9e\";\n}\n.icon-orange-foundation::before {\n content: \"\\ea9f\";\n}\n.icon-Orange-garden::before {\n content: \"\\eaa0\";\n}\n.icon-orange-gesture::before {\n content: \"\\eaa1\";\n}\n.icon-orange-jobs::before {\n content: \"\\eaa2\";\n}\n.icon-orange-messenger::before {\n content: \"\\eaa3\";\n}\n.icon-Orange-Messenger-1::before {\n content: \"\\eaa4\";\n}\n.icon-orange-money::before {\n content: \"\\eaa5\";\n}\n.icon-orange-Photography::before {\n content: \"\\eaa6\";\n}\n.icon-orange-pro::before {\n content: \"\\eaa7\";\n}\n.icon-orange-protect::before {\n content: \"\\eaa8\";\n}\n.icon-orange-radio::before {\n content: \"\\eaa9\";\n}\n.icon-orange-reflections::before {\n content: \"\\eaaa\";\n}\n.icon-Orange-rewards::before {\n content: \"\\eaab\";\n}\n.icon-Orange-security-suite::before {\n content: \"\\eaac\";\n}\n.icon-orange-travel::before {\n content: \"\\eaad\";\n}\n.icon-orange-tv::before {\n content: \"\\eaae\";\n}\n.icon-orange-wallet::before {\n content: \"\\eaaf\";\n}\n.icon-orange-wifi::before {\n content: \"\\eab0\";\n}\n.icon-Orange-Guest::before {\n content: \"\\eab1\";\n}\n.icon-organisation::before {\n content: \"\\eab2\";\n}\n.icon-outbox::before {\n content: \"\\eab3\";\n}\n.icon-outdoor-sports-mountain-biking::before {\n content: \"\\eab4\";\n}\n.icon-outdoor-sports-skiing::before {\n content: \"\\eab5\";\n}\n.icon-Package::before {\n content: \"\\eab6\";\n}\n.icon-Package-content::before {\n content: \"\\eab7\";\n}\n.icon-parabole-tv::before {\n content: \"\\eab8\";\n}\n.icon-parental-control::before {\n content: \"\\eab9\";\n}\n.icon-Parrasol::before {\n content: \"\\eaba\";\n}\n.icon-pass-video::before {\n content: \"\\eabb\";\n}\n.icon-Pause::before {\n content: \"\\eabc\";\n}\n.icon-Payment-euro::before {\n content: \"\\eabd\";\n}\n.icon-pda-device::before {\n content: \"\\eabe\";\n}\n.icon-pdf-file::before {\n content: \"\\eabf\";\n}\n.icon-Pencil::before {\n content: \"\\eac0\";\n}\n.icon-personal-smartphone-trainer::before {\n content: \"\\eac1\";\n}\n.icon-phone-advisor::before {\n content: \"\\eac2\";\n}\n.icon-phone-fund::before {\n content: \"\\eac3\";\n}\n.icon-phone-protection::before {\n content: \"\\eac4\";\n}\n.icon-Photo-dialer::before {\n content: \"\\eac5\";\n}\n.icon-picture-messaging::before {\n content: \"\\eac6\";\n}\n.icon-Pills::before {\n content: \"\\eac7\";\n}\n.icon-pioneering::before {\n content: \"\\eac8\";\n}\n.icon-Play::before {\n content: \"\\eac9\";\n}\n.icon-play-and-win::before {\n content: \"\\eaca\";\n}\n.icon-playmode-random::before {\n content: \"\\eacb\";\n}\n.icon-polls::before {\n content: \"\\eacc\";\n}\n.icon-portfolio::before {\n content: \"\\eacd\";\n}\n.icon-POS-payment::before {\n content: \"\\eace\";\n}\n.icon-power::before {\n content: \"\\eacf\";\n}\n.icon-powerpoint-file::before {\n content: \"\\ead0\";\n}\n.icon-presentation::before {\n content: \"\\ead1\";\n}\n.icon-previous::before {\n content: \"\\ead2\";\n}\n.icon-printer::before {\n content: \"\\ead3\";\n}\n.icon-profileringtone::before {\n content: \"\\ead4\";\n}\n.icon-public-transport::before {\n content: \"\\ead5\";\n}\n.icon-publish::before {\n content: \"\\ead6\";\n}\n.icon-Quirky-stories::before {\n content: \"\\ead7\";\n}\n.icon-Quiz::before {\n content: \"\\ead8\";\n}\n.icon-Radiography::before {\n content: \"\\ead9\";\n}\n.icon-ratings-stars::before {\n content: \"\\eada\";\n}\n.icon-Real-time::before {\n content: \"\\eadb\";\n}\n.icon-recommend::before {\n content: \"\\eadc\";\n}\n.icon-record::before {\n content: \"\\eadd\";\n}\n.icon-Record-1::before {\n content: \"\\eade\";\n}\n.icon-recycle-device::before {\n content: \"\\eadf\";\n}\n.icon-Redo::before {\n content: \"\\eae0\";\n}\n.icon-relationship::before {\n content: \"\\eae1\";\n}\n.icon-reload::before {\n content: \"\\eae2\";\n}\n.icon-remote-control::before {\n content: \"\\eae3\";\n}\n.icon-Remote-control-1::before {\n content: \"\\eae4\";\n}\n.icon-remove-modifier::before {\n content: \"\\eae5\";\n}\n.icon-Replay-boxed-arrow::before {\n content: \"\\eae6\";\n}\n.icon-Reply-boxed-arrow::before {\n content: \"\\eae7\";\n}\n.icon-Reply-curved-arrow::before {\n content: \"\\eae8\";\n}\n.icon-report::before {\n content: \"\\eae9\";\n}\n.icon-responsible::before {\n content: \"\\eaea\";\n}\n.icon-Restaurant::before {\n content: \"\\eaeb\";\n}\n.icon-restore-to-phone::before {\n content: \"\\eaec\";\n}\n.icon-Restrictied-content::before {\n content: \"\\eaed\";\n}\n.icon-rewards::before {\n content: \"\\eaee\";\n}\n.icon-ringtones::before {\n content: \"\\eaef\";\n}\n.icon-running::before {\n content: \"\\eaf0\";\n}\n.icon-Scales::before {\n content: \"\\eaf1\";\n}\n.icon-scan-ticket::before {\n content: \"\\eaf2\";\n}\n.icon-School::before {\n content: \"\\eaf3\";\n}\n.icon-Science::before {\n content: \"\\eaf4\";\n}\n.icon-Scissors::before {\n content: \"\\eaf5\";\n}\n.icon-sd-card::before {\n content: \"\\eaf6\";\n}\n.icon-SD-card-1::before {\n content: \"\\eaf7\";\n}\n.icon-search::before {\n content: \"\\eaf8\";\n}\n.icon-Send::before {\n content: \"\\eaf9\";\n}\n.icon-Send-to-person::before {\n content: \"\\eafa\";\n}\n.icon-Server::before {\n content: \"\\eafb\";\n}\n.icon-servers::before {\n content: \"\\eafc\";\n}\n.icon-settings::before {\n content: \"\\eafd\";\n}\n.icon-setup-and-repair::before {\n content: \"\\eafe\";\n}\n.icon-setup-and-repair-cog::before {\n content: \"\\eaff\";\n}\n.icon-setup-internet::before {\n content: \"\\eb00\";\n}\n.icon-share::before {\n content: \"\\eb01\";\n}\n.icon-Share-wifi::before {\n content: \"\\eb02\";\n}\n.icon-shipping::before {\n content: \"\\eb03\";\n}\n.icon-Shop::before {\n content: \"\\eb04\";\n}\n.icon-shop-pin::before {\n content: \"\\eb05\";\n}\n.icon-shop-subscriptions::before {\n content: \"\\eb06\";\n}\n.icon-Shopping::before {\n content: \"\\eb07\";\n}\n.icon-Show-front-back-camera::before {\n content: \"\\eb08\";\n}\n.icon-Shower::before {\n content: \"\\eb09\";\n}\n.icon-showroom-mobile-pro::before {\n content: \"\\eb0a\";\n}\n.icon-signal-1-5::before {\n content: \"\\eb0b\";\n}\n.icon-signal-2-5::before {\n content: \"\\eb0c\";\n}\n.icon-signal-3-5::before {\n content: \"\\eb0d\";\n}\n.icon-signal-4-5::before {\n content: \"\\eb0e\";\n}\n.icon-signal-5-5::before {\n content: \"\\eb0f\";\n}\n.icon-signal-boost::before {\n content: \"\\eb10\";\n}\n.icon-Silent::before {\n content: \"\\eb11\";\n}\n.icon-sim::before {\n content: \"\\eb12\";\n}\n.icon-simple-mode::before {\n content: \"\\eb13\";\n}\n.icon-Simplicity::before {\n content: \"\\eb14\";\n}\n.icon-Skip-backward::before {\n content: \"\\eb15\";\n}\n.icon-Skip-forward::before {\n content: \"\\eb16\";\n}\n.icon-Sleep::before {\n content: \"\\eb17\";\n}\n.icon-Smart-electric-meter::before {\n content: \"\\eb18\";\n}\n.icon-Smart-heating-switch::before {\n content: \"\\eb19\";\n}\n.icon-smart-home::before {\n content: \"\\eb1a\";\n}\n.icon-smart-lightswitch::before {\n content: \"\\eb1b\";\n}\n.icon-smart-powerstation::before {\n content: \"\\eb1c\";\n}\n.icon-Smart-Sensor::before {\n content: \"\\eb1d\";\n}\n.icon-smart-tap::before {\n content: \"\\eb1e\";\n}\n.icon-smart-watch::before {\n content: \"\\eb1f\";\n}\n.icon-social-network::before {\n content: \"\\eb20\";\n}\n.icon-software-update::before {\n content: \"\\eb21\";\n}\n.icon-Sport-channel::before {\n content: \"\\eb22\";\n}\n.icon-Start-services::before {\n content: \"\\eb23\";\n}\n.icon-startup-wizard::before {\n content: \"\\eb24\";\n}\n.icon-stocks::before {\n content: \"\\eb25\";\n}\n.icon-stop-secret::before {\n content: \"\\eb26\";\n}\n.icon-Stop-video::before {\n content: \"\\eb27\";\n}\n.icon-Storage-cloud::before {\n content: \"\\eb28\";\n}\n.icon-store-locator::before {\n content: \"\\eb29\";\n}\n.icon-Street::before {\n content: \"\\eb2a\";\n}\n.icon-Stretcher::before {\n content: \"\\eb2b\";\n}\n.icon-subscription-package::before {\n content: \"\\eb2c\";\n}\n.icon-Sudoku::before {\n content: \"\\eb2d\";\n}\n.icon-support::before {\n content: \"\\eb2e\";\n}\n.icon-surveillance-camera::before {\n content: \"\\eb2f\";\n}\n.icon-Syncronise::before {\n content: \"\\eb30\";\n}\n.icon-target-location::before {\n content: \"\\eb31\";\n}\n.icon-tarif::before {\n content: \"\\eb32\";\n}\n.icon-tariff::before {\n content: \"\\eb33\";\n}\n.icon-task-list::before {\n content: \"\\eb34\";\n}\n.icon-Taxi::before {\n content: \"\\eb35\";\n}\n.icon-team-connect::before {\n content: \"\\eb36\";\n}\n.icon-temperature::before {\n content: \"\\eb37\";\n}\n.icon-terms-conditions::before {\n content: \"\\eb38\";\n}\n.icon-text-alerts::before {\n content: \"\\eb39\";\n}\n.icon-Thumb-down::before {\n content: \"\\eb3a\";\n}\n.icon-Thumb-up::before {\n content: \"\\eb3b\";\n}\n.icon-tick::before {\n content: \"\\eb3c\";\n}\n.icon-tick-circle::before {\n content: \"\\eb3d\";\n}\n.icon-tickets::before {\n content: \"\\eb3e\";\n}\n.icon-Top-10::before {\n content: \"\\eb3f\";\n}\n.icon-top-up-dollar::before {\n content: \"\\eb40\";\n}\n.icon-top-up-euro::before {\n content: \"\\eb41\";\n}\n.icon-top-up-uk-bank::before {\n content: \"\\eb42\";\n}\n.icon-touch-screen::before {\n content: \"\\eb43\";\n}\n.icon-town::before {\n content: \"\\eb44\";\n}\n.icon-townhall::before {\n content: \"\\eb45\";\n}\n.icon-track-your-delivery::before {\n content: \"\\eb46\";\n}\n.icon-track-your-order::before {\n content: \"\\eb47\";\n}\n.icon-Trading::before {\n content: \"\\eb48\";\n}\n.icon-trash::before {\n content: \"\\eb49\";\n}\n.icon-tv-plus::before {\n content: \"\\eb4a\";\n}\n.icon-TV-series::before {\n content: \"\\eb4b\";\n}\n.icon-Undo::before {\n content: \"\\eb4c\";\n}\n.icon-unique::before {\n content: \"\\eb4d\";\n}\n.icon-unknown-file::before {\n content: \"\\eb4e\";\n}\n.icon-unlimited-calls::before {\n content: \"\\eb4f\";\n}\n.icon-unlocked::before {\n content: \"\\eb50\";\n}\n.icon-Unmissable::before {\n content: \"\\eb51\";\n}\n.icon-upload::before {\n content: \"\\eb52\";\n}\n.icon-USB::before {\n content: \"\\eb53\";\n}\n.icon-usb-key::before {\n content: \"\\eb54\";\n}\n.icon-Value::before {\n content: \"\\eb55\";\n}\n.icon-vehicle::before {\n content: \"\\eb56\";\n}\n.icon-video::before {\n content: \"\\eb57\";\n}\n.icon-video-file::before {\n content: \"\\eb58\";\n}\n.icon-video-phone::before {\n content: \"\\eb59\";\n}\n.icon-video-meeting2::before {\n content: \"\\eb5a\";\n}\n.icon-Vinyl::before {\n content: \"\\eb5b\";\n}\n.icon-vip-contact::before {\n content: \"\\eb5c\";\n}\n.icon-virtual-gamepad::before {\n content: \"\\eb5d\";\n}\n.icon-visual-voicemail::before {\n content: \"\\eb5e\";\n}\n.icon-vod-portrait::before {\n content: \"\\eb5f\";\n}\n.icon-volte::before {\n content: \"\\eb60\";\n}\n.icon-volume-high::before {\n content: \"\\eb61\";\n}\n.icon-volume-low::before {\n content: \"\\eb62\";\n}\n.icon-volume-mid::before {\n content: \"\\eb63\";\n}\n.icon-volume-none::before {\n content: \"\\eb64\";\n}\n.icon-vowifi::before {\n content: \"\\eb65\";\n}\n.icon-vvm-message-read-full::before {\n content: \"\\eb66\";\n}\n.icon-Warehouse::before {\n content: \"\\eb67\";\n}\n.icon-Warningimportant::before {\n content: \"\\eb68\";\n}\n.icon-Warning-important::before {\n content: \"\\eb69\";\n}\n.icon-web-cam::before {\n content: \"\\eb6a\";\n}\n.icon-web-fax-widget::before {\n content: \"\\eb6b\";\n}\n.icon-Wholesale-retail::before {\n content: \"\\eb6c\";\n}\n.icon-Widget::before {\n content: \"\\eb6d\";\n}\n.icon-widget-tour::before {\n content: \"\\eb6e\";\n}\n.icon-wifi::before {\n content: \"\\eb6f\";\n}\n.icon-wifi-0::before {\n content: \"\\eb70\";\n}\n.icon-wifi-1::before {\n content: \"\\eb71\";\n}\n.icon-wifi-2::before {\n content: \"\\eb72\";\n}\n.icon-wps-pairing::before {\n content: \"\\eb73\";\n}\n.icon-WPT::before {\n content: \"\\eb74\";\n}\n.icon-zoom-in::before {\n content: \"\\eb75\";\n}\n.icon-zoom-out::before {\n content: \"\\eb76\";\n}\n.icon-popout-tech::before {\n content: \"\\e634\";\n}\n.icon-frame-care::before {\n content: \"\\e640\";\n}\n.icon-frame-family::before {\n content: \"\\e637\";\n}\n.icon-frame-fun::before {\n content: \"\\e638\";\n}\n.icon-frame-home::before {\n content: \"\\e639\";\n}\n.icon-frame-money::before {\n content: \"\\e63a\";\n}\n.icon-frame-on-the-move::before {\n content: \"\\e63b\";\n}\n.icon-frame-tariff::before {\n content: \"\\e63c\";\n}\n.icon-frame-tech::before {\n content: \"\\e63d\";\n}\n.icon-frame-wellbeing::before {\n content: \"\\e63e\";\n}\n.icon-frame-work::before {\n content: \"\\e63f\";\n}\n.icon-popout-care::before {\n content: \"\\e62d\";\n}\n.icon-popout-family::before {\n content: \"\\e62e\";\n}\n.icon-popout-fun::before {\n content: \"\\e62f\";\n}\n.icon-popout-home::before {\n content: \"\\e630\";\n}\n.icon-popout-money::before {\n content: \"\\e631\";\n}\n.icon-popout-on-the-move::before {\n content: \"\\e632\";\n}\n.icon-popout-tariff::before {\n content: \"\\e633\";\n}\n.icon-popout-wellbeing::before {\n content: \"\\e635\";\n}\n.icon-popout-work::before {\n content: \"\\e636\";\n}\n.icon-frame-connectivity::before {\n content: \"\\eb78\";\n}\n.icon-frame-my-customers::before {\n content: \"\\eb79\";\n}\n.icon-frame-performance::before {\n content: \"\\eb7a\";\n}\n.icon-frame-security::before {\n content: \"\\eb7b\";\n}\n.icon-frame-teamwork::before {\n content: \"\\eb7c\";\n}\n.icon-popout-connectivity::before {\n content: \"\\eb7d\";\n}\n.icon-popout-my-customers::before {\n content: \"\\eb7e\";\n}\n.icon-popout-performance::before {\n content: \"\\eb7f\";\n}\n.icon-popout-security::before {\n content: \"\\eb80\";\n}\n.icon-popout-teamwork::before {\n content: \"\\eb81\";\n}\n\n// Using svg\n\n.svg-delete,\n.svg-checkbox-tick,\n.svg-warning-circle,\n.svg-menu,\n.svg-tick,\n.svg-success,\n.svg-warning,\n.svg-info,\n.svg-error,\n.svg-arrow-previous,\n.svg-arrow-next,\n.svg-settings,\n.svg-search,\n.svg-avatar,\n.svg-buy {\n position: relative;\n}\n\n.svg-delete::after,\n.svg-checkbox-tick::after,\n.svg-warning-circle::after,\n.svg-menu::after,\n.svg-tick::after,\n.svg-arrow-previous::after,\n.svg-arrow-next::after,\n.svg-settings::after,\n.svg-search::after,\n.svg-avatar::after,\n.svg-buy::after,\n.svg-success::after,\n.svg-warning::after,\n.svg-info::after,\n.svg-error::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.svg-delete {\n @include svg-delete(\"#fff\");\n}\n\n.svg-checkbox-tick {\n @include svg-checkbox-tick(\"#fff\");\n}\n\n.svg-warning-circle {\n @include svg-warning-circle(theme-color(\"info\"));\n}\n\n.svg-menu {\n @include svg-menu(\"#fff\");\n}\n\n.svg-menu:hover {\n @include svg-menu(\"#000\");\n}\n\n.svg-tick {\n @include svg-tick(theme-color(\"success\"));\n}\n\n.svg-success {\n @include svg-success();\n}\n\n.svg-warning {\n @include svg-warning();\n}\n\n.svg-error {\n @include svg-error();\n}\n\n.svg-info {\n @include svg-info();\n}\n\n.svg-arrow-previous {\n @include svg-arrow-previous(\"#000\");\n}\n\n.svg-arrow-previous:hover,\n.svg-arrow-previous:focus,\n.svg-arrow-previous:active, {\n @include svg-arrow-previous(\"#fff\");\n}\n\n.svg-arrow-next {\n @include svg-arrow-next(\"#000\");\n}\n\n.svg-arrow-next.btn-primary {\n @include svg-arrow-next(\"#fff\");\n}\n\n.svg-arrow-next.btn-primary:active {\n @include svg-arrow-next(\"#000\");\n}\n\n.svg-settings {\n @include svg-settings(\"#fff\");\n}\n\n.svg-settings:hover,\n.svg-settings:focus {\n @include svg-settings(theme-color(\"primary\"));\n}\n\n.svg-search {\n @include svg-search(\"#fff\");\n}\n\n.svg-search:hover {\n @include svg-search(theme-color(\"primary\"));\n}\n\n.svg-avatar {\n @include svg-avatar(\"#fff\");\n}\n\n.svg-avatar:hover,\n.svg-avatar:active {\n @include svg-avatar(theme-color(\"primary\"));\n}\n\n.svg-buy {\n @include svg-buy(\"#fff\");\n}\n\n.svg-buy:hover,\n.svg-buy:active {\n @include svg-buy(theme-color(\"primary\"));\n}\n\n.btn-mail {\n @include btn-mail();\n}\n\n.btn-mail-inverse {\n @include btn-mail-inverse();\n}\n\n.btn-lin {\n @include btn-lin();\n}\n\n.btn-lin-inverse {\n @include btn-lin-inverse();\n}\n\n.btn-gplus {\n @include btn-gplus();\n}\n\n.btn-gplus-inverse {\n @include btn-gplus-inverse();\n}\n\n.btn-tw {\n @include btn-tw();\n}\n\n.btn-tw-inverse {\n @include btn-tw-inverse();\n}\n\n.btn-fbk {\n @include btn-fbk();\n}\n\n.btn-fbk-inverse {\n @include btn-fbk-inverse();\n}\n","@font-face {\n font-family: icon-orange;\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(\"../fonts/icon-orange.woff2\") format(\"woff2\"), url(\"../fonts/icon-orange.woff\") format(\"woff\");\n}\n\n.icon-checkbox-tick,\n.icon-2for1cinematicket,\n.icon-3g,\n.icon-4g,\n.icon-4g-cam,\n.icon-4G-Cam--Live-80,\n.icon-4G-Cam-Camera-80,\n.icon-4G-Cam-Inbox80,\n.icon-4G-Cam-Outbox-80,\n.icon-4G-Cam-Rec-80,\n.icon-4g-plus,\n.icon-4G-Cam-Compact,\n.icon-1013-Reseau,\n.icon-about-event,\n.icon-Accessability,\n.icon-accessibility-cognition,\n.icon-accessibility-dexterity,\n.icon-accessibility-hearing,\n.icon-accessibility-mobility,\n.icon-accessibility-speech,\n.icon-accessibility-vision,\n.icon-accessory-headphones,\n.icon-accessory-shop,\n.icon-Add,\n.icon-add-more,\n.icon-Add-person,\n.icon-address-book,\n.icon-administrator,\n.icon-Adultcode,\n.icon-Adult,\n.icon-advertising,\n.icon-aeroplane,\n.icon-Age-rating-3,\n.icon-Age-rating-4,\n.icon-Age-rating-7,\n.icon-Age-rating-9,\n.icon-Age-rating-12,\n.icon-Age-rating-16,\n.icon-Age-rating-17,\n.icon-Age-rating-18,\n.icon-age-rating-mono-3,\n.icon-age-rating-mono-4,\n.icon-age-rating-mono-7,\n.icon-age-rating-mono-9,\n.icon-age-rating-mono-12,\n.icon-age-rating-mono-16,\n.icon-age-rating-mono-17,\n.icon-age-rating-mono-18,\n.icon-agriculture,\n.icon-airbox-auto,\n.icon-alarm-clock,\n.icon-alarm-off,\n.icon-Alias-numbers,\n.icon-all-channels,\n.icon-antenna,\n.icon-anti-spam,\n.icon-antivirus,\n.icon-Apartment-building,\n.icon-Apps,\n.icon-Apps-disabled,\n.icon-Archive,\n.icon-arrow-down,\n.icon-arrow-up,\n.icon-arrow-next,\n.icon-arrow-previous,\n.icon-Art,\n.icon-assistance,\n.icon-attachment,\n.icon-Auditorium,\n.icon-avatar,\n.icon-Baby,\n.icon-backup,\n.icon-banking,\n.icon-battery-1-bar,\n.icon-battery-2-bar,\n.icon-battery-charging,\n.icon-battery-empty,\n.icon-battery-full,\n.icon-battery-full-2,\n.icon-Betting,\n.icon-bill-euro,\n.icon-billboard,\n.icon-birthday,\n.icon-bluetooth,\n.icon-Book-award,\n.icon-book-download,\n.icon-bookmark,\n.icon-bookmark-smart,\n.icon-Boxes,\n.icon-broadcast,\n.icon-burst-mode,\n.icon-Business-everywhere,\n.icon-business-invoices,\n.icon-business-lounge,\n.icon-business-telephonie,\n.icon-buy,\n.icon-buy-back-euro,\n.icon-buzz,\n.icon-Calculator,\n.icon-calendaralarm,\n.icon-calendar-30,\n.icon-calendar-day,\n.icon-Calendar-fixtures-results,\n.icon-Calendar-football-match,\n.icon-calendar-month,\n.icon-calendar-week,\n.icon-call,\n.icon-call-forward,\n.icon-call-invite,\n.icon-call-log,\n.icon-camera,\n.icon-Car-park,\n.icon-Car-pooling,\n.icon-Casting,\n.icon-Categories,\n.icon-CD,\n.icon-change-wallpaper,\n.icon-Change-wallpaper-1,\n.icon-charger,\n.icon-check-your-balance,\n.icon-Child,\n.icon-child-protection,\n.icon-Children-channel,\n.icon-cineday-silhouette,\n.icon-clock,\n.icon-cloud-backup,\n.icon-Coat-hanger,\n.icon-Collective-class-training,\n.icon-Colour-Call,\n.icon-Comedy-channel,\n.icon-Comic,\n.icon-Comments,\n.icon-commercial-representitive,\n.icon-community-sms,\n.icon-Concierge-bell,\n.icon-conference-call,\n.icon-connected-object,\n.icon-connection,\n.icon-construction,\n.icon-contact-card,\n.icon-control-centre,\n.icon-control-mydata,\n.icon-copy,\n.icon-Courier,\n.icon-CPU,\n.icon-crane,\n.icon-Crop,\n.icon-Currency-brazilian-real,\n.icon-currency-converter,\n.icon-Currency-dollar,\n.icon-currency-euro,\n.icon-Currency-sterling,\n.icon-Currency-yen,\n.icon-data-protection,\n.icon-data-services,\n.icon-decoder,\n.icon-Decrease-test-size,\n.icon-Defibrillator,\n.icon-delete,\n.icon-device-desktop-computer,\n.icon-device-desktop-computer-connected,\n.icon-device-fixed-line-phone,\n.icon-device-laptop-computer,\n.icon-device-laptop-computer-connected,\n.icon-device-smart-phone,\n.icon-device-status,\n.icon-device-tablet,\n.icon-device-tablet-connected,\n.icon-device-tv,\n.icon-device-connected-printer,\n.icon-device-manager,\n.icon-device-managment-express,\n.icon-dialler,\n.icon-Digital-frame,\n.icon-disable-apps,\n.icon-Discovery-offer,\n.icon-Discussion-author,\n.icon-Discussion-more,\n.icon-Doctor,\n.icon-Doctors-bag,\n.icon-Doctors-communicating,\n.icon-Document-compose,\n.icon-document-stack,\n.icon-document-word,\n.icon-document-zip,\n.icon-Documentary,\n.icon-done-modifier,\n.icon-download,\n.icon-draft,\n.icon-dual-sim-packaging,\n.icon-easy-internet,\n.icon-ebook,\n.icon-Eco-mode,\n.icon-edashboard,\n.icon-edit-draft,\n.icon-edit-email,\n.icon-edit-image,\n.icon-Elderly-person,\n.icon-electric-car,\n.icon-electric-car-charging,\n.icon-electricity-provider,\n.icon-elevator,\n.icon-email,\n.icon-email-forwarded,\n.icon-Email-replied,\n.icon-emap,\n.icon-emergency-firemen,\n.icon-emergency-police,\n.icon-emergency-sos,\n.icon-emergency-service,\n.icon-employees-1,\n.icon-Empty-trash,\n.icon-End-call,\n.icon-Entertainment-channel,\n.icon-epg,\n.icon-erase,\n.icon-error-severe,\n.icon-Ethenet,\n.icon-event-agenda,\n.icon-event-organiser,\n.icon-event-speaker,\n.icon-Excel,\n.icon-Expand-screen,\n.icon-expert,\n.icon-external-drive,\n.icon-Factory,\n.icon-family-place,\n.icon-Fast-delivery,\n.icon-Favorite-music,\n.icon-favourite,\n.icon-Featured,\n.icon-filter,\n.icon-Filter-effects,\n.icon-finance,\n.icon-fire,\n.icon-Fire-extinguisher,\n.icon-Firewall,\n.icon-flexible-storage,\n.icon-folder-camera,\n.icon-folder-document,\n.icon-folder-favourite,\n.icon-folder-sd,\n.icon-football,\n.icon-Football-match,\n.icon-Football-quiz,\n.icon-Forward,\n.icon-Forward-curved-arrow,\n.icon-forward-the-number,\n.icon-free-tag,\n.icon-Free-up-space,\n.icon-front-end-dashboard,\n.icon-Full-screen-view,\n.icon-Gallery,\n.icon-games,\n.icon-Gas-tank,\n.icon-gaugecapacity,\n.icon-gauge-counter,\n.icon-gauge-rate,\n.icon-gauge-mon-reseau,\n.icon-generic-document,\n.icon-geolocation,\n.icon-hands-free,\n.icon-HDMI-Card,\n.icon-health,\n.icon-health-monitor,\n.icon-Health-patient,\n.icon-Heart-rate,\n.icon-Heartbeats,\n.icon-help-guide,\n.icon-history,\n.icon-home,\n.icon-Home-1,\n.icon-home-alarm,\n.icon-Homelive,\n.icon-homescreen,\n.icon-Horoscopes,\n.icon-hospital,\n.icon-hotel,\n.icon-Hourglass,\n.icon-Im-driving,\n.icon-image,\n.icon-image-file,\n.icon-improvement,\n.icon-inbox,\n.icon-Incoming-call-curved-arrow,\n.icon-Increase-test-size,\n.icon-info,\n.icon-Information-data,\n.icon-internationaltv,\n.icon-international-globe,\n.icon-internet,\n.icon-internet-browser,\n.icon-Internet-security-desktop,\n.icon-Internet-security-mobile,\n.icon-Internet-security-password,\n.icon-Internet-security-server,\n.icon-internet-usage,\n.icon-Interventions,\n.icon-IT-infrastructure,\n.icon-keeper,\n.icon-keyboard,\n.icon-Keypad,\n.icon-La-Cle,\n.icon-Language,\n.icon-Latest,\n.icon-Le-Bloc,\n.icon-Leave-session,\n.icon-lightbulb-sh,\n.icon-ligue-1,\n.icon-Link,\n.icon-live,\n.icon-livebox,\n.icon-livebox-info,\n.icon-livebox-phone,\n.icon-location-pin-compass,\n.icon-lock,\n.icon-Lock-screen-settings,\n.icon-logistics,\n.icon-logout,\n.icon-Maintenance-man,\n.icon-manage-android,\n.icon-managing-equipment,\n.icon-Map,\n.icon-map-pin,\n.icon-Medal,\n.icon-Medical-app,\n.icon-Medical-app-phone,\n.icon-medical-chart,\n.icon-Medical-files,\n.icon-menu,\n.icon-Message-download,\n.icon-messaging,\n.icon-messaging-compose-sms,\n.icon-messaging-unified,\n.icon-messaging-untitled-compose,\n.icon-microphone,\n.icon-Microscope,\n.icon-mini-games,\n.icon-mirroring,\n.icon-Missed-call-boxed-arrow,\n.icon-Missed-call-curved-arrow,\n.icon-mobile-applications,\n.icon-Mobile-backup-restore,\n.icon-mobile-box,\n.icon-mobile-data-toggle,\n.icon-mobile-insurance,\n.icon-mobile-network-coverage,\n.icon-mobile-security,\n.icon-mobile-setup,\n.icon-Modem,\n.icon-modifier-add,\n.icon-Modifier-delete,\n.icon-Modifier-favorite,\n.icon-modifier-new,\n.icon-modifier-no-access,\n.icon-modifier-synchro,\n.icon-modifier-upload,\n.icon-modifier-wizard,\n.icon-Modifier-download,\n.icon-mon-reseau,\n.icon-money,\n.icon-More-dots,\n.icon-move-to-folder,\n.icon-multi-sim,\n.icon-multiple-timezone,\n.icon-Music-artist,\n.icon-music-file,\n.icon-Music-genre,\n.icon-music-player,\n.icon-Mute-microphone,\n.icon-my-account,\n.icon-my-bill-uk,\n.icon-my-boutique,\n.icon-my-essential,\n.icon-my-essential-tablet,\n.icon-my-livebox,\n.icon-my-media,\n.icon-My-Office-Phone,\n.icon-my-orange,\n.icon-my-plug,\n.icon-my-services,\n.icon-my-travels,\n.icon-Nature,\n.icon-Network-add,\n.icon-Network-livebox,\n.icon-networks,\n.icon-new,\n.icon-newspaper,\n.icon-nfc,\n.icon-NFC-tag,\n.icon-no-sim,\n.icon-Notification,\n.icon-Notification-Bell,\n.icon-nouveau-contract-social,\n.icon-numero-unique,\n.icon-office,\n.icon-oil-and-gas,\n.icon-On-board-unit,\n.icon-online-help,\n.icon-orangewallet,\n.icon-orange-assistant,\n.icon-orange-cash,\n.icon-orange-corporate,\n.icon-Orange-Detente,\n.icon-orange-events,\n.icon-Orange-Experts-Class-Training,\n.icon-Orange-Experts-Copy-Keep,\n.icon-orange-experts-expert,\n.icon-orange-experts-insurance,\n.icon-Orange-Experts-One2One-Coach,\n.icon-orange-experts-orange-business-consultant,\n.icon-orange-experts-orange-startup-smartphone,\n.icon-orange-experts-recycle,\n.icon-orange-experts-repair,\n.icon-orange-experts-tranquil,\n.icon-Orange-Football-Club,\n.icon-orange-foundation,\n.icon-Orange-garden,\n.icon-orange-gesture,\n.icon-orange-jobs,\n.icon-orange-messenger,\n.icon-Orange-Messenger-1,\n.icon-orange-money,\n.icon-orange-Photography,\n.icon-orange-pro,\n.icon-orange-protect,\n.icon-orange-radio,\n.icon-orange-reflections,\n.icon-Orange-rewards,\n.icon-Orange-security-suite,\n.icon-orange-travel,\n.icon-orange-tv,\n.icon-orange-wallet,\n.icon-orange-wifi,\n.icon-Orange-Guest,\n.icon-organisation,\n.icon-outbox,\n.icon-outdoor-sports-mountain-biking,\n.icon-outdoor-sports-skiing,\n.icon-Package,\n.icon-Package-content,\n.icon-parabole-tv,\n.icon-parental-control,\n.icon-Parrasol,\n.icon-pass-video,\n.icon-Pause,\n.icon-Payment-euro,\n.icon-pda-device,\n.icon-pdf-file,\n.icon-Pencil,\n.icon-personal-smartphone-trainer,\n.icon-phone-advisor,\n.icon-phone-fund,\n.icon-phone-protection,\n.icon-Photo-dialer,\n.icon-picture-messaging,\n.icon-Pills,\n.icon-pioneering,\n.icon-Play,\n.icon-play-and-win,\n.icon-playmode-random,\n.icon-polls,\n.icon-portfolio,\n.icon-POS-payment,\n.icon-power,\n.icon-powerpoint-file,\n.icon-presentation,\n.icon-previous,\n.icon-printer,\n.icon-profileringtone,\n.icon-public-transport,\n.icon-publish,\n.icon-Quirky-stories,\n.icon-Quiz,\n.icon-Radiography,\n.icon-ratings-stars,\n.icon-Real-time,\n.icon-recommend,\n.icon-record,\n.icon-Record-1,\n.icon-recycle-device,\n.icon-Redo,\n.icon-relationship,\n.icon-reload,\n.icon-remote-control,\n.icon-Remote-control-1,\n.icon-remove-modifier,\n.icon-Replay-boxed-arrow,\n.icon-Reply-boxed-arrow,\n.icon-Reply-curved-arrow,\n.icon-report,\n.icon-responsible,\n.icon-Restaurant,\n.icon-restore-to-phone,\n.icon-Restrictied-content,\n.icon-rewards,\n.icon-ringtones,\n.icon-running,\n.icon-Scales,\n.icon-scan-ticket,\n.icon-School,\n.icon-Science,\n.icon-Scissors,\n.icon-sd-card,\n.icon-SD-card-1,\n.icon-search,\n.icon-Send,\n.icon-Send-to-person,\n.icon-Server,\n.icon-servers,\n.icon-settings,\n.icon-setup-and-repair,\n.icon-setup-and-repair-cog,\n.icon-setup-internet,\n.icon-share,\n.icon-Share-wifi,\n.icon-shipping,\n.icon-Shop,\n.icon-shop-pin,\n.icon-shop-subscriptions,\n.icon-Shopping,\n.icon-Show-front-back-camera,\n.icon-Shower,\n.icon-showroom-mobile-pro,\n.icon-signal-1-5,\n.icon-signal-2-5,\n.icon-signal-3-5,\n.icon-signal-4-5,\n.icon-signal-5-5,\n.icon-signal-boost,\n.icon-Silent,\n.icon-sim,\n.icon-simple-mode,\n.icon-Simplicity,\n.icon-Skip-backward,\n.icon-Skip-forward,\n.icon-Sleep,\n.icon-Smart-electric-meter,\n.icon-Smart-heating-switch,\n.icon-smart-home,\n.icon-smart-lightswitch,\n.icon-smart-powerstation,\n.icon-Smart-Sensor,\n.icon-smart-tap,\n.icon-smart-watch,\n.icon-social-network,\n.icon-software-update,\n.icon-Sport-channel,\n.icon-Start-services,\n.icon-startup-wizard,\n.icon-stocks,\n.icon-stop-secret,\n.icon-Stop-video,\n.icon-Storage-cloud,\n.icon-store-locator,\n.icon-Street,\n.icon-Stretcher,\n.icon-subscription-package,\n.icon-Sudoku,\n.icon-support,\n.icon-surveillance-camera,\n.icon-Syncronise,\n.icon-target-location,\n.icon-tarif,\n.icon-tariff,\n.icon-task-list,\n.icon-Taxi,\n.icon-team-connect,\n.icon-temperature,\n.icon-terms-conditions,\n.icon-text-alerts,\n.icon-Thumb-down,\n.icon-Thumb-up,\n.icon-tick,\n.icon-tick-circle,\n.icon-tickets,\n.icon-Top-10,\n.icon-top-up-dollar,\n.icon-top-up-euro,\n.icon-top-up-uk-bank,\n.icon-touch-screen,\n.icon-town,\n.icon-townhall,\n.icon-track-your-delivery,\n.icon-track-your-order,\n.icon-Trading,\n.icon-trash,\n.icon-tv-plus,\n.icon-TV-series,\n.icon-Undo,\n.icon-unique,\n.icon-unknown-file,\n.icon-unlimited-calls,\n.icon-unlocked,\n.icon-Unmissable,\n.icon-upload,\n.icon-USB,\n.icon-usb-key,\n.icon-Value,\n.icon-vehicle,\n.icon-video,\n.icon-video-file,\n.icon-video-phone,\n.icon-video-meeting2,\n.icon-Vinyl,\n.icon-vip-contact,\n.icon-virtual-gamepad,\n.icon-visual-voicemail,\n.icon-vod-portrait,\n.icon-volte,\n.icon-volume-high,\n.icon-volume-low,\n.icon-volume-mid,\n.icon-volume-none,\n.icon-vowifi,\n.icon-vvm-message-read-full,\n.icon-Warehouse,\n.icon-Warningimportant,\n.icon-Warning-important,\n.icon-web-cam,\n.icon-web-fax-widget,\n.icon-Wholesale-retail,\n.icon-Widget,\n.icon-widget-tour,\n.icon-wifi,\n.icon-wifi-0,\n.icon-wifi-1,\n.icon-wifi-2,\n.icon-wps-pairing,\n.icon-WPT,\n.icon-zoom-in,\n.icon-zoom-out,\n.icon-popout-tech,\n.icon-frame-care,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n font-family: icon-orange !important;\n font-style: normal;\n font-variant: normal;\n line-height: 1;\n text-transform: none;\n speak: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-popout-care,\n.icon-popout-family,\n.icon-popout-fun,\n.icon-popout-home,\n.icon-popout-money,\n.icon-popout-on-the-move,\n.icon-popout-tariff,\n.icon-popout-tech,\n.icon-popout-wellbeing,\n.icon-popout-work,\n.icon-frame-family,\n.icon-frame-fun,\n.icon-frame-home,\n.icon-frame-money,\n.icon-frame-on-the-move,\n.icon-frame-tariff,\n.icon-frame-tech,\n.icon-frame-wellbeing,\n.icon-frame-work,\n.icon-frame-care,\n.icon-frame-connectivity,\n.icon-frame-my-customers,\n.icon-frame-performance,\n.icon-frame-security,\n.icon-frame-teamwork,\n.icon-popout-connectivity,\n.icon-popout-my-customers,\n.icon-popout-performance,\n.icon-popout-security,\n.icon-popout-teamwork {\n color: #f16e00;\n}\n\n.icon-checkbox-tick::before {\n content: \"\\eb77\";\n}\n\n.icon-2for1cinematicket::before {\n content: \"\\e900\";\n}\n\n.icon-3g::before {\n content: \"\\e901\";\n}\n\n.icon-4g::before {\n content: \"\\e902\";\n}\n\n.icon-4g-cam::before {\n content: \"\\e903\";\n}\n\n.icon-4G-Cam--Live-80::before {\n content: \"\\e904\";\n}\n\n.icon-4G-Cam-Camera-80::before {\n content: \"\\e905\";\n}\n\n.icon-4G-Cam-Inbox80::before {\n content: \"\\e906\";\n}\n\n.icon-4G-Cam-Outbox-80::before {\n content: \"\\e907\";\n}\n\n.icon-4G-Cam-Rec-80::before {\n content: \"\\e908\";\n}\n\n.icon-4g-plus::before {\n content: \"\\e909\";\n}\n\n.icon-4G-Cam-Compact::before {\n content: \"\\e90a\";\n}\n\n.icon-1013-Reseau::before {\n content: \"\\e90b\";\n}\n\n.icon-about-event::before {\n content: \"\\e90c\";\n}\n\n.icon-Accessability::before {\n content: \"\\e90d\";\n}\n\n.icon-accessibility-cognition::before {\n content: \"\\e90e\";\n}\n\n.icon-accessibility-dexterity::before {\n content: \"\\e90f\";\n}\n\n.icon-accessibility-hearing::before {\n content: \"\\e910\";\n}\n\n.icon-accessibility-mobility::before {\n content: \"\\e911\";\n}\n\n.icon-accessibility-speech::before {\n content: \"\\e912\";\n}\n\n.icon-accessibility-vision::before {\n content: \"\\e913\";\n}\n\n.icon-accessory-headphones::before {\n content: \"\\e914\";\n}\n\n.icon-accessory-shop::before {\n content: \"\\e915\";\n}\n\n.icon-Add::before {\n content: \"\\e916\";\n}\n\n.icon-add-more::before {\n content: \"\\e917\";\n}\n\n.icon-Add-person::before {\n content: \"\\e918\";\n}\n\n.icon-address-book::before {\n content: \"\\e919\";\n}\n\n.icon-administrator::before {\n content: \"\\e91a\";\n}\n\n.icon-Adultcode::before {\n content: \"\\e91b\";\n}\n\n.icon-Adult::before {\n content: \"\\e91c\";\n}\n\n.icon-advertising::before {\n content: \"\\e91d\";\n}\n\n.icon-aeroplane::before {\n content: \"\\e91e\";\n}\n\n.icon-Age-rating-3::before {\n content: \"\\e91f\";\n}\n\n.icon-Age-rating-4::before {\n content: \"\\e920\";\n}\n\n.icon-Age-rating-7::before {\n content: \"\\e921\";\n}\n\n.icon-Age-rating-9::before {\n content: \"\\e922\";\n}\n\n.icon-Age-rating-12::before {\n content: \"\\e923\";\n}\n\n.icon-Age-rating-16::before {\n content: \"\\e924\";\n}\n\n.icon-Age-rating-17::before {\n content: \"\\e925\";\n}\n\n.icon-Age-rating-18::before {\n content: \"\\e926\";\n}\n\n.icon-age-rating-mono-3::before {\n content: \"\\e927\";\n}\n\n.icon-age-rating-mono-4::before {\n content: \"\\e928\";\n}\n\n.icon-age-rating-mono-7::before {\n content: \"\\e929\";\n}\n\n.icon-age-rating-mono-9::before {\n content: \"\\e92a\";\n}\n\n.icon-age-rating-mono-12::before {\n content: \"\\e92b\";\n}\n\n.icon-age-rating-mono-16::before {\n content: \"\\e92c\";\n}\n\n.icon-age-rating-mono-17::before {\n content: \"\\e92d\";\n}\n\n.icon-age-rating-mono-18::before {\n content: \"\\e92e\";\n}\n\n.icon-agriculture::before {\n content: \"\\e92f\";\n}\n\n.icon-airbox-auto::before {\n content: \"\\e930\";\n}\n\n.icon-alarm-clock::before {\n content: \"\\e931\";\n}\n\n.icon-alarm-off::before {\n content: \"\\e932\";\n}\n\n.icon-Alias-numbers::before {\n content: \"\\e933\";\n}\n\n.icon-all-channels::before {\n content: \"\\e934\";\n}\n\n.icon-antenna::before {\n content: \"\\e935\";\n}\n\n.icon-anti-spam::before {\n content: \"\\e936\";\n}\n\n.icon-antivirus::before {\n content: \"\\e937\";\n}\n\n.icon-Apartment-building::before {\n content: \"\\e938\";\n}\n\n.icon-Apps::before {\n content: \"\\e939\";\n}\n\n.icon-Apps-disabled::before {\n content: \"\\e93a\";\n}\n\n.icon-Archive::before {\n content: \"\\e93b\";\n}\n\n.icon-arrow-down::before {\n content: \"\\e93c\";\n}\n\n.icon-arrow-up::before {\n content: \"\\e93d\";\n}\n\n.icon-arrow-next::before {\n content: \"\\e93e\";\n}\n\n.icon-arrow-previous::before {\n content: \"\\e93f\";\n}\n\n.icon-Art::before {\n content: \"\\e940\";\n}\n\n.icon-assistance::before {\n content: \"\\e941\";\n}\n\n.icon-attachment::before {\n content: \"\\e942\";\n}\n\n.icon-Auditorium::before {\n content: \"\\e943\";\n}\n\n.icon-avatar::before {\n content: \"\\e944\";\n}\n\n.icon-Baby::before {\n content: \"\\e945\";\n}\n\n.icon-backup::before {\n content: \"\\e946\";\n}\n\n.icon-banking::before {\n content: \"\\e947\";\n}\n\n.icon-battery-1-bar::before {\n content: \"\\e948\";\n}\n\n.icon-battery-2-bar::before {\n content: \"\\e949\";\n}\n\n.icon-battery-charging::before {\n content: \"\\e94a\";\n}\n\n.icon-battery-empty::before {\n content: \"\\e94b\";\n}\n\n.icon-battery-full::before {\n content: \"\\e94c\";\n}\n\n.icon-battery-full-2::before {\n content: \"\\e94d\";\n}\n\n.icon-Betting::before {\n content: \"\\e94e\";\n}\n\n.icon-bill-euro::before {\n content: \"\\e94f\";\n}\n\n.icon-billboard::before {\n content: \"\\e950\";\n}\n\n.icon-birthday::before {\n content: \"\\e951\";\n}\n\n.icon-bluetooth::before {\n content: \"\\e952\";\n}\n\n.icon-Book-award::before {\n content: \"\\e953\";\n}\n\n.icon-book-download::before {\n content: \"\\e954\";\n}\n\n.icon-bookmark::before {\n content: \"\\e955\";\n}\n\n.icon-bookmark-smart::before {\n content: \"\\e956\";\n}\n\n.icon-Boxes::before {\n content: \"\\e957\";\n}\n\n.icon-broadcast::before {\n content: \"\\e958\";\n}\n\n.icon-burst-mode::before {\n content: \"\\e959\";\n}\n\n.icon-Business-everywhere::before {\n content: \"\\e95a\";\n}\n\n.icon-business-invoices::before {\n content: \"\\e95b\";\n}\n\n.icon-business-lounge::before {\n content: \"\\e95c\";\n}\n\n.icon-business-telephonie::before {\n content: \"\\e95d\";\n}\n\n.icon-buy::before {\n content: \"\\e95e\";\n}\n\n.icon-buy-back-euro::before {\n content: \"\\e95f\";\n}\n\n.icon-buzz::before {\n content: \"\\e960\";\n}\n\n.icon-Calculator::before {\n content: \"\\e961\";\n}\n\n.icon-calendaralarm::before {\n content: \"\\e962\";\n}\n\n.icon-calendar-30::before {\n content: \"\\e963\";\n}\n\n.icon-calendar-day::before {\n content: \"\\e964\";\n}\n\n.icon-Calendar-fixtures-results::before {\n content: \"\\e965\";\n}\n\n.icon-Calendar-football-match::before {\n content: \"\\e966\";\n}\n\n.icon-calendar-month::before {\n content: \"\\e967\";\n}\n\n.icon-calendar-week::before {\n content: \"\\e968\";\n}\n\n.icon-call::before {\n content: \"\\e969\";\n}\n\n.icon-call-forward::before {\n content: \"\\e96a\";\n}\n\n.icon-call-invite::before {\n content: \"\\e96b\";\n}\n\n.icon-call-log::before {\n content: \"\\e96c\";\n}\n\n.icon-camera::before {\n content: \"\\e96d\";\n}\n\n.icon-Car-park::before {\n content: \"\\e96e\";\n}\n\n.icon-Car-pooling::before {\n content: \"\\e96f\";\n}\n\n.icon-Casting::before {\n content: \"\\e970\";\n}\n\n.icon-Categories::before {\n content: \"\\e971\";\n}\n\n.icon-CD::before {\n content: \"\\e972\";\n}\n\n.icon-change-wallpaper::before {\n content: \"\\e973\";\n}\n\n.icon-Change-wallpaper-1::before {\n content: \"\\e974\";\n}\n\n.icon-charger::before {\n content: \"\\e975\";\n}\n\n.icon-check-your-balance::before {\n content: \"\\e976\";\n}\n\n.icon-Child::before {\n content: \"\\e977\";\n}\n\n.icon-child-protection::before {\n content: \"\\e978\";\n}\n\n.icon-Children-channel::before {\n content: \"\\e979\";\n}\n\n.icon-cineday-silhouette::before {\n content: \"\\e97a\";\n}\n\n.icon-clock::before {\n content: \"\\e97b\";\n}\n\n.icon-cloud-backup::before {\n content: \"\\e97c\";\n}\n\n.icon-Coat-hanger::before {\n content: \"\\e97d\";\n}\n\n.icon-Collective-class-training::before {\n content: \"\\e97e\";\n}\n\n.icon-Colour-Call::before {\n content: \"\\e97f\";\n}\n\n.icon-Comedy-channel::before {\n content: \"\\e980\";\n}\n\n.icon-Comic::before {\n content: \"\\e981\";\n}\n\n.icon-Comments::before {\n content: \"\\e982\";\n}\n\n.icon-commercial-representitive::before {\n content: \"\\e983\";\n}\n\n.icon-community-sms::before {\n content: \"\\e984\";\n}\n\n.icon-Concierge-bell::before {\n content: \"\\e985\";\n}\n\n.icon-conference-call::before {\n content: \"\\e986\";\n}\n\n.icon-connected-object::before {\n content: \"\\e987\";\n}\n\n.icon-connection::before {\n content: \"\\e988\";\n}\n\n.icon-construction::before {\n content: \"\\e989\";\n}\n\n.icon-contact-card::before {\n content: \"\\e98a\";\n}\n\n.icon-control-centre::before {\n content: \"\\e98b\";\n}\n\n.icon-control-mydata::before {\n content: \"\\e98c\";\n}\n\n.icon-copy::before {\n content: \"\\e98d\";\n}\n\n.icon-Courier::before {\n content: \"\\e98e\";\n}\n\n.icon-CPU::before {\n content: \"\\e98f\";\n}\n\n.icon-crane::before {\n content: \"\\e990\";\n}\n\n.icon-Crop::before {\n content: \"\\e991\";\n}\n\n.icon-Currency-brazilian-real::before {\n content: \"\\e992\";\n}\n\n.icon-currency-converter::before {\n content: \"\\e993\";\n}\n\n.icon-Currency-dollar::before {\n content: \"\\e994\";\n}\n\n.icon-currency-euro::before {\n content: \"\\e995\";\n}\n\n.icon-Currency-sterling::before {\n content: \"\\e996\";\n}\n\n.icon-Currency-yen::before {\n content: \"\\e997\";\n}\n\n.icon-data-protection::before {\n content: \"\\e998\";\n}\n\n.icon-data-services::before {\n content: \"\\e999\";\n}\n\n.icon-decoder::before {\n content: \"\\e99a\";\n}\n\n.icon-Decrease-test-size::before {\n content: \"\\e99b\";\n}\n\n.icon-Defibrillator::before {\n content: \"\\e99c\";\n}\n\n.icon-delete::before {\n content: \"\\e99d\";\n}\n\n.icon-device-desktop-computer::before {\n content: \"\\e99e\";\n}\n\n.icon-device-desktop-computer-connected::before {\n content: \"\\e99f\";\n}\n\n.icon-device-fixed-line-phone::before {\n content: \"\\e9a0\";\n}\n\n.icon-device-laptop-computer::before {\n content: \"\\e9a1\";\n}\n\n.icon-device-laptop-computer-connected::before {\n content: \"\\e9a2\";\n}\n\n.icon-device-smart-phone::before {\n content: \"\\e9a3\";\n}\n\n.icon-device-status::before {\n content: \"\\e9a4\";\n}\n\n.icon-device-tablet::before {\n content: \"\\e9a5\";\n}\n\n.icon-device-tablet-connected::before {\n content: \"\\e9a6\";\n}\n\n.icon-device-tv::before {\n content: \"\\e9a7\";\n}\n\n.icon-device-connected-printer::before {\n content: \"\\e9a8\";\n}\n\n.icon-device-manager::before {\n content: \"\\e9a9\";\n}\n\n.icon-device-managment-express::before {\n content: \"\\e9aa\";\n}\n\n.icon-dialler::before {\n content: \"\\e9ab\";\n}\n\n.icon-Digital-frame::before {\n content: \"\\e9ac\";\n}\n\n.icon-disable-apps::before {\n content: \"\\e9ad\";\n}\n\n.icon-Discovery-offer::before {\n content: \"\\e9ae\";\n}\n\n.icon-Discussion-author::before {\n content: \"\\e9af\";\n}\n\n.icon-Discussion-more::before {\n content: \"\\e9b0\";\n}\n\n.icon-Doctor::before {\n content: \"\\e9b1\";\n}\n\n.icon-Doctors-bag::before {\n content: \"\\e9b2\";\n}\n\n.icon-Doctors-communicating::before {\n content: \"\\e9b3\";\n}\n\n.icon-Document-compose::before {\n content: \"\\e9b4\";\n}\n\n.icon-document-stack::before {\n content: \"\\e9b5\";\n}\n\n.icon-document-word::before {\n content: \"\\e9b6\";\n}\n\n.icon-document-zip::before {\n content: \"\\e9b7\";\n}\n\n.icon-Documentary::before {\n content: \"\\e9b8\";\n}\n\n.icon-done-modifier::before {\n content: \"\\e9b9\";\n}\n\n.icon-download::before {\n content: \"\\e9ba\";\n}\n\n.icon-draft::before {\n content: \"\\e9bb\";\n}\n\n.icon-dual-sim-packaging::before {\n content: \"\\e9bc\";\n}\n\n.icon-easy-internet::before {\n content: \"\\e9bd\";\n}\n\n.icon-ebook::before {\n content: \"\\e9be\";\n}\n\n.icon-Eco-mode::before {\n content: \"\\e9bf\";\n}\n\n.icon-edashboard::before {\n content: \"\\e9c0\";\n}\n\n.icon-edit-draft::before {\n content: \"\\e9c1\";\n}\n\n.icon-edit-email::before {\n content: \"\\e9c2\";\n}\n\n.icon-edit-image::before {\n content: \"\\e9c3\";\n}\n\n.icon-Elderly-person::before {\n content: \"\\e9c4\";\n}\n\n.icon-electric-car::before {\n content: \"\\e9c5\";\n}\n\n.icon-electric-car-charging::before {\n content: \"\\e9c6\";\n}\n\n.icon-electricity-provider::before {\n content: \"\\e9c7\";\n}\n\n.icon-elevator::before {\n content: \"\\e9c8\";\n}\n\n.icon-email::before {\n content: \"\\e9c9\";\n}\n\n.icon-email-forwarded::before {\n content: \"\\e9ca\";\n}\n\n.icon-Email-replied::before {\n content: \"\\e9cb\";\n}\n\n.icon-emap::before {\n content: \"\\e9cc\";\n}\n\n.icon-emergency-firemen::before {\n content: \"\\e9cd\";\n}\n\n.icon-emergency-police::before {\n content: \"\\e9ce\";\n}\n\n.icon-emergency-sos::before {\n content: \"\\e9cf\";\n}\n\n.icon-emergency-service::before {\n content: \"\\e9d0\";\n}\n\n.icon-employees-1::before {\n content: \"\\e9d1\";\n}\n\n.icon-Empty-trash::before {\n content: \"\\e9d2\";\n}\n\n.icon-End-call::before {\n content: \"\\e9d3\";\n}\n\n.icon-Entertainment-channel::before {\n content: \"\\e9d4\";\n}\n\n.icon-epg::before {\n content: \"\\e9d5\";\n}\n\n.icon-erase::before {\n content: \"\\e9d6\";\n}\n\n.icon-error-severe::before {\n content: \"\\e9d7\";\n}\n\n.icon-Ethenet::before {\n content: \"\\e9d8\";\n}\n\n.icon-event-agenda::before {\n content: \"\\e9d9\";\n}\n\n.icon-event-organiser::before {\n content: \"\\e9da\";\n}\n\n.icon-event-speaker::before {\n content: \"\\e9db\";\n}\n\n.icon-Excel::before {\n content: \"\\e9dc\";\n}\n\n.icon-Expand-screen::before {\n content: \"\\e9dd\";\n}\n\n.icon-expert::before {\n content: \"\\e9de\";\n}\n\n.icon-external-drive::before {\n content: \"\\e9df\";\n}\n\n.icon-Factory::before {\n content: \"\\e9e0\";\n}\n\n.icon-family-place::before {\n content: \"\\e9e1\";\n}\n\n.icon-Fast-delivery::before {\n content: \"\\e9e2\";\n}\n\n.icon-Favorite-music::before {\n content: \"\\e9e3\";\n}\n\n.icon-favourite::before {\n content: \"\\e9e4\";\n}\n\n.icon-Featured::before {\n content: \"\\e9e5\";\n}\n\n.icon-filter::before {\n content: \"\\e9e6\";\n}\n\n.icon-Filter-effects::before {\n content: \"\\e9e7\";\n}\n\n.icon-finance::before {\n content: \"\\e9e8\";\n}\n\n.icon-fire::before {\n content: \"\\e9e9\";\n}\n\n.icon-Fire-extinguisher::before {\n content: \"\\e9ea\";\n}\n\n.icon-Firewall::before {\n content: \"\\e9eb\";\n}\n\n.icon-flexible-storage::before {\n content: \"\\e9ec\";\n}\n\n.icon-folder-camera::before {\n content: \"\\e9ed\";\n}\n\n.icon-folder-document::before {\n content: \"\\e9ee\";\n}\n\n.icon-folder-favourite::before {\n content: \"\\e9ef\";\n}\n\n.icon-folder-sd::before {\n content: \"\\e9f0\";\n}\n\n.icon-football::before {\n content: \"\\e9f1\";\n}\n\n.icon-Football-match::before {\n content: \"\\e9f2\";\n}\n\n.icon-Football-quiz::before {\n content: \"\\e9f3\";\n}\n\n.icon-Forward::before {\n content: \"\\e9f4\";\n}\n\n.icon-Forward-curved-arrow::before {\n content: \"\\e9f5\";\n}\n\n.icon-forward-the-number::before {\n content: \"\\e9f6\";\n}\n\n.icon-free-tag::before {\n content: \"\\e9f7\";\n}\n\n.icon-Free-up-space::before {\n content: \"\\e9f8\";\n}\n\n.icon-front-end-dashboard::before {\n content: \"\\e9f9\";\n}\n\n.icon-Full-screen-view::before {\n content: \"\\e9fa\";\n}\n\n.icon-Gallery::before {\n content: \"\\e9fb\";\n}\n\n.icon-games::before {\n content: \"\\e9fc\";\n}\n\n.icon-Gas-tank::before {\n content: \"\\e9fd\";\n}\n\n.icon-gaugecapacity::before {\n content: \"\\e9fe\";\n}\n\n.icon-gauge-counter::before {\n content: \"\\e9ff\";\n}\n\n.icon-gauge-rate::before {\n content: \"\\ea00\";\n}\n\n.icon-gauge-mon-reseau::before {\n content: \"\\ea01\";\n}\n\n.icon-generic-document::before {\n content: \"\\ea02\";\n}\n\n.icon-geolocation::before {\n content: \"\\ea03\";\n}\n\n.icon-hands-free::before {\n content: \"\\ea04\";\n}\n\n.icon-HDMI-Card::before {\n content: \"\\ea05\";\n}\n\n.icon-health::before {\n content: \"\\ea06\";\n}\n\n.icon-health-monitor::before {\n content: \"\\ea07\";\n}\n\n.icon-Health-patient::before {\n content: \"\\ea08\";\n}\n\n.icon-Heart-rate::before {\n content: \"\\ea09\";\n}\n\n.icon-Heartbeats::before {\n content: \"\\ea0a\";\n}\n\n.icon-help-guide::before {\n content: \"\\ea0b\";\n}\n\n.icon-history::before {\n content: \"\\ea0c\";\n}\n\n.icon-home::before {\n content: \"\\ea0d\";\n}\n\n.icon-Home-1::before {\n content: \"\\ea0e\";\n}\n\n.icon-home-alarm::before {\n content: \"\\ea0f\";\n}\n\n.icon-Homelive::before {\n content: \"\\ea10\";\n}\n\n.icon-homescreen::before {\n content: \"\\ea11\";\n}\n\n.icon-Horoscopes::before {\n content: \"\\ea12\";\n}\n\n.icon-hospital::before {\n content: \"\\ea13\";\n}\n\n.icon-hotel::before {\n content: \"\\ea14\";\n}\n\n.icon-Hourglass::before {\n content: \"\\ea15\";\n}\n\n.icon-Im-driving::before {\n content: \"\\ea16\";\n}\n\n.icon-image::before {\n content: \"\\ea17\";\n}\n\n.icon-image-file::before {\n content: \"\\ea18\";\n}\n\n.icon-improvement::before {\n content: \"\\ea19\";\n}\n\n.icon-inbox::before {\n content: \"\\ea1a\";\n}\n\n.icon-Incoming-call-curved-arrow::before {\n content: \"\\ea1b\";\n}\n\n.icon-Increase-test-size::before {\n content: \"\\ea1c\";\n}\n\n.icon-info::before {\n content: \"\\ea1d\";\n}\n\n.icon-Information-data::before {\n content: \"\\ea1e\";\n}\n\n.icon-internationaltv::before {\n content: \"\\ea1f\";\n}\n\n.icon-international-globe::before {\n content: \"\\ea20\";\n}\n\n.icon-internet::before {\n content: \"\\ea21\";\n}\n\n.icon-internet-browser::before {\n content: \"\\ea22\";\n}\n\n.icon-Internet-security-desktop::before {\n content: \"\\ea23\";\n}\n\n.icon-Internet-security-mobile::before {\n content: \"\\ea24\";\n}\n\n.icon-Internet-security-password::before {\n content: \"\\ea25\";\n}\n\n.icon-Internet-security-server::before {\n content: \"\\ea26\";\n}\n\n.icon-internet-usage::before {\n content: \"\\ea27\";\n}\n\n.icon-Interventions::before {\n content: \"\\ea28\";\n}\n\n.icon-IT-infrastructure::before {\n content: \"\\ea29\";\n}\n\n.icon-keeper::before {\n content: \"\\ea2a\";\n}\n\n.icon-keyboard::before {\n content: \"\\ea2b\";\n}\n\n.icon-Keypad::before {\n content: \"\\ea2c\";\n}\n\n.icon-La-Cle::before {\n content: \"\\ea2d\";\n}\n\n.icon-Language::before {\n content: \"\\ea2e\";\n}\n\n.icon-Latest::before {\n content: \"\\ea2f\";\n}\n\n.icon-Le-Bloc::before {\n content: \"\\ea30\";\n}\n\n.icon-Leave-session::before {\n content: \"\\ea31\";\n}\n\n.icon-lightbulb-sh::before {\n content: \"\\ea32\";\n}\n\n.icon-ligue-1::before {\n content: \"\\ea33\";\n}\n\n.icon-Link::before {\n content: \"\\ea34\";\n}\n\n.icon-live::before {\n content: \"\\ea35\";\n}\n\n.icon-livebox::before {\n content: \"\\ea36\";\n}\n\n.icon-livebox-info::before {\n content: \"\\ea37\";\n}\n\n.icon-livebox-phone::before {\n content: \"\\ea38\";\n}\n\n.icon-location-pin-compass::before {\n content: \"\\ea39\";\n}\n\n.icon-lock::before {\n content: \"\\ea3a\";\n}\n\n.icon-Lock-screen-settings::before {\n content: \"\\ea3b\";\n}\n\n.icon-logistics::before {\n content: \"\\ea3c\";\n}\n\n.icon-logout::before {\n content: \"\\ea3d\";\n}\n\n.icon-Maintenance-man::before {\n content: \"\\ea3e\";\n}\n\n.icon-manage-android::before {\n content: \"\\ea3f\";\n}\n\n.icon-managing-equipment::before {\n content: \"\\ea40\";\n}\n\n.icon-Map::before {\n content: \"\\ea41\";\n}\n\n.icon-map-pin::before {\n content: \"\\ea42\";\n}\n\n.icon-Medal::before {\n content: \"\\ea43\";\n}\n\n.icon-Medical-app::before {\n content: \"\\ea44\";\n}\n\n.icon-Medical-app-phone::before {\n content: \"\\ea45\";\n}\n\n.icon-medical-chart::before {\n content: \"\\ea46\";\n}\n\n.icon-Medical-files::before {\n content: \"\\ea47\";\n}\n\n.icon-menu::before {\n content: \"\\ea48\";\n}\n\n.icon-Message-download::before {\n content: \"\\ea49\";\n}\n\n.icon-messaging::before {\n content: \"\\ea4a\";\n}\n\n.icon-messaging-compose-sms::before {\n content: \"\\ea4b\";\n}\n\n.icon-messaging-unified::before {\n content: \"\\ea4c\";\n}\n\n.icon-messaging-untitled-compose::before {\n content: \"\\ea4d\";\n}\n\n.icon-microphone::before {\n content: \"\\ea4e\";\n}\n\n.icon-Microscope::before {\n content: \"\\ea4f\";\n}\n\n.icon-mini-games::before {\n content: \"\\ea50\";\n}\n\n.icon-mirroring::before {\n content: \"\\ea51\";\n}\n\n.icon-Missed-call-boxed-arrow::before {\n content: \"\\ea52\";\n}\n\n.icon-Missed-call-curved-arrow::before {\n content: \"\\ea53\";\n}\n\n.icon-mobile-applications::before {\n content: \"\\ea54\";\n}\n\n.icon-Mobile-backup-restore::before {\n content: \"\\ea55\";\n}\n\n.icon-mobile-box::before {\n content: \"\\ea56\";\n}\n\n.icon-mobile-data-toggle::before {\n content: \"\\ea57\";\n}\n\n.icon-mobile-insurance::before {\n content: \"\\ea58\";\n}\n\n.icon-mobile-network-coverage::before {\n content: \"\\ea59\";\n}\n\n.icon-mobile-security::before {\n content: \"\\ea5a\";\n}\n\n.icon-mobile-setup::before {\n content: \"\\ea5b\";\n}\n\n.icon-Modem::before {\n content: \"\\ea5c\";\n}\n\n.icon-modifier-add::before {\n content: \"\\ea5d\";\n}\n\n.icon-Modifier-delete::before {\n content: \"\\ea5e\";\n}\n\n.icon-Modifier-favorite::before {\n content: \"\\ea5f\";\n}\n\n.icon-modifier-new::before {\n content: \"\\ea60\";\n}\n\n.icon-modifier-no-access::before {\n content: \"\\ea61\";\n}\n\n.icon-modifier-synchro::before {\n content: \"\\ea62\";\n}\n\n.icon-modifier-upload::before {\n content: \"\\ea63\";\n}\n\n.icon-modifier-wizard::before {\n content: \"\\ea64\";\n}\n\n.icon-Modifier-download::before {\n content: \"\\ea65\";\n}\n\n.icon-mon-reseau::before {\n content: \"\\ea66\";\n}\n\n.icon-money::before {\n content: \"\\ea67\";\n}\n\n.icon-More-dots::before {\n content: \"\\ea68\";\n}\n\n.icon-move-to-folder::before {\n content: \"\\ea69\";\n}\n\n.icon-multi-sim::before {\n content: \"\\ea6a\";\n}\n\n.icon-multiple-timezone::before {\n content: \"\\ea6b\";\n}\n\n.icon-Music-artist::before {\n content: \"\\ea6c\";\n}\n\n.icon-music-file::before {\n content: \"\\ea6d\";\n}\n\n.icon-Music-genre::before {\n content: \"\\ea6e\";\n}\n\n.icon-music-player::before {\n content: \"\\ea6f\";\n}\n\n.icon-Mute-microphone::before {\n content: \"\\ea70\";\n}\n\n.icon-my-account::before {\n content: \"\\ea71\";\n}\n\n.icon-my-bill-uk::before {\n content: \"\\ea72\";\n}\n\n.icon-my-boutique::before {\n content: \"\\ea73\";\n}\n\n.icon-my-essential::before {\n content: \"\\ea74\";\n}\n\n.icon-my-essential-tablet::before {\n content: \"\\ea75\";\n}\n\n.icon-my-livebox::before {\n content: \"\\ea76\";\n}\n\n.icon-my-media::before {\n content: \"\\ea77\";\n}\n\n.icon-My-Office-Phone::before {\n content: \"\\ea78\";\n}\n\n.icon-my-orange::before {\n content: \"\\ea79\";\n}\n\n.icon-my-plug::before {\n content: \"\\ea7a\";\n}\n\n.icon-my-services::before {\n content: \"\\ea7b\";\n}\n\n.icon-my-travels::before {\n content: \"\\ea7c\";\n}\n\n.icon-Nature::before {\n content: \"\\ea7d\";\n}\n\n.icon-Network-add::before {\n content: \"\\ea7e\";\n}\n\n.icon-Network-livebox::before {\n content: \"\\ea7f\";\n}\n\n.icon-networks::before {\n content: \"\\ea80\";\n}\n\n.icon-new::before {\n content: \"\\ea81\";\n}\n\n.icon-newspaper::before {\n content: \"\\ea82\";\n}\n\n.icon-nfc::before {\n content: \"\\ea83\";\n}\n\n.icon-NFC-tag::before {\n content: \"\\ea84\";\n}\n\n.icon-no-sim::before {\n content: \"\\ea85\";\n}\n\n.icon-Notification::before {\n content: \"\\ea86\";\n}\n\n.icon-Notification-Bell::before {\n content: \"\\ea87\";\n}\n\n.icon-nouveau-contract-social::before {\n content: \"\\ea88\";\n}\n\n.icon-numero-unique::before {\n content: \"\\ea89\";\n}\n\n.icon-office::before {\n content: \"\\ea8a\";\n}\n\n.icon-oil-and-gas::before {\n content: \"\\ea8b\";\n}\n\n.icon-On-board-unit::before {\n content: \"\\ea8c\";\n}\n\n.icon-online-help::before {\n content: \"\\ea8d\";\n}\n\n.icon-orangewallet::before {\n content: \"\\ea8e\";\n}\n\n.icon-orange-assistant::before {\n content: \"\\ea8f\";\n}\n\n.icon-orange-cash::before {\n content: \"\\ea90\";\n}\n\n.icon-orange-corporate::before {\n content: \"\\ea91\";\n}\n\n.icon-Orange-Detente::before {\n content: \"\\ea92\";\n}\n\n.icon-orange-events::before {\n content: \"\\ea93\";\n}\n\n.icon-Orange-Experts-Class-Training::before {\n content: \"\\ea94\";\n}\n\n.icon-Orange-Experts-Copy-Keep::before {\n content: \"\\ea95\";\n}\n\n.icon-orange-experts-expert::before {\n content: \"\\ea96\";\n}\n\n.icon-orange-experts-insurance::before {\n content: \"\\ea97\";\n}\n\n.icon-Orange-Experts-One2One-Coach::before {\n content: \"\\ea98\";\n}\n\n.icon-orange-experts-orange-business-consultant::before {\n content: \"\\ea99\";\n}\n\n.icon-orange-experts-orange-startup-smartphone::before {\n content: \"\\ea9a\";\n}\n\n.icon-orange-experts-recycle::before {\n content: \"\\ea9b\";\n}\n\n.icon-orange-experts-repair::before {\n content: \"\\ea9c\";\n}\n\n.icon-orange-experts-tranquil::before {\n content: \"\\ea9d\";\n}\n\n.icon-Orange-Football-Club::before {\n content: \"\\ea9e\";\n}\n\n.icon-orange-foundation::before {\n content: \"\\ea9f\";\n}\n\n.icon-Orange-garden::before {\n content: \"\\eaa0\";\n}\n\n.icon-orange-gesture::before {\n content: \"\\eaa1\";\n}\n\n.icon-orange-jobs::before {\n content: \"\\eaa2\";\n}\n\n.icon-orange-messenger::before {\n content: \"\\eaa3\";\n}\n\n.icon-Orange-Messenger-1::before {\n content: \"\\eaa4\";\n}\n\n.icon-orange-money::before {\n content: \"\\eaa5\";\n}\n\n.icon-orange-Photography::before {\n content: \"\\eaa6\";\n}\n\n.icon-orange-pro::before {\n content: \"\\eaa7\";\n}\n\n.icon-orange-protect::before {\n content: \"\\eaa8\";\n}\n\n.icon-orange-radio::before {\n content: \"\\eaa9\";\n}\n\n.icon-orange-reflections::before {\n content: \"\\eaaa\";\n}\n\n.icon-Orange-rewards::before {\n content: \"\\eaab\";\n}\n\n.icon-Orange-security-suite::before {\n content: \"\\eaac\";\n}\n\n.icon-orange-travel::before {\n content: \"\\eaad\";\n}\n\n.icon-orange-tv::before {\n content: \"\\eaae\";\n}\n\n.icon-orange-wallet::before {\n content: \"\\eaaf\";\n}\n\n.icon-orange-wifi::before {\n content: \"\\eab0\";\n}\n\n.icon-Orange-Guest::before {\n content: \"\\eab1\";\n}\n\n.icon-organisation::before {\n content: \"\\eab2\";\n}\n\n.icon-outbox::before {\n content: \"\\eab3\";\n}\n\n.icon-outdoor-sports-mountain-biking::before {\n content: \"\\eab4\";\n}\n\n.icon-outdoor-sports-skiing::before {\n content: \"\\eab5\";\n}\n\n.icon-Package::before {\n content: \"\\eab6\";\n}\n\n.icon-Package-content::before {\n content: \"\\eab7\";\n}\n\n.icon-parabole-tv::before {\n content: \"\\eab8\";\n}\n\n.icon-parental-control::before {\n content: \"\\eab9\";\n}\n\n.icon-Parrasol::before {\n content: \"\\eaba\";\n}\n\n.icon-pass-video::before {\n content: \"\\eabb\";\n}\n\n.icon-Pause::before {\n content: \"\\eabc\";\n}\n\n.icon-Payment-euro::before {\n content: \"\\eabd\";\n}\n\n.icon-pda-device::before {\n content: \"\\eabe\";\n}\n\n.icon-pdf-file::before {\n content: \"\\eabf\";\n}\n\n.icon-Pencil::before {\n content: \"\\eac0\";\n}\n\n.icon-personal-smartphone-trainer::before {\n content: \"\\eac1\";\n}\n\n.icon-phone-advisor::before {\n content: \"\\eac2\";\n}\n\n.icon-phone-fund::before {\n content: \"\\eac3\";\n}\n\n.icon-phone-protection::before {\n content: \"\\eac4\";\n}\n\n.icon-Photo-dialer::before {\n content: \"\\eac5\";\n}\n\n.icon-picture-messaging::before {\n content: \"\\eac6\";\n}\n\n.icon-Pills::before {\n content: \"\\eac7\";\n}\n\n.icon-pioneering::before {\n content: \"\\eac8\";\n}\n\n.icon-Play::before {\n content: \"\\eac9\";\n}\n\n.icon-play-and-win::before {\n content: \"\\eaca\";\n}\n\n.icon-playmode-random::before {\n content: \"\\eacb\";\n}\n\n.icon-polls::before {\n content: \"\\eacc\";\n}\n\n.icon-portfolio::before {\n content: \"\\eacd\";\n}\n\n.icon-POS-payment::before {\n content: \"\\eace\";\n}\n\n.icon-power::before {\n content: \"\\eacf\";\n}\n\n.icon-powerpoint-file::before {\n content: \"\\ead0\";\n}\n\n.icon-presentation::before {\n content: \"\\ead1\";\n}\n\n.icon-previous::before {\n content: \"\\ead2\";\n}\n\n.icon-printer::before {\n content: \"\\ead3\";\n}\n\n.icon-profileringtone::before {\n content: \"\\ead4\";\n}\n\n.icon-public-transport::before {\n content: \"\\ead5\";\n}\n\n.icon-publish::before {\n content: \"\\ead6\";\n}\n\n.icon-Quirky-stories::before {\n content: \"\\ead7\";\n}\n\n.icon-Quiz::before {\n content: \"\\ead8\";\n}\n\n.icon-Radiography::before {\n content: \"\\ead9\";\n}\n\n.icon-ratings-stars::before {\n content: \"\\eada\";\n}\n\n.icon-Real-time::before {\n content: \"\\eadb\";\n}\n\n.icon-recommend::before {\n content: \"\\eadc\";\n}\n\n.icon-record::before {\n content: \"\\eadd\";\n}\n\n.icon-Record-1::before {\n content: \"\\eade\";\n}\n\n.icon-recycle-device::before {\n content: \"\\eadf\";\n}\n\n.icon-Redo::before {\n content: \"\\eae0\";\n}\n\n.icon-relationship::before {\n content: \"\\eae1\";\n}\n\n.icon-reload::before {\n content: \"\\eae2\";\n}\n\n.icon-remote-control::before {\n content: \"\\eae3\";\n}\n\n.icon-Remote-control-1::before {\n content: \"\\eae4\";\n}\n\n.icon-remove-modifier::before {\n content: \"\\eae5\";\n}\n\n.icon-Replay-boxed-arrow::before {\n content: \"\\eae6\";\n}\n\n.icon-Reply-boxed-arrow::before {\n content: \"\\eae7\";\n}\n\n.icon-Reply-curved-arrow::before {\n content: \"\\eae8\";\n}\n\n.icon-report::before {\n content: \"\\eae9\";\n}\n\n.icon-responsible::before {\n content: \"\\eaea\";\n}\n\n.icon-Restaurant::before {\n content: \"\\eaeb\";\n}\n\n.icon-restore-to-phone::before {\n content: \"\\eaec\";\n}\n\n.icon-Restrictied-content::before {\n content: \"\\eaed\";\n}\n\n.icon-rewards::before {\n content: \"\\eaee\";\n}\n\n.icon-ringtones::before {\n content: \"\\eaef\";\n}\n\n.icon-running::before {\n content: \"\\eaf0\";\n}\n\n.icon-Scales::before {\n content: \"\\eaf1\";\n}\n\n.icon-scan-ticket::before {\n content: \"\\eaf2\";\n}\n\n.icon-School::before {\n content: \"\\eaf3\";\n}\n\n.icon-Science::before {\n content: \"\\eaf4\";\n}\n\n.icon-Scissors::before {\n content: \"\\eaf5\";\n}\n\n.icon-sd-card::before {\n content: \"\\eaf6\";\n}\n\n.icon-SD-card-1::before {\n content: \"\\eaf7\";\n}\n\n.icon-search::before {\n content: \"\\eaf8\";\n}\n\n.icon-Send::before {\n content: \"\\eaf9\";\n}\n\n.icon-Send-to-person::before {\n content: \"\\eafa\";\n}\n\n.icon-Server::before {\n content: \"\\eafb\";\n}\n\n.icon-servers::before {\n content: \"\\eafc\";\n}\n\n.icon-settings::before {\n content: \"\\eafd\";\n}\n\n.icon-setup-and-repair::before {\n content: \"\\eafe\";\n}\n\n.icon-setup-and-repair-cog::before {\n content: \"\\eaff\";\n}\n\n.icon-setup-internet::before {\n content: \"\\eb00\";\n}\n\n.icon-share::before {\n content: \"\\eb01\";\n}\n\n.icon-Share-wifi::before {\n content: \"\\eb02\";\n}\n\n.icon-shipping::before {\n content: \"\\eb03\";\n}\n\n.icon-Shop::before {\n content: \"\\eb04\";\n}\n\n.icon-shop-pin::before {\n content: \"\\eb05\";\n}\n\n.icon-shop-subscriptions::before {\n content: \"\\eb06\";\n}\n\n.icon-Shopping::before {\n content: \"\\eb07\";\n}\n\n.icon-Show-front-back-camera::before {\n content: \"\\eb08\";\n}\n\n.icon-Shower::before {\n content: \"\\eb09\";\n}\n\n.icon-showroom-mobile-pro::before {\n content: \"\\eb0a\";\n}\n\n.icon-signal-1-5::before {\n content: \"\\eb0b\";\n}\n\n.icon-signal-2-5::before {\n content: \"\\eb0c\";\n}\n\n.icon-signal-3-5::before {\n content: \"\\eb0d\";\n}\n\n.icon-signal-4-5::before {\n content: \"\\eb0e\";\n}\n\n.icon-signal-5-5::before {\n content: \"\\eb0f\";\n}\n\n.icon-signal-boost::before {\n content: \"\\eb10\";\n}\n\n.icon-Silent::before {\n content: \"\\eb11\";\n}\n\n.icon-sim::before {\n content: \"\\eb12\";\n}\n\n.icon-simple-mode::before {\n content: \"\\eb13\";\n}\n\n.icon-Simplicity::before {\n content: \"\\eb14\";\n}\n\n.icon-Skip-backward::before {\n content: \"\\eb15\";\n}\n\n.icon-Skip-forward::before {\n content: \"\\eb16\";\n}\n\n.icon-Sleep::before {\n content: \"\\eb17\";\n}\n\n.icon-Smart-electric-meter::before {\n content: \"\\eb18\";\n}\n\n.icon-Smart-heating-switch::before {\n content: \"\\eb19\";\n}\n\n.icon-smart-home::before {\n content: \"\\eb1a\";\n}\n\n.icon-smart-lightswitch::before {\n content: \"\\eb1b\";\n}\n\n.icon-smart-powerstation::before {\n content: \"\\eb1c\";\n}\n\n.icon-Smart-Sensor::before {\n content: \"\\eb1d\";\n}\n\n.icon-smart-tap::before {\n content: \"\\eb1e\";\n}\n\n.icon-smart-watch::before {\n content: \"\\eb1f\";\n}\n\n.icon-social-network::before {\n content: \"\\eb20\";\n}\n\n.icon-software-update::before {\n content: \"\\eb21\";\n}\n\n.icon-Sport-channel::before {\n content: \"\\eb22\";\n}\n\n.icon-Start-services::before {\n content: \"\\eb23\";\n}\n\n.icon-startup-wizard::before {\n content: \"\\eb24\";\n}\n\n.icon-stocks::before {\n content: \"\\eb25\";\n}\n\n.icon-stop-secret::before {\n content: \"\\eb26\";\n}\n\n.icon-Stop-video::before {\n content: \"\\eb27\";\n}\n\n.icon-Storage-cloud::before {\n content: \"\\eb28\";\n}\n\n.icon-store-locator::before {\n content: \"\\eb29\";\n}\n\n.icon-Street::before {\n content: \"\\eb2a\";\n}\n\n.icon-Stretcher::before {\n content: \"\\eb2b\";\n}\n\n.icon-subscription-package::before {\n content: \"\\eb2c\";\n}\n\n.icon-Sudoku::before {\n content: \"\\eb2d\";\n}\n\n.icon-support::before {\n content: \"\\eb2e\";\n}\n\n.icon-surveillance-camera::before {\n content: \"\\eb2f\";\n}\n\n.icon-Syncronise::before {\n content: \"\\eb30\";\n}\n\n.icon-target-location::before {\n content: \"\\eb31\";\n}\n\n.icon-tarif::before {\n content: \"\\eb32\";\n}\n\n.icon-tariff::before {\n content: \"\\eb33\";\n}\n\n.icon-task-list::before {\n content: \"\\eb34\";\n}\n\n.icon-Taxi::before {\n content: \"\\eb35\";\n}\n\n.icon-team-connect::before {\n content: \"\\eb36\";\n}\n\n.icon-temperature::before {\n content: \"\\eb37\";\n}\n\n.icon-terms-conditions::before {\n content: \"\\eb38\";\n}\n\n.icon-text-alerts::before {\n content: \"\\eb39\";\n}\n\n.icon-Thumb-down::before {\n content: \"\\eb3a\";\n}\n\n.icon-Thumb-up::before {\n content: \"\\eb3b\";\n}\n\n.icon-tick::before {\n content: \"\\eb3c\";\n}\n\n.icon-tick-circle::before {\n content: \"\\eb3d\";\n}\n\n.icon-tickets::before {\n content: \"\\eb3e\";\n}\n\n.icon-Top-10::before {\n content: \"\\eb3f\";\n}\n\n.icon-top-up-dollar::before {\n content: \"\\eb40\";\n}\n\n.icon-top-up-euro::before {\n content: \"\\eb41\";\n}\n\n.icon-top-up-uk-bank::before {\n content: \"\\eb42\";\n}\n\n.icon-touch-screen::before {\n content: \"\\eb43\";\n}\n\n.icon-town::before {\n content: \"\\eb44\";\n}\n\n.icon-townhall::before {\n content: \"\\eb45\";\n}\n\n.icon-track-your-delivery::before {\n content: \"\\eb46\";\n}\n\n.icon-track-your-order::before {\n content: \"\\eb47\";\n}\n\n.icon-Trading::before {\n content: \"\\eb48\";\n}\n\n.icon-trash::before {\n content: \"\\eb49\";\n}\n\n.icon-tv-plus::before {\n content: \"\\eb4a\";\n}\n\n.icon-TV-series::before {\n content: \"\\eb4b\";\n}\n\n.icon-Undo::before {\n content: \"\\eb4c\";\n}\n\n.icon-unique::before {\n content: \"\\eb4d\";\n}\n\n.icon-unknown-file::before {\n content: \"\\eb4e\";\n}\n\n.icon-unlimited-calls::before {\n content: \"\\eb4f\";\n}\n\n.icon-unlocked::before {\n content: \"\\eb50\";\n}\n\n.icon-Unmissable::before {\n content: \"\\eb51\";\n}\n\n.icon-upload::before {\n content: \"\\eb52\";\n}\n\n.icon-USB::before {\n content: \"\\eb53\";\n}\n\n.icon-usb-key::before {\n content: \"\\eb54\";\n}\n\n.icon-Value::before {\n content: \"\\eb55\";\n}\n\n.icon-vehicle::before {\n content: \"\\eb56\";\n}\n\n.icon-video::before {\n content: \"\\eb57\";\n}\n\n.icon-video-file::before {\n content: \"\\eb58\";\n}\n\n.icon-video-phone::before {\n content: \"\\eb59\";\n}\n\n.icon-video-meeting2::before {\n content: \"\\eb5a\";\n}\n\n.icon-Vinyl::before {\n content: \"\\eb5b\";\n}\n\n.icon-vip-contact::before {\n content: \"\\eb5c\";\n}\n\n.icon-virtual-gamepad::before {\n content: \"\\eb5d\";\n}\n\n.icon-visual-voicemail::before {\n content: \"\\eb5e\";\n}\n\n.icon-vod-portrait::before {\n content: \"\\eb5f\";\n}\n\n.icon-volte::before {\n content: \"\\eb60\";\n}\n\n.icon-volume-high::before {\n content: \"\\eb61\";\n}\n\n.icon-volume-low::before {\n content: \"\\eb62\";\n}\n\n.icon-volume-mid::before {\n content: \"\\eb63\";\n}\n\n.icon-volume-none::before {\n content: \"\\eb64\";\n}\n\n.icon-vowifi::before {\n content: \"\\eb65\";\n}\n\n.icon-vvm-message-read-full::before {\n content: \"\\eb66\";\n}\n\n.icon-Warehouse::before {\n content: \"\\eb67\";\n}\n\n.icon-Warningimportant::before {\n content: \"\\eb68\";\n}\n\n.icon-Warning-important::before {\n content: \"\\eb69\";\n}\n\n.icon-web-cam::before {\n content: \"\\eb6a\";\n}\n\n.icon-web-fax-widget::before {\n content: \"\\eb6b\";\n}\n\n.icon-Wholesale-retail::before {\n content: \"\\eb6c\";\n}\n\n.icon-Widget::before {\n content: \"\\eb6d\";\n}\n\n.icon-widget-tour::before {\n content: \"\\eb6e\";\n}\n\n.icon-wifi::before {\n content: \"\\eb6f\";\n}\n\n.icon-wifi-0::before {\n content: \"\\eb70\";\n}\n\n.icon-wifi-1::before {\n content: \"\\eb71\";\n}\n\n.icon-wifi-2::before {\n content: \"\\eb72\";\n}\n\n.icon-wps-pairing::before {\n content: \"\\eb73\";\n}\n\n.icon-WPT::before {\n content: \"\\eb74\";\n}\n\n.icon-zoom-in::before {\n content: \"\\eb75\";\n}\n\n.icon-zoom-out::before {\n content: \"\\eb76\";\n}\n\n.icon-popout-tech::before {\n content: \"\\e634\";\n}\n\n.icon-frame-care::before {\n content: \"\\e640\";\n}\n\n.icon-frame-family::before {\n content: \"\\e637\";\n}\n\n.icon-frame-fun::before {\n content: \"\\e638\";\n}\n\n.icon-frame-home::before {\n content: \"\\e639\";\n}\n\n.icon-frame-money::before {\n content: \"\\e63a\";\n}\n\n.icon-frame-on-the-move::before {\n content: \"\\e63b\";\n}\n\n.icon-frame-tariff::before {\n content: \"\\e63c\";\n}\n\n.icon-frame-tech::before {\n content: \"\\e63d\";\n}\n\n.icon-frame-wellbeing::before {\n content: \"\\e63e\";\n}\n\n.icon-frame-work::before {\n content: \"\\e63f\";\n}\n\n.icon-popout-care::before {\n content: \"\\e62d\";\n}\n\n.icon-popout-family::before {\n content: \"\\e62e\";\n}\n\n.icon-popout-fun::before {\n content: \"\\e62f\";\n}\n\n.icon-popout-home::before {\n content: \"\\e630\";\n}\n\n.icon-popout-money::before {\n content: \"\\e631\";\n}\n\n.icon-popout-on-the-move::before {\n content: \"\\e632\";\n}\n\n.icon-popout-tariff::before {\n content: \"\\e633\";\n}\n\n.icon-popout-wellbeing::before {\n content: \"\\e635\";\n}\n\n.icon-popout-work::before {\n content: \"\\e636\";\n}\n\n.icon-frame-connectivity::before {\n content: \"\\eb78\";\n}\n\n.icon-frame-my-customers::before {\n content: \"\\eb79\";\n}\n\n.icon-frame-performance::before {\n content: \"\\eb7a\";\n}\n\n.icon-frame-security::before {\n content: \"\\eb7b\";\n}\n\n.icon-frame-teamwork::before {\n content: \"\\eb7c\";\n}\n\n.icon-popout-connectivity::before {\n content: \"\\eb7d\";\n}\n\n.icon-popout-my-customers::before {\n content: \"\\eb7e\";\n}\n\n.icon-popout-performance::before {\n content: \"\\eb7f\";\n}\n\n.icon-popout-security::before {\n content: \"\\eb80\";\n}\n\n.icon-popout-teamwork::before {\n content: \"\\eb81\";\n}\n\n.svg-delete,\n.svg-checkbox-tick,\n.svg-warning-circle,\n.svg-menu,\n.svg-tick,\n.svg-success,\n.svg-warning,\n.svg-info,\n.svg-error,\n.svg-arrow-previous,\n.svg-arrow-next,\n.svg-settings,\n.svg-search,\n.svg-avatar,\n.svg-buy {\n position: relative;\n}\n\n.svg-delete::after,\n.svg-checkbox-tick::after,\n.svg-warning-circle::after,\n.svg-menu::after,\n.svg-tick::after,\n.svg-arrow-previous::after,\n.svg-arrow-next::after,\n.svg-settings::after,\n.svg-search::after,\n.svg-avatar::after,\n.svg-buy::after,\n.svg-success::after,\n.svg-warning::after,\n.svg-info::after,\n.svg-error::after {\n position: absolute;\n top: 0;\n left: 0;\n width: 1.25rem;\n height: 1.25rem;\n content: \"\";\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.svg-delete::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-checkbox-tick::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-warning-circle::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='%23527edb'/%3E%3C/svg%3E\");\n}\n\n.svg-menu::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-menu:hover::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-tick::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='%2332c832'/%3E%3C/svg%3E\");\n}\n\n.svg-success::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%2332c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-warning::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='%23fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\");\n}\n\n.svg-error::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='%23cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-info::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='%23527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-previous::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-previous:hover::after,\n.svg-arrow-previous:focus::after,\n.svg-arrow-previous:active::after {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next.btn-primary::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-arrow-next.btn-primary:active::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='%23000'/%3E%3C/svg%3E\");\n}\n\n.svg-settings::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-settings:hover::after,\n.svg-settings:focus::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.svg-search::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-search:hover::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.svg-avatar::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23fff'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-avatar:hover::after,\n.svg-avatar:active::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='%23f16e00'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.svg-buy::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.svg-buy:hover::after,\n.svg-buy:active::after {\n background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='%23f16e00'/%3E%3C/svg%3E\");\n}\n\n.btn-mail {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail:hover, .btn-mail:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-mail {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n.btn-mail-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail-inverse:hover, .btn-mail-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-mail-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-mail-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-lin {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-lin:hover, .btn-lin:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n}\n\n.btn-lin:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-lin {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-lin-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-lin-inverse:hover, .btn-lin-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n}\n\n.btn-lin-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-lin-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-gplus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus:hover, .btn-gplus:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-gplus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-gplus-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus-inverse:hover, .btn-gplus-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-gplus-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-gplus-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-tw {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw:hover, .btn-tw:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-tw {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-tw-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw-inverse:hover, .btn-tw-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-tw-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-tw-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-fbk {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk:hover, .btn-fbk:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-fbk {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n.btn-fbk-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk-inverse:hover, .btn-fbk-inverse:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n}\n\n.btn-fbk-inverse:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n}\n\n@media screen and (-ms-high-contrast: active) {\n .btn-fbk-inverse {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n/*# sourceMappingURL=orangeIcons.css.map */","@mixin svg-delete($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M343.625 211.5c-4.875 1.125-12 4.125-15.875 6.5-8.5 5.25-102 98.25-108.625 108-8.875 13.25-12.25 31.5-8.625 46.875C215 392.25 209.625 386.25 334.125 511l114 114-114 114.125c-113.375 113.375-114 114-118.5 123.625-5.375 11.75-6.875 18.75-6.25 30.625.5 12.125 4.375 23.375 11.375 33.5 4.125 5.875 100.25 101 105.5 104.375 13.75 8.875 33.25 11.875 48.875 7.625 17.625-4.75 14.875-2.25 136.375-123.625L625 801.875l114 114C848.875 1025.625 853.5 1030 862.25 1034.25c20.625 9.75 45.25 8.375 62.125-3.625 7.75-5.5 100.75-98.125 105.75-105.25 9.25-13.375 13.125-33.375 9.25-48.625-4.875-19.5.625-13.375-123.5-137.75l-114-114L915.75 510.875c80.75-80.75 114.875-115.75 117.25-120.125 11.5-21.125 10.25-46.75-3.125-66.375-3.875-5.75-98.625-100.625-104.25-104.5-11.125-7.5-24.5-11.25-37.875-10.5-11.875.5-21.125 3.375-30.25 9-4.5 2.875-46.125 43.625-119.625 117L625 448.125l-114-114C386.375 209.75 392.25 215 373 210.5c-10-2.25-17.625-2-29.375 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-previous($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M15 3l-3-3L0 12l12 12 3-3-9-9' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-checkbox-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath d='M7.5 12.5L3.75 8.75l-2.5 2.5L7.5 17.5 20 5l-2.5-2.5-10 10z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning-circle($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M593.75 94.125c-.375.25-6.25.875-13.125 1.375-6.875.375-13.875 1-15.625 1.25s-5.875.875-9.375 1.375c-10.75 1.375-29.75 4.375-35 5.625-2.75.625-9.25 2.125-14.375 3.25-70.625 15.625-147.25 51.625-204.375 96.125C256.625 238.375 219.625 277 188 322.5c-35 50.125-62.375 109.375-77.875 168.75-4.75 18.375-10.75 48.625-12.5 63.125-.75 6.125-1.625 13.5-2 16.25-3.25 26.5-3.25 85.375 0 111.5 5.625 45.75 12 74.5 24.875 113.5 10.75 32.25 28.25 71.25 43.25 96.375 2.75 4.75 5.5 9.375 6 10.125 3.875 6.625 14.75 23.125 21.875 33.125 64.125 90 156.75 159.375 260.375 194.875 27.125 9.25 70.5 19.875 94.875 23.125 3.5.5 7.375 1 8.75 1.25 1.25.25 6.125.875 10.625 1.25 4.5.5 9.875 1.125 11.875 1.375 9.5 1.375 81 1.25 95.625-.25 33.625-3.375 49.25-6 79.375-13.375 134.75-32.875 252.375-118.625 325.75-237.25 45.25-73.125 72.75-158.375 78.25-243.125 1.625-25.5.875-77.375-1.5-92.125-.25-1.5-1.375-10.25-2.5-19.125-10.25-79.75-43.75-164.25-92.125-232.75-7-10-10-13.875-22.625-29.75-16.125-20.125-44-48.75-66.125-67.75-68.875-59.125-152-99.625-241.625-117.75-6.875-1.375-14.75-2.875-17.375-3.25s-6-.875-7.5-1.25c-1.5-.25-5.375-.875-8.875-1.25-3.375-.375-8.5-1-11.25-1.375s-7.25-.875-10-1.25c-6.75-.75-81.125-2-81.875-1.375zM647 278.75c14.875 4.875 28.25 15 36 27.375 7.625 12.125 13 33.125 12.5 49.5-.125 8.25-1.75 36.25-2.375 43.125-.125 2.375-.75 9.375-1.125 15.625-.875 11.75-1.625 22.375-2.625 35-.375 4.125-.875 11.75-1.25 16.875-1.5 21.75-2 27.125-2.5 32.5-.25 3.125-.875 9.875-1.25 15-1.25 16.875-1.75 23-3 37.5-.75 7.875-1.625 18.875-2 24.375s-.875 12.5-1.25 15.625c-.25 3.125-.875 9-1.25 13.125s-.875 10-1.25 13.125c-.25 3.125-.875 10.125-1.25 15.625s-1 12.25-1.25 15c-.375 2.75-.875 8.375-1.25 12.5-1.625 17.75-2.5 26.75-4.375 42.5-.75 6.125-1.625 14-2 17.5-1.25 11.375-3 17.25-6.75 22.25-7.125 9.75-16.75 14.125-31.875 14.5-16.625.375-27.5-4.5-34.875-15.5-3.5-5.125-4.5-8.25-5.625-17.5-.875-6.25-1.75-12.625-2-14.375s-1.125-9.875-1.875-18.125c-1.25-14.25-2-21.625-3.125-30-.25-2.125-.875-8.25-1.25-13.75s-1-12.25-1.25-15c-1-9.125-1.75-18.625-2.5-28.75-.375-5.5-1-11.75-1.25-13.75-.25-2.125-.875-9.375-1.25-16.25-.5-6.875-1.125-13.875-1.25-15.625-.25-1.75-.75-8.25-1.25-14.375-.375-6.25-1-13-1.25-15-.25-2.125-.875-8.875-1.25-15-.375-6.25-1-13.75-1.25-16.875-.5-5.25-1.25-15.25-2.5-31.25-.25-3.75-.875-11.375-1.25-16.875-.875-11.625-1.625-21.625-2.5-33.125-.25-4.5-.875-12.375-1.25-17.5-.25-5.125-.875-14.125-1.375-20-3.125-39.875 2.375-64 18.625-81.625C593.25 277.875 622 270.5 647 278.75zm.625 563.375c23.375 8 41.875 28.5 46.625 51.625 2.75 13.625 1.125 30.875-3.875 43.125-7.125 17-24.375 32-43.5 37.75-11.25 3.375-33.5 3-44.375-.75-15.125-5.25-29.625-16.125-36.875-27.625C554 927.875 552.5 898 562.125 878c9.25-19.125 27.625-33.5 48.5-38 8.25-1.875 29.125-.625 37 2.125z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-menu($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M130.5 251.25c-13.375 2.625-26 13-32.25 26.125-3.375 7.375-3.875 9.5-3.875 19.5 0 10.25.375 12 4.125 19.625 5.25 10.625 12.375 17.75 22.75 22.75l8.125 3.875h991.25l8.125-3.875c10.25-5 18.125-12.75 22.75-22.5 11.125-23.75 1.25-50.75-22.75-62.25l-8.125-3.875-492.5-.125c-270.875-.125-494.875.25-497.625.75zM128.625 564.25c-13 3.5-23.5 12.25-30.125 25.125-3.625 6.75-4 8.625-4 19.375-.125 10.75.25 12.625 3.75 20 4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-4c9.125-4.5 11.25-6.125 17.625-14.125 6.75-8.375 9.25-16.25 9.25-28.75 0-9.25-.5-11.625-3.875-18.75-4.875-10.375-12.625-18.125-23-23l-8.125-3.875-493.125-.25c-388-.125-494.375.125-498.875 1.375zM128.125 876.75c-13.875 4.375-23.625 12.875-29.875 25.75-3.375 7.25-3.875 9.375-3.875 19.375s.5 12.125 3.875 19.375c4.875 10.25 12.625 18 23 23l8.125 3.875h991.25l8.125-3.875c10.375-4.875 18.125-12.625 23-23 3.5-7.25 3.875-9.375 3.875-19.375s-.375-12.125-3.875-19.375c-4.875-10.25-12.625-18-23-23l-8.125-3.875-493.75-.25c-396.625-.125-494.75.125-498.75 1.375z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-tick($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M993.75 221.125c-10.5 2.875-15.75 5.25-24 10.5-8.5 5.5-6.375 3.625-48.125 44.25-19.625 19.125-40 38.875-45.25 44C859 336.75 789.875 404 764.5 428.75c-13.625 13.375-27.875 27.125-31.375 30.625-3.625 3.375-24.125 23.5-45.75 44.5-21.625 21.125-42.625 41.5-46.75 45.5s-18.25 17.75-31.375 30.5C542 645.5 502.875 683.625 497.625 688.625c-3.125 3-8.625 8.25-12 11.625l-6.375 6-10.125-11.5c-5.625-6.375-11.5-13-13.125-14.75-2.5-2.625-89.875-100.125-122.75-136.875C321.5 530 321.375 530 313 524.375c-25.5-16.875-59-17.25-86-1-8.5 5.125-47.125 43-55.375 54.25-17.75 24.5-20.125 57.875-6 84.75 2.75 5.125 21.125 29.375 45.125 59.625 70.625 88.75 138.75 174.375 173 217.375C402 962.25 418.25 982.75 420 985c19.25 25.5 31.125 35.375 50.625 41.875 28.5 9.625 60.25 2.25 81.5-19 3.25-3.25 10.625-11.875 16.25-19.125s13.75-17.375 17.875-22.5 10.125-12.75 13.375-16.875c35.875-45.25 62.125-78.125 69.125-86.875 4.75-5.875 21.125-26.375 36.375-45.625 26-32.625 59-74.25 96.125-120.75 8.625-10.875 22.75-28.625 31.375-39.5s33.375-42 55-69.125 46-57.875 54.25-68.125c29.125-36.75 64.125-80.625 99.25-124.75 40.125-50.25 42.25-53.25 46.75-64.75 15.375-38.625-1.5-83.125-38.5-102.25-16.375-8.375-38.875-11-55.625-6.5z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-arrow-next($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 24'%3E%3Cpath d='M3 0L0 3l9 9-9 9 3 3 12-12' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-settings($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M470.625 118.75c-20.125 4.25-46 13.875-72.5 26.875-42.875 21.125-57.375 39.125-52 64.375.75 3.625 4.25 13.75 7.875 22.375 8.25 20.375 11 31 11.125 42.625.125 19.875-10 39.75-30.875 60.5-21.125 21.125-40.375 30.75-61.125 30.75-11.25 0-20.75-2.375-36.25-8.75-29.375-12.375-40.625-13.875-53.625-7.625-13.125 6.375-27.5 25.125-40.75 53-18.5 39-27.5 69.375-27 91.625.5 22 8.625 31.375 38.125 43.625C176 547.5 182.75 551.5 192.375 560.5c15.125 14.375 21.375 33.5 21.5 64.75 0 22.5-2.25 34.625-9.5 49.125-8.75 17.625-21.75 27.375-52.5 39.375-28.75 11.375-38.25 24.25-36.5 49.75 2.625 36.5 31.75 104.625 54.75 128 8.25 8.25 16.875 12.625 26.375 13.25 9.25.75 15.125-.875 37.25-9.75 10-4 19.875-7.625 21.875-8 2.125-.375 5.125-1.125 6.875-1.5 3.875-.75 18.25-.75 22.375.125 16.125 3.125 33.125 13.75 50.5 31.25 19.75 20 29.375 39.125 29.75 58.625.125 13.25-2.5 23-14 50.125-4.75 11.375-5.25 13.5-5.375 23.75-.125 9.5.375 12.25 3 17.375 8 16.25 31.625 32.5 71.875 49.25 57 23.75 88.5 24.875 104.125 3.625 5.25-7 6.125-8.875 14.5-28.875 12.125-29 23.375-41.125 45.25-49.125 21.75-7.875 59.875-7.5 81.375.625 21.375 8.125 32 20.5 45.375 52.75 10.625 25.5 17 33.125 31.75 37.75 20.125 6.25 56.125-2.5 104.125-25.25 28-13.25 46.625-27.625 52.875-40.625 6.125-12.625 4.875-24-5.25-48.125-9.25-22.125-10.375-26.625-10.375-42.5.125-12.875.375-15.25 3.625-23.125 11.75-28.625 45.25-59.5 72.375-66.5 16.25-4.125 27.875-2.25 58.375 9.875 18.25 7.25 20 7.75 30 7.75 8.875.125 11.625-.375 16.875-3 13.375-6.625 26.875-24.25 40-51.75 17.625-36.75 26.875-66.125 27.625-87.25.625-17.375-3.5-28.125-13.75-36.25-6.5-5.125-8-6-30.75-15.75-28.625-12.25-37.25-20.25-48.875-45.375-2.625-5.875-5.125-24.375-5.125-38.625-.125-41.875 12.375-65.625 41.75-79.75 4.375-2.125 13.5-6.125 20.375-9 27.375-11.5 35-20.375 36.5-41.75 1.375-20.875-11-61.625-29.875-98.75-17.25-33.75-32.875-49.25-51.25-50.5-9.125-.75-15.25.875-34.75 8.75-20.5 8.375-30.875 11-42.5 11-20.75 0-39.75-9.875-61.75-32-14.375-14.375-23.25-28.375-27.5-43-2.125-7.25-2.875-21.875-1.375-28.125 2-8.5 5.75-19.375 10.375-30.625 7.375-17.375 9.375-25.375 8.75-34.25-.625-9.75-4.5-17.75-12.75-26.25-10-10.25-18.5-15.75-42.625-27.5-43.875-21.5-80.625-31.25-101.25-27-17.75 3.625-24.375 11.25-37.5 43.125-5.25 12.75-10.125 21.875-15.5 28.5-13.5 17-36.5 25.875-67.625 26.125-39.25.25-63-10.5-77.375-35-2.75-4.625-7.875-15.375-11.375-24-3.625-8.625-8.5-18.625-10.875-22.25-11-16.375-28.125-21.125-56-15.25zm200 261.75c40.375 7.625 78.25 25 110.625 50.75 12 9.625 32.875 30.625 41.375 41.875 27 35.375 44.125 76.5 50.375 121.25 2.25 16 1.75 55.75-.875 70.75C862.375 720.25 838.5 766.5 800.375 804c-40 39.5-87.125 62.375-144.75 70.375-11.875 1.625-52.875 1.75-60.625.25-1.75-.375-7.375-1.375-12.5-2.125-29.75-4.75-61.625-16.875-90-34.5-9.5-5.875-26.625-18.25-30.75-22.25-.75-.75-4.125-4-7.5-7.125-20.125-18.625-40-45.25-52.25-69.5-18.125-36.5-26.75-72.25-26.75-112.25.125-56.375 17.875-109 52.125-153.75 8-10.625 29-32 40.125-41 35.625-28.75 79.875-47.75 125.625-53.875 21.5-2.875 55.625-1.875 77.5 2.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-search($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M491.125 125.5c-.25.25-5.25.75-11.125 1.25-26.5 2-59.875 9-87.625 18.25-108.5 36.125-195.875 118.125-239 224.375-18.25 45.125-27 88.875-27.75 140-.625 39.5 2.5 66.875 11.375 102.25 19.75 78.625 64.375 149.75 127.375 203 39.25 33.25 87.125 59.25 136.875 74.5 21.25 6.5 47.75 12.125 65.625 14 4.125.5 8.875 1.125 10.625 1.5 8.125 1.5 59.25 1.375 75.125-.25 66-6.625 125.875-27.875 179-63.375l11-7.375 143 143c90 90 144.75 143.875 147.75 145.375 6.875 3.375 20.625 3.125 27.25-.375 5.75-3 56.875-53.75 60.875-60.375s4.25-19 .5-27c-2.375-5-28.875-32.125-145.625-148.875l-142.75-142.75 7.375-11c33-49.375 55.5-109.875 62.125-167.25.375-3.5 1.25-10.5 1.875-15.625 1.125-9.875.625-64.625-.625-73.125-.375-2.75-1.625-10.875-2.625-18.125-17.375-124-98.125-234.625-212.625-291.75-37.875-18.875-83.25-32.75-123.5-37.625-3.375-.375-8.25-1-10.625-1.375-4.875-.75-63.125-1.875-63.875-1.25zm58.25 126.375c61.25 9.25 112 34.25 153.75 76.125 42.125 42.25 67.625 94 76.25 154.5 1.375 10.125 1.75 51.625.5 61.875-5.5 44.625-19.625 82.75-44 119.375-42.5 63.875-114.125 107.5-190 115.875-11.625 1.25-50.125 1.25-61.5-.125-30.125-3.375-67.875-15.375-94.375-29.875C312.25 707 259.75 629 251.5 543.75c-1.625-17-.875-52.25 1.375-66.875 13.5-87.75 66.5-160.25 145.625-199.375 29.625-14.625 59.5-23.125 94-26.625 6.375-.625 51 .125 56.875 1z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-avatar($color:\"#000\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M603.75 94.5c-85.75 9-156.625 61.625-188.375 139.875-7.25 17.625-12 34.75-13.75 49.375-.375 3.125-1.125 8.125-1.625 11.25-1.125 6-.75 46 .625 54.375C405.25 380 417.75 414.25 433.25 438.5c13.625 21.125 33 42.625 52.375 57.75 63.625 49.875 151 61.25 225.625 29.625 74.5-31.625 126.5-100.75 135.875-180.875 1.75-14.875 1-48.375-1.375-62.375-6.375-36.875-20.75-70.625-42.5-99.5-9-11.75-30.75-34-41.375-42.125-32.25-24.5-70.375-40.25-109.125-45.375-11.125-1.375-39.75-2.125-49-1.125z' fill='#{$color}'/%3E%3Cpath d='M418.125 532.75c-22.75 14.25-41.75 29.125-58 45.875-43.375 44.75-70.125 100.5-78.25 163.875-1.375 10.5-1.625 42.375-1.375 160.625.25 135.875.375 148.125 2.375 155.625C286.25 1071 290 1081.125 294 1088.625c18.625 34.5 48 56.625 86 65 11.875 2.5 13 2.5 299.75 2.625h287.875l-.5-205.25c-.125-113-.75-206.75-1.125-208.5-.5-1.75-1.5-7.375-2.25-12.5-6.5-44.25-27.75-92.5-57.125-129.625-16.25-20.625-39-42-60.125-56.375-12.75-8.75-23.625-15.25-25.375-15.25-.625 0-3.375 2-6 4.375-31.75 29.375-76.5 53.125-121.125 64.25-25.125 6.375-39.625 8.125-67.125 8.125-33.875.125-53.25-2.25-81.125-10-26.875-7.5-61.75-23.625-81.375-37.375-12-8.5-23.75-17.625-29.75-23.125-3.75-3.375-7.625-6.25-8.5-6.125-1 0-4.5 1.75-8 3.875z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-buy($color:\"#fff\") {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250'%3E%3Cpath d='M608.625 139.375c-.25.25-4.5.875-9.25 1.25C580.5 142.5 550.25 152 531.25 162.25c-53.625 28.75-92.375 81.75-103 140.875-3 17-3.125 20.375-3.125 102.75L425 482.5H280.25c-157.875 0-151.125-.25-166.5 7.125-4 1.875-10.375 6.875-15.125 11.5-13.375 13.375-19.75 30.25-18.125 48 1 10.75 2.625 16.625 8 27.75 2.375 4.75 9.875 21.125 16.75 36.25s13.625 30 15 33.125c1.5 3.125 5.5 12.125 9.125 20s8 17.5 9.75 21.25 29.875 65.875 62.75 138.125c32.75 72.125 61 134.375 62.75 138.125 1.625 3.75 14.375 31.625 28.125 61.875s26.375 58.125 28.125 61.875 4.5 9.875 6.125 13.5l3 6.5 290.75-.25 290.875-.375 10.375-22.5c14.5-31.375 16.5-35.875 28-60.625 5.625-12 11.375-24.375 12.75-27.5s8.25-17.75 15-32.5c14.25-30.5 16.5-35.5 27-58.125 8.375-18.5 12.75-27.75 20.25-43.75 2.875-6.25 6.625-14.125 8.125-17.5 3.625-8 8.25-18.125 18.75-40.625 7.5-16.25 49.5-106.875 58.125-125.625 1.875-4.125 7.25-15.625 11.875-25.625 11.75-25.375 14.375-30.875 23.125-50 4.25-9.25 10.125-21.75 13.125-27.625 7.75-15.25 9.875-23.375 9-34.25-1.875-24.125-17.375-44.375-41.75-54.125l-8.5-3.375-146.5-.375-146.625-.25-.125-77.25c0-42.375-.25-78.875-.375-80.875-1.625-18.875-5.625-37-12.25-54.875-28.875-78.125-102.875-129.875-186.75-130.5-8.375-.125-15.375.125-15.625.375zm42.5 96.875C688 246.5 716 274.125 726.5 310.75c2.75 9.75 2.75 11.25 3.25 90.75l.375 81h-211.5l.5-80.375c.125-44.125.75-82 1.25-84C528.625 285 544 263.75 571.75 247c6.875-4.125 17.875-8.875 23.875-10.375 20.125-4.75 39.25-4.875 55.5-.375zM424.25 610.875c.375 2 1.875 11.125 3.25 20.375 4.625 31.25 8.75 58 10.625 70 1.125 6.5 2.75 17.25 3.75 23.75s2.625 17.5 3.75 24.375c1 6.875 1.875 12.875 1.875 13.375 0 .625-38 1-84.5 1h-84.375l-5.375-11.625c-3-6.25-8.875-18.75-13.125-27.625-4.125-8.75-7.625-16.125-7.625-16.375 0-.125-4.375-9.5-9.875-20.75-5.375-11.25-11-23.25-12.5-26.5S224 647.75 219.75 639c-4.125-8.75-9.125-19.375-11.125-23.75l-3.5-7.75H423.5l.75 3.375zM730 608.5c0 .5-.875 7.75-1.875 15.875-2.75 20.875-2.75 21.625-5 41.25-2 17.25-2.625 22.625-3.75 30-.25 2-.875 6.25-1.125 9.375-1.125 9.625-5.875 49.25-6.375 52.5-.25 1.75-.5 3.875-.5 4.625-.125 1.25-17.875 1.625-84.5 1.625-46.375 0-84.375-.375-84.5-1 0-.5-.25-2.25-.625-4-1.75-10.25-6.875-42-8-49.375-.625-4.875-1.5-10.125-1.875-11.875-.25-1.625-.875-5.25-1.25-8.125-.5-2.75-2.625-16.875-5-31.25-2.375-14.5-4.875-30.25-5.625-35-.75-4.875-1.625-10.25-2-12.25l-.75-3.375h106.375c58.5 0 106.375.5 106.375 1zm305.875.5c-.375.875-6.625 15.375-14 32.25s-19.125 44.125-26.25 60.625-16 37-19.75 45.625l-6.75 15.625-85.875.375-85.75.25.625-2.75c.25-1.625 4-30.5 8.125-64.125 4.25-33.75 7.875-62.625 8.125-64.375s.875-6.75 1.375-11.25 1.125-8.5 1.25-9.125c.125-.5.25-1.75.375-2.75.125-1.625 13.25-1.875 109.625-1.875 87.125 0 109.375.375 108.875 1.5zM463 862.75c.75 4.75 2.5 15.625 8.375 54.125.75 4.75 1.75 11.875 2.375 15.625s3.375 21.75 6.125 40 5.375 35 5.875 37.125l.875 4.125h-94.25l-6.625-14.125C382 992 375 977.125 370 966.875c-5-10.375-11.75-24.375-15-31.25s-9.625-20.125-14.125-29.375c-4.375-9.25-11.25-23.625-15.25-31.875-3.875-8.25-7.375-15.375-7.75-16-.25-.5 32.125-.875 71.875-.875h72.375l.875 5.25zm235.25-1.875c-.375 2-2.5 14.5-4.625 27.875s-4.625 29.125-5.5 35c-6.5 40.375-8.25 51.375-10.5 66.875-1.5 9.625-3 18.75-3.375 20.375l-.5 2.75H574l-.75-3.5c-.375-1.875-1-5.625-1.375-8.375s-1-6.375-1.25-8.125c-.375-1.75-.875-4.875-1.125-6.875-.375-2.125-2-12.5-3.75-23.125s-4.625-28.625-6.375-40c-1.875-11.375-3.5-22-3.875-23.75-.25-1.75-1.125-6.75-1.75-11.25s-2-12.875-3.125-18.75c-1-5.875-1.875-11-1.875-11.625 0-.5 33.75-.875 75.125-.875H699l-.75 3.375zm224.375 11.875c-7.125 14.875-13.125 27.5-30.75 64.125-4.625 9.625-11.125 23.125-14.375 30s-9.625 20.25-14.125 29.625l-8.25 17.25h-47c-36.625 0-46.875-.375-46.875-1.625 0-.75.875-6.125 1.75-11.75 1-5.625 2.25-12.625 2.625-15.625 1.75-11.75 13.125-82 14.25-87.875.75-3.5 2.125-12.125 3.25-19.375 1-7.25 2.25-14.625 2.625-16.625l.75-3.375h143.375l-7.25 15.25z' fill='#{$color}'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-success() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.982 125 62.5 125c34.517 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#32c832'/%3E%3Cpath d='M96.437 35.294c0-3.248-2.62-5.882-5.851-5.882a5.813 5.813 0 0 0-4.002 1.592v-.001L51.968 64.706 40.563 52.004l-.001.002a5.81 5.81 0 0 0-3.808-1.418 5.814 5.814 0 0 0-4.136 1.724l-2.341 2.352a5.881 5.881 0 0 0-1.714 4.16c0 1.39.481 2.667 1.284 3.674h-.001l18.723 23.53.002-.001a5.828 5.828 0 0 0 9.136 0v.001l37.447-47.059v-.001a5.88 5.88 0 0 0 1.283-3.674' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-warning() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.7 101.504l.001-.002-54.767-93.75-.003.002C81.218 3.117 76.183 0 70.416 0 64.65 0 59.615 3.117 56.901 7.754l-.001-.002-54.634 93.52c-.002.003-.003.007-.006.01l-.129.22.001.002A15.527 15.527 0 0 0 0 109.375C0 118.005 7.006 125 15.647 125h109.538c8.642 0 15.649-6.995 15.649-15.625 0-2.871-.78-5.559-2.134-7.871' fill='#fc0' /%3E%3Cpath d='M62.68 37.562l2.624 43.12c.002 2.913 2.364 4.007 5.28 4.007 2.913 0 5.275-1.094 5.277-4.007l2.617-43.02a7.917 7.917 0 0 0-7.895-8.494 7.917 7.917 0 0 0-7.902 8.394M70.583 92.5a7.918 7.918 0 1 0-.001 15.836 7.918 7.918 0 0 0 .001-15.836' /%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-error() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 140 125' %3E%3Cpath d='M138.426 101.502h.003L83.767 7.752C81.056 3.116 76.033 0 70.276 0 64.522 0 59.5 3.116 56.79 7.752h-.002l-54.525 93.52-.006.01-.129.22h.002c-1.35 2.313-2.129 5-2.129 7.873C0 118.004 6.994 125 15.617 125H124.94c8.623 0 15.616-6.996 15.616-15.625 0-2.873-.778-5.56-2.129-7.873' fill='#cd3c14'/%3E%3Cpath d='M94.435 99.68a6.41 6.41 0 0 1-4.543 1.882 6.407 6.407 0 0 1-4.542-1.882L70.278 84.601 55.206 99.68a6.404 6.404 0 0 1-4.541 1.882 6.405 6.405 0 0 1-4.543-1.882 6.43 6.43 0 0 1 .001-9.089l15.07-15.079-14.535-14.54a6.426 6.426 0 1 1 9.086-9.09L70.28 66.423 84.815 51.88a6.423 6.423 0 0 1 9.083 0 6.43 6.43 0 0 1 0 9.09L79.363 75.512l15.072 15.08a6.429 6.429 0 0 1 0 9.088' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin svg-info() {\n &::after {\n background-image: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1250' height='1250' viewBox='0 0 125 125' %3E%3Cpath d='M62.5 0C27.983 0 0 27.982 0 62.5 0 97.017 27.983 125 62.5 125c34.518 0 62.5-27.982 62.5-62.5C125 27.983 97.018 0 62.5 0' fill='#527edb' /%3E%3Cpath d='M80.127 99.133c-2.491-.15-4.013-.702-4.798-1.64-.556-.665-1.8-2.46-1.8-7.228V44.118H47.794v3.823l.754.045c2.45.15 4.09.703 4.879 1.642.556.667 1.221 2.463 1.221 7.227v33.41c0 5.009-.644 6.498-1.022 6.935-1.067 1.208-2.767 1.858-5.054 1.931l-.778.025v3.785h33.088v-3.763l-.755-.045zM62.499 36.765c6.092 0 11.03-4.939 11.03-11.03 0-6.091-4.938-11.03-11.03-11.03-6.09 0-11.028 4.939-11.028 11.03 0 6.091 4.937 11.03 11.028 11.03' fill='#fff'/%3E%3C/svg%3E\"), \"#\", \"%23\");\n }\n}\n\n@mixin btn-mail() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.61113 0.555546C3.71434 0.555546 0.555573 3.71432 0.555573 7.6111C0.555573 11.5079 3.71434 14.6667 7.61113 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.6111C14.6667 3.71432 11.5079 0.555546 7.61113 0.555546ZM7.61113 1.2611C11.1124 1.2611 13.9611 4.10943 13.9611 7.6111C13.9611 11.1128 11.1124 13.9611 7.61113 13.9611C4.10981 13.9611 1.26113 11.1128 1.26113 7.6111C1.26113 4.10943 4.10981 1.2611 7.61113 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.39392 8.51524H8.39216C8.1879 8.71809 7.91132 8.82357 7.60617 8.82357C7.30101 8.82357 7.02444 8.71809 6.81983 8.51524H6.81418L4.74479 6.51146V5.74805C5.57381 6.5672 7.08194 8.03017 7.08194 8.03017H7.08229C7.21741 8.17128 7.40085 8.23126 7.6037 8.23126C7.81854 8.23126 8.01186 8.14482 8.14839 7.99489H8.14909L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08333V9.59086C4.08333 10.0216 4.43223 10.3673 4.86261 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.61113 15C3.71434 15 0.555573 11.8412 0.555573 7.94444C0.555573 4.04766 3.71434 0.888889 7.61113 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.39392 8.84859H8.39216C8.1879 9.05143 7.91132 9.15691 7.60617 9.15691C7.30101 9.15691 7.02444 9.05143 6.81983 8.84859H6.81418L4.74479 6.84481V6.0814C5.57381 6.90055 7.08194 8.36352 7.08194 8.36352H7.08229C7.21741 8.50463 7.40085 8.5646 7.6037 8.5646C7.81854 8.5646 8.01186 8.47817 8.14839 8.32824H8.14909L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08333V9.9242C4.08333 10.3549 4.43223 10.7007 4.86261 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='white'/%3E%3C/svg%3E\");\n }\n}\n\n@mixin btn-mail-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.6111 0.555561C3.71431 0.555561 0.555542 3.71433 0.555542 7.61112C0.555542 11.5079 3.71431 14.6667 7.6111 14.6667C11.5079 14.6667 14.6667 11.5079 14.6667 7.61112C14.6667 3.71433 11.5079 0.555561 7.6111 0.555561ZM7.6111 1.26112C11.1124 1.26112 13.9611 4.10944 13.9611 7.61112C13.9611 11.1128 11.1124 13.9611 7.6111 13.9611C4.10978 13.9611 1.2611 11.1128 1.2611 7.61112C1.2611 4.10944 4.10978 1.26112 7.6111 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.51005L8.3939 8.51524H8.39214C8.18788 8.71809 7.9113 8.82357 7.60615 8.82357C7.301 8.82357 7.02442 8.71809 6.81981 8.51524H6.81417L4.74477 6.51146V5.74805C5.5738 6.5672 7.08192 8.03017 7.08192 8.03017H7.08228C7.21739 8.17128 7.40084 8.23126 7.60368 8.23126C7.81852 8.23126 8.01185 8.14482 8.14837 7.99489H8.14908L10.4774 5.73747V6.51005ZM10.3582 4.85517H4.08331V9.59086C4.08331 10.0216 4.43221 10.3673 4.8626 10.3673H11.1389V5.61611C11.1389 5.18572 10.7889 4.85517 10.3582 4.85517' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.77777C14.6667 11.6746 11.5079 14.8333 7.61113 14.8333C3.71434 14.8333 0.555573 11.6746 0.555573 7.77777C0.555573 3.88099 3.71434 0.722218 7.61113 0.722218C11.5079 0.722218 14.6667 3.88099 14.6667 7.77777Z' fill='%23F16E00'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.67672L8.39392 8.68191H8.39216C8.1879 8.88476 7.91132 8.99024 7.60617 8.99024C7.30101 8.99024 7.02444 8.88476 6.81983 8.68191H6.81418L4.74479 6.67814V5.91472C5.57381 6.73387 7.08194 8.19684 7.08194 8.19684H7.08229C7.21741 8.33796 7.40085 8.39793 7.6037 8.39793C7.81854 8.39793 8.01186 8.3115 8.14839 8.16157H8.14909L10.4774 5.90414V6.67672ZM10.3582 5.02184H4.08333V9.75753C4.08333 10.1883 4.43223 10.534 4.86261 10.534H11.1389V5.78279C11.1389 5.3524 10.7889 5.02184 10.3582 5.02184' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.6667 7.94444C14.6667 11.8412 11.5079 15 7.6111 15C3.71431 15 0.555542 11.8412 0.555542 7.94444C0.555542 4.04766 3.71431 0.888889 7.6111 0.888889C11.5079 0.888889 14.6667 4.04766 14.6667 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.4774 6.8434L8.3939 8.84859H8.39214C8.18788 9.05143 7.9113 9.15691 7.60615 9.15691C7.301 9.15691 7.02442 9.05143 6.81981 8.84859H6.81417L4.74477 6.84481V6.0814C5.5738 6.90055 7.08192 8.36352 7.08192 8.36352H7.08228C7.21739 8.50463 7.40084 8.5646 7.60368 8.5646C7.81852 8.5646 8.01185 8.47817 8.14837 8.32824H8.14908L10.4774 6.07081V6.8434ZM10.3582 5.18852H4.08331V9.9242C4.08331 10.3549 4.43221 10.7007 4.8626 10.7007H11.1389V5.94946C11.1389 5.51907 10.7889 5.18852 10.3582 5.18852' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.0863C8.92942 6.0863 8.50009 6.43767 8.3244 6.77104H8.30641V6.19178H7.04382V10.4332H8.35933V8.33526C8.35933 7.7821 8.46375 7.24588 9.14885 7.24588C9.823 7.24588 9.83253 7.87876 9.83253 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56936 6.0863ZM5.56004 4.08323C5.13812 4.08323 4.79733 4.42578 4.79733 4.84734C4.79733 5.26962 5.13812 5.61181 5.56004 5.61181C5.9809 5.61181 6.32274 5.26962 6.32274 4.84734C6.32274 4.42578 5.9809 4.08323 5.56004 4.08323V4.08323ZM4.90176 10.4332H6.21832V6.19178H4.90176V10.4332Z' fill='black'/%3E%3Cpath d='M7.97224 0.555546C4.07546 0.555546 0.916687 3.71432 0.916687 7.6111C0.916687 11.5079 4.07546 14.6667 7.97224 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.6111C15.0278 3.71432 11.869 0.555546 7.97224 0.555546ZM7.97224 1.2611C11.4736 1.2611 14.3222 4.10943 14.3222 7.6111C14.3222 11.1128 11.4736 13.9611 7.97224 13.9611C4.47092 13.9611 1.62224 11.1128 1.62224 7.6111C1.62224 4.10943 4.47092 1.2611 7.97224 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-lin-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.0863C8.92939 6.0863 8.50006 6.43767 8.32437 6.77104H8.30638V6.19178H7.04379V10.4332H8.3593V8.33526C8.3593 7.7821 8.46372 7.24588 9.14882 7.24588C9.82297 7.24588 9.8325 7.87876 9.8325 8.37089V10.4332H11.1473V8.10701C11.1473 6.96436 10.9011 6.0863 9.56933 6.0863ZM5.56001 4.08288C5.13809 4.08288 4.7973 4.42578 4.7973 4.84734C4.7973 5.26962 5.13809 5.61181 5.56001 5.61181C5.98087 5.61181 6.32271 5.26962 6.32271 4.84734C6.32271 4.42578 5.98087 4.08288 5.56001 4.08288V4.08288ZM4.90172 10.4332H6.21829V6.19178H4.90172V10.4332Z' fill='white'/%3E%3Cpath d='M7.97221 0.555561C4.07543 0.555561 0.916656 3.71433 0.916656 7.61112C0.916656 11.5079 4.07543 14.6667 7.97221 14.6667C11.869 14.6667 15.0278 11.5079 15.0278 7.61112C15.0278 3.71433 11.869 0.555561 7.97221 0.555561ZM7.97221 1.26112C11.4735 1.26112 14.3222 4.10944 14.3222 7.61112C14.3222 11.1128 11.4735 13.9611 7.97221 13.9611C4.47089 13.9611 1.62221 11.1128 1.62221 7.61112C1.62221 4.10944 4.47089 1.26112 7.97221 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.77777C15.0278 11.6746 11.869 14.8333 7.97224 14.8333C4.07546 14.8333 0.916687 11.6746 0.916687 7.77777C0.916687 3.88099 4.07546 0.722218 7.97224 0.722218C11.869 0.722218 15.0278 3.88099 15.0278 7.77777Z' fill='%230077B5'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.25297C8.92942 6.25297 8.50009 6.60469 8.3244 6.93806H8.30641V6.3588H7.04382V10.6003H8.35933V8.50193C8.35933 7.94877 8.46375 7.4129 9.14885 7.4129C9.823 7.4129 9.83253 8.04543 9.83253 8.53791V10.6003H11.1473V8.27403C11.1473 7.13139 10.9011 6.25297 9.56936 6.25297ZM5.56004 4.2499C5.13812 4.2499 4.79733 4.59244 4.79733 5.01401C4.79733 5.43664 5.13812 5.77884 5.56004 5.77884C5.9809 5.77884 6.32274 5.43664 6.32274 5.01401C6.32274 4.59244 5.9809 4.2499 5.56004 4.2499V4.2499ZM4.90176 10.6003H6.21832V6.3588H4.90176V10.6003Z' fill='white'/%3E%3C/svg%3E \");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97221 15C4.07543 15 0.916656 11.8412 0.916656 7.94444C0.916656 4.04766 4.07543 0.888889 7.97221 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56933 6.41964C8.92939 6.41964 8.50006 6.77136 8.32437 7.10474H8.30638V6.52548H7.04379V10.7669H8.3593V8.6686C8.3593 8.11544 8.46372 7.57957 9.14882 7.57957C9.82297 7.57957 9.8325 8.21211 9.8325 8.70458V10.7669H11.1473V8.44071C11.1473 7.29771 10.9011 6.41964 9.56933 6.41964ZM4.90172 10.7669H6.21829V6.52548H4.90172V10.7669V10.7669ZM5.56001 4.41657C5.13809 4.41657 4.7973 4.75912 4.7973 5.18069C4.7973 5.60331 5.13809 5.94551 5.56001 5.94551C5.98087 5.94551 6.32271 5.60331 6.32271 5.18069C6.32271 4.75912 5.98087 4.41657 5.56001 4.41657' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.0278 7.94444C15.0278 11.8412 11.869 15 7.97224 15C4.07546 15 0.916687 11.8412 0.916687 7.94444C0.916687 4.04766 4.07546 0.888889 7.97224 0.888889C11.869 0.888889 15.0278 4.04766 15.0278 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.56936 6.41964C8.92942 6.41964 8.50009 6.77136 8.3244 7.10474H8.30641V6.52548H7.04382V10.7669H8.35933V8.6686C8.35933 8.11544 8.46375 7.57957 9.14885 7.57957C9.823 7.57957 9.83253 8.21211 9.83253 8.70458V10.7669H11.1473V8.44071C11.1473 7.29806 10.9011 6.41964 9.56936 6.41964ZM4.90176 10.7669H6.21832V6.52548H4.90176V10.7669V10.7669ZM5.56004 4.41657C5.13812 4.41657 4.79733 4.75912 4.79733 5.18069C4.79733 5.60331 5.13812 5.94551 5.56004 5.94551C5.9809 5.94551 6.32274 5.60331 6.32274 5.18069C6.32274 4.75912 5.9809 4.41657 5.56004 4.41657' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.2263V6.45654H10.0273V7.2263H9.25786V7.99606H10.0273V8.76547H10.797V7.99606H11.5668V7.2263H10.797ZM5.79394 7.2263V8.14987H7.32147C7.26044 8.54604 6.86003 9.31227 5.79394 9.31227C4.87425 9.31227 4.12389 8.55027 4.12389 7.61118C4.12389 6.67209 4.87425 5.91009 5.79394 5.91009C6.31746 5.91009 6.66777 6.13304 6.86744 6.32566L7.5991 5.62116C7.12956 5.18266 6.52137 4.91702 5.79394 4.91702C4.30451 4.91702 3.10013 6.12175 3.10013 7.61118C3.10013 9.10025 4.30451 10.3053 5.79394 10.3053C7.34898 10.3053 8.3798 9.21209 8.3798 7.67292C8.3798 7.49582 8.3611 7.36106 8.33782 7.2263H5.79394V7.2263Z' fill='black'/%3E%3Cpath d='M7.33334 0.555546C3.43656 0.555546 0.277786 3.71432 0.277786 7.6111C0.277786 11.5079 3.43656 14.6667 7.33334 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.6111C14.3889 3.71432 11.2301 0.555546 7.33334 0.555546ZM7.33334 1.2611C10.8347 1.2611 13.6833 4.10943 13.6833 7.6111C13.6833 11.1128 10.8347 13.9611 7.33334 13.9611C3.83202 13.9611 0.983342 11.1128 0.983342 7.6111C0.983342 4.10943 3.83202 1.2611 7.33334 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.55964V6.78988H10.0273V7.55964H9.25786V8.3294H10.0273V9.09881H10.797V8.3294H11.5668V7.55964H10.797ZM5.79394 7.55964V8.48322H7.32147C7.26044 8.87938 6.86003 9.64562 5.79394 9.64562C4.87425 9.64562 4.12389 8.88362 4.12389 7.94452C4.12389 7.00543 4.87425 6.24343 5.79394 6.24343C6.31746 6.24343 6.66777 6.46638 6.86744 6.659L7.5991 5.9545C7.12956 5.516 6.52137 5.25036 5.79394 5.25036C4.30451 5.25036 3.10013 6.4551 3.10013 7.94452C3.10013 9.4336 4.30451 10.6387 5.79394 10.6387C7.34898 10.6387 8.3798 9.54543 8.3798 8.00626C8.3798 7.82917 8.3611 7.6944 8.33782 7.55964H5.79394V7.55964Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-gplus-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.22631V6.45655H10.0273V7.22631H9.2579V7.99608H10.0273V8.76548H10.7971V7.99608H11.5668V7.22631H10.7971ZM5.79397 7.22631V8.14989H7.3215C7.26047 8.54606 6.86006 9.31229 5.79397 9.31229C4.87428 9.31229 4.12392 8.55029 4.12392 7.6112C4.12392 6.6721 4.87428 5.9101 5.79397 5.9101C6.31749 5.9101 6.6678 6.13306 6.86747 6.32567L7.59913 5.62118C7.12959 5.18267 6.5214 4.91703 5.79397 4.91703C4.30454 4.91703 3.10016 6.12177 3.10016 7.6112C3.10016 9.10027 4.30454 10.3054 5.79397 10.3054C7.34901 10.3054 8.37983 9.2121 8.37983 7.67293C8.37983 7.49584 8.36113 7.36108 8.33785 7.22631H5.79397V7.22631Z' fill='white'/%3E%3Cpath d='M7.33333 0.555561C3.43654 0.555561 0.277771 3.71433 0.277771 7.61112C0.277771 11.5079 3.43654 14.6667 7.33333 14.6667C11.2301 14.6667 14.3889 11.5079 14.3889 7.61112C14.3889 3.71433 11.2301 0.555561 7.33333 0.555561ZM7.33333 1.26112C10.8346 1.26112 13.6833 4.10944 13.6833 7.61112C13.6833 11.1128 10.8346 13.9611 7.33333 13.9611C3.83201 13.9611 0.983327 11.1128 0.983327 7.61112C0.983327 4.10944 3.83201 1.26112 7.33333 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.77777C14.3889 11.6746 11.2301 14.8333 7.33333 14.8333C3.43654 14.8333 0.277771 11.6746 0.277771 7.77777C0.277771 3.88099 3.43654 0.722218 7.33333 0.722218C11.2301 0.722218 14.3889 3.88099 14.3889 7.77777Z' fill='%23DD4B39'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.797 7.39297V6.62321H10.0273V7.39297H9.25786V8.16273H10.0273V8.93214H10.797V8.16273H11.5668V7.39297H10.797ZM5.79394 7.39297V8.31654H7.32147C7.26044 8.71271 6.86003 9.47895 5.79394 9.47895C4.87425 9.47895 4.12389 8.71695 4.12389 7.77785C4.12389 6.83876 4.87425 6.07676 5.79394 6.07676C6.31746 6.07676 6.66777 6.29971 6.86744 6.49233L7.5991 5.78783C7.12956 5.34933 6.52137 5.08369 5.79394 5.08369C4.30451 5.08369 3.10013 6.28842 3.10013 7.77785C3.10013 9.26693 4.30451 10.472 5.79394 10.472C7.34898 10.472 8.3798 9.37876 8.3798 7.83959C8.3798 7.66249 8.3611 7.52773 8.33782 7.39297H5.79394V7.39297Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.3889 7.94444C14.3889 11.8412 11.2301 15 7.33333 15C3.43654 15 0.277771 11.8412 0.277771 7.94444C0.277771 4.04766 3.43654 0.888889 7.33333 0.888889C11.2301 0.888889 14.3889 4.04766 14.3889 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.7971 7.55964V6.78988H10.0273V7.55964H9.2579V8.3294H10.0273V9.09881H10.7971V8.3294H11.5668V7.55964H10.7971ZM5.79397 7.55964V8.48322H7.3215C7.26047 8.87938 6.86006 9.64562 5.79397 9.64562C4.87428 9.64562 4.12392 8.88362 4.12392 7.94452C4.12392 7.00543 4.87428 6.24343 5.79397 6.24343C6.31749 6.24343 6.6678 6.46638 6.86747 6.659L7.59913 5.9545C7.12959 5.516 6.5214 5.25036 5.79397 5.25036C4.30454 5.25036 3.10016 6.4551 3.10016 7.94452C3.10016 9.4336 4.30454 10.6387 5.79397 10.6387C7.34901 10.6387 8.37983 9.54543 8.37983 8.00626C8.37983 7.82917 8.36113 7.6944 8.33785 7.55964H5.79397V7.55964Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45722C10.8319 5.57011 10.5642 5.64702 10.283 5.68159C10.5698 5.5052 10.7903 5.2258 10.894 4.89278C10.6255 5.05611 10.3282 5.17465 10.0117 5.23885C9.75806 4.96192 9.39717 4.78871 8.99747 4.78871C8.22983 4.78871 7.60753 5.42688 7.60753 6.21393C7.60753 6.32541 7.61988 6.43442 7.64351 6.53849C6.48852 6.47887 5.46476 5.9116 4.77931 5.04976C4.65972 5.26002 4.59128 5.50485 4.59128 5.7659C4.59128 6.26014 4.83646 6.69688 5.20935 6.95194C4.98145 6.94488 4.76767 6.88068 4.57999 6.77379C4.57964 6.77979 4.57964 6.78578 4.57964 6.79178C4.57964 7.48217 5.05906 8.05825 5.69442 8.18913C5.57765 8.22159 5.45523 8.23887 5.32823 8.23887C5.23863 8.23887 5.15184 8.2297 5.06682 8.21312C5.24392 8.77968 5.75686 9.19173 6.3654 9.20302C5.8895 9.58507 5.29048 9.81332 4.63926 9.81332C4.52707 9.81332 4.4163 9.80627 4.308 9.79321C4.92289 10.1975 5.65314 10.4332 6.43807 10.4332C8.99395 10.4332 10.3917 8.26216 10.3917 6.37903C10.3917 6.31729 10.3902 6.25591 10.3878 6.19453C10.6594 5.9938 10.8951 5.74297 11.081 5.45722' fill='black'/%3E%3Cpath d='M7.69444 0.555546C3.79766 0.555546 0.638885 3.71432 0.638885 7.6111C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.6111C14.75 3.71432 11.5912 0.555546 7.69444 0.555546ZM7.69444 1.2611C11.1958 1.2611 14.0444 4.10943 14.0444 7.6111C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.6111C1.34444 4.10943 4.19312 1.2611 7.69444 1.2611Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5642 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3282 5.50799 10.0117 5.57219C9.75806 5.29526 9.39717 5.12205 8.99747 5.12205C8.22983 5.12205 7.60753 5.76023 7.60753 6.54727C7.60753 6.65875 7.61988 6.76776 7.64351 6.87183C6.48852 6.81221 5.46476 6.24494 4.77931 5.38311C4.65972 5.59336 4.59128 5.83819 4.59128 6.09925C4.59128 6.59349 4.83646 7.03023 5.20935 7.28528C4.98145 7.27823 4.76767 7.21402 4.57999 7.10713C4.57964 7.11313 4.57964 7.11913 4.57964 7.12512C4.57964 7.81551 5.05906 8.39159 5.69442 8.52248C5.57765 8.55493 5.45523 8.57222 5.32823 8.57222C5.23863 8.57222 5.15184 8.56304 5.06682 8.54646C5.24392 9.11303 5.75686 9.52507 6.3654 9.53636C5.8895 9.91842 5.29048 10.1467 4.63926 10.1467C4.52707 10.1467 4.4163 10.1396 4.308 10.1266C4.92289 10.5308 5.65314 10.7665 6.43807 10.7665C8.99395 10.7665 10.3917 8.5955 10.3917 6.71237C10.3917 6.65064 10.3902 6.58925 10.3878 6.52787C10.6594 6.32714 10.8951 6.07631 11.081 5.79056' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-tw-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.45724C10.8319 5.57013 10.5641 5.64703 10.283 5.6816C10.5698 5.50521 10.7903 5.22581 10.894 4.89279C10.6255 5.05613 10.3281 5.17466 10.0117 5.23887C9.75805 4.96194 9.39716 4.78872 8.99746 4.78872C8.22981 4.78872 7.60751 5.4269 7.60751 6.21394C7.60751 6.32542 7.61986 6.43443 7.6435 6.5385C6.4885 6.47888 5.46474 5.91161 4.77929 5.04978C4.6597 5.26003 4.59126 5.50486 4.59126 5.76592C4.59126 6.26016 4.83644 6.6969 5.20933 6.95196C4.98144 6.9449 4.76765 6.88069 4.57998 6.7738C4.57962 6.7798 4.57962 6.7858 4.57962 6.79179C4.57962 7.48218 5.05905 8.05827 5.6944 8.18915C5.57763 8.2216 5.45522 8.23889 5.32822 8.23889C5.23861 8.23889 5.15183 8.22972 5.06681 8.21314C5.2439 8.7797 5.75684 9.19174 6.36538 9.20303C5.88949 9.58509 5.29047 9.81334 4.63924 9.81334C4.52706 9.81334 4.41629 9.80628 4.30798 9.79323C4.92288 10.1975 5.65312 10.4332 6.43806 10.4332C8.99393 10.4332 10.3916 8.26217 10.3916 6.37869C10.3916 6.31731 10.3902 6.25593 10.3878 6.19489C10.6594 5.99381 10.895 5.74299 11.081 5.45724Z' fill='white'/%3E%3Cpath d='M7.69444 0.555561C3.79766 0.555561 0.638885 3.71433 0.638885 7.61112C0.638885 11.5079 3.79766 14.6667 7.69444 14.6667C11.5912 14.6667 14.75 11.5079 14.75 7.61112C14.75 3.71433 11.5912 0.555561 7.69444 0.555561ZM7.69444 1.26112C11.1958 1.26112 14.0444 4.10944 14.0444 7.61112C14.0444 11.1128 11.1958 13.9611 7.69444 13.9611C4.19312 13.9611 1.34444 11.1128 1.34444 7.61112C1.34444 4.10944 4.19312 1.26112 7.69444 1.26112Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.77777C14.75 11.6746 11.5912 14.8333 7.69444 14.8333C3.79766 14.8333 0.638885 11.6746 0.638885 7.77777C0.638885 3.88099 3.79766 0.722218 7.69444 0.722218C11.5912 0.722218 14.75 3.88099 14.75 7.77777Z' fill='%2355ACEE'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.62389C10.8319 5.73678 10.5642 5.81369 10.283 5.84826C10.5698 5.67187 10.7903 5.39247 10.894 5.05945C10.6255 5.22278 10.3282 5.34132 10.0117 5.40552C9.75806 5.12859 9.39717 4.95538 8.99747 4.95538C8.22983 4.95538 7.60753 5.59355 7.60753 6.3806C7.60753 6.49208 7.61988 6.60109 7.64351 6.70516C6.48852 6.64554 5.46476 6.07827 4.77931 5.21643C4.65972 5.42669 4.59128 5.67152 4.59128 5.93257C4.59128 6.42681 4.83646 6.86355 5.20935 7.11861C4.98145 7.11156 4.76767 7.04735 4.57999 6.94046C4.57964 6.94646 4.57964 6.95245 4.57964 6.95845C4.57964 7.64884 5.05906 8.22492 5.69442 8.3558C5.57765 8.38826 5.45523 8.40555 5.32823 8.40555C5.23863 8.40555 5.15184 8.39637 5.06682 8.37979C5.24392 8.94635 5.75686 9.3584 6.3654 9.36969C5.8895 9.75175 5.29048 9.97999 4.63926 9.97999C4.52707 9.97999 4.4163 9.97294 4.308 9.95988C4.92289 10.3642 5.65314 10.5998 6.43807 10.5998C8.99395 10.5998 10.3917 8.42883 10.3917 6.5457C10.3917 6.48396 10.3902 6.42258 10.3878 6.3612C10.6594 6.16047 10.8951 5.90964 11.081 5.62389' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.75 7.94444C14.75 11.8412 11.5912 15 7.69444 15C3.79766 15 0.638885 11.8412 0.638885 7.94444C0.638885 4.04766 3.79766 0.888889 7.69444 0.888889C11.5912 0.888889 14.75 4.04766 14.75 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.081 5.79056C10.8319 5.90345 10.5641 5.98036 10.283 6.01493C10.5698 5.83854 10.7903 5.55914 10.894 5.22612C10.6255 5.38946 10.3281 5.50799 10.0117 5.57219C9.75805 5.29526 9.39716 5.12205 8.99746 5.12205C8.22981 5.12205 7.60751 5.76023 7.60751 6.54727C7.60751 6.65875 7.61986 6.76776 7.6435 6.87183C6.4885 6.81221 5.46474 6.24494 4.77929 5.38311C4.6597 5.59336 4.59126 5.83819 4.59126 6.09925C4.59126 6.59349 4.83644 7.03023 5.20933 7.28528C4.98144 7.27823 4.76765 7.21402 4.57998 7.10713C4.57962 7.11313 4.57962 7.11913 4.57962 7.12512C4.57962 7.81551 5.05905 8.39159 5.6944 8.52248C5.57763 8.55493 5.45522 8.57222 5.32822 8.57222C5.23861 8.57222 5.15183 8.56304 5.06681 8.54646C5.2439 9.11303 5.75684 9.52507 6.36538 9.53636C5.88949 9.91842 5.29047 10.1467 4.63924 10.1467C4.52706 10.1467 4.41629 10.1396 4.30798 10.1266C4.92288 10.5308 5.65312 10.7665 6.43806 10.7665C8.99393 10.7665 10.3916 8.5955 10.3916 6.71202C10.3916 6.65064 10.3902 6.58925 10.3878 6.52822C10.6594 6.32714 10.895 6.07631 11.081 5.79056Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555546C3.15877 0.555546 0 3.71432 0 7.6111C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.6111C14.1111 3.71432 10.9523 0.555546 7.05556 0.555546ZM7.05556 1.2611C10.5569 1.2611 13.4056 4.10943 13.4056 7.6111C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.6111C0.705556 4.10943 3.55424 1.2611 7.05556 1.2611Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.49031H8.64314V4.48066C8.54366 4.4669 8.20181 4.43621 7.80459 4.43621C6.9745 4.43621 6.40653 4.9622 6.40653 5.92811V6.76101H5.46814V7.88955H6.40653V10.7862H7.52907V7.88955H8.46499L8.60504 6.76101H7.52907V6.04029C7.52907 5.71326 7.61656 5.49031 8.06741 5.49031Z' fill='black'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='black'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.82365H8.64314V4.814C8.54366 4.80024 8.20181 4.76955 7.80459 4.76955C6.9745 4.76955 6.40653 5.29554 6.40653 6.26145V7.09436H5.46814V8.22289H6.40653V11.1196H7.52907V8.22289H8.46499L8.60504 7.09436H7.52907V6.37363C7.52907 6.04661 7.61656 5.82365 8.06741 5.82365Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n}\n\n@mixin btn-fbk-inverse() {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.05556 0.555561C3.15877 0.555561 0 3.71433 0 7.61112C0 11.5079 3.15877 14.6667 7.05556 14.6667C10.9523 14.6667 14.1111 11.5079 14.1111 7.61112C14.1111 3.71433 10.9523 0.555561 7.05556 0.555561ZM7.05556 1.26112C10.5569 1.26112 13.4056 4.10944 13.4056 7.61112C13.4056 11.1128 10.5569 13.9611 7.05556 13.9611C3.55424 13.9611 0.705556 11.1128 0.705556 7.61112C0.705556 4.10944 3.55424 1.26112 7.05556 1.26112Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.49032H8.64311V4.48067C8.54363 4.46692 8.20178 4.43622 7.80456 4.43622C6.97447 4.43622 6.4065 4.96222 6.4065 5.92812V6.76103H5.46811V7.88957H6.4065V10.7862H7.52904V7.88957H8.46496L8.60501 6.76103H7.52904V6.04031C7.52904 5.71328 7.61653 5.49032 8.06738 5.49032Z' fill='white'/%3E%3C/svg%3E%0A\");\n &:hover,\n &:focus {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.77777C14.1111 11.6746 10.9523 14.8333 7.05556 14.8333C3.15877 14.8333 0 11.6746 0 7.77777C0 3.88099 3.15877 0.722218 7.05556 0.722218C10.9523 0.722218 14.1111 3.88099 14.1111 7.77777Z' fill='%233B5998'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06741 5.65698H8.64314V4.64733C8.54366 4.63357 8.20181 4.60288 7.80459 4.60288C6.9745 4.60288 6.40653 5.12887 6.40653 6.09478V6.92769H5.46814V8.05622H6.40653V10.9529H7.52907V8.05622H8.46499L8.60504 6.92769H7.52907V6.20696C7.52907 5.87994 7.61656 5.65698 8.06741 5.65698Z' fill='white'/%3E%3C/svg%3E%0A\");\n }\n &:active {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n @media screen and (-ms-high-contrast: active) {\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.1111 7.94444C14.1111 11.8412 10.9523 15 7.05556 15C3.15877 15 0 11.8412 0 7.94444C0 4.04766 3.15877 0.888889 7.05556 0.888889C10.9523 0.888889 14.1111 4.04766 14.1111 7.94444Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.06738 5.82365H8.64311V4.814C8.54363 4.80024 8.20178 4.76955 7.80456 4.76955C6.97447 4.76955 6.4065 5.29554 6.4065 6.26145V7.09436H5.46811V8.22289H6.4065V11.1196H7.52904V8.22289H8.46496L8.60501 7.09436H7.52904V6.37363C7.52904 6.04661 7.61653 5.82365 8.06738 5.82365Z' fill='black'/%3E%3C/svg%3E%0A\");\n }\n}\n\n"]} \ No newline at end of file
diff --git a/dashboard/public/favicon.ico b/dashboard/public/favicon.ico
new file mode 100644
index 00000000..7f6945a4
--- /dev/null
+++ b/dashboard/public/favicon.ico
Binary files differ
diff --git a/dashboard/public/fonts/FontAwesome.otf b/dashboard/public/fonts/FontAwesome.otf
new file mode 100644
index 00000000..401ec0f3
--- /dev/null
+++ b/dashboard/public/fonts/FontAwesome.otf
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue55_W1G.eot b/dashboard/public/fonts/HelvNeue55_W1G.eot
new file mode 100644
index 00000000..818d20ed
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue55_W1G.eot
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue55_W1G.svg b/dashboard/public/fonts/HelvNeue55_W1G.svg
new file mode 100644
index 00000000..28057cef
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue55_W1G.svg
@@ -0,0 +1,653 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" >
+<metadata>
+<version>1.0</version>
+<id><![CDATA[Helvetica Neue LT W07 55 Roman]]></id>
+<vendor>Monotype Imaging Inc.</vendor>
+<credits>
+<name>Fonts.com WebFonts</name>
+<URL>http://webfonts.fonts.com</URL>
+<role>Home of the Web fonts</role>
+</credits>
+<license>
+<URL>http://webfonts.fonts.com/Legal</URL>
+</license>
+<copyright><![CDATA[Copyright © 2014 Monotype Imaging Inc. All rights reserved.]]></copyright>
+<trademark><![CDATA[Neue Helvetica is a trademark of Monotype Imaging Inc. registered in the U.S. Patent and Trademark Office and may be registered in certain other jurisdictions.]]></trademark>
+<licensee>
+<name></name>
+</licensee>
+</metadata>
+<defs >
+<font horiz-adv-x="550" id="1e3b77a5-0007-4628-a07a-8f18c2302daa">
+<font-face font-family="Helvetica Neue LT W07 55 Roman" panose-1="2 11 6 4 2 2 2 2 2 4" ascent="973" descent="-248" units-per-em="1000" alphabetic="0">
+</font-face>
+<missing-glyph horiz-adv-x="512" d="M512 718V0H0V718H512ZM462 50V667H50V50H462ZM259 609Q313 609 348 573T383 478Q383 446 372 421T319 357Q285 326 278 311Q271 294 271 234H225L223 253Q223 304 236 332T286 395Q332 436 332 474Q332 508 309 533T256 559Q186 559 174 464L124 472Q138 609 259 609ZM222 184H278V117H222V184Z" />
+
+<glyph unicode="&#xA;" />
+<glyph unicode="&#xD;" horiz-adv-x="278" />
+<glyph unicode=" " horiz-adv-x="278" />
+<glyph unicode="!" horiz-adv-x="259" d="M177 714V494L152 183H107L82 494V714H177ZM185 111V0H74V111H185Z" />
+<glyph unicode="&quot;" horiz-adv-x="426" d="M177 714V456H109V714H177ZM317 714V456H249V714H317Z" />
+<glyph unicode="#" horiz-adv-x="556" d="M269 697L240 492H364L394 697H462L433 492H522V424H424L403 274H494V206H393L364 0H295L324 206H200L171 0H102L131 206H34V274H141L162 424H60V492H171L201 697H269ZM210 274H334L355 424H231L210 274Z" />
+<glyph unicode="$" horiz-adv-x="556" d="M251 797H306V730Q459 713 503 532H418Q397 631 306 648V402L369 385Q440 364 482 316T525 200Q525 108 467 51T307 -17V-99H251V-17Q148 -6 91 54T25 218H110Q113 153 149 114T251 63V328Q134 356 90 397T46 521Q46 604 101 662T251 731V797ZM136 530Q136 485 161 460T251 417V651Q198 646 167 615T136 530ZM306 63Q435 73 435 191Q435 235 410 262T306 314V63Z" />
+<glyph unicode="%" horiz-adv-x="1000" d="M811 722L274 -22H188L726 722H811ZM254 709Q414 709 414 509Q414 417 373 363T254 308Q174 308 133 359T92 506Q92 603 133 656T254 709ZM167 507Q167 363 251 363Q339 363 339 509Q339 654 253 654Q167 654 167 507ZM748 389Q908 389 908 189Q908 96 864 42T748 -12Q670 -12 628 38T586 186Q586 283 627 336T748 389ZM661 188Q661 43 745 43Q833 43 833 189Q833 334 748 334Q661 334 661 188Z" />
+<glyph unicode="&amp;" horiz-adv-x="630" d="M282 714Q358 714 406 673T455 568Q455 459 321 383L450 226Q469 282 473 337H554Q549 283 541 251T506 161L645 0H534L458 88Q427 41 372 15T255 -12Q144 -12 89 44T33 184Q33 251 72 301T200 399L167 444Q121 506 121 567Q121 632 167 673T282 714ZM206 563Q206 539 220 513T275 439Q330 474 350 502T370 563Q370 594 348 616T288 639Q256 639 231 618T206 563ZM123 185Q123 136 162 100T259 63Q355 63 411 148L247 345Q177 306 150 271T123 185Z" />
+<glyph unicode="&apos;" horiz-adv-x="278" d="M173 714V456H105V714H173Z" />
+<glyph unicode="(" horiz-adv-x="259" d="M269 731Q137 525 137 270Q137 141 167 30T269 -198H204Q121 -68 84 43T47 270Q47 388 87 508T204 731H269Z" />
+<glyph unicode=")" horiz-adv-x="259" d="M55 731Q137 604 174 494T212 263Q212 142 171 24T55 -198H-10Q57 -92 89 19T122 263Q122 518 -10 731H55Z" />
+<glyph unicode="*" horiz-adv-x="352" d="M148 714H201V601L308 641L328 593L219 555L285 464L244 433L175 529L110 433L65 464L130 555L24 593L42 641L148 601V714Z" />
+<glyph unicode="+" horiz-adv-x="600" d="M334 506V287H552V219H334V0H266V219H48V287H266V506H334Z" />
+<glyph unicode="&#x2c;" horiz-adv-x="278" d="M194 111V4Q194 -52 168 -90T84 -147V-97Q111 -88 126 -63T142 -5V0H83V111H194Z" />
+<glyph unicode="-" horiz-adv-x="389" d="M339 318V238H50V318H339Z" />
+<glyph unicode="." horiz-adv-x="278" d="M194 111V0H83V111H194Z" />
+<glyph unicode="/" horiz-adv-x="333" d="M351 731L55 -17H-18L278 731H351Z" />
+<glyph unicode="0" horiz-adv-x="556" d="M278 709Q394 709 454 632T514 348Q514 141 454 65T278 -12Q159 -12 101 68T42 348Q42 551 101 630T278 709ZM132 349Q132 188 167 126T278 63Q356 63 390 128T424 346Q424 458 409 516T361 604T277 634Q210 634 171 577T132 349Z" />
+<glyph unicode="1" horiz-adv-x="556" d="M356 709V0H271V508H87V576H90Q180 576 229 608T291 709H356Z" />
+<glyph unicode="2" horiz-adv-x="556" d="M272 709Q373 709 433 652T494 505Q494 432 453 373T279 237Q203 193 168 157T123 75H487V0H24Q31 92 69 156T213 284Q317 346 360 391T404 505Q404 559 366 596T267 634Q204 634 167 587T129 465V458H44L43 476Q43 581 104 645T272 709Z" />
+<glyph unicode="3" horiz-adv-x="556" d="M264 709Q366 709 422 659T479 520Q479 476 454 439T381 378V376Q444 362 476 317T509 204Q509 108 442 49T266 -12Q157 -12 94 48T29 216V219H115Q118 144 158 104T266 63Q312 63 347 82T400 132T419 200Q419 263 378 299T265 336Q243 334 217 333V405Q231 404 249 404Q312 404 350 436T390 520Q390 572 357 602T264 634Q201 634 166 594T129 480H44Q50 592 107 650T264 709Z" />
+<glyph unicode="4" horiz-adv-x="556" d="M419 709V241H515V166H419V0H339V166H28V248L351 709H419ZM337 588L101 241H339V588H337Z" />
+<glyph unicode="5" horiz-adv-x="556" d="M470 697V622H184L146 418L148 416Q194 467 280 467Q386 467 447 402T509 225Q509 121 440 55T261 -12Q162 -12 100 45T35 190V191H120Q124 135 165 99T269 63Q337 63 378 109T419 231Q419 300 374 346T259 392Q184 392 127 325L54 329L120 697H470Z" />
+<glyph unicode="6" horiz-adv-x="556" d="M299 709Q387 709 439 662T499 528H414Q407 579 376 606T295 634Q129 634 123 365L125 363Q183 456 302 456Q399 456 459 391T519 227Q519 122 457 55T282 -12Q38 -12 38 330Q38 514 104 611T299 709ZM139 221Q139 151 179 107T286 63Q347 63 388 107T429 220Q429 294 391 337T285 381Q220 381 180 337T139 221Z" />
+<glyph unicode="7" horiz-adv-x="556" d="M509 697V624Q402 517 326 346T237 0H142Q154 166 224 323T422 617H50V697H509Z" />
+<glyph unicode="8" horiz-adv-x="556" d="M273 709Q374 709 431 660T488 528Q488 482 463 443T390 381Q516 341 516 204Q516 106 450 47T281 -12Q172 -12 106 46T40 204Q40 267 72 314T164 381Q117 401 91 440T65 528Q65 606 123 657T273 709ZM155 525Q155 474 188 443T281 411Q335 411 366 442T398 525Q398 577 367 605T278 634Q224 634 190 604T155 525ZM130 200Q130 137 172 100T281 63Q344 63 385 102T426 201Q426 255 384 295T279 336Q217 336 174 298T130 200Z" />
+<glyph unicode="9" horiz-adv-x="556" d="M267 709Q391 709 450 626T510 370Q510 173 449 81T264 -12Q172 -12 116 34T49 171H134Q141 119 176 91T264 63Q342 63 380 130T424 337L422 339Q397 293 354 267T257 241Q152 241 93 306T34 478Q34 579 99 644T267 709ZM124 466Q124 406 165 361T264 316Q324 316 366 360T409 472Q409 545 369 589T262 634Q197 634 161 589T124 466Z" />
+<glyph unicode=":" horiz-adv-x="278" d="M194 517V406H83V517H194ZM194 111V0H83V111H194Z" />
+<glyph unicode=";" horiz-adv-x="278" d="M194 517V406H83V517H194ZM194 111V-1Q194 -48 168 -89T84 -147V-97Q110 -88 126 -63T142 -5V0H83V111H194Z" />
+<glyph unicode="&lt;" horiz-adv-x="600" d="M554 446L129 253L554 60V-8L46 222V284L554 514V446Z" />
+<glyph unicode="=" horiz-adv-x="600" d="M552 388V320H48V388H552ZM552 186V118H48V186H552Z" />
+<glyph unicode="&gt;" horiz-adv-x="600" d="M46 514L554 284V222L46 -8V60L471 253L46 446V514Z" />
+<glyph unicode="?" horiz-adv-x="556" d="M278 731Q376 731 432 676T489 531Q489 481 468 441T396 354Q350 311 333 280T316 204V174H231V217Q231 267 251 304T319 386Q369 431 384 462T399 527Q399 585 368 620T278 656Q212 656 176 613T140 491H54V502Q54 600 115 665T278 731ZM328 111V0H217V111H328Z" />
+<glyph unicode="@" horiz-adv-x="800" d="M413 731Q558 731 655 642T753 423Q753 350 718 284T627 175T519 133Q491 133 474 150T455 198H452Q393 131 328 131Q265 131 225 177T185 290Q185 403 253 488T420 573Q500 573 532 491L555 554H618L535 272Q523 230 523 219Q523 188 547 188Q594 188 639 264T685 418Q685 531 604 603T414 676Q287 676 199 580T110 355Q110 223 201 131T419 38Q489 38 557 71T667 159H730Q681 75 596 29T417 -17Q314 -17 227 33T91 171T42 360Q42 510 149 620T413 731ZM260 296Q260 256 283 228T346 199Q405 199 453 269T501 412Q501 449 476 477T419 505Q355 505 308 436T260 296Z" />
+<glyph unicode="A" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322Z" />
+<glyph unicode="B" horiz-adv-x="685" d="M383 714Q515 714 562 660T610 539Q610 482 583 441T504 379V377Q570 363 605 317T640 205Q640 117 579 59T427 0H78V714H383ZM368 407Q440 407 477 433T515 521Q515 577 484 605T369 634H173V407H368ZM415 80Q473 80 509 114T545 208Q545 327 386 327H173V80H415Z" />
+<glyph unicode="C" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 130 587 57T373 -17Q221 -17 132 83T43 355Q43 522 134 626T381 731Z" />
+<glyph unicode="D" horiz-adv-x="704" d="M329 714Q491 714 578 629T666 374Q666 0 329 0H78V714H329ZM334 80Q447 80 509 153T571 361Q571 503 512 568T338 634H173V80H334Z" />
+<glyph unicode="E" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571Z" />
+<glyph unicode="F" horiz-adv-x="574" d="M547 714V634H173V407H501V327H173V0H78V714H547Z" />
+<glyph unicode="G" horiz-adv-x="759" d="M383 731Q510 731 591 671T690 494H595Q581 570 526 610T383 651Q272 651 205 569T138 348Q138 227 205 145T383 63Q482 63 547 124T612 285V296H384V376H697V0H637L612 89Q573 38 513 11T383 -17Q237 -17 140 87T43 343Q43 513 133 622T383 731Z" />
+<glyph unicode="H" horiz-adv-x="722" d="M173 714V407H549V714H644V0H549V327H173V0H78V714H173Z" />
+<glyph unicode="I" horiz-adv-x="259" d="M177 714V0H82V714H177Z" />
+<glyph unicode="J" horiz-adv-x="519" d="M441 714V175Q441 84 386 34T230 -17Q133 -17 78 34T22 210V235H117V211Q117 130 143 97T232 63Q346 63 346 188V714H441Z" />
+<glyph unicode="K" horiz-adv-x="667" d="M173 714V358L535 714H658L357 426L670 0H550L292 361L173 250V0H78V714H173Z" />
+<glyph unicode="L" horiz-adv-x="556" d="M173 714V80H551V0H78V714H173Z" />
+<glyph unicode="M" horiz-adv-x="871" d="M210 714L435 114L661 714H791V0H701V594H699L476 0H395L172 594H170V0H80V714H210Z" />
+<glyph unicode="N" horiz-adv-x="722" d="M178 714L554 135H556V714H646V0H542L169 573H167V0H77V714H178Z" />
+<glyph unicode="O" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357Z" />
+<glyph unicode="P" horiz-adv-x="648" d="M396 714Q493 714 551 661T610 503Q610 402 555 347T402 292H173V0H78V714H396ZM369 372Q437 372 476 404T515 503Q515 634 363 634H173V372H369Z" />
+<glyph unicode="Q" horiz-adv-x="760" d="M380 731Q534 731 628 628T722 357Q722 179 614 73L708 -2L660 -62L551 26Q480 -17 380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q431 63 479 83L400 146L450 204L545 128Q627 210 627 357Q627 486 561 568T379 651Q265 651 199 568T133 357Z" />
+<glyph unicode="R" horiz-adv-x="685" d="M418 714Q515 714 573 663T631 527Q631 381 507 346V344Q563 334 587 293T616 157Q618 94 627 59T656 0H550Q541 12 539 23T533 55L529 133Q527 202 502 253T408 305H173V0H78V714H418ZM376 385Q536 385 536 512Q536 570 504 602T413 634H173V385H376Z" />
+<glyph unicode="S" horiz-adv-x="648" d="M318 731Q439 731 510 671T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 492 185 464T383 402Q498 379 554 331T611 196Q611 96 529 40T332 -17Q197 -17 117 50T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 130 674T318 731Z" />
+<glyph unicode="T" horiz-adv-x="574" d="M573 714V634H335V0H240V634H2V714H573Z" />
+<glyph unicode="U" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169Z" />
+<glyph unicode="V" horiz-adv-x="611" d="M102 714L306 95H308L514 714H613L359 0H251L-1 714H102Z" />
+<glyph unicode="W" horiz-adv-x="926" d="M109 714L249 120H251L411 714H514L672 120H674L819 714H914L723 0H624L461 600H459L294 0H195L12 714H109Z" />
+<glyph unicode="X" horiz-adv-x="611" d="M127 714L305 435L491 714H597L361 367L612 0H496L304 295L106 0H-1L248 367L13 714H127Z" />
+<glyph unicode="Y" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115Z" />
+<glyph unicode="Z" horiz-adv-x="611" d="M578 714V634L135 80H590V0H22V80L466 634H56V714H578Z" />
+<glyph unicode="[" horiz-adv-x="259" d="M259 731V663H152V-130H259V-198H72V731H259Z" />
+<glyph unicode="\" horiz-adv-x="333" d="M55 731L351 -17H278L-18 731H55Z" />
+<glyph unicode="]" horiz-adv-x="259" d="M187 731V-198H0V-130H107V663H0V731H187Z" />
+<glyph unicode="^" horiz-adv-x="600" d="M332 697L550 264H480L299 624L121 264H50L268 697H332Z" />
+<glyph unicode="_" horiz-adv-x="500" d="M500 -75V-125H0V-75H500Z" />
+<glyph unicode="`" horiz-adv-x="222" d="M86 732L172 589H108L-23 732H86Z" />
+<glyph unicode="a" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139Z" />
+<glyph unicode="b" horiz-adv-x="593" d="M152 714V447H154Q195 529 319 529Q427 529 492 454T557 257Q557 136 493 62T321 -12Q273 -12 227 7T154 69H152V0H67V714H152ZM149 259Q149 169 191 116T312 63Q386 63 426 115T467 263Q467 348 424 401T306 454Q234 454 192 401T149 259Z" />
+<glyph unicode="c" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 92 434 40T278 -12Q166 -12 101 58T36 252Q36 380 101 454T280 529Z" />
+<glyph unicode="d" horiz-adv-x="593" d="M526 714V0H441V70H439Q419 30 376 9T274 -12Q167 -12 102 63T36 260Q36 382 99 455T271 529Q322 529 368 508T439 448H441V714H526ZM126 254Q126 169 170 116T286 63Q359 63 401 116T444 258Q444 346 402 400T280 454Q206 454 166 401T126 254Z" />
+<glyph unicode="e" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423Z" />
+<glyph unicode="f" horiz-adv-x="296" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H284V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722Z" />
+<glyph unicode="g" horiz-adv-x="574" d="M274 529Q380 529 429 443H430V517H510V39Q510 -210 271 -210Q174 -210 117 -169T56 -58H141Q143 -95 181 -118T275 -142Q430 -142 430 56V88H428Q408 45 365 20T267 -6Q162 -6 99 66T36 256Q36 378 99 453T274 529ZM126 266Q126 175 164 122T272 69Q342 69 384 124T426 269Q426 352 387 403T278 454Q206 454 166 403T126 266Z" />
+<glyph unicode="h" horiz-adv-x="556" d="M149 714V441H151Q169 483 214 506T314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q229 454 189 410T149 295V0H64V714H149Z" />
+<glyph unicode="i" horiz-adv-x="222" d="M154 714V610H69V714H154ZM154 517V0H69V517H154Z" />
+<glyph unicode="j" horiz-adv-x="222" d="M154 714V610H69V714H154ZM154 517V-69Q154 -132 123 -164T30 -198Q4 -198 -14 -194V-121Q-9 -123 14 -123Q31 -123 43 -119T62 -102T69 -56V517H154Z" />
+<glyph unicode="k" horiz-adv-x="519" d="M154 714V291L390 517H504L299 329L519 0H411L234 270L154 196V0H69V714H154Z" />
+<glyph unicode="l" horiz-adv-x="222" d="M154 714V0H69V714H154Z" />
+<glyph unicode="m" horiz-adv-x="853" d="M313 529Q426 529 455 441Q481 483 523 506T618 529Q706 529 747 490T789 382V0H704V343Q704 399 681 426T604 454Q544 454 507 419T469 325V0H384V343Q384 399 361 426T287 454Q250 454 220 437T170 386T149 324V0H64V517H144V441H146Q204 529 313 529Z" />
+<glyph unicode="n" horiz-adv-x="556" d="M314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q228 454 189 410T149 295V0H64V517H144V435H146Q202 529 314 529Z" />
+<glyph unicode="o" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258Z" />
+<glyph unicode="p" horiz-adv-x="593" d="M319 529Q429 529 493 455T557 257Q557 136 493 62T321 -12Q273 -12 227 7T154 69H152V-198H67V517H152V447H154Q195 529 319 529ZM149 259Q149 169 191 116T312 63Q386 63 426 115T467 263Q467 348 424 401T306 454Q234 454 192 402T149 259Z" />
+<glyph unicode="q" horiz-adv-x="593" d="M271 529Q322 529 368 508T439 448H441V517H526V-198H441V70H439Q419 30 376 9T274 -12Q167 -12 102 63T36 260Q36 383 100 456T271 529ZM126 254Q126 169 170 116T286 63Q359 63 401 116T444 258Q444 346 402 400T280 454Q206 454 166 401T126 254Z" />
+<glyph unicode="r" horiz-adv-x="333" d="M333 529V439Q237 439 192 389T146 231V0H61V517H141V408H143Q202 529 321 529H333Z" />
+<glyph unicode="s" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 74 411 31T250 -12Q151 -12 93 31T31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 174 350 194T219 235Q124 254 83 288T42 382Q42 448 94 488T236 529Z" />
+<glyph unicode="t" horiz-adv-x="315" d="M182 672V517H285V442H182V118Q182 95 191 85T236 75H285V0H215Q149 0 123 22T97 108V442H9V517H97V672H182Z" />
+<glyph unicode="u" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149Z" />
+<glyph unicode="v" horiz-adv-x="500" d="M109 517L254 86H256L397 517H486L297 0H206L14 517H109Z" />
+<glyph unicode="w" horiz-adv-x="758" d="M111 517L228 94H230L334 517H427L536 94H537L653 517H741L577 1L576 0H486L380 411H379L275 0H183L17 517H111Z" />
+<glyph unicode="x" horiz-adv-x="518" d="M132 517L255 337H256L385 517H487L309 279L509 0H400L256 214L112 0H9L203 272L23 517H132Z" />
+<glyph unicode="y" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104Z" />
+<glyph unicode="z" horiz-adv-x="480" d="M444 517V459L128 75H458V0H22V65L334 442H42V517H444Z" />
+<glyph unicode="{" horiz-adv-x="333" d="M309 731V671H259Q211 671 211 588V398Q211 353 187 317T124 268V265Q162 257 186 220T211 134V-55Q211 -138 259 -138H309V-198H237Q196 -198 164 -161T131 -70V119Q131 161 109 195T48 232V300Q83 302 107 335T131 415V603Q131 655 163 693T237 731H309Z" />
+<glyph unicode="|" horiz-adv-x="222" d="M145 786V-214H77V786H145Z" />
+<glyph unicode="}" horiz-adv-x="333" d="M91 731Q134 731 168 695T202 603V415Q202 370 224 336T285 300V232Q250 230 226 197T202 118V-70Q202 -122 170 -160T96 -198H24V-138H73Q122 -138 122 -55V134Q122 182 148 218T209 265V268Q171 276 147 311T122 398V586Q122 671 73 671H24V731H91Z" />
+<glyph unicode="~" horiz-adv-x="600" d="M495 319L531 269Q502 224 472 204T406 183Q359 183 299 219Q235 255 189 255Q163 255 144 238T105 179L69 229Q112 314 194 315Q242 315 307 282Q384 243 407 243Q441 243 471 285L495 319Z" />
+<glyph unicode="&#xA0;" horiz-adv-x="278" />
+<glyph unicode="&#xA1;" horiz-adv-x="259" d="M185 517V406H74V517H185ZM107 333H152L177 22V-198H82V22L107 333Z" />
+<glyph unicode="&#xA2;" horiz-adv-x="556" d="M272 624H311V529Q492 523 514 351H427Q406 450 311 454V63Q411 73 432 189H517Q504 99 448 44T311 -12V-116H272V-12Q166 -6 106 65T46 252Q46 371 107 446T272 529V624ZM136 252Q136 172 171 121T272 63V454Q209 447 173 397T136 252Z" />
+<glyph unicode="&#xA3;" horiz-adv-x="556" d="M286 731Q401 731 461 666T522 483V473H437Q433 656 291 656Q228 656 188 617T148 524Q148 486 160 454T200 372H359V327H222Q242 288 242 251Q242 197 216 156T126 64L128 62L165 77Q198 91 233 91Q291 91 354 68Q386 58 412 58Q456 58 501 95L544 29Q488 -17 398 -17Q360 -17 298 3Q238 24 194 24Q142 24 94 -11L47 55Q157 130 157 233Q157 270 132 327H47V372H105Q58 450 58 528Q58 615 122 673T286 731Z" />
+<glyph unicode="&#xA4;" horiz-adv-x="556" d="M481 605L531 554L476 499Q528 445 528 351Q528 261 476 201L531 145L484 98L428 156Q367 101 280 101Q188 101 128 155L73 97L25 145L80 203Q28 267 28 349Q28 441 82 497L25 555L74 604L130 548Q189 599 281 599Q319 599 358 585T424 549L481 605ZM113 349Q113 275 162 226T280 176Q347 176 395 227T443 351Q443 420 397 472T280 524Q212 524 163 474T113 349Z" />
+<glyph unicode="&#xA5;" horiz-adv-x="556" d="M109 714L283 361L452 714H556L378 369H471V309H345L327 276V234H471V174H327V0H232V174H91V234H232V276L214 309H91V369H183L0 714H109Z" />
+<glyph unicode="&#xA6;" horiz-adv-x="222" d="M145 661V411H77V661H145ZM145 161V-89H77V161H145Z" />
+<glyph unicode="&#xA7;" horiz-adv-x="556" d="M281 731Q368 731 415 683T465 546H380Q379 596 352 626T279 656Q234 656 209 633T184 570Q184 538 213 509T314 442Q431 385 473 337T516 229Q516 183 489 143T412 82Q471 38 471 -38Q471 -109 418 -153T284 -198Q199 -198 145 -150T83 -9H168Q170 -62 200 -92T282 -123Q324 -123 353 -101T383 -40Q383 -15 367 6T324 48T190 126Q111 168 73 215T35 325Q35 368 64 408T142 463Q119 489 108 513T96 569Q96 638 149 684T281 731ZM117 329Q117 291 143 263T256 189Q314 158 362 124Q434 155 434 217Q434 243 412 271T306 349Q237 387 190 420Q156 408 137 383T117 329Z" />
+<glyph unicode="&#xA8;" horiz-adv-x="222" d="M62 706V602H-28V706H62ZM250 706V602H160V706H250Z" />
+<glyph unicode="&#xA9;" horiz-adv-x="800" d="M401 731Q553 731 664 624T776 359Q776 203 667 93T401 -17Q244 -17 134 93T24 359Q24 512 134 621T401 731ZM92 359Q92 225 179 132T401 38Q531 38 619 130T708 359Q708 491 620 583T400 676Q269 676 181 584T92 359ZM410 585Q484 585 535 546T598 433H535Q524 479 492 504T411 530Q340 530 300 482T259 359Q259 283 303 233T413 183Q460 183 493 210T535 285H599Q582 210 532 169T413 128Q317 128 254 191T191 357Q191 459 251 522T410 585Z" />
+<glyph unicode="&#xAA;" horiz-adv-x="378" d="M187 709Q253 709 285 687T317 625V461Q317 444 319 437T334 430Q350 430 353 432V388Q335 380 310 380Q263 380 259 425Q214 380 142 380Q90 380 58 403T25 469Q25 512 55 537T135 567Q229 577 244 584T260 610Q260 636 243 647T183 659Q140 659 122 646T100 603H40Q42 652 80 680T187 709ZM93 471Q93 449 108 440T155 430Q203 430 230 449T257 500V546Q245 535 165 525Q125 519 109 507T93 471Z" />
+<glyph unicode="&#xAB;" horiz-adv-x="463" d="M202 442V356L102 278L202 200V114L50 234V322L202 442ZM398 442V356L298 278L398 200V114L246 234V322L398 442Z" />
+<glyph unicode="&#xAC;" horiz-adv-x="600" d="M552 388V109H484V320H48V388H552Z" />
+<glyph unicode="&#xAD;" horiz-adv-x="389" d="M339 318V238H50V318H339Z" />
+<glyph unicode="&#xAE;" horiz-adv-x="800" d="M401 731Q553 731 664 624T776 359Q776 203 667 93T401 -17Q244 -17 134 93T24 359Q24 512 134 621T401 731ZM92 359Q92 225 179 132T401 38Q531 38 619 130T708 359Q708 493 620 584T400 676Q268 676 180 584T92 359ZM428 576Q577 576 577 451Q577 347 462 332L587 139H514L395 327H323V139H255V576H428ZM401 382Q463 382 486 398T509 454Q509 521 417 521H323V382H401Z" />
+<glyph unicode="&#xAF;" horiz-adv-x="222" d="M282 682V627H-59V682H282Z" />
+<glyph unicode="&#xB0;" horiz-adv-x="400" d="M200 709Q260 709 302 666T344 565Q344 504 302 463T200 421Q139 421 98 462T56 565Q56 625 98 667T200 709ZM106 565Q106 528 131 500T200 471Q243 471 268 499T294 565Q294 604 267 631T200 659Q159 659 133 632T106 565Z" />
+<glyph unicode="&#xB1;" horiz-adv-x="600" d="M334 505V339H552V271H334V104H266V271H48V339H266V505H334ZM552 68V0H48V68H552Z" />
+<glyph unicode="&#xB2;" horiz-adv-x="370" d="M194 829Q256 829 295 794T334 703Q334 652 307 618T208 547Q157 521 135 499T107 452H328V397H31Q35 471 68 515T170 594Q230 624 248 645T266 701Q266 733 247 753T193 774Q111 774 107 675H39Q39 744 81 786T194 829Z" />
+<glyph unicode="&#xB3;" horiz-adv-x="370" d="M188 829Q250 829 287 797T325 714Q325 685 306 661T256 626V624Q342 603 342 523Q342 463 298 426T185 388Q112 388 71 425T29 530H95Q95 488 119 465T187 442Q229 442 252 463T275 520Q275 555 252 574T187 594H154V644H165Q189 644 203 646T233 658T253 681T258 710Q258 740 239 757T188 775Q110 775 105 686H39Q41 753 82 791T188 829Z" />
+<glyph unicode="&#xB4;" horiz-adv-x="222" d="M245 732L114 589H50L136 732H245Z" />
+<glyph unicode="&#xB5;" horiz-adv-x="556" d="M152 517V164Q152 119 179 91T255 63Q325 63 366 107T407 222V517H492V0H412V82H410Q353 -12 253 -12Q187 -12 154 23H152V-198H67V517H152Z" />
+<glyph unicode="&#xB6;" horiz-adv-x="600" d="M515 714V-155H447V659H325V-155H257V322Q163 323 106 376T48 508Q48 601 108 657T271 714H515Z" />
+<glyph unicode="&#xB7;" horiz-adv-x="278" d="M139 375Q167 375 185 356T203 311Q203 286 184 267T140 247Q114 247 95 266T75 311Q75 338 94 356T139 375Z" />
+<glyph unicode="&#xB8;" horiz-adv-x="222" d="M102 0H144L102 -53L104 -55Q117 -48 137 -48Q173 -48 196 -67T221 -121Q221 -163 187 -186T97 -210Q49 -210 5 -191L23 -147Q56 -160 88 -160Q145 -159 146 -129Q146 -116 133 -107T99 -98Q76 -98 58 -106L41 -78L102 0Z" />
+<glyph unicode="&#xB9;" horiz-adv-x="370" d="M242 822V397H174V701H59V751Q177 751 192 822H242Z" />
+<glyph unicode="&#xBA;" horiz-adv-x="384" d="M192 709Q268 709 313 664T359 543Q359 466 315 424T193 380Q118 380 72 424T25 543Q25 618 70 663T192 709ZM93 543Q93 492 118 462T193 430Q241 430 266 460T291 542Q291 600 265 629T191 659Q147 659 121 630T93 543Z" />
+<glyph unicode="&#xBB;" horiz-adv-x="463" d="M65 442L217 322V234L65 114V200L165 278L65 356V442ZM261 442L413 322V234L261 114V200L361 278L261 356V442Z" />
+<glyph unicode="&#xBC;" horiz-adv-x="834" d="M649 725L214 -28H150L585 725H649ZM229 709V280H161V588H46V638H49Q162 638 179 709H229ZM717 423V157H773V102H717V0H651V102H459V170L651 423H717ZM649 338L514 157H651V338H649Z" />
+<glyph unicode="&#xBD;" horiz-adv-x="834" d="M629 725L194 -28H130L565 725H629ZM229 709V280H161V588H46V638H49Q162 638 179 709H229ZM647 432Q709 432 748 398T787 306Q787 263 764 228T658 148Q568 102 560 55H781V0H484Q487 69 519 115T617 194Q681 225 700 247T719 304Q719 336 700 356T646 377Q564 377 560 278H492Q493 351 536 391T647 432Z" />
+<glyph unicode="&#xBE;" horiz-adv-x="834" d="M700 725L265 -28H201L636 725H700ZM207 712Q270 712 307 680T344 598Q344 570 327 546T275 509V507Q361 487 361 406Q361 347 316 309T204 271Q132 271 91 307T48 413H114Q118 325 206 325Q247 325 270 345T294 403Q294 437 272 457T209 477H173V527H184Q226 527 245 537T270 560T277 593Q277 622 258 640T207 658Q128 658 124 569H58Q60 636 101 674T207 712ZM717 423V157H773V102H717V0H651V102H459V170L651 423H717ZM649 338L514 157H651V338H649Z" />
+<glyph unicode="&#xBF;" horiz-adv-x="556" d="M337 517V406H226V517H337ZM326 339V318Q326 256 308 221T235 132Q194 93 176 63T158 -6Q158 -66 190 -100T279 -135Q345 -135 381 -92T418 30H503V28Q503 -80 440 -145T279 -210Q184 -210 126 -156T68 -10Q68 41 87 78T161 167Q214 215 227 244T241 323V339H326Z" />
+<glyph unicode="&#xC0;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM287 922L373 779H309L178 922H287Z" />
+<glyph unicode="&#xC1;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM467 922L336 779H272L358 922H467Z" />
+<glyph unicode="&#xC2;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM372 922L476 779H392L323 875L253 779H176L279 922H372Z" />
+<glyph unicode="&#xC3;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM498 907Q479 797 397 796Q379 796 353 804T301 824Q276 835 256 835Q222 835 207 793H155Q179 903 261 903Q291 903 335 883Q379 863 400 863Q433 863 446 907H498Z" />
+<glyph unicode="&#xC4;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM276 897V793H186V897H276ZM464 897V793H374V897H464Z" />
+<glyph unicode="&#xC5;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM324 973Q371 973 404 941T437 861Q437 815 404 782T324 749Q277 749 244 782T211 861Q211 908 244 940T324 973ZM257 860Q257 831 276 812T324 792Q354 792 372 812T391 860Q391 888 372 908T323 928Q296 928 277 909T257 860Z" />
+<glyph unicode="&#xC6;" horiz-adv-x="926" d="M889 714V634H538V407H868V327H538V80H895V0H448V208H202L100 0H-7L354 714H889ZM239 288H448V634H407L239 288Z" />
+<glyph unicode="&#xC7;" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 133 590 60T381 -16L352 -53L354 -55Q367 -48 387 -48Q423 -48 447 -68T471 -121Q471 -163 436 -186T347 -210Q302 -210 255 -191L273 -147Q306 -160 338 -160Q396 -160 396 -129Q396 -115 383 -107T349 -98Q328 -98 308 -106L291 -78L340 -15Q198 -3 121 96T43 355Q43 525 136 628T381 731Z" />
+<glyph unicode="&#xC8;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM275 922L361 779H297L166 922H275Z" />
+<glyph unicode="&#xC9;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM465 922L334 779H270L356 922H465Z" />
+<glyph unicode="&#xCA;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM365 922L469 779H385L316 875L246 779H169L272 922H365Z" />
+<glyph unicode="&#xCB;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM270 897V793H180V897H270ZM458 897V793H368V897H458Z" />
+<glyph unicode="&#xCC;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM91 922L177 779H113L-18 922H91Z" />
+<glyph unicode="&#xCD;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM275 922L144 779H80L166 922H275Z" />
+<glyph unicode="&#xCE;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM177 922L281 779H197L128 875L58 779H-19L84 922H177Z" />
+<glyph unicode="&#xCF;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM81 897V793H-9V897H81ZM269 897V793H179V897H269Z" />
+<glyph unicode="&#xD0;" horiz-adv-x="704" d="M329 714Q491 714 578 629T666 374Q666 0 329 0H78V341H8V405H78V714H329ZM387 405V341H173V80H334Q447 80 509 153T571 361Q571 503 512 568T338 634H173V405H387Z" />
+<glyph unicode="&#xD1;" horiz-adv-x="722" d="M178 714L554 135H556V714H646V0H542L169 573H167V0H77V714H178ZM535 907Q516 797 434 796Q416 796 390 804T338 824Q313 835 293 835Q259 835 244 793H192Q216 903 298 903Q328 903 372 883Q416 863 437 863Q470 863 483 907H535Z" />
+<glyph unicode="&#xD2;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM338 922L424 779H360L229 922H338Z" />
+<glyph unicode="&#xD3;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM528 922L397 779H333L419 922H528Z" />
+<glyph unicode="&#xD4;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM428 922L532 779H448L379 875L309 779H232L335 922H428Z" />
+<glyph unicode="&#xD5;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM554 907Q535 797 453 796Q435 796 409 804T357 824Q332 835 312 835Q278 835 263 793H211Q235 903 317 903Q347 903 391 883Q435 863 456 863Q489 863 502 907H554Z" />
+<glyph unicode="&#xD6;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM332 897V793H242V897H332ZM520 897V793H430V897H520Z" />
+<glyph unicode="&#xD7;" horiz-adv-x="600" d="M120 482L300 302L480 482L528 434L349 254L529 72L481 24L300 206L119 24L70 72L252 254L71 434L120 482Z" />
+<glyph unicode="&#xD8;" horiz-adv-x="760" d="M380 731Q522 731 612 643L691 730L723 700L641 610Q722 506 722 357Q722 190 627 87T380 -17Q243 -17 151 69L70 -20L37 10L121 102Q38 203 38 357Q38 517 130 624T380 731ZM133 357Q133 247 183 170L551 577H552Q486 651 379 651Q263 651 198 566T133 357ZM210 134Q274 63 380 63Q493 63 560 145T627 357Q627 462 579 541L210 134Z" />
+<glyph unicode="&#xD9;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM320 922L406 779H342L211 922H320Z" />
+<glyph unicode="&#xDA;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM510 922L379 779H315L401 922H510Z" />
+<glyph unicode="&#xDB;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM410 922L514 779H430L361 875L291 779H214L317 922H410Z" />
+<glyph unicode="&#xDC;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM314 897V793H224V897H314ZM502 897V793H412V897H502Z" />
+<glyph unicode="&#xDD;" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115ZM475 922L344 779H280L366 922H475Z" />
+<glyph unicode="&#xDE;" horiz-adv-x="648" d="M173 714V600H391Q491 600 550 547T610 388Q610 284 553 231T396 178H173V0H78V714H173ZM363 258Q515 258 515 388Q515 520 363 520H173V258H363Z" />
+<glyph unicode="&#xDF;" horiz-adv-x="556" d="M262 731Q349 731 409 682T469 556Q469 435 365 401V399Q423 393 462 343T501 220Q501 119 436 54T270 -12Q241 -12 227 -8V66Q241 63 257 63Q332 63 371 104T411 209Q411 291 372 325T236 359H227V427H247Q308 427 343 456T379 543Q379 590 347 623T268 656Q201 656 175 620T149 521V0H64V528Q64 618 118 674T262 731Z" />
+<glyph unicode="&#xE0;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM231 732L317 589H253L122 732H231Z" />
+<glyph unicode="&#xE1;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM417 732L286 589H222L308 732H417Z" />
+<glyph unicode="&#xE2;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM319 732L423 589H339L270 685L200 589H123L226 732H319Z" />
+<glyph unicode="&#xE3;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM445 717Q426 608 344 606Q324 606 300 614T248 634Q220 645 203 645Q169 645 154 603H102Q126 713 208 713Q237 713 282 693Q329 673 347 673Q379 673 393 717H445Z" />
+<glyph unicode="&#xE4;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM223 706V602H133V706H223ZM411 706V602H321V706H411Z" />
+<glyph unicode="&#xE5;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM272 788Q319 788 352 755T385 676Q385 630 352 597T272 564Q225 564 192 596T159 676Q159 722 192 755T272 788ZM205 675Q205 647 223 627T272 607Q302 607 320 627T339 675Q339 703 321 723T271 743Q245 743 225 724T205 675Z" />
+<glyph unicode="&#xE6;" horiz-adv-x="870" d="M275 529Q343 529 385 512T448 454Q471 489 513 508T613 529Q726 529 785 458T846 233H467Q469 151 511 107T622 63Q674 63 708 89T753 163H840Q820 78 762 34T616 -12Q475 -12 429 89Q371 -10 211 -12Q128 -12 83 25T36 133Q36 180 54 211T105 260T225 294L299 307Q349 315 368 329T387 374Q387 414 361 433T271 454Q204 454 174 430T141 356H56Q66 527 275 529ZM756 308Q754 374 714 414T612 454Q548 454 509 414T467 308H756ZM126 139Q126 102 154 83T226 63Q294 63 340 97T387 178V267Q359 249 287 241Q186 229 156 205T126 139Z" />
+<glyph unicode="&#xE7;" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 95 438 44T293 -10L260 -53L262 -55Q273 -48 295 -48Q332 -48 355 -68T379 -121Q379 -164 344 -187T255 -210Q206 -210 163 -191L181 -147Q216 -160 246 -160Q271 -160 287 -152T304 -129Q304 -115 291 -107T257 -98Q237 -98 216 -106L199 -78L252 -10H251Q149 -2 93 67T36 252Q36 380 101 454T280 529Z" />
+<glyph unicode="&#xE8;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM240 732L326 589H262L131 732H240Z" />
+<glyph unicode="&#xE9;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM426 732L295 589H231L317 732H426Z" />
+<glyph unicode="&#xEA;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM328 732L432 589H348L279 685L209 589H132L235 732H328Z" />
+<glyph unicode="&#xEB;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM232 706V602H142V706H232ZM420 706V602H330V706H420Z" />
+<glyph unicode="&#xEC;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM71 732L157 589H93L-38 732H71Z" />
+<glyph unicode="&#xED;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM257 732L126 589H62L148 732H257Z" />
+<glyph unicode="&#xEE;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM159 732L263 589H179L110 685L40 589H-37L66 732H159Z" />
+<glyph unicode="&#xEF;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM63 706V602H-27V706H63ZM251 706V602H161V706H251Z" />
+<glyph unicode="&#xF0;" horiz-adv-x="574" d="M247 731L324 675L444 731L479 694L364 641Q538 501 538 258Q538 135 468 62T287 -12Q173 -12 105 62T36 257Q36 364 102 435T272 506Q361 506 411 450H413Q392 495 358 536T291 601L176 547L138 587L248 638Q209 669 177 686L247 731ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 257Q448 335 405 383T281 431Q208 431 167 385T126 258Z" />
+<glyph unicode="&#xF1;" horiz-adv-x="556" d="M314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q228 454 189 410T149 295V0H64V517H144V435H146Q202 529 314 529ZM454 717Q435 608 353 606Q333 606 309 614T257 634Q229 645 212 645Q178 645 163 603H111Q135 713 217 713Q246 713 291 693Q338 673 356 673Q388 673 402 717H454Z" />
+<glyph unicode="&#xF2;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM245 732L331 589H267L136 732H245Z" />
+<glyph unicode="&#xF3;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM435 732L304 589H240L326 732H435Z" />
+<glyph unicode="&#xF4;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM335 732L439 589H355L286 685L216 589H139L242 732H335Z" />
+<glyph unicode="&#xF5;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM461 717Q442 608 360 606Q340 606 316 614T264 634Q236 645 219 645Q185 645 170 603H118Q142 713 224 713Q253 713 298 693Q345 673 363 673Q395 673 409 717H461Z" />
+<glyph unicode="&#xF6;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM239 706V602H149V706H239ZM427 706V602H337V706H427Z" />
+<glyph unicode="&#xF7;" horiz-adv-x="600" d="M300 523Q325 523 344 504T364 459Q364 435 345 415T301 395Q275 395 256 414T236 459Q236 484 254 503T300 523ZM552 287V219H48V287H552ZM300 111Q326 111 345 93T364 47Q364 23 345 3T301 -17Q275 -17 256 2T236 47Q236 73 255 92T300 111Z" />
+<glyph unicode="&#xF8;" horiz-adv-x="574" d="M513 535L540 509L480 443Q538 373 538 258Q538 140 471 64T287 -12Q188 -12 122 45L62 -22L34 2L96 71Q36 143 36 258Q36 382 105 455T287 529Q392 529 455 470L513 535ZM126 258Q126 190 156 137L397 406H398Q355 454 286 454Q217 454 172 399T126 258ZM179 108Q222 63 287 63Q357 63 402 116T448 258Q448 322 420 377L179 108Z" />
+<glyph unicode="&#xF9;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM237 732L323 589H259L128 732H237Z" />
+<glyph unicode="&#xFA;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM423 732L292 589H228L314 732H423Z" />
+<glyph unicode="&#xFB;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM325 732L429 589H345L276 685L206 589H129L232 732H325Z" />
+<glyph unicode="&#xFC;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM229 706V602H139V706H229ZM417 706V602H327V706H417Z" />
+<glyph unicode="&#xFD;" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104ZM400 732L269 589H205L291 732H400Z" />
+<glyph unicode="&#xFE;" horiz-adv-x="593" d="M152 714V447H154Q195 529 319 529Q427 529 492 455T557 257Q557 136 493 62T321 -12Q273 -12 227 7T154 69H152V-198H67V714H152ZM149 259Q149 169 191 116T312 63Q386 63 426 115T467 263Q467 350 424 402T306 454Q234 454 192 402T149 259Z" />
+<glyph unicode="&#xFF;" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104ZM206 706V602H116V706H206ZM394 706V602H304V706H394Z" />
+<glyph unicode="&#x100;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM496 872V817H155V872H496Z" />
+<glyph unicode="&#x101;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM443 682V627H102V682H443Z" />
+<glyph unicode="&#x102;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322ZM219 919Q243 836 331 836Q366 836 388 853T430 919H481Q468 851 427 816T323 781Q190 781 169 919H219Z" />
+<glyph unicode="&#x103;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139ZM166 729Q190 646 278 646Q313 646 336 664T377 729H428Q415 662 374 627T270 591Q136 591 116 729H166Z" />
+<glyph unicode="&#x104;" horiz-adv-x="648" d="M377 714L656 0H591Q507 -68 507 -118Q507 -160 548 -160Q585 -160 607 -130L639 -148Q604 -210 531 -210Q487 -210 463 -190T439 -134Q439 -66 551 0L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322Z" />
+<glyph unicode="&#x105;" horiz-adv-x="537" d="M275 529Q469 529 469 391V92Q469 63 496 63Q509 63 522 68V2Q496 -13 452 -13Q382 -71 382 -118Q382 -160 423 -160Q460 -160 482 -130L514 -148Q479 -210 406 -210Q362 -210 338 -190T314 -134Q314 -67 421 -3Q389 13 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 206 81 245T293 305Q348 312 366 327T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 275 529ZM126 139Q126 103 152 83T226 63Q291 63 337 96T384 178V267Q362 251 328 247L237 233Q180 225 153 203T126 139Z" />
+<glyph unicode="&#x106;" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 130 587 57T373 -17Q221 -17 132 83T43 355Q43 522 134 626T381 731ZM527 922L396 779H332L418 922H527Z" />
+<glyph unicode="&#x107;" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 92 434 40T278 -12Q166 -12 101 58T36 252Q36 380 101 454T280 529ZM429 732L298 589H234L320 732H429Z" />
+<glyph unicode="&#x108;" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 130 587 57T373 -17Q221 -17 132 83T43 355Q43 522 134 626T381 731ZM427 922L531 779H447L378 875L308 779H231L334 922H427Z" />
+<glyph unicode="&#x109;" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 92 434 40T278 -12Q166 -12 101 58T36 252Q36 380 101 454T280 529ZM331 732L435 589H351L282 685L212 589H135L238 732H331Z" />
+<glyph unicode="&#x10A;" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 130 587 57T373 -17Q221 -17 132 83T43 355Q43 522 134 626T381 731ZM425 897V793H335V897H425Z" />
+<glyph unicode="&#x10B;" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 92 434 40T278 -12Q166 -12 101 58T36 252Q36 380 101 454T280 529ZM329 708V604H239V708H329Z" />
+<glyph unicode="&#x10C;" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 130 587 57T373 -17Q221 -17 132 83T43 355Q43 522 134 626T381 731ZM315 922L384 826L454 922H531L428 779H335L231 922H315Z" />
+<glyph unicode="&#x10D;" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 92 434 40T278 -12Q166 -12 101 58T36 252Q36 380 101 454T280 529ZM214 732L283 636L353 732H430L327 589H234L130 732H214Z" />
+<glyph unicode="&#x10E;" horiz-adv-x="704" d="M329 714Q491 714 578 629T666 374Q666 0 329 0H78V714H329ZM334 80Q447 80 509 153T571 361Q571 503 512 568T338 634H173V80H334ZM250 922L319 826L389 922H466L363 779H270L166 922H250Z" />
+<glyph unicode="&#x10F;" horiz-adv-x="593" d="M526 714V0H441V70H439Q419 30 376 9T274 -12Q167 -12 102 63T36 260Q36 382 99 455T271 529Q322 529 368 508T439 448H441V714H526ZM126 254Q126 169 170 116T286 63Q359 63 401 116T444 258Q444 346 402 400T280 454Q206 454 166 401T126 254ZM711 714L636 571H576L602 714H711Z" />
+<glyph unicode="&#x110;" horiz-adv-x="704" d="M329 714Q491 714 578 629T666 374Q666 0 329 0H78V341H8V405H78V714H329ZM387 405V341H173V80H334Q447 80 509 153T571 361Q571 503 512 568T338 634H173V405H387Z" />
+<glyph unicode="&#x111;" horiz-adv-x="598" d="M526 714V636H612V583H526V0H441V70H439Q419 30 376 9T274 -12Q167 -12 102 63T36 260Q36 382 99 455T271 529Q324 529 368 508T439 448H441V583H271V636H441V714H526ZM126 254Q126 169 170 116T286 63Q359 63 401 116T444 258Q444 346 402 400T280 454Q206 454 166 401T126 254Z" />
+<glyph unicode="&#x112;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM490 872V817H149V872H490Z" />
+<glyph unicode="&#x113;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM452 682V627H111V682H452Z" />
+<glyph unicode="&#x114;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM213 919Q237 836 325 836Q360 836 382 853T424 919H475Q462 851 421 816T317 781Q184 781 163 919H213Z" />
+<glyph unicode="&#x115;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM175 729Q199 646 287 646Q322 646 345 664T386 729H437Q424 662 383 627T279 591Q145 591 125 729H175Z" />
+<glyph unicode="&#x116;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM364 897V793H274V897H364Z" />
+<glyph unicode="&#x117;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM326 708V604H236V708H326Z" />
+<glyph unicode="&#x118;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H526Q442 -70 442 -118Q442 -160 483 -160Q517 -160 542 -130L574 -148Q539 -210 466 -210Q423 -210 399 -191T374 -134Q374 -64 486 0H78V714H571Z" />
+<glyph unicode="&#x119;" horiz-adv-x="537" d="M279 529Q388 529 450 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q490 87 441 42T314 -10H313Q269 -50 256 -73T242 -118Q242 -160 283 -160Q320 -160 342 -130L374 -148Q339 -210 266 -210Q222 -210 198 -190T174 -134Q174 -72 266 -11Q148 -3 93 76T36 262Q36 375 105 452T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423Z" />
+<glyph unicode="&#x11A;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM253 922L322 826L392 922H469L366 779H273L169 922H253Z" />
+<glyph unicode="&#x11B;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM213 732L282 636L352 732H429L326 589H233L129 732H213Z" />
+<glyph unicode="&#x11C;" horiz-adv-x="759" d="M383 731Q510 731 591 671T690 494H595Q581 570 526 610T383 651Q272 651 205 569T138 348Q138 227 205 145T383 63Q482 63 547 124T612 285V296H384V376H697V0H637L612 89Q573 38 513 11T383 -17Q237 -17 140 87T43 343Q43 513 133 622T383 731ZM433 922L537 779H453L384 875L314 779H237L340 922H433Z" />
+<glyph unicode="&#x11D;" horiz-adv-x="574" d="M274 529Q380 529 429 443H430V517H510V39Q510 -210 271 -210Q174 -210 117 -169T56 -58H141Q143 -95 181 -118T275 -142Q430 -142 430 56V88H428Q408 45 365 20T267 -6Q162 -6 99 66T36 256Q36 378 99 453T274 529ZM126 266Q126 175 164 122T272 69Q342 69 384 124T426 269Q426 352 387 403T278 454Q206 454 166 403T126 266ZM333 732L437 589H353L284 685L214 589H137L240 732H333Z" />
+<glyph unicode="&#x11E;" horiz-adv-x="759" d="M383 731Q510 731 591 671T690 494H595Q581 570 526 610T383 651Q272 651 205 569T138 348Q138 227 205 145T383 63Q482 63 547 124T612 285V296H384V376H697V0H637L612 89Q573 38 513 11T383 -17Q237 -17 140 87T43 343Q43 513 133 622T383 731ZM280 919Q304 836 392 836Q427 836 449 853T491 919H542Q529 851 488 816T384 781Q251 781 230 919H280Z" />
+<glyph unicode="&#x11F;" horiz-adv-x="574" d="M274 529Q380 529 429 443H430V517H510V39Q510 -210 271 -210Q174 -210 117 -169T56 -58H141Q143 -95 181 -118T275 -142Q430 -142 430 56V88H428Q408 45 365 20T267 -6Q162 -6 99 66T36 256Q36 378 99 453T274 529ZM126 266Q126 175 164 122T272 69Q342 69 384 124T426 269Q426 352 387 403T278 454Q206 454 166 403T126 266ZM180 729Q204 646 292 646Q327 646 350 664T391 729H442Q429 662 388 627T284 591Q150 591 130 729H180Z" />
+<glyph unicode="&#x120;" horiz-adv-x="759" d="M383 731Q510 731 591 671T690 494H595Q581 570 526 610T383 651Q272 651 205 569T138 348Q138 227 205 145T383 63Q482 63 547 124T612 285V296H384V376H697V0H637L612 89Q573 38 513 11T383 -17Q237 -17 140 87T43 343Q43 513 133 622T383 731ZM430 897V793H340V897H430Z" />
+<glyph unicode="&#x121;" horiz-adv-x="574" d="M274 529Q380 529 429 443H430V517H510V39Q510 -210 271 -210Q174 -210 117 -169T56 -58H141Q143 -95 181 -118T275 -142Q430 -142 430 56V88H428Q408 45 365 20T267 -6Q162 -6 99 66T36 256Q36 378 99 453T274 529ZM126 266Q126 175 164 122T272 69Q342 69 384 124T426 269Q426 352 387 403T278 454Q206 454 166 403T126 266ZM331 708V604H241V708H331Z" />
+<glyph unicode="&#x122;" horiz-adv-x="759" d="M383 731Q510 731 591 671T690 494H595Q581 570 526 610T383 651Q272 651 205 569T138 348Q138 227 205 145T383 63Q482 63 547 124T612 285V296H384V376H697V0H637L612 89Q573 38 513 11T383 -17Q237 -17 140 87T43 343Q43 513 133 622T383 731ZM432 -50V-129Q432 -206 333 -210V-175Q373 -167 373 -143V-138H321V-50H432Z" />
+<glyph unicode="&#x123;" horiz-adv-x="574" d="M274 529Q380 529 429 443H430V517H510V39Q510 -210 271 -210Q174 -210 117 -169T56 -58H141Q143 -95 181 -118T275 -142Q430 -142 430 56V88H428Q408 45 365 20T267 -6Q162 -6 99 66T36 256Q36 378 99 453T274 529ZM126 266Q126 175 164 122T272 69Q342 69 384 124T426 269Q426 352 387 403T278 454Q206 454 166 403T126 266ZM329 751Q289 741 289 717V714H341V626H230V704Q231 784 329 786V751Z" />
+<glyph unicode="&#x124;" horiz-adv-x="722" d="M173 714V407H549V714H644V0H549V327H173V0H78V714H173ZM405 922L509 779H425L356 875L286 779H209L312 922H405Z" />
+<glyph unicode="&#x125;" horiz-adv-x="556" d="M149 714V441H151Q169 483 214 506T314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q229 454 189 410T149 295V0H64V714H149ZM316 922L420 779H336L267 875L197 779H120L223 922H316Z" />
+<glyph unicode="&#x126;" horiz-adv-x="722" d="M173 714V570H549V714H644V0H549V306H173V0H78V714H173ZM549 384V512H173V384H549Z" />
+<glyph unicode="&#x127;" horiz-adv-x="561" d="M154 714V636H324V583H154V441H156Q174 482 218 505T319 529Q497 529 497 344V0H412V353Q412 396 385 425T307 454Q233 454 194 410T154 295V0H69V583H-17V636H69V714H154Z" />
+<glyph unicode="&#x128;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM304 907Q285 797 203 796Q185 796 159 804T107 824Q82 835 62 835Q28 835 13 793H-39Q-15 903 67 903Q97 903 141 883Q185 863 206 863Q239 863 252 907H304Z" />
+<glyph unicode="&#x129;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM285 717Q266 608 184 606Q164 606 140 614T88 634Q60 645 43 645Q9 645 -6 603H-58Q-34 713 48 713Q77 713 122 693Q169 673 187 673Q219 673 233 717H285Z" />
+<glyph unicode="&#x12A;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM301 872V817H-40V872H301Z" />
+<glyph unicode="&#x12B;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM283 682V627H-58V682H283Z" />
+<glyph unicode="&#x12C;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM24 919Q48 836 136 836Q171 836 193 853T235 919H286Q273 851 232 816T128 781Q-5 781 -26 919H24Z" />
+<glyph unicode="&#x12D;" horiz-adv-x="222" d="M154 517V0H69V517H154ZM6 729Q30 646 118 646Q153 646 176 664T217 729H268Q255 662 214 627T110 591Q-24 591 -44 729H6Z" />
+<glyph unicode="&#x12E;" horiz-adv-x="259" d="M177 714V0Q130 -47 116 -70T102 -118Q102 -137 111 -148T137 -160Q169 -160 192 -130L220 -148Q185 -210 129 -210Q88 -210 64 -190T40 -132Q40 -65 141 0H82V714H177Z" />
+<glyph unicode="&#x12F;" horiz-adv-x="222" d="M154 714V610H69V714H154ZM154 517V0Q107 -47 93 -70T79 -118Q79 -138 88 -149T113 -160Q148 -160 169 -130L197 -148Q164 -210 106 -210Q65 -210 41 -190T17 -132Q17 -65 118 0H69V517H154Z" />
+<glyph unicode="&#x130;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM175 897V793H85V897H175Z" />
+<glyph unicode="&#x131;" horiz-adv-x="222" d="M154 517V0H69V517H154Z" />
+<glyph unicode="&#x132;" horiz-adv-x="770" d="M177 714V0H82V714H177ZM692 714V175Q692 84 637 34T481 -17Q384 -17 329 34T273 210V235H368V211Q368 130 394 97T483 63Q597 63 597 188V714H692Z" />
+<glyph unicode="&#x133;" horiz-adv-x="438" d="M154 714V610H69V714H154ZM154 517V0H69V517H154ZM370 714V610H285V714H370ZM370 517V-69Q370 -132 339 -164T246 -198Q220 -198 202 -194V-121Q207 -123 230 -123Q247 -123 259 -119T278 -102T285 -56V517H370Z" />
+<glyph unicode="&#x134;" horiz-adv-x="519" d="M441 714V175Q441 84 386 34T230 -17Q133 -17 78 34T22 210V235H117V211Q117 130 143 97T232 63Q346 63 346 188V714H441ZM437 922L541 779H457L388 875L318 779H241L344 922H437Z" />
+<glyph unicode="&#x135;" horiz-adv-x="222" d="M154 517V-69Q154 -134 122 -166T30 -198Q5 -198 -14 -194V-121Q-7 -123 14 -123Q27 -123 40 -120T61 -104T69 -56V517H154ZM157 732L261 589H177L108 685L38 589H-39L64 732H157Z" />
+<glyph unicode="&#x136;" horiz-adv-x="667" d="M173 714V358L535 714H658L357 426L670 0H550L292 361L173 250V0H78V714H173ZM401 -50V-129Q401 -206 302 -210V-175Q342 -167 342 -143V-138H290V-50H401Z" />
+<glyph unicode="&#x137;" horiz-adv-x="519" d="M154 714V291L390 517H504L299 329L519 0H411L234 270L154 196V0H69V714H154ZM331 -50V-129Q331 -206 232 -210V-175Q272 -167 272 -143V-138H220V-50H331Z" />
+<glyph unicode="&#x138;" horiz-adv-x="514" d="M149 517V291L385 517H499L294 329L514 0H406L229 270L149 196V0H64V517H149Z" />
+<glyph unicode="&#x139;" horiz-adv-x="556" d="M173 714V80H551V0H78V714H173ZM288 922L157 779H93L179 922H288Z" />
+<glyph unicode="&#x13A;" horiz-adv-x="222" d="M154 714V0H69V714H154ZM260 922L129 779H65L151 922H260Z" />
+<glyph unicode="&#x13B;" horiz-adv-x="556" d="M173 714V80H551V0H78V714H173ZM364 -50V-129Q364 -206 265 -210V-175Q305 -167 305 -143V-138H253V-50H364Z" />
+<glyph unicode="&#x13C;" horiz-adv-x="222" d="M154 714V0H69V714H154ZM168 -50V-129Q168 -206 69 -210V-175Q109 -167 109 -143V-138H57V-50H168Z" />
+<glyph unicode="&#x13D;" horiz-adv-x="556" d="M173 714V80H551V0H78V714H173ZM411 714L336 571H276L302 714H411Z" />
+<glyph unicode="&#x13E;" horiz-adv-x="222" d="M154 714V0H69V714H154ZM339 714L264 571H204L230 714H339Z" />
+<glyph unicode="&#x13F;" horiz-adv-x="556" d="M173 714V80H551V0H78V714H173ZM405 441V337H315V441H405Z" />
+<glyph unicode="&#x140;" horiz-adv-x="342" d="M154 714V0H69V714H154ZM315 441V337H225V441H315Z" />
+<glyph unicode="&#x141;" horiz-adv-x="556" d="M173 714V384L401 544V468L173 308V80H551V0H78V240L-1 184V260L78 316V714H173Z" />
+<glyph unicode="&#x142;" horiz-adv-x="222" d="M154 714V460L224 516V445L154 389V0H69V321L-1 266V337L69 393V714H154Z" />
+<glyph unicode="&#x143;" horiz-adv-x="722" d="M178 714L554 135H556V714H646V0H542L169 573H167V0H77V714H178ZM509 922L378 779H314L400 922H509Z" />
+<glyph unicode="&#x144;" horiz-adv-x="556" d="M314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q228 454 189 410T149 295V0H64V517H144V435H146Q202 529 314 529ZM426 732L295 589H231L317 732H426Z" />
+<glyph unicode="&#x145;" horiz-adv-x="722" d="M178 714L554 135H556V714H646V0H542L169 573H167V0H77V714H178ZM414 -50V-129Q414 -206 315 -210V-175Q355 -167 355 -143V-138H303V-50H414Z" />
+<glyph unicode="&#x146;" horiz-adv-x="556" d="M314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q228 454 189 410T149 295V0H64V517H144V435H146Q202 529 314 529ZM332 -50V-129Q332 -206 233 -210V-175Q273 -167 273 -143V-138H221V-50H332Z" />
+<glyph unicode="&#x147;" horiz-adv-x="722" d="M178 714L554 135H556V714H646V0H542L169 573H167V0H77V714H178ZM294 922L363 826L433 922H510L407 779H314L210 922H294Z" />
+<glyph unicode="&#x148;" horiz-adv-x="556" d="M314 529Q492 529 492 344V0H407V353Q407 396 380 425T301 454Q228 454 189 410T149 295V0H64V517H144V435H146Q202 529 314 529ZM213 732L282 636L352 732H429L326 589H233L129 732H213Z" />
+<glyph unicode="&#x149;" horiz-adv-x="663" d="M421 529Q599 529 599 344V0H514V353Q514 396 487 425T408 454Q335 454 296 410T256 295V0H171V517H251V435H253Q309 529 421 529ZM130 714V599Q130 533 100 495T20 456V506Q76 507 78 603H19V714H130Z" />
+<glyph unicode="&#x14A;" horiz-adv-x="722" d="M178 714L554 135H556V714H646V-44Q646 -198 485 -198Q440 -198 409 -189V-111Q441 -118 475 -118Q523 -118 539 -99T556 -23V-17L169 573H167V0H77V714H178Z" />
+<glyph unicode="&#x14B;" horiz-adv-x="556" d="M314 529Q492 529 492 344V-54Q492 -198 348 -198Q311 -198 283 -191V-118Q315 -123 339 -123Q380 -123 393 -103T407 -41V353Q407 396 380 425T301 454Q229 454 189 410T149 295V0H64V517H144V435H146Q200 529 314 529Z" />
+<glyph unicode="&#x14C;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM552 872V817H211V872H552Z" />
+<glyph unicode="&#x14D;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM459 682V627H118V682H459Z" />
+<glyph unicode="&#x14E;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM275 919Q299 836 387 836Q422 836 444 853T486 919H537Q524 851 483 816T379 781Q246 781 225 919H275Z" />
+<glyph unicode="&#x14F;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM182 729Q206 646 294 646Q329 646 352 664T393 729H444Q431 662 390 627T286 591Q152 591 132 729H182Z" />
+<glyph unicode="&#x150;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM451 922L331 779H265L346 922H451ZM607 922L487 779H421L502 922H607Z" />
+<glyph unicode="&#x151;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM358 732L238 589H172L253 732H358ZM514 732L394 589H328L409 732H514Z" />
+<glyph unicode="&#x152;" horiz-adv-x="1074" d="M373 731Q432 731 482 709T549 655H551V714H1028V634H646V407H996V327H646V80H1034V0H551V69H549Q522 27 472 5T365 -17Q217 -17 128 84T38 355Q38 525 129 628T373 731ZM133 351Q133 221 199 142T372 63Q446 63 498 103T551 202V515Q551 552 535 577T475 627T373 651Q263 651 198 568T133 351Z" />
+<glyph unicode="&#x153;" horiz-adv-x="891" d="M271 529Q343 529 385 507T450 438Q477 482 526 505T633 529Q744 529 804 458T865 252Q865 239 864 233H489V227Q489 155 529 110T638 63Q690 63 727 90T778 164H859Q808 -12 638 -12Q493 -12 450 90Q406 -10 271 -12Q163 -12 100 60T36 259Q36 383 98 455T271 529ZM126 249Q126 167 165 116T271 63Q341 63 378 114T415 260Q415 453 271 454Q204 454 166 399T126 249ZM774 308Q774 376 735 415T632 454Q570 454 531 415T489 308H774Z" />
+<glyph unicode="&#x154;" horiz-adv-x="685" d="M418 714Q515 714 573 663T631 527Q631 381 507 346V344Q563 334 587 293T616 157Q618 94 627 59T656 0H550Q541 12 539 23T533 55L529 133Q527 202 502 253T408 305H173V0H78V714H418ZM376 385Q536 385 536 512Q536 570 504 602T413 634H173V385H376ZM473 922L342 779H278L364 922H473Z" />
+<glyph unicode="&#x155;" horiz-adv-x="333" d="M333 529V439Q237 439 192 389T146 231V0H61V517H141V408H143Q202 529 321 529H333ZM337 732L206 589H142L228 732H337Z" />
+<glyph unicode="&#x156;" horiz-adv-x="685" d="M418 714Q515 714 573 663T631 527Q631 381 507 346V344Q563 334 587 293T616 157Q618 94 627 59T656 0H550Q541 12 539 23T533 55L529 133Q527 202 502 253T408 305H173V0H78V714H418ZM376 385Q536 385 536 512Q536 570 504 602T413 634H173V385H376ZM406 -50V-129Q406 -206 307 -210V-175Q347 -167 347 -143V-138H295V-50H406Z" />
+<glyph unicode="&#x157;" horiz-adv-x="333" d="M333 529V439Q237 439 192 389T146 231V0H61V517H141V408H143Q202 529 321 529H333ZM159 -50V-129Q159 -206 60 -210V-175Q100 -167 100 -143V-138H48V-50H159Z" />
+<glyph unicode="&#x158;" horiz-adv-x="685" d="M418 714Q515 714 573 663T631 527Q631 381 507 346V344Q563 334 587 293T616 157Q618 94 627 59T656 0H550Q541 12 539 23T533 55L529 133Q527 202 502 253T408 305H173V0H78V714H418ZM376 385Q536 385 536 512Q536 570 504 602T413 634H173V385H376ZM257 922L326 826L396 922H473L370 779H277L173 922H257Z" />
+<glyph unicode="&#x159;" horiz-adv-x="333" d="M333 529V439Q237 439 192 389T146 231V0H61V517H141V408H143Q202 529 321 529H333ZM129 732L198 636L268 732H345L242 589H149L45 732H129Z" />
+<glyph unicode="&#x15A;" horiz-adv-x="648" d="M318 731Q439 731 510 671T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 492 185 464T383 402Q498 379 554 331T611 196Q611 96 529 40T332 -17Q197 -17 117 50T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 130 674T318 731ZM471 922L340 779H276L362 922H471Z" />
+<glyph unicode="&#x15B;" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 74 411 31T250 -12Q151 -12 93 31T31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 174 350 194T219 235Q124 254 83 288T42 382Q42 448 94 488T236 529ZM398 732L267 589H203L289 732H398Z" />
+<glyph unicode="&#x15C;" horiz-adv-x="648" d="M318 731Q439 731 510 671T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 492 185 464T383 402Q498 379 554 331T611 196Q611 96 529 40T332 -17Q197 -17 117 50T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 130 674T318 731ZM371 922L475 779H391L322 875L252 779H175L278 922H371Z" />
+<glyph unicode="&#x15D;" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 74 411 31T250 -12Q151 -12 93 31T31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 174 350 194T219 235Q124 254 83 288T42 382Q42 448 94 488T236 529ZM297 732L401 589H317L248 685L178 589H101L204 732H297Z" />
+<glyph unicode="&#x15E;" horiz-adv-x="648" d="M318 731Q437 731 506 674T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 489 187 462T383 402Q498 379 554 331T611 196Q611 101 533 42T326 -17L298 -53L300 -55Q313 -48 333 -48Q370 -48 393 -68T417 -121Q417 -164 382 -187T293 -210Q244 -210 201 -191L219 -147Q254 -160 284 -160Q342 -160 342 -129Q342 -115 329 -107T295 -98Q275 -98 254 -106L237 -78L286 -14Q165 0 101 64T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 131 674T318 731Z" />
+<glyph unicode="&#x15F;" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 78 417 35T257 -12L225 -53L227 -55Q240 -48 260 -48Q297 -48 320 -68T344 -121Q344 -163 309 -186T220 -210Q175 -210 128 -191L146 -147Q179 -160 211 -160Q269 -160 269 -129Q269 -115 256 -107T222 -98Q201 -98 181 -106L164 -78L217 -10Q37 6 31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 175 348 195T219 235Q121 255 82 289T42 382Q42 447 95 488T236 529Z" />
+<glyph unicode="&#x160;" horiz-adv-x="648" d="M318 731Q439 731 510 671T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 492 185 464T383 402Q498 379 554 331T611 196Q611 96 529 40T332 -17Q197 -17 117 50T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 130 674T318 731ZM258 922L327 826L397 922H474L371 779H278L174 922H258Z" />
+<glyph unicode="&#x161;" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 74 411 31T250 -12Q151 -12 93 31T31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 174 350 194T219 235Q124 254 83 288T42 382Q42 448 94 488T236 529ZM183 732L252 636L322 732H399L296 589H203L99 732H183Z" />
+<glyph unicode="&#x162;" horiz-adv-x="574" d="M573 714V634H335V0H240V634H2V714H573ZM342 -50V-129Q342 -206 243 -210V-175Q283 -167 283 -143V-138H231V-50H342Z" />
+<glyph unicode="&#x163;" horiz-adv-x="315" d="M182 672V517H285V442H182V118Q182 95 191 85T236 75H285V0H215Q149 0 123 22T97 108V442H9V517H97V672H182ZM241 -50V-129Q241 -206 142 -210V-175Q182 -167 182 -143V-138H130V-50H241Z" />
+<glyph unicode="&#x164;" horiz-adv-x="574" d="M573 714V634H335V0H240V634H2V714H573ZM220 922L289 826L359 922H436L333 779H240L136 922H220Z" />
+<glyph unicode="&#x165;" horiz-adv-x="315" d="M182 672V517H285V442H182V118Q182 95 191 85T236 75H285V0H215Q149 0 123 22T97 108V442H9V517H97V672H182ZM382 714L307 571H247L273 714H382Z" />
+<glyph unicode="&#x166;" horiz-adv-x="574" d="M573 714V634H335V487H479V426H335V0H240V426H98V487H240V634H2V714H573Z" />
+<glyph unicode="&#x167;" horiz-adv-x="315" d="M182 672V517H285V442H182V346H277V291H182V118Q182 95 191 85T236 75H285V0H215Q149 0 123 22T97 108V291H14V346H97V442H9V517H97V672H182Z" />
+<glyph unicode="&#x168;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM536 907Q517 797 435 796Q417 796 391 804T339 824Q314 835 294 835Q260 835 245 793H193Q217 903 299 903Q329 903 373 883Q417 863 438 863Q471 863 484 907H536Z" />
+<glyph unicode="&#x169;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM451 717Q432 608 350 606Q330 606 306 614T254 634Q226 645 209 645Q175 645 160 603H108Q132 713 214 713Q243 713 288 693Q335 673 353 673Q385 673 399 717H451Z" />
+<glyph unicode="&#x16A;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM534 872V817H193V872H534Z" />
+<glyph unicode="&#x16B;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM449 682V627H108V682H449Z" />
+<glyph unicode="&#x16C;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM257 919Q281 836 369 836Q404 836 426 853T468 919H519Q506 851 465 816T361 781Q228 781 207 919H257Z" />
+<glyph unicode="&#x16D;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM172 729Q196 646 284 646Q319 646 342 664T383 729H434Q421 662 380 627T276 591Q142 591 122 729H172Z" />
+<glyph unicode="&#x16E;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM362 973Q409 973 442 941T475 861Q475 815 442 782T362 749Q315 749 282 782T249 861Q249 908 282 940T362 973ZM295 860Q295 831 314 812T362 792Q392 792 410 812T429 860Q429 888 410 908T361 928Q334 928 315 909T295 860Z" />
+<glyph unicode="&#x16F;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM278 793Q325 793 358 760T391 681Q391 635 358 602T278 569Q231 569 198 601T165 681Q165 727 198 760T278 793ZM211 680Q211 652 229 632T278 612Q308 612 326 632T345 680Q345 708 327 728T277 748Q251 748 231 729T211 680Z" />
+<glyph unicode="&#x170;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 123 575 53T367 -17Q220 -17 147 53T74 253V714H169ZM433 922L313 779H247L328 922H433ZM589 922L469 779H403L484 922H589Z" />
+<glyph unicode="&#x171;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 107T407 222V517H492V0H412V82H410Q357 -12 242 -12Q64 -12 64 172V517H149ZM348 732L228 589H162L243 732H348ZM504 732L384 589H318L399 732H504Z" />
+<glyph unicode="&#x172;" horiz-adv-x="722" d="M169 714V254Q169 166 218 115T367 63Q460 63 506 115T553 254V714H648V253Q648 137 587 66T404 -15Q338 -73 338 -118Q338 -160 379 -160Q413 -160 438 -130L470 -148Q435 -210 362 -210Q319 -210 295 -191T270 -134Q270 -73 355 -17Q214 -14 144 55T74 253V714H169Z" />
+<glyph unicode="&#x173;" horiz-adv-x="556" d="M149 517V165Q149 120 177 92T254 63Q329 63 368 108T407 222V517H492V0H452Q368 -67 368 -118Q368 -160 409 -160Q446 -160 468 -130L500 -148Q465 -210 392 -210Q349 -210 325 -190T300 -134Q300 -64 412 0V82H410Q357 -12 242 -12Q64 -12 64 172V517H149Z" />
+<glyph unicode="&#x174;" horiz-adv-x="926" d="M109 714L249 120H251L411 714H514L672 120H674L819 714H914L723 0H624L461 600H459L294 0H195L12 714H109ZM510 922L614 779H530L461 875L391 779H314L417 922H510Z" />
+<glyph unicode="&#x175;" horiz-adv-x="758" d="M111 517L228 94H230L334 517H427L536 94H537L653 517H741L577 1L576 0H486L380 411H379L275 0H183L17 517H111ZM429 732L533 589H449L380 685L310 589H233L336 732H429Z" />
+<glyph unicode="&#x176;" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115ZM375 922L479 779H395L326 875L256 779H179L282 922H375Z" />
+<glyph unicode="&#x177;" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104ZM302 732L406 589H322L253 685L183 589H106L209 732H302Z" />
+<glyph unicode="&#x178;" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115ZM279 897V793H189V897H279ZM467 897V793H377V897H467Z" />
+<glyph unicode="&#x179;" horiz-adv-x="611" d="M578 714V634L135 80H590V0H22V80L466 634H56V714H578ZM459 922L328 779H264L350 922H459Z" />
+<glyph unicode="&#x17A;" horiz-adv-x="480" d="M444 517V459L128 75H458V0H22V65L334 442H42V517H444ZM388 732L257 589H193L279 732H388Z" />
+<glyph unicode="&#x17B;" horiz-adv-x="611" d="M578 714V634L135 80H590V0H22V80L466 634H56V714H578ZM357 897V793H267V897H357Z" />
+<glyph unicode="&#x17C;" horiz-adv-x="480" d="M444 517V459L128 75H458V0H22V65L334 442H42V517H444ZM288 708V604H198V708H288Z" />
+<glyph unicode="&#x17D;" horiz-adv-x="611" d="M578 714V634L135 80H590V0H22V80L466 634H56V714H578ZM245 922L314 826L384 922H461L358 779H265L161 922H245Z" />
+<glyph unicode="&#x17E;" horiz-adv-x="480" d="M444 517V459L128 75H458V0H22V65L334 442H42V517H444ZM175 732L244 636L314 732H391L288 589H195L91 732H175Z" />
+<glyph unicode="&#x192;" horiz-adv-x="556" d="M492 714L478 639H418Q368 639 358 589L326 449H428L414 381H314L260 75Q235 -66 194 -115T73 -165H3L17 -90H51Q134 -90 147 -29L226 381H134L147 449H238L264 584Q290 714 425 714H492Z" />
+<glyph unicode="&#x1FA;" horiz-adv-x="648" d="M445 973L341 867H277L343 973H445ZM325 849Q363 849 391 822T420 754Q420 711 386 682L656 0H551L473 215H171L91 0H-7L263 682Q229 708 229 754Q229 794 258 821T325 849ZM270 754Q270 731 285 715T325 698Q347 698 363 713T379 754Q379 780 363 794T325 809Q302 809 286 793T270 754ZM322 628L201 295H443L324 628H322Z" />
+<glyph unicode="&#x1FB;" horiz-adv-x="537" d="M418 922L289 796H226L309 922H418ZM272 771Q318 771 348 741T378 668Q378 627 348 596T272 565Q228 565 197 594T166 668Q166 709 196 740T272 771ZM211 668Q211 640 228 623T272 606Q299 606 316 623T333 668Q333 695 317 712T271 730Q245 730 228 713T211 668ZM275 529Q469 529 469 391V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 205 81 243T293 305Q348 312 366 327T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 275 529ZM126 139Q126 103 152 83T226 63Q291 63 337 96T384 178V267Q362 251 328 247L237 233Q180 225 153 203T126 139Z" />
+<glyph unicode="&#x1FC;" horiz-adv-x="926" d="M889 714V634H538V407H868V327H538V80H895V0H448V208H202L100 0H-7L354 714H889ZM239 288H448V634H407L239 288ZM723 922L592 779H528L614 922H723Z" />
+<glyph unicode="&#x1FD;" horiz-adv-x="870" d="M275 529Q343 529 385 512T448 454Q471 489 513 508T613 529Q726 529 785 458T846 233H467Q469 151 511 107T622 63Q674 63 708 89T753 163H840Q820 78 762 34T616 -12Q475 -12 429 89Q371 -10 211 -12Q128 -12 83 25T36 133Q36 180 54 211T105 260T225 294L299 307Q349 315 368 329T387 374Q387 414 361 433T271 454Q204 454 174 430T141 356H56Q66 527 275 529ZM756 308Q754 374 714 414T612 454Q548 454 509 414T467 308H756ZM126 139Q126 102 154 83T226 63Q294 63 340 97T387 178V267Q359 249 287 241Q186 229 156 205T126 139ZM611 732L480 589H416L502 732H611Z" />
+<glyph unicode="&#x1FE;" horiz-adv-x="760" d="M380 731Q522 731 612 643L691 730L723 700L641 610Q722 506 722 357Q722 190 627 87T380 -17Q243 -17 151 69L70 -20L37 10L121 102Q38 203 38 357Q38 517 130 624T380 731ZM133 357Q133 247 183 170L551 577H552Q486 651 379 651Q263 651 198 566T133 357ZM210 134Q274 63 380 63Q493 63 560 145T627 357Q627 462 579 541L210 134ZM520 922L389 779H325L411 922H520Z" />
+<glyph unicode="&#x1FF;" horiz-adv-x="574" d="M513 535L540 509L480 443Q538 373 538 258Q538 140 471 64T287 -12Q188 -12 122 45L62 -22L34 2L96 71Q36 143 36 258Q36 382 105 455T287 529Q392 529 455 470L513 535ZM126 258Q126 190 156 137L397 406H398Q355 454 286 454Q217 454 172 399T126 258ZM179 108Q222 63 287 63Q357 63 402 116T448 258Q448 322 420 377L179 108ZM435 732L304 589H240L326 732H435Z" />
+<glyph unicode="&#x218;" horiz-adv-x="648" d="M318 731Q439 731 510 671T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 492 185 464T383 402Q498 379 554 331T611 196Q611 96 529 40T332 -17Q197 -17 117 50T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 130 674T318 731ZM381 -50V-129Q381 -206 282 -210V-175Q322 -167 322 -143V-138H270V-50H381Z" />
+<glyph unicode="&#x219;" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 74 411 31T250 -12Q151 -12 93 31T31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 174 350 194T219 235Q124 254 83 288T42 382Q42 448 94 488T236 529ZM308 -50V-129Q308 -206 209 -210V-175Q249 -167 249 -143V-138H197V-50H308Z" />
+<glyph unicode="&#x21A;" horiz-adv-x="574" d="M573 714V634H335V0H240V634H2V714H573ZM342 -50V-129Q342 -206 243 -210V-175Q283 -167 283 -143V-138H231V-50H342Z" />
+<glyph unicode="&#x21B;" horiz-adv-x="315" d="M182 672V517H285V442H182V118Q182 95 191 85T236 75H285V0H215Q149 0 123 22T97 108V442H9V517H97V672H182ZM241 -50V-129Q241 -206 142 -210V-175Q182 -167 182 -143V-138H130V-50H241Z" />
+<glyph unicode="&#x237;" horiz-adv-x="222" d="M154 517V-69Q154 -134 122 -166T30 -198Q5 -198 -14 -194V-121Q-7 -123 14 -123Q27 -123 40 -120T61 -104T69 -56V517H154Z" />
+<glyph unicode="&#x2C6;" horiz-adv-x="222" d="M157 732L261 589H177L108 685L38 589H-39L64 732H157Z" />
+<glyph unicode="&#x2C7;" horiz-adv-x="222" d="M45 732L114 636L184 732H261L158 589H65L-39 732H45Z" />
+<glyph unicode="&#x2C9;" horiz-adv-x="222" d="M282 682V627H-59V682H282Z" />
+<glyph unicode="&#x2D8;" horiz-adv-x="222" d="M5 729Q29 646 117 646Q152 646 175 664T216 729H267Q254 662 213 627T109 591Q-25 591 -45 729H5Z" />
+<glyph unicode="&#x2D9;" horiz-adv-x="222" d="M156 708V604H66V708H156Z" />
+<glyph unicode="&#x2DA;" horiz-adv-x="222" d="M111 793Q158 793 191 760T224 681Q224 635 191 602T111 569Q64 569 31 601T-2 681Q-2 727 31 760T111 793ZM44 680Q44 652 62 632T111 612Q141 612 159 632T178 680Q178 708 160 728T110 748Q84 748 64 729T44 680Z" />
+<glyph unicode="&#x2DB;" horiz-adv-x="222" d="M228 0Q188 -33 166 -61T144 -118Q145 -159 185 -160Q221 -160 244 -130L276 -148Q241 -210 168 -210Q125 -210 101 -191T76 -134Q76 -65 188 0H228Z" />
+<glyph unicode="&#x2DC;" horiz-adv-x="222" d="M285 717Q266 608 184 606Q164 606 140 614T88 634Q60 645 43 645Q9 645 -6 603H-58Q-34 713 48 713Q77 713 122 693Q169 673 187 673Q219 673 233 717H285Z" />
+<glyph unicode="&#x2DD;" horiz-adv-x="222" d="M138 732L18 589H-48L33 732H138ZM294 732L174 589H108L189 732H294Z" />
+<glyph unicode="&#x374;" horiz-adv-x="222" d="M192 732L115 561H48L86 732H192Z" />
+<glyph unicode="&#x375;" horiz-adv-x="222" d="M168 -32L130 -203H24L101 -32H168Z" />
+<glyph unicode="&#x37E;" horiz-adv-x="278" d="M194 517V406H83V517H194ZM194 111V-1Q194 -48 168 -89T84 -147V-97Q110 -88 126 -63T142 -5V0H83V111H194Z" />
+<glyph unicode="&#x384;" horiz-adv-x="241" d="M231 732L156 589H88L121 732H231Z" />
+<glyph unicode="&#x385;" horiz-adv-x="332" d="M235 732L172 589H110L147 732H235ZM79 706V602H-5V706H79ZM337 706V602H253V706H337Z" />
+<glyph unicode="&#x386;" horiz-adv-x="655" d="M384 714L663 0H558L480 215H178L98 0H0L279 714H384ZM329 628L208 295H450L331 628H329ZM188 714L113 571H45L78 714H188Z" />
+<glyph unicode="&#x387;" horiz-adv-x="278" d="M194 517V406H83V517H194Z" />
+<glyph unicode="&#x388;" horiz-adv-x="754" d="M714 714V634H316V407H687V327H316V80H717V0H221V714H714ZM154 714L79 571H11L44 714H154Z" />
+<glyph unicode="&#x389;" horiz-adv-x="865" d="M316 714V407H692V714H787V0H692V327H316V0H221V714H316ZM154 714L79 571H11L44 714H154Z" />
+<glyph unicode="&#x38A;" horiz-adv-x="394" d="M316 714V0H221V714H316ZM154 714L79 571H11L44 714H154Z" />
+<glyph unicode="&#x38C;" horiz-adv-x="865" d="M485 731Q640 731 733 626T827 357Q827 191 732 87T485 -17Q331 -17 237 88T143 357Q143 517 235 624T485 731ZM238 357Q238 226 305 145T485 63Q597 63 664 143T732 357Q732 486 666 568T484 651Q370 651 304 568T238 357ZM154 714L79 571H11L44 714H154Z" />
+<glyph unicode="&#x38E;" horiz-adv-x="842" d="M309 714L523 374L732 714H840L567 292V0H472V292L196 714H309ZM154 714L79 571H11L44 714H154Z" />
+<glyph unicode="&#x38F;" horiz-adv-x="868" d="M491 731Q638 731 731 637T825 401Q825 201 661 84V80H836V0H554V72Q730 192 730 401Q730 509 664 580T491 651Q382 651 315 580T247 392Q247 195 427 72V0H144V80H315V84Q152 197 152 391Q152 538 247 634T491 731ZM154 714L79 571H11L44 714H154Z" />
+<glyph unicode="&#x390;" horiz-adv-x="237" d="M154 517V109Q154 62 189 62Q204 62 224 67V1Q196 -12 158 -12Q69 -12 69 86V517H154ZM193 732L130 589H68L105 732H193ZM37 706V602H-47V706H37ZM295 706V602H211V706H295Z" />
+<glyph unicode="&#x391;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322Z" />
+<glyph unicode="&#x392;" horiz-adv-x="685" d="M383 714Q515 714 562 660T610 539Q610 482 583 441T504 379V377Q570 363 605 317T640 205Q640 117 579 59T427 0H78V714H383ZM368 407Q440 407 477 433T515 521Q515 577 484 605T369 634H173V407H368ZM415 80Q473 80 509 114T545 208Q545 327 386 327H173V80H415Z" />
+<glyph unicode="&#x393;" horiz-adv-x="552" d="M546 714V634H173V0H78V714H546Z" />
+<glyph unicode="&#x394;" horiz-adv-x="648" d="M377 714L653 0H-4L272 714H377ZM323 629L124 80H518L325 629H323Z" />
+<glyph unicode="&#x395;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571Z" />
+<glyph unicode="&#x396;" horiz-adv-x="611" d="M578 714V634L135 80H590V0H22V80L466 634H56V714H578Z" />
+<glyph unicode="&#x397;" horiz-adv-x="722" d="M173 714V407H549V714H644V0H549V327H173V0H78V714H173Z" />
+<glyph unicode="&#x398;" horiz-adv-x="760" d="M380 731Q541 731 631 623T722 357Q722 195 629 89T380 -17Q224 -17 131 89T38 357Q38 517 130 624T380 731ZM133 357Q133 225 200 144T380 63Q492 63 559 144T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357ZM528 408V328H228V408H528Z" />
+<glyph unicode="&#x399;" horiz-adv-x="259" d="M177 714V0H82V714H177Z" />
+<glyph unicode="&#x39A;" horiz-adv-x="667" d="M173 714V358L535 714H658L357 426L670 0H550L292 361L173 250V0H78V714H173Z" />
+<glyph unicode="&#x39B;" horiz-adv-x="613" d="M361 714L621 0H518L307 619H305L92 0H-7L255 714H361Z" />
+<glyph unicode="&#x39C;" horiz-adv-x="871" d="M210 714L435 114L661 714H791V0H701V594H699L476 0H395L172 594H170V0H80V714H210Z" />
+<glyph unicode="&#x39D;" horiz-adv-x="722" d="M178 714L554 135H556V714H646V0H542L169 573H167V0H77V714H178Z" />
+<glyph unicode="&#x39E;" horiz-adv-x="570" d="M523 714V634H47V714H523ZM489 407V327H81V407H489ZM533 80V0H37V80H533Z" />
+<glyph unicode="&#x39F;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357Z" />
+<glyph unicode="&#x3A0;" horiz-adv-x="715" d="M637 714V0H542V634H173V0H78V714H637Z" />
+<glyph unicode="&#x3A1;" horiz-adv-x="648" d="M396 714Q493 714 551 661T610 503Q610 402 555 347T402 292H173V0H78V714H396ZM369 372Q437 372 476 404T515 503Q515 634 363 634H173V372H369Z" />
+<glyph unicode="&#x3A3;" horiz-adv-x="610" d="M559 714V634H178L434 376V372L164 80H576V0H42V77L318 371L54 637V714H559Z" />
+<glyph unicode="&#x3A4;" horiz-adv-x="574" d="M573 714V634H335V0H240V634H2V714H573Z" />
+<glyph unicode="&#x3A5;" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115Z" />
+<glyph unicode="&#x3A6;" horiz-adv-x="777" d="M436 744V675Q582 670 660 594T739 372Q739 234 662 157T436 75V0H341V75Q38 86 38 368Q38 505 117 587T341 675V744H436ZM133 368Q133 262 183 211T342 155V595Q133 583 133 368ZM435 155Q542 160 593 213T644 372Q644 585 435 595V155Z" />
+<glyph unicode="&#x3A7;" horiz-adv-x="611" d="M127 714L305 435L491 714H597L361 367L612 0H496L304 295L106 0H-1L248 367L13 714H127Z" />
+<glyph unicode="&#x3A8;" horiz-adv-x="827" d="M166 714V437Q166 330 215 285T366 240V714H461V240Q569 241 615 290T661 437V714H756V434Q756 167 461 157V0H366V157Q216 157 144 224T71 434V714H166Z" />
+<glyph unicode="&#x3A9;" horiz-adv-x="759" d="M382 731Q529 731 622 637T716 401Q716 201 552 84V80H727V0H445V72Q621 192 621 401Q621 509 555 580T382 651Q273 651 206 580T138 392Q138 195 318 72V0H35V80H206V84Q43 197 43 391Q43 538 138 634T382 731Z" />
+<glyph unicode="&#x3AA;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM81 897V793H-9V897H81ZM269 897V793H179V897H269Z" />
+<glyph unicode="&#x3AB;" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115ZM279 897V793H189V897H279ZM467 897V793H377V897H467Z" />
+<glyph unicode="&#x3AC;" horiz-adv-x="587" d="M272 529Q321 529 360 508T422 448H424V517H509V110Q509 89 518 76T542 62Q561 62 574 66V0Q548 -12 515 -12Q436 -12 426 76H424Q380 -10 261 -12Q162 -12 100 64T36 260Q36 343 67 405T152 498T272 529ZM126 254Q127 166 168 115T273 63Q347 64 386 115T427 258Q427 345 387 399T278 454Q206 454 167 402T126 254ZM394 732L319 589H251L284 732H394Z" />
+<glyph unicode="&#x3AD;" horiz-adv-x="485" d="M249 529Q425 529 447 378H363Q351 456 249 456Q137 456 137 379Q137 342 159 324T216 306H300V233H218Q122 233 122 151Q122 61 251 61Q313 61 344 86T383 164H470Q456 73 398 31T234 -12Q144 -12 88 30T31 146Q31 191 55 224T123 268V270Q48 298 48 377Q48 444 103 486T249 529ZM350 732L275 589H207L240 732H350Z" />
+<glyph unicode="&#x3AE;" horiz-adv-x="557" d="M314 529Q492 529 492 344V-198H407V353Q407 396 380 425T301 454Q229 454 189 410T149 295V0H64V517H144V435H146Q200 529 314 529ZM396 732L321 589H253L286 732H396Z" />
+<glyph unicode="&#x3AF;" horiz-adv-x="237" d="M154 517V109Q154 62 189 62Q204 62 224 67V1Q196 -12 158 -12Q69 -12 69 86V517H154ZM223 732L148 589H80L113 732H223Z" />
+<glyph unicode="&#x3B0;" horiz-adv-x="527" d="M145 517V187Q145 124 171 94T262 63Q405 63 405 273Q405 333 389 399T343 517H435Q460 470 475 405T491 275Q491 138 433 63T262 -12Q60 -12 60 166V517H145ZM333 732L270 589H208L245 732H333ZM177 706V602H93V706H177ZM435 706V602H351V706H435Z" />
+<glyph unicode="&#x3B1;" horiz-adv-x="587" d="M272 529Q321 529 360 508T422 448H424V517H509V110Q509 89 518 76T542 62Q561 62 574 66V0Q548 -12 515 -12Q436 -12 426 76H424Q380 -10 261 -12Q162 -12 100 64T36 260Q36 343 67 405T152 498T272 529ZM126 254Q127 166 168 115T273 63Q347 64 386 115T427 258Q427 345 387 399T278 454Q206 454 167 402T126 254Z" />
+<glyph unicode="&#x3B2;" horiz-adv-x="564" d="M273 731Q374 731 426 684T478 559Q478 511 454 474T389 424V422Q457 408 492 356T528 220Q528 112 463 50T310 -12Q202 -12 152 68V-198H67V522Q67 625 116 678T273 731ZM152 253Q152 167 189 115T295 63Q361 63 399 103T438 209Q438 367 312 367H248V435H263Q302 435 326 445T369 485T388 559Q388 605 358 631T272 657Q208 657 180 621T152 509V253Z" />
+<glyph unicode="&#x3B3;" horiz-adv-x="465" d="M108 517Q144 457 184 331T237 106H241Q325 270 364 517H453Q408 231 263 -12V-198H175V-47Q175 55 126 224T14 517H108Z" />
+<glyph unicode="&#x3B4;" horiz-adv-x="554" d="M296 731Q385 731 449 701V626Q413 641 369 650T295 660Q206 660 206 611Q206 595 230 574T331 507Q435 442 476 384T518 247Q518 129 456 59T283 -12Q171 -12 104 58T36 249Q36 343 83 403T221 486Q167 518 143 548T119 615Q119 666 165 698T296 731ZM126 249Q126 161 167 112T283 63Q351 63 389 112T428 247Q428 368 284 446Q126 421 126 249Z" />
+<glyph unicode="&#x3B5;" horiz-adv-x="485" d="M249 529Q425 529 447 378H363Q351 456 249 456Q137 456 137 379Q137 342 159 324T216 306H300V233H218Q122 233 122 151Q122 61 251 61Q313 61 344 86T383 164H470Q456 73 398 31T234 -12Q144 -12 88 30T31 146Q31 191 55 224T123 268V270Q48 298 48 377Q48 444 103 486T249 529Z" />
+<glyph unicode="&#x3B6;" horiz-adv-x="433" d="M433 714V646Q279 584 204 493T128 273Q128 74 288 74H317Q380 69 404 37T429 -52Q429 -104 417 -154H335Q347 -101 347 -66Q347 -30 337 -15T304 0H263Q151 5 95 75T38 262Q38 390 102 487T288 639H85V714H433Z" />
+<glyph unicode="&#x3B7;" horiz-adv-x="557" d="M314 529Q492 529 492 344V-198H407V353Q407 396 380 425T301 454Q229 454 189 410T149 295V0H64V517H144V435H146Q200 529 314 529Z" />
+<glyph unicode="&#x3B8;" horiz-adv-x="534" d="M267 731Q381 731 439 643T498 359Q498 169 441 79T267 -12Q151 -12 94 78T36 359Q36 731 267 731ZM406 400Q402 528 371 592T266 656Q212 656 181 624T139 526T127 400H406ZM267 63Q344 63 373 119T407 333H127Q129 177 160 120T267 63Z" />
+<glyph unicode="&#x3B9;" horiz-adv-x="237" d="M154 517V109Q154 62 189 62Q204 62 224 67V1Q196 -12 158 -12Q69 -12 69 86V517H154Z" />
+<glyph unicode="&#x3BA;" horiz-adv-x="514" d="M149 517V278L385 517H499L290 318L514 0H406L229 256H228L149 182V0H64V517H149Z" />
+<glyph unicode="&#x3BB;" horiz-adv-x="518" d="M123 731Q175 731 205 705T266 598L449 88Q456 69 463 66T480 62Q497 62 512 67V1Q486 -12 459 -12Q396 -12 378 43L260 392H258L108 0H12L219 486L168 616Q153 656 106 656Q83 656 59 650L58 720Q90 731 123 731Z" />
+<glyph unicode="&#x3BC;" horiz-adv-x="556" d="M152 517V164Q152 119 179 91T255 63Q325 63 366 107T407 222V517H492V0H412V82H410Q353 -12 253 -12Q187 -12 154 23H152V-198H67V517H152Z" />
+<glyph unicode="&#x3BD;" horiz-adv-x="484" d="M109 517L250 87Q299 192 335 308T384 517H472Q430 268 291 0H200L14 517H109Z" />
+<glyph unicode="&#x3BE;" horiz-adv-x="425" d="M272 731Q340 731 409 705V630Q341 658 272 658Q218 658 184 625T149 530Q149 475 187 446T288 416H385V341H284Q127 341 127 205Q127 141 166 107T275 73L303 74Q425 74 425 -52Q425 -108 413 -154H331Q343 -101 343 -65Q343 -24 329 -11T283 2L253 0Q157 0 98 56T38 199Q38 339 170 379V381Q120 398 91 439T62 530Q62 622 120 676T272 731Z" />
+<glyph unicode="&#x3BF;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258Z" />
+<glyph unicode="&#x3C0;" horiz-adv-x="658" d="M635 517V442H529V113Q529 62 573 62Q590 62 608 67V1Q576 -12 540 -12Q444 -12 444 87V442H207V0H122V442H20V517H635Z" />
+<glyph unicode="&#x3C1;" horiz-adv-x="570" d="M295 529Q407 529 470 452T534 257Q534 141 474 65T306 -12Q260 -12 215 11T147 69H145V-198H60V262Q60 384 124 456T295 529ZM143 259Q143 170 184 116T298 62Q360 62 402 119T444 263Q444 349 406 401T290 454Q223 454 183 404T143 259Z" />
+<glyph unicode="&#x3C2;" horiz-adv-x="513" d="M281 529Q366 529 418 490T488 378H399Q371 454 281 454Q206 454 166 404T126 262Q126 170 169 122T287 74H320Q383 74 414 44T445 -52Q445 -106 433 -154H351Q363 -106 363 -65Q363 -31 353 -16T311 0H274Q165 0 101 70T36 262Q36 387 100 458T281 529Z" />
+<glyph unicode="&#x3C3;" horiz-adv-x="565" d="M563 517V442H443Q479 415 501 365T523 258Q523 146 457 67T281 -12Q172 -12 104 62T36 258Q36 373 109 445T301 517H563ZM126 258Q126 169 169 116T281 63Q353 63 393 115T433 258Q433 384 362 443H317Q226 443 176 396T126 258Z" />
+<glyph unicode="&#x3C4;" horiz-adv-x="452" d="M449 517V442H260V113Q260 88 270 75T310 62Q331 62 349 67V1Q317 -12 277 -12Q175 -12 175 87V442H3V517H449Z" />
+<glyph unicode="&#x3C5;" horiz-adv-x="527" d="M145 517V187Q145 124 171 94T262 63Q405 63 405 273Q405 333 389 399T343 517H435Q460 470 475 405T491 275Q491 138 433 63T262 -12Q60 -12 60 166V517H145Z" />
+<glyph unicode="&#x3C6;" horiz-adv-x="716" d="M400 666V530Q532 528 608 456T684 263Q684 136 610 66T402 -9V-198H315V-9Q179 -5 106 63T32 261Q32 384 108 457T315 530V666H400ZM400 67H405Q494 67 544 119T594 263Q594 351 543 404T408 457H400V67ZM122 261Q122 168 171 117T310 65H315V455H306Q223 455 173 401T122 261Z" />
+<glyph unicode="&#x3C7;" horiz-adv-x="449" d="M106 517L227 269L348 517H444L272 191L459 -198H360L221 102L89 -198H-10L179 185L10 517H106Z" />
+<glyph unicode="&#x3C8;" horiz-adv-x="662" d="M377 665V63Q539 75 539 273Q539 330 524 396T477 517H566Q593 468 607 401T622 276Q622 148 561 72T377 -12V-198H292V-12Q176 -4 120 62T64 237V517H149V245Q149 75 292 63V665H377Z" />
+<glyph unicode="&#x3C9;" horiz-adv-x="719" d="M218 517Q126 396 126 243Q126 155 153 109T231 63Q317 63 317 175V403H399V175Q399 123 420 93T486 63Q593 63 593 244Q593 396 501 517H599Q683 406 683 238Q683 131 629 60T491 -12Q443 -12 407 15T356 96Q320 -12 221 -12Q136 -12 86 56T36 236Q36 401 121 517H218Z" />
+<glyph unicode="&#x3CA;" horiz-adv-x="237" d="M154 517V109Q154 62 189 62Q204 62 224 67V1Q196 -12 158 -12Q69 -12 69 86V517H154ZM63 706V602H-27V706H63ZM251 706V602H161V706H251Z" />
+<glyph unicode="&#x3CB;" horiz-adv-x="527" d="M145 517V187Q145 124 171 94T262 63Q405 63 405 273Q405 333 389 399T343 517H435Q460 470 475 405T491 275Q491 138 433 63T262 -12Q60 -12 60 166V517H145ZM211 706V602H121V706H211ZM399 706V602H309V706H399Z" />
+<glyph unicode="&#x3CC;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258ZM390 732L315 589H247L280 732H390Z" />
+<glyph unicode="&#x3CD;" horiz-adv-x="527" d="M145 517V187Q145 124 171 94T262 63Q405 63 405 273Q405 333 389 399T343 517H435Q460 470 475 405T491 275Q491 138 433 63T262 -12Q60 -12 60 166V517H145ZM358 732L283 589H215L248 732H358Z" />
+<glyph unicode="&#x3CE;" horiz-adv-x="719" d="M218 517Q126 396 126 243Q126 155 153 109T231 63Q317 63 317 175V403H399V175Q399 123 420 93T486 63Q593 63 593 244Q593 396 501 517H599Q683 406 683 238Q683 131 629 60T491 -12Q443 -12 407 15T356 96Q320 -12 221 -12Q136 -12 86 56T36 236Q36 401 121 517H218ZM469 732L394 589H326L359 732H469Z" />
+<glyph unicode="&#x400;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM275 922L361 779H297L166 922H275Z" />
+<glyph unicode="&#x401;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571ZM270 897V793H180V897H270ZM458 897V793H368V897H458Z" />
+<glyph unicode="&#x402;" horiz-adv-x="746" d="M573 714V634H303V359H305Q360 442 475 442Q585 442 648 368T711 173Q711 44 632 -44T430 -135V-54H431Q519 -46 567 15T616 173Q616 264 576 313T461 363Q389 363 346 316T303 190V0H208V634H2V714H573Z" />
+<glyph unicode="&#x403;" horiz-adv-x="552" d="M546 714V634H173V0H78V714H546ZM429 922L298 779H234L320 922H429Z" />
+<glyph unicode="&#x404;" horiz-adv-x="722" d="M380 731Q501 731 581 670T676 508H581Q565 577 512 614T378 651Q276 651 213 588T140 414H484V334H138Q140 208 204 136T377 63Q463 63 517 109T586 247H681Q663 120 582 52T373 -17Q220 -17 132 83T43 355Q43 525 134 628T380 731Z" />
+<glyph unicode="&#x405;" horiz-adv-x="648" d="M318 731Q439 731 510 671T581 505H491Q475 651 314 651Q237 651 196 620T154 529Q154 492 185 464T383 402Q498 379 554 331T611 196Q611 96 529 40T332 -17Q197 -17 117 50T37 235H127Q128 152 185 108T335 63Q422 63 469 96T516 193Q516 245 471 275T315 327Q158 358 109 403T59 522Q59 617 130 674T318 731Z" />
+<glyph unicode="&#x406;" horiz-adv-x="259" d="M177 714V0H82V714H177Z" />
+<glyph unicode="&#x407;" horiz-adv-x="259" d="M177 714V0H82V714H177ZM81 897V793H-9V897H81ZM269 897V793H179V897H269Z" />
+<glyph unicode="&#x408;" horiz-adv-x="519" d="M441 714V175Q441 84 386 34T230 -17Q133 -17 78 34T22 210V235H117V211Q117 130 143 97T232 63Q346 63 346 188V714H441Z" />
+<glyph unicode="&#x409;" horiz-adv-x="1000" d="M564 714V421H742Q847 421 904 368T962 210Q962 112 903 56T741 0H469V632H247L231 197Q227 96 180 40T59 -17Q28 -17 -4 -4V77Q24 67 47 67Q98 67 117 105T139 221L154 714H564ZM716 80Q868 80 868 210Q868 276 828 308T716 341H564V80H716Z" />
+<glyph unicode="&#x40A;" horiz-adv-x="1000" d="M173 714V421H475V714H570V421H742Q847 421 904 368T962 210Q962 112 903 56T741 0H475V341H173V0H78V714H173ZM716 80Q868 80 868 210Q868 276 828 308T716 341H570V80H716Z" />
+<glyph unicode="&#x40B;" horiz-adv-x="746" d="M573 714V634H303V412Q393 442 479 442Q588 442 645 391T702 244V0H607V229Q607 299 577 329T469 360Q399 360 303 330V0H208V634H2V714H573Z" />
+<glyph unicode="&#x40C;" horiz-adv-x="667" d="M173 714V358L535 714H658L357 426L670 0H550L292 361L173 250V0H78V714H173ZM471 922L340 779H276L362 922H471Z" />
+<glyph unicode="&#x40D;" horiz-adv-x="722" d="M173 714V117H175L524 714H644V0H549V599H547L197 0H78V714H173ZM329 922L415 779H351L220 922H329Z" />
+<glyph unicode="&#x40E;" horiz-adv-x="611" d="M103 714L309 278L515 714H616L313 102Q254 -17 146 -17Q102 -17 62 -2V78Q107 63 132 63Q172 63 199 88T258 189L0 714H103ZM205 919Q229 836 317 836Q352 836 374 853T416 919H467Q454 851 413 816T309 781Q176 781 155 919H205Z" />
+<glyph unicode="&#x40F;" horiz-adv-x="722" d="M173 714V80H549V714H644V0H409V-177H314V0H78V714H173Z" />
+<glyph unicode="&#x410;" horiz-adv-x="648" d="M377 714L656 0H551L473 215H171L91 0H-7L272 714H377ZM322 628L201 295H443L324 628H322Z" />
+<glyph unicode="&#x411;" horiz-adv-x="672" d="M567 714V634H173V421H410Q515 421 572 368T630 210Q630 109 571 55T409 0H78V714H567ZM383 80Q535 80 535 210Q535 276 495 308T383 341H173V80H383Z" />
+<glyph unicode="&#x412;" horiz-adv-x="685" d="M383 714Q515 714 562 660T610 539Q610 482 583 441T504 379V377Q570 363 605 317T640 205Q640 117 579 59T427 0H78V714H383ZM368 407Q440 407 477 433T515 521Q515 577 484 605T369 634H173V407H368ZM415 80Q473 80 509 114T545 208Q545 327 386 327H173V80H415Z" />
+<glyph unicode="&#x413;" horiz-adv-x="552" d="M546 714V634H173V0H78V714H546Z" />
+<glyph unicode="&#x414;" horiz-adv-x="722" d="M631 714V80H710V-177H615V0H104V-177H9V80H79Q172 275 172 527V714H631ZM266 524Q266 270 183 80H536V634H266V524Z" />
+<glyph unicode="&#x415;" horiz-adv-x="611" d="M571 714V634H173V407H544V327H173V80H574V0H78V714H571Z" />
+<glyph unicode="&#x416;" horiz-adv-x="1003" d="M143 714L454 382V714H549V382L862 714H979L695 421L1011 0H893L633 359L549 269V0H454V269L370 357L109 0H-8L307 417L24 714H143Z" />
+<glyph unicode="&#x417;" horiz-adv-x="654" d="M342 731Q420 731 473 707T556 639T586 534Q586 484 553 442T468 382V379Q532 366 571 319T611 203Q611 141 577 92T478 13T331 -17Q196 -17 119 47T41 235H132Q135 148 188 104T335 60Q415 60 465 99T517 205Q517 256 494 284T432 323T323 334Q291 334 273 333V411Q276 410 337 410Q401 410 433 428T478 471T492 529Q492 588 454 620T339 653Q255 653 212 617T160 507H69Q74 617 147 674T342 731Z" />
+<glyph unicode="&#x418;" horiz-adv-x="722" d="M173 714V117H175L524 714H644V0H549V599H547L197 0H78V714H173Z" />
+<glyph unicode="&#x419;" horiz-adv-x="722" d="M173 714V117H175L524 714H644V0H549V599H547L197 0H78V714H173ZM260 919Q284 836 372 836Q407 836 429 853T471 919H522Q509 851 468 816T364 781Q231 781 210 919H260Z" />
+<glyph unicode="&#x41A;" horiz-adv-x="667" d="M173 714V358L535 714H658L357 426L670 0H550L292 361L173 250V0H78V714H173Z" />
+<glyph unicode="&#x41B;" horiz-adv-x="682" d="M601 714V0H506V632H247L231 197Q227 96 180 40T59 -17Q28 -17 -4 -4V77Q24 67 47 67Q98 67 117 105T139 221L154 714H601Z" />
+<glyph unicode="&#x41C;" horiz-adv-x="871" d="M210 714L435 114L661 714H791V0H701V594H699L476 0H395L172 594H170V0H80V714H210Z" />
+<glyph unicode="&#x41D;" horiz-adv-x="722" d="M173 714V407H549V714H644V0H549V327H173V0H78V714H173Z" />
+<glyph unicode="&#x41E;" horiz-adv-x="760" d="M380 731Q535 731 628 626T722 357Q722 191 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM133 357Q133 226 200 145T380 63Q492 63 559 143T627 357Q627 486 561 568T379 651Q265 651 199 568T133 357Z" />
+<glyph unicode="&#x41F;" horiz-adv-x="722" d="M644 714V0H549V634H173V0H78V714H644Z" />
+<glyph unicode="&#x420;" horiz-adv-x="648" d="M396 714Q493 714 551 661T610 503Q610 402 555 347T402 292H173V0H78V714H396ZM369 372Q437 372 476 404T515 503Q515 634 363 634H173V372H369Z" />
+<glyph unicode="&#x421;" horiz-adv-x="722" d="M381 731Q500 731 579 669T675 499H580Q564 573 512 612T380 651Q272 651 205 573T138 362Q138 222 203 143T381 63Q471 63 526 120T587 269H682Q667 130 587 57T373 -17Q221 -17 132 83T43 355Q43 522 134 626T381 731Z" />
+<glyph unicode="&#x422;" horiz-adv-x="574" d="M573 714V634H335V0H240V634H2V714H573Z" />
+<glyph unicode="&#x423;" horiz-adv-x="611" d="M103 714L309 278L515 714H616L313 102Q254 -17 146 -17Q102 -17 62 -2V78Q107 63 132 63Q172 63 199 88T258 189L0 714H103Z" />
+<glyph unicode="&#x424;" horiz-adv-x="778" d="M437 714V638Q577 634 662 558T747 359Q747 240 667 167T437 85V0H342V85Q202 87 117 163T31 359Q31 479 116 555T342 638V714H437ZM125 359Q125 272 179 221T342 162V561Q241 557 183 504T125 359ZM437 162Q543 167 598 218T653 359Q653 448 597 502T437 561V162Z" />
+<glyph unicode="&#x425;" horiz-adv-x="611" d="M127 714L305 435L491 714H597L361 367L612 0H496L304 295L106 0H-1L248 367L13 714H127Z" />
+<glyph unicode="&#x426;" horiz-adv-x="722" d="M173 714V80H536V714H631V80H710V-177H615V0H78V714H173Z" />
+<glyph unicode="&#x427;" horiz-adv-x="669" d="M143 714V513Q143 444 180 410T305 375Q385 375 496 399V714H591V0H496V317Q373 292 300 292Q174 292 111 347T48 499V714H143Z" />
+<glyph unicode="&#x428;" horiz-adv-x="1073" d="M173 714V80H488V714H583V80H898V714H993V0H78V714H173Z" />
+<glyph unicode="&#x429;" horiz-adv-x="1084" d="M173 714V80H488V714H583V80H898V714H993V80H1072V-177H977V0H78V714H173Z" />
+<glyph unicode="&#x42A;" horiz-adv-x="803" d="M328 714V421H546Q648 421 706 368T765 210Q765 112 706 56T544 0H233V634H2V714H328ZM519 80Q670 80 670 210Q670 341 519 341H328V80H519Z" />
+<glyph unicode="&#x42B;" horiz-adv-x="871" d="M173 714V421H391Q492 421 551 368T610 210Q610 112 551 56T389 0H78V714H173ZM793 714V0H698V714H793ZM363 80Q515 80 515 210Q515 276 475 308T363 341H173V80H363Z" />
+<glyph unicode="&#x42C;" horiz-adv-x="648" d="M173 714V421H391Q492 421 551 368T610 210Q610 112 551 56T389 0H78V714H173ZM363 80Q515 80 515 210Q515 276 475 308T363 341H173V80H363Z" />
+<glyph unicode="&#x42D;" horiz-adv-x="722" d="M352 731Q503 731 591 631T679 355Q679 189 586 86T350 -17Q220 -17 139 53T43 247H138Q166 64 353 64Q451 64 514 136T584 334H238V414H580Q569 526 510 588T354 650Q279 650 223 614T143 508H48Q74 615 158 673T352 731Z" />
+<glyph unicode="&#x42E;" horiz-adv-x="1000" d="M635 731Q784 731 873 628T962 357Q962 187 872 85T635 -17Q496 -17 408 75T310 331H173V0H78V714H173V411H311Q327 559 414 645T635 731ZM402 357Q402 228 463 146T635 63Q742 63 804 142T867 357Q867 493 805 572T634 651Q524 651 463 569T402 357Z" />
+<glyph unicode="&#x42F;" horiz-adv-x="665" d="M587 714V0H492V305H345L109 0H-6L232 309Q147 320 101 371T55 509Q55 603 113 658T275 714H587ZM150 509Q150 385 297 385H492V634H286Q223 634 187 602T150 509Z" />
+<glyph unicode="&#x430;" horiz-adv-x="537" d="M276 529Q469 529 469 390V92Q469 63 496 63Q509 63 522 68V2Q497 -12 461 -12Q389 -12 389 68Q321 -12 207 -12Q127 -12 82 25T36 133Q36 202 81 243T290 305Q346 312 365 326T385 369Q385 454 270 454Q207 454 176 431T141 356H56Q66 529 276 529ZM126 139Q126 103 152 83T226 63Q295 63 339 97T384 178V267Q361 251 324 246L237 233Q180 225 153 203T126 139Z" />
+<glyph unicode="&#x431;" horiz-adv-x="574" d="M510 714Q500 663 463 639T334 606Q239 597 189 554T116 399H119Q150 455 200 485T314 515Q415 515 476 446T538 259Q538 136 468 62T288 -12Q170 -12 104 62T38 278Q38 472 101 562T289 673L359 684Q397 690 408 695T425 714H510ZM125 256Q125 167 171 114T289 61Q359 61 403 116T448 257Q448 344 407 394T293 444Q220 444 173 392T125 256Z" />
+<glyph unicode="&#x432;" horiz-adv-x="537" d="M308 517Q479 517 479 391Q479 315 404 279V278Q502 251 502 152Q502 87 458 44T349 0H64V517H308ZM304 308Q393 308 393 377Q393 444 302 444H147V308H304ZM332 73Q369 73 392 94T416 154Q416 194 389 215T317 236H147V73H332Z" />
+<glyph unicode="&#x433;" horiz-adv-x="422" d="M418 517V442H149V0H64V517H418Z" />
+<glyph unicode="&#x434;" horiz-adv-x="574" d="M494 517V75H561V-164H476V0H90V-164H5V75H61Q126 224 126 385V517H494ZM409 75V442H210V407Q210 298 196 223T149 75H409Z" />
+<glyph unicode="&#x435;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423Z" />
+<glyph unicode="&#x436;" horiz-adv-x="777" d="M136 517L344 282H346V517H431V277H433L645 517H748L551 302L777 0H672L495 248L431 181V0H346V179L280 248L104 0H0L227 302L29 517H136Z" />
+<glyph unicode="&#x437;" horiz-adv-x="500" d="M253 529Q342 529 394 491T446 383Q446 310 361 279V277Q463 248 463 152Q463 78 402 33T244 -12Q34 -12 25 163H111Q121 57 244 57Q305 57 340 82T375 150Q375 234 269 234H194V307H256Q360 307 360 379Q360 416 332 438T252 460Q134 460 122 367H36Q43 445 99 487T253 529Z" />
+<glyph unicode="&#x438;" horiz-adv-x="556" d="M149 517V97H151L383 517H492V0H407V420H405L173 0H64V517H149Z" />
+<glyph unicode="&#x439;" horiz-adv-x="556" d="M149 517V97H151L383 517H492V0H407V420H405L173 0H64V517H149ZM172 729Q196 646 284 646Q319 646 342 664T383 729H434Q421 662 380 627T276 591Q142 591 122 729H172Z" />
+<glyph unicode="&#x43A;" horiz-adv-x="514" d="M149 517V278L385 517H499L290 318L514 0H406L229 256H228L149 182V0H64V517H149Z" />
+<glyph unicode="&#x43B;" horiz-adv-x="546" d="M482 517V0H397V442H210L199 169Q193 -11 61 -11Q31 -11 2 0V70Q21 62 45 62Q81 62 97 89T117 182L128 517H482Z" />
+<glyph unicode="&#x43C;" horiz-adv-x="688" d="M187 517L344 95H346L503 517H624V0H539V410H536L383 0H305L152 410H149V0H64V517H187Z" />
+<glyph unicode="&#x43D;" horiz-adv-x="556" d="M149 517V311H407V517H492V0H407V236H149V0H64V517H149Z" />
+<glyph unicode="&#x43E;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 140 471 64T287 -12Q173 -12 105 61T36 258Q36 382 103 455T287 529ZM126 258Q126 171 171 117T287 63Q357 63 402 116T448 258Q448 345 403 399T286 454Q217 454 172 399T126 258Z" />
+<glyph unicode="&#x43F;" horiz-adv-x="556" d="M492 517V0H407V442H149V0H64V517H492Z" />
+<glyph unicode="&#x440;" horiz-adv-x="593" d="M319 529Q429 529 493 455T557 257Q557 136 493 62T321 -12Q273 -12 227 7T154 69H152V-198H67V517H152V447H154Q195 529 319 529ZM149 259Q149 169 191 116T312 63Q386 63 426 115T467 263Q467 348 424 401T306 454Q234 454 192 402T149 259Z" />
+<glyph unicode="&#x441;" horiz-adv-x="537" d="M280 529Q374 529 433 485T503 351H415Q393 454 287 454Q208 454 167 402T126 252Q126 167 166 115T277 63Q339 63 375 96T419 189H506Q492 92 434 40T278 -12Q166 -12 101 58T36 252Q36 380 101 454T280 529Z" />
+<glyph unicode="&#x442;" horiz-adv-x="463" d="M459 517V442H274V0H189V442H4V517H459Z" />
+<glyph unicode="&#x443;" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104Z" />
+<glyph unicode="&#x444;" horiz-adv-x="801" d="M443 714V473H446Q496 529 566 529Q655 529 708 457T761 266Q761 135 707 62T554 -12Q486 -12 445 39H443V-198H358V41H356Q309 -12 238 -12Q145 -12 93 62T40 266Q40 391 95 460T241 529Q318 529 355 473H358V714H443ZM128 264Q128 168 161 114T258 59Q285 59 308 70T344 97T358 126V386Q343 421 315 439T252 458Q193 458 161 409T128 264ZM443 126Q450 96 478 78T543 59Q607 59 640 114T673 264Q673 458 547 458Q470 458 443 387V126Z" />
+<glyph unicode="&#x445;" horiz-adv-x="518" d="M132 517L255 337H256L385 517H487L309 279L509 0H400L256 214L112 0H9L203 272L23 517H132Z" />
+<glyph unicode="&#x446;" horiz-adv-x="568" d="M149 517V75H403V517H488V75H555V-164H470V0H64V517H149Z" />
+<glyph unicode="&#x447;" horiz-adv-x="523" d="M131 517V364Q131 319 156 298T230 277Q275 277 314 285T374 299V517H459V0H374V229Q287 205 214 205Q132 205 89 244T46 351V517H131Z" />
+<glyph unicode="&#x448;" horiz-adv-x="809" d="M149 517V75H362V517H447V75H660V517H745V0H64V517H149Z" />
+<glyph unicode="&#x449;" horiz-adv-x="825" d="M149 517V75H362V517H447V75H660V517H745V75H812V-164H727V0H64V517H149Z" />
+<glyph unicode="&#x44A;" horiz-adv-x="611" d="M237 517V320H419Q497 320 543 278T589 163Q589 89 542 45T418 0H152V442H3V517H237ZM400 73Q501 73 501 161Q501 204 474 225T401 247H237V73H400Z" />
+<glyph unicode="&#x44B;" horiz-adv-x="708" d="M149 517V320H308Q384 320 430 278T477 162Q477 89 430 45T312 0H64V517H149ZM644 517V0H559V517H644ZM289 73Q389 73 389 160Q389 202 363 224T290 247H149V73H289Z" />
+<glyph unicode="&#x44C;" horiz-adv-x="523" d="M149 517V320H332Q408 320 454 278T501 162Q501 92 456 46T335 0H64V517H149ZM312 73Q413 73 413 160Q413 203 386 225T313 247H149V73H312Z" />
+<glyph unicode="&#x44D;" horiz-adv-x="537" d="M260 529Q374 529 437 457T501 258Q501 132 436 60T252 -12Q162 -12 102 36T31 176H117Q126 119 162 90T256 61Q324 61 366 104T411 233H195V308H409Q400 382 361 419T261 456Q152 456 125 366H35Q50 442 109 485T260 529Z" />
+<glyph unicode="&#x44E;" horiz-adv-x="766" d="M490 529Q599 529 664 455T730 258Q730 136 664 62T490 -12Q387 -12 323 53T251 237H149V0H64V517H149V310H254Q268 413 329 471T490 529ZM339 258Q339 168 379 116T490 63Q560 63 600 115T640 258Q640 352 599 403T489 454Q422 454 381 401T339 258Z" />
+<glyph unicode="&#x44F;" horiz-adv-x="535" d="M471 517V0H386V211H273L110 0H-3L174 214Q115 224 81 264T47 364Q47 436 92 476T214 517H471ZM134 364Q134 286 225 286H386V442H221Q183 442 159 423T134 364Z" />
+<glyph unicode="&#x450;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM240 732L326 589H262L131 732H240Z" />
+<glyph unicode="&#x451;" horiz-adv-x="537" d="M279 529Q389 529 451 450T513 243V233H126V227Q126 152 169 108T287 63Q398 63 421 164H505Q488 77 430 33T284 -12Q162 -12 99 68T36 262Q36 377 105 453T279 529ZM423 308Q419 371 378 412T273 454Q214 454 173 415T126 308H423ZM232 706V602H142V706H232ZM420 706V602H330V706H420Z" />
+<glyph unicode="&#x452;" horiz-adv-x="556" d="M149 714V641H319V580H149V429H151Q175 473 220 493T314 514Q492 514 492 333V92Q492 -31 420 -108T220 -198V-119Q407 -86 407 96V341Q407 383 380 411T301 439Q229 439 189 396T149 283V0H64V580H-22V641H64V714H149Z" />
+<glyph unicode="&#x453;" horiz-adv-x="422" d="M418 517V442H149V0H64V517H418ZM369 732L238 589H174L260 732H369Z" />
+<glyph unicode="&#x454;" horiz-adv-x="535" d="M284 529Q470 529 500 366H410Q387 456 285 456Q220 456 180 418T128 308H346V233H125Q131 148 170 105T279 61Q394 61 418 176H504Q488 82 429 35T281 -12Q166 -12 101 57T36 251Q36 381 101 455T284 529Z" />
+<glyph unicode="&#x455;" horiz-adv-x="500" d="M236 529Q341 529 391 489T447 367H362V368Q358 410 326 432T242 454Q191 454 162 437T132 388Q132 359 158 342T237 312L317 294Q392 277 431 244T470 151Q470 74 411 31T250 -12Q151 -12 93 31T31 163H116Q118 115 154 89T255 63Q380 63 380 140Q380 174 350 194T219 235Q124 254 83 288T42 382Q42 448 94 488T236 529Z" />
+<glyph unicode="&#x456;" horiz-adv-x="222" d="M154 714V610H69V714H154ZM154 517V0H69V517H154Z" />
+<glyph unicode="&#x457;" horiz-adv-x="222" d="M63 706V602H-27V706H63ZM251 706V602H161V706H251ZM154 517V0H69V517H154Z" />
+<glyph unicode="&#x458;" horiz-adv-x="222" d="M154 714V610H69V714H154ZM154 517V-69Q154 -132 123 -164T30 -198Q4 -198 -14 -194V-121Q-9 -123 14 -123Q31 -123 43 -119T62 -102T69 -56V517H154Z" />
+<glyph unicode="&#x459;" horiz-adv-x="773" d="M452 517V320H587Q659 320 705 278T751 162Q751 91 706 46T586 0H367V442H205L194 164Q187 -11 59 -11Q30 -11 2 0V70Q24 62 43 62Q80 62 94 90T111 167L123 517H452ZM563 73Q663 73 663 160Q663 202 637 224T564 247H452V73H563Z" />
+<glyph unicode="&#x45A;" horiz-adv-x="778" d="M149 517V320H367V517H452V320H586Q663 320 709 279T756 162Q756 89 710 45T590 0H367V246H149V0H64V517H149ZM567 73Q668 73 668 160Q668 203 641 225T568 247H452V73H567Z" />
+<glyph unicode="&#x45B;" horiz-adv-x="556" d="M149 714V641H319V580H149V429H151Q175 473 220 493T314 514Q492 514 492 333V0H407V341Q407 383 380 411T301 439Q229 439 189 396T149 283V0H64V580H-22V641H64V714H149Z" />
+<glyph unicode="&#x45C;" horiz-adv-x="514" d="M149 517V278L385 517H499L290 318L514 0H406L229 256H228L149 182V0H64V517H149ZM398 732L267 589H203L289 732H398Z" />
+<glyph unicode="&#x45D;" horiz-adv-x="556" d="M149 517V97H151L383 517H492V0H407V420H405L173 0H64V517H149ZM240 732L326 589H262L131 732H240Z" />
+<glyph unicode="&#x45E;" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104ZM149 729Q173 646 261 646Q296 646 319 664T360 729H411Q398 662 357 627T253 591Q119 591 99 729H149Z" />
+<glyph unicode="&#x45F;" horiz-adv-x="556" d="M149 517V75H407V517H492V0H320V-164H235V0H64V517H149Z" />
+<glyph unicode="&#x462;" horiz-adv-x="726" d="M251 714V612H447V536H251V421H468Q573 421 630 368T688 210Q688 110 629 55T467 0H156V536H2V612H156V714H251ZM441 80Q593 80 593 210Q593 276 553 308T441 341H251V80H441Z" />
+<glyph unicode="&#x463;" horiz-adv-x="587" d="M213 714V517H439V442H213V320H400Q473 320 519 277T565 162Q565 89 519 45T399 0H128V442H3V517H128V714H213ZM376 73Q477 73 477 160Q477 203 450 225T373 247H213V73H376Z" />
+<glyph unicode="&#x472;" horiz-adv-x="760" d="M380 731Q534 731 628 627T722 357Q722 190 627 87T380 -17Q226 -17 132 88T38 357Q38 517 130 624T380 731ZM626 407Q610 520 547 585T379 651Q279 651 215 588T134 407H626ZM132 329Q143 202 208 133T380 63Q484 63 551 133T628 329H132Z" />
+<glyph unicode="&#x473;" horiz-adv-x="574" d="M287 529Q403 529 470 455T538 258Q538 138 470 63T287 -12Q173 -12 105 62T36 258Q36 381 104 455T287 529ZM446 306Q434 375 390 414T286 454Q227 454 184 415T128 306H446ZM287 63Q353 63 397 107T449 233H125Q133 155 176 109T287 63Z" />
+<glyph unicode="&#x474;" horiz-adv-x="632" d="M609 731Q648 731 666 723V643Q640 651 621 651Q574 651 556 598L359 0H251L-1 714H102L306 95H308L463 599Q485 671 517 701T609 731Z" />
+<glyph unicode="&#x475;" horiz-adv-x="512" d="M475 529Q501 529 523 522V447Q506 454 486 454Q453 454 439 412L297 0H206L14 517H109L254 86H256L364 435Q380 488 405 508T475 529Z" />
+<glyph unicode="&#x490;" horiz-adv-x="552" d="M541 873V634H173V0H78V714H446V873H541Z" />
+<glyph unicode="&#x491;" horiz-adv-x="422" d="M414 672V442H149V0H64V517H329V672H414Z" />
+<glyph unicode="&#x1E80;" horiz-adv-x="926" d="M109 714L249 120H251L411 714H514L672 120H674L819 714H914L723 0H624L461 600H459L294 0H195L12 714H109ZM435 922L521 779H457L326 922H435Z" />
+<glyph unicode="&#x1E81;" horiz-adv-x="758" d="M111 517L228 94H230L334 517H427L536 94H537L653 517H741L577 1L576 0H486L380 411H379L275 0H183L17 517H111ZM341 732L427 589H363L232 732H341Z" />
+<glyph unicode="&#x1E82;" horiz-adv-x="926" d="M109 714L249 120H251L411 714H514L672 120H674L819 714H914L723 0H624L461 600H459L294 0H195L12 714H109ZM597 922L466 779H402L488 922H597Z" />
+<glyph unicode="&#x1E83;" horiz-adv-x="758" d="M111 517L228 94H230L334 517H427L536 94H537L653 517H741L577 1L576 0H486L380 411H379L275 0H183L17 517H111ZM527 732L396 589H332L418 732H527Z" />
+<glyph unicode="&#x1E84;" horiz-adv-x="926" d="M109 714L249 120H251L411 714H514L672 120H674L819 714H914L723 0H624L461 600H459L294 0H195L12 714H109ZM415 897V793H325V897H415ZM603 897V793H513V897H603Z" />
+<glyph unicode="&#x1E85;" horiz-adv-x="758" d="M111 517L228 94H230L334 517H427L536 94H537L653 517H741L577 1L576 0H486L380 411H379L275 0H183L17 517H111ZM333 706V602H243V706H333ZM521 706V602H431V706H521Z" />
+<glyph unicode="&#x1E9E;" horiz-adv-x="724" d="M581 623Q497 621 442 592T387 516Q387 483 412 458T518 397Q686 324 686 188Q686 95 624 39T458 -17Q358 -17 299 37T239 180H329Q329 126 365 95T461 63Q523 63 557 95T591 183Q591 234 563 265T457 330Q365 370 329 412T292 509Q292 564 328 601T431 650Q405 654 359 654Q279 654 245 642T192 602T173 526V0H78V539Q78 640 144 685T355 731Q481 731 581 706V623Z" />
+<glyph unicode="&#x1EF2;" horiz-adv-x="648" d="M115 714L329 374L538 714H646L373 292V0H278V292L2 714H115ZM285 922L371 779H307L176 922H285Z" />
+<glyph unicode="&#x1EF3;" horiz-adv-x="500" d="M104 517L255 94H257L402 517H492L272 -55Q237 -148 205 -177T117 -207Q83 -207 58 -198V-120Q94 -132 108 -132Q161 -132 180 -80L213 3L8 517H104ZM214 732L300 589H236L105 732H214Z" />
+<glyph unicode="&#x2010;" horiz-adv-x="389" d="M339 318V238H50V318H339Z" />
+<glyph unicode="&#x2013;" horiz-adv-x="500" d="M500 318V238H0V318H500Z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M870 318V238H130V318H870Z" />
+<glyph unicode="&#x2015;" horiz-adv-x="1000" d="M900 318V238H100V318H900Z" />
+<glyph unicode="&#x2018;" horiz-adv-x="278" d="M194 664Q138 663 136 567H195V456H84V560Q84 631 112 672T194 714V664Z" />
+<glyph unicode="&#x2019;" horiz-adv-x="278" d="M194 714V599Q194 533 164 495T84 456V506Q140 507 142 603H83V714H194Z" />
+<glyph unicode="&#x201A;" horiz-adv-x="278" d="M194 111V-3Q194 -69 166 -107T84 -147V-97Q140 -96 142 0H83V111H194Z" />
+<glyph unicode="&#x201C;" horiz-adv-x="426" d="M176 664Q122 663 118 567H177V456H66V562Q66 631 94 672T176 714V664ZM359 664Q303 664 301 567H360V456H249V566Q249 631 277 672T359 714V664Z" />
+<glyph unicode="&#x201D;" horiz-adv-x="426" d="M177 714V599Q177 533 147 495T67 456V506Q123 507 125 603H66V714H177ZM360 714V600Q360 533 330 495T250 456V506Q306 507 308 603H249V714H360Z" />
+<glyph unicode="&#x201E;" horiz-adv-x="426" d="M177 111V1Q177 -68 149 -107T67 -147V-97Q123 -96 125 0H66V111H177ZM360 111V1Q360 -66 332 -106T250 -147V-97Q306 -96 308 0H249V111H360Z" />
+<glyph unicode="&#x2020;" horiz-adv-x="556" d="M316 714V517H514V442H316V-155H236V442H42V517H236V714H316Z" />
+<glyph unicode="&#x2021;" horiz-adv-x="556" d="M316 714V517H514V442H316V117H514V42H316V-155H236V42H42V117H236V442H42V517H236V714H316Z" />
+<glyph unicode="&#x2022;" horiz-adv-x="500" d="M250 535Q325 535 377 483T429 357Q429 286 378 232T250 178Q173 178 123 231T72 357Q72 431 123 482Q173 535 250 535Z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M222 111V0H111V111H222ZM555 111V0H444V111H555ZM888 111V0H777V111H888Z" />
+<glyph unicode="&#x2030;" horiz-adv-x="1148" d="M713 722L176 -22H90L628 722H713ZM220 709Q292 709 329 665T366 540Q366 462 327 415T218 368Q146 368 109 412T72 535Q72 619 110 664T220 709ZM147 538Q147 423 219 423Q254 423 272 453T291 537Q291 590 274 622T223 654Q186 654 167 623T147 538ZM585 329Q657 329 694 286T731 161Q731 83 692 36T583 -12Q513 -12 475 31T437 155Q437 237 474 283T585 329ZM930 329Q1002 329 1039 286T1076 161Q1076 79 1036 34T928 -12Q859 -12 821 29T782 155Q782 240 819 284T930 329ZM512 158Q512 43 584 43Q656 43 656 157Q656 211 639 242T587 274Q554 274 533 245T512 158ZM857 158Q857 43 929 43Q1001 43 1001 157Q1001 210 984 242T933 274Q897 274 877 243T857 158Z" />
+<glyph unicode="&#x2039;" horiz-adv-x="259" d="M202 442V356L102 278L202 200V114L50 234V322L202 442Z" />
+<glyph unicode="&#x203A;" horiz-adv-x="259" d="M57 442L209 322V234L57 114V200L157 278L57 356V442Z" />
+<glyph unicode="&#x203D;" horiz-adv-x="556" d="M303 714V650H304Q389 642 436 597T483 483Q483 439 463 405T393 322Q365 294 348 274T324 238T317 189V174H238L218 494V573Q184 564 162 538T136 481H54Q60 544 104 587T218 646V714H303ZM287 311L336 361Q399 424 399 481Q399 521 376 547T303 579V494L287 311ZM329 111V0H218V111H329Z" />
+<glyph unicode="&#x2044;" horiz-adv-x="167" d="M333 725L-102 -28H-166L269 725H333Z" />
+<glyph unicode="&#x2070;" horiz-adv-x="370" d="M186 829Q336 829 336 609Q336 388 184 388Q106 388 70 441T34 607Q34 829 186 829ZM104 608Q104 523 123 483T185 443Q228 443 247 483T266 609Q266 693 247 733T185 774Q140 774 122 732T104 608Z" />
+<glyph unicode="&#x2074;" horiz-adv-x="370" d="M283 820V554H339V499H283V397H217V499H25V567L217 820H283ZM215 735L80 554H217V735H215Z" />
+<glyph unicode="&#x2075;" horiz-adv-x="370" d="M309 820V765H135L111 652L115 651Q144 680 196 680Q262 680 299 643T336 541Q336 475 292 432T181 388Q113 388 74 421T31 516H99Q102 479 124 461T181 442Q268 442 268 540Q268 582 245 605T180 629Q128 629 104 587H39L84 820H309Z" />
+<glyph unicode="&#x2076;" horiz-adv-x="370" d="M199 829Q255 829 288 801T327 720H263Q255 775 196 775Q153 775 129 737T102 627L103 626Q134 674 203 674Q265 674 301 637T337 534Q337 468 297 428T191 388Q35 388 35 601Q35 707 78 768T199 829ZM106 535Q106 492 130 467T189 441Q227 441 248 465T270 535Q270 576 248 599T187 623Q150 623 128 597T106 535Z" />
+<glyph unicode="&#x2077;" horiz-adv-x="370" d="M331 820V768Q190 609 173 397H99Q114 595 262 763H43V820H331Z" />
+<glyph unicode="&#x2078;" horiz-adv-x="370" d="M185 829Q248 829 283 799T318 713Q318 650 257 627V625Q297 614 316 586T336 519Q336 460 295 424T183 388Q114 388 74 422T33 518Q33 594 111 624V626Q51 650 51 713Q51 763 87 796T185 829ZM114 713Q114 683 133 665T184 646Q217 646 236 664T255 713Q255 742 237 760T184 778Q152 778 133 760T114 713ZM100 520Q100 482 123 461T184 439Q222 439 245 461T269 520Q269 554 246 577T184 600Q149 600 125 578T100 520Z" />
+<glyph unicode="&#x2079;" horiz-adv-x="370" d="M180 829Q336 829 336 617Q336 509 293 449T172 388Q116 388 82 417T44 497H108Q116 442 175 442Q263 442 269 590L268 591Q237 543 168 543Q105 543 70 580T34 683Q34 749 74 789T180 829ZM100 682Q100 642 122 618T183 594Q219 594 242 619T266 682Q266 722 243 749T181 776Q143 776 122 751T100 682Z" />
+<glyph unicode="&#x207A;" horiz-adv-x="400" d="M232 707V583H360V521H232V397H169V521H41V583H169V707H232Z" />
+<glyph unicode="&#x207B;" horiz-adv-x="250" d="M215 594V530H35V594H215Z" />
+<glyph unicode="&#x207C;" horiz-adv-x="400" d="M360 643V581H41V643H360ZM360 519V457H41V519H360Z" />
+<glyph unicode="&#x207D;" horiz-adv-x="190" d="M183 876Q108 742 108 597Q108 450 183 318H124Q82 383 60 449T38 597Q38 739 129 876H183Z" />
+<glyph unicode="&#x207E;" horiz-adv-x="190" d="M66 876Q111 803 131 739T152 598Q152 458 61 318H7Q82 452 82 597Q82 747 7 876H66Z" />
+<glyph unicode="&#x207F;" horiz-adv-x="370" d="M213 719Q270 719 299 687T328 605V397H261V589Q261 664 192 664Q154 664 131 638T108 569V397H42V710H108V664Q146 719 213 719Z" />
+<glyph unicode="&#x2080;" horiz-adv-x="370" d="M186 263Q336 263 336 43Q336 -178 184 -178Q106 -178 70 -125T34 41Q34 263 186 263ZM104 42Q104 -43 123 -83T185 -123Q228 -123 247 -83T266 43Q266 127 247 167T185 208Q140 208 122 166T104 42Z" />
+<glyph unicode="&#x2081;" horiz-adv-x="370" d="M242 256V-169H174V135H59V185Q177 185 192 256H242Z" />
+<glyph unicode="&#x2082;" horiz-adv-x="370" d="M194 263Q256 263 295 228T334 137Q334 86 307 52T208 -19Q157 -45 135 -67T107 -114H328V-169H31Q35 -95 68 -51T170 28Q230 58 248 79T266 135Q266 167 247 187T193 208Q111 208 107 109H39Q39 178 81 220T194 263Z" />
+<glyph unicode="&#x2083;" horiz-adv-x="370" d="M188 263Q250 263 287 231T325 148Q325 119 306 95T256 60V58Q342 37 342 -43Q342 -103 298 -140T185 -178Q112 -178 71 -141T29 -36H95Q95 -78 119 -101T187 -124Q229 -124 252 -103T275 -46Q275 -11 252 8T187 28H154V78H165Q189 78 203 80T233 92T253 115T258 144Q258 174 239 191T188 209Q110 209 105 120H39Q41 187 82 225T188 263Z" />
+<glyph unicode="&#x2084;" horiz-adv-x="370" d="M283 254V-12H339V-67H283V-169H217V-67H25V1L217 254H283ZM215 169L80 -12H217V169H215Z" />
+<glyph unicode="&#x2085;" horiz-adv-x="370" d="M309 254V199H135L111 86L115 85Q144 114 196 114Q262 114 299 77T336 -25Q336 -91 292 -134T181 -178Q113 -178 74 -145T31 -50H99Q102 -87 124 -105T181 -124Q268 -124 268 -26Q268 16 245 39T180 63Q128 63 104 21H39L84 254H309Z" />
+<glyph unicode="&#x2086;" horiz-adv-x="370" d="M199 263Q255 263 288 235T327 154H263Q255 209 196 209Q153 209 129 171T102 61L103 60Q134 108 203 108Q265 108 301 71T337 -32Q337 -98 297 -138T191 -178Q35 -178 35 35Q35 141 78 202T199 263ZM106 -31Q106 -74 130 -99T189 -125Q227 -125 248 -101T270 -31Q270 10 248 33T187 57Q150 57 128 31T106 -31Z" />
+<glyph unicode="&#x2087;" horiz-adv-x="370" d="M331 254V202Q190 43 173 -169H99Q114 29 262 197H43V254H331Z" />
+<glyph unicode="&#x2088;" horiz-adv-x="370" d="M185 263Q248 263 283 233T318 147Q318 84 257 61V59Q297 48 316 20T336 -47Q336 -106 295 -142T183 -178Q114 -178 74 -144T33 -48Q33 28 111 58V60Q51 84 51 147Q51 197 87 230T185 263ZM114 147Q114 117 133 99T184 80Q217 80 236 98T255 147Q255 176 237 194T184 212Q152 212 133 194T114 147ZM100 -46Q100 -84 123 -105T184 -127Q222 -127 245 -105T269 -46Q269 -12 246 11T184 34Q149 34 125 12T100 -46Z" />
+<glyph unicode="&#x2089;" horiz-adv-x="370" d="M180 263Q336 263 336 51Q336 -57 293 -117T172 -178Q116 -178 82 -149T44 -69H108Q116 -124 175 -124Q263 -124 269 24L268 25Q237 -23 168 -23Q105 -23 70 14T34 117Q34 183 74 223T180 263ZM100 116Q100 76 122 52T183 28Q219 28 242 53T266 116Q266 156 243 183T181 210Q143 210 122 185T100 116Z" />
+<glyph unicode="&#x208A;" horiz-adv-x="400" d="M232 141V17H360V-45H232V-169H169V-45H41V17H169V141H232Z" />
+<glyph unicode="&#x208B;" horiz-adv-x="250" d="M215 28V-36H35V28H215Z" />
+<glyph unicode="&#x208C;" horiz-adv-x="400" d="M360 77V15H41V77H360ZM360 -47V-109H41V-47H360Z" />
+<glyph unicode="&#x208D;" horiz-adv-x="190" d="M183 310Q108 176 108 31Q108 -116 183 -248H124Q82 -183 60 -117T38 31Q38 173 129 310H183Z" />
+<glyph unicode="&#x208E;" horiz-adv-x="190" d="M66 310Q111 237 131 173T152 32Q152 -108 61 -248H7Q82 -114 82 31Q82 181 7 310H66Z" />
+<glyph unicode="&#x20AC;" horiz-adv-x="556" d="M377 725Q468 725 558 663L512 579Q441 648 369 648Q301 648 255 595T189 450H472L445 389H182Q181 382 181 364T182 337H431L405 276H187Q220 61 377 61Q429 61 461 79T531 133V28Q464 -15 377 -16Q133 -16 90 276H13L41 337H86Q85 342 85 362T86 389H13L39 450H93Q118 580 191 651T377 725Z" />
+<glyph unicode="&#x20B9;" horiz-adv-x="556" d="M373 637Q412 599 422 545H555V485H426Q421 395 363 348T205 300H163L446 0H329L51 305V374H164Q264 374 298 404T334 485H51V545H331Q322 592 284 614T165 637H51V697H555V637H373Z" />
+<glyph unicode="&#x20BA;" horiz-adv-x="556" d="M539 347Q537 246 493 166T373 43T198 0H117V329L29 287V352L117 394V472L29 430V495L117 537V697H207V580L406 676V611L207 515V437L406 533V468L207 372V75Q313 77 380 150T454 347H539Z" />
+<glyph unicode="&#x20BC;" horiz-adv-x="722" d="M404 70H318V500Q255 491 209 431T137 267T112 50V0H22V65Q22 196 57 314T160 499T318 575V697H404V575Q493 567 560 501T664 316T700 65V0H610V50Q610 163 585 267T514 431T404 500V70Z" />
+<glyph unicode="&#x20BD;" horiz-adv-x="556" d="M188 181V0H98V181H11V251H98V312H11V382H98V697H328Q436 697 491 648T547 505Q547 409 487 361T314 312H188V251H374V181H188ZM312 382Q389 382 423 411T457 504Q457 566 422 594T311 622H188V382H312Z" />
+<glyph unicode="&#x2105;" horiz-adv-x="834" d="M664 725L229 -28H165L600 725H664ZM199 709Q331 709 341 568H269Q263 652 195 652Q146 652 127 613T108 488Q108 405 127 365T195 325Q233 325 251 346T271 414H343Q327 268 194 268Q114 268 75 321T35 488Q35 599 74 654T199 709ZM639 429Q719 429 759 377T799 209Q799 -12 637 -12Q477 -12 477 208Q477 429 639 429ZM550 208Q550 124 570 84T638 44Q684 44 705 83T726 209Q726 293 706 333T638 373Q590 373 570 333T550 208Z" />
+<glyph unicode="&#x2113;" horiz-adv-x="500" d="M287 721Q333 721 365 688T397 593Q397 452 226 275V122Q226 84 246 61T301 38Q347 38 389 76H391L415 41Q356 -14 285 -14Q228 -14 193 19T158 110V228L100 166H98L72 203L158 287V550Q158 625 194 673T287 721ZM226 335Q280 397 310 464T340 588Q340 626 325 649T287 673Q259 673 243 641T226 561V335Z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1000" d="M178 697L498 137H500V697H590V0H486L169 554H167V0H77V697H178ZM799 421Q868 421 907 382T946 274Q946 211 907 172T799 132Q730 132 691 171T652 279Q652 342 691 381T799 421ZM725 276Q725 187 799 187Q873 187 873 277Q873 366 798 366Q725 366 725 276ZM944 63V0H664V63H944Z" />
+<glyph unicode="&#x2117;" horiz-adv-x="800" d="M401 731Q553 731 664 624T776 359Q776 203 667 93T401 -17Q244 -17 134 93T24 359Q24 512 134 621T401 731ZM92 359Q92 225 179 132T401 38Q531 38 619 130T708 359Q708 493 620 584T400 676Q268 676 180 584T92 359ZM438 576Q504 576 545 544T587 449Q587 386 549 353T444 319H333V139H265V576H438ZM437 374Q519 374 519 448Q519 521 435 521H333V374H437Z" />
+<glyph unicode="&#x2122;" horiz-adv-x="990" d="M390 714V659H261V302H193V659H64V714H390ZM579 714L702 401L823 714H927V302H859V646H857L722 302H679L544 646H542V302H474V714H579Z" />
+<glyph unicode="&#x2126;" horiz-adv-x="759" d="M382 731Q529 731 622 637T716 401Q716 201 552 84V80H727V0H445V72Q621 192 621 401Q621 509 555 580T382 651Q273 651 206 580T138 392Q138 195 318 72V0H35V80H206V84Q43 197 43 391Q43 538 138 634T382 731Z" />
+<glyph unicode="&#x212E;" horiz-adv-x="760" d="M381 709Q527 709 621 612T719 348H192V112Q269 35 381 35Q466 35 525 73T633 192L679 164Q620 70 552 29T381 -12Q235 -12 140 89T44 348Q44 503 138 606T381 709ZM192 396H572V585Q491 663 379 663Q270 663 192 585V396Z" />
+<glyph unicode="&#x2153;" horiz-adv-x="834" d="M629 725L194 -28H130L565 725H629ZM229 709V280H161V588H46V638H49Q162 638 179 709H229ZM646 432Q708 432 745 400T783 317Q783 288 765 264T714 229V227Q800 206 800 126Q800 68 757 30T643 -9Q568 -9 528 28T487 133H553Q553 91 577 68T645 45Q687 45 710 66T733 123Q733 157 711 177T648 197H612V247H630Q716 247 716 313Q716 343 697 360T646 378Q568 378 563 289H497Q499 356 540 394T646 432Z" />
+<glyph unicode="&#x2154;" horiz-adv-x="834" d="M673 725L238 -28H174L609 725H673ZM190 712Q252 712 291 678T330 586Q330 542 307 507T195 425Q112 383 103 335H324V280H27Q30 398 133 458L199 495Q234 514 248 533T262 584Q262 618 243 637T189 657Q105 657 103 558H35Q35 628 77 670T190 712ZM660 432Q720 432 758 401T797 317Q797 287 779 264T728 229V227Q814 206 814 126Q814 68 771 30T657 -9Q584 -9 543 28T501 133H567Q569 45 659 45Q701 45 724 66T747 123Q747 157 724 177T665 197H626V247H642Q730 247 730 313Q730 342 711 360T660 378Q581 378 577 289H511Q513 355 553 393T660 432Z" />
+<glyph unicode="&#x215B;" horiz-adv-x="834" d="M642 725L207 -28H143L578 725H642ZM239 709V280H171V588H56V638H59Q171 638 189 709H239ZM654 432Q717 432 752 401T787 316Q787 253 726 230V228Q805 204 805 122Q805 65 765 28T652 -9Q583 -9 543 25T502 121Q502 157 522 185T580 227V229Q520 254 520 316Q520 367 558 399T654 432ZM583 316Q583 284 602 267T653 249Q686 249 705 267T724 316Q724 345 705 363T652 381Q620 381 602 363T583 316ZM569 123Q569 86 592 64T653 42Q693 42 715 64T738 123Q738 158 714 180T652 203Q617 203 593 181T569 123Z" />
+<glyph unicode="&#x215C;" horiz-adv-x="834" d="M678 725L243 -28H179L614 725H678ZM202 712Q263 712 301 681T339 598Q339 568 321 545T270 509V507Q356 487 356 406Q356 346 312 309T199 271Q127 271 85 307T43 413H109Q111 325 201 325Q242 325 265 345T289 403Q289 437 267 457T206 477H168V527H181Q272 527 272 593Q272 623 252 640T202 658Q125 658 119 569H53Q55 635 95 673T202 712ZM649 432Q712 432 747 401T782 316Q782 255 721 230V228Q800 205 800 122Q800 62 758 27T647 -9Q576 -9 537 26T497 121Q497 198 575 227V229Q515 254 515 316Q515 368 552 400T649 432ZM578 316Q578 285 597 267T648 249Q681 249 700 267T719 316Q719 345 700 363T647 381Q615 381 597 363T578 316ZM564 123Q564 86 587 64T648 42Q688 42 710 64T733 123Q733 158 709 180T647 203Q612 203 588 181T564 123Z" />
+<glyph unicode="&#x215D;" horiz-adv-x="834" d="M678 725L243 -28H179L614 725H678ZM327 703V648H153L129 535L133 534Q164 563 214 563Q280 563 317 526T354 424Q354 358 310 315T199 271Q131 271 92 304T49 399H117Q119 364 141 345T199 325Q242 325 264 351T286 423Q286 465 263 488T198 512Q148 512 122 470H57L102 703H327ZM649 432Q712 432 747 401T782 316Q782 255 721 230V228Q800 205 800 122Q800 62 758 27T647 -9Q576 -9 537 26T497 121Q497 198 575 227V229Q515 254 515 316Q515 368 552 400T649 432ZM578 316Q578 285 597 267T648 249Q681 249 700 267T719 316Q719 345 700 363T647 381Q615 381 597 363T578 316ZM564 123Q564 86 587 64T648 42Q688 42 710 64T733 123Q733 158 709 180T647 203Q612 203 588 181T564 123Z" />
+<glyph unicode="&#x215E;" horiz-adv-x="834" d="M633 725L198 -28H134L569 725H633ZM364 703V651Q222 489 206 281V280H132Q149 481 295 646H76V703H364ZM634 432Q697 432 732 401T767 316Q767 253 706 230V228Q785 204 785 122Q785 64 745 28T632 -9Q563 -9 523 25T482 121Q482 157 502 185T560 227V229Q500 254 500 316Q500 367 538 399T634 432ZM563 316Q563 287 581 268T633 249Q666 249 685 267T704 316Q704 345 685 363T632 381Q600 381 582 363T563 316ZM549 123Q549 87 572 65T633 42Q671 42 694 63T718 123Q718 158 694 180T632 203Q597 203 573 181T549 123Z" />
+<glyph unicode="&#x2202;" horiz-adv-x="511" d="M218 721Q341 721 405 622T469 361Q469 180 410 84T237 -12Q148 -12 91 52T33 213Q33 307 89 367T232 427Q328 427 393 352L394 398Q394 514 345 586T221 658Q165 658 107 611L65 661Q134 721 218 721ZM107 210Q107 140 145 94T239 48Q307 48 348 117T389 280Q324 365 240 365Q181 365 144 321T107 210Z" />
+<glyph unicode="&#x2206;" horiz-adv-x="648" d="M377 714L653 0H-4L272 714H377ZM323 629L124 80H518L325 629H323Z" />
+<glyph unicode="&#x220F;" horiz-adv-x="719" d="M650 786V-214H572V714H146V-214H68V786H650Z" />
+<glyph unicode="&#x2211;" horiz-adv-x="615" d="M577 786V714H140L441 290L122 -142H589V-214H25V-150L347 290L39 722V786H577Z" />
+<glyph unicode="&#x2212;" horiz-adv-x="600" d="M552 287V219H48V287H552Z" />
+<glyph unicode="&#x2215;" horiz-adv-x="167" d="M333 725L-102 -28H-166L269 725H333Z" />
+<glyph unicode="&#x2219;" horiz-adv-x="278" d="M139 375Q167 375 185 356T203 311Q203 286 184 267T140 247Q114 247 95 266T75 311Q75 338 94 356T139 375Z" />
+<glyph unicode="&#x221A;" horiz-adv-x="504" d="M514 786L303 -214H228L66 120L19 98L-9 158L103 210L254 -107L438 786H514Z" />
+<glyph unicode="&#x221E;" horiz-adv-x="759" d="M569 410Q634 410 675 367T717 255Q717 186 676 142T570 98Q527 98 483 121T380 207Q305 138 268 119T193 99Q124 99 83 141T42 252Q42 318 82 363T187 408Q233 408 276 382T380 294Q450 367 490 388T569 410ZM423 251Q473 203 506 185T573 166Q609 166 630 190T652 252Q652 292 631 317T569 342Q540 342 510 324T423 251ZM107 252Q107 214 129 190T190 166Q254 166 337 251Q243 341 187 341Q151 341 129 315T107 252Z" />
+<glyph unicode="&#x222B;" horiz-adv-x="554" d="M340 786Q372 786 396 771T420 730Q420 713 408 703T378 692Q356 692 337 723Q329 735 322 735Q291 735 291 641L293 555V7Q293 -113 261 -163T167 -213Q140 -213 119 -199T98 -161Q98 -146 109 -136T135 -125Q155 -125 167 -146Q180 -167 187 -167Q216 -167 216 -54L214 567Q214 687 244 736T340 786Z" />
+<glyph unicode="&#x2248;" horiz-adv-x="600" d="M568 421Q560 356 526 317T434 278Q378 278 251 330Q201 349 169 349Q109 349 98 274H33Q41 340 75 378T167 417Q220 417 307 382Q400 346 432 346Q491 346 503 421H568ZM568 231Q560 165 525 127T434 88Q383 88 293 124Q203 159 169 159Q109 159 98 84H33Q41 149 76 188T167 227Q219 227 308 191Q394 156 432 156Q491 156 503 231H568Z" />
+<glyph unicode="&#x2260;" horiz-adv-x="600" d="M421 528L479 496L417 388H552V322H378L302 184H552V118H263L180 -28L122 4L187 118H48V184H226L302 322H48V388H341L421 528Z" />
+<glyph unicode="&#x2264;" horiz-adv-x="600" d="M552 457L134 307L550 158H552V86L48 274V340L552 528V457ZM552 68V0H48V68H552Z" />
+<glyph unicode="&#x2265;" horiz-adv-x="600" d="M48 528L552 340V274L47 86V157L466 307L48 457V528ZM552 68V0H48V68H552Z" />
+<glyph unicode="&#x25CA;" horiz-adv-x="593" d="M332 747L504 356L332 -35H260L89 356L260 747H332ZM165 356L296 41L428 356L296 671L165 356Z" />
+<glyph unicode="&#xF001;" horiz-adv-x="518" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H284V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722ZM450 714V610H365V714H450ZM450 517V0H365V517H450Z" />
+<glyph unicode="&#xF002;" horiz-adv-x="518" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H284V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722ZM450 714V0H365V714H450Z" />
+<glyph unicode="&#xF8FF;" horiz-adv-x="512" d="M512 718V0H0V718H512ZM462 50V667H50V50H462ZM259 609Q313 609 348 573T383 478Q383 446 372 421T319 357Q285 326 278 311Q271 294 271 234H225L223 253Q223 300 234 328T286 395Q332 436 332 474Q332 508 309 533T256 559Q186 559 174 464L124 472Q138 609 259 609ZM222 184H278V117H222V184Z" />
+<glyph unicode="&#xFB00;" horiz-adv-x="577" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H380V598Q380 655 415 688T522 722Q546 722 578 714V640Q559 647 530 647Q465 647 465 591V517H565V442H465V0H380V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722Z" />
+<glyph unicode="&#xFB01;" horiz-adv-x="518" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H284V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722ZM450 714V610H365V714H450ZM450 517V0H365V517H450Z" />
+<glyph unicode="&#xFB02;" horiz-adv-x="518" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H284V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722ZM450 714V0H365V714H450Z" />
+<glyph unicode="&#xFB03;" horiz-adv-x="799" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H380V598Q380 655 415 688T522 722Q546 722 578 714V640Q559 647 530 647Q465 647 465 591V517H565V442H465V0H380V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722ZM731 714V610H646V714H731ZM731 517V0H646V517H731Z" />
+<glyph unicode="&#xFB04;" horiz-adv-x="799" d="M241 722Q273 722 297 714V640Q279 647 249 647Q184 647 184 591V517H380V598Q380 655 415 688T522 722Q546 722 578 714V640Q559 647 530 647Q465 647 465 591V517H565V442H465V0H380V442H184V0H99V442H12V517H99V598Q99 655 134 688T241 722ZM731 714V0H646V714H731Z" />
+
+
+</font>
+</defs>
+<text x="40" y="40" font-family="Helvetica Neue LT W07 55 Roman" font-size="30" fill="#933" >ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz AÁÀÂÄÅÃÆ CÇ DÐ EÉÈÊË I Í Ì Î Ï NÑ</text>
+<text x="40" y="80" font-family="Helvetica Neue LT W07 55 Roman" font-size="30" fill="#933" >OÓÒÔÖÕØŒ SŠ UÚÙÛÜ YÝŸ ZŽ Þ aáàâäåãæ cç dð eéèêë i ı í ì î ï nñ oóòôöõøœ sšß uúùûü yýÿ zž</text>
+<text x="40" y="120" font-family="Helvetica Neue LT W07 55 Roman" font-size="30" fill="#933" >þ 1234567890 ½ ¼ ¾ % ‰ $¢£¥ƒ€¤ † ‡ § ¶ # ^~µ +×± &lt; = &gt; ÷¬ !¡?¿ &quot; &amp; &apos; * ° . , : ; () [ \ ] {} / |</text>
+<text x="40" y="160" font-family="Helvetica Neue LT W07 55 Roman" font-size="30" fill="#933" >¦ _ ‚ „ … ‹› «» ‘ ’ “ ” • ­ - – — @ © ® ™ ªº ¹²³ ´ ` ˆ ˜ ¨ ¯ · ¸</text>
+</svg>
diff --git a/dashboard/public/fonts/HelvNeue55_W1G.ttf b/dashboard/public/fonts/HelvNeue55_W1G.ttf
new file mode 100644
index 00000000..007f6d19
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue55_W1G.ttf
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue55_W1G.woff b/dashboard/public/fonts/HelvNeue55_W1G.woff
new file mode 100644
index 00000000..79d02e3c
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue55_W1G.woff
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue55_W1G.woff2 b/dashboard/public/fonts/HelvNeue55_W1G.woff2
new file mode 100644
index 00000000..8ad6b553
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue55_W1G.woff2
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue75_W1G.eot b/dashboard/public/fonts/HelvNeue75_W1G.eot
new file mode 100644
index 00000000..f5a075df
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue75_W1G.eot
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue75_W1G.svg b/dashboard/public/fonts/HelvNeue75_W1G.svg
new file mode 100644
index 00000000..bb5811c0
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue75_W1G.svg
@@ -0,0 +1,653 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" >
+<metadata>
+<version>1.0</version>
+<id><![CDATA[Helvetica Neue LT W07 75 Bold]]></id>
+<vendor>Monotype Imaging Inc.</vendor>
+<credits>
+<name>Fonts.com WebFonts</name>
+<URL>http://webfonts.fonts.com</URL>
+<role>Home of the Web fonts</role>
+</credits>
+<license>
+<URL>http://webfonts.fonts.com/Legal</URL>
+</license>
+<copyright><![CDATA[Copyright © 2014 Monotype Imaging Inc. All rights reserved.]]></copyright>
+<trademark><![CDATA[Neue Helvetica is a trademark of Monotype Imaging Inc. registered in the U.S. Patent and Trademark Office and may be registered in certain other jurisdictions.]]></trademark>
+<licensee>
+<name></name>
+</licensee>
+</metadata>
+<defs >
+<font horiz-adv-x="579" id="5a01321a-bdf4-4f8e-bd1c-6323b7fc10ba">
+<font-face font-family="Helvetica Neue LT W07 75 Bold" panose-1="2 11 8 4 2 2 2 2 2 4" ascent="973" descent="-248" units-per-em="1000" alphabetic="0">
+</font-face>
+<missing-glyph horiz-adv-x="512" d="M512 718V0H0V718H512ZM462 50V667H50V50H462ZM259 609Q313 609 348 573T383 478Q383 446 372 421T319 357Q285 326 278 311Q271 294 271 234H225L223 253Q223 308 238 335T286 395Q332 436 332 474Q332 508 309 533T256 559Q186 559 174 464L124 472Q138 609 259 609ZM222 184H278V117H222V184Z" />
+
+<glyph unicode="&#xA;" />
+<glyph unicode="&#xD;" horiz-adv-x="278" />
+<glyph unicode=" " horiz-adv-x="278" />
+<glyph unicode="!" horiz-adv-x="278" d="M213 714V522L174 214H103L65 522V714H213ZM218 154V0H61V154H218Z" />
+<glyph unicode="&quot;" horiz-adv-x="463" d="M192 714V393H85V714H192ZM378 714V393H271V714H378Z" />
+<glyph unicode="#" horiz-adv-x="556" d="M283 700L255 502H352L379 700H476L449 502H523V412H436L419 288H493V198H406L379 0H282L309 198H213L186 3L185 0H88L116 198H33V288H128L146 412H63V502H158L186 700H283ZM243 412L225 288H322L339 412H243Z" />
+<glyph unicode="$" horiz-adv-x="556" d="M248 808H307V731Q410 720 468 666T532 518H390Q388 560 364 587T307 614V437Q440 408 498 355T557 198Q557 148 527 99T440 18T307 -17V-102H248V-17Q139 -10 75 52T-1 232H141V229Q141 178 170 144T248 100V309Q178 328 156 336T99 363T40 421T16 517Q16 606 78 664T248 731V808ZM158 531Q158 499 179 481T248 451V614Q210 614 184 591T158 531ZM307 100Q354 105 384 131T415 198Q415 236 392 256T307 292V100Z" />
+<glyph unicode="%" horiz-adv-x="1000" d="M753 722L341 -22H254L668 722H753ZM245 714Q324 714 366 663T409 513Q409 421 365 373T240 324Q75 324 75 516Q75 608 120 661T245 714ZM177 513Q177 446 193 423T241 399Q307 399 307 513Q307 639 245 639Q212 639 195 610T177 513ZM761 376Q925 376 925 180Q925 90 882 38T756 -14Q670 -14 631 39T591 183Q591 273 636 324T761 376ZM693 182Q693 112 709 87T757 61Q795 61 809 94T823 182Q823 301 760 301Q693 301 693 182Z" />
+<glyph unicode="&amp;" horiz-adv-x="685" d="M311 722Q396 722 451 676T506 551Q506 441 379 373L471 260Q491 295 497 345H620Q609 245 551 169L696 0H522L464 71Q377 -14 263 -14Q159 -14 96 45T32 200Q32 331 192 407Q152 453 138 488T124 559Q124 629 178 675T311 722ZM253 564Q253 540 265 517T309 457Q347 480 364 503T382 559Q382 587 363 607T316 627Q291 627 272 610T253 564ZM167 197Q167 158 198 131T269 103Q333 103 389 166L267 315Q167 273 167 197Z" />
+<glyph unicode="&apos;" horiz-adv-x="278" d="M193 714V393H86V714H193Z" />
+<glyph unicode="(" horiz-adv-x="296" d="M303 731Q194 529 194 278Q194 28 302 -182H184Q52 33 52 268Q52 393 88 518T184 731H303Z" />
+<glyph unicode=")" horiz-adv-x="296" d="M112 731Q244 516 244 280Q244 158 210 35T112 -182H-7Q102 26 102 270Q102 519 -6 731H112Z" />
+<glyph unicode="*" horiz-adv-x="407" d="M242 714V589L358 633L385 556L267 517L341 419L275 370L201 473L131 370L64 419L138 517L22 556L49 633L162 589V714H242Z" />
+<glyph unicode="+" horiz-adv-x="600" d="M354 505V306H553V199H354V0H247V199H48V306H247V505H354Z" />
+<glyph unicode="&#x2c;" horiz-adv-x="278" d="M218 154V-2Q218 -63 176 -109T62 -166V-94Q94 -87 113 -62T133 -7V0H61V154H218Z" />
+<glyph unicode="-" horiz-adv-x="407" d="M354 334V212H53V334H354Z" />
+<glyph unicode="." horiz-adv-x="278" d="M217 154V0H60V154H217Z" />
+<glyph unicode="/" horiz-adv-x="371" d="M382 731L103 -17H-11L268 731H382Z" />
+<glyph unicode="0" horiz-adv-x="556" d="M277 714Q403 714 469 623T535 353Q535 171 470 79T277 -14Q21 -14 21 353Q21 531 85 622T277 714ZM163 357Q163 215 192 159T277 103Q321 103 345 133T381 211T393 357Q393 487 363 542T276 597Q221 597 192 541T163 357Z" />
+<glyph unicode="1" horiz-adv-x="556" d="M392 700V0H250V454H74V561H84Q257 561 279 700H392Z" />
+<glyph unicode="2" horiz-adv-x="556" d="M291 714Q394 714 462 653T531 495Q531 451 518 415T474 342T364 255Q247 182 204 122H535V0H21Q21 91 64 157T227 303Q322 366 347 391T380 438T389 484Q389 532 361 562T284 592Q231 592 203 549T173 431H37V444Q37 567 106 640T291 714Z" />
+<glyph unicode="3" horiz-adv-x="556" d="M277 714Q376 714 444 658T512 520Q512 468 487 430T414 377V375Q473 362 505 319T538 216Q538 114 464 50T278 -14Q158 -14 88 53T18 233V241H153Q156 175 188 139T276 103Q326 103 358 133T390 213Q390 274 353 295T250 317H228V417H254Q314 417 345 439T377 504Q377 549 348 573T278 597Q227 597 199 564T170 472H35Q39 583 104 648T277 714Z" />
+<glyph unicode="4" horiz-adv-x="556" d="M447 700V279H540V162H447V0H312V162H16V292L320 700H447ZM309 522L128 279H312V522H309Z" />
+<glyph unicode="5" horiz-adv-x="556" d="M500 700V583H211L183 424L185 422Q239 476 322 476Q419 476 478 410T538 238Q538 133 463 60T281 -14Q164 -14 92 47T18 208H160Q165 160 196 132T275 103Q328 103 362 142T396 238Q396 294 364 331T274 369Q236 369 212 356T168 313H40L109 700H500Z" />
+<glyph unicode="6" horiz-adv-x="556" d="M296 714Q389 714 450 663T523 520H388Q380 560 354 583T294 607Q236 607 200 549T160 394L162 392Q216 470 319 470Q409 470 472 407T535 242Q535 133 467 60T290 -14Q160 -14 91 78T21 348Q21 504 92 609T296 714ZM173 233Q173 179 204 141T286 103Q333 103 363 141T393 231Q393 289 364 326T285 363Q234 363 204 327T173 233Z" />
+<glyph unicode="7" horiz-adv-x="556" d="M517 700V578Q417 489 354 325T288 0H136Q148 156 209 301T371 568H39V700H517Z" />
+<glyph unicode="8" horiz-adv-x="556" d="M279 714Q350 714 403 687T484 616T513 525Q513 474 488 435T411 379V377Q477 361 509 316T542 206Q542 107 468 47T280 -14Q164 -14 89 45T14 205Q14 271 48 316T146 377V379Q96 393 70 431T43 523Q43 608 112 661T279 714ZM172 510Q172 465 204 442T279 418Q324 418 354 441T384 510Q384 556 355 581T278 607Q232 607 202 580T172 510ZM156 212Q156 158 191 126T280 93Q332 93 366 126T400 211Q400 259 366 291T279 323Q226 323 191 294T156 212Z" />
+<glyph unicode="9" horiz-adv-x="556" d="M267 714Q396 714 465 621T535 353Q535 189 461 88T260 -14Q168 -14 107 36T33 180H168Q176 142 201 118T262 93Q319 93 353 147T396 306L394 308Q339 230 236 230Q179 230 129 259T50 338T21 458Q21 569 90 641T267 714ZM163 469Q163 411 192 374T270 337Q319 337 351 371T383 467Q383 521 352 559T270 597Q223 597 193 560T163 469Z" />
+<glyph unicode=":" horiz-adv-x="278" d="M218 508V354H61V508H218ZM218 154V0H61V154H218Z" />
+<glyph unicode=";" horiz-adv-x="278" d="M218 508V354H61V508H218ZM218 154V-1Q218 -66 174 -111T62 -166V-94Q92 -88 112 -63T133 -7V0H61V154H218Z" />
+<glyph unicode="&lt;" horiz-adv-x="600" d="M554 399L187 253L554 107V-8L46 194V312L554 514V399Z" />
+<glyph unicode="=" horiz-adv-x="600" d="M553 413V306H48V413H553ZM553 199V92H48V199H553Z" />
+<glyph unicode="&gt;" horiz-adv-x="600" d="M46 514L554 312V194L46 -8V107L413 253L46 399V514Z" />
+<glyph unicode="?" horiz-adv-x="556" d="M275 731Q352 731 407 706T493 635T524 537Q524 485 505 444T437 367Q378 324 360 299T342 243V214H207V243Q207 303 229 343T296 418Q343 454 355 474T367 524Q367 614 282 614Q232 614 206 579T179 484H32Q34 595 101 663T275 731ZM350 154V0H193V154H350Z" />
+<glyph unicode="@" horiz-adv-x="800" d="M416 731Q508 731 589 692T717 582T764 426Q764 343 728 279T634 176T528 136Q499 136 479 151T456 193H454Q418 135 346 135Q283 135 236 185T189 307Q189 409 252 485T407 561Q444 561 476 544T524 491L540 545H622L561 295Q551 261 551 244Q551 221 568 221Q616 221 651 276T686 405Q686 516 612 583T415 651Q290 651 211 569T132 355Q132 228 213 146T427 63Q489 63 546 84T642 145H726Q672 64 592 24T421 -17Q261 -17 149 90T36 357Q36 458 86 544T225 680T416 731ZM291 319Q291 281 311 256T369 230Q419 230 455 276T492 381Q492 416 471 441T414 466Q367 466 329 422T291 319Z" />
+<glyph unicode="A" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342Z" />
+<glyph unicode="B" horiz-adv-x="704" d="M406 714Q633 714 633 538Q633 437 536 388Q602 369 634 322T667 207Q667 111 598 56T415 0H69V714H406ZM386 425Q481 425 481 510Q481 592 375 592H226V425H386ZM395 122Q510 122 510 216Q510 318 398 318H226V122H395Z" />
+<glyph unicode="C" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q537 527 492 563T389 599Q297 599 246 533T195 354Q195 244 246 180T389 115Q457 115 499 156T551 275H703Q691 139 606 61T389 -17Q232 -17 135 86T38 354Q38 520 134 625T389 731Z" />
+<glyph unicode="D" horiz-adv-x="741" d="M375 714Q527 714 614 620T701 361Q701 190 614 95T379 0H69V714H375ZM365 132Q450 132 497 188T544 347Q544 465 494 523T338 582H226V132H365Z" />
+<glyph unicode="E" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603Z" />
+<glyph unicode="F" horiz-adv-x="593" d="M571 714V582H226V417H525V295H226V0H69V714H571Z" />
+<glyph unicode="G" horiz-adv-x="759" d="M389 731Q511 731 596 660T690 479H540Q526 539 486 569T389 599Q297 599 246 533T195 354Q195 244 247 180T389 115Q543 115 559 269H401V386H701V0H601L585 81Q510 -17 389 -17Q231 -17 135 87T38 354Q38 520 134 625T389 731Z" />
+<glyph unicode="H" horiz-adv-x="741" d="M226 714V440H515V714H672V0H515V308H226V0H69V714H226Z" />
+<glyph unicode="I" horiz-adv-x="295" d="M226 714V0H69V714H226Z" />
+<glyph unicode="J" horiz-adv-x="556" d="M487 714V224Q487 -17 251 -17Q144 -17 79 41T14 202V266H156V231Q156 168 179 142T247 115Q290 115 310 139T330 226V714H487Z" />
+<glyph unicode="K" horiz-adv-x="722" d="M226 714V418L505 714H701L422 432L728 0H531L316 321L226 230V0H69V714H226Z" />
+<glyph unicode="L" horiz-adv-x="593" d="M226 714V132H574V0H69V714H226Z" />
+<glyph unicode="M" horiz-adv-x="907" d="M290 714L457 223H459L617 714H838V0H691V506H689L514 0H393L218 501H216V0H69V714H290Z" />
+<glyph unicode="N" horiz-adv-x="741" d="M225 714L523 235H525V714H672V0H515L218 478H216V0H69V714H225Z" />
+<glyph unicode="O" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354Z" />
+<glyph unicode="P" horiz-adv-x="667" d="M392 714Q506 714 572 652T638 485Q638 379 572 318T393 256H226V0H69V714H392ZM351 378Q419 378 452 403T486 485Q486 540 454 566T352 592H226V378H351Z" />
+<glyph unicode="Q" horiz-adv-x="778" d="M389 731Q548 731 644 625T740 354Q740 198 647 91L736 10L663 -67L562 25Q488 -17 389 -17Q231 -17 135 88T38 354Q38 520 134 625T389 731ZM195 354Q195 245 246 180T390 115Q441 115 452 125L385 186L458 264L539 190Q583 247 583 354Q583 468 531 533T388 599Q299 599 247 534T195 354Z" />
+<glyph unicode="R" horiz-adv-x="722" d="M454 714Q544 714 603 659T663 517Q663 383 550 338V336Q588 325 609 300T642 240T656 131Q660 33 684 0H527Q514 33 507 124Q499 220 472 249T384 279H226V0H69V714H454ZM399 391Q449 391 477 413T506 493Q506 547 478 569T398 592H226V391H399Z" />
+<glyph unicode="S" horiz-adv-x="649" d="M315 731Q446 731 523 671T601 501H449Q446 555 413 582T309 609Q260 609 230 588T200 528Q200 497 218 483T271 458T390 426Q479 404 527 378T600 312T625 212Q625 144 589 91T484 11T328 -17Q195 -17 110 49T24 232V237H176Q176 174 219 140T333 105Q396 105 434 127T473 194Q473 223 452 243T396 275T278 307Q182 331 138 358T71 423T48 516Q48 583 86 633T187 707T315 731Z" />
+<glyph unicode="T" horiz-adv-x="611" d="M598 714V582H384V0H227V582H13V714H598Z" />
+<glyph unicode="U" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223Z" />
+<glyph unicode="V" horiz-adv-x="630" d="M154 714L313 212H315L476 714H638L401 0H224L-8 714H154Z" />
+<glyph unicode="W" horiz-adv-x="944" d="M160 714L273 228H275L399 714H546L668 222H670L787 714H941L749 0H593L472 486H470L351 0H192L3 714H160Z" />
+<glyph unicode="X" horiz-adv-x="667" d="M196 714L336 486L481 714H653L424 373L673 0H486L330 247L171 0H-6L244 374L14 714H196Z" />
+<glyph unicode="Y" horiz-adv-x="667" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168Z" />
+<glyph unicode="Z" horiz-adv-x="648" d="M615 714V590L232 132H625V0H23V124L406 582H53V714H615Z" />
+<glyph unicode="[" horiz-adv-x="333" d="M332 731V619H210V-70H332V-182H68V731H332Z" />
+<glyph unicode="\" horiz-adv-x="371" d="M103 731L382 -17H268L-11 731H103Z" />
+<glyph unicode="]" horiz-adv-x="333" d="M265 731V-182H1V-70H123V619H1V731H265Z" />
+<glyph unicode="^" horiz-adv-x="600" d="M367 700L539 315H422L300 590L178 315H61L233 700H367Z" />
+<glyph unicode="_" horiz-adv-x="500" d="M500 -75V-125H0V-75H500Z" />
+<glyph unicode="`" horiz-adv-x="259" d="M109 731L205 589H106L-48 731H109Z" />
+<glyph unicode="a" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147Z" />
+<glyph unicode="b" horiz-adv-x="611" d="M196 714V454H198Q221 489 263 510T361 531Q456 531 515 455T575 259Q575 138 516 62T360 -14Q234 -14 191 66H189V0H54V714H196ZM191 258Q191 183 224 138T312 93Q366 93 399 137T433 258Q433 334 401 379T311 424Q255 424 223 378T191 258Z" />
+<glyph unicode="c" horiz-adv-x="574" d="M302 531Q407 531 473 478T545 335H406Q392 424 301 424Q245 424 213 378T180 256Q180 183 211 138T298 93Q395 93 411 198H548Q534 95 469 41T299 -14Q184 -14 111 59T38 251Q38 379 110 455T302 531Z" />
+<glyph unicode="d" horiz-adv-x="611" d="M558 714V0H423V66H421Q375 -14 264 -14Q157 -14 95 64T32 263Q32 381 95 456T261 531Q308 531 349 512T414 454H416V714H558ZM174 259Q174 188 207 141T299 93Q360 93 390 137T421 260Q421 338 389 381T298 424Q237 424 206 379T174 259Z" />
+<glyph unicode="e" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402Z" />
+<glyph unicode="f" horiz-adv-x="333" d="M258 714Q276 714 333 710V604Q305 607 282 607Q251 607 239 594T227 547V517H325V422H227V0H85V422H0V517H85V555Q85 631 130 672T258 714Z" />
+<glyph unicode="g" horiz-adv-x="611" d="M260 531Q367 531 414 448H416V517H551V32Q551 -80 482 -138T284 -196Q186 -196 123 -149T55 -30H196Q213 -101 302 -101Q357 -101 386 -69T416 24V95H414Q393 57 353 36T259 15Q155 15 97 83T38 275Q38 385 99 458T260 531ZM180 277Q180 204 210 163T295 122Q350 122 383 161T416 266Q416 344 385 384T294 424Q239 424 210 383T180 277Z" />
+<glyph unicode="h" horiz-adv-x="593" d="M196 714V445H199Q223 485 264 508T351 531Q450 531 494 481T539 323V0H397V294Q397 357 377 388T306 419Q249 419 223 385T196 271V0H54V714H196Z" />
+<glyph unicode="i" horiz-adv-x="258" d="M200 714V597H58V714H200ZM200 517V0H58V517H200Z" />
+<glyph unicode="j" horiz-adv-x="278" d="M209 714V597H67V714H209ZM209 517V-29Q209 -85 193 -117T139 -165T28 -182Q0 -182 -19 -178V-61Q-7 -65 13 -65Q44 -65 56 -53T67 -18V517H209Z" />
+<glyph unicode="k" horiz-adv-x="574" d="M209 714V331L388 517H556L361 327L578 0H406L264 231L209 178V0H67V714H209Z" />
+<glyph unicode="l" horiz-adv-x="258" d="M200 714V0H58V714H200Z" />
+<glyph unicode="m" horiz-adv-x="906" d="M352 531Q465 531 503 445Q562 531 660 531Q757 531 802 482T848 347V0H706V299Q706 367 686 393T619 419Q524 419 524 289V0H382V305Q382 371 361 395T296 419Q255 419 228 387T200 301V0H58V517H192V447H194Q253 531 352 531Z" />
+<glyph unicode="n" horiz-adv-x="593" d="M351 531Q450 531 494 481T539 322V0H397V293Q397 357 377 388T306 419Q248 419 222 384T196 269V0H54V517H189V445H192Q245 531 351 531Z" />
+<glyph unicode="o" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258Z" />
+<glyph unicode="p" horiz-adv-x="611" d="M345 531Q452 531 516 456T580 253Q580 136 519 61T353 -14Q251 -14 198 64H196V-182H54V517H189V451H191Q242 531 345 531ZM191 257Q191 181 223 137T315 93Q377 93 407 137T438 257Q438 335 405 379T313 424Q254 424 223 380T191 257Z" />
+<glyph unicode="q" horiz-adv-x="611" d="M264 531Q376 531 421 451H423V517H558V-182H416V65H414Q391 26 348 6T251 -14Q190 -14 140 18T61 111T32 254Q32 377 95 454T264 531ZM174 258Q174 178 206 136T297 93Q357 93 389 136T421 256Q421 335 388 379T299 424Q240 424 207 379T174 258Z" />
+<glyph unicode="r" horiz-adv-x="389" d="M356 531Q374 531 387 526V394Q364 399 336 399Q196 399 196 233V0H54V517H189V421H191Q212 471 257 501T356 531Z" />
+<glyph unicode="s" horiz-adv-x="537" d="M266 531Q370 531 428 489T494 366H359Q356 403 332 419T262 436Q222 436 203 424T183 388Q183 370 196 358T235 337T294 322Q391 303 431 283T489 235T508 166Q508 79 445 33T272 -14Q158 -14 95 35T29 168H164Q164 128 195 105T273 81Q313 81 339 98T366 147Q366 167 350 180T303 203T210 226Q160 236 121 253T62 297T41 365Q41 416 65 454T140 511T266 531Z" />
+<glyph unicode="t" horiz-adv-x="352" d="M234 672V517H338V422H234V166Q234 130 246 118T294 106Q320 106 338 110V-1Q308 -6 254 -6Q172 -6 132 22T92 119V422H6V517H92V672H234Z" />
+<glyph unicode="u" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196Z" />
+<glyph unicode="v" horiz-adv-x="520" d="M154 517L263 164H265L374 517H515L340 0H182L5 517H154Z" />
+<glyph unicode="w" horiz-adv-x="814" d="M156 517L251 166H253L339 517H477L565 167H567L662 517H808L645 0H499L407 347H405L317 0H170L6 517H156Z" />
+<glyph unicode="x" horiz-adv-x="537" d="M178 517L269 382L359 517H516L346 275L537 0H375L267 163L159 0H0L186 272L16 517H178Z" />
+<glyph unicode="y" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146Z" />
+<glyph unicode="z" horiz-adv-x="519" d="M478 517V410L209 107H497V0H22V107L291 410H42V517H478Z" />
+<glyph unicode="{" horiz-adv-x="333" d="M333 619H279Q225 619 225 548V395Q225 287 126 276V273Q166 268 195 241T225 164V1Q225 -70 280 -70H333V-182H209Q158 -182 121 -142T83 -48V148Q83 183 56 207T-9 231V318Q29 320 56 343T83 406V597Q83 650 121 690T210 731H333V619Z" />
+<glyph unicode="|" horiz-adv-x="223" d="M165 786V-214H58V786H165Z" />
+<glyph unicode="}" horiz-adv-x="333" d="M126 731Q173 731 211 692T250 595V407Q250 366 277 343T342 318V231Q300 229 275 206T250 150V-48Q250 -86 232 -116T185 -164T126 -182H0V-70H54Q108 -70 108 2V163Q108 210 137 239T207 273V276Q155 281 132 314T108 392V548Q108 619 54 619H0V731H126Z" />
+<glyph unicode="~" horiz-adv-x="600" d="M533 251Q504 207 475 186T408 165Q363 165 298 199Q232 233 191 233Q139 233 107 161L67 254Q112 340 192 340Q238 340 316 302Q376 272 405 272Q429 272 449 289T493 344L533 251Z" />
+<glyph unicode="&#xA0;" horiz-adv-x="278" />
+<glyph unicode="&#xA1;" horiz-adv-x="278" d="M218 531V377H61V531H218ZM175 317L213 9V-183H65V9L104 317H175Z" />
+<glyph unicode="&#xA2;" horiz-adv-x="556" d="M260 616H319V531Q409 531 474 474T543 334H404Q401 369 378 395T319 424V93Q357 100 381 132T406 203H545Q537 111 476 53T319 -14V-115H260V-14Q155 -8 88 66T21 250Q21 371 85 446T260 531V616ZM163 264Q163 196 188 152T260 93V423Q213 411 188 369T163 264Z" />
+<glyph unicode="&#xA3;" horiz-adv-x="556" d="M295 731Q410 731 474 668T539 481H404Q398 614 295 614Q252 614 225 590T197 521Q197 494 203 471T238 394H371V309H266Q274 287 274 248Q274 205 253 172T192 107L194 105Q234 128 262 128Q295 128 340 117Q396 105 420 105Q448 105 467 115T507 148L567 47Q501 -17 410 -17Q348 -17 299 2Q250 21 203 21Q136 21 88 -17L26 76Q139 147 139 242Q139 268 120 309H21V394H85Q66 418 53 455T40 532Q40 621 110 676T295 731Z" />
+<glyph unicode="&#xA4;" horiz-adv-x="556" d="M475 610L536 549L480 494Q525 443 525 351Q525 260 479 205L534 149L479 94L422 152Q372 102 279 102Q185 102 132 151L76 93L20 149L77 207Q29 264 29 349Q29 445 77 493L20 551L77 608L134 552Q159 573 198 585T280 598Q314 598 352 587T417 553L475 610ZM153 349Q153 288 188 249T279 209Q335 209 368 249T401 351Q401 412 368 451T279 491Q224 491 189 451T153 349Z" />
+<glyph unicode="&#xA5;" horiz-adv-x="556" d="M154 714L286 403L415 714H577L422 403H517V308H374L359 279V233H517V138H359V0H207V138H50V233H207V279L193 308H50V403H145L-9 714H154Z" />
+<glyph unicode="&#xA6;" horiz-adv-x="223" d="M165 661V411H58V661H165ZM165 161V-89H58V161H165Z" />
+<glyph unicode="&#xA7;" horiz-adv-x="556" d="M283 731Q376 731 435 678T494 538H370Q370 576 347 600T285 624Q256 624 233 607T209 561Q209 533 238 508T333 455Q468 394 507 350T546 250Q546 198 517 160T442 104Q497 63 497 -14Q497 -88 436 -135T284 -182Q179 -182 119 -133T59 12H183Q187 -75 281 -75Q317 -75 336 -56T355 -7Q355 22 328 45T249 92L194 117Q93 163 52 208T10 312Q10 419 117 457Q74 506 74 558Q74 634 135 682T283 731ZM134 323Q134 292 168 273L333 183Q358 169 376 169Q394 169 408 187T422 224Q422 262 377 287L203 385Q195 390 187 390Q167 390 151 369T134 323Z" />
+<glyph unicode="&#xA8;" horiz-adv-x="259" d="M94 715V598H-41V715H94ZM300 715V598H165V715H300Z" />
+<glyph unicode="&#xA9;" horiz-adv-x="800" d="M400 731Q505 731 593 684T733 550T784 357Q784 251 732 164T591 30T400 -17Q296 -17 207 31T67 166T16 357Q16 462 66 548T207 682T400 731ZM118 357Q118 230 199 147T400 63Q520 63 601 147T682 357Q682 481 601 566T399 651Q280 651 199 567T118 357ZM412 583Q485 583 534 542T593 428H515Q507 464 479 483T412 503Q355 503 325 464T295 361Q295 299 328 258T414 217Q454 217 481 237T515 295H596Q584 222 534 180T414 137Q318 137 259 200T199 359Q199 461 258 522T412 583Z" />
+<glyph unicode="&#xAA;" horiz-adv-x="344" d="M176 714Q251 714 288 692T326 624V456Q326 409 338 384H237Q232 400 230 415Q191 375 122 375Q69 375 40 401T10 475Q10 507 24 527T65 558T169 577Q195 580 212 585T231 610Q231 633 217 641T172 649Q127 647 122 605H20Q30 663 68 688T176 714ZM112 477Q113 441 158 440Q230 440 230 512V535Q220 525 182 520Q147 515 130 506T112 477Z" />
+<glyph unicode="&#xAB;" horiz-adv-x="444" d="M199 463V343L109 272L199 200V80L42 205V340L199 463ZM402 463V343L312 272L402 200V80L245 205V340L402 463Z" />
+<glyph unicode="&#xAC;" horiz-adv-x="600" d="M544 406V99H437V299H40V406H544Z" />
+<glyph unicode="&#xAD;" horiz-adv-x="407" d="M354 334V212H53V334H354Z" />
+<glyph unicode="&#xAE;" horiz-adv-x="800" d="M400 731Q504 731 592 684T732 550T784 358Q784 252 734 166T595 32T400 -17Q295 -17 207 31T67 166T16 358Q16 463 66 548T206 682T400 731ZM118 358Q118 235 197 149T400 63Q520 63 601 148T682 358Q682 479 603 565T399 651Q280 651 199 568T118 358ZM411 568Q493 568 533 539T573 444Q573 342 463 332L575 149H488L386 328H334V149H251V568H411ZM413 393Q457 393 473 407T490 451Q490 503 405 503H334V393H413Z" />
+<glyph unicode="&#xAF;" horiz-adv-x="259" d="M306 694V619H-47V694H306Z" />
+<glyph unicode="&#xB0;" horiz-adv-x="400" d="M200 714Q262 714 305 671T348 566Q348 504 305 461T200 418Q139 418 96 461T52 566Q52 627 94 670T200 714ZM117 566Q117 531 142 505T200 478Q233 478 258 504T283 566Q283 600 258 627T200 654Q167 654 142 628T117 566Z" />
+<glyph unicode="&#xB1;" horiz-adv-x="600" d="M354 506V375H553V268H354V137H247V268H48V375H247V506H354ZM553 107V0H48V107H553Z" />
+<glyph unicode="&#xB2;" horiz-adv-x="390" d="M205 829Q277 829 317 796T357 702Q357 628 276 578L194 528Q152 501 148 477H354V397H33V398Q33 468 55 508T131 583L206 630Q233 647 244 663T256 702Q256 723 242 737T204 752Q143 752 140 676H40Q40 747 84 788T205 829Z" />
+<glyph unicode="&#xB3;" horiz-adv-x="390" d="M198 829Q264 829 304 800T344 716Q344 651 278 628Q361 611 361 522Q361 462 312 425T191 388Q110 388 69 426T27 527H123Q131 467 194 467Q226 467 246 482T267 526Q267 558 249 572T190 586H162V655H188Q217 655 234 668T252 704Q252 727 237 740T194 753Q132 753 132 687H37Q40 756 83 792T198 829Z" />
+<glyph unicode="&#xB4;" horiz-adv-x="259" d="M307 731L153 589H54L150 731H307Z" />
+<glyph unicode="&#xB5;" horiz-adv-x="593" d="M196 517V225Q196 161 216 130T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q343 -14 271 -14Q227 -14 196 10V-182H54V517H196Z" />
+<glyph unicode="&#xB6;" horiz-adv-x="620" d="M535 -166H433V634H323V-166H221V357Q113 358 58 405T2 532Q2 714 240 714H535V-166Z" />
+<glyph unicode="&#xB7;" horiz-adv-x="278" d="M140 372Q162 372 181 361T212 330T224 287Q224 267 213 248T182 216T141 203Q118 203 97 215T66 248T55 287Q55 310 67 330T99 361T140 372Z" />
+<glyph unicode="&#xB8;" horiz-adv-x="259" d="M115 0H164L125 -52L127 -54Q146 -47 167 -47Q206 -47 229 -67T253 -124Q253 -168 221 -192T127 -217Q67 -217 12 -195L33 -147Q77 -165 112 -165Q156 -164 157 -131Q157 -116 146 -107T115 -98Q97 -98 77 -106L56 -82L115 0Z" />
+<glyph unicode="&#xB9;" horiz-adv-x="390" d="M269 820V397H167V665H57V737H78Q174 737 185 820H269Z" />
+<glyph unicode="&#xBA;" horiz-adv-x="367" d="M183 714Q261 714 308 669T355 544Q355 466 309 421T183 375Q105 375 59 420T12 544Q12 623 58 668T183 714ZM119 544Q119 506 135 478T183 450Q211 450 229 476T248 544Q248 587 231 613T183 639Q155 639 137 614T119 544Z" />
+<glyph unicode="&#xBB;" horiz-adv-x="444" d="M199 340V205L42 80V200L132 272L42 343V463L199 340ZM245 463L402 340V205L245 80V200L335 272L245 343V463Z" />
+<glyph unicode="&#xBC;" horiz-adv-x="834" d="M247 703V280H145V548H35V620H56Q152 620 163 703H247ZM649 722L237 -22H150L564 722H649ZM733 423V159H790V83H733V0H637V83H449V167L642 423H733ZM524 159H637V313L524 159Z" />
+<glyph unicode="&#xBD;" horiz-adv-x="834" d="M247 703V280H145V548H35V620H56Q152 620 163 703H247ZM629 722L217 -22H130L544 722H629ZM642 432Q714 432 754 399T794 305Q794 231 713 181L631 131Q589 104 585 80H791V0H470V1Q470 71 492 111T568 186L643 233Q670 250 681 266T693 305Q693 326 679 340T641 355Q580 355 577 279H477Q477 350 521 391T642 432Z" />
+<glyph unicode="&#xBE;" horiz-adv-x="834" d="M208 712Q274 712 314 683T354 599Q354 534 288 511Q371 494 371 405Q371 345 322 308T201 271Q120 271 79 309T37 410H133Q141 350 204 350Q236 350 256 365T277 409Q277 441 259 455T200 469H172V538H198Q227 538 244 551T262 587Q262 610 247 623T204 636Q142 636 142 570H47Q50 639 93 675T208 712ZM720 722L308 -22H221L635 722H720ZM763 423V159H820V83H763V0H667V83H479V167L672 423H763ZM554 159H667V313L554 159Z" />
+<glyph unicode="&#xBF;" horiz-adv-x="556" d="M363 531V377H206V531H363ZM349 321V296Q349 238 328 195T255 113Q218 86 204 64T189 12Q189 -79 274 -79Q324 -79 349 -42T375 51H522Q518 -64 451 -130T280 -196Q203 -196 147 -170T62 -99T32 -2Q32 55 51 94T119 168Q177 207 195 233T214 292V321H349Z" />
+<glyph unicode="&#xC0;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM315 921L411 779H312L158 921H315Z" />
+<glyph unicode="&#xC1;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM528 921L374 779H275L371 921H528Z" />
+<glyph unicode="&#xC2;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM410 921L520 779H405L343 860L279 779H169L280 921H410Z" />
+<glyph unicode="&#xC3;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM277 911Q308 911 357 892Q398 876 420 876Q437 876 447 883T463 911H527Q515 851 488 824T415 797Q380 797 338 813Q292 831 268 831Q234 831 223 789H160Q167 843 199 877T277 911Z" />
+<glyph unicode="&#xC4;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM308 905V788H173V905H308ZM514 905V788H379V905H514Z" />
+<glyph unicode="&#xC5;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM344 973Q376 973 403 958T446 916T461 859Q461 829 446 803T404 761T344 745Q313 745 285 760T242 802T227 859Q227 889 242 916T285 958T344 973ZM283 859Q283 831 300 814T344 796Q371 796 388 813T405 859Q405 887 389 904T343 922Q318 922 301 905T283 859Z" />
+<glyph unicode="&#xC6;" horiz-adv-x="981" d="M936 714V582H604V429H916V307H604V132H944V0H452V159H228L156 0H-11L330 714H936ZM418 582L280 276H452V582H418Z" />
+<glyph unicode="&#xC7;" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q535 528 491 563T389 599Q300 599 248 534T195 354Q195 243 247 179T389 115Q457 115 499 156T551 275H703Q691 140 606 62T390 -17L364 -52L366 -54Q380 -47 406 -47Q445 -47 468 -67T492 -124Q492 -169 460 -193T367 -217Q310 -217 251 -195L272 -147Q310 -165 351 -165Q396 -165 396 -131Q396 -116 385 -107T354 -98Q336 -98 316 -106L295 -82L343 -14Q206 0 122 101T38 354Q38 522 135 626T389 731Z" />
+<glyph unicode="&#xC8;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM294 921L390 779H291L137 921H294Z" />
+<glyph unicode="&#xC9;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM526 921L372 779H273L369 921H526Z" />
+<glyph unicode="&#xCA;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM398 921L508 779H393L331 860L267 779H157L268 921H398Z" />
+<glyph unicode="&#xCB;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM296 905V788H161V905H296ZM502 905V788H367V905H502Z" />
+<glyph unicode="&#xCC;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM121 921L217 779H118L-36 921H121Z" />
+<glyph unicode="&#xCD;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM328 921L174 779H75L171 921H328Z" />
+<glyph unicode="&#xCE;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM213 921L323 779H208L146 860L82 779H-28L83 921H213Z" />
+<glyph unicode="&#xCF;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM111 905V788H-24V905H111ZM317 905V788H182V905H317Z" />
+<glyph unicode="&#xD0;" horiz-adv-x="741" d="M375 714Q527 714 614 620T701 361Q701 195 615 98T379 0H69V320H-4V418H69V714H375ZM386 418V320H226V132H366Q451 132 497 189T544 347Q544 465 495 523T337 582H226V418H386Z" />
+<glyph unicode="&#xD1;" horiz-adv-x="741" d="M225 714L523 235H525V714H672V0H515L218 478H216V0H69V714H225ZM299 911Q330 911 379 892Q420 876 442 876Q459 876 469 883T485 911H549Q537 851 510 824T437 797Q402 797 360 813Q314 831 290 831Q256 831 245 789H182Q189 843 221 877T299 911Z" />
+<glyph unicode="&#xD2;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM351 921L447 779H348L194 921H351Z" />
+<glyph unicode="&#xD3;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM584 921L430 779H331L427 921H584Z" />
+<glyph unicode="&#xD4;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM456 921L566 779H451L389 860L325 779H215L326 921H456Z" />
+<glyph unicode="&#xD5;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM323 911Q354 911 403 892Q444 876 466 876Q483 876 493 883T509 911H573Q561 851 534 824T461 797Q426 797 384 813Q338 831 314 831Q280 831 269 789H206Q213 843 245 877T323 911Z" />
+<glyph unicode="&#xD6;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM354 905V788H219V905H354ZM560 905V788H425V905H560Z" />
+<glyph unicode="&#xD7;" horiz-adv-x="600" d="M142 489L301 329L461 489L537 413L376 253L537 93L461 17L301 178L140 17L64 93L225 253L66 413L142 489Z" />
+<glyph unicode="&#xD8;" horiz-adv-x="778" d="M744 699L660 606Q740 506 740 354Q740 189 642 86T389 -17Q258 -17 166 59L83 -33L34 10L120 105Q38 205 38 354Q38 520 134 625T389 731Q523 731 614 654L694 743L744 699ZM195 354Q195 275 223 219L519 548Q468 599 388 599Q298 599 247 534T195 354ZM261 164Q310 115 389 115Q478 115 530 179T583 354Q583 432 556 490L261 164Z" />
+<glyph unicode="&#xD9;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM332 921L428 779H329L175 921H332Z" />
+<glyph unicode="&#xDA;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM565 921L411 779H312L408 921H565Z" />
+<glyph unicode="&#xDB;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM437 921L547 779H432L370 860L306 779H196L307 921H437Z" />
+<glyph unicode="&#xDC;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM335 905V788H200V905H335ZM541 905V788H406V905H541Z" />
+<glyph unicode="&#xDD;" horiz-adv-x="667" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168ZM531 921L377 779H278L374 921H531Z" />
+<glyph unicode="&#xDE;" horiz-adv-x="667" d="M226 714V617H393Q508 617 573 555T638 388Q638 281 571 220T391 159H226V0H69V714H226ZM351 281Q420 281 453 306T486 388Q486 445 453 470T349 495H226V281H351Z" />
+<glyph unicode="&#xDF;" horiz-adv-x="611" d="M291 731Q393 731 455 680T518 540Q518 490 493 452T425 400V398Q487 385 521 337T555 219Q555 122 492 54T337 -14Q299 -14 256 -8V108Q273 103 296 103Q346 103 379 137T413 225Q413 283 382 314T291 346L256 344V438L278 436Q324 436 353 460T383 525Q383 614 288 614Q241 614 220 586T198 516V0H56V494Q56 731 291 731Z" />
+<glyph unicode="&#xE0;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM260 731L356 589H257L103 731H260Z" />
+<glyph unicode="&#xE1;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM485 731L331 589H232L328 731H485Z" />
+<glyph unicode="&#xE2;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM361 731L471 589H356L294 670L230 589H120L231 731H361Z" />
+<glyph unicode="&#xE3;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM228 721Q259 721 303 704Q347 686 371 686Q389 686 399 694T414 721H478Q469 669 442 638T366 607Q333 607 289 623Q244 641 219 641Q186 641 174 599H111Q118 652 150 686T228 721Z" />
+<glyph unicode="&#xE4;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM259 715V598H124V715H259ZM465 715V598H330V715H465Z" />
+<glyph unicode="&#xE5;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM296 804Q332 804 359 789T402 746T418 684Q418 650 402 622T357 579T295 564Q263 564 235 578T190 621T173 684Q173 719 191 748T237 790T296 804ZM232 684Q232 655 249 636T295 617Q324 617 341 635T359 684Q359 713 343 732T295 751Q267 751 250 732T232 684Z" />
+<glyph unicode="&#xE6;" horiz-adv-x="907" d="M295 531Q352 531 398 513T467 461Q499 497 538 514T640 531Q752 531 814 450T878 224H509V218Q509 162 544 122T632 81Q720 81 735 162H873Q850 81 787 34T635 -14Q503 -14 442 74Q409 30 353 8T231 -14Q141 -14 90 26T38 140Q38 193 62 226T123 275T242 303Q322 313 353 325T385 370Q385 436 293 436Q199 436 194 356H52Q54 437 117 484T295 531ZM736 314Q736 367 706 401T624 436Q577 436 544 403T509 314H736ZM180 148Q180 81 268 81Q316 81 350 110T385 187V252L373 245Q356 234 283 224Q232 218 206 200T180 148Z" />
+<glyph unicode="&#xE7;" horiz-adv-x="574" d="M302 531Q406 531 472 478T545 335H406Q392 424 301 424Q244 424 212 378T180 256Q180 183 211 138T298 93Q396 93 411 198H548Q535 104 476 47T312 -14L284 -52L286 -54Q302 -47 326 -47Q366 -47 389 -67T412 -124Q412 -169 380 -193T287 -217Q230 -217 171 -195L192 -147Q230 -165 271 -165Q316 -165 316 -131Q316 -116 305 -107T274 -98Q256 -98 236 -106L215 -82L265 -12Q159 0 99 72T38 251Q38 378 110 454T302 531Z" />
+<glyph unicode="&#xE8;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM259 731L355 589H256L102 731H259Z" />
+<glyph unicode="&#xE9;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM484 731L330 589H231L327 731H484Z" />
+<glyph unicode="&#xEA;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM360 731L470 589H355L293 670L229 589H119L230 731H360Z" />
+<glyph unicode="&#xEB;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM258 715V598H123V715H258ZM464 715V598H329V715H464Z" />
+<glyph unicode="&#xEC;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM105 731L201 589H102L-52 731H105Z" />
+<glyph unicode="&#xED;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM310 731L156 589H57L153 731H310Z" />
+<glyph unicode="&#xEE;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM196 731L306 589H191L129 670L65 589H-45L66 731H196Z" />
+<glyph unicode="&#xEF;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM94 715V598H-41V715H94ZM300 715V598H165V715H300Z" />
+<glyph unicode="&#xF0;" horiz-adv-x="611" d="M247 743Q315 720 357 693L463 743L509 684L420 643Q499 571 536 482T573 272Q573 145 499 66T305 -14Q186 -14 112 59T38 250Q38 363 101 434T273 506Q359 506 413 456H415Q382 546 318 593L201 537L155 596L247 639L173 673L247 743ZM180 257Q180 177 213 135T305 93Q367 93 399 136T431 257Q431 328 397 369T303 411Q242 411 211 367T180 257Z" />
+<glyph unicode="&#xF1;" horiz-adv-x="593" d="M351 531Q450 531 494 481T539 322V0H397V293Q397 357 377 388T306 419Q248 419 222 384T196 269V0H54V517H189V445H192Q245 531 351 531ZM229 721Q260 721 304 704Q348 686 372 686Q390 686 400 694T415 721H479Q470 669 443 638T367 607Q334 607 290 623Q245 641 220 641Q187 641 175 599H112Q119 652 151 686T229 721Z" />
+<glyph unicode="&#xF2;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM272 731L368 589H269L115 731H272Z" />
+<glyph unicode="&#xF3;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM497 731L343 589H244L340 731H497Z" />
+<glyph unicode="&#xF4;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM373 731L483 589H368L306 670L242 589H132L243 731H373Z" />
+<glyph unicode="&#xF5;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM240 721Q271 721 315 704Q359 686 383 686Q401 686 411 694T426 721H490Q481 669 454 638T378 607Q345 607 301 623Q256 641 231 641Q198 641 186 599H123Q130 652 162 686T240 721Z" />
+<glyph unicode="&#xF6;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM271 715V598H136V715H271ZM477 715V598H342V715H477Z" />
+<glyph unicode="&#xF7;" horiz-adv-x="600" d="M301 545Q334 545 359 521T385 460Q385 430 361 403T302 376Q265 376 241 401T216 460Q216 496 241 520T301 545ZM553 306V199H48V306H553ZM301 129Q336 129 360 105T385 45Q385 13 360 -13T302 -40Q267 -40 242 -15T216 45Q216 80 241 104T301 129Z" />
+<glyph unicode="&#xF8;" horiz-adv-x="611" d="M521 544L558 512L504 451Q573 377 573 258Q573 134 500 60T305 -14Q208 -14 140 36L81 -31L44 1L104 69Q38 141 38 258Q38 383 111 457T305 531Q400 531 468 483L521 544ZM180 258Q180 206 195 172L388 392Q358 424 304 424Q244 424 212 381T180 258ZM220 127Q251 93 305 93Q368 93 399 137T431 258Q431 308 415 349L220 127Z" />
+<glyph unicode="&#xF9;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM264 731L360 589H261L107 731H264Z" />
+<glyph unicode="&#xFA;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM489 731L335 589H236L332 731H489Z" />
+<glyph unicode="&#xFB;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM365 731L475 589H360L298 670L234 589H124L235 731H365Z" />
+<glyph unicode="&#xFC;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM263 715V598H128V715H263ZM469 715V598H334V715H469Z" />
+<glyph unicode="&#xFD;" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146ZM455 731L301 589H202L298 731H455Z" />
+<glyph unicode="&#xFE;" horiz-adv-x="611" d="M196 714V451H198Q247 531 346 531Q454 531 517 455T580 253Q580 134 518 60T353 -14Q253 -14 198 64H196V-182H54V714H196ZM191 257Q191 178 224 136T315 93Q379 93 408 139T438 257Q438 335 404 379T313 424Q255 424 223 380T191 257Z" />
+<glyph unicode="&#xFF;" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146ZM229 715V598H94V715H229ZM435 715V598H300V715H435Z" />
+<glyph unicode="&#x100;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM520 884V809H167V884H520Z" />
+<glyph unicode="&#x101;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM471 694V619H118V694H471Z" />
+<glyph unicode="&#x102;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342ZM242 921Q248 888 275 871T341 854Q436 855 451 921H514Q495 780 336 779Q190 781 177 921H242Z" />
+<glyph unicode="&#x103;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147ZM193 731Q198 700 225 682T292 664Q386 664 402 731H465Q445 589 287 589Q215 589 175 626T128 731H193Z" />
+<glyph unicode="&#x104;" horiz-adv-x="685" d="M425 714L692 0H609Q568 -43 552 -68T536 -119Q536 -136 546 -146T573 -157Q602 -157 628 -125L673 -151Q630 -217 549 -217Q500 -217 470 -195T440 -134Q440 -100 465 -69T545 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342Z" />
+<glyph unicode="&#x105;" horiz-adv-x="574" d="M292 531Q518 531 518 385V110Q518 29 536 0H470Q435 -35 419 -61T402 -118Q402 -136 412 -146T440 -157Q467 -157 495 -125L540 -151Q517 -186 488 -201T416 -217Q367 -217 337 -194T307 -133Q307 -99 329 -69T400 0Q386 28 382 50Q321 -14 208 -14Q128 -14 80 26T32 141Q32 213 78 252T243 303Q319 311 347 323T376 367Q376 408 352 422T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q376 81 376 198V253Q366 244 348 239T276 226Q221 218 198 200T174 147Z" />
+<glyph unicode="&#x106;" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q537 527 492 563T389 599Q297 599 246 533T195 354Q195 244 246 180T389 115Q457 115 499 156T551 275H703Q691 139 606 61T389 -17Q232 -17 135 86T38 354Q38 520 134 625T389 731ZM579 921L425 779H326L422 921H579Z" />
+<glyph unicode="&#x107;" horiz-adv-x="574" d="M302 531Q407 531 473 478T545 335H406Q392 424 301 424Q245 424 213 378T180 256Q180 183 211 138T298 93Q395 93 411 198H548Q534 95 469 41T299 -14Q184 -14 111 59T38 251Q38 379 110 455T302 531ZM495 731L341 589H242L338 731H495Z" />
+<glyph unicode="&#x108;" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q537 527 492 563T389 599Q297 599 246 533T195 354Q195 244 246 180T389 115Q457 115 499 156T551 275H703Q691 139 606 61T389 -17Q232 -17 135 86T38 354Q38 520 134 625T389 731ZM451 921L561 779H446L384 860L320 779H210L321 921H451Z" />
+<glyph unicode="&#x109;" horiz-adv-x="574" d="M302 531Q407 531 473 478T545 335H406Q392 424 301 424Q245 424 213 378T180 256Q180 183 211 138T298 93Q395 93 411 198H548Q534 95 469 41T299 -14Q184 -14 111 59T38 251Q38 379 110 455T302 531ZM371 731L481 589H366L304 670L240 589H130L241 731H371Z" />
+<glyph unicode="&#x10A;" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q537 527 492 563T389 599Q297 599 246 533T195 354Q195 244 246 180T389 115Q457 115 499 156T551 275H703Q691 139 606 61T389 -17Q232 -17 135 86T38 354Q38 520 134 625T389 731ZM451 905V788H316V905H451Z" />
+<glyph unicode="&#x10B;" horiz-adv-x="574" d="M302 531Q407 531 473 478T545 335H406Q392 424 301 424Q245 424 213 378T180 256Q180 183 211 138T298 93Q395 93 411 198H548Q534 95 469 41T299 -14Q184 -14 111 59T38 251Q38 379 110 455T302 531ZM372 715V598H237V715H372Z" />
+<glyph unicode="&#x10C;" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q537 527 492 563T389 599Q297 599 246 533T195 354Q195 244 246 180T389 115Q457 115 499 156T551 275H703Q691 139 606 61T389 -17Q232 -17 135 86T38 354Q38 520 134 625T389 731ZM323 921L385 840L449 921H559L448 779H318L208 921H323Z" />
+<glyph unicode="&#x10D;" horiz-adv-x="574" d="M302 531Q407 531 473 478T545 335H406Q392 424 301 424Q245 424 213 378T180 256Q180 183 211 138T298 93Q395 93 411 198H548Q534 95 469 41T299 -14Q184 -14 111 59T38 251Q38 379 110 455T302 531ZM245 731L307 650L371 731H481L370 589H240L130 731H245Z" />
+<glyph unicode="&#x10E;" horiz-adv-x="741" d="M375 714Q527 714 614 620T701 361Q701 190 614 95T379 0H69V714H375ZM365 132Q450 132 497 188T544 347Q544 465 494 523T338 582H226V132H365ZM272 921L334 840L398 921H508L397 779H267L157 921H272Z" />
+<glyph unicode="&#x10F;" horiz-adv-x="611" d="M558 714V0H423V66H421Q375 -14 264 -14Q157 -14 95 64T32 263Q32 381 95 456T261 531Q308 531 349 512T414 454H416V714H558ZM174 259Q174 188 207 141T299 93Q360 93 390 137T421 260Q421 338 389 381T298 424Q237 424 206 379T174 259ZM784 714L703 572H605L636 714H784Z" />
+<glyph unicode="&#x110;" horiz-adv-x="741" d="M375 714Q527 714 614 620T701 361Q701 195 615 98T379 0H69V320H-4V418H69V714H375ZM386 418V320H226V132H366Q451 132 497 189T544 347Q544 465 495 523T337 582H226V418H386Z" />
+<glyph unicode="&#x111;" horiz-adv-x="621" d="M558 714V644H639V568H558V0H423V66H421Q375 -14 264 -14Q157 -14 95 64T32 263Q32 381 95 456T261 531Q309 531 350 511T414 454H416V568H258V644H416V714H558ZM174 259Q174 184 208 139T299 93Q358 93 389 137T421 260Q421 338 389 381T298 424Q237 424 206 379T174 259Z" />
+<glyph unicode="&#x112;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM508 884V809H155V884H508Z" />
+<glyph unicode="&#x113;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM470 694V619H117V694H470Z" />
+<glyph unicode="&#x114;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM230 921Q236 888 263 871T329 854Q424 855 439 921H502Q483 780 324 779Q178 781 165 921H230Z" />
+<glyph unicode="&#x115;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM192 731Q197 700 224 682T291 664Q385 664 401 731H464Q444 589 286 589Q214 589 174 626T127 731H192Z" />
+<glyph unicode="&#x116;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM398 905V788H263V905H398Z" />
+<glyph unicode="&#x117;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM360 715V598H225V715H360Z" />
+<glyph unicode="&#x118;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H540Q497 -46 482 -70T467 -119Q467 -136 477 -146T504 -157Q533 -157 559 -125L604 -151Q581 -186 552 -201T480 -217Q430 -217 401 -195T371 -134Q371 -70 476 0H69V714H603Z" />
+<glyph unicode="&#x119;" horiz-adv-x="574" d="M293 531Q367 531 423 498T512 399T545 250Q545 237 544 224H171Q174 160 204 127T298 93Q336 93 368 112T410 160H535Q483 4 331 -12Q295 -51 283 -74T270 -119Q270 -136 280 -146T307 -157Q336 -157 362 -125L407 -151Q384 -186 356 -201T283 -217Q232 -217 203 -194T174 -134Q174 -72 261 -12Q194 -6 140 29T58 125T29 258Q29 338 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q239 424 208 396T171 314H402Z" />
+<glyph unicode="&#x11A;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM272 921L334 840L398 921H508L397 779H267L157 921H272Z" />
+<glyph unicode="&#x11B;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM234 731L296 650L360 731H470L359 589H229L119 731H234Z" />
+<glyph unicode="&#x11C;" horiz-adv-x="759" d="M389 731Q511 731 596 660T690 479H540Q526 539 486 569T389 599Q297 599 246 533T195 354Q195 244 247 180T389 115Q543 115 559 269H401V386H701V0H601L585 81Q510 -17 389 -17Q231 -17 135 87T38 354Q38 520 134 625T389 731ZM451 921L561 779H446L384 860L320 779H210L321 921H451Z" />
+<glyph unicode="&#x11D;" horiz-adv-x="611" d="M260 531Q367 531 414 448H416V517H551V32Q551 -80 482 -138T284 -196Q186 -196 123 -149T55 -30H196Q213 -101 302 -101Q357 -101 386 -69T416 24V95H414Q393 57 353 36T259 15Q155 15 97 83T38 275Q38 385 99 458T260 531ZM180 277Q180 204 210 163T295 122Q350 122 383 161T416 266Q416 344 385 384T294 424Q239 424 210 383T180 277ZM376 731L486 589H371L309 670L245 589H135L246 731H376Z" />
+<glyph unicode="&#x11E;" horiz-adv-x="759" d="M389 731Q511 731 596 660T690 479H540Q526 539 486 569T389 599Q297 599 246 533T195 354Q195 244 247 180T389 115Q543 115 559 269H401V386H701V0H601L585 81Q510 -17 389 -17Q231 -17 135 87T38 354Q38 520 134 625T389 731ZM283 921Q289 888 316 871T382 854Q477 855 492 921H555Q536 780 377 779Q231 781 218 921H283Z" />
+<glyph unicode="&#x11F;" horiz-adv-x="611" d="M260 531Q367 531 414 448H416V517H551V32Q551 -80 482 -138T284 -196Q186 -196 123 -149T55 -30H196Q213 -101 302 -101Q357 -101 386 -69T416 24V95H414Q393 57 353 36T259 15Q155 15 97 83T38 275Q38 385 99 458T260 531ZM180 277Q180 204 210 163T295 122Q350 122 383 161T416 266Q416 344 385 384T294 424Q239 424 210 383T180 277ZM208 731Q213 700 240 682T307 664Q401 664 417 731H480Q460 589 302 589Q230 589 190 626T143 731H208Z" />
+<glyph unicode="&#x120;" horiz-adv-x="759" d="M389 731Q511 731 596 660T690 479H540Q526 539 486 569T389 599Q297 599 246 533T195 354Q195 244 247 180T389 115Q543 115 559 269H401V386H701V0H601L585 81Q510 -17 389 -17Q231 -17 135 87T38 354Q38 520 134 625T389 731ZM451 905V788H316V905H451Z" />
+<glyph unicode="&#x121;" horiz-adv-x="611" d="M260 531Q367 531 414 448H416V517H551V32Q551 -80 482 -138T284 -196Q186 -196 123 -149T55 -30H196Q213 -101 302 -101Q357 -101 386 -69T416 24V95H414Q393 57 353 36T259 15Q155 15 97 83T38 275Q38 385 99 458T260 531ZM180 277Q180 204 210 163T295 122Q350 122 383 161T416 266Q416 344 385 384T294 424Q239 424 210 383T180 277ZM376 715V598H241V715H376Z" />
+<glyph unicode="&#x122;" horiz-adv-x="759" d="M389 731Q511 731 596 660T690 479H540Q526 539 486 569T389 599Q297 599 246 533T195 354Q195 244 247 180T389 115Q543 115 559 269H401V386H701V0H601L585 81Q510 -17 389 -17Q231 -17 135 87T38 354Q38 520 134 625T389 731ZM452 -50V-122Q452 -159 440 -178T402 -207T323 -217H317V-180Q347 -177 359 -167T374 -143H307V-50H452Z" />
+<glyph unicode="&#x123;" horiz-adv-x="611" d="M260 531Q367 531 414 448H416V517H551V32Q551 -80 482 -138T284 -196Q186 -196 123 -149T55 -30H196Q213 -101 302 -101Q357 -101 386 -69T416 24V95H414Q393 57 353 36T259 15Q155 15 97 83T38 275Q38 385 99 458T260 531ZM180 277Q180 204 210 163T295 122Q350 122 383 161T416 266Q416 344 385 384T294 424Q239 424 210 383T180 277ZM370 751Q348 749 334 741T313 714H380V621H235V691Q235 729 248 749T287 778T363 788H370V751Z" />
+<glyph unicode="&#x124;" horiz-adv-x="741" d="M226 714V440H515V714H672V0H515V308H226V0H69V714H226ZM436 921L546 779H431L369 860L305 779H195L306 921H436Z" />
+<glyph unicode="&#x125;" horiz-adv-x="593" d="M196 714V445H199Q223 485 264 508T351 531Q450 531 494 481T539 323V0H397V294Q397 357 377 388T306 419Q249 419 223 385T196 271V0H54V714H196ZM351 921L461 779H346L284 860L220 779H110L221 921H351Z" />
+<glyph unicode="&#x126;" horiz-adv-x="741" d="M226 714V605H515V714H672V0H515V281H226V0H69V714H226ZM515 403V516H226V403H515Z" />
+<glyph unicode="&#x127;" horiz-adv-x="603" d="M206 714V644H364V568H206V445H209Q233 484 273 507T361 531Q459 531 504 482T549 322V0H407V294Q407 357 387 388T316 419Q254 419 230 382T206 272V0H64V568H-17V644H64V714H206Z" />
+<glyph unicode="&#x128;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM81 911Q112 911 161 892Q202 876 224 876Q241 876 251 883T267 911H331Q319 851 292 824T219 797Q184 797 142 813Q96 831 72 831Q38 831 27 789H-36Q-29 843 3 877T81 911Z" />
+<glyph unicode="&#x129;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM63 721Q94 721 138 704Q182 686 206 686Q224 686 234 694T249 721H313Q304 669 277 638T201 607Q168 607 124 623Q79 641 54 641Q21 641 9 599H-54Q-47 652 -15 686T63 721Z" />
+<glyph unicode="&#x12A;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM323 884V809H-30V884H323Z" />
+<glyph unicode="&#x12B;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM306 694V619H-47V694H306Z" />
+<glyph unicode="&#x12C;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM45 921Q51 888 78 871T144 854Q239 855 254 921H317Q298 780 139 779Q-7 781 -20 921H45Z" />
+<glyph unicode="&#x12D;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM28 731Q33 700 60 682T127 664Q221 664 237 731H300Q280 589 122 589Q50 589 10 626T-37 731H28Z" />
+<glyph unicode="&#x12E;" horiz-adv-x="295" d="M226 714V0Q180 -37 160 -65T140 -121Q140 -157 172 -157Q197 -157 218 -129L259 -155Q237 -186 213 -201T150 -217Q103 -217 76 -195T48 -134Q48 -66 158 0H69V714H226Z" />
+<glyph unicode="&#x12F;" horiz-adv-x="258" d="M200 714V597H58V714H200ZM200 517V0Q158 -40 141 -66T123 -121Q123 -157 155 -157Q180 -157 201 -129L242 -155Q220 -185 196 -201T133 -217Q86 -217 59 -195T31 -134Q31 -66 138 0H58V517H200Z" />
+<glyph unicode="&#x130;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM215 905V788H80V905H215Z" />
+<glyph unicode="&#x131;" horiz-adv-x="258" d="M200 517V0H58V517H200Z" />
+<glyph unicode="&#x132;" horiz-adv-x="845" d="M226 714V0H69V714H226ZM776 714V224Q776 -17 540 -17Q433 -17 368 41T303 202V266H445V231Q445 168 468 142T536 115Q579 115 599 139T619 226V714H776Z" />
+<glyph unicode="&#x133;" horiz-adv-x="524" d="M200 714V597H58V714H200ZM200 517V0H58V517H200ZM455 714V597H313V714H455ZM455 517V-29Q455 -85 439 -117T385 -165T274 -182Q246 -182 227 -178V-61Q239 -65 259 -65Q290 -65 302 -53T313 -18V517H455Z" />
+<glyph unicode="&#x134;" horiz-adv-x="556" d="M487 714V224Q487 -17 251 -17Q144 -17 79 41T14 202V266H156V231Q156 168 179 142T247 115Q290 115 310 139T330 226V714H487ZM469 921L579 779H464L402 860L338 779H228L339 921H469Z" />
+<glyph unicode="&#x135;" horiz-adv-x="278" d="M209 517V-27Q209 -84 193 -116T139 -165T28 -182Q1 -182 -19 -178V-61Q-8 -65 12 -65Q43 -65 55 -54T67 -18V517H209ZM201 731L311 589H196L134 670L70 589H-40L71 731H201Z" />
+<glyph unicode="&#x136;" horiz-adv-x="722" d="M226 714V418L505 714H701L422 432L728 0H531L316 321L226 230V0H69V714H226ZM443 -50V-122Q443 -159 431 -178T393 -207T314 -217H308V-180Q338 -177 350 -167T365 -143H298V-50H443Z" />
+<glyph unicode="&#x137;" horiz-adv-x="574" d="M209 714V331L388 517H556L361 327L578 0H406L264 231L209 178V0H67V714H209ZM380 -50V-122Q380 -159 368 -178T330 -207T251 -217H245V-180Q275 -177 287 -167T302 -143H235V-50H380Z" />
+<glyph unicode="&#x138;" horiz-adv-x="565" d="M196 517V313L375 517H543L349 315L566 0H394L254 216L196 160V0H54V517H196Z" />
+<glyph unicode="&#x139;" horiz-adv-x="593" d="M226 714V132H574V0H69V714H226ZM348 921L194 779H95L191 921H348Z" />
+<glyph unicode="&#x13A;" horiz-adv-x="258" d="M200 714V0H58V714H200ZM313 921L159 779H60L156 921H313Z" />
+<glyph unicode="&#x13B;" horiz-adv-x="593" d="M226 714V132H574V0H69V714H226ZM391 -50V-122Q391 -159 379 -178T341 -207T262 -217H256V-180Q286 -177 298 -167T313 -143H246V-50H391Z" />
+<glyph unicode="&#x13C;" horiz-adv-x="258" d="M200 714V0H58V714H200ZM201 -50V-122Q201 -159 189 -178T151 -207T72 -217H66V-180Q96 -177 108 -167T123 -143H56V-50H201Z" />
+<glyph unicode="&#x13D;" horiz-adv-x="593" d="M226 714V132H574V0H69V714H226ZM483 714L402 572H304L335 714H483Z" />
+<glyph unicode="&#x13E;" horiz-adv-x="258" d="M200 714V0H58V714H200ZM426 714L345 572H247L278 714H426Z" />
+<glyph unicode="&#x13F;" horiz-adv-x="593" d="M226 714V132H574V0H69V714H226ZM475 450V333H340V450H475Z" />
+<glyph unicode="&#x140;" horiz-adv-x="410" d="M200 714V0H58V714H200ZM396 450V333H261V450H396Z" />
+<glyph unicode="&#x141;" horiz-adv-x="593" d="M226 714V436L437 584V472L226 324V132H574V0H69V214L-11 158V270L69 326V714H226Z" />
+<glyph unicode="&#x142;" horiz-adv-x="258" d="M200 714V500L267 553V451L200 398V0H58V286L-9 233V335L58 388V714H200Z" />
+<glyph unicode="&#x143;" horiz-adv-x="741" d="M225 714L523 235H525V714H672V0H515L218 478H216V0H69V714H225ZM560 921L406 779H307L403 921H560Z" />
+<glyph unicode="&#x144;" horiz-adv-x="593" d="M351 531Q450 531 494 481T539 322V0H397V293Q397 357 377 388T306 419Q248 419 222 384T196 269V0H54V517H189V445H192Q245 531 351 531ZM486 731L332 589H233L329 731H486Z" />
+<glyph unicode="&#x145;" horiz-adv-x="741" d="M225 714L523 235H525V714H672V0H515L218 478H216V0H69V714H225ZM445 -50V-122Q445 -159 433 -178T395 -207T316 -217H310V-180Q340 -177 352 -167T367 -143H300V-50H445Z" />
+<glyph unicode="&#x146;" horiz-adv-x="593" d="M351 531Q450 531 494 481T539 322V0H397V293Q397 357 377 388T306 419Q248 419 222 384T196 269V0H54V517H189V445H192Q245 531 351 531ZM366 -50V-122Q366 -159 354 -178T316 -207T237 -217H231V-180Q261 -177 273 -167T288 -143H221V-50H366Z" />
+<glyph unicode="&#x147;" horiz-adv-x="741" d="M225 714L523 235H525V714H672V0H515L218 478H216V0H69V714H225ZM306 921L368 840L432 921H542L431 779H301L191 921H306Z" />
+<glyph unicode="&#x148;" horiz-adv-x="593" d="M351 531Q450 531 494 481T539 322V0H397V293Q397 357 377 388T306 419Q248 419 222 384T196 269V0H54V517H189V445H192Q245 531 351 531ZM236 731L298 650L362 731H472L361 589H231L121 731H236Z" />
+<glyph unicode="&#x149;" horiz-adv-x="737" d="M495 531Q594 531 638 481T683 322V0H541V293Q541 357 521 388T450 419Q392 419 366 384T340 269V0H198V517H333V445H336Q389 531 495 531ZM162 714V555Q162 492 122 447T20 393V459Q86 481 86 558V560H20V714H162Z" />
+<glyph unicode="&#x14A;" horiz-adv-x="741" d="M225 714L523 243H525V714H672V-2Q672 -96 626 -139T474 -182Q448 -182 397 -176V-55Q433 -61 455 -61Q525 -61 527 0L218 478H216V0H69V714H225Z" />
+<glyph unicode="&#x14B;" horiz-adv-x="593" d="M351 531Q417 531 457 510T518 444T539 322V-8Q539 -101 494 -141T347 -182Q318 -182 289 -178V-61Q312 -65 333 -65Q364 -65 380 -48T397 -2V295Q397 358 376 388T306 419Q246 419 221 383T196 271V0H54V517H189V445H192Q223 492 264 511T351 531Z" />
+<glyph unicode="&#x14C;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM566 884V809H213V884H566Z" />
+<glyph unicode="&#x14D;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM483 694V619H130V694H483Z" />
+<glyph unicode="&#x14E;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM288 921Q294 888 321 871T387 854Q482 855 497 921H560Q541 780 382 779Q236 781 223 921H288Z" />
+<glyph unicode="&#x14F;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM205 731Q210 700 237 682T304 664Q398 664 414 731H477Q457 589 299 589Q227 589 187 626T140 731H205Z" />
+<glyph unicode="&#x150;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM472 921L323 779H224L315 921H472ZM679 921L530 779H431L522 921H679Z" />
+<glyph unicode="&#x151;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM389 731L240 589H141L232 731H389ZM596 731L447 589H348L439 731H596Z" />
+<glyph unicode="&#x152;" horiz-adv-x="1093" d="M373 731Q490 731 542 663H544V714H1044V582H690V429H1014V307H690V132H1051V0H544V54H542Q510 19 465 1T370 -17Q222 -17 130 88T38 353Q38 456 80 543T199 681T373 731ZM195 355Q195 245 245 180T381 115Q452 115 495 159T538 277V449Q538 516 494 557T383 599Q293 599 244 532T195 355Z" />
+<glyph unicode="&#x153;" horiz-adv-x="926" d="M292 531Q413 531 470 449Q494 485 543 508T644 531Q763 531 829 451T897 224H528Q528 163 560 128T651 93Q727 93 755 164H893Q867 78 803 32T651 -14Q589 -14 541 8T464 74Q438 30 389 8T281 -14Q211 -14 156 19T70 116T38 261Q38 341 73 405T166 500T292 531ZM180 256Q180 185 208 139T290 93Q346 93 375 135T404 260Q404 340 376 382T292 424Q240 424 210 380T180 256ZM755 314Q753 366 725 395T640 424Q591 424 561 395T528 314H755Z" />
+<glyph unicode="&#x154;" horiz-adv-x="722" d="M454 714Q544 714 603 659T663 517Q663 383 550 338V336Q588 325 609 300T642 240T656 131Q660 33 684 0H527Q514 33 507 124Q499 220 472 249T384 279H226V0H69V714H454ZM399 391Q449 391 477 413T506 493Q506 547 478 569T398 592H226V391H399ZM532 921L378 779H279L375 921H532Z" />
+<glyph unicode="&#x155;" horiz-adv-x="389" d="M356 531Q374 531 387 526V394Q364 399 336 399Q196 399 196 233V0H54V517H189V421H191Q212 471 257 501T356 531ZM410 731L256 589H157L253 731H410Z" />
+<glyph unicode="&#x156;" horiz-adv-x="722" d="M454 714Q544 714 603 659T663 517Q663 383 550 338V336Q588 325 609 300T642 240T656 131Q660 33 684 0H527Q514 33 507 124Q499 220 472 249T384 279H226V0H69V714H454ZM399 391Q449 391 477 413T506 493Q506 547 478 569T398 592H226V391H399ZM440 -50V-122Q440 -159 428 -178T390 -207T311 -217H305V-180Q335 -177 347 -167T362 -143H295V-50H440Z" />
+<glyph unicode="&#x157;" horiz-adv-x="389" d="M356 531Q374 531 387 526V394Q364 399 336 399Q196 399 196 233V0H54V517H189V421H191Q212 471 257 501T356 531ZM199 -50V-122Q199 -159 187 -178T149 -207T70 -217H64V-180Q94 -177 106 -167T121 -143H54V-50H199Z" />
+<glyph unicode="&#x158;" horiz-adv-x="722" d="M454 714Q544 714 603 659T663 517Q663 383 550 338V336Q588 325 609 300T642 240T656 131Q660 33 684 0H527Q514 33 507 124Q499 220 472 249T384 279H226V0H69V714H454ZM399 391Q449 391 477 413T506 493Q506 547 478 569T398 592H226V391H399ZM278 921L340 840L404 921H514L403 779H273L163 921H278Z" />
+<glyph unicode="&#x159;" horiz-adv-x="389" d="M356 531Q374 531 387 526V394Q364 399 336 399Q196 399 196 233V0H54V517H189V421H191Q212 471 257 501T356 531ZM160 731L222 650L286 731H396L285 589H155L45 731H160Z" />
+<glyph unicode="&#x15A;" horiz-adv-x="649" d="M315 731Q446 731 523 671T601 501H449Q446 555 413 582T309 609Q260 609 230 588T200 528Q200 497 218 483T271 458T390 426Q479 404 527 378T600 312T625 212Q625 144 589 91T484 11T328 -17Q195 -17 110 49T24 232V237H176Q176 174 219 140T333 105Q396 105 434 127T473 194Q473 223 452 243T396 275T278 307Q182 331 138 358T71 423T48 516Q48 583 86 633T187 707T315 731ZM522 921L368 779H269L365 921H522Z" />
+<glyph unicode="&#x15B;" horiz-adv-x="537" d="M266 531Q370 531 428 489T494 366H359Q356 403 332 419T262 436Q222 436 203 424T183 388Q183 370 196 358T235 337T294 322Q391 303 431 283T489 235T508 166Q508 79 445 33T272 -14Q158 -14 95 35T29 168H164Q164 128 195 105T273 81Q313 81 339 98T366 147Q366 167 350 180T303 203T210 226Q160 236 121 253T62 297T41 365Q41 416 65 454T140 511T266 531ZM461 731L307 589H208L304 731H461Z" />
+<glyph unicode="&#x15C;" horiz-adv-x="649" d="M315 731Q446 731 523 671T601 501H449Q446 555 413 582T309 609Q260 609 230 588T200 528Q200 497 218 483T271 458T390 426Q479 404 527 378T600 312T625 212Q625 144 589 91T484 11T328 -17Q195 -17 110 49T24 232V237H176Q176 174 219 140T333 105Q396 105 434 127T473 194Q473 223 452 243T396 275T278 307Q182 331 138 358T71 423T48 516Q48 583 86 633T187 707T315 731ZM394 921L504 779H389L327 860L263 779H153L264 921H394Z" />
+<glyph unicode="&#x15D;" horiz-adv-x="537" d="M266 531Q370 531 428 489T494 366H359Q356 403 332 419T262 436Q222 436 203 424T183 388Q183 370 196 358T235 337T294 322Q391 303 431 283T489 235T508 166Q508 79 445 33T272 -14Q158 -14 95 35T29 168H164Q164 128 195 105T273 81Q313 81 339 98T366 147Q366 167 350 180T303 203T210 226Q160 236 121 253T62 297T41 365Q41 416 65 454T140 511T266 531ZM337 731L447 589H332L270 670L206 589H96L207 731H337Z" />
+<glyph unicode="&#x15E;" horiz-adv-x="649" d="M315 731Q448 731 524 670T601 501H449Q443 609 309 609Q260 609 230 588T200 528Q200 493 229 476T328 442L434 415Q625 367 625 212Q625 108 546 47T333 -17L307 -52L309 -54Q325 -47 349 -47Q387 -47 411 -66T435 -124Q435 -169 402 -193T309 -217Q254 -217 194 -195L215 -147Q253 -165 293 -165Q339 -165 339 -131Q339 -116 328 -107T296 -98Q279 -98 259 -106L238 -82L286 -15Q161 -2 93 63T24 230V237H176Q176 174 217 140T333 105Q398 105 435 128T473 194Q473 232 439 255T279 307Q153 336 101 386T48 515Q48 612 124 671T315 731Z" />
+<glyph unicode="&#x15F;" horiz-adv-x="537" d="M266 531Q369 531 428 490T494 366H359Q353 436 262 436Q183 436 183 388Q183 359 215 345T308 319Q408 297 442 277T492 230T508 166Q508 81 449 35T279 -14L251 -52L253 -54Q269 -47 293 -47Q332 -47 355 -67T379 -124Q379 -168 347 -192T253 -217Q196 -217 138 -195L159 -147Q197 -165 238 -165Q283 -165 283 -131Q283 -114 270 -106T241 -98Q223 -98 203 -106L182 -82L232 -12Q35 6 29 168H164Q164 127 195 104T273 81Q309 81 337 97T366 146Q366 176 326 193T210 226Q119 245 80 277T41 365Q41 448 99 489T266 531Z" />
+<glyph unicode="&#x160;" horiz-adv-x="649" d="M315 731Q446 731 523 671T601 501H449Q446 555 413 582T309 609Q260 609 230 588T200 528Q200 497 218 483T271 458T390 426Q479 404 527 378T600 312T625 212Q625 144 589 91T484 11T328 -17Q195 -17 110 49T24 232V237H176Q176 174 219 140T333 105Q396 105 434 127T473 194Q473 223 452 243T396 275T278 307Q182 331 138 358T71 423T48 516Q48 583 86 633T187 707T315 731ZM268 921L330 840L394 921H504L393 779H263L153 921H268Z" />
+<glyph unicode="&#x161;" horiz-adv-x="537" d="M266 531Q370 531 428 489T494 366H359Q356 403 332 419T262 436Q222 436 203 424T183 388Q183 370 196 358T235 337T294 322Q391 303 431 283T489 235T508 166Q508 79 445 33T272 -14Q158 -14 95 35T29 168H164Q164 128 195 105T273 81Q313 81 339 98T366 147Q366 167 350 180T303 203T210 226Q160 236 121 253T62 297T41 365Q41 416 65 454T140 511T266 531ZM211 731L273 650L337 731H447L336 589H206L96 731H211Z" />
+<glyph unicode="&#x162;" horiz-adv-x="611" d="M598 714V582H384V0H227V582H13V714H598ZM378 -50V-122Q378 -159 366 -178T328 -207T249 -217H243V-180Q273 -177 285 -167T300 -143H233V-50H378Z" />
+<glyph unicode="&#x163;" horiz-adv-x="352" d="M234 672V517H338V422H234V166Q234 130 246 118T294 106Q320 106 338 110V-1Q308 -6 254 -6Q172 -6 132 22T92 119V422H6V517H92V672H234ZM286 -50V-122Q286 -159 274 -178T236 -207T157 -217H151V-180Q181 -177 193 -167T208 -143H141V-50H286Z" />
+<glyph unicode="&#x164;" horiz-adv-x="611" d="M598 714V582H384V0H227V582H13V714H598ZM245 921L307 840L371 921H481L370 779H240L130 921H245Z" />
+<glyph unicode="&#x165;" horiz-adv-x="352" d="M234 672V517H338V422H234V166Q234 130 246 118T294 106Q320 106 338 110V-1Q308 -6 254 -6Q172 -6 132 22T92 119V422H6V517H92V672H234ZM466 714L385 572H287L318 714H466Z" />
+<glyph unicode="&#x166;" horiz-adv-x="611" d="M598 714V582H384V462H531V366H384V0H227V366H80V462H227V582H13V714H598Z" />
+<glyph unicode="&#x167;" horiz-adv-x="352" d="M234 672V517H338V422H234V341H326V265H234V167Q234 128 246 117T293 106Q320 106 338 110V-1Q308 -6 256 -6Q166 -6 129 24T92 119V265H14V341H92V422H6V517H92V672H234Z" />
+<glyph unicode="&#x168;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM304 911Q335 911 384 892Q425 876 447 876Q464 876 474 883T490 911H554Q542 851 515 824T442 797Q407 797 365 813Q319 831 295 831Q261 831 250 789H187Q194 843 226 877T304 911Z" />
+<glyph unicode="&#x169;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM232 721Q263 721 307 704Q351 686 375 686Q393 686 403 694T418 721H482Q473 669 446 638T370 607Q337 607 293 623Q248 641 223 641Q190 641 178 599H115Q122 652 154 686T232 721Z" />
+<glyph unicode="&#x16A;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM547 884V809H194V884H547Z" />
+<glyph unicode="&#x16B;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM476 694V619H123V694H476Z" />
+<glyph unicode="&#x16C;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM269 921Q275 888 302 871T368 854Q463 855 478 921H541Q522 780 363 779Q217 781 204 921H269Z" />
+<glyph unicode="&#x16D;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM197 731Q202 700 229 682T296 664Q390 664 406 731H469Q449 589 291 589Q219 589 179 626T132 731H197Z" />
+<glyph unicode="&#x16E;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM370 973Q402 973 429 958T472 916T487 859Q487 829 472 803T430 761T370 745Q339 745 311 760T268 802T253 859Q253 889 268 916T311 958T370 973ZM309 859Q309 831 326 814T370 796Q397 796 414 813T431 859Q431 887 415 904T369 922Q344 922 327 905T309 859Z" />
+<glyph unicode="&#x16F;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM299 804Q335 804 362 789T405 746T421 684Q421 650 405 622T360 579T298 564Q266 564 238 578T193 621T176 684Q176 719 194 748T240 790T299 804ZM235 684Q235 655 252 636T298 617Q327 617 344 635T362 684Q362 713 346 732T298 751Q270 751 253 732T235 684Z" />
+<glyph unicode="&#x170;" horiz-adv-x="741" d="M223 714V267Q223 188 258 152T370 115Q452 115 485 151T518 267V714H675V267Q675 133 599 58T370 -17Q215 -17 141 58T66 267V714H223ZM453 921L304 779H205L296 921H453ZM660 921L511 779H412L503 921H660Z" />
+<glyph unicode="&#x171;" horiz-adv-x="593" d="M196 517V224Q196 164 215 131T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q348 -14 242 -14Q141 -14 98 37T54 196V517H196ZM381 731L232 589H133L224 731H381ZM588 731L439 589H340L431 731H588Z" />
+<glyph unicode="&#x172;" horiz-adv-x="741" d="M223 714V266Q223 188 258 152T370 115Q452 115 485 152T518 267V714H675V266Q675 142 608 68T408 -16Q380 -47 365 -69T350 -119Q350 -136 360 -146T387 -157Q416 -157 442 -125L487 -151Q464 -186 435 -201T363 -217Q313 -217 284 -195T254 -134Q254 -74 336 -16Q198 -8 132 67T66 268V714H223Z" />
+<glyph unicode="&#x173;" horiz-adv-x="593" d="M196 517V225Q196 161 216 130T287 98Q346 98 371 134T397 244V517H539V0H474Q439 -35 424 -62T408 -118Q408 -137 419 -147T446 -157Q473 -157 501 -125L546 -151Q523 -185 495 -201T422 -217Q373 -217 343 -194T313 -133Q313 -99 334 -69T404 0V72H401Q375 28 333 7T242 -14Q146 -14 100 35T54 195V517H196Z" />
+<glyph unicode="&#x174;" horiz-adv-x="944" d="M160 714L273 228H275L399 714H546L668 222H670L787 714H941L749 0H593L472 486H470L351 0H192L3 714H160ZM540 921L650 779H535L473 860L409 779H299L410 921H540Z" />
+<glyph unicode="&#x175;" horiz-adv-x="814" d="M156 517L251 166H253L339 517H477L565 167H567L662 517H808L645 0H499L407 347H405L317 0H170L6 517H156ZM475 731L585 589H470L408 670L344 589H234L345 731H475Z" />
+<glyph unicode="&#x176;" horiz-adv-x="667" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168ZM403 921L513 779H398L336 860L272 779H162L273 921H403Z" />
+<glyph unicode="&#x177;" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146ZM332 731L442 589H327L265 670L201 589H91L202 731H332Z" />
+<glyph unicode="&#x178;" horiz-adv-x="667" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168ZM301 905V788H166V905H301ZM507 905V788H372V905H507Z" />
+<glyph unicode="&#x179;" horiz-adv-x="648" d="M615 714V590L232 132H625V0H23V124L406 582H53V714H615ZM527 921L373 779H274L370 921H527Z" />
+<glyph unicode="&#x17A;" horiz-adv-x="519" d="M478 517V410L209 107H497V0H22V107L291 410H42V517H478ZM451 731L297 589H198L294 731H451Z" />
+<glyph unicode="&#x17B;" horiz-adv-x="648" d="M615 714V590L232 132H625V0H23V124L406 582H53V714H615ZM399 905V788H264V905H399Z" />
+<glyph unicode="&#x17C;" horiz-adv-x="519" d="M478 517V410L209 107H497V0H22V107L291 410H42V517H478ZM327 715V598H192V715H327Z" />
+<glyph unicode="&#x17D;" horiz-adv-x="648" d="M615 714V590L232 132H625V0H23V124L406 582H53V714H615ZM273 921L335 840L399 921H509L398 779H268L158 921H273Z" />
+<glyph unicode="&#x17E;" horiz-adv-x="519" d="M478 517V410L209 107H497V0H22V107L291 410H42V517H478ZM201 731L263 650L327 731H437L326 589H196L86 731H201Z" />
+<glyph unicode="&#x192;" horiz-adv-x="556" d="M436 731Q479 731 511 724L493 617Q478 624 455 624Q417 624 401 611T377 562L352 432H450L434 337H334L278 27Q257 -90 211 -130T67 -170Q16 -170 -5 -167L14 -60Q29 -63 59 -63Q87 -63 103 -49T126 8L189 337H97L115 432H206L230 559Q248 654 293 692T436 731Z" />
+<glyph unicode="&#x1FA;" horiz-adv-x="685" d="M507 973L382 858H283L360 973H507ZM344 837Q391 837 419 809T447 739Q447 709 431 685L692 0H529L475 159H208L152 0H-7L257 683Q240 706 240 739Q240 783 269 810T344 837ZM293 739Q293 716 307 701T344 686Q367 686 380 701T394 739Q394 762 380 777T344 792Q321 792 307 777T293 739ZM342 548L249 276H434L344 548H342Z" />
+<glyph unicode="&#x1FB;" horiz-adv-x="574" d="M463 921L335 802H237L316 921H463ZM295 774Q343 774 373 745T403 669Q403 625 373 595T295 564Q248 564 218 593T187 669Q187 715 218 744T295 774ZM239 669Q239 643 254 627T295 611Q320 611 335 627T351 669Q351 692 337 709T294 727Q271 727 255 712T239 669ZM292 531Q518 531 518 385V110Q518 29 536 0H392Q384 24 382 50Q321 -14 208 -14Q128 -14 80 26T32 141Q32 212 76 250T243 303Q311 310 343 321T376 367Q376 403 356 419T285 436Q240 436 217 418T190 358H48Q54 440 116 485T292 531ZM174 147Q174 81 261 81Q376 81 376 198V253Q364 242 343 237T277 226Q224 219 199 202T174 147Z" />
+<glyph unicode="&#x1FC;" horiz-adv-x="981" d="M936 714V582H604V429H916V307H604V132H944V0H452V159H228L156 0H-11L330 714H936ZM418 582L280 276H452V582H418ZM777 921L623 779H524L620 921H777Z" />
+<glyph unicode="&#x1FD;" horiz-adv-x="907" d="M295 531Q352 531 398 513T467 461Q499 497 538 514T640 531Q752 531 814 450T878 224H509V218Q509 162 544 122T632 81Q720 81 735 162H873Q850 81 787 34T635 -14Q503 -14 442 74Q409 30 353 8T231 -14Q141 -14 90 26T38 140Q38 193 62 226T123 275T242 303Q322 313 353 325T385 370Q385 436 293 436Q199 436 194 356H52Q54 437 117 484T295 531ZM736 314Q736 367 706 401T624 436Q577 436 544 403T509 314H736ZM180 148Q180 81 268 81Q316 81 350 110T385 187V252L373 245Q356 234 283 224Q232 218 206 200T180 148ZM660 731L506 589H407L503 731H660Z" />
+<glyph unicode="&#x1FE;" horiz-adv-x="778" d="M744 699L660 606Q740 506 740 354Q740 189 642 86T389 -17Q258 -17 166 59L83 -33L34 10L120 105Q38 205 38 354Q38 520 134 625T389 731Q523 731 614 654L694 743L744 699ZM195 354Q195 275 223 219L519 548Q468 599 388 599Q298 599 247 534T195 354ZM261 164Q310 115 389 115Q478 115 530 179T583 354Q583 432 556 490L261 164ZM585 921L431 779H332L428 921H585Z" />
+<glyph unicode="&#x1FF;" horiz-adv-x="611" d="M521 544L558 512L504 451Q573 377 573 258Q573 134 500 60T305 -14Q208 -14 140 36L81 -31L44 1L104 69Q38 141 38 258Q38 383 111 457T305 531Q400 531 468 483L521 544ZM180 258Q180 206 195 172L388 392Q358 424 304 424Q244 424 212 381T180 258ZM220 127Q251 93 305 93Q368 93 399 137T431 258Q431 308 415 349L220 127ZM497 731L343 589H244L340 731H497Z" />
+<glyph unicode="&#x218;" horiz-adv-x="649" d="M315 731Q446 731 523 671T601 501H449Q446 555 413 582T309 609Q260 609 230 588T200 528Q200 497 218 483T271 458T390 426Q479 404 527 378T600 312T625 212Q625 144 589 91T484 11T328 -17Q195 -17 110 49T24 232V237H176Q176 174 219 140T333 105Q396 105 434 127T473 194Q473 223 452 243T396 275T278 307Q182 331 138 358T71 423T48 516Q48 583 86 633T187 707T315 731ZM391 -50V-122Q391 -159 379 -178T341 -207T262 -217H256V-180Q286 -177 298 -167T313 -143H246V-50H391Z" />
+<glyph unicode="&#x219;" horiz-adv-x="537" d="M266 531Q370 531 428 489T494 366H359Q356 403 332 419T262 436Q222 436 203 424T183 388Q183 370 196 358T235 337T294 322Q391 303 431 283T489 235T508 166Q508 79 445 33T272 -14Q158 -14 95 35T29 168H164Q164 128 195 105T273 81Q313 81 339 98T366 147Q366 167 350 180T303 203T210 226Q160 236 121 253T62 297T41 365Q41 416 65 454T140 511T266 531ZM337 -50V-122Q337 -159 325 -178T287 -207T208 -217H202V-180Q232 -177 244 -167T259 -143H192V-50H337Z" />
+<glyph unicode="&#x21A;" horiz-adv-x="611" d="M598 714V582H384V0H227V582H13V714H598ZM378 -50V-122Q378 -159 366 -178T328 -207T249 -217H243V-180Q273 -177 285 -167T300 -143H233V-50H378Z" />
+<glyph unicode="&#x21B;" horiz-adv-x="352" d="M234 672V517H338V422H234V166Q234 130 246 118T294 106Q320 106 338 110V-1Q308 -6 254 -6Q172 -6 132 22T92 119V422H6V517H92V672H234ZM286 -50V-122Q286 -159 274 -178T236 -207T157 -217H151V-180Q181 -177 193 -167T208 -143H141V-50H286Z" />
+<glyph unicode="&#x237;" horiz-adv-x="278" d="M209 517V-27Q209 -84 193 -116T139 -165T28 -182Q1 -182 -19 -178V-61Q-8 -65 12 -65Q43 -65 55 -54T67 -18V517H209Z" />
+<glyph unicode="&#x2C6;" horiz-adv-x="259" d="M195 731L305 589H190L128 670L64 589H-46L65 731H195Z" />
+<glyph unicode="&#x2C7;" horiz-adv-x="259" d="M69 731L131 650L195 731H305L194 589H64L-46 731H69Z" />
+<glyph unicode="&#x2C9;" horiz-adv-x="259" d="M306 694V619H-47V694H306Z" />
+<glyph unicode="&#x2D8;" horiz-adv-x="259" d="M26 731Q31 700 58 682T125 664Q219 664 235 731H298Q278 589 120 589Q48 589 8 626T-39 731H26Z" />
+<glyph unicode="&#x2D9;" horiz-adv-x="259" d="M197 715V598H62V715H197Z" />
+<glyph unicode="&#x2DA;" horiz-adv-x="259" d="M130 804Q166 804 193 789T236 746T252 684Q252 650 236 622T191 579T129 564Q97 564 69 578T24 621T7 684Q7 719 25 748T71 790T130 804ZM66 684Q66 655 83 636T129 617Q158 617 175 635T193 684Q193 713 177 732T129 751Q101 751 84 732T66 684Z" />
+<glyph unicode="&#x2DB;" horiz-adv-x="259" d="M180 0Q150 -32 129 -61T107 -118Q107 -138 118 -147T144 -157Q173 -157 199 -125L244 -151Q223 -184 194 -200T120 -217Q70 -217 41 -194T11 -134Q11 -102 35 -70T116 0H180Z" />
+<glyph unicode="&#x2DC;" horiz-adv-x="259" d="M63 721Q94 721 138 704Q182 686 206 686Q224 686 234 694T249 721H313Q304 669 277 638T201 607Q168 607 124 623Q79 641 54 641Q21 641 9 599H-54Q-47 652 -15 686T63 721Z" />
+<glyph unicode="&#x2DD;" horiz-adv-x="259" d="M192 731L43 589H-56L35 731H192ZM399 731L250 589H151L242 731H399Z" />
+<glyph unicode="&#x374;" horiz-adv-x="278" d="M249 732L155 561H53L96 732H249Z" />
+<glyph unicode="&#x375;" horiz-adv-x="278" d="M217 -32L179 -203H26L115 -32H217Z" />
+<glyph unicode="&#x37E;" horiz-adv-x="278" d="M218 508V354H61V508H218ZM218 154V-1Q218 -66 174 -111T62 -166V-94Q92 -88 112 -63T133 -7V0H61V154H218Z" />
+<glyph unicode="&#x384;" horiz-adv-x="241" d="M255 731L181 589H63L93 731H255Z" />
+<glyph unicode="&#x385;" horiz-adv-x="512" d="M353 731L286 589H175L201 731H353ZM153 715V598H28V715H153ZM484 715V598H359V715H484Z" />
+<glyph unicode="&#x386;" horiz-adv-x="722" d="M462 714L729 0H566L512 159H245L189 0H30L301 714H462ZM379 538L286 276H471L381 538H379ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x387;" horiz-adv-x="278" d="M218 508V354H61V508H218Z" />
+<glyph unicode="&#x388;" horiz-adv-x="844" d="M799 714V582H422V429H768V307H422V132H807V0H265V714H799ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x389;" horiz-adv-x="937" d="M422 714V440H711V714H868V0H711V308H422V0H265V714H422ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x38A;" horiz-adv-x="491" d="M422 714V0H265V714H422ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x38C;" horiz-adv-x="928" d="M539 731Q697 731 793 626T890 354Q890 191 793 87T539 -17Q381 -17 285 87T188 354Q188 520 285 625T539 731ZM345 354Q345 246 396 181T539 115Q629 115 681 179T733 354Q733 469 682 534T538 599Q448 599 397 534T345 354ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x38E;" horiz-adv-x="924" d="M425 714L592 432L758 714H933L668 274V0H511V278L248 714H425ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x38F;" horiz-adv-x="929" d="M542 731Q697 731 794 638T891 393Q891 312 856 245T751 133V128H892V0H587V118Q664 171 699 231T734 384Q734 489 682 544T542 599Q453 599 402 543T350 384Q350 296 384 236T496 118V0H190V128H327V133Q263 173 228 239T193 393Q193 540 293 635T542 731ZM206 714L132 572H14L44 714H206Z" />
+<glyph unicode="&#x390;" horiz-adv-x="280" d="M203 517V137Q203 93 236 93Q253 93 268 98V7Q224 -14 176 -14Q61 -14 61 99V517H203ZM252 731L185 589H74L100 731H252ZM52 715V598H-73V715H52ZM383 715V598H258V715H383Z" />
+<glyph unicode="&#x391;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342Z" />
+<glyph unicode="&#x392;" horiz-adv-x="704" d="M406 714Q633 714 633 538Q633 437 536 388Q602 369 634 322T667 207Q667 111 598 56T415 0H69V714H406ZM386 425Q481 425 481 510Q481 592 375 592H226V425H386ZM395 122Q510 122 510 216Q510 318 398 318H226V122H395Z" />
+<glyph unicode="&#x393;" horiz-adv-x="571" d="M558 714V582H226V0H69V714H558Z" />
+<glyph unicode="&#x394;" horiz-adv-x="681" d="M423 714L688 0H-7L262 714H423ZM340 538L198 132H480L342 538H340Z" />
+<glyph unicode="&#x395;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603Z" />
+<glyph unicode="&#x396;" horiz-adv-x="648" d="M615 714V590L232 132H625V0H23V124L406 582H53V714H615Z" />
+<glyph unicode="&#x397;" horiz-adv-x="741" d="M226 714V440H515V714H672V0H515V308H226V0H69V714H226Z" />
+<glyph unicode="&#x398;" horiz-adv-x="778" d="M389 731Q545 731 642 627T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 522 135 626T389 731ZM195 354Q195 244 247 180T389 115Q480 115 531 180T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354ZM506 426V304H275V426H506Z" />
+<glyph unicode="&#x399;" horiz-adv-x="295" d="M226 714V0H69V714H226Z" />
+<glyph unicode="&#x39A;" horiz-adv-x="722" d="M226 714V418L505 714H701L422 432L728 0H531L316 321L226 230V0H69V714H226Z" />
+<glyph unicode="&#x39B;" horiz-adv-x="665" d="M415 714L672 0H509L334 538H332L152 0H-7L254 714H415Z" />
+<glyph unicode="&#x39C;" horiz-adv-x="907" d="M290 714L457 223H459L617 714H838V0H691V506H689L514 0H393L218 501H216V0H69V714H290Z" />
+<glyph unicode="&#x39D;" horiz-adv-x="741" d="M225 714L523 235H525V714H672V0H515L218 478H216V0H69V714H225Z" />
+<glyph unicode="&#x39E;" horiz-adv-x="623" d="M573 714V582H50V714H573ZM524 438V306H99V438H524ZM582 132V0H41V132H582Z" />
+<glyph unicode="&#x39F;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354Z" />
+<glyph unicode="&#x3A0;" horiz-adv-x="753" d="M684 714V0H527V582H226V0H69V714H684Z" />
+<glyph unicode="&#x3A1;" horiz-adv-x="667" d="M392 714Q506 714 572 652T638 485Q638 379 572 318T393 256H226V0H69V714H392ZM351 378Q419 378 452 403T486 485Q486 540 454 566T352 592H226V378H351Z" />
+<glyph unicode="&#x3A3;" horiz-adv-x="648" d="M599 714V583H252L456 374V372L234 132H615V0H37V130L262 370L49 584V714H599Z" />
+<glyph unicode="&#x3A4;" horiz-adv-x="611" d="M598 714V582H384V0H227V582H13V714H598Z" />
+<glyph unicode="&#x3A5;" horiz-adv-x="667" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168Z" />
+<glyph unicode="&#x3A6;" horiz-adv-x="815" d="M487 749V679Q630 672 704 592T779 375Q779 238 703 160T487 75V0H330V75Q186 81 112 157T37 371Q37 512 112 592T330 679V749H487ZM193 371Q193 279 225 236T330 191V563Q193 559 193 371ZM487 192Q560 194 591 239T622 375Q622 467 591 514T487 563V192Z" />
+<glyph unicode="&#x3A7;" horiz-adv-x="667" d="M196 714L336 486L481 714H653L424 373L673 0H486L330 247L171 0H-6L244 374L14 714H196Z" />
+<glyph unicode="&#x3A8;" horiz-adv-x="841" d="M209 714V437Q209 350 239 311T342 271V714H499V272Q571 272 601 310T632 437V714H790V434Q790 172 499 154V0H342V154Q186 161 119 231T51 436V714H209Z" />
+<glyph unicode="&#x3A9;" horiz-adv-x="774" d="M387 731Q542 731 639 638T736 393Q736 312 701 245T596 133V128H737V0H432V118Q509 171 544 231T579 384Q579 489 527 544T387 599Q298 599 247 543T195 384Q195 296 229 236T341 118V0H35V128H172V133Q108 173 73 239T38 393Q38 540 138 635T387 731Z" />
+<glyph unicode="&#x3AA;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM111 905V788H-24V905H111ZM317 905V788H182V905H317Z" />
+<glyph unicode="&#x3AB;" horiz-adv-x="657" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168ZM301 905V788H166V905H301ZM507 905V788H372V905H507Z" />
+<glyph unicode="&#x3AC;" horiz-adv-x="618" d="M261 531Q303 531 339 512T399 455H401V517H543V136Q543 93 576 93Q589 93 606 98V7Q565 -14 521 -14Q482 -14 449 5T405 66H403Q359 -14 253 -14Q156 -14 94 64T32 261Q32 378 93 454T261 531ZM174 257Q174 187 207 140T293 93Q347 93 376 138T406 259Q406 332 376 378T295 424Q237 424 206 381T174 257ZM436 731L362 589H244L274 731H436Z" />
+<glyph unicode="&#x3AD;" horiz-adv-x="515" d="M265 531Q461 531 486 364H348Q338 427 262 427Q182 427 182 364Q182 314 245 314H310V224H242Q169 224 169 160Q169 125 194 108T262 90Q310 90 336 108T368 176H505Q490 78 428 32T251 -14Q148 -14 87 29T26 146Q26 234 120 262V266Q45 292 45 372Q45 444 106 487T265 531ZM397 731L323 589H205L235 731H397Z" />
+<glyph unicode="&#x3AE;" horiz-adv-x="593" d="M351 531Q449 531 494 482T539 323V-181H397V294Q397 357 377 388T306 419Q247 419 222 384T196 271V0H54V517H189V445H192Q245 531 351 531ZM438 731L364 589H246L276 731H438Z" />
+<glyph unicode="&#x3AF;" horiz-adv-x="273" d="M196 517V137Q196 93 229 93Q246 93 261 98V7Q217 -14 169 -14Q54 -14 54 99V517H196ZM255 731L181 589H63L93 731H255Z" />
+<glyph unicode="&#x3B0;" horiz-adv-x="568" d="M196 517V192Q196 93 280 93Q336 93 363 136T390 272Q390 332 373 398T326 517H473Q503 464 517 399T532 275Q532 137 464 62T279 -14Q54 -14 54 177V517H196ZM374 731L307 589H196L222 731H374ZM174 715V598H49V715H174ZM505 715V598H380V715H505Z" />
+<glyph unicode="&#x3B1;" horiz-adv-x="618" d="M261 531Q303 531 339 512T399 455H401V517H543V136Q543 93 576 93Q589 93 606 98V7Q565 -14 521 -14Q482 -14 449 5T405 66H403Q359 -14 253 -14Q156 -14 94 64T32 261Q32 378 93 454T261 531ZM174 257Q174 187 207 140T293 93Q347 93 376 138T406 259Q406 332 376 378T295 424Q237 424 206 381T174 257Z" />
+<glyph unicode="&#x3B2;" horiz-adv-x="588" d="M284 722Q394 722 450 676T507 548Q507 500 481 464T407 420V417Q477 405 517 351T557 221Q557 109 501 48T350 -14Q247 -14 197 62H196V-182H54V491Q54 605 109 663T284 722ZM189 273Q189 185 219 139T305 92Q357 92 386 125T415 216Q415 282 394 316T319 351H264V441H290Q366 441 366 533Q366 613 283 613Q229 613 209 579T189 478V273Z" />
+<glyph unicode="&#x3B3;" horiz-adv-x="508" d="M156 517Q186 465 216 361T257 159H262Q325 284 353 517H498Q455 231 306 -3V-182H164V-38Q164 67 115 234T5 517H156Z" />
+<glyph unicode="&#x3B4;" horiz-adv-x="592" d="M314 722Q423 722 491 689V583Q417 618 315 618Q262 618 262 595Q262 576 324 539Q458 459 507 393T556 247Q556 135 488 61T303 -14Q183 -14 110 58T36 249Q36 426 213 479Q116 534 116 604Q116 722 314 722ZM179 249Q179 170 212 132T303 93Q355 93 384 133T414 247Q414 308 385 350T297 426Q179 399 179 249Z" />
+<glyph unicode="&#x3B5;" horiz-adv-x="515" d="M265 531Q461 531 486 364H348Q338 427 262 427Q182 427 182 364Q182 314 245 314H310V224H242Q169 224 169 160Q169 125 194 108T262 90Q310 90 336 108T368 176H505Q490 78 428 32T251 -14Q148 -14 87 29T26 146Q26 234 120 262V266Q45 292 45 372Q45 444 106 487T265 531Z" />
+<glyph unicode="&#x3B6;" horiz-adv-x="474" d="M474 714V621Q326 562 253 477T180 262Q180 184 212 150T308 115H332Q472 115 472 -40Q472 -101 457 -154H333Q345 -113 345 -65Q345 -35 336 -18T301 0H270Q163 0 101 70T38 262Q38 504 279 606H81V714H474Z" />
+<glyph unicode="&#x3B7;" horiz-adv-x="593" d="M351 531Q449 531 494 482T539 323V-181H397V294Q397 357 377 388T306 419Q247 419 222 384T196 271V0H54V517H189V445H192Q245 531 351 531Z" />
+<glyph unicode="&#x3B8;" horiz-adv-x="575" d="M287 722Q416 722 477 632T539 355Q539 167 477 77T287 -14Q161 -14 99 76T36 355Q36 542 98 632T287 722ZM393 416V420Q393 521 368 568T286 615Q232 615 207 570T182 424V416H393ZM287 94Q345 94 367 136T393 309H182Q182 189 205 142T287 94Z" />
+<glyph unicode="&#x3B9;" horiz-adv-x="273" d="M196 517V137Q196 93 229 93Q246 93 261 98V7Q217 -14 169 -14Q54 -14 54 99V517H196Z" />
+<glyph unicode="&#x3BA;" horiz-adv-x="567" d="M196 517V310L380 517H548L350 310L571 0H399L254 212L196 156V0H54V517H196Z" />
+<glyph unicode="&#x3BB;" horiz-adv-x="551" d="M146 722Q213 722 248 693T314 584L485 134Q494 110 500 102T520 93Q536 93 551 98V7Q512 -14 471 -14Q420 -14 396 7T361 62L277 329H274L157 0H5L212 478L171 576Q155 612 105 612Q82 612 56 605V711Q92 722 146 722Z" />
+<glyph unicode="&#x3BC;" horiz-adv-x="593" d="M196 517V225Q196 161 216 130T287 98Q346 98 371 133T397 245V517H539V0H404V72H401Q343 -14 271 -14Q227 -14 196 10V-182H54V517H196Z" />
+<glyph unicode="&#x3BD;" horiz-adv-x="530" d="M154 517L267 153H270Q351 320 374 517H515Q476 264 340 0H182L5 517H154Z" />
+<glyph unicode="&#x3BE;" horiz-adv-x="465" d="M289 722Q373 722 450 689V583Q364 614 305 614Q255 614 227 590T199 520Q199 469 229 447T328 425H417V323H327Q243 323 211 299T178 220Q178 167 207 141T301 115H327Q391 115 428 78T465 -40Q465 -100 450 -154H326Q338 -111 338 -65Q338 -26 326 -13T283 0H258Q152 0 94 53T36 200Q36 346 180 380V382Q120 391 89 427T57 521Q57 614 121 668T289 722Z" />
+<glyph unicode="&#x3BF;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258Z" />
+<glyph unicode="&#x3C0;" horiz-adv-x="692" d="M672 517V410H562V139Q562 116 571 105T603 94Q622 94 636 98V6Q596 -14 543 -14Q478 -14 449 14T420 100V410H261V0H119V410H15V517H672Z" />
+<glyph unicode="&#x3C1;" horiz-adv-x="597" d="M305 531Q423 531 494 455T566 257Q566 135 505 61T340 -14Q299 -14 260 5T198 63H196V-182H54V260Q54 389 120 460T305 531ZM191 259Q191 184 222 139T307 93Q362 93 393 138T424 263Q424 335 393 379T305 424Q255 424 223 381T191 259Z" />
+<glyph unicode="&#x3C2;" horiz-adv-x="547" d="M299 531Q389 531 450 487T530 358H392Q371 424 299 424Q243 424 211 381T178 262Q178 115 303 115H340Q409 115 445 75T481 -41Q481 -105 466 -154H342Q354 -104 354 -66Q354 -31 344 -16T309 0H270Q161 0 99 69T36 262Q36 381 108 456T299 531Z" />
+<glyph unicode="&#x3C3;" horiz-adv-x="598" d="M595 410H466Q504 391 527 348T550 257Q550 137 480 62T295 -14Q178 -14 107 61T36 258Q36 376 112 446T316 517H595V410ZM178 258Q178 174 210 134T295 93Q350 93 379 136T408 258Q408 369 354 410H323Q178 410 178 258Z" />
+<glyph unicode="&#x3C4;" horiz-adv-x="499" d="M495 517V410H311V139Q311 94 358 94Q380 94 398 99V8Q356 -14 296 -14Q233 -14 201 13T169 100V410H5V517H495Z" />
+<glyph unicode="&#x3C5;" horiz-adv-x="572" d="M196 517V192Q196 93 280 93Q336 93 363 136T390 272Q390 332 373 398T326 517H473Q503 464 517 399T532 275Q532 137 464 62T279 -14Q54 -14 54 177V517H196Z" />
+<glyph unicode="&#x3C6;" horiz-adv-x="754" d="M449 660V531Q574 527 647 454T720 263Q720 137 648 64T449 -14V-182H307V-14Q183 -12 110 60T36 261Q36 380 110 454T307 531V660H449ZM449 95Q578 95 578 263Q578 426 449 426V95ZM178 261Q178 93 307 93V424Q247 424 213 383T178 261Z" />
+<glyph unicode="&#x3C7;" horiz-adv-x="537" d="M179 517L270 317L359 517H517L341 198L537 -181H375L265 69L160 -181H0L195 193L17 517H179Z" />
+<glyph unicode="&#x3C8;" horiz-adv-x="726" d="M431 659V92Q488 94 517 141T546 273Q546 401 492 517H638Q660 473 674 409T688 275Q688 145 619 67T431 -14V-182H289V-15Q54 -7 54 242V517H196V246Q196 177 216 137T289 92V659H431Z" />
+<glyph unicode="&#x3C9;" horiz-adv-x="760" d="M272 517Q178 394 178 243Q178 92 255 92Q284 92 295 118T307 199V372H450V198Q450 143 462 118T503 92Q582 92 582 244Q582 392 488 517H637Q685 454 704 387T724 238Q724 126 670 56T516 -14Q412 -14 376 74Q355 29 323 8T237 -14Q139 -14 88 50T36 238Q36 393 123 517H272Z" />
+<glyph unicode="&#x3CA;" horiz-adv-x="280" d="M196 517V137Q196 93 229 93Q246 93 261 98V7Q217 -14 169 -14Q54 -14 54 99V517H196ZM95 715V598H-40V715H95ZM301 715V598H166V715H301Z" />
+<glyph unicode="&#x3CB;" horiz-adv-x="575" d="M196 517V192Q196 93 280 93Q336 93 363 136T390 272Q390 332 373 398T326 517H473Q503 464 517 399T532 275Q532 137 464 62T279 -14Q54 -14 54 177V517H196ZM236 715V598H101V715H236ZM442 715V598H307V715H442Z" />
+<glyph unicode="&#x3CC;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258ZM436 731L362 589H244L274 731H436Z" />
+<glyph unicode="&#x3CD;" horiz-adv-x="575" d="M196 517V192Q196 93 280 93Q336 93 363 136T390 272Q390 332 373 398T326 517H473Q503 464 517 399T532 275Q532 137 464 62T279 -14Q54 -14 54 177V517H196ZM404 731L330 589H212L242 731H404Z" />
+<glyph unicode="&#x3CE;" horiz-adv-x="760" d="M272 517Q178 394 178 243Q178 92 255 92Q284 92 295 118T307 199V372H450V198Q450 143 462 118T503 92Q582 92 582 244Q582 392 488 517H637Q685 454 704 387T724 238Q724 126 670 56T516 -14Q412 -14 376 74Q355 29 323 8T237 -14Q139 -14 88 50T36 238Q36 393 123 517H272ZM511 731L437 589H319L349 731H511Z" />
+<glyph unicode="&#x400;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM294 921L390 779H291L137 921H294Z" />
+<glyph unicode="&#x401;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603ZM296 905V788H161V905H296ZM502 905V788H367V905H502Z" />
+<glyph unicode="&#x402;" horiz-adv-x="784" d="M588 714V582H354V365Q418 443 528 443Q636 443 697 369T758 166Q758 27 684 -58T483 -144H462V-18Q532 -18 566 27T600 166Q600 322 479 322Q418 322 386 279T354 165V0H197V582H13V714H588Z" />
+<glyph unicode="&#x403;" horiz-adv-x="571" d="M558 714V582H226V0H69V714H558ZM465 921L311 779H212L308 921H465Z" />
+<glyph unicode="&#x404;" horiz-adv-x="741" d="M388 731Q516 731 599 666T697 493H542Q529 545 487 573T385 601Q312 601 264 557T199 429H460V307H196Q204 221 254 167T383 113Q526 113 548 247H704Q685 119 600 51T382 -17Q226 -17 132 87T38 357Q38 523 133 627T388 731Z" />
+<glyph unicode="&#x405;" horiz-adv-x="649" d="M315 731Q446 731 523 671T601 501H449Q446 555 413 582T309 609Q260 609 230 588T200 528Q200 497 218 483T271 458T390 426Q479 404 527 378T600 312T625 212Q625 144 589 91T484 11T328 -17Q195 -17 110 49T24 232V237H176Q176 174 219 140T333 105Q396 105 434 127T473 194Q473 223 452 243T396 275T278 307Q182 331 138 358T71 423T48 516Q48 583 86 633T187 707T315 731Z" />
+<glyph unicode="&#x406;" horiz-adv-x="295" d="M226 714V0H69V714H226Z" />
+<glyph unicode="&#x407;" horiz-adv-x="295" d="M226 714V0H69V714H226ZM111 905V788H-24V905H111ZM317 905V788H182V905H317Z" />
+<glyph unicode="&#x408;" horiz-adv-x="556" d="M487 714V224Q487 -17 251 -17Q144 -17 79 41T14 202V266H156V231Q156 168 179 142T247 115Q290 115 310 139T330 226V714H487Z" />
+<glyph unicode="&#x409;" horiz-adv-x="1057" d="M635 714V444H772Q894 444 962 385T1030 222Q1030 118 961 59T762 0H478V581H304L296 245Q289 -17 91 -17Q56 -17 10 -5V118Q50 110 69 110Q107 110 123 142T142 252L154 714H635ZM760 134Q815 134 846 153T878 222Q878 312 758 312H635V134H760Z" />
+<glyph unicode="&#x40A;" horiz-adv-x="1057" d="M226 714V444H478V714H635V444H773Q892 444 961 386T1030 222Q1030 115 960 58T764 0H478V311H226V0H69V714H226ZM760 134Q817 134 847 154T878 222Q878 312 758 312H635V134H760Z" />
+<glyph unicode="&#x40B;" horiz-adv-x="782" d="M588 714V582H354V428Q434 448 505 448Q738 448 738 217V0H581V211Q581 267 556 292T471 318Q428 318 354 302V0H197V582H13V714H588Z" />
+<glyph unicode="&#x40C;" horiz-adv-x="722" d="M226 714V418L505 714H701L422 432L728 0H531L316 321L226 230V0H69V714H226ZM523 921L369 779H270L366 921H523Z" />
+<glyph unicode="&#x40D;" horiz-adv-x="741" d="M226 714V233H229L503 714H672V0H515V482H512L238 0H69V714H226ZM331 921L427 779H328L174 921H331Z" />
+<glyph unicode="&#x40E;" horiz-adv-x="656" d="M177 714L340 334L496 714H663L419 183Q380 97 349 60T276 3T179 -17Q122 -17 83 -4V122Q125 110 168 110Q206 110 228 129T250 181Q250 203 235 233L4 714H177ZM236 921Q242 888 269 871T335 854Q430 855 445 921H508Q489 780 330 779Q184 781 171 921H236Z" />
+<glyph unicode="&#x40F;" horiz-adv-x="741" d="M226 714V132H515V714H672V0H447V-183H294V0H69V714H226Z" />
+<glyph unicode="&#x410;" horiz-adv-x="685" d="M425 714L692 0H529L475 159H208L152 0H-7L264 714H425ZM342 538L249 276H434L344 538H342Z" />
+<glyph unicode="&#x411;" horiz-adv-x="704" d="M599 714V582H226V458H414Q532 458 598 398T665 229Q665 120 597 60T404 0H69V714H599ZM393 128Q513 128 513 229Q513 330 391 330H226V128H393Z" />
+<glyph unicode="&#x412;" horiz-adv-x="704" d="M406 714Q633 714 633 538Q633 437 536 388Q602 369 634 322T667 207Q667 111 598 56T415 0H69V714H406ZM386 425Q481 425 481 510Q481 592 375 592H226V425H386ZM395 122Q510 122 510 216Q510 318 398 318H226V122H395Z" />
+<glyph unicode="&#x413;" horiz-adv-x="571" d="M558 714V582H226V0H69V714H558Z" />
+<glyph unicode="&#x414;" horiz-adv-x="770" d="M685 714V132H762V-183H609V0H161V-183H8V132H62Q123 216 149 328T176 602V714H685ZM528 132V582H331V570Q331 432 310 329T236 132H528Z" />
+<glyph unicode="&#x415;" horiz-adv-x="648" d="M603 714V582H226V429H572V307H226V132H611V0H69V714H603Z" />
+<glyph unicode="&#x416;" horiz-adv-x="1059" d="M209 714L452 425V714H607V421L854 714H1042L784 422L1068 0H874L683 311L607 225V0H452V221L375 309L180 0H-9L276 418L17 714H209Z" />
+<glyph unicode="&#x417;" horiz-adv-x="649" d="M327 731Q439 731 511 677T583 533Q583 421 475 388Q541 371 575 327T610 219Q610 111 529 47T320 -17Q180 -17 102 47T21 234H176Q178 168 218 136T324 103Q384 103 418 134T453 218Q453 319 319 319H265V424H311Q436 424 436 517Q436 559 406 584T324 610Q207 610 197 503H49Q51 613 127 672T327 731Z" />
+<glyph unicode="&#x418;" horiz-adv-x="741" d="M226 714V233H229L503 714H672V0H515V482H512L238 0H69V714H226Z" />
+<glyph unicode="&#x419;" horiz-adv-x="741" d="M226 714V233H229L503 714H672V0H515V482H512L238 0H69V714H226ZM268 921Q274 888 301 871T367 854Q462 855 477 921H540Q521 780 362 779Q216 781 203 921H268Z" />
+<glyph unicode="&#x41A;" horiz-adv-x="722" d="M226 714V418L505 714H701L422 432L728 0H531L316 321L226 230V0H69V714H226Z" />
+<glyph unicode="&#x41B;" horiz-adv-x="722" d="M653 714V0H496V581H304L296 245Q290 -17 91 -17Q50 -17 10 -5V118Q42 110 69 110Q103 110 121 139T142 250L154 714H653Z" />
+<glyph unicode="&#x41C;" horiz-adv-x="907" d="M290 714L457 223H459L617 714H838V0H691V506H689L514 0H393L218 501H216V0H69V714H290Z" />
+<glyph unicode="&#x41D;" horiz-adv-x="741" d="M226 714V440H515V714H672V0H515V308H226V0H69V714H226Z" />
+<glyph unicode="&#x41E;" horiz-adv-x="778" d="M389 731Q547 731 643 626T740 354Q740 191 643 87T389 -17Q231 -17 135 87T38 354Q38 520 135 625T389 731ZM195 354Q195 246 246 181T389 115Q479 115 531 179T583 354Q583 469 532 534T388 599Q298 599 247 534T195 354Z" />
+<glyph unicode="&#x41F;" horiz-adv-x="741" d="M672 714V0H515V582H226V0H69V714H672Z" />
+<glyph unicode="&#x420;" horiz-adv-x="667" d="M392 714Q506 714 572 652T638 485Q638 379 572 318T393 256H226V0H69V714H392ZM351 378Q419 378 452 403T486 485Q486 540 454 566T352 592H226V378H351Z" />
+<glyph unicode="&#x421;" horiz-adv-x="741" d="M389 731Q514 731 599 661T697 474H545Q537 527 492 563T389 599Q297 599 246 533T195 354Q195 244 246 180T389 115Q457 115 499 156T551 275H703Q691 139 606 61T389 -17Q232 -17 135 86T38 354Q38 520 134 625T389 731Z" />
+<glyph unicode="&#x422;" horiz-adv-x="611" d="M598 714V582H384V0H227V582H13V714H598Z" />
+<glyph unicode="&#x423;" horiz-adv-x="656" d="M177 714L340 334L496 714H663L419 183Q380 97 349 60T276 3T179 -17Q122 -17 83 -4V122Q125 110 168 110Q206 110 228 129T250 181Q250 203 235 233L4 714H177Z" />
+<glyph unicode="&#x424;" horiz-adv-x="848" d="M501 714V642Q652 635 731 561T810 364Q810 236 727 160T501 78V0H347V78Q198 86 118 161T38 364Q38 489 121 562T347 642V714H501ZM189 364Q189 289 233 243T347 195V529Q189 523 189 364ZM501 195Q576 198 617 244T659 364Q659 441 619 483T501 529V195Z" />
+<glyph unicode="&#x425;" horiz-adv-x="667" d="M196 714L336 486L481 714H653L424 373L673 0H486L330 247L171 0H-6L244 374L14 714H196Z" />
+<glyph unicode="&#x426;" horiz-adv-x="757" d="M226 714V132H515V714H672V132H749V-183H596V0H69V714H226Z" />
+<glyph unicode="&#x427;" horiz-adv-x="670" d="M194 714V512Q194 455 220 430T309 405Q359 405 444 421V714H601V0H444V294Q351 274 285 274Q163 274 100 332T37 502V714H194Z" />
+<glyph unicode="&#x428;" horiz-adv-x="1077" d="M226 714V132H460V714H617V132H851V714H1008V0H69V714H226Z" />
+<glyph unicode="&#x429;" horiz-adv-x="1092" d="M226 714V132H460V714H617V132H851V714H1008V132H1085V-183H932V0H69V714H226Z" />
+<glyph unicode="&#x42A;" horiz-adv-x="809" d="M361 714V458H528Q646 458 713 398T780 229Q780 121 712 61T520 0H204V582H13V714H361ZM507 128Q564 128 596 150T628 229Q628 330 506 330H361V128H507Z" />
+<glyph unicode="&#x42B;" horiz-adv-x="914" d="M226 714V458H356Q475 458 541 398T608 229Q608 122 541 61T348 0H69V714H226ZM845 714V0H688V714H845ZM336 128Q456 128 456 229Q456 330 334 330H226V128H336Z" />
+<glyph unicode="&#x42C;" horiz-adv-x="674" d="M226 714V458H392Q510 458 577 399T645 229Q645 119 577 60T384 0H69V714H226ZM372 128Q493 128 493 229Q493 330 370 330H226V128H372Z" />
+<glyph unicode="&#x42D;" horiz-adv-x="741" d="M364 731Q518 731 610 628T703 357Q703 191 608 87T362 -17Q224 -17 137 54T37 247H193Q203 180 249 147T363 113Q440 113 490 165T546 307H278V429H541Q530 507 483 554T362 601Q242 601 200 493H45Q66 602 151 666T364 731Z" />
+<glyph unicode="&#x42E;" horiz-adv-x="1018" d="M659 731Q804 731 892 629T980 355Q980 188 891 86T658 -17Q524 -17 437 71T337 312H226V0H69V714H226V434H340Q361 574 446 652T659 731ZM490 356Q490 238 535 175T659 111Q737 111 780 175T823 358Q823 472 780 537T656 603Q581 603 536 540T490 356Z" />
+<glyph unicode="&#x42F;" horiz-adv-x="716" d="M647 0H490V280H392L198 0H4L222 288Q142 307 98 359T53 494Q53 595 122 654T300 714H647V0ZM206 493Q206 393 324 393H490V591H326Q206 591 206 493Z" />
+<glyph unicode="&#x430;" horiz-adv-x="574" d="M292 531Q518 530 518 384V110Q518 34 536 0H392Q384 24 382 50Q319 -14 208 -14Q127 -14 80 27T32 141Q32 212 77 251Q123 292 244 303Q330 312 353 325T376 367Q376 402 355 419T285 436Q240 436 217 418T190 358H48Q53 443 118 487T292 531ZM174 147Q174 81 261 81Q375 82 376 198V253Q359 236 290 228Q230 221 202 204T174 147Z" />
+<glyph unicode="&#x431;" horiz-adv-x="611" d="M546 714Q533 601 401 581L330 570Q250 558 213 523T155 406H158Q192 459 237 485T348 511Q454 511 513 441T573 252Q573 134 500 60T309 -14Q187 -14 117 69T46 310Q46 476 104 563T281 669Q380 685 393 692T412 714H546ZM187 252Q187 176 219 135T309 93Q366 93 398 133T431 252Q431 329 402 369T318 410Q253 410 220 366T187 252Z" />
+<glyph unicode="&#x432;" horiz-adv-x="570" d="M352 517Q428 517 469 482T511 386Q511 312 443 281V279Q489 264 513 231T537 154Q537 84 490 42T361 0H56V517H352ZM298 309Q374 309 374 368Q374 427 293 427H196V309H298ZM300 92Q347 92 371 107T395 160Q395 229 300 229H196V92H300Z" />
+<glyph unicode="&#x433;" horiz-adv-x="455" d="M446 517V410H198V0H56V517H446Z" />
+<glyph unicode="&#x434;" horiz-adv-x="622" d="M549 517V107H614V-152H478V0H144V-152H8V107H70Q135 249 135 424V517H549ZM407 107V410H269V400Q269 237 210 107H407Z" />
+<glyph unicode="&#x435;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402Z" />
+<glyph unicode="&#x436;" horiz-adv-x="822" d="M182 517L341 313V517H481V311L643 517H805L626 317L828 0H661L536 217L481 155V0H341V153L286 217L159 0H-6L193 312L16 517H182Z" />
+<glyph unicode="&#x437;" horiz-adv-x="534" d="M270 531Q373 531 428 492T484 385Q484 343 459 316T391 279V277Q500 254 500 153Q500 74 435 30T255 -14Q24 -14 20 168H155Q158 123 184 103T261 83Q308 83 333 103T358 156Q358 188 335 206T266 224H213V314H259Q348 314 348 374Q348 402 327 418T264 435Q175 435 169 366H37Q39 444 98 487T270 531Z" />
+<glyph unicode="&#x438;" horiz-adv-x="593" d="M192 517V175L379 517H537V0H401V342L214 0H56V517H192Z" />
+<glyph unicode="&#x439;" horiz-adv-x="593" d="M192 517V175L379 517H537V0H401V342L214 0H56V517H192ZM195 731Q200 700 227 682T294 664Q388 664 404 731H467Q447 589 289 589Q217 589 177 626T130 731H195Z" />
+<glyph unicode="&#x43A;" horiz-adv-x="567" d="M196 517V310L380 517H548L350 310L571 0H399L254 212L196 156V0H54V517H196Z" />
+<glyph unicode="&#x43B;" horiz-adv-x="593" d="M537 517V0H395V410H257L249 183Q243 -14 76 -14Q42 -14 8 -4V107Q28 102 48 102Q82 102 96 125T112 194L121 517H537Z" />
+<glyph unicode="&#x43C;" horiz-adv-x="722" d="M264 517L360 140H364L460 517H666V0H532V385H529L428 0H294L193 385H190V0H56V517H264Z" />
+<glyph unicode="&#x43D;" horiz-adv-x="593" d="M198 517V329H395V517H537V0H395V217H198V0H56V517H198Z" />
+<glyph unicode="&#x43E;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 135 500 61T305 -14Q182 -14 110 61T38 258Q38 383 111 457T305 531ZM180 258Q180 179 212 136T305 93Q368 93 399 137T431 258Q431 338 399 381T304 424Q244 424 212 381T180 258Z" />
+<glyph unicode="&#x43F;" horiz-adv-x="593" d="M537 517V0H395V410H198V0H56V517H537Z" />
+<glyph unicode="&#x440;" horiz-adv-x="611" d="M345 531Q452 531 516 456T580 253Q580 136 519 61T353 -14Q251 -14 198 64H196V-182H54V517H189V451H191Q242 531 345 531ZM191 257Q191 181 223 137T315 93Q377 93 407 137T438 257Q438 335 405 379T313 424Q254 424 223 380T191 257Z" />
+<glyph unicode="&#x441;" horiz-adv-x="574" d="M302 531Q407 531 473 478T545 335H406Q392 424 301 424Q245 424 213 378T180 256Q180 183 211 138T298 93Q395 93 411 198H548Q534 95 469 41T299 -14Q184 -14 111 59T38 251Q38 379 110 455T302 531Z" />
+<glyph unicode="&#x442;" horiz-adv-x="500" d="M491 517V410H321V0H180V410H10V517H491Z" />
+<glyph unicode="&#x443;" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146Z" />
+<glyph unicode="&#x444;" horiz-adv-x="846" d="M493 714V478H496Q545 531 617 531Q708 531 759 459T810 266Q810 136 756 61T604 -14Q538 -14 496 34H493V-182H353V34H350Q304 -14 235 -14Q139 -14 88 59T36 266Q36 389 91 460T236 531Q314 531 350 478H353V714H493ZM178 263Q178 93 276 93Q302 93 325 107T353 145V367Q343 392 320 408T271 424Q178 424 178 263ZM493 145Q496 128 516 111T570 93Q668 93 668 263Q668 424 574 424Q548 424 526 409T493 367V145Z" />
+<glyph unicode="&#x445;" horiz-adv-x="537" d="M178 517L269 382L359 517H516L346 275L537 0H375L267 163L159 0H0L186 272L16 517H178Z" />
+<glyph unicode="&#x446;" horiz-adv-x="604" d="M198 517V107H389V517H531V107H596V-152H460V0H56V517H198Z" />
+<glyph unicode="&#x447;" horiz-adv-x="574" d="M179 517V369Q179 330 195 309T258 287Q303 287 376 301V517H518V0H376V199Q289 180 231 180Q37 180 37 357V517H179Z" />
+<glyph unicode="&#x448;" horiz-adv-x="844" d="M198 517V107H351V517H493V107H646V517H788V0H56V517H198Z" />
+<glyph unicode="&#x449;" horiz-adv-x="861" d="M198 517V107H351V517H493V107H646V517H788V107H853V-152H717V0H56V517H198Z" />
+<glyph unicode="&#x44A;" horiz-adv-x="650" d="M302 517V339H434Q526 339 577 294T628 170Q628 88 575 44T434 0H160V410H10V517H302ZM404 98Q486 98 486 170Q486 243 403 243H302V98H404Z" />
+<glyph unicode="&#x44B;" horiz-adv-x="761" d="M198 517V339H304Q395 339 446 295T498 170Q498 92 447 46T304 0H56V517H198ZM705 517V0H563V517H705ZM273 98Q356 98 356 170Q356 243 273 243H198V98H273Z" />
+<glyph unicode="&#x44C;" horiz-adv-x="546" d="M198 517V339H330Q422 339 473 294T524 170Q524 89 472 45T330 0H56V517H198ZM300 98Q382 98 382 170Q382 243 299 243H198V98H300Z" />
+<glyph unicode="&#x44D;" horiz-adv-x="574" d="M276 531Q397 531 466 458T536 254Q536 133 462 60T268 -14Q166 -14 101 37T24 177H162Q168 135 197 114T271 93Q322 93 355 126T394 224H223V314H390Q385 366 355 395T276 424Q191 424 169 348H28Q47 438 111 484T276 531Z" />
+<glyph unicode="&#x44E;" horiz-adv-x="836" d="M547 531Q663 531 730 456T798 258Q798 134 731 60T547 -14Q441 -14 376 47T299 220H200V0H58V517H200V318H302Q319 418 382 474T547 531ZM437 258Q437 177 465 134T547 91Q598 91 627 133T656 259Q656 339 628 382T546 426Q495 426 466 385T437 258Z" />
+<glyph unicode="&#x44F;" horiz-adv-x="571" d="M515 0H373V191H309L161 0H-8L163 203Q101 217 67 256T32 354Q32 425 84 471T217 517H515V0ZM171 353Q171 293 250 293H373V415H252Q171 415 171 353Z" />
+<glyph unicode="&#x450;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM259 731L355 589H256L102 731H259Z" />
+<glyph unicode="&#x451;" horiz-adv-x="574" d="M293 531Q366 531 423 497T512 399T545 250Q545 242 544 224H171Q173 162 203 128T297 93Q336 93 368 112T410 160H535Q480 -14 293 -14Q222 -13 162 17T65 110T29 258Q29 337 65 402T162 499T293 531ZM402 314Q392 372 365 398T288 424Q236 424 206 395T171 314H402ZM258 715V598H123V715H258ZM464 715V598H329V715H464Z" />
+<glyph unicode="&#x452;" horiz-adv-x="593" d="M196 714V656H373V559H196V420H199Q251 506 360 506Q453 506 496 454T539 295V110Q539 -33 462 -111T247 -190V-72Q323 -69 360 -21T397 113V270Q397 340 374 367T307 394Q245 394 221 357T196 242V0H54V559H-34V656H54V714H196Z" />
+<glyph unicode="&#x453;" horiz-adv-x="455" d="M446 517V410H198V0H56V517H446ZM419 731L265 589H166L262 731H419Z" />
+<glyph unicode="&#x454;" horiz-adv-x="574" d="M304 531Q406 531 470 483T548 348H407Q389 424 304 424Q256 424 225 396T184 314H351V224H180Q185 159 217 126T301 93Q386 93 410 177H548Q529 83 464 35T302 -14Q182 -14 110 59T38 254Q38 377 109 454T304 531Z" />
+<glyph unicode="&#x455;" horiz-adv-x="537" d="M266 531Q370 531 428 489T494 366H359Q356 403 332 419T262 436Q222 436 203 424T183 388Q183 370 196 358T235 337T294 322Q391 303 431 283T489 235T508 166Q508 79 445 33T272 -14Q158 -14 95 35T29 168H164Q164 128 195 105T273 81Q313 81 339 98T366 147Q366 167 350 180T303 203T210 226Q160 236 121 253T62 297T41 365Q41 416 65 454T140 511T266 531Z" />
+<glyph unicode="&#x456;" horiz-adv-x="258" d="M200 714V597H58V714H200ZM200 517V0H58V517H200Z" />
+<glyph unicode="&#x457;" horiz-adv-x="258" d="M200 517V0H58V517H200ZM94 715V598H-41V715H94ZM300 715V598H165V715H300Z" />
+<glyph unicode="&#x458;" horiz-adv-x="278" d="M209 714V597H67V714H209ZM209 517V-29Q209 -85 193 -117T139 -165T28 -182Q0 -182 -19 -178V-61Q-7 -65 13 -65Q44 -65 56 -53T67 -18V517H209Z" />
+<glyph unicode="&#x459;" horiz-adv-x="826" d="M510 517V329H610Q700 329 752 286T804 165Q804 85 751 43T610 0H368V410H251L243 184Q238 83 197 35T74 -14Q45 -14 8 -4V107Q26 102 45 102Q76 102 90 124T106 195L115 517H510ZM585 101Q622 101 642 114T663 164Q663 229 584 229H510V101H585Z" />
+<glyph unicode="&#x45A;" horiz-adv-x="826" d="M198 517V329H368V517H510V329H610Q700 329 752 286T804 165Q804 88 753 44T611 0H368V229H198V0H56V517H198ZM585 101Q623 101 643 115T663 164Q663 229 583 229H510V101H585Z" />
+<glyph unicode="&#x45B;" horiz-adv-x="593" d="M196 714V656H373V559H196V420H199Q252 506 360 506Q452 506 495 454T539 296V0H397V269Q397 331 377 362T306 394Q250 394 223 361T196 243V0H54V559H-34V656H54V714H196Z" />
+<glyph unicode="&#x45C;" horiz-adv-x="567" d="M196 517V310L380 517H548L350 310L571 0H399L254 212L196 156V0H54V517H196ZM457 731L303 589H204L300 731H457Z" />
+<glyph unicode="&#x45D;" horiz-adv-x="593" d="M192 517V175L379 517H537V0H401V342L214 0H56V517H192ZM262 731L358 589H259L105 731H262Z" />
+<glyph unicode="&#x45E;" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146ZM163 731Q168 700 195 682T262 664Q356 664 372 731H435Q415 589 257 589Q185 589 145 626T98 731H163Z" />
+<glyph unicode="&#x45F;" horiz-adv-x="593" d="M198 517V107H395V517H537V0H366V-152H228V0H56V517H198Z" />
+<glyph unicode="&#x462;" horiz-adv-x="746" d="M302 714V640H487V530H302V436H460Q581 436 649 379T717 218Q717 112 647 56T449 0H145V530H13V640H145V714H302ZM446 132Q500 132 532 149T565 218Q565 306 446 306H302V132H446Z" />
+<glyph unicode="&#x463;" horiz-adv-x="614" d="M266 714V517H461V410H266V329H398Q489 329 540 286T592 165Q592 88 541 44T399 0H124V410H10V517H124V714H266ZM373 101Q410 101 430 114T451 164Q451 229 372 229H266V101H373Z" />
+<glyph unicode="&#x472;" horiz-adv-x="778" d="M389 731Q545 731 642 627T740 354Q740 191 643 87T389 -17Q232 -17 135 87T38 354Q38 522 135 626T389 731ZM577 429Q563 511 515 555T388 599Q311 599 263 554T201 429H577ZM389 115Q472 115 521 165T581 307H197Q205 219 254 167T389 115Z" />
+<glyph unicode="&#x473;" horiz-adv-x="611" d="M305 531Q429 531 501 456T573 258Q573 134 500 60T305 -14Q185 -14 112 60T38 258Q38 383 111 457T305 531ZM428 311Q420 363 389 393T305 424Q254 424 222 394T182 311H428ZM305 93Q359 93 392 125T431 221H180Q185 161 217 127T305 93Z" />
+<glyph unicode="&#x474;" horiz-adv-x="654" d="M591 731Q626 731 663 723V593Q631 599 620 599Q601 599 590 590T570 555L401 0H224L-8 714H154L313 212H315L429 606Q444 654 465 681T517 720T591 731Z" />
+<glyph unicode="&#x475;" horiz-adv-x="544" d="M482 531Q517 531 542 523V419Q520 424 505 424Q471 424 460 384L340 0H182L5 517H154L263 164H265L341 431Q370 531 482 531Z" />
+<glyph unicode="&#x490;" horiz-adv-x="571" d="M550 871V582H226V0H69V714H399V871H550Z" />
+<glyph unicode="&#x491;" horiz-adv-x="455" d="M442 658V410H198V0H56V517H308V658H442Z" />
+<glyph unicode="&#x1E80;" horiz-adv-x="944" d="M160 714L273 228H275L399 714H546L668 222H670L787 714H941L749 0H593L472 486H470L351 0H192L3 714H160ZM445 921L541 779H442L288 921H445Z" />
+<glyph unicode="&#x1E81;" horiz-adv-x="814" d="M156 517L251 166H253L339 517H477L565 167H567L662 517H808L645 0H499L407 347H405L317 0H170L6 517H156ZM379 731L475 589H376L222 731H379Z" />
+<glyph unicode="&#x1E82;" horiz-adv-x="944" d="M160 714L273 228H275L399 714H546L668 222H670L787 714H941L749 0H593L472 486H470L351 0H192L3 714H160ZM658 921L504 779H405L501 921H658Z" />
+<glyph unicode="&#x1E83;" horiz-adv-x="814" d="M156 517L251 166H253L339 517H477L565 167H567L662 517H808L645 0H499L407 347H405L317 0H170L6 517H156ZM594 731L440 589H341L437 731H594Z" />
+<glyph unicode="&#x1E84;" horiz-adv-x="944" d="M160 714L273 228H275L399 714H546L668 222H670L787 714H941L749 0H593L472 486H470L351 0H192L3 714H160ZM438 905V788H303V905H438ZM644 905V788H509V905H644Z" />
+<glyph unicode="&#x1E85;" horiz-adv-x="814" d="M156 517L251 166H253L339 517H477L565 167H567L662 517H808L645 0H499L407 347H405L317 0H170L6 517H156ZM373 715V598H238V715H373ZM579 715V598H444V715H579Z" />
+<glyph unicode="&#x1E9E;" horiz-adv-x="792" d="M485 514Q485 487 507 467T597 416Q689 373 726 322T763 196Q763 133 736 85T653 10T520 -17Q416 -17 350 38T281 194H431Q431 150 455 126T523 102Q610 104 611 186Q611 225 589 250T494 308Q417 342 377 384T336 484Q336 533 366 565T447 609L404 612H389Q336 612 302 603T247 567T226 496V0H69V494Q69 578 104 631T207 707T384 731Q514 731 647 711L645 594Q568 591 527 570T485 514Z" />
+<glyph unicode="&#x1EF2;" horiz-adv-x="667" d="M168 714L335 432L501 714H676L411 274V0H254V278L-9 714H168ZM298 921L394 779H295L141 921H298Z" />
+<glyph unicode="&#x1EF3;" horiz-adv-x="519" d="M146 517L263 163H265L378 517H525L309 -65Q286 -126 246 -154T133 -182Q102 -182 44 -177V-60Q82 -65 119 -65Q149 -65 165 -47T182 0Q182 16 176 32L-6 517H146ZM230 731L326 589H227L73 731H230Z" />
+<glyph unicode="&#x2010;" horiz-adv-x="407" d="M354 334V212H53V334H354Z" />
+<glyph unicode="&#x2013;" horiz-adv-x="500" d="M500 334V212H0V334H500Z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M870 334V212H130V334H870Z" />
+<glyph unicode="&#x2015;" horiz-adv-x="1000" d="M930 334V212H70V334H930Z" />
+<glyph unicode="&#x2018;" horiz-adv-x="278" d="M210 648Q144 627 144 549V547H210V393H68V552Q68 615 108 660T210 714V648Z" />
+<glyph unicode="&#x2019;" horiz-adv-x="278" d="M210 714V555Q210 492 170 447T68 393V459Q134 481 134 558V560H68V714H210Z" />
+<glyph unicode="&#x201A;" horiz-adv-x="278" d="M210 154V-6Q210 -68 170 -113T68 -167V-101Q134 -80 134 -2V0H68V154H210Z" />
+<glyph unicode="&#x201C;" horiz-adv-x="463" d="M196 648Q161 636 146 613T130 547H196V393H54V553Q54 615 94 661T196 714V648ZM409 648Q373 636 358 612T343 547H409V393H267V553Q267 615 307 661T409 714V648Z" />
+<glyph unicode="&#x201D;" horiz-adv-x="463" d="M196 714V553Q196 493 157 447T54 393V459Q87 470 103 493T120 560H54V714H196ZM409 714V555Q409 490 368 446T267 393V459Q301 470 317 493T333 560H267V714H409Z" />
+<glyph unicode="&#x201E;" horiz-adv-x="463" d="M196 154V-7Q196 -69 155 -114T54 -167V-101Q86 -90 103 -68T120 0H54V154H196ZM409 154V-6Q409 -69 368 -114T267 -167V-101Q299 -90 316 -68T333 0H267V154H409Z" />
+<glyph unicode="&#x2020;" horiz-adv-x="556" d="M345 714V517H532V400H345V-166H210V400H24V517H210V714H345Z" />
+<glyph unicode="&#x2021;" horiz-adv-x="556" d="M345 714V517H532V400H345V144H532V27H345V-166H210V27H24V144H210V400H24V517H210V714H345Z" />
+<glyph unicode="&#x2022;" horiz-adv-x="501" d="M250 535Q324 535 376 483T429 357Q429 284 378 231T250 178Q176 178 124 229T72 357Q72 431 123 483T250 535Z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M245 154V0H88V154H245ZM578 154V0H421V154H578ZM911 154V0H754V154H911Z" />
+<glyph unicode="&#x2030;" horiz-adv-x="1147" d="M649 722L237 -22H150L564 722H649ZM587 330Q732 330 732 155Q732 75 695 31T586 -14Q518 -14 479 31T440 155Q440 233 477 281T587 330ZM530 162Q530 105 543 78T586 51Q616 51 629 73T642 155Q642 222 629 243T588 265Q558 265 544 244T530 162ZM933 330Q1078 330 1078 155Q1078 75 1041 31T932 -14Q863 -14 825 31T786 155Q786 236 825 283T933 330ZM876 164Q876 51 932 51Q961 51 974 71T988 155Q988 222 975 243T934 265Q903 265 890 244T876 164ZM216 714Q361 714 361 539Q361 458 323 414T215 370Q146 370 108 416T69 539Q69 620 107 667T216 714ZM159 548Q159 486 173 461T215 435Q244 435 257 455T271 540Q271 606 258 627T217 649Q195 649 183 639T165 610T159 548Z" />
+<glyph unicode="&#x2039;" horiz-adv-x="241" d="M199 463V343L109 272L199 200V80L42 205V340L199 463Z" />
+<glyph unicode="&#x203A;" horiz-adv-x="241" d="M199 340V205L42 80V200L132 272L42 343V463L199 340Z" />
+<glyph unicode="&#x203D;" horiz-adv-x="556" d="M336 714V655Q427 645 475 601T524 485Q524 436 502 401T438 331Q399 298 378 274T354 214H230L207 522V546Q161 527 160 467H33Q37 622 207 651V714H336ZM336 522L312 359Q356 400 365 414T378 443T383 477Q383 531 336 549V522ZM373 154V0H216V154H373Z" />
+<glyph unicode="&#x2044;" horiz-adv-x="167" d="M333 722L-79 -22H-166L248 722H333Z" />
+<glyph unicode="&#x2070;" horiz-adv-x="390" d="M195 829Q361 829 361 611Q361 388 195 388Q29 388 29 607Q29 829 195 829ZM129 607Q129 531 143 498T195 465Q233 465 247 500T261 611Q261 689 246 720T194 752Q159 752 144 719T129 607Z" />
+<glyph unicode="&#x2074;" horiz-adv-x="390" d="M307 820V556H364V480H307V397H211V480H23V564L216 820H307ZM98 556H211V710L98 556Z" />
+<glyph unicode="&#x2075;" horiz-adv-x="390" d="M335 820V743H154L138 657Q165 684 220 684Q283 684 319 646T355 545Q355 474 310 431T188 388Q122 388 79 421T32 513H126Q137 467 191 467Q222 467 241 487T260 543Q260 616 194 616Q155 616 135 585H42L79 820H335Z" />
+<glyph unicode="&#x2076;" horiz-adv-x="390" d="M207 829Q333 829 349 722H254Q245 756 205 756Q132 756 128 639Q163 680 228 680Q285 680 322 644T359 541Q359 474 316 431T203 388Q32 388 32 597Q32 709 77 769T207 829ZM130 536Q130 504 148 484T198 464Q230 464 247 483T265 535Q265 570 248 590T198 611Q166 611 148 591T130 536Z" />
+<glyph unicode="&#x2077;" horiz-adv-x="390" d="M344 820V743Q284 690 249 594T212 397H102Q116 585 243 739H44V820H344Z" />
+<glyph unicode="&#x2078;" horiz-adv-x="390" d="M195 829Q266 829 305 799T344 716Q342 648 274 626Q322 613 342 585T362 520Q362 460 314 424T195 388Q119 388 74 422T28 519Q28 557 51 585T116 623Q47 645 46 712Q46 763 87 796T195 829ZM136 706Q136 684 152 670T195 655Q222 655 237 668T253 706Q252 758 194 759Q169 759 153 746T136 706ZM123 524Q123 494 143 478T196 461Q266 462 266 524Q266 553 247 570T194 588Q162 588 143 571T123 524Z" />
+<glyph unicode="&#x2079;" horiz-adv-x="390" d="M187 829Q358 829 358 620Q358 388 185 388Q56 388 41 495H136Q145 461 187 461Q262 461 262 579Q227 540 164 540Q104 540 68 577T31 677Q31 744 75 786T187 829ZM125 683Q125 649 142 629T191 608Q224 608 242 628T260 682Q260 714 242 734T192 754Q162 754 144 736T125 683Z" />
+<glyph unicode="&#x207A;" horiz-adv-x="400" d="M243 709V592H359V515H243V397H157V515H41V592H157V709H243Z" />
+<glyph unicode="&#x207B;" horiz-adv-x="270" d="M231 604V520H39V604H231Z" />
+<glyph unicode="&#x207C;" horiz-adv-x="400" d="M359 657V580H41V657H359ZM359 524V447H41V524H359Z" />
+<glyph unicode="&#x207D;" horiz-adv-x="225" d="M205 876Q141 759 141 599Q141 449 205 318H122Q37 439 37 593Q37 674 61 749T122 876H205Z" />
+<glyph unicode="&#x207E;" horiz-adv-x="225" d="M103 876Q188 755 188 601Q188 527 166 452T103 318H20Q84 438 84 595Q84 745 20 876H103Z" />
+<glyph unicode="&#x207F;" horiz-adv-x="390" d="M242 725Q350 725 350 598V397H248V579Q248 647 201 647Q171 647 157 625T142 572V397H40V716H137V669Q171 725 242 725Z" />
+<glyph unicode="&#x2080;" horiz-adv-x="390" d="M195 263Q361 263 361 45Q361 -178 195 -178Q29 -178 29 41Q29 263 195 263ZM129 41Q129 -35 143 -68T195 -101Q233 -101 247 -66T261 45Q261 123 246 154T194 186Q159 186 144 153T129 41Z" />
+<glyph unicode="&#x2081;" horiz-adv-x="390" d="M269 254V-169H167V99H57V171H78Q174 171 185 254H269Z" />
+<glyph unicode="&#x2082;" horiz-adv-x="390" d="M205 263Q277 263 317 230T357 136Q357 62 276 12L194 -38Q152 -65 148 -89H354V-169H33V-168Q33 -98 55 -58T131 17L206 64Q233 81 244 97T256 136Q256 157 242 171T204 186Q143 186 140 110H40Q40 181 84 222T205 263Z" />
+<glyph unicode="&#x2083;" horiz-adv-x="390" d="M198 263Q264 263 304 234T344 150Q344 85 278 62Q361 45 361 -44Q361 -104 312 -141T191 -178Q110 -178 69 -140T27 -39H123Q131 -99 194 -99Q226 -99 246 -84T267 -40Q267 -8 249 6T190 20H162V89H188Q217 89 234 102T252 138Q252 161 237 174T194 187Q132 187 132 121H37Q40 190 83 226T198 263Z" />
+<glyph unicode="&#x2084;" horiz-adv-x="390" d="M307 254V-10H364V-86H307V-169H211V-86H23V-2L216 254H307ZM98 -10H211V144L98 -10Z" />
+<glyph unicode="&#x2085;" horiz-adv-x="390" d="M335 254V177H154L138 91Q165 118 220 118Q283 118 319 80T355 -21Q355 -92 310 -135T188 -178Q122 -178 79 -145T32 -53H126Q137 -99 191 -99Q222 -99 241 -79T260 -23Q260 50 194 50Q155 50 135 19H42L79 254H335Z" />
+<glyph unicode="&#x2086;" horiz-adv-x="390" d="M207 263Q333 263 349 156H254Q245 190 205 190Q132 190 128 73Q163 114 228 114Q285 114 322 78T359 -25Q359 -92 316 -135T203 -178Q32 -178 32 31Q32 143 77 203T207 263ZM130 -30Q130 -62 148 -82T198 -102Q230 -102 247 -83T265 -31Q265 4 248 24T198 45Q166 45 148 25T130 -30Z" />
+<glyph unicode="&#x2087;" horiz-adv-x="390" d="M344 254V177Q284 124 249 28T212 -169H102Q116 19 243 173H44V254H344Z" />
+<glyph unicode="&#x2088;" horiz-adv-x="390" d="M195 263Q266 263 305 233T344 150Q342 82 274 60Q322 47 342 19T362 -46Q362 -106 314 -142T195 -178Q119 -178 74 -144T28 -47Q28 -9 51 19T116 57Q47 79 46 146Q46 197 87 230T195 263ZM136 140Q136 118 152 104T195 89Q222 89 237 102T253 140Q252 192 194 193Q169 193 153 180T136 140ZM123 -42Q123 -72 143 -88T196 -105Q266 -104 266 -42Q266 -13 247 4T194 22Q162 22 143 5T123 -42Z" />
+<glyph unicode="&#x2089;" horiz-adv-x="390" d="M187 263Q358 263 358 54Q358 -178 185 -178Q56 -178 41 -71H136Q145 -105 187 -105Q262 -105 262 13Q227 -26 164 -26Q104 -26 68 11T31 111Q31 178 75 220T187 263ZM125 117Q125 83 142 63T191 42Q224 42 242 62T260 116Q260 148 242 168T192 188Q162 188 144 170T125 117Z" />
+<glyph unicode="&#x208A;" horiz-adv-x="400" d="M243 143V26H359V-51H243V-169H157V-51H41V26H157V143H243Z" />
+<glyph unicode="&#x208B;" horiz-adv-x="270" d="M231 38V-46H39V38H231Z" />
+<glyph unicode="&#x208C;" horiz-adv-x="400" d="M359 91V14H41V91H359ZM359 -42V-119H41V-42H359Z" />
+<glyph unicode="&#x208D;" horiz-adv-x="225" d="M205 310Q141 193 141 33Q141 -117 205 -248H122Q37 -127 37 27Q37 108 61 183T122 310H205Z" />
+<glyph unicode="&#x208E;" horiz-adv-x="225" d="M103 310Q188 189 188 35Q188 -39 166 -114T103 -248H20Q84 -128 84 29Q84 179 20 310H103Z" />
+<glyph unicode="&#x20AC;" horiz-adv-x="556" d="M394 722Q478 722 576 672L515 547Q444 592 384 592Q279 592 244 455H488L457 383H233L232 351V341H445L414 269H240Q272 111 388 111Q462 111 542 174L541 23Q475 -17 386 -17Q268 -17 192 57T93 269H16L47 341H87V367L88 383H15L46 455H97Q122 579 200 650T394 722Z" />
+<glyph unicode="&#x20B9;" horiz-adv-x="556" d="M43 700H554V627H398Q431 598 439 549H554V476H441Q435 382 380 333T229 283H216L456 0H273L43 291V383H150Q225 383 258 405T298 476H43V549H296Q285 592 253 609T164 627H43V700Z" />
+<glyph unicode="&#x20BA;" horiz-adv-x="556" d="M539 368Q539 173 458 87T200 0H92V291L13 253V333L92 371V439L13 401V481L92 519V700H227V583L403 668V588L227 503V435L403 520V440L227 355V118Q317 125 358 180T399 368H539Z" />
+<glyph unicode="&#x20BC;" horiz-adv-x="785" d="M460 70H325V462Q248 439 207 322T165 41V0H24V64Q24 184 54 297T153 487T325 581V700H460V581Q562 565 630 489T730 301T761 64V0H619V41Q619 210 579 324T460 462V70Z" />
+<glyph unicode="&#x20BD;" horiz-adv-x="556" d="M238 138V0H103V138H15V234H103V297H15V393H103V696H295Q418 696 477 647T537 497Q537 398 474 348T288 297H238V234H378V138H238ZM281 393Q338 393 366 416T394 493Q394 543 367 564T277 586H238V393H281Z" />
+<glyph unicode="&#x2105;" horiz-adv-x="834" d="M666 722L254 -22H167L581 722H666ZM207 714Q347 714 355 576H255Q250 609 238 622T203 636Q169 636 156 603T142 492Q142 351 203 351Q252 351 258 421H356Q348 350 309 312T204 273Q39 273 39 490Q39 714 207 714ZM638 427Q804 427 804 209Q804 97 761 42T638 -14Q472 -14 472 205Q472 427 638 427ZM572 205Q572 129 586 96T638 63Q676 63 690 98T704 209Q704 285 690 317T638 350Q602 350 587 317T572 205Z" />
+<glyph unicode="&#x2113;" horiz-adv-x="500" d="M299 721Q367 721 408 681T450 571Q450 496 404 423T258 265V153Q258 123 274 105T319 87Q357 87 407 125H409L456 53Q376 -14 284 -14Q208 -14 164 26T120 133V174L65 126H63L14 201L119 287V523Q119 610 170 665T299 721ZM258 382Q337 467 337 563Q337 591 326 610T298 629Q280 629 269 606T258 553V382Z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1046" d="M223 700L479 235V700H621V0H470L212 466V0H69V700H223ZM844 452Q917 452 961 409T1006 291Q1006 219 963 174T843 129Q768 129 724 173T679 291Q679 365 724 408T844 452ZM778 291Q778 203 843 203Q874 203 891 226T908 291Q908 378 841 378Q815 378 797 357T778 291ZM999 98V0H698V98H999Z" />
+<glyph unicode="&#x2117;" horiz-adv-x="800" d="M400 731Q504 731 592 684T732 550T784 358Q784 253 734 167T594 32T400 -17Q295 -17 207 31T67 166T16 358Q16 463 66 549T206 683T400 731ZM118 358Q118 231 199 147T400 63Q519 63 600 148T682 358Q682 483 600 567T399 651Q280 651 199 568T118 358ZM424 568Q582 568 582 438Q582 378 544 343T438 308H345V149H260V568H424ZM427 373Q460 373 479 389T499 438Q499 469 480 486T427 503H345V373H427Z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1000" d="M398 714V634H281V302H179V634H62V714H398ZM587 714L690 443L793 714H928V302H832V594H830L724 302H655L549 594H547V302H451V714H587Z" />
+<glyph unicode="&#x2126;" horiz-adv-x="774" d="M387 731Q542 731 639 638T736 393Q736 312 701 245T596 133V128H737V0H432V118Q509 171 544 231T579 384Q579 489 527 544T387 599Q298 599 247 543T195 384Q195 296 229 236T341 118V0H35V128H172V133Q108 173 73 239T38 393Q38 540 138 635T387 731Z" />
+<glyph unicode="&#x212E;" horiz-adv-x="770" d="M384 714Q536 714 631 612T726 349H193V111Q272 33 384 33Q470 33 530 72T639 192L685 164Q624 68 556 27T384 -14Q234 -14 139 88T44 349Q44 508 139 611T384 714ZM193 398H577V589Q492 668 382 668Q272 668 193 589V398Z" />
+<glyph unicode="&#x2153;" horiz-adv-x="834" d="M247 703V280H145V548H35V620H56Q152 620 163 703H247ZM629 722L217 -22H130L544 722H629ZM646 432Q712 432 752 403T792 319Q792 254 726 231Q809 214 809 125Q809 65 760 28T639 -9Q558 -9 517 29T475 130H571Q579 70 642 70Q674 70 694 85T715 129Q715 161 697 175T638 189H610V258H636Q665 258 682 271T700 307Q700 330 685 343T642 356Q580 356 580 290H485Q488 359 531 395T646 432Z" />
+<glyph unicode="&#x2154;" horiz-adv-x="834" d="M191 711Q263 711 303 678T343 584Q343 510 262 460L180 410Q138 383 134 359H340V279H19V280Q19 350 41 390T117 465L192 512Q219 529 230 545T242 584Q242 605 228 619T190 634Q129 634 126 558H26Q26 629 70 670T191 711ZM679 722L267 -22H180L594 722H679ZM660 432Q726 432 766 403T806 319Q806 254 740 231Q823 214 823 125Q823 65 774 28T653 -9Q572 -9 531 29T489 130H585Q593 70 656 70Q688 70 708 85T729 129Q729 161 711 175T652 189H624V258H650Q679 258 696 271T714 307Q714 330 699 343T656 356Q594 356 594 290H499Q502 359 545 395T660 432Z" />
+<glyph unicode="&#x215B;" horiz-adv-x="834" d="M247 703V280H145V548H35V620H56Q152 620 163 703H247ZM629 722L217 -22H130L544 722H629ZM642 432Q713 432 752 402T791 319Q789 251 721 229Q769 216 789 188T809 123Q809 63 761 27T642 -9Q566 -9 521 25T475 122Q475 160 498 188T563 226Q494 248 493 315Q493 366 534 399T642 432ZM583 309Q583 287 599 273T642 258Q669 258 684 271T700 309Q699 361 641 362Q616 362 600 349T583 309ZM570 127Q570 97 590 81T643 64Q713 65 713 127Q713 156 694 173T641 191Q609 191 590 174T570 127Z" />
+<glyph unicode="&#x215C;" horiz-adv-x="834" d="M193 712Q259 712 299 683T339 599Q339 534 273 511Q356 494 356 405Q356 345 307 308T186 271Q105 271 64 309T22 410H118Q126 350 189 350Q221 350 241 365T262 409Q262 441 244 455T185 469H157V538H183Q212 538 229 551T247 587Q247 610 232 623T189 636Q127 636 127 570H32Q35 639 78 675T193 712ZM670 722L258 -22H171L585 722H670ZM647 432Q718 432 757 402T796 319Q794 251 726 229Q774 216 794 188T814 123Q814 63 766 27T647 -9Q571 -9 526 25T480 122Q480 160 503 188T568 226Q499 248 498 315Q498 366 539 399T647 432ZM588 309Q588 287 604 273T647 258Q674 258 689 271T705 309Q704 361 646 362Q621 362 605 349T588 309ZM575 127Q575 97 595 81T648 64Q718 65 718 127Q718 156 699 173T646 191Q614 191 595 174T575 127Z" />
+<glyph unicode="&#x215D;" horiz-adv-x="834" d="M335 703V626H154L138 540Q165 567 220 567Q283 567 319 529T355 428Q355 357 310 314T188 271Q122 271 79 304T32 396H126Q137 350 191 350Q222 350 241 370T260 426Q260 499 194 499Q155 499 135 468H42L79 703H335ZM668 722L256 -22H169L583 722H668ZM647 432Q718 432 757 402T796 319Q794 251 726 229Q774 216 794 188T814 123Q814 63 766 27T647 -9Q571 -9 526 25T480 122Q480 160 503 188T568 226Q499 248 498 315Q498 366 539 399T647 432ZM588 309Q588 287 604 273T647 258Q674 258 689 271T705 309Q704 361 646 362Q621 362 605 349T588 309ZM575 127Q575 97 595 81T648 64Q718 65 718 127Q718 156 699 173T646 191Q614 191 595 174T575 127Z" />
+<glyph unicode="&#x215E;" horiz-adv-x="834" d="M353 703V626Q293 573 258 477T221 280H111Q125 468 252 622H53V703H353ZM619 722L207 -22H120L534 722H619ZM632 432Q703 432 742 402T781 319Q779 251 711 229Q759 216 779 188T799 123Q799 63 751 27T632 -9Q556 -9 511 25T465 122Q465 160 488 188T553 226Q484 248 483 315Q483 366 524 399T632 432ZM573 309Q573 287 589 273T632 258Q659 258 674 271T690 309Q689 361 631 362Q606 362 590 349T573 309ZM560 127Q560 97 580 81T633 64Q703 65 703 127Q703 156 684 173T631 191Q599 191 580 174T560 127Z" />
+<glyph unicode="&#x2202;" horiz-adv-x="572" d="M253 721Q383 721 456 625T529 358Q529 172 463 80T271 -13Q171 -13 107 51T42 219Q42 317 103 380T262 443Q333 443 396 395V403Q396 503 361 561T259 620Q199 620 138 567L68 647Q121 692 165 706T253 721ZM169 212Q169 158 196 121T273 84Q327 84 361 135T395 262V291Q346 346 282 346Q231 346 200 309T169 212Z" />
+<glyph unicode="&#x2206;" horiz-adv-x="681" d="M423 714L688 0H-7L262 714H423ZM340 538L198 132H480L342 538H340Z" />
+<glyph unicode="&#x220F;" horiz-adv-x="749" d="M693 786V-214H561V660H188V-214H55V786H693Z" />
+<glyph unicode="&#x2211;" horiz-adv-x="673" d="M634 786V660H216L479 293L198 -88H646V-214H27V-104L322 292L39 676V786H634Z" />
+<glyph unicode="&#x2212;" horiz-adv-x="600" d="M553 306V199H48V306H553Z" />
+<glyph unicode="&#x2215;" horiz-adv-x="167" d="M333 722L-79 -22H-166L248 722H333Z" />
+<glyph unicode="&#x2219;" horiz-adv-x="278" d="M140 372Q162 372 181 361T212 330T224 287Q224 267 213 248T182 216T141 203Q118 203 97 215T66 248T55 287Q55 310 67 330T99 361T140 372Z" />
+<glyph unicode="&#x221A;" horiz-adv-x="570" d="M580 786L362 -214H240L93 89L40 63L-9 168L162 246L279 -9L441 786H580Z" />
+<glyph unicode="&#x221E;" horiz-adv-x="848" d="M228 463Q284 463 330 433T424 341Q472 406 519 434T620 463Q701 463 752 410T803 269Q803 180 752 125T619 69Q570 69 524 95T424 185Q372 124 330 98T232 71Q149 71 97 125T45 268Q45 356 95 409T228 463ZM491 264Q559 184 619 184Q653 184 673 207T694 266Q694 304 673 326T616 349Q562 349 491 264ZM154 266Q154 231 174 208T231 185Q294 185 356 264Q284 348 229 348Q194 348 174 324T154 266Z" />
+<glyph unicode="&#x222B;" horiz-adv-x="628" d="M400 784Q448 784 483 760T519 702Q519 674 502 656T458 638Q432 638 421 653T401 693Q395 713 391 719T379 725Q360 725 360 689L366 515V37Q366 -92 326 -152T199 -213Q149 -213 113 -188T77 -124Q77 -96 97 -82T140 -67Q162 -67 174 -80T195 -125Q202 -154 215 -154Q234 -154 234 -124L228 33V515Q228 663 268 723T400 784Z" />
+<glyph unicode="&#x2248;" horiz-adv-x="600" d="M195 435Q235 435 304 405Q376 372 412 372Q465 372 473 434H557Q541 270 404 270Q359 270 292 302Q228 333 188 333Q136 333 127 273H43Q58 434 195 435ZM195 221Q237 221 311 188Q378 158 412 158Q464 158 473 220H557Q542 57 404 56Q361 56 292 88Q225 119 188 119Q136 119 127 59H43Q58 219 195 221Z" />
+<glyph unicode="&#x2260;" horiz-adv-x="600" d="M492 504L442 412H553V308H381L326 197H553V93H268L197 -41L110 2L159 93H48V197H221L275 308H48V412H333L405 547L492 504Z" />
+<glyph unicode="&#x2264;" horiz-adv-x="600" d="M553 401L197 318L553 235V122L48 264V372L553 514V401ZM553 107V0H48V107H553Z" />
+<glyph unicode="&#x2265;" horiz-adv-x="600" d="M48 514L553 372V264L48 122V234L404 317L48 400V514ZM553 107V0H48V107H553Z" />
+<glyph unicode="&#x25CA;" horiz-adv-x="593" d="M355 747L541 356L355 -35H236L52 356L237 747H355ZM184 356L296 94L408 356L296 617L184 356Z" />
+<glyph unicode="&#xF001;" horiz-adv-x="591" d="M258 714Q276 714 333 710V604Q305 607 282 607Q251 607 239 594T227 547V517H325V422H227V0H85V422H0V517H85V555Q85 631 130 672T258 714ZM533 714V597H391V714H533ZM533 517V0H391V517H533Z" />
+<glyph unicode="&#xF002;" horiz-adv-x="591" d="M258 714Q276 714 333 710V604Q305 607 282 607Q251 607 239 594T227 547V517H325V422H227V0H85V422H0V517H85V555Q85 631 130 672T258 714ZM533 714V0H391V714H533Z" />
+<glyph unicode="&#xF8FF;" horiz-adv-x="512" d="M512 718V0H0V718H512ZM462 50V667H50V50H462ZM259 609Q313 609 348 573T383 478Q383 446 372 421T319 357Q285 326 278 311Q271 294 271 234H225L223 253Q223 300 234 328T286 395Q332 436 332 474Q332 508 309 533T256 559Q186 559 174 464L124 472Q138 609 259 609ZM222 184H278V117H222V184Z" />
+<glyph unicode="&#xFB00;" horiz-adv-x="636" d="M258 714Q276 714 333 710V604Q304 607 282 607Q253 607 240 595T227 550V517H388V556Q388 631 434 672T561 714Q577 714 636 710V604Q608 607 585 607Q554 607 542 593T530 549V517H628V422H530V0H388V422H227V0H85V422H0V517H85V555Q85 630 130 672T258 714Z" />
+<glyph unicode="&#xFB01;" horiz-adv-x="591" d="M258 714Q276 714 333 710V604Q305 607 282 607Q251 607 239 594T227 547V517H325V422H227V0H85V422H0V517H85V555Q85 631 130 672T258 714ZM533 714V597H391V714H533ZM533 517V0H391V517H533Z" />
+<glyph unicode="&#xFB02;" horiz-adv-x="591" d="M258 714Q276 714 333 710V604Q305 607 282 607Q251 607 239 594T227 547V517H325V422H227V0H85V422H0V517H85V555Q85 631 130 672T258 714ZM533 714V0H391V714H533Z" />
+<glyph unicode="&#xFB03;" horiz-adv-x="894" d="M258 714Q276 714 333 710V604Q304 607 282 607Q253 607 240 595T227 550V517H388V556Q388 631 434 672T561 714Q577 714 636 710V604Q608 607 585 607Q554 607 542 593T530 549V517H628V422H530V0H388V422H227V0H85V422H0V517H85V555Q85 630 130 672T258 714ZM836 714V597H694V714H836ZM836 517V0H694V517H836Z" />
+<glyph unicode="&#xFB04;" horiz-adv-x="894" d="M258 714Q276 714 333 710V604Q304 607 282 607Q253 607 240 595T227 550V517H388V556Q388 631 434 672T561 714Q577 714 636 710V604Q608 607 585 607Q554 607 542 593T530 549V517H628V422H530V0H388V422H227V0H85V422H0V517H85V555Q85 630 130 672T258 714ZM836 714V0H694V714H836Z" />
+
+
+</font>
+</defs>
+<text x="40" y="40" font-family="Helvetica Neue LT W07 75 Bold" font-size="30" fill="#933" >ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz AÁÀÂÄÅÃÆ CÇ DÐ EÉÈÊË I Í Ì Î Ï NÑ</text>
+<text x="40" y="80" font-family="Helvetica Neue LT W07 75 Bold" font-size="30" fill="#933" >OÓÒÔÖÕØŒ SŠ UÚÙÛÜ YÝŸ ZŽ Þ aáàâäåãæ cç dð eéèêë i ı í ì î ï nñ oóòôöõøœ sšß uúùûü yýÿ zž</text>
+<text x="40" y="120" font-family="Helvetica Neue LT W07 75 Bold" font-size="30" fill="#933" >þ 1234567890 ½ ¼ ¾ % ‰ $¢£¥ƒ€¤ † ‡ § ¶ # ^~µ +×± &lt; = &gt; ÷¬ !¡?¿ &quot; &amp; &apos; * ° . , : ; () [ \ ] {} / |</text>
+<text x="40" y="160" font-family="Helvetica Neue LT W07 75 Bold" font-size="30" fill="#933" >¦ _ ‚ „ … ‹› «» ‘ ’ “ ” • ­ - – — @ © ® ™ ªº ¹²³ ´ ` ˆ ˜ ¨ ¯ · ¸</text>
+</svg>
diff --git a/dashboard/public/fonts/HelvNeue75_W1G.ttf b/dashboard/public/fonts/HelvNeue75_W1G.ttf
new file mode 100644
index 00000000..01ebe37b
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue75_W1G.ttf
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue75_W1G.woff b/dashboard/public/fonts/HelvNeue75_W1G.woff
new file mode 100644
index 00000000..96ba6a6f
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue75_W1G.woff
Binary files differ
diff --git a/dashboard/public/fonts/HelvNeue75_W1G.woff2 b/dashboard/public/fonts/HelvNeue75_W1G.woff2
new file mode 100644
index 00000000..81b0c4d3
--- /dev/null
+++ b/dashboard/public/fonts/HelvNeue75_W1G.woff2
Binary files differ
diff --git a/dashboard/public/fonts/fontawesome-webfont.eot b/dashboard/public/fonts/fontawesome-webfont.eot
new file mode 100644
index 00000000..e9f60ca9
--- /dev/null
+++ b/dashboard/public/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/dashboard/public/fonts/fontawesome-webfont.svg b/dashboard/public/fonts/fontawesome-webfont.svg
new file mode 100644
index 00000000..855c845e
--- /dev/null
+++ b/dashboard/public/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg>
+<metadata>
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+</metadata>
+<defs>
+<font id="FontAwesome" horiz-adv-x="1536" >
+ <font-face
+ font-family="FontAwesome"
+ font-weight="400"
+ font-stretch="normal"
+ units-per-em="1792"
+ panose-1="0 0 0 0 0 0 0 0 0 0"
+ ascent="1536"
+ descent="-256"
+ bbox="-1.02083 -256.962 2304.6 1537.02"
+ underline-thickness="0"
+ underline-position="0"
+ unicode-range="U+0020-F500"
+ />
+<missing-glyph horiz-adv-x="896"
+d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
+ <glyph glyph-name=".notdef" horiz-adv-x="896"
+d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
+ <glyph glyph-name=".null" horiz-adv-x="0"
+ />
+ <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597"
+ />
+ <glyph glyph-name="space" unicode=" " horiz-adv-x="448"
+ />
+ <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792"
+d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+ <glyph glyph-name="music" unicode="&#xf001;"
+d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
+t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664"
+d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
+t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+ <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792"
+d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
+t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
+M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792"
+d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
+q-18 -18 -44 -18z" />
+ <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664"
+d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
+l502 -73q56 -9 56 -46z" />
+ <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664"
+d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
+l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+ <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280"
+d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
+t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+ <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920"
+d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
+q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
+t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
+q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
+t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664"
+d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
+h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792"
+d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
+h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
+q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792"
+d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
+h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792"
+d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+ <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408"
+d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
+t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+ <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664"
+d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
+q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
+t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+ <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664"
+d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
+M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
+" />
+ <glyph glyph-name="off" unicode="&#xf011;"
+d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
+t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+ <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792"
+d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
+v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="cog" unicode="&#xf013;"
+d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
+q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
+l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
+q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+ <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408"
+d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
+q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
+q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664"
+d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
+l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+ <glyph glyph-name="file_alt" unicode="&#xf016;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+" />
+ <glyph glyph-name="time" unicode="&#xf017;"
+d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920"
+d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
+q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+ <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664"
+d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
+q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+ <glyph glyph-name="download" unicode="&#xf01a;"
+d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
+t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="upload" unicode="&#xf01b;"
+d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
+t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="inbox" unicode="&#xf01c;"
+d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
+q25 -61 25 -123z" />
+ <glyph glyph-name="play_circle" unicode="&#xf01d;"
+d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="repeat" unicode="&#xf01e;"
+d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
+l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+ <glyph glyph-name="refresh" unicode="&#xf021;"
+d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
+q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
+q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+ <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792"
+d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
+M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
+t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
+t47 -113z" />
+ <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152"
+d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792"
+d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
+t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664"
+d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
+t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
+t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+ <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768"
+d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+ <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152"
+d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
+t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+ <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664"
+d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
+t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
+t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
+t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+ <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408"
+d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
+M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+ <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792"
+d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
+M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+ <glyph glyph-name="tag" unicode="&#xf02b;"
+d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
+l715 -714q37 -39 37 -91z" />
+ <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920"
+d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
+l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+ <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664"
+d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
+q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
+q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
+t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+ <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280"
+d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+ <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664"
+d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
+v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+ <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920"
+d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
+q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664"
+d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
+q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
+q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+ <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408"
+d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
+q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
+t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
+t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+ <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024"
+d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
+q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+ <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792"
+d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
+t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
+q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
+q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+ <glyph glyph-name="text_width" unicode="&#xf035;"
+d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
+t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
+q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
+t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
+t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+ <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792"
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
+t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792"
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
+h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792"
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
+t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792"
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
+t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792"
+d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
+t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
+q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
+t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
+q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+ <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792"
+d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
+t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
+q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+ <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792"
+d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
+t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
+q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+ <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792"
+d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
+q39 -17 39 -59z" />
+ <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920"
+d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
+q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="pencil" unicode="&#xf040;"
+d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
+q53 0 91 -38l235 -234q37 -39 37 -91z" />
+ <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024"
+d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+ <glyph glyph-name="adjust" unicode="&#xf042;"
+d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024"
+d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
+q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+ <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792"
+d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
+q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
+l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+ <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664"
+d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
+q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
+t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+ <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664"
+d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
+q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
+q24 -24 24 -57t-24 -57z" />
+ <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792"
+d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
+t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+ <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024"
+d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" />
+ <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792"
+d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
+q19 19 32 13t13 -32v-710q4 10 13 19z" />
+ <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664"
+d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" />
+ <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408"
+d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+ <glyph glyph-name="pause" unicode="&#xf04c;"
+d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="stop" unicode="&#xf04d;"
+d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664"
+d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
+ <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792"
+d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
+q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
+ <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024"
+d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" />
+ <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538"
+d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+ <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280"
+d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+ <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280"
+d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+ <glyph glyph-name="plus_sign" unicode="&#xf055;"
+d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
+t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="minus_sign" unicode="&#xf056;"
+d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
+t103 -385.5z" />
+ <glyph glyph-name="remove_sign" unicode="&#xf057;"
+d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
+q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="ok_sign" unicode="&#xf058;"
+d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="question_sign" unicode="&#xf059;"
+d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
+q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="info_sign" unicode="&#xf05a;"
+d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
+t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="screenshot" unicode="&#xf05b;"
+d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
+q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
+q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="remove_circle" unicode="&#xf05c;"
+d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
+l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
+t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="ok_circle" unicode="&#xf05d;"
+d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
+t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="ban_circle" unicode="&#xf05e;"
+d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
+t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+ <glyph glyph-name="arrow_left" unicode="&#xf060;"
+d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
+t32.5 -90.5z" />
+ <glyph glyph-name="arrow_right" unicode="&#xf061;"
+d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+ <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664"
+d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
+q37 -39 37 -91z" />
+ <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664"
+d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+ <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792"
+d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
+t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+ <glyph glyph-name="resize_full" unicode="&#xf065;"
+d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
+q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="resize_small" unicode="&#xf066;"
+d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
+t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+ <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408"
+d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408"
+d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664"
+d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
+q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+ <glyph glyph-name="exclamation_sign" unicode="&#xf06a;"
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
+q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+ <glyph glyph-name="gift" unicode="&#xf06b;"
+d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
+q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
+t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792"
+d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
+q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
+t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+ <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408"
+d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
+q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+ <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792"
+d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
+t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+ <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792"
+d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
+q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
+q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
+" />
+ <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792"
+d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
+q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+ <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408"
+d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
+q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+ <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664"
+d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
+M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
+q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
+h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792"
+d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
+t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
+v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
+t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+ <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792"
+d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
+q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+ <glyph glyph-name="magnet" unicode="&#xf076;"
+d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
+q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792"
+d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+ <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792"
+d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+ <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920"
+d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
+zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
+" />
+ <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664"
+d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
+t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664"
+d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+ <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920"
+d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
+t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+ <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768"
+d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+ <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792"
+d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+ <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048"
+d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+ <glyph glyph-name="twitter_sign" unicode="&#xf081;"
+d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
+q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
+t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="facebook_sign" unicode="&#xf082;"
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
+q0 119 84.5 203.5t203.5 84.5h960z" />
+ <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792"
+d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
+t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
+q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+ <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792"
+d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
+l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
+t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+ <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920"
+d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
+t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
+l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
+l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
+q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
+t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
+q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
+q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+ <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792"
+d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
+q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
+q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+ <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;"
+d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
+t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
+q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
+q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+ <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;"
+d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
+t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
+M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
+h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" />
+ <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896"
+d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+ <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792"
+d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
+q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
+q224 0 351 -124t127 -344z" />
+ <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664"
+d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
+q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+ <glyph glyph-name="linkedin_sign" unicode="&#xf08c;"
+d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
+q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152"
+d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
+t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+ <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792"
+d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
+q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="signin" unicode="&#xf090;"
+d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
+q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664"
+d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
+t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
+q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="github_sign" unicode="&#xf092;"
+d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
+q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
+t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
+q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664"
+d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
+t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+ <glyph glyph-name="lemon" unicode="&#xf094;"
+d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
+q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
+q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
+q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" />
+ <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408"
+d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
+q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
+t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+ <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408"
+d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
+q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280"
+d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
+q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+ <glyph glyph-name="phone_sign" unicode="&#xf098;"
+d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
+t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
+t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
+" />
+ <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664"
+d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
+q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+ <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024"
+d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+ <glyph glyph-name="github" unicode="&#xf09b;"
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
+q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
+t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
+q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
+M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
+ <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664"
+d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
+t316.5 -131.5t131.5 -316.5z" />
+ <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920"
+d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
+q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+ <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408"
+d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
+t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
+q187 -186 294 -425.5t120 -501.5z" />
+ <glyph glyph-name="hdd" unicode="&#xf0a0;"
+d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
+h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
+l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+ <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792"
+d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
+t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+ <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792"
+d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
+M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
+t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+ <glyph glyph-name="certificate" unicode="&#xf0a3;"
+d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
+l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
+l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+ <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792"
+d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
+q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
+q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
+t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+ <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792"
+d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
+t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
+M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
+q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+ <glyph glyph-name="hand_up" unicode="&#xf0a6;"
+d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
+q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
+t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
+q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+ <glyph glyph-name="hand_down" unicode="&#xf0a7;"
+d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
+t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
+q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
+q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+ <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;"
+d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;"
+d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;"
+d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;"
+d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="globe" unicode="&#xf0ac;"
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
+q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
+q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
+q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
+t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
+q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
+q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
+t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
+t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
+q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
+q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
+q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
+t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
+q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
+q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+ <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664"
+d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
+t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+ <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792"
+d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
+t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408"
+d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+ <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792"
+d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
+t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="fullscreen" unicode="&#xf0b2;"
+d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
+l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
+" />
+ <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920"
+d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
+t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
+t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
+t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+ <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664"
+d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
+l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
+t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
+q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+ <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920"
+d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
+" />
+ <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664"
+d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+ <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792"
+d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
+q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
+q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
+q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
+q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+ <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792"
+d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
+h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+ <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408"
+d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
+l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
+z" />
+ <glyph glyph-name="save" unicode="&#xf0c7;"
+d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
+h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+ <glyph glyph-name="sign_blank" unicode="&#xf0c8;"
+d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="reorder" unicode="&#xf0c9;"
+d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
+t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792"
+d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
+t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
+M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+ <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792"
+d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
+q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
+t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
+q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+ <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792"
+d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
+l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
+l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+ <glyph glyph-name="underline" unicode="&#xf0cd;"
+d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
+q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
+q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
+q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+ <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664"
+d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
+v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
+q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
+q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
+z" />
+ <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664"
+d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
+l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+ <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792"
+d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
+t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
+t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="pinterest" unicode="&#xf0d2;"
+d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
+q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
+q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;"
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
+t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
+t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+ <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;"
+d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
+h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304"
+d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
+q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
+ <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920"
+d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
+v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024"
+d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024"
+d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+ <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640"
+d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+ <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640"
+d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+ <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664"
+d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024"
+d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+ <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024"
+d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024"
+d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+ <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792"
+d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
+q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+ <glyph glyph-name="linkedin" unicode="&#xf0e1;"
+d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
+q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+ <glyph glyph-name="undo" unicode="&#xf0e2;"
+d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
+t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+ <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792"
+d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
+t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
+q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
+q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+ <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792"
+d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
+t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
+t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
+q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792"
+d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
+q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
+t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+ <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792"
+d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
+t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
+t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
+q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+ <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896"
+d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+ <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792"
+d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
+q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
+z" />
+ <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664"
+d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
+q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
+q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+ <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792"
+d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
+h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+ <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024"
+d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
+q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
+q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
+t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+ <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792"
+d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
+q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+ <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920"
+d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
+q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+ <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920"
+d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
+q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+ <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408"
+d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
+t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
+t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
+t271.5 -112.5t112.5 -271.5z" />
+ <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408"
+d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
+t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
+t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+ <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792"
+d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
+t66 -158z" />
+ <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792"
+d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
+t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+ <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920"
+d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
+t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+ <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408"
+d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
+t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="file_text_alt" unicode="&#xf0f6;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
+q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+ <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408"
+d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408"
+d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
+t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
+v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920"
+d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
+t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
+q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792"
+d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
+q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+ <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920"
+d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
+q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" />
+ <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664"
+d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+ <glyph glyph-name="h_sign" unicode="&#xf0fd;"
+d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="f0fe" unicode="&#xf0fe;"
+d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024"
+d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
+t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+ <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024"
+d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
+l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+ <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152"
+d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
+q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+ <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152"
+d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
+t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+ <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640"
+d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+ <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640"
+d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+ <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152"
+d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+ <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152"
+d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+ <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920"
+d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
+t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920"
+d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
+M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+ <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152"
+d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
+q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768"
+d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
+q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="circle_blank" unicode="&#xf10c;"
+d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
+t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664"
+d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
+M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+ <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664"
+d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
+v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+ <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792"
+d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
+t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
+M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
+q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+ <glyph glyph-name="circle" unicode="&#xf111;"
+d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792"
+d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
+l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+ <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664"
+d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
+q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
+t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
+q0 -87 -27 -168q136 -160 136 -398z" />
+ <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664"
+d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
+q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+ <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920"
+d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
+v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
+" />
+ <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="smile" unicode="&#xf118;"
+d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
+t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
+t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="frown" unicode="&#xf119;"
+d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
+t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
+t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="meh" unicode="&#xf11a;"
+d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
+t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920"
+d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
+t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
+t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+ <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920"
+d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
+h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
+h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
+q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
+h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+ <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792"
+d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9
+h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102
+q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+ <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792"
+d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2
+q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266
+q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8
+q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+ <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664"
+d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9
+t9 -23z" />
+ <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920"
+d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5
+l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+ <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792"
+d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1
+q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+ <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664"
+d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5
+l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+ <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408"
+d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+ <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664"
+d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23
+v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024"
+d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5
+q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497
+q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+ <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664"
+d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320
+q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18
+l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9
+t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+ <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024"
+d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5
+t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+ <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640"
+d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192
+q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640"
+d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+ <glyph glyph-name="superscript" unicode="&#xf12b;"
+d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
+M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5
+t-65.5 -51.5t-30.5 -63h232v80h126z" />
+ <glyph glyph-name="subscript" unicode="&#xf12c;"
+d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
+M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73
+h232v80h126z" />
+ <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920"
+d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+ <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664"
+d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5
+t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89
+q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117
+q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+ <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152"
+d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5
+t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+ <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408"
+d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128
+q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23
+t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+ <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280"
+d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150
+t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664"
+d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
+q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408"
+d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800
+q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113
+q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+ <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664"
+d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1
+q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+ <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792"
+d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+ <glyph glyph-name="chevron_sign_left" unicode="&#xf137;"
+d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="chevron_sign_right" unicode="&#xf138;"
+d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="chevron_sign_up" unicode="&#xf139;"
+d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;"
+d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408"
+d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+ <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792"
+d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+ <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792"
+d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352
+q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19
+t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152"
+d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181
+v-320h736z" />
+ <glyph glyph-name="bullseye" unicode="&#xf140;"
+d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150
+t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408"
+d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384"
+d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+ <glyph glyph-name="_303" unicode="&#xf143;"
+d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128
+q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="play_sign" unicode="&#xf144;"
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56
+q16 -8 32 -8q17 0 32 9z" />
+ <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792"
+d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136
+t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+ <glyph glyph-name="minus_sign_alt" unicode="&#xf146;"
+d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
+t84.5 -203.5z" />
+ <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408"
+d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5
+t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024"
+d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+ <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024"
+d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+ <glyph glyph-name="check_sign" unicode="&#xf14a;"
+d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5
+t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="edit_sign" unicode="&#xf14b;"
+d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120
+v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_312" unicode="&#xf14c;"
+d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960
+q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="share_sign" unicode="&#xf14d;"
+d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5
+t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="compass" unicode="&#xf14e;"
+d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="collapse" unicode="&#xf150;"
+d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120
+v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="collapse_top" unicode="&#xf151;"
+d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_317" unicode="&#xf152;"
+d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5
+t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024"
+d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9
+t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26
+l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+ <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024"
+d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7
+q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+ <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024"
+d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43
+t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5
+t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50
+t53 -63.5t31.5 -76.5t13 -94z" />
+ <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898"
+d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102
+q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027"
+d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61
+l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+ <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280"
+d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128
+q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+ <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792"
+d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23
+t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28
+q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280"
+d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164
+l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30
+t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+ <glyph glyph-name="file" unicode="&#xf15b;"
+d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+ <glyph glyph-name="file_text" unicode="&#xf15c;"
+d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704
+q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+ <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664"
+d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23
+v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162
+l230 -662h70z" />
+ <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664"
+d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150
+v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248
+v119h121z" />
+ <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792"
+d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832
+q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256
+q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792"
+d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192
+q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832
+q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="sort_by_order" unicode="&#xf162;"
+d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23
+zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5
+t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+ <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;"
+d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9
+t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13
+q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+ <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664"
+d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76
+q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5
+t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+ <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664"
+d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135
+t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121
+t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+ <glyph glyph-name="youtube_sign" unicode="&#xf166;"
+d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15
+q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38
+q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5
+q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38
+q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5
+h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="youtube" unicode="&#xf167;"
+d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73
+q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51
+q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99
+q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51
+q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+ <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408"
+d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942
+q25 45 64 45h241q22 0 31 -15z" />
+ <glyph glyph-name="xing_sign" unicode="&#xf169;"
+d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1
+l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792"
+d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5
+l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136
+q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" />
+ <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792"
+d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+ <glyph glyph-name="stackexchange" unicode="&#xf16c;"
+d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
+ <glyph glyph-name="instagram" unicode="&#xf16d;"
+d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270
+q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5
+t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317
+q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
+ <glyph glyph-name="flickr" unicode="&#xf16e;"
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150
+t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+ <glyph glyph-name="adn" unicode="&#xf170;"
+d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408"
+d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22
+t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18
+t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5
+t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+ <glyph glyph-name="bitbucket_sign" unicode="&#xf172;"
+d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5
+t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z
+M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120
+v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024"
+d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14
+q78 2 134 29z" />
+ <glyph glyph-name="tumblr_sign" unicode="&#xf174;"
+d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z
+M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768"
+d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+ <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768"
+d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+ <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792"
+d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792"
+d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+ <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408"
+d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65
+q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+ <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664"
+d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+ <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408"
+d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30
+t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5
+h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+ <glyph glyph-name="linux" unicode="&#xf17c;"
+d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z
+M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7
+q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15
+q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5
+t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19
+q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63
+q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92
+q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152
+q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4
+t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5
+t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43
+q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49
+t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54
+q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5
+t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5
+t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+ <glyph glyph-name="dribble" unicode="&#xf17d;"
+d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81
+t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19
+q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6
+t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="skype" unicode="&#xf17e;"
+d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5
+t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5
+q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80
+q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+ <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280"
+d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z
+M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324
+l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+ <glyph glyph-name="trello" unicode="&#xf181;"
+d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408
+q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280"
+d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43
+q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+ <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024"
+d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z
+M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+ <glyph glyph-name="gittip" unicode="&#xf184;"
+d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792"
+d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4
+l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94
+q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+ <glyph glyph-name="_366" unicode="&#xf186;"
+d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61
+t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+ <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792"
+d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536
+q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664"
+d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207
+q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19
+t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+ <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920"
+d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58
+t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6
+q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24
+q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2
+q39 5 64 -2.5t31 -16.5z" />
+ <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792"
+d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12
+q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422
+q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178
+q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z
+M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+ <glyph glyph-name="renren" unicode="&#xf18b;"
+d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495
+q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+ <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408"
+d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5
+t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56
+t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5
+t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+ <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280"
+d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z
+" />
+ <glyph glyph-name="_374" unicode="&#xf18e;"
+d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
+t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;"
+d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
+t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_376" unicode="&#xf191;"
+d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z
+M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="dot_circle_alt" unicode="&#xf192;"
+d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5
+t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664"
+d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128
+q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+ <glyph glyph-name="vimeo_square" unicode="&#xf194;"
+d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179
+q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152"
+d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160
+q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408"
+d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832
+q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176"
+d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40
+t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29
+q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+ <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664"
+d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9
+q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102
+t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+ <glyph glyph-name="_384" unicode="&#xf199;"
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69
+q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13
+t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+ <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792"
+d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5
+t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21
+t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286
+t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273
+t273 -182.5t331.5 -68z" />
+ <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792"
+d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+ <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048"
+d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64
+q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+ <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304"
+d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433
+q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+ <glyph glyph-name="_389" unicode="&#xf19e;"
+d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0
+q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+ <glyph glyph-name="uniF1A0" unicode="&#xf1a0;"
+d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5
+t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
+ <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792"
+d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26
+t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37
+q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191
+t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="_392" unicode="&#xf1a2;"
+d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54
+q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83
+q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
+q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_393" unicode="&#xf1a3;"
+d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150
+v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103
+t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920"
+d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328
+v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+ <glyph glyph-name="_395" unicode="&#xf1a5;"
+d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
+t84.5 -203.5z" />
+ <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048"
+d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
+v-369h123z" />
+ <glyph glyph-name="_397" unicode="&#xf1a7;"
+d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101
+v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
+q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038"
+d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14
+q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24
+q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33
+q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5
+t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43
+q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5
+t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13
+t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+ <glyph glyph-name="_399" unicode="&#xf1a9;"
+d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10
+q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14
+q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14
+t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44
+q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+ <glyph glyph-name="_400" unicode="&#xf1aa;"
+d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z
+M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5
+t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5
+q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126
+t135.5 51q85 0 145 -60.5t60 -145.5z" />
+ <glyph glyph-name="f1ab" unicode="&#xf1ab;"
+d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5
+q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28
+q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z
+M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11
+q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5
+q20 0 20 -21v-418z" />
+ <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792"
+d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48
+l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23
+t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128
+q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128
+q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+ <glyph glyph-name="_403" unicode="&#xf1ad;"
+d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9
+t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64
+q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
+q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9
+t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64
+q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
+q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9
+t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+ <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280"
+d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152
+q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+ <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664"
+d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5
+q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819
+q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5
+t100.5 134t141.5 55.5z" />
+ <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768"
+d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+ <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792"
+d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z
+" />
+ <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304"
+d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67
+t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70
+v-400l434 -186q36 -16 57 -48t21 -70z" />
+ <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048"
+d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658
+q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204
+q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+ <glyph glyph-name="_410" unicode="&#xf1b5;"
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5
+t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217
+t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+ <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792"
+d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5
+q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89
+q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+ <glyph glyph-name="_412" unicode="&#xf1b7;"
+d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5
+q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5
+q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z
+" />
+ <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792"
+d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188
+l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5
+t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1
+q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+ <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048"
+d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384
+q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5
+l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+ <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048"
+d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5
+t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z
+M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+ <glyph glyph-name="_416" unicode="&#xf1bb;"
+d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384
+q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+ <glyph glyph-name="_417" unicode="&#xf1bc;"
+d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64
+q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37
+q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024"
+d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+ <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304"
+d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11
+q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245
+q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785
+l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242
+q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236
+q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786
+q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+ <glyph glyph-name="uniF1C0" unicode="&#xf1c0;"
+d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127
+t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5
+t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+ <glyph glyph-name="uniF1C1" unicode="&#xf1c1;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197
+q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8
+q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+ <glyph glyph-name="_422" unicode="&#xf1c2;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5
+t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" />
+ <glyph glyph-name="_423" unicode="&#xf1c3;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107
+h-290v-107h68l189 -272l-194 -283h-68z" />
+ <glyph glyph-name="_424" unicode="&#xf1c4;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+ <glyph glyph-name="_425" unicode="&#xf1c5;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+ <glyph glyph-name="_426" unicode="&#xf1c6;"
+d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400
+v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79
+q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+ <glyph glyph-name="_427" unicode="&#xf1c7;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5
+q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+ <glyph glyph-name="_428" unicode="&#xf1c8;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+ <glyph glyph-name="_429" unicode="&#xf1c9;"
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243
+l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+ <glyph glyph-name="_430" unicode="&#xf1ca;"
+d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406
+q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+ <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792"
+d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546
+q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+ <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048"
+d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94
+q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55
+t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" />
+ <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792"
+d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194
+q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5
+t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+ <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792"
+d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5
+t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
+ <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792"
+d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41
+t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170
+t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136
+q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+ <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792"
+d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251
+l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162
+q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33
+q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5
+t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
+t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="uniF1D2" unicode="&#xf1d2;"
+d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85
+q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392
+q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072
+q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792"
+d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58
+q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47
+q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171
+v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+ <glyph glyph-name="_439" unicode="&#xf1d4;"
+d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280"
+d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5
+t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153
+t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+ <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792"
+d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5
+q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20
+t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5
+t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+ <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048"
+d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25
+q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5
+q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109
+q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+ <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792"
+d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+ <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792"
+d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137
+l863 639l-478 -797z" />
+ <glyph glyph-name="_445" unicode="&#xf1da;"
+d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
+t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23
+t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="_446" unicode="&#xf1db;"
+d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792"
+d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15
+t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2
+t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160
+q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5
+q0 -26 -12 -48t-36 -22z" />
+ <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280"
+d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179
+q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+ <glyph glyph-name="_449" unicode="&#xf1de;"
+d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256
+q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+ <glyph glyph-name="uniF1E0" unicode="&#xf1e0;"
+d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5
+t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+ <glyph glyph-name="_451" unicode="&#xf1e1;"
+d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5
+t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792"
+d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5
+t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91
+q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9
+t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+ <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792"
+d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323
+l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+ <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792"
+d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
+v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192
+q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23
+zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5
+t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+ <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792"
+d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z
+M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792"
+d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234
+l401 400q38 37 91 37t90 -37z" />
+ <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792"
+d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5
+t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z
+M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7
+t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+ <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792"
+d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+ <glyph glyph-name="_459" unicode="&#xf1e9;"
+d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36
+q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5
+t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87
+q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+ <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048"
+d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19
+t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+ <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048"
+d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121
+q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z
+M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+ <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792"
+d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
+t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5
+t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5
+t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
+M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38
+h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_463" unicode="&#xf1ed;"
+d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246
+q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598
+q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
+ <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792"
+d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640
+q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
+ <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304"
+d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27
+q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128
+q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304"
+d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249
+q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z
+M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32
+h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4
+q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75
+q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14
+q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22
+q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12
+q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122
+h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5
+t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304"
+d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42
+q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604
+v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569
+q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73
+t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+ <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304"
+d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z
+M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260
+l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279
+v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040
+q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168
+q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5
+t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21
+h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5
+t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+ <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304"
+d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16
+t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76
+q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59
+t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489
+l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66
+q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304"
+d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109
+q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118
+q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151
+q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31
+q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048"
+d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5
+l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5
+l418 363q10 8 23.5 7t21.5 -11z" />
+ <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048"
+d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128
+q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161
+q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+ <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408"
+d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704
+q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167
+q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="_474" unicode="&#xf1f9;"
+d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5
+t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5
+t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_475" unicode="&#xf1fa;"
+d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53
+q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24
+t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61
+t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+ <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792"
+d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10
+t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+ <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792"
+d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5
+t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+ <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792"
+d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5
+t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38
+t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448
+h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5
+q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+ <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048"
+d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+ <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792"
+d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048"
+d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9
+t9 -23z" />
+ <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792"
+d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20
+q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50
+t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1
+q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+ <glyph glyph-name="_483" unicode="&#xf203;"
+d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73
+q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110
+q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048"
+d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5
+t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5
+t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+ <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048"
+d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5
+t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+ <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304"
+d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94
+q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469
+q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400
+q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+ <glyph glyph-name="_487" unicode="&#xf207;"
+d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5
+h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
+t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+ <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048"
+d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327
+q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5
+q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+ <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280"
+d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119
+t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5
+t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14
+q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88
+q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5
+t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+ <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048"
+d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206
+q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307
+t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14
+t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+ <glyph glyph-name="_491" unicode="&#xf20b;"
+d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5
+t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="_492" unicode="&#xf20c;"
+d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55
+q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410
+q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+ <glyph glyph-name="_493" unicode="&#xf20d;"
+d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+ <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048"
+d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335
+q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5
+q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438
+h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66
+l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946
+l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82
+zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+ <glyph glyph-name="f210" unicode="&#xf210;"
+d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+ <glyph glyph-name="_496" unicode="&#xf211;"
+d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384
+q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+ <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048"
+d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021
+q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25
+q209 0 374 -102q172 107 374 102z" />
+ <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048"
+d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101
+q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284
+q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+ <glyph glyph-name="_499" unicode="&#xf214;"
+d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34
+l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114
+v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z
+M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378
+v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51
+h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5
+t-43 -34t-16.5 -53.5z" />
+ <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048"
+d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832
+q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+ <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048"
+d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5
+t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113
+t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5
+q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+ <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664"
+d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
+t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
+q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664"
+d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
+t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
+q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048"
+d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20
+l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+ <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048"
+d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
+q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83
+q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314
+v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
+q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+ <glyph glyph-name="_506" unicode="&#xf21b;"
+d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14
+t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5
+q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31
+t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+ <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304"
+d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5
+t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105
+l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226
+t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+ <glyph glyph-name="_508" unicode="&#xf21d;"
+d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12
+q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384
+q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5
+t158.5 -65.5t65.5 -158.5z" />
+ <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792"
+d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221
+q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124
+t127 -344z" />
+ <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280"
+d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292
+q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+ <glyph glyph-name="_511" unicode="&#xf222;"
+d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5
+q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280"
+d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5
+t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
+t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_513" unicode="&#xf224;"
+d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
+q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
+t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792"
+d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
+q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9
+t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5
+t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792"
+d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23
+t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391
+q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391
+q0 -226 -154 -391q103 -57 218 -57z" />
+ <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920"
+d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230
+q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9
+t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128
+q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+ <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048"
+d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23
+t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9
+t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5
+t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+ <glyph glyph-name="_518" unicode="&#xf229;"
+d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5
+t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
+t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280"
+d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22
+t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5
+t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048"
+d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5
+t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5
+t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280"
+d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5
+t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+ <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280"
+d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123
+t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+ <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="_525" unicode="&#xf230;"
+d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+ <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280"
+d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5
+l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5
+q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+ <glyph glyph-name="_527" unicode="&#xf232;"
+d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5
+t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233
+l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+ <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792"
+d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216
+q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+ <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048"
+d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5
+t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5
+t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+ <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048"
+d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136
+q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69
+t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+ <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048"
+d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704
+q-26 0 -45 -19t-19 -45v-384h1152z" />
+ <glyph glyph-name="_532" unicode="&#xf237;"
+d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+ <glyph glyph-name="_533" unicode="&#xf238;"
+d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56
+t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+ <glyph glyph-name="_534" unicode="&#xf239;"
+d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47
+t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+ <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792"
+d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116
+q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
+ <glyph glyph-name="_536" unicode="&#xf23b;"
+d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+ <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296"
+d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5
+q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5
+q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42
+q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37
+q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5
+q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139
+q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8
+t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132
+q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132
+q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z
+M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86
+t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103
+q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4
+l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130
+t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150
+q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12
+q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
+ <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304"
+d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5
+t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5
+t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
+ <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792"
+d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348
+t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23
+t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96
+q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512
+q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
+ <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304"
+d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113
+v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+ <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304"
+d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
+h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+ <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304"
+d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
+h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+ <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304"
+d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
+h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+ <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304"
+d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23
+v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+ <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280"
+d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+ <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024"
+d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+ <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048"
+d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
+h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+ <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304"
+d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256
+v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
+ <glyph glyph-name="_549" unicode="&#xf249;"
+d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+ <glyph glyph-name="_550" unicode="&#xf24a;"
+d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68
+z" />
+ <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304"
+d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5
+t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88
+t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90
+t90 38h2048q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304"
+d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294
+t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z
+M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792"
+d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113
+zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304"
+d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64
+q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91
+t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5
+t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
+ <glyph glyph-name="_555" unicode="&#xf250;"
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5
+t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+ <glyph glyph-name="_556" unicode="&#xf251;"
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
+ <glyph glyph-name="_557" unicode="&#xf252;"
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+ <glyph glyph-name="_558" unicode="&#xf253;"
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196
+h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+ <glyph glyph-name="_559" unicode="&#xf254;"
+d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87
+t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9
+h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
+ <glyph glyph-name="_560" unicode="&#xf255;"
+d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25
+q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27
+t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21
+q72 69 174 69z" />
+ <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792"
+d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33
+t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52
+h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
+ <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792"
+d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668
+q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17
+t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5
+t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5
+q0 -42 -23 -78t-61 -53l-310 -141h91z" />
+ <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048"
+d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32
+q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68
+q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
+ <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048"
+d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79
+t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24
+q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26
+l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" />
+ <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792"
+d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5
+q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5
+v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32
+v-384h32z" />
+ <glyph glyph-name="_566" unicode="&#xf25b;"
+d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181
+v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46
+q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5
+q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308
+q0 -53 37.5 -90.5t90.5 -37.5h668z" />
+ <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973"
+d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5
+t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141
+q13 0 22 -8.5t10 -20.5z" />
+ <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792"
+d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109
+t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640
+q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792"
+d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78
+q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5
+t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376
+q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191
+t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
+ <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048"
+d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+ <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792"
+d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191
+t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304"
+d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57
+t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197
+t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5
+t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5
+t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5
+q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
+ <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280"
+d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5
+t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94
+q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
+ <glyph glyph-name="_574" unicode="&#xf264;"
+d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32
+q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5
+zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720"
+d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33
+l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+ <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304"
+d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540
+q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81
+l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
+ <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792"
+d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640
+q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5
+t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5
+t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5
+t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191
+t191 -286t71 -348z" />
+ <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792"
+d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962
+q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
+ <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792"
+d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5
+q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5
+q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
+ <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792"
+d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339
+q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z
+" />
+ <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792"
+d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606
+q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z
+M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
+ <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048"
+d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23
+v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792"
+d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34
+h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100
+q-68 175 -180 287z" />
+ <glyph glyph-name="_584" unicode="&#xf26e;"
+d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6
+q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13
+q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249
+q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183
+q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46
+t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
+ <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792"
+d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z
+M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30
+q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57
+t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133
+q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
+ <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792"
+d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9
+h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224
+v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
+ <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792"
+d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23
+t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47
+t47 -113v-96h128q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792"
+d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z
+M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
+q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792"
+d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23
+t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47
+t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+ <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792"
+d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+ <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024"
+d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249
+q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+ <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792"
+d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768
+q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+ <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048"
+d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173
+v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+ <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792"
+d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472
+q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+ <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792"
+d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5
+t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37
+t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+ <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792"
+d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5
+t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5
+t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51
+t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
+ <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024"
+d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+ <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792"
+d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246
+q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+ <glyph glyph-name="f27e" unicode="&#xf27e;"
+d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+ <glyph glyph-name="uniF280" unicode="&#xf280;"
+d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72
+h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275
+l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
+ <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792"
+d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5
+l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44
+t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106
+q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
+ <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792"
+d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53
+q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
+ <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304"
+d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
+ <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792"
+d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308
+t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20
+t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" />
+ <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792"
+d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
+ <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792"
+d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96
+q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5
+q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96
+q16 0 16 -16z" />
+ <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304"
+d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96
+q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5
+t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
+ <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792"
+d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348
+t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304"
+d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22
+q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5
+q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13
+q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
+ <glyph glyph-name="_610" unicode="&#xf28a;"
+d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83
+t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20
+q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5
+t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
+ <glyph glyph-name="_611" unicode="&#xf28b;"
+d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103
+t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_612" unicode="&#xf28c;"
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
+t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
+ <glyph glyph-name="_613" unicode="&#xf28d;"
+d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
+t103 -385.5z" />
+ <glyph glyph-name="_614" unicode="&#xf28e;"
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
+t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
+ <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792"
+d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5
+t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+ <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048"
+d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5
+t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416
+q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441
+h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
+ <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792"
+d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12
+q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311
+q15 0 25 -12q9 -12 6 -28z" />
+ <glyph glyph-name="_618" unicode="&#xf293;"
+d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5
+t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
+ <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024"
+d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
+ <glyph glyph-name="_620" unicode="&#xf295;"
+d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5
+t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
+t271.5 -112.5t112.5 -271.5z" />
+ <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792"
+d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" />
+ <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792"
+d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111
+q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" />
+ <glyph glyph-name="_623" unicode="&#xf298;"
+d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14
+t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" />
+ <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792"
+d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57
+q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285
+q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" />
+ <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792"
+d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42
+q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
+M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298
+t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="_626" unicode="&#xf29b;"
+d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300
+l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z
+M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" />
+ <glyph glyph-name="_627" unicode="&#xf29c;"
+d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5
+t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5
+t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5
+t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408"
+d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457
+q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521
+q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661
+q3 -1 7 1t7 4l3 2q11 9 11 17z" />
+ <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304"
+d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10
+t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5
+t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5
+h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96
+t9.5 -70.5z" />
+ <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408"
+d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5
+q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127
+l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272
+t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249
+q-18 -19 -45 -19z" />
+ <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176"
+d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352
+q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864
+q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136
+t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56
+t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56
+t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136
+t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" />
+ <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792"
+d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z
+M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72
+t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45
+t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4
+q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" />
+ <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304"
+d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55
+q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5
+q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101
+q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35
+q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5
+q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" />
+ <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792"
+d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19
+t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74
+t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233
+l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" />
+ <glyph glyph-name="uniF2A5" unicode="&#xf2a5;"
+d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2
+q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10
+q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5
+t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535"
+d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5
+l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5
+q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9
+q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" />
+ <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664"
+d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37
+t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
+l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148
+q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26
+l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" />
+ <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792"
+d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5
+q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841
+q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5
+q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" />
+ <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280"
+d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5
+q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z
+M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" />
+ <glyph glyph-name="uniF2AA" unicode="&#xf2aa;"
+d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z
+M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5
+q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
+t84.5 -203.5z" />
+ <glyph glyph-name="uniF2AB" unicode="&#xf2ab;"
+d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114
+q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5
+t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
+t103 -385.5z" />
+ <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664"
+d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35
+q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5
+t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" />
+ <glyph glyph-name="uniF2AD" unicode="&#xf2ad;"
+d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115
+q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15
+t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960
+q119 0 203.5 -84.5t84.5 -203.5z" />
+ <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304"
+d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7
+q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158
+q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" />
+ <glyph glyph-name="uniF2B0" unicode="&#xf2b0;"
+d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104
+q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108
+l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z
+M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
+ <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664"
+d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5
+t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" />
+ <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792"
+d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5
+t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114
+q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50
+q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5
+t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46
+q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5
+q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177
+t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" />
+ <glyph glyph-name="uniF2B3" unicode="&#xf2b3;"
+d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110
+h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+ <glyph glyph-name="uniF2B4" unicode="&#xf2b4;"
+d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5
+q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304"
+d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66
+l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180
+q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z
+M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421
+q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" />
+ <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792"
+d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107
+t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39
+q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" />
+ <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792"
+d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5
+l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5
+h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94
+q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" />
+ <glyph glyph-name="uniF2B8" unicode="&#xf2b8;"
+d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465
+l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161
+q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74
+q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" />
+ <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664"
+d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576
+q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216
+q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" />
+ <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664"
+d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5
+t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96
+q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216
+q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" />
+ <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048"
+d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z
+M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568
+q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9
+h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048"
+d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925
+q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568
+q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5
+t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113
+t113 47h1728q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792"
+d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5
+t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792"
+d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61
+t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" />
+ <glyph glyph-name="uniF2C0" unicode="&#xf2c0;"
+d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5
+t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145
+q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" />
+ <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280"
+d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5
+t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352
+q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048"
+d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56
+t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23
+v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728
+q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048"
+d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z
+M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64
+q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47
+h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792"
+d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117
+q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5
+t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" />
+ <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304"
+d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21
+t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46
+t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54
+t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29
+q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5
+t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314
+q2 -42 2 -64z" />
+ <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792"
+d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
+t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024"
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+ <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024"
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+ <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024"
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+ <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024"
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+ <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024"
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z
+M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
+ <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920"
+d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41
+t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19
+t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768
+q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19
+t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384
+q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" />
+ <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792"
+d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9
+t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9
+t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42
+q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9
+t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23
+t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" />
+ <glyph glyph-name="uniF2CE" unicode="&#xf2ce;"
+d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5
+t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70
+q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20
+q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5
+t72.5 -263.5z" />
+ <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792"
+d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792"
+d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048"
+d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47
+t47 -113z" />
+ <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792"
+d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10
+l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792"
+d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
+l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792"
+d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794"
+d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12
+t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5
+t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5
+q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5
+q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34
+q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5
+t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" />
+ <glyph glyph-name="uniF2D7" unicode="&#xf2d7;"
+d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89
+q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5
+t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" />
+ <glyph glyph-name="uniF2D8" unicode="&#xf2d8;"
+d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7
+t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5
+h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113
+v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" />
+ <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176"
+d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584
+q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5
+q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15
+q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82
+q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104
+t302 11t306.5 -97q220 -115 333 -336t87 -474z" />
+ <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792"
+d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178
+q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199
+t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297
+t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208
+t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" />
+ <glyph glyph-name="uniF2DB" unicode="&#xf2db;"
+d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16
+q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28
+t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32
+q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16
+h48q16 0 16 -16z" />
+ <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664"
+d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45
+t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33
+q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313
+l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106
+q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" />
+ <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792"
+d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321
+q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" />
+ <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792"
+d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62
+t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71
+t286 -191t191 -286t71 -348z" />
+ <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920"
+d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3
+t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53
+q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5
+q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5
+t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5
+q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z
+M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21
+q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16
+q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" />
+ <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792"
+ />
+ <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792"
+ />
+ </font>
+</defs></svg>
diff --git a/dashboard/public/fonts/fontawesome-webfont.ttf b/dashboard/public/fonts/fontawesome-webfont.ttf
new file mode 100644
index 00000000..35acda2f
--- /dev/null
+++ b/dashboard/public/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/dashboard/public/fonts/fontawesome-webfont.woff b/dashboard/public/fonts/fontawesome-webfont.woff
new file mode 100644
index 00000000..400014a4
--- /dev/null
+++ b/dashboard/public/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/dashboard/public/fonts/fontawesome-webfont.woff2 b/dashboard/public/fonts/fontawesome-webfont.woff2
new file mode 100644
index 00000000..4d13fc60
--- /dev/null
+++ b/dashboard/public/fonts/fontawesome-webfont.woff2
Binary files differ
diff --git a/dashboard/public/fonts/icon-orange.eot b/dashboard/public/fonts/icon-orange.eot
new file mode 100644
index 00000000..6561ccce
--- /dev/null
+++ b/dashboard/public/fonts/icon-orange.eot
Binary files differ
diff --git a/dashboard/public/fonts/icon-orange.svg b/dashboard/public/fonts/icon-orange.svg
new file mode 100644
index 00000000..72d0d46c
--- /dev/null
+++ b/dashboard/public/fonts/icon-orange.svg
@@ -0,0 +1,672 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="orange" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="0" d="" />
+<glyph unicode="&#xe62d;" glyph-name="popout-care" d="M350.519-19.028c-247.778 111.974-358.033 403.379-246.618 651.268l-83.422 37.696c112.124 248.098 404.134 358.319 652.233 246.195 247.774-111.987 358.029-403.379 246.626-651.268l83.396-37.696c-112.111-248.081-404.122-358.319-652.216-246.195z" />
+<glyph unicode="&#xe62e;" glyph-name="popout-family" d="M973.086 322.496c-19.368-19.368-42.173-33.185-66.445-41.504 10.562-22.439 16.49-47.482 16.49-73.923 0-96.018-77.83-173.848-173.84-173.848-27.388 0-53.284 6.355-76.33 17.634-8.397-23.333-21.915-45.235-40.611-63.935-67.896-67.896-177.965-67.888-245.852 0-19.368 19.368-33.185 42.169-41.504 66.441-22.439-10.562-47.482-16.49-73.927-16.49-96.018-0.004-173.844 77.83-173.844 173.844 0 27.388 6.355 53.28 17.634 76.33-23.337 8.393-45.235 21.91-63.935 40.611-67.896 67.888-67.896 177.961 0 245.857 19.364 19.36 42.164 33.181 66.436 41.5-10.562 22.435-16.49 47.482-16.49 73.923 0 96.014 77.83 173.848 173.848 173.848 27.388 0 53.28-6.351 76.326-17.634 8.397 23.333 21.915 45.235 40.611 63.927 67.896 67.9 177.965 67.896 245.857 0.012 19.364-19.368 33.185-42.173 41.5-66.445 22.439 10.558 47.482 16.49 73.923 16.49 96.022 0 173.848-77.834 173.852-173.84 0-27.388-6.355-53.288-17.638-76.334 23.333-8.397 45.235-21.915 63.931-40.611 67.9-67.896 67.896-177.961 0.008-245.852z" />
+<glyph unicode="&#xe62f;" glyph-name="popout-fun" d="M937.64 447.977c53.404 54.355 86.383 128.83 86.383 211.004 0 166.262-134.771 301.019-301.019 301.019-82.187 0-156.657-32.987-210.977-86.387-54.328 53.4-128.799 86.387-210.99 86.387-166.244 0-301.037-134.757-301.037-301.019 0-82.173 33.001-156.648 86.401-211.004-53.4-54.288-86.401-128.772-86.401-210.958 0-166.244 134.793-301.019 301.037-301.019 82.191 0 156.662 32.987 210.99 86.396 54.319-53.409 128.79-86.396 210.977-86.396 166.248 0 301.019 134.775 301.019 301.019 0 82.187-32.978 156.671-86.383 210.958z" />
+<glyph unicode="&#xe630;" glyph-name="popout-home" d="M1024 693.989v-757.989h-1024v757.989l512 266.011 512-266.011z" />
+<glyph unicode="&#xe631;" glyph-name="popout-money" d="M1024 156.996c-98.336 59.583-164.073 167.609-164.073 291.001 0 123.383 65.738 231.409 164.073 291.001v221.001h-1024v-1024h1024v220.996z" />
+<glyph unicode="&#xe632;" glyph-name="popout-on-the-move" d="M512.771 956.407v0c380.218 0 752.631-348.924 315.639-764.703-215.067-204.629-315.639-253.669-315.639-253.669s-100.572 49.040-315.639 253.669c-436.992 415.78-64.579 764.703 315.639 764.703z" />
+<glyph unicode="&#xe633;" glyph-name="popout-tariff" d="M104.355 138.222l-71.208-184.934 191.191 71.127c81.991-55.79 181.017-88.415 287.662-88.415 282.77 0 512.004 229.23 512.004 512s-229.234 512-512.004 512c-282.77 0-512-229.23-512-512 0-116.427 38.89-223.766 104.355-309.778z" />
+<glyph unicode="&#xe634;" glyph-name="popout-tech" d="M0 676.315l283.978 283.685h740.017v-738.342l-285.952-285.658h-738.044v740.315z" />
+<glyph unicode="&#xe635;" glyph-name="popout-wellbeing" horiz-adv-x="1027" d="M1.498 575.861c-17.854 255.319 126.707 384.139 283.168 384.139 93.378 0 176.121-47.567 227.782-120.947h1.711c51.662 73.38 134.418 120.947 227.8 120.947 156.456 0 301.027-128.82 283.164-384.139-26.783-382.988-320.524-639.861-511.817-639.861-191.289 0-485.038 256.872-511.808 639.861z" />
+<glyph unicode="&#xe636;" glyph-name="popout-work" d="M1023.869-62.513h-1022.067v893.526h343.788c19.439 74.222 86.941 128.987 167.247 128.987 80.311 0 147.813-54.765 167.243-128.987h343.788v-893.526z" />
+<glyph unicode="&#xe637;" glyph-name="frame-family" d="M892.89 547.418c-15.443 15.436-33.542 26.606-52.825 33.534 9.335 19.045 14.576 40.438 14.576 63.070-0.007 79.308-64.298 143.599-143.624 143.599-21.837 0-42.515-4.898-61.050-13.615-6.871 20.049-18.297 38.881-34.282 54.884-56.094 56.072-147.016 56.072-203.099-0.004-15.443-15.447-26.609-33.538-33.545-52.814-19.041 9.317-40.427 14.562-63.055 14.562-79.315 0-143.613-64.298-143.613-143.613 0-21.837 4.906-42.529 13.63-61.058-20.056-6.882-38.899-18.293-54.891-34.286-56.076-56.083-56.076-147.012 0-203.088 15.458-15.447 33.545-26.609 52.821-33.552-9.317-19.034-14.569-40.427-14.569-63.052 0-79.311 64.287-143.613 143.609-143.606 21.848 0 42.533 4.884 61.068 13.623 6.878-20.049 18.286-38.888 34.289-54.891 56.076-56.080 146.994-56.091 203.085 0 15.443 15.45 26.613 33.542 33.556 52.825 19.030-9.324 40.427-14.573 63.048-14.573 79.304 0 143.609 64.298 143.609 143.606 0 21.848-4.895 42.533-13.623 61.065 20.042 6.878 38.881 18.293 54.884 34.286 56.076 56.091 56.076 147.009 0 203.099zM1024.004-64h-1024.004v1024h1024.004v-1024z" />
+<glyph unicode="&#xe638;" glyph-name="frame-fun" d="M853.142 447.989c42.804 43.566 69.236 103.258 69.236 169.121 0 133.26-108.020 241.268-241.268 241.268-65.873 0-125.562-26.44-169.099-69.24-43.544 42.8-103.233 69.24-169.11 69.24-133.245 0-241.283-108.009-241.283-241.268 0-65.862 26.45-125.554 69.251-169.121-42.8-43.512-69.251-103.211-69.251-169.084 0-133.245 108.038-241.268 241.283-241.268 65.877 0 125.565 26.44 169.11 69.247 43.537-42.808 103.226-69.247 169.099-69.247 133.249 0 241.268 108.023 241.268 241.268 0 65.873-26.432 125.572-69.236 169.084zM1024-64h-1024v1024h1024v-1024z" />
+<glyph unicode="&#xe639;" glyph-name="frame-home" d="M1023.996 960h-1023.996v-1024h1023.996v1024zM921.599 644.791v-606.389h-819.197v606.389l409.599 212.808 409.599-212.808z" />
+<glyph unicode="&#xe63a;" glyph-name="frame-money" d="M921.598 215.199c-78.668 47.666-131.258 134.087-131.258 232.801 0 98.707 52.59 185.127 131.258 232.801v176.801h-819.199v-819.199h819.199v176.797zM1024-64h-1024v1024h1024v-1024z" />
+<glyph unicode="&#xe63b;" glyph-name="frame-on-the-move" d="M511.995 858.447c-305.75 0-605.206-280.578-253.81-614.924 172.938-164.55 253.81-203.976 253.81-203.976s80.875 39.426 253.814 203.976c351.396 334.346 51.922 614.924-253.814 614.924zM1024-64h-1024v1024h1024v-1024z" />
+<glyph unicode="&#xe63c;" glyph-name="frame-tariff" d="M185.327 199.768l-57.059-148.209 153.208 56.994c65.704-44.697 145.059-70.837 230.522-70.837 226.606 0 410.282 183.683 410.282 410.289 0 226.603-183.676 410.286-410.282 410.286-226.595 0-410.296-183.683-410.296-410.286 0-93.303 31.168-179.334 83.625-248.238zM1024.004-64h-1024.004v1024h1024.004v-1024z" />
+<glyph unicode="&#xe63d;" glyph-name="frame-tech" d="M0-64h1024v1024h-1024v-1024zM102.398 630.654l227.186 226.944h592.014v-590.674l-228.761-228.523h-590.439v592.252z" />
+<glyph unicode="&#xe63e;" glyph-name="frame-wellbeing" d="M0-64h1024.004v1024h-1024.004v-1024zM102.431 550.315c-14.287 204.309 101.398 307.394 226.598 307.394 74.724 0 140.936-38.064 182.277-96.785h1.373c41.337 58.72 107.564 96.785 182.288 96.785 125.2 0 240.893-103.085 226.598-307.394-21.436-306.477-256.491-512.036-409.573-512.036-153.074 0-388.14 205.559-409.562 512.036z" />
+<glyph unicode="&#xe63f;" glyph-name="frame-work" d="M1023.996 960h-1023.996v-1024h1023.996v1024zM921.595 38.405h-819.204v716.166h275.553c15.584 59.493 69.684 103.388 134.054 103.388 64.366 0 118.477-43.895 134.047-103.388h275.55v-716.166z" />
+<glyph unicode="&#xe640;" glyph-name="frame-care" d="M1024 960h-1024v-1024h1024v1024zM379.938 64.657c-203.146 91.807-293.543 330.708-202.195 533.937l-68.387 30.915c91.919 203.395 331.322 293.756 534.724 201.834 212.928-96.239 290.368-337.752 202.206-533.937l68.355-30.904c-91.908-203.391-331.3-293.764-534.702-201.845z" />
+<glyph unicode="&#xe900;" glyph-name="2for1cinematicket" d="M600.474 858.010c-16.896-12.186-32.87-23.962-35.738-26.010-8.397-6.246-70.144-50.995-78.848-57.139-2.253-1.536-18.33-13.21-35.84-25.907-17.408-12.698-50.381-36.557-73.216-53.146-22.835-16.486-43.725-31.744-46.592-33.792-8.192-6.042-53.965-39.219-56.832-41.165-1.434-0.922-10.138-7.27-19.456-14.029-9.318-6.861-22.221-16.179-28.672-20.89l-11.776-8.397 17.203-0.307c9.421-0.102 24.781-0.102 34.099 0l16.896 0.307-4.096 5.837-4.198 5.837 15.872 11.571c19.456 14.131 25.395 18.227 25.702 17.92 1.024-1.024 24.678-33.894 26.829-37.274l2.765-4.301 505.344-0.102-10.547 14.643c-5.837 7.987-14.643 20.173-19.558 27.034l-8.909 12.493-8.397-4.506c-11.571-6.144-21.299-8.806-34.509-9.216-23.040-0.819-42.086 6.758-57.856 22.938-9.933 10.138-16.998 23.654-19.968 37.99-1.638 8.294-1.126 24.883 1.126 33.792 3.584 14.131 14.234 31.642 24.371 39.731 2.253 1.843 4.198 3.789 4.198 4.301s-15.77 22.733-35.021 49.357c-19.251 26.624-39.117 54.17-44.134 61.235s-9.318 12.902-9.421 13.107c-0.102 0.102-14.029-9.728-30.822-21.914zM641.024 822.784c14.336-19.866 14.438-19.968 12.083-21.504-1.229-0.819-10.547-7.578-20.685-14.95l-18.432-13.517-5.734 7.885c-16.384 22.426-23.552 32.666-23.552 33.485 0.102 1.434 40.346 30.106 41.165 29.286 0.41-0.41 7.168-9.728 15.155-20.685zM578.56 778.138c7.987-11.059 14.131-20.48 13.619-20.89-2.56-2.458-39.322-28.672-40.141-28.672-0.512 0-6.554 7.987-13.517 17.715-6.861 9.626-13.414 18.637-14.541 19.866-1.024 1.229-1.638 2.662-1.331 3.174s3.379 2.97 6.758 5.427c3.482 2.458 12.288 8.909 19.763 14.438 7.373 5.427 13.824 9.626 14.234 9.421 0.41-0.307 7.27-9.523 15.155-20.48zM515.584 734.208c7.782-10.65 14.234-19.968 14.541-20.582 0.41-1.126-38.4-30.106-40.346-30.106-0.512 0-3.891 4.198-7.475 9.421-3.686 5.12-7.782 10.854-9.216 12.8s-5.018 6.861-7.885 10.957l-5.427 7.578 9.011 6.554c4.915 3.584 10.957 7.987 13.517 9.83 2.56 1.741 7.782 5.53 11.674 8.397 3.891 2.765 7.27 5.018 7.373 4.813 0.102-0.102 6.554-8.909 14.234-19.661zM454.554 687.718l14.336-19.968-6.349-4.608c-3.584-2.56-10.24-7.475-14.95-10.854s-11.059-8.090-14.234-10.445l-5.734-4.198-3.072 4.198c-1.638 2.355-4.71 6.656-6.758 9.421-2.15 2.867-7.475 10.24-12.083 16.486l-8.192 11.469 20.582 14.95c11.366 8.192 20.992 14.541 21.402 14.131s7.168-9.626 15.053-20.582zM391.68 643.789c7.885-11.059 14.336-20.378 14.336-20.787 0-1.126-39.526-29.696-40.55-29.389-0.512 0.205-7.373 9.318-15.258 20.275-13.722 18.944-14.336 19.968-12.595 21.606 1.024 0.922 8.806 6.656 17.203 12.698 8.499 6.144 16.794 12.083 18.432 13.414 1.741 1.331 3.277 2.458 3.584 2.355 0.307 0 6.963-9.011 14.848-20.173zM164.352 542.003c-21.914-15.667-43.008-30.618-46.797-33.382l-6.861-5.018 7.885-10.854c11.878-16.384 42.291-57.856 53.453-72.909 5.325-7.27 12.698-17.306 16.282-22.221l6.554-8.909 3.686 1.536c2.048 0.922 4.301 1.843 5.018 2.15 0.922 0.41 1.229 9.728 1.229 41.882 0 22.733-0.307 41.37-0.614 41.37-0.41 0-6.349-4.096-13.312-9.216-6.963-5.018-13.005-9.216-13.517-9.216-1.126 0-29.798 39.117-29.594 40.448 0 0.614 9.318 7.578 20.48 15.667l20.378 14.541 7.782-10.752 7.885-10.752 0.307 16.486c0.102 9.011 0.102 23.45 0 32.051l-0.307 15.565-39.936-28.467zM230.4 473.702v-76.595l7.066-0.717c32.256-3.174 58.778-25.702 67.277-57.139 2.458-8.909 2.56-29.696 0.102-38.502-3.482-12.902-10.547-25.293-19.866-34.509-14.131-14.131-32.973-22.528-51.712-22.938l-2.867-0.102v-153.6h640v153.19l-8.909 1.126c-22.426 2.867-42.291 14.95-54.682 33.28-17.306 25.498-17.408 60.109-0.102 85.606 13.926 20.378 37.171 33.382 60.928 33.894l2.765 0.102v153.6h-640v-76.698zM307.2 499.2v-25.6h-51.2v51.2h51.2v-25.6zM384 499.2v-25.6h-51.2v51.2h51.2v-25.6zM460.8 499.2v-25.6h-51.2v51.2h51.2v-25.6zM537.6 499.2v-25.6h-51.2v51.2h51.2v-25.6zM614.4 499.2v-25.6h-51.2v51.2h51.2v-25.6zM691.2 499.2v-25.6h-51.2v51.2h51.2v-25.6zM768 499.2v-25.6h-51.2v51.2h51.2v-25.6zM844.8 499.2v-25.6h-51.2v51.2h51.2v-25.6zM553.984 420.454c0-0.512 3.891-9.114 8.704-19.046s8.704-18.227 8.704-18.432c0-0.102 2.97-6.451 6.656-14.029l6.554-13.824 9.523-1.229c5.222-0.717 10.957-1.434 12.595-1.741 1.741-0.205 12.902-1.741 24.883-3.379 11.981-1.536 22.016-3.174 22.323-3.482s-10.752-11.878-24.678-25.805c-20.787-20.787-25.19-25.702-24.678-27.443 0.205-1.229 3.584-17.408 7.27-36.045 3.686-18.534 7.066-34.918 7.373-36.147 0.512-2.355 0.41-2.355-5.939 1.126-3.584 1.946-10.24 5.53-14.746 7.885-4.506 2.458-10.445 5.632-13.312 7.168-2.765 1.536-8.294 4.506-12.288 6.656-3.891 2.15-10.035 5.427-13.619 7.373l-6.349 3.482-6.451-3.482c-3.482-1.946-12.595-6.861-20.173-10.957-14.746-7.885-19.354-10.445-32.051-17.306-7.578-4.198-7.987-4.301-7.475-1.946 0.307 1.229 3.584 17.613 7.27 36.147 3.789 18.637 7.066 34.816 7.373 36.045 0.41 1.843-3.994 6.656-24.781 27.443-13.926 13.926-25.088 25.498-24.781 25.702 0.614 0.614 2.765 1.024 14.029 2.458 4.813 0.614 9.83 1.331 11.264 1.536 6.656 0.922 11.162 1.536 16.384 2.048 3.072 0.41 6.349 0.819 7.168 1.024s4.096 0.614 7.168 1.024c14.438 1.638 13.005 0.614 19.046 13.824 20.275 44.032 25.293 54.272 26.214 54.272 0.41 0 0.819-0.41 0.819-0.922zM307.2 140.8v-25.6h-51.2v51.2h51.2v-25.6zM384 140.8v-25.6h-51.2v51.2h51.2v-25.6zM460.8 140.8v-25.6h-51.2v51.2h51.2v-25.6zM537.6 140.8v-25.6h-51.2v51.2h51.2v-25.6zM614.4 140.8v-25.6h-51.2v51.2h51.2v-25.6zM691.2 140.8v-25.6h-51.2v51.2h51.2v-25.6zM768 140.8v-25.6h-51.2v51.2h51.2v-25.6zM844.8 140.8v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xe901;" glyph-name="3g" d="M694.784 731.443c-35.738-3.891-60.314-10.342-86.733-22.733-62.771-29.286-107.93-84.48-129.229-158.003-3.379-11.674-7.066-28.57-8.294-38.195-0.307-2.56-0.819-5.734-1.024-7.168-0.512-3.482-1.536-13.517-2.15-21.504-0.717-9.523-0.717-39.117 0-47.616 0.307-3.891 0.922-9.933 1.229-13.312 0.922-10.65 4.403-29.798 7.475-42.291 21.709-85.811 77.21-148.378 155.136-174.899 16.896-5.734 38.502-10.547 54.886-12.083 3.072-0.307 8.192-0.819 11.264-1.126 7.578-0.819 35.226-0.819 41.472 0 31.334 3.891 58.88 13.414 79.872 27.443 13.005 8.704 27.75 22.323 39.424 36.352l4.506 5.53 5.734-29.082 5.632-28.979 35.84-0.307c20.89-0.102 35.942 0.205 36.25 0.717s0.614 63.283 0.614 139.571v138.547l-217.293 0.512 0.102-42.189 0.102-42.291 114.278-0.512-0.614-4.915c-1.843-13.414-3.789-22.323-7.168-32.461-14.234-43.622-47.514-68.506-97.792-73.114-9.933-0.819-32.768-0.614-39.014 0.41-12.186 2.048-16.589 2.97-23.962 5.325-49.254 15.462-82.944 62.259-92.058 127.795-2.662 18.944-2.662 19.866-2.662 39.424-0.102 49.562 12.186 94.822 33.587 124.928 24.371 34.099 61.542 51.917 107.725 51.61 45.056-0.307 79.667-20.685 97.792-57.446 4.096-8.499 9.728-24.269 9.728-27.546 0-0.717 0.307-1.434 0.819-1.536 0.41 0 24.371-0.205 53.35-0.205 33.792-0.102 53.043 0.205 53.862 0.819 1.024 0.819 0.819 3.994-1.126 14.848-7.27 42.086-24.883 75.981-54.886 105.267-15.462 15.155-31.437 26.317-53.146 36.966-23.757 11.776-47.821 18.739-80.282 23.142-7.373 1.024-44.851 1.229-53.248 0.307zM251.802 719.974c-0.205-0.205-3.584-0.614-7.578-0.922-38.502-3.277-75.981-20.070-101.786-45.773-29.594-29.389-45.875-66.458-50.688-115.405l-1.229-12.595 6.144-0.102c23.859-0.205 91.034 0.102 91.443 0.41 0.205 0.307 0.614 4.301 0.819 9.011 2.253 40.96 22.63 69.939 55.296 78.336 10.24 2.662 34.202 2.662 43.52 0 17.203-5.018 32.563-15.565 41.165-28.365 10.957-16.282 12.595-46.49 3.482-64.102-9.421-18.432-33.178-31.642-62.566-34.918-3.379-0.41-13.619-0.717-22.835-0.717h-16.589v-72.192l13.107-0.102c29.594-0.205 44.237-1.946 59.187-7.066 12.083-4.096 19.354-8.499 27.546-16.794 12.8-12.902 17.306-26.419 17.203-51.302 0-11.162-0.512-16.077-2.253-22.323-7.578-28.57-28.877-48.333-59.29-54.989-12.288-2.765-35.123-2.253-46.182 0.922-32.768 9.626-53.862 35.533-60.928 74.957-1.331 7.373-2.56 17.306-2.662 20.89 0 0.717-16.794 1.024-48.333 0.922h-48.435l0.102-14.848c0.205-66.048 35.021-122.675 91.853-149.402 19.661-9.216 43.622-15.872 64.922-17.92 3.277-0.307 7.987-0.819 10.547-1.024 5.837-0.614 33.178-0.614 37.888-0.102 1.946 0.205 6.554 0.717 10.24 1.126 3.686 0.307 11.264 1.536 16.896 2.662s11.264 2.253 12.595 2.56c8.397 1.638 29.491 9.626 41.677 15.77 34.509 17.306 58.368 41.165 74.24 74.24 9.933 20.685 14.541 42.496 14.541 69.12 0 34.099-10.957 62.054-32.87 84.070-14.541 14.746-31.334 24.269-52.019 29.594-3.994 1.024-6.144 3.072-3.277 3.072 2.253 0 16.691 6.246 23.245 10.138 23.347 13.619 40.141 40.96 44.749 72.806 1.946 13.21 1.229 36.659-1.434 48.23-5.222 23.040-16.896 43.315-35.84 62.259-30.72 30.822-77.107 48.845-128.205 49.766-9.421 0.205-17.203 0.205-17.408 0.102z" />
+<glyph unicode="&#xe902;" glyph-name="4g" d="M691.2 731.034c-48.64-5.018-88.883-20.275-124.928-47.309-41.984-31.437-74.138-81.203-88.986-137.728-7.885-29.696-10.854-53.35-10.752-86.221 0-23.962 0.922-35.021 4.506-56.934 12.288-73.216 51.61-136.090 107.52-171.827 39.219-25.19 81.203-37.376 132.608-38.605 18.227-0.41 23.654-0.102 35.635 1.638 31.13 4.608 57.549 15.053 78.848 31.13 10.342 7.782 26.317 23.552 34.202 33.69 2.458 3.277 2.355 3.379 4.301-6.963 0.614-3.379 2.253-11.878 3.584-18.944 1.434-7.066 3.072-15.77 3.686-19.456s1.331-7.475 1.638-8.397c0.512-1.741 3.174-1.843 37.376-1.843h36.762v30.515c0.102 16.691 0.307 79.565 0.614 139.776l0.512 109.261h-219.238v-84.992h114.79l-0.717-5.325c-7.782-62.874-44.442-99.84-103.834-105.062-9.83-0.819-32.051-0.819-38.912 0.102-38.093 4.915-66.867 22.323-88.781 53.658-13.619 19.456-25.498 51.814-28.57 77.619-0.307 2.253-1.024 7.27-1.638 11.162-1.331 8.909-1.741 41.37-0.717 52.326 1.536 14.541 1.946 18.227 3.482 26.829 10.445 59.802 39.219 100.864 83.046 118.374 12.083 4.915 19.866 6.656 35.021 8.294 28.262 2.867 50.688-0.41 71.168-10.342 26.522-12.902 43.418-33.485 53.35-65.229l3.174-10.24h53.146c29.184-0.102 53.555 0.205 54.067 0.512 1.331 0.819 0.512 8.294-2.765 23.962-15.053 72.499-71.987 129.638-148.992 149.402-3.686 0.922-7.987 2.15-9.728 2.662-1.638 0.41-5.12 1.229-7.68 1.536-2.56 0.41-5.53 0.922-6.554 1.126-16.486 3.072-49.971 3.891-70.246 1.843zM262.349 663.859c-19.046-25.498-43.315-58.163-53.965-72.499-42.906-57.549-60.928-81.613-63.898-85.504-1.741-2.253-17.715-23.552-35.43-47.411l-32.256-43.213v-95.232h214.016v-116.736h98.304v117.76h66.56v84.992h-66.56v304.128h-92.16l-34.611-46.285zM290.816 493.056v-88.064h-133.12l16.179 21.811c8.909 11.878 25.088 33.69 36.045 48.333 10.854 14.643 25.6 34.509 32.768 44.032 7.066 9.626 20.378 27.443 29.491 39.731 9.114 12.186 17.101 22.221 17.613 22.221 0.717 0 1.024-30.413 1.024-88.064z" />
+<glyph unicode="&#xe903;" glyph-name="4g_cam" d="M768 742.502v-12.902l5.939-0.102c18.842-0.102 45.261-6.042 64.717-14.541 42.906-18.637 76.8-52.736 94.72-95.437 7.782-18.534 13.824-46.592 13.824-64.512v-4.608h25.907l-0.717 12.083c-4.608 76.8-51.2 143.872-121.446 175.002-23.552 10.445-46.592 15.974-72.397 17.306l-10.547 0.614v-12.902zM768 691.507v-12.8l8.806-0.717c37.888-2.867 71.475-21.402 94.208-51.814 11.776-15.872 21.299-38.605 23.552-56.832 0.41-3.379 0.819-6.554 0.922-7.168 0.102-0.512 0.307-3.482 0.307-6.349l0.205-5.427h25.907l-0.717 9.523c-0.819 11.981-2.253 20.685-4.813 30.106-17.101 63.795-72.602 109.158-138.854 113.562l-9.523 0.614v-12.698zM170.598 661.606c-5.734-2.15-10.957-6.758-13.926-12.493-2.458-4.71-2.56-5.837-2.867-26.214l-0.307-21.299h-76.698v-220.16c0-156.672 0.307-221.594 1.126-225.485 3.891-18.637 18.944-34.202 37.888-39.219 4.71-1.331 55.603-1.536 354.509-1.536h348.877l-0.205 223.437-0.307 223.539-2.662 6.349c-6.349 14.746-15.462 23.654-31.027 30.31l-5.222 2.253-498.176 0.512v19.866c0 21.504-0.717 25.293-5.734 31.949-1.536 1.946-4.915 4.813-7.475 6.349l-4.71 2.765-44.544 0.205c-36.147 0.205-45.261 0-48.538-1.126zM264.704 533.402c5.222-1.843 11.571-7.373 14.541-12.902 1.536-2.867 1.843-5.939 1.843-21.299 0-17.715 0-17.92-2.867-22.733-3.277-5.632-7.782-9.421-13.926-11.571-6.554-2.253-86.835-2.253-93.389 0-6.144 2.15-10.65 5.939-13.926 11.571-2.662 4.608-2.867 5.632-3.277 19.763-0.41 18.842 0.922 24.576 7.475 31.027 7.475 7.578 7.885 7.578 56.013 7.68 36.864 0.102 43.213-0.102 47.514-1.536zM531.968 521.421c34.816-7.27 63.078-22.938 87.347-48.333 24.371-25.498 39.219-56.013 44.646-91.648 1.331-9.011 1.536-37.888 0.307-45.056-0.307-1.434-1.024-5.734-1.638-9.626-4.198-24.781-19.456-56.218-37.376-76.8-26.624-30.515-58.368-48.23-100.454-56.115-11.981-2.253-42.701-1.638-56.422 1.024-32.051 6.349-61.030 21.402-84.070 43.52-28.262 27.238-45.466 61.44-50.381 100.045-1.434 11.059-0.614 38.81 1.434 49.152 8.090 41.574 28.467 75.366 60.928 101.478 22.323 17.92 52.941 30.72 82.432 34.611 13.312 1.741 39.526 0.614 53.248-2.253zM768 640.102v-12.902h3.482c6.042 0 18.227-2.765 25.702-5.837 27.443-11.264 46.797-39.014 47.514-68.096l0.102-2.867h25.907l-0.717 8.499c-2.048 24.166-12.493 46.49-29.798 63.693-17.101 17.203-39.526 27.648-63.795 29.696l-8.397 0.819v-13.005z" />
+<glyph unicode="&#xe904;" glyph-name="4G_Cam__Live_80" d="M53.76 688.64c-21.76-21.76-21.76-613.12 0-634.88s702.72-21.76 724.48 0c8.96 8.96 15.36 53.76 15.36 110.080v94.72l83.2-72.96c44.8-39.68 88.32-69.12 96-64 16.64 10.24 17.92 487.68 1.28 499.2-7.68 3.84-48.64-25.6-93.44-65.28l-80.64-71.68-6.4 93.44c-3.84 52.48-11.52 102.4-16.64 111.36-14.080 21.76-700.16 23.040-723.2 0zM128 396.8v-89.6h51.2c37.12 0 51.2-5.12 51.2-19.2 0-15.36-16.64-19.2-76.8-19.2h-76.8v108.8c0 99.84 2.56 108.8 25.6 108.8s25.6-8.96 25.6-89.6zM320 377.6c0-107.52 0-108.8-32-108.8s-32 1.28-32 108.8c0 107.52 0 108.8 32 108.8s32-1.28 32-108.8zM419.84 408.32c26.88-85.76 28.16-85.76 55.040 6.4 16.64 57.6 40.96 85.76 57.6 67.84 5.12-3.84-7.68-53.76-26.88-110.080-29.44-90.88-38.4-103.68-64-103.68-24.32 0-33.28 10.24-43.52 48.64-7.68 25.6-21.76 74.24-32 108.8-16.64 56.32-16.64 60.16 6.4 60.16 17.92 0 29.44-19.2 47.36-78.080zM729.6 467.2c0-14.080-15.36-19.2-57.6-19.2-48.64 0-57.6-3.84-57.6-25.6s8.96-25.6 51.2-25.6c37.12 0 51.2-5.12 51.2-19.2s-14.080-19.2-51.2-19.2c-42.24 0-51.2-3.84-51.2-25.6s8.96-25.6 57.6-25.6c42.24 0 57.6-5.12 57.6-19.2 0-15.36-17.92-19.2-83.2-19.2h-83.2v217.6h83.2c65.28 0 83.2-3.84 83.2-19.2z" />
+<glyph unicode="&#xe905;" glyph-name="4G_Cam_Camera_80" d="M780.8 768c0-6.4 23.040-17.92 49.92-25.6 57.6-15.36 110.080-70.4 122.88-128 10.24-43.52 32-52.48 32-11.52 0 51.2-53.76 125.44-108.8 152.32-57.6 28.16-96 33.28-96 12.8zM780.8 716.8c0-6.4 14.080-15.36 32-20.48 35.84-8.96 96-72.96 96-102.4 0-10.24 6.4-17.92 12.8-17.92 17.92 0 15.36 38.4-5.12 74.24-29.44 53.76-135.68 104.96-135.68 66.56zM128 659.2c0-26.88-6.4-32-38.4-32h-38.4v-234.24c0-165.12 5.12-239.36 15.36-249.6 11.52-11.52 115.2-15.36 390.4-15.36h375.040v234.24c0 165.12-5.12 239.36-15.36 249.6-11.52 11.52-93.44 15.36-288 15.36h-272.64v32c0 29.44-3.84 32-64 32s-64-2.56-64-32zM249.6 524.8c0-28.16-6.4-32-55.040-35.84-56.32-3.84-78.080 14.080-61.44 56.32 5.12 14.080 21.76 17.92 61.44 15.36 48.64-3.84 55.040-7.68 55.040-35.84zM588.8 514.56c85.76-62.72 96-177.92 20.48-253.44-81.92-81.92-193.28-67.84-261.12 33.28-97.28 144.64 98.56 323.84 240.64 220.16zM780.8 668.16c0-6.4 14.080-19.2 32-28.16 16.64-8.96 34.56-26.88 39.68-40.96 8.96-28.16 30.72-30.72 30.72-3.84 0 25.6-57.6 83.2-83.2 83.2-10.24 0-19.2-5.12-19.2-10.24z" />
+<glyph unicode="&#xe906;" glyph-name="4G_Cam_Inbox80" d="M366.080 875.52c-16.64-15.36-20.48-52.48-20.48-198.4v-177.92h-172.8l154.88-153.6c107.52-106.24 165.12-153.6 185.6-153.6 19.2 0 76.8 47.36 183.040 153.6l154.88 153.6h-172.8v176.64c0 224 2.56 220.16-170.24 220.16-94.72 0-126.72-5.12-142.080-20.48zM64 222.72c0-145.92 0-148.48 37.12-185.6l37.12-37.12h747.52l37.12 37.12c37.12 37.12 37.12 39.68 37.12 185.6v148.48h-128v-243.2h-640v243.2h-128v-148.48z" />
+<glyph unicode="&#xe907;" glyph-name="4G_Cam_Outbox_80" d="M326.4 742.4l-153.6-153.6h172.8v-176.64c0-224-2.56-220.16 168.96-220.16 166.4 0 163.84-2.56 163.84 221.44v175.36h172.8l-154.88 153.6c-112.64 110.080-163.84 153.6-185.6 153.6-21.76-1.28-76.8-46.080-184.32-153.6zM64 222.72c0-145.92 0-148.48 37.12-185.6l37.12-37.12h747.52l37.12 37.12c37.12 37.12 37.12 39.68 37.12 185.6v148.48h-128v-243.2h-640v243.2h-128v-148.48z" />
+<glyph unicode="&#xe908;" glyph-name="4G_Cam_Rec_80" d="M65.901 686.257c-21.545-21.545-21.545-607.050 0-628.594 20.277-20.277 671.683-21.545 708.436-2.535 20.277 11.406 24.079 27.881 24.079 108.99v95.050l76.040-67.168c41.822-36.752 83.644-67.168 92.515-67.168 11.406 0 16.475 62.099 19.010 244.594 3.802 283.881 5.069 282.614-110.257 177.426l-70.97-64.634-6.337 93.782c-3.802 51.96-11.406 101.386-16.475 110.257-13.941 21.545-693.228 22.812-716.040 0zM679.287 486.020c46.891-16.475 76.040-58.297 48.158-68.436-10.139-3.802-29.149 3.802-43.089 17.743-30.416 30.416-36.752 30.416-73.505 5.069-43.089-30.416-34.218-105.188 13.941-131.802 34.218-17.743 36.752-17.743 59.564 10.139 12.673 15.208 31.683 27.881 43.089 27.881 29.149 0 0-57.030-39.287-74.772-44.356-20.277-72.238-17.743-108.99 11.406-64.634 50.693-54.495 163.485 16.475 198.97 38.020 19.010 38.020 19.010 83.644 3.802zM283.881 465.743c24.079-22.812 26.614-57.030 6.337-77.307-10.139-10.139-10.139-21.545 0-39.287 20.277-38.020 17.743-78.574-5.069-78.574-10.139 0-19.010 6.337-19.010 12.673 0 46.891-22.812 76.040-57.030 76.040-27.881 0-31.683-5.069-31.683-44.356 0-35.485-5.069-44.356-25.347-44.356-22.812 0-25.347 8.871-25.347 107.723v107.723h68.436c45.624 0 76.040-6.337 88.713-20.277zM506.931 467.010c0-13.941-15.208-19.010-57.030-19.010-48.158 0-57.030-3.802-57.030-25.347s8.871-25.347 50.693-25.347c36.752 0 50.693-5.069 50.693-19.010s-13.941-19.010-50.693-19.010c-41.822 0-50.693-3.802-50.693-25.347s8.871-25.347 57.030-25.347c41.822 0 57.030-5.069 57.030-19.010 0-15.208-17.743-19.010-82.376-19.010h-82.376v215.446h82.376c64.634 0 82.376-3.802 82.376-19.010zM177.426 422.653c0-19.010 8.871-25.347 35.485-25.347 43.089 0 54.495 8.871 44.356 32.95-3.802 10.139-22.812 17.743-43.089 17.743-27.881 0-36.752-6.337-36.752-25.347z" />
+<glyph unicode="&#xe909;" glyph-name="4g_plus" d="M556.851 613.376c-0.205-0.205-3.379-0.614-7.066-0.922-22.221-2.15-42.598-8.090-64.922-19.149-36.762-18.125-63.59-45.568-82.432-84.378-12.186-25.088-19.558-50.995-22.221-78.848-1.024-10.342-1.024-44.544-0.102-55.091 4.301-46.080 23.962-91.955 52.429-122.573 23.962-25.702 56.73-44.544 91.238-52.634 16.282-3.789 25.498-4.813 45.056-5.222 48.435-1.126 83.866 14.029 112.23 47.821l4.915 5.837 0.922-4.813c0.614-2.662 2.048-10.138 3.277-16.589 1.126-6.451 2.662-14.541 3.379-17.92l1.229-6.144h27.955c15.462 0 28.262 0.41 28.57 0.819 0.307 0.512 0.717 49.357 1.024 108.646l0.41 107.725h-170.086v-66.048h34.099c18.637 0 38.707 0 44.442-0.102h10.547l-0.614-3.789c-2.355-16.486-5.12-26.112-10.342-36.659-5.12-10.035-8.806-15.053-16.179-22.426-11.981-11.571-28.16-19.149-46.080-21.606-2.765-0.41-6.246-0.922-7.68-1.126-6.144-1.024-27.853-0.41-36.352 1.126-16.486 2.867-27.955 7.885-41.062 17.715-13.107 9.933-22.323 21.299-30.106 37.376-11.469 23.757-15.872 45.67-15.872 78.541 0 39.117 7.885 69.222 24.678 94.72 14.746 22.323 40.858 38.195 67.584 41.062 33.075 3.482 59.085-4.096 77.722-22.528 9.011-9.011 15.053-18.944 19.968-33.178l3.686-10.854h82.842l-0.102 5.12c-0.512 18.227-10.138 44.954-23.654 65.331-8.192 12.39-25.702 30.31-37.683 38.707-30.822 21.504-67.994 32.563-109.261 32.358-8.909-0.102-16.282-0.205-16.384-0.307zM845.824 562.688v-38.912h-76.8v-51.2h76.8v-75.776h51.2v75.776h76.8v51.2h-76.8v77.824h-51.2v-38.912zM224.768 566.067c-12.39-16.691-30.106-40.55-39.424-52.941-9.318-12.493-32.154-43.213-50.79-68.198-18.739-25.088-39.322-52.736-45.875-61.44l-11.776-15.872-0.102-37.069v-37.171h165.888l0.205-45.261 0.307-45.261 37.581-0.102c24.269 0 37.786 0.41 37.99 1.024 0.205 0.512 0.307 21.197 0.307 45.875l-0.102 44.749h51.712v32.768c0 30.515-0.102 32.768-1.741 32.87-1.024 0.102-12.698 0.205-25.907 0.307l-24.064 0.102v236.032h-35.84l-35.84-0.102-22.528-30.31zM242.688 427.827v-68.403h-51.2c-37.478 0-51.098 0.307-50.79 1.126 0.205 0.614 9.318 13.107 20.173 27.648 10.854 14.643 26.931 36.25 35.738 48.026 8.704 11.878 22.323 30.106 30.208 40.755 7.885 10.547 14.643 19.149 15.053 19.149 0.512 0 0.819-30.72 0.819-68.301z" />
+<glyph unicode="&#xe90a;" glyph-name="4G-Cam-Compact" d="M451.686 804.659c-8.090-2.867-16.486-14.131-16.486-22.016 0-1.741-4.506-1.843-117.043-1.843-79.667 0-118.989-0.307-123.187-1.126-19.558-3.584-36.659-20.685-40.243-40.243-0.614-3.379-1.126-18.227-1.126-33.587v-27.443h25.6v-25.6h-25.6v-460.8h25.6v-25.6h-25.6v-27.443c0-15.36 0.512-30.208 1.126-33.587 3.482-19.251 20.173-36.147 39.629-40.243 7.578-1.536 625.971-1.638 634.675 0 18.534 3.379 34.509 18.33 39.424 36.966 1.638 6.349 1.946 11.162 1.946 35.84v28.467h-25.6v25.6h25.6v460.8h-25.6v25.6h25.805l-0.41 31.539c-0.41 29.594-0.614 31.744-2.765 36.966-6.758 16.282-18.637 27.341-34.304 31.846-3.789 1.024-7.066 1.946-7.27 1.946-0.307 0.102-53.658 0.102-118.682 0.102h-118.17l-0.614 4.608c-1.024 6.246-6.246 13.619-12.288 17.408l-5.018 3.072-57.446 0.205c-50.074 0.205-58.061 0-61.952-1.434zM544.768 598.63c69.018-13.312 123.802-64.717 140.8-132.198 1.434-5.325 2.765-11.366 3.072-13.312 0.205-1.946 0.922-6.349 1.434-9.728 1.434-9.114 0.614-40.448-1.331-50.688-2.662-14.234-5.53-24.371-10.342-36.454-23.142-58.061-73.933-99.226-136.192-110.592-10.854-1.946-39.629-2.662-50.688-1.331-69.325 8.806-126.566 54.784-148.89 119.706-6.963 20.378-9.318 35.226-9.318 58.88 0 22.835 2.662 39.322 9.626 58.675 14.848 41.574 44.032 76.186 82.534 97.69 19.558 10.957 47.821 19.763 69.632 21.606 12.083 1.126 38.4-0.102 49.664-2.253zM263.68 291.226c55.194-10.24 102.81-46.694 127.488-97.69 11.366-23.245 16.282-42.291 17.92-68.301l0.614-10.035h-25.702l-0.102 5.939c-0.102 12.083-3.482 30.618-8.192 44.134-20.992 60.621-77.21 101.581-141.926 103.424l-3.379 0.102v25.907l11.059-0.717c6.042-0.41 16.077-1.638 22.221-2.765zM255.795 240.538c24.371-4.813 46.694-16.896 64.717-35.123 22.835-22.938 34.918-49.254 37.376-81.51l0.717-8.704h-25.805l-0.102 4.403c-0.102 7.168-0.922 12.083-3.482 22.118-10.957 41.472-47.514 71.885-90.726 75.469l-8.090 0.717v25.498l9.011-0.614c4.915-0.41 12.288-1.434 16.384-2.253zM253.44 188.928c7.578-2.253 18.637-8.294 25.498-13.926 15.872-13.107 26.112-32.358 27.853-52.122l0.717-7.68h-25.498l-1.331 7.68c-3.789 22.835-23.040 40.755-45.67 42.701l-4.096 0.41-0.307 12.902c-0.205 11.674-0.102 13.005 1.536 13.312 2.15 0.512 15.462-1.638 21.299-3.277zM495.206 549.274c-28.058-3.686-52.634-15.974-73.421-36.762-15.36-15.36-25.088-31.027-31.539-51.098-4.71-14.438-5.734-21.709-5.632-40.038 0-14.643 0.41-18.33 2.662-27.648 3.994-15.872 8.806-27.238 16.896-40.141 5.734-9.114 7.27-10.957 18.739-22.323 16.486-16.486 35.123-27.136 56.934-32.666 12.493-3.174 13.312-3.277 28.058-3.686 37.376-1.024 67.891 10.957 94.31 37.376 18.022 17.92 28.16 36.045 34.406 61.44 2.355 9.318 2.765 13.107 2.765 27.648 0.102 27.341-5.12 46.49-19.046 68.915-6.349 10.138-7.578 11.571-19.251 23.245-17.818 17.818-39.936 29.594-64.41 34.509-9.318 1.741-31.744 2.458-41.472 1.229z" />
+<glyph unicode="&#xe90b;" glyph-name="1013_Reseau" d="M485.274 857.19c-0.205-0.205-5.837-0.717-12.39-1.024-6.656-0.41-13.107-0.922-14.336-1.126-1.331-0.205-5.12-0.614-8.499-1.024-41.882-4.506-87.45-15.565-127.283-30.822-50.483-19.456-95.642-46.285-133.837-79.667-25.907-22.733-51.2-52.531-68.71-81.101-22.938-37.376-37.171-78.643-41.882-121.754-1.331-12.39-1.536-51.61-0.205-57.344 0.307-1.126 0.819-4.813 1.229-8.192 1.741-15.974 6.042-33.587 12.902-54.272 25.293-75.162 84.378-142.746 165.274-189.133 26.214-15.053 60.006-30.003 88.883-39.322l11.981-3.891v-175.821l153.395 153.395 19.763 0.717c10.957 0.41 20.787 0.922 21.914 1.126s5.53 0.717 9.728 1.024c52.122 3.994 115.61 20.378 163.84 42.496 22.528 10.342 50.688 26.010 67.482 37.581 7.885 5.53 28.058 20.582 31.949 24.064 1.536 1.331 5.018 4.301 7.68 6.554 23.040 19.661 47.923 48.23 65.434 75.162 7.475 11.366 23.142 41.472 27.034 51.712 14.438 37.888 20.173 67.789 20.275 104.96 0.307 79.053-32.87 154.726-94.822 215.962-33.075 32.666-69.837 58.368-113.254 79.36-17.613 8.499-18.125 8.704-34.816 15.258-42.701 16.794-96.051 29.491-139.264 32.973-4.506 0.41-9.523 0.922-11.264 1.126-3.686 0.614-67.686 1.536-68.198 1.024zM528.589 752.333c13.312-4.403 22.221-12.902 32.563-30.822 3.686-6.451 7.68-13.312 8.806-15.36 41.267-70.554 99.43-170.394 100.762-172.646 1.024-1.638 4.198-7.168 7.168-12.288 2.97-5.018 6.144-10.547 7.168-12.288 0.922-1.638 5.837-9.933 10.752-18.432 10.547-17.92 28.16-48.128 36.045-61.747 3.072-5.325 6.554-12.186 7.578-15.36 7.885-22.733-1.536-48.128-22.528-60.621-12.8-7.578 1.024-7.168-204.902-7.168-201.523 0-189.44-0.307-202.547 5.632-11.878 5.427-23.45 20.685-26.829 35.226-2.458 10.752 0.307 26.419 6.554 37.069 1.434 2.458 3.789 6.554 5.222 9.114s3.072 5.325 3.584 6.144c1.126 1.638 6.758 11.264 35.84 61.44 3.789 6.451 22.221 38.093 40.96 70.144 18.739 32.154 36.557 62.771 39.731 68.096 3.072 5.325 8.704 15.053 12.493 21.504s11.878 20.275 18.022 30.72c6.042 10.445 13.107 22.63 15.77 27.136 8.499 14.746 11.878 19.354 17.306 24.269 5.939 5.427 14.029 9.728 21.914 11.674 6.963 1.843 21.094 1.126 28.57-1.434zM502.886 651.059c-6.246-2.253-12.698-8.909-14.95-15.667-1.741-5.427-1.741-10.65 0-34.816 0.614-8.909 1.434-21.811 2.048-34.304 0.307-5.632 0.717-12.8 1.024-15.872 0.205-3.072 0.717-10.65 1.024-16.896 0.41-6.144 0.819-13.824 1.024-16.896 0.307-3.072 0.717-11.571 1.126-18.944 0.717-14.336 1.946-18.944 5.734-21.402 3.994-2.56 10.957-3.482 17.408-2.15 10.342 2.048 11.674 4.506 12.595 25.088 0.41 7.578 0.819 15.667 1.024 17.92s0.614 9.626 0.922 16.384c0.307 6.758 0.819 14.848 1.126 17.92 0.205 3.072 0.717 10.035 1.024 15.36 1.126 20.070 1.434 24.371 2.253 35.84 1.331 20.070 1.024 31.744-1.024 35.635-6.349 11.878-19.866 17.203-32.358 12.8zM502.886 446.259c-8.909-3.174-16.486-14.131-16.486-23.962 0-4.915 2.355-11.366 5.734-15.872 8.806-11.469 27.034-12.698 37.376-2.355 5.325 5.325 7.066 9.011 7.782 16.589 0.512 5.53 0.205 7.168-2.253 12.288-5.939 12.493-19.046 17.92-32.154 13.312z" />
+<glyph unicode="&#xe90c;" glyph-name="about_event" d="M323.072 842.854c-11.264-3.584-19.456-10.65-24.474-21.094l-3.174-6.656-0.307-23.757-0.307-23.859h-179.098l0.307-326.861c0.205-310.579 0.307-327.27 2.048-332.902 5.837-19.046 16.998-34.099 33.075-44.749 6.554-4.301 11.366-6.451 23.45-10.445 3.379-1.024 70.144-1.331 369.459-1.638l365.261-0.205-0.205 326.861-0.307 326.963-2.15 6.656c-4.813 14.541-10.547 24.269-19.763 33.587-8.704 8.806-22.118 16.794-32.87 19.661-2.56 0.717-5.53 1.536-6.656 1.843s-27.955 0.819-59.597 0.922l-57.651 0.41v21.197c0 11.674-0.512 23.142-1.024 25.6-2.662 11.469-10.445 20.89-21.504 26.214-5.939 2.765-7.68 3.174-15.872 3.174s-9.933-0.307-15.974-3.174c-8.397-3.994-14.541-10.24-18.739-18.842l-3.174-6.656-0.307-23.757-0.41-23.859h-281.19l-0.41 23.859-0.307 23.757-3.174 6.656c-8.192 17.101-28.058 26.419-44.954 21.094zM298.598 662.016c4.096-8.499 10.445-14.848 18.842-18.842 5.939-2.867 7.68-3.174 15.872-3.174s9.933 0.307 15.872 3.174c8.499 4.096 14.848 10.445 18.842 18.842l3.174 6.656 1.024 60.416 6.656-6.758c19.251-19.354 23.654-48.128 11.162-73.421-10.138-20.685-33.178-35.021-56.218-35.021-36.864 0-66.662 31.334-64.205 67.482 1.126 16.589 6.963 29.696 18.432 41.267l6.349 6.451 1.024-60.416 3.174-6.656zM656.998 662.016c5.427-11.059 13.926-18.227 25.293-21.094 17.818-4.608 35.942 4.096 44.134 21.094l3.174 6.656 1.024 60.416 6.758-6.963c11.162-11.264 16.998-24.474 18.022-40.653 2.662-42.496-37.786-76.083-78.95-65.536-11.674 2.97-21.402 8.499-29.901 16.998-24.678 24.576-24.883 65.024-0.41 89.498l6.656 6.656 1.024-60.416 3.174-6.656zM836.096 533.299c7.475-3.891 11.469-7.475 15.667-13.824 6.758-9.933 6.349 3.686 6.349-217.088v-200.499l-662.016 0.512-5.632 2.662c-7.475 3.584-13.005 8.090-17.101 14.234-6.861 10.24-6.451-3.994-6.451 217.293v200.499l663.040-0.512 6.144-3.277zM495.616 485.171c-28.467-4.096-49.254-11.162-69.427-23.552-40.96-25.088-68.915-66.15-77.619-113.562-2.765-15.258-2.56-44.237 0.41-59.494 10.342-52.122 43.622-95.642 90.829-118.477 25.6-12.493 47.616-17.203 76.8-16.589 25.702 0.614 45.568 5.427 68.608 16.486 49.562 23.962 84.070 71.578 92.16 126.976 2.048 13.517 1.331 40.346-1.434 53.658-6.758 33.894-21.606 61.645-46.182 86.221-26.317 26.419-57.037 41.882-94.208 47.411-8.704 1.331-33.382 1.843-39.936 0.922zM524.595 443.29c10.854-3.686 18.432-14.541 18.227-26.214-0.205-19.149-18.432-31.744-36.762-25.498-17.818 6.042-23.859 29.286-11.366 43.52 7.885 8.909 18.944 11.981 29.901 8.192zM544.154 367.002c0.307-0.307 0.717-31.437 0.922-69.12 0.205-64 0.307-68.71 2.048-71.885 2.048-3.789 6.963-6.349 12.8-6.656 3.789-0.205 3.789-0.205 4.096-5.018l0.307-4.915h-90.214v4.506c0 4.915 0.102 5.018 7.68 6.246 2.253 0.307 5.222 1.536 6.554 2.662 5.018 4.096 5.222 8.192 5.018 67.482-0.307 48.64-0.512 55.194-2.048 58.573-1.946 4.301-5.427 6.349-12.288 7.373l-4.915 0.717v10.752l34.714-0.102c19.149 0 35.021-0.307 35.328-0.614z" />
+<glyph unicode="&#xe90d;" glyph-name="Accessability" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-62.976-50.893-109.875-117.043-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 5.12-29.594 15.667-64.512 28.058-93.184 35.021-81.306 96.358-152.269 172.032-198.758 57.856-35.635 126.771-58.163 193.024-63.078 13.824-1.024 58.368-1.024 69.632 0 47.821 4.403 88.064 14.029 129.741 30.925 20.992 8.602 48.026 22.323 64.819 33.075 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27 12.288 10.138 31.846 29.491 45.466 45.056 57.344 65.741 91.955 142.438 103.936 230.4 0.307 1.741 0.717 6.349 1.126 10.24 0.307 3.994 0.819 8.294 1.126 9.728 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-56.32 75.366-137.216 130.97-228.762 157.082-23.040 6.554-51.2 11.981-72.704 14.029-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM545.792 805.069c1.434-0.205 5.12-0.717 8.192-1.126 42.394-5.325 78.541-15.974 116.224-34.406 64.614-31.744 119.091-83.251 154.931-146.944 22.016-39.219 38.298-89.498 42.701-132.096 0.41-3.379 0.819-7.27 1.126-8.704 0.205-1.434 0.717-9.626 1.024-18.125l0.717-15.667h-256.307v-230.4h-76.8v153.6h-51.2v-153.6h-76.8v230.4h-256.205l0.614 14.131c1.638 39.526 9.318 77.722 22.63 112.538 5.427 14.131 4.608 12.186 13.619 31.027 30.822 63.795 82.022 118.17 144.589 153.805 38.912 22.118 83.968 37.581 125.952 43.213 1.946 0.307 5.222 0.717 7.168 1.024 1.946 0.205 7.27 0.819 11.776 1.126 4.506 0.41 8.397 0.922 8.602 1.126 0.41 0.41 54.272-0.41 57.446-0.922zM500.736 754.586c-13.005-2.662-22.528-6.451-31.744-12.698-14.848-10.138-25.702-25.088-30.925-42.803-3.072-10.445-3.277-28.877-0.41-39.834 7.066-27.648 30.31-49.971 58.47-55.91 9.114-1.946 26.419-1.638 35.328 0.717 35.226 9.318 59.392 42.906 57.037 78.95-0.717 10.65-2.56 18.227-6.451 26.726-9.83 21.606-28.058 36.762-52.122 43.315-4.506 1.331-25.19 2.355-29.184 1.536zM489.984 573.338c-20.787-4.71-35.533-12.902-50.176-27.546-14.029-14.029-21.811-27.75-27.341-48.128-1.536-5.53-2.15-11.981-2.56-28.365l-0.614-21.299h205.414l-0.614 21.299c-0.614 22.733-2.253 31.846-8.397 45.568-19.558 44.339-68.915 69.222-115.712 58.47z" />
+<glyph unicode="&#xe90e;" glyph-name="accessibility_cognition" d="M463.565 854.938c-0.102-0.102-4.813-0.41-10.445-0.717-112.128-6.758-213.504-81.92-252.928-187.597-13.722-36.864-19.046-67.994-18.432-108.032 0.41-23.859 1.126-31.232 4.71-50.176 7.168-38.195 23.654-78.029 45.363-109.568 6.554-9.421 15.974-39.834 18.534-59.392 0.307-2.56 1.024-7.782 1.434-11.776 0.512-3.891 1.024-59.904 1.024-124.314 0.102-103.014 0.307-117.862 1.741-123.392 4.608-17.818 18.125-31.846 35.738-37.069 5.734-1.741 15.36-1.843 153.395-1.946h147.149v63.693c0 35.123 0.307 63.795 0.819 63.898 0.41 0.102 29.798 0.205 65.229 0.307 58.573 0.205 65.126 0.41 70.656 2.048 16.179 4.813 27.648 15.667 34.611 32.666 2.253 5.222 2.253 6.554 2.765 80.077l0.512 74.752h28.672c26.726 0.102 28.979 0.307 33.28 2.253 9.216 4.301 15.36 13.619 15.36 23.347-0.102 8.806 3.277 3.584-59.085 91.648l-18.534 26.112-0.512 44.544c-0.307 24.474-0.819 46.592-1.229 49.152-6.246 45.466-18.739 82.432-39.731 117.248-32.768 54.477-81.613 96.461-140.39 120.832-19.558 8.090-49.050 16.077-68.198 18.534-2.56 0.307-5.632 0.717-6.963 0.922-6.963 1.126-43.52 2.765-44.544 1.946zM496.128 797.696c35.226-3.174 72.909-16.384 102.912-36.045 34.509-22.733 62.362-54.272 80.384-90.931 11.264-22.938 14.234-34.202 14.234-55.296 0.102-15.155-0.819-20.582-5.222-32.768-4.096-11.059-9.011-19.149-19.251-31.13-3.277-3.789-17.613-14.234-23.962-17.408-14.336-7.168-27.443-9.83-44.749-9.011-9.216 0.41-14.336 1.229-20.89 3.277-16.486 5.222-22.016 6.349-31.334 6.554-32.461 0.717-59.494-13.517-78.438-41.062-16.998-24.678-37.069-40.55-63.488-49.766-32.563-11.571-70.144-8.294-100.659 8.602-7.885 4.301-22.938 15.974-28.774 22.016-18.227 19.354-31.13 46.080-33.69 70.144-0.41 3.277-0.922 7.168-1.229 8.602s-0.717 11.981-0.922 23.552c-0.307 22.221 0.819 31.642 6.656 53.35 9.933 36.864 31.232 73.011 59.494 100.864 41.882 41.37 91.443 62.464 157.696 67.277 5.325 0.41 23.040-0.102 31.232-0.819z" />
+<glyph unicode="&#xe90f;" glyph-name="accessibility_dexterity" d="M310.682 799.232c-14.336-3.174-25.907-16.691-26.829-31.539-0.512-7.885 1.126-14.541 5.53-21.197 1.741-2.765 46.387-48.23 99.123-100.864 102.502-102.4 98.816-98.304 95.846-105.472-2.458-6.042-10.035-8.909-15.667-6.042-1.229 0.614-53.043 51.917-115.2 113.971-74.24 74.138-114.381 113.562-117.248 114.995-17.408 9.216-38.81 1.946-47.616-16.077-2.253-4.71-2.765-6.963-2.765-14.336 0-16.384-8.909-6.349 118.374-133.632 62.054-61.952 113.357-113.869 114.176-115.2 4.608-8.397-3.789-18.33-13.517-15.974-1.946 0.512-32.768 30.618-99.635 97.485-53.248 53.146-98.714 97.792-100.966 99.123-16.691 9.933-40.038 2.355-48.538-15.77-2.15-4.608-2.56-7.168-2.662-14.336 0-16.077-8.909-6.042 119.603-134.656 97.894-97.792 114.176-114.586 114.79-117.658 1.536-7.987-5.222-14.95-13.21-13.517-3.379 0.717-11.366 8.294-68.71 65.638-73.626 73.626-70.042 70.656-85.402 70.656-7.27 0-9.626-0.41-14.336-2.662-18.534-8.704-25.805-31.232-15.77-48.742 2.97-5.12 212.787-215.245 225.894-226.202 34.714-28.979 77.21-46.899 123.494-52.019 11.776-1.331 40.858-1.434 49.357-0.205 2.56 0.41 7.987 1.229 12.083 1.843l7.578 1.126 39.526-39.526c37.581-37.376 39.936-39.526 45.056-41.062 6.246-1.843 13.005-1.331 18.944 1.229 5.018 2.253 153.498 150.426 156.672 156.365 2.97 5.53 3.072 16.691 0.205 22.426-1.229 2.56-16.691 18.739-40.243 42.394l-38.298 38.298 0.819 3.789c0.41 2.048 0.819 4.403 0.922 5.222s0.41 3.174 0.819 5.12c2.048 11.264 2.867 37.786 1.638 49.766-0.41 3.891-1.024 9.83-1.331 13.21-1.024 9.523-5.222 28.672-8.806 39.936-8.704 27.136-20.48 49.357-38.707 73.216-8.499 11.162-165.581 168.653-173.261 173.773-24.474 16.384-58.778 4.71-68.506-23.245-4.198-12.083-3.584-23.757 1.946-35.533 3.072-6.349 6.963-10.65 47.616-51.507 34.202-34.304 44.442-45.261 45.056-47.718 1.536-7.782-5.018-14.438-13.107-13.414-3.891 0.512-11.264 7.68-125.542 121.856-79.667 79.667-122.88 122.061-125.542 123.392-7.066 3.482-16.589 4.813-23.654 3.277z" />
+<glyph unicode="&#xe910;" glyph-name="accessibility_hearing" d="M486.298 840.806c-0.205-0.205-3.891-0.614-8.090-1.024-39.322-3.277-82.33-17.818-117.76-39.834-45.773-28.467-85.606-74.138-105.165-120.422-0.819-1.946-1.434-6.144-1.434-9.318 0.102-22.528 22.63-37.274 43.008-28.16 8.090 3.686 11.981 8.090 18.944 21.709 29.389 57.446 83.558 98.714 146.125 111.514 16.486 3.277 23.245 3.994 41.882 3.994 25.702 0 38.81-1.741 61.133-8.192 34.099-9.933 66.355-29.491 92.16-55.91 10.752-10.957 17.306-19.251 26.112-32.666 6.451-9.83 19.251-34.202 19.251-36.659 0-0.614 0.922-3.277 2.15-5.939 3.072-7.373 8.806-30.106 10.65-42.906 3.174-21.402 2.355-50.278-2.048-72.090-5.632-27.648-18.637-57.651-33.69-77.619-8.499-11.162-17.715-23.245-42.701-55.603-7.68-9.83-16.384-21.197-19.456-25.19s-23.245-30.208-44.954-58.266c-21.709-28.058-41.779-54.067-44.544-57.754-5.018-6.554-27.546-35.738-37.99-49.254-2.867-3.686-13.824-17.92-24.371-31.744-22.016-28.57-26.010-33.075-35.635-39.526-47.104-31.539-109.875-5.632-121.856 50.278-0.614 2.97-1.229 20.992-1.331 43.11l-0.307 38.093-2.56 5.632c-7.475 16.282-25.395 22.835-41.267 15.053-7.885-3.891-12.902-9.523-15.565-17.306-1.741-5.222-1.843-9.011-1.741-44.134 0.205-38.502 0.41-42.906 3.174-55.296 12.8-57.446 59.392-100.864 117.146-109.056 28.672-3.994 57.446 0.614 83.354 13.517 9.011 4.506 13.414 7.373 23.757 15.36 10.445 7.987 17.51 15.667 33.894 36.966 7.27 9.421 16.384 21.197 20.275 26.317 3.994 5.12 26.317 34.099 49.664 64.41s46.694 60.416 51.712 67.072c5.12 6.554 21.402 27.75 36.352 47.104s28.058 36.352 29.184 37.786c1.126 1.536 10.752 14.029 21.402 27.853 21.914 28.365 26.624 35.533 36.454 55.808 24.269 50.176 32.358 104.55 23.962 160.768-2.15 14.336-8.090 37.888-12.902 51.2-9.318 25.907-28.262 59.29-45.363 79.872-45.158 54.579-103.731 87.45-175.104 98.406-9.011 1.434-54.784 3.072-55.91 2.048zM499.61 721.101c-0.205-0.307-3.174-0.717-6.554-1.024-20.582-1.946-45.773-10.752-64.512-22.426-30.618-19.251-54.886-50.586-65.843-84.787-5.427-17.101-6.656-24.576-6.963-44.544-0.307-22.323 1.434-33.997 8.294-54.579 7.066-21.197 7.885-25.088 8.294-39.117 0.41-15.667-0.922-22.835-7.68-42.906-8.192-23.962-8.704-41.165-2.048-60.109 9.523-27.136 30.208-47.002 56.73-54.682 48.742-14.131 98.509 16.589 108.032 66.56 1.536 7.68 1.536 22.938 0 30.31-3.584 18.432-12.186 34.202-25.19 46.592-8.192 7.68-14.029 11.469-26.624 17.408-14.643 6.861-24.166 13.517-33.178 23.142-12.39 13.21-19.251 26.317-23.654 44.851-2.662 11.264-2.15 32.358 1.126 44.032 8.806 32.461 34.816 58.163 67.482 66.765 13.619 3.686 33.382 3.789 46.182 0.512 34.202-9.011 60.006-34.918 69.222-69.427 1.434-5.325 1.843-10.854 1.946-22.426 0-17.306-0.819-21.606-7.782-38.605-3.174-7.987-4.096-11.674-4.096-16.589-0.102-9.933 4.608-19.149 12.8-24.986 11.366-8.192 27.546-7.066 38.605 2.662 7.27 6.349 16.691 30.618 20.378 52.019 13.21 78.541-35.84 155.034-113.152 176.026-5.018 1.434-12.39 2.97-16.384 3.584-7.373 1.126-34.611 2.458-35.43 1.741z" />
+<glyph unicode="&#xe911;" glyph-name="accessibility_mobility" d="M425.984 866.406c-32.256-5.939-59.494-26.419-74.035-55.398-19.149-38.195-11.981-85.606 17.408-115.814 15.155-15.77 28.365-23.347 51.507-29.696 5.12-1.434 10.445-1.843 22.528-1.843 14.029 0 16.998 0.307 26.010 2.765 58.061 15.872 89.907 75.366 70.758 132.403-10.65 31.642-37.274 56.422-70.349 65.536-11.981 3.174-32.154 4.198-43.827 2.048zM433.664 636.826c-11.059-2.253-14.131-3.072-19.456-5.222-18.33-7.68-34.099-23.347-41.37-41.062-5.939-14.438-5.734-9.523-5.734-120.013v-101.888l2.355-7.475c3.482-11.162 6.758-17.715 12.698-25.498 6.451-8.602 10.752-12.698 19.251-18.227 9.933-6.554 20.378-10.445 32.256-12.186 1.741-0.205 44.339-0.512 94.72-0.512l91.648-0.205 30.72-49.254c16.896-27.034 32.358-51.814 34.406-54.989 1.946-3.174 13.926-22.323 26.522-42.598 25.293-40.55 30.31-47.002 41.472-52.224 8.090-3.789 10.957-4.608 19.763-5.325 14.848-1.126 21.197 1.331 53.146 21.606l20.685 13.005-4.915 7.885c-2.662 4.301-19.558 31.437-37.478 60.109-17.92 28.774-33.997 54.579-35.84 57.344-1.843 2.867-15.667 24.986-30.72 49.152-15.053 24.269-28.467 45.67-29.696 47.616s-4.301 6.861-6.861 10.752c-11.571 18.33-13.722 21.402-18.944 26.112-6.554 5.939-15.872 10.65-24.269 12.186-3.994 0.717-29.082 1.126-71.987 1.126h-65.843v71.68h68.915c75.981 0 74.65-0.102 84.275 6.451 13.005 8.704 18.637 24.576 14.131 39.629-3.072 10.24-9.523 17.613-19.866 22.426l-5.632 2.662-141.824 0.614v8.704c0 37.478-24.474 68.301-60.416 76.288-7.885 1.741-20.685 2.355-26.112 1.331zM322.662 523.162c-81.818-40.858-134.554-117.453-144.282-209.306-0.922-9.011-0.922-39.424 0.102-50.074 4.608-50.688 25.702-101.069 59.494-141.926 12.902-15.565 38.4-38.707 54.067-48.947 32.256-20.992 61.952-33.178 97.587-40.038 18.637-3.584 21.914-3.789 45.568-4.198 27.75-0.41 41.779 1.229 68.096 7.885 34.304 8.602 64.717 23.347 94.208 45.773 9.421 7.168 12.39 9.83 25.6 23.040s21.299 22.835 30.31 35.942c6.042 8.602 18.33 29.696 18.33 31.232 0 0.512-5.222 9.216-11.469 19.251-6.349 10.138-15.258 24.371-19.763 31.744s-8.397 13.414-8.704 13.414c-0.307 0.102-2.048-4.608-3.891-10.342-3.994-12.595-15.462-36.352-22.426-46.592-30.515-45.363-73.83-74.854-126.362-86.221-13.312-2.867-21.504-3.584-39.322-3.686-26.010 0-42.189 2.458-64.512 9.83-67.277 22.221-118.682 80.282-132.608 149.504-3.072 15.258-3.584 21.914-3.482 41.882 0.205 47.104 15.565 89.293 46.182 126.157 12.493 15.053 33.587 33.28 49.050 42.291l6.554 3.891v33.587c0 27.853-0.205 33.69-1.434 33.69-0.717 0-8.294-3.482-16.896-7.782z" />
+<glyph unicode="&#xe912;" glyph-name="accessibility_speech" d="M321.536 658.432c-47.411-5.939-92.058-25.19-136.192-58.88-25.19-19.251-55.808-49.254-79.872-78.336-4.198-5.018-7.885-9.421-8.192-9.728-2.97-2.765-31.232-40.858-40.243-54.17l-5.837-8.602 3.174-5.734c5.427-9.728 21.914-33.997 29.696-43.622 37.069-45.978 89.293-89.395 148.992-124.006 13.21-7.578 36.864-19.763 49.562-25.498 5.939-2.662 12.595-5.632 14.848-6.656 41.574-18.534 104.96-35.942 147.968-40.448 3.072-0.307 6.554-0.819 7.68-1.024 10.138-2.048 82.227-2.867 104.448-1.229 18.842 1.434 49.869 5.939 65.024 9.523 30.618 7.168 34.304 8.192 57.344 15.77 15.667 5.222 37.274 13.312 47.411 17.818 38.912 17.306 66.97 32.563 97.997 53.146 38.605 25.702 77.107 58.982 102.912 88.781 2.662 3.072 6.144 7.066 7.578 8.704 8.090 9.011 22.426 29.491 31.437 44.851 6.246 10.547 6.656 8.397-3.994 23.552-19.456 28.058-47.411 63.078-65.536 82.33-62.874 66.867-121.139 101.683-188.621 112.538-17.613 2.867-48.64 2.662-64-0.41-27.341-5.53-55.706-17.818-84.992-36.966-3.072-1.946-5.837-3.891-6.144-4.198-1.331-1.536-15.258-10.035-18.944-11.571-11.264-4.506-22.835-5.632-35.226-3.174-9.216 1.741-15.258 4.608-27.034 12.902-35.43 24.678-70.144 39.731-102.605 44.442-11.162 1.536-35.328 1.536-48.64-0.102zM566.784 505.037c2.253-0.307 9.318-0.819 15.667-1.229 6.451-0.41 12.698-0.819 13.824-1.024 1.229-0.205 5.734-0.614 9.933-1.024 42.701-3.584 97.075-14.234 132.915-26.010 33.075-10.854 55.501-24.371 55.501-33.485 0-2.97-4.301-8.397-9.933-12.39-25.805-18.534-88.883-36.25-159.539-44.749-20.378-2.56-20.89-2.56-30.208-3.277-4.813-0.307-9.83-0.717-11.162-0.922-16.691-2.765-113.459-2.662-142.643 0-54.579 5.018-80.794 9.011-118.579 18.022-49.254 11.674-87.654 29.389-90.829 41.677-2.97 12.083 31.13 29.798 83.046 43.213 30.003 7.782 58.47 12.8 96.358 16.998 2.867 0.307 5.837 0.717 6.656 0.922s6.144 0.717 11.776 1.126c5.632 0.307 11.366 0.819 12.8 0.922 1.434 0.205 9.523 0.717 17.92 1.024 8.499 0.41 15.565 0.922 15.77 1.126 0.512 0.512 85.914-0.41 90.726-0.922z" />
+<glyph unicode="&#xe913;" glyph-name="accessibility_vision" d="M480.154 703.59c-0.205-0.205-4.813-0.614-10.138-0.922-73.933-4.813-159.13-32.563-232.96-75.981-47.206-27.75-83.251-55.398-119.296-91.546-24.166-24.269-41.574-45.773-56.525-69.734-11.162-18.022-10.752-16.282-6.246-24.371 9.011-16.282 26.112-40.346 40.858-57.139 75.981-87.245 190.976-155.238 305.050-180.634 13.926-3.072 34.611-6.656 45.056-7.782 3.379-0.307 6.963-0.819 7.885-1.024 10.445-1.946 79.565-2.765 100.659-1.229 97.28 7.168 202.854 48.947 291.738 115.302 36.557 27.341 75.264 65.024 98.611 95.949 8.090 10.752 17.306 24.678 23.347 35.021l4.813 8.397-4.813 8.499c-7.066 12.288-20.787 32.461-28.774 42.496-12.698 15.872-37.171 41.677-52.736 55.706-7.782 6.963-10.445 9.216-19.354 16.691-66.867 55.91-156.058 101.069-236.032 119.501-24.474 5.632-39.117 8.192-56.832 10.138-5.939 0.614-12.083 1.434-13.824 1.638-3.584 0.717-79.77 1.638-80.486 1.024zM537.6 630.374c50.79-7.68 97.178-36.864 125.44-78.95 28.467-42.496 37.99-91.546 27.546-142.746-10.854-53.76-49.971-102.912-101.069-127.078-18.227-8.602-35.84-13.824-55.398-16.384-10.138-1.331-40.038-1.331-47.718 0-20.787 3.482-32.256 6.758-48.435 13.517-38.502 16.179-72.909 48.435-91.75 86.016-10.342 20.787-14.848 35.738-19.046 64.307-0.819 5.325-0.819 32.563 0 37.888 4.198 28.262 8.704 43.622 19.046 64.307 26.317 52.531 79.053 90.624 137.114 98.918 4.198 0.614 8.806 1.331 10.24 1.536 5.018 0.717 36.454-0.205 44.032-1.331zM721.203 592.896c70.144-34.509 132.71-83.968 173.67-137.114 4.608-5.939 5.325-7.373 4.403-9.216-3.994-8.909-43.11-50.483-64.205-68.403-23.552-19.866-57.242-43.52-83.558-58.47-10.854-6.144-46.182-24.269-47.411-24.269-0.307 0 2.97 4.915 7.168 10.957 33.69 48.026 48.845 104.243 44.134 163.123-3.482 43.622-21.606 90.931-48.435 126.157-5.325 6.963-5.734 7.066 14.234-2.765zM310.579 590.643c-16.384-23.040-28.877-48.947-36.147-74.854-13.517-47.923-12.493-98.509 3.072-145.613 7.373-22.528 21.402-49.664 34.406-66.765 2.56-3.379 4.506-6.246 4.301-6.451-0.41-0.512-30.106 14.438-40.755 20.378-56.422 32.051-106.906 73.626-141.517 116.736-4.506 5.53-8.602 11.162-9.216 12.493-1.024 2.048 0 3.686 9.011 14.95 19.661 24.474 52.941 55.808 82.842 78.131 12.8 9.626 39.834 27.443 52.736 34.918 10.65 6.144 45.466 23.962 45.875 23.45 0.205-0.205-1.843-3.482-4.608-7.373zM500.224 560.026c-47.206-4.915-85.709-37.581-98.304-83.354-3.482-12.595-4.403-35.84-1.946-48.64 5.837-30.413 22.938-56.32 47.923-73.011 12.083-8.090 22.528-12.698 36.966-16.384 17.818-4.506 42.496-3.482 60.826 2.458 7.885 2.56 24.781 11.366 31.334 16.282 33.075 24.883 49.152 61.952 45.158 103.936-1.024 10.65-8.192 34.918-9.83 33.075-0.41-0.41-1.536-2.97-2.458-5.734-2.458-6.656-9.626-15.974-15.565-20.378-10.342-7.578-18.842-10.24-31.232-10.138-21.299 0.205-39.834 14.336-46.182 35.226-2.662 9.011-2.253 22.835 1.229 31.437 4.301 11.162 13.619 21.197 25.088 27.034 2.867 1.434 4.915 2.662 4.608 2.662s-5.018 1.126-10.445 2.458c-9.728 2.56-27.955 3.994-37.171 3.072z" />
+<glyph unicode="&#xe914;" glyph-name="accessory_headphones" d="M494.49 806.093c-0.205-0.307-4.813-0.717-10.138-1.126-32.461-2.048-74.752-13.926-106.496-29.798-16.486-8.294-17.306-8.704-27.648-15.155-38.093-23.859-73.011-58.47-97.485-96.563-25.6-39.834-42.189-88.166-46.592-136.090-0.512-4.506-0.819-100.352-0.819-212.89v-204.698l6.656-3.379c20.275-10.342 40.448-15.565 62.976-16.384 9.523-0.307 14.848 0 18.842 1.024 18.944 5.12 33.997 20.685 37.888 39.322 0.819 3.891 1.126 38.093 1.126 113.664 0 90.112-0.307 109.158-1.536 113.766-4.403 16.691-16.794 30.413-32.461 35.942-7.68 2.662-9.523 2.867-27.238 2.97l-15.565 0.102 0.102 59.187c0 32.461 0.512 62.566 1.024 66.765 1.741 15.155 2.15 18.022 4.096 27.546 5.734 27.853 16.998 56.422 32.256 81.613 27.034 44.646 69.427 81.51 117.658 102.298 20.992 9.011 46.592 16.282 65.536 18.432 3.379 0.41 7.066 1.024 8.192 1.229 3.994 0.922 43.11 1.126 51.2 0.205 79.565-8.602 147.456-49.971 190.566-116.122 19.046-29.286 31.334-60.518 37.888-96.768 2.662-14.746 2.765-15.053 3.174-79.565l0.512-64.819-15.77-0.102c-17.715-0.102-19.558-0.307-27.238-2.97-16.179-5.734-29.389-20.787-32.87-37.683-0.819-3.891-1.126-38.093-1.126-113.664 0-117.453-0.205-112.845 5.734-125.030 3.686-7.475 14.541-18.33 22.016-22.016 9.728-4.71 15.462-5.734 29.082-5.325 22.016 0.717 43.11 5.939 61.952 15.36l8.704 4.403v204.186c0 112.333-0.307 208.486-0.819 213.709-4.096 48.64-23.45 102.502-51.814 143.565-26.624 38.605-60.518 70.349-99.635 93.082-47.309 27.443-94.31 40.653-148.89 41.677-12.39 0.307-22.733 0.307-23.040 0.102zM171.11 347.853c-22.221-24.166-34.509-48.333-40.653-79.565-2.867-14.029-2.56-43.52 0.512-57.856 6.042-28.672 18.022-52.224 37.478-74.035 4.71-5.427 9.114-10.035 9.728-10.445 0.717-0.41 1.024 36.454 1.024 114.586 0 63.386-0.205 115.302-0.41 115.302s-3.686-3.584-7.68-7.987zM844.8 239.923v-114.995l8.090 8.499c18.534 19.456 31.539 43.11 38.4 69.632 7.168 27.443 5.427 63.693-4.403 90.112-5.837 15.667-14.643 31.642-24.371 43.725-5.939 7.475-15.77 17.92-16.794 17.92-0.512 0-0.922-48.23-0.922-114.893z" />
+<glyph unicode="&#xe915;" glyph-name="accessory_shop" d="M485.171 880.026c-26.522-4.198-49.971-13.414-72.602-28.467-36.557-24.371-63.386-62.157-74.138-104.448-2.662-10.752-5.632-31.027-5.632-39.117v-5.018h-153.6l0.307-314.061c0.205-299.315 0.307-314.47 2.048-320.307 8.704-28.672 30.925-49.357 59.699-55.296 6.656-1.331 38.605-1.536 270.95-1.536 231.526 0 264.397 0.205 270.848 1.638 30.106 6.246 53.146 28.979 59.699 58.573 1.946 8.704 2.048 16.691 2.048 320v310.989h-153.6l-0.102 5.427c0 2.867-0.205 6.758-0.41 8.397-0.205 1.741-0.614 5.734-1.024 9.011-3.072 28.774-16.691 61.338-35.942 86.221-27.955 36.147-66.048 59.085-112.538 67.789-12.902 2.355-41.574 2.56-56.013 0.205zM537.395 828.518c25.498-5.632 46.899-17.408 65.229-35.84 21.914-22.016 34.918-50.586 37.069-81.203l0.512-8.499h-256.41l0.614 8.499c2.355 32.051 14.95 59.392 37.581 81.818 21.299 20.992 46.285 33.178 76.186 36.966 6.963 0.922 32.154-0.205 39.219-1.741zM335.155 589.517c4.71-8.602 14.336-14.541 23.757-14.541 5.734 0 13.005 3.174 17.51 7.782 6.758 6.758 7.578 10.752 7.578 38.502v23.45l2.253-1.229c3.891-2.048 11.878-10.138 15.155-15.258 9.728-15.155 10.65-35.738 2.15-51.712-4.198-7.987-15.053-18.432-22.733-21.914-20.582-9.216-41.472-5.939-57.549 9.011-23.040 21.606-20.685 59.597 4.915 78.131l4.096 2.97 0.512-25.907c0.41-22.426 0.717-26.317 2.355-29.286zM641.843 590.848c3.789-8.704 11.469-14.336 20.992-15.462 10.035-1.229 19.763 3.686 24.986 12.698l2.867 4.813 0.307 25.907 0.41 25.805 3.072-1.741c4.301-2.56 13.107-12.288 16.077-17.818 7.168-13.517 7.987-30.31 2.048-44.339-6.349-15.053-20.89-27.034-37.069-30.31-24.371-4.915-48.64 8.806-58.061 32.87-2.765 7.168-3.584 21.811-1.536 29.491 2.97 11.366 10.342 22.426 19.456 28.979l4.096 2.97 0.512-25.395c0.41-17.613 0.922-26.317 1.843-28.467zM539.648 495.718c58.778-11.469 106.598-56.115 120.832-112.64 1.638-6.451 3.379-14.746 3.994-18.637 0.614-4.301 0.922-47.616 0.819-110.899l-0.205-103.936-4.813-2.355c-11.674-5.837-35.226-9.114-43.622-6.042-6.144 2.253-10.854 6.144-14.234 11.674l-2.867 4.813-0.307 56.627c-0.205 37.478 0.102 57.958 0.819 60.621 1.536 5.837 6.963 12.288 12.8 15.258 4.301 2.253 6.656 2.662 16.179 2.97l11.059 0.41-0.41 33.894c-0.205 18.739-0.717 35.635-1.126 37.581-8.499 41.984-32.563 74.854-68.198 93.082-20.275 10.342-38.81 14.643-61.44 13.926-21.094-0.512-32.973-3.379-51.712-12.288-21.299-10.138-41.062-27.238-52.429-45.466-6.451-10.342-13.722-27.034-16.794-38.502l-3.277-12.288-0.41-35.021-0.512-35.123h10.138c5.53-0.102 11.674-0.717 13.722-1.434 5.427-1.946 10.752-6.349 13.926-11.674l2.867-4.813 0.307-56.627c0.205-37.478-0.102-57.958-0.819-60.621-1.536-5.837-6.963-12.288-12.8-15.258-3.891-2.048-6.758-2.662-12.8-2.867-12.083-0.205-30.515 3.994-37.683 8.704l-2.355 1.536 0.41 107.11c0.307 105.677 0.307 107.213 2.56 116.941 3.379 14.643 6.861 24.781 13.005 37.274 21.811 44.646 63.693 75.981 112.64 84.378 14.029 2.458 39.526 2.253 52.736-0.307zM348.16 215.347v-57.446l-2.662 2.458c-4.608 4.301-11.674 14.336-14.746 20.992-13.517 28.877-9.626 60.621 10.24 84.173 3.379 3.994 6.451 7.373 6.656 7.373 0.307 0 0.512-25.907 0.512-57.549zM688.333 258.765c15.667-22.426 17.101-53.453 3.789-79.053-3.891-7.578-13.619-20.48-15.36-20.48-0.512 0-0.922 24.678-0.922 57.139v57.037l4.71-5.12c2.56-2.765 6.042-7.066 7.782-9.523z" />
+<glyph unicode="&#xe916;" glyph-name="Add" d="M447.386 855.757c-17.715-4.71-32.87-20.685-36.659-38.912-0.819-3.789-1.126-44.646-1.126-135.885v-130.56l-131.072-0.102c-72.090-0.102-131.379-0.205-131.789-0.307-0.512-0.102-2.662-0.512-4.813-1.024-11.674-2.253-25.6-12.493-32.358-23.757-6.963-11.469-7.066-12.8-7.066-75.776-0.102-36.762 0.307-58.47 1.024-62.464 3.584-19.456 19.968-36.045 39.629-40.243 3.891-0.819 42.906-1.126 135.885-1.126h130.56v-129.843c0-87.859 0.307-131.891 1.126-135.987 3.277-18.432 18.432-34.611 37.069-39.424 6.656-1.741 11.981-1.946 63.181-1.946 35.738 0 58.163 0.41 62.054 1.126 19.354 3.482 36.147 20.070 40.243 39.629 0.819 3.789 1.126 44.646 1.126 135.885v130.56l266.752 0.512 6.042 2.355c16.691 6.349 28.467 19.251 32.87 36.147 1.843 7.066 2.253 114.483 0.41 124.314-3.584 19.763-20.582 36.762-40.243 40.346-4.198 0.819-47.104 1.126-135.987 1.126h-129.843v130.867c0 125.133-0.102 131.277-1.946 138.24-1.024 4.096-3.482 10.035-5.325 13.107-6.861 11.469-20.582 21.197-33.485 23.859-3.584 0.717-24.678 1.126-62.464 1.024-50.483 0-57.856-0.205-63.795-1.741z" />
+<glyph unicode="&#xe917;" glyph-name="add_more" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.096-0.717-6.656-0.922c-11.264-1.331-15.77-2.048-29.696-4.813-120.422-23.859-224.563-96.563-288.256-201.626-19.456-31.949-34.611-66.15-44.954-101.376-4.71-15.974-10.445-40.653-12.39-53.248-1.741-11.674-2.458-17.715-3.072-24.064-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.162 3.072-30.515 3.686-33.792 0.205-1.126 1.331-7.373 2.56-13.824 7.782-43.418 23.962-89.498 45.158-128.307 30.208-55.296 72.806-104.55 122.88-141.824 53.146-39.526 116.531-67.277 180.531-78.95 12.493-2.253 15.258-2.662 31.744-4.71 17.306-2.15 65.024-2.867 82.432-1.229 59.597 5.53 108.954 19.354 159.744 44.749 6.451 3.174 13.619 6.963 15.872 8.192 2.253 1.331 6.144 3.482 8.704 4.915s10.547 6.451 17.92 11.264c86.733 56.627 150.528 141.619 179.917 239.821 2.253 7.578 4.506 15.462 4.915 17.408 2.97 12.698 8.192 39.219 8.602 43.52 0.307 2.867 0.819 6.042 1.024 7.168s0.717 5.53 1.126 9.728c0.41 4.198 0.922 9.114 1.229 10.752 0.922 6.246 1.126 58.675 0.205 68.096-1.229 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-2.662 15.667-9.523 42.189-15.565 59.904-41.37 121.344-131.379 216.678-250.266 265.114-35.123 14.234-80.384 25.498-116.122 28.877-3.686 0.307-7.987 0.819-9.728 1.126-3.482 0.512-61.542 1.331-62.157 0.819zM571.904 727.859c2.97-0.922 6.758-3.379 9.216-5.939 8.090-7.987 7.68-2.662 7.68-105.677v-91.443h91.546c99.533 0 95.949 0.205 103.731-5.734 1.843-1.331 4.608-4.71 6.144-7.373l2.867-4.813 0.307-56.73c0.307-63.898 0.41-63.386-7.066-70.861-8.192-8.192 0.614-7.578-104.038-7.885l-93.389-0.307-0.614-186.778-2.56-4.506c-2.458-4.301-6.963-8.499-12.288-11.469-2.048-1.126-13.107-1.536-59.29-1.741-64.614-0.307-63.488-0.41-71.373 7.578-7.987 8.294-7.578 2.765-7.578 105.574v91.443h-91.443c-103.014 0-97.69-0.41-105.677 7.68-7.885 7.782-7.782 6.861-7.475 71.27l0.307 56.73 2.765 4.71c1.536 2.56 4.403 5.939 6.349 7.475 7.885 5.939 4.096 5.734 103.629 5.734h91.546l0.205 93.491c0.307 104.858-0.307 95.949 8.090 104.141 7.373 7.066 6.246 6.963 68.096 7.066 48.947 0.102 55.91-0.102 60.314-1.638z" />
+<glyph unicode="&#xe918;" glyph-name="Add_person" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM660.48 267.469c5.12-3.994 5.12-4.096 5.12-40.858v-34.611h34.304c22.426 0 35.021-0.41 36.659-1.126 5.12-2.355 5.837-5.325 5.837-24.678 0-15.053-0.307-18.125-1.741-20.275-3.482-5.12-2.867-5.018-39.936-5.12h-35.123v-34.406c0-37.376-0.205-38.707-5.837-41.267-3.277-1.536-36.25-1.536-39.526 0-5.632 2.56-5.837 3.891-5.837 41.267v34.406h-34.406c-37.376 0-38.707 0.205-41.267 5.837-1.536 3.482-1.536 36.25 0.102 39.731 2.458 5.427 3.994 5.632 41.267 5.632h34.304v34.304c0 22.221 0.41 35.021 1.126 36.659 2.355 5.12 5.018 5.734 24.986 5.734 12.902 0 18.944-0.307 19.968-1.229z" />
+<glyph unicode="&#xe919;" glyph-name="address_book" d="M204.8 793.6v-64l-15.565-0.102c-17.715-0.102-19.558-0.307-27.238-2.97-28.365-10.035-41.779-43.008-28.672-70.554 6.246-13.107 20.992-24.678 35.43-27.648 2.97-0.614 12.288-1.126 20.685-1.126h15.36v-128h-15.36c-8.397 0-17.715-0.512-20.685-1.126-23.142-4.813-40.755-26.522-40.755-50.074 0-23.757 18.227-45.875 41.37-50.074 3.379-0.614 12.698-1.126 20.787-1.126h14.643v-128h-15.36c-8.397 0-17.715-0.512-20.685-1.126-17.101-3.584-31.949-16.691-37.786-33.28-9.216-26.112 5.018-55.706 31.027-64.922 7.68-2.662 9.523-2.867 27.238-2.97l15.565-0.102v-28.365c0-15.667 0.512-31.437 1.126-35.123 5.018-31.744 28.774-56.115 61.235-62.874 6.656-1.331 45.056-1.536 318.157-1.638h310.682l-0.205 377.549-0.307 377.651-2.15 7.168c-7.168 23.654-23.45 42.189-44.646 50.893-15.77 6.349 7.782 5.939-333.005 5.939h-310.886v-64zM574.464 700.826c40.55-11.776 67.379-49.050 65.229-90.522-0.717-13.21-3.277-23.142-8.909-35.021-11.059-22.835-33.485-41.165-58.368-47.514-12.698-3.277-32.051-3.277-44.032-0.102-31.949 8.704-55.603 32.154-64.717 64.205-1.843 6.758-2.253 10.752-2.253 23.040 0 15.565 1.229 21.914 6.861 35.328 11.059 26.317 35.533 45.978 65.229 52.326 9.83 2.048 31.027 1.229 40.96-1.741zM577.536 496.64c46.49-9.933 84.582-41.165 102.4-83.763 5.018-11.981 8.806-26.317 10.24-38.298 0.614-5.325 1.024-44.134 1.024-95.846v-86.733l-242.176 0.512-5.427 2.253c-16.998 6.963-29.389 21.299-32.87 38.093-1.536 7.373-1.536 130.355 0 142.438 8.090 63.078 56.013 112.333 119.194 122.47 10.752 1.638 37.478 1.126 47.616-1.126z" />
+<glyph unicode="&#xe91a;" glyph-name="administrator" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM602.214 293.376c1.126-0.614 3.686-4.608 5.734-8.806 5.018-10.24 7.987-12.083 19.251-12.186 11.162 0 14.234 1.946 19.251 12.288 4.301 8.602 6.554 10.24 13.517 9.421 5.018-0.614 16.896-5.018 21.914-8.090 8.602-5.325 9.83-9.011 6.246-18.227-2.56-6.349-2.662-12.902-0.205-16.486 8.397-12.595 15.872-15.667 27.648-11.162 7.578 2.867 10.752 2.662 14.438-1.024 5.12-5.222 12.39-22.63 12.39-29.901 0-4.915-1.843-6.861-9.728-10.65-10.24-4.813-12.288-8.090-12.288-19.354 0-11.059 2.15-14.438 11.571-18.944 8.090-3.891 10.342-6.349 10.445-11.366 0-6.963-7.373-24.576-12.493-29.696-3.584-3.584-6.861-3.789-14.131-0.922-5.734 2.253-12.288 2.662-15.667 0.922-3.277-1.638-10.854-9.216-12.595-12.39-2.048-3.891-1.741-10.035 0.614-16.179 2.867-7.27 2.662-10.547-1.024-14.234-6.554-6.451-25.702-13.517-32.563-11.776-3.379 0.819-4.198 1.741-7.68 8.602-5.53 10.752-8.602 12.8-19.661 12.8-10.854 0-14.438-2.15-19.046-11.776-3.686-7.68-6.246-10.138-10.752-10.24-7.373 0-24.678 7.066-29.901 12.186-3.891 3.891-4.096 6.554-1.229 14.746 3.584 10.24 2.458 15.565-5.12 22.938-6.963 6.861-12.493 7.885-22.835 4.198-10.445-3.584-14.029-1.536-20.48 11.776-4.403 9.011-6.554 18.432-5.222 22.733 0.819 2.458 2.662 3.891 8.602 6.963 10.65 5.325 12.8 8.602 12.8 19.558 0 11.264-1.843 14.029-12.493 19.558-6.758 3.482-8.090 4.608-8.909 7.373-1.843 6.758 5.222 26.419 11.878 33.075 3.584 3.686 6.861 3.891 14.336 1.024 10.035-3.789 15.462-2.56 23.040 5.325 6.963 7.168 8.090 13.005 4.403 22.323-1.126 2.867-2.048 6.554-2.048 8.192 0 3.686 4.915 8.806 11.264 11.674 13.722 6.144 22.323 7.987 26.726 5.734zM615.936 232.55c-23.757-5.53-40.858-24.986-42.803-48.742-3.584-41.882 40.346-71.987 78.131-53.453 28.467 13.824 39.117 49.254 22.938 76.698-11.469 19.558-36.557 30.515-58.266 25.498z" />
+<glyph unicode="&#xe91b;" glyph-name="Adultcode" d="M496.64 908.493c-0.307-0.307-3.584-0.717-7.27-1.126-23.45-2.15-50.176-10.342-72.602-22.323-46.387-24.678-81.51-65.843-98.714-115.712-4.198-12.186-8.397-30.413-9.318-41.267-0.41-3.994-0.819-8.499-1.024-10.24-0.205-1.638-0.41-45.773-0.41-97.997l-0.102-95.027h-102.4l0.307-237.261c0.205-221.184 0.41-237.773 2.048-243.098 8.397-27.546 27.238-46.49 54.886-54.886 5.325-1.638 23.654-1.843 281.498-2.048l275.661-0.307-0.307 237.261c-0.205 224.461-0.307 237.67-2.048 243.302-7.27 23.859-24.269 42.906-45.773 51.507-14.541 5.734-7.578 5.53-205.107 5.53h-181.965l0.102 96.051 0.102 95.949 2.355 11.674c4.71 22.528 12.39 38.707 27.238 56.934 26.931 33.178 70.963 50.893 113.152 45.568 29.184-3.584 54.784-16.282 75.674-37.274 20.378-20.48 32.358-45.158 36.762-75.878 0.205-1.638 0.512-34.304 0.512-72.397l0.102-69.427h76.8l-0.102 71.475c-0.102 75.264-0.307 80.179-5.018 101.581-11.162 50.278-43.11 96.358-87.142 125.747-23.040 15.462-49.766 25.907-80.282 31.437-8.294 1.536-46.49 3.277-47.616 2.253zM293.171 344.576c6.963-2.56 9.626-5.427 22.221-23.552 5.632-8.192 10.65-14.95 11.162-15.155 0.41-0.102 5.018 5.837 10.138 13.414 12.39 18.022 15.565 21.606 22.323 24.883 4.813 2.355 6.451 2.662 12.083 2.253 15.258-1.229 26.214-12.8 26.214-27.546 0-6.656-2.765-11.776-19.149-35.43-8.602-12.493-16.077-23.859-16.589-25.19-1.126-2.97-1.434-2.458 15.667-27.341 19.866-28.672 21.402-32.154 19.046-43.52-2.355-11.264-12.39-19.558-25.19-20.685-11.469-1.024-18.33 3.584-29.594 20.173-10.854 15.77-14.234 20.48-14.746 20.48-0.41 0-5.427-6.963-11.366-15.462s-12.493-16.998-14.541-18.944c-7.475-6.656-20.48-8.294-29.594-3.584-6.144 3.174-8.909 5.837-11.776 11.571-5.222 10.24-4.198 19.251 3.482 30.822 2.662 4.096 9.933 14.643 16.077 23.552 15.155 21.709 14.438 20.48 13.005 23.45-1.126 2.048-6.349 9.728-25.702 37.274-8.499 11.981-9.83 15.36-9.83 23.45 0 5.939 0.512 8.090 3.072 12.595 6.861 12.493 20.173 17.51 33.587 12.493zM476.262 345.088c7.27-2.458 11.366-6.656 23.142-23.654 5.939-8.602 11.162-15.77 11.571-15.77s3.584 4.301 7.168 9.523c9.933 14.438 10.445 15.155 15.155 20.89 15.667 19.046 45.158 10.445 48.026-13.926 0.922-8.192-1.741-14.131-14.336-32.358-23.552-33.792-22.426-31.846-20.685-36.045 0.819-1.946 2.867-5.222 4.403-7.27 5.222-6.758 25.6-36.762 27.648-40.858 6.861-13.517 1.229-30.31-12.186-36.045-11.059-4.813-21.299-3.686-29.184 3.174-1.843 1.638-8.397 10.138-14.336 18.842-6.042 8.704-11.366 15.667-11.776 15.565-0.41-0.205-5.734-7.475-11.878-16.179-6.656-9.523-12.8-17.101-15.36-19.046-12.493-9.523-30.822-5.837-38.912 7.68-6.349 10.547-5.53 20.173 2.56 32.256 9.114 13.619 23.142 33.894 26.522 38.502 3.994 5.222 3.891 7.475-0.614 13.21-1.536 2.048-6.758 9.421-11.571 16.486-20.582 30.208-21.299 31.539-21.299 38.81 0 18.637 18.534 32.154 35.942 26.214zM662.323 345.088c8.602-2.56 10.65-4.915 29.901-32.973 2.458-3.584 4.71-6.451 5.12-6.451s4.096 4.915 8.192 11.059c11.571 16.896 15.053 21.402 18.944 24.371 13.21 10.035 32.461 5.734 40.141-9.114 2.253-4.301 2.765-6.758 2.867-12.493 0-9.728-0.922-11.366-26.522-47.411-3.891-5.427-7.68-11.366-8.397-13.21-1.536-3.584-2.458-2.048 21.197-36.147 10.445-15.155 13.005-20.070 13.824-26.931 1.741-14.746-9.626-27.546-25.907-29.082-6.554-0.614-13.21 1.536-18.33 6.144-1.946 1.638-8.499 10.138-14.438 18.739-6.042 8.704-11.162 15.77-11.571 15.77-0.307 0-5.325-6.861-11.162-15.258-12.186-17.715-15.053-20.685-22.426-23.552-6.349-2.56-11.264-2.662-18.227-0.614-13.619 3.994-21.914 20.173-17.306 33.792 1.741 5.018 3.891 8.294 25.293 39.219 11.162 15.974 11.162 15.974 5.939 22.733-9.216 12.083-30.208 44.134-31.437 48.128-4.096 13.21 4.301 29.184 17.408 33.382 5.837 1.741 10.547 1.741 16.896-0.102z" />
+<glyph unicode="&#xe91c;" glyph-name="Adult" d="M496.128 907.776c-2.765-0.41-6.963-1.024-9.216-1.331-8.294-1.229-25.088-6.758-34.406-11.366-12.39-6.042-14.95-7.475-23.654-14.029-30.72-22.835-50.074-55.296-55.91-94.106-0.922-5.939-0.922-31.949 0-37.888 4.813-31.539 18.022-58.163 40.141-80.384 20.173-20.173 44.237-33.075 73.318-39.117 12.186-2.56 40.141-2.56 52.224 0 29.082 6.144 52.736 18.739 73.216 39.117 19.456 19.354 32.87 43.725 38.502 70.451 2.355 10.854 3.277 33.997 1.946 45.773-6.246 52.634-42.598 97.997-92.672 115.712-14.95 5.222-26.829 7.373-43.52 7.68-8.192 0.102-17.101-0.102-19.968-0.512zM378.163 630.374c-23.040-13.722-39.834-29.491-55.706-52.326-3.891-5.632-5.734-9.011-11.059-19.968-7.68-15.872-12.083-30.31-14.848-48.64-1.843-12.493-2.355-137.114-0.512-150.016 4.813-35.328 37.069-64 72.909-64.922l2.765-0.102v-117.76c0-80.998 0.307-119.398 1.126-123.085 3.789-18.637 18.944-34.202 38.093-39.322 7.066-1.843 192.922-2.15 201.626-0.307 18.637 3.994 35.84 20.787 39.322 38.298 0.512 2.253 0.922 4.403 1.024 4.915 0.102 0.41 0.205 53.862 0.307 118.886l0.102 118.067 6.963 0.717c32.461 3.277 57.139 23.962 67.379 56.525 1.843 5.632 1.946 10.752 1.946 77.722 0 80.282 0 79.872-5.325 100.352-7.578 28.877-21.299 52.429-43.725 74.752-11.981 11.981-29.082 24.781-39.731 29.798l-3.789 1.741-4.403-3.994c-7.27-6.656-16.077-13.107-26.931-19.558-19.046-11.264-35.635-17.715-58.47-22.426-11.674-2.458-15.667-2.765-33.69-2.867-22.016-0.102-31.539 1.126-50.176 6.246-24.064 6.656-48.742 19.763-67.686 35.84-4.096 3.584-7.885 6.451-8.294 6.451s-4.608-2.253-9.216-5.018z" />
+<glyph unicode="&#xe91d;" glyph-name="advertising" d="M321.638 662.323c-126.362-126.464-209.408-210.227-212.275-214.323-13.414-18.842-19.558-38.298-19.456-60.621 0.102-21.402 7.27-42.394 20.173-59.699 7.578-10.138 279.040-280.781 286.31-285.491 12.698-8.192 27.238-14.029 40.141-16.077 9.114-1.434 23.962-1.434 32.973 0 16.384 2.56 35.43 11.162 47.616 21.402 3.072 2.56 98.406 97.382 211.661 210.739l206.131 206.029v180.019c0 197.939 0.307 186.675-6.246 198.963-3.994 7.578-12.902 16.384-20.48 20.48-12.083 6.451-2.458 6.144-199.373 6.144h-179.507l-207.667-207.565zM831.59 790.221c18.227-8.806 28.467-24.883 28.57-44.749 0-13.21-5.12-25.293-14.746-34.816-18.33-18.33-46.182-19.661-66.458-3.072-21.811 17.715-23.859 50.586-4.608 71.68 10.035 10.957 22.733 16.077 38.81 15.565 9.011-0.41 10.445-0.717 18.432-4.608zM550.81 664.166l22.835-22.835 9.933 2.662c5.427 1.434 20.173 5.325 32.87 8.704 12.595 3.379 23.142 5.939 23.45 5.734 0.41-0.512 14.131-50.688 16.589-61.030l1.229-4.608 8.294-2.253c4.506-1.229 17.715-4.813 29.286-7.885s22.733-6.144 24.883-6.656c2.97-0.819 3.789-1.536 3.379-2.867-0.205-0.922-3.277-12.288-6.758-25.293-3.379-12.902-6.861-25.805-7.68-28.672-3.277-11.366-5.325-7.987 21.606-34.816l24.269-24.269-48.742-48.742 3.174-11.571c1.741-6.451 5.325-19.456 7.782-29.082 2.56-9.523 5.12-19.046 5.734-20.992 0.512-1.946 0.614-3.891 0.205-4.198-0.41-0.41-6.246-2.253-13.005-3.994-16.077-4.301-41.779-11.162-47.616-12.698-5.325-1.434-3.789 2.458-14.95-39.526-3.789-14.336-7.27-26.522-7.68-26.931-0.614-0.819-9.421 1.331-49.562 12.186l-16.384 4.403-24.269-24.269-24.371-24.269-48.64 48.435-5.12-1.331c-2.765-0.614-17.408-4.506-32.358-8.602-14.95-3.994-27.648-7.27-28.16-7.27s-2.458 5.837-4.403 13.107c-13.722 51.61-14.234 53.453-15.77 53.453-0.717 0-9.523 2.253-19.661 5.018-10.138 2.662-24.269 6.554-31.437 8.397-7.27 1.946-13.107 3.891-13.107 4.403 0 0.922 9.728 37.786 14.438 54.886l2.97 10.752-48.64 48.64 24.269 24.371 24.371 24.269-1.536 5.12c-0.922 2.765-1.741 6.042-2.048 7.168-0.205 1.126-3.482 13.517-7.27 27.546-5.018 18.739-6.554 25.6-5.632 26.112 0.717 0.512 7.782 2.56 15.77 4.71 39.117 10.445 48.333 13.005 48.947 13.619 0.41 0.41 4.403 15.053 9.011 32.461 4.71 17.51 8.704 32.051 9.114 32.461s4.198-0.205 8.397-1.331c4.198-1.126 18.944-5.018 32.666-8.704l24.986-6.758 12.186 12.186c6.656 6.656 17.51 17.51 24.064 24.064 10.138 10.24 12.186 11.878 13.517 10.752 0.922-0.614 11.878-11.571 24.576-24.166z" />
+<glyph unicode="&#xe91e;" glyph-name="aeroplane" d="M864.768 832.205c-6.349-0.512-15.565-2.56-23.040-5.018-15.77-5.222-44.442-20.48-61.952-32.87-5.427-3.891-73.83-54.886-139.469-104.141l-39.629-29.798-56.934 19.149c-272.896 91.443-299.827 100.352-304.947 100.454-5.939 0-11.674-1.638-16.077-4.608-4.301-2.97-52.838-51.2-52.429-52.224 0.205-0.819 29.389-18.739 67.277-41.472 6.451-3.789 27.238-16.384 46.080-27.75 18.842-11.469 35.738-21.606 37.376-22.63 1.741-1.024 8.397-5.018 14.848-8.909 12.698-7.68 74.957-45.363 115.507-69.837 13.619-8.192 24.781-15.155 24.781-15.565 0-0.307-3.789-5.222-8.397-10.854-11.264-13.722-54.886-67.174-67.789-83.149-5.734-6.963-16.998-20.787-25.19-30.822s-23.347-28.672-33.792-41.472c-18.637-22.938-48.026-58.982-48.742-59.802-0.307-0.307-94.31 39.424-98.714 41.779-0.819 0.41-9.933 4.403-20.275 8.806-16.998 7.168-19.251 7.885-23.859 7.475-4.915-0.512-5.734-1.024-13.312-8.602-4.403-4.403-7.987-8.499-7.782-8.909 0.41-1.229 286.618-287.437 287.334-287.437 1.229 0 14.541 14.234 15.974 17.101 0.819 1.536 1.536 4.403 1.536 6.246 0 2.867-8.704 24.576-19.456 48.845-6.758 15.258-38.912 90.931-38.912 91.648 0 0.512 3.072 3.379 6.963 6.451 3.789 3.072 18.842 15.258 33.485 27.238s31.846 26.010 38.195 31.13c6.451 5.222 12.186 9.933 12.8 10.445 0.717 0.614 7.475 6.144 15.053 12.288s16.589 13.517 20.070 16.282c3.379 2.867 8.192 6.861 10.65 8.806s7.066 5.632 10.138 8.192c3.174 2.56 9.421 7.68 13.926 11.366 25.395 20.787 47.206 38.502 55.706 45.466 7.885 6.451 9.83 7.578 10.854 6.451 0.614-0.717 8.090-12.8 16.384-26.931 20.89-35.328 62.054-104.448 69.12-116.224 3.277-5.325 18.944-31.642 34.816-58.368 15.974-26.726 33.178-55.808 38.4-64.512s12.698-21.299 16.691-27.955c3.994-6.656 7.578-12.083 8.090-12.083 0.41 0 12.39 11.571 26.624 25.702 27.75 27.648 29.798 30.515 30.72 40.755 0.41 5.53-2.458 14.438-59.392 185.242l-59.904 179.405 64 85.299c67.789 90.419 71.782 95.846 81.408 111.821 20.48 33.792 29.798 63.283 25.293 79.974-1.536 5.837-5.734 11.571-10.65 14.438-4.198 2.458-13.517 4.198-19.456 3.686z" />
+<glyph unicode="&#xe91f;" glyph-name="Age-rating_3" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM506.368 782.131c-39.117-1.946-84.89-15.565-120.218-35.942-44.339-25.498-73.626-62.976-78.336-100.557-1.024-7.578-0.819-21.606 0.307-27.238 3.891-20.070 19.251-38.4 38.81-46.592 6.349-2.662 9.728-3.379 17.306-3.789 23.552-1.229 40.243 7.885 69.939 38.298 24.474 25.088 36.352 33.178 57.344 39.117 3.584 0.922 9.83 1.536 17.408 1.536 9.83-0.102 13.107-0.512 20.070-2.765 13.312-4.301 24.474-12.493 31.334-23.142 10.138-15.77 9.318-40.55-1.843-57.856-9.933-15.462-25.088-25.293-50.586-32.768-22.733-6.554-38.195-11.981-45.056-15.462-12.083-6.349-20.582-15.872-24.781-27.853-2.048-5.939-2.355-8.909-2.355-21.709 0-12.902 0.307-15.872 2.458-22.323 4.71-14.541 15.667-27.546 28.262-33.485 9.421-4.506 25.088-8.499 39.936-10.24 2.867-0.307 6.963-0.717 9.216-1.024 34.918-4.096 57.446-17.101 67.584-38.912 10.854-23.245 8.602-56.115-5.325-78.336-7.782-12.39-23.45-25.395-37.171-30.72-16.384-6.451-38.298-8.090-53.453-4.198-16.179 4.198-30.515 12.493-43.11 24.986-8.806 8.704-12.186 13.517-26.214 37.888-11.878 20.48-18.022 27.955-27.853 33.792-10.957 6.451-18.739 8.397-34.202 8.294-11.162 0-14.336-0.41-19.968-2.355-9.83-3.482-18.022-8.806-26.624-17.51-17.51-17.408-23.962-37.069-19.968-60.928 5.427-33.382 23.654-65.536 54.374-96.256 26.829-26.829 56.32-44.339 92.774-55.296 9.728-2.867 29.594-7.066 39.219-8.192 3.277-0.41 6.963-0.922 8.192-1.229 3.891-0.819 46.080-1.024 54.784-0.205 38.195 3.686 72.499 14.643 102.605 32.768 41.37 24.986 70.963 60.109 87.347 103.834 5.222 13.926 7.066 21.197 10.24 40.141 2.458 15.053 2.765 42.598 0.614 57.651-7.987 53.965-37.581 94.925-92.058 127.795-5.837 3.482-10.957 6.349-11.469 6.349-2.048 0-0.922 1.946 2.355 4.198 6.861 4.915 21.197 17.51 27.75 24.576 18.739 20.275 29.389 40.038 34.714 64.614 3.379 15.053 3.891 19.558 4.301 39.219 0.819 33.792-7.168 61.747-25.805 90.624-31.334 48.333-91.648 79.462-156.877 80.794-5.325 0.102-9.933 0.307-10.24 0.41-0.41 0.102-2.867 0.102-5.734 0z" />
+<glyph unicode="&#xe920;" glyph-name="Age-rating_4" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM553.984 775.578c-10.957-1.229-14.95-2.15-23.757-5.53-26.010-9.626-52.019-33.792-68.096-62.976-1.741-3.072-8.090-14.848-14.131-26.112s-12.288-22.733-13.824-25.6c-1.536-2.765-6.349-11.776-10.752-19.968s-9.626-17.818-11.571-21.504c-2.97-5.427-20.582-38.093-56.525-104.96-2.458-4.506-6.246-11.366-8.397-15.155-2.15-3.891-3.891-7.168-3.891-7.373s-5.427-10.445-12.083-22.733c-6.656-12.288-14.336-26.419-17.101-31.539-9.114-16.998-12.083-22.528-13.824-25.6-0.922-1.638-3.994-7.168-6.656-12.288-2.765-5.018-9.114-16.998-14.336-26.624-5.12-9.523-9.83-18.739-10.547-20.48-6.451-16.589-4.915-40.448 3.584-54.17 9.523-15.462 31.334-27.238 55.603-30.003 3.072-0.307 49.562-0.717 103.219-0.717 53.555 0 97.587-0.307 97.587-0.614 0.102-0.307 0.307-19.149 0.41-41.984 0.307-45.158 0.614-48.947 6.656-63.386 6.861-16.794 19.763-30.413 34.202-36.352 11.674-4.813 29.901-6.042 44.442-3.072 24.166 4.915 42.394 24.678 49.562 53.658 0.614 2.765 1.331 22.016 1.741 48.128l0.614 43.52 9.83 0.205c20.378 0.512 38.4 8.397 53.555 23.347 14.541 14.438 21.606 36.762 17.613 55.706-4.608 22.016-18.534 37.683-40.346 45.568-8.192 2.867-14.848 3.891-27.853 4.301-5.325 0.102-10.547 0.307-11.469 0.307-1.638 0.102-1.843 9.114-2.15 148.378-0.41 160.358 0 149.402-5.53 166.605-8.397 26.112-29.286 50.381-52.429 60.621-16.282 7.27-36.147 10.342-53.35 8.397zM528.896 492.032c0-66.97-0.307-100.352-1.024-100.454-6.042-0.512-104.243-0.205-104.653 0.41-0.205 0.41 1.331 4.096 3.584 8.192 4.813 8.909 10.24 18.944 18.125 33.997 3.277 6.246 7.885 14.95 10.24 19.456s9.114 17.203 14.848 28.16c5.734 10.957 12.186 23.245 14.336 27.136 2.048 3.994 6.656 12.698 10.24 19.456 3.482 6.758 7.68 14.643 9.216 17.408 1.536 2.867 5.939 11.162 9.728 18.432 3.891 7.373 8.192 15.667 9.728 18.432 1.536 2.867 3.277 6.144 3.994 7.475 0.614 1.229 1.331 2.253 1.434 2.253s0.205-45.158 0.205-100.352z" />
+<glyph unicode="&#xe921;" glyph-name="Age-rating_7" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM346.112 764.928c-27.443-5.53-47.104-23.040-52.429-46.592-5.325-23.347 0.922-47.002 16.179-61.542 8.704-8.397 18.33-13.619 31.642-17.613 6.963-2.048 9.626-2.048 112.435-2.355 57.958-0.102 105.472-0.41 105.677-0.614s-0.512-2.15-1.536-4.403c-3.686-8.294-12.595-27.853-15.565-34.304-1.741-3.686-6.554-14.234-10.752-23.552-4.301-9.318-9.728-21.197-12.186-26.522-2.458-5.222-4.506-9.728-4.506-9.933s-1.536-3.686-3.482-7.782c-5.939-12.8-14.643-31.846-17.306-37.683-1.331-3.072-3.789-8.397-5.325-11.776s-5.325-11.674-8.397-18.432c-23.962-52.224-53.658-117.35-57.958-126.976-2.56-5.632-6.144-13.722-8.192-17.92-5.018-10.854-18.125-39.526-30.413-66.56-5.734-12.698-11.981-26.419-13.926-30.618-7.475-16.077-10.24-35.635-7.168-50.278 5.018-23.962 24.986-44.851 50.995-53.658 6.758-2.253 9.216-2.662 19.866-3.379 28.262-1.843 53.35 14.848 69.734 46.285 3.789 7.373 22.938 50.893 121.856 277.504 15.462 35.533 34.509 79.053 42.291 96.768 35.635 81.306 53.76 122.88 56.525 129.536 7.578 18.227 9.318 36.557 5.018 52.019-7.782 28.058-29.491 46.49-60.006 50.893-11.674 1.638-314.675 1.126-323.072-0.512z" />
+<glyph unicode="&#xe922;" glyph-name="Age-rating_9" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM482.099 781.312c-0.205-0.102-3.891-0.512-8.192-0.922-15.872-1.331-45.773-8.397-58.778-13.926-2.765-1.229-6.349-2.662-8.090-3.379-13.005-5.222-36.659-19.251-49.971-29.696-42.189-33.075-73.011-88.883-80.486-145.613-6.042-45.773-1.638-83.251 14.131-119.091 26.522-60.314 84.275-105.574 145.818-114.381 2.765-0.307 6.042-0.922 7.168-1.229 1.229-0.205 9.626-0.614 18.637-0.819 17.51-0.307 24.064 0.41 42.189 5.018 5.734 1.434 10.65 2.662 11.059 2.662 2.048 0-57.344-74.854-71.578-90.112-2.355-2.56-7.066-7.578-10.342-11.264-3.379-3.686-10.65-11.571-16.077-17.408-14.848-16.179-20.787-24.064-26.419-35.328-6.554-13.005-9.216-23.552-9.216-36.352-0.102-10.445 1.229-15.77 5.632-24.576 7.168-14.131 26.624-28.467 46.285-33.997 11.469-3.174 28.774-3.277 38.707-0.102 17.92 5.734 38.707 23.552 67.686 58.163 65.024 77.722 100.762 125.542 129.741 173.261 38.912 64.102 58.163 111.104 66.15 161.178 1.946 12.083 2.458 16.486 3.686 29.594 0.614 6.656 0.717 40.55 0.102 43.52-0.205 1.126-0.717 5.325-1.126 9.216-6.246 62.771-40.96 120.525-92.877 155.136-34.304 22.835-70.144 35.226-115.507 40.038-8.090 0.819-47.411 1.229-48.333 0.41zM528.794 634.982c27.136-7.578 50.995-31.744 58.061-58.778 2.765-10.547 3.072-28.467 0.614-39.117-5.53-23.347-23.245-45.158-45.261-55.808-12.698-6.042-20.992-7.987-35.328-7.987-26.726 0-48.742 11.469-65.946 34.099-19.456 25.805-21.197 62.157-4.301 90.010 4.915 7.987 15.77 19.558 23.654 25.19 7.782 5.632 17.818 10.342 26.931 12.902 8.704 2.355 32.256 2.15 41.574-0.512z" />
+<glyph unicode="&#xe923;" glyph-name="Age-rating_12" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM661.094 781.619c-98.509-5.734-184.013-79.36-201.728-173.568-4.301-22.835-3.891-47.104 1.024-60.928 10.24-28.877 32.768-44.851 63.386-44.851 19.456 0 30.925 4.403 42.496 16.384 11.366 11.571 14.95 19.558 26.010 59.187 7.27 25.805 14.643 40.55 25.293 51.302 21.094 20.89 55.91 25.293 79.155 9.83 12.186-8.090 22.835-23.552 26.931-39.424 2.048-8.192 2.355-28.672 0.41-36.864-5.837-24.781-13.824-40.038-38.4-72.602-20.173-26.829-35.635-45.363-81.408-97.382-3.277-3.686-17.613-19.968-31.846-36.352-14.336-16.282-26.214-29.901-26.624-30.208-0.307-0.307-6.963-7.885-14.848-16.896s-20.070-22.835-27.136-30.72c-6.963-7.885-13.619-15.462-14.848-16.794-1.126-1.331-4.608-5.222-7.68-8.499-9.421-10.342-10.24-11.264-17.715-21.299-12.902-16.998-17.408-29.491-16.589-45.568 0.512-11.571 2.15-18.227 6.656-27.648 8.806-18.534 27.136-29.491 55.296-33.178 3.686-0.512 76.698-0.922 162.304-0.922 169.165 0 163.84-0.205 178.688 5.632 14.643 5.734 27.853 17.306 33.792 29.491 4.403 9.011 6.349 17.715 6.349 29.491 0.102 25.805-11.981 45.875-34.304 56.934-16.179 7.987-11.674 7.578-105.882 8.192l-84.173 0.614 19.149 19.456c20.582 20.89 37.99 39.424 53.965 57.344 5.53 6.246 11.674 13.107 13.722 15.36 6.861 7.475 40.243 47.002 44.954 53.248 2.56 3.379 6.758 8.909 9.421 12.288 17.408 22.733 35.738 52.122 47.104 75.878 15.667 32.461 23.142 67.174 22.733 104.858-0.819 76.698-48.947 143.872-124.109 173.363-21.197 8.294-44.032 13.414-65.024 14.643-6.144 0.307-11.674 0.717-12.288 0.819-0.512 0.102-6.963-0.205-14.234-0.614zM169.779 765.44c-26.624-4.506-46.694-20.48-54.067-43.11-2.15-6.349-2.56-9.626-2.56-20.89 0-11.366 0.41-14.438 2.458-20.787 5.12-15.667 16.384-28.262 32.154-35.942 13.517-6.554 19.558-7.475 51.917-7.885l29.184-0.307 0.102-220.467c0.102-121.242 0.41-224.358 0.819-229.274 2.15-28.467 17.408-53.146 39.731-64.41 11.674-5.837 20.787-7.578 36.557-6.861 23.962 0.922 39.526 8.602 53.35 26.522 4.403 5.734 11.162 20.685 13.517 29.798l2.355 9.421v260.096c0 243.405-0.102 260.608-1.741 268.39-6.861 31.334-28.058 51.2-59.699 55.706-8.499 1.126-136.909 1.229-144.077 0z" />
+<glyph unicode="&#xe924;" glyph-name="Age-rating_16" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM708.608 780.288c-20.173-5.734-37.888-19.763-66.662-52.736-54.17-62.054-105.984-131.072-136.294-181.248-43.725-72.294-62.771-123.904-68.403-184.218-1.229-13.312-1.229-41.37 0.102-54.374 4.915-50.278 25.907-95.642 60.416-131.174 35.635-36.659 87.552-60.723 144.282-66.97 9.728-1.126 46.182-1.331 55.808-0.41 62.054 5.939 117.453 34.611 153.395 79.258 35.328 43.93 52.326 95.744 51.405 156.672-0.819 51.098-20.582 98.304-56.525 135.168-29.901 30.618-72.909 52.224-112.435 56.422-2.765 0.307-6.451 0.717-8.192 1.024-3.891 0.512-25.805 0.512-29.184 0-1.434-0.205-4.813-0.717-7.68-1.126-4.403-0.614-20.378-4.403-26.419-6.246-4.71-1.434 57.958 78.234 76.595 97.485 4.198 4.301 28.774 30.413 32.051 34.099 4.403 4.813 11.469 15.462 15.053 22.63 11.674 23.245 11.981 48.538 0.717 64.717-8.704 12.493-24.781 23.654-42.189 29.389-9.011 3.072-27.853 3.891-35.84 1.638zM687.104 415.232c20.173-5.325 33.997-14.131 47.002-30.208 22.938-28.262 23.757-68.301 1.946-97.997-11.674-15.872-27.955-27.238-46.080-32.154-8.704-2.355-27.955-2.765-37.171-0.922-33.382 6.963-60.928 36.864-64.819 70.656-3.072 26.010 4.608 48.435 23.040 67.379 12.698 13.005 28.365 21.402 44.851 24.166 6.861 1.126 25.498 0.614 31.232-0.922zM173.056 765.44c-14.541-2.56-29.286-9.933-39.424-19.866-21.606-21.197-22.938-62.566-2.867-85.504 8.294-9.421 23.859-18.227 38.707-21.709 3.072-0.717 16.384-1.331 33.69-1.536 15.667-0.205 28.774-0.614 29.184-0.922 0.307-0.41 0.614-102.4 0.717-226.611 0.102-249.958-0.307-232.243 6.554-249.037 6.554-15.77 20.582-31.744 33.28-37.888 20.685-9.933 47.411-9.83 67.584 0.205 15.053 7.578 27.75 23.245 34.202 42.598 4.813 14.336 4.813 8.909 4.71 279.245-0.102 234.803-0.307 255.693-1.843 263.782-5.734 29.389-22.016 47.104-50.893 55.501-7.475 2.15-9.114 2.15-78.336 2.355-38.81 0.102-72.704-0.205-75.264-0.614z" />
+<glyph unicode="&#xe925;" glyph-name="Age-rating_17" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM197.734 764.314c-24.474-5.427-41.984-20.48-49.357-42.394-2.048-6.042-2.355-9.216-2.355-20.48 0-13.619 0.819-17.818 5.325-28.16 5.222-12.083 18.842-24.576 32.973-30.31 14.234-5.734 16.896-5.939 73.421-6.554h4.198v-224.461c0-162.099 0.41-226.509 1.229-231.731 5.222-32.358 26.726-57.242 54.784-63.488 11.981-2.662 30.925-1.741 42.291 2.048 18.739 6.246 32.154 19.251 40.96 39.629 7.373 17.203 6.758-7.066 7.066 280.371 0.205 212.89 0 259.994-1.126 266.752-2.97 17.203-9.318 30.106-19.866 40.55-7.782 7.578-13.824 11.469-23.654 15.053-14.131 5.12-18.022 5.325-90.214 5.222-61.747-0.102-67.789-0.205-75.674-2.048zM503.091 765.44c-27.238-3.994-48.947-21.811-55.194-45.056-2.15-8.090-2.458-26.726-0.512-34.816 5.632-23.757 25.498-41.677 52.019-47.002 8.294-1.741 17.101-1.843 108.339-1.946 54.682-0.102 101.069-0.102 103.322-0.205 2.97 0 3.686-0.307 2.867-1.229-0.512-0.717-3.072-5.939-5.632-11.571s-6.246-13.722-8.192-17.92c-3.686-8.090-29.798-65.331-43.008-94.208-4.198-9.318-12.698-27.955-18.944-41.472-6.144-13.517-12.186-26.829-13.517-29.696-1.229-2.765-3.789-8.294-5.632-12.288-1.843-3.891-5.53-11.981-8.192-17.92s-6.861-15.053-9.318-20.378c-2.458-5.222-4.506-9.728-4.506-9.83 0-0.205-1.638-3.994-3.686-8.397-3.789-8.090-7.68-16.589-12.493-26.931-1.434-3.072-4.915-10.957-7.885-17.408-7.373-16.179-25.19-55.296-29.184-64-1.843-3.891-4.813-10.547-6.758-14.643-1.946-4.198-3.482-7.68-3.482-7.885 0-0.102-2.355-5.325-5.222-11.366-10.24-21.914-12.39-29.901-12.493-47.002-0.102-9.728 0.307-12.39 2.765-19.456 11.878-34.406 50.586-56.422 86.118-49.152 13.824 2.867 24.576 9.114 35.738 20.787 9.728 10.138 16.998 22.528 27.238 46.285 2.97 7.066 7.27 16.589 9.421 21.299s3.891 8.704 3.891 8.909c0 0.307 20.685 47.718 34.816 79.872 2.662 6.246 13.824 31.539 24.576 56.32 10.854 24.781 20.582 47.104 21.709 49.664s8.192 18.944 15.872 36.352c7.578 17.51 14.746 33.792 15.872 36.352 1.229 2.56 3.584 8.090 5.427 12.288 3.584 8.294 20.275 46.694 22.528 51.712 0.717 1.741 2.355 5.427 3.584 8.192 2.662 6.144 36.352 83.251 38.912 89.088 13.926 31.539 15.974 36.454 18.534 45.67 7.373 26.317-0.307 53.453-20.378 71.578-7.782 6.963-17.715 12.288-29.594 15.667l-7.987 2.253-158.208 0.102c-87.040 0.102-160.563-0.205-163.533-0.614z" />
+<glyph unicode="&#xe926;" glyph-name="Age-rating_18" d="M0 448v-512h1024v1024h-1024v-512zM1003.52 448v-491.52h-983.040v983.040h983.040v-491.52zM657.92 780.698c-19.251-2.56-24.883-3.584-37.376-6.656-31.027-7.578-60.621-21.504-82.944-39.117-13.517-10.65-31.027-31.232-40.243-47.411-7.782-13.619-14.746-33.997-17.51-51.507-2.867-18.432-1.434-51.302 3.072-70.758 6.861-29.389 22.016-55.501 46.899-80.486l7.68-7.885-9.421-7.066c-23.757-17.92-40.858-35.123-52.634-53.35-12.698-19.456-23.040-47.616-25.395-69.222-0.41-3.174-0.819-6.861-1.126-8.090-0.614-3.174-0.512-32.051 0.102-37.581 5.53-44.646 14.746-70.451 35.738-100.352 31.437-44.851 81.101-75.366 142.438-87.552 19.046-3.686 30.003-4.813 53.248-5.12 29.901-0.41 49.357 1.638 74.035 7.68 66.253 16.179 115.917 53.658 144.282 108.749 9.318 18.022 16.691 41.165 19.251 60.211 0.41 3.072 0.922 6.554 1.229 7.68 1.229 5.325 1.536 42.086 0.41 51.405-6.144 51.507-29.696 89.088-78.438 125.338l-9.83 7.168 8.602 8.397c35.533 34.918 50.483 69.632 51.507 119.501 0.717 41.472-7.885 70.349-29.901 99.635-14.848 19.661-34.918 36.659-58.88 49.664-13.414 7.27-42.496 18.33-53.248 20.173-1.536 0.307-5.632 1.229-9.011 2.048-13.107 3.379-33.792 5.427-55.398 5.427-11.571-0.102-23.757-0.41-27.136-0.922zM700.826 655.872c10.342-2.662 18.125-6.861 26.419-14.438 8.602-7.68 15.258-17.613 18.842-28.058 2.56-7.168 2.867-9.728 2.867-20.48 0-20.173-5.222-33.075-19.354-47.104-19.968-19.968-47.718-24.576-73.114-12.083-10.957 5.427-24.781 19.149-30.003 30.003-5.427 11.264-6.349 15.462-6.349 29.184 0.102 13.619 1.843 20.582 7.885 31.232 5.12 9.011 19.251 22.426 28.365 26.931 13.824 6.861 29.696 8.602 44.442 4.813zM703.898 419.84c24.269-5.734 47.514-24.883 58.573-48.128 13.926-29.491 9.626-62.976-11.366-89.293-27.136-33.894-76.595-41.882-112.742-18.227-8.294 5.53-19.661 16.998-25.19 25.6-9.728 14.95-13.312 27.648-13.414 46.080 0 23.757 8.294 44.032 24.883 60.621 20.89 20.89 51.302 29.901 79.258 23.347zM151.552 765.338c-27.443-4.506-48.538-22.528-54.784-46.899-2.15-8.192-2.253-24.986-0.205-33.382 4.301-18.33 16.179-32.256 35.021-41.062 14.746-6.861 14.336-6.758 76.8-7.578h3.072v-224.563c-0.102-241.357-0.307-232.243 5.12-247.91 4.71-13.619 16.998-30.31 27.648-37.581 16.179-10.957 41.574-14.438 62.976-8.397 23.757 6.554 42.086 27.955 48.538 56.627 1.638 7.168 1.946 48.333 1.946 270.848 0 192.717-0.307 255.59-1.331 260.608-6.042 33.075-25.907 53.248-57.856 58.88-7.475 1.229-19.866 1.536-75.162 1.434-36.352-0.102-68.71-0.512-71.782-1.024z" />
+<glyph unicode="&#xe927;" glyph-name="age-rating_mono_3" d="M0 448v-512h1024v1024h-1024v-512zM522.342 781.722c56.525-1.126 112.947-26.214 144.691-64.307 19.866-23.859 32.256-51.098 36.864-80.998 1.741-10.854 1.536-37.069-0.307-50.483-2.765-20.275-9.114-39.014-18.125-54.067-9.626-15.974-27.034-34.816-43.622-47.206-6.554-4.915-8.294-6.963-5.939-6.963 1.434 0 20.685-11.776 29.184-17.715 38.298-27.238 62.362-61.542 71.782-102.605 7.68-33.485 4.608-76.595-7.987-110.592-16.282-44.134-45.978-79.667-87.654-104.858-30.208-18.227-64-28.979-102.605-32.768-8.909-0.922-50.688-0.717-55.296 0.307-1.434 0.307-6.451 1.024-11.264 1.638-31.13 4.198-61.645 14.848-87.45 30.413-40.346 24.474-77.21 68.301-90.214 107.315-3.072 9.216-6.656 28.058-6.656 35.021 0 13.619 6.451 30.31 16.282 41.984 15.77 18.739 33.382 26.829 55.91 25.6 17.613-1.024 31.539-7.066 41.984-18.33 2.97-3.174 9.216-12.39 13.926-20.48 15.258-26.522 19.456-32.666 27.546-40.755 14.438-14.438 31.437-23.654 49.664-27.136 5.939-1.126 24.269-0.512 31.949 1.126 18.432 3.789 31.846 11.162 43.93 24.166 10.65 11.571 16.589 23.45 19.558 39.117 1.843 9.83 1.229 30.72-1.126 39.322-7.885 28.57-31.744 45.158-71.782 49.869-2.253 0.307-6.349 0.717-9.216 1.024-14.848 1.741-30.515 5.734-39.936 10.24-12.595 5.939-23.552 18.944-28.262 33.485-2.15 6.451-2.458 9.421-2.458 22.323 0 12.8 0.307 15.77 2.355 21.709 2.765 7.987 6.758 13.926 13.312 19.968 8.602 7.885 19.558 12.493 52.634 22.221 8.909 2.662 19.251 6.144 23.040 7.987 26.214 12.083 40.448 32.666 40.346 58.163-0.102 44.442-55.296 66.867-98.816 40.243-11.162-6.758-18.125-12.8-35.226-30.106-22.733-23.245-35.021-31.744-51.61-36.25-9.216-2.458-24.371-1.741-33.075 1.536-16.077 6.144-31.13 21.197-37.786 37.786-5.939 15.155-4.915 38.912 2.458 59.187 18.739 51.098 82.022 95.027 157.696 109.773 13.824 2.662 38.502 5.427 41.062 4.506 0.307-0.102 4.915-0.307 10.24-0.41z" />
+<glyph unicode="&#xe928;" glyph-name="age-rating_mono_4" d="M0 448v-512h1024v1024h-1024v-512zM579.379 775.168c21.914-3.277 37.683-10.752 52.531-24.781 12.698-12.083 22.733-27.955 27.853-43.827 5.53-17.203 5.12-6.246 5.53-166.605 0.307-139.264 0.512-148.275 2.15-148.378 0.922 0 6.349-0.205 11.981-0.307 16.282-0.512 24.781-2.355 35.635-7.885 16.998-8.602 28.058-23.040 32.051-41.984 2.048-9.421 1.229-19.558-2.15-30.515-8.704-27.341-37.683-47.718-69.018-48.538l-9.83-0.205-0.614-43.52c-0.41-26.112-1.126-45.363-1.741-48.128-5.53-22.528-17.613-39.424-34.611-48.333-15.872-8.397-42.189-9.318-59.392-2.253-14.541 5.939-27.341 19.456-34.202 36.25-6.042 14.541-6.349 18.227-6.656 63.488-0.102 22.835-0.307 41.677-0.41 41.984 0 0.307-44.032 0.614-97.587 0.614-53.658 0-100.147 0.41-103.219 0.717-24.269 2.765-46.080 14.541-55.603 30.003-8.499 13.722-10.035 37.581-3.584 54.17 0.717 1.741 5.427 10.957 10.547 20.48 5.222 9.626 11.571 21.606 14.336 26.624 2.662 5.12 5.734 10.65 6.656 12.288 1.741 3.072 4.71 8.602 13.824 25.6 2.765 5.12 10.445 19.251 17.101 31.539s12.083 22.528 12.083 22.733c0 0.205 1.741 3.482 3.891 7.373 2.15 3.789 5.939 10.65 8.397 15.155 35.942 66.867 53.555 99.533 56.525 104.96 1.946 3.686 7.168 13.312 11.571 21.504s9.216 17.203 10.752 19.968c1.536 2.867 7.782 14.336 13.824 25.6 15.872 29.491 16.794 31.13 21.299 37.888 18.432 27.546 44.646 47.718 70.451 54.374 11.162 2.867 28.262 3.686 39.629 1.946zM527.258 590.131c-0.717-1.331-2.458-4.608-3.994-7.475-1.536-2.765-5.837-11.059-9.728-18.432-3.789-7.27-8.192-15.565-9.728-18.432-1.536-2.765-5.734-10.65-9.216-17.408-3.584-6.758-8.192-15.462-10.24-19.456-2.15-3.891-8.602-16.179-14.336-27.136s-12.493-23.654-14.848-28.16c-2.355-4.506-6.963-13.21-10.24-19.456-7.885-15.053-13.312-25.088-18.125-33.997-2.253-4.096-3.789-7.782-3.584-8.192 0.41-0.614 98.611-0.922 104.653-0.41 0.717 0.102 1.024 33.485 1.024 100.454 0 55.194-0.102 100.352-0.205 100.352s-0.819-1.024-1.434-2.253z" />
+<glyph unicode="&#xe929;" glyph-name="age-rating_mono_7" d="M0 448v-512h1024v1024h-1024v-512zM669.184 765.44c25.395-3.686 44.646-16.998 55.603-38.605 6.758-13.21 8.602-33.28 4.506-48.947-2.867-10.752-1.434-7.373-61.645-144.896-7.782-17.715-22.016-50.483-31.744-72.704-9.626-22.221-18.432-42.496-19.558-44.954-1.229-2.458-13.107-29.696-26.522-60.416-88.986-204.083-86.733-199.168-96.256-212.070-11.776-15.872-28.16-26.829-44.442-29.696-10.24-1.843-24.986-0.717-35.226 2.662-20.173 6.861-36.966 21.094-45.875 38.81-9.114 18.33-8.294 42.906 2.048 65.229 1.946 4.096 8.192 17.818 13.926 30.515 12.288 27.034 25.395 55.706 30.413 66.56 2.048 4.198 5.632 12.288 8.192 17.92 4.301 9.626 33.997 74.752 57.958 126.976 3.072 6.758 6.861 15.053 8.397 18.432s3.994 8.704 5.325 11.776c2.662 5.837 11.366 24.883 17.306 37.683 1.946 4.096 3.482 7.578 3.482 7.782s2.048 4.71 4.506 9.933c2.458 5.325 7.885 17.203 12.186 26.522 4.198 9.318 9.011 19.866 10.752 23.552 2.97 6.451 11.878 26.010 15.565 34.304 1.024 2.253 1.741 4.301 1.536 4.403-0.205 0.205-47.718 0.512-105.677 0.614-102.81 0.307-105.472 0.307-112.435 2.355-32.666 9.626-50.483 32.768-49.562 64.717 0.614 21.914 9.421 38.4 26.726 49.869 7.987 5.325 17.203 9.114 27.443 11.162 8.397 1.638 311.398 2.15 323.072 0.512z" />
+<glyph unicode="&#xe92a;" glyph-name="age-rating_mono_9" d="M0 448v-512h1024v1024h-1024v-512zM530.944 780.8c44.339-4.608 80.998-17.306 114.995-39.936 51.917-34.611 86.63-92.365 92.877-155.136 0.41-3.891 0.922-8.090 1.126-9.216 0.614-2.97 0.512-36.864-0.102-43.52-1.229-13.107-1.741-17.51-3.686-29.594-5.632-35.635-16.998-69.53-35.738-106.598-32.154-63.488-72.397-122.061-139.674-203.264-5.12-6.144-14.336-17.203-20.378-24.576-6.144-7.27-16.282-18.534-22.528-24.883-20.070-20.378-31.949-29.082-45.261-33.28-9.933-3.174-27.341-3.072-38.707 0.102-19.661 5.53-39.117 19.866-46.285 33.997-4.403 8.806-5.734 14.131-5.632 24.576 0 12.8 2.662 23.347 9.216 36.352 5.632 11.264 11.571 19.149 26.419 35.328 5.427 5.837 12.698 13.722 16.077 17.408 3.277 3.686 7.987 8.704 10.342 11.264 14.234 15.258 73.626 90.112 71.578 90.112-0.41 0-5.325-1.229-11.059-2.662-18.125-4.608-24.678-5.325-42.189-5.018-9.011 0.205-17.306 0.512-18.432 0.819s-4.301 0.819-7.066 1.126c-16.486 2.253-36.659 8.806-54.067 17.51-51.098 25.6-88.371 72.090-102.707 128-9.626 37.581-7.782 84.378 5.018 125.952 13.005 42.496 39.731 82.432 71.987 107.725 13.312 10.445 36.966 24.474 49.971 29.696 1.741 0.717 5.325 2.15 8.090 3.379 13.005 5.53 42.906 12.595 58.778 13.926 4.301 0.41 7.987 0.819 8.192 0.922 0.922 0.819 40.346 0.41 48.845-0.512zM487.219 635.494c-24.883-6.861-47.104-26.522-56.627-49.971-7.987-19.866-7.168-44.544 1.946-64.307 6.246-13.414 17.613-26.214 31.437-35.533 12.902-8.602 25.805-12.39 42.906-12.39 14.336 0 22.63 1.946 35.328 7.987 16.691 8.090 30.822 22.118 38.912 38.912 6.144 12.493 8.090 21.709 7.987 36.352-0.205 19.968-5.12 33.69-17.613 49.254-10.854 13.619-27.341 24.883-42.803 29.184-9.216 2.662-32.768 2.867-41.472 0.512z" />
+<glyph unicode="&#xe92b;" glyph-name="age-rating_mono_12" d="M0 448v-512h1024v1024h-1024v-512zM688.128 781.312c20.685-1.126 43.622-6.349 64.512-14.541 75.878-29.696 124.006-97.587 124.109-175.104 0.102-37.786-7.168-70.861-22.733-103.117-11.366-23.757-29.696-53.146-47.104-75.878-2.662-3.379-6.861-8.909-9.421-12.288-4.71-6.246-38.093-45.773-44.954-53.248-2.048-2.253-8.192-9.114-13.722-15.36-15.974-17.92-33.28-36.352-53.965-57.344l-19.149-19.456 84.173-0.614c94.208-0.614 89.702-0.205 105.882-8.192 22.323-11.059 34.406-31.13 34.304-56.934 0-11.776-1.946-20.48-6.349-29.491-5.939-12.186-19.149-23.757-33.792-29.491-14.848-5.837-9.523-5.632-178.688-5.632-85.606 0-158.618 0.41-162.304 0.922-19.661 2.56-35.43 9.216-45.363 19.046-17.101 16.896-21.811 48.23-10.65 70.861 1.741 3.686 6.554 11.162 10.65 16.486 7.475 10.035 8.294 10.957 17.715 21.299 3.072 3.277 6.554 7.168 7.68 8.499s4.608 5.222 7.578 8.602c3.072 3.379 6.963 7.782 8.704 9.728s10.24 11.571 18.944 21.504c8.602 9.83 17.203 19.558 18.944 21.504s14.95 16.998 29.184 33.28c14.336 16.384 28.672 32.666 31.949 36.352 54.374 61.85 79.872 93.082 98.406 120.832 21.914 32.87 28.57 67.072 18.33 94.31-8.909 23.347-28.672 38.912-51.405 40.141-25.805 1.536-47.206-9.216-61.133-30.413-6.349-9.728-10.752-20.582-16.179-39.731-11.059-39.629-14.643-47.616-26.010-59.187-11.571-11.981-23.040-16.384-42.496-16.384-30.618 0-53.146 15.974-63.386 44.851-7.885 22.221-3.891 63.59 9.318 96.973 27.75 70.042 93.082 122.266 168.96 135.168 8.397 1.434 34.918 3.482 37.683 2.97 0.614-0.205 5.837-0.512 11.776-0.922zM313.856 765.44c31.642-4.506 52.838-24.371 59.699-55.706 1.638-7.782 1.741-24.986 1.741-268.39v-260.096l-2.355-9.421c-2.355-9.114-9.114-24.064-13.517-29.798-13.824-17.92-29.389-25.6-53.35-26.522-15.77-0.717-24.883 1.024-36.557 6.861-22.323 11.264-37.581 35.942-39.731 64.41-0.41 4.915-0.717 108.032-0.819 229.274l-0.102 220.467-29.184 0.307c-25.907 0.307-30.106 0.614-37.274 2.56-23.654 6.349-40.141 20.89-46.797 41.267-2.048 6.349-2.458 9.421-2.458 20.787 0 11.264 0.41 14.541 2.56 20.89 3.789 11.571 11.059 21.811 20.89 29.184 9.216 6.963 20.787 11.776 33.178 13.926 7.168 1.229 135.578 1.126 144.077 0z" />
+<glyph unicode="&#xe92c;" glyph-name="age-rating_mono_16" d="M0 448v-512h1024v1024h-1024v-512zM744.448 778.65c24.371-7.987 43.315-24.883 48.64-43.315 2.97-10.138 2.253-25.6-1.638-37.581-3.891-11.776-12.698-27.238-20.582-35.84-3.277-3.686-27.853-29.798-32.051-34.099-18.637-19.251-81.306-98.918-76.595-97.485 6.042 1.843 22.016 5.632 26.419 6.246 2.867 0.41 6.246 0.922 7.68 1.126 3.379 0.512 25.293 0.512 29.184 0 1.741-0.307 5.427-0.717 8.192-1.024 39.526-4.198 82.534-25.805 112.435-56.422 35.942-36.864 55.706-84.070 56.525-135.168 0.512-37.376-4.71-67.174-17.613-99.328-31.027-77.414-100.659-128.307-187.187-136.602-9.626-0.922-46.080-0.717-55.808 0.41-56.73 6.246-108.646 30.31-144.282 66.97-34.509 35.533-55.501 80.896-60.416 131.174-1.331 13.005-1.331 41.062-0.102 54.374 5.632 60.314 24.678 111.923 68.403 184.218 30.31 50.176 82.125 119.194 136.294 181.248 28.774 32.973 46.49 47.002 66.662 52.736 7.987 2.253 26.829 1.434 35.84-1.638zM326.656 763.699c28.877-8.397 45.158-26.112 50.893-55.501 1.536-8.090 1.741-28.979 1.843-263.782 0-201.728-0.205-256.819-1.229-263.987-4.608-31.334-23.45-55.194-49.459-62.464-12.39-3.379-28.058-3.891-40.346-1.126-26.214 5.939-46.899 28.672-53.453 58.573-1.638 7.27-1.741 26.419-1.843 233.882-0.102 124.211-0.41 226.202-0.717 226.611-0.41 0.307-13.517 0.717-29.184 0.922-29.901 0.307-33.587 0.717-45.875 5.427-26.010 9.83-40.653 31.13-40.653 59.085 0.102 24.576 10.24 42.803 30.72 54.784 6.042 3.584 18.432 8.090 25.702 9.318 2.56 0.41 36.454 0.717 75.264 0.614 69.222-0.205 70.861-0.205 78.336-2.355zM655.872 416.154c-16.486-2.765-32.154-11.162-44.851-24.166-18.432-18.944-26.112-41.37-23.040-67.379 3.891-33.792 31.437-63.693 64.819-70.656 9.216-1.843 28.467-1.434 37.171 0.922 18.125 4.915 34.406 16.282 46.080 32.154 21.811 29.696 20.992 69.734-1.946 97.997-13.005 16.077-26.829 24.883-47.002 30.208-5.734 1.536-24.371 2.048-31.232 0.922z" />
+<glyph unicode="&#xe92d;" glyph-name="age-rating_mono_17" d="M0 448v-512h1024v1024h-1024v-512zM348.672 765.030c17.51-3.174 29.696-9.421 40.346-20.685 6.758-7.168 11.571-15.462 14.95-25.498 4.608-13.722 4.506-6.758 4.301-280.064-0.307-287.437 0.307-263.168-7.066-280.371-4.403-10.24-9.728-18.125-16.691-24.883-12.595-12.186-25.498-17.306-45.67-18.125-15.974-0.614-25.19 1.229-37.069 7.27-14.541 7.475-26.931 21.914-33.587 39.117-1.741 4.506-3.379 9.114-3.584 10.24-2.458 12.083-2.56 28.058-2.662 239.923v224.461h-4.198c-56.627 0.614-59.29 0.819-73.421 6.554s-27.75 18.227-32.973 30.31c-4.506 10.342-5.325 14.541-5.325 28.16 0 11.264 0.307 14.438 2.355 20.48 7.373 21.914 24.883 36.966 49.357 42.394 7.885 1.843 13.926 1.946 75.674 2.048 53.862 0.102 68.71-0.205 75.264-1.331zM832.819 763.699c28.467-8.090 47.206-28.57 51.917-56.832 2.765-16.384-1.126-33.69-13.926-60.928-1.843-4.096-3.482-7.68-3.482-7.987 0-0.205-1.126-2.867-2.458-5.837-2.15-4.813-33.69-76.902-39.526-90.419-1.229-2.765-2.867-6.451-3.584-8.192-2.253-5.018-18.944-43.418-22.528-51.712-1.843-4.198-4.198-9.728-5.325-12.288-2.15-4.813-6.246-14.029-21.094-48.128-4.813-10.957-9.626-22.016-10.752-24.576s-10.854-24.883-21.709-49.664c-10.752-24.781-21.914-50.074-24.576-56.32-14.131-32.154-34.816-79.565-34.816-79.872 0-0.205-1.741-4.198-3.891-8.909s-6.451-14.234-9.421-21.299c-12.698-29.491-22.016-43.418-36.966-55.296-22.528-17.818-57.651-17.306-84.582 1.126-12.083 8.294-22.835 22.426-27.546 36.25-2.458 7.066-2.867 9.728-2.765 19.456 0.102 17.101 2.253 25.088 12.493 47.002 2.867 6.042 5.222 11.264 5.222 11.366 0 0.205 1.536 3.686 3.482 7.885 1.946 4.096 4.915 10.752 6.758 14.643 3.994 8.704 21.811 47.821 29.184 64 2.97 6.451 6.451 14.336 7.885 17.408 4.813 10.342 8.704 18.842 12.493 26.931 2.048 4.403 3.686 8.192 3.686 8.397 0 0.102 2.048 4.608 4.506 9.83 2.458 5.325 6.656 14.438 9.318 20.378s6.349 14.029 8.192 17.92c1.843 3.994 4.403 9.523 5.632 12.288 1.331 2.867 7.373 16.179 13.517 29.696 6.246 13.517 16.896 37.069 23.859 52.224 6.963 15.258 13.926 30.618 15.667 34.304 1.638 3.686 5.325 11.776 8.192 17.92 9.011 19.763 10.65 23.347 14.234 31.232 1.946 4.198 5.632 12.288 8.192 17.92s5.12 10.854 5.632 11.571c0.819 0.922 0.205 1.229-2.355 1.331-1.946 0-48.435 0-103.322 0.102-91.648 0.102-100.557 0.205-108.851 1.946-21.504 4.301-39.014 16.998-47.206 34.202-4.813 9.83-6.144 16.589-6.144 29.696 0.102 19.149 4.915 31.539 16.896 43.418 10.342 10.342 24.678 17.306 40.141 19.558 2.97 0.41 76.493 0.717 163.533 0.614l158.208-0.102 7.987-2.253z" />
+<glyph unicode="&#xe92e;" glyph-name="age-rating_mono_18" d="M0 448v-512h1024v1024h-1024v-512zM720.179 779.674c7.782-1.024 16.896-2.56 20.275-3.482 3.379-0.819 7.475-1.741 9.011-2.048 1.536-0.205 7.168-1.843 12.493-3.482 34.714-10.752 62.874-27.136 84.992-49.562 24.781-25.088 38.605-52.838 43.418-87.245 2.048-14.336 1.331-45.466-1.434-60.109-6.246-34.099-21.504-61.645-48.947-88.576l-8.602-8.397 9.83-7.168c48.742-36.25 72.294-73.83 78.438-125.338 1.126-9.318 0.819-46.080-0.41-51.405-0.307-1.126-0.819-4.608-1.229-7.68-2.56-19.046-9.933-42.189-19.251-60.211-25.088-48.64-66.355-83.354-121.856-102.298-19.456-6.554-44.544-11.878-63.693-13.414-14.131-1.126-50.995-0.717-62.976 0.717-83.661 9.933-148.48 52.019-181.146 117.453-10.65 21.504-15.872 40.858-20.070 74.138-0.614 5.53-0.717 34.406-0.102 37.581 0.307 1.229 0.717 4.915 1.126 8.090 2.355 21.606 12.698 49.766 25.395 69.222 10.342 15.974 23.552 29.901 45.261 47.821 1.126 0.922 5.427 4.096 9.523 7.168l7.373 5.427-6.861 6.861c-25.088 24.986-40.96 51.917-47.821 81.51-4.506 19.456-5.939 52.326-3.072 70.758 5.222 32.666 19.968 61.85 43.315 85.402 15.77 15.872 28.774 25.088 49.766 35.43 16.486 8.090 29.798 12.902 47.616 17.203 12.493 3.072 18.125 4.096 37.376 6.656 11.674 1.638 47.206 1.024 62.259-1.024zM298.496 764.928c31.949-5.632 51.814-25.805 57.856-58.88 1.024-5.018 1.331-67.891 1.331-260.608 0-139.674-0.307-257.434-0.717-261.632-1.536-15.155-6.758-29.286-15.462-41.472-6.451-9.011-13.722-15.155-23.552-19.968-19.149-9.523-45.261-9.83-64.512-0.922-8.090 3.789-11.059 5.837-18.227 12.902-10.547 10.445-18.33 24.883-21.811 40.755-1.638 7.68-1.843 22.118-1.946 234.189 0 124.314-0.307 226.304-0.717 226.611-0.307 0.307-13.414 0.717-29.082 0.922-31.744 0.307-37.069 1.126-50.074 7.168-18.842 8.806-30.72 22.733-35.021 41.062-2.048 8.397-1.946 25.19 0.205 33.382 6.246 24.371 27.341 42.394 54.784 46.899 3.072 0.512 35.43 0.922 71.782 1.024 55.296 0.102 67.686-0.205 75.162-1.434zM670.72 656.282c-11.469-2.355-20.89-7.885-30.72-17.715-9.421-9.421-13.824-16.179-17.51-26.726-1.843-5.427-2.253-8.909-2.355-18.944 0-13.722 0.922-17.92 6.349-29.184 5.222-10.854 19.046-24.576 30.003-30.003 25.395-12.493 53.146-7.885 73.114 12.083 14.131 14.029 19.354 26.931 19.354 47.104 0 10.752-0.307 13.312-2.867 20.48-5.222 15.155-17.818 30.106-31.437 37.376-12.493 6.656-29.184 8.704-43.93 5.53zM673.28 421.171c-17.203-2.253-35.635-11.674-48.64-24.678-7.68-7.68-11.162-12.595-16.384-23.040-6.246-12.39-8.499-22.938-8.499-38.093 0.205-24.474 7.782-42.496 25.293-59.904 13.107-13.107 27.955-20.787 45.568-23.654 30.618-5.018 61.338 6.656 80.486 30.618 10.035 12.595 16.794 27.853 18.739 42.394 4.915 36.25-15.258 72.499-49.254 88.781-15.155 7.27-31.13 9.83-47.309 7.578z" />
+<glyph unicode="&#xe92f;" glyph-name="agriculture" d="M245.76 779.674c-12.902-2.458-28.16-14.131-34.611-26.317-6.144-11.571-5.734-3.789-6.349-137.318l-0.512-123.29-19.661-11.366c-10.752-6.246-21.094-12.8-22.938-14.438-6.656-6.246-9.216-16.486-6.451-25.805 2.15-6.963 6.451-11.878 13.21-15.155 11.571-5.734 21.504-2.867 41.574 11.981 33.485 24.781 61.952 34.304 104.858 35.123 20.685 0.41 26.624-0.205 45.978-4.198 47.821-10.138 91.853-40.448 119.398-82.432 20.992-31.949 31.539-67.482 31.744-106.598v-11.059h142.438l-3.584-6.861c-9.523-18.944-12.8-40.346-9.318-61.235 8.602-50.995 53.76-87.654 105.062-85.197 26.829 1.331 49.766 11.469 68.608 30.31 15.77 15.77 26.522 36.966 29.184 57.549 0.614 4.608 7.373 44.134 14.746 85.914 5.12 29.389 8.294 47.514 13.824 79.36 9.626 55.501 10.854 62.771 12.8 72.294 3.994 19.763 0.102 34.714-12.902 48.23-10.752 11.264-21.094 15.155-44.442 16.691-8.294 0.512-27.341 1.843-44.339 3.174-4.403 0.307-8.806 0.717-9.728 0.922s-2.765 0.41-4.096 0.41l-2.355 0.102 0.307 62.259 0.307 62.362 3.072 5.018c3.789 6.042 11.162 11.264 17.408 12.288l4.608 0.614v50.995h-15.667c-16.998 0-23.859-1.229-33.28-5.734-7.066-3.482-16.179-11.981-20.685-19.456-7.066-11.776-7.066-11.059-7.066-91.648-0.102-39.731-0.307-72.499-0.614-72.704-0.205-0.307-4.506-0.205-9.421 0.205s-13.414 1.024-18.739 1.331c-5.325 0.41-11.776 0.922-14.336 1.126s-9.216 0.717-14.848 1.024c-5.632 0.307-12.493 0.819-15.36 1.024-2.765 0.205-9.216 0.717-14.336 1.024-5.018 0.307-11.776 0.819-14.848 1.024s-9.728 0.717-14.848 1.024c-5.018 0.307-11.776 0.819-14.848 1.126-3.072 0.205-9.011 0.717-13.21 0.922-4.198 0.307-7.885 0.717-8.090 1.024-0.307 0.205-7.373 23.654-15.77 51.917-8.294 28.365-18.432 62.566-22.426 76.083-4.096 13.517-7.68 26.010-8.192 27.648-0.41 1.741-2.253 7.885-3.994 13.824-3.277 10.65-6.554 21.914-11.674 39.219-1.434 4.915-2.662 9.421-2.662 10.035s-1.229 3.686-2.765 6.861c-6.656 14.438-18.534 24.269-33.587 28.262-5.427 1.434-18.842 1.536-109.056 1.536-56.627-0.102-104.96-0.512-107.52-1.024zM453.018 724.787c0.819-2.765 3.686-12.288 6.246-21.299 2.662-9.011 8.602-29.286 13.312-45.056s9.011-30.31 9.523-32.256c1.946-7.066 29.082-98.714 29.594-100.045 0.41-1.126-21.197-1.331-127.59-1.331h-128.102v204.8h195.379l1.638-4.813zM303.104 447.283c-52.122-6.758-93.491-31.846-121.754-73.933-18.842-28.058-27.853-59.187-27.238-94.822 0.307-26.829 5.018-46.387 16.896-70.656 24.166-49.254 69.222-81.818 125.952-91.034 13.005-2.15 40.55-1.434 54.374 1.331 33.792 6.758 61.645 21.709 86.016 46.080 31.437 31.437 47.616 69.222 48.64 113.254 0.614 29.082-4.301 51.712-16.486 76.8-24.269 49.971-71.782 84.378-126.976 92.058-9.114 1.229-32.563 1.843-39.424 0.922zM342.63 394.342c14.848-3.174 30.003-9.728 42.803-18.227 8.499-5.734 24.678-22.221 30.618-31.334 25.395-38.81 25.19-88.064-0.512-127.181-6.144-9.318-22.323-25.395-32.051-31.642-47.718-31.027-109.261-24.371-148.173 16.077-22.426 23.347-33.894 53.35-32.256 84.582 1.536 29.798 12.39 54.477 33.382 75.469 18.432 18.432 40.96 29.901 66.15 33.587 8.909 1.331 31.642 0.512 40.038-1.331z" />
+<glyph unicode="&#xe930;" glyph-name="airbox_auto" d="M242.381 753.664c-7.168-1.946-15.565-6.451-20.992-11.264-5.325-4.608-161.997-213.402-165.683-220.672-5.632-11.264-5.53-9.011-5.53-112.64 0-103.834-0.102-100.352 5.734-112.538 3.789-7.782 14.541-18.432 22.426-22.118 9.728-4.608 14.643-5.427 31.949-5.632 8.806 0 16.179-0.205 16.282-0.307s0.512-4.301 0.819-9.216c1.638-22.426 9.626-44.749 22.63-63.693 6.656-9.626 23.859-26.624 33.28-32.666 15.258-10.035 32.973-17.306 49.152-20.173 11.571-2.048 36.557-1.843 47.104 0.41 42.906 9.114 76.493 36.557 93.491 76.493 5.427 12.8 9.83 32.87 9.933 44.851v4.301h230.4l0.102-4.301c0.102-10.445 2.97-25.498 6.758-36.659 10.752-31.949 33.997-58.368 64.614-73.728 18.944-9.421 36.762-13.21 60.109-12.8 20.582 0.41 35.533 4.096 54.067 13.414 12.902 6.451 21.094 12.595 33.075 24.474 21.811 21.811 34.509 49.254 36.864 79.872 0.307 5.12 0.717 9.318 0.819 9.421s13.107 0.307 28.979 0.307c20.89 0.102 30.208 0.512 34.099 1.536 18.125 4.813 32.666 19.354 37.376 37.478 2.253 8.602 2.253 168.755 0 177.562-2.458 9.421-6.554 16.589-13.414 23.654-8.090 8.192-17.51 12.8-32.154 15.667-5.939 1.126-27.75 5.325-48.64 9.216-20.787 3.994-45.056 8.602-53.76 10.24l-15.872 3.174-8.704 8.909c-8.806 9.114-14.336 15.053-40.96 43.315-8.192 8.704-18.33 19.456-22.63 24.064-4.301 4.506-9.114 9.626-10.65 11.264-1.536 1.741-9.114 9.728-16.896 17.92-7.68 8.192-15.565 16.486-17.408 18.432-5.018 5.427-27.034 28.979-36.352 38.81-4.506 4.71-10.24 10.752-12.595 13.312-13.824 14.643-21.197 21.504-26.317 24.576-11.981 7.27 2.56 6.758-191.488 6.963-142.541 0.102-176.026-0.102-180.019-1.229zM456.192 694.784c37.581-3.482 75.469-15.974 107.418-35.635 8.909-5.427 31.744-21.914 32.768-23.654 0.307-0.41-0.205-1.741-1.229-2.765-0.922-1.126-4.71-5.427-8.397-9.626s-7.782-9.011-9.216-10.547l-2.662-2.867-3.994 3.482c-24.166 20.173-54.067 34.918-88.576 43.622-28.262 7.168-71.066 6.656-100.864-1.024s-58.266-21.606-80.384-39.219c-3.686-2.97-7.168-5.632-7.885-6.042-0.717-0.512-5.325 3.994-12.083 11.776l-10.854 12.493 2.355 1.946c32.563 26.317 62.976 41.882 101.274 51.814 7.475 1.946 31.334 5.939 38.81 6.554 10.752 0.819 32.768 0.717 43.52-0.307zM464.384 627.712c29.798-5.427 55.706-17.203 79.155-35.635l6.349-5.018-5.837-6.758c-3.277-3.789-7.373-8.397-9.216-10.445-1.741-1.946-3.994-4.608-5.12-5.939l-1.843-2.253-5.12 4.096c-11.981 9.728-28.467 18.637-43.725 23.654-16.589 5.427-24.371 6.554-43.827 6.554-18.739 0-22.733-0.307-33.792-2.97-20.173-4.608-44.339-16.589-57.856-28.365-2.97-2.662-3.789-2.867-4.813-1.741-5.427 5.632-20.275 23.245-20.275 24.064 0 0.512 3.072 3.277 6.963 6.144 26.214 19.763 52.838 30.925 85.197 35.635 11.878 1.741 41.984 1.229 53.76-1.024zM450.56 562.074c19.558-3.072 38.605-11.469 52.634-23.142l2.97-2.458-11.059-12.493-10.957-12.595-3.379 2.56c-8.806 6.758-16.998 10.65-29.594 13.926-8.806 2.355-27.648 2.15-36.966-0.41-8.294-2.253-19.354-7.68-25.498-12.288-5.837-4.506-3.686-5.837-17.92 10.65l-9.318 10.752 2.253 1.843c4.608 3.686 15.77 10.752 22.016 13.926 19.149 9.626 43.213 13.21 64.819 9.728zM451.277 487.629c10.854-5.632 16.691-15.053 16.691-27.136 0-26.419-32.256-39.731-50.893-21.094-6.042 6.042-8.704 12.493-8.806 20.992-0.102 7.373 1.229 11.469 5.53 17.92 7.885 11.674 24.678 15.77 37.478 9.318z" />
+<glyph unicode="&#xe931;" glyph-name="alarm_clock" d="M248.32 882.074c-17.101-3.174-27.136-9.011-49.357-28.365-9.421-8.294-29.901-26.112-45.363-39.629s-29.798-26.010-31.744-27.75c-1.946-1.741-7.987-7.066-13.312-11.776-11.776-10.445-13.107-11.878-18.842-20.378-8.397-12.39-11.878-23.757-12.39-39.936-0.614-17.92 3.891-33.178 13.517-46.285 3.686-4.915 41.574-48.845 57.242-66.355 1.741-1.946 5.939-6.758 9.318-10.65l6.042-6.963-5.325-12.493c-13.21-30.72-24.371-73.216-27.546-105.062-0.41-3.686-0.922-7.782-1.229-9.216-0.922-5.325-1.126-54.17-0.205-65.024 1.946-22.835 7.066-51.917 12.39-70.656 1.126-3.891 2.458-8.806 2.97-10.752 3.072-12.288 13.619-38.912 23.040-57.856 16.282-33.075 36.25-62.157 63.181-91.955l6.963-7.68-26.214-45.261c-14.336-24.883-26.829-46.899-27.75-48.947-8.192-19.046-4.813-39.834 9.011-54.989 12.595-13.722 31.13-19.558 49.254-15.36 9.728 2.253 16.794 6.246 24.269 13.824 5.837 5.837 9.626 11.776 29.594 46.592 12.595 22.016 23.142 40.141 23.347 40.448 0.205 0.205 1.946-0.41 3.686-1.434 45.363-26.317 102.4-43.827 157.901-48.435 11.878-1.024 48.128-1.024 61.645-0.102 52.634 3.891 108.646 20.685 155.136 46.592 3.789 2.048 7.066 3.584 7.27 3.277 0.41-0.41 23.962-41.267 38.707-66.97 12.493-21.914 23.859-31.334 41.165-34.304 33.382-5.837 62.874 21.504 59.699 55.398-0.307 3.891-1.536 9.421-2.765 12.39-1.126 2.97-10.752 20.378-21.402 38.707-10.547 18.33-22.528 39.014-26.522 45.978l-7.27 12.595 3.277 3.789c1.741 2.048 4.915 5.53 7.066 7.782 8.192 8.806 21.299 25.19 29.594 37.171 39.424 56.832 61.338 116.531 68.096 186.061 1.843 19.046 1.331 59.904-0.922 78.336-4.813 38.4-13.926 73.011-27.648 105.165l-5.325 12.39 16.691 19.149c9.216 10.547 19.354 22.221 22.733 25.907 32.563 36.864 36.25 41.677 41.165 53.453 9.83 23.757 7.373 50.381-6.758 71.68-5.12 7.782-8.909 11.674-22.63 23.654-33.894 29.696-45.261 39.629-48.026 41.984-1.638 1.536-9.318 8.192-16.896 14.746-7.578 6.656-15.667 13.722-17.92 15.77-19.251 17.408-26.624 22.733-37.581 27.136-20.378 8.090-41.779 7.475-61.542-1.843-10.65-4.915-18.842-11.571-30.106-24.474-5.53-6.349-10.445-11.981-11.059-12.595-1.331-1.331-8.090-9.114-30.106-34.406l-17.613-20.070-5.222 1.946c-15.36 5.53-48.333 13.619-64.307 15.77-2.56 0.307-5.734 0.819-7.168 1.024-14.848 2.458-32.768 3.379-58.368 3.072-24.781-0.41-27.546-0.614-46.592-3.174-22.221-2.97-47.821-8.909-67.789-15.667l-8.499-2.867-13.005 14.95c-7.168 8.192-14.336 16.384-15.77 18.022-14.336 16.282-21.606 24.678-26.931 30.72-14.541 16.896-23.859 24.371-37.069 29.594-13.21 5.325-28.672 6.963-41.882 4.608zM544.768 728.064c72.806-9.318 133.837-38.502 182.989-87.347 48.538-48.128 78.336-107.213 88.474-175.309 3.072-20.582 3.277-66.15 0.41-82.944-0.205-1.434-1.126-7.168-2.15-12.8-5.939-35.738-19.763-73.216-38.605-104.448-50.483-83.968-137.114-138.957-233.677-148.582-10.24-1.024-46.387-1.126-57.344-0.205-72.499 6.349-140.39 38.4-191.386 90.317-48.845 49.766-78.029 110.694-86.835 180.838-0.819 6.451-1.331 20.992-1.229 36.352 0.102 27.546 1.638 41.984 7.168 67.072 17.818 79.872 69.427 151.142 140.698 194.355 39.322 23.859 88.883 40.038 131.072 42.803 5.325 0.41 9.933 0.922 10.24 1.126 0.614 0.614 44.237-0.512 50.176-1.229zM502.272 689.664c-9.114-2.253-17.51-8.090-22.426-15.565-7.168-10.957-6.861-3.379-6.554-139.162l0.307-122.266 2.97-6.042c2.56-5.325 12.39-15.462 71.885-74.957 74.445-74.445 73.216-73.318 85.914-74.957 25.907-3.379 47.104 17.715 43.418 43.213-1.741 12.698-1.331 12.186-67.379 78.336l-61.030 61.030-0.512 111.616c-0.512 111.411-0.512 111.616-2.662 116.224-5.325 11.264-13.21 18.227-24.166 21.709-6.246 1.843-14.234 2.253-19.763 0.819z" />
+<glyph unicode="&#xe932;" glyph-name="alarm_off" d="M486.4 489.062l-435.2-435.2 27.238-27.136 27.136-27.238 870.4 870.298-14.131 14.029c-7.782 7.782-19.968 19.968-27.238 27.238l-13.005 13.21-435.2-435.2zM503.808 909.107c-11.878-1.843-25.907-7.475-34.816-14.029-20.582-15.155-31.437-35.942-32.051-61.747l-0.205-10.035-12.595-3.891c-48.64-14.95-90.931-40.346-126.771-75.981-24.474-24.474-41.165-47.104-56.934-77.312-18.432-35.43-27.955-68.915-33.178-115.712-0.41-3.686-0.819-68.403-0.819-143.872l-0.102-137.216-18.125-30.003c-9.933-16.486-17.306-29.389-16.384-28.672 1.126 0.922 540.672 540.672 543.949 544.154 0.307 0.307-0.717 1.638-2.15 2.765-30.106 25.088-56.32 40.96-88.474 53.76-11.674 4.608-29.286 10.445-31.642 10.445-2.458 0-2.97 1.843-3.277 12.186-1.229 41.472-33.28 74.035-74.138 75.264-5.325 0.102-10.854 0.102-12.288-0.102zM538.522 396.288c-139.878-140.083-254.464-254.669-254.566-254.771s128.922-0.205 286.72-0.205l286.925 0.102 5.734 2.662c9.114 4.198 14.438 12.8 14.438 23.45 0 7.066 0.102 6.861-20.787 41.574-9.114 15.155-17.408 28.877-18.33 30.515-1.024 1.741-5.427 9.114-9.83 16.384l-8.090 13.312-0.102 135.68c0 74.65-0.41 139.162-0.819 143.36-2.662 28.16-7.885 52.429-16.486 76.8-3.174 9.114-9.421 24.576-10.138 25.293-0.102 0.205-114.79-114.176-254.669-254.157zM411.238 112.435c1.024-11.674 1.638-16.384 2.867-21.197 12.8-48.23 56.73-80.179 106.189-77.005 48.333 2.97 88.269 40.243 94.618 88.166 0.717 5.632 1.229 10.854 1.024 11.776-0.205 1.331-11.674 1.536-102.605 1.843l-102.502 0.205 0.41-3.789z" />
+<glyph unicode="&#xe933;" glyph-name="Alias_numbers" d="M585.728 882.586c-1.434-0.307-7.168-1.126-12.8-2.048-58.982-9.421-110.694-54.17-129.331-112.026-4.915-15.258-5.018-14.029 2.253-14.848 14.029-1.536 30.106-5.53 45.056-11.264 58.88-22.426 103.424-73.114 118.17-134.656 3.686-15.155 5.325-32.051 5.325-53.965v-2.97l6.963 0.819c69.325 8.294 127.693 60.826 142.541 128.307 4.608 20.685 5.222 47.514 1.536 66.048-3.277 16.794-6.963 28.16-14.029 42.906-8.602 18.022-19.558 33.075-34.918 47.821-23.245 22.426-53.658 38.093-85.709 43.93-9.011 1.741-38.502 2.97-45.056 1.946zM407.45 729.19c-0.205-0.205-2.97-0.717-6.042-1.024-12.8-1.536-23.654-4.198-37.786-9.523-22.835-8.499-40.141-19.763-58.573-38.195-24.371-24.269-38.81-51.2-46.080-86.016-3.379-15.667-3.379-47.002-0.102-62.464 7.578-35.635 22.733-63.488 47.821-87.859 23.757-23.040 52.224-37.99 84.685-44.339 16.589-3.277 45.568-3.379 61.85-0.102 71.578 14.234 125.44 71.68 134.451 143.565 1.638 12.8 0.717 38.912-1.843 51.2-12.595 61.235-54.579 108.442-113.459 127.283-15.77 5.12-28.774 7.168-48.026 7.475-9.114 0.205-16.691 0.205-16.896 0zM709.12 539.443c-18.33-11.162-45.978-21.914-66.458-25.805-11.059-2.15-24.781-3.891-32.87-4.096-2.867-0.102-3.174-0.614-5.12-6.451-9.626-30.72-32.051-64.41-56.627-84.992l-4.301-3.584 9.421-3.277c14.95-5.222 39.731-17.613 49.459-24.883 35.942-26.726 59.597-56.525 74.24-93.389 6.144-15.565 11.571-37.171 12.902-51.405 0.41-4.403 0.819-9.011 1.024-10.138 0.102-1.126 0.307-16.179 0.307-33.485l0.102-31.539h153.702l-0.41 112.947c-0.205 62.054-0.614 114.483-1.024 116.429s-1.229 5.939-1.843 8.704c-3.379 16.486-8.704 32.358-15.36 45.875-18.842 37.888-49.664 67.482-88.474 84.787-6.554 2.867-20.787 8.090-22.221 8.090-0.205 0-3.072-1.638-6.451-3.789zM296.448 385.638c-60.723-23.142-102.502-73.216-114.79-137.318-1.741-8.909-1.843-17.818-2.15-100.352-0.307-98.611-0.512-95.13 5.427-107.418 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.042-2.765-5.734 237.773-5.734h220.979l-0.41 112.845c-0.205 62.157-0.717 114.79-1.126 117.043-6.042 31.846-15.053 54.784-30.413 76.8-20.89 30.208-50.995 53.35-86.426 66.56l-10.24 3.891-5.632-3.277c-38.4-22.221-72.294-31.13-114.176-30.31-37.478 0.717-70.349 10.24-102.605 29.696-3.277 1.946-6.349 3.584-6.963 3.584-0.512 0-5.632-1.843-11.264-3.994z" />
+<glyph unicode="&#xe934;" glyph-name="all_channels" d="M76.8 488.96v-266.24h153.6v-81.92h563.2v81.92h153.6v532.48h-870.4v-266.24zM885.76 488.96v-204.8h-747.52v409.6h747.52v-204.8zM522.957 246.067c16.691-6.246 24.269-25.805 16.282-42.189-11.162-22.835-44.851-22.016-55.194 1.331-10.957 24.678 13.517 50.381 38.912 40.858zM300.032 626.278c-7.475-2.253-14.234-8.294-17.101-15.258-1.946-4.71-1.843-14.336 0.205-19.354 4.915-11.878 18.944-18.227 31.437-14.234 17.51 5.734 23.347 28.16 10.752 41.472-6.349 6.758-17.101 9.83-25.293 7.373zM400.486 625.459c-6.042-2.15-12.698-8.909-14.746-15.155-3.482-10.138-1.229-19.558 6.451-27.034 8.090-7.782-4.71-7.27 171.11-7.27 138.138 0 157.901 0.205 161.792 1.536 17.818 6.349 22.938 28.262 9.728 41.779-8.192 8.499 5.632 7.885-172.032 7.782-140.186 0-158.31-0.205-162.304-1.638zM296.96 548.352c-16.179-7.578-20.89-27.443-9.421-40.141 5.632-6.246 10.65-8.397 19.149-8.397s13.517 2.15 19.149 8.397c10.957 12.083 7.066 31.642-7.68 39.322-6.042 3.072-15.565 3.379-21.197 0.819zM401.101 548.762c-9.421-2.867-17.101-13.722-17.101-23.962 0-6.246 3.072-13.312 7.68-17.92 8.294-8.294-5.325-7.782 173.568-7.475l159.232 0.307 4.198 2.253c19.046 10.138 17.715 36.659-2.15 45.978l-5.12 2.458-157.696-0.102c-136.397 0-158.413-0.205-162.611-1.536zM300.032 472.678c-18.432-5.632-24.883-28.365-11.981-41.984 4.608-4.813 12.39-8.294 18.637-8.294 9.626 0 19.866 6.963 23.654 15.872 3.584 8.704 1.536 20.173-5.018 27.034-6.349 6.758-17.101 9.83-25.293 7.373zM398.848 471.040c-13.312-6.554-18.33-21.402-11.878-34.714 2.662-5.53 9.728-11.366 15.565-12.902 2.56-0.717 57.651-0.922 162.918-0.819l159.027 0.307 4.71 2.765c9.216 5.53 12.595 11.571 12.595 22.323 0.102 8.806-1.331 12.186-7.475 18.33-7.782 7.782 4.813 7.27-172.032 7.27h-158.31l-5.12-2.56zM298.701 395.366c-17.408-6.246-23.245-27.443-11.162-40.755 9.933-11.059 25.395-11.878 36.352-1.946 5.325 4.813 7.987 10.854 7.987 18.432 0.102 10.547-5.12 18.637-14.95 23.245-5.837 2.765-12.288 3.072-18.227 1.024zM400.486 395.059c-2.458-0.922-6.451-3.584-8.806-5.939-11.981-11.981-9.318-31.539 5.53-40.243l4.71-2.765 158.72-0.307c119.603-0.205 159.846 0 163.123 0.922 6.144 1.741 11.878 6.144 15.155 11.776 2.355 3.994 2.867 6.144 2.867 12.083 0.102 8.909-2.662 15.36-8.806 20.173-7.885 6.349 2.56 5.939-169.779 5.939-140.595-0.102-158.72-0.205-162.714-1.638z" />
+<glyph unicode="&#xe935;" glyph-name="antenna" d="M214.528 867.123c-4.403-1.331-6.758-3.174-17.408-13.926-13.107-13.312-31.744-35.942-42.701-51.917-35.738-51.814-58.163-105.882-70.963-171.008-1.229-6.246-3.994-27.955-5.12-40.141-1.331-14.438-1.331-63.898 0-75.059 2.56-21.299 3.994-31.437 6.246-43.315 15.462-82.022 55.398-159.334 113.152-219.034 10.24-10.547 15.36-13.824 22.835-14.234 10.138-0.512 18.842 4.096 23.859 12.698 2.458 4.198 2.867 5.939 2.867 13.005 0 9.933-0.307 10.445-16.282 27.75-38.81 42.086-66.15 88.064-83.558 140.698-7.782 23.347-14.643 53.965-16.794 74.752-0.307 3.072-0.922 9.114-1.331 13.312-1.024 10.035-1.024 54.477 0 65.024 3.174 32.666 8.704 60.109 17.715 87.45 18.637 56.218 47.411 103.526 90.726 148.787 8.090 8.499 10.547 14.541 9.728 23.45-1.434 16.077-16.896 26.317-32.973 21.709zM793.6 866.816c-11.469-3.891-18.227-14.029-17.203-26.010 0.614-7.475 2.867-11.366 11.674-20.582 41.062-43.213 70.144-91.238 88.371-145.818 6.758-19.968 13.005-46.387 15.462-65.126 0.512-3.891 1.126-8.090 1.434-9.216 2.765-13.517 2.765-76.186 0-92.058-0.205-1.229-1.024-7.168-1.946-13.414-6.554-45.261-23.347-93.082-46.387-132.608-15.667-26.931-31.642-48.23-54.374-72.602-12.39-13.312-14.643-17.613-14.131-26.931 0.922-14.643 12.083-24.678 26.522-23.859 8.192 0.41 13.414 3.686 23.962 14.746 58.982 62.157 98.099 138.65 112.947 220.774 5.222 28.979 6.758 46.592 6.758 79.872 0 33.587-1.331 47.923-7.168 80.486-10.035 55.194-33.28 112.128-65.331 160.154-20.275 30.31-52.838 67.584-62.566 71.68-5.427 2.253-12.186 2.458-18.022 0.512zM285.696 794.419c-10.547-3.891-40.653-39.219-58.573-68.915-25.395-41.984-41.574-90.829-46.592-140.288-1.024-10.24-1.024-52.736 0-62.976 7.168-70.144 33.894-133.018 78.438-184.832 18.739-21.709 25.293-26.624 36.045-26.624 22.221 0 33.485 27.238 17.92 43.418-32.973 34.202-54.682 69.325-67.994 110.182-10.138 30.925-14.336 57.139-14.336 89.6 0.102 72.806 26.317 138.342 77.414 193.229 6.963 7.578 9.626 11.264 10.957 15.155 3.994 11.981-1.843 25.702-13.107 31.027-5.427 2.56-14.643 3.072-20.173 1.024zM722.022 795.034c-13.312-3.994-21.402-19.456-17.101-32.461 1.331-3.891 4.096-7.68 11.059-15.258 42.086-45.261 66.867-96.87 75.264-156.979 2.662-19.354 2.458-58.163-0.512-77.312-6.246-40.55-19.661-77.005-40.55-109.875-9.83-15.565-19.661-28.058-35.226-44.954-4.301-4.608-8.602-10.342-9.523-12.8-4.71-11.469 0.102-24.781 11.264-31.334 3.994-2.355 5.837-2.765 12.39-2.765 9.933 0.102 13.414 1.946 23.654 12.493 34.816 36.045 62.771 83.558 77.21 131.174 4.71 15.565 8.090 29.901 10.138 43.213 0.922 5.939 1.946 12.186 2.253 13.824 1.946 11.878 2.662 55.808 1.126 71.68-7.373 76.083-37.581 142.438-90.726 199.373-4.198 4.506-9.318 8.806-11.878 10.035-5.325 2.56-13.824 3.482-18.842 1.946zM359.117 722.432c-3.584-1.126-9.421-5.325-13.824-10.138-9.523-10.24-19.763-23.245-26.419-33.485-7.168-10.957-19.046-33.894-22.426-43.418-6.656-18.637-11.878-40.755-13.722-58.88-1.024-9.421-0.717-44.237 0.41-50.688 0.307-1.946 1.024-6.758 1.638-10.752 4.506-29.696 18.022-63.59 35.942-90.112 11.878-17.408 27.238-34.816 34.406-38.707 16.998-9.216 37.478 3.072 37.376 22.426-0.102 7.68-2.867 13.414-10.138 21.094-26.317 27.648-42.701 61.952-48.026 100.557-1.843 13.21-1.331 40.755 1.024 53.35 4.301 23.347 12.083 43.93 24.269 63.795 5.53 9.011 11.571 16.998 22.016 28.774 6.144 6.861 8.909 10.854 9.933 14.336 3.686 12.698-2.765 26.214-15.258 31.437-3.789 1.536-12.595 1.741-17.203 0.41zM649.728 722.739c-10.752-2.662-19.456-15.565-18.227-26.931 0.717-6.554 3.584-11.878 10.138-18.944 27.238-29.184 43.52-63.795 48.435-102.912 1.638-12.8 0.614-40.858-1.946-53.658-6.861-34.611-21.504-63.283-46.387-90.522-7.987-8.704-9.728-12.083-10.138-19.149-1.229-20.275 18.432-33.485 36.659-24.576 5.12 2.56 13.722 11.059 24.576 24.576 23.552 29.286 40.755 68.301 46.49 105.472 0.614 3.994 1.331 8.294 1.638 9.728 0.205 1.434 0.717 9.933 1.126 18.944 2.048 54.067-14.029 104.755-47.104 148.48-11.162 14.643-21.402 24.986-27.853 28.058-4.403 2.048-12.186 2.662-17.408 1.434zM496.538 651.264c-52.326-8.397-89.395-53.965-86.528-106.496 1.024-18.432 5.837-33.792 15.565-49.459 5.837-9.216 19.763-23.654 28.877-29.798l6.349-4.301 0.102-201.421c0-110.797 0.307-202.752 0.512-204.39 3.789-23.347 26.214-42.496 49.766-42.598 24.986 0 47.514 18.534 51.405 42.598 0.205 1.638 0.512 93.594 0.512 204.39l0.102 201.318 7.987 5.632c12.39 8.704 25.293 23.45 31.949 36.659 2.97 5.837 6.656 15.872 8.806 24.474 2.867 11.469 2.662 34.099-0.512 46.592-9.728 38.298-40.243 67.789-78.643 75.776-10.138 2.15-26.214 2.56-36.25 1.024z" />
+<glyph unicode="&#xe936;" glyph-name="anti_spam" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c50.586-5.222 96.256-20.275 139.059-45.67l6.963-4.198-2.867-2.97c-2.97-3.174-455.68-455.68-456.397-456.294-0.205-0.205-4.096 6.144-8.704 14.234-23.245 41.165-37.274 85.811-41.882 134.042-0.922 9.728-0.922 45.67 0 57.856 4.506 60.518 28.57 123.187 66.15 172.544 48.435 63.59 117.043 107.52 193.741 124.314 6.451 1.434 13.414 2.765 15.36 3.072s4.915 0.819 6.554 1.126c3.482 0.512 20.787 2.458 26.726 2.867 10.035 0.819 44.134 0.307 55.296-0.922zM800.154 614.502c24.269-42.189 37.888-84.787 43.008-134.246 1.536-14.336 1.843-45.158 0.614-58.368-1.638-16.998-1.946-19.866-4.096-31.949-18.125-104.038-86.118-194.15-181.76-240.947-36.659-17.92-77.21-29.184-117.248-32.666-10.752-0.922-54.682-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-26.112 3.379-49.766 9.523-77.312 20.070-11.776 4.506-39.936 18.432-48.947 24.166l-6.963 4.403 229.683 229.581c126.259 126.259 229.888 229.274 230.298 228.864 0.41-0.512 3.277-5.325 6.451-10.957z" />
+<glyph unicode="&#xe937;" glyph-name="antivirus" d="M501.76 876.442c-20.787-14.234-53.453-32.461-75.776-42.394-5.325-2.355-11.981-5.427-14.848-6.656-31.334-14.029-80.179-28.877-117.248-35.738-4.813-0.922-10.957-2.15-13.824-2.662-2.765-0.512-7.373-1.229-10.24-1.536-2.765-0.307-6.042-0.819-7.27-1.024-3.686-0.819-30.31-3.482-40.96-4.096-5.53-0.41-12.39-0.819-15.258-1.024-2.765-0.205-15.872-0.41-28.979-0.41l-23.859-0.102 0.41-158.925c0.205-87.45 0.717-160.154 0.922-161.587 0.307-1.434 0.819-5.734 1.229-9.728 3.174-34.816 11.571-74.957 23.347-111.104 35.635-109.568 103.936-200.602 196.915-262.451 37.786-25.19 75.981-43.93 121.446-59.597l13.926-4.813 12.186 4.096c63.59 21.094 128.307 57.651 173.466 97.997 37.171 33.28 62.976 62.874 88.269 101.376 36.147 54.886 62.362 119.603 74.957 184.32 3.584 18.534 4.71 25.907 6.656 44.544 0.614 5.325 1.434 11.571 1.741 13.824 0.41 2.253 0.922 75.674 1.126 163.123l0.41 158.925-23.859 0.102c-13.107 0-26.112 0.205-28.979 0.41-2.765 0.205-10.24 0.614-16.486 1.024-6.246 0.307-12.902 0.819-14.848 1.024-1.946 0.307-5.734 0.717-8.602 1.024-12.186 1.434-22.733 2.765-25.088 3.174-1.434 0.307-5.325 0.922-8.704 1.434-24.064 3.686-60.006 12.698-88.166 22.118-11.674 3.891-40.243 14.848-49.050 18.842-31.334 14.131-59.494 29.696-85.709 47.309-5.018 3.277-9.114 5.939-9.216 5.837-0.205 0-4.71-2.97-10.035-6.656zM522.138 786.534c22.835-12.8 47.718-24.678 71.578-34.304l12.698-5.018-180.429-180.429c-99.226-99.226-180.531-180.224-180.736-180.019-0.307 0.41-5.222 21.811-7.066 31.539-1.638 8.192-4.301 25.805-5.222 34.304-0.307 2.867-0.819 7.168-1.229 9.728-0.307 2.56-0.819 58.368-1.024 124.211l-0.41 119.501 4.403 0.102c2.458 0 5.12 0.205 5.939 0.307 0.819 0.205 5.018 0.614 9.216 1.024 29.082 2.765 84.275 13.005 108.032 20.070 1.741 0.512 7.885 2.355 13.824 4.096 46.592 13.824 93.901 33.997 135.68 57.958 2.253 1.331 4.301 2.355 4.506 2.458 0.102 0 4.71-2.458 10.24-5.53zM793.293 516.608c-0.307-27.853-0.819-52.326-1.126-54.272s-0.819-5.837-1.126-8.704c-3.891-35.635-11.162-67.072-23.347-101.888-26.624-75.674-74.445-143.053-136.397-192.102-11.981-9.523-39.117-27.648-52.224-34.918-19.251-10.752-44.442-22.528-60.416-28.365l-6.963-2.56-12.902 5.12c-26.112 10.445-52.224 23.962-76.288 39.629-13.722 8.909-37.478 26.522-37.478 27.75 0 0.717 46.285 47.206 119.706 119.91 81.408 80.589 254.874 252.928 271.872 270.029 15.258 15.36 16.486 16.384 16.794 13.824 0.205-1.536 0.205-25.6-0.102-53.453z" />
+<glyph unicode="&#xe938;" glyph-name="Apartment_building" d="M348.365 874.803c-5.632-4.71-11.981-9.933-14.131-11.776-2.15-1.741-24.474-20.378-49.562-41.267s-47.411-39.526-49.664-41.267c-2.15-1.843-6.144-5.12-8.806-7.373-2.56-2.253-8.499-7.27-13.107-11.059l-8.294-6.963v-716.698h-25.6v-25.6h665.6v25.6h-25.6l-0.102 358.707-0.102 358.605-27.238 22.528c-14.95 12.39-49.459 41.062-76.698 63.795l-49.459 41.165-47.002-39.117c-25.805-21.606-60.416-50.381-76.8-64.102l-29.798-24.781-34.099 28.365c-18.637 15.565-53.248 44.442-76.698 64l-42.701 35.635-10.138-8.397zM358.4 665.6v-38.4h-76.8v76.8h76.8v-38.4zM486.4 665.6v-38.4h-76.8v76.8h76.8v-38.4zM614.4 665.6v-38.4h-76.8v76.8h76.8v-38.4zM742.4 665.6v-38.4h-76.8v76.8h76.8v-38.4zM358.4 537.6v-38.4h-75.776v76.8h75.776v-38.4zM486.4 537.6v-38.4h-76.8v76.8h76.8v-38.4zM614.4 537.6v-38.4h-76.8v76.8h76.8v-38.4zM742.4 537.6v-38.4h-76.8v76.8h76.8v-38.4zM358.4 409.6v-38.4h-76.8v76.8h76.8v-38.4zM486.4 409.6v-38.4h-76.8v76.8h76.8v-38.4zM614.4 409.6v-38.4h-76.8v76.8h76.8v-38.4zM742.4 409.6v-38.4h-76.8v76.8h76.8v-38.4zM358.4 281.6v-38.4h-76.8v76.8h76.8v-38.4zM486.4 281.6v-38.4h-76.8v76.8h76.8v-38.4zM614.4 281.6v-38.4h-76.8v76.8h76.8v-38.4zM742.4 281.6v-38.4h-76.8v76.8h76.8v-38.4zM358.4 153.6v-38.4h-76.8v76.8h76.8v-38.4zM501.76 115.2v-76.8h-92.16v153.6h92.16v-76.8zM614.4 115.2v-76.8h-93.184v153.6h93.184v-76.8zM742.4 153.6v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xe939;" glyph-name="Apps" d="M166.605 830.464c-18.637-5.12-33.69-20.89-37.478-39.219-0.819-3.891-1.126-44.954-1.126-139.264 0-112.333 0.307-134.758 1.536-139.366 5.018-19.251 21.094-34.406 39.936-37.888 8.397-1.536 267.059-1.536 275.558 0 19.354 3.482 36.147 20.070 40.243 39.629 0.819 3.891 1.126 44.954 1.126 139.264 0 112.333-0.307 134.758-1.536 139.366-4.813 18.33-19.149 32.666-37.478 37.478-7.885 2.15-273.203 2.048-280.781 0zM576.819 830.566c-16.486-3.994-30.106-16.282-36.352-32.973l-2.355-6.042-0.205-136.704c-0.205-111.616 0-137.626 1.126-141.824 5.325-19.968 21.299-35.123 40.55-38.4 4.71-0.819 45.978-1.024 141.824-0.819l135.168 0.307 6.349 2.662c17.101 7.373 28.877 21.504 31.949 38.298 0.819 4.198 1.126 47.411 1.126 139.264 0 111.718-0.307 134.042-1.536 138.65-5.018 18.944-20.48 33.894-39.219 37.888-8.192 1.741-271.155 1.434-278.426-0.307zM167.219 420.966c-18.842-4.608-34.714-21.197-38.093-40.038-0.819-4.198-1.126-47.411-1.126-139.264 0-111.718 0.307-134.042 1.536-138.65 5.018-18.944 20.582-33.997 39.219-37.888 7.578-1.536 267.674-1.638 276.275 0 19.661 3.584 36.659 20.582 40.243 40.346 0.819 4.198 1.126 47.411 1.126 139.264 0 111.718-0.307 134.042-1.536 138.65-5.018 19.251-21.094 34.509-39.834 37.888-9.318 1.741-270.643 1.434-277.811-0.307zM576.205 420.864c-16.077-4.403-28.467-15.462-35.43-31.539l-2.662-6.349-0.307-136.192c-0.205-102.195 0-137.626 0.922-141.824 4.198-19.866 20.89-36.352 40.243-39.834 8.602-1.638 268.698-1.536 276.275 0 19.558 4.096 36.147 20.89 39.629 40.346 0.819 4.198 1.126 47.411 1.126 139.264 0 111.718-0.307 134.042-1.536 138.65-4.813 18.33-19.149 32.666-37.478 37.478-7.885 2.15-273.203 2.048-280.781 0z" />
+<glyph unicode="&#xe93a;" glyph-name="Apps_disabled" d="M484.352 475.648l-435.2-435.2 54.272-54.272 217.907 217.907c119.808 119.808 315.597 315.597 435.098 435.098l217.395 217.395-54.272 54.272-435.2-435.2zM166.605 830.464c-18.637-5.12-33.69-20.89-37.478-39.219-0.819-3.891-1.126-44.954-1.126-139.264 0-112.333 0.307-134.758 1.536-139.366 5.018-19.251 21.094-34.406 39.936-37.888 4.096-0.819 43.315-1.126 122.778-1.126h116.838l38.707 38.4 38.605 38.4v118.579c0 99.021-0.307 119.398-1.536 124.006-4.813 18.33-19.149 32.666-37.478 37.478-7.885 2.15-273.203 2.048-280.781 0zM576.819 830.566c-18.842-4.608-34.714-21.197-38.093-39.936-0.717-4.096-1.126-36.352-1.126-97.587v-91.443l112.947 113.050c62.054 62.157 113.766 113.971 114.79 115.2l1.946 2.15-92.57-0.102c-70.246 0-93.798-0.41-97.894-1.331zM780.595 588.8c-62.669-62.669-113.971-114.278-113.971-114.586 0-0.41 41.574-0.614 92.467-0.614 76.39 0 93.286 0.307 97.894 1.536 19.251 5.018 34.509 21.094 37.888 39.834 1.331 7.066 1.638 188.006 0.41 187.904-0.512 0-52.122-51.405-114.688-114.074zM167.219 420.966c-18.842-4.608-34.714-21.197-38.093-39.936-0.717-4.096-1.126-36.352-1.126-97.587v-91.443l114.688 114.79c63.078 63.181 114.688 114.995 114.688 115.2s-41.574 0.41-92.365 0.307c-70.246 0-93.696-0.41-97.792-1.331zM576.307 383.898l-38.707-38.4v-117.658c0-81.92 0.307-119.296 1.126-123.085 4.096-19.558 20.89-36.147 40.243-39.629 8.602-1.638 268.698-1.536 276.275 0 19.558 4.096 36.147 20.89 39.629 40.243 0.819 4.198 1.126 48.026 1.126 139.264 0 144.794 0.205 137.626-5.734 150.016-3.686 7.475-14.541 18.33-22.016 22.016-12.288 5.939-6.656 5.734-135.066 5.734h-118.272l-38.605-38.502zM370.995 179.2c-62.669-62.669-113.971-114.278-113.971-114.586 0-1.126 181.658-0.614 188.006 0.512 19.661 3.584 36.659 20.582 40.243 40.243 1.331 7.066 1.638 188.006 0.41 187.904-0.512 0-52.122-51.302-114.688-114.074z" />
+<glyph unicode="&#xe93b;" glyph-name="Archive" d="M128.102 482.099c0.102-383.59-0.41-356.045 6.042-371.2 9.114-21.299 27.546-37.581 50.688-44.544 5.837-1.741 22.528-1.843 358.707-2.048l352.461-0.307v348.979c0 243.814-0.307 350.822-1.126 355.123-5.734 31.642-29.184 55.706-60.826 62.362-6.246 1.331-52.634 1.536-356.659 1.536h-349.389l0.102-349.901zM784.589 752.435c17.613-6.758 30.31-21.299 33.485-38.605 1.536-8.499 1.536-191.898 0-199.475-3.994-19.149-20.48-35.635-39.629-39.629-7.68-1.638-525.21-1.638-532.89 0-18.842 3.891-34.202 18.842-39.322 38.093-1.843 6.963-2.15 191.078-0.307 200.909 3.379 18.432 18.637 34.714 37.478 39.936 3.994 1.126 52.326 1.331 270.131 1.229l265.216-0.205 5.837-2.253zM778.445 421.274c16.998-3.584 31.437-16.179 37.888-33.28l2.355-6.042 0.307-96.768c0.205-69.325 0-98.509-0.819-102.912-3.686-19.149-18.637-34.816-38.195-40.038-4.403-1.126-48.64-1.434-266.445-1.434-183.808 0-263.066 0.307-267.264 1.126-19.866 3.584-36.659 20.378-40.346 40.346-1.434 7.885-1.536 191.386-0.102 199.168 3.482 18.125 19.763 35.021 38.195 39.526 7.27 1.741 526.131 2.048 534.426 0.307zM246.989 727.859c-2.355-0.819-6.349-3.482-8.806-6.042-8.192-8.192-7.782-2.253-7.782-107.52 0-101.478-0.205-97.792 5.734-105.574 1.331-1.843 4.71-4.608 7.373-6.144l4.813-2.867 261.632-0.307c293.888-0.307 267.571-0.922 276.070 7.475 7.885 7.987 7.578 3.174 7.578 108.032s0.41 99.123-7.885 107.11c-8.499 8.294 17.203 7.578-274.125 7.475-229.069 0-260.71-0.205-264.602-1.638zM571.29 651.162c7.066-2.048 13.517-8.397 15.872-15.565 1.536-4.403 1.741-8.397 1.434-23.552-0.307-17.51-0.41-18.227-3.072-22.835-1.536-2.56-4.403-5.939-6.349-7.475-7.578-5.734-7.373-5.734-67.072-5.734-62.259 0-61.542-0.102-69.222 7.68-6.451 6.451-7.68 11.162-7.68 30.208 0 17.715 1.024 23.040 5.632 29.082 2.97 3.891 7.987 7.475 12.595 8.806 1.536 0.512 27.443 0.922 57.651 0.922 47.002 0.102 55.603-0.102 60.211-1.536zM248.832 395.878c-7.782-2.355-14.131-8.602-16.896-16.589-2.355-6.451-2.253-189.030 0-195.584 2.15-6.144 5.939-10.65 11.571-13.926l4.813-2.867 261.632-0.307c292.966-0.307 267.264-0.922 275.763 7.373 8.294 7.987 7.885 2.15 7.885 107.725 0 101.478 0.205 97.792-5.734 105.574-1.331 1.843-4.71 4.608-7.373 6.144l-4.813 2.867-262.144 0.205c-144.179 0.102-263.27-0.205-264.704-0.614zM571.494 318.464c6.144-2.15 10.65-5.939 13.926-11.571l2.867-4.813v-40.96l-2.867-4.915c-3.379-5.734-9.114-10.138-15.258-11.878-3.174-0.922-19.558-1.126-60.723-0.922-62.874 0.307-58.778-0.102-66.867 7.885-6.246 6.144-7.373 10.854-7.373 30.31s1.126 23.859 7.578 30.618c7.578 7.782 6.246 7.578 68.813 7.68 47.104 0.102 56.115-0.102 59.904-1.434z" />
+<glyph unicode="&#xe93c;" glyph-name="arrow_down" horiz-adv-x="816" d="M5.557 672.051c3.072-3.584 14.029-16.589 24.371-28.979s19.149-22.733 19.456-23.040c0.307-0.307 3.891-4.403 7.885-9.216s10.138-12.186 13.722-16.384c22.938-27.238 57.139-67.891 71.066-84.48 15.974-19.046 38.707-46.080 57.344-67.994 5.12-6.042 11.162-13.21 13.414-15.974 2.355-2.867 13.21-15.667 24.166-28.672 28.467-33.792 87.962-104.448 104.755-124.416 7.885-9.421 22.426-26.624 32.256-38.4 9.83-11.674 21.914-26.010 26.829-31.846l8.909-10.65 7.475 8.909c4.096 4.813 11.674 13.722 16.691 19.661 5.12 5.939 12.698 15.053 16.896 20.070 4.198 5.12 7.885 9.421 8.192 9.728s5.427 6.246 11.264 13.312c5.837 7.066 10.854 13.005 11.162 13.312 0.41 0.307 7.782 9.011 16.486 19.456s19.046 22.835 23.142 27.648c4.096 4.813 16.691 19.763 28.058 33.28s22.63 26.931 24.986 29.696c2.458 2.867 21.811 25.805 43.11 51.098s39.526 46.899 40.448 48.128c1.024 1.229 14.848 17.613 30.72 36.454s30.822 36.659 33.28 39.424c2.355 2.867 13.414 15.974 24.474 29.184 11.162 13.21 23.45 27.853 27.341 32.461 3.994 4.71 12.288 14.643 18.534 22.016 6.349 7.475 15.053 17.92 19.558 23.142l8.090 9.421h-819.61l5.53-6.349z" />
+<glyph unicode="&#xe93d;" glyph-name="arrow_up" horiz-adv-x="816" d="M408.197 703.283c-0.205-0.614-10.957-13.722-23.962-29.082-12.902-15.36-33.587-39.936-45.978-54.579-12.288-14.746-23.757-28.365-25.6-30.413-1.741-2.048-8.704-10.342-15.462-18.33-6.758-8.090-16.384-19.558-21.504-25.6-5.018-5.939-11.162-13.107-13.517-15.872-10.138-12.186-143.36-170.496-147.251-175.104-16.077-18.944-25.088-29.594-44.032-52.224-11.776-14.029-21.914-26.112-22.528-26.726-0.512-0.614-6.554-7.68-13.312-15.77s-17.408-20.685-23.654-28.058l-11.366-13.414 204.595-0.307c112.64-0.102 296.755-0.102 409.293 0l204.698 0.307-13.926 16.486c-14.029 16.589-20.787 24.576-72.397 85.914-15.667 18.637-33.075 39.322-38.81 46.080s-23.142 27.546-38.81 46.080c-15.667 18.637-30.413 36.147-32.768 38.912-2.458 2.867-9.421 11.162-15.462 18.432-6.144 7.373-13.312 15.872-15.974 18.944s-17.818 21.094-33.69 39.936c-15.872 18.842-37.069 44.032-47.002 55.808-10.035 11.878-30.515 36.25-45.67 54.272-43.827 52.122-47.206 56.013-51.405 60.928-2.253 2.458-4.301 3.994-4.506 3.379z" />
+<glyph unicode="&#xe93e;" glyph-name="arrow-next" horiz-adv-x="656" d="M143.996 960l-128-128 384-384-384-384 128-128 512 512z" />
+<glyph unicode="&#xe93f;" glyph-name="arrow-previous" horiz-adv-x="656" d="M640.016 832l-128 128-512-512 512-512 128 128-384 384z" />
+<glyph unicode="&#xe940;" glyph-name="Art" d="M131.584 780.083c-22.835-2.97-43.725-20.48-51.2-42.701-11.469-34.099 7.373-71.066 41.472-81.613l5.632-1.741 0.307-40.55 0.205-40.448-2.765-1.536c-6.144-3.379-13.312-11.776-17.101-20.173-5.837-12.595-5.734-11.264-5.427-105.882 0.307-96.461-0.102-90.522 7.066-104.141 3.277-6.144 10.854-14.438 15.462-16.794l2.765-1.536-0.205-40.55-0.307-40.653-4.608-1.331c-21.402-6.042-38.4-23.859-44.032-46.080-8.499-33.792 12.39-68.301 46.694-77.107 32.154-8.294 66.355 11.059 76.288 43.008l1.741 5.632 40.346 0.307 40.448 0.205 2.662-3.994c6.349-9.626 18.432-17.203 31.949-20.070 10.957-2.253 362.291-2.253 373.453 0 13.619 2.765 25.805 10.445 32.358 20.275l2.56 3.789 46.592-0.205 46.49-0.307 1.843-5.837c3.686-12.083 12.288-24.371 21.914-31.437 13.107-9.728 27.136-14.029 42.598-13.107 11.366 0.717 13.926 1.434 25.6 7.168 25.498 12.595 39.219 41.472 33.28 69.837-4.608 22.016-21.914 41.062-43.52 47.718l-5.632 1.741-0.307 40.55-0.205 40.448 2.765 1.536c5.12 2.662 12.698 11.264 16.282 18.534 6.758 13.722 6.656 12.698 6.349 108.442-0.41 95.334 0 89.6-7.066 103.117-3.379 6.144-10.957 14.643-15.565 16.896l-2.765 1.536 0.205 40.448 0.307 40.55 5.632 1.741c28.058 8.704 46.797 36.147 44.749 65.638-1.946 26.829-20.378 49.357-46.694 56.934-32.461 9.318-67.891-10.035-78.029-42.598l-1.741-5.632-46.694-0.307-46.592-0.205-1.536 2.765c-2.662 5.12-11.264 12.698-18.534 16.282-14.029 6.861-2.662 6.554-201.83 6.554-174.797 0-180.634-0.102-188.109-1.946-14.131-3.686-25.907-11.571-31.027-20.89l-1.536-2.765-40.448 0.205-40.448 0.307-2.56 7.475c-9.626 28.672-38.912 46.592-69.53 42.496zM844.8 448v-230.4h-665.6v460.8h665.6v-230.4zM291.84 652.288c-11.469-2.253-19.456-5.53-28.467-11.674-34.304-23.245-44.032-68.915-22.221-104.141 18.842-30.31 56.218-43.52 90.112-31.949 24.269 8.294 42.189 27.955 49.766 54.579 2.15 7.578 1.843 28.979-0.41 37.274-11.059 39.322-49.562 63.59-88.781 55.91zM620.339 512.205c-2.048-1.229-7.066-6.349-11.162-11.469-19.046-23.654-41.165-49.869-57.651-68.506-21.709-24.576-29.389-33.178-39.526-44.134-3.686-3.994-11.674-12.698-17.92-19.456-6.144-6.758-16.077-17.306-22.016-23.552-5.837-6.144-11.162-11.776-11.776-12.39-7.373-8.192-19.456-19.763-19.968-19.149-0.41 0.41-4.813 5.632-9.728 11.571-5.018 5.939-9.421 10.957-9.728 11.264s-7.885 8.806-16.998 18.944c-42.086 47.309-58.88 66.355-66.765 75.469-9.626 11.264-13.517 14.131-19.354 14.131-7.066 0-9.626-2.355-68.301-63.488-7.27-7.578-20.275-20.992-28.877-29.798l-15.77-15.872v-92.57h614.4v32.154c0 17.613-0.307 33.485-0.614 35.021-0.307 1.638-2.458 5.12-4.813 7.68s-8.499 9.318-13.619 14.848c-5.12 5.53-13.824 15.258-19.354 21.402-5.53 6.246-11.469 12.902-13.21 14.848s-11.674 13.312-22.118 25.088c-15.053 17.203-39.936 45.158-45.568 51.302-7.27 7.987-21.197 22.938-24.269 26.317-14.336 15.462-38.707 39.117-41.984 40.755-5.018 2.56-8.704 2.458-13.312-0.41z" />
+<glyph unicode="&#xe941;" glyph-name="assistance" d="M488.346 882.79c-0.205-0.205-4.813-0.614-10.138-1.024-9.114-0.614-37.274-4.096-43.008-5.222-1.434-0.307-3.686-0.717-5.018-1.024-6.963-1.331-30.208-6.861-36.454-8.806-3.891-1.126-10.138-2.97-13.824-3.994-6.554-1.946-27.238-9.318-31.232-11.264-1.126-0.512-5.018-2.15-8.704-3.686-15.258-6.144-44.237-21.504-60.416-31.949-19.763-12.698-23.859-15.667-38.81-27.648-64-51.405-111.616-118.067-139.059-194.765-7.68-21.504-15.77-52.634-18.739-72.192-2.458-15.974-2.97-19.866-3.584-26.624-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-54.989 32.256-111.514 64.205-160.051 3.686-5.734 7.168-10.854 7.578-11.469 0.512-0.512 2.253-2.867 3.891-5.12s4.506-6.144 6.349-8.602c7.373-9.83 28.57-33.894 39.219-44.442 51.712-51.405 111.718-86.938 184.32-109.158 9.728-3.072 33.28-8.499 45.568-10.752 26.317-4.608 46.080-6.246 76.8-6.246 24.371 0 44.134 1.126 55.296 3.072 1.434 0.205 5.12 0.717 8.192 1.024 11.674 1.331 33.69 6.144 53.248 11.469 81.715 22.323 156.365 69.632 212.275 134.451 34.611 40.141 60.109 83.149 78.95 132.813 4.403 11.674 12.083 36.147 13.926 44.339 6.042 27.136 9.728 47.821 10.854 61.44 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.229 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-7.578 45.158-28.672 101.683-53.453 142.643-20.173 33.485-41.37 60.621-68.506 87.654-51.2 50.995-117.76 90.010-186.266 109.261-18.944 5.222-45.67 10.957-57.856 12.288-2.253 0.205-5.018 0.614-6.144 0.819-1.126 0.307-5.018 0.717-8.704 1.126-3.686 0.307-8.704 0.819-11.264 1.126-5.222 0.614-58.982 1.536-59.494 1.024zM540.16 723.046c1.741-0.307 5.12-0.819 7.68-1.126 37.683-5.018 70.144-18.842 95.949-40.653 11.469-9.728 18.33-17.51 26.317-29.798 9.421-14.541 14.643-26.214 18.739-42.189 2.048-8.397 2.662-13.312 2.97-27.136 0.614-29.594-4.301-47.411-19.968-71.168-11.264-17.203-21.709-27.853-64.614-66.56-36.762-33.178-45.158-42.189-51.814-56.32-2.97-6.246-6.656-18.33-8.090-26.112-1.536-8.704-5.939-23.347-8.294-27.546-5.018-9.318-14.95-16.998-24.474-19.149-5.939-1.229-18.739-1.331-24.269 0-11.366 2.662-23.142 11.571-27.853 20.89-4.403 9.011-5.222 14.029-5.12 31.949 0.102 14.336 0.512 18.637 2.765 28.467 3.994 17.203 11.981 34.509 22.733 48.845 8.806 11.674 28.877 31.334 62.976 61.44 18.739 16.589 27.443 25.702 34.714 36.454 8.806 12.902 10.854 19.866 10.854 35.738 0 11.571-0.307 13.619-2.97 20.787-11.162 30.31-40.243 48.23-76.698 47.206-25.702-0.819-43.008-6.861-55.603-19.558-11.264-11.469-21.709-29.696-30.106-52.531-7.066-19.456-9.318-24.474-13.824-30.618-8.397-11.366-19.354-17.306-33.178-18.022-14.746-0.819-26.624 3.686-36.762 13.722-10.342 10.342-14.541 20.070-14.541 33.69 0 7.885 2.048 21.914 4.198 28.774 2.867 9.421 7.782 21.606 10.854 27.034 1.843 3.379 3.379 6.246 3.379 6.451 0 0.307 2.355 3.994 5.222 8.294 30.003 44.339 79.667 72.704 138.138 78.541 11.366 1.229 44.442 1.331 50.688 0.205zM521.626 278.63c6.656-1.946 12.186-5.018 18.842-10.445 13.21-10.547 19.968-26.214 19.251-44.442-0.614-15.77-4.813-25.907-14.95-35.84-18.227-18.022-46.080-21.299-69.12-8.192-6.963 3.994-15.667 12.698-19.251 19.149-5.837 10.854-7.885 30.413-4.301 42.701 5.837 20.173 24.678 36.045 46.080 38.81 5.837 0.717 17.92-0.205 23.45-1.741z" />
+<glyph unicode="&#xe942;" glyph-name="attachment" d="M560.128 908.186c-1.434-0.307-7.168-1.126-12.8-2.048-32.973-5.222-63.181-21.094-88.678-46.49-24.064-24.064-38.605-50.893-46.182-85.504l-2.253-10.24-0.307-278.016c-0.307-299.622-0.512-282.726 4.813-300.134 5.734-18.432 19.251-37.478 35.123-49.357 41.677-31.232 97.792-27.546 134.451 8.909 15.462 15.462 26.010 36.454 28.979 57.446 1.434 10.547 1.434 323.891 0 331.776-3.482 19.149-18.432 34.816-38.093 40.038-3.482 0.922-11.059 1.434-21.402 1.434h-16.179v-181.146c0-197.427 0.41-185.139-5.734-193.229-1.536-1.946-4.915-4.813-7.475-6.349-3.994-2.355-5.939-2.765-12.39-2.765s-8.397 0.41-12.39 2.765c-2.56 1.536-5.939 4.403-7.475 6.451-6.144 8.090-5.837-12.493-5.53 284.16l0.307 271.872 2.867 9.216c9.523 30.413 31.846 52.634 61.645 61.44 15.258 4.506 36.25 4.301 51.2-0.512 17.818-5.734 34.304-17.51 45.363-32.563 6.451-8.806 10.752-17.306 14.234-28.57l2.867-9.011 0.205-275.968c0.205-305.050 0.614-285.082-6.554-309.043-14.746-49.971-57.139-90.726-107.827-103.629-4.813-1.229-9.626-2.458-10.752-2.662-12.698-2.56-41.882-2.56-55.603 0-52.429 9.523-96.563 46.182-115.917 96.051-3.686 9.626-7.885 25.702-8.704 34.099-0.41 3.379-0.819 7.578-1.024 9.216-0.205 1.741-0.41 85.709-0.41 186.778l-0.102 183.603-18.637-0.512c-16.998-0.41-19.354-0.717-25.088-3.072-16.589-6.758-28.467-20.685-32.051-37.581-0.819-4.198-1.024-48.333-0.819-173.568 0.205-92.365 0.614-168.858 1.024-169.984 0.307-1.126 0.922-4.608 1.331-7.68 2.56-19.968 10.65-46.080 20.89-67.072 27.341-55.91 75.469-97.997 134.246-117.658 26.419-8.704 43.93-11.366 74.24-11.264 19.354 0.102 24.576 0.512 37.376 2.765 101.888 18.125 176.947 97.485 189.952 200.909 2.253 17.203 2.15 559.718-0.102 573.952-3.379 22.426-10.957 44.032-21.504 61.747-10.035 16.589-26.214 35.021-40.858 46.387-20.378 15.77-43.418 26.317-69.018 31.744-9.318 2.048-15.667 2.662-29.286 2.867-9.523 0.205-18.534 0.205-19.968 0z" />
+<glyph unicode="&#xe943;" glyph-name="Auditorium" d="M76.8 601.6v-256h90.214l-5.53 6.963c-9.523 11.981-19.251 28.877-23.347 40.448-1.229 3.584-1.536 3.789-5.734 3.789h-4.403v409.6h768v-409.6h-8.704l-2.97-7.475c-5.12-12.8-13.722-26.931-23.45-38.81l-3.994-4.915h90.317v512h-870.4v-256zM263.68 575.898c-53.862-7.782-97.382-49.562-108.134-103.834-1.843-9.011-1.843-37.683 0-46.080 5.837-27.546 16.794-47.923 35.942-67.072 18.637-18.637 39.117-29.798 64.717-35.43 9.933-2.15 33.587-2.56 45.363-0.819 25.293 3.891 49.050 15.667 68.198 33.997 10.138 9.626 11.878 11.981 10.24 13.824-0.512 0.717-3.072 5.427-5.632 10.445-22.63 45.363-20.89 100.147 4.506 144.794 1.946 3.379 1.946 3.584 0 6.144-3.482 5.018-17.818 18.022-25.19 22.938-14.234 9.421-29.901 15.974-47.002 19.866-8.192 1.843-33.69 2.56-43.008 1.229zM495.206 575.898c-43.315-5.939-80.179-32.973-99.123-72.602-3.686-7.782-8.704-23.040-10.24-31.437-1.331-6.963-1.741-36.966-0.614-42.803 1.536-7.987 5.325-20.992 7.68-26.624 4.813-11.469 6.246-14.336 11.469-22.323 7.066-10.854 6.451-10.035 18.022-21.709 18.432-18.534 38.707-29.389 65.024-35.021 6.451-1.331 13.005-1.741 25.6-1.741 14.541 0.102 18.432 0.512 27.648 2.765 23.245 5.632 41.984 15.667 58.47 31.232 27.75 26.112 41.165 58.368 40.346 96.973-0.512 25.293-6.758 45.363-20.787 66.867-18.739 28.877-49.562 48.947-85.709 56.013-5.837 1.126-30.72 1.434-37.786 0.41zM722.227 575.386c-25.907-3.994-49.254-15.872-69.222-35.123l-10.138-9.83 5.12-10.24c12.8-25.088 17.101-43.418 16.998-71.168 0-20.582-1.638-31.027-7.168-47.923-3.072-9.626-11.162-27.341-13.926-30.618-1.536-1.843 0.307-4.301 10.342-13.824 25.293-24.166 55.091-35.738 90.419-35.123 34.816 0.512 63.386 12.698 87.859 37.274 26.214 26.317 38.4 56.934 37.376 93.798-0.819 34.202-12.902 62.157-37.274 86.63-18.432 18.432-39.219 29.696-64.717 35.328-10.342 2.253-33.69 2.662-45.67 0.819zM157.901 324.096c-37.888-20.685-65.638-55.91-76.083-96.666-4.608-18.022-4.813-21.914-4.915-101.478-0.102-61.747 0.205-76.8 1.331-81.101 2.97-11.264 11.469-22.016 21.299-27.034s8.704-5.018 105.574-5.018c49.971 0 90.829 0.205 90.829 0.41 0 0.307-1.434 2.56-3.072 5.12-4.608 6.861-7.885 14.848-9.728 23.859-1.434 7.168-1.638 17.715-1.229 87.45 0.205 43.622 0.717 81.306 1.126 83.866 3.789 23.962 13.005 49.152 25.293 69.222l4.096 6.656-5.427-0.614c-2.97-0.41-6.554-0.922-7.987-1.126s-9.421-0.41-17.92-0.41c-39.014-0.205-77.312 12.8-108.237 36.454-3.174 2.458-6.144 4.506-6.656 4.506-0.41 0-4.198-1.843-8.294-4.096zM853.504 325.632c-22.221-18.432-54.374-32.256-85.504-36.864-9.728-1.434-37.274-2.253-42.496-1.229-1.126 0.307-4.71 0.819-7.987 1.229l-5.939 0.717 4.301-7.066c12.902-20.89 22.426-48.026 25.088-71.68 0.307-3.277 0.819-6.861 0.922-7.987s0.307-44.339 0.41-95.949l0.102-94.003h204.902l-0.41 97.587c-0.205 53.555-0.717 99.123-1.126 101.069s-1.434 6.758-2.253 10.547c-6.554 31.539-25.805 63.078-51.712 84.685-10.035 8.397-31.232 21.606-34.406 21.504-0.41-0.102-2.15-1.229-3.891-2.56zM391.68 325.018c-18.33-9.523-38.195-25.6-50.995-41.37-14.131-17.51-25.19-41.267-30.618-66.048-2.355-10.752-2.355-10.854-2.355-91.648v-80.896l3.277-6.963c3.789-7.885 11.878-16.691 18.842-20.173 10.24-5.325 1.536-5.12 200.909-5.12h186.061v94.515c-0.102 88.678-0.205 95.13-2.15 105.677-5.53 31.642-21.094 61.747-43.213 83.763-10.035 9.933-27.034 22.118-38.707 27.853l-5.632 2.765-9.216-6.758c-35.021-25.805-79.974-38.195-124.211-33.894-30.72 2.97-65.331 16.691-90.214 35.84-3.277 2.56-6.349 4.608-6.861 4.608-0.41-0.102-2.662-1.024-4.915-2.15z" />
+<glyph unicode="&#xe944;" glyph-name="avatar" d="M494.592 882.586c-70.246-7.373-128.307-50.483-154.317-114.586-5.939-14.438-9.83-28.467-11.264-40.448-0.307-2.56-0.922-6.656-1.331-9.216-0.922-4.915-0.614-37.683 0.512-44.544 3.789-25.088 14.029-53.146 26.726-73.011 11.162-17.306 27.034-34.918 42.906-47.309 52.122-40.858 123.699-50.176 184.832-24.269 61.030 25.907 103.629 82.534 111.309 148.173 1.434 12.186 0.819 39.629-1.126 51.098-5.222 30.208-16.998 57.856-34.816 81.51-7.373 9.626-25.19 27.853-33.894 34.509-26.419 20.070-57.651 32.973-89.395 37.171-9.114 1.126-32.563 1.741-40.141 0.922zM342.528 523.571c-18.637-11.674-34.202-23.859-47.514-37.581-35.533-36.659-57.446-82.33-64.102-134.246-1.126-8.602-1.331-34.714-1.126-131.584 0.205-111.309 0.307-121.344 1.946-127.488 2.765-10.035 5.837-18.33 9.114-24.474 15.258-28.262 39.322-46.387 70.451-53.248 9.728-2.048 10.65-2.048 245.555-2.15h235.827l-0.41 168.141c-0.102 92.57-0.614 169.37-0.922 170.803-0.41 1.434-1.229 6.042-1.843 10.24-5.325 36.25-22.733 75.776-46.797 106.189-13.312 16.896-31.949 34.406-49.254 46.182-10.445 7.168-19.354 12.493-20.787 12.493-0.512 0-2.765-1.638-4.915-3.584-26.010-24.064-62.669-43.52-99.226-52.634-20.582-5.222-32.461-6.656-54.989-6.656-27.75-0.102-43.622 1.843-66.458 8.192-22.016 6.144-50.586 19.354-66.662 30.618-9.83 6.963-19.456 14.438-24.371 18.944-3.072 2.765-6.246 5.12-6.963 5.018-0.819 0-3.686-1.434-6.554-3.174z" />
+<glyph unicode="&#xe945;" glyph-name="Baby" d="M493.056 907.264c-48.64-7.782-87.654-40.858-102.707-87.040-12.186-37.171-6.554-77.107 15.667-111.104 6.246-9.626 24.269-27.648 33.894-33.997 15.258-10.138 32.973-17.408 49.562-20.378 11.366-2.048 36.454-1.843 47.104 0.41 17.613 3.789 35.328 11.366 48.947 20.89 10.035 7.066 26.522 24.064 33.075 34.099 14.95 22.835 21.402 45.261 20.89 72.704-0.512 35.021-12.595 63.59-37.274 88.064-19.149 19.046-39.117 29.798-65.126 35.43-10.445 2.15-33.178 2.662-44.032 0.922zM403.968 626.688c-0.512-0.205-4.506-1.126-8.704-2.048-8.909-2.048-22.016-8.294-28.672-13.619-2.56-1.946-11.059-10.24-18.944-18.227s-35.942-36.557-62.464-63.488c-102.502-104.038-96.358-97.587-100.454-106.496-16.179-34.918 6.451-74.342 44.134-76.902 9.216-0.614 17.715 1.126 27.136 5.53 5.939 2.765 21.709 18.227 97.075 95.027l30.925 31.642v-106.906h256v107.008l14.95-15.36c69.325-71.066 104.243-105.779 109.158-108.851 9.421-5.632 16.486-7.68 27.443-7.68 11.878-0.102 19.251 1.946 28.262 7.578 24.781 15.667 32.256 48.435 16.794 73.728-2.355 3.994-18.125 20.787-46.080 49.152-23.347 23.859-54.682 55.706-69.632 70.861-61.338 62.362-62.464 63.386-71.168 68.506-4.506 2.56-12.083 6.042-16.896 7.578l-8.704 2.97-109.568 0.205c-60.211 0.102-109.978 0-110.592-0.205zM364.954 315.085c-7.782-7.168-35.021-32.973-47.821-45.261-20.173-19.456-29.491-35.43-33.997-58.368-1.843-9.83-1.434-28.672 1.024-38.912 3.891-16.486 14.029-34.714 25.805-46.592 6.451-6.451 9.933-9.83 39.731-37.888 10.138-9.523 21.914-20.582 26.112-24.576s12.083-11.469 17.408-16.486c5.325-5.12 13.926-13.107 18.944-17.92 5.53-5.222 11.571-9.933 15.053-11.571 20.992-10.24 45.466-2.458 55.296 17.613 3.072 6.246 3.379 7.68 3.379 16.077-0.102 8.090-0.41 9.933-2.97 14.848-3.584 6.963-4.915 8.499-16.998 19.968-5.325 5.018-14.643 13.722-20.582 19.456-5.939 5.632-14.438 13.619-18.944 17.818-23.859 22.323-24.986 23.859-25.805 33.69-0.717 7.885 1.843 13.517 9.421 21.094 3.482 3.379 14.131 13.619 23.654 22.63 9.626 9.011 20.582 19.354 24.371 23.040l7.066 6.656-7.066 6.554c-3.789 3.584-13.619 12.8-21.811 20.582s-16.486 15.565-18.432 17.408c-1.946 1.741-7.27 6.758-11.776 11.059-7.27 6.861-12.902 12.288-31.744 30.003l-4.096 3.891-5.222-4.813zM646.656 313.139c-3.891-3.686-13.824-13.107-22.016-20.787-8.192-7.782-16.691-15.77-18.944-17.92-2.253-2.048-10.547-9.933-18.432-17.306-7.885-7.475-17.51-16.589-21.299-20.173l-7.066-6.554 16.282-15.36c8.909-8.397 19.866-18.842 24.371-23.142s10.65-10.035 13.517-12.698c9.318-8.602 12.39-17.92 9.318-28.57-0.922-3.277-3.686-6.656-12.083-14.95-9.114-9.011-29.696-28.672-42.394-40.346-26.112-24.166-29.798-29.696-29.798-44.646 0-7.27 0.41-9.626 2.765-14.541 9.728-20.89 35.021-29.184 56.422-18.534 3.994 1.946 22.733 18.637 40.653 36.147 1.536 1.434 6.656 6.349 11.571 10.957s12.8 11.981 17.408 16.384c50.278 47.411 52.224 49.357 58.573 58.778 10.547 15.77 15.872 32.256 16.486 51.098 0.512 18.33-2.048 30.413-9.933 46.592-7.373 15.053-11.674 19.763-59.187 64.512-5.325 5.12-10.65 10.138-11.878 11.264-1.126 1.126-3.277 3.072-4.608 4.301l-2.56 2.253-7.168-6.758z" />
+<glyph unicode="&#xe946;" glyph-name="backup" d="M179.302 558.387l0.102-324.915 2.253-8.704c5.837-22.63 19.661-39.936 39.936-49.971 16.486-8.192 10.445-7.782 104.346-8.090l83.661-0.41v-49.357c0.102-27.136 0.307-51.2 0.614-53.453 3.277-24.678 17.818-42.803 39.117-48.538 7.68-2.048 10.138-2.15 64.307-2.15 60.621 0 62.362 0.205 71.475 5.53 8.909 5.222 19.456 17.101 23.757 26.931 5.018 11.059 5.427 17.203 5.53 71.27v49.869h230.4v324.403c0 292.966-0.205 325.018-1.638 331.469-6.861 29.901-29.286 52.429-58.47 58.88-8.806 1.946-16.077 2.048-307.302 2.048h-298.189l0.102-324.813zM754.586 830.464c18.33-4.813 32.666-19.149 37.478-37.478 1.331-4.71 1.536-46.797 1.536-290.406v-284.979h-128.512l-11.981 12.288c-6.656 6.758-12.083 12.493-12.083 12.8s28.57 0.512 63.488 0.512h63.488v563.2h-512v-563.2l126.874-0.512-12.288-12.595-12.288-12.493h-41.165c-45.466 0-47.923 0.307-59.392 6.349-12.698 6.758-23.245 21.094-26.214 35.43-0.819 3.891-1.126 87.245-1.126 289.075v283.546h259.379c221.082 0 260.096-0.205 264.806-1.536zM527.258 675.738c18.022-4.301 33.894-16.998 41.882-33.178 5.427-10.957 7.475-20.275 6.861-31.744-0.512-10.445-2.253-16.896-6.656-26.010-3.994-7.987-14.131-19.456-21.504-24.166-2.765-1.843-5.12-3.584-5.12-3.994 0-0.307 1.126-8.397 2.56-18.022 3.379-22.323 3.174-21.197 4.506-30.208 1.434-10.24 7.168-48.742 7.782-52.736 1.331-7.885 1.536-9.626 2.15-15.36 0.41-3.379 0.819-6.451 1.024-6.758 0.205-0.41 0.614-2.97 1.024-5.939l0.614-5.222h-50.79c-28.979 0-50.79 0.41-50.79 0.922s0.614 4.506 1.434 8.909c0.819 4.506 1.741 10.342 2.15 13.005 0.307 2.765 1.946 13.107 3.584 23.040s4.096 25.293 5.53 33.997c1.434 8.704 3.994 24.474 5.734 35.021 1.638 10.445 3.072 19.354 3.072 19.558 0 0.307-2.15 1.946-4.813 3.584-17.92 11.571-28.979 31.949-28.979 53.35 0 17.408 6.144 31.949 18.944 44.749 8.806 8.806 16.589 13.517 28.467 16.896 8.090 2.355 22.528 2.458 31.334 0.307zM528.896 326.758c5.325-2.458 11.162-7.987 42.803-39.936 20.173-20.275 49.357-49.664 64.819-65.229s28.058-28.672 28.058-28.979c0-0.307-16.998-0.614-37.888-0.614h-37.786l-0.307-66.253c-0.41-74.957-0.102-72.397-8.397-80.691-6.861-6.861-6.451-6.758-69.734-6.451-55.398 0.307-56.422 0.307-60.416 2.56-6.861 3.686-10.957 9.318-13.312 18.432-1.331 4.915-1.536 16.282-1.536 69.12v63.283h-76.8l4.915 4.71c2.662 2.56 21.402 20.89 41.574 40.755 20.173 19.763 39.834 38.912 43.52 42.496s15.36 14.95 25.907 25.293c23.347 22.835 26.931 25.088 40.755 24.678 6.042-0.205 9.011-0.819 13.824-3.174z" />
+<glyph unicode="&#xe947;" glyph-name="banking" d="M506.368 803.84c-5.734-2.765-20.685-9.626-29.184-13.517-3.072-1.434-10.445-4.813-16.179-7.578-5.837-2.765-10.752-5.018-10.957-5.018-0.102 0-5.018-2.253-10.854-5.018-5.837-2.662-19.866-9.216-31.13-14.438s-23.962-11.059-28.16-13.005c-4.198-1.946-10.24-4.71-13.312-6.144s-9.114-4.198-13.312-6.246c-4.198-1.946-10.445-4.813-13.824-6.349-6.758-3.072-9.216-4.198-40.96-18.944-11.776-5.427-24.986-11.571-29.184-13.517s-14.746-6.758-23.347-10.752l-15.565-7.27v-48.845h-153.6v-51.2h25.6v-435.2h-25.6v-25.6h-25.6v-25.6h921.6v25.6h-25.6v25.6h-25.6v435.2h25.6v51.2h-153.6v48.845l-8.397 3.891c-4.71 2.15-15.36 7.168-23.859 11.059-8.397 3.891-20.173 9.318-26.010 12.083s-10.752 5.018-10.957 5.018c-0.205 0-6.144 2.765-13.312 6.144-7.066 3.379-13.005 6.144-13.21 6.144-0.307 0-20.787 9.523-42.496 19.661-7.987 3.789-11.059 5.12-47.104 21.811-15.462 7.168-31.334 14.541-35.328 16.384-6.144 2.97-15.155 7.066-54.579 25.19-3.482 1.638-6.554 2.97-6.656 2.867-0.102 0-2.458-1.126-5.325-2.458zM519.27 746.598c4.198-1.843 12.083-5.53 17.613-8.192 5.632-2.56 10.24-4.71 10.445-4.71 0.102 0 5.53-2.458 11.878-5.53 6.451-2.97 14.438-6.758 17.818-8.294s9.626-4.403 13.824-6.349c4.198-1.946 9.933-4.608 12.8-5.939 2.765-1.331 8.806-4.096 13.312-6.144 40.858-18.842 48.23-22.221 48.538-22.63 0.205-0.205-68.915-0.41-153.6-0.307l-154.010 0.102 5.12 2.355c2.867 1.331 8.090 3.891 11.776 5.53 3.686 1.741 11.264 5.222 16.896 7.885 5.632 2.56 15.36 7.066 21.504 9.83 6.246 2.867 15.462 7.066 20.48 9.421 16.486 7.782 27.238 12.8 52.736 24.678 13.824 6.349 25.19 11.674 25.19 11.674 0.102 0.102 3.584-1.434 7.68-3.379zM358.4 371.2v-204.8h-51.2v409.6h51.2v-204.8zM460.8 371.2v-204.8h-51.2v409.6h51.2v-204.8zM614.4 371.2v-204.8h-51.2v409.6h51.2v-204.8zM716.8 371.2v-204.8h-51.2v409.6h51.2v-204.8zM256 460.8v-64h-102.4v128h102.4v-64zM870.4 460.8v-64h-102.4v128h102.4v-64zM256 281.088v-63.488h-102.4v126.976h102.4v-63.488zM870.4 281.088v-63.488h-102.4v126.976h102.4v-63.488z" />
+<glyph unicode="&#xe948;" glyph-name="battery_1_bar" d="M91.648 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-40.448-1.536-242.074 0-263.475-0.512-243.712 7.168-256.614 7.27-12.186 19.968-21.402 33.587-24.371 7.578-1.536 753.869-1.638 762.675 0 19.661 3.584 36.659 20.582 40.243 40.243 0.717 3.891 1.126 25.498 1.126 59.187v53.043h26.931c31.539 0 34.816 0.614 41.984 7.475 8.499 8.294 7.987 0.512 7.68 122.675l-0.307 107.93-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-6.963 5.325-10.035 5.734-39.731 5.734h-27.546l-0.102 54.272c-0.102 29.901-0.205 54.579-0.307 55.091-0.102 0.41-0.512 2.56-1.024 4.71-3.584 18.022-21.197 35.021-39.936 38.4-7.987 1.434-755.405 1.331-762.982-0.102zM819.2 448v-204.8h-691.2v409.6h691.2v-204.8zM179.2 448v-153.6h204.8v307.2h-204.8v-153.6z" />
+<glyph unicode="&#xe949;" glyph-name="battery_2_bar" d="M91.648 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-40.448-1.536-242.074 0-263.475-0.512-243.712 7.168-256.614 7.27-12.186 19.968-21.402 33.587-24.371 7.578-1.536 753.869-1.638 762.675 0 19.661 3.584 36.659 20.582 40.243 40.243 0.717 3.891 1.126 25.498 1.126 59.187v53.043h26.931c31.539 0 34.816 0.614 41.984 7.475 8.499 8.294 7.987 0.512 7.68 122.675l-0.307 107.93-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-6.963 5.325-10.035 5.734-39.731 5.734h-27.546l-0.102 54.272c-0.102 29.901-0.205 54.579-0.307 55.091-0.102 0.41-0.512 2.56-1.024 4.71-3.584 18.022-21.197 35.021-39.936 38.4-7.987 1.434-755.405 1.331-762.982-0.102zM819.2 448v-204.8h-691.2v409.6h691.2v-204.8zM179.2 448v-153.6h384v307.2h-384v-153.6z" />
+<glyph unicode="&#xe94a;" glyph-name="battery_charging" d="M91.648 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-40.448-1.536-242.074 0-263.475-0.512-243.712 7.168-256.614 7.27-12.186 19.968-21.402 33.587-24.371 7.578-1.536 753.869-1.638 762.675 0 19.661 3.584 36.659 20.582 40.243 40.243 0.717 3.891 1.126 25.498 1.126 59.187v53.043h26.931c31.539 0 34.816 0.614 41.984 7.475 8.499 8.294 7.987 0.512 7.68 122.675l-0.307 107.93-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-6.963 5.325-10.035 5.734-39.731 5.734h-27.546l-0.102 54.272c-0.102 29.901-0.205 54.579-0.307 55.091-0.102 0.41-0.512 2.56-1.024 4.71-3.584 18.022-21.197 35.021-39.936 38.4-7.987 1.434-755.405 1.331-762.982-0.102zM535.552 639.898c-2.253-12.595-8.909-52.019-9.728-58.266-0.307-2.253-1.024-6.144-1.536-8.704s-1.741-9.216-2.56-14.848c-2.048-13.21-2.458-15.872-3.072-18.944-0.307-1.434-0.717-3.891-0.922-5.632-1.229-7.68-4.813-28.979-5.325-31.437l-0.614-2.867h128.41l-9.114-9.933c-4.915-5.53-10.65-11.878-12.698-14.131-9.421-10.445-35.738-39.731-42.803-47.616-4.301-4.813-10.342-11.469-13.414-14.848-3.174-3.379-9.626-10.547-14.336-15.872-10.445-11.674-9.011-10.035-18.432-20.48-4.198-4.71-8.397-9.318-9.318-10.445-0.922-1.024-5.325-5.837-9.728-10.752-9.626-10.65-18.022-19.968-22.323-24.883-3.994-4.506-21.402-23.859-22.118-24.576-0.922-0.819-19.354-21.402-27.648-30.72-4.198-4.813-10.445-11.674-13.824-15.36s-8.397-9.216-11.059-12.288l-4.915-5.632 0.512 3.584c0.41 1.946 1.536 8.909 2.662 15.36 1.024 6.451 2.662 15.974 3.584 20.992 0.922 5.12 1.843 10.65 2.15 12.288 0.614 3.686 7.066 40.755 9.114 52.224 1.126 6.656 5.939 34.304 8.192 47.821l0.41 2.867-127.795 0.512 4.813 5.12c2.662 2.867 10.547 11.571 17.613 19.456s13.005 14.541 13.312 14.848c0.41 0.307 4.71 5.12 9.83 10.752 5.018 5.632 9.318 10.445 9.626 10.752s4.608 5.12 9.626 10.752c5.12 5.632 9.421 10.445 9.728 10.752s4.301 4.608 8.806 9.728c4.506 5.018 9.83 11.059 11.878 13.312s8.704 9.626 14.746 16.384c6.042 6.758 13.005 14.336 15.258 16.896 2.355 2.56 7.885 8.704 12.39 13.824 4.506 5.018 8.704 9.626 9.318 10.24 0.512 0.512 4.71 5.12 9.216 10.138 4.403 5.12 8.806 9.933 9.626 10.854s5.018 5.53 9.216 10.24c4.198 4.71 8.192 9.011 8.704 9.626 0.614 0.614 4.915 5.53 9.728 10.854s8.909 9.933 9.216 10.24c0.614 0.614 6.656 7.27 18.842 20.787 4.403 4.915 8.192 8.806 8.397 8.602s-0.512-5.325-1.638-11.571z" />
+<glyph unicode="&#xe94b;" glyph-name="battery_empty" d="M91.648 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-40.448-1.536-242.074 0-263.475-0.512-243.712 7.168-256.614 7.27-12.186 19.968-21.402 33.587-24.371 7.578-1.536 753.869-1.638 762.675 0 19.661 3.584 36.659 20.582 40.243 40.243 0.717 3.891 1.126 25.498 1.126 59.187v53.043h26.931c31.539 0 34.816 0.614 41.984 7.475 8.499 8.294 7.987 0.512 7.68 122.675l-0.307 107.93-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-6.963 5.325-10.035 5.734-39.731 5.734h-27.546l-0.102 54.272c-0.102 29.901-0.205 54.579-0.307 55.091-0.102 0.41-0.512 2.56-1.024 4.71-3.584 18.022-21.197 35.021-39.936 38.4-7.987 1.434-755.405 1.331-762.982-0.102zM819.2 448v-204.8h-691.2v409.6h691.2v-204.8z" />
+<glyph unicode="&#xe94c;" glyph-name="battery_full" d="M91.648 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-40.448-1.536-242.074 0-263.475-0.512-243.712 7.168-256.614 7.27-12.186 19.968-21.402 33.587-24.371 7.578-1.536 753.869-1.638 762.675 0 19.661 3.584 36.659 20.582 40.243 40.243 0.717 3.891 1.126 25.498 1.126 59.187v53.043h26.931c31.539 0 34.816 0.614 41.984 7.475 8.499 8.294 7.987 0.512 7.68 122.675l-0.307 107.93-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-6.963 5.325-10.035 5.734-39.731 5.734h-27.546l-0.102 54.272c-0.102 29.901-0.205 54.579-0.307 55.091-0.102 0.41-0.512 2.56-1.024 4.71-3.584 18.022-21.197 35.021-39.936 38.4-7.987 1.434-755.405 1.331-762.982-0.102z" />
+<glyph unicode="&#xe94d;" glyph-name="battery_full_2" d="M91.648 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-40.448-1.536-242.074 0-263.475-0.512-243.712 7.168-256.614 7.27-12.186 19.968-21.402 33.587-24.371 7.578-1.536 753.869-1.638 762.675 0 19.661 3.584 36.659 20.582 40.243 40.243 0.717 3.891 1.126 25.498 1.126 59.187v53.043h26.931c31.539 0 34.816 0.614 41.984 7.475 8.499 8.294 7.987 0.512 7.68 122.675l-0.307 107.93-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-6.963 5.325-10.035 5.734-39.731 5.734h-27.546l-0.102 54.272c-0.102 29.901-0.205 54.579-0.307 55.091-0.102 0.41-0.512 2.56-1.024 4.71-3.584 18.022-21.197 35.021-39.936 38.4-7.987 1.434-755.405 1.331-762.982-0.102zM819.2 448v-204.8h-691.2v409.6h691.2v-204.8zM179.2 448v-153.6h588.8v307.2h-588.8v-153.6z" />
+<glyph unicode="&#xe94e;" glyph-name="Betting" d="M179.2 508.518v-323.584l2.56-8.090c4.506-14.438 15.462-26.317 29.286-32.154 7.27-3.072 8.294-3.174 26.317-3.686l18.637-0.41v614.605h486.4v16.179c0 10.65-0.512 17.92-1.536 21.606-5.018 18.944-20.582 33.997-39.219 37.888-3.891 0.819-79.155 1.126-263.885 1.126h-258.56v-323.482zM281.6 406.323c0-352.358-0.41-327.475 5.734-340.173 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.042-6.246-5.734 276.173-5.734h259.277v321.741c0 196.301-0.41 324.096-1.024 327.68-2.97 18.534-18.739 35.123-37.99 40.243-4.71 1.331-43.725 1.536-264.806 1.536h-259.379v-323.277zM572.518 587.571c4.71-7.27 18.739-28.57 31.13-47.411 12.493-18.842 27.546-41.677 33.485-50.688s20.685-31.334 32.768-49.664c33.69-50.995 35.226-53.453 37.888-58.368 10.854-19.558 11.674-47.206 2.048-67.584-23.45-50.176-88.678-60.416-126.362-19.968l-4.813 5.12 1.434-4.608c10.957-36.045 31.642-73.318 53.043-95.437l6.656-6.963h-76.186c-41.882 0-76.186 0.205-76.186 0.512s1.741 2.253 3.891 4.403c20.275 19.968 39.834 53.453 52.531 90.214 2.253 6.451 3.789 11.878 3.482 12.186s-0.512 0-0.512-0.614c0-1.741-11.059-12.288-17.408-16.589-13.619-9.318-25.395-12.698-43.008-12.698-17.51 0-29.594 3.584-43.008 12.698-31.232 21.299-42.189 61.235-26.419 96.256 2.253 4.813 3.994 7.578 37.171 57.856 11.162 16.896 24.986 37.888 30.72 46.592 11.571 17.613 51.405 78.029 67.379 102.195 5.632 8.499 10.65 15.565 10.957 15.565 0.41 0 4.608-5.837 9.318-13.005z" />
+<glyph unicode="&#xe94f;" glyph-name="bill_euro" d="M179.2 755.2v-102.4h26.112c14.336 0 26.112 0.41 26.112 0.819 0 1.331 9.523 7.987 13.824 9.626 14.234 5.53 30.31 1.843 40.755-9.318 7.68-8.192 10.342-14.95 10.342-26.726 0.102-9.011-0.102-10.24-3.277-16.589-6.042-12.288-17.51-20.173-31.437-21.811-8.909-1.024-20.582 3.174-28.57 10.138l-2.97 2.662h-50.893v-307.2h53.453l2.97 2.458c6.656 5.632 21.299 8.499 31.642 6.246 10.547-2.253 20.992-10.957 26.317-21.914 2.458-5.018 2.765-6.963 2.765-14.95 0-6.963-0.614-10.547-2.253-14.848-6.963-17.715-28.262-28.058-46.285-22.426-4.915 1.536-12.083 6.246-16.282 10.547l-3.584 3.686h-48.845l0.307-71.373c0.41-69.018 0.41-71.68 2.458-78.131 8.909-27.853 29.389-47.002 57.549-53.965 6.246-1.536 31.949-1.638 306.176-1.741l299.213-0.102-0.205 377.856c-0.307 359.014-0.41 378.163-2.15 384-8.704 29.491-30.618 50.176-59.597 56.32-6.246 1.331-46.797 1.536-305.357 1.536h-298.291v-102.4zM729.293 664.781c11.981-7.168 16.486-22.426 10.035-34.099-3.072-5.53-4.915-7.373-10.24-10.547l-4.608-2.662-159.13-0.307c-179.507-0.307-165.478-0.922-173.773 7.68-12.902 13.312-7.885 35.635 9.421 41.779 3.379 1.229 29.696 1.434 163.738 1.229l159.744-0.205 4.813-2.867zM729.293 536.883c19.046-11.264 16.486-39.014-4.198-46.387-3.891-1.331-23.654-1.536-161.894-1.536-136.704 0-158.003 0.205-161.792 1.536-17.715 6.246-23.040 28.774-9.728 41.984 8.090 8.090-5.734 7.578 173.056 7.373l159.744-0.205 4.813-2.765zM585.216 409.395c15.258-8.192 18.432-28.57 6.246-40.653-8.090-8.192-3.379-7.782-100.045-7.782-74.035 0-86.221 0.205-90.112 1.536-17.92 6.349-23.040 28.672-9.523 42.086 7.782 7.782 3.174 7.475 101.786 7.27l87.552-0.205 4.096-2.253zM718.848 318.464c16.794-2.355 31.027-10.24 40.653-22.63 4.506-5.734 10.342-17.613 10.957-22.016 1.024-8.499-6.963-17.306-15.667-17.306-7.987 0-11.571 2.765-16.691 12.8-7.68 14.95-14.438 19.456-31.027 20.378-14.234 0.819-26.726-3.891-35.123-13.21-4.096-4.506-9.933-15.155-11.878-21.709l-0.717-2.355h35.942c41.267 0 41.37 0 45.056-7.782 2.355-5.12 2.15-10.65-0.614-16.077-2.97-5.632-4.915-5.837-46.49-5.837h-37.888v-15.36h32.358c30.72 0 32.563-0.102 35.738-2.048 1.843-1.126 3.891-3.379 4.608-5.018 1.741-4.301 1.536-11.776-0.614-14.95-3.584-5.427-4.915-5.632-38.298-5.632h-30.822l0.614-2.253c0.41-1.331 1.946-5.222 3.584-8.602 6.963-15.36 20.275-23.552 39.526-24.269 18.637-0.717 28.57 4.403 35.738 18.739 5.53 10.957 12.288 14.95 20.787 12.186 14.95-4.813 16.282-15.667 4.198-33.792-12.083-18.022-30.822-26.726-57.754-26.726-28.365 0-48.23 9.318-62.464 29.286-6.861 9.728-10.342 17.613-13.824 30.925l-1.024 4.301-8.704 0.307c-8.192 0.41-8.909 0.614-11.878 3.686-2.56 2.458-3.379 4.301-3.686 8.192-0.819 9.933 5.12 15.667 16.384 15.667h5.837v15.36h-6.349c-7.782 0-12.493 2.458-14.746 7.68-2.765 6.758-1.229 14.029 4.198 18.944 2.355 2.253 3.891 2.56 11.366 2.97l8.602 0.307 1.024 4.301c3.584 13.517 8.602 24.781 15.872 34.918 14.95 20.992 42.291 30.925 73.216 26.624z" />
+<glyph unicode="&#xe950;" glyph-name="billboard" d="M146.637 882.176c-4.198-1.024-10.957-5.632-13.619-9.318-4.096-5.734-5.018-10.752-5.018-26.112v-14.746l36.045-0.205 35.942-0.307 3.994-11.776c2.15-6.451 3.891-12.083 3.891-12.493s-26.112-0.922-58.061-1.126c-51.507-0.307-58.778-0.512-63.181-2.048-15.053-5.222-26.829-16.794-32.563-32.051l-2.355-6.042v-431.104l2.355-6.144c5.837-14.95 15.565-24.781 31.13-31.437l5.427-2.355 416.768-0.307c297.574-0.205 418.611 0 423.322 0.819 19.866 3.379 36.864 19.866 40.96 39.731 1.638 7.68 1.638 422.81 0 430.49-3.994 19.046-20.582 35.635-39.629 39.629-3.584 0.717-24.269 1.126-60.621 1.126-30.413 0-55.296 0.41-55.296 0.819s1.741 6.042 3.891 12.493l3.994 11.776 36.045 0.307 36.147 0.205-0.41 16.691c-0.41 18.534-0.819 20.173-7.885 27.238-7.27 7.27-7.066 7.27-68.71 7.27-62.464 0-61.542 0.102-69.222-7.885-6.349-6.451-7.578-11.162-7.578-28.672v-14.643h27.136c14.95 0 27.136-0.41 27.136-0.819s-1.741-6.042-3.891-12.493l-3.994-11.776h-263.987v12.288l0.102 12.288 32.051 0.307 32.051 0.205-0.41 16.691c-0.41 18.534-0.922 20.275-7.885 27.238-7.27 7.27-7.066 7.27-68.813 7.27-59.597 0-59.699 0-67.174-5.734-1.843-1.331-4.608-4.71-6.144-7.373-2.765-4.608-2.867-5.427-3.174-21.402l-0.41-16.691h64.205v-25.6l-263.987 0.512-3.994 11.776c-2.15 6.451-3.891 12.083-3.891 12.493s12.288 0.819 27.238 0.819h27.238l-0.41 16.691c-0.41 18.534-0.819 20.173-7.885 27.238-7.27 7.27-7.066 7.27-68.608 7.168-30.208-0.102-56.422-0.512-58.266-0.922zM921.6 550.4v-204.8h-819.2v409.6h819.2v-204.8zM121.242 267.776c-4.608-1.024-10.24-4.813-13.21-8.602-7.987-10.445-7.168-24.781 2.048-33.894 8.192-8.294-5.018-7.68 169.677-7.68h155.443v-230.4h153.6v230.4h154.931c88.474 0 156.57 0.41 158.822 1.024 9.421 2.15 17.51 11.469 18.637 21.504 1.229 11.162-4.096 20.89-14.234 25.907l-5.734 2.765-388.403-0.102c-213.606-0.102-389.837-0.41-391.578-0.922z" />
+<glyph unicode="&#xe951;" glyph-name="birthday" d="M250.266 876.954c-3.379-3.482-6.554-6.758-7.168-7.475-11.264-12.083-32.256-39.731-41.882-55.398-24.166-39.117-27.853-65.229-13.21-94.106 9.523-18.842 26.419-32.666 47.514-38.605 8.909-2.56 10.854-2.355 4.608 0.614-7.27 3.277-13.926 9.626-17.613 16.589s-4.608 10.547-4.608 18.534c0 13.619 11.674 34.202 33.69 58.982l4.198 4.813 4.608-4.915c11.776-12.595 24.166-30.208 29.389-41.677 2.97-6.349 5.018-15.77 4.506-19.661-1.024-7.68-1.741-10.342-3.994-14.746-4.608-9.114-11.878-15.667-20.89-18.944-5.222-1.946-1.126-1.843 6.451 0.102 8.090 2.048 20.787 8.397 26.931 13.414 18.227 14.746 27.955 32.87 29.696 55.398 1.331 17.92-5.837 38.81-22.323 65.229-10.65 16.998-31.13 43.52-45.056 58.368-2.662 2.867-5.734 6.144-6.861 7.475l-2.048 2.253-5.939-6.246zM508.928 880.23c-1.434-1.638-6.246-7.066-10.65-12.083-30.925-34.509-54.067-71.066-60.621-96.051-3.994-14.746-2.15-34.611 4.506-48.64 10.547-22.733 33.075-40.243 56.013-43.52l4.096-0.614-4.301 1.843c-14.438 6.042-23.859 19.558-24.064 34.611-0.307 14.643 11.059 35.226 33.178 59.802l4.71 5.222 4.096-4.301c15.565-16.486 28.16-35.533 32.461-48.845 6.144-18.842-4.096-39.731-22.938-46.899l-3.686-1.434 4.608 0.614c7.373 1.024 17.92 5.12 25.907 10.138 30.618 19.251 43.622 54.886 32.256 88.064-7.987 23.347-26.419 52.429-52.531 83.046-7.578 8.806-19.661 22.016-20.173 22.016-0.205 0-1.434-1.331-2.867-2.97zM762.061 876.749c-34.611-35.84-63.488-81.101-69.325-108.749-4.915-23.245 2.97-48.64 20.685-66.56 9.523-9.523 21.094-16.384 33.997-20.070 8.602-2.458 12.39-2.458 5.939 0.102-18.227 7.066-27.955 28.672-21.402 47.411 4.301 11.981 15.974 29.798 28.877 44.032 5.837 6.246 7.578 7.68 8.602 6.656 4.915-5.018 19.251-23.040 23.654-29.901 9.626-14.746 13.21-24.166 13.005-34.611-0.205-14.541-10.752-29.286-24.474-34.202-4.71-1.638-1.536-1.946 4.301-0.307 28.262 7.578 49.357 28.262 56.32 55.296 4.915 19.046 2.458 35.738-8.704 58.778-10.138 20.89-32.87 53.248-51.712 73.728-1.536 1.741-5.325 5.734-8.294 8.909l-5.427 5.837-6.042-6.349zM221.286 651.059c-2.458-0.922-6.451-3.584-8.806-5.939-7.987-7.987-7.68-4.198-7.68-92.877v-78.643h-16.077c-24.678 0-38.605-2.765-54.784-10.752-26.624-13.21-45.978-36.864-53.862-65.843l-2.662-9.933-0.41-60.416c-0.205-43.315 0-61.542 0.819-64.512 2.662-9.421 11.059-16.998 19.968-18.33l4.608-0.717v-230.298h819.2v229.888l5.427 1.331c6.963 1.638 12.698 5.734 16.589 11.981l3.072 4.915v126.157l-2.765 10.035c-4.915 17.818-13.824 33.28-26.931 46.285-13.619 13.619-29.184 22.528-47.821 27.238-6.758 1.741-12.8 2.253-29.184 2.662l-20.787 0.512v78.029c0 88.474 0.205 85.402-7.68 93.286-7.066 7.168-10.24 7.68-44.032 7.68-33.075 0-35.84-0.512-43.008-7.68-7.987-7.885-7.68-4.198-7.68-92.877v-78.643h-153.6v78.131c0 43.213-0.512 79.872-1.024 82.022-1.331 5.734-5.939 11.878-11.674 15.462l-5.018 3.072-31.13 0.307c-35.84 0.41-38.093 0-45.67-7.373-8.192-7.987-7.885-3.994-7.885-92.979v-78.643h-153.6v79.258c0 70.246-0.205 79.667-1.638 83.149-2.458 6.042-6.144 10.342-11.469 13.414l-4.813 2.867-31.744 0.205c-26.829 0.205-32.461 0-36.25-1.434zM281.395 291.328c13.107-3.686 21.402-8.499 40.141-23.142 14.95-11.674 22.221-16.179 32.051-19.661 10.035-3.584 12.39-4.096 25.293-4.915 23.245-1.536 41.984 4.198 60.826 18.739 26.829 20.685 34.099 25.088 48.333 29.184 11.674 3.277 36.147 3.379 47.821 0 13.722-3.891 21.811-8.602 41.165-23.654 25.6-20.070 36.762-24.269 63.488-24.064 13.619 0.102 16.384 0.41 24.576 2.867 11.571 3.482 20.89 8.806 35.021 19.763 28.365 22.221 39.219 26.829 64.307 27.443 15.36 0.41 23.962-0.512 36.864-4.198 34.816-9.728 57.549-33.997 66.253-70.554 2.15-8.909 2.253-11.878 2.56-82.125l0.41-73.011h-716.902v68.403c0 72.602 0.41 80.589 5.12 95.232 10.035 31.13 31.437 52.326 62.362 61.645 18.022 5.53 45.056 6.451 60.314 2.048z" />
+<glyph unicode="&#xe952;" glyph-name="bluetooth" d="M502.579 882.79c-9.318-2.662-17.613-8.909-22.938-17.306-5.734-8.909-5.53-2.355-5.53-170.189v-154.624l-68.813 68.813c-74.752 74.547-73.421 73.318-86.323 74.957-12.288 1.434-23.654-2.458-32.154-10.957-11.571-11.674-14.336-28.877-7.168-44.032 1.741-3.686 22.426-25.088 90.624-93.389l88.474-88.576-88.986-89.088c-85.094-85.299-88.986-89.395-91.238-95.232-9.421-25.088 6.963-51.098 33.485-53.146 6.656-0.512 16.179 2.048 22.016 5.837 3.072 2.048 34.509 32.666 72.499 70.758l67.072 67.174 0.512-156.877 0.512-156.979 3.277-6.861c3.891-8.397 9.933-14.336 18.739-18.637 6.042-2.867 7.578-3.174 15.872-3.072 8.294 0 9.933 0.41 16.384 3.379 6.861 3.277 11.981 8.294 111.206 107.52 80.486 80.486 104.55 105.062 106.291 108.749 5.222 11.264 5.222 23.347 0.102 34.406-1.843 3.891-21.606 24.269-90.726 93.491l-88.474 88.576 87.962 87.962c100.762 100.762 94.72 93.696 94.72 111.206 0 17.408 8.294 7.782-109.875 126.054-96.358 96.461-104.55 104.346-110.797 107.418-8.090 3.891-18.842 4.915-26.726 2.662zM604.365 593.203l-53.453-53.555v214.016l53.453-53.555 53.555-53.453-53.555-53.453zM604.365 194.867l-53.453-53.555v214.016l53.453-53.555 53.555-53.453-53.555-53.453z" />
+<glyph unicode="&#xe953;" glyph-name="Book_award" d="M240.23 881.459c-30.925-6.554-54.886-31.744-59.904-62.771-0.819-4.608-1.126-121.651-1.126-371.712 0-391.373-0.205-369.562 5.018-384.41 2.765-7.885 9.933-19.251 16.282-25.805 9.728-10.035 20.378-16.589 35.021-21.299l6.656-2.15 602.624-0.512v793.6h-289.485c-285.389 0-289.587 0-292.864 2.048-8.499 5.12-8.397 16.896 0.205 21.811 1.536 0.922 66.765 1.331 257.536 1.741l255.488 0.512 4.915 2.97c19.046 11.366 16.384 38.81-4.506 46.182-6.451 2.355-525.21 2.15-535.859-0.205zM534.528 634.88l16.179-16.179 6.554 1.638c3.482 0.922 13.517 3.584 22.016 5.837 24.883 6.451 25.19 6.246 33.075-23.654 2.97-11.469 5.939-21.402 6.554-22.118 0.614-0.614 10.138-3.584 21.094-6.451 10.957-2.97 21.402-6.144 23.142-7.27 3.584-2.15 5.53-5.734 5.53-10.138 0-2.355-5.427-24.166-10.24-40.96l-1.024-3.584 16.486-16.486c14.746-14.746 16.486-16.896 16.998-20.582 0.307-2.56 0-5.12-0.922-6.861-0.819-1.536-8.499-9.83-16.998-18.432l-15.565-15.565 5.632-20.787c3.072-11.469 5.632-22.221 5.632-23.859 0-4.096-3.277-9.318-6.861-10.957-2.458-1.126-24.678-7.27-38.4-10.547l-4.71-1.126-2.15-7.782c-1.229-4.301-3.789-14.029-5.837-21.606-3.789-14.131-4.813-16.486-8.499-19.149-4.096-2.765-7.578-2.458-29.491 3.379l-21.914 5.837-15.77-15.77c-17.101-16.998-20.582-19.354-26.624-17.306-2.048 0.717-9.318 7.066-19.251 16.998l-15.974 15.974-7.987-2.048c-4.403-1.126-14.541-3.789-22.528-5.837-8.704-2.355-15.565-3.584-17.101-3.174-1.331 0.307-3.789 1.946-5.427 3.584-2.458 2.355-3.789 6.144-8.294 22.733-2.97 10.957-5.325 20.378-5.325 20.992 0 2.253-2.765 3.379-20.48 7.987-9.83 2.662-19.866 5.427-22.221 6.349-5.12 1.843-8.499 6.656-8.499 11.776 0 1.946 2.56 12.698 5.632 23.859l5.632 20.48-16.077 16.077c-8.806 8.806-16.384 16.896-16.794 17.92-1.229 3.072-0.922 7.885 0.512 10.445 0.717 1.331 8.294 9.421 16.794 17.92l15.462 15.565-5.12 18.944c-2.765 10.445-5.427 20.89-5.734 23.245-0.717 5.53 1.126 9.933 5.222 12.493 1.741 1.024 12.493 4.403 23.859 7.373l20.685 5.427 3.072 11.366c1.638 6.144 4.301 15.872 5.734 21.402 2.765 10.547 3.994 13.107 7.475 15.565 4.096 2.867 7.885 2.458 26.829-2.662 10.445-2.765 20.275-5.325 22.016-5.632 2.867-0.512 4.096 0.512 18.432 14.95 8.499 8.499 16.691 16.077 18.227 16.794 1.946 0.819 4.403 0.922 7.066 0.512 3.584-0.717 6.349-2.97 20.275-16.896zM395.264 310.272c5.427-9.523 13.824-15.77 24.678-18.534 7.373-1.946 13.312-1.434 26.829 2.15 5.018 1.331 8.909 2.048 8.704 1.638-0.307-0.819-9.216-13.824-20.275-29.798-3.072-4.403-7.578-10.957-10.035-14.541s-10.957-15.872-18.944-27.443c-7.987-11.571-16.179-23.45-18.125-26.317s-3.891-5.018-4.198-4.608c-0.307 0.41-3.277 11.674-6.554 25.088l-6.042 24.371-3.686-0.614c-1.946-0.307-5.837-1.229-8.704-2.048-7.475-2.15-37.888-9.523-38.093-9.318-0.307 0.205 14.234 21.709 28.467 42.291 3.584 5.222 13.926 20.275 22.938 33.485l16.384 24.064 2.15-7.885c1.229-4.301 3.277-9.728 4.506-11.981zM644.198 317.235c4.096-6.144 19.149-28.058 33.382-48.845s25.805-37.888 25.702-38.093c-0.205-0.102-11.059 2.458-24.269 5.837-13.21 3.277-24.474 6.042-25.088 6.042-0.717 0-3.789-10.138-7.27-24.269-3.277-13.414-6.246-24.678-6.656-25.088-0.307-0.512-2.56 2.048-4.813 5.632-2.355 3.482-6.042 8.909-8.192 11.981-2.253 3.072-7.475 10.752-11.674 16.896-4.301 6.246-16.589 24.064-27.341 39.731-10.854 15.667-19.661 28.672-19.661 28.877 0 0.41 3.072-0.307 11.366-2.662 10.445-2.97 17.101-3.379 24.576-1.536 15.258 3.891 25.088 14.848 29.594 33.178 0.614 2.355 1.536 4.096 1.946 3.789 0.512-0.307 4.301-5.427 8.397-11.469zM495.514 561.050c-42.291-7.987-73.011-45.056-72.806-87.962 0.102-41.062 27.034-75.981 66.97-86.733 12.186-3.277 32.666-3.277 44.646 0 28.774 7.782 51.405 28.365 61.645 55.706 8.192 22.118 6.861 49.766-3.174 69.734-18.739 36.966-57.754 56.73-97.28 49.254zM523.878 535.962c12.39-2.867 19.763-6.451 28.672-13.619 11.264-9.114 19.251-22.426 22.528-37.581 1.024-4.813 0.717-20.173-0.614-25.6-1.638-7.475-8.192-20.89-13.005-26.624-23.654-28.57-67.891-31.13-93.901-5.325-16.077 15.974-22.426 36.659-17.92 58.88 4.71 23.757 22.835 42.701 46.694 48.947 8.294 2.15 20.787 2.56 27.546 0.922z" />
+<glyph unicode="&#xe954;" glyph-name="book_download" d="M76.8 519.475c0-215.040 0.307-262.349 1.434-266.547 4.608-17.51 18.842-31.027 35.942-34.202 4.198-0.819 41.267-1.229 114.688-1.434 59.699-0.205 109.978-0.614 111.616-1.024 1.741-0.307 7.27-1.126 12.288-1.741 27.034-3.482 53.248-11.162 75.776-22.016 16.896-8.192 29.901-16.179 64.205-39.731 10.957-7.475 14.438-8.806 21.299-8.192 4.506 0.41 13.722 4.813 17.92 8.499 2.867 2.56 33.997 23.142 44.749 29.594 16.794 10.035 33.075 17.101 54.579 23.654 8.499 2.56 34.099 7.68 43.52 8.704 3.686 0.41 7.578 1.024 8.704 1.331s52.736 0.819 114.688 1.126c76.186 0.512 113.664 1.024 115.712 1.741 16.998 6.144 29.184 19.661 32.154 35.738 0.819 4.198 1.126 82.944 1.126 265.933v259.994l-130.765-0.41c-71.987-0.205-132.506-0.614-134.451-0.922s-7.066-0.922-11.264-1.229c-48.538-4.403-104.346-22.118-148.275-47.002-9.728-5.427-10.854-5.837-12.8-4.506-9.216 5.939-34.611 18.637-49.459 24.678-18.739 7.578-35.942 13.107-55.706 17.92-16.896 3.994-33.587 6.963-51.2 8.909-3.072 0.307-7.27 0.819-9.216 1.229-1.946 0.307-62.874 0.717-135.373 0.922l-131.891 0.41v-261.427zM369.459 676.045c20.378-11.162 18.534-39.731-2.97-47.309-3.584-1.331-19.968-1.536-110.49-1.536-116.326 0-110.694-0.307-118.682 6.042-8.909 7.066-11.776 22.221-5.939 32.051 3.174 5.427 8.090 9.626 13.722 11.674 3.174 1.126 23.552 1.331 112.435 1.126 102.4-0.205 108.749-0.307 111.923-2.048zM776.499 676.762c2.867-1.024 6.656-3.482 9.318-6.144 7.987-7.987 7.782-5.53 7.782-79.974v-65.843h37.888c20.89 0 37.888-0.205 37.888-0.512 0-1.126-128.614-128.819-131.994-131.072-7.782-5.12-19.354-7.27-28.774-5.12-10.957 2.458-10.854 2.355-79.155 70.554-35.84 35.84-65.229 65.434-65.229 65.638 0 0.307 16.998 0.512 37.888 0.512h37.786l0.307 67.891 0.307 67.789 2.765 4.71c3.277 5.53 8.602 9.933 14.541 11.776 3.174 1.024 17.203 1.331 59.085 1.331 47.718 0.102 55.501-0.102 59.597-1.536zM366.899 574.362c9.523-3.277 17.101-13.824 17.101-23.962 0-8.806-6.042-18.637-14.336-23.142-3.482-1.843-7.68-1.946-111.514-2.253-121.446-0.307-113.971-0.717-122.266 7.373-10.445 10.035-10.342 26.010 0 36.147 7.987 7.68 1.434 7.373 120.218 7.373 94.515 0.102 106.598-0.102 110.797-1.536zM263.373 472.576c2.15-0.614 5.734-2.56 8.192-4.403 12.493-9.626 12.902-30.106 0.614-39.731-7.578-6.042-6.656-5.939-66.97-6.042-62.464 0-61.44-0.102-69.427 7.578-13.414 13.107-8.397 35.84 9.318 42.189 4.915 1.741 112.128 2.048 118.272 0.41zM344.064 318.771c1.434-0.41 5.53-0.922 9.216-1.229 7.475-0.717 8.499-0.922 23.040-3.277 29.901-4.813 59.802-13.414 89.088-25.702 8.704-3.686 30.72-14.746 39.322-19.661l7.168-4.198 10.547 5.939c37.069 20.89 78.95 35.738 122.163 43.213 31.642 5.427 31.642 5.427 145.203 5.837l106.189 0.41v-14.234c0-17.715-1.331-22.835-7.578-29.286-7.885-7.987-2.867-7.68-110.182-8.090-52.122-0.307-96.768-0.717-99.328-1.126s-8.499-1.126-13.312-1.741c-13.619-1.638-37.171-6.656-50.483-10.65-26.317-7.987-44.954-16.486-74.547-34.099-20.275-12.083-19.866-11.878-28.57-11.776-8.704 0-8.397-0.205-28.672 11.878-49.562 29.389-87.552 41.677-144.384 46.694-5.325 0.512-50.074 0.922-99.328 1.024-54.272 0.102-91.034 0.512-93.286 1.126-5.632 1.536-12.39 7.27-15.258 12.902-2.355 4.608-2.56 6.349-2.867 21.197l-0.307 16.179 106.803-0.41c58.778-0.205 107.93-0.614 109.363-0.922z" />
+<glyph unicode="&#xe955;" glyph-name="bookmark" d="M218.112 815.206c-18.33-5.325-32.563-19.149-37.069-36.352-0.922-3.686-1.741-10.547-1.741-15.155l-0.102-8.499h-102.4v-309.965c0-338.33-0.307-317.235 5.837-329.83 3.277-6.758 10.957-14.95 17.818-18.944 2.56-1.536 8.294-3.686 12.698-4.813 7.987-2.048 11.264-2.048 397.312-2.048 275.149 0 391.066 0.307 395.366 1.126 18.534 3.379 33.997 17.92 39.219 36.762l2.15 7.68v620.032l-185.549-0.307c-102.093-0.102-186.573-0.512-187.699-0.922-1.126-0.307-4.096-1.126-6.656-1.843-24.986-6.656-47.206-29.901-52.838-55.296-0.922-4.198-2.048-8.602-2.458-9.728-0.717-1.741-0.922-1.638-1.024 1.024 0 1.741-0.717 5.632-1.434 8.704-7.475 30.618-33.894 54.067-65.126 57.754-2.56 0.307-14.848 0.512-27.341 0.512l-22.835 0.102v7.987c0 24.269-13.824 43.725-36.352 50.995-7.168 2.355-7.475 2.355-71.168 2.355-48.947-0.102-65.126-0.41-68.608-1.331zM354.816 787.866c5.734-2.867 11.162-9.318 12.8-15.053 0.922-3.686 1.024-37.683 1.024-427.008 0-66.458-0.41-116.941-0.922-116.736s-18.944 16.077-41.062 35.43l-40.141 35.226-3.277-3.072c-9.523-8.909-77.619-67.891-78.029-67.584-0.922 1.024-0.41 540.058 0.614 543.437 2.253 7.782 8.499 14.234 16.896 17.306 2.15 0.717 22.426 1.024 65.024 0.922l62.054-0.205 5.018-2.662z" />
+<glyph unicode="&#xe956;" glyph-name="bookmark_smart" d="M218.112 815.206c-18.33-5.325-32.563-19.149-37.069-36.352-0.922-3.686-1.741-10.547-1.741-15.155l-0.102-8.499h-102.4v-309.965c0-338.33-0.307-317.235 5.837-329.83 3.277-6.758 10.957-14.95 17.818-18.944 2.56-1.536 8.294-3.686 12.698-4.813 7.987-2.048 11.264-2.048 397.312-2.048 275.149 0 391.066 0.307 395.366 1.126 18.534 3.379 33.997 17.92 39.219 36.762l2.15 7.68v620.032l-185.549-0.307c-102.093-0.102-186.573-0.512-187.699-0.922-1.126-0.307-4.096-1.126-6.656-1.843-24.986-6.656-47.206-29.901-52.838-55.296-0.922-4.198-2.048-8.602-2.458-9.728-0.717-1.741-0.922-1.638-1.024 1.024 0 1.741-0.717 5.632-1.434 8.704-7.475 30.618-33.894 54.067-65.126 57.754-2.56 0.307-14.848 0.512-27.341 0.512l-22.835 0.102v7.987c0 24.269-13.824 43.725-36.352 50.995-7.168 2.355-7.475 2.355-71.168 2.355-48.947-0.102-65.126-0.41-68.608-1.331zM354.816 787.866c5.734-2.867 11.162-9.318 12.8-15.053 0.922-3.686 1.024-37.683 1.024-427.008 0-66.458-0.41-116.941-0.922-116.736s-18.944 16.077-41.062 35.43l-40.141 35.226-3.277-3.072c-9.523-8.909-77.619-67.891-78.029-67.584-0.922 1.024-0.41 540.058 0.614 543.437 2.253 7.782 8.499 14.234 16.896 17.306 2.15 0.717 22.426 1.024 65.024 0.922l62.054-0.205 5.018-2.662zM854.016 550.81c9.011-4.915 16.282-15.155 16.384-23.040 0-6.144-2.867-13.414-7.987-19.968-2.662-3.379-16.794-21.402-31.539-39.936-14.643-18.534-41.984-53.043-60.723-76.698s-35.328-44.646-36.966-46.592c-1.536-1.946-9.421-11.878-17.408-22.016-16.998-21.504-20.070-24.576-27.546-26.726-11.469-3.482-20.070 0.205-33.587 14.336-13.107 13.619-45.363 50.79-77.21 88.678-12.8 15.258-13.722 16.998-13.722 26.624 0 6.656 0.41 8.397 2.97 13.107 3.686 6.656 13.926 16.384 20.275 19.456 2.56 1.126 7.066 2.355 9.933 2.765 9.421 1.024 11.469-0.41 42.906-32.154 31.027-31.334 31.334-31.437 37.478-26.624 1.434 1.126 35.533 34.918 75.776 75.162 65.741 65.638 73.626 73.216 78.541 75.162 7.373 2.867 15.258 2.355 22.426-1.536z" />
+<glyph unicode="&#xe957;" glyph-name="Boxes" d="M145.818 830.566c-5.939-1.843-11.264-6.246-14.541-11.776l-2.765-4.71-0.307-67.789-0.307-67.891h768.102v66.355c-0.102 51.2-0.41 67.072-1.434 69.939-1.946 5.53-6.554 10.957-11.776 14.029l-4.71 2.765-364.032 0.205c-295.629 0.102-364.851-0.102-368.23-1.126zM153.6 358.4v-294.4h716.8v588.8h-716.8v-294.4zM599.142 523.674c19.866-4.096 36.762-21.504 39.936-41.165 4.403-26.624-11.776-51.61-38.093-58.573-4.608-1.229-19.866-1.536-88.166-1.536-56.422 0-84.378 0.41-88.064 1.126-18.534 3.891-34.304 19.046-39.117 37.581-6.963 26.522 9.83 54.784 36.966 62.157 6.554 1.741 168.141 2.15 176.538 0.41z" />
+<glyph unicode="&#xe958;" glyph-name="broadcast" d="M402.637 768.307c-17.203-35.635-29.901-78.746-33.382-113.459-0.307-3.072-0.922-8.602-1.331-12.288-1.536-13.824-0.819-62.669 1.229-73.626 0.102-0.922 0.614-4.403 0.922-7.782 1.229-10.138 6.554-35.123 10.445-48.742 5.939-21.094 13.722-41.062 23.859-61.030l5.222-10.547v-69.632l-89.498-89.6-89.6-89.498-85.606-0.614-4.71-2.765c-2.56-1.536-5.939-4.403-7.475-6.349-5.325-7.066-5.734-9.83-5.734-39.629v-27.546h563.2v27.546c0 29.696-0.41 32.768-5.734 39.731-1.331 1.843-4.71 4.608-7.373 6.144l-4.813 2.867-110.694 1.024-88.474 88.474 13.414 13.414h70.451l12.186-6.042c25.395-12.493 54.579-22.426 86.733-29.286 5.632-1.229 30.106-4.608 38.093-5.325 15.974-1.434 60.006-0.717 74.035 1.126 43.008 5.734 79.258 16.384 114.483 33.587l12.595 6.144-242.995 243.098c-133.632 133.632-243.098 243.098-243.2 243.098s-2.867-5.632-6.246-12.493zM480.768 223.744l31.744-31.744h-27.136l-25.088 25.088c-13.824 13.824-25.088 25.395-25.088 25.702 0 0.819 12.288 12.698 13.21 12.698 0.307 0 14.95-14.234 32.358-31.744zM423.014 192.205c-6.758-0.102-18.125-0.102-25.395 0l-13.107 0.307 25.293 25.293 12.698-12.595 12.698-12.698-12.186-0.307zM708.096 650.752c-26.726-6.963-85.709-21.914-89.395-22.733l-4.301-1.024 63.59-63.488c34.918-34.918 63.898-63.078 64.307-62.669 0.717 0.819 10.24 37.99 17.51 67.994 3.072 12.8 7.168 29.082 7.782 30.925 0.41 1.229-6.758 9.011-25.088 27.341-14.131 14.131-26.010 25.702-26.419 25.6-0.512-0.102-3.994-0.922-7.987-1.946z" />
+<glyph unicode="&#xe959;" glyph-name="burst_mode" d="M90.419 868.454c-17.92-4.403-32.87-19.149-37.683-37.581-1.331-4.71-1.536-42.394-1.536-254.874 0-220.877 0.205-250.061 1.536-255.488 5.018-19.354 20.173-34.202 39.219-38.298 7.68-1.638 576.307-1.638 584.090 0 19.354 4.096 36.147 21.094 39.629 40.243 0.819 4.301 1.126 80.896 1.126 254.054 0 239.923-0.102 248.218-1.946 255.283-4.71 18.125-18.739 31.744-37.478 36.557-5.325 1.331-38.605 1.536-293.888 1.434-226.406-0.102-288.87-0.307-293.069-1.331zM640 575.488v-217.6h-512v435.2h512v-217.6zM768 508.928c0-165.99-0.307-234.394-1.126-238.285-3.891-18.534-19.046-34.304-37.888-39.219-4.71-1.331-45.056-1.536-277.606-1.536h-272.179v-16.179c0-12.902 0.41-17.51 2.048-23.040 4.813-17.101 16.998-29.594 34.099-35.123l7.373-2.355 288.461-0.102c315.494 0 293.069-0.41 305.971 5.837 7.27 3.482 18.33 14.541 21.811 21.811 6.246 12.8 5.837-5.734 5.837 267.059 0 271.77 0.41 253.747-5.734 266.342-3.891 7.987-14.541 18.432-22.938 22.426-8.909 4.198-16.077 5.325-33.485 5.325h-14.643v-232.96zM896 380.928c0-165.99-0.307-234.394-1.126-238.285-4.198-19.866-21.709-36.864-41.472-40.141-1.638-0.205-125.235-0.512-274.637-0.512l-271.667-0.102 0.102-16.384c0.102-10.035 0.717-18.432 1.536-21.606 4.915-18.534 20.89-33.894 39.219-37.683 7.578-1.536 574.771-1.638 583.475 0 18.739 3.379 34.714 18.637 39.936 37.888 1.229 4.71 1.331 41.574 1.126 257.946l-0.205 252.416-2.355 5.427c-5.12 11.981-12.186 20.48-22.118 26.522-9.421 5.734-17.715 7.475-36.147 7.475h-15.667v-232.96z" />
+<glyph unicode="&#xe95a;" glyph-name="Business_everywhere" d="M482.816 881.664c-68.403-7.578-126.669-36.352-174.899-86.221-38.605-40.038-64.922-93.184-74.035-149.504-3.174-19.661-4.198-51.098-2.253-70.963 3.789-39.322 15.258-75.674 35.942-113.459 3.584-6.554 8.294-15.155 10.445-19.149 2.15-3.891 4.608-8.499 5.632-10.24 1.024-1.638 3.686-6.554 5.939-10.752s13.824-25.6 25.805-47.616c11.981-21.914 23.45-42.906 25.395-46.592s7.373-13.517 11.981-22.016c4.608-8.397 10.138-18.534 12.288-22.528 4.198-7.782 8.499-15.77 12.595-23.040 1.331-2.56 8.499-15.667 15.77-29.184 7.373-13.517 15.77-28.979 18.739-34.304 5.939-10.65 8.192-14.848 18.432-33.792 6.451-11.981 8.909-16.384 15.872-29.184 5.12-9.318 59.085-108.442 62.054-113.869 1.536-2.97 3.174-5.427 3.584-5.427s2.56 3.584 4.915 7.987c2.253 4.301 5.939 11.162 8.090 15.053 2.15 3.994 5.837 10.65 8.090 14.848 2.355 4.198 6.554 12.083 9.523 17.408s7.68 14.131 10.445 19.456c2.867 5.325 6.554 11.878 8.090 14.643 1.638 2.662 2.97 5.018 2.97 5.222s3.482 6.758 7.782 14.541c4.301 7.782 9.626 17.715 11.981 21.914 2.253 4.198 12.186 22.426 22.016 40.448s19.456 35.738 21.402 39.424c2.048 3.686 6.451 11.776 9.83 17.92 8.090 14.746 9.83 18.125 21.709 39.936 10.445 19.149 11.469 21.094 22.016 40.448 3.584 6.451 7.782 14.234 9.318 17.203 1.638 2.867 4.301 7.782 5.939 10.752 1.536 2.867 9.933 18.227 18.534 33.997s17.101 31.437 18.944 34.816c1.843 3.379 5.12 9.421 7.168 13.312 2.15 3.994 7.373 13.414 11.571 20.992 9.83 17.818 14.746 27.648 20.173 40.96 20.992 51.302 26.317 107.418 15.36 162.099-12.493 62.566-47.309 120.934-96.154 160.973-2.765 2.253-6.451 5.325-8.192 6.758-8.602 7.27-31.539 21.402-47.206 29.082-29.901 14.746-57.549 22.835-93.696 27.648-10.138 1.331-47.821 1.331-59.904 0zM537.6 804.864c24.166-4.198 31.539-6.042 45.978-11.469 41.882-15.565 80.794-47.718 103.424-85.504l2.355-3.891h-202.957l-0.205 25.395-0.307 25.498-15.053-10.342c-8.294-5.734-30.515-20.787-49.254-33.69-21.299-14.541-34.714-24.371-35.84-26.214-4.301-7.27-1.229-13.312 10.547-21.402 7.987-5.427 52.122-35.635 79.155-54.17l10.957-7.578v51.302h112.128c61.645 0 112.128-0.205 112.128-0.307 0-0.205 0.922-4.71 1.946-10.035 3.072-14.848 3.686-22.323 3.584-43.418-0.205-32.358-5.734-56.73-19.763-86.016-10.65-22.221-23.859-40.653-41.779-57.856-12.8-12.39-15.77-14.848-29.491-24.064-25.805-17.306-59.802-29.798-89.702-32.973-9.318-1.024-38.195-1.024-46.49-0.102-55.398 6.554-107.52 36.147-139.878 79.667-6.451 8.602-11.264 15.77-13.107 19.251l-1.229 2.253h202.854l0.205-25.498 0.307-25.395 46.080 31.539c25.395 17.306 47.616 32.563 49.459 33.894 9.216 6.451 8.294 16.589-2.15 23.654-2.97 1.946-13.619 9.318-23.757 16.282-10.24 6.861-28.365 19.251-40.346 27.443s-23.45 16.179-25.498 17.715l-3.789 2.97-0.307-25.702-0.205-25.702h-224.051l-1.741 7.885c-6.451 29.082-5.427 66.867 2.56 97.075 21.094 78.848 90.214 139.059 171.622 149.402 11.059 1.331 44.032 1.434 51.61 0.102z" />
+<glyph unicode="&#xe95b;" glyph-name="business_invoices" d="M166.912 780.8v-76.8h51.2v102.4h234.803c134.246 0 236.237-0.41 238.285-0.922 8.397-2.15 9.216-2.253 9.216-0.717 0 2.458-5.018 12.902-9.114 18.944-10.24 14.95-22.221 23.757-42.496 31.13l-6.246 2.253-475.648 0.512v-76.8zM243.712 704.512v-76.288h51.2v101.376h234.291c202.957 0 235.11-0.205 241.357-1.536 3.891-0.819 7.27-1.536 7.373-1.536 0.205 0-2.355 6.451-4.506 11.264-9.318 20.378-31.846 37.376-55.808 41.882-3.584 0.717-86.323 1.024-239.616 1.126h-234.291v-76.288zM320.512 624.64v-79.36h31.334l5.222 5.018c6.042 5.837 9.83 7.987 17.203 9.933 28.57 7.68 54.374-18.842 46.592-47.718-1.638-6.042-7.373-14.541-13.107-19.149-15.258-12.39-38.81-10.547-52.019 4.096-2.458 2.765-4.506 5.427-4.506 5.939s-6.861 0.922-15.36 0.922h-15.36v-251.904h31.744l4.096 4.506c2.253 2.458 7.168 5.939 11.059 7.885 6.349 3.174 7.68 3.379 16.589 3.379 8.499 0.102 10.445-0.307 15.462-2.765 7.987-3.891 14.336-9.728 18.125-16.794 3.174-6.042 5.427-15.974 4.71-20.787-1.229-7.987-1.843-10.035-3.994-14.234-8.602-17.101-27.341-25.19-45.363-19.661-7.987 2.355-16.179 8.192-19.968 13.926l-2.253 3.584h-30.31l0.41-54.989c0.307-49.050 0.512-55.808 2.15-61.235 6.758-22.733 23.552-42.086 44.032-50.483 15.462-6.246-6.246-5.734 253.85-6.042l237.261-0.307-0.205 301.261-0.307 301.363-2.253 6.656c-3.174 9.933-5.222 14.131-10.035 21.606-9.626 14.848-23.654 25.293-43.008 32.051l-6.144 2.15-475.648 0.512v-79.36zM762.266 544.051c2.253-0.717 5.837-2.97 7.885-5.12 9.728-10.035 6.758-26.624-5.734-32.461l-4.71-2.15-266.65 0.512-3.686 2.253c-9.114 5.734-12.493 17.408-7.68 26.931 2.253 4.506 8.294 9.728 12.39 10.547 1.126 0.205 60.928 0.512 133.018 0.614 100.659 0.102 131.891-0.205 135.168-1.126zM765.44 440.218c15.872-8.294 13.21-32.256-4.096-37.274-2.97-0.819-39.219-1.024-136.192-0.819l-132.096 0.307-3.686 2.253c-7.782 4.915-11.571 14.643-9.216 23.45 1.434 5.222 7.987 12.288 12.595 13.619 2.048 0.614 54.374 0.922 135.987 0.819 132.301-0.205 132.608-0.205 136.704-2.355zM639.078 336.794c13.926-10.138 10.957-30.72-5.12-36.147-2.458-0.819-23.245-1.126-71.168-1.126l-67.686 0.102-4.506 2.253c-2.355 1.229-5.837 4.301-7.68 6.758-2.765 3.891-3.174 5.222-3.174 11.366s0.41 7.578 3.072 11.366c1.741 2.458 5.12 5.427 7.68 6.758l4.608 2.355 139.571-0.512 4.403-3.174zM772.506 260.198c13.414-4.506 22.323-11.981 29.389-24.576 2.867-5.325 3.994-8.499 3.994-11.674 0-8.397-5.632-13.824-14.029-13.722-6.042 0.205-9.626 2.867-13.107 10.035-5.222 10.752-11.366 15.667-21.606 17.51-14.541 2.662-29.184-2.048-37.069-11.878-3.584-4.506-7.782-12.39-8.704-16.589l-0.614-2.56h30.31c25.907 0.102 30.925-0.102 34.099-1.536 7.885-3.584 8.602-17.203 1.229-22.016-2.355-1.536-6.349-1.741-36.045-1.843l-33.28-0.102-0.307-6.349-0.307-6.451h27.955c20.275 0 28.672-0.41 30.515-1.331 7.475-3.686 7.68-17.715 0.307-21.094-1.536-0.717-12.288-1.126-29.082-1.126h-26.624l0.614-2.253c2.97-10.24 10.65-19.661 19.251-23.654 6.451-3.072 10.547-3.789 19.968-3.891 15.155-0.205 23.245 4.506 29.286 16.896 3.379 6.758 7.373 9.83 13.312 9.83 7.475 0 14.95-6.554 14.95-13.107 0-5.12-7.27-17.51-14.438-24.576-5.837-5.734-16.896-11.162-26.522-13.005-12.083-2.253-30.31-1.434-40.448 1.843-20.48 6.758-34.304 22.221-40.96 46.080l-1.638 5.837h-6.349c-3.482 0-7.475 0.614-8.909 1.331-3.686 1.843-6.349 7.578-5.632 11.878 1.331 7.066 5.837 10.342 14.438 10.342 4.71 0 4.71 0 4.71 5.632 0 7.68 0.307 7.373-5.734 7.475-9.216 0-14.234 5.325-13.312 13.926 0.922 7.885 5.12 10.957 15.155 11.162 6.451 0.102 6.861 0.205 7.373 2.662 1.434 6.758 6.042 18.432 9.933 24.883 7.987 13.312 19.149 22.221 33.178 26.317 9.83 2.867 10.65 2.97 24.371 2.662 9.933-0.307 13.824-0.819 20.378-2.97zM166.912 537.088v-125.952h51.2v251.904h-51.2v-125.952zM243.712 461.312v-125.952h51.2v251.904h-51.2v-125.952zM167.219 312.627c0.41-62.771 0.307-61.645 6.554-75.366 7.987-17.613 24.371-33.075 42.086-40.038 5.018-2.048 5.427-2.048 4.915-0.41-0.307 1.024-0.819 3.482-1.126 5.427s-0.819 4.506-1.024 5.632c-0.205 1.126-0.41 38.093-0.41 82.227l-0.102 80.077h-51.302l0.41-57.549zM243.917 236.339c0.41-55.706 0.512-58.47 2.56-64.922 6.246-19.661 17.306-34.304 33.485-44.442 7.475-4.608 18.022-9.216 18.022-7.885 0 0.41-0.41 2.355-0.922 4.301-1.843 7.066-2.048 13.926-2.048 91.955l-0.102 79.053h-51.302l0.307-58.061z" />
+<glyph unicode="&#xe95c;" glyph-name="business_lounge" d="M489.472 856.064c-58.573-8.397-106.189-42.189-132.813-94.208-8.090-15.77-13.722-33.69-17.203-54.784-1.126-6.451-1.434-35.123-0.512-43.008 4.608-37.99 21.606-74.138 47.514-100.864 27.238-27.955 57.856-44.237 96.358-51.405 18.534-3.379 48.333-2.458 68.813 2.253 57.037 13.005 105.267 56.422 124.723 112.128 6.349 18.33 8.909 33.69 9.216 54.272 0.307 19.558-0.922 31.027-5.12 46.899-7.987 30.003-23.45 56.934-45.67 79.155-27.75 27.75-64.614 45.67-103.322 49.971-11.059 1.229-31.846 1.024-41.984-0.41zM356.454 521.728c-46.182-28.058-78.541-70.144-92.774-120.73-7.68-27.341-7.68-27.341-7.373-164.454l0.205-120.832 2.867-9.114c6.963-22.426 20.070-40.55 37.581-52.019 10.752-7.168 18.534-10.445 34.714-14.848 1.434-0.41 100.25-0.922 219.546-1.024l216.883-0.307-0.307 165.069-0.307 165.171-2.867 14.029c-9.626 48.64-33.587 89.19-70.861 120.422-8.602 7.27-24.576 18.33-31.846 22.016-3.072 1.536-3.379 1.536-5.12-0.41-3.379-3.686-19.046-15.77-28.058-21.709-27.238-17.613-56.73-28.365-90.624-32.87-14.336-1.946-45.158-1.434-59.187 0.922-34.918 5.734-67.072 19.251-94.822 39.731-7.885 5.837-10.035 7.578-16.077 13.21l-3.072 2.867-8.499-5.12zM512.512 432.538c9.318 0 17.306 0.205 17.818 0.512 1.843 1.229 2.867-2.355 4.506-16.794 1.024-8.192 1.946-15.974 2.253-17.408 0.205-1.434 1.331-10.138 2.56-19.456 1.126-9.318 2.253-18.227 2.56-19.968 0.922-6.963 3.482-26.931 3.994-31.232 0.819-6.451 2.458-19.251 3.072-23.552 0.307-1.946 0.819-5.837 1.126-8.704 0.41-2.765 0.819-6.451 1.024-8.192 1.536-10.752 4.608-34.611 5.12-38.912 0.307-2.765 1.536-11.981 2.662-20.48 1.126-8.397 2.253-17.203 2.56-19.456 0.205-2.253 0.717-5.837 1.024-7.885 0.512-3.379 0-4.506-5.427-11.366-3.277-4.198-10.342-13.312-15.667-20.275s-14.131-18.534-19.763-25.805l-10.035-13.005-7.68 9.933c-9.011 11.878-23.245 30.515-34.918 45.773-7.373 9.523-8.397 11.366-7.987 14.234 0.205 1.843 0.922 7.168 1.536 11.981s1.536 11.674 2.048 15.36c0.512 3.686 1.229 8.704 1.536 11.264s1.229 9.421 2.048 15.36c1.946 14.234 3.379 25.088 4.096 30.72 0.307 2.56 0.717 5.53 0.922 6.656s0.717 4.608 1.024 7.68c0.41 3.072 1.126 8.602 1.638 12.288 1.331 9.523 1.741 11.878 4.096 30.208 1.126 9.011 2.355 17.818 2.56 19.456 0.307 1.741 0.717 4.71 1.024 6.656 0.717 6.144 3.584 27.546 5.632 42.496 1.024 7.885 2.048 15.77 2.253 17.408 0.307 3.584 1.638 5.837 3.072 5.018 0.512-0.307 8.499-0.614 17.715-0.512z" />
+<glyph unicode="&#xe95d;" glyph-name="business_telephonie" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-112.128-8.499-219.443-62.874-293.99-149.197-57.856-67.072-94.618-151.45-103.322-237.466-0.41-3.686-0.922-8.294-1.126-10.24-0.307-1.946-0.717-15.565-0.922-30.208-0.512-27.648 1.024-52.941 4.198-71.168 6.349-36.454 11.264-56.115 20.582-81.92 33.587-93.286 98.099-172.749 182.067-224.358 57.856-35.635 125.952-57.856 193.024-63.078 13.619-1.024 58.163-1.024 69.632 0 38.093 3.482 71.578 10.445 103.936 21.402 134.349 45.363 239.104 154.112 278.426 288.973 7.578 25.805 13.312 54.374 15.462 76.39 0.307 3.686 1.024 10.854 1.434 15.872 0.512 5.12 0.922 91.034 0.922 190.976 0.102 195.072 0.307 188.416-5.018 204.8-9.83 30.515-34.406 55.194-65.434 65.434-16.179 5.325-8.192 5.12-205.926 5.12-101.171 0-184.115-0.102-184.32-0.307zM611.123 794.214c2.15-1.126 6.451-4.608 9.626-7.987 8.704-8.909 26.829-31.334 33.587-41.574 10.957-16.486 9.83-21.094-10.138-41.677-7.987-8.294-12.39-13.619-12.595-15.36-1.638-13.107 11.059-33.587 38.093-61.747 10.957-11.469 25.907-26.010 31.232-30.515 2.253-1.946 4.813-4.096 5.632-4.915 3.174-3.072 17.51-13.312 22.733-16.282 7.782-4.403 16.077-6.758 20.787-5.939 2.97 0.614 6.144 3.072 15.872 12.493 13.926 13.619 15.053 14.541 21.094 16.384 5.939 1.741 12.186 0 20.48-5.939 12.493-8.909 35.942-28.058 43.11-35.123 10.138-10.138 11.162-15.053 4.915-24.064-3.891-5.632-35.738-36.966-39.629-39.014-9.421-4.915-26.829-4.915-45.875 0-32.358 8.397-67.686 28.262-103.424 58.061-11.366 9.421-37.581 35.226-47.718 47.002-45.261 52.019-70.451 106.906-65.741 142.541 1.536 11.469 3.686 14.643 22.733 33.69 22.016 22.016 26.317 24.474 35.226 19.968zM266.24 573.338c6.861-3.174 19.866-16.077 34.304-34.202 5.632-7.066 10.445-13.005 10.752-13.312s4.301-5.325 8.806-11.264c17.92-23.45 22.528-32.358 21.606-42.189-0.819-9.626-4.506-14.746-26.829-37.478-16.998-17.408-18.534-19.968-17.51-29.696 2.662-23.654 34.918-65.741 90.829-118.477 42.291-39.834 74.138-57.958 90.624-51.712 1.536 0.614 10.445 8.602 19.763 17.715 16.896 16.589 19.866 19.149 26.829 23.040 11.264 6.349 22.63 2.867 44.442-13.517 22.733-16.998 50.278-39.936 59.187-49.050 14.131-14.541 13.722-23.245-1.946-41.062-11.674-13.21-46.694-47.104-51.712-50.074-7.578-4.301-14.746-5.939-28.57-6.451-22.426-0.717-48.333 5.222-78.336 17.818-66.97 28.16-137.216 83.046-198.144 154.829-15.462 18.227-30.003 38.093-45.67 62.464-5.12 8.090-14.336 24.781-19.763 35.942-7.782 16.077-7.885 16.282-12.493 28.877-12.595 33.894-16.384 61.030-11.571 83.046 2.97 13.824 4.813 16.384 32.154 43.622 25.19 25.293 30.413 29.798 37.581 32.358 5.734 1.946 9.318 1.741 15.667-1.229zM579.994 547.328c20.787-7.782 33.792-26.624 33.587-48.742-0.102-26.214-20.48-48.128-46.694-50.176-19.456-1.638-38.912 8.602-48.538 25.395-16.691 29.184-0.614 66.765 32.154 75.059 8.090 2.048 21.811 1.331 29.491-1.536zM473.088 446.157c22.528-5.734 38.093-26.010 38.093-49.357 0-14.234-4.915-26.112-14.848-36.147-17.51-17.408-44.237-19.763-64.922-5.837-27.034 18.227-29.798 57.446-5.53 79.565 12.698 11.674 30.618 16.179 47.206 11.776z" />
+<glyph unicode="&#xe95e;" glyph-name="buy" d="M498.586 845.824c-0.205-0.205-3.686-0.717-7.578-1.024-15.462-1.536-40.243-9.318-55.808-17.715-43.93-23.552-75.674-66.97-84.378-115.405-2.458-13.926-2.56-16.691-2.56-84.173l-0.102-62.771h-118.579c-129.331 0-123.802 0.205-136.397-5.837-3.277-1.536-8.499-5.632-12.39-9.421-10.957-10.957-16.179-24.781-14.848-39.322 0.819-8.806 2.15-13.619 6.554-22.733 1.946-3.891 8.090-17.306 13.722-29.696s11.162-24.576 12.288-27.136c1.229-2.56 4.506-9.933 7.475-16.384s6.554-14.336 7.987-17.408c1.434-3.072 24.474-53.965 51.405-113.152 26.829-59.085 49.971-110.080 51.405-113.152 1.331-3.072 11.776-25.907 23.040-50.688s21.606-47.616 23.040-50.688c1.434-3.072 3.686-8.090 5.018-11.059l2.458-5.325 476.467 0.512 8.499 18.432c11.878 25.702 13.517 29.389 22.938 49.664 4.608 9.83 9.318 19.968 10.445 22.528s6.758 14.541 12.288 26.624c11.674 24.986 13.517 29.082 22.118 47.616 6.861 15.155 10.445 22.733 16.589 35.84 2.355 5.12 5.427 11.571 6.656 14.336 2.97 6.554 6.758 14.848 15.36 33.28 6.144 13.312 40.55 87.552 47.616 102.912 1.536 3.379 5.939 12.8 9.728 20.992 9.626 20.787 11.776 25.293 18.944 40.96 3.482 7.578 8.294 17.818 10.752 22.63 6.349 12.493 8.090 19.149 7.373 28.058-1.536 19.763-14.234 36.352-34.202 44.339l-6.963 2.765-240.128 0.512-0.102 63.283c0 34.714-0.205 64.614-0.307 66.253-1.331 15.462-4.608 30.31-10.035 44.954-23.654 64-84.275 106.394-152.986 106.906-6.861 0.102-12.595-0.102-12.8-0.307zM533.402 766.464c30.208-8.397 53.146-31.027 61.747-61.030 2.253-7.987 2.253-9.216 2.662-74.342l0.307-66.355h-173.261l0.41 65.843c0.102 36.147 0.614 67.174 1.024 68.813 6.758 27.136 19.354 44.544 42.086 58.266 5.632 3.379 14.643 7.27 19.558 8.499 16.486 3.891 32.154 3.994 45.466 0.307zM347.546 459.571c0.307-1.638 1.536-9.114 2.662-16.691 3.789-25.6 7.168-47.514 8.704-57.344 0.922-5.325 2.253-14.131 3.072-19.456s2.15-14.336 3.072-19.968c0.819-5.632 1.536-10.547 1.536-10.957 0-0.512-31.13-0.819-69.222-0.819h-69.12l-4.403 9.523c-2.458 5.12-7.27 15.36-10.752 22.63-3.379 7.168-6.246 13.21-6.246 13.414 0 0.102-3.584 7.782-8.090 16.998-4.403 9.216-9.011 19.046-10.24 21.709s-5.018 10.752-8.499 17.92c-3.379 7.168-7.475 15.872-9.114 19.456l-2.867 6.349h178.893l0.614-2.765zM598.016 461.517c0-0.41-0.717-6.349-1.536-13.005-2.253-17.101-2.253-17.715-4.096-33.792-1.638-14.131-2.15-18.534-3.072-24.576-0.205-1.638-0.717-5.12-0.922-7.68-0.922-7.885-4.813-40.346-5.222-43.008-0.205-1.434-0.41-3.174-0.41-3.789-0.102-1.024-14.643-1.331-69.222-1.331-37.99 0-69.12 0.307-69.222 0.819 0 0.41-0.205 1.843-0.512 3.277-1.434 8.397-5.632 34.406-6.554 40.448-0.512 3.994-1.229 8.294-1.536 9.728-0.205 1.331-0.717 4.301-1.024 6.656-0.41 2.253-2.15 13.824-4.096 25.6-1.946 11.878-3.994 24.781-4.608 28.672-0.614 3.994-1.331 8.397-1.638 10.035l-0.614 2.765h87.142c47.923 0 87.142-0.41 87.142-0.819zM848.589 461.107c-0.307-0.717-5.427-12.595-11.469-26.419s-15.667-36.147-21.504-49.664c-5.837-13.517-13.107-30.31-16.179-37.376l-5.53-12.8-140.595-0.512 0.512 2.253c0.205 1.331 3.277 24.986 6.656 52.531 3.482 27.648 6.451 51.302 6.656 52.736s0.717 5.53 1.126 9.216c0.41 3.686 0.922 6.963 1.024 7.475 0.102 0.41 0.205 1.434 0.307 2.253 0.102 1.331 10.854 1.536 89.805 1.536 71.373 0 89.6-0.307 89.19-1.229zM379.29 253.235c0.614-3.891 2.048-12.8 6.861-44.339 0.614-3.891 1.434-9.728 1.946-12.8s2.765-17.818 5.018-32.768c2.253-14.95 4.403-28.672 4.813-30.413l0.717-3.379h-77.21l-5.427 11.571c-3.072 6.246-8.806 18.432-12.902 26.829-4.096 8.499-9.626 19.968-12.288 25.6s-7.885 16.486-11.571 24.064c-3.584 7.578-9.216 19.354-12.493 26.112-3.174 6.758-6.042 12.595-6.349 13.107-0.205 0.41 26.317 0.717 58.88 0.717h59.29l0.717-4.301zM572.006 254.771c-0.307-1.638-2.048-11.878-3.789-22.835s-3.789-23.859-4.506-28.672c-5.325-33.075-6.758-42.086-8.602-54.784-1.229-7.885-2.458-15.36-2.765-16.691l-0.41-2.253h-81.715l-0.614 2.867c-0.307 1.536-0.819 4.608-1.126 6.861s-0.819 5.222-1.024 6.656c-0.307 1.434-0.717 3.994-0.922 5.632-0.307 1.741-1.638 10.24-3.072 18.944s-3.789 23.45-5.222 32.768c-1.536 9.318-2.867 18.022-3.174 19.456-0.205 1.434-0.922 5.53-1.434 9.216s-1.638 10.547-2.56 15.36c-0.819 4.813-1.536 9.011-1.536 9.523 0 0.41 27.648 0.717 61.542 0.717h61.542l-0.614-2.765zM755.814 245.043c-5.837-12.186-10.752-22.528-25.19-52.531-3.789-7.885-9.114-18.944-11.776-24.576s-7.885-16.589-11.571-24.269l-6.758-14.131h-38.502c-30.003 0-38.4 0.307-38.4 1.331 0 0.614 0.717 5.018 1.434 9.626 0.819 4.608 1.843 10.342 2.15 12.8 1.434 9.626 10.752 67.174 11.674 71.987 0.614 2.867 1.741 9.933 2.662 15.872 0.819 5.939 1.843 11.981 2.15 13.619l0.614 2.765h117.453l-5.939-12.493z" />
+<glyph unicode="&#xe95f;" glyph-name="buy_back_euro" d="M414.413 878.49c-0.102-0.102-5.53-0.41-11.981-0.717-25.088-1.126-48.23-10.752-66.458-27.853-8.704-8.090-11.469-12.083-29.286-41.062-8.294-13.414-16.179-26.112-17.408-28.058s-11.878-19.251-23.552-38.4c-11.674-19.149-24.371-39.834-28.16-46.080-6.246-9.933-6.758-11.366-5.325-12.39 1.024-0.614 23.45-13.722 49.869-29.082 26.522-15.36 49.766-28.979 51.712-30.208s9.83-5.837 17.408-10.24c7.578-4.403 15.258-8.806 16.896-9.728 10.957-6.554 19.456-11.264 20.070-11.264 0.307 0 2.355 2.867 4.506 6.451 2.15 3.482 4.915 7.987 6.144 9.933 2.048 3.174 125.030 206.438 131.994 218.112 1.434 2.56 8.909 14.746 16.384 27.136 7.578 12.39 13.21 22.63 12.595 22.835-1.229 0.205-145.101 0.819-145.408 0.614zM617.472 876.032c-17.613-4.813-27.853-12.8-38.4-30.003-14.848-24.064-52.736-87.654-52.736-88.576 0-0.512 13.414-23.347 29.798-50.483 16.384-27.238 30.208-50.278 30.72-51.2 0.717-1.434-3.686-4.301-25.19-16.896-30.106-17.613-29.286-14.848-6.144-22.221 16.998-5.427 88.064-28.467 98.304-31.949 6.246-2.048 66.56-21.606 79.667-25.805 8.090-2.56 18.739 0.41 23.040 6.554 3.277 4.71 3.072 3.686 13.005 57.139 5.222 27.853 7.885 42.189 8.704 47.104 0.512 2.867 2.765 15.258 5.12 27.648s4.608 24.883 5.12 27.648c1.536 8.499 5.939 32.154 7.782 41.779 0.922 4.915 1.434 9.216 1.126 9.523s-11.981-6.144-25.907-14.336c-19.763-11.571-25.702-14.643-26.624-13.619-0.614 0.614-6.246 9.728-12.39 20.173-39.731 66.765-51.712 85.914-57.139 91.443-6.758 6.758-15.053 11.981-24.064 15.053-9.114 3.072-24.576 3.584-33.792 1.024zM259.072 576.102c-7.578-2.56-194.97-71.885-195.277-72.192-0.512-0.41 4.608-3.379 31.232-17.51 11.366-6.042 20.685-11.469 20.685-11.981s-5.018-10.035-11.162-21.094c-11.776-21.504-37.99-69.222-43.725-79.77-6.963-12.8-9.523-22.938-8.909-35.123 1.229-23.757 19.251-46.694 41.165-52.429 6.042-1.536 13.107-1.638 67.174-1.536l60.314 0.205 3.482 6.144c2.765 4.915 30.925 56.013 35.43 64.512 0.614 1.126 5.018 9.011 9.728 17.613l8.602 15.565 4.198-2.355c5.837-3.277 15.974-8.806 25.702-13.926 4.506-2.355 11.571-6.144 15.667-8.397 5.325-2.867 7.373-3.584 7.373-2.458 0 1.434-13.517 62.259-15.36 69.222-0.512 1.946-4.198 18.33-8.192 36.352s-8.192 36.454-9.216 40.96c-1.024 4.506-4.301 18.842-7.27 31.744-2.867 13.005-6.144 25.293-7.373 27.341-3.072 5.632-9.011 9.114-15.974 9.626-3.174 0.205-6.861 0-8.294-0.512zM497.664 565.248c-30.003-5.018-52.736-22.221-67.174-50.893-3.891-7.68-11.674-30.106-11.674-33.485 0-1.843-1.024-2.048-11.776-2.355l-11.674-0.307-4.096-3.994c-9.216-9.011-7.987-25.805 2.355-31.949 2.765-1.638 7.885-2.253 18.125-2.458h2.56l-0.102-8.909c-0.102-5.018-0.205-9.523-0.307-10.035-0.102-0.614-3.174-1.024-7.066-1.024-9.216 0.102-13.005-1.126-17.203-5.734-5.325-5.939-6.246-17.408-1.741-23.45 3.789-5.018 8.090-6.656 19.046-7.168l10.24-0.512 1.741-7.168c8.090-32.973 29.184-59.187 56.218-69.939 12.698-5.018 21.197-6.554 38.912-6.861 40.243-0.819 64.922 10.445 81.613 37.171 6.861 10.957 9.83 19.046 9.216 24.576-1.126 10.24-11.059 18.125-22.835 18.125-9.421 0-13.824-3.379-19.968-15.36-8.090-15.667-14.643-21.197-28.774-24.576-8.294-1.946-28.672-1.331-36.659 1.024-17.818 5.427-30.72 17.92-36.864 35.942-1.126 3.174-2.048 6.246-2.048 6.758 0 0.41 17.818 0.819 39.731 0.819 36.454 0 39.936 0.205 43.827 1.946 13.414 6.042 11.469 29.594-2.662 33.69-2.15 0.614-19.251 0.922-43.52 0.819-21.914-0.102-40.346 0.102-40.96 0.512-1.024 0.819-1.229 17.92-0.205 18.944 0.307 0.41 22.426 0.614 49.050 0.614 31.744-0.102 49.664 0.307 52.019 1.024 5.222 1.536 9.114 5.734 10.752 11.571 2.15 7.475 1.126 13.926-3.277 19.763-5.018 6.656-3.789 6.554-56.218 6.451-26.112 0-47.514 0.307-47.514 0.717s0.819 3.072 1.843 5.837c10.65 28.877 28.877 42.496 57.037 42.496 22.63 0 34.406-7.066 43.622-26.112 4.198-8.602 8.909-14.336 13.21-16.179 1.434-0.614 5.222-1.229 8.397-1.331 4.813-0.205 6.554 0.205 10.342 2.662 2.458 1.536 5.837 4.608 7.475 6.758 2.662 3.379 2.97 4.608 2.867 11.059 0 6.042-0.614 8.397-3.277 13.926-13.517 27.75-34.406 42.803-65.229 46.899-10.035 1.331-28.262 1.229-37.376-0.307zM865.28 529.818c-3.072-1.741-9.523-5.222-14.336-7.782-4.813-2.662-33.382-18.125-63.488-34.406s-58.778-31.846-63.59-34.406c-4.813-2.56-9.83-5.427-11.059-6.246l-2.253-1.536 11.674-19.456c6.451-10.65 35.533-59.29 64.614-108.032 85.197-142.336 92.058-153.6 92.672-153.6 0.307 0.102 16.486 26.624 35.942 59.187 19.354 32.461 37.171 62.054 39.424 65.741 6.349 9.933 10.138 17.203 12.595 24.064 8.909 24.678 7.373 51.917-4.301 75.264-2.662 5.222-38.195 61.133-74.752 117.76-2.355 3.686-7.27 11.162-10.752 16.691-3.584 5.427-6.554 9.933-6.656 9.933 0 0-2.662-1.434-5.734-3.174zM670.208 312.013c-2.253-2.048-7.168-6.349-10.752-9.523-9.421-8.090-32.154-27.853-39.424-34.202-3.379-2.867-12.39-10.752-19.968-17.408-7.578-6.554-15.155-13.21-16.896-14.746-2.867-2.458-21.709-18.842-55.501-47.923-7.373-6.349-14.438-13.312-15.77-15.462-2.765-4.608-2.97-13.722-0.512-18.227s3.891-5.939 23.142-22.426c9.83-8.397 18.125-15.667 18.432-15.974s3.994-3.584 8.192-7.168c4.198-3.584 9.318-7.987 11.264-9.728s13.312-11.571 25.088-21.914c11.878-10.24 23.142-20.173 25.088-21.914s7.066-6.144 11.264-9.83c4.198-3.686 8.192-7.066 8.806-7.68 1.536-1.434 12.39-10.957 23.45-20.48l9.216-7.987 0.307 31.334 0.205 31.437 62.771 0.102c34.406 0 63.795 0.205 65.229 0.512 12.698 2.048 23.859 7.885 33.28 17.306 16.282 16.282 21.709 40.448 13.824 61.645-1.126 2.97-7.373 14.95-13.926 26.624-6.451 11.776-18.534 33.382-26.829 48.23l-15.053 26.829h-119.296v31.232c0 17.203-0.307 31.232-0.717 31.232-0.512 0-2.662-1.741-4.915-3.891zM100.147 250.163c1.126-1.843 14.336-23.654 29.389-48.435 15.155-24.781 33.485-55.091 40.858-67.379 14.029-23.45 21.299-32.666 32.358-41.165 12.186-9.421 28.877-16.691 45.056-19.558 6.042-1.024 26.829-1.331 97.587-1.434h89.805v181.248h-337.101l2.048-3.277z" />
+<glyph unicode="&#xe960;" glyph-name="buzz" d="M734.003 798.003c-32.973-32.768-62.362-62.054-65.434-64.819-29.798-27.546-70.144-51.2-109.67-64.41-17.408-5.837-41.779-11.264-59.699-13.517-3.379-0.41-7.066-0.819-8.192-1.024-1.126-0.102-2.662-0.307-3.277-0.307-1.024-0.102-1.331-31.744-1.331-154.624v-154.624l4.915-0.614c35.226-4.301 63.283-11.571 92.365-24.064 11.469-4.915 28.979-13.824 36.864-18.842 31.539-19.866 39.526-27.034 110.182-97.587l62.976-62.976 16.589 0.41c15.872 0.307 16.794 0.41 21.299 3.072 5.734 3.379 9.933 8.704 11.776 14.95 1.229 3.789 1.434 27.341 1.434 133.837v129.126l9.523 1.229c8.602 1.126 19.251 4.198 25.395 7.373 5.325 2.765 15.974 10.854 20.173 15.258 25.088 26.317 28.672 66.662 8.602 96.051-13.414 19.558-34.099 31.744-57.549 33.792-3.072 0.307-5.734 0.614-5.837 0.717-0.205 0.205-0.307 58.778-0.307 130.355 0 116.122-0.205 130.56-1.638 134.042-2.458 5.837-6.349 10.445-11.571 13.517-4.506 2.662-5.427 2.765-21.197 3.072l-16.589 0.41-59.802-59.802zM240.64 652.083c-34.509-5.018-59.494-15.462-81.92-34.202-7.066-5.837-16.384-14.746-16.384-15.77 0-0.307 23.347-0.512 52.019-0.512 49.664 0 52.019-0.102 55.194-2.048 6.246-3.789 8.090-11.059 4.403-17.101-3.686-6.144-1.229-5.939-69.018-6.451l-62.464-0.512-4.301-8.806c-2.355-4.813-5.53-12.186-6.963-16.384-2.458-7.27-6.758-22.938-6.758-24.678 0-0.41 26.112-0.819 58.163-0.819 44.339 0 58.675-0.307 60.621-1.331 3.482-1.741 7.168-7.578 7.168-11.366 0-1.741-0.922-4.608-2.048-6.451-3.994-6.656-1.946-6.451-67.174-6.451h-59.085l0.717-9.626c0.717-10.854 2.56-21.197 5.837-33.382l2.15-8.192h67.789c52.122 0 68.301-0.307 70.246-1.331 1.331-0.717 3.584-2.867 4.915-4.813 4.198-6.246 1.843-14.438-5.12-18.022-2.253-1.229-13.619-1.434-64.307-1.434h-61.542l3.789-5.837c25.907-40.96 70.246-67.072 119.706-70.554 5.12-0.41 9.421-0.819 9.626-1.024 0.205-0.102 16.589-65.331 36.454-144.691 19.866-79.462 36.659-145.92 37.376-147.558 1.946-4.813 10.445-11.878 15.77-13.21 3.174-0.717 22.016-1.126 59.187-1.126h54.579l5.632 2.867c4.198 2.15 6.656 4.301 9.421 8.397 7.27 10.65 9.421-0.41-29.389 154.624-18.842 75.776-34.611 138.547-34.918 139.571-0.512 1.638 1.126 1.741 25.088 1.741h25.702v307.2l-108.749-0.102c-59.904-0.102-109.978-0.41-111.411-0.614z" />
+<glyph unicode="&#xe961;" glyph-name="Calculator" d="M230.502 482.099c0.102-435.712-0.307-407.040 5.53-421.274 2.662-6.656 9.933-18.125 15.053-23.552 8.806-9.523 22.733-18.022 36.147-22.118 5.837-1.741 18.842-1.843 256.307-2.048l250.061-0.307v399.565c0 426.291 0.205 408.269-4.71 420.659-9.83 24.781-30.208 42.598-55.296 48.128-8.909 1.946-14.234 2.048-256.205 2.048h-246.989l0.102-401.101zM703.693 803.021c2.662-1.536 5.939-4.301 7.27-6.144 5.632-7.782 5.325-2.56 5.325-93.286 0-94.208 0.614-86.528-7.578-94.72-7.885-7.885 7.885-7.373-198.758-7.066l-184.832 0.307-4.813 2.867c-5.939 3.482-9.728 8.294-11.674 14.643-2.15 7.27-2.15 163.021 0.102 169.267 2.765 7.885 9.216 14.234 16.691 16.486 1.536 0.512 86.221 0.819 188.109 0.717l185.344-0.205 4.813-2.867zM403.149 548.352c6.246-3.789 6.451-5.12 6.451-36.557 0-26.419-0.102-28.672-2.048-31.744-3.891-6.451-3.789-6.451-49.152-6.451-43.827 0-44.032 0-48.64 5.12-1.946 2.15-2.048 3.994-2.355 31.744-0.307 32.87-0.205 33.997 6.246 37.888 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM557.158 548.045c5.939-3.994 6.042-4.608 6.042-36.045s-0.102-32.051-6.042-36.045c-3.482-2.355-3.482-2.355-44.851-2.355-45.67 0-45.568 0-49.459 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.851 2.048h41.574l3.482-2.355zM711.68 547.84c4.915-4.506 5.12-5.837 5.12-36.147 0-28.058 0-28.672-2.355-32.051-4.096-6.042-3.584-6.042-48.64-6.042-45.568 0-45.466 0-49.357 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.659 3.174 1.946 5.018 1.946 45.875 1.741 41.062-0.307 42.803-0.41 44.954-2.355zM403.149 420.352c6.246-3.789 6.451-5.018 6.451-36.557 0-31.13-0.102-31.846-6.042-35.84l-3.482-2.355h-83.354l-3.482 2.355c-5.939 3.994-6.042 4.71-6.042 35.84 0 31.539 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM556.749 420.352c6.246-3.789 6.451-5.12 6.451-36.352s-0.205-32.563-6.451-36.352c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM710.349 420.352c6.246-3.789 6.451-5.12 6.451-36.352s-0.205-32.563-6.451-36.352c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM403.149 292.352c6.246-3.789 6.451-5.12 6.451-36.352s-0.205-32.563-6.451-36.352c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM556.749 292.352c6.246-3.789 6.451-5.12 6.451-36.352s-0.205-32.563-6.451-36.352c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM710.349 292.352c6.861-4.096 6.451 1.536 6.451-100.557 0-71.885-0.307-92.979-1.331-95.027-0.717-1.331-2.867-3.584-4.71-4.813l-3.482-2.355h-41.574c-39.424 0-41.779 0.102-44.851 2.048-6.861 4.096-6.451-1.536-6.451 100.352s-0.41 96.256 6.451 100.352c3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM403.149 164.352c6.246-3.789 6.451-5.018 6.451-36.557 0-31.13-0.102-31.846-6.042-35.84-3.482-2.355-3.482-2.355-44.851-2.355-45.67 0-45.568 0-49.459 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM556.749 164.352c6.246-3.789 6.451-5.12 6.451-36.352s-0.205-32.563-6.451-36.352c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-1.946 3.072-2.048 5.325-2.048 31.949 0 31.437 0.102 32.051 6.042 36.045l3.482 2.355h41.574c39.424 0 41.779-0.102 44.851-2.048z" />
+<glyph unicode="&#xe962;" glyph-name="calendaralarm" d="M309.76 856.166c-11.162-3.482-19.558-10.65-24.474-20.992l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.15-6.758c3.174-9.728 5.837-15.258 10.547-22.323 8.397-12.39 21.914-23.347 34.714-28.16 15.974-6.042-11.366-5.632 383.488-5.734h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.626-0.41-15.36-3.174-3.891-1.843-8.499-5.12-11.059-7.782-10.138-10.65-11.469-15.565-11.469-43.725v-21.606h-281.498l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.118-4.301 0.102-9.626-0.307-11.878-1.024zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.974 3.277 8.192 4.301 14.234 10.547 18.227 18.739l3.174 6.656 1.024 60.416 6.963-7.168c24.371-25.088 23.962-64.717-1.024-89.19-25.498-25.088-65.229-24.986-90.112 0.205-24.576 24.986-24.781 64.512-0.614 89.088l6.963 7.066 1.024-60.416 3.174-6.656zM642.458 677.376c2.15-5.12 8.294-13.414 12.288-16.486 1.434-1.126 5.222-3.277 8.499-4.813 5.018-2.355 7.27-2.765 14.643-2.765 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.41 28.16 0.819 28.16 1.946 0 13.312-13.619 16.896-20.275 25.6-47.821-16.384-104.141-69.325-92.877-40.141 8.499-62.054 52.531-44.646 89.395 3.482 7.27 10.547 16.998 15.565 21.197l3.379 2.867 0.512-30.106c0.512-26.522 0.819-30.618 2.458-34.714zM821.248 546.611c10.65-5.222 18.022-13.21 21.504-23.347 2.048-5.837 2.048-8.909 2.048-206.95v-201.114h-658.125l-6.554 2.15c-10.445 3.379-17.818 9.933-22.835 20.378l-3.174 6.656-0.307 203.059-0.205 202.957 660.992-0.512 6.656-3.277zM488.858 497.152c-9.114-3.584-14.336-10.138-17.306-21.709l-2.048-8.294-11.776-4.71c-12.595-5.222-20.685-9.933-29.696-17.408-20.275-16.794-33.69-38.502-40.038-65.126-2.15-8.806-2.253-11.776-2.458-61.952-0.205-43.008-0.512-53.453-1.741-56.832-0.819-2.355-5.427-10.854-10.342-19.149-9.421-15.667-10.547-19.558-7.373-24.064 0.922-1.331 3.277-2.56 5.427-2.97 2.048-0.41 60.006-0.717 128.717-0.717 94.822 0 125.85 0.307 128.614 1.229 5.018 1.638 6.758 5.53 5.018 10.957-0.717 2.15-4.506 9.216-8.499 15.667-12.493 20.48-11.366 13.517-11.571 71.885-0.205 42.086-0.512 52.531-1.946 60.928-4.198 24.269-15.872 46.49-33.485 63.488-11.264 10.957-20.89 16.998-40.96 25.907-7.373 3.174-9.114 5.427-10.445 12.902-1.536 8.192-7.066 15.36-15.053 19.558-5.222 2.662-16.896 2.867-23.040 0.41zM462.234 200.499c2.765-14.95 9.011-23.45 21.811-29.594 6.758-3.277 8.704-3.789 15.667-3.789 7.168-0.102 8.704 0.205 15.667 3.686 12.8 6.349 20.275 16.384 21.606 29.184l0.41 4.301h-75.776l0.614-3.789z" />
+<glyph unicode="&#xe963;" glyph-name="calendar_30" d="M310.784 856.576c-10.24-2.355-20.582-11.162-25.498-21.402l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.253-6.963c9.318-28.979 30.31-48.333 59.187-54.374 6.246-1.331 52.941-1.536 369.459-1.638h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.523-0.41-15.36-3.174-8.397-3.994-14.643-10.24-18.842-18.842l-3.174-6.656-0.307-23.757-0.307-23.859h-281.395l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.016-4.301 0.205-9.114-0.102-10.854-0.512zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.872 3.277 8.294 4.198 14.438 10.65 18.33 18.739l3.174 6.656 1.024 60.416 6.963-7.066c24.269-24.781 23.962-64.512-0.819-89.19-25.293-25.088-65.434-25.088-90.317 0.102-24.576 24.986-24.781 64.512-0.614 89.088l6.963 7.066 1.024-60.416 3.174-6.656zM643.686 675.328c4.198-8.602 10.342-14.848 18.739-18.842 5.939-2.765 7.885-3.174 15.462-3.174 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.41 28.16 0.819 28.16 1.946 0 13.312-13.619 16.896-20.275 25.6-47.821-16.384-104.141-69.325-92.877-12.902 2.765-26.112 10.342-34.406 19.763-22.221 25.293-21.504 63.078 1.741 86.835l6.963 7.066 1.024-60.416 3.174-6.656zM821.453 546.509c8.192-3.994 16.282-11.878 20.070-19.558l2.765-5.734 0.307-202.957 0.205-203.059h-658.125l-6.554 2.15c-10.445 3.379-17.818 9.933-22.835 20.378l-3.174 6.656-0.307 203.059-0.205 202.957 660.992-0.512 6.861-3.379zM354.304 497.664c-16.998-2.765-35.533-10.138-46.694-18.432-26.112-19.661-40.038-47.206-43.725-86.733-0.307-3.686-0.205-3.891 2.867-3.891 3.584-0.102 54.477-0.102 56.934 0 1.331 0 1.741 1.638 2.355 8.090 1.843 22.426 12.595 39.117 29.286 45.568 10.445 3.994 24.576 4.301 35.328 0.819 19.354-6.349 29.491-20.173 29.491-40.243 0-11.366-2.355-17.51-9.626-24.781-10.445-10.342-24.781-15.053-46.49-15.053h-11.776v-5.325c-0.205-30.106-0.102-38.912 0.512-39.526 0.307-0.41 5.018-0.717 10.342-0.819 41.267-0.717 59.904-12.288 62.566-38.81 0.819-8.397 0.819-9.318-0.102-16.794-2.15-17.92-13.312-31.949-30.925-38.605-8.499-3.174-24.371-4.403-33.075-2.56-14.746 3.174-29.184 14.438-35.635 27.853-3.686 7.782-7.27 20.685-7.578 27.853-0.205 2.662-0.819 5.222-1.331 5.734-0.614 0.41-14.438 0.717-30.822 0.717l-29.696-0.102 0.205-11.366c0.512-24.576 9.114-48.538 23.654-65.843 7.68-9.011 11.469-12.39 21.402-19.149 19.149-12.902 43.725-19.558 72.499-19.558 71.885-0.205 122.163 45.261 119.603 108.032-1.331 33.075-19.558 57.549-49.971 67.379-5.53 1.741-6.656 2.458-5.12 2.97 21.197 7.578 34.714 22.221 40.653 44.032 3.789 13.824 2.97 34.611-1.741 48.128-3.584 10.138-13.21 24.166-22.426 32.563-12.595 11.469-31.334 21.299-47.718 25.088-2.56 0.614-6.861 1.638-9.728 2.253-8.192 1.843-33.485 2.253-43.52 0.512zM606.925 497.562c-8.602-1.331-24.576-6.144-30.925-9.421-12.493-6.246-27.648-20.275-35.84-32.87-12.8-19.763-22.528-49.050-25.702-77.414-0.307-3.379-0.922-7.066-1.126-8.192-1.229-5.325-1.024-60.314 0.307-73.523 5.12-51.814 23.040-91.648 50.074-110.797 9.114-6.554 14.336-9.114 25.088-12.698 26.931-9.114 59.187-7.885 84.992 3.072 12.902 5.427 28.467 18.227 37.888 31.13 12.39 16.794 24.064 48.538 27.136 73.728 0.41 2.867 0.819 5.837 1.024 6.656 1.946 7.27 2.765 61.030 1.331 79.565-5.325 66.048-31.744 110.899-74.138 125.645-17.203 6.042-41.472 8.090-60.109 5.12zM642.355 442.88c11.059-4.198 22.118-17.101 27.238-32.051 3.174-9.318 6.246-24.781 7.782-39.117 1.229-12.595 1.434-71.782 0.102-78.336-0.205-1.434-0.717-5.325-1.126-8.704-3.482-30.208-15.053-53.35-30.72-61.030-11.366-5.53-28.57-5.325-39.117 0.717-11.469 6.554-21.299 23.962-25.805 45.773-3.891 18.125-4.506 28.058-4.608 64.205 0 43.315 1.741 57.754 9.421 78.848 4.301 11.776 14.234 24.269 22.426 28.16 9.933 4.71 24.166 5.325 34.406 1.536z" />
+<glyph unicode="&#xe964;" glyph-name="calendar_day" d="M309.76 856.166c-11.162-3.482-19.558-10.65-24.474-20.992l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.15-6.758c3.174-9.728 5.837-15.258 10.547-22.323 8.397-12.39 21.914-23.347 34.714-28.16 15.974-6.042-11.366-5.632 383.488-5.734h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.626-0.41-15.36-3.174-3.891-1.843-8.499-5.12-11.059-7.782-10.138-10.65-11.469-15.565-11.469-43.725v-21.606h-281.498l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.118-4.301 0.102-9.626-0.307-11.878-1.024zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.974 3.277 8.192 4.301 14.234 10.547 18.227 18.739l3.174 6.656 1.024 60.416 6.963-7.168c24.371-25.088 23.962-64.717-1.024-89.19-25.498-25.088-65.229-24.986-90.112 0.205-24.576 24.986-24.781 64.512-0.614 89.088l6.963 7.066 1.024-60.416 3.174-6.656zM642.458 677.376c2.15-5.12 8.294-13.414 12.288-16.486 1.434-1.126 5.222-3.277 8.499-4.813 5.018-2.355 7.27-2.765 14.643-2.765 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.41 28.16 0.819 28.16 1.946 0 13.312-13.619 16.896-20.275 25.6-47.821-16.384-104.141-69.325-92.877-40.141 8.499-62.054 52.531-44.646 89.395 3.482 7.27 10.547 16.998 15.565 21.197l3.379 2.867 0.512-30.106c0.512-26.522 0.819-30.618 2.458-34.714zM821.248 546.611c10.65-5.222 18.022-13.21 21.504-23.347 2.048-5.837 2.048-8.909 2.048-206.95v-201.114h-658.125l-6.554 2.15c-10.445 3.379-17.818 9.933-22.835 20.378l-3.174 6.656-0.307 203.059-0.205 202.957 660.992-0.512 6.656-3.277z" />
+<glyph unicode="&#xe965;" glyph-name="Calendar_fixtures_results" d="M310.784 856.576c-10.24-2.355-20.582-11.162-25.498-21.402l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.253-6.963c9.318-28.979 30.31-48.333 59.187-54.374 6.246-1.331 52.941-1.536 369.459-1.638h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.523-0.41-15.36-3.174-8.397-3.994-14.643-10.24-18.842-18.842l-3.174-6.656-0.307-23.757-0.307-23.859h-281.395l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.016-4.301 0.205-9.114-0.102-10.854-0.512zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.872 3.277 8.294 4.198 14.438 10.65 18.33 18.739l3.174 6.656 1.024 60.416 6.861-7.066c24.371-25.19 24.064-64.512-0.717-89.19-25.293-25.088-65.434-25.088-90.317 0.102-24.576 24.986-24.781 64.512-0.614 89.088l6.963 7.066 1.024-60.416 3.174-6.656zM643.686 675.328c4.198-8.602 10.342-14.848 18.739-18.842 5.939-2.765 7.885-3.174 15.462-3.174 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.307 28.16 0.717 28.16 0.307 0 3.482-2.97 6.861-6.554 24.166-25.498 23.654-64.717-1.126-89.395-29.696-29.491-78.643-23.040-100.147 13.21-14.234 24.064-10.24 56.013 9.421 76.186l6.963 7.066 1.024-60.416 3.174-6.656zM821.35 546.714c10.547-5.018 18.637-14.336 22.323-25.907 0.819-2.355 1.126-64 1.126-204.493v-201.114h-329.114c-326.758 0-329.114 0-335.77 2.048-10.342 3.174-19.149 11.469-23.859 22.528-1.843 4.506-1.946 10.342-2.253 207.667l-0.205 202.957 660.992-0.512 6.758-3.174zM231.322 421.683c-0.102-0.512-0.102-3.789 0-7.475 0.41-32.563 6.963-67.174 17.51-92.467 14.234-34.304 37.786-61.952 64.205-75.469l6.349-3.277 5.837 2.662c18.534 8.499 40.55 28.57 53.043 48.538 19.763 31.539 29.491 67.277 31.846 116.736l0.512 11.469h-89.6c-49.254 0-89.6-0.307-89.702-0.717zM588.288 410.419c1.536-37.171 8.090-68.096 20.070-95.027 12.902-29.082 35.942-55.194 60.621-68.608l6.963-3.789 5.325 2.253c2.97 1.229 9.728 5.222 15.053 8.704 26.112 17.51 46.49 46.182 58.266 82.022 4.403 13.517 8.806 32.87 9.83 43.93 0.41 3.994 0.922 7.475 1.126 7.885 0.307 0.41 0.717 8.294 1.126 17.613l0.614 16.998h-179.507l0.512-11.981zM460.8 345.395c0.102-0.205 5.734-17.306 12.698-38.195l12.698-37.888 12.8-0.307c11.469-0.205 12.8-0.102 13.517 1.536 0.41 1.024 4.71 13.619 9.728 27.955 4.915 14.336 10.24 29.594 11.776 33.792s3.174 8.909 3.584 10.547l0.922 2.765h-26.214l-1.638-4.301c-0.922-2.458-3.789-10.957-6.451-19.046-2.662-7.987-4.915-14.438-5.018-14.336-0.205 0.205-2.662 7.475-5.53 16.179-2.97 8.704-5.837 17.101-6.451 18.739l-1.024 2.765h-12.698c-6.963 0-12.698-0.102-12.698-0.205z" />
+<glyph unicode="&#xe966;" glyph-name="Calendar_football_match" d="M310.784 856.576c-10.24-2.355-20.582-11.162-25.498-21.402l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.253-6.963c9.318-28.979 30.31-48.333 59.187-54.374 6.246-1.331 52.941-1.536 369.459-1.638h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.523-0.41-15.36-3.174-8.397-3.994-14.643-10.24-18.842-18.842l-3.174-6.656-0.307-23.757-0.307-23.859h-281.395l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.016-4.301 0.205-9.114-0.102-10.854-0.512zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.872 3.277 8.294 4.198 14.438 10.65 18.33 18.739l3.174 6.656 1.024 60.416 6.963-7.066c24.269-24.781 23.962-64.512-0.819-89.19-25.293-25.088-65.434-25.088-90.317 0.102-24.576 24.986-24.781 64.512-0.614 89.088l6.963 7.066 1.024-60.416 3.174-6.656zM643.686 675.328c4.198-8.602 10.342-14.848 18.739-18.842 5.939-2.765 7.885-3.174 15.462-3.174 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.41 28.16 0.819 28.16 1.946 0 13.312-13.619 16.896-20.275 25.6-47.821-16.384-104.141-69.325-92.877-12.902 2.765-26.112 10.342-34.406 19.763-22.221 25.293-21.504 63.078 1.741 86.835l6.963 7.066 1.024-60.416 3.174-6.656zM821.248 546.611c10.65-5.222 18.022-13.21 21.504-23.347 2.048-5.837 2.048-8.602 2.048-207.053v-201.011h-658.125l-6.554 2.15c-10.445 3.379-17.818 9.933-22.835 20.378l-3.174 6.656-0.307 203.059-0.205 202.957 660.992-0.512 6.656-3.277zM481.792 524.083c-36.659-3.277-74.445-18.637-102.912-41.779-36.966-29.901-60.109-69.632-69.222-118.272-2.458-13.21-2.662-43.622-0.41-58.368 6.554-43.213 25.088-79.77 55.808-109.978 28.16-27.648 66.458-47.104 103.424-52.326 2.867-0.41 6.042-1.024 7.168-1.229s10.342-0.614 20.48-0.819c21.299-0.307 36.762 1.536 55.194 6.758 96.256 27.238 155.648 124.006 136.192 222.106-15.258 77.517-76.8 137.523-155.443 151.757-10.854 1.946-39.424 3.174-50.278 2.15zM448.614 480.87l-6.144-12.186 27.853-11.059c15.36-6.042 28.57-10.957 29.389-10.957 0.819 0.102 13.824 5.12 28.877 11.059l27.341 10.957-6.042 12.186c-3.379 6.656-5.939 12.186-5.734 12.186s3.994-1.229 8.397-2.662c16.794-5.427 35.635-15.77 50.074-27.341 10.035-8.090 25.088-23.757 31.027-32.256 4.096-5.939 4.301-6.349 2.048-5.837-2.355 0.512-12.493 2.15-20.992 3.277l-4.403 0.614-0.102-5.53c0-3.072-0.205-6.451-0.41-7.578s-0.614-7.373-0.922-13.824c-1.229-22.835-1.843-31.232-2.15-32.358-0.41-1.434 37.683-47.821 39.014-47.514 0.512 0.102 4.915 3.994 9.83 8.806 5.018 4.71 9.318 8.602 9.626 8.602 0.41 0 0.41-6.144 0.102-13.619-1.536-31.846-10.24-58.778-27.546-84.89-3.994-6.042-7.68-11.059-8.090-11.059s-1.536 5.53-2.458 12.186c-1.024 6.758-2.15 12.698-2.458 13.312-0.512 0.717-2.765 0.512-6.758-0.512-3.379-0.922-6.861-1.843-7.68-1.946-15.872-3.584-43.93-11.469-45.158-12.698-1.741-1.741-30.106-46.694-31.13-49.254-0.41-1.126 2.662-3.174 11.469-7.578l12.083-6.042-3.584-1.536c-4.813-2.048-16.077-5.018-26.112-6.963-16.691-3.277-45.568-2.56-65.536 1.638-5.427 1.126-22.221 6.246-21.811 6.656 0.205 0.205 5.427 2.867 11.776 6.042s11.776 6.246 12.083 6.656c0.307 0.512-1.126 3.379-3.072 6.349-1.946 3.072-9.216 14.541-16.179 25.498l-12.595 19.968-29.082 7.373c-16.077 4.096-29.389 7.066-29.798 6.656-0.307-0.41-1.434-6.349-2.56-13.21-1.024-6.963-2.15-12.595-2.458-12.595-0.614 0-7.578 9.83-12.186 17.408-7.68 12.39-16.384 34.099-19.558 48.64-3.072 13.722-5.325 43.52-3.379 43.52 0.41 0 5.018-4.198 10.035-9.216l9.216-9.216 1.843 2.253c1.024 1.331 9.83 11.981 19.456 23.654 9.728 11.776 17.51 22.016 17.51 22.835-0.102 0.819-0.512 7.168-0.922 14.029-0.307 6.861-0.819 14.541-1.024 17.101s-0.717 9.728-1.126 15.872c-0.307 6.246-0.819 11.469-0.922 11.674-0.205 0.205-6.451-0.512-13.722-1.638-7.373-1.024-13.414-1.843-13.414-1.741s2.765 3.789 6.144 8.192c15.974 20.89 36.352 37.581 59.904 49.050 9.318 4.608 24.269 10.445 27.443 10.65 0.41 0.102-2.048-5.427-5.325-12.083zM471.347 375.91c-15.872-11.059-27.853-20.173-27.853-21.094 0-0.819 5.018-16.077 10.957-33.792l10.957-32.256 33.997-0.307 33.894-0.205 7.475 22.221c4.096 12.288 9.216 27.546 11.264 33.894l3.789 11.469-10.342 7.373c-5.734 3.994-17.306 12.186-25.805 18.125-8.397 6.042-16.486 11.571-17.92 12.493-2.56 1.638-2.97 1.331-30.413-17.92z" />
+<glyph unicode="&#xe967;" glyph-name="calendar_month" d="M309.76 856.166c-11.162-3.482-19.558-10.65-24.474-20.992l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.15-6.758c3.174-9.728 5.837-15.258 10.547-22.323 8.397-12.39 21.914-23.347 34.714-28.16 15.974-6.042-11.366-5.632 383.488-5.734h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.626-0.41-15.36-3.174-3.891-1.843-8.499-5.12-11.059-7.782-10.138-10.65-11.469-15.565-11.469-43.725v-21.606h-281.498l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.118-4.301 0.102-9.626-0.307-11.878-1.024zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.974 3.277 8.192 4.301 14.234 10.547 18.227 18.739l3.174 6.656 1.024 60.416 6.963-7.066c24.371-24.883 23.962-64.819-1.024-89.293-8.602-8.499-18.125-13.926-29.594-16.794-32.154-8.192-66.253 10.957-76.186 42.701-6.963 22.323-1.024 47.206 15.155 63.488l6.861 6.963 1.024-60.416 3.174-6.656zM642.458 677.376c2.15-5.12 8.294-13.414 12.288-16.486 1.434-1.126 5.222-3.277 8.499-4.813 5.018-2.355 7.27-2.765 14.643-2.765 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.41 28.16 0.819 28.16 1.946 0 13.312-13.619 16.896-20.275 25.6-47.821-16.384-104.141-69.325-92.877-12.902 2.765-26.112 10.342-34.406 19.763-22.323 25.395-21.504 63.078 1.741 86.835l6.963 7.066 0.512-30.208c0.512-26.624 0.819-30.72 2.458-34.816zM290.099 550.4h17.101v-128h-153.6v127.898l8.499 0.307c4.608 0.205 31.437 0.205 59.597 0.102s58.88-0.307 68.403-0.307zM478.003 550.4h8.397v-128h-153.6v127.898l2.867 0.307c1.536 0.205 32.256 0.205 68.301 0.102 36.045-0.205 69.325-0.307 74.035-0.307zM655.155 550.4h10.445v-128h-153.6v63.795c0 35.123 0.205 64.102 0.41 64.307s30.106 0.307 66.355 0.205c36.25-0.205 70.554-0.307 76.39-0.307zM805.478 550.093c8.909-0.307 11.264-0.819 16.896-3.482 8.602-4.096 14.131-9.523 18.432-18.227l3.482-7.168 0.307-49.357 0.307-49.459h-153.702v127.898l3.891 0.307c5.12 0.41 97.28 0 110.387-0.512zM307.2 332.8v-64h-153.6v128h153.6v-64zM486.4 332.8v-64h-153.6v128h153.6v-64zM665.6 332.8v-64h-153.6v128h153.6v-64zM844.8 332.8v-64h-153.6v128h153.6v-64zM307.2 179.2v-64h-59.699c-63.693 0-64.512 0.102-74.445 5.12-5.837 2.97-12.39 10.24-15.77 17.408l-3.174 6.656-0.307 49.459-0.307 49.357h153.702v-64zM486.4 179.2v-64h-153.6v128h153.6v-64zM665.6 179.2v-64h-153.6v128h153.6v-64z" />
+<glyph unicode="&#xe968;" glyph-name="calendar_week" d="M309.76 856.166c-11.162-3.482-19.558-10.65-24.474-20.992l-3.174-6.758-0.307-23.757-0.41-23.859h-178.995l0.205-326.861 0.307-326.963 2.15-6.758c3.174-9.728 5.837-15.258 10.547-22.323 8.397-12.39 21.914-23.347 34.714-28.16 15.974-6.042-11.366-5.632 383.488-5.734h362.189v322.765c0 211.354-0.41 325.018-1.024 329.216-3.686 22.835-18.022 43.52-38.195 54.989-6.042 3.482-16.998 7.475-22.63 8.294-2.253 0.41-5.12 0.819-6.246 1.024s-26.522 0.41-56.525 0.41l-54.477 0.102-0.307 23.859c-0.307 23.45-0.307 23.859-3.072 29.798-7.066 15.053-19.046 22.63-35.635 22.63-7.578 0-9.626-0.41-15.36-3.174-3.891-1.843-8.499-5.12-11.059-7.782-10.138-10.65-11.469-15.565-11.469-43.725v-21.606h-281.498l-0.307 23.859-0.307 23.757-3.174 6.656c-6.451 13.414-18.739 21.606-33.075 22.118-4.301 0.102-9.626-0.307-11.878-1.024zM285.286 675.328c4.198-8.602 10.342-14.848 18.739-18.842 6.144-2.867 7.68-3.174 16.486-3.174 8.909 0.102 10.24 0.307 15.974 3.277 8.192 4.301 14.234 10.547 18.227 18.739l3.174 6.656 1.024 60.416 6.963-7.168c24.371-25.088 23.962-64.717-1.024-89.19-25.498-25.088-65.229-24.986-90.112 0.205-24.576 24.986-24.781 64.512-0.614 89.088l6.963 7.066 1.024-60.416 3.174-6.656zM642.458 677.376c2.15-5.12 8.294-13.414 12.288-16.486 1.434-1.126 5.222-3.277 8.499-4.813 5.018-2.355 7.27-2.765 14.643-2.765 13.619 0 22.63 4.403 30.925 14.848 7.168 9.114 7.987 13.517 7.987 45.568 0 15.462 0.41 28.16 0.819 28.16 1.946 0 13.312-13.619 16.896-20.275 25.6-47.821-16.384-104.141-69.325-92.877-40.141 8.499-62.054 52.531-44.646 89.395 3.482 7.27 10.547 16.998 15.565 21.197l3.379 2.867 0.512-30.106c0.512-26.522 0.819-30.618 2.458-34.714zM307.2 332.8v-217.6h-60.211c-58.368 0-60.518 0.102-66.867 2.15-10.445 3.379-17.818 9.933-22.835 20.378l-3.174 6.656-0.307 203.059-0.205 202.957h153.6v-217.6zM486.4 332.8v-217.6h-153.6v435.2h153.6v-217.6zM665.6 332.8v-217.6h-153.6v435.2h153.6v-217.6zM821.248 546.611c10.65-5.222 18.022-13.21 21.504-23.347 2.048-5.837 2.048-8.909 2.048-206.95v-201.114h-153.6v435.302l123.392-0.614 6.656-3.277z" />
+<glyph unicode="&#xe969;" glyph-name="call" d="M229.683 852.48c-14.541-5.222-32.768-20.89-71.885-62.054-5.837-6.144-16.486-17.101-23.552-24.474-17.51-18.022-21.811-24.576-27.034-41.165-4.608-14.438-5.734-23.552-5.325-44.851 0.102-10.65 0.614-21.094 0.922-23.040 0.41-1.946 1.126-6.758 1.741-10.752 7.987-54.477 38.093-126.259 82.432-196.301 29.082-46.080 67.174-95.334 109.773-142.131 12.186-13.414 64-65.126 77.005-76.902 111.718-101.171 231.322-169.267 331.264-188.723 21.094-4.198 50.79-5.734 66.56-3.584 17.408 2.458 32.768 8.090 43.213 15.872 5.939 4.403 78.643 77.107 84.275 84.275 20.378 25.702 23.962 37.376 16.589 53.658-7.168 15.565-25.395 32.563-93.389 86.835-54.579 43.622-74.752 53.248-96.154 45.978-14.438-4.813-23.142-11.981-61.747-50.483-25.6-25.498-27.648-26.829-42.291-26.726-12.595 0.102-23.45 3.277-39.936 11.674-18.842 9.523-41.267 24.883-64.512 43.93-38.912 32.051-94.106 85.914-131.584 128.614-61.235 69.734-84.582 118.272-68.915 143.155 1.331 2.15 11.264 12.8 22.118 23.654 28.672 28.672 35.942 36.557 43.315 47.206 14.131 20.378 13.517 35.738-2.765 62.669-4.71 7.68-29.491 41.574-34.304 46.899-1.126 1.229-3.482 4.198-5.427 6.656-15.258 19.763-45.875 56.013-56.422 66.662-22.835 23.040-37.376 29.389-53.965 23.45z" />
+<glyph unicode="&#xe96a;" glyph-name="call_forward" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-112.128-8.499-219.443-62.874-293.99-149.197-57.856-67.072-94.618-151.45-103.322-237.466-0.41-3.686-0.922-8.294-1.126-10.24-0.307-1.946-0.717-15.565-0.922-30.208-0.512-27.648 1.024-52.941 4.198-71.168 6.349-36.454 11.264-56.115 20.582-81.92 33.587-93.286 98.099-172.749 182.067-224.358 57.856-35.635 125.952-57.856 193.024-63.078 13.619-1.024 58.163-1.024 69.632 0 38.093 3.482 71.578 10.445 103.936 21.402 134.349 45.363 239.104 154.112 278.426 288.973 7.578 25.805 13.312 54.374 15.462 76.39 0.307 3.686 1.024 10.854 1.434 15.872 0.512 5.12 0.922 91.034 0.922 190.976 0.102 195.072 0.307 188.416-5.018 204.8-9.83 30.515-34.406 55.194-65.434 65.434-16.179 5.325-8.192 5.12-205.926 5.12-101.171 0-184.115-0.102-184.32-0.307zM814.592 779.162c15.36-4.096 25.498-15.462 28.16-31.846 0.614-3.482 1.024-48.128 1.024-107.827v-101.888l-61.44 61.44-45.466-45.466c-24.986-24.986-47.514-46.797-50.074-48.333-11.571-7.168-24.678-7.782-36.25-1.843-5.53 2.97-12.595 9.421-44.032 40.858-44.032 43.93-43.827 43.725-43.827 60.416 0.102 16.589-1.331 14.746 52.429 68.403l46.49 46.387-30.925 30.72-30.925 30.618h104.346c91.341 0 105.062-0.205 110.49-1.638zM298.086 643.379c11.264-3.789 23.962-17.101 57.856-60.211 22.016-28.058 28.058-38.707 28.16-49.562 0.205-11.059-5.734-19.558-31.13-45.158-7.782-7.885-14.848-15.462-15.565-16.896-9.626-18.432 13.21-57.651 64-109.978 58.061-59.802 99.533-90.624 122.368-90.931 10.445-0.205 10.957 0.102 31.334 20.275 10.445 10.24 21.914 20.48 25.395 22.733 15.872 10.24 26.829 7.578 54.272-13.107 7.373-5.632 16.998-13.107 21.299-16.691 4.403-3.482 12.8-10.342 18.739-15.053 14.541-11.674 26.829-23.654 30.822-29.901 2.765-4.301 3.379-6.144 3.379-11.469 0.102-10.24-2.97-14.438-34.918-46.694-29.594-30.003-34.202-33.69-46.182-37.069-9.216-2.662-30.106-3.277-43.213-1.229-52.736 8.090-116.122 39.834-178.176 89.088-6.451 5.12-14.029 11.366-16.896 13.824-19.968 17.818-26.214 23.654-39.526 36.762-75.981 75.571-127.59 158.925-141.312 228.454-3.072 15.36-3.379 40.96-0.512 50.995 4.198 15.155 8.397 20.48 49.254 60.723 19.763 19.456 29.901 24.781 40.55 21.094z" />
+<glyph unicode="&#xe96b;" glyph-name="call_invite" d="M496.64 830.259c-1.434-0.205-6.656-1.126-11.776-1.946-26.624-4.403-54.17-18.227-75.162-37.786-15.872-14.746-24.166-26.010-33.894-46.080-10.445-21.402-14.643-40.038-14.643-65.024 0-18.534 1.946-31.232 7.066-47.104 16.282-49.664 56.32-87.142 107.213-100.25 12.186-3.174 23.45-4.506 38.093-4.403 69.53 0.205 129.843 47.616 146.432 115.405 3.482 14.438 3.686 15.667 4.096 32.768 0.819 29.696-6.144 56.32-21.094 81.101-22.118 36.557-57.446 61.645-99.738 70.963-7.68 1.638-14.438 2.253-27.136 2.458-9.318 0.205-18.022 0.102-19.456-0.102zM369.869 532.173c-30.106-18.944-53.965-45.363-69.427-76.698-6.246-12.595-6.451-13.517-4.71-24.371 1.331-8.806 0.819-15.462-1.946-23.654-1.843-5.837-8.499-16.179-11.469-18.022-0.922-0.614-1.331-15.258-1.536-64.307l-0.307-63.59 3.277-5.837c5.222-9.216 13.21-21.606 18.842-29.389 5.734-7.68 14.643-17.203 15.667-16.691 0.41 0.205 6.963 3.482 14.541 7.27 19.661 9.83 27.75 12.39 39.936 12.288 8.090 0 10.854-0.41 15.974-2.56 16.179-6.656 26.214-18.33 56.115-65.126 11.674-18.227 18.33-31.846 20.173-40.858l1.331-6.451h124.621l9.421-7.885c39.322-32.768 88.576-47.206 138.752-40.653 65.946 8.499 122.368 53.862 145.101 116.531 15.258 42.086 14.029 89.702-3.379 130.662-3.891 9.114-5.12 11.674-11.469 22.528-24.474 41.882-71.066 74.752-118.272 83.456-5.018 0.922-10.24 1.843-11.366 2.15-1.638 0.307-2.458 1.434-2.97 4.198-1.126 6.144-9.114 25.498-14.848 36.147-16.384 30.106-40.346 55.296-68.915 72.499l-7.066 4.198-7.782-6.656c-18.125-15.36-41.779-28.57-64.205-36.045-47.718-15.77-98.611-12.8-144.486 8.602-12.595 5.837-35.942 21.094-44.544 29.184-5.734 5.427-5.018 5.53-15.053-0.922zM728.576 373.76c28.365-2.048 57.139-15.565 78.848-36.864 18.637-18.227 30.003-38.298 36.454-64.512 3.072-11.981 3.789-37.683 1.536-50.688-2.253-12.902-7.782-29.184-13.619-39.834-28.262-52.429-84.787-78.848-143.462-67.072-38.093 7.68-71.885 33.997-90.112 70.042-11.469 22.835-16.179 51.712-12.493 76.8 7.885 54.682 49.152 98.714 103.117 110.080 7.987 1.741 25.702 3.482 29.491 2.97 1.126-0.205 5.734-0.614 10.24-0.922zM695.706 343.552c-2.56-1.331-5.018-3.584-6.349-6.042-2.15-3.789-2.253-5.018-2.253-34.714v-30.72l-28.365-0.102c-15.667 0-29.594 0-31.027 0-1.536-0.102-4.608-1.331-6.963-2.867-6.451-4.198-7.373-7.578-7.373-26.726 0-15.77 0.102-16.282 2.662-20.378 4.813-7.373 5.837-7.578 40.448-7.578l30.618-0.102v-30.72c0-29.696 0.102-30.925 2.253-34.714 1.434-2.56 3.789-4.71 6.554-6.144 3.994-1.843 5.939-2.048 21.197-1.741 15.872 0.307 16.896 0.41 20.378 2.867 6.758 4.608 6.963 5.734 6.963 39.834v30.618l30.618 0.102c16.794 0 31.642 0.512 33.075 1.024 3.072 1.126 8.806 7.475 9.626 10.752 0.307 1.331 0.41 9.728 0.205 18.739-0.307 15.462-0.41 16.589-2.867 20.070-4.608 6.758-6.246 6.963-40.243 7.066h-30.413v30.72c0 29.696-0.102 30.925-2.253 34.714-3.789 6.861-7.987 8.090-26.522 8.090-13.722 0-16.282-0.307-19.968-2.048zM209.818 522.854c-4.915-1.536-31.334-14.234-34.202-16.486-0.512-0.41-5.837-3.277-11.776-6.246-17.715-9.114-25.19-18.432-31.027-38.912-3.379-11.469-3.789-14.848-4.506-34.918-1.331-41.062 8.192-86.63 29.389-140.083 42.291-106.598 116.429-196.301 180.326-218.317 8.294-2.867 11.059-3.277 19.968-3.379h10.342l19.354 9.523c35.123 17.408 46.592 24.781 49.562 31.949 2.15 5.12 0.717 13.312-3.891 22.323-8.294 16.486-36.966 59.085-45.67 67.994-11.878 12.288-19.149 11.776-49.357-3.277-20.992-10.445-23.245-10.854-32.051-6.554-16.691 8.397-38.502 39.117-64.205 90.522-20.275 40.755-29.594 67.379-30.003 86.426-0.205 9.318 1.638 15.77 5.632 19.149 1.024 0.922 7.68 4.608 14.746 8.192 38.912 19.661 41.677 24.678 31.232 56.73-3.686 11.264-16.486 44.442-20.582 53.453-9.728 21.504-17.92 26.829-33.28 21.914z" />
+<glyph unicode="&#xe96c;" glyph-name="call_log" d="M486.298 882.79c-0.205-0.205-4.813-0.717-10.138-1.024-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.229 10.24 0.307 1.434 0.717 87.142 0.922 190.464 0.307 205.107 0.614 194.15-5.53 211.866-9.728 28.365-33.792 52.838-61.542 62.464-17.818 6.246 0.307 5.632-205.619 5.939-103.117 0.102-187.699 0.102-187.904-0.102zM672.973 689.459l-91.341-91.341-19.354 19.354c-22.221 22.118-24.166 24.986-24.166 35.84 0 5.939 0.512 7.987 2.765 11.776 1.536 2.56 19.354 21.197 39.629 41.472 20.378 20.275 36.966 37.171 36.966 37.683 0 0.41-7.782 8.602-17.408 18.227-9.523 9.523-17.408 17.613-17.408 17.818 0 0.307 40.858 0.512 90.829 0.512h90.829l-91.341-91.341zM821.35 723.763c17.92-18.125 20.275-20.89 21.914-25.805 2.355-7.066 1.638-14.95-1.946-20.89-1.331-2.355-19.149-20.89-39.424-41.165-20.378-20.275-36.966-37.171-36.966-37.581s8.090-8.806 18.022-18.739l17.92-17.92h-90.624c-49.971 0-90.726 0.307-90.726 0.614 0 0.819 180.429 181.658 181.248 181.658 0.307 0 9.626-9.114 20.582-20.173zM318.054 624.64c6.758-3.379 17.92-14.131 29.082-27.955 1.946-2.458 4.403-5.53 5.53-6.656 1.024-1.229 3.072-3.891 4.608-5.837 1.434-1.946 2.97-3.789 3.277-4.096 1.843-1.434 22.733-29.389 25.907-34.714 7.27-11.981 8.909-20.685 5.222-29.389-2.253-5.53-9.421-14.029-24.986-29.798-7.885-8.090-15.155-16.077-16.077-17.92-3.482-6.758-1.843-17.613 4.813-30.925 6.144-12.083 21.094-33.485 30.618-43.622 0.819-0.922 4.71-5.325 8.704-9.83 7.68-8.704 40.858-42.291 51.712-52.122 16.998-15.565 37.99-31.437 51.2-38.707 14.336-7.885 27.648-10.035 34.816-5.734 1.946 1.229 9.114 7.782 15.872 14.643 22.835 23.040 29.491 27.648 39.936 27.648 10.65 0.102 20.070-5.427 49.664-28.877 54.477-43.315 59.699-50.79 47.923-68.71-5.53-8.499-52.224-54.886-59.187-58.778-7.578-4.403-14.541-5.939-28.16-6.349-56.627-1.843-140.595 40.55-215.040 108.544-75.981 69.427-130.662 150.118-147.968 218.624-3.994 15.667-4.608 21.402-4.506 38.4 0.102 12.698 0.41 15.258 2.867 22.323 1.434 4.403 3.789 9.626 5.12 11.571 2.97 4.506 40.96 43.11 49.254 50.278 12.39 10.547 20.378 12.698 29.798 7.987z" />
+<glyph unicode="&#xe96d;" glyph-name="camera" d="M182.989 779.674c-13.517-3.174-25.088-14.95-28.365-28.774-0.512-2.458-1.024-13.926-1.024-25.6v-21.299h-76.8v-271.36c0-193.536 0.307-272.794 1.126-276.685 3.994-19.251 21.197-36.147 40.243-39.629 4.301-0.819 127.283-1.126 417.587-1.126h411.443v271.872c0 267.059 0 272.077-2.048 279.142-2.458 9.114-6.042 15.155-13.107 22.63-6.144 6.451-16.589 12.186-25.6 14.029-3.891 0.819-91.853 1.126-302.285 1.126h-296.96v21.299c0 28.672-1.638 34.509-12.39 45.056-4.915 4.71-10.65 7.782-17.51 9.421-5.427 1.229-88.883 1.229-94.31-0.102zM291.123 625.254c2.458-1.024 6.349-3.686 8.602-5.939 6.144-5.734 7.475-11.366 7.475-30.515s-1.331-24.371-7.578-30.618c-7.885-7.885-6.963-7.782-69.325-7.782-62.464 0.102-61.44 0-69.12 7.885-6.861 6.963-7.782 11.264-7.373 32.87 0.307 17.51 0.41 18.227 3.072 22.835 1.536 2.56 4.403 5.939 6.451 7.475 7.373 5.632 6.758 5.632 67.277 5.632 52.838 0.102 56.218 0 60.518-1.843zM575.283 599.962c86.938-11.366 155.136-80.384 165.888-167.834 1.434-11.674 0.717-41.267-1.229-53.146-6.656-40.346-25.293-76.493-54.374-105.472-27.238-27.034-60.518-44.749-99.123-52.429-23.552-4.71-54.682-4.198-78.029 1.126-63.898 14.848-115.405 59.904-138.035 120.832-11.878 31.949-14.848 69.427-8.294 103.936 4.506 23.142 14.643 47.923 27.955 67.994 2.56 3.789 5.427 8.090 6.349 9.421 2.15 3.277 17.715 20.992 20.582 23.45 1.331 1.024 5.837 5.018 10.24 8.704 16.998 14.746 38.502 26.931 60.723 34.611 26.931 9.216 59.29 12.493 87.347 8.806z" />
+<glyph unicode="&#xe96e;" glyph-name="Car_park" d="M213.402 830.464c-26.419-4.813-48.947-18.432-64.41-38.912-8.704-11.571-13.926-22.63-18.637-39.424-1.741-6.349-1.843-19.661-1.843-304.128v-297.472l2.765-9.933c9.523-34.509 35.021-61.235 68.915-71.987 4.403-1.331 11.366-2.97 15.565-3.584 5.12-0.717 102.912-1.024 296.653-1.024 318.054 0 297.267-0.41 316.006 6.246 4.813 1.638 11.981 4.915 15.872 7.27 24.064 14.131 40.141 34.816 48.23 62.259l2.97 9.728 0.307 292.352c0.307 218.522 0 294.502-0.819 301.056-5.12 37.274-28.979 67.891-63.59 81.818-3.174 1.229-9.216 3.277-13.312 4.506l-7.578 2.253-294.912 0.102c-236.749 0.205-296.346 0-302.182-1.126zM595.866 676.966c39.117-5.632 69.325-19.763 91.648-43.008 24.166-25.19 37.274-59.699 37.786-99.738 0.512-38.605-9.318-71.578-28.877-96.87-19.046-24.576-49.050-42.598-82.534-49.766-20.173-4.301-25.805-4.506-94.413-4.608h-59.699v-165.376h-101.376v460.902l116.531-0.41c64-0.307 118.477-0.717 120.934-1.126zM464.691 599.757l-4.915-0.307v-138.035l45.363 0.102c45.978 0.102 56.32 0.614 70.758 3.482 34.611 6.758 52.531 30.72 51.302 68.506-0.512 16.691-2.97 26.010-9.523 36.352-11.571 18.33-32.461 27.546-66.253 29.286-13.824 0.717-78.234 1.126-86.733 0.614z" />
+<glyph unicode="&#xe96f;" glyph-name="Car_pooling" d="M244.019 702.566c-7.168-1.741-15.974-6.349-21.606-11.366-3.686-3.174-157.594-207.258-164.147-217.6-0.922-1.434-2.765-5.325-4.096-8.704l-2.458-6.144-0.307-98.304c-0.205-107.52-0.512-102.4 5.734-115.2 3.482-7.373 14.438-18.33 21.811-21.914 9.421-4.506 14.95-5.53 32.358-5.734 8.806 0 16.179-0.205 16.282-0.307s0.41-3.891 0.819-8.397c2.355-30.413 13.926-56.934 34.099-78.336 18.022-19.149 38.707-31.232 64.512-37.581 9.626-2.355 13.21-2.662 27.955-2.765 18.637-0.102 27.341 1.331 43.213 6.656 40.55 13.824 72.397 49.152 82.125 91.238 2.355 10.035 3.584 18.842 3.686 26.214v3.277h230.4l0.102-4.301c0-4.301 0.205-5.53 1.434-15.155 2.253-16.896 9.83-36.147 20.685-52.531 6.758-10.24 24.474-27.648 35.123-34.611 22.938-14.848 43.315-20.89 70.656-20.89 34.816 0.102 63.283 11.366 88.064 34.918 24.166 23.040 39.322 56.627 39.834 88.269l0.102 4.301h28.16c16.486 0 30.31 0.512 33.485 1.126 19.558 4.096 35.942 20.787 39.731 40.346 0.819 4.403 1.024 30.208 0.819 90.112l-0.307 83.968-2.458 6.144c-7.987 19.968-23.347 31.334-46.694 34.611-3.277 0.512-27.648 5.12-35.328 6.758-2.56 0.614-17.306 3.379-32.768 6.246s-30.003 5.632-32.256 6.144c-2.253 0.512-6.656 1.434-9.83 1.946-5.939 1.024-7.68 2.458-22.426 18.534-1.843 1.946-6.554 7.066-10.65 11.264-10.957 11.674-35.738 37.99-38.912 41.472-1.638 1.741-9.216 9.728-16.896 17.92-7.782 8.192-15.36 16.282-16.896 17.92-1.536 1.741-6.144 6.554-10.138 10.752-9.421 10.035-19.149 20.275-38.605 40.96-38.707 41.062-37.274 39.731-45.158 43.93-12.083 6.554-1.843 6.246-191.386 6.144-134.554-0.102-173.67-0.307-177.869-1.331zM396.288 573.952v-74.752h-31.437l-4.506 4.198c-25.088 23.347-60.006 27.955-90.010 11.878-6.246-3.379-13.517-8.909-17.408-13.21l-2.458-2.867h-49.050c-26.931 0-48.845 0.41-48.64 0.819 0.205 0.512 25.19 34.202 55.603 74.752l55.194 73.933h132.71v-74.752zM597.504 637.85c5.632-6.042 11.162-11.878 12.186-13.107 1.126-1.126 5.734-6.042 10.24-10.854 9.318-9.83 18.125-19.149 39.014-41.472 7.885-8.397 18.022-19.251 22.63-24.064 4.506-4.813 11.878-12.595 16.384-17.408 4.403-4.71 11.162-11.878 14.95-15.872 3.686-3.891 8.499-9.011 10.547-11.264l3.686-4.096-116.838-0.512-2.765 2.867c-9.216 9.216-23.040 17.203-35.43 20.275-11.059 2.867-29.389 2.662-40.038-0.512-12.083-3.482-23.142-9.933-32.154-18.432l-4.301-4.198h-22.528v149.504h114.176l10.24-10.854zM300.032 613.478c-27.341-4.71-40.346-37.786-23.552-60.109 17.306-23.040 52.326-19.866 65.024 5.837 10.547 21.197-1.741 48.538-24.064 53.555-8.090 1.741-10.65 1.946-17.408 0.717zM545.792 613.683c-9.933-1.741-20.685-9.421-26.214-18.739-5.325-9.114-6.246-22.528-2.355-32.563 10.957-28.058 47.923-33.28 66.253-9.318 9.83 12.698 10.24 31.642 0.922 44.851-8.397 12.083-23.962 18.432-38.605 15.77z" />
+<glyph unicode="&#xe970;" glyph-name="Casting" d="M258.355 881.664c-10.65-2.97-19.149-10.342-24.269-20.992l-3.174-6.656-0.307-177.357-0.205-177.357-47.616-0.614-6.656-3.174c-8.090-3.891-14.541-10.035-18.739-18.33-2.867-5.632-3.174-7.066-3.277-15.872 0-8.499 0.307-10.445 2.765-15.667 5.018-10.752 12.493-17.613 23.040-21.094 6.042-2.048 8.499-2.15 52.429-2.15h46.080l148.275-148.275 27.238 27.136 27.136 27.238-46.899 47.002-47.002 46.899h111.616c61.338 0 111.514-0.205 111.514-0.512 0-0.205-78.131-78.643-173.67-174.080-164.045-164.147-173.773-174.080-176.845-180.531-2.867-6.144-3.277-7.885-3.277-16.077 0-7.885 0.41-10.035 2.765-15.155 1.536-3.277 4.096-7.475 5.53-9.216 11.366-13.517 29.901-17.613 45.875-10.138 6.042 2.867 20.89 17.408 207.565 204.083l201.114 201.114 121.856 1.024 6.656 3.174c17.715 8.499 26.624 28.57 20.582 46.387-3.789 10.957-9.728 17.613-20.582 22.938l-6.554 3.277-47.718 0.614-0.205 177.357-0.307 177.357-3.174 6.656c-3.994 8.499-10.342 14.848-18.842 18.842-5.939 2.867-7.68 3.174-15.872 3.174s-9.933-0.307-15.974-3.174c-8.397-3.994-14.541-10.24-18.739-18.842-2.765-5.939-3.174-7.885-3.482-17.613l-0.41-11.059h-409.088l-0.512 11.059c-0.41 9.626-0.819 11.878-3.584 17.715-7.987 16.998-27.238 25.907-45.056 20.89zM515.789 798.515c11.674-25.088 18.022-37.171 19.558-37.274 0.922 0 2.662-0.205 3.789-0.41s5.018-0.819 8.704-1.536c3.686-0.614 13.21-2.15 21.299-3.482s14.848-2.56 14.95-2.765c0.205-0.205-8.090-7.885-18.432-17.101s-18.842-17.306-18.842-17.92c0-0.717 2.765-12.083 6.042-25.293 3.379-13.21 5.837-24.269 5.632-24.474s-10.65 5.222-23.142 12.083l-22.835 12.493-6.144-3.072c-5.837-2.97-11.366-5.939-32.563-17.613-6.656-3.584-8.909-4.506-8.499-3.174 0.205 0.922 3.072 12.493 6.349 25.702l5.939 23.962-5.12 4.71c-7.578 6.963-19.456 17.51-26.726 23.757-5.12 4.403-6.042 5.632-4.608 6.144 0.922 0.307 12.493 2.355 25.6 4.506l23.859 3.994 6.963 14.336c3.789 7.987 8.499 17.818 10.342 21.914 1.946 3.994 3.789 7.373 4.096 7.373s2.048-3.072 3.789-6.861zM716.8 563.2v-64h-409.6v128h409.6v-64zM544.051 210.227l-26.726-26.726 80.486-80.486c44.339-44.339 82.227-81.715 84.173-83.251 1.946-1.434 6.554-3.686 10.24-4.915 18.022-6.144 38.093 2.765 46.49 20.48 2.867 5.939 3.174 7.68 3.174 15.872s-0.41 10.035-3.277 16.077c-3.072 6.554-8.397 12.083-84.685 88.371-44.749 44.749-81.715 81.408-82.227 81.408-0.41 0-12.902-12.083-27.648-26.829z" />
+<glyph unicode="&#xe971;" glyph-name="Categories" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM614.4 409.6v-89.6h-179.2v179.2h179.2v-89.6zM768 498.176c32.768-4.608 60.928-27.853 71.885-59.392 5.325-15.258 6.042-36.045 1.946-51.712-12.186-46.182-58.573-74.957-104.55-65.024-18.944 4.096-32.051 11.264-45.568 24.986-18.432 18.637-27.341 41.984-25.702 67.789 3.072 52.326 49.971 90.726 101.99 83.354zM283.238 496.435c0.614-1.024 2.662-4.608 4.506-7.987s3.686-6.554 4.096-7.168c0.41-0.512 1.946-3.072 3.277-5.632 2.662-4.71 23.45-41.267 64.922-113.664l23.757-41.472-51.098-0.307c-28.16-0.102-74.138-0.102-102.195 0l-51.098 0.307 5.632 9.728c3.072 5.325 6.963 12.083 8.499 14.848 1.638 2.867 8.806 15.462 16.077 28.16s26.317 45.978 42.291 74.035c15.974 27.955 29.389 50.893 29.696 50.893s1.024-0.819 1.638-1.741z" />
+<glyph unicode="&#xe972;" glyph-name="CD" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM367.923 795.955c4.403-10.854 11.776-28.57 39.014-94.31 14.438-34.816 26.214-63.59 26.112-64 0-0.41-5.427-3.379-12.083-6.554-20.582-10.035-36.25-21.197-53.555-38.4-7.475-7.373-10.24-9.626-11.264-8.806-2.048 1.536-66.15 50.688-69.222 53.043-32.973 24.781-70.349 54.272-70.349 55.296 0 1.741 17.408 21.299 27.955 31.334 30.72 29.286 59.494 49.664 95.437 67.379 19.968 9.933 22.733 11.264 24.166 11.264 0.717 0.102 2.355-2.765 3.789-6.246zM221.184 655.053c11.571-8.909 38.707-29.798 60.416-46.387 41.37-31.744 55.194-42.394 58.47-44.954 1.843-1.434 1.741-1.741-2.355-8.192-3.584-5.837-13.107-24.166-14.336-27.853-0.307-0.922-8.909 2.15-27.546 9.83-14.848 6.144-28.877 11.981-31.13 12.902-2.253 1.024-8.192 3.482-13.312 5.53-5.018 2.048-10.138 4.198-11.264 4.71s-7.066 2.97-13.312 5.53c-10.65 4.403-48.845 20.070-62.669 25.907-3.584 1.434-6.451 3.072-6.451 3.584 0 2.355 11.878 26.624 21.299 43.315 5.222 9.318 19.866 32.256 20.685 32.256 0.307 0 9.933-7.27 21.504-16.179zM542.208 598.63c30.822-6.758 55.706-20.070 77.312-41.267 17.715-17.408 30.618-38.093 38.4-61.645 5.222-15.872 6.963-26.624 7.168-45.158 0.41-25.907-4.403-48.435-15.155-70.042-4.096-8.090-13.21-23.347-14.95-24.678-0.307-0.307-2.458-2.765-4.71-5.632-23.347-29.286-60.826-49.766-99.84-54.682-12.186-1.536-36.762-0.614-48.64 1.946-62.054 13.005-109.261 61.030-120.934 122.88-2.15 11.366-2.662 36.864-0.922 48.64 9.318 65.126 57.958 116.736 121.958 129.536 13.722 2.662 14.848 2.765 33.69 2.56 12.288-0.205 18.944-0.819 26.624-2.458zM708.915 366.49c3.482-1.434 7.782-3.277 9.421-3.994 1.741-0.717 11.162-4.71 20.992-8.704 63.59-26.112 126.259-52.224 126.874-52.838 1.024-1.024-14.029-31.846-23.245-47.514-4.403-7.578-16.384-26.317-18.227-28.57-0.205-0.205-3.174 1.843-6.758 4.608-7.782 5.837-38.093 29.082-49.459 37.786-4.506 3.482-23.654 18.125-42.496 32.666-49.766 38.093-44.339 33.382-42.291 36.454 3.277 4.71 12.39 21.709 14.848 27.238 1.331 3.072 2.765 5.53 3.174 5.53s3.686-1.229 7.168-2.662zM670.413 310.477c1.536-1.331 6.758-5.427 11.571-9.114s30.822-23.654 57.856-44.339c27.034-20.787 53.35-40.96 58.368-44.851 5.12-3.789 9.421-7.475 9.523-7.987 0.819-2.15-27.853-32.256-43.315-45.67-29.286-25.19-62.362-46.285-96.051-61.133-4.915-2.253-9.114-3.789-9.421-3.584-0.205 0.307-6.656 15.667-14.438 34.202-7.68 18.637-20.787 50.176-29.082 70.144-25.498 61.645-25.19 60.723-23.552 61.235 4.301 1.434 24.064 11.981 31.232 16.691 12.493 8.090 20.48 14.541 32.256 26.112 5.939 5.837 11.059 10.65 11.469 10.65 0.307 0 1.946-1.024 3.584-2.355zM499.2 575.386c-18.022-2.355-30.72-6.144-44.954-13.312-21.094-10.65-38.195-26.214-50.483-45.978-13.21-21.402-19.046-41.37-19.149-66.048-0.102-16.794 0.614-23.347 3.994-35.635 5.939-21.914 16.384-39.731 33.28-56.525 17.92-18.022 40.55-30.515 62.464-34.714 3.686-0.717 8.704-1.741 11.264-2.253 7.987-1.536 33.178-0.41 44.032 2.15 33.894 7.68 63.488 28.774 81.101 57.856 8.397 13.824 13.722 26.726 16.077 39.424 0.717 3.686 1.741 8.704 2.15 11.264 1.434 7.373 0.512 32.256-1.434 41.472-5.325 24.474-15.872 44.851-32.154 62.157-18.33 19.354-40.858 32.256-66.253 37.786-8.806 1.946-32.563 3.379-39.936 2.355zM530.125 495.718c35.738-14.029 44.339-59.699 16.077-85.606-16.794-15.258-42.598-17.51-61.85-5.12-9.114 5.837-16.384 15.053-20.787 26.419-1.843 4.915-2.253 7.68-2.15 17.101 0.102 9.523 0.512 12.288 2.765 17.715 6.451 15.77 19.661 27.443 35.84 31.539 7.885 2.048 22.221 1.126 30.106-2.048z" />
+<glyph unicode="&#xe973;" glyph-name="change_wallpaper" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 3.891-0.819 66.15-1.126 215.552-1.126 182.886 0 210.944 0.205 216.064 1.536 19.354 5.018 34.509 20.48 38.502 39.219 0.819 3.789 1.126 34.918 1.126 102.093v96.666l-24.371 24.371c-13.517 13.414-25.088 24.883-25.907 25.6-1.229 1.024-1.434-7.578-1.229-59.699 0.102-33.485-0.102-60.826-0.41-60.826s-32.051 31.539-70.656 70.042l-70.144 70.144-7.168-7.27-7.168-7.373 77.722-77.517 77.619-77.619 0.205-18.432 0.102-18.534h-88.269l-90.726 91.136v36.864h-37.069l-116.531 116.736v36.864h-36.557l-20.173 19.866-20.070 19.968v124.928l114.586-114.586c62.976-63.078 114.893-114.688 115.2-114.688s0.614 6.144 0.614 13.722v13.824l-230.4 230.4 0.205 62.259 0.307 62.157 12.595-12.698 12.493-12.698v-36.454h36.352l58.675-58.368 58.573-58.47v-36.762h51.2v51.2h-36.864l-116.736 116.736v36.864h-36.557l-40.243 39.834v62.566h61.952l188.826-188.826 7.27 3.789c4.096 2.048 8.192 3.789 9.216 3.789 1.126 0 2.15 0.41 2.458 0.922 0.307 0.41-39.731 41.267-88.986 90.624l-89.6 89.702h124.416l117.248-117.043v-36.557h36.352l25.6-25.6h66.048v105.267c0 114.79 0.205 110.285-5.939 122.88-3.584 7.475-14.336 18.33-21.709 21.914-13.21 6.349 2.355 5.939-228.966 5.837-164.966-0.102-211.968-0.307-216.166-1.331zM555.93 856.166c8.602-4.506 9.114-17.101 0.922-22.118-3.277-2.048-4.71-2.048-46.080-1.843l-42.803 0.307-3.174 3.277c-2.56 2.458-3.379 4.301-3.686 8.192-0.512 4.403-0.205 5.427 2.355 8.397 1.536 1.843 3.789 3.789 4.915 4.198 1.229 0.512 20.685 0.922 43.418 0.922 34.099 0.102 41.779-0.205 44.134-1.331zM716.8 724.48c0-45.056-0.205-81.92-0.512-81.92-0.205 0-5.939 5.53-12.8 12.288l-12.288 12.288v36.864h-37.376l-51.098 51.2-50.995 51.2h165.069v-81.92zM320.41 394.547l12.39-12.595v-36.352h36.352l117.248-116.941v-36.659h36.352l76.8-76.8h-124.518l-167.834 167.834v62.054c0 34.099 0.205 61.952 0.41 61.952s6.042-5.632 12.8-12.493zM377.139 184.218c37.274-37.478 67.994-68.301 68.198-68.608 0.205-0.205-30.72-0.41-68.813-0.41h-69.325v69.222c0 47.206 0.307 68.915 1.024 68.506 0.614-0.41 31.642-31.334 68.915-68.71zM521.728 87.142c6.861-3.174 11.162-7.68 13.619-14.234 3.994-10.547 0.512-22.835-8.397-29.184-5.734-4.096-9.626-5.222-16.794-4.915-14.234 0.614-24.781 12.8-23.45 27.238 1.536 17.715 19.354 28.467 35.021 21.094zM580.198 600.064c-5.939-2.048-11.059-6.758-14.234-12.902l-2.765-5.53 0.205-117.658 0.307-117.658 36.352 36.454 36.352 36.557 71.373-70.963c39.219-38.912 73.83-74.035 76.902-78.029 34.202-43.827 46.285-100.454 32.973-154.726-2.56-10.24-8.704-27.136-12.698-35.123-1.229-2.253-2.15-4.608-2.15-5.12 0-1.434 2.97-4.198 4.506-4.198 1.126 0 51.917 50.381 61.338 60.928 51.814 57.856 66.048 141.005 36.659 213.811-4.096 10.138-7.27 16.486-13.722 27.341-12.083 20.378-16.998 25.805-83.046 91.341l-63.59 63.283 36.147 36.045c19.763 19.866 36.352 36.454 36.762 36.966 0.307 0.41-52.122 0.717-116.531 0.717-96.973-0.102-117.862-0.307-121.139-1.536z" />
+<glyph unicode="&#xe974;" glyph-name="Change_wallpaper_1" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.994 19.149-20.48 35.635-39.629 39.629-8.294 1.741-424.755 1.434-432.026-0.307zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM543.13 632.73l173.67-173.67v-61.85c0-33.997-0.205-61.85-0.41-61.85-0.307 0-6.042 5.632-12.8 12.493l-12.39 12.39v36.557h-36.557l-117.043 116.941v36.659h-36.659l-116.941 117.043v36.557h-36.659l-20.070 20.070-20.070 20.173v62.157h62.157l173.773-173.67zM581.53 747.93l58.47-58.573v-36.557h36.557l40.243-40.243v-61.747c0-33.997-0.205-61.85-0.41-61.85-0.307 0-314.163 313.754-316.109 316.006-1.024 1.229 8.499 1.434 60.723 1.434h61.952l58.573-58.47zM716.8 724.48c0-45.056-0.205-81.92-0.41-81.92-0.307 0-6.042 5.632-12.8 12.493l-12.39 12.39v36.557h-36.557l-49.664 49.562c-27.238 27.341-50.176 50.381-50.893 51.2-1.229 1.536 6.349 1.638 80.691 1.638h82.022v-81.92zM320.41 701.85l12.39-12.493v-36.557h36.557l58.573-58.47 58.47-58.573v-36.557h36.557l117.043-117.043v-36.557h36.557l20.070-20.070 20.173-20.070v-124.006l-2.15 1.946c-1.229 1.024-93.389 93.082-204.8 204.595l-202.65 202.65v61.747c0 33.997 0.205 61.85 0.41 61.85s5.939-5.632 12.8-12.39zM716.8 133.53v-18.33h-87.757l-45.773 45.67-45.67 45.67v36.659h-36.659l-116.941 117.043v36.557h-36.557l-20.173 20.070-20.070 20.070v124.518l409.6-409.702v-18.227zM332.8 363.93v-18.33h36.557l58.573-58.47 58.47-58.573v-36.557h36.557l35.738-35.738c19.661-19.661 36.864-36.966 38.195-38.4l2.458-2.662h-123.904l-84.173 84.070-84.070 84.173v124.416l12.8-12.902 12.8-12.8v-18.227zM375.501 185.856c37.171-37.171 68.198-68.198 68.915-69.12 1.126-1.331-5.939-1.536-67.994-1.536h-69.222v69.12c0 37.99 0.205 69.12 0.41 69.12s30.72-30.413 67.891-67.584zM524.698 86.118c8.806-5.12 13.517-14.336 12.493-24.474-1.229-12.698-10.138-21.504-23.040-22.938-17.818-1.843-32.256 16.384-26.214 33.382 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.070-2.56z" />
+<glyph unicode="&#xe975;" glyph-name="charger" d="M386.355 881.664c-12.698-3.482-23.040-13.926-26.419-26.726-1.331-5.12-1.536-19.763-1.536-104.038v-98.099h-27.546c-29.798 0-32.563-0.41-39.629-5.734-1.946-1.536-4.813-4.915-6.349-7.475l-2.765-4.71-0.205-114.176c-0.102-119.501 0-123.085 4.403-144.896 14.029-69.018 60.621-129.024 124.723-160.358 13.107-6.451 36.864-15.155 45.978-16.794l3.789-0.717v-185.139h102.4v185.139l3.891 0.717c4.198 0.717 24.064 7.066 30.413 9.626 15.77 6.451 37.478 18.432 49.971 27.648 23.45 17.306 44.339 39.834 60.006 64.512 15.36 24.166 29.082 61.338 32.358 87.654 0.41 2.867 0.922 6.246 1.331 7.68 0.307 1.434 0.717 55.296 0.922 119.808l0.307 117.248-2.867 5.632c-3.174 6.246-9.421 11.571-15.36 13.312-2.15 0.512-15.462 1.024-31.13 1.024h-27.341l-0.307 101.171-0.307 101.069-3.277 6.144c-5.632 10.65-12.186 16.384-22.528 19.866-14.438 4.915-30.003 0.819-40.55-10.65-1.638-1.638-4.403-6.042-6.144-9.728l-3.277-6.656-0.307-100.557-0.205-100.659h-153.6l-0.205 100.659-0.307 100.557-3.277 6.861c-8.192 17.306-26.419 25.805-45.056 20.787zM562.074 571.699c-0.512-1.843-6.042-21.094-12.288-42.803-6.144-21.709-11.878-41.677-12.8-44.544-0.819-2.765-3.482-11.981-5.837-20.48l-4.403-15.36 43.315-0.307c23.859-0.102 43.315-0.512 43.315-0.819 0-0.512-15.974-19.251-42.906-50.586-5.12-5.939-42.701-49.869-46.592-54.272-1.843-2.253-15.565-18.227-22.733-26.624-1.229-1.434-9.933-11.571-19.354-22.528s-17.92-20.787-18.944-21.811c-1.229-1.434 1.024 7.987 7.885 31.744 5.325 18.432 10.752 37.786 12.186 42.803 1.331 5.12 5.12 18.432 8.397 29.696l5.939 20.48-43.827 0.307-43.827 0.205 22.118 25.907c12.186 14.131 23.347 27.238 24.883 28.877 1.434 1.741 25.907 30.106 54.272 63.283 28.365 33.075 51.712 60.109 51.814 60.109 0.205 0-0.102-1.536-0.614-3.277z" />
+<glyph unicode="&#xe976;" glyph-name="check_your_balance" d="M489.37 882.79c-0.205-0.205-5.632-0.614-11.981-1.024s-12.083-0.922-12.8-1.126c-0.717-0.205-3.789-0.614-6.861-1.024-16.691-1.741-44.749-7.373-62.464-12.39-83.046-23.654-155.648-69.837-212.378-135.066-15.258-17.613-37.683-49.050-46.694-65.536-1.843-3.379-3.686-6.554-4.096-7.168-0.512-0.512-4.506-8.397-9.011-17.408-65.434-131.072-60.416-286.618 13.312-412.979 26.214-44.851 63.488-88.269 103.014-119.808 12.493-9.933 48.128-35.021 49.766-35.021 0.205 0 4.403-2.355 9.421-5.222 27.034-15.565 59.699-29.286 92.365-38.81 18.227-5.325 44.954-11.264 57.549-12.698 2.56-0.307 6.451-0.819 8.806-1.126 15.77-2.355 33.28-3.277 58.778-3.072 15.462 0.205 30.515 0.614 33.28 0.922 2.867 0.307 6.963 0.819 9.216 1.126 2.253 0.205 6.861 0.717 10.24 1.126 22.63 2.355 57.651 10.547 84.48 19.763 63.078 21.504 118.989 56.422 166.4 103.936 55.501 55.603 93.594 121.549 113.664 196.71 6.554 24.474 10.138 45.978 13.414 80.384 0.819 8.602 0.819 52.838 0 61.44-0.41 3.686-0.922 9.011-1.229 11.776-0.41 5.222-2.97 24.678-3.994 31.232-5.12 32.051-20.48 81.51-33.792 108.544-1.536 3.072-4.198 8.602-5.939 12.288-25.907 53.555-70.554 108.134-120.627 147.763-46.592 36.762-101.888 64-160.154 79.053-22.221 5.734-40.243 8.909-70.656 12.39-5.53 0.614-60.416 1.536-61.030 1.024zM546.304 805.069c1.126-0.307 4.813-0.819 8.192-1.126 5.222-0.614 16.896-2.355 28.672-4.403 6.656-1.126 34.406-8.602 44.032-11.878 68.915-23.45 129.638-67.686 173.158-126.259 4.813-6.451 8.499-12.083 8.192-12.595s-4.608-3.174-9.523-6.042c-5.018-2.765-16.384-9.318-25.395-14.541-23.654-13.722-30.106-17.408-30.515-17.408-0.205 0-4.71 5.427-10.035 11.981-9.728 12.186-25.19 28.467-36.147 37.99-6.451 5.632-7.782 6.246-7.782 3.789 0-0.819-1.126-4.813-2.458-8.909-1.434-4.096-8.294-25.702-15.462-47.923-7.066-22.221-15.155-47.309-17.92-55.808-2.765-8.397-7.782-24.371-11.264-35.328-3.584-10.957-7.885-24.576-9.728-30.208-3.994-12.083-16.077-49.766-19.661-61.44-7.68-24.883-17.306-40.55-33.792-54.784-35.021-30.106-86.938-32.563-125.030-5.939-27.238 19.149-43.213 49.766-43.418 83.251 0 17.203 3.072 30.925 10.445 45.773 6.246 12.493 9.83 17.306 27.546 36.147 6.349 6.861 26.010 28.16 28.262 30.72 0.614 0.614 3.994 4.301 7.68 8.294 9.626 10.342 16.384 17.613 30.618 33.178 7.066 7.578 15.36 16.589 18.432 19.968 4.915 5.222 13.005 13.926 47.206 51.098 2.56 2.765 5.12 5.53 5.734 6.144 12.595 13.414 28.058 30.618 28.058 31.232 0 1.946-30.925 10.957-50.688 14.848-29.594 5.939-73.523 5.734-104.448-0.307-68.506-13.414-129.126-51.2-171.622-107.11-36.454-47.821-56.525-107.827-56.525-168.96-0.102-12.083 1.024-31.334 1.946-34.918 0.614-2.56 2.56-1.331-44.134-28.365-14.029-8.192-25.907-14.643-26.317-14.234-0.717 0.819-5.53 29.184-6.451 38.093-1.331 12.902-1.741 21.811-1.843 36.864-0.102 14.336 1.024 39.629 1.843 40.96 0.102 0.307 0.512 3.277 0.922 6.656 3.686 35.123 16.077 76.288 33.894 112.64 41.574 84.582 115.507 149.709 205.21 180.838 10.342 3.584 33.997 10.24 41.165 11.571 1.331 0.205 6.349 1.126 11.162 2.048 12.083 2.253 21.402 3.482 32.768 4.301 5.325 0.307 9.933 0.819 10.138 1.024 0.512 0.512 52.429-0.41 54.886-0.922zM841.011 591.36c22.733-52.224 32.666-108.851 29.082-166.605-0.614-10.138-1.331-16.486-3.277-31.027-1.229-8.397-3.891-22.118-4.506-22.733-0.307-0.307-4.096 1.434-8.294 3.891-4.198 2.56-8.602 5.018-9.728 5.53-1.126 0.614-13.312 7.578-27.136 15.667-24.166 14.131-25.088 14.746-24.883 17.715 0.102 1.638 0.512 6.861 0.819 11.674 2.97 38.605-1.536 75.878-13.619 112.128-2.253 6.758-5.53 15.462-7.27 19.251-1.741 3.891-3.174 7.68-3.174 8.499 0 0.717 1.741 2.253 3.891 3.379 2.048 1.126 16.896 9.626 32.973 18.944 15.974 9.216 29.184 16.794 29.389 16.691 0.102-0.102 2.662-5.939 5.734-13.005zM681.472 744.141c-4.915-5.427-12.083-13.21-15.77-17.203-3.686-3.891-8.806-9.421-11.366-12.288-2.56-2.765-7.885-8.499-11.776-12.698-6.042-6.554-26.419-28.57-29.696-32.154-3.174-3.482-39.014-42.291-39.936-43.213-0.512-0.614-5.12-5.632-10.24-11.162-5.018-5.53-10.854-11.674-12.8-13.824-2.867-3.072-10.854-11.776-23.040-24.986-4.608-5.12-26.726-28.979-31.232-33.792-3.072-3.277-6.042-6.554-6.656-7.168-2.253-2.56-24.986-27.136-30.003-32.461-20.275-21.504-27.443-47.002-20.787-73.728 11.878-47.514 64.41-71.782 108.134-50.074 10.342 5.12 18.33 11.366 25.6 20.173 9.114 10.957 10.547 14.643 28.877 72.499 1.946 6.246 4.403 13.824 5.427 16.896 1.843 5.632 5.53 16.998 19.763 61.44 4.301 13.21 11.674 36.25 16.486 51.2 4.71 14.95 12.39 38.912 16.998 53.248s10.854 33.69 13.824 43.008c12.083 37.274 17.92 55.706 17.613 56.013-0.205 0.102-4.403-4.198-9.421-9.728z" />
+<glyph unicode="&#xe977;" glyph-name="Child" d="M494.080 856.474c-25.088-4.301-41.677-10.65-59.904-22.938-18.534-12.493-33.792-28.877-44.339-47.616l-2.56-4.608-15.77-0.614c-18.022-0.819-30.413-3.584-43.008-9.523-27.955-13.414-46.899-35.942-55.706-66.56-2.662-9.011-2.765-10.24-3.174-43.52l-0.512-34.202 7.475 0.614c18.534 1.536 34.714 7.168 50.586 17.613 7.68 5.12 21.299 18.637 26.214 26.112 8.909 13.414 15.36 29.696 16.896 42.496 0.922 7.475 1.434 6.963 1.536-1.331 0.102-4.096 0.205-7.68 0.307-8.090 0.102-0.512 0.614-3.584 1.024-6.963 7.578-57.754 52.326-105.677 110.694-118.374 10.854-2.355 36.147-3.379 47.104-1.843 31.027 4.301 58.778 18.227 80.896 40.346 22.016 22.118 36.762 51.405 39.936 79.77 0.41 3.379 0.922 6.861 1.024 7.68 0.205 0.922 0.41 4.608 0.512 8.294l0.205 6.656 1.331-7.27c3.891-21.606 12.698-39.014 27.546-54.067 18.33-18.739 39.834-28.877 65.946-31.027l7.578-0.614-0.41 33.69c-0.41 32.358-0.512 34.099-3.072 43.622-6.554 24.371-22.221 46.080-42.906 59.494-11.878 7.68-22.426 12.083-38.298 15.77-1.126 0.205-9.011 0.717-17.613 1.024l-15.462 0.614-5.939 9.523c-20.685 33.485-57.446 58.778-93.594 64.41-2.56 0.41-5.53 1.024-6.656 1.229-3.686 0.922-32.666 1.126-37.888 0.205zM372.429 727.347c-0.307-0.819-0.614-0.512-0.614 0.614-0.102 1.126 0.205 1.741 0.512 1.331 0.307-0.307 0.41-1.229 0.102-1.946zM378.061 579.174c-14.541-8.704-21.914-14.541-34.611-27.136-22.221-22.323-35.84-46.592-44.032-78.438-3.994-15.872-4.301-23.142-4.096-83.456 0.205-64.922 0-62.771 7.475-78.131 5.632-11.674 14.848-22.528 24.371-28.774 2.253-1.434 4.301-2.867 4.608-3.174 3.584-3.584 19.354-9.011 30.515-10.445l9.421-1.229v-104.755c0-71.578 0.307-106.394 1.126-110.080 3.789-18.637 18.944-34.202 38.093-39.322 7.066-1.843 192.922-2.15 201.626-0.307 18.637 3.994 35.84 20.787 39.322 38.298 0.512 2.253 0.922 4.403 1.024 4.915 0.102 0.41 0.205 48.23 0.307 106.189l0.102 105.472h3.891c2.048 0 7.782 0.922 12.595 2.048 29.389 6.451 52.224 29.389 58.675 58.88 2.355 10.957 1.741 122.061-0.819 134.656-9.728 48.947-37.478 88.883-79.155 113.869-5.427 3.277-10.342 5.939-10.854 5.939s-3.994-2.662-7.782-6.042c-23.040-20.275-57.446-36.045-89.805-41.165-9.728-1.434-38.093-2.048-48.026-0.819-34.611 4.096-67.584 18.022-94.72 40.141-4.198 3.482-7.782 6.656-7.987 7.066-0.717 1.638-3.174 0.717-11.264-4.198z" />
+<glyph unicode="&#xe978;" glyph-name="child_protection" d="M487.424 895.488c-11.366-1.638-27.443-5.734-34.816-8.806-1.946-0.819-9.114-4.301-15.872-7.578-50.074-24.576-84.685-73.933-91.546-130.56-1.126-9.626-0.614-35.021 0.922-44.544 5.939-36.659 22.63-68.915 49.254-94.925 9.421-9.114 13.414-12.288 24.781-19.866 17.818-11.776 41.165-21.094 62.669-25.088 12.595-2.355 42.086-2.765 54.272-0.819 38.4 6.246 70.963 23.142 96.973 50.176 29.594 30.925 45.568 69.53 46.387 112.026 0.717 34.406-7.066 63.386-24.474 91.648-23.347 38.093-60.416 65.024-104.038 75.571-20.89 5.12-42.496 6.042-64.512 2.765zM372.736 571.699c-20.070-12.288-33.382-22.835-47.104-37.274-23.962-25.293-40.346-54.579-49.152-87.859-6.963-26.419-6.656-20.89-6.656-127.59 0-107.725-0.102-106.086 7.168-134.758 21.504-84.48 87.245-151.142 171.52-174.080 23.962-6.451 37.786-8.090 67.072-7.987 20.173 0 29.286 1.024 49.050 5.12 44.134 9.114 86.733 32.461 119.91 65.741 33.178 33.178 55.398 73.728 65.434 119.194 5.427 24.269 5.632 29.389 5.427 130.867l-0.307 93.696-2.662 13.824c-11.674 58.47-44.544 106.394-94.822 137.933-4.813 2.97-9.114 5.427-9.728 5.427-0.512 0-3.891-2.355-7.373-5.12-35.635-28.365-80.282-44.032-125.952-44.339-17.818-0.102-22.016 0.205-37.888 2.97-32.563 5.53-65.536 20.378-92.262 41.472-3.482 2.765-6.758 5.018-7.168 5.018-0.512 0-2.56-1.024-4.506-2.253zM478.618 448c22.221-5.632 40.038-22.528 47.309-44.646 5.222-15.872 3.686-35.328-3.789-50.074-14.234-28.058-46.080-42.906-75.878-35.328-54.579 13.722-69.427 83.763-24.986 118.272 16.179 12.493 37.478 16.896 57.344 11.776zM526.95 310.682c16.998-11.776 28.877-28.877 34.918-50.074 1.638-6.042 1.843-11.059 1.843-52.224v-45.568l-2.765-9.933c-5.222-18.637-13.21-32.461-26.317-45.875-39.219-39.731-103.731-39.936-142.848-0.205-12.8 13.005-20.685 26.419-25.702 43.827-3.584 12.288-4.096 20.992-3.994 62.874 0.205 39.629 0.614 44.032 6.349 58.573 5.632 14.541 18.022 30.106 30.618 38.502l5.427 3.584 6.963-4.71c16.077-11.059 30.106-15.36 50.381-15.462 13.926 0 19.968 1.024 31.744 5.325 7.373 2.662 23.552 12.083 25.19 14.643 0.922 1.536 1.843 1.126 8.192-3.277z" />
+<glyph unicode="&#xe979;" glyph-name="Children_channel" d="M215.962 780.39c-0.205-0.205-2.765-0.614-5.734-1.024-15.565-1.843-33.075-7.27-48.64-15.053-42.598-21.402-71.885-59.904-81.92-107.622-3.277-15.872-3.174-46.387 0.307-61.133 9.83-41.472 32.154-74.035 65.946-96.563 7.782-5.12 25.293-14.131 31.437-16.077 3.584-1.229 3.686-1.331 3.072-5.018-0.922-5.325-0.922-51.302 0.102-60.621 7.373-70.758 34.202-133.939 79.155-186.47 4.096-4.71 29.696-30.515 34.406-34.509 48.742-41.882 110.592-69.837 172.851-77.926 4.813-0.717 10.342-1.434 12.288-1.741 6.861-1.024 50.79-1.229 61.44-0.307 60.621 5.222 121.446 28.365 169.779 64.717 16.589 12.39 21.709 16.896 37.581 32.87 54.989 55.296 87.552 124.621 95.232 202.854 1.331 13.926 1.434 56.013 0.102 62.054-0.512 2.458-0.205 2.867 4.301 4.506 2.662 1.024 8.806 3.789 13.722 6.246 44.032 21.709 74.957 62.874 83.354 111.002 2.048 11.264 2.662 36.659 1.229 46.797-9.318 63.898-55.398 114.893-117.043 129.126-13.312 3.174-15.77 3.379-32.768 3.789-25.702 0.614-47.718-4.198-70.451-15.462-14.746-7.373-28.877-17.306-40.038-28.262l-2.867-2.97-4.301 2.56c-39.424 23.040-86.118 38.093-133.222 42.906-21.402 2.253-55.091 1.843-75.264-0.819-9.83-1.331-12.083-1.741-22.528-3.789-34.816-6.861-73.523-21.402-102.502-38.605l-3.584-2.15-4.608 4.198c-30.618 28.262-65.946 42.496-106.496 42.701-7.68 0.102-14.131 0-14.336-0.205zM402.33 597.914c43.725-17.715 43.622-77.926-0.205-95.334-18.33-7.168-39.629-2.56-54.067 11.878-9.83 9.933-15.258 22.528-15.258 35.942 0 22.938 16.589 44.032 39.219 49.766 8.192 2.15 22.221 1.126 30.31-2.253zM656.691 598.733c20.48-7.373 34.509-27.034 34.509-48.333 0-13.517-5.325-26.010-15.462-36.147-10.752-10.752-23.859-15.77-38.707-14.746-42.803 2.867-63.488 52.941-35.021 84.89 10.342 11.469 23.962 17.306 39.526 16.794 6.144-0.205 11.162-1.024 15.155-2.458zM571.904 423.731c14.95-8.294 20.89-25.498 13.824-40.038-2.355-4.915-52.429-55.808-58.266-59.085l-3.379-2.048 0.512-13.824c0.819-20.89 5.939-33.69 18.534-46.080 11.366-11.162 24.371-16.998 40.141-18.125 16.589-1.126 31.539 3.891 45.466 15.258 5.939 4.813 7.168 5.427 11.469 5.427 4.096 0 5.427-0.512 8.090-3.174 3.994-3.994 5.018-10.138 2.458-14.336-0.922-1.638-4.301-5.018-7.27-7.578-30.31-24.986-72.602-27.238-104.96-5.427-7.475 4.915-21.402 18.842-24.064 23.962-0.819 1.638-1.843 2.97-2.253 2.97s-2.56-2.56-4.813-5.734c-12.902-17.92-33.382-30.925-55.808-35.123-7.68-1.434-28.877-0.614-36.25 1.331-14.541 3.994-29.491 12.288-38.707 21.606-6.144 6.144-6.349 13.107-0.717 18.534 2.56 2.458 3.994 2.97 7.885 2.97 4.301 0 5.53-0.614 11.469-5.427 26.214-21.402 61.747-20.378 85.094 2.355 13.619 13.21 19.354 28.16 19.354 50.176 0 9.83-0.205 10.65-2.048 11.264-3.482 1.126-56.934 54.989-59.494 60.006-1.946 3.584-2.355 6.144-2.355 12.698 0 11.162 3.277 17.92 11.776 24.371 7.68 5.734 6.963 5.734 65.946 5.53 54.067-0.205 54.272-0.205 58.368-2.458z" />
+<glyph unicode="&#xe97a;" glyph-name="cineday_silhouette" d="M781.005 798.618c-0.102-0.102-3.072-0.41-6.451-0.717-8.090-0.819-13.722-2.15-46.592-10.957-14.848-3.994-39.731-10.65-55.194-14.746-15.462-4.198-29.286-7.885-30.72-8.192-29.082-7.987-78.029-21.094-91.648-24.678-5.018-1.331-27.443-7.27-49.664-13.312-36.864-9.933-49.152-13.21-93.696-25.088-11.776-3.174-47.514-12.698-88.576-23.757-4.198-1.126-12.493-3.379-18.432-4.915-5.939-1.638-14.234-3.789-18.432-4.915-4.198-1.229-12.083-3.277-17.408-4.71s-12.288-3.277-15.36-4.096c-39.424-10.547-88.474-23.757-95.744-25.702-20.582-5.427-36.864-9.933-37.069-10.138-0.102-0.102 1.536-6.861 3.686-15.053 2.253-8.090 5.53-20.275 7.27-27.034 1.843-6.758 4.403-16.179 5.632-20.992 1.331-4.813 3.789-14.029 5.53-20.582l3.174-11.776 0.307-188.928c0.205-176.538 0.41-189.235 2.048-194.97 6.554-22.426 14.234-35.738 28.774-50.176 12.39-12.288 27.238-20.787 45.363-25.805l10.035-2.867 681.472-0.512v460.8l-664.064 0.102 58.88 15.872c32.358 8.704 78.029 20.89 101.376 27.136s46.387 12.493 51.2 13.722c17.92 4.915 54.17 14.643 123.904 33.28 21.094 5.632 46.899 12.595 57.344 15.36s24.064 6.451 30.208 8.090c6.246 1.638 28.774 7.68 50.176 13.414s41.267 11.059 44.032 11.776c6.349 1.741 19.661 5.325 27.136 7.27 7.373 2.048 27.955 7.578 43.52 11.674 6.758 1.741 16.179 4.301 20.992 5.632 7.475 2.048 17.203 4.71 32.973 8.806l3.686 0.922-2.458 9.523c-6.861 25.19-10.445 34.304-18.33 46.182-15.053 22.733-42.291 39.936-68.608 43.52-7.782 1.024-19.763 1.946-20.275 1.536zM795.75 771.994c3.072-2.56 7.168-6.246 9.114-7.987 1.946-1.843 13.312-11.776 25.088-22.016 11.878-10.342 23.245-20.48 25.293-22.426l3.891-3.686-10.547-2.765c-5.734-1.434-15.77-4.096-22.221-5.837-18.022-4.813-49.766-13.414-58.163-15.667l-7.475-2.048-2.867 2.355c-2.765 2.253-32.154 27.955-40.038 35.021-1.946 1.741-8.806 7.782-15.258 13.414-11.366 10.035-11.571 10.24-8.704 10.957 7.168 1.741 51.61 13.619 56.73 15.155 9.83 2.867 36.557 10.035 37.99 10.138 0.819 0 4.096-2.048 7.168-4.608zM611.328 707.072c39.936-34.918 49.152-43.11 49.152-43.827 0-0.41-2.662-1.331-5.837-2.15-3.277-0.717-8.909-2.15-12.595-3.174-6.246-1.741-26.112-7.066-60.826-16.384-8.499-2.253-16.077-4.301-16.998-4.608s-4.506 2.048-9.216 6.246c-4.198 3.686-16.691 14.643-27.648 24.269s-20.173 17.818-20.48 18.125c-0.307 0.307-3.379 3.072-6.963 6.042-3.482 3.072-6.246 5.632-6.042 5.837 0.102 0.102 15.872 4.403 35.021 9.523 45.773 12.288 53.453 14.336 58.368 15.872 2.867 0.922 4.506 0.922 5.632 0.205 0.819-0.614 9.114-7.782 18.432-15.974zM403.558 662.938c10.957-9.83 48.435-42.598 54.784-48.026l5.427-4.608-4.301-1.331c-2.355-0.717-10.24-2.867-17.613-4.813-7.27-1.843-16.794-4.403-20.992-5.53s-18.534-5.018-31.846-8.602l-24.269-6.451-7.987 7.066c-9.421 8.294-10.035 8.806-27.546 24.166-7.27 6.451-16.486 14.438-20.48 17.92-3.891 3.482-8.499 7.475-10.138 8.909-2.867 2.458-2.867 2.765-1.024 3.277 1.024 0.41 21.811 5.939 45.978 12.493 24.269 6.451 45.466 12.186 47.104 12.595 3.789 1.126 3.686 1.126 12.902-7.066zM200.909 614.195c2.458-2.15 4.608-4.096 4.915-4.403s5.53-4.915 11.674-10.24c6.144-5.325 12.8-11.264 14.848-13.005 2.048-1.843 10.24-9.011 18.227-15.872 7.987-6.963 14.541-12.902 14.541-13.21 0.102-0.307-3.891-1.638-8.806-2.867-5.018-1.229-10.138-2.662-11.571-3.174-2.97-1.024-76.186-20.48-77.005-20.48-0.717 0-3.584 9.626-7.987 26.624-1.741 7.066-3.584 13.926-4.096 15.36-2.97 8.806-8.294 31.027-7.578 31.642 0.512 0.512 7.578 2.56 15.77 4.71s18.534 4.915 23.040 6.246c4.506 1.229 8.499 2.355 8.909 2.355 0.512 0.102 2.765-1.638 5.12-3.686zM243.712 460.8l-25.6-38.4h-51.2v76.8h102.4l-25.6-38.4zM448.512 460.8l-25.6-38.4h-102.4l51.2 76.8h102.4l-25.6-38.4zM653.312 460.8l-25.6-38.4h-102.4l51.2 76.8h102.4l-25.6-38.4zM858.112 460.8l-25.6-38.4h-102.4l51.2 76.8h102.4l-25.6-38.4zM547.738 304.333c4.506-9.523 8.294-17.51 8.294-17.92 0.205-3.482 3.379-4.403 30.822-8.909 15.462-2.56 29.491-4.813 31.13-5.222 1.741-0.307 4.71-0.819 6.656-1.126s4.198-0.819 4.915-1.229c1.024-0.614-29.594-28.774-50.586-46.694l-2.355-2.048 9.114-36.352c5.018-19.968 9.216-36.454 9.216-36.659 0-0.102-2.458 1.024-5.325 2.662-2.97 1.638-9.728 5.427-14.95 8.294-5.12 2.867-9.626 5.222-9.83 5.222-0.307 0-3.174 1.536-6.451 3.482-3.277 1.843-9.114 5.12-13.107 7.27-3.891 2.15-9.421 5.12-12.288 6.656l-5.12 2.765-33.28-18.125c-18.33-10.035-33.382-18.125-33.485-18.022s3.891 16.486 8.909 36.454l9.114 36.352-2.355 2.048c-14.131 12.083-51.61 46.080-51.302 46.49 0.307 0.307 1.331 0.614 2.355 0.819 66.048 10.752 71.68 11.981 71.885 15.872 0 0.41 4.403 9.83 9.83 20.992 5.325 11.162 11.674 24.371 14.029 29.389l4.198 9.114 5.837-12.186c3.174-6.758 9.523-19.968 14.131-29.389z" />
+<glyph unicode="&#xe97b;" glyph-name="clock" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-56.32 75.469-137.216 130.97-228.762 157.082-23.040 6.554-51.2 11.981-72.704 14.029-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM527.36 802.714c7.373-3.482 14.438-9.933 17.613-16.179 5.12-9.933 4.915-4.198 4.915-148.787v-135.475l70.144-70.144c38.605-38.605 71.475-72.090 73.216-74.445 6.554-8.909 8.192-23.859 4.096-35.021-3.072-8.090-9.011-14.95-16.896-19.661-12.083-7.066-29.286-6.349-40.448 1.741-2.355 1.741-39.322 38.195-82.125 80.998-72.090 72.192-78.131 78.438-81.101 84.685l-3.174 6.758-0.307 147.866c-0.307 161.178-0.512 153.6 5.325 162.816 7.885 12.186 19.763 18.534 34.406 18.125 6.144-0.102 9.011-0.819 14.336-3.277z" />
+<glyph unicode="&#xe97c;" glyph-name="cloud_backup" d="M584.192 753.562c-12.288-1.434-32.051-4.813-37.888-6.554-52.634-15.565-83.661-32.051-118.886-62.976-5.837-5.018-21.914-21.606-26.214-26.829l-5.427-6.554-4.608 0.717c-8.499 1.331-30.106 1.229-38.4-0.102-43.52-6.963-79.667-39.219-92.16-82.022-1.434-5.018-2.97-11.674-3.379-14.746l-0.717-5.632-9.728-1.638c-63.693-10.854-118.17-51.098-147.661-108.954-10.445-20.582-16.486-39.834-20.275-64.205-1.434-9.83-1.843-16.794-1.536-31.539 0.205-10.445 0.614-20.070 0.819-21.504 0.307-1.434 1.024-5.939 1.638-10.035 4.608-30.925 20.992-67.379 41.984-93.389 8.909-11.059 27.443-29.286 35.43-34.816 28.979-20.070 51.712-30.618 79.155-36.966 21.709-4.915 14.131-4.813 303.821-4.608 149.811 0.102 273.818 0.512 275.456 0.922 1.741 0.41 5.632 1.229 8.704 1.843 9.114 1.741 22.426 5.939 31.232 9.933 43.93 19.866 75.366 57.242 86.938 103.219 3.174 12.8 3.584 15.462 4.301 30.618 1.741 32.154-7.27 64.512-25.702 92.16-7.373 11.059-15.462 20.275-27.034 30.515l-4.403 3.994 1.638 8.294c0.922 4.608 1.843 10.957 2.253 14.029 0.307 3.072 0.819 6.758 1.126 8.192 0.205 1.434 0.614 11.366 0.922 22.016 2.15 87.040-34.611 167.629-101.99 223.846-38.195 31.846-89.088 54.477-137.728 61.338-4.506 0.614-9.523 1.331-11.264 1.638-7.578 1.229-48.742 1.126-60.416-0.205zM549.069 562.586c3.379-1.741 166.707-163.635 166.707-165.274 0-0.307-22.835-0.512-50.688-0.512h-50.586l-0.307-80.589-0.307-80.691-2.867-4.813c-3.277-5.632-7.782-9.421-13.926-11.571-6.451-2.253-112.333-2.355-118.784 0-6.042 2.048-11.059 6.246-14.234 11.674l-2.765 4.71-0.307 80.691-0.205 80.589h-50.688c-27.853 0-50.688 0.205-50.688 0.512 0 1.434 163.226 163.43 166.093 164.966 7.168 3.789 16.589 3.891 23.552 0.307z" />
+<glyph unicode="&#xe97d;" glyph-name="Coat_hanger" d="M499.61 805.99c-0.205-0.205-3.174-0.614-6.554-0.922s-10.65-1.741-16.077-3.174c-26.010-6.861-47.309-19.354-66.15-39.014-26.214-27.136-39.526-60.416-39.322-97.792 0.102-14.131 0.205-15.462 2.867-28.467 8.397-40.96 35.021-75.776 73.626-96.461 13.926-7.373 18.842-12.493 23.245-23.654 1.946-5.018 2.15-7.885 2.253-28.877 0.102-12.8-0.102-23.654-0.41-24.064-0.307-0.512-3.277-2.355-6.656-4.301-6.861-3.789-55.501-31.13-78.234-43.93-8.090-4.608-14.95-8.294-15.258-8.294-0.205 0-1.638-0.819-3.072-1.843-1.536-1.126-5.939-3.686-9.933-5.837-3.891-2.15-18.022-9.933-31.232-17.408-32.666-18.432-31.642-17.92-36.864-20.787-2.56-1.331-5.939-3.277-7.68-4.301-1.638-1.024-5.325-3.072-8.192-4.608-2.765-1.536-10.138-5.632-16.384-9.216-17.203-9.728-124.723-70.144-151.040-84.787-29.184-16.282-46.49-37.581-53.965-66.253-8.806-34.099 0.922-70.758 25.498-96.358 14.95-15.667 33.792-25.702 56.115-30.003 11.469-2.253 738.714-2.253 751.002-0.102 33.075 5.939 60.211 26.317 75.059 56.32 14.643 29.389 13.517 67.174-2.867 94.822-11.571 19.763-22.221 29.286-50.074 44.954-17.613 9.933-46.387 26.112-54.272 30.515-5.12 2.867-68.096 38.298-73.728 41.472-1.946 1.126-7.475 4.198-12.288 6.861-8.090 4.506-152.474 85.606-190.976 107.315-9.523 5.427-19.661 11.059-22.528 12.595l-5.018 2.867-0.205 26.931c-0.205 23.040-0.512 28.365-2.355 36.762-7.782 35.021-27.648 61.235-60.518 79.258-18.227 10.035-26.624 18.227-33.28 32.768-4.506 9.626-6.042 16.691-5.939 27.136 0.41 36.762 31.949 65.946 68.403 63.078 16.282-1.229 30.413-7.885 41.574-19.763s16.384-24.474 17.818-42.803c1.024-14.234 5.222-23.347 14.131-30.515 5.837-4.813 9.421-6.451 16.896-7.987 15.974-3.277 33.178 4.813 40.858 19.251 3.891 7.27 5.12 13.619 4.71 24.371-1.536 39.014-20.070 76.288-50.688 102.093-16.998 14.336-39.424 25.088-62.771 30.106-7.27 1.536-38.298 3.174-39.526 2.048zM528.691 387.379c9.114-5.12 18.637-10.445 21.197-11.878 6.963-3.891 27.136-15.258 36.147-20.275 14.643-8.294 23.654-13.414 41.165-23.245 9.626-5.325 19.251-10.752 21.504-12.083 2.253-1.229 9.626-5.325 16.384-9.114s38.298-21.504 70.144-39.424c31.846-17.92 60.211-33.894 62.976-35.43 51.712-28.672 87.757-49.562 90.829-52.531 10.752-10.65 8.090-30.106-5.12-38.093-2.97-1.741-7.066-3.482-9.114-3.891-6.861-1.126-722.33-0.717-727.245 0.512-13.824 3.174-22.63 18.944-18.125 32.461 2.458 7.168 7.475 11.878 21.197 19.456 6.451 3.482 14.029 7.68 16.794 9.318 2.867 1.536 31.334 17.613 63.488 35.635 32.154 18.125 60.211 33.894 62.464 35.123 2.253 1.331 7.578 4.301 11.776 6.656 11.059 6.144 139.469 78.336 154.112 86.528 6.758 3.891 21.299 12.083 32.256 18.227 10.957 6.246 20.070 11.366 20.275 11.366 0.102 0.102 7.68-4.096 16.896-9.318z" />
+<glyph unicode="&#xe97e;" glyph-name="Collective_class_training" d="M492.032 881.664c-52.736-8.090-96.051-44.339-112.64-94.003-5.939-17.818-7.168-25.702-7.066-45.773 0-15.77 0.41-19.354 2.765-29.696 6.554-27.955 18.33-49.357 37.99-69.018 19.149-19.149 43.622-32.768 68.198-37.99 3.789-0.819 8.090-1.741 9.728-2.048 6.451-1.434 32.87-1.434 41.472-0.102 53.35 8.499 95.539 43.418 113.050 93.798 17.715 50.688 4.506 106.906-33.997 145.203-21.811 21.811-50.176 35.738-81.101 40.038-9.318 1.331-28.672 1.126-38.4-0.41zM280.576 831.386c-12.8-1.434-34.816-8.397-46.080-14.541-32.358-17.613-55.296-47.514-64.205-83.866-2.355-9.626-2.662-13.312-2.765-27.955-0.102-12.698 0.41-19.046 1.741-25.6 5.12-24.269 16.282-45.978 32.358-62.771 25.498-26.726 57.139-40.346 93.798-40.448 6.246-0.102 11.776 0.205 12.288 0.614 0.614 0.41 3.789 3.994 7.168 7.885 16.589 19.558 37.581 36.045 61.133 48.128l7.782 3.994-2.867 3.686c-14.95 18.944-27.136 45.978-31.744 70.144-2.15 11.571-2.56 16.384-2.458 33.792 0 14.029 0.512 19.763 2.355 29.184 2.355 11.264 9.523 33.894 11.571 36.557 1.843 2.253 0.205 3.891-8.499 8.192-17.92 8.909-36.25 13.21-56.218 13.312-6.451 0-13.414-0.102-15.36-0.307zM714.752 831.181c-6.349-0.614-24.371-5.222-31.437-8.090-6.963-2.662-17.51-7.987-19.046-9.523-0.512-0.41 0.717-4.608 2.662-9.318 4.198-10.342 7.168-20.787 9.626-33.178 2.458-13.107 2.458-43.418 0-57.139-4.71-25.498-15.053-49.869-29.901-69.939l-5.427-7.27 8.806-4.506c8.806-4.506 21.402-12.186 27.136-16.486 12.493-9.318 29.082-25.293 35.738-34.304 3.994-5.427 6.144-5.939 22.733-5.12 33.178 1.536 61.030 13.926 84.685 37.478 23.654 23.757 35.942 51.61 37.478 85.094 2.97 63.898-43.827 121.242-107.213 131.379-8.909 1.434-26.931 1.946-35.84 0.922zM378.163 604.774c-13.107-7.782-21.197-13.926-31.846-24.064-26.010-24.986-42.189-55.194-49.050-91.75-1.638-8.806-1.843-16.896-1.843-82.944 0-67.789 0.102-73.728 1.843-79.872 4.915-17.408 16.589-34.099 29.901-42.906 2.253-1.434 4.301-2.97 4.608-3.277s3.482-2.048 7.168-3.686c9.011-4.198 20.89-7.168 29.491-7.373l3.277-0.102v-104.96c0-71.68 0.307-106.598 1.126-110.285 3.789-18.637 18.944-34.202 38.093-39.322 7.066-1.843 192.922-2.15 201.626-0.307 18.637 3.994 35.84 20.787 39.322 38.298 0.512 2.253 0.922 4.403 1.024 4.915 0.102 0.41 0.205 48.23 0.307 106.189l0.102 105.472h3.891c7.27 0.102 21.811 3.994 30.208 8.192 16.794 8.397 29.286 21.606 36.454 38.605 6.144 14.336 6.144 14.438 5.734 92.979-0.102 39.424-0.512 73.114-0.819 74.752-8.602 52.531-36.659 94.515-80.794 120.73-5.222 3.174-10.035 5.734-10.65 5.734s-1.946-0.922-3.072-2.15c-6.451-7.168-26.317-20.685-41.165-28.058-45.978-22.733-99.942-24.986-147.354-6.042-19.251 7.68-35.226 17.203-49.664 29.491-4.403 3.686-8.294 6.758-8.704 6.758s-4.608-2.253-9.216-5.018zM168.448 583.475c-35.43-20.582-61.542-54.272-72.499-93.491-5.53-19.456-5.734-23.859-5.53-103.936 0.307-81.306-0.102-75.776 6.861-91.034 10.547-22.63 33.178-38.605 58.675-41.165l6.861-0.717v-97.075c0-68.301 0.307-98.714 1.126-102.502 4.096-19.251 18.432-34.304 37.478-39.219 4.915-1.331 18.022-1.536 84.992-1.536h79.155l-4.096 5.325c-4.813 6.451-10.342 17.51-12.902 26.010-1.741 5.53-1.946 14.029-2.458 104.141l-0.512 98.202-6.656 2.253c-35.123 12.288-59.597 40.141-67.584 76.902-1.946 8.704-1.946 12.902-1.741 82.944 0.205 40.55 0.614 74.65 0.922 75.776s0.922 4.403 1.229 7.168c1.536 11.162 6.861 30.003 12.083 42.291 1.741 4.096 2.97 7.578 2.662 7.885-0.205 0.205-3.584 0.717-7.578 1.024-34.816 2.97-70.144 18.33-97.69 42.394-1.946 1.741-3.789 3.174-4.096 3.174s-4.198-2.15-8.704-4.813zM845.21 586.445c-26.624-24.371-63.181-40.448-99.635-43.725-3.686-0.307-6.758-0.717-7.066-0.922-0.205-0.307 1.536-5.12 3.789-10.957 4.71-11.469 8.294-24.576 11.059-39.629 1.638-8.909 1.843-17.408 1.843-85.197v-75.264l-2.458-9.216c-9.114-34.918-32.973-60.928-66.662-72.806l-6.656-2.355-0.512-97.587c-0.614-98.304-0.717-100.25-4.301-109.875-2.355-6.554-7.373-15.872-11.162-20.89l-3.994-5.222h78.643c86.323 0 85.811 0 97.587 6.246 12.493 6.758 22.835 20.992 25.395 35.123 0.717 4.096 1.126 38.195 1.126 102.707v96.563l3.584 0.102c1.946 0.102 3.891 0.205 4.403 0.307 0.41 0.102 2.867 0.512 5.53 0.922 17.715 2.867 37.376 16.077 47.616 32.154 4.301 6.758 9.011 18.432 10.445 25.907 0.614 3.686 0.922 31.949 0.717 80.384-0.205 65.843-0.512 75.776-2.048 83.456-2.355 11.981-8.806 30.72-13.926 41.062-3.891 7.68-14.95 25.19-17.818 28.16-0.614 0.614-3.686 3.994-6.758 7.475-9.523 10.752-24.678 22.835-39.834 31.846-6.246 3.584-6.246 3.584-8.909 1.229z" />
+<glyph unicode="&#xe97f;" glyph-name="Colour-Call" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-112.128-8.499-219.443-62.874-293.99-149.197-57.856-67.072-94.618-151.45-103.322-237.466-0.41-3.686-0.922-8.294-1.126-10.24-0.307-1.946-0.717-15.565-0.922-30.208-0.512-27.648 1.024-52.941 4.198-71.168 6.349-36.454 11.264-56.115 20.582-81.92 33.587-93.286 98.099-172.749 182.067-224.358 57.856-35.635 125.952-57.856 193.024-63.078 13.619-1.024 58.163-1.024 69.632 0 38.093 3.482 71.578 10.445 103.936 21.402 134.349 45.363 239.104 154.112 278.426 288.973 7.578 25.805 13.312 54.374 15.462 76.39 0.307 3.686 1.024 10.854 1.434 15.872 0.512 5.12 0.922 91.034 0.922 190.976 0.102 195.072 0.307 188.416-5.018 204.8-9.83 30.515-34.406 55.194-65.434 65.434-16.179 5.325-8.192 5.12-205.926 5.12-101.171 0-184.115-0.102-184.32-0.307zM595.866 779.674c5.837-1.741 11.571-6.246 14.95-11.674l3.072-4.915 0.307-29.594 0.307-29.491h27.443c31.539 0 34.509-0.512 41.574-7.68 7.168-7.066 7.68-10.035 7.68-41.677v-27.443h27.443c31.642 0 34.611-0.512 41.677-7.68 7.168-7.066 7.68-10.035 7.68-41.677v-27.443h26.931c31.437 0 35.123-0.614 41.779-7.27 8.294-8.294 8.192-7.68 7.885-57.651l-0.307-44.134-2.56-5.018c-7.885-15.36-27.75-18.534-40.243-6.349-7.373 7.066-7.885 9.933-7.885 41.677v27.443l-58.88 0.614-4.813 2.867c-2.662 1.536-6.042 4.301-7.373 6.144-5.325 6.963-5.734 10.035-5.734 39.731v27.546h-27.443c-31.642 0-34.611 0.512-41.677 7.68-7.168 7.066-7.68 10.035-7.68 41.677v27.443h-26.931c-29.286 0-33.587 0.614-40.141 5.53-1.946 1.536-4.813 4.915-6.349 7.578l-2.867 4.813-0.307 29.491-0.307 29.389h-27.443c-31.437 0-34.099 0.512-41.37 7.578-10.24 9.933-10.342 25.907-0.205 35.942 7.373 7.475 7.885 7.475 55.706 7.578 27.75 0.102 43.622-0.307 46.080-1.024zM493.978 676.966c6.349-1.946 11.162-5.734 14.643-11.674l2.867-4.813 0.614-58.778 58.778-0.614 4.813-2.867c2.662-1.536 6.042-4.301 7.373-6.144 5.325-6.963 5.734-10.035 5.734-39.731v-27.546h27.546c29.696 0 32.768-0.41 39.731-5.734 1.843-1.331 4.608-4.71 6.144-7.373l2.867-4.813 0.614-58.778 29.389-0.307c32.768-0.307 32.461-0.307 40.038-7.885 7.066-7.066 7.27-8.499 7.27-55.808 0-25.805-0.41-43.52-1.024-45.875-0.614-2.15-2.56-5.734-4.403-8.090-9.318-12.083-27.341-13.312-38.093-2.458-7.168 7.066-7.68 10.035-7.68 41.677v27.443h-26.931c-29.286 0-33.587 0.614-40.141 5.53-1.946 1.536-4.813 4.915-6.349 7.578l-2.867 4.813-0.307 29.491-0.307 29.389h-27.443c-31.13 0-34.509 0.614-41.165 7.27-7.578 7.578-7.578 7.27-7.885 40.038l-0.307 29.389-58.778 0.614-4.813 2.867c-2.662 1.536-6.042 4.403-7.578 6.349-5.12 6.758-5.427 9.114-5.53 39.219v27.853h-27.443c-31.846 0-34.714 0.512-41.779 7.885-10.035 10.24-9.933 25.702 0.205 35.738 7.168 7.27 8.397 7.475 55.808 7.475 33.075 0.102 42.496-0.205 46.387-1.331zM298.086 643.379c11.264-3.789 23.962-17.101 57.856-60.211 22.016-28.058 28.058-38.707 28.16-49.562 0.205-11.059-5.734-19.558-31.13-45.158-7.782-7.885-14.848-15.462-15.565-16.896-9.626-18.432 13.21-57.651 64-109.978 58.061-59.802 99.533-90.624 122.368-90.931 10.445-0.205 10.957 0.102 31.334 20.275 10.445 10.24 21.914 20.48 25.395 22.733 15.872 10.24 26.829 7.578 54.272-13.107 7.373-5.632 16.998-13.107 21.299-16.691 4.403-3.482 12.8-10.342 18.739-15.053 14.541-11.674 26.829-23.654 30.822-29.901 2.765-4.301 3.379-6.144 3.379-11.469 0.102-10.24-2.97-14.438-34.918-46.694-29.594-30.003-34.202-33.69-46.182-37.069-9.216-2.662-30.106-3.277-43.213-1.229-52.736 8.090-116.122 39.834-178.176 89.088-6.451 5.12-14.029 11.366-16.896 13.824-19.968 17.818-26.214 23.654-39.526 36.762-75.981 75.571-127.59 158.925-141.312 228.454-3.072 15.36-3.379 40.96-0.512 50.995 4.198 15.155 8.397 20.48 49.254 60.723 19.763 19.456 29.901 24.781 40.55 21.094z" />
+<glyph unicode="&#xe980;" glyph-name="Comedy_channel" d="M179.302 603.443c0.102-240.538 0.205-255.078 1.946-269.414 7.168-56.934 24.269-103.424 55.091-148.992 40.755-60.518 101.683-106.803 170.701-129.741 10.138-3.379 37.274-10.342 43.52-11.264 2.56-0.307 6.963-1.024 9.728-1.638 16.998-3.584 67.379-4.71 88.064-2.048 42.906 5.427 73.318 14.336 109.568 31.846 33.587 16.384 61.542 36.352 88.576 63.488 16.896 16.794 19.661 19.968 31.027 35.021 26.931 35.942 46.285 76.186 57.037 118.579 3.379 13.414 6.656 30.925 7.68 41.472 0.41 3.994 1.024 8.090 1.331 9.216 0.41 1.126 0.717 91.955 0.922 201.728 0.205 213.811 0.512 203.674-4.813 223.13-2.253 8.602-4.198 13.312-9.933 24.678-5.939 11.571-11.366 18.842-22.835 30.208-18.637 18.739-37.478 29.082-64.512 35.43-7.27 1.741-23.142 1.843-285.491 2.15l-277.709 0.307 0.102-254.157zM378.163 676.352c45.158-9.318 78.746-47.002 82.227-92.467 0.614-7.27 0.41-9.216-1.024-11.469-2.56-3.891-5.939-3.277-15.258 2.97-25.395 16.896-52.531 25.293-82.637 25.805-33.69 0.41-61.133-7.578-88.781-25.805-9.318-6.246-12.698-6.861-15.258-2.97-1.434 2.15-1.638 4.198-1.024 11.674 2.56 33.997 22.528 64.717 53.248 81.92 19.149 10.854 46.080 14.848 68.506 10.342zM683.315 676.762c21.811-4.096 39.526-13.619 55.501-29.594 16.589-16.691 27.136-40.243 28.877-64.307 0.512-7.68 0.41-9.216-1.229-10.957-2.867-3.174-6.246-2.458-15.155 3.482-25.395 16.794-51.712 25.088-82.125 25.702-26.419 0.614-47.616-3.891-70.144-14.746-6.963-3.379-18.842-10.342-23.45-13.824s-8.704-3.482-10.957-0.102c-2.048 3.072-1.536 12.595 1.126 25.6 6.144 29.696 27.546 56.934 54.784 69.837 6.246 2.97 17.51 7.066 22.118 7.987 13.21 2.765 28.877 3.174 40.653 0.922zM324.096 383.078c1.843-0.819 6.042-3.379 9.216-5.734 13.722-10.138 37.888-23.962 55.296-31.539 18.125-7.885 45.875-16.691 61.747-19.661 3.174-0.512 6.861-1.229 8.192-1.536 23.654-4.608 68.096-5.53 93.389-2.048 48.026 6.656 91.955 23.245 130.867 49.562 17.101 11.571 18.432 12.288 22.426 11.776 8.294-1.024 11.776-6.246 11.469-17.101-1.126-51.507-21.811-101.171-57.549-137.83-29.901-30.72-68.71-51.61-109.261-58.88-4.813-0.922-10.035-1.843-11.776-2.253-1.638-0.307-12.083-0.717-23.040-0.922-20.48-0.307-33.28 0.922-50.381 5.018-34.202 8.090-68.71 26.829-93.901 51.098-38.605 37.171-60.416 84.992-63.181 138.445-0.614 10.24-0.41 12.902 0.922 15.462 2.15 4.096 6.042 6.656 11.264 7.475 0.41 0 2.355-0.512 4.301-1.331z" />
+<glyph unicode="&#xe981;" glyph-name="Comic" d="M606.618 883.098c-121.958-9.421-221.798-62.054-259.277-136.602-17.613-35.123-19.251-77.107-4.506-111.821l3.174-7.475h-269.21v-247.91c0-172.237 0.307-250.061 1.126-255.181 4.301-29.082 15.77-52.224 35.738-72.499 15.872-16.179 31.642-26.010 52.429-32.666 19.558-6.246-1.946-5.939 353.382-6.042l325.325-0.102v524.902l14.131 9.318c46.694 30.925 76.39 69.734 85.299 111.411 7.578 35.738-0.307 73.011-22.528 106.189-7.987 11.878-21.504 27.443-30.31 35.123-3.277 2.867-7.168 6.144-8.602 7.475s-7.27 5.734-12.902 9.933c-44.749 32.768-103.834 54.579-171.93 63.59-22.63 2.97-68.506 4.096-91.341 2.355zM726.016 794.419c2.355-12.493 4.608-24.678 6.144-33.587 0.512-2.765 3.482-19.046 6.554-36.147 3.174-16.998 5.734-31.232 5.734-31.437s0.614-0.205 1.331 0.102c0.819 0.307 1.434 2.048 1.434 4.301 0 4.506 1.331 37.581 1.843 47.821 0.205 3.994 0.717 14.746 1.024 24.064 1.024 26.010 1.331 31.949 1.741 32.358 0.205 0.205 9.216 0.614 19.866 1.024l19.558 0.614-3.379-17.715c-1.843-9.83-4.608-23.757-5.939-31.13-9.318-48.128-12.288-64-16.077-83.968-2.355-12.39-4.301-22.63-4.403-22.733-0.41-0.512-7.168-1.229-16.998-1.843l-10.752-0.717-11.776 30.925c-6.451 16.998-13.107 34.406-14.643 38.707s-3.174 8.192-3.584 8.602c-0.512 0.512-4.403-20.89-8.806-47.514s-8.397-49.357-8.806-50.483c-0.614-1.638-3.584-2.765-13.926-5.427-7.27-1.946-14.234-3.891-15.565-4.403-1.638-0.614-2.458-0.512-2.765 0.41-0.41 1.331-7.168 29.389-13.414 55.808-2.15 9.114-4.301 16.589-4.608 16.589-0.41 0-1.024-1.536-1.331-3.277-0.819-4.506-5.734-14.746-10.138-21.299-19.251-28.57-52.531-37.376-78.438-20.787-17.92 11.469-28.57 33.28-28.774 58.573v7.68l-6.349-6.554c-11.469-11.571-30.822-25.907-45.158-33.28l-5.939-3.072 0.614-20.582c0.307-11.264 0.717-23.142 0.922-26.317 0.205-4.71 0-5.837-1.331-5.939-0.922 0-2.56-0.205-3.584-0.41-1.126-0.205-6.656-0.512-12.288-0.717l-10.24-0.307-0.205 3.072c-0.102 1.741-0.512 7.885-0.819 13.824s-0.819 14.95-1.126 19.968c-0.307 5.12-0.717 12.186-1.024 15.872s-0.819 11.776-1.126 17.92c-0.307 6.246-0.717 13.312-0.922 15.872s-0.41 6.656-0.41 9.114c-0.102 4.608-0.614 4.915-6.554 2.662-1.126-0.512-2.458 3.482-6.246 19.149-2.662 10.854-5.018 20.48-5.222 21.299-0.819 2.97 35.635 22.016 59.392 31.027 31.642 11.981 54.477 11.059 61.542-2.56 2.458-4.813 5.53-16.179 5.53-20.582v-3.891l6.656 5.734c18.739 15.872 41.779 19.456 61.44 9.523 4.506-2.355 11.571-7.578 13.517-10.035 0.922-1.229 1.126-0.717 0.614 2.662-0.41 3.174-0.205 4.301 1.024 4.813 0.819 0.307 8.192 5.632 16.384 11.878s15.36 11.366 15.872 11.366c0.512 0 1.331-3.789 1.741-8.397 0.41-4.71 0.922-9.421 1.126-10.547s1.024-8.294 1.946-15.872c0.819-7.578 2.662-23.757 4.096-35.84s3.277-28.877 4.198-37.376c0.922-8.397 2.15-15.77 2.662-16.384 1.638-1.843 2.56 1.536 2.765 10.035 0.102 4.608 0.41 10.24 0.614 12.493 0.102 2.253 0.614 9.83 0.922 16.896 0.41 7.066 0.922 15.565 1.126 18.944s0.717 12.186 1.024 19.456c0.41 7.373 0.819 15.667 1.024 18.432 0.205 2.867 0.614 11.162 1.024 18.432 0.41 7.373 0.819 13.312 0.922 13.414 0.41 0.307 44.339 11.469 45.261 11.571 0.717 0.102 2.15-4.71 3.482-11.878zM842.342 772.915c-0.307-3.277-0.717-12.186-1.126-19.763-0.307-7.578-0.819-16.384-1.024-19.456s-0.614-11.878-1.024-19.456c-0.307-7.578-0.819-16.794-1.024-20.48s-0.717-13.312-1.126-21.504c-0.307-8.192-0.717-15.565-0.922-16.384-0.102-1.024-2.765-2.048-8.294-3.277-13.824-2.97-14.438-2.97-14.438-1.638 0 2.048-1.434 18.33-1.843 22.323-0.205 1.946-0.717 6.554-1.024 10.24-0.41 3.686-0.819 8.294-1.024 10.24s-0.922 9.626-1.536 16.896c-0.614 7.373-1.331 14.438-1.536 15.872s-0.717 6.451-1.024 11.264c-0.41 4.813-0.819 9.83-1.024 11.264s-0.614 6.554-1.024 11.366l-0.717 8.806 12.083 3.174c6.758 1.741 14.746 3.891 17.818 4.71 10.035 2.662 10.24 2.56 9.83-4.198zM836.915 632.218c5.427-2.765 7.885-6.246 7.885-10.957 0-5.939-2.355-10.65-7.782-15.462-10.342-9.114-26.214-8.704-30.72 0.717-5.222 11.059 8.704 26.317 24.474 26.726 2.15 0.102 4.915-0.41 6.144-1.024zM307.2 320v-256h-54.989c-31.539 0.102-57.549 0.512-60.723 1.126-11.264 2.048-25.088 8.192-33.28 14.848-7.578 6.144-9.421 8.090-14.643 15.053-6.042 7.885-9.728 15.462-12.902 25.805l-2.15 7.168-0.307 224.051-0.205 223.949h179.2v-256zM407.040 556.544c45.466-34.202 110.182-58.573 175.616-66.15 3.072-0.307 5.837-0.819 6.042-1.024 0.205-0.102-2.56-11.981-6.042-26.214s-9.523-38.81-13.312-54.579c-3.891-15.77-6.963-28.672-6.861-28.877 0.205-0.102 6.451 3.584 14.029 8.294s37.376 22.938 66.048 40.55c28.774 17.613 57.958 35.635 65.024 39.936 53.043 32.87 57.446 35.43 70.656 39.834 7.066 2.458 13.414 4.608 14.131 4.915 0.922 0.41 1.229-19.251 1.229-96.358v-96.87h-409.6v256.205l6.963-6.349c3.789-3.482 11.059-9.523 16.077-13.312zM793.6 153.6v-89.6h-409.6v179.2h409.6v-89.6zM480.256 753.869c-5.427-1.536-12.186-4.915-17.92-8.806l-4.096-2.765 0.102-12.8c0.205-20.685 0.819-37.786 1.434-38.81 0.819-1.434 15.667 8.602 23.142 15.565 14.234 13.312 19.763 27.546 15.667 40.346-2.253 7.066-9.114 9.83-18.33 7.27zM575.795 736.666c-16.998-3.072-29.286-21.197-27.546-40.243 1.638-17.306 13.21-29.696 27.853-29.696 18.125 0 32.256 16.282 32.358 37.274 0 20.685-15.155 35.84-32.666 32.666z" />
+<glyph unicode="&#xe982;" glyph-name="Comments" d="M485.274 869.478c-0.205-0.205-5.018-0.614-10.65-0.922-96.563-6.042-192.819-40.55-263.578-94.72-52.634-40.243-91.443-89.498-113.357-143.872-13.619-33.485-19.866-64.614-20.378-100.557-0.41-27.853 1.741-47.923 7.885-72.704 27.75-112.435 126.976-208.179 261.222-252.006l11.981-3.994v-175.718l153.293 153.395 19.968 0.717c11.059 0.41 21.094 0.922 22.426 1.126s5.837 0.614 9.933 1.024c4.198 0.307 9.011 0.717 10.752 1.024 1.843 0.205 8.602 1.126 15.053 2.048 49.869 6.861 102.4 22.63 146.944 44.032 83.763 40.346 146.842 100.454 181.76 173.056 13.312 27.546 20.992 52.429 25.6 81.818 4.198 26.726 3.174 71.68-2.15 95.334-8.294 36.966-19.149 64.205-37.683 95.232-3.686 6.246-7.066 11.776-7.475 12.288-0.512 0.614-4.198 5.632-8.294 11.264-13.722 18.842-32.461 39.526-50.176 55.603-30.106 27.341-72.806 54.682-115.405 73.728-45.875 20.582-109.568 36.864-159.232 40.755-4.506 0.307-9.83 0.819-11.776 1.126-4.301 0.512-66.15 1.434-66.662 0.922zM457.933 662.016c9.318-4.301 14.234-12.493 14.95-24.474 0.717-14.234-4.915-23.654-19.046-31.539-14.95-8.397-29.594-21.299-37.376-33.075-6.042-9.011-11.162-25.498-11.469-36.25 0-0.512 3.277-1.126 7.168-1.331 18.432-0.819 33.587-8.192 46.694-22.733 10.854-11.878 15.565-24.986 15.667-43.11 0-9.728-0.41-13.107-2.458-19.354-6.963-21.709-26.931-38.502-50.893-42.906-33.28-6.042-61.952 8.909-77.107 40.243-8.602 17.92-11.981 37.683-10.957 63.488 1.536 34.304 11.059 64.205 30.106 94.106 18.637 29.082 45.466 51.814 69.12 58.47 7.27 2.048 19.558 1.331 25.6-1.536zM649.011 662.118c12.493-6.451 17.818-21.299 13.107-37.274-2.253-7.578-6.349-11.878-18.125-19.149-22.118-13.619-33.997-25.907-41.165-42.803-2.765-6.349-7.27-25.702-6.246-26.726 0.307-0.307 3.789-0.614 7.68-0.819 25.293-0.819 49.971-19.968 58.163-45.158 3.072-9.318 3.891-24.064 1.741-33.997-6.349-30.003-33.894-50.995-66.662-50.995-39.424 0-67.789 30.822-73.011 79.667-1.024 9.216-0.819 33.28 0.307 40.96 4.915 33.997 14.438 58.573 32.973 85.504 17.101 24.883 43.725 46.285 65.229 52.224 6.963 2.048 20.787 1.229 26.010-1.434z" />
+<glyph unicode="&#xe983;" glyph-name="commercial_representitive" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM677.888 291.021c15.667-4.403 27.238-12.083 36.045-23.757 5.734-7.578 11.059-18.33 11.776-23.859 2.355-17.51-21.299-27.443-31.744-13.312-1.331 1.843-3.789 6.144-5.325 9.523-5.427 11.366-14.541 18.637-25.805 20.685-6.656 1.126-19.046 0.614-25.907-1.126-17.203-4.403-28.672-16.794-35.226-38.093-0.614-2.048-0.614-2.048 40.038-2.15 45.568 0 45.056 0.102 49.562-7.168 1.741-2.765 2.355-5.222 2.355-9.626-0.102-6.963-2.56-11.776-7.475-14.643-3.277-1.843-5.734-1.946-46.592-2.048l-43.11-0.102-0.102-8.397v-8.499h35.635c38.707 0 40.448-0.205 44.646-5.53 1.229-1.638 2.458-5.12 2.765-8.294 0.819-6.451-1.229-11.878-5.939-15.258-2.765-2.048-4.301-2.15-37.581-2.15-19.149-0.102-35.021-0.307-35.328-0.614-0.922-1.024 3.379-11.878 6.963-17.51 9.421-14.848 23.45-21.402 45.261-21.402 18.944 0 28.467 5.632 36.454 21.197 4.915 9.626 8.499 13.005 15.565 14.234 9.523 1.638 20.378-6.042 21.709-15.258 0.614-4.096 0.205-5.632-3.482-13.21-9.626-20.070-24.269-32.256-45.158-37.683-9.421-2.355-31.13-3.277-43.622-1.638-11.674 1.434-27.034 7.578-35.738 14.336-13.926 10.854-25.293 28.262-30.31 46.387-1.229 4.403-2.458 8.704-2.867 9.421-0.41 1.024-3.174 1.536-8.909 1.741-12.595 0.41-17.51 3.891-18.534 13.21-0.614 5.427 2.355 13.005 6.246 15.462 1.638 1.126 5.632 1.946 10.854 2.253l8.192 0.614v7.987c0 8.806 0.41 8.294-6.861 8.602-7.987 0.307-11.366 1.536-14.541 5.12-6.656 7.68-4.915 20.89 3.482 26.112 2.867 1.741 5.222 2.253 12.288 2.253l8.704 0.102 1.024 4.198c8.499 33.69 26.112 56.013 51.814 65.741 10.957 4.096 19.763 5.325 35.738 4.915 11.366-0.205 16.179-0.819 23.040-2.765z" />
+<glyph unicode="&#xe984;" glyph-name="community_sms" d="M102.707 556.339c0.205-261.427 0.307-276.070 2.048-281.702 9.523-31.027 33.997-52.224 65.229-56.525 1.434-0.205 27.136-0.41 57.139-0.41l54.477-0.102v-179.302l89.6 89.702 89.702 89.6h460.698l-0.102 273.203c-0.102 299.11 0.307 279.245-6.042 294.298-9.114 21.299-26.214 36.454-50.176 44.237l-6.656 2.15-756.224 0.512 0.307-275.661zM527.36 742.298c19.661-3.994 34.816-12.288 48.333-26.317 33.587-34.714 32.768-91.136-1.843-125.338-6.451-6.349-15.974-13.21-22.221-16.077-17.51-7.987-23.45-9.216-41.165-9.216-11.776 0-15.77 0.512-22.528 2.458-52.326 15.053-79.36 68.71-60.211 119.296 9.626 25.498 31.334 45.056 59.187 53.555 11.059 3.277 28.672 3.994 40.448 1.638zM390.656 727.142c7.066-1.843 23.45-9.523 22.835-10.752-0.205-0.307-2.765-5.53-5.734-11.674-16.384-33.28-15.667-71.987 1.946-104.96 3.686-6.963 4.813-9.933 4.096-10.854-1.638-1.946-16.282-8.499-23.142-10.445-8.499-2.253-25.907-2.765-34.509-0.922-43.315 9.114-70.042 51.712-59.187 94.31 7.27 28.262 29.798 49.869 58.88 56.218 8.294 1.741 25.907 1.331 34.816-0.922zM668.365 727.859c39.117-8.192 65.126-44.442 60.518-84.48-2.765-24.576-19.149-47.821-41.677-59.187-11.264-5.632-19.354-7.475-33.382-7.578-9.626-0.102-15.155 0.41-19.968 1.741-6.451 1.741-21.094 8.397-24.986 11.366-1.843 1.434-1.843 1.638 0.307 4.608 6.656 9.318 14.336 31.13 16.077 45.67 2.765 22.835-1.843 48.026-12.39 67.994-1.946 3.686-3.584 7.066-3.584 7.475 0 2.253 17.92 10.342 28.058 12.595 7.885 1.741 22.221 1.638 31.027-0.205zM302.080 577.638c18.637-17.51 43.418-27.034 69.939-26.829 6.554 0.102 11.981 0.102 11.981 0s-2.048-3.277-4.608-7.168c-10.035-15.258-17.51-34.816-19.456-51.098-0.41-3.379-0.922-6.861-1.126-7.68-0.102-0.819-0.307-26.726-0.307-57.549l-0.102-56.115h-30.208c-18.227 0-32.256 0.41-35.533 1.126-17.306 3.686-31.949 18.227-35.635 35.533-0.717 3.277-1.024 24.269-0.819 60.723 0.41 63.386 0.41 62.874 9.421 81.306 4.198 8.499 6.451 11.981 13.107 20.275 2.56 3.072 14.848 14.029 15.872 14.029 0.307 0 3.686-2.97 7.475-6.554zM735.437 579.584c13.107-10.752 23.45-26.726 29.184-45.261l2.867-9.011 0.307-77.005 0.307-77.107h-102.502l-0.102 55.603c0 30.515-0.205 57.139-0.512 59.085-0.205 1.946-0.614 5.018-0.819 6.656-2.253 16.691-9.933 36.864-20.070 52.019-2.253 3.277-4.096 6.144-4.096 6.246 0 0 6.144 0.102 13.619 0.102 15.77 0.102 25.19 1.946 38.502 7.475 10.445 4.403 24.269 13.414 31.334 20.582 2.867 2.867 5.427 5.222 5.734 5.222 0.41 0 3.174-2.048 6.246-4.608zM588.493 562.483c21.606-12.493 39.322-34.304 46.387-57.139 5.018-16.077 5.018-16.896 5.12-103.629v-81.715h-104.858c-72.704 0-106.598 0.307-110.387 1.126-14.029 2.97-29.082 14.336-34.918 26.522-5.939 12.39-5.939 12.595-5.53 80.589 0.307 60.314 0.41 62.464 2.56 70.042 5.734 20.173 14.131 34.509 28.262 48.64 6.246 6.144 20.89 16.794 23.245 16.794 0.614 0 4.915-2.458 9.421-5.53 39.117-25.805 92.467-24.986 129.229 1.843 3.379 2.56 6.451 4.608 6.861 4.608 0.41 0.102 2.458-0.922 4.608-2.15z" />
+<glyph unicode="&#xe985;" glyph-name="Concierge_bell" d="M445.952 752.742c-9.83-3.174-12.8-4.813-19.661-11.264-12.8-11.878-16.691-23.040-16.691-47.411v-15.667h76.8v-51.2h-19.661c-36.762-0.102-60.928-2.97-92.979-10.854-107.827-26.624-198.554-103.834-242.483-206.746-9.318-21.914-15.974-42.701-20.48-64-3.379-16.179-4.198-20.582-5.325-30.208-0.614-5.018-1.331-11.059-1.536-13.312-0.307-2.253-0.819-10.65-1.126-18.637l-0.614-14.643h819.61l-0.614 15.667c-0.41 8.499-0.819 16.691-1.024 18.125s-0.717 5.325-1.126 8.704c-1.946 18.637-7.885 45.773-14.336 66.355-21.402 67.482-64.614 129.638-119.808 172.646-4.506 3.482-8.909 6.963-9.933 7.782-4.301 3.482-29.082 19.251-38.298 24.371-35.328 19.661-76.902 33.997-116.634 40.141-5.632 0.922-11.366 1.843-12.8 2.048-2.97 0.41-15.462 1.536-23.552 2.048-3.072 0.205-14.746 0.41-25.805 0.41l-20.275 0.102v51.2h76.902l-0.205 15.872c0 8.806-0.717 18.432-1.434 21.504-4.403 19.046-20.89 34.816-39.936 38.298-4.096 0.819-25.498 1.126-62.976 1.126-56.115-0.102-56.934-0.102-64-2.458zM204.493 234.803c-0.717-10.65-2.867-18.637-7.475-28.058-9.011-18.227-26.624-32.666-46.080-37.786-3.277-0.922-11.469-1.946-18.022-2.458-13.824-1.024-19.456-3.174-24.371-9.318-5.12-6.554-6.144-10.854-6.144-27.238v-14.746h819.405l-0.307 16.691c-0.41 15.77-0.512 16.794-3.072 21.197-5.632 9.523-11.571 12.493-27.546 13.414-13.824 0.922-21.197 2.662-31.334 7.68-14.131 7.066-26.624 19.763-33.178 33.792-4.301 9.421-6.042 15.77-6.758 26.112l-0.717 9.114h-613.786l-0.614-8.397z" />
+<glyph unicode="&#xe986;" glyph-name="conference_call" d="M291.123 882.176c-13.722-1.843-18.739-3.072-30.618-7.27-46.797-16.486-81.203-56.627-91.136-106.394-2.253-10.957-2.662-35.226-0.922-46.592 9.114-58.061 52.429-104.755 108.544-116.838 12.186-2.662 15.872-2.97 32.256-2.867 12.39 0 18.33 0.512 27.136 2.355 6.246 1.331 11.571 2.662 11.981 2.97 0.41 0.41 0.102 5.12-0.717 10.445-5.427 38.605 4.403 81.408 26.419 114.176 14.131 21.197 34.406 40.038 56.832 52.838l9.318 5.222-2.048 5.12c-6.861 17.408-17.306 32.87-32.461 47.718-20.48 20.173-47.718 33.894-76.493 38.502-9.626 1.536-29.082 1.843-38.093 0.614zM488.96 778.752c-54.067-9.728-96.358-47.514-111.718-99.84-7.578-25.805-6.963-58.368 1.741-83.456 6.656-19.661 18.33-38.605 32.461-53.043 22.528-23.142 47.309-35.942 80.589-41.779 1.741-0.307 9.523-0.717 17.408-0.922 16.282-0.41 28.262 1.024 42.803 5.222 1.843 0.614 1.843 1.434 0.102 10.138-1.434 6.861-1.331 35.021 0.102 45.056 7.475 52.122 37.581 96.358 83.149 122.368l9.421 5.325-1.946 5.018c-9.011 22.835-29.286 48.435-49.254 62.054-31.232 21.402-69.632 30.106-104.858 23.859zM696.832 676.864c-40.55-6.349-74.445-28.058-97.485-62.464-9.011-13.414-16.589-32.256-20.378-50.688-2.56-12.186-2.56-40.141-0.102-52.224 6.144-29.286 18.842-52.941 39.219-73.318 24.883-24.883 56.73-39.117 91.546-41.062 24.064-1.229 46.899 3.277 68.608 13.722 39.936 19.149 68.813 56.627 77.517 100.454 2.458 12.698 2.458 40.653 0 52.429-6.349 29.696-18.944 53.146-39.219 73.318-14.336 14.234-27.341 22.733-49.664 32.461-4.506 1.946-22.835 6.451-31.027 7.782-8.806 1.331-29.491 1.126-39.014-0.41zM173.363 604.774c-12.8-7.578-20.89-13.722-30.925-23.245-23.45-22.221-38.605-47.616-46.49-77.722-5.632-21.299-5.632-22.221-5.734-122.368-0.102-59.802 0.307-95.027 0.922-99.226 4.301-26.214 21.606-48.128 46.080-58.573 13.21-5.632 16.179-5.837 76.595-5.939l55.501-0.102 0.102 76.493c0 42.189 0.205 77.517 0.41 78.541s0.512 4.301 0.614 7.168c0.102 2.867 0.614 6.554 1.024 8.192 0.512 1.638 1.126 4.915 1.434 7.168 0.717 4.71 1.843 8.909 5.12 20.070 14.95 48.947 50.688 91.238 96.973 114.586 5.939 2.97 8.704 4.915 8.090 5.632-5.734 7.27-11.776 16.282-15.974 23.962-4.301 7.987-5.427 9.318-7.168 8.909-21.504-5.939-34.611-7.578-56.32-7.168-17.408 0.307-26.214 1.536-42.496 5.632-10.342 2.56-28.774 9.83-38.605 15.053-12.288 6.554-31.334 19.968-36.557 25.805-1.126 1.229-2.458 2.15-3.072 2.15s-4.915-2.253-9.523-5.018zM378.368 502.579c-13.107-7.68-22.733-15.258-35.43-27.853-26.522-26.624-43.008-61.133-47.002-99.021-0.717-6.656-1.024-41.984-0.819-103.834 0.41-84.48 0.614-94.208 2.15-99.43 9.011-29.798 32.051-50.79 61.542-56.115 3.891-0.717 26.317-1.126 60.723-1.126h54.579l0.102 75.571c0.102 83.251 0 79.155 2.355 94.925 8.704 59.494 48.026 113.766 102.195 141.21l9.933 5.018-2.867 3.686c-4.813 6.144-14.438 21.197-16.589 26.214-1.536 3.482-2.56 4.608-3.789 4.198-5.837-1.843-24.576-5.837-31.027-6.656-11.264-1.331-40.858-0.614-51.302 1.229-32.256 5.939-58.061 17.306-82.227 36.045-4.506 3.482-9.114 7.373-10.138 8.602-1.126 1.126-2.458 2.15-3.072 2.15s-4.813-2.15-9.318-4.813zM583.168 400.179c-12.902-7.475-22.63-15.155-34.406-26.829-24.678-24.576-38.093-49.766-46.182-86.118-2.15-9.421-2.15-12.493-2.56-104.96-0.307-62.771-0.102-97.997 0.614-103.219 1.434-10.752 5.018-20.582 10.854-29.901 4.813-7.68 16.691-20.48 20.173-21.606 1.024-0.307 1.843-0.922 1.843-1.434 0-1.741 17.818-9.421 26.317-11.264 8.704-1.946 14.746-2.048 192.102-2.048h183.091l-0.41 132.403c-0.307 98.406-0.717 133.734-1.638 137.933-3.686 16.998-7.782 30.515-11.469 38.298-1.126 2.253-1.946 4.403-1.946 4.813 0 1.331-10.035 18.125-15.667 26.419-8.294 12.083-28.877 32.256-41.677 40.653-5.939 3.891-12.902 8.192-15.565 9.626l-4.71 2.458-4.608-4.198c-20.89-19.251-54.17-35.84-83.661-41.779-16.384-3.174-40.55-4.301-57.344-2.458-24.576 2.765-54.886 13.517-76.595 27.238-6.963 4.403-21.402 15.565-24.166 18.637-1.126 1.126-2.458 2.15-3.072 2.15s-4.813-2.15-9.318-4.813zM699.187 290.918c2.97-1.536 10.65-9.318 17.101-17.51 2.253-2.765 4.301-5.325 4.608-5.632 1.741-1.536 10.24-13.414 12.595-17.51 5.325-9.114 3.482-13.722-10.854-28.262-7.885-8.090-8.294-8.704-8.294-12.902 0.205-10.65 10.65-25.395 35.635-50.483 24.576-24.576 40.141-35.533 50.483-35.635 4.198-0.102 4.813 0.41 12.8 8.294 17.408 17.101 20.378 17.51 37.683 4.506 4.198-3.174 11.878-9.114 16.896-13.414 18.637-15.462 19.558-18.842 8.294-31.846-8.294-9.728-20.992-21.811-25.19-23.962-1.741-0.922-6.349-1.946-10.035-2.253-24.064-1.946-60.723 14.029-95.437 41.677-11.469 9.216-33.69 30.72-43.622 42.496-34.406 40.448-52.736 84.787-44.851 108.442 1.434 4.096 4.096 7.475 14.131 17.818 16.998 17.51 20.992 19.866 28.058 16.179z" />
+<glyph unicode="&#xe987;" glyph-name="connected_object" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM368.742 684.032c1.331-0.205 5.734-0.614 9.626-1.024 3.994-0.307 11.571-1.331 16.896-2.15 75.674-11.674 146.842-44.032 204.8-92.979 11.059-9.318 10.035-8.397 18.022-16.077 70.656-67.584 115.405-156.467 126.464-251.187 1.638-14.541 1.843-16.384 2.56-34.611l0.717-17.203h-71.987l-0.102 6.963c-0.102 13.414-1.843 35.123-3.584 45.773-7.066 42.086-17.306 73.216-35.43 108.134-36.966 71.27-99.942 128.614-174.899 159.027-24.269 9.933-57.651 18.944-78.848 21.504-2.56 0.307-8.499 1.024-13.312 1.638-9.933 1.126-19.866 1.843-29.901 1.946l-6.963 0.102v71.885l16.691-0.614c9.216-0.41 17.818-0.819 19.251-1.126zM363.418 550.912c1.331-0.205 5.837-0.922 10.035-1.536 72.909-10.138 141.414-51.098 185.651-111.104 33.792-45.875 52.326-98.509 54.886-155.853l0.614-13.619h-71.885l-0.102 6.963c0 3.789-0.205 7.987-0.41 9.421s-0.614 5.53-0.922 9.216c-1.536 17.203-7.168 39.219-14.746 57.344-26.214 62.362-82.227 109.363-147.354 123.802-12.698 2.867-30.106 5.018-41.472 5.12l-4.915 0.102v71.987l14.234-0.717c7.782-0.41 15.155-0.922 16.384-1.126zM362.701 416.154c65.331-13.107 114.176-69.53 118.272-136.499l0.614-10.854h-71.987l-0.102 4.403c-0.41 23.552-13.619 47.514-33.69 61.133-11.469 7.782-27.034 12.902-40.141 13.21l-2.867 0.102v71.987l10.035-0.717c5.427-0.41 14.438-1.638 19.866-2.765z" />
+<glyph unicode="&#xe988;" glyph-name="connection" d="M461.722 880.742c-0.205-0.205-4.506-0.614-9.626-0.922-51.712-3.379-109.67-21.197-156.672-48.333-102.4-58.982-170.189-160.563-185.242-278.016-1.536-11.264-2.15-25.702-2.15-46.080 0-25.395 0.717-35.021 4.096-56.934 19.866-126.464 104.858-234.906 223.437-284.979 31.13-13.21 64.512-22.323 95.539-26.214 3.072-0.41 6.451-0.922 7.475-1.126s6.144-0.614 11.264-1.024c5.222-0.307 9.728-0.819 10.24-1.126 2.048-1.229 0.819 1.024-13.107 24.781-5.018 8.499-10.854 18.432-13.107 22.323-2.56 4.403-4.813 7.066-6.144 7.373-1.229 0.205-5.018 0.922-8.397 1.536-25.498 4.813-57.446 15.667-81.51 27.648-33.178 16.691-59.187 35.533-85.914 62.362-29.594 29.798-49.766 59.29-67.379 98.509-7.885 17.51-13.926 36.966-20.685 66.458-4.608 20.378-6.861 58.982-4.813 86.016 9.523 129.638 98.816 242.278 223.949 282.419 16.998 5.427 37.069 9.933 57.344 12.902 19.866 2.867 60.518 2.867 83.456 0 49.459-6.144 101.888-26.112 142.848-54.477 23.245-16.179 52.531-43.315 68.71-63.693 36.659-46.285 58.778-96.666 67.891-155.136 3.789-24.064 4.096-66.253 0.614-88.064-0.512-3.379-1.229-8.192-1.536-10.752-2.253-16.077-8.602-39.834-16.077-59.904-2.355-6.144-4.198-11.776-4.198-12.288 0-1.434 29.286-51.712 30.106-51.712 1.024 0 12.39 23.552 17.715 36.557 7.885 19.354 17.818 52.531 20.48 68.403 5.325 31.949 6.554 46.592 6.246 75.776-0.307 24.781-0.41 26.829-3.174 47.104-8.192 60.621-32.666 120.115-69.939 169.984-62.054 83.149-155.136 136.704-258.15 148.582-1.946 0.205-5.837 0.614-8.704 1.024-6.042 0.614-54.272 1.638-54.886 1.024zM463.36 774.554c-64.41-4.506-125.235-32.256-171.11-78.131-67.584-67.789-94.106-165.274-70.042-257.946 17.203-66.662 60.006-124.518 119.091-161.075 14.234-8.806 33.69-18.33 48.128-23.552l3.891-1.434-3.277 5.939c-1.843 3.174-3.686 6.349-4.096 6.861-0.922 1.331-21.197 35.84-27.443 47.002-1.126 1.946-3.174 5.427-4.608 7.68-1.536 2.253-2.662 4.403-2.662 4.71 0 1.741-7.68 11.878-10.957 14.336-9.318 7.168-26.931 26.419-37.376 40.96-16.896 23.552-31.642 58.47-36.25 85.504-0.41 2.56-0.819 4.813-0.922 5.12s-0.512 3.482-0.922 7.168c-0.41 3.686-1.024 8.090-1.229 9.728-0.717 4.71-0.512 32.358 0.102 39.629 1.741 18.125 8.602 45.773 15.36 62.157 30.31 73.421 98.611 125.645 176.128 134.758 3.379 0.41 7.066 0.922 8.192 1.126 2.662 0.614 33.894 0.512 37.888 0 1.741-0.307 5.632-0.717 8.704-1.126 11.162-1.126 27.341-4.915 40.96-9.318 68.506-22.528 121.754-77.619 142.131-147.354 3.072-10.24 6.758-29.696 7.885-40.55 0.41-5.12 2.15-8.602 14.541-29.696 7.68-13.21 17.203-29.594 21.197-36.454 3.994-6.963 7.578-12.595 7.885-12.595 0.922 0 5.018 26.522 5.837 38.298 8.192 108.442-50.278 211.558-147.968 260.608-29.082 14.643-59.392 23.245-95.334 27.341-8.192 0.819-32.461 1.024-43.725 0.307zM463.872 668.467c-11.059-1.638-26.624-5.12-34.304-7.68-35.738-12.083-65.843-35.226-86.938-66.867-5.222-7.68-15.565-27.853-14.848-28.57 0.41-0.41 43.008 24.269 93.594 54.17 25.395 15.053 72.602 42.803 77.312 45.466l4.608 2.56-3.584 0.819c-3.482 0.717-30.618 0.819-35.84 0.102zM556.134 656.794c-4.506-0.922-5.837-1.536-27.443-14.131-6.963-3.994-18.022-10.445-24.576-14.336-6.656-3.789-37.888-22.118-69.427-40.55-70.349-41.165-81.203-47.514-104.243-61.030-19.456-11.366-23.552-14.643-27.443-22.221-2.048-4.096-2.458-6.349-2.458-14.541v-9.728l5.734-10.24c3.072-5.632 20.992-36.454 39.834-68.608 18.739-32.051 34.918-59.699 35.84-61.44 4.71-8.192 26.522-45.875 40.448-69.632 8.602-14.643 22.733-38.81 31.437-53.76s22.63-38.605 30.72-52.736c12.493-21.402 33.485-57.446 66.048-113.152 9.523-16.282 12.39-20.378 16.998-23.654 7.168-5.222 10.752-6.349 20.173-6.451 7.373 0 9.421 0.307 13.824 2.56 4.198 2.15 145.51 84.378 181.76 105.779 5.939 3.482 20.582 12.083 32.563 19.046 11.981 7.066 23.45 14.336 25.498 16.384 7.68 7.578 11.264 21.709 8.090 32.154-0.717 2.355-13.517 25.293-28.467 50.893-14.848 25.6-28.262 48.845-29.696 51.61-3.174 6.451-27.546 47.923-28.467 48.64-0.41 0.307-2.56 3.789-4.813 7.68-2.253 3.994-8.909 15.462-14.848 25.6s-11.674 20.275-12.8 22.528c-1.946 3.891-15.565 27.238-46.49 79.36-15.36 26.010-17.715 29.901-33.894 57.856-18.944 32.461-32.666 56.013-39.731 68.096-3.789 6.451-10.138 17.408-14.131 24.269-5.018 8.397-8.909 13.722-12.186 16.486-7.168 6.144-18.022 9.011-27.853 7.27zM587.059 582.963c4.71-8.090 11.162-19.046 14.234-24.371 6.349-10.957 114.688-196.71 120.32-206.336 1.946-3.379 19.046-32.666 37.888-65.024s34.918-59.904 35.738-61.133c1.434-2.253 0.205-3.174-23.45-16.589-6.451-3.686-198.963-116.019-201.933-117.862l-3.174-1.946-7.27 12.493c-15.258 26.112-39.629 67.891-41.267 70.861-1.024 1.741-10.547 18.022-21.197 36.352s-23.552 40.448-28.672 49.152c-5.018 8.704-19.661 33.894-32.563 55.808-12.8 22.016-24.166 41.574-25.293 43.52s-3.277 5.632-4.915 8.192c-5.018 8.090-55.194 94.72-55.808 96.256-0.307 1.024 0.922 2.355 3.789 3.994 2.458 1.331 11.366 6.451 19.763 11.366 24.781 14.541 57.139 33.382 74.24 43.315 8.704 5.018 25.293 14.746 36.864 21.504s25.6 14.95 31.232 18.227c5.632 3.277 22.016 12.902 36.352 21.299s26.214 15.36 26.317 15.36c0.102 0.102 4.096-6.451 8.806-14.438zM473.907 576c1.229-1.229 2.253-2.458 2.355-2.867 0-0.41 0.205-1.741 0.512-2.97 0.717-3.891-4.096-7.578-26.726-20.787-23.040-13.517-26.317-14.541-30.515-10.342-2.765 2.662-2.765 8.806 0 11.366 1.536 1.434 36.25 22.016 44.339 26.317 3.686 1.946 7.475 1.638 10.035-0.717zM707.174 144.282c14.336-6.758 16.077-26.624 3.174-35.738-3.686-2.662-5.222-3.072-11.059-3.072-5.632 0-7.373 0.41-10.957 2.867-10.342 6.758-11.981 22.323-3.277 31.334 5.939 6.042 15.053 7.987 22.118 4.608z" />
+<glyph unicode="&#xe989;" glyph-name="construction" d="M687.616 866.099c-14.336-1.638-30.106-8.294-40.96-17.408-7.475-6.246-7.885-6.758-88.064-112.026-18.534-24.474-39.936-52.429-47.514-62.362-7.475-9.83-17.51-22.938-22.221-29.184-4.71-6.144-14.029-18.534-20.787-27.341l-12.39-16.179 19.763-0.102c10.752 0 48.947 0 84.787 0h65.024l5.325-26.317c2.97-14.541 5.53-27.238 5.734-28.365 0.307-1.126 2.253-10.957 4.403-21.709 2.15-10.854 4.198-19.763 4.506-19.763 0.41 0 1.843 2.662 3.277 5.939 1.434 3.174 6.349 13.414 10.752 22.733 4.506 9.318 9.318 19.456 10.752 22.528 1.331 3.072 5.427 11.674 8.909 18.944 3.482 7.373 7.68 16.077 9.216 19.456s6.861 14.336 11.674 24.474c4.813 10.035 8.806 18.432 8.806 18.534 0 0.205 4.198 8.909 9.216 19.456 5.12 10.547 9.216 19.251 9.216 19.456 0 0.102 3.891 8.294 8.499 18.022 4.71 9.83 10.342 21.504 12.493 26.010s6.554 13.926 9.933 20.992c12.083 25.293 14.234 32.563 14.234 47.718 0 36.045-24.986 67.174-60.006 75.162-5.325 1.229-19.149 1.946-24.576 1.331zM787.968 745.779c-1.024-2.458-5.939-12.902-10.957-23.245-4.915-10.342-9.011-18.944-9.011-19.149 0-0.102-4.403-9.318-9.728-20.48-5.325-11.059-9.728-20.275-9.728-20.378 0-0.205-3.482-7.578-7.782-16.486-4.301-9.011-9.114-19.251-10.854-22.938s-4.71-9.83-6.554-13.619l-3.379-6.963 2.867-3.277c1.536-1.843 3.379-4.301 4.198-5.427 0.819-1.229 12.595-16.384 26.112-33.69s26.419-33.894 28.672-36.864c2.253-2.867 9.421-12.083 15.872-20.378s17.203-22.118 23.859-30.618c16.384-21.094 17.306-22.323 19.661-24.883l2.048-2.253 29.696 23.347c19.149 15.155 29.594 24.064 29.389 25.088-0.205 0.819-2.97 7.68-6.246 15.155-3.277 7.373-12.39 28.058-20.070 45.773-7.782 17.715-14.95 34.099-15.872 36.352-1.024 2.253-10.035 22.733-19.968 45.568s-18.842 43.315-19.866 45.568c-1.024 2.253-7.987 18.125-15.462 35.328s-13.926 31.539-14.234 32.051c-0.41 0.41-1.536-1.229-2.662-3.584zM397.005 499.507l-38.298-76.595-96.154-0.614c-100.352-0.512-97.997-0.41-110.694-5.12-22.528-8.499-39.526-27.341-47.206-52.634-1.331-4.198-1.638-13.722-1.946-52.531-0.41-49.664-0.102-56.32 3.994-68.096 7.373-21.811 25.395-40.141 46.387-47.309 13.517-4.71 4.813-4.506 242.176-4.506 248.627-0.102 231.629-0.512 244.224 6.554 12.186 6.758 22.118 20.378 24.986 34.304 1.434 6.554 1.434 40.96 0 46.694-0.512 2.253-2.765 13.005-4.915 23.962-5.632 27.955-12.902 63.59-23.654 116.736-5.12 25.088-10.65 52.224-12.288 60.416-13.517 66.867-18.534 91.853-19.046 93.491s-5.427 1.741-84.89 1.741h-84.378l-38.298-76.493zM899.994 454.861c-10.957-8.704-45.466-35.84-76.698-60.416-31.232-24.678-62.874-49.562-70.349-55.501s-13.926-10.752-14.336-10.752c-0.41 0-2.15 1.946-3.891 4.198-4.301 5.837-7.987 8.192-12.8 8.294-7.168 0.102-12.595-5.325-12.698-12.493 0-5.427 5.427-13.21 18.33-26.214 13.005-13.107 19.968-18.227 34.099-25.395 41.779-20.992 91.546-17.306 131.277 9.728 9.216 6.246 25.19 22.426 31.437 31.744 11.571 17.203 19.558 37.581 21.606 55.194 1.331 11.674 0.717 33.69-1.126 42.598-3.584 16.896-11.366 35.43-20.48 48.23l-4.506 6.451-19.866-15.667zM169.882 165.99c-0.205-0.205-2.253-0.717-4.506-1.024-23.552-3.686-47.411-22.528-56.627-45.056-3.686-9.114-5.222-15.462-5.939-25.19-2.867-38.195 23.552-72.704 61.542-80.282 7.373-1.536 28.979-1.638 223.232-1.331 203.571 0.205 215.347 0.307 221.184 2.048 35.123 10.547 57.446 40.858 56.422 76.493-0.41 16.282-5.12 30.515-13.926 42.496-11.776 15.872-27.238 26.010-46.080 30.31-8.397 1.843-16.384 1.843-221.798 1.946-117.146 0-213.197-0.205-213.504-0.41zM187.085 113.664c11.162-3.277 18.637-14.95 17.408-26.931-2.15-20.992-28.262-30.106-43.213-15.053-10.138 10.035-10.035 25.6 0.205 35.84 7.066 7.066 15.565 9.114 25.6 6.144zM294.912 111.309c16.384-10.035 15.974-34.099-0.717-43.93-9.83-5.734-24.883-3.072-32.154 5.734-3.482 4.198-6.042 11.264-6.042 16.486 0 9.83 7.373 20.582 16.486 23.859 6.656 2.458 16.384 1.536 22.426-2.15zM392.294 113.664c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493s-0.41-8.397-2.867-12.493c-10.035-17.101-34.406-17.101-44.442-0.102-5.734 9.83-3.072 24.883 5.837 32.256 6.656 5.427 16.589 7.27 24.678 4.403zM499.712 111.309c12.083-7.373 15.77-23.45 8.090-35.43-8.499-13.517-27.955-15.667-39.322-4.301-4.506 4.506-7.68 11.776-7.68 17.613 0 10.035 7.475 20.992 16.691 24.371 6.451 2.355 16.282 1.434 22.221-2.253zM597.504 113.459c19.456-6.554 22.528-34.202 5.12-45.261-15.872-10.035-37.171 0.102-39.117 18.534-1.946 18.842 15.974 32.87 33.997 26.726z" />
+<glyph unicode="&#xe98a;" glyph-name="contact_card" d="M76.902 481.587c0.102-339.456-0.307-317.747 5.734-331.981 9.933-23.757 30.822-40.96 55.808-46.080 6.758-1.434 18.227-1.638 82.227-1.638h74.24v49.664l-3.072 3.584c-1.741 1.946-4.608 6.554-6.451 10.24-2.97 5.939-3.277 7.475-3.277 15.872s0.307 9.933 3.379 16.077c4.301 8.704 10.138 14.541 18.637 18.637 5.939 2.867 7.68 3.174 15.872 3.174s9.933-0.41 15.872-3.174c8.397-3.994 14.438-10.035 18.637-18.637 3.072-6.144 3.379-7.68 3.379-16.077 0-10.547-1.843-15.667-8.704-24.576l-4.096-5.325v-49.459h332.8v26.112c0 14.336-0.41 26.112-0.922 26.112-1.946 0-8.294 11.162-9.933 17.408-6.451 25.395 13.517 49.664 39.322 47.821 14.234-1.024 26.112-9.216 32.154-22.016 6.758-14.234 4.301-29.082-6.758-41.574l-2.662-2.97v-50.893h218.112v310.067c0 211.456-0.307 312.115-1.126 316.621-5.12 32.154-31.232 58.266-63.386 63.386-4.608 0.819-132.096 1.126-406.323 1.126h-399.565l0.102-311.501zM469.504 663.45c5.837-2.048 12.186-7.987 14.848-14.029 1.843-4.096 1.843-10.854 1.946-162.509 0.102-106.394-0.205-159.437-0.922-161.997-1.638-5.734-7.066-12.186-12.8-15.053-4.71-2.458-6.246-2.662-21.197-2.97l-16.179-0.307-0.102 11.264c-0.102 6.246-0.205 11.674-0.307 12.186-0.102 0.41-0.614 3.482-1.024 6.861-4.71 35.43-29.286 69.018-62.566 85.504-27.853 13.824-58.368 15.872-87.757 6.144-35.43-11.878-63.488-41.165-73.933-77.107-3.482-11.878-4.506-19.661-4.608-35.226l-0.102-9.523h-14.643c-17.613 0-22.528 1.331-28.877 7.68-8.294 8.294-7.782-5.325-7.475 173.67l0.307 159.13 2.867 4.813c1.536 2.662 4.301 6.042 6.246 7.475 7.578 5.734-0.819 5.53 156.365 5.53 131.891 0.102 145.408 0 149.914-1.536zM851.354 664.064c18.637-4.301 25.19-29.082 11.264-42.598-8.397-8.090 1.331-7.578-146.739-7.578-107.315 0.102-132.403 0.307-135.578 1.434-5.632 2.048-10.342 6.042-13.619 11.571-2.56 4.301-2.97 5.939-2.97 12.595 0 6.554 0.512 8.499 2.867 12.493 3.379 5.734 8.294 9.728 14.234 11.571 3.584 1.126 29.082 1.434 135.475 1.434 75.366 0 132.813-0.307 135.066-0.922zM853.094 535.552c6.144-2.15 10.65-5.939 13.926-11.469 2.253-3.891 2.765-6.042 2.765-12.083 0.102-8.704-2.765-15.36-8.704-20.070-8.090-6.349 0.205-6.042-144.179-6.042-148.173 0-137.83-0.512-146.022 7.68-13.414 13.414-7.885 36.454 10.138 42.086 3.379 1.024 31.232 1.331 135.885 1.331 115.405 0.102 132.301-0.102 136.192-1.434zM754.176 406.221c8.294-4.71 13.824-14.029 13.824-23.245 0-5.734-3.174-13.005-7.68-17.408-7.987-7.987-3.994-7.68-94.208-7.68-66.048 0-80.896 0.205-84.89 1.434-18.125 5.53-23.859 28.57-10.342 42.086 7.885 7.885 3.174 7.578 96.256 7.373l82.944-0.205 4.096-2.355zM308.736 613.171c-9.421-2.048-16.077-3.891-19.968-5.734-37.274-17.101-54.784-57.958-41.472-96.256 8.192-23.245 28.467-41.882 52.736-48.435 8.294-2.253 25.907-2.662 34.509-0.819 23.654 4.915 42.803 19.558 53.453 40.96 6.144 12.288 7.68 19.251 7.68 34.202 0.102 14.746-1.434 21.402-7.782 34.202-10.445 21.402-29.696 36.147-53.248 40.96-7.27 1.536-21.094 2.048-25.907 0.922z" />
+<glyph unicode="&#xe98b;" glyph-name="control_centre" d="M493.466 882.79c-0.205-0.205-3.891-0.717-8.090-1.024-48.435-4.506-99.021-25.395-142.336-58.88-62.771-48.538-112.947-124.621-139.776-212.173l-2.662-8.806-19.149-0.614c-12.902-0.41-21.197-1.126-25.293-2.253-21.811-5.939-35.226-13.619-49.869-28.467-5.018-4.915-9.011-9.421-9.011-9.933s-1.126-2.15-2.458-3.789c-3.686-4.403-9.626-16.077-12.39-24.269-5.53-16.384-5.734-21.094-5.325-89.293 0.307-59.597 0.41-62.771 2.458-70.554 8.704-32.563 31.027-58.47 61.030-70.758 13.312-5.427 20.582-6.656 40.858-7.27l19.046-0.614 3.277-10.342c39.526-127.181 124.416-223.744 226.509-257.638 11.878-3.994 31.334-8.602 42.803-10.24 4.813-0.614 9.83-1.434 11.264-1.638s9.728-0.717 18.432-1.024c98.918-3.994 194.355 50.688 259.891 148.582 24.166 36.25 44.544 79.667 58.061 123.699l2.765 8.909h14.029c22.528 0 36.864 2.97 52.736 10.854 10.957 5.427 17.51 10.138 26.624 19.251 13.312 13.21 22.016 28.16 27.034 46.592l2.765 9.83v134.144l-2.662 9.728c-10.342 37.069-37.171 63.693-74.65 73.83-5.939 1.638-12.083 2.253-26.829 2.662-18.432 0.512-19.251 0.614-19.763 2.765-2.867 10.138-11.059 33.587-16.077 46.182-28.262 70.554-73.728 132.915-126.259 173.158-27.853 21.299-64 40.038-94.208 48.845-14.848 4.301-22.323 5.939-45.056 9.421-4.506 0.717-47.104 1.741-47.718 1.126zM313.344 658.534c48.435-9.318 97.382-31.232 152.781-68.506 15.155-10.138 21.709-14.95 48.947-35.738 30.31-23.040 57.446-37.683 90.624-48.845 18.842-6.349 42.496-11.264 62.976-13.107 10.65-1.024 38.605-1.024 49.459 0 23.142 2.048 52.326 9.421 66.048 16.691 2.56 1.331 4.71 2.458 4.915 2.458 0.614 0 1.536-7.066 2.867-22.016 1.843-20.173 1.434-71.475-0.717-92.16-5.53-52.736-17.818-100.352-37.683-145.92-1.126-2.56-2.355-5.325-2.867-6.144-0.717-1.331-11.264-1.536-83.354-1.843l-82.534-0.205-3.789 7.782c-9.318 19.456-26.829 34.202-48.128 40.448-6.758 2.048-10.342 2.458-21.402 2.355-12.288 0-14.029-0.307-23.45-3.482-54.272-18.432-70.451-86.016-30.413-126.771 9.626-9.728 22.835-17.203 36.25-20.582 14.234-3.482 33.28-2.15 46.899 3.482 17.408 7.066 33.28 22.323 41.165 39.629l2.765 5.939h136.294l-1.843-3.174c-6.656-11.264-27.034-35.942-41.677-50.586-51.302-51.098-111.104-76.493-173.67-73.83-8.192 0.307-16.179 0.819-17.92 1.126-1.638 0.307-5.837 1.024-9.216 1.638-38.81 6.451-77.107 25.088-113.152 54.989-10.342 8.602-30.515 29.696-41.062 42.906-11.059 13.722-25.6 35.328-34.509 50.995-5.837 10.445-18.33 36.352-21.197 44.032-1.024 2.867-2.253 5.632-2.662 6.144-0.41 0.614-3.994 10.752-7.885 22.528-13.619 40.755-20.685 75.981-24.678 123.392-1.024 12.39-1.024 58.163-0.102 69.632 0.512 4.813 1.126 11.981 1.434 15.872 3.072 38.502 13.722 84.992 28.262 123.904 7.168 19.251 11.059 26.214 17.715 31.13 9.626 7.168 18.944 8.806 34.509 5.837z" />
+<glyph unicode="&#xe98c;" glyph-name="control_mydata" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-62.976-50.893-109.875-117.043-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-56.32 75.366-137.216 130.97-228.762 157.082-23.040 6.554-51.2 11.981-72.704 14.029-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM546.816 804.966c1.434-0.307 8.090-1.229 14.848-2.15 50.688-6.656 103.731-26.624 146.432-54.886 16.077-10.65 29.286-20.787 44.442-34.406l3.686-3.174-27.136-27.136-27.034-27.238-5.018 4.301c-15.77 13.312-35.123 27.136-36.25 25.907-0.614-0.614-5.837-28.365-20.378-107.622-2.048-11.571-12.288-67.072-15.258-82.944-1.331-7.27-4.813-26.214-7.68-41.984-5.427-29.798-8.294-40.755-13.619-51.2-9.011-17.92-23.45-33.28-40.141-42.701-15.974-9.011-30.822-13.21-48.64-13.722-40.243-1.024-76.288 20.582-94.72 56.934-11.469 22.63-13.619 52.634-5.53 77.107 3.994 12.288 10.035 22.221 35.226 57.549 14.029 19.763 27.136 38.195 29.082 41.062 5.734 8.090 30.106 42.496 64 90.214 32.87 46.080 36.659 51.814 35.533 52.429-2.15 1.331-24.166 5.325-36.966 6.656-22.118 2.355-61.44 1.024-80.384-2.867-10.138-2.048-18.33-3.891-22.733-5.222-2.97-0.819-7.578-2.15-10.24-2.97-10.957-3.072-26.317-9.421-41.882-17.101-21.402-10.65-40.038-23.040-58.778-38.912l-5.734-4.813-26.829 26.829c-14.746 14.746-26.829 27.136-26.829 27.546 0 0.512 12.595 11.469 23.040 19.968 20.685 16.998 59.392 39.322 87.040 50.176 27.443 10.752 59.699 19.456 83.354 22.221 2.56 0.307 5.837 0.819 7.27 1.024s6.246 0.717 10.752 1.126c4.506 0.307 8.397 0.819 8.602 1.024 0.512 0.512 55.603-0.41 58.47-1.024zM277.197 664.883l26.829-26.829-2.97-3.584c-1.536-2.048-3.789-4.608-4.813-5.734-8.499-9.011-24.371-32.563-33.178-49.050l-6.246-11.878 5.53-2.355c2.97-1.229 13.619-5.734 23.552-9.933l18.125-7.475-1.331-3.174c-0.717-1.741-2.867-6.963-4.813-11.674-2.458-6.246-3.891-8.397-5.018-8.090-0.819 0.205-23.45 9.523-50.176 20.685s-52.531 21.811-57.344 23.757c-4.813 1.946-8.806 3.686-9.011 3.789-0.102 0.205 1.638 4.915 3.994 10.445 15.462 37.376 36.352 70.861 63.181 101.581 3.072 3.482 5.837 6.349 6.246 6.349 0.307 0 12.698-12.083 27.443-26.829zM783.053 682.291c20.48-24.064 34.202-44.339 48.435-71.987 5.837-11.366 16.794-36.352 16.077-36.966-0.205-0.205-51.712-21.606-97.792-40.55-10.854-4.506-19.968-7.987-20.173-7.885-0.205 0.205-1.741 3.891-3.379 8.090-1.741 4.198-3.789 9.318-4.71 11.366l-1.536 3.789 21.709 8.909c11.981 4.915 22.528 9.421 23.552 9.933 1.638 0.819 1.434 1.638-2.56 9.318-4.403 8.602-13.722 24.371-17.715 29.901-7.27 10.138-14.643 19.661-19.456 25.293l-5.53 6.451 26.829 26.931c14.746 14.746 27.136 26.829 27.546 26.829 0.307 0 4.301-4.301 8.704-9.421zM646.246 769.843c-9.011-12.39-21.709-30.31-38.4-54.067-9.523-13.517-19.251-27.136-21.504-30.31-2.355-3.072-6.451-9.011-9.318-13.005-2.765-4.096-10.445-14.848-16.998-24.064-6.451-9.114-19.661-27.648-29.286-41.165-9.523-13.517-32.154-45.261-50.074-70.656-18.022-25.293-33.894-48.23-35.43-50.79-11.981-20.48-12.902-49.766-2.15-70.861 10.138-20.070 27.546-34.714 48.435-40.653 11.981-3.379 27.75-3.584 39.424-0.512 26.112 6.963 46.797 26.214 54.374 50.586 1.331 4.301 9.318 45.67 15.258 78.95 1.331 7.578 3.584 20.070 5.018 27.648s4.198 22.835 6.246 33.792c2.048 10.957 4.403 23.654 5.222 28.16s1.843 9.626 2.048 11.264c0.307 1.741 1.946 10.445 3.584 19.456 1.741 9.011 3.482 18.739 3.994 21.504 1.536 9.216 8.090 44.851 9.626 52.736 1.331 6.758 3.584 18.944 5.12 28.16 0.307 1.741 1.024 5.632 1.741 8.704 0.614 3.072 1.331 7.27 1.638 9.216s1.741 9.933 3.277 17.715c1.536 7.68 2.662 14.029 2.56 14.029s-2.048-2.662-4.403-5.837z" />
+<glyph unicode="&#xe98d;" glyph-name="copy" d="M153.907 581.939c0.307-330.342-0.205-302.387 6.144-317.85 6.963-17.203 22.528-32.666 40.448-40.346 13.517-5.734 16.179-5.939 76.8-6.042l55.501-0.102v128h-40.243c-45.875 0-47.002 0.205-54.477 7.68-11.981 11.878-9.421 31.232 5.325 40.038l4.915 2.97 84.48 0.614v50.995l-42.189 0.307c-47.206 0.307-45.056 0-52.941 7.885-11.878 11.878-8.499 32.358 6.656 40.038l5.018 2.56 83.456 0.614v50.995l-83.558 0.614-5.018 2.662c-17.715 9.114-17.92 34.918-0.41 44.954l4.506 2.56 84.48 0.614v102.298h147.558l-3.482 4.403c-6.861 8.294-12.698 21.606-14.95 33.792-0.512 2.662-0.922 5.12-1.024 5.325 0 0.307-0.102 30.925-0.102 68.096v67.584h-307.2l0.307-301.261zM512 816.845c0-74.138-0.205-71.782 7.885-79.667 7.987-7.782 5.632-7.578 79.872-7.578h65.843l-76.288 76.288c-41.984 41.984-76.595 76.288-76.8 76.288-0.307 0-0.512-29.389-0.512-65.331zM358.4 380.416c0-324.096-0.307-304.23 5.53-319.181 6.963-17.818 22.528-33.997 39.936-41.677 15.155-6.758-5.734-6.144 242.074-6.451l224.461-0.307v460.698l-70.861 0.307c-79.462 0.41-75.469 0.102-91.443 8.090-23.142 11.776-39.322 34.714-41.882 59.392-0.307 2.458-0.512 34.304-0.512 70.861l-0.102 66.253h-307.2v-297.984zM780.902 393.216c6.042-3.789 11.366-11.366 12.288-17.715 1.638-10.752-3.994-21.914-13.414-26.726l-5.018-2.662-158.208-0.307c-177.971-0.307-165.478-0.819-173.568 7.373-9.011 9.011-10.138 22.835-2.765 33.28 2.662 3.686 9.421 8.294 13.619 9.318 1.843 0.512 75.059 0.717 162.714 0.717l159.334-0.205 5.018-3.072zM776.294 292.864c17.715-6.042 22.938-28.774 9.626-41.984-8.294-8.294 5.427-7.782-173.568-7.475-178.381 0.307-161.382-0.41-169.779 7.885-9.83 9.728-9.626 25.702 0.512 35.533 8.192 7.987-5.222 7.373 170.906 7.475 138.957 0.102 158.31-0.102 162.304-1.434zM780.595 188.518c14.746-8.806 17.306-28.16 5.325-40.038-8.192-8.294 5.222-7.68-171.52-7.68-176.333 0-162.918-0.614-171.315 7.578-9.216 8.909-10.342 22.835-2.662 33.485 2.56 3.584 9.318 8.090 13.722 9.216 1.741 0.41 74.752 0.614 162.304 0.614l159.232-0.205 4.915-2.97zM716.8 612.045c0-73.421-0.205-71.68 7.373-79.258 8.192-8.192 4.301-7.782 78.95-7.885 36.454-0.102 66.253 0.102 66.253 0.41 0 0.614-151.45 152.064-152.064 152.064-0.307 0-0.512-29.389-0.512-65.331z" />
+<glyph unicode="&#xe98e;" glyph-name="Courier" d="M228.352 831.283c-14.746-1.434-31.232-6.144-43.622-12.288-8.499-4.301-90.931-51.302-96.154-54.886-10.24-7.066-13.824-19.558-8.909-30.72 4.096-9.318 12.186-14.438 22.733-14.541 7.987 0 5.734-1.126 64.512 32.768 44.442 25.498 51.302 28.57 66.662 29.798 18.432 1.331 36.352-3.891 51.61-15.155 9.114-6.656 15.974-15.36 24.781-31.027 2.253-3.891 48.026-82.739 101.683-175.104s98.714-169.984 100.147-172.544c1.331-2.56 3.994-7.168 5.939-10.24 6.758-11.366 36.454-62.771 36.864-63.898 0.307-0.819-3.277-1.024-12.595-0.922-20.173 0.307-37.171-3.379-55.398-11.981-79.258-37.581-95.949-142.848-32.154-202.854 17.818-16.794 39.117-27.546 63.693-32.358 11.571-2.15 33.587-2.15 45.056 0 52.224 10.138 91.853 49.971 100.966 101.478 0.922 5.12 1.741 15.258 1.843 22.528l0.102 13.21 27.136 15.565c14.95 8.499 41.472 23.757 58.88 33.792 17.51 10.035 36.557 20.992 42.496 24.371s12.186 6.963 13.824 7.885c1.741 1.024 21.299 12.288 43.52 25.088s42.803 24.576 45.568 26.112c2.867 1.536 8.602 4.915 12.8 7.373 4.198 2.56 10.445 6.144 13.824 7.987 15.872 8.704 20.992 13.722 22.835 22.221 2.56 11.674-4.096 24.474-14.848 28.57-9.421 3.584-16.691 2.15-31.027-6.349-2.56-1.536-21.606-12.493-42.496-24.474-58.163-33.382-124.826-71.578-169.165-97.075l-40.141-23.040-11.981 20.582c-6.554 11.366-21.709 37.478-33.69 58.061s-35.84 61.85-53.146 91.648c-32.87 56.525-35.942 61.952-44.339 76.288-12.595 21.606-18.944 32.461-59.187 101.888-23.45 40.55-46.694 80.691-51.712 89.088-4.915 8.499-18.33 31.539-29.696 51.2-26.214 45.363-33.69 55.091-52.736 68.608-15.053 10.752-32.563 18.227-50.278 21.504-8.294 1.638-26.624 2.56-34.202 1.843zM553.37 236.032c26.419-6.758 42.598-33.587 35.84-59.802-5.837-22.63-25.19-37.683-48.538-37.683-44.237-0.102-66.765 53.248-35.635 84.378 13.107 13.107 30.208 17.818 48.333 13.107zM751.514 683.213c-2.048-0.819-8.909-4.403-15.36-8.090-86.118-49.562-128.102-73.626-170.906-98.099-39.629-22.63-43.725-25.702-46.694-35.123-3.584-11.571-9.523-0.205 88.166-168.141 6.861-11.776 18.637-32.051 26.112-45.056 14.643-25.19 17.51-29.082 24.166-32.256 4.813-2.355 14.746-2.97 19.251-1.126 2.97 1.229 52.838 29.696 145.51 83.046 9.626 5.53 19.354 11.162 21.606 12.493 40.858 23.142 56.422 32.461 58.88 34.918 4.915 4.813 7.27 10.445 7.373 17.51 0.102 6.451-1.126 9.83-6.554 19.046-11.674 19.763-50.278 86.323-53.453 92.16-1.638 3.072-3.379 6.144-3.789 6.656-0.41 0.614-13.312 22.733-28.672 49.152-15.258 26.522-29.696 51.405-32.051 55.296-5.12 8.806-9.216 13.414-14.438 16.077-5.12 2.662-14.234 3.379-19.149 1.536z" />
+<glyph unicode="&#xe98f;" glyph-name="CPU" d="M281.6 819.2v-38.4h-28.877c-31.334 0-34.918-0.512-45.773-5.734-11.571-5.632-24.064-21.606-26.419-33.69-0.41-2.253-0.819-4.403-0.922-4.813-0.102-0.512-0.205-13.722-0.307-29.491l-0.102-28.672h-76.8v-51.2h76.8v-51.2h-76.8v-51.2h76.8v-51.2h-76.8v-51.2h76.8v-51.2h-76.8v-51.2h76.8v-51.2h-76.8v-51.2h76.8l0.102-28.365c0.102-31.027 0.102-31.949 2.97-40.038 5.427-15.36 18.842-27.75 34.714-32.051 5.734-1.638 10.957-1.843 35.738-1.946h28.877v-76.8h51.2v76.8h51.2v-76.8h51.2v76.8h51.2v-76.8h51.2v76.8h51.2v-76.8h51.2v76.8h51.2v-76.8h51.2v76.8l28.467 0.102c30.413 0.102 30.822 0.102 38.605 2.56 15.053 4.813 27.955 17.613 32.666 32.666 2.458 7.782 2.458 8.192 2.56 38.707l0.102 28.365h76.8v51.2h-76.8v51.2h76.8v51.2h-76.8v51.2h76.8v51.2h-76.8v51.2h76.8v51.2h-76.8v51.2h76.8v51.2h-76.8l-0.102 28.672c-0.102 15.77-0.205 28.979-0.307 29.491-0.102 0.41-0.512 2.56-1.024 4.71-1.536 7.987-6.861 17.306-13.824 24.269-7.475 7.373-11.776 9.933-22.118 13.107-6.246 1.946-9.421 2.15-35.942 2.15h-29.082v76.8h-51.2v-76.8h-51.2v76.8h-51.2v-76.8h-51.2v76.8h-51.2v-76.8h-51.2v76.8h-51.2v-76.8h-51.2v76.8h-51.2v-38.4zM691.2 448v-179.2h-358.4v358.4h358.4v-179.2zM358.4 448v-153.6h307.2v307.2h-307.2v-153.6z" />
+<glyph unicode="&#xe990;" glyph-name="crane" d="M237.056 881.254c-3.891-2.458-182.579-181.248-184.422-184.525-1.024-1.946-1.331-11.571-1.434-43.93 0-39.322 0.102-41.677 2.048-44.749 4.096-6.758-0.717-6.451 92.672-6.451h84.48v-486.4h-26.931c-29.286 0-33.587-0.614-40.141-5.53-1.946-1.536-4.813-4.915-6.349-7.578l-2.867-4.813-0.307-54.989-0.307-55.091h358.502v53.146c0 57.549 0 57.856-5.734 65.331-1.331 1.843-4.71 4.608-7.373 6.144l-4.813 2.867-58.88 0.614v486.298h384v-128h25.6v128h51.2v-128h25.6v127.488l7.782 1.331c29.389 4.608 49.152 33.894 41.882 62.157-4.403 16.896-16.179 30.413-31.539 35.942-6.349 2.355-7.475 2.56-18.125 3.379-7.987 0.717-12.186 1.741-23.552 6.042-13.722 5.12-25.293 9.318-88.576 32.461-18.022 6.554-38.707 14.131-46.080 16.896-15.565 5.734-43.725 16.077-95.232 34.816-20.275 7.373-39.322 14.336-42.189 15.36-2.97 1.126-7.885 2.97-10.752 4.096-2.97 1.024-19.456 7.066-36.659 13.414-17.203 6.246-45.773 16.691-63.488 23.142-17.715 6.554-37.069 13.619-43.008 15.667-5.939 2.15-18.33 6.861-27.648 10.445l-16.896 6.451-93.696 0.307c-90.317 0.205-93.798 0.102-96.768-1.741zM462.438 842.138c14.029-5.12 29.696-10.854 34.714-12.698 5.12-1.843 19.558-7.168 32.256-11.878 12.698-4.608 25.6-9.318 28.672-10.342 3.072-1.126 6.554-2.355 7.68-2.867s9.626-3.686 18.944-7.066c16.589-5.939 106.906-38.912 136.192-49.766 8.192-2.97 36.966-13.517 64-23.347 27.034-9.933 50.278-18.432 51.712-19.046 1.741-0.614-63.795-1.024-199.373-1.024l-202.035-0.102v73.728c0 40.55 0.41 73.728 0.819 73.728 0.512 0 12.39-4.198 26.419-9.318zM230.4 771.584v-67.584h-135.68l67.584 67.584c37.171 37.171 67.686 67.584 67.789 67.584 0.205 0 0.307-30.413 0.307-67.584zM367.104 830.054c-2.662-2.56-82.637-69.12-84.275-70.144-0.922-0.614-1.229 7.168-1.229 35.635v36.454h43.725c43.008 0 43.725 0 41.779-1.946zM383.693 704.307c-0.205-0.205-19.866-0.205-43.725-0.102l-43.418 0.307 86.938 72.397 0.307-36.045c0.102-19.866 0.102-36.352-0.102-36.557zM366.080 598.835c-5.632-5.018-81.92-68.506-83.149-69.222-1.024-0.717-1.331 6.758-1.331 35.533v36.454h43.827l43.725-0.102-3.072-2.662zM383.693 473.907c-0.205-0.205-19.866-0.205-43.725-0.102l-43.418 0.307 86.938 72.397 0.307-36.045c0.102-19.866 0.102-36.352-0.102-36.557zM366.592 419.942c-3.174-2.97-81.92-68.506-83.661-69.632-1.024-0.614-1.331 6.861-1.331 35.635v36.454h87.552l-2.56-2.458zM383.693 294.707c-0.205-0.205-19.866-0.205-43.725-0.102l-43.315 0.307 43.418 36.25 43.418 36.147 0.307-36.045c0.102-19.866 0.102-36.352-0.102-36.557zM368.64 242.79c0-0.512-83.661-70.349-85.709-71.578-1.126-0.717-1.331 5.734-1.331 35.635v36.352h43.52c23.962 0 43.52-0.205 43.52-0.41zM383.693 115.507c-0.205-0.205-19.866-0.205-43.725-0.102l-43.315 0.307 86.835 72.499 0.307-36.147c0.102-19.866 0.102-36.352-0.102-36.557zM799.539 446.362c-3.482-1.843-5.939-6.349-5.939-10.957 0-3.891 3.072-9.216 17.408-29.798 5.325-7.68 15.155-21.811 21.811-31.334l11.981-17.408v-19.763c0-22.528 1.024-27.75 6.349-33.792 4.915-5.427 10.138-7.782 19.661-9.011 12.493-1.536 20.173-7.066 23.757-17.203 5.734-15.872-7.168-33.894-24.166-33.894-13.414 0-25.6 12.083-25.6 25.498 0 6.861-5.53 12.493-12.083 12.595-9.523 0.102-14.234-6.042-13.107-17.408 2.15-21.811 17.203-39.117 39.014-44.749 16.998-4.301 34.714 0.717 47.718 13.722 15.565 15.565 19.456 38.4 10.035 58.061-3.277 7.066-11.366 16.486-16.896 19.866l-3.482 2.253v44.032l8.499 12.186c4.608 6.758 15.258 22.016 23.552 33.997 8.397 11.878 16.077 23.45 17.203 25.498 3.686 7.168 1.638 14.643-4.813 17.715-4.915 2.253-136.704 2.253-140.902-0.102z" />
+<glyph unicode="&#xe991;" glyph-name="Crop" d="M270.336 881.869c-19.968-4.71-35.942-21.606-39.322-41.677-0.307-1.434-0.512-26.829-0.512-56.525l-0.102-54.067h-53.043c-33.69 0-55.296-0.41-59.187-1.126-17.101-3.072-32.358-16.282-38.502-33.382-2.765-7.475-3.379-21.299-1.331-28.877 5.12-19.661 21.811-35.123 41.472-38.4 1.434-0.307 26.829-0.512 56.627-0.512l53.965-0.102v-207.36c0-147.354 0.307-208.794 1.126-212.685 4.096-19.558 20.89-36.147 40.243-39.629 4.301-0.819 68.813-1.126 212.787-1.126h206.643l0.102-53.965c0-29.798 0.205-55.194 0.512-56.627 3.072-18.432 16.794-34.304 34.714-40.448 6.963-2.355 19.456-3.072 26.214-1.536 20.48 4.71 36.966 21.811 40.243 41.574 0.205 1.638 0.512 27.238 0.512 57.037l0.102 53.965h53.76c35.226 0 55.501 0.41 59.085 1.126 24.678 5.12 42.496 28.877 40.448 53.965-1.741 22.426-18.534 41.574-40.448 46.182-3.584 0.717-23.859 1.126-59.085 1.126h-53.76v424.448l74.138 74.24c44.339 44.237 75.059 75.776 76.39 78.234 6.554 12.288 1.331 28.365-11.366 34.918-5.12 2.662-13.107 3.072-19.456 1.024-5.222-1.741-9.421-5.632-80.794-76.902l-75.264-75.162h-424.448v54.579c0 43.93-0.307 55.501-1.536 60.006-4.403 16.896-16.794 30.413-32.973 36.147-7.373 2.56-20.275 3.277-27.955 1.536zM627.2 599.552c-41.165-41.267-293.376-293.274-293.888-293.786-0.307-0.205-0.512 71.987-0.512 160.461v160.973h322.048l-27.648-27.648zM690.893 269.107c-0.205-0.205-72.602-0.205-160.87-0.102l-160.358 0.307 321.024 321.024 0.307-160.461c0.102-88.166 0.102-160.563-0.102-160.768z" />
+<glyph unicode="&#xe992;" glyph-name="Currency_brazilian_real" d="M76.8 473.6v-256h819.2v512h-819.2v-256zM768.307 669.491c-2.253-38.195 29.286-69.837 67.584-67.584l8.909 0.512v-257.434h-11.981c-8.806 0-13.722-0.512-18.227-1.843-29.184-8.909-48.026-35.635-46.285-65.331l0.614-9.011h-565.043l0.614 7.987c1.946 25.702-11.981 50.381-34.714 61.542-11.264 5.632-21.197 7.68-32.768 6.861l-9.011-0.614v257.536h12.595c10.854 0.102 13.517 0.512 20.378 2.867 15.667 5.427 28.979 16.794 36.454 31.13 5.325 10.24 7.27 19.456 6.861 32.358l-0.307 9.933h564.941l-0.614-8.909zM467.763 626.074c-63.078-8.192-113.869-52.736-129.843-113.664-3.891-14.746-4.608-22.118-4.506-42.394 0.205-22.63 4.506-41.677 13.824-61.44 21.811-46.182 63.386-77.517 114.995-86.528 11.571-2.048 39.936-2.048 49.254-0.102 2.867 0.614 6.042 1.229 7.168 1.434 8.397 1.434 25.088 7.373 35.738 12.698 43.93 21.914 73.114 60.518 83.149 109.875 1.946 9.626 2.56 38.195 1.126 48.128-5.427 35.635-20.685 65.638-45.67 90.010-22.938 22.221-49.357 35.226-84.070 41.574-6.042 1.024-33.894 1.331-41.165 0.41zM495.616 583.885c6.554-4.301 7.68-7.68 8.090-25.395 0.102-2.458 0.819-2.867 8.294-4.813 26.624-7.168 35.84-19.866 27.034-37.581-5.222-10.65-13.312-13.107-27.034-8.294-24.883 8.806-39.322 5.734-49.562-10.445-11.366-18.125-7.066-45.363 9.114-56.525 10.854-7.475 22.426-7.475 42.701-0.102 3.277 1.229 7.373 2.15 9.216 2.15 4.915 0 11.264-3.584 14.643-8.499 2.765-3.789 3.072-5.12 2.97-11.674 0-6.144-0.41-7.987-2.765-11.469-4.096-6.144-11.264-10.854-21.914-14.336-5.12-1.741-10.138-3.174-10.957-3.174-0.922 0-1.638-0.307-1.741-0.717 0-0.512-0.102-5.222-0.205-10.547-0.205-7.578-0.717-10.445-2.253-13.21-6.042-10.342-19.354-10.854-25.805-0.922-2.662 3.891-3.072 6.758-3.379 22.63 0 2.15-0.512 2.765-2.355 2.765-1.229 0-5.325 1.126-9.011 2.458-24.269 8.806-39.834 25.6-47.616 51.302-2.458 8.294-2.765 10.854-2.867 25.088 0 18.534 1.946 27.853 8.602 41.574 10.138 20.89 23.962 32.563 46.182 39.629 3.891 1.126 7.066 2.662 7.168 3.174 0 0.614 0.102 4.915 0.307 9.523 0.205 7.578 0.512 9.011 3.277 12.8 4.813 6.861 13.619 8.909 19.866 4.608zM236.544 511.386c-6.656-1.229-16.282-6.349-20.582-10.854-21.197-22.118-10.035-58.163 19.866-64.41 3.379-0.717 7.066-1.126 8.294-0.922s4.198 0.614 6.656 0.922c15.974 2.355 30.822 20.070 30.822 36.864 0 23.859-22.118 42.598-45.056 38.4zM724.992 511.693c-28.877-3.994-43.11-36.147-26.726-60.006 13.414-19.354 41.267-22.016 57.856-5.427 18.944 18.944 14.131 49.562-9.421 61.542-6.451 3.277-15.258 4.813-21.709 3.891zM921.6 422.4v-230.4h-793.6v-51.2h844.8v512h-51.2v-230.4z" />
+<glyph unicode="&#xe993;" glyph-name="currency_converter" d="M179.302 493.875c0-247.398 0.41-392.090 1.024-396.595 5.325-38.298 28.467-67.379 62.976-79.155 16.282-5.632 0.205-5.325 313.037-5.325h288.461v778.752l-2.458 11.776c-1.331 6.451-3.584 14.746-5.018 18.33-11.264 27.443-32.051 47.616-58.163 56.422-15.77 5.325-1.331 5.12-311.501 5.12h-288.461l0.102-389.325zM725.504 804.659c6.554-2.15 13.005-8.704 15.258-15.36 1.536-4.608 1.638-13.005 1.434-87.45-0.307-82.022-0.307-82.33-2.458-86.426-2.867-5.222-6.656-9.011-11.469-11.469-3.686-1.741-11.878-1.843-215.757-1.843h-211.968l-4.096 2.253c-5.427 2.867-10.138 7.987-12.698 13.619-2.048 4.506-2.15 6.349-2.15 85.606 0 87.962-0.205 85.402 5.632 93.082 2.765 3.482 9.421 7.987 13.312 9.011 1.126 0.205 96.051 0.512 211.046 0.614 192 0.102 209.306 0 213.914-1.638zM467.456 549.274c5.53-1.434 13.005-7.68 16.179-13.619l2.253-4.198 0.307-81.92c0.205-62.669 0-83.046-1.024-86.528-0.819-3.174-2.867-6.246-6.451-9.83-4.301-4.301-6.246-5.53-10.854-6.554-3.994-0.819-27.136-1.024-86.426-0.819-68.301 0.307-81.408 0.512-83.968 1.843-6.246 2.97-11.059 7.578-13.517 12.902l-2.355 5.325 0.205 82.227 0.307 82.33 2.253 4.301c3.994 7.68 7.885 11.059 16.179 14.336 4.301 1.638 160.358 1.843 166.912 0.205zM726.528 547.942c5.939-2.765 10.138-6.656 13.21-12.39 2.15-4.096 2.15-4.096 2.15-88.064v-83.968l-2.867-4.813c-1.536-2.662-4.301-6.042-6.144-7.373-7.68-5.837-5.325-5.734-91.75-5.734-91.648 0-87.142-0.41-95.949 8.602-3.482 3.584-5.53 6.758-6.349 9.83-1.024 3.482-1.229 23.859-1.024 85.504l0.307 80.896 2.662 5.12c2.867 5.427 10.24 11.878 15.667 13.619 2.048 0.614 32.768 1.024 84.070 1.126l80.896 0.102 5.12-2.458zM468.173 293.171c5.12-1.536 12.493-7.987 15.462-13.517l2.253-4.198 0.307-82.33c0.307-91.955 0.512-88.576-6.758-95.642-2.048-2.048-5.837-4.608-8.397-5.734-4.506-2.048-6.451-2.048-86.221-2.15-74.854 0-81.92 0.205-86.426 1.843-6.246 2.253-13.926 9.728-15.565 15.258-0.922 3.072-1.229 24.781-1.229 84.48 0 90.931-0.41 86.221 8.090 94.925 8.294 8.602 3.277 8.090 94.208 8.192 58.778 0.102 81.306-0.205 84.275-1.126zM728.576 292.147c5.222-2.97 10.547-9.216 12.186-14.643 1.536-4.608 1.638-14.131 1.434-87.552l-0.307-82.432-2.253-4.198c-3.482-6.451-9.421-11.264-15.77-12.698-3.994-0.819-27.955-1.024-86.426-0.819l-80.896 0.307-4.198 2.253c-5.939 3.174-12.186 10.65-13.619 16.179-1.536 6.349-1.536 161.178 0 166.912 2.15 7.782 9.83 15.462 18.022 17.92 1.638 0.512 40.243 0.819 85.811 0.717 75.981-0.205 83.251-0.307 86.016-1.946zM377.856 523.776c-11.162-1.946-20.89-7.373-29.184-16.077-4.301-4.608-12.083-20.173-13.824-27.648l-1.229-5.427h-6.144c-5.837 0-6.451-0.205-9.626-3.686-7.782-8.192-2.458-18.842 9.421-18.842 3.584 0 3.686-0.205 3.686-5.632 0-5.53-0.102-5.632-4.301-5.632-9.523 0-14.848-7.578-11.162-15.667 1.638-3.584 5.018-5.018 11.469-5.018h5.734l1.126-5.325c0.717-2.867 3.072-9.011 5.427-13.619 10.342-21.094 29.184-31.232 54.784-29.696 15.77 1.024 24.678 4.608 33.485 13.414 5.53 5.53 11.776 16.589 11.776 20.89 0 6.042-6.349 11.469-13.517 11.469-4.608 0-7.578-2.253-10.547-8.090-5.939-11.776-10.342-14.541-24.064-15.258-8.294-0.307-10.65-0.102-15.77 1.843-6.963 2.662-13.517 8.806-16.794 15.667-4.301 9.011-5.837 8.397 20.582 8.499 23.245 0.102 23.45 0.102 25.805 2.56 2.97 2.97 3.891 7.475 2.458 11.981-1.946 5.837-4.198 6.349-30.618 6.349h-23.654l0.614 11.469h28.058c16.179 0 28.979 0.41 30.31 1.024 6.861 3.072 6.861 16.998-0.102 20.173-1.741 0.717-11.469 1.126-29.082 1.126-14.643 0-26.624 0.205-26.624 0.512 0 1.638 3.891 9.933 6.349 13.619 6.451 9.523 14.438 13.619 26.624 13.619 13.005 0.102 19.046-3.379 24.678-14.234 4.608-8.704 5.632-9.626 11.981-10.24 4.71-0.41 5.325-0.205 8.704 3.174 4.915 4.915 5.018 8.806 0.717 18.022-3.277 7.066-13.312 17.306-19.968 20.378-10.24 4.813-24.986 6.451-37.581 4.301zM634.163 528.486c-2.56-2.253-2.97-3.277-3.379-10.342l-0.512-7.885-5.939-1.946c-11.469-3.891-18.33-9.83-23.552-20.275-2.867-5.837-3.174-7.578-3.174-15.36 0-10.342 2.253-16.077 8.499-22.528 5.018-5.12 7.27-6.246 22.118-10.854 17.715-5.53 21.504-7.27 23.552-11.162 2.458-4.608 1.434-9.933-2.662-13.312-5.632-4.813-13.824-4.813-28.058-0.102-13.312 4.403-17.818 3.584-21.914-3.686-6.758-11.981 2.458-21.299 25.293-25.6l6.349-1.229 0.102-4.71c0.102-8.294 0.717-10.752 3.482-13.107 3.686-3.174 8.192-3.072 11.264 0.307 2.253 2.458 2.56 3.686 2.56 10.752 0 7.885 0 8.090 2.867 8.704 5.837 1.434 15.872 7.066 20.173 11.469 7.885 7.885 11.571 19.046 10.342 31.846-1.434 16.486-10.65 24.781-36.966 33.28-14.234 4.71-15.872 5.53-17.408 9.216-1.638 3.891-0.922 6.246 2.662 9.318 4.608 3.789 9.114 4.198 19.251 1.536 4.813-1.331 10.547-2.253 12.595-2.253 10.035 0.205 15.77 11.571 10.035 19.661-2.662 3.686-10.138 7.578-18.125 9.318l-5.325 1.229v6.963c0.102 9.421-2.56 13.107-9.523 13.21-0.922 0-3.072-1.126-4.608-2.458zM378.88 260.198c-17.101-4.198-29.594-13.107-34.406-24.781-2.458-5.734-2.662-15.77-0.512-23.552l1.843-6.554h-5.53c-6.144 0-9.728-1.536-13.619-5.632-2.15-2.355-2.56-3.686-2.56-9.216 0-10.342 4.71-13.926 18.842-14.438 4.71-0.205 8.704-0.512 9.011-0.717 0.205-0.307-0.41-3.891-1.434-7.987-1.331-5.734-3.174-9.728-7.782-16.589-5.325-7.987-6.042-9.626-6.042-14.029 0.102-5.939 2.048-10.24 6.042-12.902 2.662-1.843 5.632-1.946 45.875-2.253 39.526-0.205 43.315-0.102 46.49 1.536 10.138 5.325 10.957 19.251 1.331 24.883-3.482 2.048-5.018 2.253-30.822 2.253-14.95 0.102-27.546 0.205-27.955 0.512-0.41 0.205 0.614 3.174 2.15 6.758 2.97 6.554 5.427 15.872 4.608 17.306-0.307 0.41 0.102 0.819 0.819 0.922 0.717 0 4.608 0.102 8.499 0.307 11.674 0.41 16.896 4.301 17.715 13.005 1.024 11.366-5.325 16.282-21.197 16.282h-9.421l-2.048 4.813c-3.584 8.397-2.662 14.541 3.072 19.558 4.096 3.584 9.83 4.71 16.179 3.277s9.318-3.584 14.746-10.957c5.53-7.373 9.421-9.728 15.053-9.216 8.192 0.819 14.746 7.782 14.746 15.462 0 12.698-10.547 23.962-28.058 30.003-9.216 3.072-26.829 4.096-35.635 1.946zM593.92 248.525c-2.97-2.97-4.096-5.018-4.608-8.806-0.922-6.246-0.41-7.373 10.854-22.733 5.018-6.861 9.114-12.8 9.114-13.107s-3.891-0.614-8.499-0.614c-9.216 0-11.981-1.331-11.981-5.837s2.867-5.427 16.589-5.427h12.902l3.686-5.018c2.048-2.765 3.686-5.939 3.686-7.168 0-2.15-0.41-2.15-16.691-2.15-14.95 0-16.998-0.205-18.432-1.843-2.253-2.458-2.15-5.632 0.102-7.68 1.638-1.434 4.506-1.741 18.33-1.741h16.486v-17.818c0-19.456 0.922-23.654 6.042-26.931 5.427-3.584 13.619-3.277 18.125 0.614 4.403 3.891 5.018 6.963 5.222 25.702l0.102 17.92 16.282 0.307c17.51 0.307 19.968 1.024 19.968 5.837s-2.458 5.53-19.968 5.837l-16.384 0.307 0.307 2.458c0.205 1.331 1.843 4.506 3.584 6.861l3.277 4.403 12.902 0.102c11.162 0 13.107 0.205 14.541 1.843 2.253 2.458 2.15 5.632-0.102 7.68-1.434 1.331-3.891 1.741-10.24 1.741h-8.397l9.216 12.083c10.342 13.722 13.312 19.456 12.595 24.166-1.331 8.090-6.349 12.902-13.619 12.902-8.192 0-9.728-1.434-28.16-27.136-3.891-5.53-7.987-10.957-9.011-12.186-2.15-2.56-1.024-3.686-13.005 13.722-13.517 19.866-14.746 21.299-18.534 23.45-2.15 1.229-5.632 2.15-8.090 2.15-3.686 0-4.915-0.614-8.192-3.891z" />
+<glyph unicode="&#xe994;" glyph-name="Currency_dollar" d="M76.8 473.6v-256h819.2v512h-819.2v-256zM768.307 669.491c-2.253-38.195 29.286-69.837 67.584-67.584l8.909 0.512v-257.434h-11.981c-8.806 0-13.722-0.512-18.227-1.843-29.184-8.909-48.026-35.635-46.285-65.331l0.614-9.011h-565.043l0.614 7.987c1.946 25.702-11.981 50.381-34.714 61.542-11.264 5.632-21.197 7.68-32.768 6.861l-9.011-0.614v257.536h12.595c10.854 0.102 13.517 0.512 20.378 2.867 15.667 5.427 28.979 16.794 36.454 31.13 5.325 10.24 7.27 19.456 6.861 32.358l-0.307 9.933h564.941l-0.614-8.909zM467.763 626.074c-63.078-8.192-113.869-52.736-129.843-113.664-3.891-14.746-4.608-22.118-4.506-42.394 0.205-22.63 4.506-41.677 13.824-61.44 21.811-46.182 63.386-77.517 114.995-86.528 11.469-2.048 39.834-2.048 49.254-0.102 2.867 0.614 6.246 1.331 7.68 1.536 20.992 3.994 47.206 16.896 65.126 31.949 28.16 23.552 45.67 53.453 53.248 90.522 1.946 9.626 2.56 38.195 1.126 48.128-5.427 35.328-20.48 65.229-45.261 89.498-22.938 22.528-49.459 35.738-84.48 42.086-6.042 1.024-33.894 1.331-41.165 0.41zM495.206 591.258c3.379-2.867 4.71-7.373 4.915-16.691l0.102-9.216 6.656-1.229c12.288-2.253 22.938-7.885 26.726-14.029 5.837-9.626-1.331-24.166-12.902-25.805-4.506-0.717-6.758-0.307-22.016 3.994-10.138 2.867-19.251 1.536-25.805-3.789-2.56-2.048-4.096-6.861-3.379-10.65 0.922-4.915 5.53-8.090 17.203-11.674 43.93-13.517 56.422-23.552 59.392-47.616 2.662-20.89-5.939-40.96-21.811-51.302-5.222-3.379-15.36-7.885-20.173-8.909-3.891-0.922-4.198-1.638-4.198-13.21-0.102-7.27-0.512-9.626-2.253-12.493-4.301-6.861-14.746-7.066-19.558-0.41-2.15 3.072-2.355 4.198-2.867 21.504-0.102 1.229-1.946 1.946-7.987 2.867-20.48 3.174-34.304 10.547-38.195 20.275-2.662 6.861 1.331 18.022 7.782 22.323 4.403 2.867 12.493 2.355 23.45-1.434 12.186-4.198 20.48-6.042 26.112-5.632 20.582 1.331 27.75 21.811 10.65 30.413-1.741 0.922-11.674 4.301-22.016 7.475-25.805 7.885-30.822 10.65-38.093 20.685-5.632 7.782-8.192 15.667-8.192 25.805 0 9.933 1.229 15.258 5.632 24.064 6.144 12.8 21.606 24.474 36.352 27.648 1.843 0.307 3.584 1.024 3.891 1.536s0.717 4.915 0.922 9.933c0.41 10.854 1.741 13.926 6.963 16.589 4.198 2.048 9.523 1.638 12.698-1.024zM236.544 511.386c-6.656-1.229-16.282-6.349-20.582-10.854-21.197-22.118-10.035-58.163 19.866-64.41 3.379-0.717 7.066-1.126 8.294-0.922s4.198 0.614 6.656 0.922c15.974 2.355 30.822 20.070 30.822 36.864 0 23.859-22.118 42.598-45.056 38.4zM724.992 511.693c-28.877-3.994-43.11-36.147-26.726-60.006 13.414-19.354 41.267-22.016 57.856-5.427 18.944 18.944 14.131 49.562-9.421 61.542-6.451 3.277-15.258 4.813-21.709 3.891zM921.6 422.4v-230.4h-793.6v-51.2h844.8v512h-51.2v-230.4z" />
+<glyph unicode="&#xe995;" glyph-name="currency_euro" d="M76.8 473.6v-256h819.2v512h-819.2v-256zM768.41 671.744c2.867-27.648 18.022-49.869 42.189-61.85 9.728-4.813 16.896-6.861 26.829-7.885l7.373-0.717v-255.693h-3.789c-10.957-0.102-27.238-5.427-38.502-12.8-19.763-12.698-33.792-37.581-34.406-60.621l-0.102-3.379h-563.2l-0.102 2.355c-0.614 30.208-20.787 58.47-49.459 69.427-4.813 1.843-19.046 5.222-20.787 4.915-0.512-0.102-2.048-0.102-3.584 0l-2.867 0.102v255.693l7.066 0.717c27.546 2.765 50.995 19.456 62.976 44.954 3.072 6.451 6.656 21.504 6.758 27.648v3.789h562.893l0.717-6.656zM467.763 626.074c-63.078-8.192-114.176-53.043-129.741-113.766-3.994-15.36-4.198-17.203-4.71-35.123-0.512-21.094 0.717-30.106 7.168-50.688 12.902-41.267 43.213-74.957 84.173-93.491 10.24-4.608 23.757-8.602 37.581-10.957 11.469-2.048 39.834-2.048 49.254-0.102 2.867 0.614 6.246 1.331 7.68 1.536 20.992 3.994 47.206 16.896 65.126 31.949 28.16 23.552 45.67 53.453 53.248 90.522 1.946 9.626 2.56 38.195 1.126 48.128-5.427 35.635-20.685 65.638-45.67 90.010-22.938 22.221-49.357 35.226-84.070 41.574-6.042 1.024-33.894 1.331-41.165 0.41zM517.12 568.73c19.046-3.686 33.178-14.336 41.37-31.232 4.301-8.704 4.813-14.541 1.638-19.558-2.765-4.608-9.114-7.68-14.643-7.066-6.042 0.819-8.806 3.277-13.414 11.878-7.578 14.234-15.667 19.456-30.822 19.558-9.523 0.102-14.234-0.819-20.992-4.198-7.885-3.994-13.824-10.342-18.534-20.070-3.994-8.192-4.71-10.547-3.174-10.752 0.41-0.102 15.974-0.205 34.509-0.307 38.298-0.205 37.888-0.102 41.062-8.294 2.355-6.246 1.331-12.595-2.765-16.486l-3.072-2.97-24.269-0.205c-13.312-0.102-30.106-0.205-37.274-0.307h-13.107v-14.234l63.693-0.614 2.97-3.584c2.355-2.765 2.97-4.506 2.97-8.499 0-5.632-2.048-10.342-5.427-12.186-1.638-0.819-10.445-1.229-31.13-1.331-15.872 0-29.082-0.307-29.491-0.614-0.717-0.819 2.15-8.806 5.12-13.722 5.325-9.011 14.438-15.462 25.088-17.818 2.56-0.614 9.216-0.922 14.848-0.819 16.179 0.41 22.835 4.608 29.798 18.33 4.096 8.192 7.885 11.059 14.541 11.059 5.939 0 11.059-2.56 14.131-7.066 4.096-6.144 2.765-12.288-5.427-24.883-11.571-17.613-28.979-25.702-55.603-25.702-14.131 0-23.962 2.048-34.816 7.168-10.24 4.915-22.426 16.998-28.058 27.75-3.994 7.782-8.806 20.787-8.806 23.962 0 2.048 0 2.048-8.192 2.253-10.547 0.307-15.155 4.096-15.565 12.698-0.102 4.813 3.072 10.547 6.861 12.288 1.434 0.717 5.325 1.229 8.499 1.229h5.837v14.131l-7.066 0.512c-6.656 0.41-7.373 0.717-10.547 4.198-2.765 2.97-3.379 4.506-3.379 8.294 0 10.854 4.506 15.155 15.667 15.36 6.758 0 7.475 0.205 8.602 2.56 0.717 1.434 1.331 3.277 1.331 4.198 0 2.765 6.758 18.944 10.24 24.678 9.011 14.746 19.558 23.245 35.123 28.365 11.469 3.789 28.262 4.608 41.677 2.048zM236.544 511.386c-6.656-1.229-16.282-6.349-20.582-10.854-21.197-22.118-10.035-58.163 19.866-64.41 3.379-0.717 7.066-1.126 8.294-0.922s4.198 0.614 6.656 0.922c15.974 2.355 30.822 20.070 30.822 36.864 0 23.859-22.118 42.598-45.056 38.4zM724.992 511.693c-28.877-3.994-43.11-36.147-26.726-60.006 13.414-19.354 41.267-22.016 57.856-5.427 18.944 18.944 14.131 49.562-9.421 61.542-6.451 3.277-15.258 4.813-21.709 3.891zM921.6 422.4v-230.4h-793.6v-51.2h844.8v512h-51.2v-230.4z" />
+<glyph unicode="&#xe996;" glyph-name="Currency_sterling" d="M76.8 473.6v-256h819.2v512h-819.2v-256zM768.307 669.491c-2.253-38.195 29.286-69.837 67.584-67.584l8.909 0.512v-257.434h-11.981c-8.806 0-13.722-0.512-18.227-1.843-29.184-8.909-48.026-35.635-46.285-65.331l0.614-9.011h-565.043l0.614 7.987c1.946 25.702-11.981 50.381-34.714 61.542-11.264 5.632-21.197 7.68-32.768 6.861l-9.011-0.614v257.536h12.595c10.854 0.102 13.517 0.512 20.378 2.867 15.667 5.427 28.979 16.794 36.454 31.13 5.325 10.24 7.27 19.456 6.861 32.358l-0.307 9.933h564.941l-0.614-8.909zM467.763 626.074c-63.078-8.192-113.869-52.736-129.843-113.664-3.891-14.746-4.608-22.118-4.506-42.394 0.205-22.63 4.506-41.677 13.824-61.44 21.811-46.182 63.386-77.517 114.995-86.528 11.571-2.048 39.936-2.048 49.254-0.102 2.867 0.614 6.042 1.229 7.168 1.434 8.397 1.434 25.088 7.373 35.738 12.698 43.93 21.914 73.114 60.518 83.149 109.875 1.946 9.626 2.56 38.195 1.126 48.128-5.427 35.635-20.685 65.638-45.67 90.010-22.938 22.221-49.357 35.226-84.070 41.574-6.042 1.024-33.894 1.331-41.165 0.41zM508.211 565.862c14.029-2.355 25.395-7.68 34.509-16.077 7.987-7.373 10.752-13.312 10.752-22.63 0-6.451-0.307-7.782-3.072-11.674-3.994-5.632-9.523-8.499-16.486-8.499-6.656 0-10.752 2.867-17.408 12.083-5.837 7.885-10.65 11.469-17.715 12.902-9.011 1.946-17.408-0.307-22.528-6.042-4.915-5.53-5.53-12.493-1.946-21.811 1.946-5.018 2.765-5.939 4.915-6.042 1.434 0 6.963-0.205 12.288-0.307 16.077-0.307 23.245-5.325 24.064-16.691 0.307-5.837-0.717-9.011-4.403-12.902-5.222-5.632-8.704-6.656-21.299-6.758l-8.294-0.102-0.102-4.198c-0.205-4.608-4.506-18.125-7.475-23.245-1.024-1.843-1.946-3.584-1.946-3.789s14.95-0.41 33.28-0.41c20.275 0 34.816-0.41 37.274-1.126 8.397-2.253 13.312-10.65 11.878-20.070-1.024-6.758-6.349-11.981-13.824-13.619-3.482-0.717-21.914-1.126-53.555-1.126-54.886 0.102-55.706 0.205-61.542 7.475-2.867 3.584-3.174 4.71-3.174 10.752 0 7.578 0.205 7.987 8.806 20.89 5.53 8.192 8.192 15.053 9.626 24.166l0.717 4.301h-9.728c-18.125 0-25.395 5.222-25.6 18.33-0.102 10.957 6.554 17.203 19.456 18.022 3.686 0.307 6.963 0.717 7.27 0.922 0.205 0.307-0.307 2.765-1.331 5.427-0.922 2.662-1.946 8.397-2.253 12.595-1.536 21.299 11.878 38.195 36.864 46.592 13.107 4.301 26.931 5.222 41.984 2.662zM236.544 511.386c-6.656-1.229-16.282-6.349-20.582-10.854-21.197-22.118-10.035-58.163 19.866-64.41 3.379-0.717 7.066-1.126 8.294-0.922s4.198 0.614 6.656 0.922c15.974 2.355 30.822 20.070 30.822 36.864 0 23.859-22.118 42.598-45.056 38.4zM724.992 511.693c-28.877-3.994-43.11-36.147-26.726-60.006 13.414-19.354 41.267-22.016 57.856-5.427 18.944 18.944 14.131 49.562-9.421 61.542-6.451 3.277-15.258 4.813-21.709 3.891zM921.6 422.4v-230.4h-793.6v-51.2h844.8v512h-51.2v-230.4z" />
+<glyph unicode="&#xe997;" glyph-name="Currency_yen" d="M76.8 473.6v-256h819.2v512h-819.2v-256zM768.307 669.491c-2.253-38.195 29.286-69.837 67.584-67.584l8.909 0.512v-257.434h-11.981c-8.806 0-13.722-0.512-18.227-1.843-29.184-8.909-48.026-35.635-46.285-65.331l0.614-9.011h-565.043l0.614 7.987c1.946 25.702-11.981 50.381-34.714 61.542-11.264 5.632-21.197 7.68-32.768 6.861l-9.011-0.614v257.536h12.595c10.854 0.102 13.517 0.512 20.378 2.867 15.667 5.427 28.979 16.794 36.454 31.13 5.325 10.24 7.27 19.456 6.861 32.358l-0.307 9.933h564.941l-0.614-8.909zM467.763 626.074c-63.078-8.192-113.869-52.736-129.843-113.664-3.891-14.746-4.608-22.118-4.506-42.394 0.205-22.63 4.506-41.677 13.824-61.44 21.811-46.182 63.386-77.517 114.995-86.528 11.571-2.048 39.936-2.048 49.254-0.102 2.867 0.614 6.042 1.229 7.168 1.434 8.397 1.434 25.088 7.373 35.738 12.698 43.93 21.914 73.114 60.518 83.149 109.875 1.946 9.626 2.56 38.195 1.126 48.128-5.427 35.635-20.685 65.638-45.67 90.010-22.938 22.221-49.357 35.226-84.070 41.574-6.042 1.024-33.894 1.331-41.165 0.41zM567.296 548.25c0-0.307-7.168-12.902-15.872-27.955s-15.872-27.546-15.872-27.648c0-0.205 6.042-0.307 13.312-0.205l13.312 0.102v-15.462l-17.818 0.102h-17.715l-7.27-12.493-7.27-12.595 3.277-0.102c1.843 0 12.39 0 23.552 0l20.173 0.102v-15.872h-51.712l-0.307-28.365-0.205-28.467h-41.882v24.371c0 13.312 0 26.112 0 28.365l-0.102 4.198-25.293-0.102h-25.395l-0.102 7.885-0.205 7.885h22.528c12.39 0 22.733 0.102 22.938 0.307 0.102 0.205-2.662 5.427-6.349 11.571-3.584 6.246-6.656 11.674-6.861 12.288s-7.578 1.024-18.227 1.024h-17.818v15.258h13.107c7.168-0.102 13.005 0.307 13.005 0.717s-3.994 7.578-8.806 15.974c-10.342 17.715-12.083 20.787-15.565 26.931-1.434 2.56-3.482 6.042-4.506 7.68-1.024 1.741-1.843 3.379-1.843 3.891 0 0.41 9.83 0.717 21.811 0.717h21.811l4.096-7.885c2.253-4.403 9.83-19.046 16.794-32.563s13.414-26.112 14.336-27.853l1.638-3.277 8.909 17.613c16.282 31.846 26.829 52.429 27.546 53.555s44.851 1.536 44.851 0.307zM236.544 511.386c-6.656-1.229-16.282-6.349-20.582-10.854-21.197-22.118-10.035-58.163 19.866-64.41 3.379-0.717 7.066-1.126 8.294-0.922s4.198 0.614 6.656 0.922c15.974 2.355 30.822 20.070 30.822 36.864 0 23.859-22.118 42.598-45.056 38.4zM724.992 511.693c-28.877-3.994-43.11-36.147-26.726-60.006 13.414-19.354 41.267-22.016 57.856-5.427 18.944 18.944 14.131 49.562-9.421 61.542-6.451 3.277-15.258 4.813-21.709 3.891zM921.6 422.4v-230.4h-793.6v-51.2h844.8v512h-51.2v-230.4z" />
+<glyph unicode="&#xe998;" glyph-name="data_protection" d="M501.76 876.442c-20.787-14.234-53.453-32.461-75.776-42.394-5.325-2.355-12.186-5.427-15.155-6.758-29.901-13.517-80.589-28.979-116.941-35.635-4.813-0.922-10.957-2.15-13.824-2.662-2.765-0.512-7.373-1.229-10.24-1.536-2.765-0.307-6.246-0.819-7.68-1.024-5.12-0.922-30.413-3.482-40.448-4.096-5.632-0.41-12.493-0.819-15.36-1.024-2.765-0.205-15.872-0.41-28.979-0.41l-23.859-0.102 0.41-158.925c0.205-87.45 0.717-160.154 0.922-161.587 0.307-1.434 0.819-5.734 1.229-9.728 3.174-34.816 11.571-74.957 23.347-111.104 35.635-109.568 103.936-200.602 196.915-262.451 37.786-25.19 75.981-43.93 121.446-59.597l13.926-4.813 12.186 4.096c63.59 21.094 128.307 57.651 173.466 97.997 37.171 33.28 62.976 62.874 88.269 101.376 36.147 54.886 62.362 119.603 74.957 184.32 3.584 18.534 4.71 25.907 6.656 44.544 0.614 5.325 1.434 11.571 1.741 13.824 0.41 2.253 0.922 75.674 1.126 163.123l0.41 158.925-23.859 0.102c-13.107 0-26.112 0.205-28.979 0.41-2.765 0.205-10.138 0.614-16.384 1.024-6.144 0.307-12.493 0.819-14.131 0.922-1.536 0.205-5.632 0.717-9.216 1.024-6.656 0.717-19.558 2.355-24.781 3.277-1.638 0.205-5.837 0.922-9.216 1.434-24.474 3.789-60.006 12.698-88.166 22.118-11.674 3.891-40.243 14.848-49.050 18.842-31.334 14.131-59.494 29.696-85.709 47.309-5.018 3.277-9.114 5.939-9.216 5.837-0.205 0-4.71-2.97-10.035-6.656zM533.504 732.672c20.685-4.301 41.574-15.77 56.73-31.232 35.226-35.635 41.37-90.317 15.155-134.042-5.53-9.318-18.227-23.245-27.648-30.413-26.522-20.070-62.157-26.931-94.822-18.227-31.13 8.192-57.856 30.618-71.066 59.494-7.782 16.691-9.83 26.112-9.933 44.851 0 19.763 1.229 27.238 7.373 42.496 14.131 35.43 46.49 61.338 84.275 67.584 9.83 1.638 30.822 1.331 39.936-0.512zM430.080 510.362c23.552-16.896 51.405-25.702 81.408-25.805 23.552 0 45.261 5.325 65.638 16.077 10.547 5.632 23.45 14.541 27.955 19.354 2.355 2.56 2.56 2.662 5.632 1.024 7.27-3.686 20.173-13.619 28.774-22.323 19.456-19.354 31.027-40.858 37.99-70.144 1.638-7.066 1.843-16.282 2.15-110.387l0.41-102.605-288.358 0.512-7.373 2.765c-12.288 4.506-23.962 13.517-30.822 23.654-3.482 5.222-7.987 15.974-9.421 22.221-0.614 2.765-0.922 32.973-0.922 76.8 0 79.053 0.205 81.408 6.144 100.864 5.632 18.33 15.36 35.635 28.467 50.483 7.066 8.192 22.221 20.89 30.822 26.010l6.349 3.789 3.584-3.277c1.946-1.843 7.168-5.837 11.571-9.011z" />
+<glyph unicode="&#xe999;" glyph-name="data_services" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM610.611 819.2c46.080-12.288 91.75-34.202 128.512-61.747l7.373-5.53-3.482-4.096c-1.946-2.15-3.686-4.813-3.994-5.837-0.922-3.482 1.741-8.704 5.939-11.571 6.349-4.301 10.035-4.71 16.589-1.434 2.97 1.434 6.349 2.662 7.373 2.662 2.15 0 9.728-6.758 10.65-9.421 0.819-2.253-2.97-6.963-5.53-6.963-2.048 0-3.072 1.638-3.482 5.427-0.102 1.229-0.307 2.56-0.41 2.867-0.307 1.638-5.427 1.843-8.294 0.41-4.71-2.458-5.325-4.608-3.379-10.752 1.638-5.12 1.638-5.325-0.512-7.373-1.741-1.741-3.277-2.15-7.782-1.946-7.27 0.205-10.035-1.024-23.552-10.547-11.674-8.192-18.125-10.854-26.112-10.854-5.734 0-11.776-1.638-13.312-3.482-1.946-2.355-0.102-4.608 7.168-8.806 3.789-2.253 7.68-5.12 8.602-6.349 1.843-2.765 1.946-6.861 0.205-9.114-3.277-4.301-8.499-4.915-19.149-2.355-9.626 2.355-18.432 1.946-18.432-0.819 0-0.512 0.922-2.355 2.15-3.994 4.915-6.963 7.782-22.426 5.53-29.696-0.717-2.048-0.41-2.048 4.915-1.434 3.174 0.41 7.987 0.205 11.366-0.512 7.373-1.536 10.24 0 11.264 5.837 0.922 5.53 7.68 12.698 12.698 13.517 3.277 0.512 4.096 1.229 5.939 5.12 2.662 5.427 5.222 6.656 10.854 5.12 3.277-0.819 5.53-0.717 10.957 0.614 3.686 1.024 8.090 2.355 9.728 3.072 3.994 1.741 7.168 0.614 10.035-3.482 2.15-3.174 8.294-7.066 18.227-11.366 4.198-1.741 12.595-7.27 14.029-9.011 1.638-2.253 1.638-2.458 0-4.71-1.126-1.434-3.174-1.946-9.011-2.355-8.294-0.41-10.138-0.819-10.138-2.253 0-1.229 8.499-5.12 10.752-4.813 0.922 0.102 4.506 2.458 7.782 5.12 5.427 4.403 6.042 5.325 6.042 8.704 0 2.048 0.512 4.301 1.126 4.915 0.717 0.717 0.922 1.946 0.614 2.867-0.819 2.048-9.114 5.632-13.005 5.632-2.048 0-3.584 0.819-4.813 2.662-2.15 3.072-5.12 6.246-8.294 8.806-2.765 2.253-2.867 4.506-0.41 5.837 2.15 1.126 12.083-3.072 17.101-7.27 1.741-1.434 4.198-2.97 5.632-3.379s3.686-1.638 5.018-2.662c1.331-1.126 2.97-1.946 3.686-1.946 2.56 0 6.656-4.198 6.656-6.963 0.102-3.994 1.946-6.758 6.861-10.342 3.072-2.253 4.71-4.301 5.53-7.373 0.717-2.253 1.946-4.403 2.662-4.71 1.331-0.512 7.373 2.765 10.138 5.632 1.536 1.434 1.331 1.843-1.638 4.301-2.765 2.253-3.277 3.277-2.662 5.427 0.819 3.379 5.325 5.837 10.752 5.837 5.12 0 6.656-1.638 8.806-8.704 0.922-3.174 2.458-6.554 3.584-7.68 3.891-3.891 16.077-31.744 14.848-33.792-1.434-2.355-13.824-0.512-30.822 4.71-17.203 5.222-21.197 4.506-25.088-4.403-1.843-4.301-2.15-4.608-5.325-4.096-8.704 1.229-16.794 4.198-20.378 7.475-2.048 1.843-5.325 3.584-7.168 3.891s-5.427 0.819-7.885 1.126c-5.53 0.717-10.957 3.174-11.776 5.222-0.307 0.922-0.102 2.458 0.512 3.584 1.126 2.15 0.41 9.83-1.229 11.674-0.922 1.229-40.038 1.126-42.086-0.102-0.614-0.41-2.765-0.922-4.813-1.126-9.83-0.922-11.059 1.024 19.046-29.286 15.155-15.36 29.286-30.515 31.437-33.792 5.018-7.68 9.216-17.101 11.981-26.522 2.458-8.499 3.482-29.594 1.946-38.195-1.741-9.318-6.246-21.811-10.854-29.696-3.789-6.656-4.198-8.192-3.379-10.547 0.614-1.536 0.717-7.066 0.41-13.414-0.819-13.619-0.102-15.974 10.24-30.822 10.24-14.848 12.083-19.046 12.186-28.672 0.102-7.27-0.205-8.192-5.018-17.408-7.578-14.438-7.27-18.944 2.56-35.328 4.096-6.861 8.192-15.258 8.192-16.896 0-3.072 4.608-14.131 8.499-20.173 2.458-3.789 5.53-9.523 6.758-12.595 9.523-22.63 15.77-27.546 25.6-20.378 2.355 1.638 4.71 2.97 5.222 2.765 1.024-0.41-7.782-14.131-18.022-28.058-27.648-37.478-60.109-68.403-99.226-94.106-50.278-33.075-104.448-52.736-166.707-60.518-21.606-2.765-64-2.662-87.245 0-35.635 4.198-69.325 12.8-101.069 25.702-103.526 42.394-183.501 127.386-219.238 232.96-3.891 11.469-8.499 27.341-9.933 34.202-0.41 2.355-1.741 8.806-2.867 14.438-2.048 9.626-3.789 20.787-4.915 31.232-0.307 2.56-0.717 6.042-1.024 7.68-0.307 1.741-0.717 15.053-0.922 29.696-0.307 29.184 0.41 40.755 4.198 65.229l1.741 11.264 3.174-0.614c1.741-0.41 4.403-1.536 5.939-2.662s3.379-2.048 4.096-2.048c0.717 0 4.813-1.434 8.909-3.174 5.837-2.458 8.397-3.072 11.469-2.56 13.21 2.048 12.083 2.15 16.077-1.741 5.018-4.71 10.342-7.27 19.661-9.318 14.438-3.277 15.155-3.584 18.637-7.885 12.288-15.36 16.077-17.51 33.792-19.968 5.018-0.614 4.506-0.922 11.366 6.451l2.867 3.072-5.427 1.741c-6.861 2.253-12.902 6.144-26.419 17.306-5.837 4.915-13.312 10.24-16.589 11.981l-5.939 3.174 0.307 8.397c0.41 8.909-0.41 13.824-2.56 15.258-3.686 2.253-10.138-0.41-17.715-7.578-11.571-10.752-26.010-7.782-32.358 6.758-3.584 7.885-3.379 20.685 0.41 27.853 6.861 13.312 23.962 21.299 44.954 21.094 9.626-0.102 19.251-2.048 25.907-5.427 5.53-2.765 6.349-3.482 12.698-10.854 5.837-6.758 8.909-8.090 9.83-4.096 0.205 1.229 0.41 7.578 0.205 14.029-0.205 14.131 0.819 16.691 8.909 21.914 6.246 3.994 9.318 7.68 13.824 16.794l3.277 6.554-1.741 5.222c-4.915 14.643-0.819 29.491 10.854 39.936 8.602 7.782 13.824 9.114 34.509 9.318 9.728 0 17.715 0.205 17.715 0.307 0 0.922-8.602 4.403-10.957 4.506l-2.867 0.102 3.072 0.922c2.048 0.614 5.427 0.512 9.728-0.205 3.686-0.614 8.806-1.331 11.366-1.434 4.198-0.307 4.71-0.102 4.301 1.536-0.41 1.536 0.922 2.355 8.192 4.608 8.294 2.56 16.486 3.584 17.818 2.15 0.41-0.307-0.307-2.458-1.536-4.608-4.301-7.68-4.096-7.782 11.571-7.782 7.578-0.102 13.824 0.205 13.824 0.614 0 0.307-2.048 1.946-4.608 3.584-5.939 3.686-7.373 5.939-8.602 13.619-0.512 3.379-1.536 7.066-2.15 8.192-1.229 2.355-6.246 5.222-12.8 7.27-2.867 0.922-7.066 4.301-14.131 11.366-12.083 12.083-14.643 13.21-25.395 11.366-13.414-2.355-18.227-1.229-25.498 5.427-4.096 3.891-14.438 9.728-20.070 11.366-2.867 0.819-7.987 1.536-11.469 1.536-3.482 0.102-6.349 0.205-6.349 0.41 0 0.102 2.56 2.253 5.734 4.608 6.963 5.325 8.499 5.222 25.19-1.536 7.782-3.174 13.824-4.915 18.944-5.427 8.397-0.922 10.24-0.205 4.915 1.843-4.506 1.741-4.71 3.584-0.205 2.662 10.035-2.048 10.854-1.946 14.848 0.819 2.355 1.638 5.837 2.867 8.806 3.174 5.632 0.614 13.107 5.222 15.974 10.035 1.434 2.355 1.843 4.608 1.638 9.318-0.205 3.379-0.922 6.349-1.536 6.554-3.686 1.229-5.632 4.198-5.427 8.192 0.307 3.891 0 4.301-3.482 6.144l-3.789 1.946 13.21 5.12c18.534 7.27 17.101 7.066 21.299 3.277 2.662-2.253 3.891-4.403 4.301-7.168 0.614-3.994 0.717-3.994 5.222-3.994 2.458 0 5.427 0.512 6.451 1.024 1.536 0.819 2.15 0.614 3.072-1.024 0.819-1.536 1.741-1.946 3.482-1.434 2.56 0.614 8.806-2.048 8.806-3.686 0-0.614-1.741-1.024-3.789-1.024-4.198 0-8.806-1.946-4.915-2.048 1.126-0.102 3.482-0.717 5.12-1.434l3.072-1.331-5.325-2.662c-5.427-2.765-9.523-6.963-9.523-9.728 0-3.174 4.301-10.445 9.523-15.872 11.674-12.288 26.214-20.378 37.786-20.992 9.216-0.614 12.39 1.536 19.661 12.39 2.97 4.608 6.349 9.318 7.373 10.547 4.198 4.71 17.101 9.421 43.93 15.77 9.626 2.355 21.811 5.53 27.136 7.27 5.325 1.638 12.186 3.277 15.155 3.686 6.554 0.717 7.68 2.048 2.56 2.867-10.445 1.843-9.933 2.97 1.434 3.277 9.421 0.205 11.674 1.126 9.114 3.584-1.229 1.331-1.331 2.253-0.41 5.53 1.638 5.53 2.253 6.144 7.782 7.578 2.662 0.614 5.632 1.946 6.656 2.765 1.946 1.843 2.355 4.915 0.717 5.939-1.536 0.922-1.229 2.56 0.512 2.56 0.819 0 5.837-1.126 11.059-2.56zM272.691 732.979c1.536-5.734 2.765-11.776 2.765-13.517 0-2.765-0.41-3.174-4.198-4.198-7.578-2.048-8.909-4.608-6.554-12.8 0.717-2.355-2.765-6.656-5.325-6.656-1.638 0-9.216 7.168-13.21 12.493-1.126 1.434-3.789 3.789-5.837 5.222l-3.686 2.458 6.861 6.656c13.005 12.39 24.986 22.528 25.702 21.709 0.41-0.512 2.048-5.632 3.482-11.366zM677.171 729.498c-6.861-2.048-8.909-9.011-3.789-13.107 1.331-1.024 2.458-2.458 2.458-3.072 0-0.922 4.198-3.789 4.915-3.379 1.434 1.024 5.325-2.15 5.325-4.403 0-0.819-1.229-1.536-2.765-1.741-2.048-0.205-2.97-0.922-3.174-2.56-0.205-1.229-1.024-2.765-1.843-3.379-2.048-1.741-1.741-3.072 0.614-3.072 2.867 0 2.56-1.126-1.024-4.608-2.253-2.15-3.072-3.789-2.867-5.632 0.41-3.277 2.662-2.97 9.011 1.024 5.222 3.277 11.366 4.608 18.944 4.198 6.144-0.307 9.728 2.253 9.728 7.066 0 2.458-0.512 3.174-2.765 3.686-2.355 0.614-19.763 16.794-19.763 18.33 0 0.307 0.717 1.946 1.536 3.482 1.741 3.584 1.229 4.198-3.686 4.198-2.867 0-3.891 0.512-4.301 2.048-0.614 2.253-1.536 2.355-6.554 0.922zM458.752 640.717l-141.824-0.205 9.933-9.523c5.427-5.12 23.142-22.426 39.424-38.195 16.179-15.872 31.027-30.31 32.973-32.051l3.482-3.277-66.56-66.765c-60.928-61.133-66.765-67.277-69.632-73.421-4.096-8.704-5.632-15.258-5.53-24.166 0-9.318 1.434-15.565 5.427-23.962 2.765-5.734 6.554-10.035 28.877-32.563l25.702-25.805 316.109 315.904-4.403 3.994c-6.758 5.939-14.029 8.909-23.859 9.728-4.506 0.307-72.090 0.512-150.118 0.307zM524.39 421.581l-157.082-157.286 5.018-4.608c5.837-5.222 13.107-8.909 20.89-10.342 3.482-0.614 57.037-1.024 149.709-1.024h144.282l-42.701 42.496c-23.552 23.347-42.598 42.598-42.394 42.906 0.307 0.307 30.003 30.208 66.048 66.355 62.874 63.181 65.741 66.15 69.222 73.523 8.602 17.715 7.578 35.738-2.867 52.122-3.379 5.325-50.688 53.453-52.224 53.248-0.512-0.102-71.475-70.861-157.901-157.389zM308.122 267.571c-0.307-16.998-1.126-20.89-8.704-38.912-5.939-13.926-6.656-18.33-3.482-22.323 1.126-1.434 2.048-3.482 2.048-4.608s-2.56-5.939-5.734-10.752c-5.12-7.885-5.632-9.114-5.12-12.8 0.41-2.662 0.102-5.12-0.922-7.066-3.584-6.758 0.102-15.667 10.65-26.112 13.005-12.8 28.979-18.432 35.328-12.493 3.482 3.277 4.915 7.27 4.506 12.493-0.307 4.198-0.512 4.506-3.379 4.813-6.861 0.614-7.68 1.126-7.68 4.608 0 1.741 1.843 7.168 4.096 11.981 4.096 8.806 4.915 12.698 3.072 13.824-1.638 1.024-1.229 6.963 0.614 9.728 3.686 5.53 10.445 11.571 17.306 15.565 3.994 2.355 9.114 5.837 11.571 7.782l4.301 3.584-4.813 2.56c-12.595 6.656-26.522 20.48-30.003 29.594-2.662 7.066-3.482 15.053-2.253 20.48l1.024 4.403-2.765-0.717c-3.482-0.922-13.21-0.819-16.691 0l-2.867 0.717-0.102-6.349z" />
+<glyph unicode="&#xe99a;" glyph-name="decoder" d="M76.8 499.2v-281.6l102.4-102.4h768v665.6h-870.4v-281.6zM896 281.6v-12.8h-691.2v25.6h691.2v-12.8zM245.35 215.654c2.355-1.024 5.53-3.686 7.168-5.837l2.97-3.789 0.307-24.986c0.307-23.962 0.205-25.19-1.946-29.594-1.331-2.867-3.789-5.734-6.349-7.373-3.994-2.662-4.813-2.765-17.101-2.765-12.39 0-13.107 0.102-17.203 2.765-7.68 5.12-7.885 6.042-7.885 35.738v26.214l2.97 3.789c4.608 6.042 9.421 7.782 22.118 7.782 8.294 0 11.674-0.512 14.95-1.946zM322.15 215.552c2.458-1.229 5.53-3.994 7.168-6.349l2.97-4.198 0.307-24.474c0.307-23.45 0.205-24.781-1.946-29.082-1.331-2.867-3.789-5.734-6.349-7.373-3.994-2.662-4.813-2.765-16.998-2.765-14.95 0-17.818 1.024-22.426 7.885l-2.765 4.198-0.307 23.654c-0.41 26.214 0.102 29.389 5.12 34.509 5.018 5.018 8.294 5.939 20.173 6.042 8.704 0 11.469-0.41 15.053-2.048zM452.403 214.221c7.68-5.427 8.397-8.397 8.397-35.226 0-21.606-0.205-23.552-2.15-27.75-1.331-2.662-3.891-5.53-6.349-7.168-3.994-2.662-4.71-2.765-17.101-2.765-12.288 0-13.107 0.102-17.101 2.765-2.56 1.638-5.018 4.506-6.349 7.373-2.15 4.301-2.253 5.632-1.946 29.082l0.307 24.474 2.867 4.198c4.915 6.963 9.318 8.499 23.347 8.192 11.162-0.307 12.083-0.512 16.077-3.174zM529.203 214.221c7.68-5.427 8.397-8.397 8.397-35.226 0-21.606-0.205-23.552-2.15-27.75-1.331-2.662-3.891-5.53-6.349-7.168-3.994-2.662-4.813-2.765-16.998-2.765-14.95 0-17.818 1.024-22.426 7.885l-2.765 4.301v51.507l2.867 4.198c4.915 6.963 9.318 8.499 23.347 8.192 11.162-0.307 12.083-0.512 16.077-3.174zM684.032 190.669c3.379-1.741 7.168-7.578 7.168-11.162 0-6.554-6.144-13.107-12.288-13.107-6.758 0-13.312 6.144-13.312 12.595 0 9.114 10.445 15.77 18.432 11.674zM735.232 190.669c3.482-1.741 7.168-7.578 7.168-11.366 0-6.451-6.451-12.902-12.8-12.902-9.011 0-15.462 10.342-11.264 18.33 3.174 6.144 10.957 8.909 16.896 5.939zM786.534 190.464c3.789-2.048 7.066-7.168 7.066-11.264 0-6.349-6.451-12.8-12.8-12.8-6.246 0-12.8 6.451-12.8 12.595 0 6.451 6.349 13.005 12.595 13.005 1.536 0 4.198-0.717 5.939-1.536zM374.784 182.784c4.813-4.813-0.102-12.698-6.451-10.342-4.301 1.638-5.222 8.192-1.536 10.752 3.072 2.15 5.53 2.048 7.987-0.41zM375.603 158.515c1.331-1.946 1.638-5.325 0.41-7.066-0.819-1.331-4.71-3.482-6.246-3.482-2.15 0-5.222 4.198-5.222 7.066 0 5.632 7.578 7.987 11.059 3.482z" />
+<glyph unicode="&#xe99b;" glyph-name="Decrease_test_size" d="M416.358 856.371c-46.285-5.734-87.859-37.888-110.080-85.197-1.843-3.891-9.83-24.678-17.715-46.080-7.885-21.504-17.408-47.514-21.299-57.958-3.789-10.445-14.848-40.55-24.576-67.072-9.728-26.419-19.968-54.374-22.733-61.952-2.867-7.578-5.53-14.95-5.939-16.384-0.512-1.434-1.843-5.12-3.072-8.192s-2.867-7.475-3.584-9.728c-0.717-2.253-6.758-18.637-13.312-36.352s-15.667-42.394-20.173-54.784c-4.506-12.39-9.523-26.010-11.059-30.208s-6.554-17.818-11.059-30.208c-4.506-12.39-12.186-33.075-16.896-46.080-26.112-70.963-36.045-98.099-38.605-104.96-1.536-4.198-4.915-13.619-7.68-20.992-8.602-23.347-10.24-31.744-11.366-55.706-0.717-15.258-0.307-18.227 4.403-31.027 12.083-32.87 53.453-55.603 99.123-54.682 15.155 0.41 22.835 2.56 33.587 9.83 13.414 9.011 22.835 20.787 32.87 41.472 6.554 13.414 10.854 25.702 18.432 53.248 8.294 30.003 14.95 54.067 15.565 56.115 0.512 1.638 8.704 1.741 154.010 1.741h153.395l1.126-3.277c0.922-3.072 3.789-13.107 19.968-70.554 6.246-22.323 8.294-27.853 13.619-38.298 6.042-11.674 13.517-21.914 22.835-31.232 10.957-10.957 21.709-16.794 34.509-18.637 17.306-2.56 44.954 1.946 63.898 10.342 26.112 11.674 40.96 27.853 47.104 51.507 1.946 7.373 2.15 10.24 1.638 21.811-1.331 29.696-2.048 32.358-26.317 97.792-6.758 18.227-37.683 102.4-44.544 121.344-6.246 17.203-44.646 121.754-51.712 140.8-6.349 17.203-23.552 64.307-33.894 92.672-2.253 6.246-4.71 12.902-5.53 14.848s-6.554 17.613-12.902 34.816c-6.246 17.203-14.541 39.731-18.33 50.176s-12.595 34.406-19.558 53.248c-14.643 40.038-19.456 50.688-29.696 66.048-9.114 13.722-26.317 31.232-38.912 39.629-15.462 10.445-33.382 17.818-51.61 21.299-7.782 1.536-34.611 2.048-43.93 0.819zM445.44 637.44c4.506-14.336 8.909-27.955 9.728-30.208 0.717-2.253 4.915-15.155 9.216-28.672s10.138-31.744 13.005-40.448c2.765-8.704 7.68-23.654 10.752-33.28 3.072-9.523 8.294-25.702 11.571-35.84 8.602-26.624 25.805-80.282 33.28-103.629 0.41-1.024-19.456-1.331-96.87-1.331-77.517 0-97.28 0.307-96.87 1.331 0.512 1.229 17.203 52.838 24.474 75.469 2.253 7.066 5.632 17.408 7.475 23.040s6.758 20.582 10.752 33.28c4.096 12.698 9.421 29.082 11.776 36.352 2.458 7.373 6.042 18.637 8.090 25.088s6.246 19.354 9.318 28.672c2.97 9.318 9.626 30.003 14.848 46.080 10.957 34.202 10.342 32.563 10.854 31.232 0.102-0.512 3.994-12.8 8.602-27.136zM657.101 753.562c-6.451-2.048-13.107-8.602-15.36-15.258-1.434-4.198-1.741-9.728-1.741-34.304 0-33.792 0.41-36.352 7.782-43.622 7.987-8.090-1.331-7.578 146.33-7.578 144.179 0 136.192-0.307 144.077 6.144 2.048 1.741 4.915 5.427 6.349 8.294 2.56 5.222 2.56 5.222 2.662 35.43 0.102 34.918-0.307 37.274-7.68 44.749-7.987 8.294 1.741 7.782-146.33 7.68-112.947 0-131.891-0.205-136.090-1.536z" />
+<glyph unicode="&#xe99c;" glyph-name="Defibrillator" d="M316.416 857.293c-0.307-0.205-4.198-0.717-8.704-1.126-4.506-0.307-9.114-0.819-10.24-1.024s-4.301-0.717-7.168-1.024c-8.909-1.331-30.003-6.758-42.291-10.957-14.336-4.915-34.918-14.746-48.333-22.835-33.28-20.378-65.229-52.326-85.606-85.606-16.384-26.931-29.491-62.566-34.099-92.672-0.614-3.891-1.331-9.011-1.638-11.264-1.434-9.114-1.331-46.182 0.102-57.856 6.554-54.272 27.75-101.274 64.512-142.95 29.594-33.485 47.002-53.248 47.514-53.658 0.307-0.307 5.427-6.042 11.264-12.8 5.939-6.758 11.059-12.493 11.366-12.8 0.512-0.512 10.957-12.288 23.962-27.136 3.379-3.891 6.861-7.782 7.68-8.602 0.922-0.922 4.608-5.12 8.192-9.318 3.686-4.198 6.861-7.885 7.168-8.192s5.632-6.246 11.776-13.21c6.246-7.066 13.722-15.565 16.794-18.944 3.072-3.482 6.963-7.885 8.704-9.83 1.741-2.048 6.656-7.578 10.854-12.288 4.301-4.813 13.005-14.643 19.456-22.016 6.451-7.27 11.981-13.517 12.288-13.824s5.53-6.246 11.776-13.312c6.144-7.066 12.698-14.438 14.438-16.384 6.758-7.578 14.336-16.179 17.306-19.558 1.638-1.946 6.656-7.68 11.264-12.698 4.506-5.12 11.469-12.902 15.36-17.408 3.994-4.403 7.68-8.499 8.192-9.114 0.614-0.614 6.042-6.861 12.288-13.926 19.354-22.016 48.435-55.091 54.682-61.952 2.048-2.253 8.909-9.933 15.155-16.998 6.246-7.168 11.776-12.698 12.186-12.288 0.512 0.307 2.458 2.458 4.403 4.71s6.451 7.373 10.035 11.366c3.584 4.096 7.373 8.294 8.294 9.318 0.922 1.126 4.608 5.222 7.987 9.114 3.482 3.891 13.824 15.565 23.040 26.010 9.114 10.445 20.378 23.142 24.883 28.16 4.608 5.12 11.264 12.698 14.95 16.896 8.704 9.933 32.051 36.25 36.762 41.472 2.048 2.253 6.656 7.578 10.342 11.776 3.584 4.198 6.861 7.885 7.168 8.192s5.837 6.451 12.288 13.824c6.451 7.27 13.21 14.95 14.95 16.896 8.294 9.318 47.309 53.453 60.211 68.096 7.885 9.011 14.643 16.589 14.95 16.896s5.632 6.246 11.776 13.312c6.246 7.066 11.469 13.005 11.776 13.312s5.53 6.246 11.776 13.312c6.144 7.066 12.902 14.643 14.95 16.896s7.782 8.704 12.698 14.336c4.915 5.632 10.445 11.878 12.186 13.824s8.909 10.035 15.872 17.92c6.963 7.885 15.77 17.818 19.558 22.016 12.8 14.336 15.872 17.92 20.582 24.064 27.238 35.738 43.622 74.65 50.688 120.832 1.946 12.186 2.56 47.002 1.229 60.826-4.506 44.134-21.197 88.474-46.899 124.006-3.072 4.198-6.042 8.192-6.656 8.806-0.512 0.717-2.56 3.174-4.506 5.632-7.27 9.216-30.72 31.437-42.086 39.936-16.691 12.39-24.986 17.51-42.701 26.112-34.304 16.794-68.403 24.883-107.827 25.498-19.046 0.307-24.986 0-43.52-2.662-47.411-6.656-96.768-30.413-134.144-64.614l-5.53-5.018-12.083 10.445c-36.966 31.846-86.63 54.374-131.891 59.802-3.277 0.41-6.963 0.922-8.192 1.229-2.765 0.614-42.906 1.536-43.52 1.024zM588.288 701.747c-0.41-1.229-6.656-29.798-11.878-54.579-1.126-5.018-2.253-10.035-2.56-10.957-0.307-1.024-0.717-2.97-1.024-4.506-0.717-3.994-13.619-62.874-14.746-67.482-1.536-6.144-8.192-37.376-8.192-38.502 0-0.512 27.136-0.922 70.656-0.922h70.758l-23.347-29.082c-22.938-28.672-56.422-70.451-139.674-174.592-23.142-28.979-41.882-51.712-41.574-50.688s0.819 3.072 1.126 4.506c1.843 8.909 23.45 107.418 33.997 154.726 1.843 8.806 3.482 16.486 3.482 17.101 0 0.922-17.613 1.229-70.656 1.229h-70.656l35.84 44.851c19.661 24.576 57.958 72.397 84.992 106.189s56.832 70.963 66.15 82.739c9.318 11.674 17.203 21.197 17.408 21.197s0.102-0.614-0.102-1.229z" />
+<glyph unicode="&#xe99d;" glyph-name="delete" d="M281.498 786.739c-3.994-0.922-9.83-3.379-13.005-5.325-6.963-4.301-83.558-80.486-88.986-88.474-7.27-10.854-10.035-25.805-7.066-38.4 3.686-15.872-0.717-10.957 101.274-113.152l93.389-93.389-93.389-93.491c-92.877-92.877-93.389-93.389-97.075-101.274-4.403-9.626-5.632-15.36-5.12-25.088 0.41-9.933 3.584-19.149 9.318-27.443 3.379-4.813 82.125-82.739 86.426-85.504 11.264-7.27 27.238-9.728 40.038-6.246 14.438 3.891 12.186 1.843 111.718 101.274l92.979 92.877 93.389-93.389c90.010-89.907 93.798-93.491 100.966-96.973 16.896-7.987 37.069-6.861 50.893 2.97 6.349 4.506 82.534 80.384 86.63 86.221 7.578 10.957 10.752 27.341 7.578 39.834-3.994 15.974 0.512 10.957-101.171 112.845l-93.389 93.389 93.286 93.491c66.15 66.15 94.106 94.822 96.051 98.406 9.421 17.306 8.397 38.298-2.56 54.374-3.174 4.71-80.794 82.432-85.402 85.606-9.114 6.144-20.070 9.216-31.027 8.602-9.728-0.41-17.306-2.765-24.781-7.373-3.686-2.355-37.786-35.738-97.997-95.846l-92.467-92.365-93.389 93.389c-102.093 101.888-97.28 97.587-113.050 101.274-8.192 1.843-14.438 1.638-24.064-0.819z" />
+<glyph unicode="&#xe99e;" glyph-name="device_desktop_computer" d="M116.019 780.39c-13.414-3.277-27.75-14.541-33.382-26.214-6.246-13.005-5.837 3.174-5.837-241.664 0-190.259 0.205-224.563 1.536-229.274 5.018-18.944 20.582-33.997 39.219-37.888 7.68-1.638 575.386-1.638 583.066 0 19.149 3.994 35.635 20.48 39.629 39.629 1.536 7.578 1.638 446.771 0 455.475-2.56 13.926-14.131 29.491-26.522 35.533-12.8 6.246 9.216 5.837-305.152 5.734-225.997-0.102-288.358-0.307-292.557-1.331zM691.2 537.6v-192h-563.2v384h563.2v-192zM417.178 319.283c20.173-6.861 22.733-35.123 4.096-45.978-9.114-5.325-24.064-3.379-31.027 4.096-9.523 10.342-9.421 26.214 0.41 35.942 6.963 7.066 16.896 9.216 26.522 5.939zM768 678.4v-51.2h128v-25.6h-128v-25.6h128v-25.6h-128l-0.205-134.861-0.307-134.963-2.253-6.861c-8.397-26.317-27.648-45.466-53.043-52.941-9.626-2.765-12.8-3.072-31.027-3.174h-15.667l0.102-29.389c0.102-27.853 0.307-29.901 2.56-36.864 2.867-9.011 7.168-15.974 13.619-22.016 6.656-6.144 11.366-8.909 20.48-11.674l7.782-2.458h96.256c80.486 0 97.28 0.307 101.888 1.434 16.896 4.608 29.901 16.384 36.147 32.973l2.355 6.042 0.307 263.168c0.205 192.102 0 264.806-0.819 269.312-3.686 19.558-20.992 36.864-40.346 40.346-3.994 0.717-29.184 1.126-71.987 1.126h-65.843v-51.2zM881.869 214.528c9.011-4.506 13.619-12.083 13.619-22.528-0.102-27.238-36.762-35.43-48.23-10.752-6.349 13.517 0.41 29.696 14.541 34.918 5.53 2.048 14.234 1.331 20.070-1.638zM332.8 192v-25.498l-110.080-0.614-4.813-2.867c-10.342-6.042-12.8-12.288-13.005-32.768l-0.205-15.053h409.907l-0.307 16.691c-0.41 15.974-0.512 16.794-3.277 21.402-1.536 2.662-4.403 6.042-6.349 7.578-7.066 5.427-8.806 5.53-65.741 5.53h-52.531v51.2h-153.6v-25.6z" />
+<glyph unicode="&#xe99f;" glyph-name="device_desktop_computer_connected" d="M116.019 780.39c-13.414-3.277-27.75-14.541-33.382-26.214-6.246-13.005-5.837 3.174-5.837-241.664 0-190.259 0.205-224.563 1.536-229.274 5.018-18.944 20.582-33.997 39.219-37.888 7.68-1.638 575.386-1.638 583.066 0 19.149 3.994 35.635 20.48 39.629 39.629 1.536 7.578 1.638 446.771 0 455.475-2.56 13.926-14.131 29.491-26.522 35.533-12.8 6.246 9.216 5.837-305.152 5.734-225.997-0.102-288.358-0.307-292.557-1.331zM691.2 537.6v-192h-563.2v384h563.2v-192zM417.178 319.283c20.173-6.861 22.733-35.123 4.096-45.978-9.114-5.325-24.064-3.379-31.027 4.096-9.523 10.342-9.421 26.214 0.41 35.942 6.963 7.066 16.896 9.216 26.522 5.939zM153.6 512.307v-12.595l6.451-0.307c38.093-1.536 77.722-25.19 100.454-60.109 13.107-20.070 20.275-40.346 21.299-60.928l0.41-6.656 25.293-0.614-0.717 9.523c-1.229 16.794-2.97 25.293-8.397 41.574-15.974 47.309-57.856 85.402-107.418 97.792-10.547 2.662-25.293 4.813-32.973 4.813h-4.403v-12.493zM153.6 461.414c0-11.059 0.205-12.39 1.843-12.39 3.789-0.102 10.24-1.229 17.818-3.072 33.28-8.090 56.73-37.376 58.061-72.397 0.102-2.355 0.307-2.355 12.493-2.355h12.493l-0.717 8.192c-2.048 24.371-12.186 46.387-29.491 63.795-17.408 17.408-40.448 28.16-64.512 30.003l-7.987 0.614v-12.39zM153.6 409.702v-12.698l4.403-0.717c10.854-1.843 19.046-10.035 20.787-20.89l0.717-4.198h25.498l-0.717 5.734c-1.946 16.998-13.005 32.563-28.57 40.141-6.144 2.97-14.746 5.325-19.558 5.325h-2.56v-12.698zM768 678.4v-51.2h128v-25.6h-128v-25.6h128v-25.6h-128l-0.205-134.861-0.307-134.963-2.253-6.861c-8.397-26.317-27.648-45.466-53.043-52.941-9.626-2.765-12.8-3.072-31.027-3.174h-15.667l0.102-29.389c0.102-27.853 0.307-29.901 2.56-36.864 2.867-9.011 7.168-15.974 13.619-22.016 6.656-6.144 11.366-8.909 20.48-11.674l7.782-2.458h96.256c80.486 0 97.28 0.307 101.888 1.434 16.896 4.608 29.901 16.384 36.147 32.973l2.355 6.042 0.307 263.168c0.205 192.102 0 264.806-0.819 269.312-3.686 19.558-20.992 36.864-40.346 40.346-3.994 0.717-29.184 1.126-71.987 1.126h-65.843v-51.2zM881.869 214.528c9.011-4.506 13.619-12.083 13.619-22.528-0.102-27.238-36.762-35.43-48.23-10.752-6.349 13.517 0.41 29.696 14.541 34.918 5.53 2.048 14.234 1.331 20.070-1.638zM332.8 192v-25.498l-110.080-0.614-4.813-2.867c-10.342-6.042-12.8-12.288-13.005-32.768l-0.205-15.053h409.907l-0.307 16.691c-0.41 15.974-0.512 16.794-3.277 21.402-1.536 2.662-4.403 6.042-6.349 7.578-7.066 5.427-8.806 5.53-65.741 5.53h-52.531v51.2h-153.6v-25.6z" />
+<glyph unicode="&#xe9a0;" glyph-name="device_fixed-line_phone" d="M324.198 881.562c-5.837-2.15-10.445-5.939-13.619-11.469l-2.867-4.813-0.205-352.768c-0.205-303.104-0.102-353.587 1.229-358.298 4.813-18.125 18.432-32.051 36.147-36.966 7.066-1.946 10.752-2.048 115.302-2.048 74.957 0 109.67 0.307 113.459 1.126 18.534 3.891 34.304 19.149 39.219 37.888 1.331 4.71 1.536 49.050 1.536 305.050 0 211.456-0.307 301.363-1.126 305.664-1.843 10.035-6.451 18.534-14.438 26.419-7.578 7.475-13.414 10.752-23.859 13.517-5.325 1.331-19.661 1.536-111.309 1.536h-105.165l-0.307 29.491-0.307 29.389-2.765 4.71c-6.349 10.854-19.456 15.77-30.925 11.571zM563.2 640v-115.2h-204.8v230.4h204.8v-115.2zM392.090 472.064c9.626-3.379 15.872-10.957 16.998-20.89 0.819-7.373-0.512-12.595-4.71-18.33-9.114-12.39-27.341-13.722-38.298-2.765-10.138 10.138-10.035 26.010 0.205 35.942 7.168 6.963 16.794 9.216 25.805 6.042zM472.371 470.63c5.734-2.765 11.469-9.728 13.107-15.872 2.56-9.421-1.229-20.89-8.704-26.624-16.282-12.39-38.81-3.072-41.165 16.998-1.434 12.595 5.427 22.733 19.046 27.853 3.277 1.229 13.005-0.102 17.715-2.355zM549.069 470.938c4.096-2.15 9.421-7.578 11.571-11.776 2.253-4.301 3.072-12.8 1.638-17.92-2.458-9.318-11.776-17.203-21.504-18.534-9.83-1.331-21.094 4.608-25.702 13.619-3.174 6.144-3.584 17.408-0.717 22.733 3.072 5.632 9.421 11.264 14.746 12.902 5.837 1.946 15.258 1.434 19.968-1.024zM396.902 393.216c20.685-12.186 14.336-44.032-9.421-47.104-14.336-1.946-27.341 8.192-28.774 22.528-1.229 11.981 7.066 24.371 18.33 27.238 5.632 1.434 15.053 0.205 19.866-2.662zM468.89 395.162c9.523-2.765 17.51-13.517 17.51-23.45 0-6.451-3.072-13.824-7.578-18.33-10.035-10.035-25.907-10.138-35.84-0.205-11.469 11.469-9.83 29.798 3.379 38.912 6.861 4.813 13.722 5.734 22.528 3.072zM549.376 393.83c9.421-5.12 14.643-15.053 13.414-25.498-1.638-14.029-12.698-23.040-27.136-22.221-19.558 1.024-30.106 23.45-18.739 39.834 3.072 4.506 8.806 8.704 13.722 9.933 5.325 1.331 14.234 0.307 18.739-2.048zM392.294 318.464c6.042-2.15 10.65-5.939 13.824-11.469 2.355-3.891 2.765-5.939 2.867-12.493 0.102-7.168-0.205-8.499-2.97-13.005-10.24-16.589-33.69-16.589-44.032 0-2.662 4.403-3.072 5.939-3.072 12.8 0 6.656 0.41 8.499 2.765 12.493 6.349 10.752 19.149 15.667 30.618 11.674zM469.094 318.464c6.144-2.15 10.65-5.939 13.926-11.571 2.458-4.096 2.867-5.939 2.867-12.595 0-6.861-0.41-8.294-3.072-12.8-5.632-9.114-16.384-14.029-26.931-12.186-5.837 0.922-13.414 6.349-16.896 11.981-12.186 20.070 7.987 44.954 30.106 37.171zM548.966 317.030c9.933-5.12 13.619-11.162 13.619-22.63 0.102-6.656-0.307-8.397-2.765-12.493-15.258-26.112-54.784-9.114-46.387 19.968 4.301 14.848 21.709 22.221 35.533 15.155zM504.832 190.669c3.482-1.741 7.168-7.578 7.168-11.366 0-4.403-1.946-7.782-6.042-10.547-3.482-2.355-3.482-2.355-44.851-2.355-45.67 0-45.568 0-49.459 6.451-1.126 1.843-2.048 4.301-2.048 5.632 0 4.096 2.867 9.318 6.349 11.469 3.277 1.946 5.018 2.048 44.851 2.048 31.13 0 42.086-0.307 44.032-1.331zM218.419 216.166c-18.534-4.506-34.202-20.685-38.093-39.322-0.717-3.686-1.126-30.822-1.126-84.685v-79.36h665.6v80.179c0 76.493-0.102 80.589-2.048 87.245-5.12 18.022-20.582 32.461-38.707 36.25-3.686 0.717-30.822 1.126-84.685 1.126h-79.36v-28.365c0-15.667-0.512-31.232-1.024-34.611-5.325-32.666-29.901-57.754-62.464-63.898-3.686-0.717-44.442-0.922-119.296-0.819-105.37 0.307-114.074 0.41-119.603 2.048-26.931 8.192-46.899 28.058-54.272 54.067-2.355 8.499-2.662 12.595-2.662 43.213l-0.102 28.365-28.365-0.102c-19.046 0-30.208-0.512-33.792-1.331zM776.090 164.864c6.042-2.048 11.059-6.246 14.234-11.674 2.355-3.994 2.765-5.939 2.765-12.39s-0.41-8.397-2.765-12.288c-1.434-2.56-4.198-5.939-6.042-7.475-3.686-3.072-11.674-5.837-16.794-5.837-5.427 0-12.493 3.072-16.794 7.168-6.246 6.144-7.782 9.626-7.782 18.432 0 6.554 0.41 8.397 2.867 12.493 6.349 10.752 18.944 15.667 30.31 11.571z" />
+<glyph unicode="&#xe9a1;" glyph-name="device_laptop_computer" d="M166.605 753.664c-18.637-5.12-33.69-20.787-37.478-39.219-0.819-3.891-1.126-75.674-1.126-251.085v-245.76h768v245.76c0 175.411-0.307 247.194-1.126 251.085-4.096 19.558-20.89 36.045-40.448 39.629-4.198 0.819-105.984 1.126-344.371 1.024-278.221-0.102-339.456-0.307-343.45-1.434zM844.8 486.4v-217.6h-665.6v435.2h665.6v-217.6zM76.8 164.557c0-22.938 0.307-28.365 1.741-32.461 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.816-1.638h414.106l5.734 2.765c3.072 1.536 6.963 4.403 8.602 6.349 5.53 6.758 6.042 10.138 6.042 40.243v27.443h-358.195l-0.614-3.789c-1.434-8.397-6.554-15.155-14.95-19.866-2.048-1.126-13.107-1.536-59.29-1.741-64.614-0.307-63.488-0.41-71.373 7.578-3.994 4.198-7.578 11.571-7.578 15.974 0 1.741-6.554 1.843-179.2 1.843h-179.2v-27.443z" />
+<glyph unicode="&#xe9a2;" glyph-name="device_laptop_computer_connected" d="M166.605 753.664c-18.637-5.12-33.69-20.787-37.478-39.219-0.819-3.891-1.126-75.674-1.126-251.085v-245.76h768v245.76c0 175.411-0.307 247.194-1.126 251.085-4.096 19.558-20.89 36.045-40.448 39.629-4.198 0.819-105.984 1.126-344.371 1.024-278.221-0.102-339.456-0.307-343.45-1.434zM844.8 486.4v-217.6h-665.6v435.2h665.6v-217.6zM204.8 435.61v-12.698l6.451-0.205c24.064-1.024 51.507-11.981 72.602-29.082 28.979-23.552 48.23-60.416 49.357-94.106l0.205-4.608 25.293-0.614-0.717 10.445c-4.096 61.44-45.363 115.2-103.526 134.861-7.782 2.662-14.746 4.403-27.546 6.963-1.126 0.205-6.554 0.614-12.083 1.024l-10.035 0.717v-12.698zM204.8 384.614c0-6.861 0.307-12.39 0.819-12.39 21.299-0.717 42.291-10.035 56.32-25.088 11.264-11.981 17.715-26.214 19.866-43.725l1.126-9.011h24.474l-0.614 8.192c-3.277 38.605-28.467 72.806-64.102 86.835-9.011 3.584-20.378 6.246-29.389 6.963l-8.499 0.614v-12.39zM204.8 333.107v-12.8l4.198-0.717c10.854-1.741 19.251-10.138 20.992-20.992l0.717-4.198h25.293v2.867c0 9.114-6.144 23.142-13.722 31.334-9.216 10.035-18.534 14.848-32.051 16.589l-5.427 0.717v-12.8zM76.8 164.557c0-22.938 0.307-28.365 1.741-32.461 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.816-1.638h414.106l5.734 2.765c3.072 1.536 6.963 4.403 8.602 6.349 5.53 6.758 6.042 10.138 6.042 40.243v27.443h-358.195l-0.614-3.789c-1.434-8.397-6.554-15.155-14.95-19.866-2.048-1.126-13.107-1.536-59.29-1.741-64.614-0.307-63.488-0.41-71.373 7.578-3.994 4.198-7.578 11.571-7.578 15.974 0 1.741-6.554 1.843-179.2 1.843h-179.2v-27.443z" />
+<glyph unicode="&#xe9a3;" glyph-name="device_smart_phone" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56z" />
+<glyph unicode="&#xe9a4;" glyph-name="device_status" d="M296.96 882.483c-4.71-0.819-13.824-4.506-18.637-7.68-10.752-6.861-19.968-20.48-22.221-32.973-1.638-8.704-1.536-780.698 0-788.275 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 18.637 3.891 34.202 18.944 39.219 37.888 2.253 8.294 2.253 784.077 0 792.371-4.813 18.33-19.149 32.666-37.478 37.478-4.71 1.331-36.966 1.434-216.986 1.331-116.326 0-212.582-0.307-214.016-0.512zM555.725 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.789 6.042-2.15 12.698 3.994 16.794l3.482 2.355h41.574c39.424 0 41.779-0.102 44.851-2.048zM715.776 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.288 85.709c11.674-7.168 15.565-22.63 8.499-34.816-5.222-9.216-16.589-14.029-27.443-11.571-24.474 5.53-26.522 40.038-2.97 48.845 6.042 2.253 16.077 1.126 21.914-2.458zM499.098 638.566c-15.36-4.301-26.931-15.872-31.539-31.642-1.536-5.222-1.638-17.613-0.205-23.757 1.331-5.632 7.373-15.565 12.39-20.378 14.438-13.722 34.714-16.486 52.838-7.27 5.632 2.867 15.36 12.595 18.227 18.227 12.698 24.883 0.717 54.886-25.498 64.205-6.861 2.458-18.739 2.662-26.214 0.614zM463.155 525.005l-28.979-0.205v-18.022l11.366-1.741c13.21-1.946 18.227-4.096 20.275-8.397 3.891-7.885 4.096-14.234 4.096-101.888 0.102-87.347-0.205-96.358-3.789-101.376-2.765-3.891-10.342-7.066-21.709-8.909l-10.24-1.843v-13.824h153.6v14.234l-5.837 0.614c-8.192 0.922-18.739 3.482-21.914 5.427-3.789 2.15-5.734 6.042-6.963 13.619-0.717 4.198-1.126 44.442-1.126 114.381v107.725h-3.277c-1.843 0-15.36 0.102-30.003 0.307-14.643 0.102-39.629 0.102-55.501-0.102z" />
+<glyph unicode="&#xe9a5;" glyph-name="device_tablet" d="M218.112 881.562c-8.704-2.355-15.974-6.246-22.323-12.186-7.27-6.758-11.878-14.336-14.541-23.859-2.048-7.27-2.048-11.264-2.048-397.722 0-425.574-0.41-394.547 5.734-407.245 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.144-8.806-5.734 303.514-5.734 202.24 0 288.666 0.307 292.864 1.126 18.842 3.379 34.816 18.637 39.936 37.888 1.331 4.71 1.536 61.133 1.536 395.981 0 386.458 0 390.451-2.048 397.722-4.915 17.818-18.739 31.334-36.966 36.147-8.397 2.253-579.277 2.15-587.674-0.102zM793.6 473.6v-358.4h-563.2v716.8h563.2v-358.4zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56z" />
+<glyph unicode="&#xe9a6;" glyph-name="device_tablet_connected" d="M218.112 881.562c-8.704-2.355-15.974-6.246-22.323-12.186-7.27-6.758-11.878-14.336-14.541-23.859-2.048-7.27-2.048-11.264-2.048-397.722 0-425.574-0.41-394.547 5.734-407.245 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.144-8.806-5.734 303.514-5.734 202.24 0 288.666 0.307 292.864 1.126 18.842 3.379 34.816 18.637 39.936 37.888 1.331 4.71 1.536 61.133 1.536 395.981 0 386.458 0 390.451-2.048 397.722-4.915 17.818-18.739 31.334-36.966 36.147-8.397 2.253-579.277 2.15-587.674-0.102zM793.6 473.6v-358.4h-563.2v716.8h563.2v-358.4zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM256.205 282.010l0.307-12.595 6.656-0.307c3.686-0.205 8.704-0.819 11.264-1.331s6.144-1.229 7.987-1.536c1.946-0.307 7.27-1.946 11.981-3.482 22.938-7.987 43.827-22.63 60.211-42.291 17.92-21.402 28.979-49.459 29.798-75.366l0.102-3.789 25.293-0.614-0.614 9.421c-2.97 45.158-25.293 86.835-60.518 112.845-13.414 10.035-18.125 12.698-33.28 19.354-13.517 6.042-32.87 10.547-49.459 11.674l-10.035 0.717 0.307-12.698zM256 231.117v-12.39l4.915-0.614c23.654-2.97 38.605-10.035 52.326-24.678 11.366-12.186 18.33-28.058 20.070-45.67l0.717-6.963h24.371v3.994c0 5.837-2.765 20.89-5.222 28.058-13.107 39.014-48.333 66.662-88.986 69.939l-8.192 0.614v-12.288zM256 179.302v-12.595l4.198-0.717c10.854-1.741 19.251-10.138 20.992-20.992l0.717-4.198h25.498l-0.717 5.939c-0.922 7.475-4.915 17.613-9.523 24.064-4.198 5.734-12.595 12.902-18.842 15.872-5.222 2.56-15.462 5.325-19.456 5.325h-2.867v-12.698z" />
+<glyph unicode="&#xe9a7;" glyph-name="device_tv" d="M119.808 780.083c-19.763-3.277-36.762-19.354-41.472-39.322-1.331-5.734-1.536-36.966-1.536-254.464 0-164.454 0.307-249.754 1.024-253.44 3.584-18.637 19.968-35.43 38.707-39.322 5.222-1.126 16.282-1.536 47.616-1.536h40.653v-76.8h614.4v76.8h40.96c43.827 0 47.309 0.307 58.163 5.222 7.885 3.584 19.149 14.336 23.142 22.118 6.144 12.186 5.734-5.734 5.734 266.342 0 274.739 0.512 254.874-6.246 267.571-6.554 12.288-16.282 20.378-30.106 24.986l-7.578 2.56-390.451-0.102c-214.733-0.102-391.578-0.41-393.011-0.614zM896 486.4v-243.2h-768v486.4h768v-243.2zM521.933 202.65c5.325-1.946 11.674-8.806 14.131-15.053 4.506-11.878-2.253-26.931-14.234-31.949-5.325-2.253-14.438-2.253-19.558-0.102-12.083 5.12-18.842 20.173-14.336 31.949 5.427 14.234 19.558 20.582 33.997 15.155z" />
+<glyph unicode="&#xe9a8;" glyph-name="device-connected-printer" d="M230.4 627.2v-153.6l-53.965-0.102c-29.798 0-55.296-0.307-56.832-0.512-19.456-3.277-36.045-18.739-41.37-38.605-1.126-4.403-1.434-29.184-1.434-139.162 0-94.31 0.307-135.373 1.126-139.264 3.891-18.637 18.944-34.202 37.888-39.219 8.294-2.253 784.077-2.253 792.371 0 16.896 4.506 29.901 16.282 36.147 32.87l2.355 6.042 0.307 136.499c0.205 122.47 0.102 137.114-1.434 142.848-4.608 18.227-18.637 32.154-37.274 37.069-4.608 1.229-15.565 1.536-60.109 1.536h-54.579v102.4l-204.8 204.8h-358.4v-153.6zM563.2 662.733c0-61.85 0.102-67.482 1.946-74.138 4.813-18.637 20.89-33.69 39.424-37.069 3.994-0.717 29.082-1.126 71.987-1.126h65.843v-204.8h-460.8v384h281.6v-66.867zM520.704 215.859c14.336-4.813 21.197-23.347 13.517-36.454-3.072-5.222-5.018-6.963-10.854-10.035-19.968-10.342-42.906 9.523-35.43 30.72 4.813 13.926 18.739 20.582 32.768 15.77zM307.405 583.066l0.307-18.739 6.144-0.205c3.379-0.205 8.499-0.614 11.264-0.922 2.867-0.307 6.963-0.922 9.216-1.126 6.554-0.819 20.685-4.506 31.334-8.090 45.056-15.258 88.166-52.326 111.206-95.744 12.8-23.962 21.094-53.146 22.016-77.312l0.307-8.192 18.842-0.307 18.739-0.205-0.614 11.981c-0.41 6.656-1.126 15.258-1.741 19.251-15.155 108.749-105.267 191.795-214.733 197.734l-12.595 0.717 0.307-18.842zM307.2 506.573v-18.227l11.059-1.126c41.574-4.403 74.854-26.726 92.672-62.259 4.403-8.909 8.397-20.685 9.933-29.286 0.614-3.584 1.331-7.475 1.536-8.602s0.41-4.915 0.41-8.397l0.102-6.451h18.432c14.029 0 18.432 0.307 18.534 1.331 0.41 5.53-0.717 18.022-2.253 26.317-5.734 29.901-19.866 57.242-40.96 78.848-15.667 15.974-33.178 27.648-53.453 35.738-15.155 6.042-36.045 10.342-50.074 10.342h-5.939v-18.227zM307.2 429.568v-19.456h3.379c3.686 0 11.366-2.15 15.667-4.403 8.909-4.608 17.101-16.691 18.534-27.341l0.819-5.632 19.149-0.307 19.149-0.205-0.512 5.837c-3.379 37.274-32.666 66.662-70.246 70.451l-5.939 0.512v-19.456z" />
+<glyph unicode="&#xe9a9;" glyph-name="device-manager" d="M584.192 753.562c-12.288-1.434-32.051-4.813-37.888-6.554-35.021-10.342-53.555-18.125-76.288-31.744-13.824-8.294-32.256-21.606-40.96-29.696-8.704-7.987-20.685-20.070-25.805-26.010-8.909-10.24-7.885-9.728-15.872-8.192-9.83 1.946-32.154 1.126-43.008-1.536-39.322-9.728-69.325-36.557-82.637-73.83-2.97-8.294-5.734-19.968-5.734-24.371 0-2.765-0.307-2.867-8.499-4.096-34.509-5.427-72.397-23.142-99.021-46.49-21.811-19.149-36.864-38.298-49.357-62.771-14.746-29.082-21.504-56.627-21.709-89.088-0.102-24.883 1.229-36.966 6.144-55.808 15.155-56.934 54.886-105.574 107.008-131.072 10.445-5.12 10.752-5.325 30.72-25.702 44.544-45.363 78.541-79.258 83.866-83.661 19.251-15.667 46.694-18.842 68.813-7.885 11.059 5.53 13.824 8.192 79.258 75.059l20.378 20.685 169.472 0.307c93.184 0.102 170.906 0.614 172.544 1.024 1.741 0.41 5.632 1.229 8.704 1.843 9.114 1.741 22.426 5.939 31.232 9.933 43.93 19.866 75.366 57.242 86.938 103.219 3.174 12.8 3.584 15.462 4.301 30.618 1.741 32.154-7.27 64.512-25.702 92.16-7.373 11.059-15.462 20.275-27.034 30.515l-4.403 3.994 1.638 8.294c0.922 4.608 1.843 10.957 2.253 14.029 0.307 3.072 0.819 6.758 1.126 8.192 1.126 6.144 1.024 45.363-0.205 57.344-7.68 73.933-43.315 140.493-100.864 188.518-38.195 31.846-89.088 54.477-137.728 61.338-4.506 0.614-9.523 1.331-11.264 1.638-7.578 1.229-48.742 1.126-60.416-0.205zM623.104 676.659c3.072-1.024 6.656-3.379 9.318-6.144 7.987-8.192 7.578-2.458 7.578-107.315 0-105.062 0.41-99.533-7.68-107.52-5.427-5.53-12.902-8.192-20.48-7.373-6.554 0.717-10.65 2.662-15.77 7.782-7.68 7.68-7.373 2.56-7.066 109.261l0.307 95.13 2.97 4.915c3.482 5.939 8.806 9.933 15.974 12.288 3.277 1.126 10.035 0.614 14.848-1.024zM526.848 619.315c10.547-3.584 17.715-15.155 16.589-26.624-0.819-7.578-4.096-12.698-14.131-21.811-22.938-20.89-37.683-48.64-42.496-79.872-1.229-8.499-0.614-30.822 1.126-39.424 5.837-28.058 17.818-50.278 37.274-69.018 62.259-60.006 164.659-42.189 203.264 35.43 18.739 37.478 17.613 81.51-2.97 117.555-6.861 12.083-14.746 21.709-27.136 33.485-6.042 5.837-11.981 12.186-13.21 14.131-5.222 8.909-3.379 22.323 4.096 29.798 5.12 5.12 8.704 6.861 15.565 7.68 11.366 1.331 19.558-3.482 38.093-22.63 24.064-24.678 39.629-53.965 46.49-87.45 13.722-66.867-11.776-135.475-65.946-177.459-24.269-18.842-50.074-30.003-82.944-35.738-8.090-1.434-38.605-1.843-48.538-0.614-7.373 0.819-7.68 0.922-19.968 3.789-47.104 11.162-88.166 41.677-113.050 84.275-2.97 4.915-5.325 9.114-5.325 9.318 0 0.307-1.536 3.789-3.482 7.987-9.933 21.197-15.155 45.773-15.155 71.987-0.102 34.099 7.987 64.614 25.088 93.594 12.8 21.914 37.376 47.514 49.869 51.917 5.018 1.843 11.059 1.741 16.896-0.307zM391.578 344.371c5.632-1.638 15.155-11.162 16.794-16.794 0.922-3.072 1.229-21.504 1.229-69.939v-65.638h37.888c20.89 0 37.888-0.205 37.888-0.614 0-0.307-27.341-27.853-60.621-61.133-47.411-47.309-61.85-61.235-65.638-62.976-9.933-4.608-21.811-3.994-30.925 1.638-2.253 1.434-13.005 11.571-23.859 22.63s-37.478 37.888-59.187 59.699c-21.606 21.709-39.322 39.834-39.322 40.141s17.101 0.614 37.888 0.614h37.888v132.608l2.56 5.12c1.331 2.867 3.072 5.837 3.789 6.656 2.253 2.662 8.294 6.861 11.571 7.987 4.608 1.638 86.528 1.638 92.058 0z" />
+<glyph unicode="&#xe9aa;" glyph-name="device-managment-express" d="M584.192 753.562c-12.288-1.434-32.051-4.813-37.888-6.554-35.021-10.342-53.555-18.125-76.288-31.744-13.824-8.294-32.256-21.606-40.96-29.696-8.704-7.987-20.685-20.070-25.805-26.010-8.909-10.24-7.885-9.728-15.872-8.192-9.83 1.946-32.154 1.126-43.008-1.536-39.322-9.728-69.325-36.557-82.637-73.83-2.97-8.294-5.734-19.968-5.734-24.371 0-2.765-0.307-2.867-8.499-4.096-34.406-5.427-71.885-22.938-98.918-46.387-21.197-18.33-36.966-38.502-49.459-62.874-14.746-29.082-21.504-56.627-21.709-89.088-0.102-24.883 1.229-36.966 6.144-55.808 15.155-56.934 54.886-105.574 107.008-131.072 10.445-5.12 10.752-5.325 30.72-25.702 44.544-45.363 78.541-79.258 83.866-83.661 15.36-12.493 36.864-17.408 55.501-12.595 14.234 3.686 24.269 10.138 38.707 24.781 4.198 4.403 22.63 23.142 40.858 41.779l33.28 33.894h115.302v-28.979c0-25.6 0.205-29.696 2.048-35.84 5.018-17.715 18.944-31.334 36.864-36.045 4.301-1.126 15.155-1.434 50.074-1.536 40.755 0 45.261 0.102 52.122 1.946 18.125 4.71 31.744 18.739 36.557 37.478 1.229 4.71 1.536 12.288 1.536 34.509v28.467l17.203 0.102c9.421 0 18.739 0.205 20.685 0.41 52.838 4.608 98.099 34.509 123.597 81.51 6.656 12.186 14.029 34.611 16.077 48.538 1.536 10.138 1.843 29.389 0.717 39.424-4.506 39.117-22.426 73.421-52.122 99.635l-4.506 3.994 1.638 8.294c0.922 4.608 1.843 10.957 2.253 14.029 0.307 3.072 0.819 6.758 1.126 8.192 1.126 6.144 1.024 45.363-0.205 57.344-7.68 73.933-43.315 140.493-100.864 188.518-38.195 31.846-89.088 54.477-137.728 61.338-4.506 0.614-9.523 1.331-11.264 1.638-7.578 1.229-48.742 1.126-60.416-0.205zM391.578 344.371c5.632-1.638 15.155-11.162 16.794-16.794 0.922-3.072 1.229-21.504 1.229-69.939v-65.638h37.888c20.89 0 37.888-0.205 37.888-0.614 0-0.307-27.341-27.853-60.621-61.133-47.411-47.309-61.85-61.235-65.638-62.976-9.933-4.608-21.811-3.994-30.925 1.638-2.253 1.434-13.005 11.571-23.859 22.63s-37.478 37.888-59.187 59.699c-21.606 21.709-39.322 39.834-39.322 40.141s17.101 0.614 37.888 0.614h37.888v132.608l2.56 5.12c1.331 2.867 3.072 5.837 3.789 6.656 2.253 2.662 8.294 6.861 11.571 7.987 4.608 1.638 86.528 1.638 92.058 0zM690.688 342.528c3.379-1.638 9.626-6.963 18.125-15.36 28.467-28.058 109.363-108.749 109.363-109.158 0-0.205-16.998-0.41-37.888-0.41h-37.786l-0.307-67.277c-0.307-63.386-0.41-67.584-2.253-70.963-3.072-5.939-8.909-11.162-14.643-13.312-5.222-1.946-8.090-2.048-47.616-2.048-28.57 0-43.315 0.41-45.978 1.126-5.222 1.638-10.547 6.144-14.029 11.981l-2.765 4.813-0.307 67.891-0.307 67.789h-77.926l39.936 40.243c22.016 22.016 49.152 49.459 60.314 60.723 24.576 24.883 27.853 27.034 41.779 26.624 5.12-0.205 8.602-0.922 12.288-2.662z" />
+<glyph unicode="&#xe9ab;" glyph-name="dialler" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-62.976-50.893-109.875-117.043-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 85.811 7.987 160.666 36.352 226.816 86.118 84.787 63.693 143.667 156.877 164.659 260.71 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM332.698 723.968c11.162-3.891 22.426-14.95 50.278-49.152 24.269-29.696 38.298-49.357 42.598-59.699 2.15-5.222 2.867-14.336 1.536-19.354-2.15-7.987-10.752-18.842-31.13-39.526-17.101-17.306-20.070-20.787-21.197-24.781-6.758-24.064 22.323-68.301 87.654-133.12 46.285-46.080 81.306-72.704 107.418-82.022 7.168-2.458 20.378-2.56 24.883-0.102 1.946 1.024 11.162 9.523 20.48 18.842 17.715 17.613 27.136 25.702 35.021 30.003 3.789 2.15 5.939 2.56 12.8 2.56 7.168-0.102 9.114-0.512 15.053-3.379 11.366-5.632 23.45-14.234 53.043-37.99 46.387-37.376 55.603-47.821 53.965-61.645-1.434-11.571-7.578-19.456-43.725-55.398-29.901-29.798-32.666-31.846-47.616-35.226-12.8-2.97-37.888-2.56-54.886 0.922-50.381 10.445-107.827 38.195-164.25 79.36-11.162 8.192-31.539 23.962-33.28 25.805-0.307 0.307-3.482 3.072-7.168 6.144-22.221 18.739-60.006 55.603-79.974 78.336-69.222 78.643-111.821 156.467-122.163 223.232-2.048 12.902-1.434 35.533 1.229 45.568 3.482 13.517 6.656 18.534 21.606 34.202 23.347 24.474 44.339 45.158 50.79 49.869 10.24 7.475 18.739 9.523 27.034 6.554z" />
+<glyph unicode="&#xe9ac;" glyph-name="Digital_frame" d="M115.405 779.264c-18.944-5.222-34.099-21.299-37.478-39.936-0.819-4.301-1.126-94.208-1.126-305.664 0-256 0.205-300.339 1.536-305.050 5.018-18.842 20.787-34.099 39.219-37.888 3.891-0.819 116.941-1.126 395.264-1.126 424.858 0 393.933-0.41 406.63 5.734 7.475 3.686 18.33 14.541 21.914 21.914 6.246 13.005 5.837-10.65 5.837 318.669v300.749l-2.458 7.782c-5.632 17.613-18.739 30.106-36.966 34.918-7.578 2.048-784.998 1.946-792.371-0.102zM870.4 435.2v-268.8h-716.8v537.6h716.8v-268.8zM290.816 599.552c-52.838-11.162-77.312-72.602-47.002-117.76 20.173-30.106 59.904-41.882 93.286-27.648 16.794 7.168 30.925 20.48 38.912 36.864 5.837 11.981 7.373 19.046 7.373 33.792 0 17.92-3.072 28.262-12.288 42.189-17.818 26.829-48.64 39.322-80.282 32.563zM609.792 489.472c-5.018-2.355-5.222-2.56-27.546-31.642-10.035-13.005-72.294-93.082-78.131-100.454-7.168-9.114-36.864-47.104-41.062-52.736-3.174-4.198-10.24-13.21-20.582-26.419l-7.475-9.421-3.174 3.994c-4.403 5.427-21.504 26.010-42.189 50.79-9.421 11.264-18.842 22.528-20.89 24.986-2.048 2.56-5.12 6.246-6.861 8.192-1.741 2.048-12.493 14.95-23.962 28.57-11.366 13.722-22.221 25.805-23.962 26.931-3.891 2.355-10.854 2.56-15.053 0.41-1.638-0.922-29.286-27.853-61.338-60.006l-58.368-58.368v-102.298h665.6v76.8l-109.67 109.67c-70.144 70.144-110.899 110.182-113.152 111.104-4.301 1.843-8.192 1.741-12.186-0.102z" />
+<glyph unicode="&#xe9ad;" glyph-name="disable_apps" d="M484.352 475.648l-435.2-435.2 54.272-54.272 217.6 217.6c119.706 119.706 315.494 315.494 435.2 435.2l217.6 217.6-54.272 54.272-435.2-435.2zM191.488 856.883c-11.878-1.843-27.853-7.168-36.762-12.39-22.221-12.902-38.912-32.87-46.797-56.013-5.12-15.053-4.915-6.963-5.222-166.093l-0.41-148.787h308.838l75.264 75.264v308.736l-146.125-0.102c-80.486-0.102-147.354-0.41-148.787-0.614zM537.6 728.883v-128.819l128.512 128.512c70.656 70.656 128.512 128.614 128.512 128.717 0 0.205-57.856 0.307-128.512 0.307h-128.512v-128.717zM792.576 602.112l-128.512-128.512h257.536v128.512c0 70.656-0.102 128.512-0.307 128.512-0.102 0-58.061-57.856-128.717-128.512zM102.4 293.683v-128.819l128.512 128.512c70.656 70.656 128.512 128.614 128.512 128.717 0 0.205-57.856 0.307-128.512 0.307h-128.512v-128.717zM575.181 384.717l-37.581-37.581v-308.838l298.496 0.614 9.626 2.867c38.4 11.264 66.355 41.267 73.83 79.462 1.843 9.318 1.946 16.896 2.048 155.546v145.613h-308.736l-37.683-37.683zM357.376 166.912l-128.512-128.512h257.536v128.512c0 70.656-0.102 128.512-0.307 128.512-0.102 0-58.061-57.856-128.717-128.512z" />
+<glyph unicode="&#xe9ae;" glyph-name="Discovery_offer" d="M499.405 894.464c-17.613-2.97-30.925-10.547-46.694-26.624-28.262-28.774-85.094-86.835-90.726-92.672-3.789-3.891-24.269-24.883-45.568-46.592-21.197-21.709-41.984-42.906-46.182-47.206-9.933-10.24-79.872-81.715-86.221-87.962l-4.813-4.915 0.205-251.29 0.307-251.187 2.867-10.035c5.222-18.637 13.517-32.973 26.829-46.285 15.565-15.565 33.485-24.883 55.501-28.672 7.987-1.434 37.888-1.536 251.187-1.331l242.176 0.307 10.035 2.765c17.92 4.915 33.075 13.824 46.285 26.931 11.674 11.571 19.968 24.986 25.088 40.448 5.325 15.77 5.12 6.144 5.12 271.155v247.194l-19.866 20.070c-10.957 11.162-22.733 23.142-26.214 26.829s-23.962 24.576-45.466 46.49c-68.301 69.734-83.046 84.787-95.437 97.587-26.010 26.726-79.155 80.998-87.962 89.702-14.234 14.336-26.419 21.299-42.906 24.678-8.397 1.741-19.354 1.946-27.546 0.614zM525.619 778.854c23.552-5.427 42.496-23.859 48.435-47.206 7.782-30.515-9.114-63.283-38.605-74.65-20.582-8.090-42.906-5.325-60.621 7.373-35.533 25.395-35.533 78.438-0.102 103.731 14.541 10.342 34.202 14.541 50.893 10.752zM539.238 432.538c51.302-7.475 101.888-32.973 155.443-78.234 10.445-8.806 47.718-45.875 47.718-47.411 0-1.331-20.992-24.064-32.358-35.021-41.882-40.448-87.962-69.018-134.042-83.251-35.123-10.854-73.523-12.595-107.52-4.915-48.128 10.854-96.973 38.093-144.998 80.589-16.486 14.541-41.984 41.267-41.062 43.008 3.482 6.144 33.587 37.069 49.254 50.586 43.11 37.171 92.672 63.181 137.626 72.294 22.733 4.608 48.64 5.53 69.939 2.355zM494.182 407.45c-35.226-6.349-64.205-30.208-77.414-63.488-9.523-23.757-9.011-54.272 1.126-77.414 5.222-11.981 12.186-22.221 21.402-31.539 14.848-14.848 30.31-23.552 50.688-28.262 11.469-2.662 33.894-2.662 44.544 0 24.781 6.246 45.158 19.558 60.211 39.629 5.018 6.656 12.595 21.606 15.053 29.594 4.915 16.384 5.632 39.014 1.638 55.091-7.885 31.642-30.925 58.163-60.826 70.451-16.691 6.758-39.014 9.114-56.422 5.939zM545.894 356.352c9.523-3.379 15.667-11.059 16.896-20.992 1.229-10.547-3.482-19.866-12.595-25.293-9.933-5.837-24.781-3.174-32.154 5.837-3.277 3.891-6.042 11.674-6.042 16.896 0 5.837 3.174 13.005 7.885 17.51 7.168 7.066 16.794 9.216 26.010 6.042z" />
+<glyph unicode="&#xe9af;" glyph-name="Discussion_author" d="M485.274 857.19c-0.205-0.205-5.837-0.717-12.39-1.024-6.656-0.41-13.107-0.922-14.336-1.126-1.331-0.205-5.12-0.614-8.499-1.024-41.882-4.506-87.45-15.565-127.283-30.822-50.483-19.456-95.642-46.285-133.837-79.667-25.907-22.733-51.2-52.531-68.71-81.101-22.938-37.376-37.171-78.643-41.882-121.754-1.331-12.39-1.536-51.61-0.205-57.344 0.307-1.126 0.819-4.813 1.229-8.192 1.741-15.974 6.042-33.587 12.902-54.272 25.293-75.162 84.378-142.746 165.274-189.133 26.214-15.053 60.006-30.003 88.883-39.322l11.981-3.891v-175.821l153.293 153.395 20.173 0.717c11.059 0.41 20.685 0.922 21.402 1.126s4.915 0.614 9.421 0.922c22.528 1.638 51.712 6.554 77.824 13.005 65.434 16.077 121.446 42.291 172.032 80.384 6.246 4.71 12.493 9.523 13.926 10.854 1.536 1.331 5.018 4.301 7.68 6.554 23.040 19.661 47.923 48.23 65.434 75.162 7.475 11.366 23.142 41.472 27.034 51.712 14.438 37.888 20.173 67.789 20.275 104.96 0.307 79.053-32.87 154.726-94.822 215.962-48.435 47.821-107.622 82.739-178.688 105.472-33.997 10.854-76.288 19.456-108.646 22.118-4.506 0.41-9.523 0.922-11.264 1.126-3.686 0.614-67.686 1.536-68.198 1.024zM589.722 674.611c2.97-11.162 47.206-188.826 47.206-189.542 0-0.41-1.536-1.638-3.277-2.662-11.776-6.758-30.515-23.552-41.062-36.966-13.107-16.691-26.112-39.834-34.202-60.928-6.963-18.227-11.469-34.611-15.565-57.344-1.946-10.445-2.253-12.902-3.686-26.317l-0.717-6.451h-16.179v206.643l3.482 2.15c6.758 4.198 11.878 13.517 11.878 21.709 0 6.554-3.686 14.746-8.499 18.842-10.547 9.011-25.702 8.499-35.123-1.229-10.854-11.162-9.523-28.774 2.765-37.99l5.018-3.686v-206.438h-16.077l-1.229 10.547c-1.843 16.077-2.15 17.818-4.813 30.925-8.499 41.574-23.45 76.288-45.773 106.394-9.114 12.083-26.317 28.774-37.274 35.942-5.222 3.379-9.421 6.451-9.523 6.963 0 0.614 43.93 177.254 47.206 189.44l1.024 3.789h153.395l1.024-3.789z" />
+<glyph unicode="&#xe9b0;" glyph-name="Discussion_more" d="M485.274 857.19c-0.205-0.205-5.837-0.717-12.39-1.024-6.656-0.41-13.107-0.922-14.336-1.126-1.331-0.205-5.12-0.614-8.499-1.024-41.882-4.506-87.45-15.565-127.283-30.822-50.483-19.456-95.642-46.285-133.837-79.667-25.907-22.733-51.2-52.531-68.71-81.101-22.938-37.376-37.171-78.643-41.882-121.754-1.331-12.39-1.536-51.61-0.205-57.344 0.307-1.126 0.819-4.813 1.229-8.192 1.741-15.974 6.042-33.587 12.902-54.272 25.293-75.162 84.378-142.746 165.274-189.133 26.214-15.053 60.006-30.003 88.883-39.322l11.981-3.891v-175.821l153.395 153.395 19.763 0.717c10.957 0.41 20.787 0.922 21.914 1.126s5.53 0.717 9.728 1.024c38.298 2.867 85.402 13.107 125.44 27.136 44.851 15.77 85.914 37.581 122.47 65.024 36.25 27.238 65.024 57.754 88.474 93.696 7.475 11.366 23.142 41.472 27.034 51.712 14.438 37.888 20.173 67.789 20.275 104.96 0.307 79.053-32.87 154.726-94.822 215.962-33.075 32.666-69.837 58.368-113.254 79.36-17.613 8.499-18.125 8.704-34.816 15.258-42.701 16.794-96.051 29.491-139.264 32.973-4.506 0.41-9.523 0.922-11.264 1.126-3.686 0.614-67.686 1.536-68.198 1.024zM307.712 574.464c23.859-5.018 43.52-24.474 49.254-48.742 0.307-1.331 0.819-6.144 1.126-10.65 1.843-30.003-18.534-57.344-48.538-65.126-27.955-7.168-59.085 7.066-71.885 32.87-12.288 25.088-8.602 52.326 10.035 73.114 6.144 6.758 18.022 14.029 28.262 17.306 9.216 2.97 21.299 3.379 31.744 1.229zM526.336 574.259c8.909-2.048 19.968-7.475 26.726-13.312 28.16-23.962 30.515-65.741 5.325-92.467-9.421-10.035-22.118-17.306-33.485-19.251-9.011-1.536-24.371-0.717-32.051 1.741-17.101 5.53-31.232 18.022-38.502 33.894-4.608 9.933-6.144 16.998-6.144 27.136 0 10.65 1.638 17.408 6.656 28.16 3.379 7.066 5.734 10.342 12.493 16.998 10.24 10.138 20.275 15.36 34.918 18.125 4.915 0.922 18.227 0.41 24.064-1.024zM744.858 573.952c27.443-6.963 46.797-30.413 48.538-58.47 2.458-42.701-37.99-75.878-79.565-65.331-33.075 8.397-53.76 41.574-46.694 75.162 7.27 34.816 43.418 57.446 77.722 48.64z" />
+<glyph unicode="&#xe9b1;" glyph-name="Doctor" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM348.16 518.758c-34.304-21.094-61.235-46.694-82.534-78.541-13.107-19.661-26.317-50.586-30.515-71.578-4.608-23.040-4.608-22.323-4.403-148.992l0.205-120.32 2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.458-5.222h234.394l-0.102 163.123c0 129.946-0.307 165.171-1.434 173.875-8.499 67.277-51.405 129.638-116.224 169.062l-9.728 5.837-0.205-4.301c-0.205-2.355-0.41-23.859-0.614-47.821s-0.717-44.851-1.126-46.592c-0.307-1.638-1.126-5.632-1.741-8.704-8.602-45.056-39.834-85.606-82.33-106.803-15.872-7.885-33.792-13.312-48.742-14.643l-7.066-0.717v-39.731c0-35.942 0.205-39.834 1.638-39.834 3.379 0 14.848-6.349 20.275-11.264 21.811-20.070 22.63-53.043 1.741-73.728-20.582-20.48-51.507-20.48-71.782-0.102-20.378 20.48-20.378 51.2-0.102 71.68 6.451 6.554 17.715 13.414 22.118 13.414 1.331 0 1.536 4.915 1.331 39.731l-0.307 39.629-3.584 0.307c-1.946 0.205-8.090 1.229-13.619 2.355-55.091 10.854-99.635 50.995-116.941 105.37-5.427 17.101-5.837 22.426-6.349 69.632-0.205 24.474-0.41 46.285-0.614 48.435l-0.205 3.789-9.728-6.042zM384.307 464.896c0.205-19.149 0.717-36.147 1.126-37.888 1.946-8.499 5.939-22.63 7.168-25.498 0.819-1.741 2.662-5.939 4.198-9.318 10.65-23.245 36.25-48.742 60.006-59.699 9.728-4.403 19.866-7.885 27.546-9.318 3.686-0.717 8.704-1.741 11.264-2.253s11.264-0.717 19.456-0.512c21.606 0.614 36.25 4.198 54.682 13.517 29.082 14.643 52.634 41.472 62.874 71.578 6.144 18.125 6.554 21.606 7.066 59.392l0.512 34.816-2.97-2.662c-2.56-2.355-12.493-10.854-21.299-18.227-1.741-1.434-13.414-10.854-26.112-21.094-19.456-15.565-32.051-25.498-73.933-58.061l-3.789-2.97-15.667 11.981c-8.602 6.656-19.149 14.848-23.347 18.125-4.198 3.379-9.216 7.27-11.162 8.806-16.998 13.107-58.266 46.694-71.578 58.368l-6.554 5.632 0.512-34.714z" />
+<glyph unicode="&#xe9b2;" glyph-name="Doctors_bag" d="M438.784 831.283c-35.328-5.12-64.41-29.286-75.571-62.771-4.198-12.493-4.71-18.739-4.506-59.392l0.205-38.4 2.867-4.813c8.704-14.848 28.365-17.408 40.243-5.222 7.168 7.27 7.578 9.83 7.578 42.803 0 33.997 0.512 37.069 7.782 44.032 8.192 7.987 3.994 7.68 94.003 7.68 44.339 0 81.715-0.512 83.968-1.024 5.734-1.331 11.878-5.939 15.462-11.674l3.072-5.018 1.024-66.765 2.867-4.915c9.933-16.896 34.509-16.896 44.442 0l2.867 4.915v41.984c0 40.55-0.102 42.291-2.355 49.971-9.626 33.178-33.28 56.934-66.355 66.458-8.090 2.253-8.499 2.253-81.306 2.458-40.243 0.102-74.547-0.102-76.288-0.307zM239.616 626.483c-7.578-0.819-23.45-4.403-32.256-7.27-52.736-17.408-92.058-62.771-102.707-118.477-1.638-8.499-1.741-24.883-1.741-214.016v-204.8l2.867-4.813c1.536-2.662 4.403-6.042 6.349-7.578 7.782-5.939-20.685-5.53 400.179-5.53 275.251 0 388.096 0.307 390.758 1.126 5.837 1.741 11.571 6.246 14.95 11.674l3.072 4.915v204.902c0 193.536-0.102 205.414-1.843 214.118-2.56 12.698-5.325 22.016-9.728 32.256-18.739 44.442-58.061 78.234-103.526 89.293-20.275 4.915-9.114 4.71-293.99 4.71-147.866-0.102-270.438-0.307-272.384-0.512zM531.968 523.674c20.173-2.15 41.062-8.397 60.416-18.022 19.251-9.523 39.731-25.293 53.453-41.062 9.728-11.264 10.138-11.776 16.179-21.094 20.378-31.232 30.515-68.403 28.774-105.062-0.717-15.36-0.922-16.998-3.686-30.31-13.824-65.536-64-118.272-128.922-135.68-26.317-7.066-59.187-7.68-86.118-1.536-7.68 1.741-24.371 7.066-29.696 9.523-31.642 14.336-55.091 32.87-74.445 58.675-17.818 23.859-30.618 56.218-33.997 86.016-1.331 11.878-0.614 39.526 1.331 50.176 5.837 31.744 19.354 61.44 37.786 83.456 30.925 36.864 70.656 58.573 118.477 64.922 8.499 1.126 29.798 1.126 40.448 0zM460.8 435.2v-38.4h-76.8v-102.4h76.8v-76.8h102.4v76.8h76.8v102.4h-76.8v76.8h-102.4v-38.4z" />
+<glyph unicode="&#xe9b3;" glyph-name="Doctors_communicating" d="M102.707 505.139c0.307-274.432 0.307-275.763 2.355-282.522 8.704-28.058 30.003-48.128 57.549-54.17 8.192-1.843 13.517-2.048 64-2.048h54.989v-76.288c0-41.984 0.205-76.288 0.512-76.288s34.816 34.304 76.902 76.288l76.39 76.288h486.195l-0.307 275.763c-0.205 258.97-0.307 275.968-2.048 281.498-8.806 28.672-28.979 48.23-56.934 55.091-7.475 1.843-20.685 1.946-383.898 1.946l-376.013 0.102 0.307-275.661zM538.112 701.030c18.944-4.71 34.304-13.312 48.128-27.238 19.763-19.763 30.106-44.544 30.003-72.192-0.205-44.442-27.955-83.046-69.939-97.075-21.402-7.168-49.357-6.656-68.71 1.434-15.667 6.451-24.986 12.595-35.942 23.654-24.474 24.576-34.611 58.47-27.75 92.262 4.096 20.378 13.005 36.966 27.955 51.917 15.053 15.155 32.973 24.576 54.272 28.672 10.752 1.946 30.822 1.331 41.984-1.434zM437.35 471.552c0.102-31.13 0.205-33.894 2.458-42.291 7.168-27.648 26.931-47.616 55.091-55.501l5.837-1.638v-28.058l-4.608-2.458c-12.595-6.656-20.275-19.763-20.173-34.406 0.205-21.197 16.691-37.478 38.093-37.581 33.997-0.205 51.098 41.165 26.931 65.126-2.765 2.662-7.373 5.939-10.24 7.475l-5.427 2.56v27.238l3.891 0.717c14.438 2.662 29.286 10.957 40.55 22.528 3.584 3.686 5.222 5.837 11.059 14.746 2.662 3.891 6.861 15.155 8.397 22.733 1.024 4.608 1.434 15.872 1.536 37.683 0.102 17.203 0.41 31.437 0.614 31.642 0.205 0.307 3.686-1.638 7.578-4.301 28.774-19.456 51.098-50.586 60.314-83.763 5.939-21.094 5.632-17.613 6.144-96.87l0.307-73.933-264.806 0.512-6.144 2.56c-18.432 7.475-31.949 23.245-35.328 40.96-1.638 8.499-1.126 93.389 0.614 104.96 2.662 18.432 6.656 31.539 14.234 46.694 4.096 8.294 13.005 23.142 14.746 24.474 0.307 0.307 2.458 2.867 4.71 5.632 5.018 6.246 12.493 13.722 19.968 20.070 5.837 5.018 22.63 16.486 23.142 15.974 0.205-0.205 0.41-15.258 0.512-33.485zM489.779 464.179l24.269-16.179 25.395 16.896 25.293 16.896 0.307-18.637c0.205-11.162-0.205-21.197-0.819-24.883-3.686-19.558-20.173-36.25-39.731-40.346-11.674-2.458-23.040-0.717-34.918 5.325-12.288 6.246-23.142 20.992-25.6 34.918-1.638 9.011-1.536 43.93 0.205 43.008 0.614-0.41 12.186-8.090 25.6-16.998z" />
+<glyph unicode="&#xe9b4;" glyph-name="Document_compose" d="M179.2 470.323c0-449.741-0.41-417.075 5.734-429.568 3.891-8.090 13.21-17.51 21.094-21.606 13.414-6.861-13.107-6.349 328.294-6.349h310.477v280.576l56.832 56.832c31.232 31.232 57.958 58.573 59.29 60.826 3.994 6.246 6.042 14.746 5.427 22.016-1.331 14.438-2.253 15.667-39.526 53.146l-33.382 33.587-24.371-24.166-24.269-24.166v155.75l-81.101 0.102c-44.646 0-82.637 0.205-84.275 0.41-36.045 4.813-66.56 27.136-81.51 59.494-3.379 7.373-7.578 22.528-8.499 30.208-0.205 2.458-0.512 40.755-0.512 85.197l-0.102 80.589h-409.6v-412.877zM702.976 573.542c2.867-1.331 6.451-3.789 7.987-5.632 3.072-3.686 5.837-11.981 5.837-17.613 0-8.090-6.758-18.432-14.746-22.733l-4.198-2.253-184.32-0.307c-125.133-0.205-185.549 0-188.006 0.717-13.517 3.994-21.504 19.763-16.896 33.587 2.56 7.68 9.216 14.029 16.486 15.77 1.638 0.41 86.221 0.717 187.904 0.819l184.832 0.102 5.12-2.458zM916.992 459.674c23.859-24.064 25.395-26.112 23.552-32.358-0.614-2.15-32.973-35.635-34.406-35.635-0.41 0-47.923 47.206-52.122 51.814-0.512 0.614 37.99 39.322 39.219 39.322 0.512 0 11.162-10.445 23.757-23.142zM699.699 471.962c2.765-0.922 6.758-3.482 9.216-5.939 12.595-12.186 9.421-33.485-6.246-41.165-3.686-1.843-10.547-1.946-190.669-1.946h-186.88l-4.915 2.458c-12.39 6.042-16.691 23.347-8.806 35.226 3.277 5.018 9.011 9.421 14.95 11.571 3.174 1.126 35.43 1.331 186.266 1.434 164.352 0 182.784-0.205 187.085-1.638zM841.83 419.226c3.584-3.482 14.234-13.926 23.654-23.245 18.227-18.022 19.866-20.48 17.306-26.624-0.614-1.536-61.235-62.771-134.554-136.090l-133.325-133.222-16.896-8.704c-9.318-4.71-23.142-11.878-30.72-15.77-7.578-3.994-23.040-11.981-34.304-17.715-11.264-5.837-22.426-11.571-24.781-12.902-4.096-2.253-5.632-2.15-3.482 0.102 0.512 0.614 3.482 6.144 6.758 12.288 3.174 6.246 6.656 12.698 7.68 14.336 0.922 1.741 4.198 7.68 7.168 13.312s6.861 13.005 8.704 16.384c1.843 3.379 8.704 16.282 15.36 28.672l11.981 22.528 136.397 136.397c74.957 75.059 136.294 136.499 136.397 136.499 0 0 3.072-2.867 6.656-6.246zM698.675 369.971c2.048-0.614 3.789-1.434 3.789-1.843 0-0.307-10.854-11.264-24.064-24.371l-23.962-23.757h-163.021c-120.73 0-164.045 0.307-166.912 1.229-9.421 2.765-17.306 13.824-17.306 24.371 0 10.752 7.27 20.89 17.408 24.064 3.891 1.126 33.69 1.434 187.392 1.434 135.373 0.102 183.808-0.205 186.675-1.126zM443.494 268.288c23.040-7.68 22.835-40.448-0.205-48.128-6.963-2.355-110.387-2.355-118.17-0.102-22.118 6.656-24.166 36.557-3.174 47.411 4.71 2.458 15.462 2.867 68.506 2.662 41.779-0.102 48.538-0.41 53.043-1.843zM640 802.611c0.102-88.678-0.102-86.938 6.963-99.942 6.349-11.878 17.51-20.582 29.901-23.142 4.096-0.922 27.443-1.126 86.528-0.922l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xe9b5;" glyph-name="document_stack" d="M179.2 547.328c0-338.739-0.41-314.88 5.734-327.373 3.277-6.758 11.162-15.462 17.613-19.661 6.042-3.891 15.155-7.066 22.426-7.987l5.427-0.614v614.707h178.688c98.304 0 178.688 0.205 178.688 0.512s-11.264 11.776-25.088 25.6l-25.19 25.088h-358.298v-310.272zM256 471.040c0-222.106 0.307-311.194 1.126-315.085 4.403-21.197 22.938-37.99 44.442-40.346l5.632-0.614v614.605h358.4l-25.702 25.6-25.6 25.6h-358.298v-309.76zM332.8 394.24c0-222.106 0.307-311.194 1.126-315.085 4.096-19.456 20.992-36.147 40.243-39.629 4.301-0.819 75.981-1.126 238.387-1.126h232.243v471.040h-66.253c-36.557 0.102-68.198 0.307-70.451 0.614-6.861 0.819-17.101 4.301-23.347 7.782-12.493 7.066-20.992 15.974-27.443 28.979-6.963 14.234-7.066 14.438-7.066 89.907v67.277h-317.44v-309.76zM748.851 416.154c2.253-0.614 5.632-2.765 7.782-5.018 9.011-9.318 7.782-23.654-2.765-31.13l-4.506-3.174h-320.819l-3.891 2.458c-6.349 3.891-9.318 9.626-9.421 17.51 0 5.222 0.512 7.475 2.458 10.547 2.355 3.891 7.987 8.192 11.981 9.216 4.198 1.024 315.29 0.717 319.181-0.41zM752.947 311.91c7.578-4.71 11.366-14.541 9.011-23.347-1.536-5.53-7.987-12.186-13.312-13.619-2.765-0.717-53.965-0.922-162.099-0.819l-158.208 0.307-4.198 2.97c-7.885 5.427-10.854 13.722-8.294 22.835 1.536 5.53 7.578 12.083 12.595 13.517 1.843 0.614 68.71 0.922 161.894 0.819l158.72-0.205 3.891-2.458zM748.851 211.354c4.608-1.229 10.342-6.758 12.595-11.981 3.379-7.987 0-18.842-7.68-24.269l-4.403-3.072h-321.126l-4.403 3.072c-10.65 7.578-12.083 21.709-2.97 31.13 2.15 2.253 5.53 4.506 7.373 5.12 4.915 1.331 315.494 1.434 320.614 0zM691.2 638.157c0-73.114-0.102-72.294 7.168-79.565 8.192-8.192 2.662-7.68 78.131-7.987 36.966-0.102 67.277 0 67.277 0.205 0 0.717-151.45 152.166-152.064 152.166-0.307 0-0.512-29.184-0.512-64.819z" />
+<glyph unicode="&#xe9b6;" glyph-name="document_word" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM776.294 497.664c6.144-2.15 10.65-5.939 13.926-11.571 2.458-4.096 2.867-5.939 2.867-12.493s-0.512-8.499-2.765-12.39c-3.174-5.427-8.294-9.626-14.234-11.674-5.939-2.15-164.147-2.253-170.086-0.102-17.51 6.246-22.63 28.57-9.626 41.882 7.782 8.090 3.277 7.68 94.413 7.782 70.042 0.102 81.613-0.102 85.504-1.434zM304.026 469.811c0.614-2.15 2.97-11.674 5.222-21.299 2.355-9.523 7.168-29.389 10.752-44.032s8.397-34.714 10.752-44.544c5.939-24.781 6.246-25.907 6.656-25.395 0.41 0.41 9.318 33.382 18.739 68.915 2.253 8.499 6.861 26.010 10.342 38.912 3.482 13.005 6.758 25.293 7.373 27.443l1.024 3.789 22.118-0.205 22.221-0.307 2.253-8.704c1.229-4.813 5.53-21.606 9.626-37.376s9.216-35.533 11.469-44.032c4.608-17.818 10.65-41.267 12.288-47.104 1.126-3.891 2.048-0.41 18.739 66.56l17.613 70.656 23.347 0.307c18.944 0.205 23.142 0 22.733-1.126-0.307-0.717-1.536-5.018-2.765-9.421-3.994-14.336-17.408-62.259-18.944-67.584-0.819-2.765-5.837-20.582-11.162-39.424s-12.902-46.182-16.998-60.621l-7.475-26.419h-23.45c-17.818 0-23.45 0.307-23.757 1.331-0.205 0.614-2.048 7.68-4.096 15.565-11.366 44.134-30.413 117.146-31.13 119.808-0.819 3.072-0.922 2.97-2.56-2.56-0.819-3.072-4.813-18.33-8.806-33.792-3.891-15.462-9.216-36.25-11.776-46.080-2.458-9.83-6.246-24.371-8.192-32.256-2.048-7.885-4.198-16.077-4.71-18.125l-1.126-3.891h-47.616l-3.891 14.131c-2.15 7.68-5.939 21.402-8.397 30.413s-5.222 18.739-6.042 21.504c-0.819 2.867-2.15 7.68-2.97 10.752-1.638 6.349-33.587 121.651-35.021 126.259-0.512 1.638 1.024 1.741 23.040 1.741h23.552l1.024-3.789zM780.902 393.216c6.042-3.789 11.366-11.366 12.288-17.715 1.638-10.752-3.994-21.914-13.414-26.726l-5.018-2.662-81.92-0.307c-73.933-0.205-82.33-0.102-86.938 1.434-9.83 3.277-17.101 13.722-17.101 24.576 0 10.138 8.090 20.89 18.227 23.962 1.536 0.512 40.141 0.819 85.811 0.717l83.046-0.205 5.018-3.072zM776.294 292.864c17.715-6.042 22.938-28.774 9.626-41.984-7.987-7.987-3.994-7.68-94.208-7.68-90.112 0-87.347-0.205-94.822 7.27s-9.626 15.872-6.554 26.112c2.355 8.090 8.602 14.131 17.92 17.101 0.819 0.307 37.99 0.614 82.534 0.614 70.042 0.102 81.51-0.102 85.504-1.434zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xe9b7;" glyph-name="document_zip" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-117.76v-40.96h40.96v-40.96h-40.96v-40.96h40.96v-40.96h-40.96v-40.96h40.96v-40.96h-40.96v-40.96h40.96v-40.96h-40.96v-40.96h40.96v-64.819c0-60.826-0.102-65.434-1.946-72.602-3.072-11.981-7.475-19.763-16.384-28.57-32.563-32.461-85.299-19.968-101.683 23.962-2.253 6.349-2.253 6.451-2.662 74.24l-0.307 67.789h41.062v40.96h-40.96v40.96h40.96v40.96h-40.96v40.96h40.96v40.96h-40.96v40.96h40.96v40.96h-40.96v40.96h40.96v40.96h-250.88v-412.877zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565zM441.242 426.189c-10.65-2.97-18.534-9.933-23.347-20.173-2.15-4.608-2.56-7.168-2.662-14.336 0-7.782 0.307-9.421 3.379-15.565 6.144-12.493 17.306-19.661 30.925-19.661 10.342-0.102 16.179 1.741 23.245 7.475 4.403 3.584 6.861 6.554 9.523 11.776 3.277 6.451 3.584 7.885 3.584 15.872 0 10.24-2.662 17.306-9.216 24.576-7.987 8.806-23.859 13.312-35.43 10.035z" />
+<glyph unicode="&#xe9b8;" glyph-name="Documentary" d="M72.192 741.683c-8.397-1.741-14.438-6.349-18.534-14.131-1.843-3.379-1.946-7.475-1.946-81.92 0-86.938-0.41-81.92 6.758-89.088 7.68-7.578 15.667-9.114 31.642-5.939 4.198 0.922 26.010 5.325 48.538 9.933 38.093 7.782 41.677 8.294 53.453 8.294h12.698v-173.056c0-154.317 0.205-173.978 1.638-181.043 5.837-28.57 26.317-50.381 55.603-59.29 5.325-1.638 23.757-1.843 281.498-2.048l275.661-0.307v58.88c0 32.358 0.205 58.88 0.512 58.88s27.341-13.414 60.109-29.798c63.59-31.846 64.717-32.256 74.24-29.696 6.349 1.741 12.595 6.963 15.872 13.312l2.867 5.53-0.205 134.246c-0.307 126.771-0.41 134.451-2.15 137.933-5.53 11.059-18.125 17.101-29.389 13.926-1.946-0.512-30.208-14.234-62.669-30.515l-59.187-29.594-0.102 46.285c0 25.498-0.307 48.435-0.614 50.995-0.922 7.373-5.325 20.48-9.216 27.136-10.957 18.739-25.395 30.003-47.923 37.171-4.506 1.536-18.842 1.741-127.181 1.946l-122.163 0.41v28.058c0 30.72-0.512 35.328-5.427 45.568-3.994 8.294-14.336 18.944-22.221 22.835-12.493 6.144-4.71 5.837-161.485 5.837h-143.667l-48.947 9.626c-58.061 11.469-53.043 10.65-58.061 9.626zM420.762 361.677c5.427-3.072 10.957-9.318 12.8-14.643 1.331-3.994 1.638-9.83 1.638-33.69 0-33.792-0.614-37.069-7.68-44.032-7.782-7.782-8.499-7.782-58.573-7.475l-43.827 0.307-4.71 2.765c-5.734 3.379-9.933 8.704-11.776 14.95-2.048 6.656-2.048 59.29 0 65.946 2.458 8.397 9.523 15.36 17.408 17.306 1.741 0.41 23.040 0.717 47.206 0.614 40.653-0.205 44.339-0.307 47.514-2.048zM575.795 360.653c5.734-3.379 10.138-9.114 11.878-15.258 0.922-3.072 1.126-13.414 0.922-35.123l-0.307-30.72-2.97-5.018c-3.379-5.632-9.421-10.342-15.155-11.981-2.56-0.614-19.456-0.922-47.718-0.717-43.418 0.307-43.725 0.307-47.821 2.662-2.253 1.331-5.53 3.994-7.373 5.939-6.042 6.758-6.451 9.728-6.451 42.803 0 29.491 0 29.901 2.56 35.226 1.331 2.97 4.198 6.963 6.246 8.909 6.861 6.554 7.27 6.554 56.73 6.349l44.544-0.205 4.915-2.867z" />
+<glyph unicode="&#xe9b9;" glyph-name="done_modifier" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c65.331-6.861 122.266-29.696 174.387-70.246 14.029-10.854 41.267-37.99 52.838-52.531 41.37-52.122 64.819-109.568 71.68-176.128 1.536-14.336 1.843-45.158 0.614-58.368-1.638-16.998-1.946-19.866-4.096-31.949-18.125-104.038-86.118-194.15-181.76-240.947-36.659-17.92-77.21-29.184-117.248-32.666-10.752-0.922-54.682-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-36.25 4.71-70.963 15.565-104.96 32.666-23.245 11.776-45.875 26.726-65.741 43.418-6.144 5.222-30.003 28.877-35.942 35.635-41.062 47.206-69.53 109.875-78.029 172.339-2.662 19.763-3.482 52.122-1.843 73.728 4.506 60.518 28.57 123.187 66.15 172.544 48.435 63.59 117.043 107.52 193.741 124.314 6.451 1.434 13.414 2.765 15.36 3.072s4.915 0.819 6.554 1.126c3.482 0.512 20.787 2.458 26.726 2.867 10.035 0.819 44.134 0.307 55.296-0.922zM687.411 626.278c-11.674-2.97-9.523-1.024-124.211-115.507-60.006-59.904-110.387-109.568-112.026-110.387s-4.608-1.536-6.656-1.536c-3.482 0-6.042 2.355-46.387 42.701-23.45 23.45-44.237 43.52-46.182 44.544-17.51 8.909-43.725-2.662-59.187-26.317-8.704-13.107-9.728-27.955-2.867-41.677 1.741-3.379 4.506-6.861 19.866-24.883 11.878-14.131 30.618-36.147 32.563-38.4 1.229-1.434 4.813-5.632 7.885-9.216 3.072-3.686 7.373-8.704 9.728-11.264 2.253-2.56 6.656-7.578 9.728-11.264 7.885-9.216 19.251-22.323 23.552-27.034 4.403-4.915 3.891-4.403 13.722-15.462 16.282-18.432 27.341-28.57 35.635-32.768 13.619-6.656 25.907-5.939 37.683 2.253 5.53 3.891 9.626 8.602 34.304 39.834 6.144 7.885 19.251 24.371 29.184 36.864 9.83 12.493 25.293 31.949 34.304 43.418 9.011 11.366 23.040 29.082 31.232 39.322 8.192 10.342 21.299 26.931 29.184 36.864 7.885 10.035 18.227 23.142 23.040 29.184s13.107 16.384 18.432 23.142c24.781 31.334 37.786 47.821 44.646 56.422 11.162 14.029 14.029 20.685 13.926 32.154-0.102 13.517-10.854 28.365-26.214 35.84-6.963 3.482-18.33 4.915-24.883 3.174z" />
+<glyph unicode="&#xe9ba;" glyph-name="download" d="M367.616 856.678c-8.909-1.946-20.89-7.168-27.648-12.186-18.33-13.517-29.594-32.256-32.154-53.453-0.307-1.946-0.512-85.504-0.512-185.549l-0.102-182.067-229.581-0.512 4.608-4.608c2.56-2.56 19.046-18.637 36.659-35.84s39.526-38.605 48.845-47.616c9.216-9.011 21.504-20.992 27.341-26.624s23.552-22.938 39.424-38.4c15.872-15.462 33.28-32.461 38.707-37.786 15.155-14.643 73.216-71.168 93.901-91.341 10.138-9.933 21.402-20.992 25.088-24.474s15.667-15.155 26.726-26.010c31.027-30.31 33.28-32.154 45.978-38.912 16.896-8.806 30.618-11.981 50.176-11.469 18.637 0.512 34.099 5.018 49.152 14.336 10.752 6.554 11.162 6.963 69.325 63.693 17.306 16.896 34.509 33.69 38.195 37.274 3.686 3.482 21.402 20.787 39.424 38.4s35.533 34.611 38.912 37.888c3.379 3.174 20.89 20.275 38.912 37.888s36.045 35.123 39.936 38.912c3.994 3.789 21.914 21.299 39.936 38.912s35.738 34.918 39.424 38.4c3.686 3.482 13.722 13.312 22.426 21.811l15.77 15.565-229.683 0.512v182.067c0 119.091-0.41 184.218-1.024 188.416-4.813 29.594-26.112 53.248-55.808 62.054-7.066 2.15-8.602 2.15-145.408 2.355-129.741 0.205-138.752 0.102-146.944-1.638z" />
+<glyph unicode="&#xe9bb;" glyph-name="draft" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM531.046 568.934c2.765-2.253 7.578-6.861 10.65-10.445 3.072-3.482 6.144-6.861 6.656-7.475 1.638-1.741 18.33-22.323 20.582-25.293 9.011-12.39 39.219-50.586 43.11-54.784 14.848-15.565 33.997-26.010 47.923-26.010 24.269 0 65.946 33.485 118.579 95.232 3.584 4.198 3.174 3.277-3.994-10.752-32.563-63.488-63.181-101.171-95.027-116.736-12.698-6.246-20.173-7.987-33.894-7.987-9.626 0-12.493 0.41-19.456 2.765-25.907 8.806-51.814 35.328-79.36 80.896-6.554 10.752-13.312 20.070-15.974 21.811-3.686 2.355-5.53 0.922-8.499-6.963-11.878-31.539-41.267-104.653-46.899-116.429-7.68-16.179-24.883-27.034-41.779-26.419-9.114 0.41-15.667 3.379-22.733 10.445-6.451 6.451-9.728 12.8-19.763 38.81-9.626 24.781-11.366 28.57-13.312 28.979-1.024 0.102-3.379-2.867-6.656-8.192-2.765-4.71-10.138-16.589-16.282-26.419s-11.981-19.251-12.902-20.992c-4.71-8.192-48.538-78.029-49.664-79.155-0.307-0.307-1.331 0.307-2.355 1.434-2.56 2.765-26.010 30.208-27.648 32.358-1.229 1.536-0.819 2.56 2.97 7.68 3.891 5.222 24.166 35.635 65.024 97.382 15.36 23.245 18.739 27.341 28.262 33.997 10.752 7.578 19.763 9.933 28.672 7.578 16.384-4.198 28.672-22.528 40.243-59.802 4.813-15.155 4.608-14.746 5.018-14.234 0.717 0.922 13.517 24.986 36.25 68.506 33.997 65.126 51.098 94.208 55.398 94.208 1.024 0 4.096-1.843 6.861-3.994zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xe9bc;" glyph-name="dual_sim_packaging" d="M0 448v-512h1024v1024h-1024v-512zM997.376 448v-485.376h-970.752v970.752h970.752v-485.376zM266.65 755.814l-53.35-53.35 0.205-89.6c0.205-96.87-0.102-91.034 5.53-102.195 2.97-5.734 11.366-13.824 17.818-16.896 2.97-1.434 8.294-3.174 11.981-3.789 4.71-0.717 76.39-1.024 246.272-0.819l239.616 0.307 5.632 2.253c12.288 5.018 21.811 15.36 25.6 27.75 1.946 6.349 2.048 9.933 2.048 129.126 0 107.418-0.205 123.29-1.638 128.614-3.686 14.336-13.619 24.678-28.57 30.106-3.482 1.229-34.304 1.434-211.046 1.638l-206.848 0.205-53.248-53.35zM554.598 734.822c0.102-22.426-0.205-31.846-1.024-32.154-0.614-0.205-14.95-0.307-31.846-0.307l-30.72 0.102-0.307 20.992c-0.41 26.112 0.307 30.31 6.451 36.454 2.458 2.458 5.939 4.813 7.885 5.427 1.843 0.512 13.722 1.024 26.419 1.024l23.142 0.102v-31.642zM640 734.413v-31.949h-31.744c-20.48 0-31.744 0.307-31.846 1.024-0.102 0.512-0.205 14.95-0.307 32.051l-0.102 30.925h64v-32.051zM713.421 763.904c6.144-3.072 10.24-8.397 11.264-14.848 0.512-2.56 0.819-14.029 0.717-25.6l-0.102-20.992h-63.283l-0.307 32.051-0.205 31.949h23.347c22.938 0 23.45 0 28.57-2.56zM386.867 634.163l-0.307-59.699h-23.552l-0.205 33.28c-0.205 18.33-0.307 35.738-0.307 38.707v5.325h-29.696v18.432h3.584c5.734 0 14.029 2.048 18.534 4.71 5.632 3.174 9.114 7.475 11.366 13.722l1.843 5.12h18.944l-0.205-59.597zM640 606.515v-74.547l-31.949 0.205-32.051 0.307v83.968l-42.803 0.307-42.701 0.205v31.539c0 17.408 0.205 31.846 0.41 32.051 0.307 0.205 33.894 0.41 74.752 0.512h74.342v-74.547zM725.094 679.936c0.102-1.434 0.102-58.982 0-61.133-0.102-1.741-2.355-1.843-31.846-1.843h-31.744v64.102h31.744c21.094 0 31.744-0.41 31.846-1.126zM552.038 595.558l2.56-0.102v-63.488h-23.552c-26.112 0-28.774 0.614-34.611 6.758-5.222 5.632-5.939 9.83-5.939 34.304 0 20.070 0.205 22.323 1.741 22.63 1.434 0.307 51.917 0.205 59.802-0.102zM724.787 594.739c0.41-0.614 0.614-11.366 0.614-23.757-0.102-21.914-0.205-22.835-2.662-27.546-1.434-2.765-4.301-6.042-6.861-7.885l-4.403-3.072-49.971-0.614v31.744c0 20.173 0.41 31.846 1.024 32.051 2.867 0.922 61.645 0 62.259-0.922zM266.65 350.515l-53.453-53.555 0.307-89.6c0.205-97.997-0.205-92.262 6.144-102.912 5.734-9.83 17.92-18.125 29.184-19.866 3.072-0.41 113.459-0.819 245.248-0.717 239.309 0.205 239.616 0.205 245.248 2.253 12.595 4.71 22.733 15.36 26.624 27.853 1.946 6.349 2.048 9.83 2.048 129.126 0 135.475 0.307 129.126-6.554 140.39-4.198 6.861-13.414 14.541-21.094 17.715l-5.632 2.253-414.72 0.512-53.35-53.453zM554.701 329.216l-0.102-31.744-3.072-0.102c-3.994-0.102-59.187-0.102-60.211 0-0.512 0.102-0.819 10.138-0.819 22.528 0 24.474 0.717 28.672 5.939 34.304 5.837 6.144 8.499 6.758 34.611 6.758h23.654v-31.744zM640 329.216v-31.744l-2.253-0.102c-2.97-0.102-59.392-0.102-60.723 0-0.717 0.102-1.024 11.366-1.024 31.846v31.744h64v-31.744zM715.878 357.376c2.56-1.843 5.427-5.12 6.861-7.885 2.458-4.71 2.56-5.53 2.56-28.57l0.102-23.757-30.618-0.102c-16.896-0.102-31.334 0-31.949 0.205-1.024 0.307-1.331 7.68-1.331 32.154v31.642l49.971-0.614 4.403-3.072zM384 288.666c16.998-4.71 27.546-20.070 26.317-38.298-1.024-14.848-7.475-23.654-27.238-37.069-14.643-9.83-21.606-15.258-24.986-19.354l-2.867-3.482 55.91-1.024 0.102-9.933c0.102-9.523 0-10.035-2.048-10.138-1.126 0-20.787-0.102-43.52-0.205-31.232-0.205-41.472 0.102-41.779 1.024-1.024 2.662 1.843 15.36 4.71 21.299 5.12 10.138 16.691 20.685 39.731 35.738 12.595 8.192 17.92 15.872 17.92 25.293-0.102 7.373-4.301 14.029-10.445 16.486-4.403 1.741-12.083 1.126-15.872-1.229-5.632-3.482-8.499-9.421-10.24-21.504l-0.512-3.584h-11.264l-11.264-0.102v5.222c0 11.264 5.222 24.269 12.8 31.744 10.65 10.445 27.341 13.824 44.544 9.114zM640 201.114v-74.65l-31.949 0.205-32.051 0.307v84.48l-5.632 0.102c-3.072 0-22.323 0-42.701 0h-37.171v64.205h149.504v-74.65zM725.094 273.613c0.307-7.782 0.41-59.802 0.102-60.723-0.205-0.819-9.421-1.229-32.051-1.229h-31.642v64l31.744 0.102h31.744l0.102-2.15zM554.598 158.413l0.102-31.949h-23.347c-20.582 0-23.757 0.205-27.853 1.946-5.222 2.253-10.138 7.782-11.878 13.312-1.024 3.686-1.741 47.309-0.717 48.333 0.307 0.205 14.643 0.41 32.051 0.41h31.539l0.102-32.051zM724.992 189.235c0.307-0.717 0.41-11.571 0.307-24.269-0.205-24.781-0.41-26.317-6.144-31.949-5.939-5.939-8.909-6.554-34.304-6.554h-23.347l-0.102 5.939c-0.205 20.89 0.102 56.73 0.512 57.344 0.205 0.41 14.438 0.717 31.539 0.717 23.45 0 31.13-0.307 31.539-1.229z" />
+<glyph unicode="&#xe9bd;" glyph-name="easy_internet" d="M166.605 753.664c-18.637-5.12-33.69-20.787-37.478-39.219-0.819-3.891-1.126-75.674-1.126-251.085v-245.76h768v245.76c0 175.411-0.307 247.194-1.126 251.085-4.096 19.558-20.89 36.045-40.448 39.629-4.198 0.819-105.984 1.126-344.371 1.024-278.221-0.102-339.456-0.307-343.45-1.434zM844.8 486.4v-217.6h-665.6v435.2h665.6v-217.6zM386.048 599.757c-10.752-3.584-18.022-9.83-22.938-19.456-8.704-17.101-2.867-38.912 13.107-49.050 19.354-12.39 45.056-5.53 55.296 14.848 3.174 6.349 4.096 10.547 3.891 19.046-0.307 13.824-9.114 26.624-22.528 32.973-7.578 3.584-18.842 4.301-26.829 1.638zM619.52 600.678c-19.661-4.198-33.075-24.371-29.491-44.339 2.97-16.384 17.306-29.594 33.792-31.232 14.746-1.331 28.262 5.222 36.147 17.613 15.667 24.371-0.922 56.934-29.696 58.368-3.891 0.205-8.806 0.102-10.752-0.41zM345.6 447.693c-5.018-1.638-8.397-4.608-10.65-9.216-4.608-9.626-2.048-16.077 11.469-28.57 7.782-7.27 18.022-16.077 26.317-22.63 4.71-3.789 16.282-11.571 26.112-17.613 55.91-34.611 118.784-42.906 177.664-23.45 13.414 4.506 17.818 6.451 33.69 14.438 24.269 12.493 43.213 26.010 68.915 49.766 11.264 10.342 13.926 14.95 12.698 22.426-1.536 9.523-7.987 15.155-17.203 15.258-6.963 0.102-9.114-1.126-21.402-12.8-33.997-32.051-73.421-53.965-108.544-60.416-14.541-2.662-15.462-2.765-28.058-3.072-50.074-1.331-99.123 20.378-145.51 64.205-12.493 11.776-17.818 14.234-25.498 11.674zM76.8 164.557c0-22.938 0.307-28.365 1.741-32.461 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.816-1.638h414.106l5.734 2.765c3.072 1.536 6.963 4.403 8.602 6.349 5.53 6.758 6.042 10.138 6.042 40.243v27.443h-358.195l-0.614-3.789c-1.434-8.397-6.554-15.155-14.95-19.866-2.048-1.126-13.107-1.536-59.29-1.741-64.614-0.307-63.488-0.41-71.373 7.578-3.994 4.198-7.578 11.571-7.578 15.974 0 1.741-6.554 1.843-179.2 1.843h-179.2v-27.443z" />
+<glyph unicode="&#xe9be;" glyph-name="ebook" d="M218.112 881.562c-8.704-2.355-15.974-6.246-22.323-12.186-7.27-6.758-11.878-14.336-14.541-23.859-2.048-7.27-2.048-11.264-2.048-397.722 0-425.574-0.41-394.547 5.734-407.245 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.144-8.806-5.734 303.514-5.734 202.24 0 288.666 0.307 292.864 1.126 18.842 3.379 34.816 18.637 39.936 37.888 1.331 4.71 1.536 61.133 1.536 395.981 0 386.458 0 390.451-2.048 397.722-4.915 17.818-18.739 31.334-36.966 36.147-8.397 2.253-579.277 2.15-587.674-0.102zM793.6 460.8v-345.6h-563.2v691.2h563.2v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM302.080 704v-25.6h261.12v51.2h-261.12v-25.6zM302.080 611.84v-20.48h419.84v40.96h-419.84v-20.48zM302.080 540.16v-20.48h419.84v40.96h-419.84v-20.48zM302.080 468.48v-20.48h419.84v40.96h-419.84v-20.48zM302.080 396.8v-20.48h419.84v40.96h-419.84v-20.48zM302.080 325.12v-20.48h419.84v40.96h-419.84v-20.48zM302.080 253.44v-20.48h419.84v40.96h-419.84v-20.48z" />
+<glyph unicode="&#xe9bf;" glyph-name="Eco_mode" d="M659.251 882.688c-0.205-0.205-6.963-0.614-15.155-0.922-8.192-0.41-16.691-0.922-18.944-1.126s-7.782-0.614-12.288-1.024c-16.486-1.229-26.214-2.253-41.165-4.096-14.746-1.741-22.016-2.765-26.931-3.584-3.072-0.512-10.035-1.638-15.36-2.56-47.002-7.885-94.925-20.89-135.27-36.864-95.744-37.99-163.738-96.563-204.186-176.128-12.39-24.269-25.293-60.314-28.774-80.384-0.307-1.434-1.331-7.373-2.458-13.312-2.765-15.872-2.97-17.101-3.789-26.624-1.024-11.264-1.024-52.326 0-63.488 3.789-41.37 16.179-84.378 34.816-120.832 6.451-12.698 19.046-33.69 24.781-41.472 6.042-8.294 13.312-17.818 16.282-21.402l2.458-2.97 8.909 17.818c4.915 9.83 10.24 20.173 11.776 22.938 1.536 2.867 4.71 8.806 7.168 13.312 28.467 53.043 70.349 115.917 109.568 164.352 23.45 28.979 42.086 49.459 72.090 79.36 51.917 51.712 109.363 96.666 168.55 131.994 6.451 3.891 13.517 8.192 15.565 9.523 2.15 1.229 4.096 2.355 4.301 2.355s4.506 2.355 9.421 5.222c17.92 10.342 85.709 42.906 89.293 42.906 0.41 0-5.222-3.379-12.39-7.578-40.448-23.654-87.757-59.29-127.693-96.358-17.51-16.179-49.050-48.538-64.512-65.946-3.686-4.198-7.168-8.090-7.68-8.704-17.51-19.456-50.79-61.747-73.318-93.389-10.138-14.131-39.526-57.856-45.568-67.686-26.010-42.598-41.062-68.403-53.146-90.931-2.765-5.018-7.578-14.029-10.752-19.968-8.499-15.667-29.286-57.344-37.888-75.776-13.517-28.774-15.36-32.87-15.36-33.28 0-0.205-1.536-3.686-3.482-7.885-17.408-37.786-46.592-111.411-49.357-124.723-3.891-18.534 2.355-38.502 16.486-52.736 32.051-32.358 86.221-18.739 99.738 25.293 14.848 48.026 30.822 95.232 41.984 123.904l1.024 2.765 4.403-1.536c5.427-1.946 27.034-7.373 34.611-8.704 13.517-2.355 26.726-4.096 35.328-4.813 18.022-1.434 59.597-0.614 69.939 1.229 0.922 0.205 4.301 0.717 7.373 1.126s6.554 0.922 7.68 1.126c1.126 0.205 4.813 0.922 8.192 1.434 9.318 1.638 32.461 7.885 44.544 11.981 70.246 23.654 131.686 71.475 174.797 135.987 41.574 62.259 71.373 147.251 84.787 241.254 2.56 18.637 2.97 21.094 4.096 31.13 0.307 2.867 0.717 6.656 1.024 8.499 0.205 1.741 0.717 7.27 1.024 12.288 0.41 4.915 0.922 9.728 1.126 10.752 0.102 0.922 0.614 7.373 0.922 14.336 0.41 6.861 0.922 14.541 1.229 17.101s0.717 54.784 1.024 116.019l0.512 111.411-105.574-0.205c-57.958-0.102-105.574-0.307-105.779-0.41z" />
+<glyph unicode="&#xe9c0;" glyph-name="edashboard" d="M500.429 882.586c-0.102-0.102-6.349-0.512-13.824-0.819-15.872-0.819-17.408-1.024-37.069-3.789-74.035-10.342-149.504-42.906-207.36-89.498-56.934-45.773-102.093-104.653-129.024-167.936-2.56-6.144-5.12-12.186-5.632-13.312-7.885-17.818-19.968-61.235-23.552-83.968-1.741-10.957-2.048-13.21-2.56-14.848-0.205-0.819-0.717-5.222-1.126-9.728-0.307-4.506-0.819-8.397-0.922-8.704-0.717-1.229-1.946-29.696-1.843-44.544 0.102-15.155 0.922-34.406 1.843-40.448 0.205-1.434 0.614-5.53 1.024-9.216 1.843-18.227 7.987-48.947 13.722-68.608 32.154-109.978 104.96-202.138 204.39-258.56 105.677-60.109 234.291-72.704 350.208-34.509 39.731 13.107 79.053 32.87 113.152 56.73 91.75 64.512 155.034 160.87 177.152 270.131 5.837 28.672 8.499 55.398 8.397 86.016 0 25.907-0.614 35.533-3.789 59.392-9.626 72.499-38.298 142.541-82.227 201.216-41.37 55.091-94.208 99.123-156.467 130.355-9.83 4.915-13.21 6.451-31.744 14.029-39.322 16.179-87.859 26.931-133.53 29.798-9.933 0.614-38.707 1.229-39.219 0.819zM776.294 701.44c6.144-2.15 10.65-5.939 13.926-11.571l2.867-4.813 0.205-118.784 0.307-118.784-45.773 45.875-45.67 45.978-203.981-203.981-102.4 102.4-92.16-92.16c-83.558-83.661-92.262-92.058-93.491-90.419-6.349 8.499-22.118 38.707-29.286 56.32-5.427 13.21-12.902 35.635-13.21 39.526-0.205 2.355 12.698 15.667 99.328 102.298 54.784 54.784 106.189 106.291 114.381 114.381l14.746 14.746 50.79-50.893c27.955-27.955 51.2-50.79 51.61-50.79s30.106 29.491 66.048 65.434l65.434 65.434-45.158 45.056c-24.883 24.781-45.158 45.363-45.158 45.67s52.224 0.614 116.122 0.614c101.171 0 116.634-0.205 120.525-1.536zM793.6 307.712v-82.125l-6.861-8.397c-15.77-19.149-33.178-35.942-56.115-54.17-1.638-1.331-5.53-4.198-8.397-6.246l-5.427-3.891v314.061l76.8-77.21v-82.022zM640 265.318v-152.883l-14.029-4.71c-14.95-5.018-26.214-8.192-34.611-9.933-8.909-1.741-26.522-5.12-27.136-5.12-0.307 0-0.717 56.115-0.819 124.723l-0.307 124.621 37.683 38.093c20.685 20.89 37.99 38.093 38.502 38.093 0.41 0.102 0.717-68.71 0.717-152.883zM448.512 327.168l37.888-37.99-0.205-99.533c-0.205-65.638-0.614-99.533-1.331-99.43-0.512 0.102-4.506 0.512-8.704 0.819-19.149 1.741-41.677 5.939-59.085 11.059l-7.475 2.15v130.355c0 71.782 0.205 130.458 0.512 130.458s17.613-17.101 38.4-37.888zM332.39 138.035c-0.717-0.819-22.835 13.619-34.918 22.733-10.547 7.885-23.142 18.739-36.045 30.925l-5.427 5.12v43.213l38.195 38.195 38.093 38.195 0.307-88.986c0.102-48.947 0-89.19-0.205-89.395z" />
+<glyph unicode="&#xe9c1;" glyph-name="edit_draft" d="M179.2 470.323c0-449.741-0.41-417.075 5.734-429.568 3.891-8.090 13.21-17.51 21.094-21.606 13.414-6.861-13.107-6.349 328.294-6.349h310.477v280.576l56.832 56.832c31.232 31.232 57.958 58.573 59.29 60.826 3.994 6.246 6.042 14.746 5.427 22.016-1.331 14.438-2.253 15.667-39.526 53.146l-33.382 33.587-24.371-24.166-24.269-24.166v155.75l-81.101 0.102c-44.646 0-82.637 0.205-84.275 0.41-36.045 4.813-66.56 27.136-81.51 59.494-3.379 7.373-7.578 22.528-8.499 30.208-0.205 2.458-0.512 40.755-0.512 85.197l-0.102 80.589h-409.6v-412.877zM531.046 568.934c2.765-2.253 7.578-6.861 10.65-10.445 3.072-3.482 6.144-6.861 6.656-7.475 1.638-1.741 18.33-22.323 20.582-25.293 9.011-12.39 39.219-50.586 43.11-54.784 14.848-15.565 33.997-26.010 47.923-26.010 24.269 0 65.946 33.485 118.579 95.232 3.584 4.198 3.174 3.277-3.994-10.752-32.563-63.488-63.181-101.171-95.027-116.736-12.698-6.246-20.173-7.987-33.894-7.987-9.626 0-12.493 0.41-19.456 2.765-25.907 8.806-51.814 35.328-79.36 80.896-6.554 10.752-13.312 20.070-15.974 21.811-3.686 2.355-5.53 0.922-8.499-6.963-11.878-31.539-41.267-104.653-46.899-116.429-7.68-16.179-24.883-27.034-41.779-26.419-9.114 0.41-15.667 3.379-22.733 10.445-6.451 6.451-9.728 12.8-19.763 38.81-9.626 24.781-11.366 28.57-13.312 28.979-1.024 0.102-3.379-2.867-6.656-8.192-2.765-4.71-10.138-16.589-16.282-26.419s-11.981-19.251-12.902-20.992c-4.71-8.192-48.538-78.029-49.664-79.155-0.307-0.307-1.331 0.307-2.355 1.434-2.56 2.765-26.010 30.208-27.648 32.358-1.229 1.536-0.819 2.56 2.97 7.68 3.891 5.222 24.166 35.635 65.024 97.382 15.36 23.245 18.739 27.341 28.262 33.997 10.752 7.578 19.763 9.933 28.672 7.578 16.384-4.198 28.672-22.528 40.243-59.802 4.813-15.155 4.608-14.746 5.018-14.234 0.717 0.922 13.517 24.986 36.25 68.506 33.997 65.126 51.098 94.208 55.398 94.208 1.024 0 4.096-1.843 6.861-3.994zM916.992 459.674c23.859-24.064 25.395-26.112 23.552-32.358-0.614-2.15-32.973-35.635-34.406-35.635-0.41 0-47.923 47.206-52.122 51.814-0.512 0.614 37.99 39.322 39.219 39.322 0.512 0 11.162-10.445 23.757-23.142zM841.83 419.226c3.584-3.482 14.234-13.926 23.654-23.245 18.227-18.022 19.866-20.48 17.306-26.624-0.614-1.536-61.235-62.771-134.554-136.090l-133.325-133.222-16.896-8.704c-9.318-4.71-23.142-11.878-30.72-15.77-7.578-3.994-23.040-11.981-34.304-17.715-11.264-5.837-22.426-11.571-24.781-12.902-4.096-2.253-5.632-2.15-3.482 0.102 0.512 0.614 3.482 6.144 6.758 12.288 3.174 6.246 6.656 12.698 7.68 14.336 0.922 1.741 4.198 7.68 7.168 13.312s6.861 13.005 8.704 16.384c1.843 3.379 8.704 16.282 15.36 28.672l11.981 22.528 136.397 136.397c74.957 75.059 136.294 136.499 136.397 136.499 0 0 3.072-2.867 6.656-6.246zM640 802.611c0.102-88.678-0.102-86.938 6.963-99.942 6.349-11.878 17.51-20.582 29.901-23.142 4.096-0.922 27.443-1.126 86.528-0.922l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xe9c2;" glyph-name="edit_email" d="M102.4 502.579c0-181.453 0.41-280.781 1.024-285.491 3.174-21.709 16.282-44.032 33.997-57.549 11.981-9.216 29.696-16.486 43.827-18.125 3.072-0.307 80.179-0.614 171.315-0.614h165.786l-4.608-8.397c-5.632-10.547-10.035-18.739-27.853-52.531-15.155-28.672-16.486-31.13-31.949-59.904-5.632-10.445-11.981-22.118-14.029-25.907l-3.789-7.066 13.619 7.168c7.475 3.891 22.426 11.571 33.075 17.101 10.752 5.53 24.986 12.902 31.744 16.384s21.504 11.162 32.768 16.998c11.264 5.734 28.365 14.541 37.888 19.558 9.626 4.915 22.221 11.366 28.16 14.336l10.752 5.427 28.467 28.467 28.467 28.365h97.485c53.658-0.102 107.725-0.102 120.32 0h22.733v240.64l15.36 15.053c8.499 8.294 16.691 17.101 18.432 19.661 6.758 10.65 7.475 23.757 1.946 35.84-2.458 5.427-5.632 9.216-19.354 22.835l-16.384 16.282v105.165c-0.102 114.176 0 112.435-5.837 127.59-9.114 24.166-30.31 44.134-55.091 52.122-15.462 5.018 5.12 4.813-389.837 4.813h-368.435v-278.221zM844.8 632.832v-44.442l-2.355-2.355c-2.458-2.355-6.758-6.451-49.869-47.923-13.21-12.698-29.082-27.955-35.328-33.894-6.144-6.042-14.234-13.824-17.92-17.306s-15.36-14.746-26.010-24.986c-10.547-10.138-21.606-20.787-24.576-23.552-2.867-2.765-15.36-14.746-27.75-26.726s-27.546-26.522-33.69-32.358c-6.042-5.837-15.053-14.438-19.968-19.149-22.016-21.299-41.37-31.846-68.813-37.683-12.288-2.56-42.086-2.662-54.17-0.102-17.408 3.686-33.485 10.342-46.182 18.842-11.776 8.090-16.794 12.698-69.53 63.795-14.95 14.541-29.696 28.774-32.768 31.744-4.506 4.301-39.219 37.888-65.536 63.488-2.56 2.56-17.408 16.794-32.768 31.744-15.462 14.95-34.918 33.792-43.213 41.984l-15.258 14.848 0.614 87.654 16.998-16.691c9.421-9.216 34.202-33.485 55.194-54.067 20.89-20.582 41.779-40.96 46.387-45.466 4.608-4.403 22.938-22.221 40.653-39.526 17.715-17.408 36.454-35.635 41.677-40.653 5.12-4.915 22.221-21.606 37.99-36.966 36.864-35.942 39.322-38.195 45.875-42.189 13.926-8.397 26.931-11.674 47.002-11.571 12.493 0 15.565 0.41 23.347 2.765 15.565 4.608 26.726 11.366 38.707 23.142 5.325 5.222 30.822 29.901 53.658 52.122 31.846 31.027 71.68 69.53 81.408 78.95 5.53 5.325 20.992 20.378 34.304 33.28 13.414 13.005 28.16 27.238 32.768 31.744 18.842 18.125 62.464 60.621 64.922 63.181 1.434 1.536 2.97 2.765 3.482 2.867 0.41 0 0.717-20.070 0.717-44.544zM934.605 440.525c3.174-6.246 1.638-8.806-16.691-27.136l-16.794-16.998-3.174 3.072c-1.741 1.638-13.722 13.517-26.624 26.419l-23.347 23.347 19.866 19.866 19.968 19.763 22.63-22.733c12.39-12.493 23.245-23.962 24.166-25.6zM843.264 417.792c32.154-30.72 35.84-35.226 34.611-41.984-0.41-1.946-38.298-40.448-134.349-136.499l-133.837-133.837-14.848-7.578c-8.090-4.198-20.685-10.65-28.058-14.438-20.173-10.445-43.827-22.63-56.218-29.082-6.144-3.174-11.264-5.632-11.469-5.427-0.307 0.205 5.222 10.957 12.186 23.859s15.565 28.979 19.149 35.738c3.482 6.758 6.758 12.8 7.168 13.312 0.41 0.614 3.174 5.632 6.144 11.264 14.438 27.546 0.102 11.981 149.914 161.587l136.192 135.987 4.608-4.403c2.458-2.458 6.451-6.246 8.806-8.499z" />
+<glyph unicode="&#xe9c3;" glyph-name="edit_image" d="M153.907 530.739c0.205-297.574 0.41-327.373 1.843-332.083 4.915-15.155 11.264-26.010 20.48-35.226 10.138-10.035 19.354-15.36 36.25-20.787 3.174-1.024 30.413-1.434 124.006-1.843l120.013-0.512-5.632-10.24c-3.072-5.632-7.68-14.131-10.24-18.944s-8.704-16.077-13.619-25.088c-4.915-9.011-15.565-28.57-23.552-43.52-8.090-14.95-15.872-29.389-17.408-32.256-8.499-15.667-14.336-26.931-14.336-27.648 0-0.41 0.614-0.307 1.331 0.205 0.614 0.614 11.878 6.451 24.781 13.107 13.005 6.656 26.829 13.722 30.72 15.872 3.994 2.15 16.384 8.499 27.648 14.336 11.264 5.734 25.6 13.107 31.744 16.384 6.246 3.277 20.275 10.547 31.232 16.179 45.568 23.45 36.864 17.101 71.578 51.61l30.822 30.515h248.832v248.934l8.806 8.909c4.915 4.915 9.83 10.547 11.162 12.493 5.12 8.192 6.963 19.046 4.506 28.16-2.048 7.885-5.632 13.414-14.95 23.142l-9.523 9.83v158.106c-0.102 173.466 0.205 165.274-6.144 180.326-9.011 21.197-27.546 37.376-50.79 44.544-5.734 1.741-20.992 1.843-333.005 2.048l-326.861 0.307 0.307-326.861zM796.877 802.611c8.397-3.994 14.541-10.138 18.637-18.739l3.174-6.656 0.307-130.458 0.205-130.355-33.894-33.894-33.997-33.792-3.686 3.994c-3.994 4.403-7.066 7.885-18.022 20.378-3.891 4.506-7.373 8.397-7.68 8.704s-3.789 4.198-7.68 8.704c-3.994 4.506-8.602 9.728-10.342 11.776-3.277 3.584-73.216 83.149-82.227 93.389-2.97 3.482-8.192 5.939-12.39 5.939-6.861 0-4.608 2.253-56.32-57.856-27.648-32.154-32.154-37.478-36.352-42.394-1.638-2.048-3.584-4.096-4.198-4.71-0.614-0.512-6.554-7.475-13.312-15.36-6.656-7.885-13.926-16.384-16.282-18.944-2.253-2.56-5.222-6.042-6.656-7.782-10.65-12.493-20.378-23.962-22.835-26.522-2.867-2.97-2.97-3.072-4.301-1.024-0.819 1.126-19.558 27.341-41.677 58.368-38.912 54.374-40.448 56.32-45.056 58.266-4.096 1.741-5.427 1.843-8.806 0.819-5.018-1.536-6.758-3.174-25.805-24.781-3.686-4.096-7.168-7.987-7.68-8.602-0.614-0.614-7.27-7.987-14.746-16.486-7.475-8.397-16.998-19.046-21.094-23.552-3.994-4.506-18.432-20.685-31.949-35.84-13.517-15.258-25.293-28.262-26.214-28.979-1.229-1.126-2.458-0.41-7.27 4.506-6.861 6.963-10.138 12.493-12.288 21.197-1.434 5.837-1.638 25.498-1.638 190.464v184.013l585.216-0.512 6.861-3.277zM869.888 433.766c1.331-6.246 0-8.397-17.408-25.702l-16.896-16.896-20.685 20.48c-11.469 11.264-23.347 23.142-26.317 26.419l-5.632 5.939 39.629 39.629 23.245-23.347c17.203-17.203 23.552-24.166 24.064-26.522zM785.818 404.992c24.986-24.269 26.010-25.395 26.726-29.901 0.512-2.97 0.205-4.71-1.434-7.168-1.126-1.843-61.645-62.874-134.451-135.68-125.235-125.133-132.813-132.403-139.571-135.68-3.891-1.946-14.95-7.578-24.576-12.595-17.101-8.806-33.485-17.203-63.181-32.666-8.397-4.301-15.462-7.782-15.77-7.782-0.512 0 3.482 7.782 12.39 24.064 1.229 2.253 6.554 12.186 11.878 22.016 5.222 9.83 15.155 28.16 21.914 40.755l12.288 22.835 136.192 136.090c132.403 132.403 136.192 136.090 138.138 134.349 1.126-0.922 9.933-9.318 19.456-18.637zM331.469 728.064c-3.277-0.717-9.933-3.277-14.746-5.632-15.155-7.475-26.829-21.402-32.666-38.912-2.867-8.499-2.662-26.829 0.307-36.352 6.349-19.968 22.63-36.352 42.598-42.701 8.397-2.662 23.654-3.277 32.461-1.331 22.323 5.12 41.062 22.733 47.718 45.056 2.765 9.216 2.56 27.546-0.512 36.352-11.162 32.256-42.906 50.586-75.162 43.52z" />
+<glyph unicode="&#xe9c4;" glyph-name="Elderly_person" d="M489.984 881.766c-41.267-6.554-76.902-30.003-99.123-65.434-14.541-23.040-21.299-48.23-20.787-77.005 0.205-9.421 1.024-18.534 2.048-23.552 11.981-56.627 53.146-98.509 109.568-111.206 10.854-2.458 35.84-3.379 47.206-1.843 44.646 6.246 84.275 33.587 105.267 72.602 12.186 22.733 17.203 43.93 16.589 70.656-0.512 21.914-4.198 37.786-13.312 57.037-15.565 33.178-47.309 61.235-82.33 73.011-18.432 6.144-46.592 8.602-65.126 5.734zM635.802 609.997c-0.819-0.205-3.072-1.946-5.018-3.789-9.318-8.602-28.058-21.094-41.165-27.443-16.794-7.987-35.84-13.722-55.091-16.486-13.312-1.946-41.779-1.434-54.272 0.819-34.202 6.349-63.283 20.070-87.962 41.37l-6.451 5.734-4.71-2.56c-21.811-11.469-46.080-33.382-59.494-53.555-11.264-16.998-19.763-35.942-24.064-53.862s-4.608-23.757-4.403-84.48c0.307-56.115 0.41-58.675 2.458-65.126 4.506-14.234 9.626-23.040 19.149-32.87 13.005-13.312 28.979-20.992 48.026-22.938l6.861-0.717v-117.555c0-80.896 0.307-119.296 1.126-122.982 3.789-18.637 18.842-34.202 37.888-39.219 8.294-2.253 195.379-2.253 203.571-0.102 16.896 4.608 30.003 16.486 36.25 33.075l2.253 5.939 0.512 190.771 0.512 190.669 29.389-58.778c31.13-62.054 32.973-65.229 43.52-72.499 14.643-10.035 34.816-11.571 51.098-3.891 3.379 1.638 9.216 5.734 12.902 9.216l6.758 6.144 2.662-3.174c6.758-7.987 6.246 5.325 6.554-154.214l0.205-144.691h25.6v143.36c0 100.659-0.307 144.896-1.126 148.685-2.458 11.776-11.776 25.907-20.787 31.539-3.379 2.048-3.379 2.253-3.994 10.957-0.307 5.018-1.434 11.571-2.56 14.643s-26.112 53.76-55.501 112.538l-53.453 106.906-7.885 7.782c-8.294 8.294-15.77 13.21-24.781 16.589-5.939 2.15-22.118 4.915-24.576 4.198z" />
+<glyph unicode="&#xe9c5;" glyph-name="electric_car" d="M244.019 702.566c-7.475-1.843-15.667-6.042-21.402-11.162-2.867-2.56-37.069-47.309-83.866-109.773-43.315-57.958-79.565-106.598-80.486-108.032s-2.765-5.325-4.096-8.704l-2.458-6.144-0.307-98.304c-0.205-86.323 0-99.123 1.331-103.936 5.53-19.354 20.685-33.894 39.219-37.786 3.482-0.717 20.378-1.126 46.285-1.126h40.96l0.102-4.301c0.205-12.39 4.198-28.058 10.752-41.37 9.728-19.968 28.877-38.298 50.074-48.026 21.197-9.626 50.893-11.059 73.523-3.482 38.81 13.005 66.662 48.23 69.939 88.576l0.717 8.602h255.693l0.102-3.789c0-2.15 0.205-4.608 0.307-5.427 0.205-0.819 0.614-4.096 1.024-7.168 2.97-23.757 18.432-49.459 39.014-65.024 35.123-26.419 82.637-27.853 118.784-3.584 25.498 17.101 41.677 44.134 44.851 75.059l1.024 9.933h40.755c25.805 0 42.701 0.41 46.182 1.126 19.558 4.096 35.942 20.787 39.731 40.346 0.819 4.403 1.024 30.208 0.819 90.112l-0.307 83.968-2.458 6.144c-7.987 19.968-23.347 31.334-46.694 34.611-3.277 0.512-27.648 5.12-35.328 6.758-2.56 0.614-17.306 3.379-32.768 6.246s-30.003 5.632-32.256 6.144c-2.253 0.512-6.656 1.434-9.83 1.946-5.939 1.024-7.68 2.458-22.426 18.534-1.843 1.946-6.554 7.066-10.65 11.264-10.957 11.674-35.738 37.99-38.912 41.472-1.638 1.741-9.216 9.728-16.896 17.92-7.782 8.192-15.36 16.282-16.896 17.92-1.536 1.741-6.144 6.554-10.138 10.752s-10.957 11.571-15.36 16.384c-4.506 4.813-11.469 12.186-15.565 16.384-3.994 4.198-14.643 15.565-23.552 25.088-20.173 21.402-21.094 22.323-28.672 26.624-12.39 7.066-1.024 6.656-192 6.554-134.349-0.102-173.67-0.307-177.869-1.331zM506.47 583.578c-21.709-72.499-21.299-71.168-20.685-71.885 0.307-0.307 17.613-0.512 38.502-0.512 23.45 0 37.888-0.307 37.683-0.922-0.512-1.434-150.733-189.133-151.142-188.826-0.102 0.205 2.15 9.523 5.018 20.685 2.97 11.162 5.632 22.016 6.042 23.962 0.512 1.946 3.174 12.8 6.042 24.064 6.451 24.678 15.36 59.802 15.872 62.054 0.307 1.536-2.867 1.638-34.918 1.638-19.354 0-35.43 0.205-35.635 0.512-0.41 0.41 23.142 30.618 37.786 48.435 4.915 6.042 94.003 117.248 96.358 120.422 6.656 8.704 16.282 20.378 16.589 20.070 0.102-0.205-7.68-27.034-17.51-59.699z" />
+<glyph unicode="&#xe9c6;" glyph-name="electric_car_charging" d="M452.096 882.483c-13.722-1.946-30.822-8.397-42.803-16.282-18.33-12.186-33.997-32.461-40.653-52.838l-2.253-6.963-107.622-0.102c-59.29 0-109.056-0.205-110.797-0.512-26.522-3.584-47.002-13.312-64.307-30.413-17.408-17.203-28.262-39.014-31.437-63.181-0.819-6.144-1.024-55.091-0.717-167.424 0.307-172.237 0-161.382 5.734-178.074 6.963-19.866 22.016-39.936 39.014-52.019 6.861-4.915 18.842-11.264 25.395-13.517l3.789-1.331 0.614-33.178c0.614-35.123 0.819-36.659 6.042-47.002 5.427-10.752 14.643-18.944 27.648-24.576 5.632-2.458 5.734-2.458 50.381-2.867l44.646-0.307 1.229-5.325c7.782-34.099 31.744-59.187 65.229-68.403 8.602-2.355 29.184-3.277 38.195-1.638 18.739 3.379 37.786 14.029 50.893 28.365 9.728 10.65 18.227 27.341 20.787 40.755l1.331 6.349h116.019c109.568 0 116.019-0.102 116.531-1.741 0.205-1.024 0.717-3.482 1.126-5.427 4.813-25.702 26.214-51.302 52.019-62.362 40.038-17.203 86.733-2.662 110.694 34.406 5.53 8.499 10.138 19.661 11.981 28.672l1.331 6.349 45.568 0.307 45.67 0.41 6.349 2.662c16.998 7.168 28.774 21.197 32.051 38.195 0.819 4.301 1.024 26.931 0.819 77.312l-0.307 71.168-2.458 6.144c-5.427 13.619-13.619 22.528-26.214 28.672-6.451 3.072-17.715 5.734-43.52 10.342-1.434 0.307-7.373 1.434-13.312 2.56s-15.36 2.97-20.992 3.994c-5.632 1.126-21.299 3.994-34.714 6.554-13.517 2.56-24.781 5.018-25.088 5.427-0.512 0.614-14.438 13.517-25.293 23.347-0.614 0.614-6.349 5.837-12.8 11.776-6.349 5.939-14.848 13.722-18.842 17.408-3.891 3.584-7.68 7.066-8.294 7.68-0.614 0.512-6.144 5.632-12.288 11.264s-14.643 13.517-18.842 17.408c-14.746 13.619-29.901 27.546-32.051 29.491-1.229 1.024-5.018 4.506-8.397 7.68-8.909 8.397-35.738 33.28-45.466 41.984-2.048 1.843-6.451 4.915-9.83 6.861-12.493 7.066-4.915 6.758-157.491 6.451l-137.421-0.307-5.632-2.458c-12.902-5.734-14.95-7.782-53.453-52.736-20.275-23.757-38.093-44.442-39.629-46.182-2.15-2.56-19.149-22.426-28.365-33.28-1.229-1.434-5.632-6.554-9.728-11.366-4.198-4.813-9.728-11.264-12.288-14.336-10.035-11.674-25.805-30.208-27.955-32.666-6.144-7.066-10.854-14.438-13.005-20.48-2.048-6.042-2.355-9.114-2.867-31.744l-0.614-25.088-4.608 4.301c-6.554 5.939-11.981 14.234-15.155 23.040l-2.765 7.475-0.205 157.184c-0.307 173.568-0.717 161.792 6.144 176.128 4.301 9.011 15.258 19.968 24.371 24.371 13.21 6.451 10.24 6.349 127.078 6.349h106.086l1.843-5.325c11.162-33.894 37.478-58.778 71.987-68.198l9.83-2.662 54.477-0.41c58.982-0.307 58.778-0.41 61.952 5.222 0.819 1.331 1.536 7.578 1.843 15.462l0.512 13.312 44.544 0.102c49.766 0 48.23-0.205 53.965 7.373 2.355 3.072 2.867 4.608 2.765 9.728-0.102 5.018-0.512 6.554-3.174 9.83-5.632 6.963-4.198 6.758-53.555 6.861l-44.544 0.102-0.307 33.997c-0.205 31.846-0.102 33.997 1.536 34.099 1.024 0 21.197 0.205 44.851 0.205 37.786 0.205 43.418 0.41 46.080 1.946 9.626 5.222 12.39 16.794 6.042 25.19-5.325 6.963-4.301 6.758-53.658 6.861l-44.544 0.102-0.512 13.312c-0.307 7.885-1.024 14.131-1.843 15.462-3.072 5.427-3.174 5.427-59.29 5.325-28.57-0.102-53.35-0.41-55.091-0.614zM511.488 847.155c-0.307-0.717-3.686-12.8-7.68-26.931-3.994-14.029-7.475-26.214-7.68-26.931-0.307-0.922 3.686-1.229 18.432-1.126 10.445 0.102 18.944-0.205 18.842-0.717-0.102-1.126-65.843-78.131-66.253-77.722-0.307 0.307 11.776 43.418 14.131 50.278 1.843 5.632 2.355 5.427-18.022 5.734l-19.046 0.307 10.035 11.776c5.53 6.451 10.547 12.288 11.162 12.902 0.512 0.614 11.162 12.902 23.45 27.341 12.39 14.541 22.63 26.317 22.835 26.317 0.102 0 0-0.614-0.205-1.229zM445.44 512v-64h-218.317l4.915 5.837c2.765 3.277 13.312 15.36 23.347 26.931 10.138 11.571 20.787 23.757 23.757 27.136 2.867 3.379 15.462 17.818 27.853 31.949 12.39 14.234 24.576 28.16 26.931 31.027l4.301 5.12h107.213v-64zM590.336 573.133c2.765-2.458 34.611-31.539 60.928-55.398 5.325-4.813 15.462-14.131 22.528-20.582s17.408-15.872 23.040-20.992c11.469-10.342 19.354-17.51 26.112-23.859l4.608-4.301h-230.912v128h90.624l3.072-2.867z" />
+<glyph unicode="&#xe9c7;" glyph-name="electricity_provider" d="M492.339 882.688c-0.205-0.102-5.427-0.512-11.674-0.922-6.144-0.41-12.39-0.819-13.824-1.024-1.331-0.307-5.222-0.717-8.602-1.126-12.698-1.434-36.352-5.837-52.019-9.728-47.309-11.878-92.262-31.539-132.813-58.163-9.933-6.554-36.25-25.805-37.888-27.75-0.307-0.41-4.915-4.403-10.24-9.011-12.083-10.342-34.816-33.485-45.67-46.387-59.802-71.475-94.515-156.16-101.581-247.808-0.922-12.8-0.922-54.067 0.102-67.072 8.909-117.146 66.765-227.942 157.594-301.978 34.918-28.467 72.704-50.995 113.459-67.789 14.131-5.734 24.474-7.066 33.28-3.994 22.733 7.578 33.28 32.358 23.040 53.453-5.018 10.138-11.469 15.258-28.262 22.221-47.309 19.661-85.914 45.568-121.139 81.408-38.195 38.912-66.662 85.299-83.968 136.806-7.27 21.709-13.107 46.797-15.053 64.512-0.205 2.867-0.717 6.144-0.922 7.27-2.765 13.312-2.765 67.174 0.102 86.426 6.554 45.056 16.794 78.848 34.611 114.688 35.328 70.656 90.419 125.952 160.461 161.178 38.502 19.354 73.421 29.901 119.194 35.942 19.354 2.56 61.030 2.56 81.92 0 45.773-5.53 84.787-17.51 124.928-38.298 83.661-43.418 146.739-118.067 176.026-208.486 6.144-19.251 12.595-48.128 14.336-65.536 0.41-3.379 0.922-8.192 1.229-10.752 1.024-8.192 1.229-52.429 0.41-60.928-0.512-4.506-1.126-10.957-1.536-14.336-4.198-42.803-21.094-94.515-44.237-135.066-49.766-87.245-136.704-151.45-233.472-172.544-14.746-3.174-23.142-1.331-30.515 6.861-6.861 7.373-6.656 5.222-6.451 94.208l0.307 80.179 7.68 2.56c22.938 7.68 45.466 22.221 61.952 39.834 24.883 26.522 39.731 60.314 42.086 95.539l0.717 10.445h-307.814l0.717-9.933c2.458-34.304 14.438-63.693 36.557-89.907 19.456-23.142 45.363-39.834 74.957-48.128l5.837-1.638 0.102-81.613c0-44.851 0.307-83.866 0.614-86.733 0.922-9.216 5.325-23.962 9.933-33.075 18.33-36.557 54.682-58.368 94.822-57.037 11.162 0.307 17.101 1.331 38.502 6.758 94.413 23.962 180.224 81.101 238.899 159.13 33.178 44.032 54.989 87.859 72.090 144.691 5.53 18.022 11.469 50.893 14.541 79.053 1.024 9.626 1.331 60.416 0.41 70.656-1.331 15.462-3.072 29.798-4.096 35.328-4.096 22.63-6.656 34.509-9.626 45.568-34.714 129.126-128.205 236.339-251.187 288.154-38.093 15.974-81.715 27.341-120.013 31.232-5.939 0.614-13.312 1.434-16.384 1.741-5.427 0.614-51.814 1.434-52.429 0.922zM426.803 656.077c-2.662-0.922-6.963-3.686-9.421-6.144-7.885-7.68-7.782-6.656-7.782-66.97v-53.043l-14.029-0.102c-7.782 0-14.95-0.205-15.872-0.41-8.090-1.536-15.053-6.963-18.739-14.336-1.843-3.686-2.048-6.656-2.355-32.973l-0.307-28.979h307.405l-0.307 28.979c-0.307 25.907-0.512 29.286-2.253 32.768-3.789 7.68-11.469 13.517-18.944 14.541-1.434 0.205-8.806 0.41-16.179 0.41l-13.619 0.102v52.531c0 59.29 0 59.802-7.066 66.97-5.837 5.837-10.547 7.885-18.534 7.782-8.294-0.102-13.005-2.15-18.432-7.68-7.168-7.475-7.168-7.68-7.168-67.072v-52.531h-102.298l-0.614 110.387-3.891 5.53c-6.861 10.035-18.944 14.234-29.594 10.24z" />
+<glyph unicode="&#xe9c8;" glyph-name="elevator" d="M502.784 907.264c-5.325-1.741-6.144-2.355-55.296-43.52l-37.274-31.232 50.893-0.307c27.955-0.102 73.83-0.102 101.786 0l50.995 0.307-15.36 12.8c-8.499 6.963-16.486 13.722-17.92 14.95-2.765 2.458-40.96 34.304-47.616 39.834-2.253 1.843-5.939 4.403-8.090 5.632-5.222 2.867-15.77 3.584-22.118 1.536zM115.712 804.762c-9.523-2.56-16.589-6.554-23.654-13.619-7.168-7.27-11.162-14.131-13.722-24.166-1.331-5.427-1.536-41.165-1.536-319.488 0-267.981 0.205-314.163 1.536-318.874 5.018-18.842 20.787-34.099 39.219-37.888 3.891-0.819 116.941-1.126 395.264-1.126 424.858 0 393.933-0.41 406.63 5.734 7.475 3.686 18.33 14.541 21.914 21.914 6.246 13.107 5.837-11.776 5.837 330.342 0 199.066-0.41 314.368-1.024 317.747-2.56 13.517-14.541 29.389-26.624 35.226-13.107 6.349 19.456 5.837-408.064 5.734-338.637 0-390.861-0.205-395.776-1.536zM896 448v-307.2h-768v614.4h768v-307.2zM265.83 702.362c-31.027-6.963-54.886-31.846-59.904-62.566-1.536-9.114-0.614-24.269 1.843-33.28 7.475-26.522 28.877-47.309 55.603-53.862 9.011-2.253 23.45-2.662 32.358-0.819 29.798 6.042 51.507 26.214 60.109 55.91 2.662 9.216 2.765 29.491 0.102 38.912-6.451 22.528-23.040 42.086-43.213 50.688-13.824 5.939-33.382 8.090-46.899 5.018zM501.248 703.283c-21.709-3.174-41.37-15.77-53.453-34.304-5.837-9.011-8.294-14.848-10.65-25.395-9.318-41.882 17.51-82.842 60.006-91.648 27.546-5.632 56.525 4.915 75.162 27.546 6.656 8.192 13.722 23.859 15.258 34.406 1.229 8.192 0.614 25.805-1.229 32.563-7.475 28.16-30.515 50.074-58.47 55.808-6.963 1.434-20.48 1.946-26.624 1.024zM729.702 702.976c-43.315-7.885-71.475-49.459-62.157-91.648 1.126-5.12 3.174-11.878 4.71-15.258 9.318-20.992 28.57-37.274 51.098-43.213 8.397-2.253 24.986-2.662 33.894-0.922 29.696 5.734 53.862 29.696 60.518 59.597 1.331 6.349 1.229 24.474-0.307 31.437-5.939 28.16-27.648 50.893-55.501 58.47-6.963 1.946-25.395 2.765-32.256 1.536zM224.256 532.787c-22.323-14.848-39.834-42.394-43.93-68.915-1.434-9.421-1.434-97.587 0-103.629 4.506-18.739 19.251-33.792 37.888-38.707 3.072-0.819 7.066-1.536 8.909-1.536h3.277v-52.531c0-60.006 0-60.211 7.578-67.686 7.27-7.373 9.83-7.782 43.622-7.782 33.997 0 36.454 0.41 43.725 7.885 7.475 7.782 7.475 7.68 7.475 67.584v52.531h3.379c15.462 0.102 35.226 13.312 42.496 28.672 5.222 10.957 5.53 15.36 5.018 68.198-0.41 45.158-0.512 48.435-2.56 55.706-3.994 14.029-10.445 27.648-17.818 37.274-5.12 6.758-16.896 17.715-24.166 22.63-6.861 4.608-9.216 5.427-10.957 3.686-1.741-1.638-14.029-6.246-22.528-8.397-12.186-3.174-31.027-3.482-43.622-0.922-10.138 2.15-22.221 6.144-25.907 8.704-3.174 2.355-4.915 1.946-11.878-2.765zM457.626 534.733c-23.45-14.541-40.141-38.707-45.875-66.458-1.741-8.499-1.946-14.336-2.048-55.091-0.102-29.389 0.307-47.718 1.024-51.712 2.355-13.005 11.162-26.112 22.426-33.28 5.837-3.789 18.842-8.192 24.064-8.192h3.584v-53.043c0-58.163 0-58.47 6.042-65.843 1.638-1.946 5.222-4.71 7.885-6.042 4.915-2.56 4.915-2.56 37.171-2.56h32.358l5.12 2.662c5.734 2.97 11.162 9.318 12.8 15.053 0.614 2.355 1.024 23.347 1.024 56.627v52.736l7.782 1.229c20.787 3.277 38.093 19.661 42.291 40.038 1.741 8.192 1.434 93.389-0.41 104.038-4.198 25.395-18.432 49.050-38.81 64.41-11.162 8.397-11.571 8.499-18.432 5.325-20.173-9.216-42.394-11.981-62.771-7.885-9.421 1.946-25.088 7.373-27.341 9.421-1.638 1.434-3.891 1.024-7.885-1.434zM688.128 534.733c-23.757-14.848-40.55-39.322-46.080-66.765-1.536-7.987-1.843-15.36-1.946-54.784-0.102-29.286 0.307-47.718 1.024-51.712 3.482-19.046 18.637-34.816 38.093-39.936 3.277-0.819 7.27-1.536 8.909-1.536h3.072v-53.146c0-57.549 0-57.856 5.734-65.331 1.331-1.843 4.71-4.608 7.373-6.144l4.813-2.867h65.536l5.12 2.662c5.837 3.072 11.162 9.421 12.8 15.053 0.614 2.355 1.024 23.45 1.024 56.832v52.941l2.867 0.102c16.896 0.512 35.123 12.39 42.701 27.955 5.632 11.469 5.632 12.288 5.325 66.662-0.41 53.862-0.205 52.122-6.144 68.608-6.963 19.558-21.402 37.888-39.322 49.766-3.277 2.15-6.349 3.994-6.758 3.994-0.512 0-3.379-1.229-6.554-2.662-5.12-2.253-11.264-4.403-23.040-7.782-4.403-1.331-29.901-1.741-36.454-0.614-9.421 1.638-18.944 4.608-26.931 8.499-6.451 3.072-6.656 3.072-11.162 0.205zM410.624 63.488c0-0.41 74.957-63.386 83.354-69.837 11.776-9.318 25.702-8.397 39.117 2.458 15.053 12.186 80.282 66.97 80.282 67.379 0 0.307-45.568 0.512-101.376 0.512-55.706 0-101.376-0.205-101.376-0.512z" />
+<glyph unicode="&#xe9c9;" glyph-name="email" d="M102.4 502.374c0-305.459-0.41-287.334 6.042-303.821 9.626-24.678 30.515-44.544 56.218-53.35 13.312-4.506 0.102-4.301 388.608-4.403h368.333v280.371c-0.102 299.52 0.102 285.798-4.915 300.237-7.373 20.992-22.63 38.502-42.701 48.742-9.626 5.018-15.462 6.963-26.624 9.114-7.27 1.331-51.507 1.536-376.525 1.536h-368.435v-278.426zM834.355 578.662c-38.605-37.274-55.398-53.453-61.44-59.085-7.885-7.68-45.158-43.52-65.843-63.386-7.782-7.578-20.070-19.354-27.136-26.112-7.066-6.861-18.534-17.92-25.6-24.781-7.066-6.758-14.95-14.336-17.51-16.794s-12.8-12.288-22.733-21.811c-19.866-19.046-29.594-26.624-42.701-33.075-18.33-8.909-34.509-12.698-56.832-13.107-29.286-0.614-53.658 5.939-75.469 20.275-11.878 7.782-17.203 12.595-60.211 54.374-20.275 19.661-69.632 67.482-76.698 74.24-3.174 3.072-12.698 12.288-21.094 20.48-8.499 8.192-28.058 27.136-43.52 42.086s-34.918 33.792-43.213 41.984l-15.258 14.848 0.614 87.654 17.101-16.691c9.318-9.216 33.997-33.382 54.784-53.76 20.685-20.275 41.472-40.55 45.978-45.056 4.608-4.403 23.245-22.528 41.37-40.243 18.227-17.715 36.454-35.43 40.448-39.424 4.096-3.891 19.558-18.944 34.406-33.485 42.598-41.472 43.11-41.882 49.459-45.978 13.312-8.704 30.925-13.107 50.381-12.698 16.896 0.41 32.154 5.222 45.773 14.234 5.734 3.789 7.27 5.222 48.435 45.261 14.643 14.234 29.082 28.16 32.154 31.13 3.072 3.072 18.534 18.022 34.304 33.28 15.77 15.36 31.744 30.822 35.533 34.406 3.686 3.584 18.125 17.613 32.051 31.13s28.16 27.238 31.642 30.618c10.65 10.24 64.307 62.362 67.584 65.741l3.174 3.174 0.614-89.293-10.547-10.138z" />
+<glyph unicode="&#xe9ca;" glyph-name="email_forwarded" d="M102.4 646.656v-134.144h130.048v25.19l-12.493 11.878c-6.963 6.554-18.944 18.022-26.726 25.6l-14.131 13.619 0.614 87.654 16.486-16.179c9.114-8.909 33.894-33.178 55.194-54.067 21.197-20.787 41.677-40.858 45.568-44.544 3.789-3.686 21.606-20.992 39.526-38.605 18.022-17.51 35.635-34.714 39.322-38.298 3.686-3.482 19.968-19.354 36.147-35.123 48.23-47.104 47.002-45.875 58.061-52.019 19.046-10.547 50.278-12.083 72.806-3.584 14.131 5.325 20.48 10.138 44.442 33.587 9.011 8.806 19.661 19.251 23.654 23.040 3.994 3.891 21.914 21.402 39.731 38.81 17.92 17.51 34.918 33.997 37.888 36.762 4.301 4.096 32.666 31.744 78.438 76.39 27.238 26.522 71.578 69.632 74.138 72.192l3.174 2.97 0.307-44.442 0.307-44.544-13.619-13.21c-7.475-7.168-19.866-19.149-27.443-26.522-7.578-7.27-25.293-24.474-39.322-37.99-13.926-13.619-28.058-27.238-31.232-30.31-3.277-3.072-17.203-16.486-30.925-29.798s-27.546-26.624-30.618-29.594c-3.072-2.97-16.691-16.077-30.208-29.184-49.050-47.514-53.248-51.098-70.656-59.392-8.806-4.198-22.63-8.909-30.208-10.138-1.946-0.307-4.71-0.922-6.144-1.229-5.939-1.331-32.87-1.638-41.062-0.41-11.674 1.638-25.498 5.325-34.714 9.216-11.878 5.018-19.866 10.138-34.406 21.914l-3.072 2.56-19.558-19.149c-10.854-10.547-38.81-37.99-62.259-61.133-65.946-64.922-66.15-65.126-71.168-67.379-12.493-5.632-27.238-0.102-33.485 12.39-1.638 3.379-1.843 7.066-2.15 33.28l-0.307 29.389h-129.946v-29.082c0-21.402 0.41-31.334 1.536-37.99 5.939-33.894 31.744-61.542 66.56-71.373l8.192-2.355 742.912-0.512v280.269c-0.102 233.984-0.307 281.6-1.536 287.539-3.379 17.408-11.264 32.461-23.347 44.749-8.499 8.602-9.318 9.318-17.613 14.336-7.168 4.301-16.486 8.192-23.654 9.933-2.765 0.614-6.144 1.536-7.578 1.946s-169.677 0.819-373.965 0.922l-371.507 0.307v-134.144zM258.048 525.107v-38.093l-87.757-0.307c-85.094-0.307-88.064-0.41-92.877-2.355-6.451-2.56-16.384-11.776-19.558-17.818-4.608-9.216-4.813-12.493-4.403-73.318l0.307-57.344 3.277-6.758c3.994-8.192 11.366-15.36 19.558-19.149l5.837-2.765 175.616-0.512 0.205-37.888 0.307-37.888 22.221 21.709c12.288 11.981 42.086 41.37 66.458 65.331 24.269 23.962 46.285 45.568 48.947 48.128 11.571 11.366 14.95 18.534 14.95 31.232-0.102 7.066-0.512 9.114-3.379 14.95-2.97 6.144-7.475 10.854-49.254 52.019-25.293 24.883-51.917 50.995-59.085 58.061-7.27 7.066-19.558 19.149-27.238 26.829l-14.131 14.029v-38.093z" />
+<glyph unicode="&#xe9cb;" glyph-name="Email_replied" d="M102.4 502.579c0-172.237 0.41-280.883 1.024-285.082 4.096-28.467 22.938-54.374 48.845-67.379 3.482-1.741 10.445-4.403 15.36-5.939l9.011-2.867 744.96-0.512v141.312h-129.946l-0.307-29.389c-0.307-26.522-0.512-29.901-2.253-33.382-4.506-9.114-13.005-14.336-23.142-14.336-11.674 0-4.915-5.837-83.251 71.27-51.098 50.278-76.186 74.854-78.541 77.005-1.434 1.331-1.946 1.126-4.096-0.819-7.987-7.27-20.582-15.565-31.232-20.582-16.896-7.987-31.232-11.059-53.76-11.469-9.83-0.205-19.968 0.102-22.528 0.512-2.56 0.512-6.246 1.229-8.192 1.536-13.107 2.048-33.382 10.138-45.158 18.022-10.547 7.066-14.746 10.957-56.934 51.917-14.336 13.926-28.058 27.238-30.413 29.389-2.253 2.253-15.974 15.36-30.31 29.286s-28.672 27.75-31.744 30.618c-3.072 2.97-17.101 16.589-31.232 30.208-14.029 13.517-31.949 30.925-39.936 38.605-7.885 7.68-19.968 19.354-26.931 26.112l-12.595 12.186 0.614 88.883 5.12-4.813c2.867-2.765 18.432-17.92 34.714-33.792 16.179-15.77 33.587-32.666 38.502-37.478s22.733-22.016 39.424-38.4c16.794-16.282 34.509-33.587 39.322-38.195 4.813-4.71 22.221-21.606 38.502-37.478 16.384-15.974 33.587-32.768 38.4-37.478 4.813-4.608 15.667-15.155 24.064-23.45 23.654-23.040 28.365-26.522 42.803-32.256 18.022-7.168 42.394-7.68 62.157-1.536 6.246 2.048 17.715 8.090 22.426 11.981 5.222 4.301 3.686 2.765 45.158 43.213 17.203 16.691 34.304 33.382 38.093 36.966 3.686 3.584 20.89 20.378 38.195 37.274s35.43 34.611 40.346 39.322c7.782 7.578 31.13 30.31 98.509 96.461l19.354 18.944v-88.371l-18.637-17.92c-10.342-9.83-22.323-21.299-26.624-25.498l-7.987-7.475v-25.19h130.048v92.57c0 77.517-0.205 93.901-1.536 101.274-3.277 18.944-10.854 33.587-24.576 47.411-13.619 13.722-26.522 20.787-45.568 25.088-8.397 1.843-19.968 1.946-378.061 1.946h-369.459v-278.221zM738.202 535.757c-98.202-96.461-114.176-112.128-116.326-114.381-1.331-1.434-3.891-5.53-5.734-9.216-2.867-5.939-3.277-7.578-3.277-15.36 0-7.578 0.41-9.523 3.174-15.36 2.048-4.198 5.427-8.909 9.318-12.8 12.8-12.8 109.056-107.418 124.211-122.163l15.872-15.462 0.307 37.786 0.205 37.888h85.299c91.955 0 91.034 0 100.352 5.427 6.042 3.584 12.698 11.059 15.872 17.92l2.765 5.837 0.307 57.344c0.307 41.267 0 58.88-0.819 62.976-2.765 13.005-12.902 24.474-24.986 28.467-6.758 2.253-7.066 2.253-92.774 2.253h-86.016l-0.205 37.786-0.307 37.786-27.238-26.726z" />
+<glyph unicode="&#xe9cc;" glyph-name="emap" d="M76.8 519.475c0-215.040 0.307-262.349 1.434-266.547 4.608-17.51 18.842-31.027 35.942-34.202 4.198-0.819 41.267-1.229 114.688-1.434 59.699-0.205 109.978-0.614 111.616-1.024 1.741-0.307 7.27-1.126 12.288-1.741 27.034-3.482 53.248-11.162 75.776-22.016 16.896-8.192 29.901-16.179 64.205-39.731 10.957-7.475 14.438-8.806 21.299-8.192 4.506 0.41 13.722 4.813 17.92 8.499 2.867 2.56 33.997 23.142 44.749 29.594 16.794 10.035 33.075 17.101 54.579 23.654 8.499 2.56 34.099 7.68 43.52 8.704 3.686 0.41 7.578 1.024 8.704 1.331s52.736 0.819 114.688 1.126c76.186 0.512 113.664 1.024 115.712 1.741 16.998 6.144 29.184 19.661 32.154 35.738 0.819 4.198 1.126 82.944 1.126 265.933v259.994l-130.765-0.41c-71.987-0.205-132.506-0.614-134.451-0.922s-7.066-0.922-11.264-1.229c-48.538-4.403-104.346-22.118-148.275-47.002-9.728-5.427-10.854-5.837-12.8-4.506-9.216 5.939-34.611 18.637-49.459 24.678-18.739 7.578-35.942 13.107-55.706 17.92-16.896 3.994-33.587 6.963-51.2 8.909-3.072 0.307-7.27 0.819-9.216 1.229-1.946 0.307-62.874 0.717-135.373 0.922l-131.891 0.41v-261.427zM369.459 676.045c20.378-11.162 18.534-39.731-2.97-47.309-3.584-1.331-19.968-1.536-110.49-1.536-116.326 0-110.694-0.307-118.682 6.042-8.909 7.066-11.776 22.221-5.939 32.051 3.174 5.427 8.090 9.626 13.722 11.674 3.174 1.126 23.552 1.331 112.435 1.126 102.4-0.205 108.749-0.307 111.923-2.048zM776.499 676.762c2.867-1.024 6.656-3.482 9.318-6.144 7.987-7.987 7.782-5.53 7.782-79.974v-65.843h37.888c20.89 0 37.888-0.205 37.888-0.512 0-1.126-128.614-128.819-131.994-131.072-7.782-5.12-19.354-7.27-28.774-5.12-10.957 2.458-10.854 2.355-79.155 70.554-35.84 35.84-65.229 65.434-65.229 65.638 0 0.307 16.998 0.512 37.888 0.512h37.786l0.307 67.891 0.307 67.789 2.765 4.71c3.277 5.53 8.602 9.933 14.541 11.776 3.174 1.024 17.203 1.331 59.085 1.331 47.718 0.102 55.501-0.102 59.597-1.536zM366.899 574.362c9.523-3.277 17.101-13.824 17.101-23.962 0-8.806-6.042-18.637-14.336-23.142-3.482-1.843-7.68-1.946-111.514-2.253-121.446-0.307-113.971-0.717-122.266 7.373-10.445 10.035-10.342 26.010 0 36.147 7.987 7.68 1.434 7.373 120.218 7.373 94.515 0.102 106.598-0.102 110.797-1.536zM263.373 472.576c2.15-0.614 5.734-2.56 8.192-4.403 12.493-9.626 12.902-30.106 0.614-39.731-7.578-6.042-6.656-5.939-66.97-6.042-62.464 0-61.44-0.102-69.427 7.578-13.414 13.107-8.397 35.84 9.318 42.189 4.915 1.741 112.128 2.048 118.272 0.41zM344.064 318.771c1.434-0.41 5.53-0.922 9.216-1.229 7.475-0.717 8.499-0.922 23.040-3.277 29.901-4.813 59.802-13.414 89.088-25.702 8.704-3.686 30.72-14.746 39.322-19.661l7.168-4.198 10.547 5.939c37.069 20.89 78.95 35.738 122.163 43.213 31.642 5.427 31.642 5.427 145.203 5.837l106.189 0.41v-14.234c0-17.715-1.331-22.835-7.578-29.286-7.885-7.987-2.867-7.68-110.182-8.090-52.122-0.307-96.768-0.717-99.328-1.126s-8.499-1.126-13.312-1.741c-13.619-1.638-37.171-6.656-50.483-10.65-26.317-7.987-44.954-16.486-74.547-34.099-20.275-12.083-19.866-11.878-28.57-11.776-8.704 0-8.397-0.205-28.672 11.878-49.562 29.389-87.552 41.677-144.384 46.694-5.325 0.512-50.074 0.922-99.328 1.024-54.272 0.102-91.034 0.512-93.286 1.126-5.632 1.536-12.39 7.27-15.258 12.902-2.355 4.608-2.56 6.349-2.867 21.197l-0.307 16.179 106.803-0.41c58.778-0.205 107.93-0.614 109.363-0.922z" />
+<glyph unicode="&#xe9cd;" glyph-name="emergency_firemen" d="M503.296 830.976c-6.656-1.638-13.005-5.325-17.92-10.445-8.192-8.397-11.264-17.203-11.264-32.154v-7.578h-346.112l0.307-311.501c0.205-295.219 0.307-311.91 2.048-317.747 9.216-30.925 25.805-53.453 50.995-69.325 20.787-13.107 48.538-19.968 69.325-17.306 57.446 7.578 98.406 43.52 106.803 93.798l1.331 7.68h152.986l1.843-7.373c12.698-52.531 47.821-85.709 98.714-93.491 47.514-7.27 94.515 16.589 118.067 59.904 3.584 6.554 8.499 18.637 9.318 22.938 0.205 1.126 0.922 4.198 1.536 6.758s1.126 6.144 1.126 7.987v3.277h153.6v143.155c0 157.696 0.307 149.811-6.451 162.406-3.891 7.373-12.698 16.589-19.251 20.275-11.674 6.451-10.854 6.349-58.675 6.963l-43.93 0.512-20.787 32.768c-11.469 18.022-21.709 34.202-22.835 35.84-16.691 26.010-26.624 41.677-49.254 77.312-10.854 17.203-22.63 35.635-26.112 40.96-6.861 10.752-47.411 74.445-54.784 86.221l-4.71 7.475-19.046 0.307-19.046 0.205-0.41 11.571c-0.41 9.933-0.819 12.288-3.277 17.306-6.144 12.493-18.944 21.094-32.461 21.811-4.198 0.205-9.421 0-11.674-0.512zM368.026 674.304c-0.41-12.39 5.734-25.088 21.709-45.056 26.317-32.768 36.045-47.821 41.37-63.59 1.843-5.222 2.355-9.421 2.56-20.89 0.41-15.77-0.512-24.678-3.789-36.352-1.946-7.27-6.758-18.227-9.216-21.197-1.843-2.253 0.717-1.434 5.632 1.843 11.162 7.373 19.558 20.070 22.835 34.202 2.867 12.288 2.765 44.646-0.205 52.941-1.843 5.12-1.946 5.734-0.41 4.915 5.53-2.97 20.582-22.938 26.317-34.816 12.083-25.19 14.234-49.152 6.861-76.8-7.578-28.16-23.040-48.026-51.098-65.536-10.547-6.554-32.358-19.456-32.87-19.456-0.307 0-4.608-2.765-9.421-6.144-23.347-15.974-32.973-30.003-32.973-47.923 0-13.005-3.072-13.926-8.806-2.458-6.758 13.312-9.83 38.81-6.963 57.651 2.355 15.77 6.758 24.883 22.426 46.797 2.56 3.482 6.451 9.933 8.602 14.336 10.035 19.763 11.366 34.714 4.608 49.254l-2.662 5.734-1.946-5.427c-2.15-6.451-9.318-16.691-15.053-21.914-5.018-4.506-13.926-10.547-23.245-15.667-9.933-5.427-16.077-10.752-20.992-18.227-7.782-11.878-10.547-27.034-7.578-41.267 3.072-14.336 3.072-13.107-0.102-12.288-7.066 1.741-23.040 15.565-31.744 27.341-9.114 12.39-14.643 30.31-15.565 50.586-0.717 16.077 0.717 23.347 7.168 35.84 5.018 9.728 6.451 11.776 23.552 35.738 16.179 22.63 21.299 32.768 22.016 43.315 0.307 4.096 0.819 7.475 1.331 7.475 1.536 0 5.939-6.656 9.114-13.619 6.246-13.722 8.192-30.515 4.608-39.424-1.024-2.458-1.536-4.608-1.331-4.813 1.024-1.024 11.366 5.12 15.565 9.216 5.222 5.325 7.68 10.035 8.499 16.691 0.41 3.891-0.307 7.168-3.789 17.613-6.144 18.432-8.294 30.003-8.294 43.52 0.205 20.173 6.042 35.328 19.046 49.562 3.277 3.686 13.312 12.39 14.234 12.39 0.102 0 0.102-1.843 0-4.096z" />
+<glyph unicode="&#xe9ce;" glyph-name="emergency_police" d="M503.808 832.922c-11.162-3.072-19.866-10.547-24.883-21.299-2.867-6.042-3.174-7.987-3.584-18.739l-0.41-12.083h-346.931v-305.357c0-332.595-0.307-315.597 5.632-333.414 5.837-17.203 15.565-32.563 28.774-45.261 21.299-20.48 46.080-31.027 76.186-32.461 58.982-2.867 109.568 37.478 118.784 94.72l1.229 7.373h76.698c60.621 0 76.698-0.307 76.8-1.229 0.102-2.15 0.819-5.939 2.56-14.131 8.397-39.014 41.062-71.782 82.637-82.842 27.341-7.373 58.368-4.506 82.842 7.578 32.973 16.384 55.398 46.694 61.235 83.251l1.229 7.373h153.395v143.36c0 99.43-0.307 144.896-1.126 148.685-3.789 18.534-18.944 34.304-37.888 39.219-4.198 1.126-14.746 1.434-46.899 1.536-31.437 0-41.779 0.307-42.701 1.331-0.614 0.614-10.035 15.258-20.89 32.461s-22.118 34.918-25.088 39.424c-2.867 4.506-7.475 11.776-10.342 16.179-2.765 4.403-7.578 11.981-10.752 16.896s-14.643 22.938-25.498 40.141c-10.854 17.203-22.63 35.635-26.112 40.96-6.861 10.752-47.411 74.445-54.784 86.221l-4.71 7.475-18.534 0.307-18.534 0.205-0.41 12.595c-0.41 11.571-0.614 12.902-3.584 18.637-8.499 16.486-27.546 25.498-44.339 20.89zM258.56 616.141c14.541-4.301 19.251-5.222 29.594-6.144 16.691-1.536 32.154 0 45.158 4.403 5.939 2.048 18.125 8.090 22.323 10.957 2.765 1.946 2.765 1.946 5.632 0 5.222-3.789 19.149-10.24 27.75-12.902 27.443-8.704 56.013-6.042 83.354 7.68 3.482 1.843 7.578 4.096 9.216 5.222 1.946 1.434 2.765 1.638 2.765 0.614 0.102-0.717 0.41-7.066 0.717-14.131 1.536-27.341 0.922-75.162-1.331-97.28-1.741-18.534-6.861-44.032-11.776-58.778-9.626-28.877-37.376-69.018-70.963-102.502-15.155-15.053-27.75-25.498-36.557-30.208l-5.939-3.174-4.403 2.253c-20.787 10.65-58.573 49.562-82.842 85.402-10.547 15.462-18.534 30.106-23.45 42.496-5.12 13.005-11.878 44.134-14.336 66.048-0.614 5.632-1.331 11.878-1.638 13.824-0.717 4.506-1.331 85.914-0.717 92.262l0.512 4.813 8.294-3.891c4.608-2.15 13.005-5.325 18.637-6.963zM345.805 552.653l-12.083-22.323-24.269-4.403c-13.312-2.458-25.088-4.608-26.112-4.915-1.536-0.41 0.102-2.458 7.782-10.342 24.064-24.576 27.341-28.365 26.931-30.413-0.307-1.126-0.819-4.813-1.126-8.192-0.41-3.379-0.819-7.066-1.024-8.192-1.536-10.138-3.789-31.437-3.277-31.846 0.307-0.41 5.12 1.536 10.65 4.198 5.53 2.765 15.667 7.578 22.63 10.854l12.493 6.042 7.475-3.482c3.994-1.843 11.264-5.325 16.077-7.475 4.813-2.253 11.776-5.53 15.565-7.373 3.789-1.741 7.27-3.174 7.782-3.174 0.41 0-0.41 10.035-1.946 22.221-1.536 12.288-2.97 23.757-3.174 25.498-0.205 2.97 1.229 4.915 15.565 19.968 8.704 9.114 16.691 17.408 17.715 18.432 1.843 1.638 1.434 1.843-8.192 3.891-5.53 1.229-13.005 2.867-16.691 3.686s-10.65 2.253-15.565 3.277l-8.909 1.741-12.493 22.323c-6.963 12.288-12.8 22.323-13.21 22.323-0.307 0-6.042-10.035-12.595-22.323z" />
+<glyph unicode="&#xe9cf;" glyph-name="emergency_sos" d="M498.483 797.184c-19.558-3.072-40.55-15.258-52.531-30.515-3.994-5.018-17.203-26.522-25.907-42.189-1.331-2.56-2.867-5.018-3.277-5.632-0.41-0.512-5.018-8.397-10.24-17.408-11.264-19.456-14.336-24.678-21.504-36.864-2.867-5.018-6.246-10.854-7.373-12.8-1.843-3.072-13.517-23.245-27.443-47.104-2.15-3.686-6.656-11.366-10.138-17.203-3.379-5.734-7.168-12.186-8.294-14.336-1.126-2.048-2.56-4.506-3.072-5.325-0.922-1.331-14.029-23.859-19.456-33.28-0.922-1.638-13.824-23.757-28.672-49.152-14.848-25.293-30.208-51.814-34.304-58.88-9.523-16.384-58.368-100.25-70.144-120.32-39.117-66.458-41.984-71.782-45.261-83.866-2.253-8.397-3.277-28.16-1.843-35.942 1.638-8.397 5.939-20.48 9.83-27.341 3.277-5.837 12.8-18.227 16.077-20.787 11.981-9.83 19.661-14.438 29.491-17.92 14.95-5.222-1.638-5.018 326.144-5.018 330.752-0.102 315.392-0.307 329.318 5.12 14.746 5.632 27.546 14.848 36.659 26.214 19.968 24.781 24.781 57.037 13.005 86.323-1.331 3.174-15.667 28.57-31.949 56.422-16.179 27.853-30.925 53.146-32.768 56.218-6.554 11.264-22.323 38.502-50.688 87.040-15.974 27.341-34.714 59.597-41.779 71.68-16.896 28.979-17.818 30.72-28.365 48.64-4.915 8.499-10.342 17.92-12.083 20.992-1.638 3.072-3.584 6.349-4.301 7.168-0.614 0.819-2.355 3.584-3.789 6.144-2.458 4.403-22.323 38.707-33.587 57.856-2.97 5.12-6.246 10.752-7.27 12.595-1.126 1.741-2.765 4.813-3.891 6.656-1.024 1.741-4.198 7.168-6.963 11.981-8.806 14.95-30.106 51.507-32.256 55.296-15.872 27.546-21.402 35.84-28.57 42.598-10.445 9.728-20.275 15.462-34.202 20.070-7.475 2.458-11.469 3.072-20.992 3.379-6.451 0.205-14.438 0-17.613-0.512zM372.224 419.84c13.619-3.686 21.402-8.909 23.552-16.077 3.686-12.288-4.506-24.371-16.384-24.371-2.15 0-8.294 1.434-13.619 3.072-17.203 5.53-30.618 3.584-35.43-5.222-4.301-7.987 0.819-15.77 12.698-19.354 3.686-1.126 11.264-3.379 16.896-5.018 18.637-5.632 34.202-14.541 41.062-23.45 11.674-15.258 10.035-45.875-3.277-63.693-6.963-9.216-14.336-14.438-26.112-18.227-26.931-8.909-70.451-2.048-81.51 12.902-5.018 6.758-5.53 15.872-1.229 22.118 6.042 8.909 14.234 10.035 29.491 4.198 23.552-9.114 35.43-8.909 44.544 0.819 3.789 4.198 3.891 4.403 3.482 10.65-0.614 10.445-4.915 13.517-28.979 20.89-27.341 8.294-36.659 13.312-43.418 23.552-4.506 6.758-6.451 13.619-6.758 23.859-0.614 26.624 17.306 47.923 45.978 54.477 7.987 1.843 30.413 1.229 39.014-1.126zM529.101 420.966c19.968-3.584 38.912-15.155 49.971-30.822 12.083-16.998 17.203-34.611 17.101-58.368-0.102-26.010-8.909-48.742-25.088-64.922-12.698-12.8-28.672-20.48-47.104-22.733-8.090-1.024-21.606-0.717-28.058 0.614-12.698 2.458-26.522 8.397-35.123 15.053-6.349 4.813-14.848 14.234-19.046 20.89-9.011 14.438-13.312 30.72-13.619 51.61-0.614 42.189 21.299 74.854 58.163 86.528 11.469 3.686 28.979 4.506 42.803 2.15zM693.76 421.376c14.029-2.048 25.293-7.373 30.003-14.336 3.277-4.813 2.867-14.336-0.819-19.763-5.018-7.27-14.643-9.933-23.245-6.349-21.504 9.011-41.267 4.506-41.267-9.421 0-6.963 4.096-10.547 15.974-14.131 28.365-8.499 37.376-12.186 47.206-19.661 11.162-8.397 15.667-17.408 16.282-33.075 1.229-30.413-14.746-52.224-43.11-58.982-8.397-1.946-26.726-2.662-36.762-1.331-14.848 1.843-29.798 7.373-35.738 13.005-7.578 7.168-9.114 18.739-3.379 26.214 6.042 7.987 13.414 8.806 28.774 3.174 19.866-7.373 28.979-8.397 37.99-4.198 6.554 3.072 9.933 7.68 10.24 13.824 0.614 11.878-3.994 15.155-34.304 24.269-28.467 8.602-39.014 16.998-43.622 34.304-1.741 6.451-1.946 15.872-0.512 23.552 1.229 6.861 7.066 18.637 11.469 23.552 9.011 9.83 23.347 17.306 37.683 19.661 5.018 0.819 20.070 0.614 27.136-0.307zM503.296 386.56c-10.547-2.458-22.528-12.39-27.443-22.528-4.403-9.216-5.939-16.794-5.939-29.696 0-30.515 13.517-51.712 35.123-55.296 23.45-3.789 41.472 9.626 47.514 35.328 2.253 9.523 2.253 29.594 0.102 37.683-4.813 17.408-12.902 27.546-26.317 32.973-4.915 1.946-17.818 2.867-23.040 1.536z" />
+<glyph unicode="&#xe9d0;" glyph-name="emergency-service" d="M515.789 780.8c-11.059-2.765-20.685-10.854-25.702-21.504-2.765-5.939-3.174-7.885-3.482-18.125l-0.41-11.571h-383.795l0.307-258.253c0.307-284.16-0.205-260.915 6.349-279.347 9.933-27.853 30.72-51.302 56.832-64.512 9.523-4.71 18.432-7.68 30.925-10.24 11.366-2.355 32.768-2.15 44.339 0.307 29.184 6.451 55.808 24.371 71.68 48.333 11.059 16.691 16.486 31.232 19.354 52.224 0.205 1.741 0.512 7.987 0.512 14.131l0.102 10.957h230.4l0.102-10.957c0-6.144 0.205-11.776 0.307-12.595 0.205-0.819 0.614-3.584 0.922-6.144 2.867-22.835 14.95-46.899 32.563-64.41 45.158-45.056 117.555-45.056 162.611 0 8.294 8.397 16.896 20.173 21.914 30.106 7.475 15.155 11.981 35.021 11.981 53.658v10.342h128v92.979c0 100.557 0.102 97.587-5.632 109.466-3.584 7.168-12.083 16.282-19.456 20.685-10.752 6.554-11.981 6.656-59.802 7.27l-43.418 0.512-42.394 70.656c-23.245 38.912-43.622 72.704-45.158 75.264-1.638 2.56-13.21 21.914-25.805 43.008-29.696 49.869-28.058 47.206-33.587 52.429-6.451 6.042-13.414 10.035-21.606 12.288-5.734 1.536-10.752 1.843-33.997 1.843h-27.238l-0.512 11.571c-0.41 10.24-0.819 12.288-3.584 18.125-6.246 13.21-18.432 21.504-32.461 22.118-3.994 0.205-9.011-0.102-11.162-0.614zM409.6 614.4v-38.4h76.8v-76.8h-76.8v-76.8h-76.8v76.8h-76.8v76.8h76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xe9d1;" glyph-name="employees_1" d="M492.032 881.664c-52.736-8.090-96.051-44.339-112.64-94.003-5.939-17.818-7.168-25.702-7.066-45.773 0-15.77 0.41-19.354 2.765-29.696 6.554-27.955 18.33-49.357 37.99-69.018 19.149-19.149 43.622-32.768 68.198-37.99 3.789-0.819 8.090-1.741 9.728-2.048 6.451-1.434 32.87-1.434 41.472-0.102 53.35 8.499 95.539 43.418 113.050 93.798 17.715 50.688 4.506 106.906-33.997 145.203-21.811 21.811-50.176 35.738-81.101 40.038-9.318 1.331-28.672 1.126-38.4-0.41zM280.576 831.386c-12.8-1.434-34.816-8.397-46.080-14.541-32.358-17.613-55.296-47.514-64.205-83.866-2.355-9.626-2.662-13.312-2.765-27.955-0.102-12.698 0.41-19.046 1.741-25.6 5.12-24.269 16.282-45.978 32.358-62.771 25.498-26.726 57.139-40.346 93.798-40.448 6.246-0.102 11.776 0.205 12.288 0.614 0.614 0.41 3.789 3.994 7.168 7.885 16.589 19.558 37.581 36.045 61.133 48.128l7.782 3.994-2.867 3.686c-14.95 18.944-27.136 45.978-31.744 70.144-2.15 11.571-2.56 16.384-2.458 33.792 0 14.029 0.512 19.763 2.355 29.184 2.355 11.264 9.523 33.894 11.571 36.557 1.843 2.253 0.205 3.891-8.499 8.192-17.92 8.909-36.25 13.21-56.218 13.312-6.451 0-13.414-0.102-15.36-0.307zM714.752 831.181c-6.349-0.614-24.371-5.222-31.437-8.090-6.963-2.662-17.51-7.987-19.046-9.523-0.512-0.41 0.717-4.608 2.662-9.318 4.198-10.342 7.168-20.787 9.626-33.178 2.458-13.107 2.458-43.418 0-57.139-4.71-25.498-15.053-49.869-29.901-69.939l-5.427-7.27 8.806-4.506c8.806-4.506 21.402-12.186 27.136-16.486 12.493-9.318 29.082-25.293 35.738-34.304 3.994-5.427 6.144-5.939 22.733-5.12 33.178 1.536 61.030 13.926 84.685 37.478 23.654 23.757 35.942 51.61 37.478 85.094 2.97 63.898-43.827 121.242-107.213 131.379-8.909 1.434-26.931 1.946-35.84 0.922zM378.163 604.774c-13.107-7.782-21.197-13.926-31.744-24.064-26.112-24.986-42.291-55.194-49.152-91.75-1.638-8.806-1.843-16.896-1.843-82.944 0-67.789 0.102-73.728 1.843-79.872 4.915-17.408 16.589-34.099 29.901-42.906 2.253-1.434 4.301-2.97 4.608-3.277s3.482-2.048 7.168-3.686c9.011-4.198 20.89-7.168 29.491-7.373l3.277-0.102v-104.96c0-71.68 0.307-106.598 1.126-110.285 3.789-18.637 18.944-34.202 38.093-39.322 7.066-1.843 192.922-2.15 201.626-0.307 18.637 3.994 35.84 20.787 39.322 38.298 0.512 2.253 0.922 4.403 1.024 4.915 0.102 0.41 0.205 48.23 0.307 106.189l0.102 105.472h3.891c7.27 0.102 21.811 3.994 30.208 8.192 16.794 8.397 29.286 21.606 36.454 38.605 6.144 14.336 6.144 14.438 5.734 92.979-0.102 39.424-0.512 73.114-0.819 74.752-8.602 52.531-36.659 94.515-80.794 120.73-5.222 3.174-10.035 5.734-10.65 5.734s-1.946-0.922-3.072-2.15c-6.451-7.168-26.317-20.685-41.165-28.058-45.978-22.733-99.942-24.986-147.354-6.042-19.251 7.68-35.226 17.203-49.664 29.491-4.403 3.686-8.294 6.758-8.704 6.758s-4.608-2.253-9.216-5.018zM528.486 523.571c0-0.717 0.205-2.253 0.41-3.379s0.819-6.451 1.536-11.776c0.614-5.325 1.331-11.366 1.638-13.312s1.434-10.752 2.458-19.456c3.584-29.286 13.21-106.906 14.234-114.176 0.512-3.891 1.229-9.318 1.638-11.878l0.614-4.71-13.21-17.306c-18.125-23.859-24.986-32.666-25.293-32.666-0.41 0-30.72 39.424-34.304 44.544-1.331 1.946-2.867 3.891-3.379 4.198-0.717 0.512-0.102 7.168 1.843 20.378 0.205 1.434 0.614 4.608 0.922 7.168 0.512 4.506 10.547 80.486 11.366 86.528 0.205 1.741 1.331 10.65 2.56 19.968 2.048 16.589 2.765 22.016 3.686 28.16 1.434 10.547 2.458 17.51 2.458 18.227 0 0.41 6.963 0.717 15.36 0.717 11.571 0 15.36-0.307 15.462-1.229zM168.448 583.475c-35.43-20.582-61.542-54.272-72.499-93.491-5.53-19.456-5.734-23.859-5.53-103.936 0.307-81.306-0.102-75.776 6.861-91.034 10.547-22.63 33.178-38.605 58.675-41.165l6.861-0.717v-97.075c0-68.301 0.307-98.714 1.126-102.502 4.096-19.251 18.432-34.304 37.478-39.219 4.915-1.331 18.022-1.536 84.992-1.536h79.155l-4.096 5.325c-4.813 6.451-10.342 17.51-12.902 26.010-1.741 5.53-1.946 14.029-2.458 104.141l-0.512 98.202-6.656 2.253c-35.123 12.288-59.597 40.141-67.584 76.902-1.946 8.704-1.946 12.902-1.741 82.944 0.205 40.55 0.614 74.65 0.922 75.776s0.922 4.403 1.229 7.168c1.536 11.162 6.861 30.003 12.083 42.291 1.741 4.096 2.97 7.578 2.662 7.885-0.205 0.205-3.584 0.717-7.578 1.024-34.816 2.97-70.144 18.33-97.69 42.394-1.946 1.741-3.789 3.174-4.096 3.174s-4.198-2.15-8.704-4.813zM845.21 586.445c-26.624-24.371-63.181-40.448-99.635-43.725-3.686-0.307-6.758-0.717-7.066-0.922-0.205-0.307 1.536-5.12 3.789-10.957 4.71-11.469 8.294-24.576 11.059-39.629 1.638-8.909 1.843-17.408 1.843-85.197v-75.264l-2.458-9.216c-9.114-34.918-32.973-60.928-66.662-72.806l-6.656-2.355-0.512-97.587c-0.614-98.304-0.717-100.25-4.301-109.875-2.355-6.554-7.373-15.872-11.162-20.89l-3.994-5.222h78.643c86.323 0 85.811 0 97.587 6.246 12.493 6.758 22.835 20.992 25.395 35.123 0.717 4.096 1.126 38.195 1.126 102.707v96.563l3.584 0.102c1.946 0.102 3.891 0.205 4.403 0.307 0.41 0.102 2.867 0.512 5.53 0.922 17.715 2.867 37.376 16.077 47.616 32.154 4.301 6.758 9.011 18.432 10.445 25.907 0.614 3.686 0.922 31.949 0.717 80.384-0.205 65.843-0.512 75.776-2.048 83.456-2.355 11.981-8.806 30.72-13.926 41.062-3.891 7.68-14.95 25.19-17.818 28.16-0.614 0.614-3.686 3.994-6.758 7.475-9.523 10.752-24.678 22.835-39.834 31.846-6.246 3.584-6.246 3.584-8.909 1.229z" />
+<glyph unicode="&#xe9d2;" glyph-name="Empty_trash" d="M422.605 881.664c-17.92-4.915-32.358-19.456-37.069-37.478-1.024-3.686-1.536-10.957-1.536-21.606v-16.179h-67.584c-73.933 0-76.083-0.102-90.214-6.042-21.197-8.909-37.888-27.853-44.544-50.79-1.434-5.12-1.843-11.776-2.15-38.605l-0.512-32.563h665.907l-0.102 30.003c-0.102 25.395-0.41 31.13-2.048 38.093-5.427 23.245-19.968 41.677-41.062 51.917-15.565 7.68-11.776 7.373-90.726 7.68l-70.963 0.41v16.077c0 10.65-0.512 17.92-1.536 21.606-4.813 18.227-19.251 32.666-37.478 37.478-7.885 2.15-170.906 2.048-178.381 0zM588.8 819.2v-12.8h-153.6v25.6h153.6v-12.8zM230.4 332.8v-320h563.2v640h-563.2v-320zM543.232 547.942c18.637-2.97 36.557-8.192 51.098-14.848 3.686-1.741 6.963-3.174 7.27-3.174 0.205 0 5.325-2.765 11.366-6.246 52.429-29.798 88.781-80.896 100.352-141.005 2.458-12.288 2.765-16.691 2.867-36.045 0.102-23.757-0.717-30.72-5.632-50.381-7.68-31.334-23.245-61.235-44.134-84.89-9.933-11.264-9.523-10.752-19.251-19.456-29.491-25.907-64-42.189-103.424-48.742-8.090-1.331-16.179-1.741-32.768-1.638-19.354 0-23.757 0.41-36.352 2.765-14.234 2.765-38.195 10.138-45.363 13.926-2.048 1.126-4.096 2.048-4.403 2.048-0.41 0-5.018 2.355-10.24 5.222-54.886 30.106-92.262 81.613-103.936 143.053-2.15 11.264-2.765 17.818-2.97 32.973-0.205 10.445 0.102 22.426 0.614 26.624 5.427 44.851 25.498 87.654 55.501 118.682 32.666 33.69 75.571 55.706 120.013 61.542 5.12 0.614 9.933 1.331 10.752 1.434 5.427 0.922 39.936-0.41 48.64-1.843zM420.147 463.872c-16.486-4.506-27.853-19.763-27.955-37.683 0-6.042 3.379-16.486 6.963-21.197 1.536-1.946 15.258-16.179 30.618-31.437l27.853-27.955-28.57-28.57c-15.77-15.77-29.696-30.515-31.13-32.666-9.421-14.95-6.554-36.659 6.451-48.128 13.312-11.878 32.051-13.722 46.387-4.71 2.253 1.434 16.896 15.462 32.666 31.13l28.57 28.57 29.491-29.389c31.642-31.642 33.69-33.28 45.978-35.328 30.003-5.222 53.453 26.112 40.448 53.862-2.662 5.837-6.554 10.138-32.358 35.942l-29.184 29.286 28.57 28.57c15.667 15.77 29.696 30.515 31.13 32.768 9.114 14.336 6.963 33.382-5.12 46.797-10.445 11.469-28.877 14.746-43.622 7.885-5.837-2.765-10.138-6.656-36.045-32.358l-29.389-29.286-27.853 27.853c-15.36 15.36-29.491 29.082-31.437 30.618-4.813 3.584-15.565 6.963-21.914 6.861-2.867 0-7.68-0.717-10.547-1.434z" />
+<glyph unicode="&#xe9d3;" glyph-name="End_call" d="M472.986 613.478c-0.205-0.205-6.861-0.614-14.746-1.024-15.053-0.717-23.859-1.229-33.28-2.048-10.854-1.024-28.16-2.765-31.232-3.174-1.638-0.307-8.806-1.126-15.872-2.048-46.592-5.837-101.069-18.637-142.336-33.382-4.813-1.741-10.138-3.789-11.981-4.608-1.741-0.819-3.482-1.434-3.891-1.434s-3.686-1.331-7.373-3.072c-3.584-1.638-6.758-3.072-7.066-3.072-0.205 0-5.837-2.662-12.493-5.939-32.87-16.282-52.531-29.901-72.909-50.278-19.354-19.456-30.618-37.069-37.274-57.958-5.222-16.589-5.734-22.63-5.734-72.602 0-42.189 0.205-47.002 1.946-53.658 4.915-18.944 20.787-33.587 40.346-37.171 5.632-1.024 9.626-1.024 20.378 0 7.373 0.717 14.336 1.434 15.565 1.638s4.915 0.614 8.294 1.024c3.379 0.307 10.035 1.024 14.848 1.638 4.813 0.512 11.059 1.229 13.824 1.536 2.867 0.205 6.246 0.717 7.68 0.922s5.53 0.717 9.216 1.024c3.686 0.307 10.138 1.024 14.336 1.536s10.24 1.229 13.312 1.536c38.093 3.891 45.158 6.349 57.344 19.661 11.059 12.083 13.21 20.070 13.312 49.971 0.102 28.672 2.253 39.014 10.752 52.326 14.541 22.733 47.616 38.093 94.72 43.93 3.072 0.41 6.349 0.922 7.27 1.024 0.819 0.205 5.427 0.614 10.24 1.024 4.71 0.41 10.24 0.819 12.186 1.024 23.552 2.355 112.845 2.355 140.288 0 27.443-2.458 39.526-4.198 57.344-8.294 43.11-10.035 68.096-29.901 74.547-59.29 1.843-8.499 2.15-12.902 2.253-34.304 0.205-26.522 2.048-33.792 11.878-45.978 9.011-11.264 21.709-17.408 38.81-19.046 3.994-0.307 8.806-0.819 10.752-1.024 1.946-0.307 12.083-1.331 22.528-2.56 10.445-1.126 22.63-2.458 27.136-2.97 4.506-0.614 13.005-1.536 18.944-2.15s12.083-1.331 13.824-1.536c22.63-2.97 37.274-3.891 43.93-2.662 19.149 3.277 35.123 17.613 40.55 36.557 1.946 6.656 2.048 9.728 1.741 57.242-0.205 27.648-0.717 51.61-1.126 53.248-3.789 15.36-5.427 20.48-9.421 29.491-24.986 57.037-98.304 103.731-204.493 130.355-30.925 7.782-73.216 15.462-100.557 18.227-2.765 0.307-9.523 1.024-14.848 1.536-16.486 1.741-20.582 2.048-32.256 2.765-6.144 0.307-12.595 0.819-14.336 1.024-3.686 0.614-96.358 1.536-96.87 1.024z" />
+<glyph unicode="&#xe9d4;" glyph-name="Entertainment_channel" d="M409.6 767.488v-25.6h-358.4l0.102-186.061c0-109.875 0.41-190.362 1.024-196.403 1.741-18.739 7.373-44.646 12.595-58.573 0.819-2.15 2.97-7.782 4.71-12.493 7.68-20.378 20.48-42.598 36.762-63.59 6.246-8.090 25.088-27.648 34.406-35.942 9.933-8.602 30.515-23.142 39.629-27.75 2.458-1.229 5.53-2.97 6.963-3.891 4.198-2.765 25.395-11.878 36.762-15.77 29.286-10.138 59.802-14.643 91.238-13.619 9.83 0.41 18.842 0.819 19.968 1.024 1.126 0.307 4.403 0.717 7.168 1.126 31.232 4.198 66.867 16.486 93.184 32.154 15.053 9.011 27.853 18.227 43.827 31.846 1.638 1.434 2.662 0.614 13.619-10.24 13.824-13.619 11.878-11.878 22.938-20.685 38.707-30.925 86.835-51.507 137.011-58.573 18.33-2.56 53.35-2.867 71.68-0.614 49.766 6.144 96.461 24.986 135.782 54.886 12.8 9.626 15.053 11.674 26.829 22.938 22.016 21.299 38.605 43.622 53.76 72.294 14.234 26.829 26.112 64.307 29.082 91.648 0.307 3.072 1.024 9.114 1.536 13.312 0.41 4.198 0.819 83.046 0.717 175.104l-0.205 167.424-2.765 10.24c-10.752 38.707-39.526 67.379-78.438 78.131l-9.933 2.765-471.552 0.512v-25.6zM409.6 632.627v-58.163l-7.68 0.205c-25.293 0.512-49.459-15.872-58.675-39.629-3.277-8.602-3.994-12.288-3.891-19.456 0.102-6.042 0.307-6.656 2.355-6.963 1.331-0.205 4.198 1.024 6.656 2.662 6.144 4.198 15.667 8.909 23.45 11.469 12.8 4.403 36.25 6.758 37.274 3.891 0.614-1.536 1.229-159.539 0.614-159.539-0.102 0-3.584 3.072-7.578 6.758-17.818 16.486-40.755 27.546-67.789 32.87-14.234 2.765-42.701 2.458-56.832-0.614-54.579-11.674-91.955-47.514-95.949-91.955-0.819-9.114 0-11.264 4.608-12.595 3.686-1.126 4.403-0.922 18.637 6.349 32.87 16.794 64.614 24.371 101.478 24.474 39.526 0 74.547-8.499 106.803-26.112 8.294-4.506 8.806-5.018 10.24-9.626 5.222-16.896 17.92-45.056 25.6-56.73 1.536-2.355 1.536-2.56-3.277-7.168-18.227-17.51-46.182-34.099-72.806-43.315-11.162-3.789-29.491-7.885-43.622-9.626-7.782-0.922-42.803-0.819-47.104 0.205-1.126 0.307-5.734 1.024-10.24 1.741-28.16 4.198-61.542 18.637-86.426 37.274-45.158 33.69-73.421 81.715-81.408 138.342-1.229 8.499-1.434 38.4-1.536 171.827l-0.102 161.485h307.2v-58.061zM576.205 640c36.25-6.758 62.874-33.28 70.349-70.144 1.638-8.090 1.434-16.691-0.307-18.842-2.253-2.662-4.71-1.946-13.926 4.096-22.528 14.643-45.67 21.402-72.499 21.094-25.19-0.307-49.562-7.68-69.939-21.197-8.909-5.939-11.571-6.656-13.824-3.891-1.843 2.15-1.536 11.571 0.512 21.606 9.728 45.466 54.579 75.674 99.635 67.277zM842.752 638.566c14.95-3.994 26.112-10.24 37.478-20.89 4.301-3.994 9.626-9.933 11.878-13.21 9.114-13.517 14.95-30.618 15.36-44.954 0.205-6.144 0-7.475-1.741-8.704-2.867-2.15-4.096-1.843-10.547 2.56-44.237 30.003-100.659 30.72-145.101 1.741-4.813-3.174-9.626-5.734-10.752-5.734-5.427 0-6.144 8.704-1.946 26.419 7.27 31.642 33.587 56.832 66.458 63.795 11.366 2.355 28.16 1.946 38.912-1.024zM535.552 391.782c1.434-1.024 5.632-3.891 9.421-6.554 32.461-22.528 78.336-39.629 116.019-43.213 3.994-0.41 8.294-0.922 9.728-1.126 5.12-0.922 38.093-0.41 47.821 0.717 45.568 5.018 88.474 21.402 124.006 47.309 7.066 5.12 10.752 6.144 15.053 4.301 6.144-2.56 7.066-5.018 6.349-19.251-1.434-31.027-10.547-58.675-27.955-85.197-8.909-13.517-12.493-17.92-23.654-28.877-24.678-24.269-53.862-39.629-88.781-46.592-9.523-1.946-14.746-2.355-32.358-2.355-13.619 0-23.552 0.512-28.16 1.434-19.354 3.686-37.786 9.933-51.712 17.408-36.762 19.558-62.259 47.309-80.179 87.142-7.168 15.872-12.493 41.165-12.902 61.030-0.205 8.704 0 9.523 2.458 12.493 3.789 4.506 9.421 5.018 14.848 1.331zM198.144 573.338c-10.854-2.662-20.685-8.294-29.286-16.794-11.469-11.366-17.306-23.347-18.842-38.707-1.126-10.445 1.741-11.878 10.854-5.734 14.643 9.933 31.949 15.155 50.586 15.155 20.378 0 33.894-3.584 50.79-13.824 4.71-2.765 9.523-4.915 10.65-4.813 2.56 0.41 3.174 5.632 1.638 14.746-3.891 21.811-19.661 40.141-41.882 48.23-8.602 3.174-24.986 3.994-34.509 1.741z" />
+<glyph unicode="&#xe9d5;" glyph-name="epg" d="M76.8 488.96v-266.24h153.6v-81.92h563.2v81.92h153.6v532.48h-870.4v-266.24zM885.76 488.96v-204.8h-747.52v409.6h747.52v-204.8zM522.957 246.067c16.691-6.246 24.269-25.805 16.282-42.189-11.162-22.835-44.851-22.016-55.194 1.331-10.957 24.678 13.517 50.381 38.912 40.858zM204.8 601.6v-40.96h81.92v81.92h-81.92v-40.96zM358.4 641.024c-11.059-3.174-18.33-8.499-24.064-17.408-4.813-7.475-6.656-14.438-6.246-23.859 0.717-16.179 8.909-28.262 24.166-35.43l6.656-3.174h429.056l6.656 3.174c8.192 3.891 13.619 8.499 17.92 15.258 4.096 6.349 5.53 10.752 6.246 17.92 1.741 16.896-6.758 32.256-22.323 40.55l-7.475 3.994-212.992 0.205c-172.544 0.102-213.914-0.102-217.6-1.229zM757.862 619.315c13.824-8.602 13.005-28.672-1.536-35.942l-4.506-2.253-390.144 0.512-4.403 3.174c-6.042 4.403-8.602 9.626-8.602 17.306 0.102 9.114 5.427 16.486 13.722 18.944 1.434 0.512 90.214 0.819 197.222 0.717l194.56-0.205 3.686-2.253zM204.8 488.96v-40.96h81.92v81.92h-81.92v-40.96zM359.117 528.794c-9.626-2.253-19.354-9.216-24.781-17.818-4.198-6.656-5.632-10.752-6.246-19.046-1.536-17.203 7.578-32.461 23.962-40.141l6.861-3.277h429.158l7.782 3.789c9.318 4.608 15.053 10.547 19.558 20.070 2.97 6.246 3.277 7.68 3.174 16.691 0 8.704-0.41 10.547-3.277 16.589-4.403 9.523-10.854 15.974-19.866 20.275l-7.475 3.482-212.48 0.205c-121.549 0-214.118-0.307-216.371-0.819zM512.819 505.958c6.554-4.506 8.909-9.011 8.909-16.998s-2.662-13.005-9.114-17.203l-4.198-2.765-144.384-0.512-4.608 2.355c-14.746 7.68-14.541 29.184 0.307 36.454 4.198 2.048 5.53 2.048 76.595 1.843l72.294-0.205 4.198-2.97zM788.48 506.675c12.902-8.090 13.517-25.498 1.126-34.509l-4.403-3.174-195.891-0.512-4.608 2.355c-2.662 1.434-5.939 4.301-7.68 6.758-2.662 3.789-3.072 5.222-2.97 11.162 0 5.734 0.512 7.578 2.867 11.162 3.072 4.506 6.349 7.168 10.752 8.602 1.434 0.41 46.49 0.717 99.942 0.614l97.28-0.205 3.584-2.253zM204.8 376.32v-40.96h81.92v81.92h-81.92v-40.96zM355.738 415.13c-11.878-3.994-21.914-14.029-25.907-25.907-1.536-4.813-1.946-8.192-1.741-14.746 0.717-15.77 9.216-28.365 23.962-35.328l6.861-3.277 212.582-0.307c191.898-0.205 212.992 0 218.010 1.434 18.534 5.53 31.027 23.552 29.286 42.291-1.434 15.974-9.523 27.341-24.166 34.304l-6.656 3.174-212.992 0.205c-212.275 0.205-212.992 0.205-219.238-1.843zM573.747 393.83c2.15-1.331 5.12-4.301 6.656-6.554 2.253-3.482 2.765-5.325 2.765-10.854 0-8.090-2.355-12.595-8.909-17.101l-4.198-2.97-101.786-0.307c-70.246-0.205-103.117 0.102-105.882 0.819-7.68 2.15-14.234 11.366-14.234 20.378 0 7.373 6.758 16.282 14.029 18.534 1.536 0.512 48.947 0.819 105.267 0.717l102.4-0.205 3.891-2.458zM789.094 393.523c7.782-5.018 11.059-13.926 8.602-22.938-1.741-6.042-7.578-12.186-13.21-13.722-2.867-0.717-24.576-1.024-69.939-0.819l-65.843 0.307-3.686 2.253c-13.824 8.602-13.005 28.979 1.434 36.045 4.198 2.048 5.632 2.048 71.373 1.843l67.072-0.205 4.198-2.765z" />
+<glyph unicode="&#xe9d6;" glyph-name="erase" d="M331.059 653.005c-18.637-13.926-53.146-39.526-76.595-57.037-23.45-17.408-44.544-33.28-46.899-35.021-2.355-1.843-19.251-14.438-37.581-28.058-63.181-47.104-72.806-54.272-74.957-56.525-4.813-5.018-11.878-17.306-14.643-25.395-2.56-7.782-2.867-10.035-2.97-22.426 0-15.462 1.126-20.992 7.066-33.075 4.915-10.035 10.547-16.384 23.859-26.829 6.451-5.018 18.739-14.746 27.341-21.504s24.986-19.661 36.454-28.774c11.469-9.011 31.642-24.883 44.749-35.328 13.21-10.342 25.498-19.968 27.341-21.402s17.101-13.414 33.792-26.624c16.691-13.21 31.949-25.19 33.792-26.624 3.379-2.56 35.635-27.955 47.104-37.171l6.042-4.813 243.302 0.307c133.734 0.102 244.634 0.614 246.272 1.024 1.741 0.512 5.837 1.536 9.216 2.355 9.011 2.253 16.486 5.12 24.781 9.626 27.853 14.95 46.387 38.707 55.706 71.168l2.355 8.192 0.307 161.28c0.102 89.498-0.205 163.328-0.614 165.888-0.512 2.56-1.229 6.246-1.536 8.192-1.638 10.445-8.397 26.419-15.974 37.274-12.698 18.33-32.666 32.973-55.091 40.55-19.251 6.451-6.246 6.144-269.21 6.144h-239.411l-33.997-25.395zM493.978 559.616c2.97-1.434 16.691-14.336 41.984-39.629l37.478-37.581 37.683 37.786c40.141 40.141 41.677 41.472 51.917 41.984 10.547 0.614 13.722-1.331 31.334-18.842 17.51-17.51 19.354-20.48 19.354-31.334 0-9.83-1.946-12.288-42.394-52.736l-37.376-37.376 37.069-37.069c20.378-20.48 38.093-39.014 39.526-41.267 3.482-6.042 3.994-15.258 1.229-22.528-1.843-4.813-4.403-7.885-17.715-21.094-14.336-14.029-16.179-15.565-21.606-17.203-6.861-2.15-12.698-1.741-19.456 1.331-3.072 1.331-15.36 12.902-41.882 39.629l-37.683 37.683-37.581-37.683c-22.528-22.528-39.322-38.502-41.779-39.731-6.042-3.174-16.896-3.072-23.245 0.102-7.168 3.584-32.768 29.901-35.635 36.454-2.765 6.246-2.458 16.282 0.614 22.323 1.126 2.15 18.944 20.787 39.629 41.472l37.581 37.581-37.888 37.786c-42.598 42.701-42.701 42.803-41.779 55.296 0.819 9.216 3.686 13.414 20.582 29.901 12.186 11.981 15.36 14.541 19.661 15.974 6.451 2.048 14.643 1.638 20.378-1.229z" />
+<glyph unicode="&#xe9d7;" glyph-name="error_severe" d="M498.483 797.184c-19.558-3.072-40.55-15.258-52.531-30.515-3.994-5.018-17.203-26.522-25.907-42.189-1.331-2.56-2.867-5.018-3.277-5.632-0.41-0.512-5.018-8.397-10.24-17.408-11.264-19.456-14.336-24.678-21.504-36.864-2.867-5.018-6.246-10.854-7.373-12.8-1.843-3.072-13.517-23.245-27.443-47.104-2.15-3.686-6.656-11.366-10.138-17.203-3.379-5.734-7.168-12.186-8.294-14.336-1.126-2.048-2.56-4.506-3.072-5.325-0.922-1.331-14.029-23.859-19.456-33.28-0.922-1.638-13.824-23.757-28.672-49.152-14.848-25.293-30.208-51.814-34.304-58.88-9.523-16.384-58.368-100.25-70.144-120.32-17.715-30.208-37.683-64.614-39.834-68.813-4.506-9.011-7.475-21.709-7.885-34.099-0.205-6.451 0.102-14.029 0.614-16.896 1.638-8.397 5.939-20.48 9.83-27.341 3.277-5.837 12.8-18.227 16.077-20.787 11.981-9.83 19.661-14.438 29.491-17.92 14.95-5.222-1.638-5.018 326.144-5.018 330.752-0.102 315.392-0.307 329.318 5.12 14.746 5.632 27.546 14.848 36.659 26.214 19.968 24.781 24.781 57.037 13.005 86.323-1.331 3.174-15.667 28.57-31.949 56.422-16.179 27.853-30.925 53.146-32.768 56.218-6.554 11.264-22.323 38.502-50.688 87.040-15.974 27.341-34.714 59.597-41.779 71.68-16.589 28.57-17.715 30.515-28.365 48.64-4.915 8.499-10.138 17.408-11.469 19.968-1.434 2.56-3.584 6.246-4.915 8.192-2.458 3.891-7.373 12.186-21.914 37.376-5.222 9.011-9.83 17.101-10.445 17.92-1.024 1.741-9.318 16.077-12.288 21.299-3.482 6.042-5.734 9.83-11.162 19.149-2.97 5.12-7.782 13.414-10.752 18.432-2.97 5.12-8.499 14.541-12.288 20.992s-7.782 13.414-8.909 15.36c-8.704 15.053-17.203 28.979-20.378 33.28-9.933 13.414-24.474 23.45-42.394 29.389-7.475 2.458-11.469 3.072-20.992 3.379-6.451 0.205-14.438 0-17.613-0.512zM422.4 521.728c3.994-1.843 14.541-11.674 47.309-44.442l42.291-42.086 42.189 42.189c48.435 48.23 46.694 46.899 62.259 46.899 8.704 0 10.342-0.307 15.155-2.867 16.077-8.397 23.040-25.6 17.613-42.906l-2.355-7.475-85.094-85.504 43.11-43.315c47.309-47.309 47.718-47.821 49.050-60.928 1.331-12.186-5.427-25.805-15.974-32.461-9.728-6.144-22.835-6.963-33.28-2.15-5.427 2.458-11.264 7.885-49.357 45.978l-43.315 43.213-43.213-43.213c-37.069-37.069-44.134-43.622-49.152-45.875-17.818-8.090-37.581-1.024-46.49 16.896-2.458 4.813-2.867 6.963-2.867 14.336-0.102 15.462-0.922 14.438 48.845 64.205l43.213 43.315-41.677 41.677c-47.923 48.026-47.411 47.309-47.411 62.771 0 7.27 0.41 9.626 2.662 14.438 4.198 8.806 12.698 16.282 22.426 19.456 5.018 1.638 18.637 0.41 24.064-2.15z" />
+<glyph unicode="&#xe9d8;" glyph-name="Ethenet" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM409.6 601.6v-76.8h-51.2v-76.8h281.6v76.8h-51.2v153.6h153.6v-153.6h-51.2v-128h-153.6v-76.8h51.2v-153.6h-153.6v153.6h51.2v76.8h-179.2v128h-51.2v153.6h153.6v-76.8z" />
+<glyph unicode="&#xe9d9;" glyph-name="event_agenda" d="M323.072 842.854c-11.264-3.584-19.456-10.65-24.474-21.094l-3.174-6.656-0.307-23.757-0.307-23.859h-179.098l0.307-326.861c0.205-310.579 0.307-327.27 2.048-332.902 5.837-19.046 16.998-34.099 33.075-44.749 6.554-4.301 11.366-6.451 23.45-10.445 3.379-1.024 70.144-1.331 369.459-1.638l365.261-0.205-0.205 326.861-0.307 326.963-2.15 6.656c-4.813 14.541-10.547 24.269-19.763 33.587-8.704 8.806-22.118 16.794-32.87 19.661-2.56 0.717-5.53 1.536-6.656 1.843s-27.955 0.819-59.597 0.922l-57.651 0.41v21.197c0 11.674-0.512 23.142-1.024 25.6-2.662 11.469-10.445 20.89-21.504 26.214-5.939 2.765-7.68 3.174-15.872 3.174s-9.933-0.307-15.974-3.174c-8.397-3.994-14.541-10.24-18.739-18.842l-3.174-6.656-0.307-23.757-0.41-23.859h-281.19l-0.41 23.859-0.307 23.757-3.174 6.656c-8.192 17.101-28.058 26.419-44.954 21.094zM298.598 662.016c4.096-8.499 10.445-14.848 18.842-18.842 5.939-2.867 7.68-3.174 15.872-3.174s9.933 0.307 15.872 3.174c8.499 4.096 14.848 10.445 18.842 18.842l3.174 6.656 1.024 60.416 6.656-6.758c19.251-19.354 23.654-48.128 11.162-73.421-10.138-20.685-33.178-35.021-56.218-35.021-36.864 0-66.662 31.334-64.205 67.482 1.126 16.589 6.963 29.696 18.432 41.267l6.349 6.451 1.024-60.416 3.174-6.656zM656.998 662.016c5.427-11.059 13.926-18.227 25.293-21.094 17.818-4.608 35.942 4.096 44.134 21.094l3.174 6.656 1.024 60.416 6.758-6.963c11.162-11.264 16.998-24.474 18.022-40.653 2.662-42.496-37.786-76.083-78.95-65.536-11.674 2.97-21.402 8.499-29.901 16.998-24.678 24.576-24.883 65.024-0.41 89.498l6.656 6.656 1.024-60.416 3.174-6.656zM836.096 533.299c7.475-3.891 11.469-7.475 15.667-13.824 6.758-9.933 6.349 3.686 6.349-217.088v-200.499l-662.016 0.512-5.632 2.662c-7.475 3.584-13.005 8.090-17.101 14.234-6.861 10.24-6.451-3.994-6.451 217.293v200.499l663.040-0.512 6.144-3.277zM247.501 484.864c-11.059-2.867-20.48-10.547-25.395-20.992-9.216-19.354-1.024-41.882 18.432-51.098 5.939-2.765 7.782-3.174 15.974-3.174 8.294 0 9.933 0.307 15.872 3.277 10.547 5.12 16.896 12.083 20.48 22.835 7.885 23.347-9.523 48.742-34.099 49.766-4.096 0.205-9.114-0.102-11.264-0.614zM364.032 472.371c-6.963-2.458-11.366-6.554-15.36-14.336-6.042-11.469-0.922-26.317 11.264-32.87l4.096-2.253h399.36l4.198 2.253c15.667 8.397 18.227 28.774 5.222 41.37-7.987 7.68 8.806 7.066-209.51 6.963-135.782 0-197.12-0.41-199.27-1.126zM247.501 356.864c-10.957-2.765-20.582-10.854-25.702-21.504-2.867-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c6.349-13.312 18.944-21.811 33.178-22.221 16.486-0.41 29.491 7.68 36.659 22.938 2.355 5.12 2.765 7.168 2.765 15.155-0.102 8.192-0.41 10.035-3.277 15.872-6.246 13.21-18.534 21.504-32.461 22.118-3.994 0.205-9.011-0.102-11.162-0.614zM364.646 344.474c-11.162-3.277-18.022-12.8-18.022-24.986 0.102-10.342 4.403-17.51 13.312-22.323l4.096-2.253h199.68c189.030 0 199.885 0.102 202.957 1.843 6.042 3.277 10.24 7.782 12.595 13.517 5.018 12.493-0.512 26.726-12.902 32.87-3.891 1.946-8.397 1.946-201.114 2.15-125.85 0.102-198.349-0.205-200.602-0.819zM246.272 228.454c-11.162-3.482-19.558-10.752-24.474-20.992-2.765-6.042-3.174-7.782-3.174-15.974s0.307-9.933 3.174-15.872c4.096-8.499 10.445-14.848 18.842-18.842 5.837-2.765 7.68-3.174 15.872-3.174s9.933 0.307 15.872 3.174c8.397 3.994 14.746 10.342 18.842 18.842 2.867 5.939 3.174 7.578 3.174 15.872-0.102 8.090-0.41 10.035-3.174 15.872-6.246 13.312-18.944 21.811-33.178 22.118-4.198 0.102-9.523-0.307-11.776-1.024zM364.544 216.371c-10.957-3.174-17.92-12.8-17.92-24.883 0.102-10.342 4.301-17.51 13.312-22.323l4.096-2.253 197.427-0.307c134.349-0.102 198.758 0.102 201.523 0.819 5.427 1.536 12.186 6.963 15.258 12.288 2.048 3.686 2.56 6.042 2.56 11.776-0.102 10.854-4.915 18.944-14.438 23.654-3.891 1.946-8.397 1.946-201.114 2.15-128.512 0.102-198.349-0.205-200.704-0.922z" />
+<glyph unicode="&#xe9da;" glyph-name="event_organiser" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM625.562 284.16c5.734-18.33 12.288-39.322 14.643-46.694l4.198-13.517h48.026c26.419 0 48.23-0.205 48.435-0.41 0.307-0.307-65.946-53.965-75.162-60.826-1.843-1.434-1.331-3.277 10.035-39.322 3.482-10.957 8.192-25.907 10.445-33.28 2.253-7.27 5.018-15.974 6.042-19.149 1.024-3.277 1.638-5.939 1.331-5.939s-18.227 13.619-39.936 30.31c-21.709 16.691-39.936 30.413-40.653 30.515-0.614 0-18.33-13.619-39.322-30.515-20.992-16.794-38.4-30.31-38.605-30.106-0.307 0.205 0.41 2.97 1.536 6.042 1.024 3.072 3.994 12.186 6.554 20.378 2.458 8.192 8.499 27.443 13.312 42.803 4.915 15.462 8.602 28.365 8.294 28.877-0.307 0.41-4.813 4.096-9.933 8.090-5.222 3.994-13.21 10.138-17.715 13.619s-13.005 10.035-18.944 14.541c-5.939 4.608-15.258 11.674-20.685 15.872-5.53 4.198-9.83 7.885-9.523 8.090 0.205 0.307 22.016 0.41 48.435 0.41l48.026-0.102 2.15 6.861c1.126 3.789 5.427 17.51 9.421 30.413 4.096 13.005 9.728 31.232 12.698 40.653 2.867 9.421 5.53 16.794 5.939 16.384 0.307-0.41 5.325-15.667 10.957-33.997z" />
+<glyph unicode="&#xe9db;" glyph-name="event_speaker" d="M485.888 906.752c-43.52-6.758-79.872-26.522-108.749-59.392-22.938-26.010-37.99-59.29-42.803-94.618-1.434-10.035-1.434-40.141-0.102-47.206 0.307-1.638 0.922-4.71 1.229-6.656 6.042-37.274 27.75-76.595 56.627-102.502 15.053-13.414 36.352-26.522 55.398-33.997 9.011-3.584 27.136-8.294 37.888-10.035 9.216-1.434 39.936-1.946 48.64-0.717 36.147 4.915 70.349 20.48 96.87 44.134 5.325 4.71 12.186 11.469 15.258 15.155 3.072 3.584 5.939 6.758 6.246 7.066 0.41 0.307 3.686 5.018 7.475 10.547 28.979 42.803 38.298 95.437 25.702 145.101-18.33 72.499-79.36 125.542-154.317 134.042-12.902 1.434-32.358 1.024-45.363-0.922zM347.648 561.254c-1.126-0.717-5.939-3.482-10.752-6.246-30.003-16.998-59.802-47.002-77.722-78.234-13.21-23.142-22.733-49.971-26.214-74.138-0.307-2.765-0.922-6.042-1.229-7.168-0.41-1.229-0.819-30.208-1.024-64.41l-0.41-62.259h256.102l-0.205 28.365-0.307 28.262-4.71 2.662c-20.787 11.776-32.666 31.949-32.973 55.91-0.205 23.757 13.414 45.875 35.123 57.037 17.818 9.216 42.189 8.806 59.392-0.922 12.083-6.861 21.504-17.101 27.034-29.082 4.506-9.83 6.042-16.896 6.042-27.034-0.102-23.654-12.288-44.134-33.28-56.218l-4.915-2.867v-56.115h256l-0.102 57.651c-0.102 31.642-0.512 61.235-1.024 65.741-5.53 49.357-26.931 94.106-61.85 129.126-14.95 15.053-32.666 28.16-51.098 38.195l-6.042 3.277-3.174-2.867c-1.741-1.536-3.379-3.174-3.686-3.482-2.048-2.355-22.016-17.101-29.389-21.606-18.432-11.366-38.707-20.582-57.651-26.214-64.717-19.354-134.451-10.035-191.59 25.395-9.83 6.042-24.883 17.306-32.154 23.962-5.734 5.222-5.427 5.12-8.192 3.277zM116.736 240.333c-7.885-3.994-13.312-11.776-14.029-20.275-0.41-5.632 0.205-8.192 10.445-37.786 6.042-17.408 11.469-33.587 12.288-35.84 0.717-2.253 6.963-20.48 13.824-40.448s12.8-37.478 13.21-38.912l0.717-2.56 25.805-0.307 25.805-0.205v-76.8h614.4v76.8l25.805 0.205 25.805 0.307 0.717 2.56c0.41 1.434 6.144 18.227 12.698 37.376 28.877 83.968 37.376 109.773 37.376 112.742 0 6.451-3.072 13.722-7.68 18.33-8.397 8.499 31.744 7.68-403.354 7.68h-388.198l-5.632-2.867z" />
+<glyph unicode="&#xe9dc;" glyph-name="Excel" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM716.8 473.6v-25.6h-102.4v51.2h102.4v-25.6zM367.206 471.962c4.506-1.536 9.216-5.939 42.906-39.424l37.888-37.683 37.888 37.683c37.171 37.069 37.99 37.786 43.93 39.526 6.758 1.946 14.131 1.536 19.456-1.229 3.891-2.048 9.216-7.475 11.571-11.776 2.56-4.71 2.458-17.408-0.102-22.323-1.024-1.946-18.637-20.378-39.117-40.96l-37.274-37.376 36.454-36.352c19.968-19.968 37.478-38.195 38.81-40.448 3.482-5.837 4.301-14.234 2.048-20.992-4.915-14.848-23.45-21.811-36.864-13.824-2.253 1.331-20.48 18.842-40.448 38.81l-36.352 36.454-37.376-37.274c-20.582-20.48-39.014-38.093-40.96-39.117-2.56-1.434-5.734-1.946-11.264-1.946-6.554 0-8.499 0.512-12.493 2.867-5.632 3.277-9.421 7.782-11.571 13.926-1.946 5.632-1.946 9.626 0.102 16.589 1.536 5.222 3.482 7.373 39.424 43.418l37.786 37.888-36.864 36.864c-25.6 25.498-37.581 38.298-39.219 41.472-1.638 3.482-2.253 6.451-2.253 11.878 0 6.246 0.41 7.885 3.072 12.186 6.861 10.854 18.637 15.155 30.822 11.162zM716.8 371.2v-25.6h-102.4v51.2h102.4v-25.6zM716.8 268.8v-25.6h-102.4v51.2h102.4v-25.6zM409.6 166.4v-25.6h-102.4v51.2h102.4v-25.6zM563.2 166.4v-25.6h-102.4v51.2h102.4v-25.6zM716.8 166.4v-25.6h-102.4v51.2h102.4v-25.6zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xe9dd;" glyph-name="Expand_screen" d="M233.984 829.952c-39.219-6.963-73.421-32.051-91.443-67.072-6.451-12.39-9.011-19.968-13.107-38.4-0.512-1.946-1.024-151.347-1.126-332.083l-0.307-328.397h324.198c287.642 0 325.427 0.205 334.95 1.638 45.466 6.656 83.354 37.274 100.659 81.306 1.229 3.072 3.379 10.138 4.915 15.77l2.765 10.342 0.307 329.523 0.205 329.421-325.837-0.102c-307.917-0.102-326.554-0.205-336.179-1.946zM819.2 471.040c0-207.053-0.307-285.491-1.126-289.485-4.198-19.354-20.275-35.533-39.629-39.629-3.891-0.819-83.968-1.126-289.485-1.126h-284.16v283.443c0 199.168 0.307 285.286 1.126 289.587 3.379 18.33 18.637 34.714 37.478 39.834 3.994 1.126 57.037 1.331 290.406 1.434l285.389 0.102v-284.16zM652.493 589.005l114.995-114.995 0.307 95.846c0.102 64.307-0.102 97.382-0.819 100.864-2.355 11.059-10.24 22.016-19.866 27.648-9.728 5.734-8.090 5.632-112.947 5.632h-96.666l114.995-114.995zM256 325.427c0-62.259 0.41-97.69 1.126-100.659 3.482-15.462 16.179-28.058 31.744-31.642 2.867-0.717 39.629-1.126 100.966-1.126h96.461l-114.688 114.688c-63.078 63.078-114.893 114.688-115.098 114.688-0.307 0-0.512-43.213-0.512-95.949z" />
+<glyph unicode="&#xe9de;" glyph-name="expert" d="M358.707 806.605c-84.070-27.955-152.781-51.098-152.883-51.405 0-0.307 68.915-23.45 153.088-51.507l153.088-50.893 229.888 76.595 0.307-89.498 0.205-89.498-4.608-23.347c-2.56-12.8-4.813-24.269-5.12-25.498l-0.512-2.355h46.285l-0.512 2.355c-0.307 1.229-2.662 12.698-5.325 25.6l-4.608 23.245 0.205 94.003 0.307 93.901 23.040 7.68c12.698 4.301 23.962 8.090 25.088 8.499 1.536 0.614-39.117 14.643-151.040 51.917-84.173 28.16-153.293 51.098-153.6 51.098s-69.325-22.938-153.293-50.893zM332.902 623.923c0.102-65.843 0.512-71.68 5.427-91.443 10.957-44.032 38.707-82.739 77.21-107.52 44.851-28.774 102.195-35.84 153.19-18.739 61.645 20.582 106.906 72.499 119.603 137.114 2.15 11.162 2.253 14.438 2.662 77.005 0.205 35.84 0.102 65.229-0.205 65.229s-40.653-13.414-89.6-29.696l-89.088-29.696-89.19 29.696c-48.947 16.282-89.293 29.696-89.6 29.696s-0.512-27.75-0.41-61.645zM337.408 419.021c-20.275-14.643-27.648-21.197-39.219-35.021-22.221-26.419-35.942-57.446-40.55-91.648-1.229-8.806-1.434-31.13-1.229-126.464 0.102-106.086 0.307-116.224 1.946-121.446 7.27-23.757 23.040-41.984 44.544-51.098 14.95-6.349 0.205-5.939 243.2-6.042l221.901-0.102-0.102 147.149c-0.102 123.187-0.307 149.094-1.536 158.413-6.656 49.254-34.714 95.13-75.366 123.187l-7.782 5.427-10.65-10.342c-17.818-17.51-37.274-31.027-60.723-42.496-20.173-9.728-42.803-16.896-62.976-19.866-4.198-0.614-8.806-1.434-10.24-1.638-5.12-1.024-41.677-1.229-50.688-0.205-51.405 5.427-100.659 28.877-138.035 65.536-5.018 5.018-9.216 9.011-9.318 8.909 0 0-1.434-1.024-3.174-2.253zM671.13 297.574c7.68-3.379 12.698-8.090 16.282-15.36 2.867-5.939 3.277-7.68 3.174-14.95 0-6.758-0.512-9.114-2.765-13.517-3.584-6.861-9.114-12.186-16.077-15.565-8.090-3.789-19.763-3.789-27.75 0.205-27.75 13.517-24.883 50.995 4.71 60.826 5.427 1.741 16.589 1.024 22.426-1.638zM691.2 139.059c0-74.854 0.102-76.698 2.15-81.203 3.891-8.602 10.24-13.005 19.968-14.029l5.53-0.614v-11.981h-106.496v12.288h4.403c9.523 0 19.866 7.885 22.118 16.998 1.638 6.246 1.536 121.139 0 126.464-2.662 8.602-10.957 14.95-20.992 15.974l-5.53 0.614v11.981h78.848v-76.493z" />
+<glyph unicode="&#xe9df;" glyph-name="external_drive" d="M287.232 881.152c-21.504-4.506-40.243-14.95-54.989-30.515-12.083-12.902-19.866-26.624-25.19-44.544l-2.765-9.421-0.307-391.987-0.205-391.885 264.909 0.307c286.413 0.307 265.626-0.102 281.805 5.325 32.051 10.65 55.808 36.557 65.946 72.192l2.253 7.68 0.205 392.499 0.307 392.397-261.325-0.102c-251.699 0-261.734-0.102-270.643-1.946zM525.312 758.067c5.837-11.981 16.998-34.714 24.678-50.483l14.131-28.672-17.408-0.307-17.306-0.205v-111.718c0-106.291 0.102-111.718 1.843-110.387 0.922 0.819 5.018 4.506 8.909 8.294 3.994 3.686 8.192 7.68 9.318 8.704 1.229 1.024 8.397 7.782 16.077 15.053 7.68 7.168 15.053 14.131 16.384 15.36 3.686 3.277 10.65 13.005 12.493 17.306l1.536 3.789h-32.768v88.064h90.112v-87.962l-31.027-0.614-1.434-5.632c-2.662-10.342-8.909-19.763-21.709-32.461-6.656-6.554-33.178-31.846-36.966-35.123-10.957-9.523-27.136-25.702-28.672-28.57-3.174-6.349-4.096-14.029-4.096-33.894 0-16.691 0.205-19.456 1.536-19.456 2.355 0 14.131-5.53 19.149-9.011 34.509-23.757 36.352-76.083 3.686-102.502-12.595-10.24-25.702-14.541-42.291-13.926-27.034 0.922-49.664 17.92-58.573 44.032-2.56 7.27-2.867 9.626-2.765 20.48 0 10.65 0.41 13.312 2.765 19.763 1.434 4.096 4.301 10.138 6.349 13.414 6.861 11.469 22.426 23.552 34.714 27.238 3.789 1.126 4.198 1.638 3.891 4.198-0.512 4.403-4.403 11.571-7.885 14.438-1.638 1.434-7.475 6.656-12.8 11.571s-11.059 10.24-12.8 11.776c-5.939 5.427-30.822 28.979-37.069 35.226-13.824 13.414-21.504 25.805-23.962 38.195-1.126 5.734-1.331 5.939-5.427 7.066-2.253 0.614-4.403 1.126-4.71 1.126-2.355-0.205-14.131 7.68-19.456 13.107-10.957 10.752-15.565 22.733-14.95 37.888 0.922 19.558 11.162 35.021 28.877 43.622 18.842 9.114 40.858 5.837 56.422-8.294 14.029-12.698 19.354-30.72 15.155-51.2-3.174-15.155-11.776-27.034-23.962-32.768-7.373-3.482-7.373-3.686-1.843-14.848 3.584-7.168 10.445-14.643 33.485-35.84 7.578-7.066 17.101-15.974 21.197-19.866s8.294-7.68 9.523-8.499l2.048-1.434v264.294h-39.014l2.97 5.427c1.638 2.867 7.782 14.541 13.517 25.805 5.837 11.264 12.698 24.678 15.36 29.696 2.662 5.12 8.397 16.282 12.902 24.883 4.403 8.499 8.294 15.565 8.602 15.565s5.325-9.83 11.264-21.709zM768 128v-12.8h-512v25.6h512v-12.8zM712.909 85.709c7.885-7.885 1.946-21.709-9.421-21.709-3.482 0-8.090 2.97-10.24 6.451-7.68 12.493 9.318 25.6 19.661 15.258z" />
+<glyph unicode="&#xe9e0;" glyph-name="Factory" d="M380.928 907.264c-20.787-4.096-36.352-12.8-50.586-28.365l-7.066-7.68-7.885 3.891c-40.448 20.275-90.419 0.307-105.574-42.189l-3.174-8.806-5.734 2.867c-24.474 12.083-55.808 1.024-67.686-23.962-13.926-29.389 2.048-63.488 33.792-71.885 8.499-2.253 375.91-2.048 386.458 0.205 27.955 5.939 50.688 27.546 58.47 55.603 2.56 9.114 2.56 29.594 0 38.912-7.27 26.522-28.262 47.616-54.886 54.886-9.421 2.662-29.798 2.56-38.912 0-14.336-4.198-27.341-12.083-36.454-22.016-3.277-3.482-3.277-3.482-3.994-1.126-1.434 4.403-9.421 15.974-15.872 22.835-11.469 12.288-26.214 21.094-42.496 25.395-10.035 2.662-28.672 3.379-38.4 1.434zM127.898 701.747c0-1.331-0.205-3.482-0.41-4.915-0.102-1.434-0.614-7.885-1.024-14.336s-0.819-13.107-1.024-14.848c-0.205-1.638-0.614-7.475-1.024-12.8-0.614-9.421-1.024-15.77-2.048-29.696-0.614-8.499-1.331-18.739-2.048-29.184-0.307-4.506-0.819-11.366-1.024-15.36-0.307-3.891-0.717-9.728-1.024-12.8s-0.717-9.523-1.024-14.336c-0.307-4.813-0.819-11.264-1.024-14.336-1.229-15.667-1.536-20.685-2.048-28.16-1.331-20.89-1.638-25.805-2.048-29.184-0.307-1.946-0.717-8.397-1.126-14.336-0.307-5.939-0.717-12.39-0.922-14.336s-0.614-8.192-1.024-13.824c-0.307-5.632-0.819-11.878-1.024-13.824s-0.717-8.909-1.024-15.36c-0.41-6.451-0.819-12.902-1.024-14.336s-0.614-7.373-1.024-13.312c-0.41-5.939-1.024-14.848-1.536-19.968-0.41-5.018-0.819-85.811-0.922-179.507l-0.102-170.189h819.2v460.902l-4.301-2.56c-2.458-1.331-29.286-16.282-59.699-33.178s-57.344-31.846-59.904-33.178c-2.56-1.434-21.402-11.981-41.984-23.347s-39.424-21.914-41.984-23.347c-2.56-1.434-8.499-4.71-13.312-7.373l-8.704-4.813-1.024 127.386-76.288-42.394c-41.984-23.347-79.974-44.442-84.48-46.899s-21.811-11.981-38.4-21.299l-30.208-16.794-1.024 127.386-76.288-42.394c-41.984-23.347-79.462-44.237-83.456-46.387-3.891-2.15-12.698-6.963-19.456-10.752s-15.462-8.602-19.456-10.752c-3.891-2.15-12.493-6.963-18.944-10.65-6.451-3.584-11.776-6.554-11.878-6.451-0.205 0.205-1.126 10.65-1.946 21.197-0.307 3.686-0.717 9.421-1.024 12.8-0.205 3.379-0.717 10.035-1.024 14.848-0.922 14.95-1.536 23.859-2.048 30.208-0.922 10.752-1.434 17.101-2.048 28.672-0.307 6.246-0.819 12.902-1.024 14.848s-0.717 7.475-1.024 12.288c-0.307 4.813-0.717 11.674-1.024 15.36-0.922 12.698-1.536 20.992-2.048 28.672-0.307 4.198-0.717 10.65-1.024 14.336s-0.717 10.547-1.024 15.36c-0.307 4.813-0.717 11.264-1.024 14.336-0.205 3.072-0.717 9.318-1.024 13.824s-0.819 10.547-1.024 13.312c-0.41 5.12-0.922 12.8-2.15 29.696-0.307 5.12-0.717 10.65-0.922 12.288-0.205 1.741-0.614 8.806-1.024 15.872s-0.922 13.619-1.126 14.541c-0.102 0.922-0.614 7.373-1.024 14.336s-0.819 13.517-0.922 14.643c-0.102 1.126-0.307 3.072-0.41 4.403l-0.102 2.253h-76.8l-0.102-2.253zM307.2 217.6v-25.6h-51.2v51.2h51.2v-25.6zM409.6 217.6v-25.6h-51.2v51.2h51.2v-25.6zM512 217.6v-25.6h-51.2v51.2h51.2v-25.6zM614.4 217.6v-25.6h-51.2v51.2h51.2v-25.6zM716.8 217.6v-25.6h-51.2v51.2h51.2v-25.6zM819.2 217.6v-25.6h-51.2v51.2h51.2v-25.6zM307.2 115.2v-25.6h-51.2v51.2h51.2v-25.6zM409.6 115.2v-25.6h-51.2v51.2h51.2v-25.6zM512 115.2v-25.6h-51.2v51.2h51.2v-25.6zM614.4 115.2v-25.6h-51.2v51.2h51.2v-25.6zM716.8 115.2v-25.6h-51.2v51.2h51.2v-25.6zM819.2 115.2v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xe9e1;" glyph-name="family_place" d="M559.616 703.283c-63.283-8.192-112.23-54.886-122.982-117.248-4.915-28.262-0.512-57.549 12.493-84.48 17.101-35.226 48.435-61.952 85.504-73.011 51.917-15.462 106.598-0.717 143.77 38.707 32.666 34.816 45.773 86.733 33.075 131.789-1.126 3.994-2.458 8.806-3.072 10.752-0.512 1.946-3.686 9.114-6.963 15.872-13.619 27.648-35.84 49.971-63.488 63.59-20.070 9.933-36.454 13.824-59.392 14.234-8.704 0.102-17.203 0.102-18.944-0.205zM325.837 625.664c-22.221-3.891-42.803-14.234-59.494-29.798-10.342-9.626-18.33-20.582-25.907-35.84-8.909-18.022-15.872-24.576-26.726-25.395-8.806-0.717-19.046 3.174-29.491 11.264l-5.734 4.403 0.41-7.373c1.843-36.659 19.763-61.338 49.050-67.891l8.397-1.843 3.686-8.294c5.734-12.698 13.414-23.654 23.552-33.894 22.221-22.118 47.411-32.973 78.438-33.792 33.485-0.819 61.235 10.342 84.992 34.304 7.475 7.578 17.306 20.378 18.944 24.781 0.307 0.819-2.458 5.632-6.144 10.65-12.39 17.408-22.733 40.96-27.136 62.157-4.403 21.504-4.608 45.67-0.512 65.229 0.819 4.096 1.536 8.090 1.536 8.806 0 2.56-14.234 11.162-27.034 16.282-12.186 4.813-22.528 6.758-37.99 7.27-9.83 0.307-16.998 0-22.835-1.024zM852.48 564.634c-10.445-1.229-17.613-4.608-24.576-11.571-3.482-3.482-6.963-7.373-7.782-8.704l-1.536-2.458-6.758 2.662c-19.456 7.782-47.104 7.27-66.458-1.229l-4.71-2.15-1.843-9.421c-5.632-29.798-18.842-55.91-40.755-80.896l-5.939-6.861 1.638-6.451c2.355-9.318 9.728-23.859 16.486-32.461 10.854-14.029 29.594-26.214 47.309-31.027 11.674-3.174 33.485-3.174 44.749-0.102 16.179 4.403 29.389 11.981 40.858 23.245 30.72 30.208 35.226 78.336 10.752 114.381-4.301 6.451-17.715 20.378-19.456 20.378-2.253 0-0.614 3.174 3.379 6.554 8.806 7.578 18.534 7.066 27.034-1.331 4.198-4.096 6.144-8.294 8.704-18.739s6.042-16.998 12.186-23.142c20.173-20.070 53.658-7.475 59.802 22.528 2.253 11.162 1.126 18.739-3.789 24.166-3.174 3.379-6.349 2.867-11.776-2.253-6.042-5.53-8.499-6.861-13.414-6.963-6.246-0.102-11.571 3.379-17.408 11.366-11.264 15.462-27.546 22.63-46.694 20.48zM191.488 460.8l-12.8-12.8-12.288 12.288c-6.758 6.758-12.595 12.288-12.902 12.288s-0.512-5.53-0.512-12.288l0.102-12.288h-25.6v-11.469c0.102-6.349-0.102-12.186-0.307-12.8-0.307-1.024-3.789-1.331-12.902-1.331h-12.493l0.102-10.957c0.102-6.144-0.102-11.878-0.307-12.8-0.41-1.638-1.843-1.843-12.595-1.843-6.758 0-12.186-0.205-12.186-0.512s5.53-11.571 12.288-25.088c6.758-13.517 12.288-24.781 12.288-25.088s-5.632-0.512-12.493-0.512l-12.595-0.102 15.36-14.848c8.499-8.192 21.606-20.992 29.184-28.467 18.432-18.022 26.829-23.654 42.496-28.672 12.186-3.891 20.992-5.018 32.666-4.403 16.486 0.922 27.955 4.506 42.291 13.21 20.378 12.186 35.738 33.997 40.755 57.651 3.072 14.541 1.946 35.43-2.765 46.899-0.717 1.741-3.789 4.608-8.397 7.578-23.040 14.848-43.11 39.219-53.35 64.922-1.536 3.994-4.198 8.192-6.451 10.445l-3.891 3.789-12.698-12.8zM480.768 419.328c-16.384-32.256-31.232-80.998-37.888-123.904-0.41-2.56-0.922-5.427-1.126-6.554-0.512-2.765-4.301-35.021-4.915-41.574-0.717-8.090-1.843-33.69-2.048-45.056l-0.102-9.728h281.6l-0.102 5.12c-0.205 10.65-1.536 43.11-1.843 46.592-0.307 1.946-0.717 6.554-1.024 10.138-5.427 59.597-19.558 114.995-40.55 159.642l-5.018 10.65-4.403-2.765c-14.029-8.499-32.358-16.384-47.411-20.070-27.853-7.066-62.054-6.144-89.293 2.253-12.595 3.891-30.515 12.186-40.448 18.739l-2.765 1.843-2.662-5.325zM444.518 412.672c-18.125-18.125-40.346-30.925-64.205-36.864-23.347-5.734-39.014-6.042-68.096-0.922l-3.686 0.614-1.741-5.939c-9.216-30.822-16.384-62.976-19.661-87.962-0.307-2.765-0.819-5.837-0.922-6.758-0.205-0.922-0.819-7.066-1.536-13.824-0.614-6.656-1.331-13.517-1.536-15.258-0.41-3.072-1.331-24.166-1.946-43.827l-0.307-9.933 128.102 0.512 0.205 9.216c0.307 20.685 1.536 41.677 4.096 66.56 3.994 39.526 15.667 90.726 28.57 125.44 5.12 13.619 9.626 24.576 11.059 26.419 2.253 2.97-0.307 0.614-8.397-7.475zM838.349 361.37c-18.125-10.752-39.219-16.077-61.542-15.36-18.33 0.512-31.949 3.891-47.923 11.878-9.011 4.506-9.83 4.71-9.011 2.662 3.789-10.138 12.288-51.098 15.36-74.854 1.126-8.397 2.253-16.486 2.56-17.92 0.205-1.434 0.717-6.656 1.126-11.776 0.307-5.018 0.819-9.933 0.922-10.854 0.41-2.15 1.843-33.587 1.946-44.442l0.102-8.192h128l-0.102 5.632c-0.102 9.318-1.434 42.291-1.843 45.568-0.205 1.741-0.717 6.554-1.024 10.752-1.741 20.787-6.246 49.254-10.957 70.656-3.891 17.101-10.138 39.936-11.059 39.936-0.307-0.102-3.277-1.638-6.554-3.686zM254.771 262.144c-1.946-1.331-7.373-4.301-11.878-6.656-24.474-12.288-52.838-15.36-79.667-8.602-3.686 0.922-6.861 1.434-7.066 1.229-1.229-1.229-2.56-20.992-2.97-43.622l-0.205-12.493 102.4 0.512 0.205 11.264c0.205 14.336 1.229 33.587 2.458 48.538 0.614 6.451 0.922 11.776 0.717 11.981s-1.946-0.717-3.994-2.15z" />
+<glyph unicode="&#xe9e2;" glyph-name="Fast_delivery" d="M51.2 751.616c0-6.042 3.072-18.944 6.246-26.419 9.933-23.347 31.13-40.55 55.91-45.363 6.451-1.229 31.027-1.434 153.805-1.434 164.659 0 152.269 0.614 160.461-7.885 10.035-10.24 9.933-25.395-0.205-35.533-8.397-8.397 6.656-7.782-182.477-7.782h-168.243l0.614-7.885c3.174-34.611 30.31-62.771 66.048-68.301 1.946-0.307 63.283-0.614 136.294-0.614 149.402 0 139.571 0.512 147.661-7.68 7.27-7.168 9.421-15.667 6.451-25.498-2.15-7.168-6.144-11.674-13.312-15.053l-6.246-2.97h-312.115l0.614-6.554c3.072-32.358 24.576-58.163 56.627-67.891 5.632-1.638 15.462-1.843 131.482-2.355 140.595-0.614 129.024 0.102 137.114-8.192 9.626-9.933 9.421-25.088-0.41-35.226-7.885-8.192-1.536-7.782-118.989-7.782h-103.834l0.41-79.053c0.205-59.802 0.614-80.282 1.638-83.763 0.717-2.56 1.434-5.427 1.638-6.451 1.126-5.53 6.349-19.661 8.602-23.245 0.922-1.434 2.458-4.198 3.482-6.144 2.97-5.837 11.981-17.51 19.046-24.474 30.208-29.696 75.059-40.243 115.814-27.238 38.912 12.39 70.042 47.104 77.414 86.221 1.741 9.523 2.15 12.595 2.355 17.51l0.102 3.277h204.39l1.229-10.65c8.397-72.192 81.203-118.784 150.221-96.154 43.52 14.234 74.957 53.76 78.95 99.43l0.717 7.373h102.093v100.557c0 83.558-0.307 101.581-1.536 106.189-4.301 16.589-15.974 29.594-32.461 36.25-5.222 2.048-7.475 2.15-49.869 2.765l-44.339 0.512-77.722 129.536c-51.098 85.197-79.258 131.174-82.33 134.451-5.427 5.734-13.107 10.752-21.504 14.131l-6.144 2.458-605.696 0.512v-3.584z" />
+<glyph unicode="&#xe9e3;" glyph-name="Favorite-music" d="M503.091 865.075c-4.813-10.035-10.957-22.835-13.619-28.467s-7.782-16.179-11.264-23.552c-3.482-7.27-9.011-18.842-12.288-25.6s-9.114-18.944-13.005-27.136c-11.674-24.166-25.088-51.917-37.683-78.336-2.97-6.144-9.216-19.046-13.824-28.672-4.608-9.523-10.138-21.197-12.39-25.702-4.506-9.421-5.427-10.035-16.896-11.674-14.848-2.048-290.816-48.23-292.454-48.947-1.434-0.614 1.024-3.174 11.776-12.698 7.475-6.554 14.746-13.005 16.179-14.336 5.427-4.915 11.059-9.83 23.962-21.299 7.27-6.451 14.95-13.21 16.896-14.95 1.946-1.843 16.998-15.155 33.28-29.594 16.384-14.541 31.539-28.058 33.792-30.106 6.144-5.53 18.125-16.179 53.76-47.718 17.715-15.77 33.382-29.594 34.714-30.925 1.741-1.536 2.458-3.277 2.458-5.632 0-1.843-3.789-18.33-8.397-36.659s-8.602-33.997-8.806-34.816c-1.536-6.451-5.939-24.064-7.168-28.672-1.331-4.71-21.402-85.197-22.528-90.112-0.205-0.819-6.656-26.522-14.234-57.037-7.68-30.413-13.926-56.013-13.926-56.627 0-0.922 0.717-0.819 2.355 0.307 2.355 1.536 23.552 13.312 38.093 21.197 4.506 2.458 17.613 9.523 29.184 15.872s23.962 13.107 27.648 15.053c3.686 2.048 43.93 23.962 89.6 48.947 98.099 53.555 92.262 50.483 95.642 49.869 1.434-0.307 16.282-7.987 32.87-17.101 33.792-18.534 85.606-46.797 94.208-51.507 3.072-1.638 7.987-4.301 10.752-5.837 12.288-6.758 15.77-8.704 22.016-12.083 39.526-21.402 117.555-64.102 118.579-64.922 0.819-0.717 1.229-0.717 1.229 0.205 0 0.614-11.571 47.411-25.702 103.731-14.131 56.422-26.112 104.243-26.522 106.189-1.024 4.915-21.094 83.456-22.63 88.678-1.946 6.656-0.819 8.704 11.162 18.944 6.042 5.222 11.162 9.728 11.469 10.138 0.307 0.307 6.963 6.246 14.848 13.21 7.885 7.066 17.818 15.872 22.016 19.558 4.198 3.789 20.787 18.534 36.864 32.768s32.666 28.979 36.864 32.768c9.933 8.806 37.274 33.178 47.104 41.882 7.066 6.246 15.462 13.722 36.147 32.256 4.403 3.891 8.704 7.68 9.728 8.397 1.126 0.819 1.434 1.638 0.717 2.253-0.819 0.819-23.859 5.018-50.176 9.114-2.355 0.307-85.811 14.234-97.792 16.179-6.861 1.126-50.893 8.499-98.816 16.384-29.286 4.813-54.477 9.318-56.115 9.933-2.867 1.126-4.608 4.403-21.709 40.243-5.939 12.493-13.21 27.648-23.552 49.152-3.789 7.885-9.318 19.456-12.288 25.6-2.97 6.246-8.499 17.715-12.288 25.6s-9.523 19.866-12.8 26.624c-3.277 6.758-9.728 20.173-14.336 29.696-4.608 9.626-10.445 21.606-12.8 26.624-12.493 26.317-19.968 41.472-20.48 41.472-0.307 0-4.506-8.192-9.421-18.125zM611.942 557.773c5.12-2.56 9.216-7.27 11.981-13.517 2.048-4.506 2.048-6.758 2.048-94.208-0.102-89.498-0.102-89.6-2.355-96.256-5.12-15.258-15.462-25.395-29.901-29.286-39.731-10.752-70.861 34.714-47.821 69.632 7.782 11.674 20.685 18.637 36.147 19.558 3.379 0.205 6.554 0.41 6.861 0.41 0.614 0.102 0.819 80.998 0.205 80.998-0.205 0-6.144-1.638-13.414-3.686-7.168-2.048-13.722-3.891-14.541-3.994-0.819-0.205-3.789-1.024-6.656-1.843-2.765-0.819-10.65-2.97-17.408-4.71-36.045-9.728-67.789-18.637-69.12-19.354-1.229-0.819-1.536-11.366-1.638-78.643-0.102-76.39-0.102-77.824-2.253-84.48-5.53-16.998-20.48-28.979-37.581-30.31-16.589-1.331-31.949 6.144-40.55 19.456-5.222 8.090-7.168 14.746-7.168 24.781 0 21.504 11.776 37.888 31.846 44.442 1.946 0.614 6.963 1.331 11.059 1.536 4.198 0.307 7.885 0.717 8.192 1.126 0.41 0.41 0.717 35.43 0.717 77.926 0 67.072 0.205 77.312 1.536 78.541 0.819 0.819 13.107 4.608 27.136 8.397 14.131 3.789 38.298 10.24 53.76 14.438s29.798 7.987 31.744 8.602c36.864 10.65 47.821 13.21 55.296 12.902 5.325-0.205 9.011-0.922 11.878-2.458z" />
+<glyph unicode="&#xe9e4;" glyph-name="favourite" d="M506.368 854.323c-2.15-4.71-7.987-16.794-12.902-26.931-12.902-26.931-19.968-41.472-26.522-55.296-3.277-6.758-9.421-19.661-13.824-28.672-4.301-9.011-9.83-20.48-12.288-25.6-2.355-5.018-8.192-16.998-12.8-26.624-4.608-9.523-10.854-22.426-13.824-28.672-2.97-6.144-8.499-17.715-12.288-25.6s-9.626-19.968-12.902-26.829c-4.608-9.83-6.451-12.595-8.294-13.005-1.741-0.41-78.029-13.005-93.491-15.565-2.355-0.307-14.234-2.355-17.92-3.072-1.434-0.205-4.813-0.717-7.68-1.024-2.765-0.41-5.427-0.819-5.734-1.024-0.41-0.205-2.458-0.614-4.608-0.922-2.253-0.41-9.523-1.536-16.282-2.662s-13.517-2.253-15.053-2.458c-1.638-0.307-4.096-0.717-5.632-1.024-1.638-0.205-8.397-1.331-15.155-2.458s-22.221-3.686-34.304-5.734c-21.094-3.482-24.166-3.994-30.413-5.018-1.638-0.307-7.27-1.229-12.595-2.15s-10.854-1.843-12.288-2.048c-5.325-0.819-29.286-4.71-31.539-5.222-2.15-0.41-1.946-0.819 2.662-4.813 2.765-2.355 9.318-8.192 14.643-12.902 5.325-4.813 12.8-11.469 16.691-14.848 3.789-3.482 7.987-7.168 9.216-8.294 1.331-1.126 4.096-3.686 6.349-5.632s7.885-7.066 12.698-11.264c4.813-4.198 13.312-11.776 18.944-16.896 5.632-5.018 13.722-12.186 17.818-15.872 4.198-3.686 9.728-8.499 12.288-10.854 2.56-2.253 11.878-10.547 20.582-18.33 8.704-7.68 17.51-15.565 19.456-17.306s11.674-10.342 21.504-19.046c9.83-8.704 18.125-16.077 18.432-16.384s6.554-5.837 13.824-12.288c7.373-6.451 13.824-12.186 14.438-12.8 0.614-0.512 2.765-2.458 4.813-4.301l3.789-3.277-30.72-123.187c-16.896-67.789-31.13-124.826-31.744-126.771-0.512-1.946-3.789-14.848-7.27-28.672-3.379-13.824-6.451-25.907-6.656-26.931-0.614-1.843 3.789 0.205 16.486 7.475 1.741 1.024 6.349 3.482 10.24 5.632 3.994 2.15 9.523 5.12 12.288 6.656 2.867 1.536 20.582 11.264 39.424 21.504 44.954 24.474 42.803 23.347 55.808 30.413 6.246 3.482 14.029 7.68 17.408 9.523s8.499 4.608 11.264 6.144c10.854 5.939 39.322 21.402 47.104 25.6 4.506 2.458 8.704 4.71 9.216 5.12 0.614 0.41 5.632 3.174 11.264 6.144s10.752 5.734 11.264 6.144c0.614 0.41 5.222 2.97 10.24 5.632 5.12 2.662 13.21 7.168 18.125 9.933 5.018 2.765 9.83 5.12 10.752 5.12 1.024 0.102 11.264-5.12 22.835-11.469 11.571-6.246 23.757-13.005 27.136-14.848s24.166-13.107 46.080-25.088c63.386-34.611 117.146-63.898 125.44-68.403 4.198-2.253 19.456-10.65 33.792-18.432 14.336-7.885 26.214-14.234 26.317-14.131s-17.101 69.018-38.093 153.19l-38.4 153.088 5.427 5.12c2.867 2.867 8.704 8.090 12.902 11.776 9.114 7.987 27.034 23.859 27.75 24.576 0.307 0.307 6.246 5.632 13.312 11.776 7.066 6.246 13.005 11.469 13.312 11.776s10.854 9.728 23.552 20.992c12.698 11.264 23.245 20.685 23.552 20.992s6.554 5.837 13.824 12.288c7.373 6.451 13.517 11.981 13.824 12.288s4.403 3.994 9.216 8.192c4.71 4.198 9.216 8.192 9.83 8.704 0.614 0.614 4.506 4.096 8.704 7.782 47.309 41.984 54.272 48.333 53.453 49.050-0.41 0.41-5.837 1.434-12.083 2.458-6.144 0.922-16.589 2.56-23.040 3.686s-17.306 2.867-24.064 3.994c-6.758 1.126-23.45 3.891-37.069 6.144-13.722 2.355-35.942 6.042-49.459 8.294s-35.635 5.939-49.152 8.192c-13.517 2.253-35.738 5.939-49.357 8.192-13.722 2.355-32.87 5.53-42.598 7.066-9.83 1.638-18.125 3.277-18.637 3.789-0.41 0.512-5.939 11.571-12.083 24.474-6.144 13.005-15.258 31.846-20.173 41.984s-11.162 23.040-13.824 28.672c-2.662 5.632-7.987 16.691-11.776 24.576-9.011 18.842-17.51 36.352-36.864 76.8-2.97 6.246-9.728 20.275-15.053 31.232s-11.469 23.757-13.619 28.467c-2.253 4.608-4.301 8.397-4.608 8.397s-2.355-3.789-4.608-8.397z" />
+<glyph unicode="&#xe9e5;" glyph-name="Featured" d="M485.376 857.293c-0.307-0.307-6.246-0.717-13.312-1.126-13.722-0.614-39.629-3.789-52.224-6.349-9.83-2.048-25.088-7.066-29.491-9.83-1.843-1.126-3.994-3.072-4.813-4.301-0.717-1.126-18.637-47.514-39.731-103.014s-46.080-121.139-55.501-145.92c-9.523-24.781-20.173-52.838-23.757-62.464-17.408-45.875-84.48-222.003-109.67-287.744l-28.16-73.728v-9.216c-0.102-10.138 1.434-14.746 7.68-23.859 15.155-22.323 56.627-44.339 112.947-60.109 21.504-6.042 55.091-13.414 76.595-16.794 3.789-0.614 9.728-1.638 13.312-2.15 5.734-0.922 23.859-3.277 35.533-4.71 2.56-0.205 6.246-0.717 8.192-0.922 1.946-0.307 6.861-0.717 10.752-1.024 3.994-0.307 9.216-0.819 11.776-1.126 10.445-1.126 30.208-2.355 52.224-3.482 16.486-0.717 107.213-0.512 118.784 0.41 3.686 0.307 11.059 0.819 16.384 1.126s12.083 0.819 14.848 1.024c16.384 1.331 20.685 1.741 23.040 2.048 1.434 0.205 5.837 0.614 9.728 1.024 11.059 0.922 36.25 4.403 53.76 7.168 128.307 20.89 205.926 61.44 201.318 105.165-0.307 3.174-2.15 9.933-4.096 14.848-4.506 11.469-18.432 48.026-26.726 69.939-7.782 20.787-28.365 74.752-44.544 117.248-6.656 17.51-26.522 69.53-44.032 115.712s-32.256 84.89-32.768 86.016c-0.512 1.126-6.656 17.51-13.824 36.352-7.066 18.842-13.414 35.43-13.926 36.864-0.614 1.434-3.789 9.728-7.066 18.432s-6.451 16.998-7.066 18.432c-2.765 6.451-61.542 161.792-61.542 162.714 0 1.536-5.939 6.042-10.752 8.294-12.493 5.632-34.406 10.035-66.56 13.312-10.854 1.126-76.39 2.56-77.312 1.741zM517.632 487.731c2.765-5.837 11.878-24.576 20.275-41.779s18.534-37.888 22.426-46.080c3.891-8.192 7.27-15.053 7.475-15.258 0.41-0.41 12.493-2.662 18.944-3.584 2.56-0.307 11.571-1.741 19.968-3.174 13.824-2.355 18.022-3.072 24.576-4.096 1.126-0.205 6.656-1.126 12.288-2.048 5.632-1.024 11.674-1.946 13.312-2.253 3.174-0.41 24.576-3.994 29.184-4.813 1.434-0.205 5.222-0.819 8.499-1.126 3.174-0.41 6.042-1.126 6.349-1.536 0.512-0.819-2.765-3.789-44.032-39.936-16.282-14.234-31.539-27.546-33.792-29.594-4.608-4.096-20.275-17.715-20.89-18.227-0.614-0.41 2.048-11.571 18.227-75.162 7.885-31.334 14.438-57.242 14.438-57.549s-7.168 3.379-15.974 8.090c-8.806 4.813-20.89 11.264-26.931 14.438-5.939 3.174-11.264 6.042-11.878 6.451-0.512 0.41-6.042 3.379-12.288 6.656-6.144 3.277-12.595 6.758-14.336 7.68-3.789 2.15-12.8 7.066-27.648 14.848-6.144 3.277-11.776 6.349-12.39 6.758-0.717 0.614-15.36-6.758-38.4-19.149-72.704-39.219-85.914-46.285-85.914-45.773 0 0.205 6.963 27.955 15.565 61.542 8.499 33.587 15.974 63.283 16.589 65.946l1.024 4.813-3.994 3.379c-2.253 1.843-6.349 5.53-9.216 8.090-2.765 2.56-10.65 9.421-17.408 15.258-6.758 5.939-12.493 10.957-12.8 11.264s-5.837 5.12-12.288 10.752c-6.451 5.632-11.981 10.445-12.288 10.752s-7.578 6.656-16.077 14.234c-8.602 7.475-15.36 14.029-15.053 14.541s1.434 0.922 2.56 0.922c1.946 0 65.536 10.24 76.186 12.186 2.867 0.614 7.168 1.331 9.728 1.741 2.56 0.307 5.53 0.819 6.656 1.024s5.018 0.922 8.704 1.434c3.686 0.614 7.782 1.331 9.114 1.536s4.403 0.717 6.656 1.024c2.355 0.41 5.12 0.819 6.246 1.024s3.072 0.41 4.403 0.41c1.946 0.102 3.686 2.867 11.366 18.842 5.018 10.24 13.926 28.57 19.763 40.653 5.939 12.083 14.438 29.491 18.842 38.707 4.403 9.114 8.294 16.589 8.704 16.589 0.307 0 2.867-4.71 5.53-10.445zM375.091 191.283c-6.349-25.293-11.571-47.923-11.571-50.381 0-6.451 1.843-11.878 5.939-16.486 5.325-6.246 10.547-8.602 19.149-8.704 6.144 0 8.090 0.512 13.619 3.277 7.578 3.891 20.89 11.059 25.293 13.619 1.741 0.922 6.963 3.891 11.776 6.451 4.813 2.458 22.938 12.288 40.346 21.606s31.949 16.998 32.461 16.998c0.717 0 8.090-3.789 16.794-8.704 2.253-1.229 8.704-4.71 14.336-7.68s12.902-6.963 16.179-8.806c3.277-1.946 6.144-3.482 6.246-3.482 0.205 0 13.517-7.066 29.491-15.667 16.077-8.704 30.618-16.282 32.563-16.896 8.909-3.174 20.275 0.205 26.829 7.885 4.506 5.325 6.349 11.571 5.632 19.251-0.307 3.277-5.632 25.702-11.776 49.869l-11.264 43.827 8.397-0.614c4.506-0.41 9.728-0.922 11.366-1.126 1.741-0.205 5.837-0.614 9.216-1.024 7.373-0.819 21.709-2.867 43.008-6.144 20.685-3.277 57.549-12.083 76.288-18.227 37.581-12.39 59.392-28.467 59.392-43.622-0.102-17.92-27.034-35.123-76.8-49.050-18.432-5.222-47.309-11.366-65.946-14.029-2.15-0.307-4.915-0.717-6.144-1.024-2.15-0.41-3.174-0.614-17.51-2.458-8.192-1.126-13.312-1.741-22.016-2.662-2.56-0.307-6.451-0.717-8.704-1.024s-7.27-0.717-11.264-1.024c-3.891-0.307-9.011-0.819-11.264-1.024s-8.499-0.717-13.824-1.024c-5.325-0.41-11.776-0.922-14.336-1.024-33.792-2.662-138.445-2.662-169.472-0.102-2.253 0.205-8.909 0.717-14.848 1.126-10.547 0.614-16.794 1.126-25.088 2.048-2.253 0.205-6.861 0.717-10.24 1.024-18.125 1.843-22.016 2.253-42.496 5.222-59.699 8.704-107.52 22.016-132.915 37.069-14.234 8.499-22.733 18.842-22.733 27.853 0 20.070 37.274 40.755 97.792 54.272 4.506 1.024 10.24 2.355 12.8 2.867 5.222 1.229 38.4 6.963 44.544 7.782 2.253 0.307 9.421 1.229 15.872 2.15 21.402 2.765 26.010 3.277 31.334 3.482l5.12 0.102-11.571-45.773z" />
+<glyph unicode="&#xe9e6;" glyph-name="filter" d="M141.312 881.562c-19.251-5.12-34.406-20.992-37.786-39.731-0.717-3.686-1.126-21.914-1.126-46.387v-40.243l332.8-332.8v-256l153.6-153.6v409.6l332.8 332.8v40.243c0 24.474-0.41 42.701-1.126 46.387-3.482 18.944-18.534 34.714-38.093 39.936-8.192 2.15-732.877 1.946-741.069-0.205z" />
+<glyph unicode="&#xe9e7;" glyph-name="Filter_effects" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM512 800.768v-31.334l-28.774 28.774c-15.872 15.77-28.672 28.877-28.467 29.184 0.717 0.614 15.258 2.458 25.498 3.174 5.325 0.41 9.83 0.717 9.933 0.819 0.205 0.102 5.12 0.307 11.059 0.512l10.752 0.205v-31.334zM453.837 755.405l58.163-58.266v-72.499l-83.866 83.866c-46.182 46.182-83.763 84.275-83.456 84.685 1.331 2.15 45.773 20.275 49.971 20.378 0.512 0 27.136-26.214 59.187-58.163zM404.992 659.046l107.008-107.008v-35.635c0-19.558-0.205-35.635-0.41-35.635s-57.651 57.242-127.59 127.181l-127.181 127.181 3.994 3.379c11.059 9.523 36.045 28.262 36.864 27.648 0.102-0.102 48.435-48.333 107.315-107.11zM366.797 552.755l145.203-145.203v-72.704l-160.768 160.768c-88.371 88.474-160.768 161.178-160.768 161.69 0 2.355 28.774 40.55 30.515 40.55 0.41 0 66.048-65.331 145.818-145.101zM338.33 436.122l173.67-173.568v-71.885l-2.662 2.458c-13.107 12.288-364.954 365.056-364.954 365.875 0.102 4.506 18.227 50.79 19.968 50.79 0.205 0 78.541-78.131 173.978-173.67zM512 90.829v-26.931l-9.626 0.205-9.626 0.307-364.646 364.646 0.102 19.968c0.102 18.432 0.717 29.798 2.355 43.93l0.717 5.53 380.723-380.723v-26.931zM340.378 144.589c48.333-48.333 64.614-65.126 62.464-64.614-14.438 3.379-44.544 15.36-64.922 25.805-64.307 32.87-117.146 82.125-155.136 144.589-15.053 24.781-33.382 66.355-38.81 88.474-0.512 2.048 17.101-14.95 65.126-62.976 36.25-36.25 95.232-95.334 131.277-131.277z" />
+<glyph unicode="&#xe9e8;" glyph-name="finance" d="M634.368 783.053c-5.734-0.614-13.722-3.277-26.317-9.011-6.963-3.174-23.654-10.752-37.171-16.794s-33.997-15.258-45.568-20.48c-11.571-5.222-27.443-12.39-35.328-15.872-7.885-3.584-21.504-9.626-30.208-13.619-8.704-3.891-26.726-11.981-39.936-17.92-13.21-5.837-26.624-11.878-29.696-13.312-5.12-2.355-56.525-25.6-93.901-42.291-34.202-15.36-62.054-27.853-70.963-31.846-3.686-1.741-32.666-14.746-64.512-28.979-31.846-14.336-60.416-27.75-63.59-29.798-15.565-10.445-24.269-30.208-21.504-48.845 1.126-7.27 3.379-13.414 13.926-36.557 2.662-5.837 37.786-83.763 41.984-93.184 1.434-3.379 3.584-7.987 4.608-10.24 0.922-2.253 9.011-20.173 17.92-39.936 8.806-19.661 17.203-38.4 18.637-41.472s4.301-9.523 6.451-14.336c4.915-11.059 16.384-36.659 19.763-44.032 1.434-3.072 7.987-17.613 14.541-32.256 15.462-34.509 14.643-32.768 18.842-38.4 5.018-6.656 11.776-12.083 19.046-15.36 5.53-2.56 15.872-5.427 16.691-4.71 0.102 0.205-1.331 3.277-3.277 6.963-1.946 3.584-4.608 10.24-5.837 14.746l-2.458 8.090v192c0 181.555 0.102 192.307 1.843 198.451 6.554 22.938 22.426 41.677 43.315 50.893 14.95 6.554-4.813 6.042 235.008 6.656l217.6 0.512-14.029 31.232c-7.782 17.203-15.053 33.28-16.179 35.84-4.096 9.114-17.306 38.502-19.354 43.008-1.126 2.56-6.042 13.619-10.957 24.576-9.728 21.504-12.288 25.907-19.046 32.563-9.728 9.318-26.522 15.053-40.346 13.722zM323.584 575.283c-1.434-0.205-5.734-1.638-9.523-3.072-14.95-5.53-26.624-18.842-30.925-35.226-2.253-8.294-2.253-374.477 0-382.771 3.584-13.722 14.746-27.853 26.317-33.28 13.005-6.144-8.909-5.734 305.254-5.734 246.272 0 288.768 0.205 293.478 1.536 16.896 4.403 29.901 16.282 36.147 32.87l2.355 6.042 0.307 186.368c0.205 135.68 0 188.006-0.819 192.512-3.686 19.046-18.739 34.816-38.4 40.038-4.198 1.126-56.013 1.434-293.376 1.229-158.515 0-289.382-0.307-290.816-0.512zM882.995 521.318c2.662-1.536 6.042-4.403 7.373-6.144 5.222-6.758 5.632-10.035 5.632-39.629v-27.546h-563.2v27.955c0.102 19.968 0.512 28.877 1.434 31.539 2.662 7.475 9.523 14.131 16.794 16.282 1.536 0.512 120.73 0.819 264.909 0.717l262.144-0.205 4.915-2.97zM895.795 277.811l-0.307-93.491-2.765-4.71c-3.072-5.222-8.499-9.83-14.029-11.776-2.97-1.126-54.784-1.331-263.885-1.434-291.942 0-265.933-0.717-274.33 7.68-8.090 7.987-7.68 2.662-7.68 105.677v91.443h563.302l-0.307-93.389zM401.101 267.162c-9.421-2.867-17.101-13.722-17.101-23.962 0-10.138 7.475-20.685 16.896-23.859 4.198-1.434 9.626-1.741 34.714-1.741 32.154 0.102 34.099 0.307 40.96 5.632 15.565 11.878 11.264 37.581-7.27 43.93-6.758 2.355-60.723 2.253-68.198 0zM530.534 267.776c-4.915-1.126-11.469-6.246-14.746-11.469-8.294-13.21-1.536-32.051 13.107-36.966 7.066-2.458 61.44-2.56 68.198-0.205 6.144 2.15 10.65 5.939 13.926 11.571 2.458 4.096 2.867 5.939 2.765 12.493 0 8.806-1.434 12.288-7.578 18.432-6.554 6.554-10.24 7.168-43.418 7.066-15.872-0.102-30.31-0.512-32.256-0.922zM659.968 268.083c-4.403-0.922-11.059-5.018-13.926-8.397-8.499-10.342-7.782-25.19 1.843-34.509 7.578-7.373 9.83-7.782 45.568-7.373 30.925 0.307 31.027 0.307 35.533 2.867 7.475 4.301 11.981 11.059 13.005 19.763 1.331 11.059-5.018 21.811-15.565 26.419-4.301 1.741-7.066 1.946-34.509 1.843-16.486-0.102-30.822-0.307-31.949-0.614z" />
+<glyph unicode="&#xe9e9;" glyph-name="fire" d="M494.592 875.725c-27.341-21.709-47.309-48.538-58.47-78.131-3.891-10.342-8.294-27.341-9.523-36.762-1.638-12.493-1.843-16.486-1.843-28.16 0-32.666 5.632-62.874 18.842-100.352 2.253-6.451 5.427-15.667 7.168-20.48 3.686-10.65 4.71-26.317 2.355-36.352-2.253-9.523-9.011-21.811-16.486-30.003-10.65-11.674-30.515-23.757-39.014-23.757-2.15 0-2.458 0.41-2.048 2.355 0.307 1.229 1.741 7.373 3.277 13.517 5.018 20.992 4.198 48.845-2.048 68.403-2.765 8.397-8.704 22.118-12.698 28.877-5.53 9.523-18.944 27.136-19.968 26.010-0.205-0.205 0.41-5.018 1.434-10.65 4.71-25.805-2.867-42.394-35.84-79.36-43.213-48.333-55.501-64.819-69.632-93.798-6.656-13.312-15.462-37.274-16.896-45.363-0.307-1.946-0.819-3.789-1.024-4.198-0.512-0.922-4.403-23.45-5.222-30.72-2.15-18.739-0.614-52.019 3.277-70.554 5.939-29.184 19.968-64 32.973-82.432 24.371-34.304 74.752-75.469 82.637-67.482 1.946 1.843 1.946 4.096 0 9.626-6.349 17.92-9.626 47.002-7.168 63.898 2.458 17.101 5.837 28.57 12.288 41.984 5.632 11.776 10.854 19.558 19.661 29.184 11.059 12.186 23.859 21.811 41.267 30.925 48.026 25.088 78.95 56.934 91.034 93.594l2.97 9.114 4.608-9.728c9.216-19.456 11.981-31.437 11.571-50.995-0.41-18.739-3.584-33.178-11.776-53.658-8.499-21.504-24.986-49.152-44.237-74.65-24.678-32.563-37.581-66.253-41.574-108.442-0.922-10.24-0.922-36.25 0-47.104 3.482-39.117 15.258-78.746 27.648-92.774 8.602-9.83 11.776-4.506 12.083 20.582 0.102 7.885 0.819 17.51 1.638 21.299 6.963 33.69 31.539 64.717 74.547 94.106 11.162 7.68 28.467 18.534 37.376 23.552 25.907 14.541 70.144 41.882 86.221 53.146 64.922 45.978 98.714 102.4 110.899 185.242 2.15 14.541 2.458 19.763 2.15 37.888-0.205 11.571-0.614 22.118-0.922 23.552s-0.819 4.813-1.229 7.475c-6.349 50.176-33.894 107.315-71.885 148.89-7.27 7.987-18.33 17.51-19.251 16.589-0.205-0.307 0.512-2.56 1.638-5.018 6.554-14.336 9.626-36.966 9.626-69.632 0-36.147-4.198-68.403-11.674-88.883-9.523-26.214-30.515-51.302-56.422-67.277-4.198-2.458-7.68-4.403-7.885-4.198s1.638 3.789 4.096 7.885c23.040 39.117 32.666 89.19 28.979 151.45-1.331 23.859-5.53 38.81-18.022 64-15.77 32.154-38.912 65.741-86.221 125.030-29.184 36.762-34.714 44.954-42.803 63.693-6.861 15.872-9.523 28.16-9.626 43.93-0.102 7.475-0.102 13.619-0.102 13.619-0.102 0-4.915-3.789-10.752-8.499z" />
+<glyph unicode="&#xe9ea;" glyph-name="Fire_extinguisher" d="M368.64 881.562c-19.763-4.198-37.376-16.179-48.538-33.075-16.691-25.293-17.101-57.651-0.819-83.046 2.662-4.301 3.789-6.758 2.97-7.066-0.717-0.205-6.758-3.072-13.517-6.349-81.51-39.629-139.571-117.453-154.214-206.95-3.072-18.432 4.915-34.202 21.094-42.291 5.53-2.662 7.168-2.97 15.872-3.072 11.162 0 15.974 1.536 24.166 7.68 7.27 5.427 11.366 12.288 13.824 23.142 4.915 21.299 8.499 34.304 12.288 43.93 22.733 57.242 70.246 101.376 129.843 120.32 5.222 1.741 10.24 3.072 10.957 3.072 1.126 0 1.434-2.765 1.434-13.517v-13.619l-6.451-1.843c-8.090-2.458-27.648-11.674-37.581-17.92-10.035-6.246-22.323-16.077-31.334-25.19-23.654-23.859-39.014-50.893-47.104-82.739-5.632-22.221-5.427-9.83-5.427-281.907-0.102-282.931-0.819-257.843 7.578-266.24 8.294-8.294-5.222-7.782 173.056-7.475l158.72 0.307 5.018 2.56c2.765 1.434 6.349 4.198 7.987 6.144 6.451 7.782 6.042-10.854 5.632 269.414-0.307 236.032-0.41 256-2.048 264.090-13.005 64.512-53.862 113.766-113.357 136.704-9.216 3.584-25.395 8.090-33.178 9.216l-4.71 0.717v27.443h102.4v-25.395l2.867-0.614c1.536-0.307 8.294-1.536 15.053-2.662 6.758-1.024 23.552-3.891 37.376-6.144 27.238-4.506 42.496-7.066 61.235-10.138 6.554-1.126 31.539-5.325 55.501-9.318s46.080-7.68 49.152-8.192c3.072-0.512 16.896-2.765 30.72-5.12s30.413-5.12 36.864-6.144c6.451-1.024 13.312-2.253 15.155-2.662l3.277-0.614v230.912l-3.277-0.717c-2.97-0.614-32.973-5.632-54.784-9.318-1.638-0.205-5.632-0.922-9.011-1.434-8.192-1.434-70.963-11.878-89.6-14.95-83.456-13.824-108.749-18.022-113.152-18.944-2.765-0.512-11.059-1.946-18.432-3.072-7.27-1.126-14.541-2.355-16.077-2.662l-2.867-0.614v-25.395h-102.4v16.384c0 11.059-0.512 19.046-1.638 24.371-5.939 28.672-27.546 51.61-55.706 59.187-8.704 2.253-26.214 2.662-34.816 0.819zM395.981 828.826c13.005-6.758 17.408-24.166 9.216-36.454-11.776-17.51-38.707-14.029-45.261 5.734-7.168 21.811 15.565 41.165 36.045 30.72z" />
+<glyph unicode="&#xe9eb;" glyph-name="Firewall" d="M492.032 904.806c-12.595-6.861-21.197-13.414-32.768-25.088-20.992-21.197-34.611-46.49-42.803-79.974-6.246-25.19-7.782-42.086-7.27-79.872 0.205-18.125-0.102-33.28-0.717-36.864-3.174-18.739-13.107-39.219-28.365-58.368-6.144-7.68-19.558-22.016-20.685-22.016-0.307 0 0.41 4.301 1.741 9.523 8.602 33.894 6.042 65.946-7.578 93.286-5.939 12.186-12.288 20.89-22.221 30.925-6.963 6.861-22.938 19.456-23.654 18.637-0.205-0.205 0.41-3.994 1.229-8.499 3.482-20.275 1.126-41.37-6.963-60.314-4.915-11.571-10.547-21.299-24.986-43.11-19.456-29.491-23.245-35.738-29.491-48.742-14.848-30.72-19.456-56.422-16.691-93.082 0.307-4.813 0.819-9.83 1.126-11.264s0.819-4.198 1.126-6.144c5.12-32.154 20.070-65.536 40.755-91.136 13.926-17.101 34.816-35.328 54.989-47.923 10.138-6.246 29.798-15.872 40.858-19.968 15.77-5.734 14.746-6.042 10.24 3.072-2.15 4.403-5.222 12.186-6.758 17.203-2.56 8.192-2.867 10.854-2.867 24.064 0 19.968 3.277 31.539 13.722 48.64 6.451 10.547 10.65 15.462 32.358 36.864 24.986 24.678 35.84 38.605 45.773 58.368 9.421 18.944 14.234 41.574 11.981 56.525-0.41 2.458-0.41 4.096 0 3.686 1.024-1.024 11.776-28.262 13.312-33.587 0.614-2.253 1.843-6.349 2.662-9.216 5.222-17.92 6.861-40.755 4.096-54.682-4.198-20.787-10.445-31.539-37.99-66.15-18.227-22.835-24.986-34.099-30.72-50.995-16.896-50.586-2.867-115.61 39.117-180.122 3.482-5.427 6.861-10.138 7.475-10.547s1.024 0.717 1.126 2.765c0 1.843 0.205 4.096 0.307 4.915 0.205 0.819 0.614 4.096 1.024 7.168 2.765 21.914 14.541 45.158 30.413 59.904 14.336 13.414 27.238 21.402 66.458 41.062 42.189 21.197 49.357 25.6 70.144 42.291 49.254 39.731 82.842 79.667 103.936 123.494 10.957 22.733 18.227 47.718 21.299 72.704 1.331 11.571 0.717 43.315-1.229 55.296-8.192 51.2-30.925 98.714-69.018 144.794-10.445 12.595-28.877 32.154-29.594 31.437-0.307-0.307 0.922-4.71 2.56-10.035 8.090-25.19 11.469-46.49 10.957-70.451-0.717-39.526-11.366-69.325-36.045-101.683-10.854-14.131-35.021-35.226-50.176-43.827l-5.427-2.97 4.198 6.349c25.293 38.912 32.563 93.184 18.739 140.8-9.114 31.539-23.45 56.115-49.357 84.070-32.87 35.533-50.278 61.542-60.416 90.522-6.963 19.661-8.806 42.496-4.506 55.91 1.126 3.482 1.946 6.349 1.843 6.349 0 0-3.277-1.843-7.27-3.994zM102.4 537.6v-64h39.731c45.875 0 47.616 0.205 54.989 7.578 7.782 7.782 7.782 8.499 7.475 58.675l-0.307 43.827-2.867 4.813c-1.536 2.662-4.403 6.042-6.349 7.578-6.963 5.325-8.192 5.427-51.917 5.53h-40.755v-64zM810.598 600.064c-5.734-2.048-10.957-6.656-13.926-12.39l-2.56-4.915-0.307-43.418c-0.307-49.562-0.205-50.381 7.475-58.061 7.68-7.782 7.168-7.68 67.277-7.68h53.043v128h-53.453c-42.906-0.102-54.374-0.41-57.549-1.536zM119.808 446.464c-6.451-2.048-11.674-6.758-14.848-13.312l-2.662-5.632 0.307-44.851 0.307-44.749 2.765-4.71c3.072-5.222 7.68-9.114 13.517-11.571 3.482-1.434 14.541-1.638 102.4-1.536 76.493 0 97.997 0.307 96.563 1.229-1.024 0.717-5.427 3.584-9.83 6.349-27.75 18.022-53.453 44.134-70.349 71.373-7.066 11.366-15.053 27.75-19.354 39.731l-3.072 8.704-45.568 0.205c-36.659 0.102-46.49-0.102-50.176-1.229zM767.59 436.531c-15.974-33.178-38.707-63.693-71.578-96.256l-17.306-17.101 3.789-1.536c3.379-1.434 16.282-1.638 110.49-1.638 119.808 0 112.538-0.512 120.832 7.578 7.885 7.68 7.885 8.294 7.578 58.675l-0.307 43.827-2.867 4.813c-1.536 2.662-4.403 6.042-6.349 7.578-7.27 5.53-7.885 5.53-75.878 5.53h-62.874l-5.53-11.469zM102.4 230.4v-64l40.755 0.102c36.352 0 41.165 0.205 45.056 1.843 6.758 2.662 11.059 6.656 14.029 12.902l2.662 5.734-0.614 89.498-2.867 4.813c-1.536 2.662-4.403 6.042-6.349 7.578-6.861 5.222-9.83 5.53-52.941 5.53h-39.731v-64zM247.398 292.762c-5.837-2.15-10.445-5.939-13.619-11.469l-2.867-4.813-0.307-43.52c-0.205-31.437 0-44.749 0.922-47.923 1.741-6.144 6.144-11.878 11.878-15.258l4.915-2.867 193.229-0.512-2.253 3.789c-9.933 16.589-24.576 44.544-24.576 46.899 0 0.307-0.922 2.458-2.048 4.915-6.656 14.541-13.619 38.195-17.101 58.675l-1.741 10.342-6.349 1.638c-5.632 1.536-13.926 1.741-71.27 1.638-53.555 0-65.536-0.307-68.813-1.536zM635.802 289.894c-11.264-7.578-23.654-14.336-53.146-29.184-28.979-14.643-30.515-15.462-37.171-19.558-13.517-8.192-23.347-16.282-29.491-24.166l-3.994-5.222v-11.776c0-14.336 1.638-19.866 7.68-25.907 8.090-8.090 0.922-7.68 120.422-7.68 115.507 0 110.592-0.205 118.374 5.734 1.843 1.331 4.608 4.71 6.144 7.373l2.867 4.813 0.307 43.827c0.307 50.074 0.205 50.893-7.475 58.573s-7.27 7.68-65.946 7.68h-51.814l-6.758-4.506zM810.086 292.659c-6.042-2.15-12.698-8.909-14.746-15.155-1.536-4.301-1.741-10.65-1.741-47.718 0-36.659 0.205-43.213 1.638-46.592 2.458-5.837 6.246-10.24 11.469-13.414l4.813-2.867 110.080-0.614v128.102l-53.453-0.102c-45.773 0-54.17-0.307-58.061-1.638zM118.886 139.059c-2.458-0.922-6.554-3.584-8.909-5.939-7.373-7.373-7.578-8.909-7.578-56.832 0-47.206 0.102-47.923 7.578-55.706 8.090-8.294 0.614-7.885 121.958-7.578l107.52 0.307 5.018 2.56c5.734 2.97 9.318 6.861 12.083 13.21 1.843 4.301 1.946 7.27 1.638 49.152l-0.307 44.646-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-7.782 5.939-2.765 5.734-118.886 5.632-93.798 0-107.11-0.205-111.104-1.638zM400.691 139.059c-6.042-2.15-12.902-9.011-14.95-15.155-1.536-4.301-1.741-10.547-1.741-47.104 0-47.923 0.102-48.845 7.68-56.32 8.090-8.090 0.922-7.68 120.32-7.68 116.326 0 111.206-0.307 118.886 6.042 1.946 1.638 4.813 5.53 6.349 8.602l2.765 5.734v42.906c0 46.592-0.102 47.616-5.734 55.091-1.536 1.946-4.915 4.813-7.475 6.349l-4.71 2.765-62.157 0.307c-50.074 0.205-62.259 0-62.259-1.024 0-0.717-0.307-5.939-0.614-11.571-0.512-10.547-1.229-25.395-1.331-30.515-0.102-2.56-1.126-1.638-8.499 8.192-4.71 6.144-12.595 16.589-17.715 23.142l-9.216 11.981-27.648-0.102c-21.811 0-28.57-0.41-31.949-1.638zM682.086 139.059c-6.042-2.15-12.493-8.806-14.746-15.258-1.638-4.71-1.843-9.011-1.536-49.152 0.307-49.152 0-46.899 7.987-54.682 7.68-7.578 1.331-7.168 119.296-7.168 118.886 0 112.435-0.41 120.627 7.475 7.987 7.782 7.987 8.294 7.68 58.778l-0.307 44.032-3.072 4.915c-3.584 5.837-9.728 10.445-15.462 11.776-2.253 0.614-49.664 0.922-109.978 0.922-93.286-0.102-106.496-0.205-110.49-1.638z" />
+<glyph unicode="&#xe9ec;" glyph-name="flexible_storage" d="M584.192 753.562c-12.288-1.434-32.051-4.813-37.888-6.554-35.021-10.342-53.555-18.125-76.288-31.744-13.824-8.294-31.949-21.402-41.062-29.696-8.090-7.373-23.552-23.142-28.16-28.672l-5.632-6.861-7.885 1.434c-10.752 1.843-31.949 1.024-42.906-1.638-45.875-11.366-80.282-47.718-87.654-92.774l-1.331-8.192-9.216-1.638c-12.8-2.253-21.709-4.608-34.714-9.421-68.198-24.883-117.555-83.354-131.174-155.136-3.891-20.378-3.994-50.688-0.41-72.806 5.222-31.13 21.299-66.662 41.882-92.262 8.909-11.059 27.443-29.286 35.43-34.816 28.774-19.968 50.176-30.003 77.312-36.454 23.245-5.53 12.186-5.325 305.664-5.12 149.811 0.102 273.818 0.512 275.456 0.922 1.741 0.41 5.632 1.229 8.704 1.843 9.114 1.741 22.426 5.939 31.232 9.933 43.93 19.866 75.366 57.242 86.938 103.219 3.174 12.8 3.584 15.462 4.301 30.618 1.741 32.154-7.27 64.512-25.702 92.16-7.373 11.059-15.462 20.275-27.034 30.515l-4.403 3.994 1.638 8.294c0.819 4.608 1.843 10.445 2.15 13.005s0.819 6.246 1.126 8.192c1.434 9.83 1.434 43.315 0 57.344-9.728 94.208-63.283 174.694-146.534 220.058-27.341 14.95-59.597 25.907-89.088 30.31-6.144 0.922-12.595 1.843-14.336 2.15-7.578 1.229-48.742 1.126-60.416-0.205zM564.224 543.13c0-36.454 0.41-39.936 6.656-49.562 4.301-6.758 9.728-11.366 17.92-15.258l6.656-3.174 70.144-0.614v-205.722l-212.48 0.512-5.12 3.174c-5.53 3.379-10.138 9.114-11.776 14.746-0.614 2.355-1.024 52.634-1.024 146.227v142.541h129.024v-32.87zM664.576 494.592c0-0.307-15.155-0.512-33.587-0.307l-33.69 0.307-4.198 2.97c-2.355 1.638-5.325 4.608-6.656 6.656-2.15 3.584-2.253 4.506-2.56 37.786l-0.307 34.202 40.448-40.55c22.323-22.221 40.55-40.755 40.55-41.062z" />
+<glyph unicode="&#xe9ed;" glyph-name="folder_camera" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM400.486 584.704c7.27-5.12 8.499-8.397 9.011-22.221l0.307-12.083 313.651-0.512 4.096-2.253c4.813-2.56 9.728-7.578 12.39-12.595 1.843-3.482 1.946-9.421 2.253-147.763l0.205-144.077-220.877 0.205c-213.299 0.307-221.082 0.41-224.563 2.253-5.018 2.662-10.035 7.578-12.595 12.39l-2.253 4.096-0.307 144.179-0.205 144.077h51.2v10.752c0 15.155 2.765 20.992 11.776 25.19 3.686 1.741 6.451 1.946 27.853 1.741l23.654-0.307 4.403-3.072zM339.968 510.669c-5.222-2.56-7.168-7.168-7.168-17.408 0-10.138 1.638-14.746 6.349-17.613 3.174-1.946 5.12-2.048 32.051-2.048s28.877 0.102 32.051 2.048c4.608 2.867 6.349 7.475 6.349 17.408s-1.741 14.541-6.349 17.408c-3.174 1.946-5.12 2.048-31.539 2.048-24.781 0-28.57-0.205-31.744-1.843zM522.752 498.176c-21.402-3.174-41.779-13.517-57.344-29.184-13.312-13.312-22.118-28.672-26.829-46.387-3.686-13.824-3.891-36.25-0.512-49.664 9.421-37.683 36.966-65.331 75.469-75.674 6.758-1.843 10.854-2.253 24.064-2.15 13.722 0 17.203 0.41 25.805 2.662 17.203 4.608 33.075 13.619 45.466 25.805 9.523 9.421 14.746 16.589 20.173 27.648 5.427 10.957 6.349 13.824 8.909 26.214 6.656 33.178-4.096 67.789-28.57 92.058-15.36 15.155-33.28 24.371-54.886 28.16-9.318 1.638-22.938 1.843-31.744 0.512z" />
+<glyph unicode="&#xe9ee;" glyph-name="folder_document" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821z" />
+<glyph unicode="&#xe9ef;" glyph-name="folder_favourite" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 281.19 0.512 259.686-7.27 275.456-7.885 16.077-23.347 28.365-41.472 32.973-7.782 2.048-12.186 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM528.384 541.798c0-0.307 10.854-22.938 28.365-58.982 4.813-9.83 9.114-18.944 9.626-20.173 1.024-2.662-0.102-2.355 25.498-6.451 10.957-1.741 22.016-3.584 24.576-4.096s21.914-3.789 43.008-7.27c21.094-3.379 38.707-6.554 39.117-6.963 0.41-0.307-2.15-3.174-5.632-6.144-3.482-3.072-10.035-8.806-14.541-12.902s-10.035-8.909-12.288-10.854c-2.253-1.946-4.301-3.789-4.608-4.096-0.41-0.512-39.014-34.816-54.784-48.742l-6.042-5.325 16.486-65.843c9.011-36.25 16.384-65.946 16.179-66.15s-33.075 17.408-50.688 27.238c-2.56 1.331-7.168 3.891-10.24 5.53-12.902 7.066-22.016 11.981-40.448 22.016l-19.456 10.65-5.12-2.56c-2.765-1.434-7.885-4.096-11.264-6.042-5.53-3.072-27.341-14.95-37.888-20.685-6.042-3.277-17.203-9.421-27.136-14.848-4.813-2.662-12.39-6.758-16.896-9.216s-11.366-6.144-15.258-8.397c-3.891-2.15-7.27-3.789-7.475-3.482-0.307 0.205 6.963 29.798 15.974 65.843l16.384 65.331-4.301 4.096c-2.355 2.253-6.656 6.144-9.421 8.602-2.867 2.458-23.245 20.685-45.466 40.448l-40.346 35.942 47.514 7.885c26.112 4.301 49.254 8.090 51.302 8.499 18.739 3.072 33.997 5.632 34.099 5.837 0.205 0.205 1.434 2.867 2.867 5.939s6.144 13.005 10.445 22.016c4.403 9.011 10.138 20.992 12.8 26.624s8.909 18.534 13.824 28.672c4.915 10.138 10.24 21.299 11.981 24.883l3.072 6.451 8.090-16.486c4.403-9.114 8.090-16.691 8.090-16.794z" />
+<glyph unicode="&#xe9f0;" glyph-name="folder_sd" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM657.92 598.016c5.53-3.379 10.138-9.216 11.776-14.848 0.614-2.355 1.024-61.747 0.922-175.104 0-158.72-0.102-172.032-1.741-178.278-4.71-17.715-20.685-32.87-38.912-36.659-7.578-1.536-243.712-1.536-251.29 0-8.192 1.741-17.51 6.554-23.962 12.39-6.451 5.939-9.728 10.752-13.619 19.763l-2.662 6.144-0.307 69.837-0.307 69.734 20.582 20.582 20.48 20.582v83.866c0 90.931-0.205 88.371 5.632 95.949 2.97 3.789 8.602 7.578 13.21 8.704 1.741 0.41 59.904 0.614 129.229 0.614l126.054-0.205 4.915-3.072zM411.648 517.12v-43.52h40.96v87.040h-40.96v-43.52zM473.088 517.12v-43.52h40.96v87.040h-40.96v-43.52zM534.528 517.12v-43.52h40.96v87.040h-40.96v-43.52zM595.968 517.12v-43.52h40.96v87.040h-40.96v-43.52z" />
+<glyph unicode="&#xe9f1;" glyph-name="football" d="M488.346 881.766c-0.205-0.205-5.12-0.614-10.957-1.024-5.734-0.41-11.059-0.922-11.776-1.126-0.614-0.205-4.198-0.614-7.885-0.922s-7.68-0.819-9.011-1.126c-1.331-0.205-7.782-1.331-14.336-2.458-91.238-15.872-179.61-64.922-243.098-134.861-47.002-51.814-79.77-111.514-98.611-179.507-6.042-21.811-11.264-51.814-13.517-78.438-1.229-14.234-0.922-63.078 0.614-76.8 9.933-94.106 46.182-176.845 108.134-247.194 10.547-12.083 33.485-34.304 45.056-43.622 2.765-2.253 6.349-5.325 8.090-6.758 23.347-19.456 62.874-43.52 94.925-57.651 41.472-18.33 91.443-31.744 129.946-34.918 4.198-0.41 8.806-0.922 10.24-1.229s15.462-0.614 31.232-0.819c30.925-0.205 51.405 1.126 75.776 5.222 68.813 11.469 134.554 39.424 189.44 80.589 21.914 16.486 51.405 43.725 66.662 61.645 16.179 19.046 21.299 25.6 32.666 42.394 23.757 35.226 39.731 67.482 52.838 106.598 6.758 20.378 9.83 31.744 14.131 53.76 3.277 16.486 3.482 17.92 5.939 37.376 1.741 14.848 2.56 63.898 1.229 78.848-4.608 51.405-15.258 95.232-33.792 138.547-11.264 26.317-20.685 43.52-37.581 69.12-60.826 92.058-153.805 157.082-261.427 182.989-15.77 3.789-41.37 8.192-54.17 9.216-4.198 0.41-8.806 0.922-10.24 1.229-2.97 0.512-59.904 1.434-60.518 0.922zM402.227 791.347c-17.613-34.406-18.125-35.533-17.408-36.25 0.41-0.41 13.824-5.837 29.901-12.186s44.749-17.715 63.795-25.19l34.509-13.722 61.747 24.678c33.894 13.619 62.669 25.088 64 25.6 2.253 0.819 1.843 1.638-13.107 31.642-8.397 16.896-15.36 30.925-15.36 31.13 0 0.717 15.77-3.891 28.672-8.294 67.482-23.347 129.434-67.174 173.978-123.085 8.192-10.342 22.835-30.925 22.426-31.437-0.205-0.102-5.632 0.614-12.083 1.638-6.451 1.126-14.746 2.458-18.432 2.97-3.686 0.614-13.926 2.253-22.938 3.686-8.909 1.434-16.384 2.458-16.589 2.355-0.41-0.512-1.638-16.691-2.97-39.219-0.205-3.379-0.614-10.957-1.024-16.896-1.024-15.565-1.229-18.637-1.946-32.256-0.41-6.758-0.922-13.619-1.126-15.36-0.307-2.56-1.331-19.251-1.946-31.642-0.102-2.56 6.656-11.162 43.418-55.501 23.962-28.877 44.032-52.429 44.749-52.326s12.493 11.366 26.214 24.986c24.986 24.678 25.088 24.781 25.6 21.504 0.614-3.994 0-51.61-0.819-58.061-2.97-25.293-5.734-40.243-10.752-60.518-7.782-30.618-21.811-65.536-37.683-93.082-10.752-18.842-34.611-52.941-37.581-53.965-0.717-0.205-1.638 3.174-2.355 8.090-1.434 9.318-2.97 19.558-6.349 40.755-1.229 7.578-2.458 15.667-2.765 17.92s-0.819 4.403-1.126 4.813c-0.41 0.41-4.198-0.205-8.397-1.331-9.011-2.355-75.366-19.354-105.267-26.931l-20.89-5.325-6.758-10.957c-3.789-6.042-19.968-31.744-36.045-57.139-16.077-25.498-29.491-46.797-29.901-47.411-0.614-1.126 8.499-6.144 51.61-28.262 7.27-3.686 13.107-6.963 13.107-7.373 0-1.843-34.714-13.005-55.296-17.715-29.696-6.758-52.429-9.216-86.528-9.216-36.352 0-60.109 2.867-94.003 11.366-16.896 4.198-49.766 15.155-48.742 16.179 0.41 0.41 27.853 14.438 54.477 27.955 6.042 3.072 10.957 5.939 10.957 6.349s-1.434 3.072-3.277 5.837c-6.656 10.342-10.24 15.974-29.491 46.49-10.854 17.203-21.197 33.587-23.040 36.352-1.843 2.867-6.349 10.035-10.138 16.179-3.789 6.042-7.68 11.366-8.602 11.878-1.024 0.512-17.613 4.915-37.069 9.83s-48.64 12.288-65.024 16.384c-16.282 4.198-30.003 7.27-30.413 6.861-0.307-0.41-2.765-13.824-5.427-29.901-2.56-16.077-5.325-31.949-5.939-35.328l-1.229-6.042-8.806 11.674c-42.291 56.627-68.198 121.446-75.162 188.416-0.41 3.686-0.922 7.578-1.229 8.704-0.819 3.686-1.434 52.122-0.717 55.603l0.717 3.482 24.883-24.883c24.781-24.678 24.986-24.883 26.931-22.938 1.946 2.048 25.805 30.618 32.87 39.424 1.946 2.458 5.222 6.349 7.168 8.704 6.349 7.373 41.37 49.766 44.339 53.555 2.458 3.277 2.765 4.403 2.355 8.397-0.307 2.56-0.819 9.728-1.126 15.872-0.307 6.246-0.819 13.107-1.024 15.36s-0.717 9.216-1.024 15.36c-0.307 6.246-0.819 13.107-1.024 15.36s-0.717 9.421-1.126 15.872c-0.41 6.451-0.819 13.414-0.922 15.36-0.205 1.946-0.614 8.704-1.024 14.848-0.41 6.246-0.922 12.902-1.024 14.848-0.205 1.946-0.41 4.915-0.41 6.554-0.102 2.867-0.205 2.867-4.403 2.253-2.458-0.41-10.342-1.638-17.715-2.765-7.27-1.024-14.438-2.15-15.872-2.355-1.434-0.307-4.403-0.717-6.656-1.024s-8.499-1.229-13.824-2.048c-5.325-0.922-9.83-1.331-10.035-1.126-0.614 0.614 12.186 18.637 21.197 30.003 47.309 59.187 110.182 102.605 182.374 125.952 7.066 2.355 14.438 4.608 16.384 5.222 1.946 0.512 3.686 1.024 3.891 1.024 0.102 0.102-5.837-11.776-13.312-26.214zM491.827 574.259c-36.454-25.6-79.053-55.501-93.184-65.536l-13.414-9.523 0.922-3.277c0.512-1.843 11.981-36.352 25.395-76.595l24.474-73.216h154.010l25.498 76.288c19.661 58.982 25.088 76.595 24.166 77.414-0.717 0.717-15.462 11.264-32.973 23.45-62.771 44.032-72.806 51.2-83.149 58.47l-10.445 7.373-21.299-14.848z" />
+<glyph unicode="&#xe9f2;" glyph-name="Football_match" d="M629.248 882.586c-30.72-5.018-55.706-27.238-63.693-56.73-2.765-10.24-2.458-29.798 0.512-40.448 16.179-56.115 86.63-74.342 128.205-33.178 14.029 14.029 21.299 31.13 22.016 51.712s-5.837 38.912-19.354 53.658c-14.541 16.077-32.358 24.371-53.35 25.088-6.144 0.205-12.595 0.102-14.336-0.102zM233.165 702.874c-10.138-2.355-21.094-11.059-25.395-20.275-9.318-19.763-1.229-42.291 18.534-51.712l6.656-3.174 309.248-0.512-129.638-129.843c-147.354-147.456-135.578-134.246-135.578-152.269 0-9.728 0.205-10.547 3.482-16.691 10.342-19.046 32.051-26.419 51.2-17.51 3.584 1.741 22.118 19.558 75.059 72.499l70.451 70.144 3.174-2.97c7.475-7.168 14.234-14.131 14.234-14.95 0-0.41-80.794-81.613-179.61-180.326-98.714-98.816-180.736-181.453-182.17-183.706-5.53-8.909-7.066-19.661-4.301-30.413 5.222-19.866 26.214-32.154 46.285-26.931 3.584 0.819 8.294 2.765 10.547 4.198s126.976 125.44 277.197 275.661l272.896 272.896 33.894-33.792 33.894-33.894-46.387-46.387c-59.494-59.494-58.778-58.675-61.44-65.946-5.632-15.053-2.048-31.334 9.318-41.984 6.758-6.246 14.029-9.523 23.45-10.24 9.114-0.717 18.125 1.843 25.498 7.27 7.987 6.042 134.758 133.734 137.523 138.752 3.379 5.939 5.222 15.872 4.506 23.245-1.331 13.107 1.126 10.24-93.798 105.267-77.722 77.824-87.757 87.45-93.901 90.624l-6.861 3.584-232.038 0.205c-132.71 0-233.677-0.307-235.93-0.819zM445.952 164.864c-33.178-7.475-55.91-31.437-61.030-64.307-5.939-37.99 19.046-75.366 56.934-85.299 9.626-2.56 29.082-2.56 38.4 0 26.726 7.27 47.616 28.262 54.886 55.091 2.56 9.216 2.56 28.672 0 38.4-7.066 27.648-29.696 49.357-58.163 55.808-8.499 1.946-23.142 2.15-31.027 0.307z" />
+<glyph unicode="&#xe9f3;" glyph-name="Football_quiz" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 7.373-40.755 20.173-78.95 39.014-116.736 33.382-66.458 82.227-122.163 145.306-165.478 50.79-35.021 120.218-61.952 179.712-69.939 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 85.709 7.885 160.768 36.454 226.816 86.016 4.506 3.379 9.83 7.578 11.878 9.318s5.939 5.018 8.704 7.27c5.939 4.915 16.384 14.643 26.419 24.678 53.76 53.76 92.57 121.344 112.23 195.789 2.56 9.626 7.68 33.69 8.704 40.448 0.307 2.765 0.819 5.939 1.024 7.066 0.307 1.126 0.717 4.71 1.024 7.885 0.41 3.174 0.819 6.861 1.126 8.294 1.946 11.571 2.662 62.054 1.126 80.896-1.024 13.824-4.403 39.014-6.758 50.176-17.818 87.347-58.368 162.714-120.832 224.973-50.79 50.483-113.971 88.064-182.784 108.442-19.251 5.632-44.544 11.264-60.621 13.21-2.765 0.41-5.734 0.819-6.554 1.024s-5.222 0.717-9.728 1.126c-4.506 0.307-9.318 0.819-10.752 1.126-3.174 0.512-61.030 1.434-61.542 0.922zM398.746 786.432c-15.667-30.618-15.872-31.232-13.517-32.154 1.331-0.512 17.101-6.758 35.123-13.926s46.080-18.227 62.259-24.678l29.491-11.674 61.645 24.678c33.894 13.619 62.669 25.088 64 25.6 2.253 0.819 1.843 1.638-13.107 31.744-8.499 16.998-15.36 31.027-15.155 31.232 0.205 0.102 3.994-0.819 8.499-2.048 84.992-24.781 158.413-77.312 208.794-149.504 4.301-6.144 7.68-11.264 7.578-11.366-0.307-0.307-7.987 0.819-15.667 2.048-1.638 0.307-5.632 1.024-8.704 1.434-3.072 0.512-14.541 2.355-25.498 4.198-10.854 1.741-19.968 3.072-20.070 2.867-0.41-0.307-1.229-10.65-2.048-23.859-0.307-5.018-0.819-12.39-1.024-16.384-0.307-3.891-0.717-11.059-1.024-15.872s-0.717-11.674-1.024-15.36c-0.307-3.686-0.717-11.469-1.126-17.408-0.307-5.939-0.717-12.39-0.922-14.336-0.307-3.994-1.843-30.003-1.946-33.28 0-2.56 86.323-107.008 88.166-106.701 0.717 0.102 12.39 11.264 25.907 24.678s24.986 24.166 25.395 23.757c0.922-1.024 0.922-43.418 0-55.398-5.12-63.488-26.010-124.416-60.928-178.176-10.24-15.565-25.293-35.328-26.010-33.997-0.41 0.717-1.741 7.885-2.97 16.077-1.229 8.090-2.458 15.77-2.662 16.896-0.614 3.584-4.608 29.594-5.222 33.792-0.307 2.253-0.819 4.403-1.229 4.813-0.307 0.41-7.782-1.126-16.486-3.379-27.443-7.066-54.784-14.131-83.968-21.504-15.462-3.891-29.491-7.578-31.232-8.192-2.56-0.819-5.325-4.506-15.77-21.197-6.861-11.059-17.101-27.341-22.63-36.045-10.138-16.077-21.299-33.69-31.846-50.79l-5.734-9.216 9.318-4.813c9.114-4.71 31.437-16.282 48.64-25.293 9.728-5.018 10.24-3.994-5.018-9.421-26.829-9.523-55.603-16.282-80.896-19.251-5.325-0.614-11.059-1.331-12.8-1.638-5.632-1.024-56.218-1.229-65.024-0.307-11.981 1.229-27.341 3.072-30.618 3.584-13.619 2.355-22.323 4.198-35.635 7.578-19.251 4.915-48.435 14.746-47.309 15.872 0.205 0.205 14.746 7.578 32.154 16.486 17.51 8.806 32.154 16.384 32.666 16.896 1.024 0.922-1.024 4.301-19.354 32.973-1.126 1.843-7.373 11.571-13.722 21.709-6.451 10.138-13.21 20.787-14.95 23.552-1.843 2.867-7.782 12.288-13.312 20.992-5.427 8.704-10.65 16.589-11.366 17.408-0.819 0.819-6.451 2.765-12.493 4.198-6.042 1.536-35.84 9.011-66.15 16.691-30.413 7.68-55.296 13.824-55.398 13.722-0.102-0.205-1.331-7.68-2.867-16.691-5.837-35.533-9.011-54.272-9.318-54.477-0.512-0.512-11.981 14.746-20.48 27.136-28.262 41.472-49.459 92.058-58.47 139.264-0.819 4.403-1.741 8.806-1.946 9.933-0.41 2.253-3.277 22.733-4.198 30.208-0.819 7.066-1.536 53.35-0.819 57.242l0.614 3.379 24.678-24.678c13.619-13.517 24.986-24.678 25.395-24.678 0.307 0 7.066 7.68 14.848 17.203 7.885 9.421 27.648 33.28 44.032 53.043l29.901 36.045-0.41 4.403c-0.205 2.458-0.614 10.035-1.024 16.794-0.307 6.758-0.819 13.414-1.024 14.848s-0.717 7.885-1.024 14.336c-0.307 6.451-0.819 14.541-1.024 17.92-0.307 3.379-0.717 9.83-1.024 14.336s-0.717 10.957-1.024 14.336c-0.205 3.379-0.717 10.342-1.024 15.36-0.819 13.517-1.741 24.576-1.946 24.781s-23.142-2.867-31.846-4.301c-3.072-0.512-6.861-1.126-26.112-3.994-5.325-0.819-9.83-1.331-10.035-1.126s1.638 3.277 4.096 6.963c47.002 68.608 116.736 121.446 194.458 147.558 5.734 1.946 23.45 7.373 25.19 7.68 0.205 0.102-6.861-13.926-15.667-31.13zM487.936 626.483c-14.95-1.741-35.738-8.090-50.176-15.36-12.902-6.451-21.094-12.493-31.846-23.45-15.36-15.667-22.118-32.051-21.504-52.122 0.205-7.578 0.819-10.24 3.174-15.36 7.168-14.95 21.299-23.347 37.888-22.63 10.854 0.512 21.914 8.294 33.28 23.245 11.981 15.565 23.859 23.347 37.274 24.269 17.203 1.126 32.973-6.554 40.141-19.456 2.765-5.018 2.97-6.144 2.867-15.667 0-11.674-1.741-17.101-7.578-24.474-7.27-9.114-16.794-13.824-36.557-18.022-21.094-4.608-27.955-8.397-32.768-18.227l-2.867-5.837-0.307-25.6c-0.41-27.546 0.41-34.714 5.018-43.827 11.264-22.016 37.171-28.16 58.675-13.926 10.138 6.758 15.462 17.818 16.691 34.918l0.614 9.011 4.198 1.126c40.96 10.752 69.222 35.635 80.896 71.066 6.144 18.637 7.27 45.261 2.662 63.488-11.264 44.851-52.326 78.541-104.96 86.016-8.499 1.229-27.443 1.638-34.816 0.819zM490.906 331.776c-15.872-2.867-30.413-15.77-34.714-30.72-7.885-27.443 11.059-55.398 39.014-57.446 14.029-1.126 25.293 3.072 35.123 12.902 17.51 17.613 17.51 45.158 0.205 62.566-10.65 10.65-25.293 15.258-39.629 12.698z" />
+<glyph unicode="&#xe9f4;" glyph-name="Forward" d="M537.6 767.59v-114.79h-181.658c-200.397 0-192.205 0.205-206.95-6.349-19.354-8.704-34.714-24.781-41.779-43.827-4.813-13.107-4.813-9.83-4.506-157.696 0.205-138.65 0.205-138.752 2.458-145.408 3.277-10.035 5.222-14.234 10.035-21.504 10.342-15.462 25.907-26.931 43.418-31.949 1.843-0.512 4.403-1.331 5.632-1.638 1.126-0.41 85.709-0.819 187.699-0.922l185.651-0.307 0.205-114.893 0.307-114.893 3.072 3.072c3.994 3.994 63.386 65.024 72.602 74.547 3.891 3.994 15.36 15.872 25.6 26.317 55.603 56.934 82.227 84.275 89.907 92.16 4.608 4.915 22.323 23.040 39.219 40.346s33.69 34.611 37.376 38.4c3.686 3.686 20.48 20.992 37.376 38.298 57.139 58.573 55.091 56.422 60.621 64.614 12.39 18.33 18.022 37.478 17.306 59.392-0.41 14.746-3.174 27.034-8.704 38.912-6.963 14.746-10.854 19.968-30.72 40.346-10.65 10.957-41.165 42.291-62.976 64.717-27.443 28.16-82.33 84.378-89.702 92.058-3.482 3.686-19.354 19.968-35.226 36.147-15.77 16.282-33.382 34.202-38.912 39.936s-23.757 24.474-40.448 41.574c-16.691 17.101-34.202 35.123-38.912 39.936-21.299 21.914-36.045 36.864-36.966 37.478-0.717 0.41-1.024-38.195-1.024-114.074z" />
+<glyph unicode="&#xe9f5;" glyph-name="Forward_curved_arrow" d="M614.4 745.472v-101.888l-124.109-0.102c-68.301-0.102-125.133-0.307-126.259-0.41s-6.144-0.512-11.264-0.922c-24.883-1.946-58.061-9.421-83.968-19.046-46.592-17.306-84.378-41.779-120.422-77.722-41.574-41.677-69.12-88.883-85.402-146.534-2.662-9.728-7.373-32.154-8.294-40.243-0.41-2.97-0.819-5.632-1.024-5.939-1.741-2.97-2.662-54.989-1.229-71.066 1.741-19.866 6.451-44.851 12.083-64 13.824-46.797 35.84-86.835 69.018-125.952 6.042-7.066 30.003-30.31 37.786-36.659l7.885-6.451 0.102 46.387c0 50.79 0.102 52.122 2.97 66.56 11.366 57.242 55.706 104.346 111.718 118.579 19.763 5.018 20.275 5.12 175.309 5.12h145.101v-204.8l166.912 167.219c91.75 91.853 168.55 169.472 170.598 172.237 7.373 10.342 10.65 18.227 13.107 32.154 3.789 20.582-2.458 44.544-15.667 60.211-4.915 5.939-333.517 335.155-334.438 335.155-0.307 0-0.512-45.875-0.512-101.888z" />
+<glyph unicode="&#xe9f6;" glyph-name="forward_the_number" d="M640 832.512v-51.2l-5.325-4.301c-2.97-2.253-9.114-7.168-13.619-10.752-4.506-3.482-9.318-7.373-10.854-8.499s-6.963-5.325-12.083-9.421l-9.421-7.373 6.861-4.915c3.686-2.662 15.155-10.957 25.395-18.33l18.534-13.312 0.512-43.52c0.512-41.882 0.614-43.52 2.662-47.514 2.56-4.71 4.608-6.656 9.626-9.318 3.482-1.843 8.909-1.946 136.499-2.253l132.813-0.205-0.205 130.253c-0.307 123.494-0.41 130.56-2.15 134.042-3.072 6.246-8.602 11.878-14.336 14.643l-5.325 2.56-259.584 0.614v-51.2zM795.853 823.091c4.608-4.71 4.71-8.602 0.307-22.016-2.15-6.349-4.506-13.517-5.222-15.974l-1.331-4.403 29.798 0.614 5.53 17.408c7.066 21.914 7.885 23.654 11.878 26.112 8.397 5.12 19.251-0.717 19.251-10.445 0-1.843-0.922-5.939-2.15-9.011s-3.686-9.933-5.632-15.155l-3.379-9.421 16.691 0.102c19.251 0.102 22.221-0.819 24.781-6.963 2.458-5.837 0.205-12.698-5.427-16.384-2.355-1.536-6.042-1.946-23.654-2.355l-20.89-0.512-9.83-24.576 17.613-0.512c19.661-0.614 22.118-1.331 24.781-7.68 1.843-4.506 1.843-6.042-0.205-10.24-3.174-6.758-4.608-7.066-29.389-7.68l-22.426-0.512-6.861-18.739c-7.27-19.866-9.728-23.757-15.053-23.962-6.349-0.307-8.704 0.307-11.674 3.072-5.222 4.608-5.12 8.090 0.922 25.19l5.222 15.053-28.877-0.614-6.554-17.818c-3.584-9.83-7.168-18.842-8.090-20.173-4.608-7.168-15.667-6.861-20.89 0.512-3.072 4.301-2.765 7.475 2.97 23.552l5.018 14.438h-15.36c-17.408 0-21.197 0.922-24.474 6.349-3.789 6.349-1.946 13.824 4.403 17.51 1.536 0.819 9.318 1.434 23.654 1.741l21.299 0.512 4.915 12.288c2.765 6.758 4.813 12.39 4.71 12.595-0.205 0.102-6.656 0.307-14.438 0.41-16.896 0.102-21.299 1.024-24.166 5.018-4.608 6.451-3.072 14.336 3.482 18.33 2.97 1.843 5.222 2.048 23.962 2.048h20.685l1.946 5.427c1.126 2.867 3.994 11.059 6.349 18.125s5.018 14.131 5.837 15.667c3.686 7.27 14.131 8.909 19.968 3.072zM777.421 749.875c-1.126-2.97-2.97-7.987-4.096-11.059s-2.355-6.451-2.765-7.475c-0.717-1.638 0.205-1.741 13.824-1.536l14.541 0.307 3.072 7.68c1.741 4.198 3.891 9.83 5.018 12.595l1.946 4.813h-29.491l-2.048-5.325zM295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 3.891-0.819 66.15-1.126 215.552-1.126 184.218 0 210.944 0.205 216.269 1.536 19.149 4.915 34.406 20.48 38.298 39.219 0.819 3.891 1.126 79.155 1.126 263.885v258.56h-51.2v-460.8h-409.6v691.2h307.2v76.8l-156.877-0.102c-121.856-0.102-158.208-0.307-162.304-1.331zM557.158 855.245c3.994-2.662 6.042-6.144 6.042-10.445s-2.048-7.782-6.042-10.445c-3.482-2.355-3.482-2.355-44.851-2.355-45.67 0-45.568 0-49.459 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.851 2.048h41.574l3.482-2.355zM524.493 86.221c5.837-3.379 8.397-6.349 11.059-12.493 6.758-15.667-3.891-33.075-21.402-35.021-17.715-1.843-32.154 16.486-26.214 33.382 2.765 7.885 9.011 14.131 16.691 16.589 5.018 1.638 15.053 0.41 19.866-2.458zM503.296 530.432c-4.915-2.15-6.144-4.301-11.264-18.944-2.662-7.578-5.734-16.179-6.861-19.149l-1.946-5.325-21.197-0.307c-20.173-0.307-21.299-0.41-24.474-2.662-6.451-4.608-6.451-15.258 0-20.070 2.56-1.946 4.71-2.253 19.661-2.662l16.691-0.512-4.71-13.005-4.71-13.107h-20.378c-22.016 0-24.986-0.614-28.672-5.734-2.355-3.174-2.458-9.318-0.41-13.414 2.867-5.427 6.758-6.451 24.166-6.451 8.499 0 15.462-0.41 15.462-0.819s-2.355-7.27-5.222-15.053c-6.042-16.691-6.246-20.685-0.922-25.293 1.638-1.638 3.994-2.97 5.12-2.97 11.776-0.717 12.698 0.307 21.402 24.166l7.168 19.456 14.336 0.307c8.806 0.102 14.438-0.102 14.438-0.717 0-0.512-0.512-2.253-1.126-3.891-4.301-10.957-9.114-25.6-9.114-27.648 0-2.867 2.253-7.578 4.506-9.421 4.915-4.096 15.053-2.662 18.534 2.56 0.819 1.331 4.301 9.933 7.578 19.046 3.379 9.216 6.349 17.51 6.758 18.534 0.614 1.536 2.662 1.741 21.402 1.741 18.534 0 20.89 0.205 23.859 2.048 1.741 1.024 3.789 2.97 4.506 4.198 1.843 3.584 1.638 10.445-0.41 13.619-3.174 4.813-7.168 5.734-24.269 5.734-8.397 0-15.36 0.205-15.36 0.512s0.41 1.331 1.024 2.355c0.512 0.922 2.662 6.656 4.813 12.698l3.891 11.059h20.275c25.702 0 27.648 0.717 30.515 10.547 0.717 2.458 0.41 4.198-1.331 7.68-3.174 6.554-5.837 7.373-24.474 7.373-14.234 0-15.462 0.102-14.95 1.843 0.307 0.922 2.662 7.987 5.222 15.462 5.018 14.336 5.222 17.306 1.946 22.323-0.819 1.229-3.482 2.97-5.939 3.994-3.686 1.331-5.12 1.434-8.090 0.41-3.379-1.126-8.806-6.554-8.806-8.806 0-0.512-2.765-8.499-6.042-17.818l-6.042-16.896-29.082-0.614 0.717 2.355c0.307 1.331 2.253 6.758 4.096 12.083 5.837 16.282 6.144 18.534 3.686 23.245-1.536 3.072-3.174 4.608-6.246 5.837-4.813 1.946-5.632 1.946-9.728 0.102zM525.722 448.41c-2.458-7.066-4.506-13.107-4.506-13.312s-6.656-0.41-14.848-0.41h-14.848l3.686 10.035c2.048 5.427 4.096 11.469 4.608 13.312l1.024 3.277h29.491l-4.608-12.902z" />
+<glyph unicode="&#xe9f7;" glyph-name="free_tag" d="M494.182 893.85c-14.541-2.56-26.726-7.578-40.55-16.691-5.632-3.686-17.408-14.95-31.642-30.31-4.198-4.506-10.957-11.674-14.848-15.872-3.994-4.198-10.957-11.674-15.462-16.486s-11.878-12.595-16.384-17.408c-4.506-4.813-11.571-12.39-15.77-16.794-4.198-4.506-11.366-12.083-15.872-16.896-7.066-7.475-29.184-31.027-38.81-41.472-2.765-2.97-6.861-7.168-24.166-25.6-4.301-4.608-11.469-12.186-15.974-16.998s-11.878-12.595-16.384-17.408c-8.806-9.421-31.744-33.792-42.496-45.363-3.686-3.891-11.162-11.776-16.589-17.408l-10.035-10.342 0.307-251.392 0.205-251.392 2.867-10.035c5.222-18.637 13.517-32.973 26.829-46.285 15.565-15.565 33.485-24.883 55.501-28.672 7.987-1.434 37.888-1.536 251.187-1.331l242.176 0.307 10.035 2.765c17.92 4.915 33.075 13.824 46.285 26.931 11.674 11.571 19.968 24.986 25.088 40.448 5.325 15.77 5.12 6.042 5.12 271.36v247.296l-8.499 8.704c-7.373 7.782-18.432 19.456-47.309 50.176-12.493 13.21-36.966 39.322-45.568 48.538-7.578 8.090-18.022 19.149-32.768 34.816-4.198 4.506-8.602 9.114-9.728 10.342s-8.499 9.114-16.384 17.51c-22.63 24.064-28.57 30.413-29.696 31.642-0.512 0.717-7.066 7.578-14.438 15.462-7.475 7.782-14.95 15.872-16.794 17.818-42.496 46.080-51.917 54.477-69.325 62.464-18.022 8.192-40.346 10.957-60.109 7.578zM524.39 778.957c23.757-4.506 43.622-23.45 49.664-47.309 7.782-30.515-9.114-63.283-38.605-74.65-20.582-8.090-42.906-5.325-60.621 7.373-35.533 25.395-35.533 78.438-0.102 103.731 14.643 10.445 31.949 14.234 49.664 10.854zM636.928 561.664c4.198-1.126 9.523-5.939 11.878-10.445 2.458-4.71 1.434-14.029-2.15-19.558-1.536-2.355-9.216-10.65-16.998-18.432-7.885-7.782-14.234-14.541-14.234-14.95 0-0.717 14.029-14.541 15.974-15.77 0.717-0.41 7.066 5.018 15.258 13.107 7.987 7.782 15.974 14.643 18.432 15.872 13.005 6.246 27.546-1.434 28.262-14.848 0.41-8.909-1.536-12.288-17.203-28.262-8.090-8.192-14.643-15.36-14.643-15.77s3.789-4.506 8.397-8.909l8.397-8.090 15.462 15.36c16.998 16.896 21.504 19.866 30.003 19.866 4.301 0 6.144-0.512 9.728-3.072 8.090-5.734 10.854-15.155 6.963-24.064-2.355-5.427-45.568-49.050-51.814-52.224-5.53-2.867-14.95-3.072-20.48-0.41-6.042 2.867-94.003 90.726-97.382 97.075-3.072 6.144-3.277 13.824-0.307 20.275 1.434 3.174 8.192 10.752 22.221 24.883 11.059 11.162 21.914 21.709 24.064 23.45 6.656 5.325 13.107 6.963 20.173 4.915zM548.659 468.685c5.018-2.56 9.523-9.318 9.933-14.848 0.717-8.909-2.15-13.414-19.456-30.618l-15.872-15.77 8.602-8.704 8.499-8.806 14.234 14.029c16.589 16.282 20.89 18.944 30.003 18.227 10.854-0.717 18.432-9.728 16.998-20.070-1.024-7.987-4.813-13.414-18.842-27.136-15.462-15.155-15.155-12.595-3.072-24.064l6.861-6.554 15.565 15.462c9.933 9.728 17.306 16.179 20.173 17.51 5.734 2.662 13.414 2.867 17.306 0.41 7.885-4.915 10.752-9.318 10.854-16.794 0-8.704-2.56-12.186-27.546-36.966-19.046-18.842-24.269-23.45-28.262-24.986-6.554-2.458-14.643-1.638-20.582 2.15-2.458 1.536-24.678 23.142-49.562 47.923-41.882 41.882-45.158 45.568-46.592 50.278-1.946 6.656-1.638 12.39 1.126 18.022 2.458 5.018 44.954 48.23 50.074 50.995 6.758 3.584 13.107 3.686 19.558 0.307zM455.987 360.96c14.131-3.277 28.979-15.77 36.147-30.208 3.891-7.782 3.994-8.499 3.994-18.432 0-8.294-0.512-11.162-2.253-15.053-2.56-5.734-2.97-5.53 9.421-6.451 33.485-2.458 40.141-3.891 45.875-9.318 4.813-4.403 6.963-8.704 7.373-14.438 0.41-6.861-1.331-11.264-6.042-15.053-7.578-6.042-11.366-6.554-32.87-5.222-3.379 0.205-12.39 0.614-19.968 1.024-7.578 0.307-18.125 0.819-23.245 1.126-5.222 0.307-9.523 0.307-9.523 0s6.246-6.758 13.824-14.336c15.462-15.565 18.33-19.866 18.33-28.262 0.102-14.336-14.95-22.938-28.262-16.384-6.451 3.277-96.358 93.082-99.226 99.226-1.126 2.458-2.15 6.656-2.253 9.216-0.205 8.294 3.174 13.312 20.787 30.822 8.704 8.704 17.92 17.51 20.48 19.558 14.438 11.674 31.13 15.974 47.411 12.186zM357.069 274.227c5.427-4.301 7.885-8.909 7.885-14.541-0.102-8.704-3.277-13.414-20.378-30.618l-15.872-15.872 3.379-3.686c1.741-2.048 5.632-5.939 8.602-8.602l5.222-5.018 13.722 13.517c14.541 14.541 20.582 18.432 27.955 18.432 11.571-0.102 20.173-9.83 18.534-21.094-0.922-7.27-3.174-10.342-17.818-25.19l-13.926-14.131 16.486-16.589c18.944-19.354 21.709-23.757 20.275-33.28-1.229-8.602-10.138-15.667-19.456-15.667-8.192 0-11.674 2.97-60.109 51.302-43.725 43.52-46.797 46.797-48.435 52.019-2.048 6.246-1.741 12.083 1.024 18.022 2.765 6.042 45.67 48.947 52.224 52.326 7.168 3.686 15.258 3.174 20.685-1.331zM435.712 317.952c-2.253-1.126-7.987-5.939-12.8-10.65l-8.602-8.704 10.547-10.445 10.445-10.547 9.216 9.216c10.138 9.933 13.21 14.746 13.21 20.48 0 10.445-11.264 15.974-22.016 10.65z" />
+<glyph unicode="&#xe9f8;" glyph-name="Free_up_space" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM512 268.698v-179.302l-15.667 0.614c-8.704 0.41-16.589 0.819-17.715 1.024-1.024 0.205-4.71 0.614-8.090 1.024-17.408 1.946-45.158 7.578-59.904 12.083-70.656 21.606-128.922 60.314-175.309 116.224-7.373 8.909-24.166 31.744-25.702 35.123-0.41 0.819-2.355 4.096-4.301 7.168l-3.482 5.632 2.253 1.741c1.229 0.922 3.891 2.56 5.837 3.686 7.475 4.096 13.824 7.68 14.848 8.397 0.614 0.41 12.083 7.168 25.6 14.848 25.702 14.746 68.403 39.424 86.016 49.664 5.632 3.277 29.594 17.101 53.248 30.72s45.363 26.112 48.128 27.75c9.114 5.325 73.728 42.803 74.035 42.803 0.102 0.102 0.205-80.589 0.205-179.2z" />
+<glyph unicode="&#xe9f9;" glyph-name="front_end_dashboard" d="M141.619 817.254c-17.818-4.403-32.87-19.354-37.683-37.581-1.331-4.71-1.536-41.882-1.536-255.386 0-278.323-0.614-255.693 7.168-268.902 4.71-7.987 13.21-16.077 20.787-19.763 12.493-6.144-16.384-5.734 381.133-5.734 261.734 0 365.466 0.307 369.357 1.126 19.456 4.096 36.147 20.992 39.629 40.243 0.819 4.301 1.126 80.179 1.126 253.44 0 269.824 0.307 255.181-5.837 266.65-6.451 12.186-21.504 23.45-34.918 26.214-8.397 1.741-731.955 1.434-739.226-0.307zM870.4 549.376v-217.088h-716.8v434.176h716.8v-217.088zM519.27 306.176c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493s-0.41-8.397-2.765-12.39c-4.813-8.090-11.674-12.288-20.89-12.8-8.192-0.41-13.926 1.741-19.456 7.373-11.264 11.162-9.421 30.515 3.686 38.81 7.373 4.608 15.155 5.734 22.63 3.072zM341.606 689.562c-42.291-5.734-78.746-32.051-97.997-70.554-9.011-18.022-12.698-34.304-12.698-56.32 0-16.998 1.434-26.522 6.246-40.96 13.517-40.346 48.128-72.499 89.19-82.842 12.288-3.072 15.053-3.379 31.027-3.686 11.571-0.205 16.998 0.205 24.576 1.741 52.429 10.752 90.112 47.923 102.093 100.659 2.355 10.65 2.355 38.4 0 49.562-5.837 26.931-16.486 46.797-35.43 65.638-19.046 19.046-39.117 29.901-65.126 35.328-9.728 2.048-31.949 2.867-41.882 1.434zM384.102 661.606c17.613-4.506 33.792-13.824 46.899-27.136 7.168-7.168 15.462-18.227 15.462-20.275-0.102-0.717-10.752-7.066-65.536-38.502-8.704-5.018-17.408-10.035-19.149-11.162l-3.379-2.048v102.912l8.090-0.717c4.403-0.307 12.39-1.741 17.613-3.072zM537.6 639.488v-25.6h204.8v51.2h-204.8v-25.6zM537.6 562.688v-25.6h256v51.2h-256v-25.6zM537.6 485.888v-25.6h204.8v51.2h-204.8v-25.6zM435.2 165.888v-38.298l-135.885-0.614-4.915-3.072c-5.734-3.584-10.547-9.83-11.776-15.462-0.512-2.15-1.024-10.342-1.024-18.022v-14.131h460.8v14.643c0 17.818-1.331 22.63-7.885 28.979-7.987 7.782-5.632 7.578-79.872 7.578h-65.843v76.8h-153.6v-38.4z" />
+<glyph unicode="&#xe9fa;" glyph-name="Full_screen_view" d="M233.984 829.952c-39.219-6.963-73.421-32.051-91.443-67.072-6.451-12.39-9.011-19.968-13.107-38.4-0.512-1.946-1.024-151.347-1.126-332.083l-0.307-328.397h324.198c287.642 0 325.427 0.205 334.95 1.638 45.466 6.656 83.354 37.274 100.659 81.306 1.229 3.072 3.379 10.138 4.915 15.77l2.765 10.342 0.307 329.523 0.205 329.421-325.837-0.102c-307.917-0.102-326.554-0.205-336.179-1.946zM819.2 471.040c0-207.053-0.307-285.491-1.126-289.485-4.198-19.354-20.275-35.533-39.629-39.629-3.891-0.819-83.968-1.126-289.485-1.126h-284.16v283.443c0 199.168 0.307 285.286 1.126 289.587 3.379 18.33 18.637 34.714 37.478 39.834 3.994 1.126 57.037 1.331 290.406 1.434l285.389 0.102v-284.16zM546.918 669.082l34.918-34.918-52.122-52.429c-44.339-44.544-52.531-53.248-54.886-58.163-6.861-14.438-6.349-30.72 1.434-44.339 3.277-5.837 58.368-61.645 64.922-65.843 13.414-8.602 31.539-9.626 46.285-2.56 5.12 2.355 13.619 10.445 58.266 54.886l52.429 52.122 69.837-69.837-0.307 109.261c-0.102 60.211-0.614 110.49-0.922 111.821-4.403 14.746-15.667 26.931-30.003 32.461-4.915 1.843-9.626 1.946-114.995 2.253l-109.875 0.307 35.021-35.021z" />
+<glyph unicode="&#xe9fb;" glyph-name="Gallery" d="M153.6 521.216c0-314.061-0.41-292.352 6.144-307.917 7.475-17.613 23.040-33.28 40.346-40.755l4.71-1.946v584.602l584.704 0.512-4.096 8.090c-9.83 19.354-23.962 31.334-47.104 39.731l-6.656 2.355-578.048 0.512v-285.184zM230.707 441.139c0.205-275.866 0.307-288.87 2.15-294.707 8.704-28.774 30.822-49.357 59.187-55.194 7.066-1.434 36.557-1.638 293.171-1.638h285.184l-0.307 288.563c-0.205 275.968-0.307 288.768-2.15 294.605-9.011 29.696-32.768 51.098-62.054 55.706-4.506 0.717-99.84 1.126-291.123 1.126h-284.365l0.307-288.461zM798.925 675.635c6.758-3.072 13.21-9.421 16.794-16.384l2.97-5.939 0.307-179.61 0.205-179.507-3.789 4.506c-4.506 5.325-21.811 25.395-23.347 27.034-0.512 0.614-3.277 3.789-6.144 7.066-7.168 8.397-33.382 38.605-40.346 46.592-3.174 3.686-11.571 13.312-18.534 21.504-7.066 8.192-13.005 15.053-13.312 15.36-0.614 0.614-12.8 14.541-16.589 18.944-1.434 1.741-4.608 5.427-6.963 8.192-2.458 2.867-6.963 8.090-10.24 11.776-3.174 3.686-12.186 14.029-19.968 23.040-15.77 18.33-18.842 20.992-23.859 20.992-3.789 0-9.626-3.072-11.776-6.042-0.614-1.024-3.584-4.608-6.451-7.885s-22.835-26.522-44.442-51.61c-21.504-25.088-40.346-47.002-41.882-48.64-1.434-1.741-8.192-9.523-14.95-17.408-6.656-7.885-12.493-14.541-12.8-14.848s-1.946-2.253-3.789-4.301c-2.97-3.482-3.277-3.584-4.71-2.048-0.819 0.922-10.752 14.848-22.118 30.925s-21.504 30.208-22.426 31.437c-0.922 1.229-7.27 10.138-14.029 19.661-13.21 18.842-16.998 22.221-23.45 20.992-4.915-0.819-6.042-1.843-19.251-16.486-6.861-7.782-12.8-14.336-13.107-14.643s-9.728-10.854-20.992-23.552c-11.264-12.698-22.323-25.088-24.678-27.648s-5.837-6.451-7.68-8.704c-1.946-2.253-4.198-4.813-5.12-5.632-0.819-0.819-5.018-5.427-9.216-10.24s-9.011-10.24-10.752-12.186l-3.174-3.482-4.71 4.301c-2.56 2.458-5.939 6.349-7.27 8.806-6.042 10.138-5.734 1.946-5.734 177.357v161.075l512.512-0.512 4.813-2.253zM393.933 609.28c-10.035-2.867-18.022-7.782-25.293-15.565-20.173-21.504-20.275-54.784-0.205-76.186 17.715-18.944 43.11-23.45 66.765-11.981 7.782 3.789 19.968 15.258 23.552 22.323 6.144 12.083 8.499 27.443 6.042 39.424-3.277 15.462-16.179 31.744-30.618 38.707-13.21 6.349-26.214 7.373-40.243 3.277z" />
+<glyph unicode="&#xe9fc;" glyph-name="games" d="M311.808 728.474c-42.394-6.144-79.258-31.949-99.533-69.53-3.174-6.042-5.12-10.65-47.923-113.664-15.565-37.478-31.027-74.547-34.304-82.432s-10.035-23.962-14.848-35.84c-9.318-22.426-14.336-34.406-15.872-37.888-0.512-1.126-3.277-7.782-6.144-14.848s-6.042-14.848-7.168-17.408c-21.299-49.152-8.192-111.309 31.744-151.45 53.043-53.146 134.144-51.712 186.675 3.379 11.981 12.595 19.968 25.395 29.389 47.206 6.656 15.36 10.24 21.504 17.306 30.208 14.029 17.306 31.437 28.467 49.766 32.256 7.27 1.434 19.968 1.536 114.176 1.331l105.984-0.307 7.168-2.355c19.354-6.451 36.045-19.866 48.64-38.912 2.765-4.198 8.090-14.746 11.776-23.552 9.626-22.323 19.149-36.659 33.69-50.79 34.918-33.69 85.197-45.978 128.922-31.334 9.728 3.277 24.781 10.445 30.618 14.541 26.214 18.534 43.315 39.731 54.374 67.379 6.349 15.974 8.909 28.979 9.421 47.616 0.614 24.883-2.048 36.25-16.896 72.192-5.632 13.824-10.957 26.522-11.674 28.16-0.819 1.741-10.957 26.112-22.63 54.272s-22.938 55.398-25.19 60.416c-2.15 5.12-15.462 37.069-29.594 71.168s-27.546 65.536-29.798 69.939c-6.554 12.698-12.698 20.89-24.371 32.563-18.944 18.739-38.707 29.594-67.174 36.454-6.656 1.638-22.426 1.741-203.776 1.946-108.134 0.102-199.373-0.205-202.752-0.717zM361.165 636.928c7.68-3.482 15.053-10.854 19.046-18.842l3.277-6.758 0.307-30.413 0.307-30.515h27.341c30.515 0 35.84-0.717 44.544-6.349 9.523-6.144 17.101-19.968 17.101-31.334 0-11.981-6.144-24.781-14.95-31.027-10.752-7.68-13.21-8.090-46.182-8.090h-27.955l-0.102-27.853c0-15.36-0.205-28.979-0.512-30.208-2.15-11.674-10.65-22.733-21.709-28.16-6.144-3.072-7.68-3.379-16.077-3.379s-9.933 0.307-15.974 3.277c-8.192 3.994-15.36 11.366-19.149 19.558l-2.765 5.837-0.307 30.515-0.41 30.413h-27.75c-31.334 0-35.021 0.614-44.134 6.656-21.504 14.234-22.528 47.206-1.946 62.259 9.933 7.27 9.83 7.27 43.622 7.68l30.413 0.41v27.75c0 30.003 0.614 34.816 5.427 43.008 2.97 5.12 10.24 11.981 15.155 14.643 9.626 5.018 23.654 5.427 33.382 0.922zM694.374 635.699c8.294-3.891 14.746-10.342 18.739-18.739 2.765-5.939 3.174-7.68 3.174-15.872s-0.41-9.933-3.174-15.872c-3.994-8.397-10.342-14.746-18.842-18.842-5.939-2.867-7.68-3.174-15.872-3.174-8.397 0-9.933 0.307-16.077 3.379-8.704 4.301-14.541 10.138-18.637 18.637-2.765 5.939-3.174 7.68-3.174 15.872s0.307 9.933 3.174 15.872c9.421 19.558 31.539 27.75 50.688 18.739zM604.262 546.611c24.371-11.571 29.798-43.11 10.65-62.054-11.366-11.162-28.262-13.926-43.008-7.066-17.51 8.294-26.010 28.16-19.866 46.592 7.27 21.709 31.642 32.256 52.224 22.528zM782.848 546.918c30.208-13.824 30.515-55.398 0.512-69.632-5.939-2.765-7.68-3.174-15.872-3.174s-9.933 0.41-15.872 3.174c-25.19 12.083-30.106 43.725-9.83 63.181 10.24 9.728 27.853 12.493 41.062 6.451zM694.374 457.523c23.859-11.162 29.798-42.598 11.469-61.133-8.294-8.499-17.203-11.981-29.389-11.469-14.336 0.512-26.419 8.704-32.768 22.118-2.867 5.939-3.174 7.68-3.174 15.872 0 8.397 0.307 9.933 3.277 15.974 5.325 10.752 14.746 18.637 25.6 21.402 7.27 1.741 17.818 0.614 24.986-2.765z" />
+<glyph unicode="&#xe9fd;" glyph-name="Gas_tank" d="M428.237 779.776c-1.843-0.41-5.222-2.048-7.578-3.686-16.998-11.776-13.312-37.99 6.349-44.954 2.458-0.819 5.222-1.536 6.246-1.536 1.843 0 1.946-0.922 1.946-12.8v-12.8h-131.072c-89.907 0-132.71-0.307-136.397-1.126-19.456-3.994-37.274-15.974-53.35-36.045-29.594-36.966-51.098-96.87-59.085-164.557-0.614-5.325-1.331-11.059-1.536-12.8-2.765-20.685-2.662-90.522 0-109.568 0.307-1.638 1.126-8.397 2.048-14.848 3.379-25.702 5.939-39.219 11.776-61.235 17.51-66.253 49.664-115.917 85.094-131.584 10.035-4.403 18.842-5.837 36.147-5.837h15.974v-25.6h-25.6v-51.2h153.6v51.2h-25.6v25.6h358.4v218.726c0 200.090 0.102 219.034 1.638 222.208 2.97 6.246 9.83 8.499 16.486 5.53 7.168-3.174 7.475-4.71 7.475-35.84v-26.624h102.4v26.522c0 15.667 0.41 27.648 1.024 29.491 3.379 9.626 18.534 10.24 22.938 0.922 1.536-3.174 1.638-21.914 1.638-222.31v-218.829l19.251 0.41c17.408 0.512 19.866 0.717 26.829 3.277 24.576 8.704 46.592 30.822 64.819 65.126 17.408 32.973 29.696 73.011 37.069 120.832 0.307 2.458 2.048 16.794 3.072 25.088 2.765 24.576 2.765 89.702 0.102 107.008-0.205 1.434-0.717 5.53-1.126 9.216-3.789 38.4-14.541 82.227-28.57 116.224-16.794 40.55-43.315 73.114-68.608 84.48-13.414 6.042-2.458 5.53-148.787 5.837l-134.451 0.307v25.293l5.53 1.229c7.168 1.536 13.005 5.837 16.691 12.083 2.458 4.198 2.867 6.042 2.867 12.698 0 6.861-0.41 8.397-3.072 12.8-3.379 5.325-9.114 9.83-14.95 11.571-4.301 1.331-162.099 1.434-167.629 0.102zM691.2 486.4v-38.4h102.4v76.8h-102.4v-38.4zM691.2 384v-38.4h102.4v76.8h-102.4v-38.4zM691.2 281.6v-38.4h102.4v76.8h-102.4v-38.4zM691.2 179.2v-38.4h-25.6v-51.2h153.6v51.2h-25.6v76.8h-102.4v-38.4z" />
+<glyph unicode="&#xe9fe;" glyph-name="gaugecapacity" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-62.976-50.893-109.875-117.043-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-56.32 75.366-137.216 130.97-228.762 157.082-23.040 6.554-51.2 11.981-72.704 14.029-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM546.816 804.966c1.434-0.307 8.090-1.229 14.848-2.15 50.688-6.656 103.731-26.624 146.432-54.886 16.077-10.65 29.286-20.787 44.442-34.406l3.686-3.174-27.136-27.136-27.034-27.238-5.018 4.301c-15.77 13.312-35.123 27.136-36.25 25.907-0.614-0.614-5.837-28.365-20.378-107.622-2.048-11.571-12.288-67.072-15.258-82.944-1.331-7.27-4.813-26.214-7.68-41.984-5.427-29.798-8.294-40.755-13.619-51.2-9.011-17.92-23.45-33.28-40.141-42.701-15.974-9.011-30.822-13.21-48.64-13.722-40.243-1.024-76.288 20.582-94.72 56.934-11.469 22.63-13.619 52.634-5.53 77.107 3.994 12.288 10.035 22.221 35.226 57.549 14.029 19.763 27.136 38.195 29.082 41.062 5.734 8.090 30.106 42.496 64 90.214 32.87 46.080 36.659 51.814 35.533 52.429-2.15 1.331-24.166 5.325-36.966 6.656-22.118 2.355-61.44 1.024-80.384-2.867-10.138-2.048-18.33-3.891-22.733-5.222-2.97-0.819-7.578-2.15-10.24-2.97-10.957-3.072-26.317-9.421-41.882-17.101-21.402-10.65-40.038-23.040-58.778-38.912l-5.734-4.813-26.829 26.829c-14.746 14.746-26.829 27.136-26.829 27.546 0 0.512 12.595 11.469 23.040 19.968 20.685 16.998 59.392 39.322 87.040 50.176 27.443 10.752 59.699 19.456 83.354 22.221 2.56 0.307 5.837 0.819 7.27 1.024s6.246 0.717 10.752 1.126c4.506 0.307 8.397 0.819 8.602 1.024 0.512 0.512 55.603-0.41 58.47-1.024zM277.197 664.883l26.829-26.829-2.97-3.584c-1.536-2.048-3.789-4.608-4.813-5.734-8.499-9.011-24.371-32.563-33.178-49.050l-6.246-11.878 5.53-2.355c2.97-1.229 13.619-5.734 23.552-9.933l18.125-7.475-1.331-3.174c-0.717-1.741-2.867-6.963-4.813-11.674-2.458-6.246-3.891-8.397-5.018-8.090-0.819 0.205-23.45 9.523-50.176 20.685s-52.531 21.811-57.344 23.757c-4.813 1.946-8.806 3.686-9.011 3.789-0.102 0.205 1.638 4.915 3.994 10.445 15.462 37.376 36.352 70.861 63.181 101.581 3.072 3.482 5.837 6.349 6.246 6.349 0.307 0 12.698-12.083 27.443-26.829zM783.053 682.291c20.48-24.064 34.202-44.339 48.435-71.987 5.837-11.366 16.794-36.352 16.077-36.966-0.205-0.205-51.712-21.606-97.792-40.55-10.854-4.506-19.968-7.987-20.173-7.885-0.205 0.205-1.741 3.891-3.379 8.090-1.741 4.198-3.789 9.318-4.71 11.366l-1.536 3.789 21.709 8.909c11.981 4.915 22.528 9.421 23.552 9.933 1.638 0.819 1.434 1.638-2.56 9.318-4.403 8.602-13.722 24.371-17.715 29.901-7.27 10.138-14.643 19.661-19.456 25.293l-5.53 6.451 26.829 26.931c14.746 14.746 27.136 26.829 27.546 26.829 0.307 0 4.301-4.301 8.704-9.421zM646.246 769.843c-9.011-12.39-21.709-30.31-38.4-54.067-9.523-13.517-19.251-27.136-21.504-30.31-2.355-3.072-6.451-9.011-9.318-13.005-2.765-4.096-10.445-14.848-16.998-24.064-6.451-9.114-19.661-27.648-29.286-41.165-9.523-13.517-32.154-45.261-50.074-70.656-18.022-25.293-33.894-48.23-35.43-50.79-11.981-20.48-12.902-49.766-2.15-70.861 10.138-20.070 27.546-34.714 48.435-40.653 11.981-3.379 27.75-3.584 39.424-0.512 26.112 6.963 46.797 26.214 54.374 50.586 1.331 4.301 9.318 45.67 15.258 78.95 1.331 7.578 3.584 20.070 5.018 27.648s4.198 22.835 6.246 33.792c2.048 10.957 4.403 23.654 5.222 28.16s1.843 9.626 2.048 11.264c0.307 1.741 1.946 10.445 3.584 19.456 1.741 9.011 3.482 18.739 3.994 21.504 1.536 9.216 8.090 44.851 9.626 52.736 1.331 6.758 3.584 18.944 5.12 28.16 0.307 1.741 1.024 5.632 1.741 8.704 0.614 3.072 1.331 7.27 1.638 9.216s1.741 9.933 3.277 17.715c1.536 7.68 2.662 14.029 2.56 14.029s-2.048-2.662-4.403-5.837z" />
+<glyph unicode="&#xe9ff;" glyph-name="gauge_counter" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-72.192-5.53-144.179-30.618-205.824-71.578-84.48-56.218-147.661-141.722-176.026-238.285-6.656-22.528-12.493-49.971-14.438-68.096-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.534-2.56-74.65 0.717-100.352 15.872-125.338 83.046-235.008 188.314-307.302 48.23-33.178 109.568-57.958 168.141-67.994 29.696-5.12 42.496-6.144 75.571-6.144 26.419 0 33.28 0.41 56.218 3.174 61.133 7.373 125.133 30.72 179.2 65.434 16.486 10.65 41.267 29.491 55.398 42.291 71.578 64.922 117.965 147.149 136.602 241.869 1.331 7.066 2.765 14.848 3.072 17.408 0.614 5.018 1.536 12.083 2.15 16.896 2.048 14.029 2.765 62.362 1.229 81.408-1.229 16.794-4.506 39.629-7.885 55.296-27.546 130.355-112.435 240.538-231.219 300.032-41.779 20.89-90.829 36.352-131.891 41.472-2.765 0.41-5.734 0.819-6.554 1.024s-5.222 0.717-9.728 1.126c-4.506 0.307-9.318 0.819-10.752 1.126-2.97 0.512-61.030 1.331-61.542 0.922zM546.816 804.966c1.434-0.307 8.090-1.229 14.848-2.15 13.619-1.741 15.77-2.15 34.816-6.656 127.181-30.106 230.605-131.994 262.554-258.662 4.198-16.896 5.632-24.064 8.806-45.466 2.048-14.234 2.765-53.35 1.331-73.421-1.946-26.214-8.602-58.88-17.306-84.582-18.227-53.658-48.026-101.478-87.859-140.595l-7.782-7.578-54.067 54.067 9.011 8.909 8.909 8.909 18.125-17.92 18.022-17.92 4.608 5.12c13.722 15.36 29.389 37.274 39.834 55.296 6.246 10.854 13.926 26.317 13.312 26.726-0.205 0.205-10.854 4.608-23.552 9.83l-23.245 9.523 4.608 10.957c2.458 5.939 4.915 11.264 5.325 11.674s11.059-3.584 23.757-8.806c12.595-5.325 23.040-9.523 23.245-9.421 0.819 0.717 7.885 23.040 10.547 33.587 5.12 20.378 9.216 48.742 9.523 65.741l0.102 3.072h-25.395l-25.395-0.102 0.307 12.902 0.307 12.8h50.176l-0.102 4.608c-0.307 15.974-3.994 40.96-9.114 61.952-3.072 12.8-8.909 31.846-10.65 34.918-0.41 0.717-8.806-2.355-23.552-8.499-12.698-5.222-23.347-9.216-23.757-8.806-0.41 0.512-2.867 5.734-5.325 11.776l-4.608 10.854 23.245 9.523c12.698 5.222 23.347 9.626 23.552 9.83 0.614 0.41-5.53 13.005-11.469 23.347-11.366 20.070-24.576 38.81-39.014 55.501l-7.27 8.499-36.147-36.147-9.011 8.909-9.011 8.806 18.022 18.227 18.125 18.125-2.458 2.15c-9.421 8.397-22.221 18.637-30.822 24.781-15.053 10.65-34.202 21.914-34.714 20.378-0.307-1.024-4.403-22.221-7.168-38.093-0.307-1.638-1.741-9.011-3.072-16.384-1.331-7.27-5.53-29.901-9.216-50.176-3.789-20.275-8.192-44.237-9.83-53.248s-3.686-20.070-4.506-24.576c-1.229-7.168-6.451-35.533-20.48-111.104-4.096-22.426-4.915-25.907-7.782-33.587-9.011-24.781-29.389-46.592-53.76-57.651-3.686-1.741-11.162-4.301-16.589-5.734-8.704-2.458-11.878-2.765-25.293-2.765-12.902-0.102-16.794 0.307-24.474 2.355-39.322 10.24-67.482 39.629-76.493 79.462-1.843 8.602-2.048 28.672-0.307 37.888 3.584 18.432 8.806 29.491 23.654 50.381 6.042 8.602 16.179 22.835 22.528 31.744 6.246 8.909 43.52 61.338 82.637 116.531s70.861 100.659 70.451 101.069c-1.434 1.434-29.082 7.987-44.134 10.547-13.824 2.355-29.286 3.994-37.99 4.096h-3.584v-50.79l-25.6 0.614-0.102 24.064c-0.102 13.21-0.205 24.678-0.307 25.395-0.102 1.024-1.331 1.229-4.915 0.819-2.765-0.307-8.397-0.819-12.595-1.126-9.626-0.717-25.19-3.072-38.093-5.632-17.101-3.584-47.411-12.698-46.49-14.234 2.355-3.789 18.944-45.67 18.33-46.285-0.512-0.41-5.734-2.867-11.674-5.325l-10.957-4.608-9.523 23.040c-5.222 12.595-9.933 23.142-10.342 23.45s-4.198-1.229-8.192-3.277c-27.546-14.234-51.507-30.413-73.318-49.562l-5.325-4.608 36.25-36.25-18.022-17.818-36.147 36.147-7.27-8.499c-9.728-11.366-16.282-19.866-24.166-31.437-10.854-15.872-27.034-45.261-26.010-46.899 0.307-0.512 10.854-5.12 23.45-10.445l23.040-9.421-4.608-10.957c-2.458-5.939-4.915-11.162-5.325-11.674-0.41-0.41-11.059 3.584-23.757 8.806-12.595 5.325-23.040 9.523-23.245 9.421-0.614-0.512-6.451-18.432-8.909-27.034-4.71-16.998-8.909-40.243-10.24-56.422-1.434-17.306-1.434-18.432-0.205-18.534 0.717-0.102 11.571-0.307 24.269-0.41s23.654-0.307 24.371-0.41c0.922-0.102 1.229-3.379 1.229-12.698v-12.595l-24.269 0.102c-13.414 0.102-24.883-0.102-25.498-0.307-1.536-0.41-1.024-10.854 1.741-32.461 2.355-18.534 8.909-46.080 14.848-62.669l2.662-7.27 3.789 1.536c26.829 11.366 42.598 17.613 43.213 16.998 0.41-0.512 2.867-5.734 5.325-11.674l4.608-10.957-23.245-9.523c-12.698-5.222-23.347-9.626-23.552-9.83-0.717-0.512 9.421-20.275 16.896-32.563 10.854-18.022 18.842-28.877 39.322-53.043 1.434-1.638 2.867-0.41 19.661 16.384l18.022 18.022 18.022-17.818-27.136-27.034-27.034-27.136-6.656 6.451c-60.314 58.061-97.997 138.035-106.291 224.973-1.536 15.872-0.717 61.747 1.331 73.933 0.205 1.331 0.922 6.042 1.536 10.547 11.776 81.818 54.886 160.461 118.682 216.269 56.422 49.357 129.843 80.691 203.366 86.938 4.506 0.307 8.397 0.819 8.602 1.024 0.512 0.512 55.603-0.41 58.47-1.024zM629.76 746.803c-10.957-15.36-28.774-40.653-39.834-56.115-33.894-47.923-62.669-88.474-103.526-145.92-21.606-30.413-41.062-58.778-43.213-62.976-9.523-18.944-10.342-41.677-2.355-62.054 17.613-44.339 70.861-61.85 111.923-36.864 14.541 8.909 27.648 25.498 32.563 41.472 1.126 3.789 9.626 47.514 13.722 71.27 0.922 5.222 7.373 40.038 13.926 75.776 2.048 10.752 5.222 27.955 7.066 38.4 7.168 38.912 14.336 77.926 21.094 114.176 1.638 9.011 3.686 20.275 4.506 25.088 0.922 4.813 2.253 12.288 3.174 16.691s1.434 8.294 1.126 8.499c-0.205 0.205-9.318-12.186-20.173-27.443z" />
+<glyph unicode="&#xea00;" glyph-name="gauge_rate" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-22.733-9.318-62.054-31.642-81.92-46.387-2.56-1.946-5.939-4.403-7.68-5.632-12.698-9.421-30.208-24.576-45.466-39.731-45.67-45.056-81.101-101.069-103.219-162.714-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM546.304 805.069c1.126-0.307 4.403-0.819 7.168-1.126 42.394-5.325 77.312-15.462 114.176-33.075 15.462-7.475 25.395-13.107 40.96-23.552 17.101-11.366 16.794-11.162 25.6-18.125 55.091-44.134 95.437-101.376 117.658-167.117 7.578-22.426 14.131-52.224 15.974-72.090 0.41-3.686 0.819-7.168 1.024-7.782s0.717-8.602 1.126-17.715l0.717-16.486h-77.005c-42.291 0-76.902 0.307-77.005 0.819-0.102 0.41-0.307 3.072-0.512 5.837-4.096 56.013-22.528 107.213-54.682 152.064-3.891 5.325-8.294 11.264-9.933 13.21l-2.97 3.379-4.915-26.931c-2.765-14.848-5.222-27.955-5.427-29.082s-1.024-5.734-1.843-10.24c-1.843-10.342-12.186-66.662-19.456-105.574-3.072-16.384-6.554-32.768-7.782-36.352-9.011-26.317-29.594-49.050-54.784-60.416-22.528-10.24-49.664-11.674-74.035-3.994-24.269 7.68-47.104 27.136-58.88 50.176-8.090 15.77-10.957 27.034-11.366 45.056-0.41 14.848 1.638 26.726 6.758 39.731 4.198 10.547 7.168 15.565 19.046 32.154 5.53 7.68 17.306 24.269 26.214 36.864s34.816 49.050 57.549 81.203c22.835 32.051 41.062 58.675 40.653 59.085-1.638 1.536-19.866 10.035-30.925 14.438-24.678 9.626-48.333 15.36-76.698 18.637-15.872 1.741-53.248 1.331-68.71-0.922-65.331-9.216-120.627-36.352-168.346-82.432l-9.011-8.806 5.427 8.192c44.442 66.97 106.086 115.302 181.146 142.029 20.787 7.475 49.869 14.541 68.506 16.691 2.56 0.307 5.632 0.819 6.758 1.024s6.451 0.717 11.776 1.126c5.325 0.307 9.933 0.819 10.138 1.024 0.614 0.512 53.35-0.41 55.91-0.922zM647.475 771.789c-1.126-1.536-13.926-19.558-28.467-40.141s-30.925-43.622-36.25-51.2c-5.427-7.578-10.547-14.848-11.366-16.077-0.819-1.126-5.222-7.373-9.83-13.824-4.506-6.349-18.33-25.805-30.72-43.315-12.39-17.408-36.352-51.098-53.146-74.752-31.642-44.442-36.864-52.941-39.936-64.717-2.15-8.192-2.867-25.088-1.434-33.075 3.686-19.354 13.926-35.942 29.798-47.923 25.702-19.456 60.621-20.685 87.962-3.072 14.131 9.114 26.522 25.19 31.232 40.653 1.126 3.686 8.397 40.96 13.312 68.198 0.307 1.741 1.126 6.758 1.946 11.264 2.458 13.414 13.722 74.854 15.974 86.733 1.126 6.042 2.253 12.288 2.56 13.824 0.922 5.018 2.662 14.438 12.288 66.867 1.434 7.578 4.403 23.859 6.554 36.045 4.198 23.142 4.301 23.45 6.042 32.563 3.174 15.872 6.349 34.099 5.939 34.406-0.205 0.205-1.331-0.922-2.458-2.458z" />
+<glyph unicode="&#xea01;" glyph-name="gauge-mon-reseau" d="M508.826 883.814c-0.205-0.205-7.987-0.614-17.306-0.922-16.179-0.614-36.045-2.458-46.080-4.301-0.819-0.102-3.584-0.614-6.144-1.024-2.56-0.307-11.264-2.048-19.354-3.686-119.501-25.088-224.051-101.171-285.389-207.872-28.467-49.562-47.309-105.779-54.17-161.178-0.922-7.27-1.843-14.95-2.15-16.896s-0.717-19.046-1.024-37.888c-0.41-28.058-0.205-35.328 1.024-39.834 5.222-19.046 20.685-33.997 39.322-37.888 3.891-0.819 114.278-1.126 394.24-1.126 339.763 0 389.632 0.205 395.264 1.536 17.51 4.096 31.539 16.998 37.478 34.304l2.662 7.68-0.41 33.792c-0.307 18.637-0.717 35.43-1.024 37.376s-1.024 8.397-1.638 14.336c-13.21 121.549-83.558 236.954-187.392 307.405-69.325 47.002-153.395 74.24-232.858 75.469-7.27 0.102-13.619 0.41-13.926 0.614-0.41 0.307-0.922 0.307-1.126 0.102zM543.232 806.298c75.059-7.168 141.414-34.816 199.475-83.354l13.107-10.957-2.355-2.662c-7.373-8.090-48.947-49.357-49.664-49.357-0.41 0-4.403 2.97-8.704 6.554-15.053 12.493-42.291 30.31-43.93 28.57-1.126-1.126-18.022-54.374-36.045-113.459-10.65-34.816-30.515-101.376-33.69-112.64-1.126-3.891-2.355-7.578-2.765-8.192-0.41-0.512-1.331-3.072-2.048-5.632-2.048-7.066-8.806-19.251-14.746-26.624-7.373-9.011-16.896-16.486-27.853-21.914-12.288-6.144-19.149-7.782-33.792-8.499-10.445-0.41-13.619-0.205-20.992 1.741-40.243 10.342-66.253 48.435-60.826 89.19 1.331 10.035 3.482 17.306 7.68 25.6 4.71 9.421 8.192 14.029 25.088 32.768 8.909 9.83 19.354 21.402 23.347 25.907 3.994 4.403 7.782 8.602 8.294 9.216 0.614 0.614 9.318 10.342 19.456 21.606 10.035 11.264 18.842 20.992 19.456 21.606 1.638 1.741 15.872 17.613 22.016 24.474 2.97 3.379 6.144 6.861 7.066 7.782s5.12 5.53 9.318 10.24c4.198 4.71 14.848 16.384 23.552 26.010 8.704 9.523 16.691 18.33 17.613 19.354 1.024 1.126 1.843 2.355 1.843 2.765 0 1.331-18.637 6.451-33.792 9.523-40.55 8.090-84.787 6.861-125.44-3.482-42.086-10.65-79.36-29.798-113.766-58.47l-8.294-6.861-27.034 27.034-27.034 27.136 5.632 5.222c3.072 2.97 10.138 8.806 15.565 13.21 52.838 42.086 114.278 67.584 182.579 75.674 16.896 1.946 55.603 2.458 71.68 0.922zM276.582 666.112c14.643-14.541 26.522-26.931 26.522-27.341s-2.765-3.994-6.144-7.987c-8.090-9.421-18.842-24.371-25.907-35.84-6.246-10.342-14.336-26.112-13.722-26.726 0.41-0.41 20.070-8.704 36.864-15.462 4.915-1.946 8.909-4.096 8.909-4.813-0.102-2.15-9.114-22.63-9.933-22.426-0.41 0.102-13.722 5.53-29.491 12.083-15.77 6.656-33.997 14.131-40.448 16.794-36.864 15.258-45.67 18.944-46.387 19.558-2.048 1.843 15.77 39.731 28.672 60.928 9.011 14.848 18.739 28.672 28.877 40.96 7.475 9.114 14.541 16.896 15.258 16.896 0.205 0 12.39-11.981 26.931-26.624zM779.878 686.899c28.672-33.178 50.278-68.403 65.536-107.008l2.253-5.837-20.173-8.294c-79.155-32.87-96.666-40.038-97.587-39.731s-10.342 22.426-9.728 22.938c0.102 0.102 9.216 3.891 20.173 8.397s21.402 8.806 23.245 9.626l3.277 1.434-6.144 11.674c-9.421 18.022-25.805 41.779-37.888 55.091l-3.277 3.482 27.034 27.034c14.848 14.848 27.238 27.034 27.648 27.034 0.307 0 2.765-2.662 5.632-5.837zM617.37 693.555c-4.71-5.222-8.806-9.728-9.114-10.035s-9.114-9.933-19.456-21.504c-10.342-11.571-19.149-21.197-19.456-21.504s-10.854-11.981-23.552-26.112c-12.698-14.029-24.883-27.648-27.341-30.208-2.355-2.56-5.12-5.53-6.144-6.758-1.946-2.253-15.565-17.408-19.661-21.811-4.608-5.12-16.998-18.842-18.637-20.787-0.922-1.024-5.222-5.837-9.626-10.547-4.403-4.813-9.216-10.445-10.65-12.595-7.168-9.933-10.854-23.040-10.035-35.533 1.331-22.528 15.053-41.165 36.147-49.254 8.704-3.379 23.347-4.198 32.154-1.843 19.456 5.222 35.123 20.685 40.448 40.243 0.717 2.56 7.168 23.347 14.336 46.182s13.619 43.52 14.336 46.080c0.717 2.56 5.939 19.558 11.674 37.888 12.39 39.322 16.589 53.146 23.654 75.776 2.867 9.318 6.349 20.275 7.68 24.371 1.331 3.994 2.253 7.373 2.048 7.373-0.102 0-4.096-4.301-8.806-9.421z" />
+<glyph unicode="&#xea02;" glyph-name="generic_document" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM699.494 574.464c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493s-0.41-8.397-2.765-12.39c-3.379-5.734-8.704-9.933-14.95-11.776-3.789-1.229-35.533-1.434-187.597-1.434-200.704 0-185.958-0.41-194.253 5.837-11.571 8.806-12.39 27.136-1.741 37.786 7.987 7.987-7.475 7.475 197.12 7.475 161.178 0.102 183.501-0.102 187.392-1.434zM699.699 471.962c6.758-2.253 13.312-8.909 15.565-15.77 3.379-10.138 0-22.016-7.987-28.058-7.987-6.144 4.403-5.734-195.174-5.734-205.926 0-189.030-0.717-197.325 7.885-11.264 11.571-9.626 29.491 3.584 38.605 2.253 1.638 5.632 3.277 7.475 3.686s85.709 0.819 186.266 0.922c164.966 0.102 183.296-0.102 187.597-1.536zM699.29 369.562c5.734-1.638 11.981-6.963 14.95-12.8 4.71-8.909 2.458-21.606-5.12-29.184-8.192-8.192 7.168-7.578-197.12-7.578-204.8 0-189.030-0.614-197.12 7.782-10.035 10.342-10.035 25.702 0 35.738 8.090 8.090-8.294 7.475 196.198 7.578 162.509 0.102 183.398-0.102 188.211-1.536zM443.904 267.162c5.222-1.843 11.571-7.373 14.541-12.902 1.229-2.355 1.843-5.632 1.843-11.059 0-6.554-0.41-8.397-2.765-12.39-1.536-2.56-4.403-5.939-6.349-7.475-7.578-5.734-7.373-5.734-67.072-5.734-61.747 0-61.542 0-68.813 7.27-5.12 5.12-7.066 9.216-7.782 15.77-0.819 7.782 1.843 15.053 7.578 20.685 7.68 7.373 6.963 7.373 69.018 7.373 48.333 0.102 55.398-0.102 59.802-1.536zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xea03;" glyph-name="geolocation" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM737.178 657.818c-7.066-14.336-32.256-65.741-42.394-86.426-5.222-10.65-15.36-31.437-22.528-46.080s-17.818-36.25-23.552-48.128c-5.734-11.776-16.384-33.485-23.552-48.128s-17.818-36.25-23.552-48.128c-5.734-11.776-16.384-33.485-23.552-48.128s-17.408-35.533-22.733-46.49c-5.325-10.957-18.33-37.478-28.877-58.88-10.547-21.504-20.070-40.96-21.094-43.418-1.024-2.355-2.253-4.301-2.56-4.301-0.512 0-6.451 20.992-21.709 77.312-1.126 3.994-2.662 9.523-3.379 12.288-3.174 11.469-8.909 32.563-12.8 47.104-2.458 9.318-8.704 32.051-10.24 37.376-0.512 1.946-2.253 8.192-3.789 13.722l-2.867 10.138-40.96 11.162c-22.528 6.144-52.429 14.234-66.56 18.125-14.029 3.891-39.629 10.752-56.832 15.462-17.203 4.608-31.949 8.602-32.768 8.909-1.536 0.512 4.608 3.686 34.816 18.125 18.022 8.602 42.086 20.173 59.392 28.467 7.066 3.379 17.408 8.397 23.040 11.059s16.486 7.885 24.064 11.571c7.578 3.584 18.432 8.806 24.064 11.469s19.661 9.421 31.13 14.95c11.469 5.632 20.992 10.138 21.094 10.138 0.205 0 9.933 4.71 21.606 10.342 11.776 5.734 25.6 12.288 30.618 14.746 5.12 2.355 13.619 6.451 18.944 9.011s17.101 8.192 26.112 12.493c9.011 4.403 21.504 10.342 27.648 13.312 42.189 20.173 56.934 27.238 74.752 35.84 9.011 4.301 19.661 9.421 23.552 11.264 16.384 7.68 44.237 21.094 46.592 22.528 1.434 0.717 2.662 1.024 2.867 0.614 0.102-0.41-1.638-4.71-3.994-9.421z" />
+<glyph unicode="&#xea04;" glyph-name="hands_free" d="M109.466 907.264c-7.373-1.946-13.722-5.53-18.842-10.547-5.939-5.734-9.114-10.65-11.674-18.33-2.048-5.939-2.048-8.499-2.15-339.763 0-359.629-0.307-338.125 5.222-349.082 5.325-10.854 18.534-20.48 30.618-22.528 1.434-0.307 58.47-0.512 126.771-0.512 123.597-0.102 124.109-0.102 124.109-2.15 0-1.126 1.126-6.861 2.56-12.698 14.438-61.338 54.272-111.411 110.182-138.65 34.099-16.486 73.114-23.45 110.49-19.558 60.723 6.246 115.712 39.629 149.606 90.522 8.294 12.493 18.534 33.382 23.245 47.821 5.12 15.462 7.885 27.75 10.035 45.363 0.41 2.867 0.819 71.68 0.922 153.088 0.205 81.408 0.307 148.173 0.41 148.48s4.403 1.126 9.728 1.843c12.698 1.741 13.926 1.946 24.678 4.813 53.862 14.438 100.147 53.453 123.904 104.448 8.294 17.92 14.336 38.912 16.794 58.88 0.512 4.198 1.024 59.597 1.024 122.982 0.102 125.645 0.41 119.706-5.632 127.59-1.331 1.843-4.71 4.608-7.373 6.144-4.608 2.765-5.427 2.867-21.402 3.174l-16.691 0.41v-77.005h20.582l-0.41-91.341c-0.307-89.907-0.41-91.648-2.56-101.478-7.578-33.485-21.402-58.778-44.749-82.227-29.696-29.798-66.253-45.773-107.725-47.104-22.835-0.717-44.032 2.662-64.102 10.445-50.176 19.251-89.395 65.434-99.533 117.043-0.819 4.301-1.843 9.216-2.253 10.854-0.41 1.741-0.819 43.725-1.024 93.491l-0.41 90.317h20.582v77.005l-16.589-0.41c-16.179-0.307-16.896-0.41-21.606-3.174-5.734-3.379-10.138-9.114-11.878-15.258-0.922-3.379-1.126-33.28-0.819-123.187 0.307-128.512 0.102-121.651 5.837-144.179 13.619-52.634 49.357-97.587 97.382-122.368 21.094-10.854 40.346-16.896 64.41-20.070l8.704-1.229v-142.643c0-157.594 0-159.13-4.608-178.79-11.776-50.483-45.978-93.491-92.877-116.736-17.613-8.602-31.539-12.902-51.507-15.872-22.938-3.379-45.978-2.15-68.71 3.584-61.133 15.462-109.568 64.205-125.44 126.464-1.331 5.325-2.458 10.035-2.458 10.547 0 0.41 17.408 0.717 38.81 0.717 21.299 0 41.062 0.41 44.032 1.024 15.565 2.97 28.672 15.155 33.28 31.13 1.434 5.018 1.638 38.81 1.638 337.818 0 220.467-0.307 334.029-1.024 337.715-3.072 16.282-17.408 30.618-33.894 33.69-8.602 1.638-361.677 1.229-367.616-0.512zM337.203 882.278c3.584-1.434 6.758-5.018 7.885-9.216 0.717-2.765 0.512-4.403-0.922-7.782-3.379-7.68-3.379-7.68-49.664-7.68-45.978 0-45.978 0-49.459 7.066-3.379 6.861-1.024 14.234 5.632 17.203 3.379 1.536 82.637 1.843 86.528 0.41zM460.8 550.4v-281.6h-332.8v563.2h332.8v-281.6zM305.766 240.333c16.486-8.499 18.944-29.696 4.915-42.086-15.77-13.926-41.472-2.253-41.677 18.842-0.102 11.776 6.963 21.402 18.739 25.19 4.096 1.331 13.619 0.307 18.022-1.946zM640 870.502v-38.502h8.499c19.251 0 31.642 7.168 39.014 22.528 2.765 5.939 3.174 7.68 3.174 15.872s-0.41 9.933-3.174 15.872c-3.686 7.68-10.035 14.438-17.203 18.125-6.656 3.379-7.68 3.584-19.763 4.096l-10.547 0.512v-38.502zM846.438 907.162c-10.342-3.174-18.637-10.65-23.552-20.89-2.867-5.939-3.174-7.68-3.174-15.872s0.41-10.035 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842 5.837-2.765 7.885-3.174 17.715-3.482l10.957-0.41v77.005l-9.421-0.102c-5.325 0-11.776-0.717-14.541-1.536z" />
+<glyph unicode="&#xea05;" glyph-name="HDMI_Card" d="M87.347 625.664c-10.138-2.253-18.534-5.632-26.317-10.854-17.92-11.878-29.082-27.853-33.382-48.026-1.946-8.909-2.048-13.517-2.048-131.789 0.102-78.746 0.512-124.518 1.126-127.795 0.614-2.765 1.229-6.144 1.536-7.475 0.717-3.379 3.994-11.571 6.554-16.179 10.547-18.739 26.726-31.539 47.616-37.888 5.837-1.843 19.661-1.946 322.048-2.15 289.894-0.307 316.211-0.205 320.819 1.331 5.427 1.843 11.674 7.27 14.746 12.902 1.741 3.174 1.843 11.878 2.15 175.411 0.307 192.819 0.819 177.766-7.373 186.163-8.397 8.704 24.678 7.885-327.68 7.782-258.662 0-314.573-0.307-319.795-1.434zM210.33 522.752c16.896-3.789 29.389-10.138 41.574-21.197 20.48-18.739 30.106-41.779 29.184-69.939-1.229-38.81-26.419-70.861-64.717-82.637-8.090-2.458-10.547-2.662-24.371-2.662-13.619 0-16.384 0.307-24.371 2.765-31.744 9.523-53.965 32.563-62.771 65.126-2.765 10.138-2.56 32.666 0.41 43.52 9.421 34.099 36.659 59.187 71.168 65.536 10.035 1.843 23.962 1.638 33.894-0.512zM768 435.2v-140.8h179.302l25.498 25.6 25.6 25.6v179.2l-51.2 51.2h-179.2v-140.8zM870.4 499.2v-25.6h-51.2v51.2h51.2v-25.6zM870.4 371.2v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xea06;" glyph-name="health" d="M384 704v-128h-256v-256h256v-256h256v256h256v256h-256v256h-256v-128z" />
+<glyph unicode="&#xea07;" glyph-name="health_monitor" d="M400.384 908.083c-9.421-1.638-20.89-7.987-27.853-15.462-6.042-6.554-8.806-11.366-11.674-19.968-2.355-7.27-2.355-7.885-2.458-62.362v-55.091h307.2v54.067c0 59.494-0.102 60.314-6.349 72.806-6.349 12.39-20.89 23.040-35.021 25.6-5.939 1.126-217.702 1.434-223.846 0.41zM270.848 728.371c-18.842-3.584-35.738-20.89-39.322-40.141-1.638-8.704-1.638-473.395 0-481.075 4.096-19.558 20.89-36.147 40.346-39.629 4.198-0.819 76.186-1.126 241.664-1.126 200.499 0 236.339 0.205 241.050 1.536 19.251 5.12 34.509 21.094 37.888 39.834 0.819 4.198 1.126 47.104 1.126 135.987v129.843h20.89c19.968 0 20.89 0.102 24.269 2.355 5.939 3.994 6.042 4.71 6.042 35.84 0 31.539-0.205 32.768-6.451 36.557-2.97 1.843-5.222 2.048-23.962 2.048h-20.787l-0.102 67.072c-0.102 36.864-0.205 67.379-0.307 67.891-0.102 0.41-0.512 2.56-1.024 4.71-2.458 12.595-14.541 28.058-26.317 33.792-12.595 6.042 4.198 5.734-253.338 5.632-145.306-0.102-238.49-0.512-241.664-1.126zM742.4 448v-230.4h-460.8v460.8h460.8v-230.4zM412.877 574.054c-4.096-1.024-10.854-3.584-15.053-5.632-19.149-9.421-31.949-25.805-37.478-47.718-3.584-14.029-1.741-31.642 4.71-45.568 4.096-8.704 8.192-13.926 32.768-40.96 5.632-6.246 13.926-15.36 18.432-20.378s10.547-11.776 13.414-14.848c4.506-5.018 18.125-20.070 31.437-34.918 2.355-2.56 6.246-6.963 8.806-9.728 2.56-2.867 8.602-9.523 13.414-14.746 4.813-5.325 9.216-10.138 9.728-10.752 3.072-3.379 18.432-20.685 18.534-20.89 0.205-0.205 2.048 1.536 4.198 3.994 2.15 2.355 4.403 4.813 4.915 5.427 0.614 0.614 11.674 12.902 24.576 27.238s23.757 26.317 24.064 26.624c0.307 0.307 6.758 7.475 14.336 15.872 7.578 8.499 14.029 15.565 14.336 15.872s6.554 7.168 13.824 15.36c7.27 8.192 15.36 17.203 18.022 19.968 2.56 2.867 6.758 7.373 9.216 10.24 2.458 2.765 5.837 6.451 7.475 8.192 4.096 4.198 11.059 15.258 13.722 21.709 12.595 30.003 1.434 66.97-25.702 85.197-23.347 15.667-53.658 16.282-77.005 1.536-7.066-4.403-10.24-7.168-28.774-24.781-5.018-4.915-10.957-10.445-13.005-12.39l-3.686-3.482-4.915 4.403c-2.662 2.458-11.162 10.445-18.739 17.715-16.589 15.974-25.293 21.914-37.478 25.805-11.674 3.789-26.726 4.403-38.093 1.638zM358.605 83.763l0.307-57.139 2.765-6.349c7.168-16.896 21.504-28.979 38.093-31.949 8.499-1.536 215.962-1.536 224.461 0 8.704 1.536 17.92 6.349 24.883 12.8 6.656 6.144 10.342 11.674 13.722 20.685 2.15 5.632 2.253 7.373 2.56 62.464l0.307 56.525h-307.405l0.307-57.037z" />
+<glyph unicode="&#xea08;" glyph-name="Health_patient" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM466.432 343.142c8.499-2.56 16.998-8.602 31.539-22.426 7.578-7.27 14.029-13.312 14.336-13.312 0.307-0.102 6.451 5.427 13.722 12.186 16.589 15.667 18.125 16.998 24.371 20.173 40.141 20.173 86.016-15.872 75.776-59.597-2.765-11.469-6.758-17.101-34.099-48.435-14.438-16.486-26.624-30.515-27.238-31.13s-12.595-14.336-26.726-30.413l-25.498-29.286-4.813 5.325c-7.68 8.704-42.906 48.947-49.050 56.115-3.072 3.584-7.475 8.602-9.83 11.162-2.253 2.56-12.8 14.438-23.347 26.522-21.094 24.269-25.088 30.618-27.443 43.827-4.506 26.829 13.005 53.35 39.936 60.211 7.066 1.843 20.89 1.331 28.365-0.922z" />
+<glyph unicode="&#xea09;" glyph-name="Heart_rate" d="M309.76 856.576c-35.226-3.891-60.928-11.162-90.112-25.6-26.726-13.21-46.080-27.034-67.686-48.64-25.6-25.498-42.598-50.995-56.218-84.275-24.371-59.699-25.088-125.85-1.843-188.723l3.789-10.138 297.062-0.512 3.072-2.355c1.638-1.331 7.885-9.728 13.926-18.739s11.366-16.384 11.776-16.384c0.512 0 1.229 1.331 1.536 2.867 0.819 3.482 23.552 90.624 27.75 106.291 1.638 6.246 3.174 11.981 3.379 12.8 0.307 1.638 7.782 30.106 15.974 61.235 2.662 10.342 5.734 20.173 6.758 21.914 3.686 6.349 12.8 8.704 19.456 5.12 6.963-3.789 7.373-5.222 13.517-41.165 1.741-9.83 4.71-27.546 6.758-39.424 2.048-11.776 3.891-22.835 4.198-24.576 0.307-1.638 4.198-24.269 8.602-50.176 4.506-25.907 8.602-49.664 9.216-52.736s1.229-6.963 1.536-8.704c4.506-27.546 3.789-26.214 7.475-13.312 1.126 3.994 2.97 10.445 4.198 14.336 1.126 3.994 5.12 18.022 8.909 31.232s7.578 25.088 8.397 26.419c2.048 3.072 8.499 6.349 12.595 6.349 4.608 0 10.035-2.97 12.288-6.554 1.024-1.741 2.662-5.734 3.482-8.806s1.946-6.963 2.458-8.704c0.512-1.638 3.584-12.902 6.861-24.883 3.174-11.981 6.246-21.402 6.656-20.992 0.41 0.512 3.789 11.469 7.578 24.371 3.789 13.005 7.782 25.19 8.806 27.136 3.994 7.68 12.288 10.138 20.378 5.939 4.403-2.253 5.018-3.072 14.029-21.197 5.222-10.342 9.83-19.251 10.342-19.763s4.608 5.325 9.83 14.029c7.475 12.493 9.523 15.155 12.902 16.896 3.891 2.048 6.144 2.048 115.098 2.048h111.104l1.536 2.867c2.97 5.837 10.752 30.003 13.312 41.267 4.915 21.914 6.144 32.768 6.144 56.218 0.102 22.118-0.205 26.419-2.97 43.52-4.71 30.003-15.053 58.778-30.413 85.811-32.87 57.344-87.654 100.454-150.835 118.579-8.806 2.56-27.853 6.656-34.816 7.475-2.765 0.41-6.758 0.922-8.704 1.229-6.963 1.024-42.598 1.331-50.688 0.41-29.798-3.379-47.718-7.782-72.704-17.613-26.829-10.65-55.603-28.774-77.926-49.254l-5.632-5.12-2.662 2.458c-1.536 1.331-4.915 4.403-7.475 6.758-33.382 30.822-88.064 55.808-133.632 61.235-3.277 0.41-6.963 0.922-8.192 1.229-3.789 0.819-42.906 1.126-50.176 0.307zM480.87 556.749c-8.192-31.949-15.565-60.109-24.166-92.877-3.379-12.902-7.578-29.286-9.421-36.25-2.662-10.65-3.686-13.21-6.554-15.974-5.837-5.837-15.565-5.837-20.992-0.102-1.638 1.741-8.090 10.752-14.234 20.070s-11.571 17.408-11.981 17.92c-0.41 0.614-3.482 5.018-6.758 10.035l-5.837 8.909h-133.12c-73.216 0-133.12-0.307-133.12-0.614 0-1.126 10.957-16.998 16.691-24.166 3.994-5.018 43.725-50.278 58.573-66.765 2.97-3.277 15.872-17.92 18.534-20.992 1.638-1.946 3.686-4.198 4.608-5.12 0.819-0.922 8.192-9.216 16.384-18.534 8.090-9.216 15.462-17.51 16.282-18.432s4.506-5.12 8.192-9.318c6.451-7.27 21.504-24.269 28.058-31.642 1.741-1.946 6.451-7.27 10.342-11.776 3.994-4.506 7.373-8.397 7.68-8.704s7.27-8.090 15.36-17.408c8.192-9.216 17.408-19.558 20.48-23.040s15.565-17.51 27.648-31.232c29.696-33.587 51.814-58.675 54.784-61.85 0.614-0.614 6.042-6.861 12.288-13.926 14.848-16.998 21.197-24.166 50.074-56.832 13.517-15.155 26.010-29.286 27.853-31.334 3.584-4.096 3.584-4.096 8.499 1.638 1.946 2.253 6.451 7.373 10.035 11.366 3.584 4.096 7.373 8.294 8.294 9.318 0.922 1.126 4.608 5.222 7.987 9.114 3.482 3.891 13.824 15.565 23.040 26.010 9.114 10.445 20.378 23.142 24.883 28.16 4.608 5.12 11.264 12.698 14.95 16.896s12.595 14.234 19.866 22.426c7.27 8.294 16.077 18.125 19.456 22.016 3.482 3.994 12.186 13.824 19.456 22.016 22.835 25.702 25.19 28.365 58.47 66.15 17.92 20.275 35.635 40.346 39.424 44.544s12.39 13.926 19.046 21.504c6.758 7.68 26.214 29.696 43.418 49.152 17.203 19.354 34.406 38.912 38.4 43.418 3.891 4.608 7.782 9.011 8.704 9.83 3.482 3.379 16.384 18.33 21.197 24.576 5.53 7.168 15.667 22.016 15.667 22.938 0 0.307-43.622 0.614-97.075 0.614h-96.973l-14.029-23.45c-7.782-12.8-15.155-24.064-16.384-24.883-5.939-3.891-14.336-3.379-19.046 1.229-1.741 1.536-6.144 9.216-10.035 16.998l-6.963 14.131-2.15-7.066c-1.229-3.994-5.939-19.354-10.342-34.202-7.066-23.45-8.499-27.341-11.366-30.31-6.861-7.066-19.354-5.325-23.654 3.277-1.126 2.15-5.325 16.589-9.421 32.051-4.198 15.462-7.885 28.57-8.192 28.979-0.41 0.41-6.349-19.149-13.312-43.52s-13.517-46.080-14.541-48.23c-1.331-2.765-3.277-4.506-6.246-5.939-5.53-2.458-9.011-2.458-14.029 0.102-5.325 2.765-7.475 7.168-9.523 19.968-0.922 5.632-1.946 11.366-2.253 12.8-0.205 1.434-3.686 21.504-7.578 44.544-3.994 23.142-7.68 44.339-8.294 47.104-0.512 2.867-1.638 9.318-2.458 14.336-0.819 5.12-2.458 14.541-3.584 20.992s-2.253 13.21-2.56 14.848c-1.536 8.806-7.987 46.080-9.216 53.043-0.717 4.403-1.536 8.090-1.741 8.294-0.205 0.307-3.584-11.878-7.475-26.829z" />
+<glyph unicode="&#xea0a;" glyph-name="Heartbeats" d="M343.552 831.078c-11.878-1.946-24.678-6.451-35.84-12.698-46.387-26.010-64.717-84.89-41.472-133.018 1.741-3.482 3.072-6.451 3.072-6.656s-27.341-0.307-60.723-0.307c-66.048 0-66.56 0-78.541-5.939-7.475-3.584-18.33-14.541-21.914-21.811-5.734-11.878-5.632-11.162-5.734-84.070v-67.379h25.6l0.102-194.765c0-107.213 0.307-196.198 0.512-197.837 3.277-19.763 20.275-37.274 40.141-41.472 7.68-1.638 678.81-1.638 686.49 0 19.558 4.096 36.147 20.89 39.629 40.243 0.819 4.301 1.126 65.126 1.126 199.987v193.843h25.6v67.379c-0.102 73.83 0 72.397-6.349 84.992-3.994 7.885-13.517 17.203-21.504 21.094-11.674 5.734-12.186 5.734-78.234 5.734-33.587 0-60.826 0.307-60.621 0.819 0.205 0.41 1.638 3.482 3.174 6.758 21.402 45.056 6.656 99.738-34.509 127.898-18.125 12.39-35.738 17.613-58.982 17.51-12.698-0.102-16.282-0.512-25.088-2.867-18.227-4.915-33.075-13.619-46.592-27.136-9.83-9.933-11.162-11.981-47.616-74.342-4.608-7.885-12.902-22.016-18.432-31.437l-10.138-17.203h-9.421l-8.294 14.131c-34.202 58.573-56.422 95.744-59.904 100.25-12.698 16.486-33.894 30.31-54.989 35.84-10.752 2.765-30.925 3.994-40.55 2.458zM373.043 778.342c12.595-3.891 24.474-13.21 29.901-23.347 1.126-2.048 32.358-55.091 41.267-70.246 1.843-2.97 3.277-5.632 3.277-5.837 0-0.307-20.89-0.512-46.285-0.512-50.381 0-54.682 0.41-66.048 5.734-8.397 3.994-18.432 14.336-22.733 23.347-4.506 9.523-6.042 20.685-4.403 30.515 5.222 30.208 36.25 49.562 65.024 40.346zM677.376 779.264c17.818-4.608 31.437-17.51 37.376-35.328 1.843-5.53 2.15-20.173 0.41-26.419-3.789-14.234-14.234-27.546-26.214-33.28-11.059-5.427-15.667-5.837-66.048-5.837-25.498 0-46.387 0.205-46.387 0.512 0 0.205 1.843 3.482 4.096 7.168s4.096 6.861 4.096 7.066c0 0.102 4.506 7.885 10.035 17.101s11.776 19.763 13.926 23.45c16.794 29.286 19.763 32.973 30.72 39.731 11.469 6.963 25.395 9.011 37.99 5.837zM456.294 523.162c18.739-3.379 35.738-11.366 50.278-23.654l5.427-4.608 5.325 4.608c12.493 10.445 26.419 17.613 42.598 21.914 8.602 2.253 12.083 2.662 25.805 2.765 17.203 0 25.293-1.434 39.629-7.168 17.101-6.861 37.376-23.040 47.206-37.786 12.288-18.432 18.432-38.4 18.432-60.006 0-20.48-6.349-41.677-17.51-58.266-2.458-3.584-13.312-16.794-16.077-19.456-0.41-0.41-18.022-19.763-20.992-23.142-0.512-0.614-2.867-3.174-5.12-5.632s-15.155-16.691-28.672-31.642c-29.184-32.256-25.702-28.365-30.72-33.894-2.253-2.458-10.957-12.083-19.456-21.402-8.397-9.318-15.872-17.408-16.486-18.125-0.614-0.614-6.042-6.758-12.186-13.517-6.144-6.861-11.366-12.39-11.776-12.39-0.307 0-3.789 3.482-7.68 7.782s-7.578 8.397-8.090 9.011c-0.614 0.614-7.373 8.090-14.95 16.486-7.578 8.499-14.234 15.872-14.848 16.486-0.512 0.614-4.915 5.427-9.728 10.752s-11.264 12.39-14.336 15.77c-3.072 3.277-6.042 6.554-6.656 7.27-0.512 0.614-4.915 5.427-9.728 10.65s-9.421 10.342-10.24 11.264c-2.048 2.355-16.179 18.022-19.456 21.504-25.6 27.853-41.267 45.568-45.056 51.2-39.322 57.958-12.39 137.318 54.272 159.642 14.541 4.915 35.43 6.349 50.79 3.584z" />
+<glyph unicode="&#xea0b;" glyph-name="help_guide" d="M76.8 471.040c0-222.106 0.307-311.194 1.126-315.085 3.891-18.637 18.944-34.202 37.888-39.219 8.294-2.253 784.077-2.253 792.371 0 16.896 4.506 29.901 16.282 36.147 32.87l2.355 6.042 0.307 312.627 0.205 312.525-186.061-0.307c-176.538-0.205-186.47-0.307-192.307-2.15-30.106-9.114-52.429-34.509-56.013-63.59-0.512-3.686-1.024-2.458-3.174 7.27-4.096 18.125-16.384 35.635-32.461 46.080-9.216 5.939-14.95 8.397-25.6 10.752-8.397 1.843-15.974 1.946-191.693 1.946h-183.091v-309.76zM320.512 600.371c19.968-2.355 39.117-9.216 54.272-19.354 26.317-17.613 41.062-44.032 41.165-73.626 0-19.354-4.915-33.69-17.51-50.176-3.584-4.813-6.963-8.909-7.373-9.216s-4.813-4.403-9.83-9.216c-4.915-4.813-13.21-12.39-18.227-16.794-5.12-4.506-14.336-13.312-20.582-19.456-13.517-13.619-16.384-18.739-20.89-37.888-1.946-8.192-4.198-14.95-5.734-17.51-10.957-17.203-39.526-15.462-49.050 3.072-2.97 5.837-3.072 6.451-2.97 19.866 0 15.974 2.15 25.395 8.192 37.376 7.066 13.722 15.36 22.938 43.418 48.128 7.578 6.758 15.36 13.722 17.306 15.462 4.915 4.403 11.776 13.926 15.053 20.685 4.71 9.933 3.994 24.064-1.638 35.226-2.867 5.632-10.445 13.414-16.794 17.203-16.179 9.728-44.954 9.626-60.211-0.205-10.547-6.758-19.661-21.094-27.341-43.008-5.632-16.179-11.981-23.654-22.63-26.726-14.541-4.198-30.515 3.277-37.478 17.613-6.246 12.698 1.434 42.598 15.77 61.85 18.33 24.576 48.64 41.882 81.101 46.285 11.981 1.638 30.413 1.843 41.984 0.41zM853.299 600.166c5.632-2.048 10.342-6.042 13.619-11.571 2.56-4.301 2.97-5.939 2.97-12.595 0-6.554-0.512-8.499-2.765-12.39-1.536-2.56-4.403-5.939-6.554-7.578-7.68-5.837-2.97-5.632-130.97-5.632-133.222 0-125.133-0.512-133.12 7.782-4.608 4.71-7.68 11.674-7.68 17.306 0 11.366 8.499 22.63 18.842 25.088 1.741 0.512 56.832 0.819 122.47 0.922 97.178 0 120.013-0.205 123.187-1.331zM853.299 497.766c5.632-2.048 10.547-6.246 13.722-11.674 2.458-4.096 2.867-5.939 2.867-12.493s-0.512-8.499-2.867-12.493c-1.536-2.662-4.301-6.042-6.144-7.373-7.885-6.042-1.638-5.734-131.686-5.734-95.846 0.102-120.115 0.307-123.187 1.434-17.51 6.246-22.63 28.57-9.626 41.882 7.987 8.294-1.229 7.68 133.222 7.782 97.587 0 120.525-0.205 123.699-1.331zM852.378 395.366c6.349-1.946 10.957-5.632 14.541-11.571 2.56-4.301 2.97-5.939 2.97-12.595 0-6.554-0.512-8.499-2.867-12.493-1.536-2.662-4.301-6.042-6.144-7.373-7.885-6.042-1.638-5.734-131.174-5.734-133.837 0-125.133-0.512-133.222 7.68-4.608 4.608-7.68 11.776-7.68 18.022 0 10.547 8.090 21.402 18.227 24.474 1.536 0.512 56.218 0.922 121.651 0.922 99.738 0.102 119.603-0.102 123.699-1.331zM308.736 310.886c7.373-3.277 11.571-6.861 15.872-13.619 8.704-13.312 6.963-32.358-3.891-43.315-17.203-17.613-48.026-13.107-58.675 8.499-2.15 4.096-2.458 6.349-2.458 15.565 0 9.83 0.205 11.162 2.867 15.872 3.379 6.144 7.68 10.957 12.8 14.336 8.602 5.632 23.962 6.861 33.485 2.662zM751.104 292.659c6.758-2.253 13.005-8.704 15.36-15.667 3.277-9.933-0.205-22.118-8.090-28.16-7.475-5.734-6.554-5.632-79.36-5.632-75.981 0-74.752-0.102-82.125 7.27-7.475 7.475-9.626 15.872-6.554 26.112 2.355 8.090 8.602 14.131 17.92 17.101 0.819 0.307 32.256 0.614 69.734 0.614 60.826 0.102 68.71-0.102 73.114-1.638z" />
+<glyph unicode="&#xea0c;" glyph-name="history" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-53.76-4.096-109.363-19.558-158.515-44.237-57.754-28.877-104.038-66.253-146.739-118.477l-3.277-3.994-91.341 91.546v-105.882c0-88.371 0.307-106.701 1.536-111.309 5.12-19.251 21.094-34.509 39.834-37.888 4.096-0.717 39.936-1.126 110.387-1.126h104.346l-45.568 45.67c-37.274 37.171-45.466 45.875-44.749 47.309 2.253 4.198 19.456 24.576 29.594 35.123 55.603 58.163 130.458 93.901 211.661 101.171 14.541 1.331 45.978 1.024 60.416-0.512 66.048-6.861 124.928-30.925 176.128-71.68 14.438-11.571 39.526-36.659 51.098-51.098 33.382-41.882 56.115-90.419 66.56-141.824 4.71-23.45 6.451-40.858 6.451-65.536 0.205-79.053-24.986-149.709-75.981-212.992-5.939-7.475-31.13-33.28-38.4-39.526-54.17-46.182-119.501-73.83-188.928-80.179-10.24-0.922-55.194-0.717-61.952 0.307-1.946 0.307-7.475 1.024-12.288 1.741-35.942 4.608-71.168 15.565-104.96 32.666-23.245 11.776-46.080 26.829-65.741 43.418-9.83 8.397-31.232 30.106-40.448 41.267-40.653 48.947-66.97 109.978-73.933 171.93-2.355 20.787-2.56 24.064-2.662 48.538-0.102 22.323-0.205 23.245-2.662 28.365-1.434 2.97-4.301 6.758-6.349 8.499-7.168 5.939-10.035 6.246-44.442 5.939l-31.027-0.307-5.018-2.97c-5.734-3.482-10.342-9.421-11.981-15.36-1.126-4.096-0.614-61.030 0.614-70.758 0.205-2.253 1.024-8.704 1.638-14.336s1.331-11.162 1.536-12.288c0.205-1.126 1.331-7.373 2.56-13.824 21.504-120.115 95.13-227.328 200.499-292.25 56.934-35.123 123.085-56.73 192.102-62.771 11.674-1.024 58.675-1.024 70.144 0 65.638 5.837 127.078 24.883 181.35 56.013 7.782 4.506 8.602 5.018 23.552 14.643 8.602 5.53 31.539 22.323 34.714 25.395 0.819 0.819 3.686 3.174 6.246 5.222 19.046 15.258 47.309 45.056 65.741 69.222 31.437 41.37 55.808 89.19 70.451 138.138 4.813 16.179 4.71 15.565 9.421 38.707 3.072 15.053 4.198 21.504 6.451 38.912 1.946 15.258 2.662 62.566 1.229 81.408-1.126 13.824-4.506 39.014-6.861 50.176-11.674 57.344-32.973 109.056-64.512 156.672-3.174 4.813-6.042 9.216-6.554 9.728-0.41 0.614-4.403 5.837-8.806 11.776-55.398 73.728-134.349 128.512-223.334 155.136-24.166 7.168-54.682 13.312-77.824 15.462-3.686 0.307-7.987 0.819-9.728 1.126-3.584 0.512-61.542 1.434-62.054 0.922zM500.224 702.669c-19.558-5.018-34.714-20.992-38.4-40.141-0.819-4.403-1.024-37.069-0.819-116.224l0.307-110.080 2.662-6.144c3.584-8.294 6.963-13.517 12.288-18.534 2.458-2.355 32.768-27.853 67.379-56.627 46.182-38.502 64.512-53.146 69.12-55.296 20.787-9.83 43.93-5.325 59.494 11.366 19.149 20.685 18.33 50.79-2.048 70.963-3.994 3.994-29.696 25.805-57.139 48.64l-49.869 41.472v92.16c0 61.85-0.41 94.31-1.126 98.406-3.072 16.794-15.258 31.334-31.949 37.99-7.782 3.072-22.118 3.994-29.901 2.048z" />
+<glyph unicode="&#xea0d;" glyph-name="home" d="M502.272 831.488c-0.512-0.205-4.506-1.126-8.704-2.048-14.643-3.379-25.395-9.728-37.99-22.323-9.318-9.216-104.243-105.677-117.555-119.398-5.325-5.427-30.618-31.13-56.32-57.242s-52.941-53.862-60.518-61.645c-15.667-15.974-95.642-97.28-108.954-110.797-4.813-4.813-8.806-9.114-8.806-9.421s34.304-0.614 76.288-0.614h76.288v-157.184c0-139.674 0.205-158.106 1.638-165.171 5.837-28.467 26.317-50.381 55.398-59.29 5.632-1.638 17.203-1.843 195.379-2.048 171.52-0.307 190.157-0.205 197.632 1.331 31.744 6.451 55.706 31.232 60.928 62.976 0.614 4.301 1.024 60.416 1.024 163.021v156.365h153.702l-7.475 7.578c-11.162 11.264-94.72 96.256-109.261 111.104-6.963 7.066-33.69 34.304-59.494 60.518s-53.043 53.862-60.518 61.645c-22.835 23.245-99.942 101.683-112.23 114.074-17.203 17.203-28.16 23.859-45.875 27.546-6.656 1.331-21.606 1.946-24.576 1.024zM571.392 444.314c8.397-3.994 14.746-10.342 18.842-18.842l3.174-6.656 0.307-116.019 0.205-115.917-231.936 0.512-6.656 3.174c-8.499 3.994-14.848 10.342-18.842 18.842l-3.174 6.656-0.307 116.019-0.205 115.917 231.936-0.512 6.656-3.174z" />
+<glyph unicode="&#xea0e;" glyph-name="Home_1" d="M364.851 804.352c-5.939-3.584-6.451-5.837-6.451-28.672v-20.48h-76.698l-153.702-153.6v-25.6h51.2v-486.4h-25.6v-25.6h665.6v25.6h-25.6v486.4h51.2v25.498l-76.8 76.902-76.902 76.8h-76.698v20.787c0 29.798-0.512 30.413-25.6 30.413-17.306 0-20.173-0.819-23.552-6.451-1.843-2.97-2.048-5.222-2.048-23.962v-20.787h-153.6v20.787c0 22.733-0.307 24.269-6.042 28.058-3.277 2.253-4.506 2.355-19.456 2.355-14.029 0-16.384-0.205-19.251-2.048zM317.030 549.274c14.131-2.56 29.491-14.029 35.533-26.522 5.53-11.571 5.837-14.336 5.837-59.085v-41.267h-102.4v41.779c0.102 44.851 0.41 47.411 5.734 58.368 2.867 5.939 12.288 16.691 16.691 19.046 15.462 8.397 24.576 10.24 38.605 7.68zM503.091 547.533c16.384-5.939 28.467-19.251 32.973-36.147 1.229-4.403 1.536-14.336 1.536-47.206v-41.779h-102.4v40.96c0 25.907 0.41 42.803 1.126 46.285 3.789 18.33 18.944 34.202 37.478 39.219 7.27 1.946 22.016 1.331 29.286-1.331zM677.786 548.864c12.8-3.072 24.781-11.981 31.949-24.064 6.554-11.162 7.066-15.053 7.066-61.645v-40.755h-102.4v40.96c0 26.214 0.41 42.803 1.126 46.285 3.994 18.739 18.842 34.202 37.683 39.219 6.246 1.638 17.306 1.638 24.576 0zM325.325 291.021c8.090-3.277 14.234-7.578 19.968-13.926 4.506-5.018 10.24-15.258 11.674-21.094 0.512-1.638 1.024-22.528 1.126-46.285l0.41-43.315h-102.502v40.243c0 24.474 0.41 42.701 1.126 46.387 3.379 18.739 19.046 35.123 38.093 39.936 7.987 2.048 22.323 1.126 30.106-1.946zM504.525 291.021c15.872-6.349 27.238-19.149 31.539-35.635 1.229-4.506 1.536-19.866 1.536-85.606v-80.179h-102.4v79.36c0 53.862 0.41 80.998 1.126 84.685 3.994 19.046 20.685 35.84 39.322 39.629 8.192 1.638 21.504 0.614 28.877-2.253zM676.045 293.274c19.558-4.096 36.147-20.89 39.629-40.243 0.717-3.686 1.126-21.914 1.126-46.387v-40.243h-102.4v40.96c0 25.907 0.41 42.803 1.126 46.285 1.946 9.421 6.758 18.125 14.131 25.498 12.595 12.493 29.491 17.613 46.387 14.131z" />
+<glyph unicode="&#xea0f;" glyph-name="home_alarm" d="M428.032 856.474c-30.413-2.458-50.688-5.632-79.77-12.8-61.030-14.95-122.47-45.056-171.315-83.763-13.824-11.059-16.691-15.462-16.589-25.702 0.102-15.053 10.445-25.395 25.498-25.498 7.27 0 11.366 1.843 20.992 9.626 39.629 31.744 89.6 57.446 140.288 71.987 38.605 11.162 70.861 15.565 113.664 15.565 30.003 0 41.062-0.819 67.584-5.222 64-10.65 126.362-37.376 177.050-75.878 18.739-14.234 22.323-16.179 30.31-15.974 3.379 0 7.885 0.819 9.933 1.741 16.179 6.963 20.48 28.877 8.192 41.165-1.741 1.741-8.602 7.373-15.258 12.39-54.989 41.984-121.037 71.68-188.211 84.685-15.77 2.97-30.822 5.325-41.472 6.246-4.198 0.41-9.011 0.922-10.752 1.126-5.837 0.922-60.416 1.126-70.144 0.307zM439.194 754.79c-0.205-0.205-4.71-0.717-9.933-1.024-5.222-0.41-10.342-0.922-11.264-1.024-0.922-0.205-4.506-0.717-7.885-1.126-6.861-0.717-32.87-6.042-40.96-8.192-45.978-12.493-85.299-31.539-122.88-59.494-22.835-16.896-26.419-21.504-26.522-33.69-0.102-8.499 2.15-13.517 8.397-19.149 6.656-6.042 15.872-7.885 24.474-5.018 2.867 1.024 8.909 4.813 14.746 9.421 44.954 35.84 93.901 57.037 151.757 65.638 19.558 2.867 60.314 3.174 79.565 0.512 59.187-8.294 112.23-30.925 155.546-66.458 10.342-8.602 14.131-10.24 22.323-10.24 21.914 0.205 33.178 25.805 18.534 42.394-6.042 6.861-30.413 24.678-49.357 36.147-43.827 26.317-91.136 42.701-142.438 49.254-11.674 1.434-62.976 3.072-64.102 2.048zM441.344 652.083c-33.28-2.97-64.205-11.469-92.672-25.395-62.566-30.515-110.387-85.709-131.584-151.757-7.782-24.064-11.366-46.797-11.776-74.035-0.307-21.606 0.307-29.389 3.686-49.152 16.589-96.973 91.238-177.664 187.29-202.65 24.678-6.451 40.653-8.192 69.12-7.782 17.92 0.307 25.702 0.922 38.912 3.174 52.224 8.909 103.322 35.942 140.186 74.24 40.653 42.086 64.922 94.413 71.27 153.498 0.819 8.294 0.614 48.435-0.307 52.736-0.307 1.126-0.819 4.608-1.229 7.68-5.018 40.653-23.552 84.582-50.586 120.32-9.318 12.39-32.154 35.43-44.134 44.749-36.966 28.57-76.39 45.466-122.368 52.531-10.342 1.638-45.875 2.765-55.808 1.843zM478.31 497.664c20.992-3.686 39.322-13.312 54.682-28.672 40.243-40.243 40.243-104.141 0-144.384-20.685-20.685-45.568-30.515-75.264-29.696-20.685 0.614-35.738 5.325-53.248 16.794-20.992 13.722-36.762 36.045-43.11 61.030-3.072 12.083-3.379 33.997-0.614 45.568 8.192 34.304 29.901 60.109 62.259 73.523 15.872 6.554 37.786 8.909 55.296 5.837zM816.333 445.85c-33.28-8.499-53.862-41.677-46.797-75.162 3.174-15.053 12.186-28.877 25.088-38.4 6.656-5.018 7.066-5.53 6.554-8.602-5.939-34.918-12.595-55.603-26.317-82.432-30.72-60.314-86.835-107.418-151.962-127.693-4.403-1.331-8.090-2.458-8.192-2.458-0.205 0-0.307 11.264-0.307 24.986v25.088l-10.24-6.042c-36.25-21.504-76.902-34.918-117.248-38.707-10.854-0.922-43.93-0.922-54.272 0.102-24.678 2.56-52.429 9.626-78.848 20.070-9.421 3.789-32.051 15.462-40.755 20.992l-5.837 3.789v-52.019c0.102-41.37 0.41-53.248 1.536-57.549 4.915-18.637 20.89-34.099 39.219-37.888 3.789-0.819 38.81-1.126 113.562-1.126 95.232 0 108.749 0.205 114.381 1.638 18.739 4.813 33.485 19.763 37.581 37.888 1.024 4.71 1.638 5.632 3.891 6.144 6.144 1.434 27.75 7.885 34.406 10.342 22.016 8.090 43.622 18.944 60.928 30.31 64.41 42.598 109.978 103.731 129.946 174.49 3.482 12.288 7.782 32.563 8.806 41.267 0.307 3.072 0.819 6.349 1.126 7.168s4.301 3.379 8.909 5.53c24.883 11.981 38.912 41.574 32.973 69.734-7.27 35.021-43.52 57.446-78.131 48.538z" />
+<glyph unicode="&#xea10;" glyph-name="Homelive" d="M358.195 678.4l-153.395-153.498v-460.902h614.4v460.8l-153.6 153.6c-84.48 84.48-153.702 153.6-153.805 153.498-0.205 0-69.325-69.12-153.6-153.498zM341.094 395.366c10.445-3.686 15.872-12.39 16.794-26.726 1.434-23.45 4.301-37.376 11.469-54.784 23.757-57.651 79.667-95.232 141.722-95.334 51.712-0.102 99.021 25.088 128 68.198 16.179 23.962 24.576 50.381 26.010 81.715 0.614 14.131 5.939 22.938 16.486 26.931 5.427 2.048 15.667 1.536 20.582-0.922 5.939-3.174 11.878-10.342 13.312-16.384 1.638-6.861-0.102-30.106-3.379-46.797-14.029-71.168-67.174-131.072-136.192-153.6-59.494-19.354-123.392-11.366-175.309 22.118-52.531 33.997-87.347 91.136-92.979 152.986-2.15 23.245-0.307 30.925 9.523 39.219 5.222 4.506 16.486 6.042 23.962 3.379z" />
+<glyph unicode="&#xea11;" glyph-name="homescreen" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.994 19.149-20.48 35.635-39.629 39.629-8.294 1.741-424.755 1.434-432.026-0.307zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 710.451l-0.102-96.051-2.048 2.56c-16.589 20.378-36.659 39.834-51.712 50.176-32.256 22.221-58.982 34.509-93.082 42.496-20.378 4.813-32.256 6.042-57.344 6.042-21.914 0.102-30.31-0.614-49.152-3.891-25.395-4.506-59.802-17.818-83.968-32.563-22.426-13.722-48.435-36.045-64-55.091-3.072-3.686-6.144-7.373-6.861-8.192-1.126-1.229-1.331 15.155-1.331 94.515v95.949h409.6v-95.949zM541.696 673.382c14.746-2.56 23.552-4.506 33.075-7.373 62.362-19.046 113.357-66.15 137.318-127.078l4.71-11.981v-133.325l-3.686-9.421c-19.149-49.869-56.013-91.034-103.014-115.302-18.637-9.523-43.827-17.818-62.669-20.685-3.994-0.614-8.397-1.331-9.83-1.638-1.434-0.205-11.059-0.614-21.504-0.819-22.835-0.307-37.069 1.229-56.627 6.144-37.478 9.421-69.939 27.648-97.894 55.091-22.426 22.118-38.093 45.568-49.664 74.547l-4.71 11.878v133.632l2.662 6.758c16.077 41.677 40.448 74.138 74.65 99.635 29.389 21.811 70.349 37.786 103.629 40.448 4.403 0.41 8.192 0.819 8.397 1.024 0.819 0.819 38.912-0.512 45.158-1.536zM318.157 293.376c27.853-32.87 66.867-59.699 107.827-74.24 28.979-10.24 51.814-14.131 82.944-14.234 28.877-0.102 41.472 1.229 65.024 7.066 55.706 13.824 101.376 43.52 140.698 91.648l2.048 2.56 0.102-95.437v-95.539h-409.6v95.437c0 79.258 0.205 95.232 1.331 94.003 0.717-0.819 5.12-5.939 9.626-11.264zM524.698 86.118c8.806-5.12 13.517-14.336 12.493-24.474-1.229-12.698-10.138-21.504-23.040-22.938-17.818-1.843-32.256 16.384-26.214 33.382 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.070-2.56zM487.526 637.85c-62.566-8.909-115.917-49.869-140.595-107.93-25.19-59.392-15.872-129.229 24.166-180.224 27.443-35.021 65.229-57.446 111.206-66.15 11.981-2.253 41.574-2.662 54.272-0.819 75.366 11.366 134.144 65.843 150.426 139.264 4.403 19.558 5.222 46.899 2.15 65.946-4.915 30.31-17.408 58.778-36.25 82.944-28.979 37.171-73.83 62.259-120.422 67.379-12.39 1.434-33.69 1.229-44.954-0.41zM540.57 595.558c13.21-2.867 20.173-5.427 33.382-11.981 38.195-18.842 65.331-54.682 73.933-97.485 2.458-12.288 2.458-40.448 0-51.917-5.222-24.166-15.565-45.773-30.413-63.181-5.734-6.861-20.48-20.275-27.136-24.781-16.998-11.366-39.629-20.173-58.675-22.835-10.547-1.434-36.762-0.819-46.285 1.126-45.158 9.523-82.432 39.629-100.454 81.408-7.987 18.534-11.162 36.045-10.752 57.958 0.512 22.426 4.403 38.093 14.541 58.368 19.558 39.424 56.627 66.662 101.274 74.65 12.083 2.15 38.195 1.434 50.586-1.331zM494.285 561.050c-20.582-3.686-39.014-13.21-53.555-27.546-13.926-13.722-22.938-29.082-27.75-47.411-3.482-13.005-3.891-35.021-0.922-47.821 4.608-20.070 13.414-35.84 27.75-50.176 36.659-36.557 92.467-40.243 134.349-9.011 37.888 28.365 50.79 81.408 30.413 124.826-10.752 22.938-31.027 41.882-54.784 51.507-16.282 6.451-38.4 8.704-55.501 5.632zM525.824 519.987c20.173-4.506 38.298-21.299 44.646-41.267 2.765-8.704 3.379-22.938 1.434-31.744-3.994-17.306-17.101-33.997-32.256-41.267-10.957-5.222-20.070-7.168-30.72-6.554-16.794 1.126-30.413 7.475-41.677 19.661-10.547 11.366-15.667 23.347-16.282 37.888-0.717 19.149 4.915 33.792 17.92 46.592 8.806 8.704 16.794 13.414 27.955 16.384 8.602 2.253 19.763 2.458 28.979 0.307z" />
+<glyph unicode="&#xea12;" glyph-name="Horoscopes" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM546.816 804.966c1.434-0.307 8.090-1.229 14.848-2.15 13.619-1.741 15.77-2.15 34.816-6.656 30.618-7.27 62.464-19.661 90.624-35.43 9.318-5.222 29.696-18.227 36.352-23.347 24.986-19.149 41.984-34.714 59.392-54.886 50.381-58.368 79.872-128.41 86.528-205.824 0.819-10.342 0.614-56.115-0.41-61.44-0.205-1.434-0.717-5.53-1.126-9.216-4.301-43.213-20.89-94.003-43.725-134.144-10.547-18.637-28.365-44.134-39.731-56.832-41.779-46.797-84.070-77.21-137.728-99.123-25.805-10.547-59.29-19.558-83.968-22.733-2.765-0.307-5.837-0.819-6.656-1.024-9.933-2.56-81.51-2.662-85.914-0.102-0.307 0.205-3.482 0.614-6.963 1.024-9.421 1.024-25.907 4.198-39.731 7.68-64.205 16.282-123.699 50.995-169.574 98.918-11.162 11.674-17.203 18.432-16.794 18.739 0.102 0.102 3.891-2.253 8.294-5.222 37.171-25.498 79.36-40.653 127.078-45.773 8.192-0.819 48.026-0.614 52.531 0.307 1.434 0.307 5.325 0.819 8.704 1.229 7.578 0.819 23.040 3.994 33.28 6.758 72.909 19.866 133.12 68.506 168.755 136.397 14.95 28.262 25.805 65.126 28.57 96.973 1.024 10.752 1.024 44.442 0.102 52.736-5.018 43.622-17.203 79.36-39.424 115.405-39.424 64-105.779 108.954-181.043 122.675-19.558 3.584-52.122 4.915-71.475 2.97-66.662-6.656-123.392-34.202-169.984-82.227l-10.035-10.342 3.789 7.168c22.528 42.496 56.934 83.149 96.051 113.664 53.965 41.984 122.88 68.915 188.518 73.83 5.12 0.41 9.421 0.819 9.626 1.024 0.614 0.512 53.453-0.41 56.422-1.024zM357.683 602.214c0.205-0.512 9.421-2.458 20.582-4.301 11.264-1.946 20.48-3.584 20.685-3.789s-5.734-5.632-13.21-12.186c-7.475-6.554-14.336-12.8-15.36-13.926-1.741-1.946-1.638-2.765 3.277-22.323 2.765-11.162 5.018-20.378 4.915-20.48s-8.499 4.403-18.637 9.933c-10.138 5.53-18.842 10.138-19.251 10.138-0.512 0-5.734-2.662-11.776-6.042-22.323-12.186-24.986-13.517-25.498-13.005-0.307 0.205 1.741 9.421 4.506 20.378l5.12 19.866-9.728 8.602c-12.083 10.752-13.107 11.674-17.92 15.77l-3.891 3.379 7.475 1.229c4.096 0.717 13.517 2.253 20.787 3.482l13.312 2.253 3.072 6.144c1.741 3.379 5.632 11.571 8.704 18.125l5.632 11.878 8.397-17.101c4.608-9.421 8.602-17.51 8.806-18.022zM523.469 584.806c1.331-0.307 5.53-1.024 9.421-1.741l7.066-1.229-6.963-6.349-6.963-6.246 2.15-8.909c1.229-4.813 2.253-9.011 2.253-9.318s-2.867 1.126-6.349 3.072c-11.469 6.349-9.83 6.246-19.558 1.024l-8.704-4.813 4.915 19.046-3.379 2.97c-1.741 1.536-5.018 4.403-7.168 6.246l-3.891 3.379 2.867 0.614c1.536 0.307 5.939 1.024 9.626 1.638l6.656 1.126 3.891 8.090 3.994 8.090 3.891-8.090c2.867-6.042 4.506-8.294 6.246-8.602zM427.93 486.4c4.608-9.728 5.939-11.776 8.192-12.186 4.608-0.922 22.016-3.789 23.859-3.994 2.253-0.205 1.536-1.024-10.342-11.469l-9.011-7.987 3.482-13.312c1.843-7.373 3.379-13.722 3.379-14.131s-5.837 2.458-12.902 6.349l-12.902 7.066-12.698-7.168c-6.963-3.891-12.698-6.554-12.698-5.939s1.434 6.861 3.174 13.824c1.638 7.066 2.97 13.107 2.765 13.517s-4.608 4.608-9.83 9.114c-5.222 4.608-9.421 8.704-9.523 9.114 0 0.819 3.072 1.536 11.878 2.867 7.066 1.024 15.155 2.56 15.36 2.765 0.102 0.205 2.662 5.53 5.632 11.878 2.97 6.246 5.734 11.469 6.042 11.469s3.072-5.325 6.144-11.776zM319.078 462.746c-1.434-7.782-4.198-23.245-6.144-34.202-2.048-10.957-3.277-20.173-2.867-20.582 1.024-1.024 17.51-14.131 21.709-17.306 1.843-1.434 8.090-6.246 13.824-10.752 5.632-4.506 12.698-10.035 15.667-12.186 2.867-2.253 5.12-4.198 4.915-4.403s-16.589-3.072-36.352-6.349c-19.763-3.277-36.147-6.144-36.352-6.349-0.102-0.205-2.97-6.656-6.246-14.234-5.018-11.674-11.469-26.624-21.197-49.152l-1.946-4.506-14.746 33.075c-8.090 18.227-14.95 33.28-15.155 33.485-0.512 0.614-6.963 1.126-23.245 1.946-7.066 0.307-14.438 0.819-16.384 1.024-4.301 0.512-26.419 1.843-28.877 1.741-1.024 0-1.843 0.205-1.843 0.512 0 0.819 4.403 5.939 15.872 18.227 18.944 20.48 30.72 33.485 31.334 34.611 0.41 0.717-0.205 4.915-1.229 9.421-3.789 16.179-12.186 55.194-12.186 56.32 0 0.717 13.722-5.53 30.515-13.824l30.413-15.155 7.68 4.198c4.198 2.355 18.33 10.035 31.232 17.101 13.005 7.066 23.654 12.595 23.859 12.186 0.102-0.307-0.922-6.963-2.253-14.848zM480.256 361.472c11.571-13.312 12.8-14.336 15.77-14.029 1.741 0.205 10.957 1.126 20.378 2.048 9.421 1.024 17.408 1.638 17.613 1.434 0.205-0.307-0.819-2.355-2.458-4.71-1.638-2.253-6.656-9.933-11.162-16.896l-8.294-12.698 2.048-3.994c1.126-2.15 4.403-8.192 7.475-13.312 8.499-14.95 10.957-19.456 10.65-19.866-0.205-0.102-9.011 1.741-19.661 4.301-10.547 2.458-20.070 4.506-20.992 4.506-0.922-0.102-8.294-6.554-16.486-14.336-8.090-7.885-15.053-14.336-15.36-14.336s-0.614 3.994-0.614 9.011c-0.41 25.702-0.717 31.744-1.331 32.666-0.307 0.614-8.602 4.915-18.227 9.626-9.728 4.71-17.715 8.806-17.715 9.114s7.987 4.198 17.715 8.704c9.626 4.403 18.125 8.499 18.739 9.114 0.717 0.614 2.765 9.523 4.608 19.866 1.843 10.24 3.686 18.534 4.096 18.432 0.41-0.205 6.349-6.758 13.21-14.643z" />
+<glyph unicode="&#xea13;" glyph-name="hospital" d="M358.4 832.512v-51.712h-128v-76.8h-51.2v-665.6h-25.6v-25.6h716.8v25.6h-25.6v665.6h-51.2v76.8h-128v103.424h-307.2v-51.712zM537.6 832v-25.6h51.2v-51.2h-51.2v-51.2h-51.2v51.2h-51.2v51.2h51.2v51.2h51.2v-25.6zM332.8 588.8v-64h-102.4v128h102.4v-64zM486.4 588.8v-64h-102.4v128h102.4v-64zM640 588.8v-64h-102.4v128h102.4v-64zM793.6 588.8v-64h-102.4v128h102.4v-64zM332.8 384v-64h-102.4v128h102.4v-64zM486.4 384v-64h-102.4v128h102.4v-64zM640 384v-64h-102.4v128h102.4v-64zM793.6 384v-64h-102.4v128h102.4v-64zM332.8 179.2v-64h-102.4v128h102.4v-64zM500.736 153.6v-89.6h-116.736v179.2h116.736v-89.6zM641.024 153.6v-89.6h-118.784v179.2h118.784v-89.6zM793.6 179.2v-64h-102.4v128h102.4v-64z" />
+<glyph unicode="&#xea14;" glyph-name="hotel" d="M320.41 882.688c-16.794-4.608-30.003-16.691-35.84-32.87-1.946-5.12-2.355-8.909-2.765-24.678l-0.41-18.739h-50.995v-51.2l-3.072-0.102c-1.638-0.102-3.379-0.205-3.789-0.307-0.512-0.102-2.662-0.512-4.915-1.024-17.613-3.482-34.406-20.787-38.298-39.322-0.819-3.891-1.126-99.942-1.126-340.685v-335.36h-25.6v-25.6h716.8v25.6h-25.6v335.667c0 323.584-0.102 335.974-1.946 342.938-2.355 9.216-7.885 18.227-15.053 24.883-8.294 7.475-16.896 11.366-28.467 12.8l-5.734 0.717v50.995h-51.2v16.384c0 24.269-3.277 34.099-15.258 46.182-7.373 7.373-16.077 12.186-25.498 14.131-8.397 1.741-374.784 1.434-381.235-0.41zM391.68 838.554c3.891-8.192 7.373-15.053 7.68-15.258 0.41-0.307 7.782-1.638 16.486-3.072s16.486-2.867 17.306-3.174c1.126-0.41 0.41-1.536-2.662-4.301-13.619-12.288-20.275-18.227-21.197-18.842-0.819-0.512 0.102-5.734 2.765-16.896 2.15-8.909 4.096-17.306 4.403-18.637 0.614-2.253 0.512-2.355-1.843-0.819-1.331 0.819-8.806 5.018-16.589 9.216l-14.131 7.68-16.282-9.011c-9.011-5.018-16.384-8.704-16.384-8.294s1.843 8.090 4.096 17.101c2.253 8.909 4.096 16.896 4.096 17.51 0 0.717-5.734 6.451-12.8 12.698-6.963 6.349-12.493 11.776-12.288 12.186 0.307 0.41 2.458 1.126 4.915 1.434 2.458 0.41 5.632 0.922 6.963 1.126s6.144 0.922 10.65 1.638c4.506 0.717 9.114 1.536 10.24 1.946 1.434 0.512 4.506 5.632 9.216 15.77 3.994 8.192 7.373 14.95 7.68 14.95s3.789-6.656 7.68-14.95zM536.576 821.35c5.222-0.922 13.107-2.253 17.51-2.867 4.506-0.614 8.090-1.434 8.090-1.946 0-0.41-3.379-3.584-7.373-7.168-4.096-3.584-9.933-8.909-13.005-11.776l-5.53-5.222 4.301-17.51c2.253-9.523 4.198-17.613 4.198-17.92s-7.373 3.584-16.384 8.499l-16.486 9.114-5.837-3.379c-11.776-6.758-25.907-14.131-26.419-13.619-0.205 0.205 1.434 7.782 3.686 16.691 4.301 17.101 4.71 19.456 3.174 20.070-0.512 0.205-2.97 2.15-5.427 4.403s-7.782 7.066-11.878 10.65c-4.096 3.584-7.066 6.861-6.656 7.27 0.614 0.614 30.925 6.144 33.587 6.144 0.307 0 3.789 6.554 7.68 14.643 3.789 7.987 7.373 14.95 7.782 15.36 0.512 0.41 4.096-6.042 8.192-14.438l7.27-15.258 9.523-1.741zM647.168 839.475c3.584-7.782 6.963-14.643 7.578-15.36s8.499-2.458 17.51-3.994c9.011-1.536 16.794-3.072 17.203-3.482s-4.915-5.734-11.981-11.878c-6.963-6.144-12.8-11.776-12.8-12.493-0.102-0.614 1.741-8.806 3.994-18.125s4.096-17.101 4.096-17.306c0-0.205-7.373 3.584-16.384 8.602l-16.384 9.011-16.077-8.909c-8.909-4.915-16.282-8.602-16.486-8.294-0.102 0.41 1.536 8.090 3.891 16.998 2.253 8.909 4.096 16.998 3.994 17.818 0 0.819-2.458 3.584-5.325 6.042-11.571 9.83-20.070 17.92-19.661 18.534 0.41 0.717 4.096 1.434 13.926 2.765 2.048 0.205 7.578 1.229 12.288 2.15 6.963 1.434 8.806 2.15 9.728 4.096 0.614 1.331 3.891 8.090 7.168 15.155 3.277 6.963 6.246 12.698 6.554 12.698 0.41 0 3.584-6.349 7.168-14.029zM332.8 588.8v-64h-102.4v128h102.4v-64zM486.4 588.8v-64h-102.4v128h102.4v-64zM640 588.8v-64h-102.4v128h102.4v-64zM793.6 588.8v-64h-102.4v128h102.4v-64zM332.8 384v-64h-102.4v128h102.4v-64zM486.4 384v-64h-102.4v128h102.4v-64zM640 384v-64h-102.4v128h102.4v-64zM793.6 384v-64h-102.4v128h102.4v-64zM332.8 179.2v-64h-102.4v128h102.4v-64zM499.712 153.6v-89.6h-115.712v179.2h115.712v-89.6zM640 153.6v-89.6h-116.736v179.2h116.736v-89.6zM793.6 179.2v-64h-102.4v128h102.4v-64z" />
+<glyph unicode="&#xea15;" glyph-name="Hourglass" d="M221.286 881.459c-6.042-2.15-12.698-8.909-14.746-15.155-1.434-4.096-1.741-9.523-1.741-32.461v-27.443h25.6l0.102-67.789c0-37.376 0.205-68.608 0.307-69.427 0.205-0.819 0.614-4.198 1.024-7.475 1.331-11.776 7.782-31.232 14.029-42.189 13.824-24.576 24.576-35.021 76.698-74.752 99.123-75.571 105.472-80.486 107.93-83.866 3.686-5.018 4.608-8.192 4.301-14.336-0.205-4.506-0.922-6.758-3.277-10.035-1.843-2.765-14.336-12.902-34.202-28.16-17.203-13.107-33.28-25.498-35.84-27.443s-8.397-6.451-12.902-9.933c-4.608-3.584-17.51-13.312-28.57-21.811-34.406-26.112-44.749-34.611-52.941-43.418-20.275-21.811-31.846-46.49-36.045-76.39-0.205-1.638-0.512-33.792-0.512-71.373l-0.102-68.403h-25.702l0.307-29.389c0.307-32.973 0.307-32.563 7.987-40.243 7.782-7.782-18.432-7.168 301.568-6.963l286.72 0.307 4.915 2.97c2.662 1.536 6.042 4.403 7.373 6.144 5.222 6.758 5.632 10.035 5.632 39.629v27.546h-25.6l-0.102 67.379c0 36.966-0.205 68.71-0.41 70.349-1.331 10.854-1.843 14.029-3.789 20.992-6.144 22.63-17.715 42.291-35.635 60.518-5.939 5.939-14.438 13.619-18.944 16.998s-18.022 13.619-30.106 22.938c-12.083 9.216-26.112 19.968-31.232 23.859s-15.053 11.469-22.118 16.896c-7.066 5.427-16.794 12.8-21.606 16.486-33.69 25.498-36.045 27.546-38.707 33.075-3.891 8.090-2.253 16.998 4.301 23.654 3.891 3.891 9.933 8.602 41.677 32.768 5.939 4.506 14.643 11.162 19.456 14.848 24.883 19.149 71.168 54.477 78.336 59.904 4.506 3.379 13.005 10.957 18.944 16.998 16.077 16.077 26.931 33.587 33.69 54.067 5.939 17.715 6.246 22.938 6.246 97.485v67.584h25.702l-0.307 29.491-0.307 29.389-2.765 4.71c-1.536 2.56-4.403 5.939-6.349 7.475-8.192 6.144 14.029 5.734-297.984 5.632-256.102 0-286.31-0.205-290.304-1.638zM742.4 740.762c0-42.394-0.41-68.198-1.126-72.909-1.946-13.005-9.216-28.16-18.637-39.117-8.294-9.421-10.65-11.366-60.109-49.152-25.6-19.661-52.122-39.834-58.88-45.056-6.758-5.12-18.227-13.926-25.6-19.558-25.395-19.354-34.406-31.539-38.912-52.531-1.843-8.499-1.331-25.088 0.922-33.382 2.458-8.704 8.090-19.354 14.234-27.136 5.427-6.656 9.216-9.728 75.469-60.416 13.619-10.445 32.87-25.19 42.906-32.768 9.933-7.68 22.221-16.998 27.238-20.89 23.347-17.613 35.942-35.123 40.755-56.422 1.434-6.144 1.638-16.896 1.741-74.547v-67.277l-17.51 0.205-17.408 0.307-3.891 10.24c-7.066 18.842-21.811 45.67-36.352 66.253-42.906 60.826-107.213 116.634-145.51 126.259-11.878 2.97-20.173 1.331-38.093-7.27-41.165-20.070-100.25-76.902-133.222-128.307-3.072-4.813-6.656-10.445-7.987-12.39-3.379-5.325-11.776-20.992-15.462-29.184-6.861-15.36-8.294-18.534-9.421-22.221l-1.331-3.891h-34.611v66.56c0 73.421 0.102 75.366 6.349 89.6 3.789 8.499 6.861 13.517 13.107 20.992 7.066 8.499 11.264 12.186 32.051 27.955 5.018 3.789 11.878 9.114 15.36 11.776 3.482 2.765 12.39 9.523 19.661 15.053 7.373 5.53 17.715 13.517 23.040 17.613s18.534 14.131 29.184 22.323c47.002 35.738 50.995 39.424 58.266 54.272 5.837 11.878 7.168 17.92 7.168 31.744 0.102 16.794-2.662 26.522-11.366 40.141-6.246 9.83-14.541 17.101-47.514 41.779-2.867 2.15-46.285 35.43-56.73 43.52-5.837 4.506-15.974 12.288-36.864 28.16-28.262 21.504-36.147 29.696-44.032 46.285-7.373 15.36-7.066 11.674-7.373 89.19l-0.41 69.837h460.902v-65.638zM317.952 649.011c1.638-2.15 4.506-5.632 6.554-7.885 2.048-2.15 45.056-35.021 95.642-72.909l91.853-69.018 91.955 69.018c50.483 37.99 93.491 70.758 95.539 72.909 2.048 2.253 4.915 5.734 6.554 7.885l2.765 3.789h-393.626l2.765-3.789z" />
+<glyph unicode="&#xea16;" glyph-name="Im_driving" d="M244.019 740.454c-7.168-1.741-15.974-6.349-21.606-11.366-5.837-5.12-158.925-209.101-164.762-219.546-2.867-5.12-4.71-9.933-5.427-14.336-0.717-4.71-1.024-36.864-0.819-103.526l0.307-96.768 2.662-6.349c7.168-16.589 20.992-28.467 37.274-31.846 3.072-0.717 21.709-1.126 45.978-1.229 22.528 0 41.062-0.102 41.165-0.307 0.102-0.102 0.41-3.482 0.717-7.373 2.15-25.19 12.493-47.309 30.31-65.024 13.005-12.902 28.262-21.606 46.080-26.419 8.499-2.253 11.981-2.56 25.702-2.56 13.824 0 17.203 0.307 25.805 2.662 17.818 4.71 33.075 13.517 46.387 26.829 17.306 17.203 27.75 39.526 29.696 63.386l0.717 8.806h255.795l0.102-3.789c0.205-16.896 7.168-37.99 18.022-54.272 5.222-7.987 18.842-21.504 26.419-26.419 20.070-12.902 37.99-18.022 60.928-17.408 27.546 0.819 49.664 10.342 69.12 29.696 15.053 14.95 25.907 35.738 28.774 54.784 0.41 3.072 0.819 6.144 0.922 6.656 0.102 0.614 0.307 3.174 0.307 5.939l0.205 4.813h40.243c24.576 0 42.598 0.41 46.285 1.126 19.046 3.482 34.816 18.637 39.936 38.093 2.253 8.909 2.253 168.346 0 177.254-2.458 9.421-6.758 16.998-13.312 23.757-9.216 9.421-16.896 12.698-40.96 17.203-10.65 2.048-27.75 5.325-37.888 7.373-10.138 1.946-20.275 3.789-22.528 4.096s-5.734 1.024-7.68 1.434c-1.946 0.512-12.288 2.56-23.040 4.608-10.65 2.048-19.661 4.096-19.968 4.506-0.307 0.512-4.301 4.915-8.909 9.728-4.608 4.915-11.981 12.698-16.384 17.306-15.258 16.179-24.474 26.010-39.219 41.677-8.192 8.704-18.432 19.661-22.835 24.269-7.885 8.397-15.974 16.896-32.563 34.611-4.71 5.018-12.595 13.312-17.408 18.432-4.813 5.018-10.138 10.65-11.776 12.39-32.256 34.714-35.942 38.298-43.315 42.291-12.39 6.554-1.843 6.246-191.59 6.144-134.554-0.102-173.67-0.307-177.869-1.331zM399.872 654.848c1.126-0.717 4.198-3.891 6.758-7.066s12.595-15.053 22.221-26.522c18.944-22.426 20.48-25.088 19.149-33.587-0.614-4.608-1.638-5.837-14.848-19.354-7.68-7.885-14.541-15.258-15.053-16.384-4.403-8.704 15.36-39.117 45.466-70.042 6.861-7.168 16.077-15.872 20.378-19.558s8.397-7.066 9.011-7.68c13.005-11.776 34.816-24.678 43.622-25.805l4.198-0.614 14.541 14.438c15.565 15.462 19.046 17.613 26.829 16.896 2.253-0.307 5.222-1.229 6.656-2.15 2.15-1.331 25.088-20.070 26.624-21.709 0.307-0.307 3.277-2.867 6.656-5.632 3.379-2.867 7.27-6.144 8.704-7.475s4.506-3.789 6.861-5.632c4.71-3.584 8.499-9.933 8.499-14.336 0-1.536-0.614-4.301-1.434-6.144-1.946-4.506-36.864-38.81-42.291-41.574-17.51-8.806-46.49-4.813-79.667 11.059-97.792 46.694-194.56 171.725-182.682 236.032 2.048 11.571 3.891 14.131 24.166 34.611 16.589 16.691 19.661 19.354 23.245 20.070 4.608 0.922 9.216 0.205 12.39-1.843z" />
+<glyph unicode="&#xea17;" glyph-name="image" d="M153.907 479.539c0.205-306.586 0.307-327.373 2.048-332.698 8.397-27.341 26.522-45.773 53.555-54.477l7.066-2.253 653.824-0.512v323.584c0 291.635-0.205 324.403-1.638 331.571-5.837 28.467-26.317 50.381-55.296 59.29-5.734 1.741-22.118 1.843-333.005 2.048l-326.861 0.307 0.307-326.861zM796.672 751.514c8.499-4.096 14.848-10.445 18.842-18.842l3.174-6.656 0.307-167.424c0.102-92.058 0.102-183.296 0-202.752l-0.307-35.328-14.746 16.896c-8.192 9.318-15.053 17.101-15.36 17.408-0.41 0.307-2.15 2.355-4.096 4.608-3.891 4.506-14.746 16.896-21.197 24.064-2.253 2.56-10.957 12.493-19.354 22.016-15.258 17.408-20.378 23.245-36.557 41.472-4.71 5.325-13.824 15.77-20.275 23.040-6.349 7.373-14.438 16.589-18.022 20.48-3.482 3.994-15.36 17.51-26.522 30.208-11.059 12.698-21.606 24.269-23.245 25.805-4.096 3.584-10.445 4.608-15.36 2.56-2.253-0.922-6.758-5.325-12.698-12.083-4.915-5.837-9.318-10.854-9.626-11.162s-7.475-8.602-15.872-18.432c-8.397-9.83-15.565-18.125-15.872-18.432s-3.072-3.482-6.144-7.168c-3.072-3.686-5.837-6.861-6.144-7.168s-3.072-3.482-6.144-7.168c-3.072-3.686-8.806-10.342-12.8-14.848-15.36-17.613-18.739-21.606-21.606-25.088-1.638-1.946-3.174-3.789-3.482-4.096s-7.475-8.602-15.872-18.432c-8.397-9.83-15.565-18.125-15.872-18.432s-2.765-3.174-5.53-6.451c-2.765-3.277-5.325-5.734-5.837-5.632-0.819 0.307-4.71 5.734-52.019 72.090-28.467 39.936-31.437 43.827-35.533 45.568-4.608 2.048-8.909 1.946-13.21-0.41-1.331-0.717-7.066-6.554-12.8-13.005-5.837-6.451-13.824-15.462-17.92-19.968-3.994-4.506-9.114-10.24-11.366-12.8-4.096-4.71-10.957-12.288-13.722-15.36-0.819-0.819-4.71-5.222-8.704-9.728-3.891-4.506-8.806-10.035-10.854-12.288-9.421-10.445-21.606-23.962-23.962-26.726-11.571-13.414-24.678-27.955-25.19-27.955-0.307-0.102-3.379 2.56-6.656 5.837-6.656 6.451-10.854 13.926-12.595 22.528-0.819 3.789-1.126 59.904-1.126 189.235v183.706l585.216-0.512 6.656-3.174zM336.384 677.786c-22.323-4.71-36.557-14.746-47.309-33.382-6.349-10.854-8.909-30.413-5.939-43.827 5.018-21.811 22.323-40.55 43.827-47.309 9.83-3.072 24.166-3.482 33.792-0.922 22.426 5.837 39.731 22.528 46.387 44.646 2.662 8.806 2.458 27.341-0.307 36.045-6.963 21.299-24.474 37.888-45.978 43.315-7.27 1.843-18.944 2.56-24.474 1.434z" />
+<glyph unicode="&#xea18;" glyph-name="image_file" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM691.2 494.899c12.39-6.042 20.787-16.077 24.166-28.877 1.126-4.301 1.434-32.973 1.434-165.274v-159.949l-376.32 0.512-7.68 3.789c-12.8 6.246-21.811 17.408-24.474 30.31-0.819 3.789-1.126 52.019-1.126 164.659v159.13l376.32-0.512 7.68-3.789zM333.005 359.731c0.307-127.488-0.307-116.838 7.68-125.133l3.789-3.891 4.096 4.403c6.246 6.963 24.678 27.546 31.334 35.123 1.946 2.253 5.939 6.656 8.704 9.83 2.867 3.072 10.445 11.469 16.691 18.637 6.451 7.168 12.595 13.21 13.926 13.517 5.837 1.434 7.373-0.205 32.358-35.226 13.21-18.637 24.269-33.792 24.576-33.792 0.41 0 4.608 4.506 9.318 10.035 20.48 23.859 46.899 54.579 53.043 61.747 3.686 4.198 9.011 10.445 11.878 13.824 2.765 3.277 7.475 8.499 10.445 11.571 5.018 5.12 5.632 5.427 9.216 4.915 2.15-0.41 4.506-1.536 5.427-2.662 0.819-1.024 9.83-11.264 19.968-22.733s19.558-22.221 20.992-23.859c1.434-1.638 3.072-3.482 3.584-4.096 4.915-5.427 58.573-66.355 69.427-78.746 1.741-2.048 1.741 3.277 1.536 121.242-0.307 117.658-0.41 123.494-2.15 126.771-2.56 4.608-6.451 8.192-11.469 10.445-3.891 1.843-11.162 1.946-174.387 1.946h-170.189l0.205-113.869zM438.579 418.509c17.408-8.192 26.214-28.467 20.173-46.285-3.584-10.854-10.445-18.33-21.197-23.245-5.018-2.355-7.373-2.765-15.155-2.867-8.192 0-9.933 0.41-15.872 3.174-8.397 3.994-14.746 10.342-18.842 18.842-2.765 5.734-3.174 7.782-3.174 14.848 0 16.077 7.168 28.365 20.685 35.226 10.24 5.12 22.835 5.325 33.382 0.307zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xea19;" glyph-name="improvement" d="M698.88 798.208c25.293-25.293 46.182-46.387 46.285-46.797 0.205-0.41-45.261-46.387-100.966-102.093l-101.376-101.274-107.725 107.725-347.034-347.136v-70.349c0.102-74.957 0.41-79.872 5.325-95.949 1.229-3.891 2.355-7.373 2.56-7.68 0.205-0.205 76.595 75.776 169.779 168.96l169.472 169.472 107.52-107.52 294.4 294.4 47.923-47.821 47.821-47.923-0.205 131.072-0.307 131.072-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-7.885 6.042-0.717 5.734-141.312 5.734h-129.126l45.978-46.080zM689.971 440.115l-147.149-147.149-107.622 107.622-311.091-310.989 6.758-6.246c16.077-14.746 35.533-24.474 60.109-30.208 7.885-1.843 18.739-1.946 318.976-1.946 296.653 0 311.194 0.102 319.488 1.843 26.522 5.734 46.592 16.589 65.638 35.533 17.818 17.715 27.648 35.226 34.509 60.826l2.765 10.342 0.614 332.186-47.718 47.718c-26.112 26.214-47.718 47.616-47.821 47.616-0.205 0-66.56-66.253-147.456-147.149z" />
+<glyph unicode="&#xea1a;" glyph-name="inbox" d="M419.738 881.664c-31.334-6.246-56.013-32.87-60.723-65.536-0.205-1.638-0.512-73.728-0.512-159.949l-0.102-156.979h-76.288c-41.984 0-76.288-0.205-76.288-0.512s9.216-9.626 20.378-20.685c11.264-11.162 69.325-68.915 129.126-128.307 129.946-129.126 119.603-118.989 126.157-123.29 19.456-12.288 46.797-11.162 65.024 2.662 1.843 1.434 54.579 53.453 117.146 115.61 62.464 62.157 123.085 122.368 134.656 133.837l20.992 20.685h-153.702v156.467c0 102.502-0.41 158.618-1.024 162.918-5.12 31.13-29.082 56.32-59.904 62.874-9.933 2.15-174.387 2.253-184.934 0.205zM77.107 235.315c0.307-135.475 0.307-135.987 2.458-144.179 9.421-35.123 34.406-62.054 67.584-73.114 15.872-5.325-3.379-5.018 368.435-4.813l346.112 0.102 7.885 2.355c38.605 11.162 64.512 37.376 74.854 75.469 2.15 8.192 2.15 8.397 2.458 144.179l0.41 135.885h-128.102v-230.4h-614.4v230.4h-128l0.307-135.885z" />
+<glyph unicode="&#xea1b;" glyph-name="Incoming_call_curved_arrow" d="M844.595 833.331c0-25.805-0.205-48.128-0.307-49.562-2.15-29.389-15.974-62.669-35.533-85.402-23.347-27.136-52.019-44.134-87.757-52.019-9.728-2.15-11.674-2.15-160.563-2.458l-150.835-0.41v101.99c0 56.013-0.205 101.888-0.512 101.888-0.205 0-75.571-75.162-167.322-166.912-98.099-98.099-168.653-169.37-170.906-172.851-17.92-26.419-17.92-60.006 0.102-86.733 2.662-3.891 64.819-66.765 171.418-173.363l167.219-167.219v204.902l123.699 0.102c67.994 0 125.645 0.205 128.205 0.512 10.24 0.922 25.293 2.56 28.16 3.072 8.806 1.331 20.89 3.584 24.064 4.506 1.946 0.512 6.554 1.638 10.24 2.56 34.406 8.192 76.8 28.058 108.646 50.688 20.582 14.746 45.363 37.478 61.44 56.32 26.419 31.027 48.538 70.349 61.338 108.851 6.144 18.227 11.674 41.267 13.722 57.037 0.307 1.946 1.024 7.066 1.741 11.264 1.434 9.728 2.048 52.634 0.819 65.536-6.451 71.782-35.021 138.752-81.715 192-7.066 7.987-29.491 29.798-37.274 36.147l-7.885 6.451-0.205-46.899z" />
+<glyph unicode="&#xea1c;" glyph-name="Increase_test_size" d="M416.358 856.371c-46.285-5.734-87.859-37.888-110.080-85.197-1.843-3.891-9.83-24.678-17.715-46.080-7.885-21.504-17.408-47.514-21.299-57.958-3.789-10.445-14.848-40.55-24.576-67.072-9.728-26.419-19.968-54.374-22.733-61.952-2.867-7.578-5.53-14.95-5.939-16.384-0.512-1.434-1.843-5.12-3.072-8.192s-2.867-7.475-3.584-9.728c-0.717-2.253-6.758-18.637-13.312-36.352s-15.667-42.394-20.173-54.784c-4.506-12.39-9.523-26.010-11.059-30.208s-6.554-17.818-11.059-30.208c-4.506-12.39-12.186-33.075-16.896-46.080-26.112-70.963-36.045-98.099-38.605-104.96-1.536-4.198-4.915-13.619-7.68-20.992-8.602-23.347-10.24-31.744-11.366-55.706-0.717-15.258-0.307-18.227 4.403-31.027 12.083-32.87 53.453-55.603 99.123-54.682 15.155 0.41 22.835 2.56 33.587 9.83 13.414 9.011 22.835 20.787 32.87 41.472 6.554 13.414 10.854 25.702 18.432 53.248 8.294 30.003 14.95 54.067 15.565 56.115 0.512 1.638 8.704 1.741 154.010 1.741h153.395l1.126-3.277c0.922-3.072 3.789-13.107 19.968-70.554 6.246-22.323 8.294-27.853 13.619-38.298 6.042-11.674 13.517-21.914 22.835-31.232 10.957-10.957 21.709-16.794 34.509-18.637 17.306-2.56 44.954 1.946 63.898 10.342 26.112 11.674 40.96 27.853 47.104 51.507 1.946 7.373 2.15 10.24 1.638 21.811-1.331 29.696-2.048 32.358-26.317 97.792-6.758 18.227-37.683 102.4-44.544 121.344-6.246 17.203-44.646 121.754-51.712 140.8-6.349 17.203-23.552 64.307-33.894 92.672-2.253 6.246-4.71 12.902-5.53 14.848s-6.554 17.613-12.902 34.816c-6.246 17.203-14.541 39.731-18.33 50.176s-12.595 34.406-19.558 53.248c-14.643 40.038-19.456 50.688-29.696 66.048-9.114 13.722-26.317 31.232-38.912 39.629-15.462 10.445-33.382 17.818-51.61 21.299-7.782 1.536-34.611 2.048-43.93 0.819zM445.44 637.44c4.506-14.336 8.909-27.955 9.728-30.208 0.717-2.253 4.915-15.155 9.216-28.672s10.138-31.744 13.005-40.448c2.765-8.704 7.68-23.654 10.752-33.28 3.072-9.523 8.294-25.702 11.571-35.84 8.602-26.624 25.805-80.282 33.28-103.629 0.41-1.024-19.456-1.331-96.87-1.331-77.517 0-97.28 0.307-96.87 1.331 0.512 1.229 17.203 52.838 24.474 75.469 2.253 7.066 5.632 17.408 7.475 23.040s6.758 20.582 10.752 33.28c4.096 12.698 9.421 29.082 11.776 36.352 2.458 7.373 6.042 18.637 8.090 25.088s6.246 19.354 9.318 28.672c2.97 9.318 9.626 30.003 14.848 46.080 10.957 34.202 10.342 32.563 10.854 31.232 0.102-0.512 3.994-12.8 8.602-27.136zM760.013 856.166c-6.042-1.946-10.65-5.734-14.131-11.571l-2.97-4.915-0.307-42.189-0.307-42.291h-39.731c-45.67 0-47.514-0.205-54.784-7.578-7.373-7.27-7.782-9.83-7.782-43.622s0.41-36.352 7.782-43.622c7.27-7.373 9.114-7.578 54.886-7.578h39.731v-40.141c0-24.576 0.41-41.779 1.024-44.032 1.638-5.734 7.066-12.186 12.8-15.053l5.018-2.662h65.843l4.915 3.072c5.837 3.584 10.445 9.728 11.776 15.462 0.512 2.15 1.024 21.811 1.024 43.725v39.629h40.243c44.237 0 45.875 0.205 53.146 6.144 2.048 1.741 4.915 5.427 6.349 8.294 2.56 5.222 2.56 5.222 2.662 35.43 0.102 34.918-0.307 37.274-7.68 44.749-7.27 7.578-8.909 7.782-54.989 7.782h-39.731v39.731c0 43.213-0.307 45.875-5.632 52.838-1.638 2.15-5.018 5.018-7.578 6.554l-4.71 2.765-31.232 0.205c-24.064 0.205-32.256-0.102-35.635-1.126z" />
+<glyph unicode="&#xea1d;" glyph-name="info" d="M501.555 882.688c-0.205-0.205-6.554-0.512-14.131-0.922-82.022-3.789-166.093-33.997-233.472-83.968-54.886-40.653-99.942-93.901-130.253-153.702-18.33-36.045-33.894-82.842-40.243-120.832-0.922-5.632-1.843-10.445-2.048-10.752-0.102-0.307-0.614-4.403-1.024-9.216s-0.922-9.011-1.126-9.318c-2.458-4.096-2.458-89.702 0-94.106 0.205-0.307 0.717-3.482 1.024-7.168 3.174-30.515 14.029-72.602 27.443-106.496 6.451-16.282 21.299-46.387 29.798-60.621 20.173-33.28 39.629-58.163 66.253-84.787 18.33-18.33 20.275-20.173 34.816-31.846 77.517-62.464 173.67-96.563 272.384-96.563 94.925 0.102 183.398 28.979 259.072 84.787 32.461 23.859 65.331 56.32 89.293 88.166 28.774 38.298 50.381 79.36 65.434 124.416 7.782 23.45 15.053 53.555 17.818 73.728 2.15 16.589 2.662 21.094 3.379 30.72 0.922 14.336 0.922 54.17-0.102 67.482-5.53 72.294-30.822 145.818-70.656 205.414-10.752 16.077-13.005 19.149-25.19 34.304-20.275 25.293-51.098 54.886-78.438 75.469-53.35 39.936-120.525 68.608-186.88 79.667-14.029 2.355-13.926 2.355-24.576 3.482-16.794 1.843-57.446 3.584-58.573 2.662zM526.336 778.752c41.062-7.475 68.915-48.23 61.030-89.293-7.066-36.864-37.99-62.362-75.571-62.362-36.966-0.102-68.096 25.805-75.162 62.157-4.71 24.986 2.867 49.664 21.094 67.994 18.534 18.739 42.598 26.214 68.608 21.504zM588.8 404.48c0.614-160.768 0.717-171.418 2.458-178.176 1.946-7.68 6.963-19.251 9.728-22.426 5.632-6.554 18.125-10.547 37.274-11.776 1.536-0.102 1.741-1.434 1.741-13.21v-13.005h-229.888l-0.614 26.624 4.403-0.102c7.27-0.102 19.149 2.355 25.088 5.325 10.957 5.325 14.131 10.445 16.794 26.522 1.434 8.499 2.048 267.469 0.717 283.238-1.126 12.595-4.198 24.986-7.475 29.184-4.71 6.144-19.149 11.264-33.485 11.776l-5.939 0.205v13.005c0 7.168 0.205 13.21 0.41 13.414 0.307 0.205 40.448 0.41 89.395 0.41h88.883l0.512-171.008z" />
+<glyph unicode="&#xea1e;" glyph-name="Information_data" d="M478.003 881.664c-0.205-0.205-3.994-0.614-8.499-0.922-17.51-1.536-40.55-5.325-57.344-9.523-5.632-1.331-12.8-3.174-15.872-3.891-9.011-2.253-32.256-10.035-45.568-15.36-12.8-5.018-40.653-18.33-51.2-24.474-3.379-1.946-7.782-4.403-9.728-5.53-12.083-6.656-47.718-31.846-55.808-39.424-1.126-1.024-4.915-4.301-8.397-7.168-8.806-7.27-37.171-36.147-46.080-46.797-23.654-28.467-41.165-55.194-57.651-88.064-22.426-44.749-38.093-98.918-42.598-146.432-0.307-3.686-0.819-7.782-1.126-9.216-0.922-4.813-1.126-57.856-0.307-68.096 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.331-7.373 2.458-13.824 20.48-117.658 95.232-227.226 198.656-291.021 59.29-36.659 123.699-57.856 194.048-64 11.878-1.024 58.88-1.024 70.144 0 37.274 3.482 69.734 10.035 101.683 20.685 22.528 7.475 50.483 19.149 49.562 20.787-1.331 2.15-43.213 74.65-75.776 131.277-7.373 12.698-14.131 24.474-15.053 26.112-1.024 1.741-3.379 5.837-5.325 9.216-7.987 13.824-28.467 49.357-39.014 67.584-20.89 36.25-26.010 45.056-38.093 66.048-6.656 11.571-15.258 26.522-19.251 33.28-3.891 6.758-8.090 13.926-9.216 15.872-1.024 1.946-3.789 6.656-5.939 10.445l-3.994 6.758v459.981l-4.096-0.205c-2.253-0.102-4.198-0.205-4.301-0.307zM537.6 677.99v-204.39h408.678l-0.614 7.475c-0.819 9.523-1.434 15.565-2.048 20.685-0.307 2.253-0.819 5.939-1.126 8.192-8.192 60.928-31.642 122.778-67.482 177.664-4.403 6.861-21.504 30.413-23.040 31.744-0.307 0.307-3.891 4.71-8.090 9.728-9.626 11.674-38.707 40.755-50.79 50.79-29.491 24.576-58.573 43.622-90.419 59.085-45.875 22.323-98.406 37.274-146.125 41.574-3.379 0.307-9.011 0.819-12.493 1.229l-6.451 0.614v-204.39zM596.992 822.374c50.688-12.698 87.040-28.262 126.464-54.477 66.15-43.827 116.122-105.267 145.408-179.098 7.475-18.842 18.944-57.344 18.944-63.59 0-0.205-67.277-0.41-149.504-0.41h-149.504v149.504c0 118.989 0.307 149.504 1.331 149.504 0.614-0.102 3.789-0.717 6.861-1.434zM547.635 419.123c1.126-1.843 2.97-5.018 3.994-6.963 1.126-1.946 7.066-12.288 13.312-23.040 11.059-19.149 57.344-99.533 60.723-105.472 0.922-1.638 6.144-10.65 11.469-19.968 24.166-41.779 83.968-145.51 93.184-161.792 5.632-9.83 10.957-18.944 11.674-20.173 1.434-2.253 1.434-2.253 10.957 3.994 38.298 25.498 73.728 58.368 102.195 95.027 45.773 58.675 75.878 128.819 86.835 201.933 1.946 13.005 2.355 16.794 3.789 32.87l0.614 6.861h-400.794l2.048-3.277z" />
+<glyph unicode="&#xea1f;" glyph-name="internationaltv" d="M75.776 489.984v-266.24h153.6v-81.92h563.2v81.92h153.6v532.48h-870.4v-266.24zM884.736 489.984v-204.8h-747.52v409.6h747.52v-204.8zM524.595 245.862c22.323-10.854 22.426-43.52 0.102-54.477-28.672-14.029-57.139 19.558-38.298 45.466 8.499 11.776 24.781 15.667 38.195 9.011zM387.789 630.682c-0.102-0.102-3.891-0.512-8.397-0.922-4.506-0.307-8.294-1.024-8.499-1.536s-1.536-0.717-3.072-0.41c-1.536 0.307-4.096 0-5.734-0.614-2.97-1.126-2.97-1.126-0.819-2.662 1.331-0.922 3.174-1.229 4.71-0.819 1.331 0.307 2.662 0.205 2.97-0.307 0.307-0.41-1.024-0.922-2.765-1.024-3.891-0.205-11.469-3.072-10.547-4.096 1.024-0.922 13.21-1.126 15.565-0.205 2.458 0.922 1.024 1.126-6.042 0.922-2.97-0.102-4.71 0.205-4.301 0.819 0.307 0.512 3.891 0.819 7.987 0.614 5.018-0.205 7.885 0.102 9.011 1.024 3.482 2.867 20.48 6.963 20.48 4.813 0-0.614-1.126-1.126-2.458-1.126s-3.994-0.307-5.837-0.717c-3.379-0.717-3.379-0.717-0.922-1.434 2.56-0.717 2.56-0.717 0.205-0.819-5.12-0.205-0.819-2.15 4.813-2.15 6.861 0 8.397-1.126 7.27-5.222-0.717-2.253-0.512-2.97 0.614-2.97 0.819 0 1.434-0.512 1.434-1.126 0-0.512-0.307-0.819-0.717-0.614-0.512 0.307-1.434-0.205-2.253-1.126-1.331-1.331-1.229-1.434 1.331-0.819 1.843 0.41 2.56 0.307 2.15-0.41-0.307-0.512-1.331-1.024-2.048-1.024-2.355 0-4.506-4.301-3.994-8.192 0.614-5.325 2.15-7.578 6.042-8.806 3.379-1.024 3.686-0.922 7.168 2.97 1.946 2.15 4.096 4.915 4.71 5.939 0.614 1.126 2.15 1.946 3.789 1.946 1.536 0 4.813 1.126 7.27 2.56 2.355 1.434 5.632 2.56 7.168 2.56 2.765 0 11.674 2.867 9.83 3.174-0.512 0.102-1.331 0.102-1.741 0-0.512 0-0.819 0.41-0.819 1.024 0 0.717 1.229 1.024 2.97 0.717 2.458-0.41 3.072 0 3.482 1.843 0.307 1.536-0.102 2.56-1.229 2.765-0.922 0.307-0.205 0.512 1.638 0.614 2.15 0.102 3.686 0.819 4.403 2.15 0.614 1.126 0.717 2.048 0.307 2.048s-0.102 0.512 0.717 1.024c1.229 0.819 1.331 1.229 0.205 1.946-1.126 0.614-1.024 1.024 0.307 1.536 0.922 0.307 2.253 0.307 2.765-0.102 0.717-0.307 0.819-0.102 0.41 0.512-0.41 0.717 1.024 1.638 3.686 2.458l4.403 1.331-6.144 0.922c-11.674 1.638-46.285 1.024-54.272-1.024-1.638-0.41-1.741-0.307-0.512 0.512 0.819 0.614 1.126 1.126 0.512 1.229-2.867 0.307-16.896 0.512-17.203 0.307zM548.352 628.531c-3.994-1.024-3.379-1.843 1.536-2.15 2.765-0.102 5.222 0.205 5.632 0.819 0.307 0.512 0 1.024-0.922 1.024-0.819 0-2.048 0.205-2.867 0.41-0.717 0.205-2.253 0.102-3.379-0.102zM538.214 627.2c0.922-0.819 5.427-0.717 4.915 0.205-0.307 0.41-1.638 0.717-2.97 0.614s-2.253-0.512-1.946-0.819zM557.875 627.507c0.717-0.307 1.638-0.205 1.946 0.102 0.41 0.307-0.205 0.614-1.331 0.512-1.126 0-1.434-0.307-0.614-0.614zM593.408 627.302c-0.614-1.126 1.126-1.741 7.987-2.662 5.734-0.717 6.246 0 1.229 2.15-3.994 1.638-8.294 1.843-9.216 0.512zM497.459 626.483c-4.096-0.41-5.12-2.048-2.048-2.97 0.922-0.307 2.56-1.024 3.584-1.536 1.229-0.614 2.458-0.512 4.096 0.512 1.946 1.331 2.56 1.331 4.096 0.102 1.126-0.717 2.662-1.126 3.584-0.717 1.229 0.41 0.512 1.024-2.458 2.355l-3.994 1.741 3.686-0.307c2.048-0.102 4.403 0.102 5.12 0.614 1.434 0.922-7.885 1.024-15.667 0.205zM336.384 623.514l-3.072-1.434 3.072 0.614c3.174 0.614 4.198 1.126 3.482 1.843-0.205 0.205-1.741-0.205-3.482-1.024zM348.16 624.128c2.048-1.331 5.12-1.331 5.12 0 0 0.614-1.536 1.024-3.277 1.024-2.56 0-2.97-0.307-1.843-1.024zM355.226 624.026c-0.819-0.512-1.126-0.922-0.717-0.922 1.126 0-2.458-4.096-3.584-4.096-0.41 0-0.512 0.512-0.205 1.024 0.41 0.614-1.126 1.024-3.994 0.819-4.301-0.102-6.758-1.638-3.174-1.946 0.819-0.102 2.048-0.307 2.56-0.41 0.614-0.102 1.741-0.307 2.56-0.41 1.946-0.102 2.048-2.15 0-2.15-0.717 0-1.946-0.819-2.56-1.741-1.024-1.638-1.024-1.638-0.512 0.205 0.41 1.741 0 2.048-2.15 2.048-1.434-0.102-2.97-0.717-3.482-1.536-0.41-0.717-1.331-0.922-1.946-0.614-1.434 0.922-1.434-0.717 0-2.15 0.614-0.614 1.843-0.922 2.765-0.614 1.126 0.512 1.331 0.307 0.614-0.819-0.41-0.819-0.717-2.253-0.614-3.174 0.307-1.434-0.307-1.843-2.56-1.741l-2.867 0.102 2.56 0.819c2.253 0.614 2.355 0.819 0.717 1.536-1.331 0.512-2.458 0.102-3.891-1.434-2.355-2.56-5.53-2.765-10.24-0.614-3.891 1.638-3.174 1.843 2.253 0.614 3.072-0.717 3.891-0.512 4.813 1.024 0.819 1.331 0.819 2.048 0.102 2.56-0.717 0.41-0.205 1.536 1.229 3.072l2.253 2.458h-2.355c-1.331 0-3.277-0.717-4.301-1.741-1.024-0.922-1.843-1.126-1.843-0.512s-0.922 0.922-2.048 0.717c-1.126-0.205-2.662 0.307-3.584 1.126-1.946 2.048-9.523 2.048-13.312 0-1.638-0.922-3.686-1.638-4.403-1.638-1.024 0-1.024-0.307 0-1.434 0.922-1.024 2.048-1.126 4.403-0.41 3.072 1.024 7.27 1.946 4.813 1.126-1.024-0.41-0.922-0.819 0.41-1.741 1.331-1.024 1.434-1.536 0.41-2.15-0.922-0.614-1.126-0.41-0.512 0.512 0.614 1.024 0.41 1.229-0.922 0.717-1.024-0.41-2.048-0.717-2.253-0.717s-0.41-0.614-0.41-1.434c0-1.229-0.717-1.229-3.584-0.512-1.946 0.614-4.096 0.717-4.608 0.41-0.614-0.307-1.024-0.102-1.024 0.512 0 0.819-0.614 0.819-2.048 0-1.126-0.614-2.048-0.717-2.048-0.205 0 1.024-8.909 0.512-14.029-0.819-1.741-0.41-3.482-0.512-3.891-0.205-0.717 0.819-2.867 1.229-9.216 1.843-2.765 0.307-6.554 0.922-8.294 1.331-3.174 0.922-13.722-0.614-18.842-2.765-2.765-1.126-3.482-1.229-5.53-1.229-0.922 0-1.229-0.819-0.819-2.662 0.41-2.253 0.205-2.56-1.434-2.15-2.97 0.922-9.114-0.717-9.114-2.355 0-1.126 0.922-1.434 3.584-1.229 5.427 0.512 2.56-1.331-4.403-2.765-3.174-0.717-6.554-1.946-7.373-2.765-1.741-1.741-2.15-5.018-0.512-3.994 0.614 0.307 1.024 0.205 1.024-0.41 0-0.512-0.614-1.229-1.229-1.434-0.717-0.307 0.307-0.614 2.253-0.614 5.222-0.102 2.765-1.741-7.782-5.222-8.704-2.765-8.909-2.867-4.301-2.765 2.765 0.102 4.915 0.41 4.915 0.819 0 0.307 2.458 1.331 5.427 2.458 2.867 1.024 5.837 2.253 6.554 2.765 0.717 0.614 1.843 0.819 2.56 0.512 0.819-0.307 0.614-0.614-0.512-0.614-1.024-0.102-1.536-0.614-1.229-1.126 0.41-0.717 1.331-0.717 2.662 0 1.126 0.614 1.741 1.536 1.434 2.048-0.41 0.614 0.102 0.717 1.126 0.307 1.126-0.41 1.536-0.307 1.024 0.512-0.307 0.614 0.205 1.638 1.331 2.15 2.458 1.331 3.482 1.434 2.662 0.205-0.307-0.614 0.717-0.614 2.662-0.102 1.843 0.512 3.584 0.717 4.096 0.41 0.41-0.205 1.229 0.41 1.843 1.331 0.819 1.434 1.229 1.638 2.253 0.614 0.717-0.717 2.662-1.331 4.198-1.331 4.403 0 5.734-1.843 5.12-7.066-0.41-3.789-0.205-4.403 1.024-3.891 1.229 0.41 1.536-0.307 1.331-3.584-0.102-2.253-0.819-4.506-1.638-5.018-1.126-0.614-1.126-1.126-0.102-2.15 2.253-2.253 1.331-6.349-2.662-11.571-5.939-7.987-6.554-9.626-5.837-16.384 0.512-5.325 1.229-6.861 3.686-7.885 0.41-0.205 0.922-2.253 1.331-4.71 0.307-2.355 1.024-5.222 1.638-6.246 0.717-1.434 0.614-2.15-0.307-2.458-0.819-0.307-0.41-1.126 1.126-2.253 1.434-1.024 2.15-2.355 1.843-3.379s0.41-2.458 1.946-3.584c1.434-1.024 2.56-1.638 2.56-1.331s-1.331 3.891-2.867 7.987c-1.536 4.096-2.765 8.090-2.765 8.909 0 2.355 2.56 2.56 2.662 0.205 0.205-3.686 0.307-3.994 2.662-6.554 1.229-1.434 1.946-2.867 1.638-3.174-0.41-0.307 0.102-1.434 0.922-2.355 2.867-3.277 5.018-8.602 4.403-10.65-0.717-2.048 2.765-5.939 5.427-6.042 0.614 0 1.229-0.41 1.229-0.922 0-1.434 8.602-4.198 11.059-3.482 1.843 0.41 3.072-0.102 4.915-2.048 1.434-1.536 3.789-3.072 5.325-3.379 1.536-0.41 3.789-1.638 5.018-2.662 1.229-1.126 2.662-1.741 3.277-1.331 0.614 0.307 1.126 0.102 1.126-0.41 0-0.614-0.41-1.126-1.024-1.126-0.512 0-1.024-0.717-1.024-1.536s0.717-1.536 1.536-1.536c0.717 0 1.843-0.614 2.253-1.229 0.41-0.717 2.253-2.15 3.994-3.072 3.174-1.741 3.277-1.741 3.789 0.307 0.307 1.229 1.024 1.843 1.638 1.434 0.614-0.307 0.922-1.024 0.614-1.536-0.307-0.41 0.205-1.126 1.126-1.434 2.56-1.024 1.434-8.806-1.946-12.39-3.072-3.379-4.506-8.397-2.97-9.933 0.819-0.819 0.614-1.536-0.41-2.56-1.536-1.638-1.024-5.325 0.922-6.656 0.512-0.307 3.174-4.71 5.837-9.728 3.277-6.246 5.837-9.728 8.294-11.264 7.885-5.018 8.499-5.837 8.806-11.674 0.205-3.072 0.512-9.216 0.922-13.722 0.307-4.506 0.717-11.878 0.922-16.384 0.512-9.523 2.355-19.968 3.686-19.968 0.41 0 0.614 0.819 0.307 1.843-0.512 1.434-0.41 1.434 0.614-0.205 0.819-1.126 0.922-2.15 0.307-2.56-1.434-0.819-1.434-7.27-0.102-7.27 0.512 0 0.819-0.614 0.512-1.434-0.922-2.355 5.632-11.162 10.035-13.517 7.475-3.891 10.752-4.608 13.005-3.072 1.946 1.331 1.843 1.434-1.536 2.56-1.843 0.614-4.403 2.56-5.734 4.198-2.048 2.867-2.15 3.277-0.614 6.042 1.946 3.789 1.946 5.222 0.102 5.222-0.717 0-1.946 0.717-2.662 1.536-1.024 1.229-0.922 1.638 0.41 2.15 0.922 0.307 1.638 1.741 1.638 3.072s0.512 2.458 1.229 2.458c0.614 0 0.819 0.307 0.41 0.819-0.41 0.41-1.331 0.717-1.946 0.717-0.512 0-1.229 0.614-1.434 1.331-0.307 0.717 0.512 1.229 2.253 1.229 1.946 0 2.662 0.41 2.253 1.434-0.717 1.741 0.922 3.174 4.506 4.096 2.867 0.614 4.813 3.584 3.174 4.608-0.512 0.307-1.331 1.741-1.741 2.97-0.614 2.253-0.512 2.355 1.536 1.229 2.458-1.331 4.608-0.102 6.246 3.584 0.512 1.126 2.15 4.096 3.584 6.656 1.638 2.97 2.355 5.53 2.048 7.27-0.717 3.686 0.922 5.325 7.68 8.090 6.656 2.662 8.192 5.427 8.704 16.282 0.205 3.686 0.819 6.861 1.331 7.066 0.614 0.205 1.126 1.126 1.126 1.946s1.126 2.867 2.56 4.608c2.56 2.97 3.174 6.246 1.946 9.421-0.307 0.922-1.024 1.638-1.638 1.638-0.512 0-2.458 1.126-4.198 2.458-1.843 1.331-5.427 2.765-8.090 3.072-2.765 0.41-4.915 1.126-4.915 1.536 0 0.512-1.536 1.434-3.277 2.15-6.963 2.56-7.782 3.277-9.011 7.782-1.331 4.71-4.608 7.68-9.114 8.090-3.891 0.41-6.246 1.536-6.246 3.072 0 0.819-0.922 1.638-2.048 2.048-1.126 0.307-2.458 2.048-2.97 3.891s-1.024 2.662-1.024 2.048c-0.102-0.922-0.819-1.024-2.662-0.307-1.741 0.614-2.56 0.614-2.56-0.102 0-1.434-7.27 0-9.114 1.843-1.024 1.024-1.741 1.126-2.458 0.41-1.638-1.638-2.765-1.331-2.15 0.41 0.41 0.819 0.205 1.536-0.41 1.536s-1.229-0.512-1.434-1.024c-0.205-0.614-1.331-1.229-2.662-1.536-3.072-0.512-4.301-1.434-4.301-3.072 0-1.946-3.891-2.97-5.53-1.638-1.024 0.922-2.15 0.819-4.096 0-2.253-1.126-2.867-0.922-4.506 1.126s-1.741 3.072-1.024 6.861c1.331 6.144 0.717 7.27-3.994 6.963-4.506-0.307-5.939 0.205-4.608 1.843 0.512 0.717 1.434 2.662 2.048 4.301 0.512 1.741 1.331 3.891 1.741 4.915 0.614 1.434 0.205 1.741-2.253 1.741-2.253 0-3.379-0.717-4.198-2.458-1.434-3.174-3.891-4.403-8.294-4.301-3.584 0.102-3.584 0-4.915 6.861-0.205 1.434 0.307 5.12 1.126 8.192 1.536 5.018 2.15 5.939 6.042 7.885 3.379 1.638 5.222 1.946 8.602 1.331 2.97-0.614 4.198-0.512 4.096 0.307-0.307 1.536 5.222 2.048 6.963 0.614 1.024-0.819 1.536-0.819 2.048 0.102 0.614 0.819 1.024 0.717 1.741-0.512 0.512-0.922 0.614-2.15 0.307-2.765-0.819-1.229 1.434-7.066 2.662-7.066 0.922 0 3.072 3.584 2.56 4.198-0.205 0.205-0.717 2.15-1.024 4.403-0.614 3.482-0.307 4.301 2.765 7.168 1.843 1.741 4.813 3.891 6.451 4.71 3.686 1.946 4.506 2.97 4.506 5.939 0 1.331 0.41 2.15 0.922 1.843 0.512-0.41 2.15 0.922 3.686 2.662 2.765 3.379 5.734 5.12 8.704 5.325 0.819 0.102 1.536 0.922 1.536 2.048 0 1.946 0.512 2.355 6.554 5.12 4.506 2.048 5.837 2.048 3.686 0-2.662-2.662-1.229-2.662 5.427 0.307 3.686 1.536 6.349 3.277 6.349 4.198 0 1.331-0.307 1.331-1.843-0.102-2.048-1.946-3.789-2.355-2.765-0.717 0.307 0.614-0.102 1.024-1.024 1.024-1.024 0-1.331-0.512-0.922-1.229 0.41-0.614 0.307-0.819-0.307-0.512-0.614 0.41-1.331 1.638-1.638 2.765s-0.205 1.843 0.307 1.536c0.41-0.307 1.331 0.205 2.048 0.922 0.922 1.229 0.614 1.536-2.253 1.843-3.277 0.307-3.277 0.307-1.126 1.638 1.946 1.126 2.765 1.024 4.915-0.41 1.434-0.922 2.867-1.434 3.277-1.126 0.307 0.41-0.512 1.126-1.843 1.638-2.15 0.922-1.946 1.024 1.843 1.024 4.71 0.102 13.21 3.379 13.824 5.325 0.512 1.638-2.15 5.018-3.994 5.018-0.717 0-1.331 0.614-1.434 1.331-0.102 0.614-0.205 2.15-0.307 3.277s-0.307 3.072-0.41 4.403l-0.205 2.355-3.072-2.15c-1.741-1.229-3.789-1.946-4.608-1.638-1.843 0.717-2.048 3.686-0.205 3.789 0.614 0 0.205 0.41-1.024 0.922-1.331 0.512-2.355 1.331-2.355 1.843 0 0.614-1.843 1.024-4.096 1.024-3.584 0.102-4.403-0.307-5.427-2.662-0.614-1.536-1.741-3.174-2.458-3.584-0.819-0.512-1.126-1.843-0.717-3.277 0.512-2.048 0-2.867-2.765-4.506-1.843-1.126-3.686-1.843-4.096-1.536-0.41 0.205-1.024-0.922-1.434-2.662-0.717-3.277-3.994-5.939-5.12-4.096-0.41 0.614-0.41 2.355-0.102 3.891 0.512 2.458 0.102 2.97-4.301 5.12-2.662 1.229-5.325 2.253-5.939 2.253-2.253 0-2.253 4.915 0 6.963 2.56 2.355 8.806 5.632 8.806 4.71 0-0.41 0.819 0 1.843 0.819 1.331 1.229 3.379 1.536 8.704 1.229 3.789-0.205 6.861-0.102 6.861 0.307s-1.229 1.843-2.765 3.072c-1.434 1.331-2.15 2.355-1.536 2.355s1.331-0.41 1.638-0.922c0.922-1.434 6.246 1.638 7.782 4.506 0.922 1.741 2.253 2.56 3.994 2.56 2.15 0 2.355-0.205 1.126-1.024-0.922-0.614-1.024-1.024-0.307-1.024 0.614 0 1.536 0.512 1.843 1.024 0.307 0.614 1.126 1.024 1.638 1.024 0.614 0 0.819-0.41 0.512-0.922s0.307-1.126 1.434-1.434c2.56-0.614 2.662-2.56 0.307-3.482-1.024-0.307-2.56-1.229-3.482-2.048s-2.048-1.331-2.56-1.229c-2.253 0.41-4.506-0.205-4.506-1.126 0-0.717 1.331-0.819 3.482-0.512 2.867 0.614 3.584 0.41 4.096-1.331 0.41-1.331 2.15-2.355 4.813-3.072 4.096-1.024 4.096-1.024 2.355 0.922-1.843 2.048-0.614 2.765 1.331 0.819 2.048-2.048 3.584 0.102 2.867 3.789-0.614 3.789 0.102 4.506 1.946 1.843 1.024-1.331 1.638-1.434 3.994-0.307 3.584 1.638 3.482 2.458-0.307 3.994-3.379 1.434-3.686 2.048-1.843 3.891 0.922 0.922 0 1.638-3.686 3.277-2.662 1.126-4.506 2.458-4.198 3.072 0.41 0.614-0.512 1.024-2.048 1.024-2.048 0-2.662-0.41-2.15-1.536 0.307-0.819 0.102-1.536-0.41-1.536-0.614 0-1.024 0.717-1.024 1.536 0 1.843-3.277 2.048-6.349 0.41-1.536-0.819-1.946-0.819-1.434 0 0.922 1.434-0.614 1.434-4.198-0.102-4.71-2.15-5.632-4.403-2.253-5.427 2.15-0.717 2.15-0.819-0.717-3.072-1.638-1.331-3.379-2.15-3.891-1.843-0.41 0.307-0.205 0.922 0.512 1.434 0.717 0.41 1.024 1.126 0.614 1.536-0.307 0.41-1.331 0.205-2.048-0.41-1.126-1.024-1.331-0.512-0.819 2.56 0.512 3.174 1.126 3.891 3.891 4.608 1.843 0.512 3.584 1.331 3.994 2.048 0.512 0.717 0 0.922-1.434 0.614-1.229-0.41-2.253-0.205-2.253 0.307s0.717 0.922 1.638 0.922c0.819 0 1.229 0.41 0.922 1.024-0.307 0.512 0.717 1.536 2.458 2.253 2.355 1.024 2.765 1.536 1.741 2.56-0.819 0.717-1.843 0.819-2.765 0.205zM313.651 606.413c0.307-0.717-0.307-1.331-1.229-1.434-1.024-0.102-1.843 0.512-1.843 1.331 0 1.843 2.355 1.946 3.072 0.102zM318.669 605.491c-0.922-0.922-1.536-0.922-2.458 0s-0.717 1.229 1.229 1.229c1.946 0 2.15-0.307 1.229-1.229zM347.341 600.166c1.024 0.614 0.922 0.307-0.102-0.922-0.717-0.922-2.15-1.741-3.072-1.741-1.434 0-1.434 0.205-0.102 1.024 1.024 0.614 1.126 1.024 0.307 1.024-0.717 0-1.331 0.512-1.331 1.126 0 0.819 0.41 0.819 1.536-0.102 0.819-0.614 2.048-0.819 2.765-0.41zM356.352 565.35c0-0.205-0.717-0.717-1.638-1.024-0.819-0.307-1.229-0.205-0.922 0.41 0.614 1.024 2.56 1.434 2.56 0.614zM330.445 477.491c-0.307-0.819-0.614-0.512-0.614 0.614-0.102 1.126 0.205 1.741 0.512 1.331 0.307-0.307 0.41-1.229 0.102-1.946zM607.232 624.128c0-0.512 1.434-1.024 3.072-1.024 1.741 0 3.072 0.512 3.072 1.024 0 0.614-1.331 1.024-3.072 1.024-1.638 0-3.072-0.41-3.072-1.024zM615.629 622.899c-0.717-0.717-1.229-0.922-1.229-0.512s-1.229 0.102-2.765-0.614c-1.638-0.819-3.482-1.229-4.198-1.024-2.458 0.922-11.469-1.843-11.469-3.482 0-1.126-0.717-1.434-2.458-0.922-2.867 0.717-4.71-1.126-2.253-2.048 0.922-0.307 1.638-1.126 1.638-1.741 0-0.717-0.41-0.717-1.229 0.102-1.536 1.536-5.939 1.638-5.939 0.102 0-0.614-0.717-0.307-1.638 0.512-2.253 2.355-2.56 2.048-1.331-1.126 1.434-3.789 2.97-5.53 4.198-4.813 1.434 0.922-0.205-3.994-1.638-4.915-2.048-1.331-2.867-0.819-1.229 0.717 1.331 1.434 1.331 1.946-0.922 5.325-1.434 2.048-2.56 3.994-2.56 4.403s-1.126 1.229-2.56 1.843c-2.253 1.024-2.662 0.922-3.994-1.638-1.331-2.458-1.229-2.867 0.717-4.506 1.126-1.024 2.56-1.843 3.072-1.843 0.614 0 0.819-0.205 0.512-0.512s-2.048 0.102-3.994 0.922c-1.946 0.717-5.53 1.638-8.090 1.946-3.482 0.512-3.994 0.41-2.253-0.307 1.536-0.614 2.048-1.434 1.638-2.253-0.614-0.922-0.922-0.922-1.126-0.102-0.307 0.717-1.024 1.024-1.638 0.717-0.717-0.205-3.482-0.614-6.349-0.717-2.765-0.205-6.144-0.922-7.373-1.536-2.867-1.536-4.506-1.536-4.198 0 0.205 0.614-0.512 1.434-1.536 1.638-1.638 0.307-1.741 0.102-0.819-1.638 1.536-2.867 1.434-3.584-0.41-2.867-0.922 0.307-2.458-0.307-3.584-1.434-1.638-1.638-2.458-1.843-4.71-1.024-2.458 0.922-2.56 0.922-1.434-0.512 0.819-0.922 0.819-1.536 0.205-1.536s-1.434 0.614-1.946 1.331c-1.536 2.458-1.126 3.482 1.331 2.97 1.331-0.205 3.686-0.102 5.12 0.205 2.355 0.614 2.56 0.922 1.331 2.048-1.741 1.638-7.373 3.686-12.186 4.403-1.946 0.307-3.891 1.024-4.198 1.536-0.819 1.229-11.981 1.229-13.517 0-0.717-0.614-1.536-1.024-2.048-1.024-2.765-0.102-6.963-1.638-8.090-3.072-1.126-1.331-1.126-1.434 0.102-0.717 0.819 0.41 0.102-0.819-1.536-2.97-1.638-2.048-4.915-4.71-7.27-5.837-4.813-2.355-5.939-4.506-4.506-8.499 1.126-2.662 4.506-3.686 5.734-1.638 1.126 1.843 3.277 1.126 4.506-1.638 0.614-1.434 0.922-2.97 0.614-3.482-0.307-0.41 0.307-1.126 1.229-1.536 1.024-0.307 1.946-0.102 2.15 0.41 0.205 0.614 1.229 1.126 2.355 1.126 1.434 0 1.946 0.717 1.946 2.56 0 1.434 0.717 2.867 1.536 3.174 0.819 0.41 1.536 1.229 1.536 2.048s-0.717 1.434-1.536 1.434c-0.819 0-1.536 0.614-1.536 1.331 0 1.741 7.782 8.909 9.728 8.909 2.355 0 1.843-1.638-1.126-3.482-1.843-1.331-2.458-2.458-2.253-4.506 0.307-2.662 0.512-2.765 6.246-2.56 3.174 0.102 5.837-0.205 5.837-0.819 0-0.512-1.638-1.024-3.584-1.024-5.632-0.205-5.939-0.307-6.451-1.741-0.205-0.819 0.205-1.229 1.331-1.024 1.024 0.205 2.048-0.307 2.253-1.024 0.307-0.819-0.41-1.126-1.946-1.024-1.741 0.205-2.458-0.307-2.662-1.946-0.41-2.662-1.638-3.072-10.445-3.891-4.403-0.307-6.144-0.205-5.12 0.41 1.229 0.922 1.229 1.126-0.307 1.741-0.922 0.307-1.536 0.922-1.331 1.331 0.307 0.41 0.102 1.331-0.41 2.15-1.536 2.458-4.403-0.819-3.686-4.301 0.512-2.458 0.205-2.867-1.843-2.867-1.229 0-3.379-1.126-4.71-2.56-2.662-2.765-6.451-3.584-5.53-1.024 0.307 0.819-0.819 2.867-2.56 4.813-3.379 3.584-3.994 5.427-1.843 6.246 0.717 0.307 0.41 0.614-0.614 0.614-1.434 0.102-1.741 0.614-1.229 2.458 0.41 1.331 0.307 1.741-0.205 1.024-0.819-1.126-3.277-1.946-6.656-2.253-0.512-0.102-0.819-0.614-0.819-1.229 0-0.819 0.614-0.717 1.741 0.205 1.536 1.331 1.536 1.229 0.614-0.614-0.614-1.126-0.819-2.662-0.614-3.277 0.307-0.819-0.307-1.331-1.434-1.331-2.867 0-5.222-2.15-6.042-5.325-0.512-2.355-0.307-2.867 1.331-2.867 2.765 0 6.656 3.072 6.042 4.71-0.717 1.843 3.482 3.072 4.608 1.331 0.614-0.922 0.307-1.536-0.614-1.741-1.434-0.307-1.946-1.536-1.638-3.686 0.102-0.41-0.41-1.536-1.126-2.458s-0.819-1.331-0.205-0.922c0.614 0.307 3.584 0.922 6.554 1.229 5.018 0.614 5.325 0.512 4.096-1.024-0.819-0.922-2.253-1.434-3.174-1.229-1.024 0.307-2.048 0-2.253-0.717-0.205-0.614-1.229-1.126-2.253-1.126-2.765 0-2.97-1.946-0.307-3.072 1.741-0.717 2.458-2.048 2.662-5.018l0.307-3.994-5.939 0.614c-3.277 0.307-6.451 0.307-7.168-0.102-0.614-0.41-1.126-2.355-1.229-4.301 0-1.946-0.102-4.301-0.205-5.12-0.41-3.584 0.205-5.12 2.15-5.12 1.126 0 2.048-0.512 2.048-1.126 0-0.717 1.229-0.819 3.379-0.41 5.53 1.024 7.987 2.765 8.602 5.939 0.41 1.843 1.741 3.686 3.482 4.71 1.638 0.922 2.97 2.458 2.97 3.584 0 1.536 0.512 1.741 2.97 1.331 1.741-0.41 3.686 0 5.018 0.922 2.253 1.536 5.325 0.922 5.325-1.126 0-1.229 3.277-3.891 7.68-6.144 1.126-0.614 2.048-1.946 2.048-3.072 0-1.536-0.717-2.048-2.765-2.048-3.277 0.102-3.686-1.024-0.922-2.458 1.638-0.922 2.253-0.614 3.789 1.741 1.024 1.536 1.741 3.379 1.536 4.198-0.205 0.922 0.307 1.229 1.434 0.717 2.867-1.126 1.126 1.741-2.15 3.379-3.379 1.741-7.885 6.758-7.373 8.294 0.307 1.024 11.981-6.349 13.312-8.499 0.41-0.717 0.819-2.253 0.819-3.482 0-1.536 0.922-2.458 3.174-3.277 4.71-1.638 5.325-1.434 3.584 1.126-2.253 3.174-2.15 3.482 2.253 3.686 3.994 0.307 4.198 0.102 4.608-7.066 0.102-1.843 0.922-2.048 10.138-2.15 4.608 0 6.656-0.41 6.451-1.229-0.205-0.614-0.614-2.867-0.819-5.018-0.307-2.15-0.717-4.198-1.024-4.506-1.638-1.536-12.493-1.024-18.227 0.819-6.861 2.253-9.114 2.048-9.114-1.024 0-1.126-0.41-2.253-0.922-2.56-1.024-0.614-7.066 2.15-9.114 4.198-0.717 0.717-2.355 1.331-3.584 1.331-2.867 0.102-6.349 2.662-4.915 3.584 1.536 0.922 1.434 5.632-0.102 5.734-1.638 0.205-0.922 0.205-9.626-0.512-4.096-0.307-8.602-1.229-10.138-2.048s-4.608-1.331-6.758-1.229c-2.867 0.205-4.403-0.205-5.939-1.843-1.126-1.229-2.765-2.765-3.584-3.482-0.922-0.717-1.946-2.56-2.253-4.096-0.41-1.536-3.174-5.12-6.144-7.987-3.072-2.867-5.53-5.837-5.53-6.554 0-0.614-0.922-2.56-2.048-4.198-1.536-2.048-1.843-3.482-1.229-4.71 0.512-1.024 0.717-3.891 0.41-6.451-1.126-10.752-0.717-13.005 2.97-17.408 10.24-12.083 11.878-13.517 15.258-12.8 1.741 0.41 5.53 0.819 8.294 0.922 2.765 0.205 5.632 0.819 6.246 1.434 2.048 2.048 8.806 1.536 10.035-0.819 0.717-1.331 2.15-2.048 3.891-2.048 4.403 0 5.12-1.434 4.096-7.373-0.922-4.813-0.717-5.53 2.048-9.421 5.325-7.68 7.68-18.125 4.915-22.323-3.072-4.71-3.072-9.523-0.205-15.462 1.536-2.97 2.97-6.861 3.277-8.499 1.126-6.861 1.741-8.909 4.198-13.21 1.331-2.458 2.355-5.427 2.15-6.554-0.41-2.765 3.072-6.451 5.222-5.325 0.922 0.512 3.789 1.126 6.349 1.434s5.734 1.126 6.963 1.843c3.584 2.253 10.342 11.776 10.342 14.746 0 1.843 0.717 2.867 2.56 3.584 3.379 1.229 4.096 3.379 2.867 7.68-1.024 3.174-0.819 3.686 2.15 6.349 1.741 1.638 4.506 3.789 6.144 4.813 2.867 1.843 2.867 1.843 2.253 9.626-0.41 4.403-0.717 9.011-0.819 10.445s-0.717 2.867-1.229 3.277c-2.048 1.434 3.584 9.728 13.824 20.378 5.325 5.53 10.138 14.746 10.138 19.251 0 1.843-0.307 1.843-5.12 0.41-6.349-1.843-10.752-1.434-10.65 0.922 0.102 0.922-1.843 3.584-4.301 5.939s-4.506 4.813-4.506 5.53c0 0.717-0.922 2.56-2.048 3.994s-2.048 3.482-2.048 4.608c0 1.126-0.614 2.765-1.229 3.482-1.126 1.126-7.578 13.21-8.909 16.691-0.205 0.614 0.614-0.102 1.741-1.536 1.536-1.741 2.15-2.048 2.253-1.024 0 1.741 9.216-11.878 9.216-13.619 0-0.717 1.843-3.891 4.198-7.168 2.253-3.379 3.686-5.734 3.072-5.427-0.512 0.41-0.307-0.717 0.614-2.458 0.819-1.741 1.638-3.789 1.741-4.608s0.512-1.741 0.819-2.048c1.024-1.024 15.258 5.325 16.486 7.27 0.41 0.819 1.741 1.434 2.867 1.434s2.253 0.717 2.56 1.536c0.41 0.819 1.024 1.536 1.638 1.536 1.331 0 2.97 1.946 5.222 5.939 2.15 3.789 1.331 5.837-3.072 7.475-1.434 0.512-2.355 1.741-2.355 3.174 0 2.048-0.102 2.048-1.229 0.512-0.717-0.922-2.662-2.15-4.198-2.662-2.458-1.024-2.97-0.819-3.686 1.229-0.512 1.229-1.126 2.048-1.434 1.741s-1.946 1.536-3.686 4.096c-4.096 6.042-1.741 6.861 4.198 1.536 3.482-3.174 4.71-3.686 7.373-3.277 2.56 0.41 3.584 0.102 4.506-1.434 1.024-1.638 2.458-1.946 9.318-1.946 6.656 0 8.294-0.307 9.83-2.048 1.024-1.126 2.662-2.253 3.686-2.56s1.638-1.229 1.331-1.946c-0.819-2.15 2.458-4.301 4.71-2.97 1.638 1.024 1.843 0.717 2.458-2.97 0.614-3.584 9.011-24.883 10.342-26.317 1.024-0.922 4.608 4.506 4.813 7.27 0.102 1.536 0.205 4.198 0.307 5.837 0.205 2.253 1.946 4.813 6.451 9.421 3.482 3.482 6.144 6.656 5.837 7.066s1.434 1.024 3.891 1.331c2.355 0.307 4.506 0.205 4.813-0.205 0.307-0.512 1.638-2.355 3.072-4.198s2.765-4.506 3.072-5.939c0.614-3.174 2.355-3.891 4.403-1.843 1.331 1.331 1.741 0.819 3.584-4.813 1.229-3.482 1.946-7.987 1.843-9.933-0.205-1.946 0.205-4.096 0.819-4.813 3.174-3.584 3.686-4.506 3.686-6.554 0-2.458 7.373-9.933 7.987-8.090 0.307 0.717-0.102 1.741-0.717 2.355s-1.126 2.355-1.126 3.891c0 1.843-1.024 3.686-3.072 5.325-1.638 1.434-3.072 3.379-3.072 4.301 0 0.819-0.717 1.843-1.536 2.15-1.126 0.512-1.331 1.638-0.922 4.915 0.41 2.253 0.819 4.403 1.024 4.608s2.048-1.331 4.198-3.379c2.15-2.048 4.198-3.686 4.71-3.686 0.41 0 0.717-0.922 0.717-2.15 0-1.843 0.41-1.741 4.096 1.331 5.222 4.403 5.632 9.318 1.229 13.824-1.638 1.536-3.686 4.096-4.608 5.53-1.638 2.56-1.638 2.662 0.614 4.915 2.458 2.253 5.837 2.048 5.837-0.307 0-0.614 0.512-0.41 1.024 0.512s3.174 2.355 5.837 3.072c2.56 0.819 5.837 2.56 7.27 3.994 3.789 3.891 6.861 14.336 4.198 14.336-0.512 0-0.819 0.41-0.512 0.922 0.614 0.922-3.891 7.066-6.246 8.602-1.946 1.229-1.638 3.584 0.717 4.301 2.56 0.819 2.662 2.56 0.307 2.662-7.987 0.41-10.035 1.946-6.451 5.018 2.765 2.458 4.506 2.662 3.789 0.512-0.717-1.741 0.922-3.072 1.843-1.536 1.229 1.946 4.608 1.024 5.632-1.536 0.512-1.434 1.638-2.56 2.458-2.56 0.922 0 1.946-1.434 2.458-3.277 0.922-3.482 2.765-4.506 5.222-2.97 1.946 1.229 0.614 4.608-3.277 8.294-2.56 2.458-2.97 3.277-1.843 3.994 0.819 0.512 1.126 1.638 0.819 2.458-0.717 1.946 1.536 3.994 3.994 3.584 3.994-0.717 6.246 11.674 2.97 15.974-0.819 1.126-1.536 2.458-1.536 2.97 0 1.638 3.891-2.355 6.963-7.168 1.536-2.355 3.482-4.403 4.301-4.403 1.126 0.102 0.922 0.614-0.717 1.946-2.867 2.458-3.379 6.246-0.512 4.096 0.922-0.717-1.024 1.434-4.403 4.813-3.379 3.277-6.246 5.427-6.451 4.813-0.307-0.922-0.922-0.922-2.765 0.307-1.331 0.819-2.97 1.434-3.789 1.331-2.662-0.307-3.994 0.102-3.379 1.126 0.41 0.717-0.205 0.922-1.946 0.41l-2.662-0.614 1.638 3.891c0.922 2.253 1.946 4.403 2.458 4.813 1.126 1.229 12.493 1.536 14.029 0.41 0.819-0.512 2.355-0.512 4.096 0.102 1.638 0.614 2.15 1.126 1.126 1.126-2.458 0.102-1.946 4.198 0.512 4.198 1.024 0 2.765-0.512 3.891-1.024 1.331-0.717 1.946-0.717 1.946 0 0 0.512 0.922 1.024 1.946 1.024 1.946 0 1.946-0.205 0.307-5.222l-1.741-5.325 6.554-5.837c4.301-3.891 6.246-6.349 5.734-7.27-0.512-0.819-0.41-1.024 0.41-0.512s1.126 2.458 0.819 5.325c-0.205 2.56 0.102 4.608 0.717 4.915 0.717 0.307 0.614 0.512-0.102 0.512-0.717 0.102-1.331 0.922-1.331 2.048s-1.229 2.355-3.072 3.174c-1.638 0.717-3.072 1.843-3.072 2.56 0 1.741 4.813 3.686 7.578 2.97 1.741-0.41 2.56 0.102 3.482 2.048 0.819 1.843 2.048 2.662 3.994 2.765 2.765 0.102 2.765 0.102-0.922 1.741-2.253 1.024-3.686 2.355-3.584 3.482 0.102 1.229 0.512 1.434 1.843 0.819 0.922-0.512 1.946-0.717 2.253-0.41s1.434 0.102 2.458-0.41c1.024-0.512 3.072-1.229 4.608-1.638 2.56-0.614 2.867-0.41 2.458 1.638-0.205 1.946-1.331 2.56-6.349 3.482-3.277 0.717-9.728 2.15-14.234 3.277-11.162 2.867-18.227 3.482-17.51 1.536 0.41-0.922 0.205-1.126-0.717-0.614-0.614 0.41-4.71 1.126-8.909 1.536-15.155 1.434-24.064 2.662-26.829 3.789-1.536 0.614-4.608 1.126-6.656 1.331-2.15 0.102-5.018 0.819-6.451 1.536-3.072 1.536-5.53 1.741-4.608 0.307 0.307-0.512 1.843-1.126 3.379-1.126 1.741-0.102 2.15-0.307 0.922-0.614-0.922-0.205-1.434-0.922-1.126-1.536 0.41-0.717-0.922-0.922-3.994-0.614-2.867 0.307-4.915 0.102-5.12-0.614-0.205-0.614-2.048 0-4.403 1.331-3.482 2.15-5.53 2.458-15.77 2.765-6.963 0.205-11.878 0.819-12.083 1.434-0.819 2.458-3.686 4.096-7.168 4.096-4.915 0-8.499 1.024-7.782 2.15 0.819 1.331 0 1.126-1.434-0.307zM629.146 616.448c-1.024-0.819-2.355-1.536-2.867-1.536-0.614 0-0.102 0.717 1.024 1.536 1.024 0.819 2.355 1.536 2.867 1.536 0.614 0 0.102-0.717-1.024-1.536zM591.872 605.491c0-0.614-0.614-0.512-1.536 0.205-0.819 0.717-1.536 1.434-1.536 1.638s0.717 0.102 1.536-0.205c0.819-0.41 1.536-1.126 1.536-1.638zM542.72 560.64c-0.819-0.512-1.126-1.024-0.512-1.024 0.512 0 0.41-0.512-0.205-1.126-0.922-0.922-0.102-1.946 3.379-4.198 2.458-1.741 4.506-3.686 4.506-4.506 0-1.741-4.813-1.946-10.342-0.307-3.379 1.024-4.608 0.922-9.011-0.922l-5.12-2.15 0.307 4.506c0.205 2.458 1.126 5.222 2.048 6.144s1.638 2.048 1.638 2.56c0 1.638 3.994-0.205 4.608-2.15 0.717-2.15 1.024-2.15 4.096-1.024 1.946 0.819 1.946 0.922-0.512 1.638l-2.56 0.819 3.072 1.331c3.891 1.638 6.963 1.946 4.608 0.41zM568.422 560.64c1.843 0 0.922-2.867-1.126-3.379-2.765-0.717-2.56-2.355 0.512-4.403 1.434-0.922 2.253-2.048 1.946-2.56s0.41-0.922 1.536-0.922c1.126 0 2.355-0.41 2.662-1.024 0.307-0.512-0.102-1.024-0.922-1.024-2.048 0-2.048-0.102-0.102-3.686 0.819-1.638 1.536-3.584 1.536-4.198 0-1.741-3.174-1.638-6.758 0.205-2.355 1.126-2.867 2.15-2.662 4.301 0.205 1.843-0.512 3.789-2.15 5.427-1.331 1.434-2.458 2.765-2.458 3.072-0.102 0.307-0.512 1.434-0.922 2.458-0.922 2.355 4.096 7.168 6.451 6.349 0.819-0.307 1.946-0.614 2.458-0.614zM321.536 621.466c-2.56-0.717-4.301-1.331-3.789-1.434 2.15-0.717 3.379-0.512 4.71 0.41 1.229 0.922 1.331 0.819 0.717-0.307-0.512-0.819-0.307-1.638 0.512-2.253 1.638-1.024 13.312 0 14.643 1.229 1.536 1.331-2.355 2.355-3.891 0.922-1.536-1.229-5.734 0.205-5.734 1.946 0 1.126-1.741 0.922-7.168-0.512zM327.373 620.442c-0.307-0.307-1.229-0.41-1.946-0.102-0.819 0.307-0.512 0.614 0.614 0.614 1.126 0.102 1.741-0.205 1.331-0.512zM566.067 621.568c-0.307-0.307-1.843-0.819-3.482-1.126-7.578-1.229-8.397-1.638-9.626-4.608-0.717-1.638-1.843-2.97-2.458-2.97-2.253-0.102 2.048-1.843 5.939-2.458l3.994-0.614-2.458 1.946c-2.355 1.946-2.355 2.048-0.512 3.994 1.024 1.229 3.277 2.458 5.12 2.765 5.632 1.126 6.758 1.638 6.246 2.662-0.717 1.024-1.946 1.229-2.765 0.41zM662.016 619.11c0.307-0.614 3.174-1.126 6.246-1.126 7.373 0 6.451 1.434-1.126 1.843-3.891 0.205-5.632 0-5.12-0.717zM674.816 618.598c0-0.922 5.12-1.229 6.349-0.512 0.819 0.614-0.102 0.922-2.458 0.922-2.15 0-3.891-0.205-3.891-0.41zM731.955 611.123c0.614-0.205 1.843-0.205 2.56 0 0.614 0.307 0.102 0.512-1.331 0.512s-1.946-0.205-1.229-0.512zM364.032 604.672c-0.819-1.331 2.56-1.331 4.608 0 1.229 0.819 0.922 1.024-1.229 1.024-1.536 0-3.072-0.41-3.379-1.024zM450.253 601.6c-2.15-0.41-5.12-0.512-6.656-0.307-1.638 0.307-2.253 0.102-1.638-0.41 0.614-0.41 1.024-1.638 0.922-2.56-0.307-1.536 0.512-1.741 5.734-1.536 3.277 0.205 6.554 0.819 7.168 1.434 1.229 1.229 0.614 4.506-0.819 4.301-0.41-0.102-2.56-0.512-4.71-0.922zM346.624 594.432c-0.819-1.331 0.512-1.331 2.56 0 1.331 0.819 1.331 1.024-0.205 1.024-0.922 0-2.048-0.41-2.355-1.024zM351.744 593.408c-0.307-0.512-0.102-1.024 0.41-1.024 0.614 0 1.126 0.512 1.126 1.024 0 0.614-0.205 1.024-0.41 1.024-0.307 0-0.819-0.41-1.126-1.024zM210.944 589.21c0-0.512 0.512-0.717 1.024-0.41 0.614 0.307 1.024 0.819 1.024 1.126 0 0.205-0.41 0.41-1.024 0.41-0.512 0-1.024-0.512-1.024-1.126zM450.355 587.571c0.717-0.307 1.638-0.205 1.946 0.102 0.41 0.307-0.205 0.614-1.331 0.512-1.126 0-1.434-0.307-0.614-0.614zM344.166 582.246c-0.717-0.512-0.922-1.126-0.41-1.434s1.536-0.205 2.253 0.205c0.717 0.512 0.922 1.126 0.41 1.434s-1.536 0.205-2.253-0.205zM757.76 577.638c0-0.205 0.717-0.717 1.638-1.024 0.819-0.307 1.229-0.205 0.922 0.41-0.614 1.024-2.56 1.434-2.56 0.614zM193.536 576c-1.331-0.819-1.229-1.024 0.307-1.024 0.922 0 1.741 0.512 1.741 1.024 0 1.229-0.102 1.229-2.048 0zM251.597 574.976c-0.307-1.126-0.102-2.048 0.41-2.048s0.922 0.205 0.922 0.41c0 0.205 0.307 1.126 0.614 2.048s0.205 1.638-0.41 1.638c-0.512 0-1.229-0.922-1.536-2.048zM780.493 575.386c1.024-1.024 2.048-1.638 2.253-1.331 0.307 0.307-0.512 1.126-1.741 1.843-2.15 1.331-2.15 1.229-0.512-0.512zM374.374 566.886l-3.891-3.891 3.686-0.717c2.048-0.41 4.096-0.41 4.608-0.102s1.229-0.102 1.434-0.717c0.922-2.253 2.56 1.024 1.946 3.891-0.307 1.946-0.922 2.355-2.355 1.946-2.15-0.717-2.56 0.512-0.717 2.355 0.717 0.717 0.819 1.229 0.205 1.229-0.512 0-2.765-1.741-4.915-3.994zM728.986 555.725c0.717-1.331 0.614-2.355-0.205-3.174-0.922-1.024-0.819-1.536 0.512-2.56 1.024-0.717 1.536-1.638 1.126-1.946-0.307-0.41 0-1.331 0.614-2.15 1.536-1.843 1.024-6.349-0.717-5.939-0.614 0.102-1.229-0.717-1.229-1.843 0-1.536-0.717-2.048-2.97-2.048-2.15 0-3.686-0.819-5.12-2.97l-2.048-2.867 4.506-4.915 0.307 2.458c0.205 1.331-0.205 2.765-0.819 3.174-0.819 0.512-0.717 0.922 0.512 1.331 0.922 0.41 1.331 0.307 1.024-0.205-0.819-1.434 0.922-2.15 2.56-1.024 1.331 0.819 1.331 1.024 0 1.946-1.126 0.717-1.126 1.024-0.205 1.024 0.717 0 1.536-0.717 1.843-1.536 0.819-2.048 2.458-1.946 2.458 0.102 0 0.819 0.41 1.331 0.922 1.024s2.048 0 3.379 0.717c2.253 1.126 2.355 1.536 1.331 6.042-0.512 2.56-2.048 5.837-3.277 7.168-2.765 2.867-3.072 4.403-0.717 3.482 1.638-0.614 3.174 0.512 5.325 4.301 1.229 2.253 1.229 2.355-1.024 0.819-2.15-1.434-2.765-1.434-5.325-0.102-3.686 1.946-3.994 1.946-2.765-0.307zM489.984 548.352c-0.717-4.403-0.307-5.734 1.331-4.71 0.819 0.512 0.614 7.68-0.307 8.602-0.205 0.205-0.614-1.536-1.024-3.891zM514.56 540.16c0.307-0.512 1.126-1.024 1.638-1.024 0.614 0 0.717 0.512 0.41 1.024-0.307 0.614-1.126 1.024-1.638 1.024-0.614 0-0.717-0.41-0.41-1.024zM535.347 534.323c0.717-0.307 1.638-0.205 1.946 0.102 0.41 0.307-0.205 0.614-1.331 0.512-1.126 0-1.434-0.307-0.614-0.614zM321.536 516.198c0-0.205 0.717-0.614 1.536-1.024 0.819-0.307 1.536-0.102 1.536 0.41 0 0.614-0.717 1.024-1.536 1.024s-1.536-0.205-1.536-0.41zM321.229 512c-0.41-0.819-0.205-1.741 0.205-2.048 0.512-0.205 1.126 0.41 1.434 1.536 0.614 2.355-0.819 2.765-1.638 0.512zM707.584 509.542c0-1.741 0.512-3.379 1.024-3.686 0.614-0.41 1.024 0.819 1.024 2.97 0 2.048-0.41 3.686-1.024 3.686-0.512 0-1.024-1.331-1.024-2.97zM312.32 507.494c0-0.512 2.048-1.946 4.608-3.174s4.403-2.56 4.096-3.072c-0.307-0.41 1.126-1.024 3.072-1.229 2.458-0.307 3.584 0 3.584 0.922 0 0.717-0.614 1.331-1.434 1.331s-2.15 0.614-2.97 1.434c-1.434 1.536-8.397 4.71-10.035 4.71-0.512 0-0.922-0.41-0.922-0.922zM308.224 506.778c0-0.307 0.614-1.229 1.434-2.048 1.331-1.229 1.536-1.229 1.331 0.614-0.102 1.741-2.765 3.174-2.765 1.434zM330.65 500.122c-0.819-0.512-0.922-0.922-0.41-0.922 0.614 0-0.102-0.717-1.536-1.536l-2.56-1.434 2.56 0.102c5.12 0 10.24 1.024 9.728 1.843-0.922 1.536-6.349 2.867-7.782 1.946zM711.27 499.712c0.41-0.819 0.819-1.536 1.024-1.536s0.41 0.717 0.41 1.536c0 0.819-0.41 1.536-1.024 1.536-0.512 0-0.717-0.717-0.41-1.536zM686.080 498.79c0-2.048 2.765-2.867 3.482-1.024 0.922 2.355 0.819 2.458-1.434 2.458-1.126 0-2.048-0.614-2.048-1.434zM319.488 496.128c0-0.512 0.717-1.024 1.536-1.024s1.536 0.512 1.536 1.024c0 0.614-0.717 1.024-1.536 1.024s-1.536-0.41-1.536-1.024zM341.811 496.435c0.717-0.307 1.638-0.205 1.946 0.102 0.41 0.307-0.205 0.614-1.331 0.512-1.126 0-1.434-0.307-0.614-0.614zM709.939 495.923c0.307-0.819 0.102-2.15-0.307-2.867-0.512-0.819-0.41-2.355 0.307-3.482 0.614-1.229 1.229-2.765 1.331-3.584 0.205-0.717 0.819-1.946 1.536-2.56 0.922-0.819 1.024-0.614 0.614 1.229-0.717 3.174 1.741 2.867 3.277-0.41 0.614-1.536 1.536-2.458 1.843-2.048 0.819 0.819 3.277-4.71 2.662-5.837-0.307-0.512-1.741-1.331-3.174-1.946-2.662-1.126-2.662-1.229-0.41-1.536 1.229-0.307 2.253-1.024 2.253-1.843 0-2.253 2.458-2.355 3.686-0.102 0.819 1.638 0.717 2.97-0.614 5.734-1.024 1.946-1.536 4.198-1.331 4.813 0.307 0.717-0.205 1.638-1.126 1.946s-1.638 1.536-1.638 2.662c0 1.024-0.307 1.741-0.717 1.536-0.512-0.307-1.741-0.102-2.867 0.307-1.536 0.512-2.048 1.638-2.048 4.71s-0.41 3.994-1.946 4.301c-1.331 0.307-1.741 0-1.331-1.024zM656.486 484.25c0-1.126 0.307-1.434 0.614-0.614 0.307 0.717 0.205 1.638-0.102 1.946-0.307 0.41-0.614-0.205-0.512-1.331zM340.787 482.099c0.717-0.307 1.638-0.205 1.946 0.102 0.41 0.307-0.205 0.614-1.331 0.512-1.126 0-1.434-0.307-0.614-0.614zM715.264 479.539c1.024-3.379 1.843-3.891 3.277-2.355 1.024 1.126 1.024 1.741-0.307 2.97-2.253 2.355-3.686 2.048-2.97-0.614zM707.789 477.594c-1.331-1.638-1.741-2.765-1.024-2.458 1.331 0.512 4.301 4.608 3.686 5.12-0.205 0.102-1.331-1.126-2.662-2.662zM631.398 475.443c0.102-1.331 0.307-3.379 0.307-4.608 0.102-2.97 2.765-3.072 3.482-0.205 0.614 2.15-1.741 7.066-3.277 7.066-0.41 0-0.717-1.024-0.512-2.253zM701.542 466.944c-2.56-2.56-5.222-4.608-5.939-4.608s-1.331-0.717-1.331-1.638c0-1.024-0.512-1.434-1.536-1.024-2.355 0.819-3.072-1.946-1.638-6.656 1.126-3.584 1.638-4.096 5.325-4.608 2.253-0.41 4.301-1.024 4.506-1.434 0.307-0.512 1.434-0.614 2.56-0.307s1.843 0.922 1.536 1.331c-0.307 0.512 0 2.15 0.717 3.789 0.614 1.536 1.229 3.277 1.229 3.686 0.102 0.41 0.717 1.126 1.434 1.638 1.126 0.614 1.126 1.331 0.102 3.584s-1.024 3.277 0 4.915c1.126 1.843 1.024 2.355-0.614 3.994-1.741 1.843-1.946 1.741-6.349-2.662zM662.528 467.763c0-0.205 2.355-3.379 5.12-7.066 2.867-3.686 5.837-8.192 6.554-9.933 3.072-7.168 9.83-10.138 9.83-4.301 0 1.434 0.512 2.56 1.126 2.56 0.819 0 0.717 0.512-0.102 1.536-0.922 1.126-1.536 1.331-2.048 0.512s-0.922-0.614-1.434 0.512c-0.307 0.922-0.307 2.253 0.102 2.765 0.307 0.614 0.205 0.819-0.41 0.512-0.614-0.41-1.536 0.41-2.15 1.741-0.614 1.434-2.15 2.765-3.379 3.174s-3.482 2.253-5.12 4.096c-2.458 2.765-8.090 5.53-8.090 3.891zM723.046 464.794c0-1.126 0.307-1.434 0.614-0.614 0.307 0.717 0.205 1.638-0.102 1.946-0.307 0.41-0.614-0.205-0.512-1.331zM727.757 459.674c-0.41-0.41-0.717-2.15-0.614-3.891 0-1.741 0.307-2.458 0.614-1.638s0.922 1.741 1.331 2.048c0.41 0.307 0.41 1.331 0.102 2.355-0.41 1.024-1.024 1.536-1.434 1.126zM818.278 458.65c0-1.126 0.307-1.434 0.614-0.614 0.307 0.717 0.205 1.638-0.102 1.946-0.307 0.41-0.614-0.205-0.512-1.331zM666.624 458.24c0-0.512 0.512-1.024 1.126-1.024 0.512 0 0.717 0.512 0.41 1.024-0.307 0.614-0.819 1.024-1.126 1.024-0.205 0-0.41-0.41-0.41-1.024zM720.486 458.547c-0.41-0.512-2.458-0.819-4.403-0.819-3.379 0-3.686-0.307-4.915-4.198-1.331-4.403-0.922-10.65 0.614-10.65 0.512 0 0.922 1.434 0.922 3.072 0 1.741 0.512 3.072 1.126 3.072 0.512 0 0.819-0.41 0.512-0.922s0.307-2.048 1.434-3.277c1.638-1.946 1.946-2.15 2.048-0.717 0 0.922-0.41 2.867-1.024 4.403-0.819 2.048-0.717 2.765 0.512 3.174 2.867 1.126 1.638 2.765-1.536 2.15-2.253-0.512-3.072-0.307-3.072 0.819 0 1.536 1.536 1.946 5.734 1.638 1.126-0.102 2.765 0.512 3.482 1.331 1.229 1.638 0 2.355-1.434 0.922zM735.334 453.734c-0.922-1.126-0.819-1.536 0.512-2.048 2.662-1.024 4.506-0.717 4.506 0.819 0 0.819-0.717 1.741-1.638 2.048-2.15 0.819-2.048 0.819-3.379-0.819zM758.784 452.71c0-0.205 0.717-0.614 1.536-1.024 0.819-0.307 1.536-0.102 1.536 0.41 0 0.614-0.717 1.024-1.536 1.024s-1.536-0.205-1.536-0.41zM821.965 451.994c0.717-0.717 1.536-1.024 1.843-0.717s-0.205 0.922-1.229 1.229c-1.434 0.614-1.536 0.512-0.614-0.512zM744.243 451.174c1.024-0.614 1.024-1.024-0.205-2.048-1.024-0.819-1.638-0.922-2.15-0.102-0.307 0.512-1.741 1.024-3.072 1.024-3.994 0-2.048-2.458 3.584-4.506 5.325-1.946 7.27-4.71 5.12-7.27-1.024-1.331-0.819-1.536 1.331-1.536 1.434 0 2.97-0.41 3.277-1.024 1.024-1.536 5.632-1.229 6.246 0.512 0.922 2.355 3.686 1.843 6.042-1.024 2.048-2.56 7.475-3.994 7.578-2.048 0.102 0.614-0.41 1.024-1.024 1.024-1.741 0-5.427 5.222-4.608 6.554 0.41 0.614 2.253 1.126 4.096 1.126 3.379 0 5.734 1.536 5.734 3.789 0 0.819-0.717 0.614-2.048-0.717-2.56-2.56-10.752-2.867-11.674-0.512-0.717 2.048-10.752 6.554-15.77 7.168-2.15 0.307-3.174 0.102-2.458-0.41zM764.723 450.355c0.614-0.205 1.843-0.205 2.56 0 0.614 0.307 0.102 0.512-1.331 0.512s-1.946-0.205-1.229-0.512zM772.813 448.922c0.717-0.717 1.536-1.024 1.843-0.717s-0.205 0.922-1.229 1.229c-1.434 0.614-1.536 0.512-0.614-0.512zM723.968 448c0-0.512 0.512-1.024 1.024-1.024 0.614 0 1.024 0.512 1.024 1.024 0 0.614-0.41 1.024-1.024 1.024-0.512 0-1.024-0.41-1.024-1.024zM729.6 448c2.765-1.229 3.584-1.229 3.584 0 0 0.614-1.229 1.024-2.765 0.922-2.56 0-2.662-0.102-0.819-0.922zM780.288 443.392c0-1.536 1.843-4.096 2.458-3.482 0.307 0.307-0.102 1.434-0.922 2.56-0.819 1.024-1.434 1.536-1.536 0.922zM739.328 441.856c0-0.512 0.512-1.024 1.024-1.024 0.614 0 1.024 0.512 1.024 1.024 0 0.614-0.41 1.024-1.024 1.024-0.512 0-1.024-0.41-1.024-1.024zM681.984 440.934c0-1.331 4.915-2.97 10.752-3.686 2.867-0.41 6.246-0.819 7.68-1.024l2.56-0.41-2.253 1.843c-1.229 1.024-2.048 2.15-1.741 2.458s-1.536 0.512-4.096 0.41c-2.56 0-5.018 0.205-5.325 0.614-1.126 1.024-7.578 0.922-7.578-0.205zM784.384 437.862c0-0.512 0.512-1.331 1.024-1.638 0.614-0.307 1.024-0.205 1.024 0.41 0 0.512-0.41 1.331-1.024 1.638-0.512 0.307-1.024 0.205-1.024-0.41zM788.48 437.76c0-0.512 0.512-1.024 1.126-1.024 0.512 0 0.717 0.512 0.41 1.024-0.307 0.614-0.819 1.024-1.126 1.024-0.205 0-0.41-0.41-0.41-1.024zM706.355 436.019c0.614-0.205 1.843-0.205 2.56 0 0.614 0.307 0.102 0.512-1.331 0.512s-1.946-0.205-1.229-0.512zM712.090 435.814c0.512-0.819 5.734-0.307 5.734 0.512 0 0.205-1.434 0.41-3.174 0.41-1.638 0-2.867-0.41-2.56-0.922zM720.179 435.302c-1.331-0.614-2.355-1.638-2.355-2.355 0-1.024 5.12 1.126 8.090 3.482 1.126 0.819-3.789-0.102-5.734-1.126zM791.245 435.405c-0.307-0.819 0.102-1.434 0.922-1.434 1.638 0 1.946 1.331 0.512 2.15-0.512 0.307-1.126 0-1.434-0.717zM708.608 434.278c0-0.205 0.717-0.614 1.536-1.024 0.819-0.307 1.536-0.102 1.536 0.41 0 0.614-0.717 1.024-1.536 1.024s-1.536-0.205-1.536-0.41zM753.766 427.315c-1.741-7.27-3.174-11.059-4.301-11.059-0.512 0-2.765 1.229-5.018 2.662-3.379 2.253-3.891 2.97-3.072 4.608 0.614 1.024 1.536 2.15 2.048 2.458 1.946 1.229 1.024 2.355-2.253 2.765-1.843 0.307-4.198 0.819-5.222 1.331-1.434 0.614-1.638 0.41-1.024-1.126 0.41-1.126 0.307-1.536-0.512-1.024-1.229 0.717-4.71-2.15-5.53-4.608-0.41-1.229-0.922-1.229-3.174 0-2.355 1.229-2.97 1.229-5.222-0.205-1.331-0.922-2.765-2.662-3.174-3.789s-1.024-1.843-1.536-1.536c-0.512 0.307-1.843-1.126-3.072-3.072s-2.867-3.584-3.584-3.584c-0.717 0-4.096-1.229-7.373-2.662-5.837-2.56-9.318-6.554-7.782-8.909 0.307-0.512 0.102-1.229-0.512-1.638-0.717-0.41-0.819-1.946-0.307-4.403 1.126-4.608 0.41-12.288-1.126-13.21s-0.307-3.994 1.638-3.994c0.819 0 2.765 0.512 4.403 1.126 1.536 0.717 4.403 1.331 6.246 1.434 1.843 0.205 3.891 0.717 4.608 1.331 0.614 0.512 3.994 1.741 7.373 2.765 7.373 2.048 11.366 1.024 12.39-3.072 0.307-1.434 1.126-2.56 1.638-2.56 0.614 0 0.819-0.717 0.41-1.536-0.307-0.819-0.102-1.536 0.307-1.536 0.512 0 1.126 0.717 1.536 1.536 0.307 0.819 0.102 1.536-0.41 1.536-1.741 0-1.126 1.536 1.331 2.97 2.048 1.331 2.15 1.331 0.922-0.205-1.024-1.126-1.126-2.15-0.307-3.584 0.512-1.024 0.717-2.867 0.41-4.096-0.717-3.072 3.994-5.325 7.066-3.379 1.126 0.717 1.741 0.819 1.434 0.307-1.024-1.638 1.946-2.15 3.994-0.614 1.024 0.819 2.662 1.434 3.584 1.434s3.891 2.765 6.758 6.144c2.765 3.379 5.325 6.144 5.734 6.144 1.126 0 5.325 7.578 6.451 11.776 0.922 3.686 0.819 4.506-1.741 8.294-1.638 2.355-2.867 4.813-2.867 5.53 0 0.614-0.922 1.946-2.048 2.867-1.229 1.126-2.253 3.482-2.662 6.349-0.307 2.56-1.229 5.12-2.048 5.734s-1.434 2.253-1.536 3.584c0 1.331-0.41 3.277-0.819 4.301-0.512 1.434-1.024 0.512-2.048-3.584zM773.939 430.899c0.614-0.205 1.843-0.205 2.56 0 0.614 0.307 0.102 0.512-1.331 0.512s-1.946-0.205-1.229-0.512zM731.648 429.568c-0.307-0.512-0.102-1.024 0.41-1.024 0.614 0 1.126 0.512 1.126 1.024 0 0.614-0.205 1.024-0.41 1.024-0.307 0-0.819-0.41-1.126-1.024zM568.73 426.189c-0.512-0.717-1.331-2.048-1.741-3.072s-2.048-2.355-3.686-2.867c-3.379-1.229-4.71-3.789-3.686-7.066 0.41-1.229 0-3.174-0.922-4.608-2.253-3.482-0.922-10.138 2.15-10.547 1.434-0.205 2.765 0.512 3.686 2.048 2.458 3.789 7.885 21.094 7.475 23.654-0.307 1.229-0.512 2.56-0.512 3.072-0.102 1.126-1.536 0.819-2.765-0.614zM802.406 420.045c0.307-1.024 0.922-1.536 1.229-1.229s0 1.126-0.717 1.843c-1.024 0.922-1.126 0.819-0.512-0.614zM824.832 418.406c-0.307-0.614 0.41-0.922 1.536-0.819s2.048 0.512 2.048 0.922c0 1.126-2.867 1.024-3.584-0.102zM821.76 415.232c0.307-0.512 1.024-1.024 1.638-1.024 0.512 0 0.922 0.512 0.922 1.024 0 0.614-0.717 1.024-1.638 1.024-0.819 0-1.229-0.41-0.922-1.024zM792.576 413.901c0-1.434 3.277-7.373 4.506-8.090 2.56-1.741 2.56-0.614 0 3.072-3.789 5.12-4.506 5.837-4.506 5.018zM799.642 376.115c-0.102-0.717-0.205-2.458-0.307-3.891s-1.024-2.97-2.253-3.584c-1.126-0.512-1.946-1.638-1.638-2.355 0.205-0.717-0.205-1.946-0.819-2.765-1.946-2.355 0.512-1.843 3.789 0.819 1.536 1.229 3.789 2.765 4.813 3.379 2.458 1.331 3.482 3.686 1.331 2.867-1.741-0.614-3.789 2.355-3.072 4.403 0.205 0.614-0.102 1.434-0.614 1.843-0.614 0.307-1.229 0-1.229-0.717zM744.858 363.93c-0.307-0.614-1.638-0.922-2.867-0.717-1.638 0.307-2.56-0.205-3.379-1.843-2.662-5.837 3.379-5.222 6.349 0.614 1.536 2.867 1.434 4.403-0.102 1.946zM789.402 363.52c-0.819-0.819-5.12-3.482-9.523-5.837-8.704-4.71-10.752-6.963-6.349-6.963 2.253 0 17.101 8.909 18.432 11.059 0.307 0.41 0.102 1.331-0.307 2.048-0.512 0.922-1.126 0.819-2.253-0.307z" />
+<glyph unicode="&#xea20;" glyph-name="international_globe" d="M487.322 882.79c-0.205-0.205-4.71-0.717-10.035-1.024-13.722-0.922-32.154-3.482-53.35-7.27-10.445-1.946-38.298-9.626-52.634-14.541-79.565-27.341-146.125-74.24-200.397-141.107-36.045-44.339-66.765-106.189-80.794-162.099-2.867-11.571-7.475-33.69-8.602-41.165-8.192-56.627-6.451-109.978 5.427-163.123 8.294-36.762 19.763-68.301 37.683-103.629 8.909-17.613 19.251-34.406 34.509-56.32 1.229-1.638 5.837-7.68 10.24-13.312 66.15-83.456 157.286-138.957 260.198-158.515 7.373-1.434 15.872-2.867 18.944-3.277s6.349-0.922 7.168-1.024c0.819-0.205 4.506-0.614 8.192-1.024 3.686-0.307 8.704-0.922 11.264-1.229 8.294-0.922 57.651-1.126 67.584-0.205 24.986 2.15 27.955 2.56 52.531 7.066 89.702 16.589 177.357 66.355 239.514 135.885 104.346 116.736 138.342 275.866 90.829 424.858-12.288 38.605-33.178 80.794-56.73 114.688-35.43 50.995-85.504 97.075-139.264 128.205-46.694 27.034-96.461 44.544-151.040 53.35-11.776 1.843-13.722 2.15-20.992 2.662-3.891 0.41-8.499 0.922-10.24 1.229-3.482 0.512-59.494 1.434-60.006 0.922zM466.944 815.309c0-19.149 0.307-18.534-27.75-46.387-17.306-17.101-24.064-23.040-27.341-24.371-3.789-1.434-9.933-1.638-46.899-1.638-46.592 0-47.718-0.102-49.254-5.939-1.229-4.813-0.717-40.55 0.614-43.008 2.458-4.608 3.482-4.71 47.718-4.813 23.142 0 42.906-0.41 44.032-0.819 4.506-1.536 5.018-4.198 5.222-25.293 0.102-17.92 0-20.275-1.741-23.142-2.56-4.198-4.301-4.506-27.955-4.506-16.691 0-20.173-0.307-23.654-1.946-6.042-2.662-40.141-36.966-42.701-42.906-1.843-4.096-2.048-7.066-2.253-26.726-0.102-20.685-0.307-22.426-2.458-26.829-1.434-3.072-8.499-10.854-20.89-23.040-16.794-16.589-19.251-18.637-23.859-19.866-6.963-1.946-43.315-1.946-49.152 0-3.072 1.024-8.704 5.837-23.040 20.070-23.45 23.142-23.040 22.938-42.906 23.040-7.987 0.102-14.438 0.41-14.438 0.717 0 0.717 2.048 8.294 5.53 20.685 4.71 16.896 15.77 43.93 26.112 64 50.995 99.123 141.722 171.213 249.139 198.144 13.824 3.482 45.875 9.216 47.206 8.499 0.41-0.205 0.717-6.554 0.717-13.926zM768.205 733.389c30.003-27.238 56.525-59.904 76.288-94.413 25.395-44.032 42.701-95.846 48.026-143.36 0.307-3.379 0.819-6.349 0.922-6.656 0.205-0.307 0.717-7.27 1.126-15.36 0.307-8.192 0.922-15.258 1.229-15.872 0.307-0.512-7.066 6.451-16.282 15.462-20.275 19.968-19.456 19.558-42.394 19.456-9.626-0.102-16.179-0.614-17.51-1.331-3.994-2.253-4.506-5.837-4.198-27.955 0.307-19.149 0.512-21.299 2.458-25.088 1.229-2.253 10.138-11.878 19.763-21.504 9.626-9.523 18.534-19.251 19.763-21.504 2.15-3.891 2.253-5.427 2.253-27.648 0-20.992-0.205-23.962-1.946-27.136-1.024-1.946-10.24-12.083-20.582-22.528-16.179-16.486-18.842-19.661-20.275-24.064-1.331-4.198-1.638-11.059-1.638-39.424 0-18.842 0-35.942-0.102-37.888 0-2.97-1.536-5.427-9.011-14.336-21.811-26.214-51.405-53.043-80.077-72.397-13.414-9.114-33.28-20.787-35.226-20.787-1.741 0-22.733 21.606-24.781 25.6-1.843 3.379-1.946 8.090-2.458 76.288-0.512 68.301-0.614 72.909-2.458 76.493-2.867 5.939-46.182 48.845-51.712 51.302-4.403 1.946-7.066 2.048-53.146 2.15l-48.538 0.102-2.458 2.97-2.56 2.867 0.307 44.749c0.307 43.622 0.41 44.749 2.56 48.742 3.277 6.042 45.978 48.128 50.995 50.278 3.686 1.638 8.909 1.843 51.712 1.946 37.171 0.102 48.742 0.41 52.736 1.536 4.608 1.229 7.373 3.584 29.696 25.6 20.070 19.763 25.395 24.371 28.774 25.395 2.458 0.717 10.854 1.229 20.275 1.229h16.179l5.734 5.734 0.102 15.565c0 8.499-0.41 16.691-0.922 18.022-1.741 4.71-5.12 5.427-23.040 5.325-14.95-0.205-16.896-0.41-20.992-2.56-2.867-1.434-13.21-10.854-27.136-24.678-12.39-12.288-24.166-23.142-26.112-24.269-3.379-1.741-7.066-1.843-52.122-1.946l-48.64-0.205-2.867 2.867c-1.741 1.741-2.867 4.096-2.97 5.837-0.102 1.536-0.102 11.264-0.102 21.402 0 16.179 0.307 19.149 2.048 23.040 2.458 5.53 42.496 46.899 49.357 50.893l4.608 2.765 45.261 0.512c45.056 0.512 45.363 0.512 47.616 2.765 2.048 2.15 2.253 3.174 2.355 18.33 0.102 17.101-0.819 21.197-5.018 22.63-1.126 0.41-10.854 0.717-21.606 0.819-10.65 0.102-20.378 0.512-21.606 0.922-1.229 0.307-2.97 2.15-3.891 3.994-1.536 2.867-1.741 5.939-1.434 23.552l0.307 20.378 6.144 4.915h96.666l10.547-9.523zM261.632 436.838c1.741-0.717 23.859-21.914 49.152-47.104 42.394-42.291 46.49-46.080 51.2-47.514 3.891-1.126 10.138-1.536 25.498-1.536h20.378l5.325-5.325 0.102-44.851c0.102-41.062-0.102-45.158-1.741-49.869-1.638-4.403-5.222-8.499-22.733-26.112-11.469-11.571-21.811-22.63-22.835-24.576-1.638-3.072-2.048-6.656-2.458-25.6-0.512-18.534-0.922-22.528-2.458-25.6-1.024-1.946-7.885-9.626-15.155-16.998l-13.414-13.517-5.734 3.072c-18.227 9.933-40.346 24.986-59.494 40.55-13.517 11.059-38.912 36.352-50.381 50.176l-8.806 10.547-0.41 13.517c-0.307 10.65-0.717 14.234-2.253 17.101-1.024 1.946-10.342 12.083-20.582 22.528-13.824 14.029-19.046 19.968-20.070 23.040-1.126 3.277-1.434 13.312-1.434 47.616 0 39.014 0.205 44.032 1.741 48.128 1.434 3.686 6.758 9.523 25.088 27.853 12.902 12.8 24.781 23.757 26.419 24.576 6.451 2.662 38.195 2.662 45.056-0.102z" />
+<glyph unicode="&#xea21;" glyph-name="internet" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM486.4 753.152v-74.752h-115.507l2.355 6.554c3.482 9.626 11.264 27.136 17.51 39.834 20.070 39.936 46.694 73.421 72.192 90.624 4.198 2.765 21.811 12.288 23.245 12.493 0.102 0 0.205-33.587 0.205-74.752zM546.099 823.91c6.758-3.174 20.685-12.186 26.419-17.101 30.208-25.907 59.29-71.168 78.131-121.446l2.56-6.963h-115.61v74.24c0 50.79 0.307 74.24 1.024 74.24 0.614 0 3.994-1.331 7.475-2.97zM656.282 803.738c62.669-25.293 114.278-64.307 159.232-120.525l3.994-4.813-112.128 0.512-4.403 12.288c-14.746 41.574-34.611 80.384-55.808 109.056-7.782 10.547-7.68 10.445-4.915 9.216 1.331-0.512 7.578-3.072 14.029-5.734zM382.976 808.858c0-0.307-1.536-2.458-3.482-4.813-10.24-12.8-25.088-37.376-35.84-59.597-11.981-24.474-14.746-31.027-22.63-53.248l-4.403-12.288-112.026-0.512 3.379 4.301c41.062 53.146 98.304 96.461 160.973 121.651 12.595 5.12 14.029 5.632 14.029 4.506zM301.773 625.664c-0.614-1.434-5.632-24.269-6.451-29.184-0.205-1.434-1.126-6.246-1.843-10.752-1.741-9.318-4.403-26.419-5.222-33.28-0.307-2.56-0.717-6.246-1.024-8.192-0.819-6.451-1.434-12.698-2.048-20.992-0.41-4.506-0.819-9.318-1.024-10.752-0.307-2.253-0.717-8.602-2.048-31.744-0.102-2.56-0.307-5.222-0.41-5.837-0.102-1.024-16.179-1.331-76.493-1.331h-76.493l0.717 8.499c0.819 9.728 1.024 11.162 3.789 28.365 5.53 35.226 16.486 70.042 33.075 104.755l5.734 11.981h65.126c56.832 0 65.024-0.205 64.614-1.536zM486.4 550.4v-76.8h-153.293l0.307 5.939c1.126 21.402 2.765 43.11 3.994 52.429 0.205 1.946 1.229 9.318 2.048 16.384 0.922 7.066 2.56 18.125 3.789 24.576 1.126 6.451 2.458 13.824 2.867 16.384 0.717 4.198 4.096 19.251 7.27 32.563l1.229 5.325h131.789v-76.8zM673.075 611.123c2.048-8.909 3.994-17.51 4.301-19.251 3.379-18.125 7.782-46.694 9.114-58.88 1.536-14.131 2.662-27.546 3.174-39.117 0.41-6.963 0.819-14.336 1.024-16.384l0.307-3.891h-153.395v153.6h131.686l3.789-16.077zM857.702 615.219c17.818-37.478 31.539-82.944 34.714-114.995 0.307-3.686 0.819-7.373 1.024-8.192s0.717-5.325 1.024-10.035l0.717-8.397-153.293 0.512-0.102 5.12c-0.205 7.578-1.536 31.334-1.946 34.304-0.205 1.434-0.717 6.246-1.024 10.752s-0.717 9.318-1.024 10.752c-0.205 1.434-0.717 5.325-1.024 8.704-2.253 22.221-10.24 66.97-14.438 81.715-0.512 1.638 3.072 1.741 64.512 1.741h65.126l5.734-11.981zM282.214 415.744c0.307-8.602 1.434-29.082 1.946-32.768 0.205-1.638 0.614-6.758 1.024-11.264 0.307-4.506 1.024-11.366 1.536-15.36 0.512-3.891 1.229-9.421 1.536-12.288 2.048-17.101 11.264-68.096 13.312-73.421 0.717-1.741-2.765-1.843-64.41-1.843h-65.126l-5.734 12.083c-16.179 33.792-26.931 67.482-32.563 101.99-3.174 19.354-3.379 20.787-4.301 31.13l-0.614 8.397 153.19-0.512 0.205-6.144zM486.4 345.6v-76.8h-131.686l-1.843 7.475c-7.373 30.413-13.312 64.922-15.974 93.389-0.614 6.758-1.331 14.029-1.536 16.282-0.307 2.15-0.717 9.523-1.024 16.384-0.41 6.758-0.819 14.131-1.024 16.282l-0.41 3.789h153.498v-76.8zM690.688 417.587c-0.205-2.765-0.614-10.24-1.024-16.691-0.614-11.162-0.819-14.336-2.15-27.648-2.56-27.648-8.090-61.133-14.234-87.552-1.946-8.397-3.584-15.667-3.584-16.077s-29.696-0.819-66.048-0.819h-66.048v153.6h153.395l-0.307-4.813zM894.566 414.515c-0.41-4.403-0.922-9.114-1.126-10.547s-0.717-5.12-1.024-8.192c-3.686-33.792-17.203-78.643-34.816-115.098l-5.734-11.878h-65.024c-61.44 0-65.024 0.102-64.512 1.843 1.229 4.198 5.734 25.19 7.68 36.045 2.867 16.179 2.867 16.384 4.71 30.208 0.922 6.758 1.843 13.414 2.048 14.848 0.922 5.53 3.584 36.045 4.198 48.64 0.922 16.384 1.126 21.402 1.331 21.811 0.102 0.102 34.509 0.205 76.493 0.205h76.39l-0.614-7.885zM321.024 204.8c14.643-41.677 36.352-83.558 57.139-111.002 2.458-3.174 4.813-6.246 5.12-6.963 0.41-0.614-3.072 0.307-7.68 2.15-31.334 12.39-53.453 23.962-79.462 41.472-30.72 20.582-63.078 50.893-86.528 80.896l-4.915 6.246 111.923-0.512 4.403-12.288zM486.4 143.36c0-54.272-0.307-74.24-1.126-74.24-1.741 0-16.589 7.578-22.118 11.366-33.792 22.733-67.994 72.499-90.010 130.765l-2.355 6.349h115.61v-74.24zM650.752 211.251c-11.571-30.515-28.467-62.771-44.544-84.992-5.325-7.373-20.787-25.498-25.805-30.106-5.427-5.12-14.643-12.288-21.402-16.794-6.349-4.198-18.33-10.24-20.378-10.24-0.717 0-1.024 23.45-1.024 74.24v74.24h115.61l-2.458-6.349zM815.514 212.787c-28.979-36.25-57.037-62.157-93.082-85.811-23.347-15.36-45.978-27.034-72.499-37.478l-10.138-3.891 2.56 3.277c25.6 33.894 47.616 77.107 64.717 127.488 0.307 0.922 12.595 1.229 56.422 1.229h55.91l-3.891-4.813z" />
+<glyph unicode="&#xea22;" glyph-name="internet_browser" d="M487.219 882.688c-0.205-0.205-4.198-0.614-9.011-1.024-4.813-0.307-9.83-0.819-11.264-1.024s-5.12-0.717-8.192-1.024c-33.485-3.891-77.21-15.667-111.104-29.696-78.336-32.563-147.046-89.088-193.638-159.232-20.787-31.437-41.165-72.090-52.941-105.984-10.957-31.539-19.354-68.608-21.709-95.744-0.41-4.198-1.126-10.854-1.536-14.848-0.819-7.578-0.512-61.235 0.512-69.12 0.307-2.56 1.024-8.704 1.638-13.824 3.994-34.714 13.517-72.090 27.136-106.803 4.71-11.981 19.149-42.189 24.781-51.917 38.605-66.662 89.907-119.194 154.317-158.106 14.336-8.602 46.899-24.883 60.928-30.31 41.472-16.179 80.179-25.498 123.904-29.594 14.234-1.331 68.506-1.536 74.752-0.307 1.434 0.307 6.246 0.819 10.752 1.229s9.114 0.922 10.24 1.126c1.126 0.205 8.090 1.331 15.36 2.458 54.886 8.909 110.797 30.413 159.334 61.030 35.533 22.528 66.662 49.254 96.666 83.456 16.077 18.125 36.045 46.797 49.664 71.066 33.894 60.518 53.248 122.163 58.163 184.832 0.922 12.698 0.922 53.965-0.102 67.277-4.506 60.211-22.733 120.934-52.224 173.875-27.238 49.050-64.614 93.286-108.237 128.102-46.080 36.762-102.4 65.229-158.208 79.77-24.166 6.349-43.315 9.933-66.56 12.39-3.379 0.307-7.475 0.819-9.216 1.126-3.482 0.512-63.693 1.331-64.205 0.819zM607.539 819.712c46.387-11.878 95.027-34.611 131.482-61.645l5.734-4.198-3.379-1.434c-1.946-0.717-5.427-3.072-7.885-5.018-10.65-8.704-9.83-17.613 2.15-23.347 4.608-2.15 6.963-2.048 12.186 0.614 9.011 4.608 12.902 3.994 17.101-2.765 2.56-4.096 2.048-6.963-1.638-9.318-3.379-2.253-5.12-1.229-5.939 3.482-0.819 5.222-3.277 6.246-8.602 3.584-4.403-2.15-5.12-4.506-3.174-11.366 1.229-4.301 1.126-4.71-1.024-6.554-1.638-1.229-4.096-1.843-7.885-1.843-7.168 0-10.854-1.638-21.402-9.216-12.083-8.704-17.203-11.059-25.6-11.776-3.891-0.41-8.294-0.819-9.626-1.024-2.662-0.512-7.27-3.277-7.27-4.403 0-1.331 4.198-4.813 9.318-7.68 9.216-5.427 11.674-10.65 7.066-15.565-3.174-3.379-8.602-4.096-16.282-2.048-9.114 2.355-15.462 2.662-18.842 0.819-4.608-2.355-7.27-9.421-7.27-19.456-0.102-10.752 1.331-12.902 12.288-17.613 9.523-4.096 16.998-5.222 19.661-2.97 0.922 0.922 3.174 2.355 4.915 3.174 2.56 1.331 3.379 2.56 3.891 5.632 0.819 5.632 7.885 13.107 13.21 14.131 3.482 0.614 4.198 1.229 5.939 5.12 2.253 5.427 3.482 6.042 9.933 4.813 3.994-0.819 6.349-0.512 13.517 1.536 14.234 3.994 13.414 4.096 17.818-1.229 3.789-4.71 8.499-7.68 15.872-10.342 6.554-2.253 17.51-10.035 17.51-12.288 0-3.072-3.174-4.608-9.523-4.608-11.571 0-13.926-1.843-6.554-5.12 5.632-2.56 7.885-2.56 10.957 0.307 1.434 1.229 4.096 3.379 5.939 4.608 2.765 2.048 3.277 3.072 3.277 6.349 0 2.15 0.512 4.301 1.024 4.608 0.614 0.307 1.024 1.536 1.024 2.56 0 2.15-6.656 5.734-12.083 6.451-2.458 0.41-5.12 2.355-9.933 7.373-5.632 5.734-6.451 7.066-5.632 8.806 0.614 1.024 1.536 1.946 2.15 1.946 2.048 0 12.493-5.222 16.077-8.192 2.15-1.638 5.018-3.277 6.656-3.584 1.536-0.41 3.072-1.126 3.379-1.638 0.205-0.512 2.56-1.741 5.018-2.867 4.096-1.843 4.608-2.458 6.144-7.68 1.434-4.71 2.458-6.246 6.144-8.909 3.174-2.253 4.915-4.506 5.939-7.475 1.843-5.632 4.915-5.939 10.342-1.229l4.096 3.482-3.277 3.072c-1.843 1.741-3.277 3.789-3.277 4.506 0 2.355 3.584 5.018 8.192 6.042 6.554 1.536 8.909 0.41 10.752-5.018 3.379-9.728 4.813-11.571 11.674-15.258 6.451-3.482 8.602-3.789 13.517-1.843 1.229 0.512 2.765-1.946 6.861-11.776 2.97-6.861 5.325-13.005 5.325-13.722 0-0.922-1.536-1.126-5.325-0.922-2.97 0.307-8.192-0.205-11.571-0.922-3.994-0.922-7.578-1.126-10.24-0.614-2.253 0.41-6.656 1.229-9.728 1.741s-9.626 2.355-14.541 4.096c-5.018 1.741-10.138 3.174-11.571 3.174-5.53 0-9.421-3.482-11.264-9.83-0.819-3.174-3.891-3.584-10.24-1.331-3.072 1.024-6.554 1.946-7.782 1.946-1.126 0-3.482 1.331-5.12 3.072-3.277 3.174-10.445 6.144-15.053 6.144-4.096 0-9.933 1.843-12.493 3.891-2.253 1.843-2.253 1.946-0.614 5.12 1.229 2.458 1.434 3.789 0.614 5.222-0.512 1.126-1.024 2.97-1.024 4.096 0 2.765-3.277 4.403-7.373 3.584-1.843-0.41-10.24-0.819-18.739-0.819-18.534-0.205-31.13-2.458-39.936-6.963-5.325-2.765-7.27-3.174-14.336-3.277-6.144-0.102-9.523-0.717-13.312-2.458-6.758-3.072-8.192-4.506-12.288-12.493-4.608-8.602-6.451-10.65-16.794-18.534-4.71-3.584-8.806-7.066-9.011-7.578-0.307-0.922 17.306-10.035 107.213-55.603 26.112-13.21 33.28-17.306 37.478-21.402 11.981-11.366 14.643-28.877 6.758-43.622-3.072-5.632-9.114-11.981-14.234-14.643-3.379-1.843-3.482-2.048-2.867-6.554 0.717-4.915 3.174-9.421 13.517-24.576 11.264-16.384 12.186-25.395 4.096-40.858-7.782-14.95-7.578-17.715 2.867-35.84 3.174-5.734 7.066-14.438 8.704-19.558 1.638-5.222 4.71-12.083 7.066-15.667 2.253-3.482 6.042-10.752 8.397-16.077 9.216-20.89 15.36-25.19 25.293-17.613 4.301 3.277 4.813 3.379 11.059 1.741 4.403-1.126 5.427-1.024 8.602 0.512 1.946 1.024 4.403 1.536 5.325 1.126 1.946-0.717 2.56 0.512-10.24-19.456-22.528-34.816-57.139-71.373-92.877-97.997-33.28-24.678-67.891-43.008-107.213-56.525-23.757-8.294-58.368-16.179-78.848-18.125-3.482-0.41-7.066-0.819-7.782-1.024-2.253-0.819-28.058-1.946-41.165-1.946-12.902 0-34.714 1.024-40.448 1.946-1.638 0.205-7.475 0.922-12.8 1.536-48.435 5.837-105.267 26.010-150.528 53.555-99.533 60.416-167.322 162.714-183.706 277.197-2.97 20.787-3.789 32.154-3.789 55.808 0 23.962 1.536 42.701 5.325 64.819 1.229 7.066 2.662 7.987 7.373 4.301 1.434-1.126 3.277-2.048 4.096-2.048s3.994-1.126 7.066-2.458c8.090-3.584 11.981-4.096 17.818-2.355 5.734 1.638 7.987 1.126 11.674-2.867 4.608-5.018 14.95-8.909 29.491-11.264 3.584-0.614 5.018-1.536 8.192-5.427 11.571-14.234 15.36-16.794 28.672-19.149 13.722-2.355 16.794-3.482 20.992-7.782 3.789-3.789 3.994-4.301 3.584-8.909-0.307-3.482-2.048-7.475-6.246-14.643-13.21-22.426-14.643-39.936-4.813-59.392 5.734-11.264 13.21-19.866 27.648-31.642 12.698-10.342 16.998-14.746 20.173-20.89 3.891-7.68 4.198-16.691 0.922-32.358-2.662-13.107-3.174-16.998-4.198-33.382-0.614-10.138-2.662-17.101-9.626-33.075-4.71-10.854-5.018-13.824-2.15-17.51 2.662-3.482 2.56-7.168-0.512-11.366-6.451-8.909-8.397-13.21-7.987-17.203 0.307-2.56-0.205-5.222-1.229-7.27-3.891-7.578 3.174-20.275 17.51-31.232 11.059-8.499 24.166-11.366 28.774-6.349 3.174 3.379 4.403 6.349 4.608 10.752 0.205 5.222-0.614 6.349-4.813 6.349-1.843 0-4.096 0.307-5.018 0.614-2.765 1.024-1.843 6.554 2.56 15.667 4.198 8.499 4.198 8.704 2.97 13.926-1.126 4.506-1.024 5.734 0.41 8.499 2.458 4.71 11.059 12.698 17.203 16.077 9.114 5.018 25.6 17.715 31.949 24.678 3.891 4.301 10.138 9.318 17.92 14.438 13.414 8.704 18.227 12.902 23.245 20.275 1.843 2.867 4.813 6.656 6.451 8.499 2.867 3.174 2.97 3.584 1.638 6.656-1.126 2.662-13.21 35.738-29.286 80.077-32.973 90.624-42.394 115.917-43.622 116.941-0.819 0.614-4.608 1.434-8.294 1.843-3.789 0.307-10.547 1.024-15.155 1.638-4.506 0.512-12.595 1.229-17.818 1.638-5.222 0.307-10.65 1.229-12.083 1.946-1.331 0.717-3.379 1.126-4.403 0.922-2.355-0.512-9.421-3.891-14.234-6.758-5.12-3.174-15.462-3.789-22.63-1.434-7.373 2.458-11.366 5.018-26.419 17.101-6.963 5.632-14.95 11.366-17.92 12.698l-5.222 2.662 0.512 8.090c0.614 9.933-0.307 13.926-3.584 15.462-3.584 1.638-6.861 0.307-13.619-5.222-7.885-6.554-12.083-8.602-17.613-8.602-6.656 0-11.674 2.765-15.258 8.397-6.042 9.421-6.861 24.576-1.843 33.178 7.987 13.619 25.6 20.89 47.821 19.866 16.691-0.819 26.624-5.12 34.304-14.848 2.253-2.867 5.12-5.734 6.451-6.451 4.096-2.253 4.813-0.102 4.813 14.234 0 15.053 0.922 17.613 8.397 22.323 6.042 3.789 9.83 8.294 14.029 16.589 2.15 4.198 4.608 7.578 6.451 8.602 3.379 1.946 16.077 11.981 16.486 13.005 0.102 0.41-1.638 5.734-3.891 11.878-4.915 13.312-5.837 19.763-4.096 28.262 1.536 7.373 7.168 16.589 12.595 20.685 7.475 5.734 14.643 8.192 23.347 8.192 9.216 0 10.035-0.307 28.672-9.626 12.595-6.349 14.438-6.963 19.661-6.758 6.451 0.205 7.475-0.307 5.939-3.174-1.331-2.458-1.331-2.355 14.541-10.445 9.011-4.608 11.264-5.325 11.981-4.096 1.331 2.15-0.41 4.608-5.632 8.192-6.656 4.608-8.499 6.861-9.216 11.674-1.229 8.294-1.741 9.728-3.994 12.186-1.229 1.331-5.427 3.686-9.421 5.12-6.144 2.355-8.294 3.994-16.077 11.878-11.674 11.878-14.848 13.312-26.624 11.366-4.506-0.717-9.523-1.331-11.059-1.229-3.482 0.102-8.602 2.662-13.005 6.554-8.602 7.475-18.842 11.981-29.286 13.005l-7.168 0.614 11.469 8.602 5.632-1.434c3.072-0.819 8.090-2.56 11.059-3.891 9.114-3.994 15.36-5.734 22.938-6.144l7.168-0.41-4.301 1.946c-5.325 2.355-5.939 4.506-1.024 3.379 9.114-1.946 11.059-1.843 14.131 0.41 2.458 1.843 8.192 3.482 13.517 3.891 2.048 0.102 10.035 6.656 11.878 9.523 1.741 2.97 1.843 4.608 1.229 15.155-0.102 0.614-0.717 1.229-1.331 1.229-3.379 0.102-5.325 3.072-5.12 7.68 0.102 4.301 0 4.506-3.891 6.246-4.915 2.253-5.427 1.843 11.674 8.806 7.066 2.867 13.21 4.813 14.438 4.506 3.277-0.819 8.806-7.27 9.626-11.059 0.614-2.97 1.126-3.379 4.198-3.482 1.946 0 4.71 0.307 6.144 0.819 1.843 0.717 2.765 0.512 3.686-0.717 0.717-1.024 2.15-1.434 3.686-1.126 2.56 0.41 9.011-2.048 9.011-3.482 0-0.41-2.355-1.126-5.325-1.434-3.789-0.512-4.915-1.024-3.891-1.638 0.819-0.614 2.458-1.024 3.686-1.024 1.126 0 2.56-0.512 3.174-1.126 0.922-0.922-0.102-1.843-3.891-3.686-5.427-2.765-9.114-6.656-9.114-9.728 0-1.024 0.922-3.789 2.15-6.144 6.246-12.186 27.546-27.75 41.677-30.31 10.445-1.843 16.384 1.229 22.835 12.083 6.656 11.162 10.957 14.541 24.576 18.944 6.451 2.048 19.251 5.632 28.57 7.782 9.318 2.253 20.378 5.12 24.576 6.451s11.059 2.97 15.155 3.686c3.994 0.717 7.373 1.638 7.373 2.048s-2.253 1.024-5.12 1.434c-7.68 1.024-7.373 2.662 0.717 2.765 7.066 0 11.571 0.614 12.39 1.434 0.307 0.307-0.205 1.331-1.126 2.355-1.434 1.536-1.536 2.458-0.512 5.427 0.614 1.946 1.229 3.994 1.434 4.71s2.253 1.741 4.71 2.355c5.632 1.434 9.114 3.174 9.83 4.915 0.205 0.819-0.307 2.97-1.229 4.915l-1.638 3.584 4.301 1.946c5.632 2.56 5.53 2.56 19.558-1.024zM259.686 727.040c1.536-6.246 2.56-12.083 2.15-13.005-0.307-0.922-2.56-2.253-4.813-2.97-5.837-1.741-7.885-5.018-6.451-10.24 0.922-3.482 0.819-4.403-0.922-6.554-1.126-1.434-2.765-2.56-3.584-2.56-0.922 0-5.837 4.403-11.059 9.728l-9.421 9.626 9.318 9.216c5.12 5.018 11.366 10.957 13.824 13.107 2.56 2.15 5.018 4.403 5.632 5.12 1.638 1.741 2.15 0.717 5.325-11.469zM661.914 723.046c-4.813-2.15-6.656-5.222-5.325-9.011 0.614-1.638 1.741-3.277 2.56-3.584s1.946-1.638 2.458-2.97c0.614-1.741 1.638-2.458 3.482-2.458 3.994 0 9.011-6.246 5.12-6.349-2.253 0-4.608-2.048-4.608-3.891 0-1.024-0.717-2.355-1.638-2.867s-1.434-1.536-1.024-2.15c0.41-0.614 1.126-0.922 1.638-0.614s1.229 0.102 1.536-0.512c0.41-0.614-0.717-2.355-2.458-3.994-3.379-3.174-4.198-6.963-1.638-7.885 0.819-0.41 3.686 0.717 6.349 2.458 6.246 3.994 11.469 5.325 19.558 5.018 5.837-0.205 6.758 0.102 8.499 2.253 3.072 3.686 2.15 7.475-1.843 8.499-2.048 0.512-4.301 2.253-5.734 4.403-1.331 1.946-4.506 5.12-7.066 7.066-5.222 3.994-6.349 6.042-4.915 8.806 2.048 3.789 1.229 5.12-2.97 5.12-3.072 0-4.096 0.41-4.506 2.048-0.614 2.355-2.97 2.56-7.475 0.614zM646.656 707.379c-1.126-0.307-4.198-1.946-6.861-3.686-3.584-2.253-4.915-3.789-4.915-5.53 0-1.331-0.717-3.789-1.536-5.427-1.434-2.765-1.434-3.072 0.614-4.096 1.536-0.819 3.482-0.819 7.373 0 7.68 1.638 12.902 5.427 13.005 9.421 0 1.024 0.922 2.662 2.15 3.789l2.15 1.946-2.458 1.536c-2.867 1.843-6.758 2.662-9.523 2.048zM318.464 665.498c0-0.307 2.97-8.806 6.554-18.739 3.686-9.933 9.83-26.726 13.722-37.478 3.994-10.65 13.414-36.762 21.197-57.856 13.005-35.738 16.077-44.032 25.395-69.632 2.048-5.325 10.547-28.877 19.046-52.224 8.602-23.347 16.384-44.749 17.51-47.616 1.024-2.765 4.71-12.698 8.090-22.016 3.277-9.318 10.24-28.16 15.258-41.984s14.336-39.322 20.685-56.832c6.349-17.408 11.878-32.051 12.186-32.461s7.066 13.414 14.95 30.72c7.782 17.306 16.179 35.635 18.534 40.653 3.994 8.602 11.571 25.088 17.51 38.4 2.355 5.12 2.662 5.427 3.891 3.686 0.819-1.024 2.97-3.584 4.813-5.632s6.861-7.578 11.059-12.39c4.198-4.813 7.885-8.909 8.192-9.216s4.71-5.12 9.626-10.752c5.018-5.632 10.547-11.878 12.39-13.824 1.741-1.946 8.909-10.035 15.872-17.92 7.066-7.885 13.005-14.541 13.312-14.848s9.728-10.854 20.992-23.552c24.678-27.75 26.010-28.979 33.997-32.973 18.637-9.216 39.731-2.048 63.693 21.606 20.173 19.968 22.733 38.502 7.885 57.958-2.97 3.891-31.232 35.738-49.869 56.218-2.56 2.867-11.366 12.595-19.456 21.709-8.090 9.011-18.842 20.992-23.962 26.624-5.018 5.53-12.186 13.619-15.872 17.715-3.686 4.198-7.68 8.499-8.909 9.626-1.331 1.229-2.355 2.458-2.355 2.867s3.789 1.946 8.499 3.379c4.608 1.434 22.733 7.066 40.141 12.39 17.51 5.427 41.165 12.8 52.736 16.282l20.992 6.451-5.632 2.867c-3.072 1.536-19.251 9.728-35.84 18.125-16.589 8.499-45.67 23.245-64.512 32.768-81.203 41.267-106.803 54.272-193.536 98.304-95.744 48.64-118.784 60.314-118.784 59.597z" />
+<glyph unicode="&#xea23;" glyph-name="Internet_security_desktop" d="M141.312 830.362c-14.643-3.891-26.624-13.414-32.973-26.214-2.048-4.096-4.198-9.933-4.813-12.902-0.819-3.891-1.126-80.896-1.126-267.264 0-291.635-0.614-267.674 7.168-280.883 4.813-8.090 13.21-16.077 20.89-19.866 12.288-6.042-15.565-5.632 380.723-5.632 262.554 0 365.773 0.307 369.664 1.126 19.558 4.096 36.147 20.89 39.629 40.346 0.819 4.198 1.126 83.456 1.126 267.264 0 222.72-0.205 261.939-1.536 266.65-4.915 18.842-20.685 33.997-39.219 37.888-3.891 0.819-107.418 1.126-369.664 1.024-315.904 0-364.954-0.205-369.869-1.536zM870.4 550.4v-230.4h-716.8v460.8h716.8v-230.4zM524.8 290.918c14.541-8.602 16.998-28.467 4.915-40.141-7.68-7.475-20.070-9.626-28.877-5.018-8.294 4.198-14.438 14.131-14.438 23.040 0 9.728 7.475 20.582 16.486 23.859 6.349 2.355 16.179 1.536 21.914-1.741zM496.538 728.064c-25.805-5.734-47.411-24.371-56.525-48.742-4.096-10.854-4.813-17.92-4.813-48.23v-29.491h-51.2l0.205-100.557 0.307-100.659 3.174-6.656c4.198-8.602 10.342-14.848 18.739-18.842l6.758-3.174 226.816-0.512v98.509c0 105.062 0.102 102.195-4.915 112.026-3.072 6.042-10.24 12.595-17.51 16.077-5.837 2.765-7.987 3.174-17.715 3.584l-11.059 0.512-0.102 28.774c-0.102 15.77-0.307 29.696-0.41 30.925-3.482 31.949-28.16 59.085-60.416 66.253-8.397 1.843-23.142 1.946-31.334 0.205zM522.957 697.446c2.867-0.819 7.475-2.458 10.24-3.789 6.246-3.072 16.691-13.517 19.661-19.661 4.71-9.728 5.222-13.926 5.222-43.93v-28.467h-92.16v28.467c0 30.106 0.512 34.202 5.222 43.93 2.97 6.246 13.414 16.486 19.763 19.661 10.547 5.12 21.914 6.451 32.051 3.789zM525.722 541.696c6.451-3.277 10.65-7.475 14.131-14.131 3.482-6.758 3.277-18.739-0.512-26.522-2.662-5.325-7.168-10.445-11.571-12.902-1.536-0.922-1.638-2.048-0.512-14.131 0.717-7.27 1.434-14.541 1.638-16.282 0.41-3.482 1.229-11.469 2.048-20.48 0.307-3.379 0.819-8.090 1.126-10.445l0.512-4.403h-20.48c-11.571 0-20.582 0.41-20.582 0.922s0.717 7.066 1.536 14.643c0.819 7.475 1.741 17.101 2.048 21.299s0.819 8.602 1.024 9.728c0.205 1.126 0.614 5.734 1.024 10.24l0.512 8.192-5.018 3.789c-3.482 2.56-5.837 5.53-7.885 9.626-13.005 26.522 14.643 54.17 40.96 40.858zM435.2 153.6v-38.4h-66.253c-52.736-0.102-67.174-0.41-70.246-1.434-5.632-2.048-10.547-6.246-13.722-11.674-2.765-4.608-2.867-5.427-3.277-21.402l-0.307-16.691h461.107l-0.102 15.667c-0.205 14.336-0.41 16.077-2.765 20.992-1.331 2.867-4.198 6.656-6.246 8.397-7.578 6.246-6.451 6.144-78.746 6.144h-65.843v76.8h-153.6v-38.4z" />
+<glyph unicode="&#xea24;" glyph-name="Internet_security_mobile" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM496.64 651.264c-27.443-5.837-48.947-25.702-58.47-53.76-2.048-6.144-2.253-9.216-2.662-39.629l-0.512-33.075h-50.995v-98.509c0-105.062-0.102-102.195 4.915-112.026 3.072-6.042 10.24-12.595 17.613-16.179l6.656-3.174 226.816-0.512-0.205 100.557-0.307 100.659-3.174 6.656c-3.994 8.499-10.445 14.848-18.842 18.842-5.837 2.765-7.987 3.174-17.613 3.482l-10.854 0.41-0.512 32.461c-0.41 35.738-0.819 38.195-7.578 51.712-15.565 31.744-50.688 49.152-84.275 42.086zM521.114 621.056c15.872-2.97 29.491-15.36 34.816-31.642 1.946-6.042 2.15-8.909 2.15-35.635v-28.979h-92.262l0.205 29.491c0.102 26.317 0.307 30.003 2.15 35.533 7.475 22.426 29.798 35.635 52.941 31.232zM522.547 466.33c15.872-5.837 24.064-23.45 18.125-39.117-2.15-5.837-8.397-13.414-12.698-15.77-1.843-1.024-1.843-1.638-0.717-14.234 0.717-7.27 1.434-14.541 1.638-16.282 0.205-1.638 0.922-8.397 1.536-14.848 0.512-6.451 1.331-13.722 1.638-16.077l0.512-4.403h-41.267l0.614 3.891c0.307 2.048 0.819 7.066 1.126 10.957 0.41 3.994 1.331 13.414 2.048 20.992 3.174 30.106 3.174 29.082-0.102 30.72-4.198 2.253-10.445 10.752-12.186 16.589-1.946 6.656-1.946 11.366 0 17.92 5.018 16.794 23.142 25.805 39.731 19.661z" />
+<glyph unicode="&#xea25;" glyph-name="Internet_security_password" d="M112.538 625.562c-28.877-6.144-51.2-27.443-58.88-56.218-1.843-6.861-1.946-13.005-1.946-134.144 0-121.242 0.102-127.283 1.946-134.144 7.987-29.696 31.027-50.995 61.542-56.832 3.174-0.614 152.781-0.819 399.872-0.717l394.752 0.205 6.656 2.15c20.070 6.656 33.485 16.589 43.622 32.256 5.939 9.216 8.397 14.95 10.752 25.702 1.843 8.602 1.946 14.438 1.946 131.584-0.102 127.488-0.102 129.126-4.198 140.083-9.216 24.576-27.341 41.574-52.838 49.357-5.632 1.741-24.576 1.843-401.203 2.048-338.842 0.102-396.186-0.102-402.022-1.331zM230.81 494.49c1.434-1.331 1.638-4.915 1.638-23.142 0-16.794 0.307-21.402 1.331-20.992 0.614 0.205 9.114 3.584 18.637 7.373 13.722 5.427 17.92 6.656 19.866 6.042 2.048-0.819 3.174-2.867 6.144-11.981 3.891-11.878 3.789-13.312-1.024-15.77-1.331-0.717-8.704-3.379-16.282-5.939-7.578-2.662-15.155-5.325-16.691-5.939l-2.867-1.229 2.662-3.584c12.186-16.179 20.992-29.286 20.992-31.334 0-1.434-1.331-3.584-3.072-5.222-6.349-5.632-14.95-11.571-16.691-11.571-2.56 0-5.222 3.174-16.998 20.685l-10.138 15.053-10.957-16.794c-5.939-9.216-11.571-17.306-12.39-18.022-2.355-1.946-5.837-0.307-14.336 6.554-6.963 5.632-8.090 6.861-7.987 9.523 0.102 2.15 3.584 7.782 11.571 18.842 6.246 8.602 11.059 16.077 10.65 16.384-0.512 0.41-6.349 2.56-13.107 4.915-22.118 7.475-23.962 8.294-24.678 11.059-0.614 2.355 3.174 16.179 5.939 21.709 2.048 3.994 4.915 3.686 17.306-1.331 6.451-2.56 12.595-5.12 13.722-5.632 1.126-0.614 3.891-1.638 6.246-2.458l4.096-1.434-0.102 19.661c-0.102 19.149 0.41 23.859 2.867 25.395 0.717 0.41 5.939 0.819 11.674 0.819 8.090 0 10.752-0.307 11.981-1.638zM431.718 495.309c2.56-1.638 3.072-5.734 2.97-24.883-0.102-17.818 0.102-20.070 1.434-19.661 0.922 0.307 9.216 3.584 18.534 7.168 21.299 8.499 20.685 8.602 25.395-5.53 3.686-10.854 3.789-14.848 0.512-16.179-1.024-0.41-9.626-3.482-19.149-6.758-9.523-3.379-17.51-6.144-17.613-6.349-0.102-0.102 5.018-7.578 11.469-16.486 6.861-9.523 11.674-17.306 11.674-18.637 0-2.56-3.277-6.042-12.288-12.698-5.53-4.096-7.578-4.813-10.035-3.174-0.819 0.512-6.349 8.192-12.493 17.101-6.042 8.909-11.366 16.282-11.878 16.486s-5.018-6.246-10.138-14.234c-11.059-17.306-13.312-20.275-16.077-20.275-2.56 0-18.944 12.595-19.763 15.36-0.819 2.662 0 4.096 12.493 21.299 5.837 8.090 10.342 15.053 10.035 15.565-0.205 0.41-1.536 1.024-2.765 1.331-6.042 1.331-32.154 11.162-33.792 12.698-2.458 2.253-2.355 3.379 1.331 14.438 3.174 9.523 5.018 12.493 7.578 12.493 1.024 0 21.709-7.987 36.147-14.029 1.024-0.41 1.229 3.994 1.229 20.685-0.102 26.419-0.819 25.088 13.722 25.088 5.734 0 10.854-0.41 11.469-0.819zM637.338 494.49c1.946-1.946 1.843-0.41 2.048-24.474 0.102-20.89 0-20.378 5.222-17.92 1.126 0.512 8.704 3.584 16.896 6.656 19.046 7.475 18.637 7.578 23.347-6.349 3.686-10.854 3.789-14.848 0.512-16.179-1.024-0.41-9.626-3.379-19.149-6.758-9.523-3.277-17.408-6.144-17.613-6.246-0.102-0.205 5.018-7.578 11.469-16.589 6.963-9.626 11.674-17.203 11.674-18.637 0-2.56-3.277-6.042-12.288-12.698-5.837-4.301-7.885-4.915-10.445-2.765-0.922 0.614-6.554 8.499-12.493 17.408-6.042 8.806-11.264 16.077-11.674 16.077s-4.403-5.837-8.909-12.902c-10.957-17.306-14.029-21.299-16.589-21.709-1.331-0.205-5.12 1.946-10.24 5.837-9.933 7.475-10.957 8.602-10.24 11.571 0.41 1.331 5.734 9.421 11.981 18.022 6.144 8.704 11.059 16.077 10.752 16.589-0.205 0.41-1.536 1.024-2.765 1.331-6.042 1.331-32.154 11.162-33.792 12.698-2.458 2.253-2.355 3.379 1.331 14.438 3.174 9.523 5.018 12.493 7.578 12.493 1.434 0 14.848-5.12 29.082-11.162 4.198-1.741 7.68-3.174 7.885-3.174s0.41 9.523 0.41 21.197c0 26.317-0.819 24.883 13.926 24.883 8.192 0 10.854-0.307 12.083-1.638zM870.4 384v-12.8h-102.4v25.6h102.4v-12.8z" />
+<glyph unicode="&#xea26;" glyph-name="Internet_security_server" d="M93.286 855.859c-2.56-0.922-6.451-3.584-8.909-6.042-7.782-8.090-7.578-5.53-7.578-81.818 0-60.416 0.205-68.301 1.741-72.704 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.099-1.638 380.621 0 413.696 0.102 418.304 1.638 5.222 1.843 11.571 7.373 14.541 12.902 1.741 3.174 1.843 8.192 2.15 72.909 0.307 75.878 0.41 74.24-5.53 82.022-1.536 2.048-4.915 4.915-7.475 6.451l-4.71 2.765-415.744 0.205c-374.886 0.102-416.154 0-420.25-1.434zM182.272 802.611c8.499-3.994 14.848-10.342 18.842-18.739 2.765-5.837 3.072-7.782 3.174-15.872 0-8.294-0.307-9.933-3.174-15.872-4.096-8.499-10.445-14.848-18.842-18.842-5.939-2.765-7.68-3.174-15.872-3.174s-9.933 0.307-15.872 3.174c-17.101 8.090-26.112 27.443-21.094 44.851 5.12 17.613 19.968 28.365 38.502 27.853 6.246-0.102 8.909-0.717 14.336-3.379zM93.286 651.059c-2.56-0.922-6.451-3.584-8.909-6.042-7.782-8.090-7.578-5.53-7.578-81.818 0-60.416 0.205-68.301 1.741-72.704 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.099-1.638s413.798 0.102 418.099 1.638c2.765 0.922 6.758 3.482 9.318 6.042 7.987 7.68 7.782 5.837 7.782 81.818 0 36.659-0.512 68.506-1.024 70.656-1.229 5.632-6.042 11.878-11.776 15.462l-4.915 3.072-415.846 0.205c-374.989 0.102-416.256 0-420.352-1.434zM182.374 597.811c8.397-3.994 14.746-10.342 18.739-18.739 2.765-5.939 3.174-7.68 3.174-15.872s-0.307-9.933-3.174-15.872c-14.336-29.798-55.296-29.798-69.427 0-2.765 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c9.318 19.558 31.642 27.75 50.688 18.739zM93.286 446.259c-4.915-1.741-11.264-7.475-14.131-12.8-1.741-3.174-1.843-7.885-1.843-74.547v-71.168l2.355-4.813c2.662-5.427 8.602-10.65 14.336-12.698 3.072-1.126 33.69-1.331 159.744-1.434h155.853l0.102 16.691c0 18.637 0.205 20.582 2.56 31.437 8.602 39.629 41.37 70.861 82.022 78.234 11.059 2.048 32.256 1.331 42.189-1.331 43.008-11.571 72.397-45.466 77.312-89.19 0.307-2.56 0.512-11.674 0.512-20.173l0.102-15.667h155.443c174.797 0 161.485-0.614 169.779 7.782 7.68 7.68 7.578 6.042 7.578 82.432 0 73.011 0.102 71.68-5.734 79.36-1.536 1.946-4.915 4.813-7.475 6.349l-4.71 2.765-415.744 0.205c-373.043 0.102-416.154 0-420.25-1.434zM182.374 393.011c8.294-3.891 14.541-10.138 18.739-18.739 2.867-5.939 3.174-7.578 3.174-15.872-0.102-8.090-0.41-10.035-3.174-15.872-3.994-8.397-10.342-14.746-18.842-18.842-5.939-2.765-7.68-3.174-15.872-3.174s-9.933 0.307-15.872 3.174c-8.499 3.994-14.848 10.342-18.842 18.842-2.765 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c9.318 19.558 31.539 27.75 50.688 18.739zM499.712 370.176c-32.973-5.632-58.47-31.744-63.898-65.536-0.307-1.434-0.512-15.77-0.512-31.949l-0.102-29.491h-51.2l0.205-100.557 0.307-100.659 3.174-6.656c3.994-8.499 10.342-14.848 18.842-18.842l6.656-3.174 226.816-0.512-0.205 100.557-0.307 100.659-3.174 6.656c-4.096 8.499-10.445 14.848-18.739 18.739-5.837 2.765-8.090 3.174-17.715 3.584l-11.059 0.512-0.102 28.774c-0.102 31.232-0.102 31.744-2.662 41.574-9.626 37.581-48.23 62.771-86.323 56.32zM521.421 339.354c8.602-1.843 16.179-6.042 22.835-12.698 3.379-3.379 7.27-8.397 8.602-11.059 4.71-9.83 5.222-13.824 5.222-43.93v-28.467h-92.365l0.512 31.027c0.41 32.666 0.41 32.358 5.734 42.701 3.174 6.042 12.698 15.258 19.046 18.33 9.83 4.915 20.173 6.246 30.413 4.096zM522.752 184.73c11.162-4.198 19.968-16.486 19.968-27.955 0-9.83-5.53-20.787-12.8-25.395l-3.686-2.355 0.614-8.397c0.307-4.71 0.819-9.523 1.024-10.752 0.205-1.331 0.614-6.042 1.024-10.445s0.819-8.909 1.024-9.83c0.205-0.922 0.614-5.12 0.922-9.318 0.41-4.198 0.922-9.523 1.229-11.878l0.614-4.403h-41.267l0.614 5.939c0.307 3.174 0.819 7.475 1.024 9.421s0.717 6.861 1.024 10.752c0.41 3.994 0.819 8.294 1.024 9.728s0.922 8.499 1.638 15.872c1.126 12.39 1.126 13.312-0.614 14.336-10.854 6.246-16.896 20.582-13.824 33.075 4.301 18.022 23.142 28.058 40.448 21.606zM76.8 76.8v-38.4h281.6v76.8h-281.6v-38.4zM665.6 76.8v-38.4h281.6v76.8h-281.6v-38.4z" />
+<glyph unicode="&#xea27;" glyph-name="internet_usage" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-54.067-4.198-109.056-19.456-158.413-44.134-20.378-10.24-25.805-13.312-49.971-29.082-30.822-19.968-69.325-55.296-94.925-87.142-46.899-58.368-77.619-126.157-90.317-199.987-1.126-6.246-2.355-14.234-2.662-17.613-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c2.765 2.253 7.987 6.861 11.571 10.24 62.464 57.856 105.677 129.229 127.078 210.227 2.56 9.626 7.68 33.69 8.704 40.448 0.307 2.765 0.819 5.939 1.024 7.066 0.307 1.126 0.717 4.71 1.024 7.885 0.41 3.174 0.819 6.861 1.126 8.294 1.946 11.571 2.662 62.054 1.126 80.896-1.024 13.824-4.403 39.014-6.758 50.176-11.674 57.344-32.973 109.056-64.512 156.672-3.174 4.813-6.042 9.216-6.554 9.728-0.41 0.614-4.403 5.837-8.806 11.776-55.501 73.83-134.246 128.512-223.334 155.136-18.637 5.53-44.954 11.366-61.030 13.312-2.765 0.41-5.734 0.819-6.554 1.024s-5.222 0.717-9.728 1.126c-4.506 0.307-9.318 0.819-10.752 1.126-3.174 0.512-61.030 1.434-61.542 0.922zM633.344 823.091c32.358-10.342 68.096-27.546 96.768-46.694 6.554-4.403 21.299-14.95 23.859-17.101 0.512-0.41-1.434-2.355-4.301-4.403-5.939-4.301-8.192-7.27-8.909-12.186-0.717-4.198 2.765-9.011 8.909-12.083 5.222-2.662 8.704-2.56 14.131 0.512 4.71 2.765 9.933 3.277 12.39 1.229 4.915-3.789 6.451-9.83 3.379-13.21-1.638-1.843-6.349-2.56-6.554-1.024-0.102 0.41-0.307 2.048-0.512 3.789-0.614 5.837-6.349 6.861-11.469 2.15-2.458-2.253-2.56-3.789-0.41-10.547 0.922-2.765 0.717-3.789-0.717-5.632-1.536-1.843-2.97-2.253-9.114-2.355-7.885-0.205-9.114-0.819-22.733-10.547-11.366-8.090-14.438-9.421-24.883-10.547-19.354-2.048-20.582-5.427-5.12-14.234 5.632-3.174 9.011-7.987 7.987-11.162-0.307-1.024-1.638-2.867-3.072-4.198-3.174-2.97-9.114-3.174-21.197-0.614-7.475 1.638-9.421 1.741-11.981 0.614-3.789-1.536-3.891-1.946-0.717-6.656 5.018-7.373 7.68-21.606 5.325-28.877-0.717-2.253-0.614-2.355 5.222-1.741 3.277 0.307 8.499 0.102 11.571-0.41 7.168-1.331 9.933 0.102 10.854 5.734 0.819 5.222 7.475 12.288 13.107 13.926 3.994 1.126 4.403 1.536 7.782 8.806 0.717 1.536 2.048 1.638 12.39 1.024 1.946-0.102 7.68 1.024 12.595 2.458 4.915 1.536 9.83 2.458 10.854 2.15s2.765-2.15 3.891-3.994c1.946-3.174 11.674-9.83 14.541-9.83 2.048 0 17.408-9.421 18.33-11.162 1.434-2.765-0.512-6.246-3.686-6.451-1.536 0-5.222-0.205-8.090-0.307-2.867-0.205-6.042-0.717-7.066-1.229-1.536-0.922-1.434-1.126 0.717-2.56 4.813-3.072 8.602-3.789 11.674-2.253 1.638 0.922 3.174 1.843 3.482 2.253s2.253 2.048 4.403 3.584c3.174 2.458 3.789 3.482 3.789 6.758 0 2.048 0.512 4.301 1.126 4.915 0.717 0.717 0.922 1.946 0.614 2.765-0.922 2.253-8.294 5.734-12.083 5.734-2.355 0-3.891 0.819-5.837 3.277-1.536 1.843-4.506 4.915-6.554 6.963-7.168 6.758-3.686 10.138 5.734 5.734 3.072-1.434 6.861-3.686 8.499-5.018 1.536-1.331 6.861-4.403 11.878-6.861 7.066-3.584 9.114-5.018 9.523-7.066 1.536-6.963 2.662-8.909 6.963-11.776 3.174-2.15 4.813-4.198 5.632-6.861 2.048-6.861 5.018-7.168 12.186-1.024 2.867 2.56 2.867 3.482-0.307 5.222-3.174 1.638-4.301 5.53-2.458 7.782 1.638 1.946 4.403 3.072 9.523 3.891 4.915 0.819 8.499-2.458 9.421-8.602 0.819-5.12 4.915-9.626 12.288-13.517 5.018-2.56 5.325-3.072 9.318-12.8 6.349-15.258 6.349-14.029-0.614-15.565-3.379-0.717-7.885-1.126-10.035-0.819-9.728 1.229-17.818 3.072-25.907 5.939-6.554 2.355-9.933 3.072-13.619 2.662-5.427-0.512-7.27-2.048-8.909-8.090-1.331-4.608-2.97-5.018-10.138-2.662-3.072 1.024-6.656 1.843-7.987 1.843-1.229 0-4.198 1.638-6.349 3.584-4.506 4.096-7.066 5.018-16.179 6.144-3.379 0.41-7.68 1.638-9.523 2.662-2.867 1.741-3.174 2.458-2.56 4.813 1.229 4.608 0.819 10.547-0.922 13.312-0.512 0.922-40.96 0.717-42.394-0.205-0.512-0.307-2.458-0.819-4.403-1.126-10.138-1.638-11.776 1.024 17.613-28.467 14.643-14.643 28.774-29.594 31.232-33.075 19.354-27.034 21.811-64.102 6.451-94.106-1.741-3.379-3.891-6.963-4.813-7.987-1.331-1.536-1.331-2.355-0.205-5.734 0.922-2.867 1.024-5.53 0.307-9.523-0.512-3.072-0.819-7.782-0.717-10.445 0.512-8.909 2.048-11.878 14.541-29.696 6.349-9.114 8.806-15.667 8.806-23.654 0-6.554-0.41-7.987-5.325-17.818-7.475-14.95-7.066-19.251 3.277-36.352 2.765-4.506 6.349-12.595 8.294-18.637 1.946-5.837 5.12-13.107 7.168-16.282 2.048-3.072 5.632-9.83 7.885-15.053 9.933-22.528 16.589-27.238 26.624-18.739 3.379 2.867 3.891 2.97 9.216 1.536l3.789-1.126-7.68-11.981c-29.798-45.978-69.837-86.118-115.712-116.224-47.104-30.822-100.25-51.2-155.546-59.494-24.064-3.686-34.509-4.403-59.904-4.403-28.365-0.102-47.002 1.638-72.704 6.451-104.346 19.661-196.403 80.691-255.693 169.37-32.666 49.050-53.965 105.37-62.157 164.352-2.662 19.354-2.765 20.89-3.174 49.152-0.41 28.058 0.512 42.496 4.096 65.536 2.048 13.005 2.355 14.234 3.891 13.005 0.717-0.614 3.686-1.741 6.656-2.56 2.97-0.922 6.656-2.355 8.192-3.174 3.379-1.843 17.101-7.168 20.89-8.192 1.536-0.307 5.427 0.102 8.602 0.922 3.277 0.819 6.246 1.536 6.554 1.536 0.41 0 2.765-1.946 5.222-4.198 5.325-5.018 10.138-7.27 20.48-9.626 14.95-3.277 14.95-3.277 18.432-8.499 4.096-6.042 11.264-12.902 15.872-15.053 2.765-1.331 17.818-4.608 21.094-4.608 0.41 0 2.97 2.253 5.734 5.018l5.12 5.12-5.325 1.638c-7.373 2.355-12.698 5.632-23.245 14.438-10.854 9.114-19.149 15.053-23.347 16.794l-3.072 1.229 0.205 10.445c0.102 11.264-0.307 12.595-3.994 14.029-3.482 1.229-7.68-0.614-15.258-6.963-3.379-2.765-7.68-5.632-9.626-6.246-15.462-5.325-27.853 8.090-26.522 28.774 0.41 5.837 1.126 8.806 3.174 12.186 7.475 12.8 24.166 20.582 44.237 20.48 17.715 0 30.208-5.222 39.322-16.179 4.096-5.018 6.042-6.554 7.68-6.349 2.048 0.307 2.15 0.819 2.253 12.595 0 6.758 0.41 13.722 0.819 15.462 0.717 3.277 4.301 7.066 11.366 12.186 5.222 3.789 5.734 4.506 10.445 13.824l3.891 7.68-1.843 5.632c-6.042 18.022 2.662 37.478 20.787 45.978 5.222 2.458 6.861 2.662 24.576 3.174l18.944 0.512-5.325 2.355c-2.867 1.229-6.144 2.355-7.168 2.355-1.024 0.102-0.205 0.512 1.741 0.819 1.946 0.41 6.861 0.102 10.752-0.614 10.342-1.946 14.643-1.741 14.438 0.41-0.205 3.174 20.685 8.909 25.498 7.066 1.536-0.512 1.434-0.922-0.41-3.584-1.229-1.638-2.458-4.403-2.765-6.144l-0.614-3.174h14.438c7.885 0 14.438 0.205 14.438 0.41s-2.253 1.843-5.018 3.584c-6.246 3.994-7.885 6.451-8.704 12.902-1.331 10.138-2.97 11.981-13.926 16.282-5.12 2.048-8.192 4.096-11.878 7.987-15.258 16.077-19.456 18.227-30.106 15.155-5.734-1.638-13.619-1.434-17.51 0.512-1.946 1.024-5.53 3.482-8.090 5.632-9.83 8.090-20.582 12.39-31.437 12.493-8.090 0.102-15.667-1.741-15.667-3.686 0-0.819 1.434-6.861 3.174-13.517 4.813-18.739 4.813-18.944-1.843-20.378-4.198-0.819-7.885-5.222-6.963-8.192 1.741-5.427 1.741-6.758 0-8.704-3.379-3.789-5.837-2.56-14.643 7.066-7.168 7.782-9.011 9.216-13.21 10.342-2.662 0.614-5.632 1.434-6.451 1.741-1.741 0.512 12.083 14.336 28.16 28.058 15.974 13.619 17.92 14.848 23.552 15.667 10.752 1.638 13.824 1.126 29.184-5.018 8.090-3.277 13.824-4.915 18.432-5.222 3.686-0.307 7.27-0.717 7.987-0.922 2.97-1.024 0.922 1.229-2.355 2.458-5.12 1.843-4.608 3.584 0.819 2.662 6.758-1.229 10.957-1.434 11.571-0.41 1.126 1.843 6.861 4.198 11.571 4.71 5.325 0.614 13.619 5.939 15.872 10.445 0.819 1.434 1.331 5.325 1.331 8.602-0.102 5.325-0.41 6.246-2.662 7.68-3.686 2.355-4.608 4.198-4.301 8.499 0.205 3.584 0 3.789-5.12 5.939-2.867 1.331-6.861 2.56-8.704 2.867-6.349 1.024-5.53 1.536 14.746 9.626l12.595 5.12 4.608-2.048c7.987-3.584 12.493-7.782 13.414-12.698 1.024-5.018 3.174-5.837 9.933-3.789 3.482 1.024 4.096 0.922 4.915-0.41 0.614-1.024 2.355-1.638 4.71-1.638 4.198-0.102 8.397-2.458 6.758-3.994-0.512-0.614-2.97-1.126-5.53-1.331l-4.608-0.307 4.301-1.331c2.355-0.717 4.608-1.741 4.915-2.253s-1.434-1.946-3.891-3.072c-12.8-6.042-11.981-14.643 2.56-28.262 12.493-11.674 23.757-17.715 34.714-18.534 10.24-0.819 12.8 0.819 20.89 13.107 4.096 6.246 8.192 11.059 10.547 12.595 4.71 3.174 21.299 8.602 37.581 12.39 6.758 1.536 16.896 4.198 22.528 5.837 5.632 1.741 14.746 4.096 20.378 5.325 6.349 1.434 9.523 2.56 8.397 2.97-1.024 0.41-2.662 0.717-3.686 0.717s-3.174 0.512-4.813 1.229c-2.56 1.126-1.946 1.331 6.554 1.843 10.035 0.614 11.571 1.126 9.523 3.482-0.922 1.229-0.922 2.56 0.102 6.656 1.229 4.915 1.331 5.018 7.066 6.554 3.174 0.922 6.554 2.56 7.475 3.584 1.741 1.946 1.741 2.15 0 5.837-1.126 2.355-1.434 4.096-0.819 4.301s2.867 1.229 5.12 2.253c4.608 2.048 6.042 1.741 29.696-5.734zM677.171 729.498c-6.861-2.048-8.909-9.011-3.789-13.107 1.331-1.024 2.458-2.458 2.458-3.072 0-0.922 4.198-3.789 4.915-3.379 1.434 1.024 5.325-2.15 5.325-4.403 0-0.819-1.229-1.536-2.765-1.741-2.048-0.205-2.97-0.922-3.174-2.56-0.205-1.229-1.024-2.765-1.843-3.379-2.048-1.741-1.741-3.072 0.614-3.072 2.867 0 2.56-1.126-1.024-4.608-2.253-2.15-3.072-3.789-2.867-5.632 0.41-3.277 2.662-2.97 9.011 1.024 5.222 3.277 11.366 4.608 18.944 4.198 6.144-0.307 9.728 2.253 9.728 7.066 0 2.458-0.512 3.174-2.765 3.686-2.355 0.614-19.763 16.794-19.763 18.33 0 0.307 0.717 1.946 1.536 3.482 1.741 3.584 1.229 4.198-3.686 4.198-2.867 0-3.891 0.512-4.301 2.048-0.614 2.253-1.536 2.355-6.554 0.922zM381.952 646.861l-33.28-0.205 79.462-79.462-69.018-69.018c-37.888-37.99-70.861-71.68-73.114-74.752-12.288-16.486-17.408-36.045-13.619-52.736 2.458-11.059 6.349-16.077 32.768-42.701l25.19-25.293 163.123 163.123c161.28 161.28 163.021 163.123 160.666 164.659-10.24 6.656-27.136 12.493-39.834 13.619-4.198 0.41-8.704 0.922-10.138 1.126-1.434 0.307-31.539 0.717-67.072 1.024-96.051 0.819-118.579 0.922-155.136 0.614zM529.203 429.261c-161.69-161.894-162.509-162.816-160.256-164.557 9.216-7.168 29.491-13.414 48.333-14.848 13.517-0.922 257.126-1.843 256.205-0.922-0.41 0.512-18.33 18.534-39.834 40.038l-39.014 39.117 69.837 69.939c73.318 73.318 77.517 77.926 82.842 91.955 7.066 18.534 6.042 35.123-3.174 49.152-2.867 4.403-50.79 53.453-51.917 53.146-0.307-0.102-73.626-73.421-163.021-163.021zM308.122 267.571c-0.307-16.998-1.126-20.89-8.704-38.912-5.939-13.926-6.656-18.33-3.482-22.323 1.126-1.434 2.048-3.482 2.048-4.608s-2.56-5.939-5.734-10.752c-5.222-8.090-5.632-9.011-5.018-13.005 0.41-3.174 0.205-5.018-0.922-6.656-4.096-5.734 0-15.974 10.547-26.317 13.005-12.8 28.979-18.432 35.328-12.493 3.482 3.277 4.915 7.27 4.506 12.493-0.307 4.198-0.512 4.506-3.379 4.813-6.861 0.614-7.68 1.126-7.68 4.608 0 1.741 1.843 7.168 4.096 11.981 4.096 8.806 4.915 12.698 3.072 13.824-1.638 1.024-1.229 6.963 0.614 9.728 3.686 5.53 10.445 11.571 17.306 15.565 3.994 2.355 9.114 5.837 11.571 7.782l4.301 3.584-4.813 2.56c-12.595 6.656-26.522 20.48-30.003 29.594-2.662 7.066-3.482 15.053-2.253 20.48l1.024 4.403-2.765-0.717c-3.482-0.922-13.21-0.819-16.691 0l-2.867 0.717-0.102-6.349z" />
+<glyph unicode="&#xea28;" glyph-name="Interventions" d="M498.176 882.995c-26.214-5.837-45.67-21.197-56.115-44.032l-2.662-5.939h-29.594c-33.792 0-36.25-0.41-43.52-7.578-7.987-7.68-7.885-7.066-7.885-67.379v-53.043h307.302l-0.307 55.091-0.307 54.989-2.97 4.915c-1.536 2.662-4.403 6.042-6.144 7.373-6.861 5.222-9.83 5.632-41.779 5.632h-29.594l-1.946 4.71c-9.011 20.992-28.774 37.99-51.405 44.032-7.27 1.946-26.624 2.662-33.075 1.229zM525.107 829.235c19.046-11.776 15.258-39.629-6.349-46.387-4.915-1.536-13.517-0.819-18.125 1.638-4.096 2.048-9.523 7.475-11.571 11.366-5.53 10.854-1.229 26.726 9.114 33.075 8.090 5.018 19.149 5.12 26.931 0.307zM245.248 780.595c-18.33-3.482-35.226-20.378-39.322-39.219-0.717-3.584-1.024-107.622-1.126-344.678 0-372.122-0.512-343.142 5.939-356.25 3.482-7.27 14.336-18.125 21.811-21.811 12.493-6.246-6.758-5.837 277.914-5.837 183.296 0 263.066 0.307 267.264 1.126 19.866 3.584 37.069 20.992 40.448 40.858 0.819 4.813 1.024 102.195 0.819 347.136l-0.307 340.48-2.662 6.349c-7.066 16.282-20.070 27.75-35.942 31.539-5.12 1.229-14.848 1.536-47.616 1.536h-41.267v-102.4h-358.4v102.4l-41.165-0.102c-22.733-0.102-43.52-0.614-46.387-1.126zM535.552 551.834c44.749-5.222 86.426-25.498 118.886-57.754 5.939-5.939 12.083-12.493 13.619-14.541 1.638-2.15 3.379-3.891 3.891-3.891 0.614 0 10.24 9.216 21.504 20.48 11.162 11.264 20.582 20.48 20.89 20.48 0.205 0 0.307-22.938 0.205-50.893-0.307-49.971-0.307-51.098-2.56-55.091-2.662-5.018-5.632-7.782-11.264-10.65-4.198-2.15-5.427-2.15-54.989-2.15h-50.688l21.402 21.402 21.402 21.299-6.349 7.578c-8.192 9.83-13.926 15.667-22.221 22.426-20.378 16.691-45.773 28.16-73.728 33.28-7.578 1.434-38.4 1.434-47.104 0.102-35.84-5.632-64.717-20.685-90.214-46.899-20.992-21.606-35.84-51.302-41.37-82.739-1.434-8.294-1.741-34.099-0.614-43.315 9.318-70.246 61.338-123.904 131.174-135.373 8.397-1.331 29.082-1.741 39.936-0.614 59.392 5.734 112.026 47.821 131.072 104.55 5.632 16.794 7.27 26.419 7.885 46.592 0.819 27.238 1.434 27.853 26.624 27.546 20.685-0.307 22.016-1.741 21.709-24.269-0.307-28.16-5.325-53.146-15.36-77.414-28.058-67.379-89.395-114.483-162.202-124.518-17.818-2.458-45.773-1.536-64.512 2.15-63.283 12.39-116.019 52.736-144.384 110.49-14.029 28.672-19.968 53.248-20.48 85.504-0.307 20.070 0.307 27.853 3.686 45.056 12.083 60.723 53.555 114.278 109.978 141.824 22.528 11.059 45.158 17.613 67.584 19.558 3.994 0.307 7.373 0.819 7.578 0.922 0.922 0.922 28.672 0.102 39.014-1.126zM520.499 459.674c6.451-2.15 13.21-8.909 15.36-15.258 1.536-4.403 1.741-10.957 1.741-53.146v-48.128l23.962-23.757c20.48-20.378 24.166-24.371 25.6-28.672 4.096-12.186-0.512-24.576-11.674-30.925-6.451-3.584-16.896-3.789-23.757-0.41-6.656 3.277-59.187 55.91-62.464 62.566-2.355 4.71-2.355 4.915-2.662 60.006-0.307 58.573-0.102 61.338 4.506 68.301 2.56 3.994 8.909 8.704 13.722 10.138 4.301 1.229 10.65 1.024 15.667-0.717z" />
+<glyph unicode="&#xea29;" glyph-name="IT_infrastructure" d="M144.384 856.883c-14.336-2.458-29.901-14.131-36.352-27.341-5.939-12.186-5.632 6.349-5.632-278.323 0-187.802 0.307-263.373 1.126-267.264 3.994-19.149 20.48-35.635 39.629-39.629 3.789-0.819 51.507-1.126 161.485-1.126h156.16v-102.4h-40.346c-43.622 0-45.261-0.205-52.531-5.734-1.843-1.331-4.608-4.71-6.144-7.373l-2.867-4.813v-92.16l2.765-4.71c3.174-5.427 8.192-9.626 14.234-11.674 6.144-2.253 264.294-2.253 271.462-0.102 6.246 1.843 11.571 6.042 14.95 11.776l2.765 4.71 0.307 43.725c0.205 28.262-0.102 45.158-0.717 47.718-1.638 5.734-6.451 11.981-12.083 15.258l-4.915 2.867-84.48 0.614v102.298h156.467c170.394 0 161.075-0.307 174.080 5.632 12.186 5.632 24.166 21.504 26.726 35.738 1.638 8.704 1.536 524.698 0 532.275-3.994 19.149-20.48 35.635-39.629 39.629-3.891 0.819-107.213 1.126-369.664 1.024-200.294-0.102-365.363-0.41-366.797-0.614zM870.4 576v-230.4h-716.8v460.8h716.8v-230.4zM524.902 316.416c15.155-8.909 16.794-31.334 2.97-41.882-14.541-11.059-35.84-4.198-40.55 13.107-1.434 5.12-0.614 13.619 1.638 17.92 2.56 5.12 9.011 10.957 13.926 12.8 6.451 2.253 16.179 1.434 22.016-1.946zM76.8 76.8v-38.4h256v76.8h-256v-38.4zM691.2 76.8v-38.4h256v76.8h-256v-38.4z" />
+<glyph unicode="&#xea2a;" glyph-name="keeper" d="M495.514 882.79c-0.205-0.205-3.379-0.717-7.066-1.024-34.202-3.584-70.042-18.022-99.226-39.936-40.243-30.208-68.096-74.342-77.824-122.982-4.096-20.685-4.096-20.275-4.096-86.733l-0.102-56.115h-102.4v-245.453c0-157.696 0.41-248.115 1.024-252.621 3.686-25.6 21.709-48.64 45.773-58.88 15.155-6.451-4.915-6.042 294.502-6.144l273.101-0.102v245.453c0 154.522-0.41 248.115-1.024 252.518-3.584 24.883-20.582 47.309-44.032 58.266-10.854 5.12-16.589 6.144-37.581 6.656l-19.763 0.512-0.102 56.013c0 30.72-0.205 58.266-0.41 61.030-2.355 28.16-10.547 56.627-23.245 80.384-31.744 59.29-87.347 98.099-154.931 108.032-4.813 0.717-41.984 1.741-42.598 1.126zM537.088 803.84c25.498-5.325 46.49-16.794 65.126-35.43 14.848-14.848 27.75-36.352 32.666-54.272 4.403-15.974 4.301-14.746 4.813-77.414l0.41-60.723h-256.205l0.41 60.211c0.307 56.627 0.512 60.621 2.56 69.325 5.734 24.678 17.101 45.158 35.43 63.386 20.685 20.685 46.694 33.178 76.39 36.864 7.373 0.922 30.515-0.307 38.4-1.946zM543.744 471.962c31.13-4.608 56.013-14.541 79.36-31.642 11.981-8.806 20.48-17.203 32.358-32.051 5.427-6.758 15.872-26.522 19.558-37.069 9.933-28.774 10.445-63.59 1.331-91.341-9.011-27.648-25.293-48.742-50.278-65.434-22.938-15.36-39.526-20.378-65.434-19.968-10.24 0.102-10.445 0.205-17.408 4.403-10.445 6.349-15.258 11.059-17.306 16.998l-1.229 3.584-6.451-5.018c-8.806-6.861-15.565-10.547-25.19-13.824-13.517-4.506-31.13-3.994-44.646 1.229-15.053 5.939-29.184 20.787-34.714 36.454-10.138 29.082-0.307 73.318 23.245 104.141 8.806 11.674 25.498 26.726 38.195 34.611 15.462 9.626 32.256 14.746 48.026 14.746 17.408 0.102 25.702-3.072 36.147-13.619 6.758-6.861 6.758-6.861 8.294-4.608 10.342 15.462 31.437 21.504 43.418 12.39 7.68-5.837 8.704-14.541 3.686-32.666-1.741-6.144-5.734-21.197-8.909-33.28-3.277-12.083-6.554-24.269-7.373-27.136-2.355-8.192-14.746-55.194-14.746-56.013 0-1.229 9.011 1.946 15.053 5.325 17.715 9.933 33.997 29.389 40.141 47.718 6.861 20.787 5.734 50.074-3.072 73.933-9.523 26.010-30.72 48.845-57.958 62.566-29.901 14.95-68.915 17.306-102.912 6.144-36.352-11.981-69.222-40.858-85.402-75.059-3.994-8.499-8.090-19.558-9.216-24.678-6.042-27.341-4.813-59.085 3.277-84.992 14.336-45.158 50.278-80.384 95.642-93.491 14.95-4.403 24.064-5.632 38.912-5.632 42.701 0.102 82.944 18.33 121.344 54.989 15.872 15.155 24.371 19.763 32.768 17.613 3.277-0.819 5.734-5.939 5.12-10.65-2.458-19.558-41.882-57.958-77.414-75.674-17.306-8.602-32.563-13.619-52.429-17.306-9.83-1.843-44.237-2.867-50.893-1.536-2.56 0.512-8.602 1.741-13.517 2.662-18.33 3.379-39.936 12.186-58.368 23.757-54.272 34.099-83.456 89.088-83.558 157.491 0 23.040 2.97 39.322 10.854 58.88 21.709 54.579 67.174 94.515 123.904 109.056 21.197 5.325 47.821 6.963 67.789 3.994zM506.368 340.070c-7.885-2.56-13.005-5.837-19.968-13.107-14.848-15.155-23.859-42.803-19.354-59.699 2.458-9.523 5.53-13.414 13.312-16.794 12.902-5.734 29.594-1.536 42.803 10.752 13.824 12.698 21.914 31.334 21.914 50.483 0 19.558-8.397 28.979-26.419 29.491-4.71 0.205-9.933-0.307-12.288-1.126z" />
+<glyph unicode="&#xea2b;" glyph-name="keyboard" d="M117.248 728.371c-13.21-2.458-28.877-14.541-34.714-26.522-6.042-12.595-5.734 4.096-5.734-253.030 0-169.062 0.307-237.773 1.126-241.664 3.891-18.637 18.944-34.202 37.888-39.219 4.71-1.331 61.133-1.536 395.366-1.536 281.19 0 391.373 0.307 395.264 1.126 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 474.010 0 481.69-4.096 19.558-20.89 36.147-40.243 39.629-7.987 1.434-781.005 1.331-788.582-0.102zM223.949 676.352c6.349-3.891 6.554-5.018 6.246-37.786-0.307-27.955-0.41-29.696-2.355-31.846-4.198-4.71-6.861-5.12-36.352-5.12-30.72 0-32.154 0.205-35.84 6.451-1.946 3.072-2.048 5.325-2.048 31.949 0 31.437 0.102 32.051 6.042 36.045 3.379 2.355 3.994 2.355 32.256 2.355 26.726 0 28.979-0.102 32.051-2.048zM351.334 676.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM479.334 676.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM607.334 676.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-31.437-0.102-32.051-6.042-36.045-3.379-2.355-3.994-2.355-32.358-2.355s-28.979 0-32.358 2.355c-5.939 3.994-6.042 4.71-6.042 35.84 0 29.901 0.205 31.642 4.71 35.635 1.126 1.024 2.867 1.946 3.994 2.253 1.126 0.205 14.643 0.512 30.003 0.614 23.45 0.102 28.467-0.205 31.027-1.434zM735.334 676.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM864.358 676.045c5.939-3.994 6.042-4.608 6.042-36.045 0-40.96 2.56-38.4-38.912-38.4-40.448 0-37.888-2.56-37.888 38.605 0 31.13 0.102 31.846 6.042 35.84 3.379 2.355 3.994 2.355 32.358 2.355s28.979 0 32.358-2.355zM223.334 548.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM350.72 548.966c1.946-0.819 4.506-3.072 5.632-4.915 1.946-3.174 2.048-5.12 2.048-32.051 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 32.051 0 28.262 0 28.877 2.355 32.256 3.994 5.837 4.71 6.042 35.328 6.042 22.016 0 28.672-0.307 31.437-1.434zM479.334 548.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-31.437-0.102-32.051-6.042-36.045-3.379-2.355-3.994-2.355-32.358-2.355s-28.979 0-32.358 2.355c-5.939 3.994-6.042 4.608-6.042 36.045s0.102 32.051 6.042 36.045c3.379 2.355 3.994 2.355 32.051 2.355 23.757 0 29.082-0.307 31.642-1.536zM607.334 548.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.96 2.56-38.4-38.707-38.4-28.058 0-28.672 0-32.051 2.355-5.939 3.994-6.042 4.71-6.042 35.84 0 31.539 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM735.334 548.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM866.509 546.509l3.379-3.277 0.307-29.696c0.307-32.87 0.102-33.997-6.246-37.888-3.072-1.946-5.325-2.048-31.744-2.048-31.437 0-32.768 0.205-36.557 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.659 3.072 1.843 4.915 1.946 33.178 1.741l30.003-0.307 3.277-3.379zM275.149 420.352c6.246-3.789 6.451-5.12 6.451-36.352s-0.205-32.563-6.451-36.352c-3.174-1.946-5.53-2.048-57.344-2.048-59.699 0-58.163-0.205-62.157 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.174 1.946 5.53 2.048 57.549 2.048s54.374-0.102 57.549-2.048zM415.846 420.864c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.325 2.048-31.949 0-40.96 2.56-38.4-38.707-38.4-28.058 0-28.672 0-32.051 2.355-5.939 3.994-6.042 4.608-6.042 36.045s0.102 32.051 6.042 36.045c3.379 2.355 3.994 2.355 32.051 2.355 23.757 0 29.082-0.307 31.642-1.536zM543.744 421.069c1.331-0.717 3.584-2.867 4.813-4.71 2.355-3.379 2.355-3.994 2.355-32.256 0-41.062 2.458-38.502-38.4-38.502-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.949 2.048 20.89 0 29.389-0.41 31.232-1.331zM672.87 420.045c5.939-3.994 6.042-4.608 6.042-36.045 0-40.858 2.458-38.4-38.4-38.4-31.232 0-32.563 0.205-36.352 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 32.051 2.048 28.262 0 28.877 0 32.256-2.355zM864.358 420.045c5.939-3.994 6.042-4.71 6.042-35.84 0-31.539-0.205-32.768-6.451-36.557-3.174-1.946-5.53-2.048-57.344-2.048-59.699 0-58.163-0.205-62.157 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.174 1.946 5.53 2.048 57.651 2.048h54.374l3.482-2.355zM223.232 293.069c1.331-0.717 3.584-2.867 4.813-4.71 2.355-3.379 2.355-3.994 2.355-32.256 0-31.539-0.102-32.154-6.042-36.147-3.379-2.355-3.994-2.355-32.358-2.355s-28.979 0-32.358 2.355c-5.939 3.994-6.042 4.71-6.042 35.84 0 31.539 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 31.949 2.048 20.89 0 29.389-0.41 31.232-1.331zM735.949 292.352c6.246-3.789 6.451-5.018 6.451-36.557 0-31.13-0.102-31.846-6.042-35.84l-3.482-2.355h-220.57c-243.712 0-224.461-0.512-228.659 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.174 2.048 6.861 2.048 223.949 2.048s220.774 0 223.949-2.048zM864.358 292.045c5.939-3.994 6.042-4.608 6.042-36.045s-0.102-32.051-6.042-36.045c-3.379-2.355-3.994-2.355-32.051-2.355-31.642 0-32.87 0.205-36.659 6.451-1.946 3.072-2.048 5.325-2.048 31.744 0 31.437 0.205 32.768 6.451 36.557 3.072 1.946 5.325 2.048 32.051 2.048 28.262 0 28.877 0 32.256-2.355z" />
+<glyph unicode="&#xea2c;" glyph-name="Keypad" d="M145.818 830.566c-5.939-1.843-11.264-6.246-14.541-11.776l-2.765-4.71-0.307-82.33c-0.307-93.389-0.614-88.883 7.68-96.973 8.192-7.987 3.789-7.68 96.666-7.373l82.33 0.307 4.096 2.355c4.506 2.662 9.011 7.27 11.674 11.981 1.434 2.765 1.638 11.162 1.946 85.402 0.307 92.979 0.614 88.781-7.475 96.87-7.987 7.987-3.891 7.68-94.618 7.578-62.771 0-81.408-0.307-84.685-1.331zM426.086 830.259c-6.042-2.15-12.493-8.806-14.746-15.155-1.638-4.71-1.741-11.469-1.741-85.606 0-90.624-0.307-86.63 7.68-94.618s4.096-7.68 94.106-7.68c44.339 0 81.715 0.512 83.968 1.024 5.734 1.331 11.878 5.939 15.462 11.776l3.072 4.915 0.307 79.974c0.205 44.032 0 82.432-0.307 85.299-0.819 6.963-5.632 14.131-12.288 18.227l-4.915 3.072-83.046 0.205c-73.216 0.102-83.558 0-87.552-1.434zM707.686 830.259c-2.56-0.922-6.451-3.584-8.909-6.042-7.885-8.192-7.578-4.096-7.578-94.618s-0.307-86.426 7.578-94.618c8.090-8.192 3.686-7.885 96.973-7.578l82.33 0.307 4.71 2.765c5.222 3.072 9.83 8.499 11.776 14.029 1.946 5.325 1.946 164.864 0 170.189-1.946 5.53-6.554 10.957-11.776 14.029l-4.71 2.765-82.944 0.205c-73.216 0.102-83.456 0-87.45-1.434zM145.101 548.762c-6.451-2.048-13.107-8.602-15.36-15.258-1.536-4.506-1.741-13.21-1.741-85.504 0-90.624-0.307-86.426 7.68-94.618 7.782-8.090 4.301-7.782 95.232-7.782 90.214 0 86.221-0.307 94.208 7.68s7.68 3.891 7.68 95.437v81.306l-2.662 5.53c-2.458 5.222-6.758 9.523-12.698 12.902-3.994 2.253-165.274 2.458-172.339 0.307zM426.086 548.659c-4.915-1.741-11.264-7.475-14.131-12.8-1.741-3.174-1.843-8.602-2.15-83.251-0.205-43.93 0-82.33 0.307-85.197 0.819-7.066 5.632-14.131 12.186-18.227l5.018-3.072h169.165l5.018 2.97c5.837 3.482 10.035 9.011 11.776 15.155 0.922 3.277 1.126 25.395 0.922 86.323l-0.307 81.92-2.867 4.813c-3.277 5.632-7.782 9.421-13.926 11.571-6.758 2.355-164.25 2.15-171.008-0.205zM708.301 548.966c-5.632-2.048-10.547-6.246-13.722-11.674l-2.867-4.813-0.307-82.33c-0.307-92.774-0.614-88.474 7.373-96.666s3.686-7.885 94.925-7.885c87.347 0 85.094-0.102 92.672 5.632 1.741 1.331 4.608 4.71 6.144 7.373l2.97 4.915 0.307 82.33c0.307 92.979 0.614 88.474-7.475 96.768-7.782 8.090-4.198 7.782-95.642 7.782-64.512-0.102-81.203-0.41-84.378-1.434zM146.637 267.776c-4.198-1.024-10.957-5.632-13.619-9.318-5.12-7.168-5.018-5.837-5.018-91.955 0-90.931-0.307-86.835 7.782-94.925 7.782-7.782 4.608-7.578 95.027-7.578 51.917 0 81.306 0.41 83.763 1.024 5.734 1.638 12.186 7.066 15.053 12.8l2.662 5.018v168.038l-2.765 4.71c-3.072 5.222-7.68 9.114-13.517 11.571-3.482 1.434-13.005 1.638-84.992 1.536-44.544-0.102-82.534-0.512-84.378-0.922zM426.086 267.059c-2.458-0.922-6.451-3.584-8.806-5.939-7.987-7.987-7.68-3.891-7.68-95.232 0.102-65.638 0.41-81.613 1.536-84.89 2.048-5.939 6.758-11.059 12.902-14.131l5.53-2.765 81.203-0.102c56.115 0 82.432 0.307 85.094 1.126 5.837 1.741 11.571 6.144 14.95 11.674l3.072 4.915v84.582c0 94.925 0.614 87.040-7.68 95.334-7.373 7.373-4.71 7.168-95.13 7.066-70.144 0-81.101-0.307-84.992-1.638zM705.843 266.138c-5.018-2.458-9.421-6.861-12.698-12.698-1.229-2.15-1.434-16.794-1.741-84.89-0.307-92.774-0.614-88.474 7.373-96.666s3.789-7.885 94.822-7.885c90.112 0 86.733-0.307 94.31 7.27 8.192 8.192 7.578 0.41 7.578 95.13v84.48l-2.765 4.71c-1.536 2.56-4.403 5.939-6.349 7.475-7.782 5.939-5.018 5.734-93.696 5.734l-81.51-0.102-5.325-2.56z" />
+<glyph unicode="&#xea2d;" glyph-name="La_Cle" d="M119.808 780.083c-19.763-3.277-36.762-19.354-41.472-39.322-1.331-5.734-1.536-36.966-1.536-254.464 0-164.454 0.307-249.754 1.024-253.44 3.584-18.637 19.968-35.43 38.707-39.322 5.222-1.126 16.282-1.536 47.616-1.536h40.653v-76.8h614.4v76.8h40.96c43.827 0 47.309 0.307 58.163 5.222 7.885 3.584 19.149 14.336 23.142 22.118 6.144 12.186 5.734-5.734 5.734 266.342 0 274.739 0.512 254.874-6.246 267.571-6.554 12.288-16.282 20.378-30.106 24.986l-7.578 2.56-390.451-0.102c-214.733-0.102-391.578-0.41-393.011-0.614zM896 486.4v-243.2h-768v486.4h768v-243.2zM521.933 202.65c5.325-1.946 11.674-8.806 14.131-15.053 4.506-11.878-2.253-26.931-14.234-31.949-5.325-2.253-14.438-2.253-19.558-0.102-12.083 5.12-18.842 20.173-14.336 31.949 5.427 14.234 19.558 20.582 33.997 15.155zM221.389 574.054c-3.584-1.229-6.861-3.379-9.421-6.042-7.373-7.987-7.168-5.837-7.168-81.613 0-76.595-0.205-74.035 7.782-82.022 8.192-8.294-13.414-7.578 250.266-7.373l235.008 0.307 4.813 2.253c2.56 1.331 6.144 3.994 7.885 6.144 3.072 3.789 6.246 11.264 6.246 14.848 0 1.741 2.355 1.843 51.2 1.843h51.2v128h-102.195l-0.717 4.403c-0.922 5.632-4.813 12.288-9.011 15.462-7.987 6.144 9.216 5.734-246.374 5.734-224.461-0.102-234.291-0.102-239.514-1.946zM793.6 486.4v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xea2e;" glyph-name="Language" d="M485.274 857.19c-0.205-0.205-5.837-0.717-12.39-1.024-6.656-0.41-13.107-0.922-14.336-1.126-1.331-0.205-5.12-0.614-8.499-1.024-41.882-4.506-87.45-15.565-127.283-30.822-50.483-19.456-95.642-46.285-133.837-79.667-25.907-22.733-51.2-52.531-68.71-81.101-22.938-37.376-37.171-78.643-41.882-121.754-1.331-12.39-1.536-51.61-0.205-57.344 0.307-1.126 0.819-4.813 1.229-8.192 1.741-15.974 6.042-33.587 12.902-54.272 25.293-75.162 84.378-142.746 165.274-189.133 26.214-15.053 60.006-30.003 88.883-39.322l11.981-3.891v-175.821l153.395 153.395 19.763 0.717c10.957 0.41 20.787 0.922 21.914 1.126s5.53 0.717 9.728 1.024c38.298 2.867 85.402 13.107 125.44 27.136 44.851 15.77 85.914 37.581 122.47 65.024 36.25 27.238 65.024 57.754 88.474 93.696 7.475 11.366 23.142 41.472 27.034 51.712 14.438 37.888 20.173 67.789 20.275 104.96 0.307 79.053-32.87 154.726-94.822 215.962-48.435 47.821-107.622 82.739-178.688 105.472-33.997 10.854-76.288 19.456-108.646 22.118-4.506 0.41-9.523 0.922-11.264 1.126-3.686 0.614-67.686 1.536-68.198 1.024zM551.526 672.358c35.43-7.373 59.29-36.25 58.163-70.349-0.614-17.306-4.915-28.262-15.258-38.81-3.686-3.686-6.656-6.861-6.656-7.066s3.379-1.946 7.578-4.096c16.691-8.192 29.798-27.443 32.87-48.23 1.126-7.168 0.614-21.504-1.024-28.774-2.15-10.24-3.072-12.902-7.066-21.299-9.83-20.378-31.027-39.219-50.586-44.954-10.138-2.867-26.522-2.867-33.997 0.102-13.312 5.222-19.149 18.944-13.722 32.461 2.56 6.451 6.861 9.421 18.33 12.902 19.354 6.042 27.443 13.107 31.846 28.16 2.97 10.24 2.15 21.197-2.253 28.774-5.12 8.806-10.342 11.674-32.461 17.203-13.107 3.379-19.354 10.957-19.354 23.859-0.102 12.902 4.813 19.149 18.637 23.757 9.318 3.174 13.926 5.939 16.998 10.342 9.318 13.517 2.97 31.846-12.8 37.274-11.776 3.994-25.6-1.126-30.31-11.264-4.096-8.602-4.301-13.824-4.403-99.226 0-91.853 0.205-88.371-6.963-96.768-5.222-6.042-10.547-8.499-18.739-8.602-3.686-0.102-8.397 0.41-10.342 1.126-5.12 1.741-11.162 7.885-14.234 14.541l-2.56 5.632v86.016c0 92.16 0.102 95.334 5.222 109.363 7.885 22.016 25.702 38.912 48.128 45.773 14.643 4.403 30.413 5.222 44.954 2.15zM297.472 659.456c6.144-2.97 7.373-3.994 11.059-8.806 3.482-4.608 4.813-9.011 4.915-15.77 0.205-9.318-4.813-17.203-14.438-22.835-6.042-3.584-16.794-3.789-23.040-0.512-9.626 5.12-15.053 13.619-14.95 23.962 0.102 19.046 19.866 32.051 36.454 23.962zM373.76 660.48c18.125-6.451 23.757-30.413 10.138-43.52-13.005-12.39-32.461-9.626-41.677 5.939-2.355 4.096-2.765 5.939-2.662 12.493 0 5.222 0.614 8.806 1.741 10.957 6.758 12.698 20.070 18.534 32.461 14.131zM328.294 594.432c9.114-2.355 16.384-6.451 24.678-13.722 4.403-3.994 5.837-4.71 6.554-3.584 0.512 0.819 0.922 1.946 0.922 2.56 0 2.458 9.318 11.469 13.517 13.21 5.53 2.15 15.565 2.253 20.582 0.102 5.53-2.355 11.366-8.090 14.131-13.722l2.355-4.813v-71.68c-0.102-70.963-0.102-71.782-2.253-77.312-5.53-14.131-18.944-20.992-33.075-16.794-6.042 1.843-12.186 7.68-15.36 14.541l-2.253 4.915-3.686-3.994c-5.837-6.554-14.848-12.595-22.323-15.155-9.011-2.97-25.907-3.277-36.659-0.512-22.016 5.632-43.315 22.938-53.862 43.827-6.963 13.722-9.83 24.883-10.752 42.496-1.536 26.522 5.632 51.507 19.866 68.915 21.606 26.419 50.176 37.683 77.619 30.72zM757.76 595.046c25.907-4.506 39.629-11.674 43.418-22.835 5.632-16.384-4.198-33.997-19.149-34.304-2.56 0-9.728 1.741-17.613 4.301-22.528 7.475-33.69 5.939-46.49-6.246-14.029-13.312-17.306-40.55-7.373-60.109 6.656-13.107 21.094-21.094 36.352-20.275 5.837 0.41 8.704 1.229 23.347 6.656 11.469 4.198 18.432 3.379 25.907-3.174 9.626-8.499 9.421-24.371-0.41-34.304-3.584-3.482-17.306-10.957-27.546-14.746-6.246-2.355-6.963-2.97-15.667-14.234-23.347-30.106-28.058-35.738-31.846-37.478-8.090-3.686-17.92 0.922-21.709 10.035-3.072 7.373-1.946 10.24 10.138 26.419 5.939 7.885 10.752 14.541 10.752 14.848s-0.922 0.512-2.15 0.512c-5.939 0-22.528 6.656-29.082 11.674-18.842 14.541-31.437 36.045-35.43 60.518-1.638 10.342-1.331 31.232 0.614 40.653 4.301 21.094 10.547 33.485 22.938 45.978 17.613 17.613 42.394 27.546 67.072 26.931 5.734-0.102 11.981-0.512 13.926-0.819zM310.272 545.997c-8.909-2.458-14.438-7.27-20.275-17.306-8.397-14.746-8.499-37.888-0.102-54.477 5.325-10.547 10.854-15.155 20.89-17.51 24.576-5.632 45.568 14.336 45.67 43.52 0.102 22.016-9.523 39.936-23.859 44.442-7.475 2.355-16.794 2.867-22.323 1.331z" />
+<glyph unicode="&#xea2f;" glyph-name="Latest" d="M128 448v-358.4h768v716.8h-768v-358.4zM844.8 396.8v-256h-665.6v512h665.6v-256zM478.515 548.352c-7.168-4.403-6.963-2.355-7.066-54.784 0-27.853-0.41-47.002-1.024-46.899-0.512 0.102-19.354 7.373-41.882 16.077-22.528 8.806-41.984 15.974-43.315 15.974-3.686 0-8.806-2.56-10.547-5.222-0.922-1.331-2.56-5.222-3.789-8.602-1.126-3.379-4.506-12.8-7.373-20.992-5.632-15.974-6.042-19.968-2.458-24.986 1.126-1.434 3.789-3.379 6.042-4.301 3.891-1.638 63.59-21.811 77.107-26.112 4.71-1.536 6.349-2.458 5.939-3.584-0.307-0.717-11.776-16.282-25.6-34.509-28.058-37.171-29.286-39.014-29.286-43.008 0-6.554 2.662-9.318 21.811-23.347 10.24-7.475 19.866-14.029 21.299-14.541 4.403-1.741 9.83 0 14.336 4.608 2.15 2.253 3.994 4.506 3.994 4.915 0 0.512 6.144 9.728 13.619 20.685 7.475 10.854 17.92 26.317 23.245 34.304s10.035 14.541 10.342 14.643c0.41 0 2.97-3.379 5.837-7.373 2.867-4.096 11.571-16.282 19.354-27.034s17.818-24.678 22.323-30.925c11.264-15.77 15.974-17.715 26.214-10.957 16.486 11.162 34.714 25.6 36.147 28.672 3.584 7.475 2.765 9.114-17.92 36.352-30.925 40.755-35.738 47.206-35.738 48.026 0 0.512 19.763 7.373 44.032 15.36 41.574 13.722 44.134 14.746 46.694 18.022 1.741 2.253 2.56 4.813 2.662 7.475 0 4.608-13.722 44.749-16.384 47.718-0.922 1.024-2.97 2.458-4.506 3.277-5.325 2.765-4.403 2.97-48.947-13.926-11.366-4.301-22.733-8.704-34.509-13.21-9.011-3.482-10.547-3.789-10.65-2.355 0 0.922-0.102 22.323-0.205 47.514-0.205 44.544-0.307 45.773-2.355 48.64-4.301 5.939-6.861 6.451-31.642 6.451-20.48 0-22.835-0.205-25.805-2.048z" />
+<glyph unicode="&#xea30;" glyph-name="Le_Bloc" d="M336.794 869.376c-62.976-9.83-112.026-53.965-127.283-114.688-1.741-6.861-2.15-9.114-3.584-19.456-0.717-4.71-1.024-108.134-1.024-299.52 0-321.229-0.41-300.851 6.144-320.819s16.077-35.43 31.642-50.893c19.558-19.661 40.96-30.925 68.096-35.942 9.728-1.741 19.354-1.843 204.8-1.638l194.56 0.205 10.547 2.867c50.278 13.312 85.402 49.869 96.154 100.045 1.741 8.294 1.843 22.426 1.843 307.2 0 311.91 0.102 300.237-4.198 318.054-6.349 26.522-22.016 53.555-42.291 72.909-23.142 22.118-49.869 35.533-81.613 41.062-10.65 1.843-19.149 1.946-178.074 1.946-134.144 0-168.653-0.307-175.718-1.331zM688.23 817.357c6.451-1.536 8.602-2.355 15.974-5.427 1.741-0.819 3.584-1.434 4.096-1.434 1.843 0 18.739-11.059 24.576-16.077 10.547-9.114 20.992-23.45 26.726-36.864 4.915-11.571 6.861-19.456 7.987-32.666l0.717-7.782-6.144 4.198c-8.499 5.837-21.094 11.878-32.256 15.462-19.763 6.349-9.216 6.042-222.003 5.837l-194.048-0.205-10.752-2.867c-15.974-4.198-37.888-14.336-45.466-20.992-1.843-1.741-1.946-1.536-1.331 6.042 3.277 41.677 30.618 76.595 70.349 90.010 15.155 5.12 10.445 5.018 188.416 4.71 150.733-0.205 167.014-0.41 173.158-1.946zM354.304 688.64c14.131-4.71 23.757-10.547 32.87-19.661 41.37-42.086 22.118-113.152-34.918-128.41-7.885-2.048-24.883-2.765-32.768-1.331-29.594 5.53-53.043 27.341-61.133 56.627-2.15 7.987-2.458 28.57-0.41 36.352 7.578 29.491 30.106 51.61 58.982 57.754 10.24 2.253 28.672 1.536 37.376-1.331zM706.56 690.074c14.848-3.072 28.57-10.547 39.322-21.402 9.216-9.318 14.541-18.432 19.456-33.28l2.15-6.656 0.307-239.104c0.205-172.134 0-241.357-0.819-247.296-4.506-31.949-31.949-59.494-64-64-5.837-0.819-61.44-1.024-196.096-0.819l-187.904 0.307-7.066 2.253c-26.624 8.602-44.544 26.522-53.146 53.043l-2.253 7.168-0.307 186.163-0.205 186.061 5.939-3.994c12.902-8.806 30.106-15.872 47.821-19.661 9.626-2.048 37.069-1.843 47.616 0.41 24.678 5.222 45.363 15.974 63.181 32.87 10.547 9.933 19.968 22.426 25.395 33.28l4.096 8.294h32.768c18.022 0 35.43 0.41 38.605 1.024 18.637 2.97 35.123 18.739 40.243 38.195 6.349 24.474-8.192 51.61-32.461 60.109-8.192 2.867-8.806 2.867-45.363 2.97l-33.894 0.102-2.867 6.144c-1.638 3.379-4.915 9.114-7.27 12.8l-4.403 6.656h131.686c115.405-0.102 132.71-0.205 139.469-1.638zM572.723 661.811c11.264-14.029 16.998-33.382 15.667-52.531-2.355-34.099-27.341-62.566-60.928-69.53-5.632-1.126-14.541-1.536-34.304-1.536-24.269-0.102-26.829-0.307-28.058-1.946-0.717-0.922-4.301-5.837-7.885-10.957-14.541-20.48-33.792-36.864-56.73-48.128-20.992-10.342-39.731-14.848-64.102-15.36-20.275-0.41-29.901 0.922-52.429 7.27l-2.355 0.614v-160.256c0-112.845 0.307-161.997 1.126-165.786 3.891-18.534 18.944-34.202 37.786-39.219 8.397-2.253 374.477-2.253 382.874 0 18.944 5.018 33.997 20.582 37.888 39.219 0.819 3.891 1.126 72.602 1.126 242.176l-0.102 236.749-2.355 7.373c-5.632 17.51-18.944 29.901-36.966 34.714-3.994 1.126-19.046 1.434-69.427 1.434h-64.307l3.482-4.301z" />
+<glyph unicode="&#xea31;" glyph-name="Leave_session" d="M102.605 511.795l0.307-345.907 20.992-11.571c19.968-11.059 27.136-14.95 39.936-22.016 3.072-1.638 9.114-5.018 13.312-7.373 8.294-4.71 57.344-31.642 66.56-36.659 3.072-1.638 7.066-3.891 8.704-4.813 3.482-2.048 9.011-5.12 23.552-13.005 5.632-3.174 16.282-9.011 23.552-13.107 7.373-3.994 16.589-9.114 20.48-11.264 3.994-2.15 12.698-6.963 19.456-10.752s15.77-8.704 19.968-11.059c4.198-2.253 11.366-6.246 15.872-8.704l8.192-4.71 0.307 77.824 0.205 77.722h281.6v204.8h-51.2v-153.6h-230.4l-0.205 243.302-0.307 243.302-15.36 8.397c-8.397 4.608-18.33 10.035-22.016 12.083-3.686 1.946-9.83 5.325-13.824 7.475-3.891 2.15-8.499 4.608-10.24 5.632-1.638 0.922-6.042 3.379-9.728 5.325-20.992 11.366-56.013 30.413-63.488 34.611-4.813 2.662-11.674 6.451-15.36 8.397-17.715 9.421-35.84 19.558-35.84 19.866 0 0.205 93.798 0.41 208.384 0.41h208.384v-153.6h51.2v204.8h-563.2l0.205-345.805zM742.4 690.688v-63.488l-130.765-0.102c-71.987 0-131.994-0.205-133.427-0.512-20.89-3.482-38.605-21.094-41.984-41.37-0.717-4.403-1.024-30.106-0.819-77.312 0.307-70.042 0.307-70.758 2.56-76.595 7.066-18.637 22.733-31.539 41.37-33.894 1.946-0.307 61.85-0.512 133.222-0.512l129.843-0.102 0.205-63.898 0.307-63.898 11.366 10.854c26.829 25.907 51.61 49.562 54.272 52.122 1.638 1.434 12.698 11.981 24.474 23.347 11.878 11.366 22.938 22.016 24.678 23.654 2.97 2.765 31.539 30.003 45.466 43.418 3.174 3.072 13.21 12.595 22.118 21.197 38.4 36.557 39.936 38.4 44.544 50.995 3.072 8.294 3.277 24.986 0.512 33.28-2.662 7.885-7.68 15.974-14.131 22.528-4.915 5.018-41.37 40.038-48.026 46.182-1.536 1.331-11.878 11.264-23.040 22.016-11.264 10.854-22.016 21.094-23.962 22.938s-12.595 11.981-23.552 22.528c-10.957 10.547-21.811 20.89-24.064 23.040-2.253 2.048-8.909 8.397-14.848 14.131s-19.456 18.739-30.106 28.877c-10.65 10.138-20.48 19.661-21.914 21.299-1.434 1.536-2.97 2.765-3.482 2.765-0.41 0-0.819-28.57-0.819-63.488z" />
+<glyph unicode="&#xea32;" glyph-name="lightbulb_sh" d="M494.080 831.386c-1.638-0.205-7.168-0.922-12.288-1.536-54.17-6.451-107.725-35.533-144.589-78.234-24.474-28.365-43.008-65.843-50.381-101.581-4.301-21.197-5.12-30.515-4.71-52.531 0.205-10.957 0.614-21.094 0.922-22.528 0.205-1.434 1.024-6.042 1.638-10.24 1.536-10.752 5.734-27.136 9.83-39.322 4.71-13.517 17.101-38.502 25.19-50.79 33.587-50.688 60.518-108.134 77.107-164.352 5.837-19.866 8.192-30.106 11.776-50.278 3.277-18.534 5.53-24.269 12.493-31.13 2.458-2.458 7.373-5.837 11.059-7.578l6.656-3.174h146.432l6.656 3.174c13.926 6.656 20.275 16.691 23.040 35.738 2.355 16.077 10.854 50.074 18.125 71.578 16.384 49.254 37.786 93.491 68.403 141.517 21.709 34.099 33.178 63.181 38.502 97.69 1.946 12.698 2.662 48.742 1.126 59.392-4.301 30.822-10.138 50.586-22.118 75.264-11.571 23.654-25.6 43.418-43.93 61.747-36.352 36.25-81.101 58.266-134.861 66.253-4.813 0.717-41.677 1.434-46.080 0.922zM409.6 152.269c0-46.080 0.205-47.718 7.782-54.989 6.861-6.758 10.957-7.68 32.256-7.68h18.125l2.253-3.482c7.578-12.39 26.112-22.118 41.984-22.118s34.406 9.728 41.984 22.016l2.15 3.482 19.661 0.307c18.842 0.307 19.968 0.41 24.781 2.97 5.734 2.867 11.162 9.318 12.8 15.053 0.614 2.253 1.024 19.456 1.024 44.032v40.141h-204.8v-39.731z" />
+<glyph unicode="&#xea33;" glyph-name="ligue_1" d="M497.664 883.2l-11.776-0.512 5.837-1.741c3.174-1.024 6.042-1.843 6.451-1.843 1.741 0 12.8-5.427 12.8-6.246 0-0.512-0.41-0.922-0.922-0.922s-20.070-8.602-43.315-19.046c-70.349-31.744-67.072-30.413-89.395-36.25-33.587-8.806-68.915-18.125-79.872-20.992-24.474-6.451-33.69-8.704-36.045-8.704-2.765 0-7.475 2.253-12.186 5.734-1.741 1.331-3.482 2.458-3.994 2.458-0.717 0-10.854-7.782-17.306-13.312-22.016-18.739-39.526-37.683-39.526-42.598s20.582-3.789 50.688 2.765c11.469 2.458 49.254 11.878 52.736 13.107 1.434 0.512 5.12 1.638 8.192 2.56 24.371 6.861 49.971 14.95 79.36 24.883 10.752 3.686 20.582 6.963 22.016 7.475 6.758 2.15 42.394 15.258 58.368 21.504 57.037 22.221 101.786 43.827 112.64 54.374 5.53 5.427 5.325 7.27-1.126 10.138-8.704 3.686-22.63 5.837-44.442 6.656-7.885 0.41-15.053 0.717-15.872 0.819s-6.861 0-13.312-0.307zM420.045 874.496c-26.931-5.632-57.856-15.36-82.637-25.907-21.606-9.216-60.723-29.901-53.76-28.467 35.43 7.475 64.512 15.77 89.6 25.702 22.323 8.806 66.048 31.334 60.416 31.13-1.126 0-7.27-1.126-13.619-2.458zM675.84 848.998c0-1.434 11.469-11.981 69.632-63.59 23.347-20.787 44.544-39.731 47.104-42.086 7.475-6.861 55.091-49.254 66.15-58.88 15.667-13.619 28.467-23.654 28.877-22.528 0.512 1.536-5.018 11.878-12.083 22.63-16.998 25.805-34.406 46.797-58.778 71.168-36.25 36.147-70.451 60.723-115.814 83.046-18.125 8.909-25.088 11.776-25.088 10.24zM573.44 769.843c-27.034-3.994-43.213-8.090-60.826-15.258-48.435-19.763-87.859-55.296-114.586-103.322-14.131-25.293-25.293-58.982-28.877-87.552-2.048-15.974-2.765-49.562-1.126-58.88 0.205-1.638 0.819-5.837 1.126-9.216 1.024-9.216 5.325-28.774 8.806-40.55 19.763-66.765 67.072-122.778 127.59-151.45 17.715-8.499 39.731-15.565 56.627-18.432 3.686-0.614 7.68-1.331 9.011-1.536 2.253-0.512 2.253-0.41 1.741 6.349-0.307 3.891-0.717 8.806-1.024 11.059-0.205 2.253-0.922 9.216-1.536 15.36-0.614 6.246-1.741 16.384-2.56 22.528-0.819 6.246-1.638 13.107-1.946 15.36s-1.024 7.578-1.536 11.776c-0.614 4.198-1.126 8.090-1.126 8.499 0 0.717-2.048 0.614-13.312-0.819-14.95-1.843-13.517-2.15-19.046 3.277-7.475 7.373-25.6 27.341-33.28 36.659-20.275 24.781-34.509 47.104-49.766 78.234l-7.782 15.667 1.741 6.349c3.482 12.493 18.637 57.856 22.118 65.638 0.41 1.126 3.994 9.421 7.68 18.432 3.789 9.011 12.186 27.136 18.637 40.141 13.517 27.341 9.421 23.859 32.563 28.365 23.245 4.506 30.72 5.734 46.797 7.782 23.245 2.867 46.285 4.608 75.571 5.632l14.848 0.614 6.758-6.963c32.563-33.485 60.006-72.397 84.275-119.603 5.427-10.445 5.427-10.342 1.126-30.208-6.758-30.618-16.486-57.651-30.413-84.787-12.083-23.45-27.238-48.538-29.594-48.947-21.197-3.379-23.245-3.789-22.938-5.427 0.205-1.536 1.024-7.782 2.15-16.998 0.205-2.253 0.717-5.222 0.922-6.656s0.717-6.656 1.024-11.776c0.307-5.018 0.819-10.854 1.024-12.8s0.717-9.114 1.024-15.872c0.614-12.698 1.536-24.371 1.946-24.883 0.614-0.512 17.613 7.168 26.931 12.083 66.458 35.43 113.254 105.165 122.675 182.784 6.349 51.712-2.56 103.322-25.702 148.992-30.106 59.699-83.456 104.755-144.282 122.266-22.733 6.451-33.28 7.987-58.368 8.294-12.39 0.102-23.654 0-25.088-0.205zM152.166 631.091c-25.702-3.482-49.254-32.87-66.253-82.432-1.536-4.71-2.662-8.499-2.458-8.499s4.506 2.048 9.421 4.403c4.915 2.458 12.288 5.734 16.179 7.373 3.994 1.536 8.090 3.174 9.216 3.584 6.554 2.662 35.533 11.264 37.888 11.264 1.536 0 12.698-14.95 22.323-29.696 18.842-29.082 36.25-63.078 52.531-103.014l5.734-14.131-0.205-16.384c-0.102-9.114-0.307-18.33-0.512-20.582s-0.614-10.547-0.922-18.432c-0.41-7.885-0.819-16.179-1.126-18.432-0.205-2.253-0.717-7.578-1.024-11.776-0.512-6.758-1.229-13.21-3.174-29.696-1.434-12.083-5.734-35.43-8.397-45.568-3.277-13.005-2.048-11.981-20.173-15.667-18.534-3.789-28.058-4.813-45.056-4.813-12.288 0.102-22.426 1.126-29.491 3.174-0.922 0.307-1.741 0.205-1.741-0.307s3.072-6.349 6.758-13.107c16.896-30.413 35.43-46.797 60.826-53.658 6.349-1.741 10.035-2.048 21.504-1.741 19.968 0.512 27.853 3.789 41.062 16.896 8.806 8.909 12.186 13.517 18.739 26.010 14.029 26.829 23.757 67.686 27.034 112.742 1.434 20.992 0.717 65.536-1.434 85.094-13.414 121.651-84.070 226.099-147.251 217.395zM595.456 607.539c-31.642-3.686-56.013-24.064-66.662-55.808-3.584-10.65-4.506-27.955-2.048-39.526 9.421-45.466 53.35-73.728 97.485-62.669 14.848 3.789 32.461 15.462 42.291 28.16 6.042 7.782 12.902 22.426 14.95 32.051 11.674 53.658-32.563 103.936-86.016 97.792zM921.907 570.675c-10.342-11.264-29.184-93.389-40.755-177.971-1.434-10.445-2.765-20.275-2.97-22.016-2.048-14.848-2.662-19.149-3.174-23.552-0.307-2.765-0.819-6.451-1.024-8.192-0.512-3.174-1.126-8.499-2.048-17.92-0.41-3.072-1.024-9.114-1.536-13.312s-1.229-10.854-1.638-14.848c-0.307-3.891-0.717-8.499-0.922-10.24-2.56-26.829-2.662-55.501-0.205-61.133 1.843-4.301 2.56-4.608 6.758-2.355 11.571 5.939 31.437 40.141 45.978 78.848 18.842 50.483 26.522 93.082 26.522 147.456 0 26.624-1.434 46.182-5.325 71.68-3.994 25.702-13.005 55.808-16.794 55.808-0.41 0-1.741-1.024-2.867-2.253zM106.394 474.214c-13.005-4.608-23.245-21.504-27.546-45.568-2.56-14.234-2.15-39.731 0.922-55.091 7.885-40.346 28.365-68.915 49.254-68.915 9.523 0.102 17.408 4.813 23.859 14.643 18.125 27.648 18.125 82.637 0 121.549-12.186 25.805-30.618 39.117-46.49 33.382zM587.264 207.77c-22.426-2.048-33.075-3.686-56.832-8.704-100.352-21.299-169.677-66.253-172.339-111.923-1.946-32.768 25.395-58.88 73.523-70.246 4.506-1.024 8.294-1.741 8.397-1.638 0.205 0.205-1.741 4.71-4.301 10.035-5.939 12.493-10.957 27.955-13.824 42.598-1.229 6.349-2.15 11.674-1.946 11.878 0.205 0.102 2.048 1.331 3.994 2.765 24.269 17.715 80.077 46.080 130.048 66.048 14.95 5.939 18.432 6.554 27.546 5.12 1.434-0.307 5.222-0.717 8.294-1.126 29.286-3.174 68.813-8.909 93.184-13.414 17.715-3.277 41.984-8.602 44.134-9.728 2.253-1.126 3.174-10.547 3.072-28.467-0.102-13.414-0.205-15.462-2.15-30.618-1.331-10.035-1.434-9.728 1.843-7.68 14.95 9.421 32.154 25.907 38.81 37.069 6.554 10.957 8.704 18.33 8.806 29.798 0.102 18.534-5.632 30.106-21.299 42.701-9.114 7.27-29.389 17.818-43.008 22.323-16.179 5.325-39.629 10.445-55.808 12.186-2.56 0.307-7.373 0.819-10.752 1.229-10.65 1.229-45.568 1.024-59.392-0.205zM589.824 93.491c-55.398-5.632-99.533-34.304-89.088-57.856 4.608-10.547 16.077-16.896 37.888-21.197 11.264-2.253 41.984-1.536 56.832 1.331 35.533 6.656 64.307 22.733 72.192 40.346 7.475 16.384-7.578 31.027-37.171 36.147-10.65 1.843-29.286 2.458-40.653 1.229z" />
+<glyph unicode="&#xea34;" glyph-name="Link" d="M718.848 881.562c-37.478-5.12-71.885-19.866-101.376-43.52-4.813-3.789-50.586-48.947-101.888-100.25-74.445-74.445-92.57-93.082-90.112-92.672 14.848 2.765 49.050 2.662 67.584-0.102 17.408-2.662 28.672-5.325 45.363-10.752l12.698-4.198 64.102 64.102c35.328 35.226 66.662 65.946 69.734 68.096 10.24 7.578 21.914 13.005 36.966 17.101 9.523 2.662 35.533 2.662 45.568 0 37.581-9.83 63.795-35.021 74.854-71.782 2.56-8.397 2.765-10.752 2.867-26.112 0-14.438-0.307-18.125-2.253-25.395-4.096-15.258-11.162-28.979-20.173-39.629-2.355-2.867-46.592-47.411-98.202-99.021-100.557-100.454-101.274-101.069-118.886-108.646-9.114-3.789-10.65-4.301-23.552-6.963-6.963-1.434-25.088-1.331-33.28 0.102-20.070 3.584-38.4 12.902-54.272 27.648-11.776 11.059-25.19 16.077-40.038 15.053-12.493-0.922-23.245-5.837-31.949-14.643-9.011-9.216-14.029-20.48-14.541-33.178-0.922-20.173 7.27-34.099 31.232-53.248 30.72-24.371 63.795-37.99 106.496-43.52 5.734-0.717 33.587-0.717 40.448 0.102 26.931 2.97 54.579 11.674 77.926 24.678 23.45 13.005 25.293 14.643 132.301 121.549 67.686 67.482 102.298 102.707 107.622 109.67 29.901 38.298 44.544 83.558 42.803 131.584-1.229 31.437-8.090 58.061-21.811 84.992-28.877 56.525-84.48 97.587-145.818 107.52-4.198 0.717-8.602 1.434-9.728 1.741-5.53 1.229-40.653 1.024-50.688-0.307zM448 596.378c-44.749-2.56-83.149-17.306-117.76-45.363-4.506-3.584-52.736-51.2-107.11-105.779-103.731-104.038-106.701-107.213-118.886-128.41-12.595-21.811-19.558-40.96-24.474-67.379-1.741-9.318-2.253-16.077-2.355-31.334-0.102-10.65 0.307-22.426 0.717-26.112 10.65-88.576 77.005-159.539 164.045-175.718 13.824-2.56 19.763-2.97 39.936-2.867 20.685 0.102 30.106 1.331 49.152 6.246 24.371 6.349 48.742 18.125 70.042 33.792 4.71 3.584 44.646 42.598 103.322 101.069 82.33 82.227 98.918 99.123 94.72 96.563-1.638-1.024-18.637-2.15-32.051-2.15-13.21-0.102-35.533 1.126-36.864 1.946-0.41 0.205-3.891 0.922-7.782 1.536-10.65 1.638-27.341 5.837-39.117 9.933l-10.445 3.584-64.512-64.512c-69.632-69.53-72.090-71.68-90.112-79.258-13.824-5.837-22.733-7.475-40.448-7.373-14.234 0-16.179 0.205-26.624 3.379-35.226 10.342-60.928 37.069-70.451 73.114-3.174 12.186-3.174 35.328 0.102 48.333 2.765 11.264 10.547 27.341 17.408 36.352 2.765 3.686 47.923 49.459 100.147 101.683 102.605 102.502 103.219 103.014 120.934 110.182 16.691 6.656 35.533 9.011 52.531 6.656 22.016-3.174 39.629-11.776 57.344-28.058 12.288-11.264 24.883-16.077 39.424-15.053 10.24 0.717 16.691 2.97 24.678 8.294 15.565 10.342 24.166 28.16 22.528 46.182-1.229 14.234-6.042 23.245-18.842 35.533-33.178 31.949-79.667 52.326-124.621 54.682-5.632 0.307-10.957 0.614-11.776 0.717s-6.554-0.102-12.8-0.41z" />
+<glyph unicode="&#xea35;" glyph-name="live" d="M115.405 753.664c-18.944-5.222-34.099-21.299-37.478-39.834-0.819-4.301-1.126-84.070-1.126-267.264 0-284.57-0.41-265.421 5.734-278.016 3.891-7.987 14.541-18.432 23.040-22.426 3.686-1.741 9.83-3.686 13.824-4.301 8.397-1.229 605.286-0.922 610.202 0.307 10.957 2.97 23.962 12.493 30.106 22.118 3.379 5.12 6.758 13.722 7.68 19.149 0.205 1.638 0.512 40.448 0.512 86.221l0.102 83.251 6.963-6.554c14.438-13.619 35.226-32.666 53.453-48.845 10.445-9.318 19.661-17.613 20.582-18.432 0.819-0.819 3.379-3.072 5.632-5.018 4.403-3.891 22.118-19.763 22.938-20.582 0.307-0.307 2.867-2.56 5.632-5.018 2.867-2.458 7.475-6.656 10.24-9.216 8.806-8.090 19.354-17.101 22.016-18.842 3.686-2.355 13.517-3.379 17.613-1.741 5.632 2.253 10.138 6.144 12.186 10.65 1.843 4.096 1.946 11.366 1.946 218.726s-0.102 214.63-1.946 218.726c-4.506 9.933-19.251 14.643-29.184 9.421-1.331-0.717-9.933-8.192-19.149-16.691-9.114-8.397-17.408-16.077-18.33-16.896-1.024-0.922-7.066-6.451-13.517-12.493s-12.595-11.776-13.824-12.8c-1.126-1.024-7.475-6.861-14.234-13.107-18.637-17.306-33.894-31.437-39.834-36.864-10.547-9.728-23.757-21.914-26.214-24.371l-2.97-2.97v84.89c0 72.806-0.205 85.709-1.536 90.931-4.403 16.896-14.95 29.082-31.539 36.25l-6.349 2.662-304.128 0.205c-249.651 0.102-305.050-0.102-309.043-1.229zM167.936 552.755c0.307-0.717 0.512-38.81 0.41-84.787 0-74.854 0.102-83.456 1.536-83.558 0.922-0.102 23.45-0.205 50.074-0.307 35.328-0.102 48.64-0.41 49.152-1.331 0.512-0.819 0.819-32.563 0.307-36.352-0.102-0.512-32.973-0.819-73.216-0.819-57.549 0-73.216 0.307-73.523 1.331-0.205 0.614-0.307 47.309-0.307 103.629l0.102 102.4 10.138 0.512c18.842 0.922 34.816 0.614 35.328-0.717zM340.992 449.843v-104.243h-45.568v207.77l3.584 0.307c1.946 0.205 12.186 0.307 22.835 0.307h19.149v-104.141zM406.016 553.267c0.307-0.307 5.734-17.101 17.92-55.603 1.536-5.018 5.837-18.637 9.523-30.208 19.866-62.362 19.456-61.030 20.275-58.368 5.427 17.203 16.691 52.634 17.818 55.808 0.717 2.253 4.915 15.155 9.216 28.672 19.354 60.621 19.046 59.904 21.402 59.904 25.702 0.614 44.646 0.307 44.646-0.512 0-0.614-2.765-9.114-6.042-18.944s-18.227-54.784-33.178-99.84c-15.053-45.056-27.75-83.456-28.467-85.197l-1.126-3.379h-51.61l-1.741 5.939c-1.024 3.174-6.451 20.173-12.083 37.581-12.493 38.298-18.739 57.651-33.69 103.936-13.107 40.755-18.534 57.344-19.149 59.085-0.307 0.819 1.024 1.331 3.994 1.536 5.939 0.41 41.779 0.102 42.291-0.41zM716.902 553.472h3.686l0.102-18.944v-18.944l-2.662-0.102c-1.536 0-25.805-0.205-53.965-0.307-28.16-0.205-51.61-0.307-52.224-0.41-0.819-0.205-1.331-33.075-0.614-42.394 0.102-1.741 3.174-1.843 50.278-1.843h50.176l-0.205-17.613-0.307-17.715-48.64-0.102c-26.726-0.102-49.357-0.205-50.176-0.307-1.331-0.102-1.536-3.584-1.536-24.883 0-18.534 0.307-24.986 1.229-25.395 0.717-0.307 25.907-0.512 56.115-0.41h54.784v-38.502h-157.696l-0.102 2.867c0 3.891 0 198.758 0 202.138 0.102 2.458 0.512 2.765 3.994 3.072 2.765 0.205 115.814 0.102 147.763-0.205z" />
+<glyph unicode="&#xea36;" glyph-name="livebox" d="M494.080 838.656c-13.005-2.458-27.341-8.397-38.912-16.179-3.379-2.253-20.378-18.33-37.786-35.738l-31.642-31.539h-129.741v-128.922l-11.981-11.878c-6.656-6.554-41.062-40.858-76.493-76.083l-64.41-64.205 152.883-0.512 0.205-160.563 0.307-160.461 2.253-6.656c9.011-27.546 26.726-45.363 53.453-53.658 6.656-2.048 8.294-2.048 197.222-2.253 207.36-0.307 196.71-0.512 210.842 5.427 24.371 10.24 41.882 32.051 46.592 58.061 0.819 4.198 1.126 55.91 1.126 163.123v156.979l153.088 0.512-22.733 22.528c-27.443 27.238-254.464 252.928-294.707 293.069-15.872 15.872-31.539 30.515-35.226 32.973-8.909 6.042-21.402 11.776-31.846 14.438-10.752 2.765-31.744 3.584-42.496 1.536zM648.499 600.166c5.632-2.048 10.547-6.246 13.722-11.674l2.867-4.813v-46.080c0-51.61 0.41-48.742-7.578-56.73-7.066-7.066-8.806-7.27-52.224-7.27h-38.502l-54.784-54.784v-95.334l27.341-27.341 27.443-27.341h25.6c29.901 0 32.973-0.614 40.038-7.885 7.168-7.27 7.578-9.728 7.578-43.315 0-33.792-0.41-36.352-7.782-43.622-6.963-7.066-10.24-7.578-43.93-7.578-33.075 0-35.84 0.512-43.008 7.68-7.066 6.963-7.68 10.24-7.68 39.936v25.702l-54.682 54.682h-51.405c-55.603 0-56.115 0-63.59 5.734-1.843 1.331-4.608 4.71-6.144 7.373l-2.867 4.813v117.76l2.765 4.71c1.536 2.56 4.403 5.939 6.349 7.475 7.578 5.734 7.782 5.734 63.488 5.734h51.302l54.784 54.784v38.502c0 42.291 0.102 43.52 6.144 51.098 1.741 2.15 5.53 5.12 8.499 6.554l5.325 2.56h43.52c33.792 0 44.339-0.307 47.411-1.331z" />
+<glyph unicode="&#xea37;" glyph-name="livebox_info" d="M76.8 499.2v-256.102l102.4-102.298h768v614.4h-870.4v-256zM526.438 701.133c10.445-4.608 17.51-11.981 21.504-22.63 2.458-6.451 2.867-16.589 1.126-23.142-1.843-6.554-7.475-14.95-13.107-19.558-24.576-19.968-62.054-2.355-62.054 29.082 0 8.909 1.536 14.643 5.837 21.197 7.475 11.878 20.48 18.432 34.406 17.51 4.301-0.307 9.728-1.434 12.288-2.458zM553.37 495.309c-0.102-111.514 0.102-116.941 4.403-124.314 3.072-5.325 14.234-8.909 27.75-9.011h3.277v-16.384h-153.6v16.384l2.867 0.102c14.029 0.205 23.347 2.765 27.648 7.373 2.458 2.765 3.994 7.578 4.915 15.053 0.819 7.373 0.819 170.803-0.102 178.176-2.048 18.534-7.475 22.426-32.461 23.45-2.867 0.102-2.867 0.102-2.867 7.782v7.68h118.272l-0.102-106.291zM896 281.6v-12.8h-691.2v25.6h691.2v-12.8zM889.958 215.245c3.994-2.662 6.042-6.144 6.042-10.445 0-6.349-6.451-12.8-12.8-12.8-6.246 0-12.8 6.451-12.8 12.595 0 6.554 6.349 13.005 12.902 13.005 1.741 0 4.71-1.024 6.656-2.355z" />
+<glyph unicode="&#xea38;" glyph-name="livebox_phone" d="M492.032 814.49c-12.186-2.56-14.848-3.482-25.088-8.499-16.384-8.090-18.33-9.83-76.186-67.891-23.757-23.757-98.304-98.509-165.888-166.195l-122.675-122.88h153.805v-157.696c0-140.186 0.205-158.618 1.638-165.683 5.837-28.467 26.317-50.381 55.398-59.29 5.632-1.638 17.203-1.843 195.379-2.048 171.52-0.307 190.157-0.205 197.632 1.331 31.744 6.451 55.706 31.232 60.928 62.976 0.614 4.301 1.024 60.518 1.024 163.43v156.979l152.986 0.512-172.134 172.237c-185.856 185.958-178.688 179.2-197.12 186.778-13.005 5.325-22.528 7.373-37.171 7.68-10.24 0.205-15.462-0.205-22.528-1.741zM399.872 497.766c6.451-2.765 13.926-10.854 37.786-40.858 16.384-20.582 22.118-30.413 22.118-37.888 0-6.451-4.71-13.414-19.251-28.467-7.68-7.987-14.336-15.258-14.746-16.179-1.434-3.379-0.717-11.469 1.331-17.203 6.349-16.896 22.528-37.478 54.067-69.018 38.298-38.195 62.771-55.194 79.36-55.194h5.734l15.462 14.848c20.787 19.866 26.419 22.528 38.195 18.022 7.578-2.97 48.742-34.816 61.747-47.821 11.469-11.469 12.186-17.818 3.277-29.082-2.253-2.867-12.39-13.414-22.528-23.347-19.456-19.149-23.142-21.811-33.894-23.757-7.782-1.434-25.293-0.512-36.147 1.946-28.365 6.349-68.403 25.498-96.768 46.285-10.138 7.373-23.245 17.408-25.088 19.046-1.126 1.024-5.939 5.12-10.752 9.216-10.854 9.114-31.437 29.286-43.622 42.803-43.725 48.23-74.138 102.707-81.715 146.637-2.765 15.36-1.434 31.642 3.174 40.653 1.024 2.048 11.162 13.107 22.426 24.474 25.293 25.498 30.515 28.774 39.834 24.883z" />
+<glyph unicode="&#xea39;" glyph-name="location_pin_compass" d="M486.4 882.176c-52.531-5.12-102.707-24.474-143.872-55.706-54.989-41.677-93.082-101.99-106.394-168.55-1.434-7.066-2.867-15.565-3.277-18.944-0.307-3.379-0.922-7.066-1.126-8.192-1.229-5.427-1.126-47.923 0.205-59.392 4.71-40.038 15.258-72.704 35.942-110.387 9.421-17.306 11.469-20.89 19.354-35.533 3.789-7.066 8.192-15.053 9.728-17.92 1.536-2.765 14.234-26.112 28.16-51.712s27.955-51.405 31.232-57.344c5.427-9.933 32.256-59.187 40.653-74.752 3.277-6.042 11.162-20.48 18.739-34.304 1.536-2.765 4.301-7.885 6.144-11.264 3.379-6.349 3.994-7.373 18.944-34.816 4.915-9.011 10.547-19.354 12.493-23.040 2.048-3.686 7.68-14.131 12.698-23.245 19.456-35.533 27.955-51.2 30.003-55.091 10.752-19.763 15.565-28.16 16.077-28.16 0.41 0 1.843 2.253 3.277 4.915 1.434 2.765 9.216 17.101 17.408 32.051 8.090 14.848 16.384 30.003 18.33 33.69 2.048 3.686 19.046 35.021 37.888 69.632 18.944 34.611 38.81 71.27 44.339 81.408 11.059 20.378 10.65 19.661 27.341 50.176 6.451 11.878 13.722 25.19 16.179 29.696 5.018 9.216 26.010 47.718 29.901 54.784 1.434 2.56 4.813 8.806 7.475 13.824 2.662 5.12 8.806 16.384 13.619 25.088s9.728 17.715 10.957 19.968c25.6 46.694 33.382 62.771 40.243 82.944 17.101 50.278 19.046 110.49 5.222 161.28-5.325 19.968-9.626 31.642-17.715 48.64-38.195 80.282-110.694 137.216-198.246 155.648-21.709 4.608-59.802 6.656-81.92 4.608zM537.6 804.864c51.098-7.885 90.624-28.262 124.314-64.102 27.955-29.696 47.514-70.758 52.941-111.002 1.434-10.342 1.843-37.99 0.717-49.664-3.277-35.635-19.456-75.571-42.086-104.243-34.202-43.315-82.33-70.554-137.421-77.517-10.035-1.331-42.189-1.331-49.664 0-31.334 5.325-47.514 10.547-70.451 22.63-38.195 20.070-69.632 52.838-88.371 92.058-14.746 30.925-20.48 57.958-19.866 92.672 0.205 9.83 0.614 19.558 1.024 21.504 4.506 26.931 9.728 44.339 19.354 64 13.926 28.365 33.178 52.224 58.163 71.885 28.774 22.733 67.686 38.502 103.219 41.882 3.686 0.41 6.861 0.819 7.066 1.024 0.614 0.512 36.864-0.41 41.062-1.126zM624.64 713.523c-8.192-3.584-16.691-7.373-18.944-8.499-2.253-1.024-26.624-11.776-54.272-24.064-52.019-23.040-63.693-28.16-70.656-31.232-2.253-1.024-17.203-7.68-33.28-14.848-16.077-7.066-30.515-13.517-32.256-14.336-1.638-0.717-16.179-7.168-32.256-14.336-16.077-7.066-31.334-13.926-34.099-15.053-2.662-1.229-4.506-2.56-4.096-2.97 0.717-0.614 44.954-13.21 89.805-25.498 7.885-2.253 14.541-4.506 14.95-5.12s1.536-7.782 2.458-15.872c1.024-8.192 1.946-16.077 2.253-17.613 0.205-1.638 1.024-8.806 1.946-16.179 0.819-7.27 2.048-16.486 2.56-20.48 0.614-3.891 2.15-16.282 3.584-27.546 1.331-11.162 2.662-20.48 2.867-20.685 0.41-0.41 8.090 11.878 61.44 97.894 10.65 17.203 22.016 35.43 25.19 40.448 3.277 5.12 6.963 11.059 8.294 13.312 2.15 3.686 5.222 8.602 11.776 18.944 1.331 1.946 7.578 12.083 14.029 22.528s21.299 34.304 32.973 53.146c11.674 18.739 21.094 34.202 20.89 34.406s-6.963-2.662-15.155-6.349z" />
+<glyph unicode="&#xea3a;" glyph-name="lock" d="M496.64 882.893c-0.307-0.307-3.584-0.717-7.373-1.126-27.546-2.56-61.030-14.234-85.811-30.003-24.986-15.77-48.845-39.629-64.922-64.819-7.475-11.674-16.384-30.822-21.094-45.056-4.096-12.493-8.602-34.304-9.626-46.592-0.307-3.379-0.512-37.376-0.614-75.469v-69.427h-102.4v-234.701c0-203.162 0.205-235.725 1.536-241.459 5.734-25.19 22.323-45.466 45.261-55.194 15.155-6.451-4.915-6.042 294.502-6.144l273.101-0.102-0.307 237.261c-0.205 221.184-0.41 237.773-2.048 243.098-8.397 27.546-28.16 47.309-54.886 54.784-3.891 1.024-12.083 1.741-25.19 2.15-10.65 0.307-19.558 0.614-19.661 0.717-0.205 0.102-0.307 32.256-0.41 71.373-0.205 73.011-0.614 82.637-4.608 99.226-4.915 20.582-11.264 37.888-19.456 53.043-31.949 58.88-87.654 97.485-154.522 107.213-5.12 0.717-40.858 1.741-41.472 1.229zM537.088 803.84c25.395-5.325 47.104-17.203 65.536-35.738 18.534-18.637 30.106-40.755 35.226-67.174 1.843-10.138 2.048-15.053 2.048-80.589l0.102-69.939h-256.102l0.307 73.523 0.41 73.421 2.765 10.24c4.608 17.51 10.854 31.13 20.275 44.544 6.963 9.83 20.787 23.654 30.618 30.618 15.155 10.65 35.43 19.149 51.302 21.504 4.198 0.614 8.704 1.331 10.138 1.536 5.427 1.024 29.594-0.307 37.376-1.946zM532.582 419.533c9.318-2.765 15.053-5.427 22.118-10.24 20.378-14.029 32.256-35.123 33.792-59.597 1.638-26.624-11.059-52.326-33.178-67.277-6.144-4.198-6.042-3.891-4.506-18.739 0.512-4.813 1.229-11.878 1.638-15.872 0.307-3.891 0.819-8.499 1.024-10.24 0.205-1.638 0.922-8.397 1.536-14.848s1.331-13.619 1.536-15.872c0.41-3.482 1.843-18.227 4.096-41.472 0.307-3.072 0.717-7.27 1.024-9.216 0.205-1.946 0.717-6.246 1.024-9.523l0.614-5.837h-102.707l0.614 4.403c0.307 2.355 1.536 14.029 2.662 25.805 1.126 11.878 2.253 23.552 2.56 26.112 0.512 4.915 1.229 12.083 5.12 51.2 1.434 13.824 2.56 26.317 2.56 27.75 0 2.15-1.126 3.482-5.427 6.246-15.77 10.445-27.853 28.57-31.744 47.411-6.144 30.003 5.325 59.699 30.003 77.926 9.318 6.861 20.275 11.571 32.461 13.722 7.68 1.434 25.498 0.41 33.178-1.843z" />
+<glyph unicode="&#xea3b;" glyph-name="Lock_screen_settings" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM546.816 804.966c1.434-0.307 8.090-1.229 14.848-2.15 36.147-4.813 72.090-15.667 106.496-32.256 99.84-48.128 173.158-142.336 194.867-250.368 3.277-15.974 3.994-21.197 6.349-43.008 0.819-8.294 0.512-56.832-0.41-62.464-0.307-1.638-0.717-5.632-1.126-8.704-1.741-17.101-7.168-43.008-12.595-61.44-25.907-86.528-85.709-161.894-164.557-207.258-37.376-21.606-83.354-37.786-123.904-43.622-4.506-0.614-9.114-1.331-10.342-1.536-12.288-1.946-58.163-2.765-74.65-1.331-23.552 2.15-53.146 7.68-70.656 13.21-12.493 3.891-16.486 5.222-25.088 8.397-60.723 22.426-116.326 63.386-157.184 115.917-37.478 48.128-63.078 107.93-71.168 166.4-0.717 4.813-1.434 9.83-1.638 11.264-2.765 17.306-2.662 62.976 0.205 85.504 10.547 83.558 47.718 157.389 108.442 215.654 58.982 56.422 134.349 90.624 215.552 97.792 4.198 0.307 7.885 0.819 8.090 1.024 0.512 0.512 55.603-0.41 58.47-1.024zM492.134 727.962c-27.034-4.198-50.381-16.282-70.246-36.25-18.739-18.739-29.286-37.99-35.43-64.512-1.434-6.451-1.843-14.95-2.15-54.989l-0.512-47.411h-50.995v-130.56c0-91.238 0.307-132.096 1.126-135.885 3.891-18.637 18.944-34.202 37.888-39.219 4.71-1.331 29.696-1.536 162.509-1.536h156.877v130.56c0 91.238-0.307 132.096-1.126 135.885-4.198 19.866-21.709 36.864-41.472 40.141-1.638 0.205-50.381 0.512-108.237 0.512l-105.267 0.102 0.41 45.363c0.307 37.171 0.614 46.182 1.946 50.381 5.734 18.534 14.848 31.949 28.57 42.291 33.997 25.498 81.92 18.637 107.213-15.258 7.168-9.83 12.595-21.709 14.029-31.334 0.41-2.15 0.819-4.813 1.024-5.939s0.41-9.318 0.41-18.125l0.102-16.179h51.507l-0.614 21.811c-0.41 14.438-1.126 24.269-2.253 29.389-10.138 46.080-42.086 81.613-86.528 96.154-17.51 5.837-40.243 7.578-58.778 4.608zM523.366 451.482c29.082-8.499 41.267-41.779 24.371-66.662-3.174-4.608-10.24-11.162-14.029-12.902-1.331-0.614-2.15-1.741-1.843-2.662s0.717-6.451 1.126-12.39c0.307-5.939 0.819-12.8 1.024-15.36 0.307-2.56 0.717-8.090 1.024-12.288 0.614-9.011 1.229-17.203 2.048-27.341l0.614-7.475h-51.507l0.614 6.451c0.614 6.656 1.229 14.643 2.15 27.341 2.355 32.768 2.662 37.171 3.072 39.936 0.307 2.048-0.41 3.072-3.789 5.12-16.282 10.035-23.654 32.154-16.998 50.995 7.373 20.89 31.13 33.382 52.122 27.238z" />
+<glyph unicode="&#xea3c;" glyph-name="logistics" d="M91.648 702.771c-18.125-3.482-35.328-20.582-39.322-39.219-0.717-3.482-1.024-62.464-1.126-187.085v-182.067h640v181.76c0 128.614-0.307 183.194-1.126 187.085-4.096 19.558-20.89 36.147-40.243 39.629-7.885 1.434-550.605 1.331-558.182-0.102zM716.8 396.8v-128l-315.29-0.512 5.734-6.144c15.258-16.179 24.678-36.762 27.136-59.085l1.229-11.059h281.19l0.102 4.608c0.102 2.56 0.205 4.915 0.307 5.427 0.102 0.41 0.614 3.482 1.024 6.758 1.638 11.878 7.885 27.955 15.872 40.243 5.12 7.987 19.149 22.016 27.034 27.341 19.558 12.902 38.093 18.227 61.133 17.613 20.787-0.614 36.864-5.734 54.784-17.613 22.118-14.643 39.936-42.701 43.11-67.994 0.41-3.072 0.819-6.349 1.024-7.168 0.102-0.819 0.307-3.277 0.307-5.53l0.102-3.891 16.691 0.307c16.077 0.41 16.794 0.512 21.504 3.277 5.632 3.277 10.445 9.421 11.981 15.155 0.717 2.662 1.024 41.37 0.717 116.326-0.307 111.821-0.307 112.435-2.56 120.115-5.837 20.173-13.517 33.69-26.931 47.309-14.234 14.336-32.461 24.269-52.122 28.262-9.216 1.946-14.438 2.048-91.853 2.15l-82.227 0.102v-128zM882.381 472.064c18.534-4.813 32.87-19.046 37.683-37.376 1.024-3.891 1.434-13.21 1.536-34.406l0.102-29.082h-153.702v102.4h54.272c44.954 0 55.194-0.307 60.109-1.536zM142.848 268.083c-43.213-6.246-73.421-48.845-64.512-90.829 3.277-15.36 9.523-27.341 20.070-38.502 23.552-24.781 62.157-30.515 92.672-13.722 17.306 9.523 31.437 27.546 36.762 47.206 0.922 3.277 1.843 10.752 2.253 16.691 0.512 9.011 0.205 12.186-1.741 19.968-7.373 30.31-29.594 51.917-59.802 58.266-6.451 1.331-19.661 1.843-25.702 0.922zM322.048 268.083c-11.776-1.638-26.522-7.782-35.533-14.848-13.722-10.752-22.835-24.166-27.648-40.653-2.97-10.138-3.174-30.003-0.512-39.834 7.782-27.955 29.491-48.947 57.549-55.501 32.973-7.68 67.686 7.885 84.173 37.888 17.92 32.358 9.216 74.445-20.173 97.382-15.974 12.493-37.683 18.33-57.856 15.565zM802.304 266.752c-32.358-7.066-57.242-35.84-59.494-68.915-2.662-38.502 22.221-72.090 59.904-80.691 30.925-7.066 62.976 6.042 80.589 32.973 25.19 38.502 11.264 89.805-29.901 110.387-15.872 7.987-33.28 10.035-51.098 6.246z" />
+<glyph unicode="&#xea3d;" glyph-name="logout" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM540.16 393.83c63.386-12.698 109.363-58.47 122.88-122.47 2.355-11.059 2.867-37.786 0.922-50.688-7.782-51.302-41.267-96.154-87.552-117.043-21.197-9.626-36.147-13.005-59.802-13.619-24.576-0.512-38.81 1.741-59.597 9.626-48.64 18.534-84.89 61.44-95.642 113.152-2.458 12.186-3.379 36.557-1.843 49.357 3.277 26.010 14.336 52.838 30.208 73.523 21.811 28.365 52.634 48.64 86.118 56.525 19.661 4.71 45.978 5.325 64.307 1.638zM448 330.342c-1.638-1.024-7.987-6.861-13.926-13.005-17.408-17.92-17.715-16.896 14.95-49.562l24.883-24.883-23.962-24.064c-13.21-13.21-24.781-25.088-25.702-26.522-2.048-3.072-1.946-10.035 0.205-13.21 3.482-5.325 23.245-23.859 26.624-24.986 7.066-2.355 9.216-0.819 36.045 25.907l24.883 24.781 25.395-25.395c13.926-13.926 26.010-25.293 26.829-25.395 0.819 0 2.458-0.205 3.584-0.41 4.506-0.922 8.806 1.946 20.378 13.414 12.698 12.698 14.541 15.872 12.8 22.323-0.717 2.662-7.168 9.728-25.498 28.16-13.517 13.517-24.576 24.986-24.576 25.395s10.854 11.674 24.064 24.883c22.63 22.63 27.238 28.365 26.522 32.563-0.102 0.614-0.205 2.15-0.307 3.379-0.102 2.355-21.606 24.883-25.907 27.136-4.096 2.15-10.342 1.843-13.517-0.717-1.536-1.229-13.414-12.8-26.317-25.702l-23.45-23.45-23.45 23.347c-12.8 12.902-24.678 24.474-26.214 25.702-3.584 2.867-10.138 2.97-14.336 0.307z" />
+<glyph unicode="&#xea3e;" glyph-name="Maintenance_man" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM523.366 369.562c9.626-2.048 24.474-9.216 31.232-14.95 11.674-9.933 20.275-23.245 23.962-36.966 2.458-8.909 3.379-23.962 1.946-30.106l-0.819-3.891 78.131-78.336c60.211-60.314 78.643-79.36 80.282-82.944 3.584-8.090 4.608-13.312 3.891-21.299-2.56-30.515-37.581-47.309-62.464-29.901-2.355 1.638-38.502 37.171-80.282 79.155l-76.186 76.186-4.198-0.819c-2.355-0.41-8.294-0.614-13.21-0.41-31.744 1.331-57.651 21.402-67.379 52.224-3.072 9.626-3.584 26.829-1.229 36.659l1.741 6.861 22.528-22.63c12.39-12.39 23.859-23.245 25.498-23.962 1.843-0.819 4.096-1.024 5.734-0.512 2.867 0.819 37.376 34.611 39.526 38.707 2.56 4.915 0.307 7.885-23.757 32.051l-23.142 23.142 6.042 1.126c3.277 0.717 6.861 1.331 7.987 1.638 5.018 1.024 17.306 0.512 24.166-1.024z" />
+<glyph unicode="&#xea3f;" glyph-name="manage_android" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-62.976-50.893-109.875-117.043-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-56.32 75.366-137.216 130.867-228.762 157.082-23.040 6.554-51.2 11.981-72.704 14.029-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM603.443 720.282c0.512-2.048-4.301-9.728-23.040-36.762-2.458-3.686-4.915-7.168-5.222-7.885-0.512-0.717 2.15-2.662 7.168-5.427 12.39-6.656 23.347-14.95 34.611-26.112 21.094-20.992 34.611-47.309 37.786-73.933l0.717-5.427h-154.726c-98.611 0-154.624 0.307-154.624 1.024 0 0.512 0.922 5.427 1.946 10.957 7.68 39.219 33.178 72.602 71.578 93.696 4.096 2.253 7.373 4.403 7.168 4.813-0.41 0.922-13.312 19.866-21.606 31.642-5.427 7.782-6.861 10.65-6.656 13.005 0.307 2.765 0.614 3.072 3.789 3.072 3.482 0 3.994-0.512 18.637-21.914 8.397-11.981 15.36-22.016 15.565-22.221s3.789 0.819 7.885 2.253c23.040 7.987 49.971 10.854 76.595 7.987 11.776-1.331 32.358-6.042 39.834-9.114 3.072-1.331 3.994-1.331 5.018-0.307 1.126 1.229 5.427 7.475 22.118 32.051 3.789 5.632 7.987 10.752 9.216 11.469 2.765 1.434 5.427 0.205 6.246-2.867zM299.622 543.334c8.499-2.253 17.408-10.035 21.197-18.534 3.686-8.192 3.789-10.854 3.482-86.528l-0.205-74.752-2.765-5.837c-11.571-24.781-43.93-28.672-57.651-6.963-5.837 9.216-5.837 8.909-5.837 90.010 0 77.312 0.102 78.95 4.403 87.245 6.963 13.722 21.504 19.661 37.376 15.36zM723.456 541.798c9.318-4.301 15.77-13.107 17.92-24.166 1.434-7.373 1.331-146.33 0-153.702-2.15-11.366-8.090-19.661-17.715-24.678-6.656-3.482-19.661-3.277-27.546 0.41-7.168 3.277-13.619 9.83-17.101 17.203l-2.662 5.632-0.307 75.674c-0.307 80.589-0.205 81.715 4.608 89.6 9.216 14.95 27.75 20.992 42.803 14.029zM655.667 542.31c0.41-0.102 0.717-57.139 0.614-126.771-0.102-104.755-0.307-127.59-1.536-131.379-1.843-6.144-7.066-12.186-13.824-15.872-5.53-3.072-5.632-3.072-24.678-3.379-17.101-0.307-19.251-0.614-19.354-2.048 0-1.024-0.205-19.661-0.307-41.677-0.205-42.803-0.41-44.646-5.53-52.838-5.939-9.318-16.179-15.258-26.624-15.36-11.571-0.205-21.504 4.813-27.648 13.824-6.349 9.421-6.554 11.878-6.656 57.139v40.755h-56.934l-0.307-43.213-0.307-43.315-2.662-5.632c-13.926-28.979-53.76-25.19-61.85 5.837-1.229 4.71-1.536 13.824-1.536 46.080v40.243h-17.715c-13.107 0-19.149 0.41-23.142 1.638-8.602 2.458-15.77 10.24-17.92 19.251-0.819 3.277-1.024 255.078-0.307 256.307 0.41 0.614 304.128 1.024 308.224 0.41zM430.899 642.56c-7.373-2.253-12.083-8.602-12.083-16.384 0-9.728 7.168-16.794 16.896-16.794 12.186 0 20.173 12.083 15.462 23.347-3.277 7.782-12.493 12.288-20.275 9.83zM563.712 642.765c-3.789-0.819-8.909-5.632-10.957-10.24-7.066-15.77 12.493-30.413 26.214-19.558 7.27 5.734 8.192 17.51 1.741 24.883-3.379 3.891-11.264 6.246-16.998 4.915z" />
+<glyph unicode="&#xea40;" glyph-name="managing_equipment" d="M396.8 865.075c-17.203-1.843-47.206-11.981-71.578-24.371-21.299-10.752-33.792-20.89-38.81-31.334-5.12-10.752-4.301-18.125 4.506-39.834 3.379-8.397 6.861-18.637 7.68-22.733 4.506-20.787-3.482-40.858-24.269-61.44-21.299-21.094-41.267-28.774-62.157-23.859-3.584 0.819-13.312 4.301-21.709 7.68-15.565 6.246-23.962 8.294-30.618 7.475-9.728-1.229-21.197-10.138-30.106-23.552-12.902-19.558-28.365-56.832-32.973-78.95-5.837-28.774 0.307-42.394 23.859-52.429 5.427-2.253 14.746-6.554 20.685-9.421 17.715-8.602 26.829-19.661 31.846-38.707 1.946-7.373 2.355-11.264 2.355-25.6 0-19.456-2.15-30.618-7.782-41.165-7.066-13.312-16.077-20.275-37.683-29.389-20.582-8.704-27.546-13.619-32.154-22.323-6.656-12.902-3.277-35.635 10.752-70.963 13.312-33.894 28.16-56.013 41.882-62.771 10.138-4.915 18.637-4.198 36.352 3.072 18.534 7.578 25.805 9.626 35.43 10.138 13.005 0.512 23.962-2.97 36.25-11.674 9.011-6.349 17.92-14.746 24.678-23.142 12.493-15.565 17.613-29.286 16.384-43.622-0.717-9.421-2.253-14.541-8.397-29.901-6.349-15.667-7.68-20.378-7.782-27.955-0.307-19.558 20.173-36.454 66.765-54.989 50.278-20.070 73.318-18.227 85.811 7.066 1.638 3.277 3.584 7.578 4.301 9.523s2.662 6.451 4.301 10.035c1.536 3.584 2.867 6.758 2.867 7.066 0 1.331 9.421 14.438 12.493 17.408 7.168 6.861 19.968 12.8 32.563 15.155 1.946 0.41 10.035 0.819 17.92 1.024 31.744 0.717 52.429-8.499 64.102-28.672 1.946-3.379 5.837-11.469 8.499-17.92 2.765-6.451 6.042-13.824 7.475-16.384 3.891-7.168 10.24-13.107 16.691-15.462 5.939-2.355 18.125-3.174 24.576-1.843 1.946 0.41 6.349 1.331 9.728 1.946 11.571 2.355 35.43 11.059 52.736 19.354 37.786 18.022 51.098 33.485 46.797 54.374-0.512 2.56-3.686 11.366-6.963 19.661-9.114 22.63-10.65 32.358-7.475 45.978 4.71 20.275 28.16 46.899 50.893 57.856 16.794 8.090 31.437 7.066 57.139-3.686 20.173-8.499 29.389-9.523 39.731-4.403 17.613 8.602 37.478 43.418 52.326 91.955 3.174 10.342 4.403 27.136 2.56 34.816-1.638 7.168-3.686 10.752-9.011 15.565-5.222 4.813-7.885 6.246-24.269 13.21-15.872 6.656-23.040 10.957-29.696 17.818-11.878 12.083-17.203 28.467-17.203 52.736 0 30.208 8.499 49.152 27.443 61.133 3.072 1.946 12.493 6.451 20.89 10.035 21.094 9.011 27.136 13.926 30.925 25.293 5.018 14.95 0.205 39.014-15.155 74.547-19.558 45.363-36.147 61.645-58.47 57.651-2.867-0.512-11.981-3.686-20.275-7.066-22.733-9.114-32.256-10.65-45.261-7.68-25.088 5.837-56.013 36.352-62.566 61.85-3.277 12.595-1.536 23.654 7.373 45.875 6.656 16.486 8.499 24.166 7.68 30.618-2.253 17.818-21.197 33.075-62.669 50.278-18.739 7.885-36.045 13.107-48.23 14.541-16.998 2.048-26.317-0.41-34.509-9.318-4.813-5.222-6.144-7.578-13.619-25.293-2.97-7.066-7.27-15.667-9.421-19.149-11.981-19.046-32.973-27.546-65.331-26.522-21.709 0.717-37.171 6.144-47.923 16.794-7.373 7.168-11.366 14.029-19.046 32.256-8.090 19.149-14.746 27.238-24.678 30.31-4.198 1.229-14.029 1.946-19.456 1.434zM573.645 633.037c22.938-11.264 22.528-43.93-0.614-54.886-3.686-1.741-7.475-2.458-14.336-2.765-8.499-0.41-11.469-0.717-20.582-2.048-37.274-5.734-73.114-32.051-91.341-66.97-25.19-48.333-16.384-109.056 21.606-147.763 20.787-21.094 45.773-33.587 76.39-38.195 1.434-0.205 6.963-0.614 12.493-0.819 13.824-0.614 21.197-3.994 27.648-12.8 10.957-14.848 5.427-36.659-11.264-44.851-5.018-2.458-7.168-2.867-15.565-3.072-19.251-0.307-43.008 4.096-63.488 11.674-45.568 16.998-82.739 50.586-103.936 94.003-5.939 12.288-12.8 31.846-14.95 42.803l-1.331 6.861h-19.456c-24.678 0-30.208 1.331-37.888 8.909-14.541 14.336-11.469 37.581 6.554 48.23 5.222 3.072 9.523 3.584 30.72 3.686l18.944 0.102 0.819 4.608c6.042 31.437 16.998 56.525 35.635 81.408 34.918 46.49 91.546 75.059 148.378 74.752 8.499 0 10.445-0.307 15.565-2.867zM578.458 536.986c30.72-4.915 56.627-25.6 69.12-55.194l2.765-6.656 20.787-0.102c23.962-0.102 28.262-1.024 35.84-7.68 11.776-10.445 13.722-28.16 4.301-40.653-4.301-5.939-11.878-10.445-19.866-11.981-0.922-0.205-11.264-0.41-22.835-0.41l-21.197-0.102-1.638-4.301c-2.867-6.963-10.445-17.92-17.306-24.781-7.885-7.987-12.698-11.674-21.299-16.384-20.582-11.264-44.134-14.029-67.174-7.782-37.99 10.342-64.819 44.237-66.253 83.763-1.434 40.755 23.962 76.595 63.283 89.293 12.186 3.994 28.467 5.12 41.472 2.97z" />
+<glyph unicode="&#xea41;" glyph-name="Map" d="M102.707 479.539c0.205-310.477 0.307-327.27 2.048-332.902 7.782-25.498 24.781-43.622 49.357-52.838 11.571-4.301-1.638-4.198 393.318-4.198h374.17l-0.102 324.403c-0.102 307.507-0.205 324.71-1.843 332.493-6.246 27.648-26.522 48.742-54.886 57.242l-7.168 2.15-755.2 0.512 0.307-326.861zM465.408 761.344l19.456-19.456-36.352-36.352-37.581 37.683-37.683 37.581h72.704l19.456-19.456zM398.643 510.669l-270.131-270.029-0.307 53.965-0.205 54.067 431.616 431.923 109.056 0.205-270.029-270.131zM249.139 506.163l-18.227-18.227-102.912 102.912v72.704l139.264-139.264-18.125-18.125zM896 627.2v-25.6h-117.248l-76.8-76.8 194.048-194.048v-72.704l-230.4 230.4-157.696-157.696 1.946-7.68c2.458-9.216 2.253-25.088-0.41-33.69l-1.741-5.53 168.653-168.653h-72.704l-132.301 132.301-6.042-1.843c-8.397-2.56-26.419-2.56-34.611-0.102l-6.042 1.946-132.301-132.301h-72.704l168.653 168.653-1.946 6.042c-2.458 8.192-2.458 26.214 0.102 34.611l1.843 6.042-66.765 66.765 18.125 18.227 18.227 18.125 66.765-66.765 5.53 1.638c9.83 2.97 22.733 3.277 32.666 0.717l8.704-2.15 157.696 157.696-90.112 90.112 18.227 18.125 18.125 18.227 90.112-90.112 91.648 91.648h138.752v-25.6z" />
+<glyph unicode="&#xea42;" glyph-name="map_pin" d="M482.816 881.664c-68.403-7.578-126.669-36.352-174.899-86.221-38.605-40.038-64.922-93.184-74.035-149.504-3.174-19.661-4.198-51.098-2.253-70.963 3.789-39.322 15.258-75.674 35.942-113.459 3.584-6.554 8.294-15.155 10.445-19.149 2.15-3.891 4.608-8.499 5.632-10.24 1.024-1.638 3.686-6.554 5.939-10.752s13.824-25.6 25.805-47.616c11.981-21.914 23.45-42.906 25.395-46.592s7.373-13.517 11.981-22.016c4.608-8.397 10.138-18.534 12.288-22.528 4.198-7.782 8.499-15.77 12.595-23.040 1.331-2.56 8.499-15.667 15.77-29.184 7.373-13.517 15.77-28.979 18.739-34.304 5.939-10.65 8.192-14.848 18.432-33.792 6.451-11.981 8.909-16.384 15.872-29.184 5.12-9.318 59.085-108.442 62.054-113.869 1.536-2.97 3.174-5.427 3.584-5.427s2.56 3.584 4.915 7.987c2.253 4.301 5.939 11.162 8.090 15.053 2.15 3.994 5.837 10.65 8.090 14.848 2.355 4.198 6.554 12.083 9.523 17.408s7.68 14.131 10.445 19.456c2.867 5.325 6.554 11.878 8.090 14.643 1.638 2.662 2.97 5.018 2.97 5.222s3.482 6.758 7.782 14.541c4.301 7.782 9.626 17.715 11.981 21.914 2.253 4.198 12.186 22.426 22.016 40.448s19.456 35.738 21.402 39.424c2.048 3.686 6.451 11.776 9.83 17.92 8.090 14.746 9.83 18.125 21.709 39.936 10.445 19.149 11.469 21.094 22.016 40.448 3.584 6.451 7.782 14.234 9.318 17.203 1.638 2.867 4.301 7.782 5.939 10.752 1.536 2.867 9.933 18.227 18.534 33.997s17.101 31.437 18.944 34.816c1.843 3.379 5.12 9.421 7.168 13.312 2.15 3.994 7.373 13.414 11.571 20.992 9.83 17.818 14.746 27.648 20.173 40.96 20.992 51.302 26.317 107.418 15.36 162.099-12.493 62.566-47.309 120.934-96.154 160.973-2.765 2.253-6.451 5.325-8.192 6.758-8.602 7.27-31.539 21.402-47.206 29.082-29.901 14.746-57.549 22.835-93.696 27.648-10.138 1.331-47.821 1.331-59.904 0zM537.6 804.864c24.166-4.198 31.539-6.042 45.978-11.469 57.651-21.402 103.731-69.427 122.88-127.795 7.68-23.45 9.83-38.605 9.728-66.56-0.205-32.358-5.734-56.73-19.763-86.016-10.65-22.221-23.859-40.653-41.779-57.856-12.8-12.39-15.77-14.848-29.491-24.064-25.805-17.306-59.802-29.798-89.702-32.973-9.318-1.024-38.195-1.024-46.49-0.102-85.197 10.035-155.136 71.475-175.718 154.624-7.987 31.949-7.578 70.144 1.126 102.707 21.094 78.848 90.317 139.059 171.622 149.402 11.059 1.331 44.032 1.434 51.61 0.102z" />
+<glyph unicode="&#xea43;" glyph-name="Medal" d="M214.221 719.974l137.523-137.626 5.632 3.174c14.131 7.782 18.739 10.138 29.184 14.848 26.010 11.776 55.091 20.070 82.944 23.757 5.12 0.614 10.342 1.434 11.776 1.741 4.813 0.922 48.64 1.126 57.344 0.205 27.238-2.765 50.79-7.782 73.216-15.565 11.981-4.096 26.214-9.83 27.648-11.059 0.512-0.512 1.536-0.922 2.253-0.922s-56.934 58.266-128.205 129.536l-129.536 129.536h-307.302l137.523-137.626zM584.806 802.611l-54.682-54.784 153.702-153.702 263.475 263.475-307.814-0.102-54.682-54.886zM492.442 601.19c-0.205-0.205-3.891-0.614-8.090-0.922-46.49-3.686-100.557-24.576-139.776-53.862-58.573-43.827-97.28-106.394-110.080-178.278-4.506-25.088-5.018-64-1.126-89.088 10.445-67.174 41.165-124.109 91.238-168.96 42.496-38.093 93.798-61.542 152.576-69.632 10.752-1.536 48.947-2.15 59.699-1.024 45.978 4.915 82.33 16.794 120.32 39.322 10.342 6.246 31.334 21.299 39.117 28.262 35.738 31.949 60.518 66.867 77.312 108.851 8.090 20.48 15.462 48.435 17.408 66.765 0.41 3.379 0.922 7.27 1.229 8.704 1.229 5.939 1.024 47.104-0.307 58.368-5.939 51.712-23.757 97.382-53.76 137.933-34.611 46.694-83.866 82.227-138.854 99.942-19.046 6.246-29.389 8.499-57.139 12.595-4.403 0.614-49.152 1.536-49.766 1.024zM537.6 523.366c1.946-0.41 7.782-1.434 12.8-2.253 52.634-9.216 102.4-42.701 133.222-89.498 16.691-25.498 28.57-58.266 31.846-88.064 1.024-9.728 1.024-38.298 0-47.104-7.168-60.518-40.55-114.381-91.853-148.070-32.461-21.299-67.482-31.949-107.52-32.666-36.966-0.717-71.885 7.475-100.659 23.757-3.379 1.843-6.144 3.379-6.349 3.379s-3.994 2.355-8.397 5.222c-39.117 25.805-67.994 62.976-82.637 106.496-7.885 23.552-10.342 39.629-10.342 66.97 0 20.787 1.434 31.846 6.144 50.176 9.421 36.352 28.262 68.403 55.91 95.334 20.685 19.968 43.622 34.611 70.554 44.749 24.166 9.216 46.387 12.902 74.752 12.493 10.445-0.205 20.582-0.614 22.528-0.922zM507.597 472.883c-1.946-4.403-8.499-18.125-14.541-30.515-5.939-12.39-14.131-29.389-18.227-37.888-3.994-8.397-7.578-15.667-7.885-16.077s-10.65-2.355-23.040-4.301c-12.39-2.048-24.781-4.096-27.648-4.608-2.765-0.614-16.998-2.97-31.437-5.325l-26.419-4.301 6.451-5.837c7.373-6.656 23.552-21.094 34.509-30.72 7.27-6.349 13.722-12.083 19.456-17.306 1.434-1.331 6.554-5.837 11.571-10.138 4.915-4.301 8.909-8.192 8.909-8.806 0-0.922-24.986-102.195-26.317-106.496-0.512-1.843-0.41-1.843 2.867 0.102 1.946 1.126 6.758 3.789 10.65 5.939 3.994 2.15 9.011 4.915 11.264 6.144 4.198 2.355 14.336 7.885 23.552 12.8 2.867 1.536 15.36 8.397 27.955 15.258l22.733 12.493 18.227-9.933c9.933-5.53 19.558-10.752 21.299-11.776 1.843-1.024 7.68-4.096 13.005-7.066 5.325-2.867 18.022-9.728 28.058-15.258s18.33-10.035 18.432-9.933c0.102 0.102-5.837 24.474-13.312 54.17l-13.414 53.965 3.277 2.867c1.741 1.638 4.813 4.301 6.656 5.939 1.741 1.638 6.963 6.246 11.366 10.138 4.506 3.994 9.523 8.499 11.264 10.035s13.414 11.981 26.010 23.040c12.493 11.059 22.426 20.275 22.016 20.378-1.434 0.41-105.882 17.715-106.906 17.715-0.512 0-2.048 2.458-3.379 5.427-2.458 5.325-7.373 15.565-24.883 51.917-5.018 10.445-10.957 22.733-13.107 27.443-2.253 4.608-4.301 8.397-4.608 8.397-0.41 0-2.355-3.584-4.403-7.885z" />
+<glyph unicode="&#xea44;" glyph-name="Medical_app" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM495.616 600.883c-8.397-0.922-24.576-4.608-33.178-7.578-54.886-18.944-94.106-66.253-102.502-123.802-1.741-12.186-1.229-37.274 0.922-49.152 10.138-54.477 49.459-100.045 101.478-117.658 25.805-8.704 56.627-10.445 82.944-4.608 32.563 7.168 65.229 27.238 84.992 52.122 2.253 2.867 4.403 5.325 4.71 5.632 0.41 0.307 2.867 3.891 5.53 8.090 11.469 17.715 19.251 37.683 22.835 58.573 2.56 14.746 2.458 39.731-0.205 53.658-8.704 44.749-36.659 83.558-76.288 105.882-22.426 12.698-44.851 18.637-71.27 19.046-9.011 0.102-18.022 0-19.968-0.205zM537.6 512v-38.4h76.8v-51.2h-76.8v-76.8h-51.2v76.8h-76.8v51.2h76.8v76.8h51.2v-38.4z" />
+<glyph unicode="&#xea45;" glyph-name="Medical_app_phone" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.698 86.118c8.806-5.12 13.517-14.336 12.493-24.474-1.229-12.698-10.138-21.504-23.040-22.938-17.818-1.843-32.256 16.384-26.214 33.382 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.070-2.56zM412.877 574.054c-4.096-1.024-10.854-3.584-15.053-5.632-19.149-9.421-31.949-25.805-37.478-47.718-3.584-14.029-1.741-31.642 4.71-45.568 4.096-8.704 8.192-13.926 32.768-40.96 5.632-6.246 13.926-15.36 18.432-20.378s10.547-11.776 13.414-14.848c4.506-5.018 18.125-20.070 31.437-34.918 2.355-2.56 6.246-6.963 8.806-9.728 2.56-2.867 8.602-9.523 13.414-14.746 4.813-5.325 9.216-10.138 9.728-10.752 3.072-3.379 18.432-20.685 18.534-20.89 0.205-0.205 2.048 1.536 4.198 3.994 2.15 2.355 4.403 4.813 4.915 5.427 0.614 0.614 11.674 12.902 24.576 27.238s23.757 26.317 24.064 26.624c0.307 0.307 6.758 7.475 14.336 15.872 7.578 8.499 14.029 15.565 14.336 15.872s6.554 7.168 13.824 15.36c7.27 8.192 13.517 15.053 13.824 15.36s4.915 5.325 10.24 11.264c5.325 5.939 10.547 11.674 11.571 12.8 3.277 3.379 10.445 14.95 12.8 20.685 12.595 30.003 1.434 66.97-25.702 85.197-23.347 15.667-53.658 16.282-77.005 1.536-7.066-4.403-10.24-7.168-28.774-24.781-5.018-4.915-10.957-10.445-13.005-12.39l-3.686-3.482-4.915 4.403c-2.662 2.458-11.162 10.445-18.739 17.715-16.589 15.974-25.293 21.914-37.478 25.805-11.674 3.789-26.726 4.403-38.093 1.638z" />
+<glyph unicode="&#xea46;" glyph-name="medical_chart" d="M502.272 908.186c-1.126-0.205-4.608-0.922-7.68-1.536-12.288-2.458-27.443-10.957-36.966-20.582-5.939-6.042-13.21-16.691-16.282-23.757l-1.946-4.608-63.386-0.614-5.939-4.096c-4.198-2.97-6.656-5.53-8.602-9.216l-2.56-5.018-0.614-109.158h307.405l-0.307 55.091-0.307 54.989-2.97 4.915c-1.536 2.662-4.403 6.042-6.349 7.475-6.451 5.018-10.65 5.53-42.086 5.53h-29.082l-1.946 4.71c-9.933 23.142-32.154 40.653-57.446 45.261-5.12 1.024-19.558 1.331-22.938 0.614zM522.342 855.347c9.83-4.198 15.872-14.541 14.95-25.395-2.048-24.064-32.666-31.949-46.387-11.981-9.318 13.517-2.97 32.358 12.8 38.298 4.403 1.638 13.517 1.126 18.637-0.922zM218.419 804.966c-13.414-3.277-27.955-14.643-33.382-26.214-6.349-13.312-5.837 15.77-5.837-369.664 0-383.283-0.41-355.84 5.734-368.538 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.144-8.806-5.734 303.514-5.734 202.24 0 288.666 0.307 292.864 1.126 18.842 3.379 34.816 18.637 39.936 37.888 2.253 8.294 2.253 707.277 0 715.571-3.584 13.722-14.541 27.546-26.112 33.178-11.981 5.734-13.21 5.837-71.885 5.837h-54.067v-51.2h102.4v-691.2h-563.2v691.2h102.4v51.2l-54.477-0.102c-39.936 0-56.013-0.41-59.904-1.331zM446.669 641.229c-3.482-2.048-6.042-6.042-7.475-11.469-0.41-1.638-1.741-6.758-2.97-11.264-7.782-29.901-13.926-53.248-19.456-74.752-2.355-9.011-5.12-19.558-6.144-23.552-1.024-3.891-3.584-13.619-5.632-21.504-4.813-18.432-8.806-33.792-12.902-49.152-1.741-6.758-3.482-13.517-3.686-15.155-0.307-1.536-0.922-2.97-1.331-3.277-0.41-0.205-5.939 7.373-12.288 16.998-9.318 14.029-12.39 17.818-15.462 19.456-3.686 1.843-6.349 1.946-40.858 1.946h-36.864v-30.72h62.464l18.944-28.467c20.173-30.31 22.63-32.973 30.106-32.973 4.71 0 11.059 3.584 13.005 7.475 1.024 1.741 3.072 8.090 4.608 14.029s4.403 16.998 6.349 24.576c2.048 7.578 6.246 23.757 9.318 35.84 3.174 12.083 6.349 24.371 7.066 27.136 0.819 2.867 4.506 16.896 8.192 31.232 9.728 37.274 9.728 37.478 10.035 36.659 0.614-2.56 0 0.819 7.578-43.315 3.072-17.408 7.373-42.803 9.728-56.32s4.608-26.829 5.12-29.696c2.56-14.336 6.554-37.888 11.264-65.536 2.867-16.896 5.939-32.461 6.861-34.611 2.355-5.53 9.114-9.318 15.053-8.704 5.53 0.614 10.138 3.994 12.288 8.909 0.922 2.048 2.97 8.499 4.608 14.438s6.656 23.654 11.264 39.424c4.506 15.77 8.704 30.72 9.421 33.28 1.024 3.891 1.331 4.301 2.048 2.56 0.922-2.15 14.029-49.357 14.848-53.658 0.819-4.198 4.301-9.933 6.963-11.776 7.373-4.813 18.227-2.15 21.914 5.325 1.126 2.048 6.246 18.125 11.366 35.533 5.222 17.51 9.626 31.846 9.728 32.051 0.205 0.102 3.686-6.451 7.782-14.746 5.018-9.83 8.602-15.565 10.445-16.998 5.939-4.096 14.95-3.379 19.763 1.741 1.126 1.126 7.987 12.083 15.36 24.371l13.312 22.221h64v30.72h-37.888c-35.84 0-38.195-0.102-41.984-2.048-3.277-1.638-5.427-4.403-12.902-16.896-4.915-8.192-9.318-14.541-9.728-14.131s-5.12 9.318-10.445 19.763c-8.602 16.998-9.933 19.149-13.619 21.197-9.626 5.53-19.968 0.307-23.245-11.469-1.024-3.789-5.939-20.378-9.421-31.744-1.843-6.144-3.789-12.39-4.198-13.824-0.512-1.843-2.15 2.765-6.656 19.456-3.277 12.083-6.963 25.293-8.090 29.184-1.126 3.994-2.048 7.782-2.048 8.499 0 2.765-5.427 9.216-9.216 10.957-9.318 4.198-18.842-1.229-21.709-12.493-1.741-6.246-19.866-70.042-20.992-73.523-0.512-1.536-0.922-0.922-1.434 2.56-0.512 2.56-2.662 15.258-4.915 28.16-2.253 13.005-5.939 34.202-8.192 47.104-2.15 13.005-5.632 32.973-7.68 44.544-3.584 20.992-9.421 55.194-10.445 60.928-2.56 15.77-7.782 44.646-8.499 47.309-1.229 4.198-3.891 6.963-8.602 9.011-4.813 1.946-9.421 1.741-13.824-0.819zM281.6 222.72v-20.48h460.8v40.96h-460.8v-20.48zM281.6 151.040v-20.48h460.8v40.96h-460.8v-20.48z" />
+<glyph unicode="&#xea47;" glyph-name="Medical_files" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM535.552 574.464c77.824-11.162 138.957-69.325 152.576-145.101 7.066-39.424 1.229-78.746-16.998-114.483-8.909-17.306-18.022-29.798-32.666-44.544-32.768-32.87-73.626-50.688-120.32-52.429-80.691-3.072-154.010 49.357-177.562 126.771-5.837 19.149-7.27 30.925-7.168 55.706 0.102 16.998 0.922 23.757 5.222 40.96 14.95 60.621 62.874 109.978 123.597 127.488 22.323 6.451 51.712 8.704 73.318 5.632zM460.8 486.4v-38.4h-76.8v-102.4h76.8v-76.8h102.4v76.8h76.8v102.4h-76.8v76.8h-102.4v-38.4z" />
+<glyph unicode="&#xea48;" glyph-name="menu" d="M106.906 754.176c-10.957-2.15-21.299-10.65-26.419-21.402-2.765-6.042-3.174-7.782-3.174-15.974 0-8.397 0.307-9.83 3.379-16.077 4.301-8.704 10.138-14.541 18.637-18.637l6.656-3.174h812.032l6.656 3.174c8.397 4.096 14.848 10.445 18.637 18.432 9.114 19.456 1.024 41.574-18.637 50.995l-6.656 3.174-403.456 0.102c-221.901 0.102-405.402-0.205-407.654-0.614zM105.37 497.766c-10.65-2.867-19.251-10.035-24.678-20.582-2.97-5.53-3.277-7.066-3.277-15.872-0.102-8.806 0.205-10.342 3.072-16.384 3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.277c7.475 3.686 9.216 5.018 14.438 11.571 5.53 6.861 7.578 13.312 7.578 23.552 0 7.578-0.41 9.523-3.174 15.36-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-403.968 0.205c-317.85 0.102-404.992-0.102-408.678-1.126zM104.96 241.766c-11.366-3.584-19.354-10.547-24.474-21.094-2.765-5.939-3.174-7.68-3.174-15.872s0.41-9.933 3.174-15.872c3.994-8.397 10.342-14.746 18.842-18.842l6.656-3.174h812.032l6.656 3.174c8.499 3.994 14.848 10.342 18.842 18.842 2.867 5.939 3.174 7.68 3.174 15.872s-0.307 9.933-3.174 15.872c-3.994 8.397-10.342 14.746-18.842 18.842l-6.656 3.174-404.48 0.205c-324.915 0.102-405.299-0.102-408.576-1.126z" />
+<glyph unicode="&#xea49;" glyph-name="Message_download" d="M245.248 779.571c-19.046-3.584-36.045-21.197-39.424-40.755-0.819-4.608-1.024-32.87-0.819-93.184l0.307-86.528 2.765-7.066c1.638-3.789 4.403-9.114 6.349-11.776 5.53-7.373 263.27-263.27 269.619-267.571 12.39-8.499 30.925-10.752 44.646-5.53 3.891 1.434 9.216 4.096 11.981 5.939s41.267 39.424 85.709 83.354c44.339 44.032 103.834 102.912 132.198 130.97 48.026 47.616 51.712 51.507 54.989 58.266 1.946 3.994 3.994 10.24 4.608 13.926 0.614 4.198 1.024 38.81 0.922 92.16v85.504l-2.355 7.373c-5.734 17.715-18.842 29.901-36.966 34.611-5.325 1.331-35.942 1.536-267.776 1.434-160.768-0.102-263.578-0.512-266.752-1.126zM566.989 677.274c7.578-3.174 9.216-4.096 11.674-6.758 6.861-7.27 6.554-3.174 6.861-76.288l0.307-66.355h75.162l-64-63.898c-59.392-59.187-64.512-64.102-71.168-67.277-6.246-3.072-8.090-3.482-15.36-3.482s-9.011 0.41-15.36 3.482c-6.656 3.277-11.674 7.987-70.861 67.072-35.021 34.918-63.488 63.693-63.283 63.898 0.205 0.307 16.998 0.512 37.376 0.512h36.864v63.488c0 46.182 0.307 64.614 1.229 67.686 2.662 9.114 8.090 14.95 16.486 17.613 5.837 1.741 109.773 2.048 114.074 0.307zM128 355.635c0-212.89-0.41-199.475 5.837-212.582 3.277-7.066 13.926-17.92 21.504-22.016 11.571-6.144-13.824-5.837 380.006-5.837h360.653v435.405l-3.482-3.379c-5.53-5.632-73.011-71.578-83.763-81.92-5.427-5.325-18.125-17.715-28.16-27.546-23.040-22.426-87.040-84.992-97.587-95.232-11.366-11.059-75.981-74.035-98.406-96.051-20.992-20.582-26.726-25.293-36.762-30.31-12.8-6.554-23.142-8.909-38.093-8.909-12.8 0.102-24.064 2.765-36.147 8.704-13.824 6.861-1.229-5.018-131.994 124.006-29.696 29.286-61.747 60.826-71.27 70.144-21.811 21.402-130.867 128.922-137.421 135.578l-4.915 4.915v-194.97z" />
+<glyph unicode="&#xea4a;" glyph-name="messaging" d="M128 508.211c0-213.914 0.205-248.013 1.536-254.259 6.963-32.87 32.154-56.525 65.536-61.338 1.741-0.205 21.811-0.512 44.851-0.512l41.677-0.102v-153.702l76.8 76.902 76.902 76.8h460.698v245.862c0 173.568-0.307 247.91-1.126 253.030-4.506 28.979-26.010 52.838-55.706 61.85-5.939 1.843-20.787 1.946-358.605 2.15l-352.563 0.307v-246.989zM725.504 625.459c6.554-2.15 13.107-8.909 15.36-15.77 3.379-9.933-0.205-22.016-7.987-27.955-7.987-6.144 6.758-5.734-220.774-5.734-234.394 0-214.528-0.717-222.925 7.68-13.107 13.21-8.090 35.533 9.523 41.984 3.277 1.126 36.966 1.434 212.89 1.434 192.102 0.102 209.306 0 213.914-1.638zM723.354 498.176c5.734-1.331 11.878-5.939 15.462-11.674 2.662-4.403 3.072-5.939 2.97-12.8 0-8.909-1.434-12.39-7.475-18.432-7.885-7.885 10.752-7.27-222.72-7.27-169.779 0.102-209.715 0.307-212.787 1.434-9.318 3.379-17.203 14.029-17.203 23.45 0 11.366 7.782 22.118 18.227 25.293 3.891 1.126 418.509 1.229 423.526 0zM520.499 369.562c2.765-0.922 6.758-3.482 9.216-5.939 12.186-11.878 9.728-31.334-5.12-40.141l-4.915-2.97-107.93-0.307c-122.061-0.307-114.381-0.717-122.573 7.578-10.035 10.342-9.933 25.702 0.205 35.84 7.782 7.782 1.229 7.475 120.32 7.475 94.515 0.102 106.598-0.102 110.797-1.536z" />
+<glyph unicode="&#xea4b;" glyph-name="messaging_compose_sms" d="M102.4 559.616c0-301.875-0.512-279.552 6.656-296.243 10.445-24.166 33.894-41.779 60.006-45.158 1.946-0.307 28.058-0.512 58.061-0.512l54.477-0.102v-154.112l153.702 154.112h48.64c26.726 0 48.435-0.307 48.23-0.717-0.717-1.229-20.173-37.376-25.805-47.923-2.662-5.018-7.885-14.746-11.571-21.504-3.584-6.758-8.499-15.77-10.752-19.968s-5.325-9.933-6.861-12.8c-1.536-2.765-5.018-9.216-7.68-14.336-2.662-5.018-7.782-14.541-11.264-20.992s-8.294-15.462-10.752-19.968c-2.355-4.506-5.939-11.162-7.885-14.746l-3.584-6.451 14.643 7.578c8.090 4.301 22.63 11.776 32.154 16.691 24.064 12.39 44.544 22.938 61.44 31.744 7.885 4.096 21.709 11.264 30.72 15.872s23.962 12.39 33.28 17.203l16.896 8.704 40.755 40.755 40.755 40.858h214.938v214.835l16.691 16.691c10.752 10.957 17.408 18.432 18.944 21.504 5.427 11.162 5.018 23.962-1.024 34.816-2.253 3.994-8.704 11.469-18.944 21.811l-15.667 15.77-0.102 110.49c-0.102 120.525 0.102 117.146-6.042 131.584-9.114 21.299-26.317 36.454-50.176 44.237l-6.656 2.15-756.224 0.512v-272.384zM750.49 676.864c18.022-6.349 23.245-28.672 9.83-41.984-8.397-8.397 14.643-7.782-250.368-7.475-225.178 0.307-236.237 0.41-239.411 2.15-15.77 8.602-19.251 28.877-6.963 41.062 8.397 8.397-15.053 7.578 248.013 7.68 203.366 0.102 235.213-0.102 238.899-1.434zM750.694 548.864c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493 0-6.656-0.41-8.397-2.867-12.595-3.379-5.734-9.114-10.138-15.258-11.878-3.379-0.922-61.645-1.126-239.923-0.922-228.659 0.307-235.622 0.41-239.104 2.253-1.946 1.024-5.018 3.482-6.861 5.325-5.427 5.632-6.861 9.318-6.861 17.818-0.102 6.656 0.307 8.294 2.765 12.493 3.277 5.325 8.090 9.523 13.824 11.571 3.174 1.126 41.677 1.434 238.387 1.434 206.848 0.102 235.213-0.102 239.104-1.434zM911.36 516.813c23.45-23.45 25.293-25.805 24.166-31.437-0.307-1.126-0.512-2.355-0.512-2.765-0.102-0.41-7.782-8.397-17.101-17.818l-17.101-16.998-52.838 52.838 19.661 19.763c10.854 10.854 19.866 19.763 20.070 19.763s10.854-10.445 23.654-23.347zM848.589 464.179c26.624-26.010 27.136-26.522 28.467-29.901 3.072-7.373 9.83-0.102-133.222-143.258l-133.427-133.734-15.155-7.885c-17.92-9.216-37.274-19.251-61.235-31.642-9.523-4.915-21.299-11.059-26.010-13.517s-8.704-4.403-8.806-4.198c-0.512 0.41 1.741 4.813 15.872 31.027 6.963 13.005 15.053 27.955 17.818 33.28 2.867 5.427 9.421 17.613 14.438 27.136l9.216 17.408 136.192 136.397c74.957 74.957 136.499 136.397 136.909 136.397 0.41 0.102 8.909-7.885 18.944-17.51zM520.192 420.864c10.854-3.789 16.896-12.698 16.794-24.576 0-5.939-0.512-7.987-2.867-12.083-3.277-5.53-7.987-9.523-13.619-11.571-3.174-1.126-26.112-1.331-122.778-1.434-133.837 0-125.952-0.41-133.939 7.578-10.24 10.24-10.24 26.112 0.102 36.045 8.090 7.885-0.922 7.373 132.506 7.475 103.219 0.102 120.013-0.102 123.802-1.434z" />
+<glyph unicode="&#xea4c;" glyph-name="messaging_unified" d="M102.707 556.339c0.205-261.427 0.307-276.070 2.048-281.702 9.523-31.027 33.997-52.224 65.229-56.525 1.434-0.205 27.136-0.41 57.139-0.41l54.477-0.102v-153.6l153.702 153.6h486.298l-0.102 273.203c-0.102 299.315 0.307 279.245-6.144 294.4-8.090 19.046-24.781 35.123-43.52 41.882-14.336 5.12 7.27 4.813-393.933 4.915h-375.501l0.307-275.661zM832.922 778.752c17.818-5.12 31.232-18.944 35.942-37.274 1.331-5.325 1.536-28.262 1.536-183.808 0-97.792 0-179.712 0-182.067v-4.403h-128v-50.688c0-27.853-0.205-50.688-0.512-50.688s-23.347 22.835-51.098 50.688l-50.483 50.688h-156.262c-108.851 0-157.901 0.307-161.69 1.126-2.97 0.614-8.806 2.765-12.8 4.71-13.414 6.451-24.576 21.504-26.931 35.942-0.614 3.482-1.024 78.643-1.024 186.88v180.941h272.179c267.571 0 272.282 0 279.142-2.048z" />
+<glyph unicode="&#xea4d;" glyph-name="messaging_untitled_compose" d="M102.4 559.616c0-244.326 0.205-273.306 1.638-280.269 6.042-29.184 27.238-51.814 55.501-59.085 9.523-2.458 9.83-2.56 67.584-2.56l54.477-0.102v-154.112l76.902 77.005 76.8 77.107h97.178l-3.379-6.349c-1.946-3.584-10.547-19.558-19.149-35.635-19.354-36.147-23.040-42.906-27.136-50.688-1.843-3.379-8.806-16.282-15.36-28.672-6.656-12.39-13.312-24.781-14.848-27.648-1.536-2.765-5.018-9.216-7.68-14.336-2.662-5.018-5.837-10.752-6.963-12.698-2.048-3.482-1.843-3.379 17.306 6.554 10.65 5.53 26.010 13.414 34.202 17.715 33.382 17.203 47.206 24.371 59.904 30.925 7.373 3.789 21.197 10.957 30.72 15.872 9.626 4.915 23.654 12.186 31.232 16.077l13.824 7.168 40.653 40.858 40.755 40.858h215.040v214.426l16.794 16.998c18.842 18.944 21.709 23.245 22.835 35.226 0.614 7.168-0.614 13.517-4.096 20.582-1.126 2.253-9.523 11.674-18.739 20.992l-16.794 16.998-0.102 110.49c-0.102 120.525 0 117.453-5.939 131.584-8.294 19.354-24.883 35.43-43.725 42.189-14.336 5.12 7.27 4.813-393.83 4.915h-375.603v-272.384zM832.922 778.752c17.818-5.12 31.232-18.944 35.942-37.376 1.331-5.222 1.536-18.432 1.536-94.208v-88.064l-235.008-235.008-23.347 23.552-23.245 23.552-130.867 0.102c-71.885 0-131.891 0.205-133.325 0.512-20.787 3.482-38.81 21.197-41.984 41.165-0.922 5.734-2.15 342.323-1.331 359.424l0.512 8.397h272.077c267.469 0 272.179 0 279.040-2.048zM910.438 517.939c12.186-12.288 22.938-23.45 23.859-24.883 2.048-3.072 2.15-7.373 0.205-11.059-0.819-1.536-8.704-9.933-17.51-18.637l-15.974-15.77-26.010 26.010c-14.336 14.336-26.112 26.419-26.112 26.829 0 0.819 37.99 39.424 38.912 39.629 0.307 0.102 10.445-9.933 22.63-22.118zM843.674 469.094c7.066-7.066 17.408-17.101 22.835-22.323s10.445-10.854 11.059-12.493c2.765-7.578 9.626-0.205-133.53-143.462l-133.222-133.325-11.776-6.144c-6.451-3.379-19.558-10.24-29.184-15.155-37.786-19.456-49.562-25.6-59.597-30.822-5.734-3.072-10.65-5.53-11.059-5.53-0.717 0 2.458 6.144 35.021 66.662l23.45 43.622 136.090 135.782c74.854 74.752 136.294 135.885 136.602 135.885 0.205 0 6.246-5.734 13.312-12.698z" />
+<glyph unicode="&#xea4e;" glyph-name="microphone" d="M485.376 881.050c-20.787-3.277-32.461-6.963-51.2-15.872-55.91-26.829-93.798-80.691-100.352-142.95-1.638-15.258-1.126-285.594 0.512-297.779 12.186-89.19 88.269-155.853 177.664-155.443 42.701 0.205 79.77 13.414 113.357 40.346 33.178 26.726 56.73 67.277 63.386 109.466 0.307 1.741 0.819 4.198 1.229 5.632 1.126 4.301 1.229 291.43 0.102 300.544-8.192 65.536-50.893 121.037-111.923 145.306-29.286 11.776-62.464 15.565-92.774 10.752zM528.077 830.976c48.23-6.246 89.907-40.346 105.165-86.016 6.349-19.251 6.144-15.155 6.451-108.749l0.41-85.811h-256.102l0.102 83.251 0.102 83.149 2.458 12.288c5.222 25.395 15.667 45.056 33.69 63.898 27.546 28.672 68.096 43.008 107.725 37.99zM234.189 523.776c-10.957-2.765-20.685-10.957-25.702-21.504l-3.174-6.656v-36.864c0.102-40.55 0.922-50.074 6.758-76.698 20.275-92.467 81.613-169.882 166.912-210.842 27.443-13.21 58.982-23.040 85.914-26.726l8.704-1.229 0.307-39.629 0.205-39.629h-46.899c-29.286 0-49.254-0.41-53.043-1.126-19.354-3.482-36.147-20.070-40.243-39.629-0.614-2.97-1.126-12.288-1.126-20.685v-15.36h358.4v15.36c0 8.397-0.512 17.715-1.126 20.685-3.994 19.046-20.582 35.635-39.629 39.629-3.482 0.717-22.323 1.126-52.941 1.126h-47.616v78.848l2.355 0.41c1.229 0.307 7.885 1.536 14.746 2.662 32.973 5.632 67.584 18.227 98.202 35.84 64 36.762 112.845 95.949 137.318 166.4 4.506 12.902 10.138 34.816 12.083 46.899 0.819 5.222 1.741 10.445 1.946 11.674 1.434 7.373 2.15 24.269 2.15 54.579v34.304l-3.379 6.861c-4.198 8.704-10.138 14.541-18.432 18.534-19.251 9.011-41.472 0.922-50.79-18.739l-3.174-6.656-0.717-35.84c-0.717-37.581-0.717-37.478-3.994-54.989-6.554-35.738-23.962-73.011-47.821-102.605-12.595-15.77-33.587-34.611-50.893-46.080-11.981-7.885-32.154-18.739-38.4-20.582-1.434-0.41-2.97-1.126-3.584-1.536-2.97-2.15-30.925-10.342-42.496-12.39-30.618-5.427-67.379-4.71-94.208 1.638-34.509 8.294-66.253 23.757-93.491 45.466-17.408 13.824-39.219 38.605-51.712 58.675-6.758 10.752-17.613 34.304-22.118 47.923-3.994 11.878-8.090 29.491-10.342 44.544-0.41 2.253-0.819 14.95-1.126 28.16-0.922 50.176-0.614 46.899-4.198 54.272-6.144 13.21-18.022 21.299-32.256 22.016-4.096 0.307-9.216 0-11.366-0.512z" />
+<glyph unicode="&#xea4f;" glyph-name="Microscope" d="M629.043 907.571c-0.614-0.717-3.994-6.554-7.578-12.902s-7.68-13.517-9.114-15.974c-1.434-2.355-6.656-11.469-11.674-20.173l-9.114-15.974-4.198 1.536c-5.632 1.946-13.517 1.843-18.227-0.205-7.168-3.072-10.752-7.578-22.938-28.57-6.554-11.366-13.619-23.654-15.77-27.341-7.27-12.39-25.19-43.52-27.853-48.128-1.434-2.56-5.222-9.216-8.499-14.848s-10.854-18.739-16.896-29.184c-6.042-10.445-19.558-33.894-30.208-52.224-10.547-18.33-20.48-35.43-21.914-37.99-2.355-4.198-13.312-23.040-35.635-61.85-4.198-7.27-11.571-20.070-16.384-28.365l-8.704-14.95-6.758 3.891c-3.789 2.15-13.722 7.885-22.118 12.698-8.397 4.915-15.36 8.704-15.565 8.602-0.102-0.205-6.042-10.445-13.21-22.835-11.981-20.89-18.432-31.949-23.245-40.141-1.024-1.741-1.536-3.379-1.126-3.686 0.41-0.205 10.035-5.734 21.299-12.186 11.264-6.554 38.195-22.118 59.904-34.611 21.709-12.595 40.858-23.552 42.496-24.576 2.662-1.536 36.147-20.89 46.387-26.726 1.741-1.126 4.813-2.765 6.656-3.789 4.813-2.765 36.454-21.094 40.653-23.552l3.584-2.15 8.090 14.029c4.403 7.68 12.39 21.606 17.715 30.822s10.342 17.818 11.162 19.046c1.434 2.253 1.331 2.458-3.379 5.325-2.662 1.741-11.776 7.066-20.275 11.878-8.397 4.813-16.179 9.421-17.203 10.24-2.048 1.434-3.277-0.922 21.197 41.165 2.97 5.12 10.854 18.739 17.613 30.413 10.547 18.227 12.39 20.89 13.722 19.763 2.97-2.458 18.944-9.626 26.624-11.776 5.222-1.536 11.571-2.355 19.968-2.56 13.312-0.41 19.354 0.41 31.232 4.198l7.68 2.458 9.011-9.318c40.96-42.803 55.194-107.622 36.352-165.171-13.824-41.984-44.954-77.619-85.299-97.382-47.616-23.245-104.448-22.221-151.040 2.765-4.198 2.253-8.090 4.506-8.704 5.018-0.512 0.512 14.438 0.922 36.659 0.922h37.581v51.2h-332.8v-51.2h102.4v-102.4l-2.765-0.102c-19.251-0.512-37.683-14.234-45.67-33.894-2.048-5.222-2.15-7.27-2.56-49.766l-0.307-44.237h563.302v40.96c0 25.907-0.41 42.803-1.126 46.285-3.584 16.998-16.282 31.539-33.382 37.99-5.837 2.15-7.27 2.253-62.259 2.765l-56.32 0.512 8.704 4.506c39.526 20.48 74.65 52.122 99.635 89.805 22.118 33.485 35.43 68.301 41.882 109.466 2.355 15.053 3.277 50.278 1.741 65.024-5.734 53.248-25.19 100.762-58.266 142.336-10.547 13.21-29.286 31.949-41.37 41.37-0.819 0.614-2.253 5.12-3.072 9.933-3.891 21.094-12.288 36.454-28.058 51.2-5.837 5.427-16.998 13.21-21.094 14.541-0.614 0.205 9.626 18.739 22.63 41.267 12.902 22.426 24.883 43.315 26.419 46.387 5.325 10.138 3.072 22.835-5.53 30.72l-3.994 3.686 7.066 11.981c17.818 30.72 30.618 53.146 30.618 53.76 0 0.512-8.192 5.53-18.227 11.264-28.365 16.179-62.874 36.147-66.355 38.298-2.56 1.536-3.482 1.638-4.198 0.717z" />
+<glyph unicode="&#xea50;" glyph-name="mini_games" d="M76.8 495.411c0-378.88 0.102-388.096 2.048-396.8 6.758-30.822 31.437-54.067 62.566-59.187 4.403-0.614 136.397-1.024 406.221-1.024h399.565v387.891c-0.102 264.397-0.41 389.53-1.126 393.421-6.042 31.437-29.594 55.501-60.928 61.952-6.554 1.331-55.603 1.536-407.962 1.536h-400.384v-387.789zM856.576 803.533c2.253-1.331 5.53-3.994 7.373-5.939 6.861-7.782 6.451 5.939 6.451-194.15v-181.043h-347.443c-389.018 0-352.973-0.717-361.472 7.578-8.602 8.294-7.885-8.397-7.885 195.379v181.043l698.88-0.512 4.096-2.355zM284.774 341.811c8.192-3.891 14.643-10.24 18.432-18.227s3.789-8.602 3.891-33.485l0.102-21.094 23.859-0.41 23.757-0.307 6.656-3.174c8.602-4.198 14.848-10.342 18.842-18.739 2.765-6.042 3.174-7.782 3.174-15.974s-0.41-9.933-3.174-15.872c-3.994-8.499-10.342-14.848-18.842-18.842l-6.656-3.174-23.757-0.307-23.757-0.41-0.307-23.654-0.307-23.757-3.174-6.656c-3.994-8.499-10.24-14.848-18.739-18.842-6.042-2.867-7.782-3.174-15.974-3.174s-9.933 0.307-15.872 3.174c-8.499 4.096-14.848 10.445-18.842 18.842l-3.174 6.656-0.614 47.514-47.514 0.614-6.656 3.174c-8.294 3.994-14.438 10.035-18.637 18.227-2.97 5.632-3.277 7.168-3.277 15.974-0.102 8.909 0.205 10.342 3.072 16.384 4.096 8.499 10.445 14.848 18.842 18.842l6.656 3.174 47.514 0.614 0.614 47.514 3.174 6.656c9.318 19.456 31.642 27.75 50.688 18.739zM835.891 342.733c21.094-7.066 35.84-29.286 34.202-51.405-1.741-21.914-15.155-38.912-36.045-45.67-12.902-4.198-29.286-2.15-41.882 5.222-10.342 6.042-20.378 20.48-23.040 33.075-5.53 26.726 11.366 53.453 38.093 60.211 7.066 1.843 21.094 1.126 28.672-1.434zM701.645 216.474c23.347-4.813 40.858-26.726 40.755-50.995-0.205-23.142-18.637-44.954-41.37-49.152-17.715-3.277-32.768 1.434-45.67 14.131-20.48 20.173-20.48 51.507-0.102 71.885 12.595 12.595 29.286 17.613 46.387 14.131z" />
+<glyph unicode="&#xea51;" glyph-name="mirroring" d="M141.312 881.562c-19.354-5.12-34.406-20.992-37.786-39.731-0.819-4.403-1.126-119.603-1.126-395.264 0-321.024 0.307-390.144 1.434-394.342 4.915-18.739 19.149-32.973 37.581-37.888 8.602-2.355 578.253-2.253 587.162 0 19.149 4.915 34.406 20.48 38.298 39.219 0.717 3.686 1.126 27.341 1.126 71.885v66.56h-51.2v-76.8h-563.2v716.8h383.59l1.126 8.499c1.946 13.824 6.963 26.214 15.258 36.864l4.506 5.837-205.619-0.102c-176.742 0-206.336-0.205-211.149-1.536zM448.205 86.016c19.763-11.571 14.95-41.677-7.475-46.694-11.162-2.458-22.835 2.765-27.853 12.595-9.421 18.227 3.891 38.605 24.269 37.171 4.506-0.307 7.885-1.229 11.059-3.072zM602.112 881.562c-16.589-4.403-29.286-15.974-35.942-32.666l-2.458-6.144-0.614-164.454-51.098-51.2-51.2-51.098 102.4-102.502v-104.858c0-72.602 0.307-106.496 1.126-110.285 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 269.21-1.638 276.89 0 19.763 4.096 36.352 21.197 39.731 40.858 0.819 4.813 1.024 87.962 0.819 294.912l-0.307 288.256-2.458 6.144c-6.451 16.077-17.613 26.726-33.382 31.846l-7.168 2.355h-135.168c-115.917 0-135.987-0.205-140.8-1.536zM870.4 576v-256h-256v512h256v-256zM751.104 292.659c14.643-4.915 21.094-23.245 13.107-36.864-11.981-20.582-44.032-14.029-47.002 9.626-2.355 19.149 15.462 33.587 33.894 27.238z" />
+<glyph unicode="&#xea52;" glyph-name="Missed_call_boxed_arrow" d="M345.6 831.59c-14.95-3.994-23.654-10.65-46.182-35.021-1.638-1.843-12.186-12.8-23.45-24.576-11.264-11.674-22.118-22.938-24.064-25.088-1.946-2.048-12.186-12.698-22.63-23.552-10.547-10.957-21.094-21.914-23.45-24.474s-13.005-13.619-23.552-24.576c-10.547-10.957-20.992-21.811-23.040-24.064-2.15-2.253-8.704-9.216-14.746-15.36-16.384-16.998-34.304-35.738-55.91-58.368-10.65-11.264-20.582-21.402-21.914-22.733l-2.458-2.355h179.507l0.102-208.589c0-114.79 0.205-209.613 0.41-210.739s0.614-3.789 1.024-5.939c0.307-2.15 1.536-6.758 2.765-10.24 8.192-24.166 27.75-42.291 53.248-49.562 6.144-1.741 20.582-1.843 300.851-1.843 281.395 0 294.707 0.102 300.954 1.843 27.238 7.782 46.694 27.238 55.091 55.501 1.741 5.837 1.843 18.739 1.843 259.584v253.44l-2.765 4.71c-1.536 2.56-4.403 5.939-6.554 7.578-7.578 5.734-5.12 5.632-105.882 5.632-101.683 0-97.997 0.205-105.574-6.042-1.946-1.638-4.608-5.12-6.042-7.885l-2.56-5.018-0.307-169.677-0.205-169.779h-256v257.024h89.19c52.224 0 88.986 0.41 88.781 0.922-0.102 0.512-9.626 10.547-20.89 22.221-11.366 11.776-22.63 23.45-24.986 26.010-2.458 2.56-13.005 13.619-23.552 24.576s-21.094 22.016-23.45 24.474c-5.939 6.349-49.869 52.122-79.565 83.046-5.734 5.939-12.39 12.8-14.746 15.36-2.458 2.56-13.21 13.824-23.962 25.088-48.845 50.995-49.562 51.712-62.874 56.525-8.499 3.174-24.576 4.096-32.461 1.946z" />
+<glyph unicode="&#xea53;" glyph-name="Missed_call_curved_arrow" d="M481.997 900.915c-9.523-1.638-21.197-6.246-29.184-11.674-3.584-2.355-71.68-69.632-173.466-171.315l-167.731-167.526h204.8l0.102-124.109c0-68.301 0.205-125.030 0.41-126.157 0.205-1.024 0.717-6.554 1.024-12.288 0.41-5.632 0.819-10.547 1.024-10.854s0.614-2.662 1.024-5.12c6.758-48.845 25.395-96.768 53.862-138.752 16.486-24.371 43.52-53.76 65.946-71.782 47.923-38.605 104.038-62.874 164.352-71.066 18.227-2.56 55.296-3.482 72.704-1.946 61.952 5.427 120.627 27.648 170.701 64.614 18.022 13.21 43.418 37.376 57.446 54.374l6.451 7.885-47.411 0.102c-26.112 0-48.538 0.205-49.971 0.512-1.434 0.205-7.168 1.126-12.8 2.048-29.082 4.71-59.802 20.685-81.408 42.394-22.835 22.938-36.864 50.483-43.622 85.504-0.41 2.253-0.922 71.68-1.126 154.419l-0.307 150.221h204.8l-167.219 166.912c-91.955 91.853-169.472 168.653-172.237 170.701-16.077 11.571-37.786 16.486-58.163 12.902z" />
+<glyph unicode="&#xea54;" glyph-name="mobile_applications" d="M293.99 881.562c-17.408-4.71-31.437-18.33-36.557-35.738-1.741-5.837-1.843-24.883-1.843-397.824s0.102-391.987 1.843-397.824c5.427-18.227 21.402-32.973 39.424-36.352 3.584-0.614 80.077-1.024 215.552-1.024 184.115 0 210.842 0.205 216.166 1.536 19.149 4.915 34.406 20.48 38.298 39.219 1.638 7.68 1.638 781.21 0 788.89-3.994 19.149-20.48 35.635-39.629 39.629-3.891 0.819-66.15 1.126-216.576 1.024-181.043 0-211.968-0.205-216.678-1.536zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM364.851 712.499c-6.246-2.15-13.005-9.011-15.155-15.565-1.434-4.506-1.638-8.499-1.331-26.112l0.307-20.787 3.072-5.018c4.096-6.656 11.162-11.366 18.33-12.186 2.97-0.41 13.722-0.512 23.757-0.307 20.48 0.41 21.914 0.819 28.979 7.885 6.656 6.656 7.475 11.059 7.066 35.328l-0.307 20.787-3.072 5.018c-3.584 5.734-9.728 10.342-15.462 11.674-6.861 1.638-41.165 1.126-46.182-0.717zM488.141 712.602c-6.451-2.048-13.107-8.602-15.36-15.258-2.355-6.656-2.458-39.731-0.307-47.002 1.946-6.349 5.734-11.162 11.674-14.643 4.813-2.867 5.018-2.867 25.498-3.174 24.576-0.41 28.672 0.41 35.738 7.578 6.861 6.758 7.885 11.571 7.373 36.147l-0.307 20.275-3.072 5.018c-3.482 5.53-10.035 10.445-15.667 11.776-6.554 1.536-40.038 1.024-45.568-0.717zM610.611 712.602c-6.144-2.253-12.902-9.114-14.95-15.258-2.458-6.963-2.458-39.629-0.102-47.514 2.048-6.963 8.397-13.414 15.258-15.77 5.939-2.048 36.966-2.458 45.466-0.614 6.656 1.434 12.595 5.734 16.179 11.878 2.765 4.813 2.867 5.222 3.174 23.347 0.205 10.138 0.102 20.89-0.307 23.757-0.819 7.066-5.632 14.131-12.186 18.227l-5.018 3.072-21.606 0.205c-17.306 0.205-22.426-0.102-25.907-1.331zM365.261 574.362c-6.656-2.048-13.21-8.602-15.462-15.565-2.56-7.578-2.048-45.158 0.614-49.971 2.97-5.53 9.626-11.366 14.746-13.107 6.758-2.253 41.062-2.355 47.616-0.102 6.144 2.15 10.65 5.939 13.926 11.571l2.867 4.813v46.285l-3.072 4.915c-3.379 5.427-9.114 9.933-14.95 11.674-5.734 1.741-40.243 1.331-46.285-0.512zM486.707 573.952c-6.246-2.765-12.083-9.114-14.131-15.258-1.434-4.403-1.638-8.499-1.331-26.010 0.307-20.582 0.307-20.685 3.174-25.6 1.638-2.662 4.71-6.246 6.861-7.782 6.656-4.813 10.957-5.427 33.382-5.018 20.173 0.307 20.48 0.307 25.19 3.174 5.632 3.277 9.421 7.782 11.571 13.926 1.843 5.325 2.15 40.141 0.512 46.387-1.638 5.632-6.963 11.981-12.8 15.053-5.018 2.56-5.632 2.662-26.624 2.867-18.944 0.102-22.016-0.102-25.805-1.741zM611.123 574.362c-6.554-2.048-13.312-8.806-15.667-15.667-1.434-4.506-1.638-8.499-1.331-26.112l0.307-20.787 3.072-5.018c3.584-5.734 9.728-10.342 15.462-11.674 6.963-1.638 40.448-1.229 45.568 0.512 6.144 2.15 10.65 5.939 13.926 11.571l2.867 4.813v46.080l-2.867 4.813c-3.072 5.325-7.373 9.011-13.21 11.366-5.325 2.253-41.165 2.253-48.128 0.102zM364.646 436.019c-2.458-0.922-6.554-3.584-8.909-5.939-6.554-6.554-7.578-11.264-7.578-33.792 0-21.914 1.024-26.112 7.782-32.87s11.469-7.782 35.43-7.373c18.227 0.307 20.173 0.512 24.576 2.662 5.427 2.662 10.65 8.602 12.698 14.336 1.946 5.632 1.946 41.472-0.102 47.206-2.048 5.939-6.042 10.854-11.571 14.131l-4.813 2.867-21.504 0.205c-17.613 0.205-22.323-0.102-26.010-1.434zM487.526 436.019c-6.451-2.253-12.902-9.114-14.848-15.77-2.253-7.373-2.355-39.322-0.102-46.592 1.946-6.554 6.144-11.571 12.39-14.746 4.813-2.458 6.042-2.56 25.293-2.867 23.859-0.41 28.058 0.512 35.021 7.475 7.066 6.963 7.885 11.162 7.475 35.635-0.307 20.48-0.307 20.685-3.174 25.498-3.174 5.427-8.090 9.626-13.722 11.674-5.837 2.048-42.291 1.843-48.333-0.307zM610.406 436.019c-6.042-2.15-12.698-8.909-14.746-15.155-2.458-7.168-2.458-41.472 0-47.821 2.458-6.451 5.939-10.65 11.366-13.824 4.813-2.867 5.018-2.867 25.498-3.174 24.064-0.41 28.672 0.512 35.226 7.066 7.27 7.27 7.475 8.294 7.885 31.232 0.205 13.005 0 22.118-0.717 24.781-1.536 5.632-6.758 12.186-12.39 15.462-4.506 2.56-5.018 2.662-26.112 2.867-17.613 0.205-22.323-0.102-26.010-1.434zM366.694 298.496c-5.222-1.229-11.469-6.144-14.95-11.776l-3.072-4.915v-23.142c0-25.907 0.102-26.317 7.68-33.894 6.042-6.042 11.162-7.168 33.382-7.168 20.070 0 24.371 0.819 30.822 5.734 1.843 1.331 4.608 4.71 6.144 7.373 2.867 4.813 2.867 5.018 3.174 25.6 0.41 24.064-0.512 28.57-7.066 35.123-7.27 7.27-8.192 7.578-31.642 7.782-11.571 0.102-22.528-0.205-24.474-0.717zM485.888 296.96c-6.554-3.379-11.264-8.602-13.312-14.95-1.434-4.096-1.638-8.704-1.331-25.702 0.307-20.48 0.307-20.89 3.072-25.498 3.379-5.734 8.704-9.933 14.95-11.776 5.325-1.638 38.093-1.946 44.646-0.41 5.632 1.229 11.878 6.042 15.462 11.776l3.072 4.915 0.307 20.378c0.41 22.938-0.512 28.262-6.042 34.918-6.349 7.68-8.806 8.294-33.69 8.704-21.811 0.205-22.016 0.205-27.136-2.355zM610.918 297.882c-5.837-2.15-10.445-5.939-13.619-11.469-2.867-4.813-2.867-5.018-3.174-25.6-0.41-24.474 0.41-28.57 7.475-35.533 6.656-6.758 10.854-7.68 33.28-7.68 22.323 0 26.214 0.922 33.075 7.578 6.963 6.656 7.885 10.752 7.885 33.485 0 21.094-0.717 24.781-6.144 31.642-1.741 2.253-5.53 5.12-8.499 6.554-5.12 2.355-6.144 2.458-25.805 2.56-15.462 0-21.504-0.41-24.474-1.536z" />
+<glyph unicode="&#xea55;" glyph-name="Mobile_backup_restore" d="M77.107 594.739c0.205-270.029 0.307-288.973 2.048-294.298 9.318-30.515 32.461-51.302 62.259-56.218 4.301-0.614 68.403-1.024 188.621-1.024h181.965v51.2h-168.243c-116.429 0-170.189 0.307-174.387 1.126-19.354 3.482-36.147 20.070-40.243 39.629-1.638 7.68-1.638 448.41 0 456.090 3.891 18.637 18.944 34.202 37.888 39.219 4.71 1.331 38.912 1.536 228.966 1.536 159.744 0 224.973-0.307 228.864-1.126 19.456-4.096 36.147-20.992 39.629-40.243 0.614-3.379 1.126-12.698 1.126-20.787v-14.643h51.2v28.467c0 15.565-0.512 31.334-1.126 34.918-2.97 18.739-13.107 35.738-28.672 48.435-5.632 4.608-18.637 11.264-27.034 13.824-5.837 1.741-19.354 1.843-294.707 2.048l-288.461 0.307 0.307-288.461zM170.291 804.659c-2.458-0.819-6.349-3.482-8.909-5.837-8.499-8.397-7.885 13.517-7.578-237.67 0.307-212.89 0.41-223.437 2.15-226.611 1.024-1.843 3.686-5.12 5.939-7.373 7.987-7.68-5.837-7.168 181.862-7.168h168.243l0.307 186.163c0.205 172.646 0.41 186.47 2.048 191.795 9.728 31.744 34.406 52.941 65.946 56.627 1.536 0.205 15.667 0.41 31.334 0.512l28.365 0.102v14.131c0 16.486-1.434 22.528-6.349 28.16-1.843 2.048-5.222 4.71-7.475 6.042l-4.096 2.355-223.744 0.205c-197.018 0.102-224.256 0-228.045-1.434zM412.058 676.352c23.142-5.939 40.755-23.552 46.694-46.694 5.53-21.402-0.922-44.442-16.794-60.109-3.994-4.096-9.114-8.294-11.264-9.421l-3.891-2.048 0.717-8.704c0.307-4.813 0.819-10.342 1.024-12.288s0.614-7.68 1.024-12.8c0.307-5.018 0.819-11.469 1.024-14.336 0.205-2.765 0.717-8.806 1.024-13.312s0.819-11.366 1.024-15.36c0.307-3.891 0.717-9.728 1.024-12.8 0.205-3.072 0.717-9.011 1.024-13.005l0.717-7.475h-77.21l0.614 5.939c0.512 5.53 0.819 8.806 2.15 28.365 0.307 4.506 0.819 11.162 1.024 14.848 0.307 3.686 0.717 9.216 1.024 12.288 0.205 3.072 0.717 9.114 1.024 13.312s0.819 10.24 1.024 13.312c0.205 3.072 0.717 9.318 1.024 13.824l0.512 8.192-5.734 3.584c-20.48 12.698-31.846 40.96-26.522 65.946 7.475 35.123 43.315 57.549 77.722 48.742zM578.048 728.371c-17.818-3.379-33.997-19.046-38.912-37.786-1.331-4.71-1.536-50.893-1.536-318.566 0-225.178 0.307-314.573 1.126-318.464 3.891-18.637 18.944-34.202 37.888-39.322 4.71-1.229 29.696-1.331 168.346-1.126l162.816 0.205 5.427 2.253c16.998 6.963 29.389 21.299 32.87 37.99 0.819 3.891 1.126 93.696 1.126 317.952 0 347.955 0.614 319.488-7.168 332.595-7.475 12.595-20.582 21.914-34.202 24.371-7.885 1.434-320.205 1.331-327.782-0.102zM896 384v-268.8h-307.2v537.6h307.2v-268.8zM754.176 86.528c5.632-3.072 7.475-4.915 10.547-10.24 2.253-3.789 2.765-5.837 2.765-12.288 0-6.554-0.41-8.397-2.765-12.39-9.216-15.667-31.642-17.51-42.394-3.482-2.867 3.789-5.53 11.469-5.53 15.872 0 10.65 8.704 22.118 18.739 24.678 5.325 1.331 14.131 0.307 18.637-2.15z" />
+<glyph unicode="&#xea56;" glyph-name="mobile_box" d="M480.256 881.050c-56.013-7.373-104.346-30.413-144.384-68.915-45.363-43.622-72.090-98.202-78.746-161.382-0.614-5.018-0.922-94.31-0.717-208.384 0.205-219.546-0.307-202.24 6.349-231.731 14.95-66.867 60.416-128.307 120.73-163.328 23.962-13.824 60.006-27.238 80.896-30.003 2.253-0.307 4.71-0.717 5.427-1.024 0.819-0.205 3.584-0.717 6.144-0.922 2.662-0.307 8.090-1.024 11.981-1.536 7.475-0.922 44.339-0.614 53.248 0.512 48.23 5.939 93.696 24.986 131.072 54.784 11.776 9.421 31.949 29.696 40.55 40.96 26.214 33.792 42.496 69.325 50.586 110.49 4.506 22.528 4.506 22.221 4.198 232.55l-0.205 200.192-2.765 14.438c-4.403 23.654-8.397 37.888-15.77 55.706-31.437 76.288-97.587 133.427-176.435 152.371-11.674 2.867-16.896 3.686-36.864 6.246-11.469 1.536-40.448 1.024-55.296-1.024zM539.648 856.064c51.814-7.066 98.304-29.696 134.042-65.126 38.195-37.99 60.826-84.685 67.379-139.162 0.41-3.686 0.819-96.256 0.819-205.824 0-185.958-0.102-199.885-1.843-210.637-2.458-15.462-7.168-33.997-11.981-46.899-10.138-27.136-25.19-51.712-45.568-74.547-24.678-27.648-59.085-50.586-93.696-62.464-28.774-9.83-49.254-13.005-80.896-12.493-30.618 0.512-52.326 4.608-79.77 15.258-71.885 27.853-126.464 92.57-141.824 168.243-4.608 22.221-4.506 21.606-4.506 225.587 0 106.701 0.41 197.734 0.922 202.24 1.331 11.878 2.765 19.866 6.554 34.816 17.51 69.939 70.451 129.741 138.752 156.57 10.445 4.198 31.13 10.138 41.267 11.878 3.482 0.614 7.475 1.331 8.909 1.638 1.434 0.205 6.042 0.717 10.24 1.024 4.198 0.41 7.885 0.819 8.090 1.024 0.614 0.614 37.888-0.41 43.11-1.126zM493.568 831.283c-49.562-5.325-91.75-25.395-126.464-60.211-32.973-32.973-52.941-74.65-58.778-122.368-1.229-10.138-1.229-390.042 0-400.896 9.318-82.022 64-149.094 141.722-173.978 32.461-10.342 70.554-12.288 104.448-5.325 60.416 12.595 114.074 54.579 141.312 110.694 11.162 22.835 16.794 41.882 19.763 66.56 0.41 3.379 0.717 94.822 0.717 203.264 0 213.709 0.307 202.24-5.837 227.328-13.619 56.422-52.429 105.37-105.267 132.915-19.968 10.445-39.117 16.486-66.56 21.197-4.301 0.717-39.936 1.434-45.056 0.819zM536.576 599.142c50.278-4.198 99.635-22.938 140.595-53.453 9.933-7.373 12.288-9.933 10.24-10.854-0.512-0.102-5.222-5.325-10.547-11.571-5.325-6.144-10.138-11.776-10.752-12.39-0.717-0.819-3.379 0.614-9.216 5.12-39.936 30.72-89.19 47.616-140.493 48.026-21.197 0.205-42.394-1.843-56.115-5.53-2.253-0.614-5.222-1.331-6.656-1.638-1.331-0.205-8.704-2.458-16.384-5.018-24.064-7.987-52.429-23.45-71.68-39.117-3.686-2.867-6.963-5.325-7.27-5.325-0.41 0-5.837 5.734-12.186 12.8-9.728 10.854-11.264 13.107-10.24 14.438 2.355 2.765 17.715 14.336 28.16 21.197 37.478 24.474 82.739 39.834 127.488 43.315 4.813 0.41 8.806 0.717 8.909 0.819 0.614 0.41 28.774-0.205 36.147-0.819zM530.944 529.51c34.509-3.072 69.325-16.384 97.587-37.376 4.608-3.482 8.397-6.451 8.397-6.758 0-0.41-17.408-20.89-22.016-25.907-0.922-1.024-1.946-0.614-5.222 1.946-15.667 12.698-40.96 24.576-62.362 29.389-44.544 10.138-92.365-0.307-129.024-27.955l-8.602-6.451-8.602 9.318c-4.71 5.222-10.138 11.162-12.083 13.414l-3.379 3.994 3.994 3.482c7.885 6.656 25.702 18.022 37.888 23.859 17.818 8.704 33.382 13.824 51.712 16.896 1.946 0.307 4.301 0.819 5.12 1.024s5.734 0.717 10.752 1.126c5.12 0.307 9.318 0.717 9.421 0.819 0.512 0.41 19.046-0.205 26.419-0.819zM531.456 457.626c17.101-2.56 36.864-10.752 51.917-21.504l6.554-4.71-4.915-5.734c-2.662-3.277-5.12-6.042-5.427-6.349s-3.482-3.891-7.066-7.987l-6.451-7.373-3.789 2.97c-27.238 21.402-69.427 21.709-98.918 0.614l-6.451-4.608-3.379 3.891c-1.843 2.048-7.066 7.885-11.571 12.8-4.608 5.018-8.397 9.421-8.499 9.728-0.102 0.41 2.662 2.867 6.144 5.53 26.010 19.558 58.982 27.75 91.853 22.733zM527.36 393.728c15.36-4.506 27.443-15.974 32.87-31.334 3.174-8.909 3.174-23.142 0-32.461-10.957-32.051-48.742-44.954-76.902-26.112-15.155 10.035-23.45 27.136-22.323 45.466 0.614 9.421 2.765 16.282 7.475 23.45 12.698 19.558 35.84 27.75 58.88 20.992z" />
+<glyph unicode="&#xea57;" glyph-name="mobile_data_toggle" d="M680.96 908.186c-9.011-1.741-21.094-6.963-27.648-11.878-4.403-3.379-242.688-241.869-242.688-242.893 0-0.307 28.57-0.614 63.488-0.614h63.386l0.41-134.861c0.307-125.645 0.41-135.373 2.048-141.005 8.806-28.979 30.31-49.050 59.597-55.501 4.915-1.024 24.064-1.229 94.208-1.126 79.667 0.307 88.576 0.41 93.798 2.048 29.491 8.909 49.562 30.413 55.706 59.597 1.229 6.144 1.536 26.726 1.536 139.059v131.789h128.102l-103.424 103.731c-56.934 57.037-111.514 111.718-121.242 121.446-18.842 18.842-24.883 23.347-36.864 27.443-7.27 2.458-23.859 3.994-30.413 2.765zM242.893 574.874c-20.275-3.379-38.4-15.258-50.586-32.973-5.53-8.090-8.806-15.872-11.162-26.317-1.843-8.294-1.946-15.36-1.946-140.493v-131.891h-63.488c-34.918 0-63.488-0.307-63.488-0.614s44.954-45.568 99.84-100.557c125.747-126.054 139.674-139.981 142.848-142.336 21.811-16.282 54.272-16.282 75.776 0 4.608 3.379 242.688 241.766 242.688 242.893 0 0.307-28.57 0.614-63.488 0.614h-63.488v131.584c0 143.974 0.205 138.65-5.939 153.805-7.066 17.408-22.528 33.28-39.834 40.858-3.072 1.434-9.421 3.379-14.029 4.506-7.782 1.843-13.005 1.946-93.286 1.843-46.694 0-87.45-0.41-90.419-0.922z" />
+<glyph unicode="&#xea58;" glyph-name="mobile_insurance" d="M497.971 874.086c-72.499-47.923-165.171-80.691-253.747-89.702-3.379-0.307-7.475-0.819-9.216-1.024-1.638-0.205-7.885-0.717-13.824-1.024-5.939-0.41-13.005-0.819-15.872-1.024-2.765-0.205-15.36-0.41-27.955-0.41l-22.835-0.102 0.41-158.413c0.205-87.245 0.614-159.846 0.922-161.587 0.307-1.638 0.922-6.758 1.331-11.264 1.126-14.336 4.608-35.942 9.728-61.338 4.71-23.45 18.432-66.662 28.672-90.214 1.126-2.765 2.97-6.963 3.891-9.216s5.12-10.957 9.318-19.456c41.37-84.173 102.4-151.859 181.35-201.421 31.437-19.661 67.891-36.762 107.52-50.381l13.824-4.813 8.704 2.765c4.813 1.434 15.36 5.222 23.552 8.294 95.846 36.25 173.158 95.334 231.322 176.947 41.37 57.958 72.806 131.789 85.606 200.704 0.922 5.12 2.048 11.264 2.662 13.824 0.819 3.994 3.482 24.576 5.632 44.032 0.41 3.072 0.819 76.698 1.126 163.635l0.41 157.901-22.835 0.102c-12.595 0-24.883 0.205-27.443 0.41-2.56 0.102-10.035 0.614-16.794 1.024-6.656 0.307-12.8 0.819-13.824 1.024-0.922 0.102-5.12 0.614-9.318 1.024s-8.397 0.819-9.216 1.024c-0.819 0.102-4.096 0.614-7.168 1.024-3.072 0.307-10.957 1.536-17.408 2.662-81.613 13.824-154.317 42.086-223.027 86.63-6.349 4.096-11.674 7.475-11.776 7.373-0.102 0-6.246-4.096-13.722-9.011zM651.776 726.835c4.813-2.56 8.704-6.554 11.366-11.571 1.843-3.482 1.946-11.674 1.946-254.464v-250.88l-2.765-4.813c-3.584-6.042-9.933-10.65-16.589-12.083-3.686-0.819-44.134-1.024-137.318-0.819l-132.096 0.307-4.813 2.867c-5.632 3.277-9.421 7.782-11.571 13.926-1.331 3.994-1.536 33.075-1.536 251.494 0 185.958 0.307 247.808 1.229 250.47 2.867 8.294 8.294 13.824 17.101 16.896 2.97 1.126 29.798 1.331 137.318 1.126l133.632-0.205 4.096-2.253zM491.725 708.403c-3.277-2.867-3.379-7.373-0.205-10.547 1.946-1.946 3.379-2.048 22.835-2.048 22.938 0 24.678 0.41 25.498 6.144 0.307 2.253-0.205 3.789-1.843 5.632-2.355 2.56-2.355 2.56-23.245 2.56-18.534 0-21.197-0.205-23.040-1.741zM384 473.6v-204.8h256v409.6h-256v-204.8zM504.115 248.422c-13.722-6.451-13.619-26.726 0.102-32.973 11.469-5.222 24.064 1.946 25.805 14.643 1.843 13.517-13.312 24.269-25.907 18.33z" />
+<glyph unicode="&#xea59;" glyph-name="mobile_network_coverage" d="M785.203 676.762c-6.349-1.946-13.312-8.704-15.462-15.258-1.638-4.608-1.741-28.877-1.741-315.904 0-349.594-0.819-316.826 7.885-325.222 8.090-7.885 5.325-7.68 83.866-7.373 77.824 0.307 71.987-0.205 80.179 7.987 7.987 8.090 7.27-22.63 7.27 324.608 0 349.491 0.819 316.826-7.885 325.222-7.987 7.782-5.427 7.578-81.613 7.475-55.808 0-68.506-0.307-72.499-1.536zM554.086 523.059c-6.349-2.253-13.005-9.318-14.95-15.974-1.331-4.608-1.536-32.973-1.536-238.797 0-262.758-0.717-239.616 7.885-247.91 8.090-7.885 5.325-7.68 83.866-7.373 78.131 0.307 72.499-0.205 80.486 8.192 7.578 8.090 7.066-13.005 6.758 249.754l-0.307 236.134-3.072 4.915c-3.584 5.837-9.318 10.138-15.565 11.674-2.867 0.717-27.034 1.126-71.68 1.024-58.368 0-67.994-0.307-71.885-1.638zM323.891 369.459c-2.458-0.819-6.349-3.482-8.806-5.837-8.499-8.192-7.885 5.53-7.885-171.622s-0.614-163.43 7.885-171.622c7.987-7.782 5.427-7.578 81.715-7.578 76.39 0 73.83-0.205 81.818 7.68 8.397 8.192 7.782-5.427 7.782 171.52 0 176.742 0.614 163.328-7.68 171.52-7.885 7.885-5.427 7.68-82.33 7.578-57.856 0-68.813-0.307-72.499-1.638zM95.027 216.576c-6.451-1.946-11.264-6.042-15.462-13.107l-2.253-3.789-0.307-82.33c-0.307-92.774-0.614-88.474 7.373-96.666 7.885-8.090 5.325-7.885 81.51-7.885 76.083 0 74.342-0.205 82.227 7.475 8.294 8.090 7.885 3.789 7.885 94.822 0 52.326-0.41 81.818-1.024 84.275-1.638 5.632-6.963 11.981-12.8 15.053l-5.12 2.662-69.632 0.205c-38.298 0.102-70.861-0.205-72.397-0.717z" />
+<glyph unicode="&#xea5a;" glyph-name="mobile_security" d="M293.99 881.562c-17.408-4.71-31.437-18.33-36.557-35.738-1.741-5.837-1.843-24.883-1.843-397.824s0.102-391.987 1.843-397.824c5.427-18.227 21.402-32.973 39.424-36.352 3.584-0.614 80.077-1.024 215.552-1.024 184.115 0 210.842 0.205 216.166 1.536 19.149 4.915 34.406 20.48 38.298 39.219 1.638 7.68 1.638 781.21 0 788.89-3.994 19.149-20.48 35.635-39.629 39.629-3.891 0.819-66.15 1.126-216.576 1.024-181.043 0-211.968-0.205-216.678-1.536zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM500.224 637.747c-29.696-6.042-49.869-20.173-63.181-44.442-3.174-5.632-7.68-18.432-8.499-23.962-0.307-2.253-0.717-5.222-1.024-6.656-0.205-1.434-0.41-16.282-0.41-32.973l-0.102-30.515h-43.008v-203.264l2.253-6.451c2.662-7.578 8.602-14.131 15.974-17.818l4.813-2.355 232.96-0.512-0.205 103.629-0.307 103.731-2.355 4.813c-3.174 6.349-8.397 11.469-14.848 14.848-4.301 2.15-7.168 2.765-15.258 3.174l-10.035 0.512-0.102 31.334c-0.102 34.099-0.102 33.997-2.97 44.954-8.397 31.027-34.509 54.989-66.765 61.133-6.758 1.229-22.323 1.741-26.931 0.819zM526.848 604.262c11.981-3.584 26.624-15.462 31.949-26.214 5.837-11.469 5.837-11.571 6.246-46.285l0.307-32.563h-106.701l0.307 32.563c0.41 30.515 0.512 32.87 2.662 38.502 10.138 27.238 38.093 41.779 65.229 33.997zM519.168 442.266c5.222-0.922 10.65-3.994 15.462-8.806 6.451-6.554 8.499-11.878 8.602-22.323 0-7.475-0.41-9.421-2.765-13.926-1.536-2.867-5.12-7.373-7.987-9.933l-5.12-4.608 1.024-9.626c0.512-5.222 1.229-12.493 1.536-16.179s0.819-7.373 1.024-8.192c0.205-0.819 0.614-5.427 1.024-10.24 0.307-4.813 0.717-9.626 0.819-10.752 0.205-1.946-0.512-2.048-21.094-2.355l-21.299-0.205 0.512 3.789c0.512 3.584 0.819 6.758 2.15 22.323 0.307 2.867 0.717 7.168 1.024 9.728 1.024 9.523 1.843 18.022 1.946 20.173 0.102 1.434-1.126 3.174-3.174 4.71-10.342 7.68-15.155 21.914-11.674 34.304 2.662 9.216 10.65 17.818 19.558 20.992 7.168 2.56 9.216 2.662 18.432 1.126z" />
+<glyph unicode="&#xea5b;" glyph-name="mobile_setup" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM465.408 600.883c-8.294-1.946-22.118-7.782-28.672-12.083-9.114-6.042-10.445-11.059-6.246-22.323 4.198-11.162 4.198-14.848 0.307-22.323-3.994-7.782-12.8-15.462-19.763-17.203-4.915-1.229-8.499-0.717-20.173 3.379-3.789 1.331-7.987 2.15-9.421 1.843-3.789-0.717-10.035-7.475-13.619-14.848-6.451-13.005-8.704-20.275-8.806-28.262-0.102-7.27 0-7.578 3.174-10.24 1.843-1.536 4.915-3.277 6.861-3.994 7.782-2.867 12.902-6.554 15.77-11.264 2.56-4.403 2.765-5.734 2.765-15.565 0-9.421-0.307-11.264-2.458-15.053-2.867-5.018-5.939-7.475-13.517-10.65-7.782-3.277-10.035-4.915-11.878-8.397-2.15-4.301-1.024-13.21 2.97-23.757 5.734-14.746 11.264-23.040 17.306-25.498 3.482-1.434 4.096-1.331 12.288 1.536 11.162 3.891 12.698 4.096 18.125 2.867 9.626-2.15 20.685-13.414 22.733-23.142 1.024-4.506 0.819-5.939-1.536-12.698-4.813-13.414-4.71-16.998 0.819-22.528 6.042-6.042 25.702-14.643 36.25-15.872 9.318-1.126 13.722 2.253 18.125 14.131 2.048 5.222 6.451 10.24 11.264 12.902 2.458 1.331 5.837 1.741 13.926 1.741 15.36 0 19.763-2.662 25.6-15.872 5.222-11.776 8.397-14.029 18.125-12.902 7.475 0.922 22.528 6.758 30.822 12.186 10.138 6.451 11.366 10.752 6.758 22.835-1.638 4.301-2.765 9.318-2.765 12.698-0.102 4.915 0.41 6.451 3.891 11.674 4.198 6.349 9.523 10.854 16.486 14.029 5.12 2.253 10.138 1.843 19.763-1.741 7.475-2.867 11.264-3.072 15.36-0.922 6.861 3.482 18.022 26.829 19.149 39.834 0.41 5.018 0.205 6.861-1.434 9.421-1.843 2.97-3.789 4.096-14.643 8.909-8.602 3.891-12.39 10.342-13.005 22.221-0.307 7.066 0 9.728 1.741 14.438 2.867 7.475 3.686 8.192 17.92 14.848 8.192 3.789 10.138 7.066 9.421 15.462-1.024 12.595-12.493 36.352-19.149 39.731-4.198 2.253-7.68 1.946-17.203-1.434-13.107-4.608-19.558-3.174-29.286 6.656-10.24 10.342-11.776 18.227-5.837 31.13 0.819 1.946 1.741 5.939 2.048 8.704 0.41 4.915 0.205 5.427-3.686 9.318-6.861 6.861-26.829 15.565-37.581 16.384-8.192 0.717-11.571-1.434-15.36-9.523-5.12-11.264-6.144-12.902-9.728-15.155-1.946-1.331-5.325-2.867-7.578-3.584-5.325-1.741-19.558-0.922-23.962 1.434-3.482 1.741-9.421 7.475-9.421 8.909 0 0.41-1.434 3.891-3.277 7.68-4.506 9.523-9.933 12.186-19.763 9.933zM530.944 519.168c32.768-8.806 54.989-37.683 54.989-71.68 0-31.027-18.432-57.958-47.206-69.018-10.65-4.096-17.203-5.12-29.798-4.813-45.875 1.434-79.36 44.851-69.222 90.010 6.349 28.365 28.262 49.971 57.344 56.627 7.782 1.741 25.293 1.229 33.894-1.126z" />
+<glyph unicode="&#xea5c;" glyph-name="Modem" d="M691.814 856.474c-18.739-1.843-42.086-7.066-61.338-13.926-23.859-8.294-54.17-25.395-74.957-42.086-21.709-17.613-49.050-49.357-58.88-68.71-7.987-15.77 4.198-35.84 21.811-36.147 11.366-0.205 17.613 3.789 26.010 16.589 20.48 31.232 47.002 55.296 79.667 71.885 18.944 9.626 36.966 15.565 60.928 19.866 12.39 2.253 47.514 2.56 60.416 0.512 59.597-9.318 110.080-41.472 142.541-90.726 3.379-5.018 7.27-10.342 8.806-11.674 16.282-14.438 42.598-2.662 42.291 18.944 0 6.861-2.15 11.776-10.138 23.654-36.659 54.477-94.925 93.901-158.413 107.213-23.040 4.813-56.525 6.758-78.746 4.608zM700.416 754.483c-1.946-0.205-8.192-1.331-13.824-2.458-48.333-9.626-89.702-42.598-109.875-87.654-5.12-11.366-6.554-17.306-5.734-23.142 2.458-15.565 17.306-25.19 32.358-20.787 8.704 2.458 13.414 7.373 18.33 19.046 14.643 33.997 41.574 55.91 77.722 62.976 15.155 2.97 38.81 0.717 53.453-5.12 18.739-7.373 34.202-18.944 45.158-33.587 6.963-9.318 9.83-14.541 14.029-24.781 3.994-9.728 9.626-15.77 16.998-18.33 6.451-2.15 10.445-2.048 17.203 0.41 14.131 5.325 20.173 20.582 14.029 35.84-19.763 49.357-61.747 84.48-113.766 95.334-10.342 2.15-35.738 3.379-46.080 2.253zM704.819 651.366c-37.478-9.114-51.712-55.603-25.805-84.070 2.867-3.072 6.758-6.554 8.704-7.68l3.482-2.253v-186.163h51.2v186.163l3.482 2.253c5.53 3.379 13.21 12.39 16.691 19.558 7.68 15.872 7.066 33.075-1.741 48.128-11.469 19.354-34.509 29.286-56.013 24.064zM138.342 344.064c-28.672-6.246-50.483-26.624-59.085-55.296-1.741-5.632-1.843-12.39-2.15-80.384-0.307-80.691-0.41-78.95 5.427-91.034 3.891-7.987 14.541-18.33 22.938-22.323 9.318-4.403 15.258-5.427 32.666-5.427h15.258l0.41-16.691c0.307-16.077 0.41-16.691 3.277-21.504 3.379-5.734 7.68-9.318 13.824-11.469 6.349-2.253 61.235-2.253 67.584 0 6.042 2.048 11.059 6.246 14.234 11.674 2.662 4.506 2.765 5.427 3.072 21.402l0.41 16.589h511.59l0.41-16.589c0.307-15.974 0.41-16.896 3.072-21.402 3.379-5.734 8.704-9.933 14.95-11.776 6.861-2.15 60.723-2.048 66.662 0.102 6.042 2.048 11.059 6.246 14.234 11.674 2.662 4.506 2.765 5.427 3.174 21.402l0.307 16.589 15.565 0.102c17.51 0.102 19.354 0.307 27.034 2.97 15.974 5.632 28.058 19.149 32.461 36.352 2.253 8.806 2.355 142.438 0 154.214-5.427 28.57-26.214 51.098-55.296 59.904-5.939 1.843-20.992 1.946-375.808 2.15-311.398 0.102-370.688-0.102-376.218-1.229zM829.645 267.674c9.421-1.946 18.125-6.758 25.498-14.131 19.968-20.070 20.378-50.381 0.819-71.168-19.149-20.48-50.995-21.197-71.885-1.638-21.094 19.661-21.402 52.224-0.614 72.806 12.595 12.595 29.286 17.613 46.182 14.131zM294.912 239.309c18.842-11.571 14.848-39.526-6.554-46.285-15.155-4.813-32.358 8.192-32.358 24.576 0 9.83 7.373 20.582 16.486 23.859 6.656 2.458 16.384 1.536 22.426-2.15zM391.782 241.664c10.957-3.277 17.203-12.186 17.306-24.576 0-5.939-0.41-7.987-2.765-11.878-11.264-19.149-39.014-16.691-46.387 4.096-3.277 9.318-0.922 19.354 6.349 26.317 7.168 7.066 15.565 9.011 25.498 6.042zM499.712 239.309c12.288-7.578 15.77-24.269 7.578-36.25-8.909-12.698-27.238-14.541-38.912-3.789-3.379 3.174-6.554 9.933-7.168 15.77-1.331 10.957 5.734 22.733 16.077 26.419 6.656 2.458 16.384 1.536 22.426-2.15zM602.112 239.309c9.318-5.734 14.029-17.51 11.264-27.75-5.939-22.221-34.509-26.419-46.49-6.861-2.765 4.403-3.174 5.939-3.174 12.8 0 6.656 0.41 8.499 2.765 12.493 3.072 5.222 8.090 9.523 13.926 11.674 5.837 2.355 15.872 1.229 21.709-2.355z" />
+<glyph unicode="&#xea5d;" glyph-name="modifier_add" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-46.080-45.875-81.101-100.966-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.728-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.475-11.264 0.512-0.512 2.253-2.867 3.891-5.12 18.33-24.781 33.587-41.984 57.446-64.614 17.101-16.179 44.442-36.864 66.97-50.688 48.947-30.106 110.49-52.634 163.84-59.699 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 28.57 2.662 53.965 7.066 78.336 13.619 83.866 22.528 159.027 69.837 215.757 135.578 49.869 57.754 82.432 123.904 97.382 197.632 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-55.706 74.547-136.294 130.253-225.69 156.16-25.805 7.475-52.941 12.8-75.776 14.95-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM548.352 794.112c6.246-0.614 14.95-1.741 19.456-2.56s9.83-1.638 11.776-2.048c7.578-1.229 28.672-6.758 38.912-10.138 61.030-19.661 114.688-55.296 156.365-103.526 18.944-21.914 32.461-41.677 45.466-66.56 22.016-42.189 34.714-86.016 38.707-134.144 0.922-10.854 0.614-50.79-0.41-59.392-4.403-37.581-9.83-60.928-21.299-91.648-7.782-21.197-24.576-53.248-37.683-72.294-20.582-29.798-49.459-60.109-77.21-80.998-54.17-40.858-114.483-63.898-182.784-69.837-10.138-0.922-51.405-0.614-59.392 0.307-2.56 0.307-7.168 0.819-10.24 1.229-9.83 1.024-28.774 4.506-41.779 7.68-52.838 13.005-102.707 38.912-143.565 74.445-67.686 58.778-108.851 137.523-118.886 227.021-1.741 14.746-1.638 58.368 0 72.704 6.554 56.73 24.269 106.803 54.272 153.088 28.774 44.544 71.066 84.89 116.531 111.206 9.318 5.427 31.846 16.794 38.707 19.558 1.741 0.717 5.427 2.253 8.192 3.379 8.806 3.789 31.642 11.059 44.749 14.234 19.763 4.915 33.792 7.066 63.283 9.626 7.782 0.717 46.182-0.205 56.832-1.331zM451.174 702.464c-7.578-2.662-12.902-8.294-14.95-15.77-0.614-2.355-1.024-32.973-1.024-82.739v-79.155l-81.101-0.205c-77.005-0.307-81.408-0.41-84.787-2.253-5.018-2.662-8.090-5.632-10.547-10.342-2.253-4.096-2.253-4.608-2.253-64s0-59.904 2.253-64c2.458-4.71 5.53-7.68 10.547-10.342 3.379-1.843 7.782-1.946 84.685-2.253l81.203-0.205 0.205-81.203c0.307-80.794 0.307-81.101 2.56-85.197 2.458-4.71 5.53-7.68 10.547-10.342 3.379-1.843 7.27-1.946 60.416-2.253 38.502-0.205 58.47 0 62.054 0.819 6.144 1.331 11.878 5.734 15.053 11.571l2.253 4.301 0.307 81.203 0.307 81.101h78.848c57.037 0 80.179 0.307 83.661 1.229 3.379 0.819 6.144 2.56 9.523 5.939 7.27 7.27 7.27 7.066 6.861 72.704-0.307 56.422-0.307 56.832-2.56 61.133-2.97 5.427-8.602 10.035-14.234 11.469-2.97 0.717-29.798 1.126-83.251 1.126h-78.95v78.95c0 53.453-0.41 80.282-1.126 83.251-1.434 5.632-6.042 11.264-11.469 14.234-4.301 2.253-4.506 2.253-62.669 2.458-48.333 0.205-59.085 0-62.362-1.229z" />
+<glyph unicode="&#xea5e;" glyph-name="Modifier_delete" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c65.331-6.861 122.266-29.696 174.387-70.246 14.029-10.854 41.267-37.99 52.838-52.531 41.37-52.122 64.819-109.568 71.68-176.128 1.536-14.336 1.843-45.158 0.614-58.368-1.638-16.998-1.946-19.866-4.096-31.949-18.432-104.55-85.914-194.048-181.76-240.947-36.557-17.92-77.21-29.184-117.248-32.666-10.752-0.922-54.682-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-36.25 4.71-70.963 15.565-104.96 32.666-23.245 11.776-45.875 26.726-65.741 43.418-6.144 5.222-30.003 28.877-35.942 35.635-41.062 47.206-69.53 109.875-78.029 172.339-2.662 19.763-3.482 52.122-1.843 73.728 4.506 60.518 28.57 123.187 66.15 172.544 48.435 63.59 117.043 107.52 193.741 124.314 6.451 1.434 13.414 2.765 15.36 3.072s4.915 0.819 6.554 1.126c3.482 0.512 20.787 2.458 26.726 2.867 10.035 0.819 44.134 0.307 55.296-0.922zM393.216 640.717c-6.451-0.717-11.878-2.56-16.794-5.734-2.867-1.843-15.462-13.722-28.058-26.214-24.883-24.986-28.16-29.594-29.491-41.062-0.717-6.656 1.331-15.155 5.427-21.811 1.434-2.253 23.757-25.395 49.562-51.302l47.002-47.104-47.923-48.128c-54.579-54.886-53.76-53.76-53.862-68.71-0.102-13.722 2.15-17.203 30.413-45.466 20.787-20.787 24.474-24.064 30.925-27.238 6.144-2.97 8.397-3.584 13.926-3.584 7.987 0 15.258 2.458 22.118 7.578 2.662 2.048 25.293 24.064 50.278 49.050l45.363 45.466 46.285-46.387c25.395-25.6 48.333-47.821 50.893-49.357 11.059-7.168 23.757-7.885 35.533-2.048 5.325 2.56 10.138 6.861 28.877 25.805 24.986 25.19 26.010 26.419 28.774 32.666 4.198 9.626 3.584 20.48-1.843 30.31-1.638 3.174-18.432 20.685-48.742 50.995-25.395 25.498-47.002 46.694-48.026 47.206-1.434 0.717 5.837 8.499 44.954 47.411 27.136 27.136 48.333 49.050 50.586 52.429 4.403 6.656 6.758 15.974 5.734 22.938-1.434 10.957-5.12 15.974-29.491 40.346-12.493 12.493-24.781 24.166-27.341 25.805-11.776 8.192-26.214 8.090-39.014-0.205-2.56-1.638-25.293-23.757-50.688-49.152-25.293-25.293-46.285-46.080-46.592-46.080s-21.914 21.402-48.128 47.514c-39.322 39.117-48.64 47.923-53.248 50.074-5.939 2.867-13.21 4.506-17.408 3.994z" />
+<glyph unicode="&#xea5f;" glyph-name="Modifier_favorite" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c80.589-8.397 152.678-43.418 207.565-100.659 52.019-54.17 82.534-120.32 91.443-197.222 1.331-11.981 1.331-50.586 0-64.512-5.734-58.573-26.624-114.893-59.187-160.256-15.462-21.504-39.219-47.616-56.422-62.054-53.555-44.851-118.272-71.987-186.47-78.131-10.24-0.922-55.194-0.717-61.952 0.307-1.946 0.307-7.475 1.024-12.288 1.741-56.73 7.373-113.562 31.334-159.13 66.867-13.414 10.547-15.667 12.493-30.413 27.238-56.115 55.91-89.19 125.952-96.87 205.312-1.024 10.547-1.024 46.387 0 58.88 6.451 79.462 42.394 154.726 100.659 210.944 33.997 32.768 74.752 58.061 119.91 74.138 16.998 6.144 42.803 12.698 58.675 14.95 4.198 0.614 9.318 1.331 11.469 1.638 16.896 2.458 53.555 2.867 73.011 0.819zM502.886 646.451c-5.632-11.571-12.186-25.293-14.746-30.618s-8.499-17.715-13.21-27.546c-4.813-9.83-11.571-23.859-15.053-31.232-3.482-7.27-8.294-17.203-10.65-21.914l-4.301-8.704-35.328-5.837c-19.456-3.277-37.171-6.144-39.424-6.554-2.253-0.307-13.517-2.15-25.088-4.096s-30.003-5.018-40.96-6.758c-10.957-1.843-20.173-3.482-20.48-3.686-0.512-0.41 2.458-3.277 14.848-14.131 4.506-3.891 8.704-7.578 9.318-8.192 0.614-0.512 4.71-4.198 9.114-8.192 16.486-14.643 27.75-24.678 31.642-28.16 5.325-4.813 5.12-4.608 14.438-12.8 4.506-3.891 9.114-8.090 10.342-9.216s8.704-7.782 16.691-14.848c11.571-10.138 14.438-13.21 14.029-14.848-23.859-95.027-39.526-158.72-39.322-159.334 0.205-0.41 9.728 4.403 21.299 10.65 32.154 17.613 72.704 39.731 77.619 42.394 2.458 1.331 6.861 3.686 9.728 5.325 2.97 1.536 13.005 7.168 22.323 12.288l17.101 9.318 5.939-3.174c3.379-1.843 15.462-8.397 27.034-14.746 11.571-6.246 23.962-13.107 27.648-15.053s16.794-9.114 29.184-15.872c12.39-6.758 26.010-14.234 30.208-16.486s12.288-6.758 17.92-9.83c5.632-3.174 10.342-5.325 10.547-4.813s-8.704 36.966-19.763 81.101l-20.070 80.179 2.355 2.15c1.331 1.126 15.258 13.517 31.027 27.546s32.154 28.467 36.352 32.256c12.595 11.366 36.966 32.973 44.339 39.424 3.789 3.379 6.554 6.451 6.144 6.758-0.41 0.41-18.125 3.584-39.219 7.066s-40.653 6.758-43.52 7.373c-2.765 0.512-20.378 3.482-39.014 6.554-18.637 2.97-35.123 5.837-36.659 6.246-2.355 0.512-3.584 2.15-6.758 9.011-2.15 4.506-7.885 16.589-12.8 26.726s-10.65 22.118-12.8 26.624c-2.15 4.506-8.090 16.998-13.312 27.648-5.222 10.752-11.162 23.142-13.312 27.648s-5.53 11.571-7.578 15.77l-3.686 7.578-10.138-20.992z" />
+<glyph unicode="&#xea60;" glyph-name="modifier_new" d="M488.346 883.814c-0.205-0.205-5.018-0.717-10.65-1.024-27.955-1.946-58.368-7.475-87.45-15.872-89.395-25.907-169.267-81.203-225.997-156.262-49.152-65.126-79.872-145.92-86.221-226.816-1.434-18.534-0.512-79.872 1.331-82.944 0.102-0.307 0.614-3.686 1.024-7.475 0.307-3.789 0.819-7.987 1.126-9.216 0.205-1.229 1.536-8.499 2.97-16.179 25.702-140.083 121.754-260.301 254.054-318.157 35.942-15.77 82.227-28.467 118.579-32.563 2.867-0.41 6.349-0.819 7.782-0.922 15.462-2.15 60.006-2.765 81.408-1.229 33.997 2.355 77.414 11.571 109.875 23.142 30.31 10.854 63.283 26.624 84.685 40.55 2.867 1.741 8.397 5.325 12.288 7.885 18.637 12.083 45.466 33.894 62.976 51.098 76.595 75.674 121.344 171.52 129.946 278.426 0.922 11.469 0.717 62.464-0.307 69.632-0.307 1.946-1.024 8.397-1.638 14.336-14.643 134.246-97.382 259.277-216.576 326.861-47.411 26.829-103.629 46.285-152.064 52.531-2.56 0.307-5.734 0.819-7.168 1.024s-5.325 0.717-8.704 1.024c-3.379 0.307-8.192 0.819-10.752 1.126-5.12 0.717-59.904 1.536-60.518 1.024zM546.304 780.288c67.072-7.373 130.15-34.406 181.248-77.722 11.571-9.83 34.099-33.075 43.725-44.954 40.96-51.405 66.662-114.483 72.192-177.869 1.536-17.306 0.717-65.126-1.229-72.704-0.205-0.819-0.614-3.789-1.024-6.656-0.307-2.765-0.819-6.042-1.024-7.168-0.307-1.126-0.717-3.379-1.024-5.018-6.349-39.219-26.624-89.19-50.074-123.494-10.035-14.541-12.39-17.818-20.582-27.546-38.81-46.694-89.907-82.432-145.92-101.99-22.63-7.987-49.152-14.131-70.144-16.486-3.379-0.307-7.066-0.819-8.192-1.126-5.222-1.229-52.019-1.024-64.819 0.307-103.834 10.65-194.662 67.072-250.061 155.546-27.546 43.93-43.418 91.546-48.845 146.432-1.024 10.138-1.024 49.664-0.102 59.392 7.987 77.824 39.014 145.51 91.955 200.499 40.755 42.394 88.474 71.27 147.456 89.19 15.77 4.813 45.978 10.342 62.566 11.469 5.325 0.41 9.83 0.819 10.035 1.024 0.717 0.614 46.899-0.41 53.862-1.126zM473.19 650.547c-2.56-1.331-6.042-4.096-7.68-6.246l-3.174-3.994-0.307-69.53c-0.102-38.195-0.41-69.53-0.717-69.53-0.205 0-7.885 2.97-17.101 6.554-28.365 11.162-85.811 33.587-95.437 37.171-9.421 3.482-14.848 4.096-19.763 2.253-3.174-1.126-8.090-5.427-9.728-8.397-2.15-4.096-21.299-59.597-21.914-63.795-0.922-6.554 3.277-14.848 9.114-18.227 2.355-1.331 31.539-11.469 64.717-22.63 33.28-11.162 60.621-20.378 60.723-20.582 0.205-0.102-6.656-9.626-15.36-21.094-67.994-89.6-66.458-87.347-65.638-95.949 0.717-7.578 3.891-10.854 26.726-27.648 12.083-8.806 23.552-17.203 25.6-18.739 7.27-5.325 9.728-6.349 16.179-6.349 11.264-0.102 5.427-7.475 68.608 85.709 9.728 14.131 18.33 26.829 19.354 28.16l1.741 2.355 5.837-8.090c8.499-12.186 31.437-44.032 39.014-54.477 3.686-5.018 13.005-18.022 20.89-28.877 7.782-10.854 15.155-20.582 16.486-21.504 1.331-1.024 4.506-2.355 7.066-3.072 7.782-2.048 11.878-0.307 30.106 13.21 41.779 30.925 41.267 30.413 41.984 40.243 0.512 7.578-0.205 8.806-25.19 41.677-42.598 56.422-54.784 72.499-55.194 73.523-0.205 0.614 4.608 2.765 10.65 4.813 6.144 1.946 34.304 11.366 62.771 20.685 28.467 9.421 53.146 18.125 54.989 19.354s4.301 4.096 5.53 6.349c3.789 6.656 3.277 12.083-2.97 29.696-3.072 8.499-6.861 19.251-8.602 24.064-6.758 19.251-8.090 22.221-11.366 25.395-6.758 6.554-13.722 6.963-27.546 1.638-42.189-16.179-111.616-42.291-113.050-42.598-1.741-0.307-1.843 3.686-1.843 67.789l-0.102 68.096-2.458 4.301c-1.434 2.458-4.403 5.632-6.656 7.168l-4.198 2.867-33.792 0.307c-33.485 0.307-33.792 0.205-38.298-2.048z" />
+<glyph unicode="&#xea61;" glyph-name="modifier_no_access" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c65.331-6.861 122.266-29.696 174.387-70.246 14.029-10.854 41.267-37.99 52.838-52.531 41.37-52.122 64.819-109.568 71.68-176.128 1.536-14.336 1.843-45.158 0.614-58.368-1.638-16.998-1.946-19.866-4.096-31.949-6.451-37.171-19.866-74.24-38.912-107.52-3.482-6.042-6.656-11.366-7.066-11.878-0.717-0.717-459.059 456.806-459.264 458.342-0.307 1.946 31.539 18.842 49.050 26.112 22.733 9.421 51.2 17.818 72.192 21.094 1.946 0.307 4.915 0.819 6.554 1.126 3.482 0.512 20.787 2.458 26.726 2.867 10.035 0.819 44.134 0.307 55.296-0.922zM460.39 396.8c125.85-125.85 228.966-229.171 229.069-229.581 0.512-2.15-37.478-22.016-55.091-28.774-30.72-11.776-63.181-19.456-93.696-22.118-10.752-0.922-54.682-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-36.25 4.71-70.963 15.565-104.96 32.666-23.245 11.776-45.875 26.726-65.741 43.418-6.144 5.222-30.003 28.877-35.942 35.635-41.062 47.206-69.53 109.875-78.029 172.339-2.662 19.763-3.482 52.122-1.843 73.728 2.662 35.123 12.186 72.294 27.341 106.598 6.349 14.336 22.323 44.032 23.245 43.213 0.205-0.205 103.424-103.322 229.376-229.171z" />
+<glyph unicode="&#xea62;" glyph-name="modifier_synchro" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c65.331-6.861 122.266-29.696 174.387-70.246 14.029-10.854 41.267-37.99 52.838-52.531 41.37-52.122 64.819-109.568 71.68-176.128 1.536-14.336 1.843-45.158 0.614-58.368-1.638-16.998-1.946-19.866-4.096-31.949-18.125-104.038-86.118-194.15-181.76-240.947-36.659-17.92-77.21-29.184-117.248-32.666-10.752-0.922-54.682-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-62.566 8.192-124.109 35.942-172.851 77.926-4.71 4.096-29.184 28.57-33.792 33.792-41.062 47.206-69.53 109.875-78.029 172.339-2.662 19.763-3.482 52.122-1.843 73.728 4.506 60.518 28.57 123.187 66.15 172.544 48.435 63.59 117.043 107.52 193.741 124.314 6.451 1.434 13.414 2.765 15.36 3.072s4.915 0.819 6.554 1.126c3.482 0.512 20.787 2.458 26.726 2.867 10.035 0.819 44.134 0.307 55.296-0.922zM489.267 677.274c-37.786-4.096-72.090-16.179-103.219-36.557-47.616-31.13-82.022-78.541-96.563-133.325-4.813-18.227-4.813-18.432-2.355-18.534 14.95-0.512 66.458 0 67.072 0.717 0.512 0.512 1.946 4.403 3.174 8.602s4.71 12.8 7.68 19.149c19.046 40.038 53.043 70.451 94.925 84.582 19.251 6.554 35.43 8.909 56.627 8.397 24.576-0.614 44.954-5.734 67.584-16.896 21.299-10.445 42.086-27.238 55.501-44.749l5.837-7.578-26.112-26.112c-25.6-25.6-25.907-26.010-22.426-26.112 1.946 0 30.208-0.102 62.771-0.102l59.085-0.102 6.656 3.277c4.608 2.355 7.782 4.71 10.24 7.987 6.656 8.806 6.656 8.294 6.656 76.493v61.542l-24.371-24.371-24.371-24.269-3.994 5.325c-5.734 7.475-23.654 25.293-33.075 32.768-31.846 25.395-70.963 42.496-110.797 48.538-12.39 1.843-44.851 2.662-56.525 1.331zM309.76 407.245c-10.752-0.922-20.275-7.168-24.781-16.282l-2.867-5.939-0.307-63.488-0.205-63.488 24.269 24.269 24.371 24.166 4.608-5.632c2.56-3.174 9.114-10.342 14.643-15.872 64.819-65.229 163.84-85.197 249.549-50.278 28.979 11.776 54.682 29.184 77.722 52.429 23.552 23.859 43.213 56.013 53.76 88.166 4.915 14.95 8.499 30.31 7.475 31.437-1.024 1.024-67.277 0.717-68.198-0.307-0.512-0.512-2.048-4.813-3.584-9.626-8.909-27.955-26.317-53.453-49.971-73.318-25.498-21.299-53.043-33.075-86.835-37.171-9.523-1.126-32.973-0.717-42.086 0.819-25.498 4.198-49.869 14.234-70.246 28.877-10.24 7.475-27.546 24.166-34.099 32.973l-4.403 5.939 25.702 25.805c14.234 14.234 25.805 26.010 25.805 26.317 0 0.512-114.586 0.717-120.32 0.205z" />
+<glyph unicode="&#xea63;" glyph-name="modifier_upload" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 85.811 7.987 160.563 36.352 226.816 86.118 84.685 63.693 143.667 156.877 164.659 260.71 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-55.706 74.547-136.294 130.253-225.69 156.16-25.805 7.475-52.941 12.8-75.776 14.95-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM545.075 779.162c64.41-6.758 121.651-29.901 173.466-70.246 14.029-10.854 41.267-37.99 52.941-52.531 41.062-51.405 64.819-109.875 71.68-176.128 1.536-14.438 1.843-45.261 0.614-58.368-2.048-21.197-1.843-20.070-5.222-37.888-14.643-78.541-60.621-151.859-126.362-201.83-8.909-6.758-26.624-18.842-27.75-18.842-0.307 0-1.843-0.819-3.277-1.946-7.987-5.53-37.99-19.968-52.634-25.293-27.443-9.933-60.518-17.408-87.859-19.763-10.854-0.922-55.706-0.717-60.416 0.205-1.434 0.307-5.12 0.819-8.192 1.126-13.21 1.331-31.334 4.813-46.080 8.806-92.058 25.19-167.322 86.118-210.842 171.008-12.083 23.45-23.757 56.525-28.672 80.896-0.614 3.072-1.434 6.758-1.638 8.192-0.922 4.096-3.482 22.63-4.301 30.31-0.922 9.011-1.024 47.206-0.102 59.29 3.994 53.453 23.654 110.080 54.374 156.16 35.942 53.862 90.317 98.714 148.173 122.368 6.451 2.662 12.698 5.222 13.824 5.734 9.318 3.891 35.328 11.059 52.838 14.643 7.373 1.536 29.082 4.301 38.81 5.018 11.776 0.819 44.851 0.307 56.627-0.922zM497.152 703.59c-2.765-0.717-7.782-2.458-10.957-3.891-10.957-5.018-12.288-6.246-48.64-41.779-22.221-21.709-76.493-74.547-85.811-83.456-12.39-11.878-70.758-68.71-90.931-88.576-10.547-10.445-19.661-19.046-20.275-19.251-5.12-1.843 7.373-2.253 71.27-2.253h72.192v-115.507c0-125.645-0.205-120.73 5.734-132.506 3.994-7.885 12.39-15.667 21.606-20.070l7.987-3.789 90.112-0.307c100.045-0.307 94.822-0.614 107.725 6.554 10.138 5.632 17.408 15.155 21.197 27.955 1.434 5.018 1.638 17.92 1.638 121.651v116.019h145.306l-17.613 17.203c-32.563 31.744-49.357 48.026-57.549 56.013-4.506 4.403-15.565 15.155-24.576 23.962-30.413 29.594-83.763 81.51-88.576 86.118-2.662 2.56-13.722 13.312-24.576 23.859-10.854 10.65-22.426 21.094-25.702 23.347-3.277 2.15-9.83 5.325-14.746 6.963-7.27 2.458-10.547 2.97-19.251 2.97-5.734 0-12.698-0.512-15.565-1.229z" />
+<glyph unicode="&#xea64;" glyph-name="modifier_wizard" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c80.589-8.397 152.678-43.418 207.565-100.659 51.917-54.17 82.534-120.32 91.443-197.222 1.331-11.981 1.331-50.586 0-64.512-5.734-58.573-26.624-114.893-59.187-160.256-15.462-21.504-39.219-47.616-56.422-62.054-53.555-44.851-118.374-71.987-186.47-78.131-10.24-0.922-55.194-0.717-61.952 0.307-1.946 0.307-7.475 1.024-12.288 1.741-56.73 7.373-113.562 31.334-159.13 66.867-13.414 10.547-15.667 12.493-30.413 27.238-56.115 55.91-89.19 125.952-96.87 205.312-1.024 10.547-1.024 46.387 0 58.88 6.451 79.462 42.394 154.726 100.659 210.944 33.997 32.768 74.752 58.061 119.91 74.138 16.998 6.144 42.803 12.698 58.675 14.95 4.198 0.614 9.318 1.331 11.469 1.638 16.896 2.458 53.555 2.867 73.011 0.819zM444.416 677.786c-15.974-3.072-44.134-15.974-52.122-23.962-8.090-8.090-8.397-12.8-2.048-29.389 7.68-20.070 5.632-29.594-9.728-44.954-15.258-15.258-24.883-17.408-44.646-9.83-14.234 5.427-17.203 5.734-23.45 2.56-6.554-3.174-11.878-10.24-18.432-23.859-8.397-17.613-11.776-28.672-11.776-39.117-0.102-8.294 0.102-9.011 2.97-12.595 3.277-4.096 5.632-5.427 19.046-11.571 9.728-4.403 15.565-9.523 18.33-15.974 2.97-6.656 4.403-16.691 3.686-25.6-1.536-19.046-7.987-27.341-27.034-35.021-14.131-5.632-18.227-11.162-17.306-23.45 1.126-14.95 12.288-42.086 22.528-54.989 4.096-5.12 11.674-8.909 16.794-8.294 2.15 0.205 8.704 2.253 14.643 4.608 11.776 4.608 19.968 5.53 26.726 2.97 10.65-4.198 23.962-16.589 29.082-27.443 4.301-9.114 3.891-16.282-1.536-30.515-5.427-14.131-5.632-19.149-1.229-25.088 5.939-8.090 18.227-15.462 38.298-22.938 12.083-4.506 22.118-6.349 28.979-5.325s12.186 6.656 16.282 17.101c5.837 14.643 12.493 21.914 23.654 25.6 6.554 2.15 26.522 1.843 32.768-0.512 11.469-4.403 15.258-8.499 22.016-23.757 7.168-16.282 11.469-19.456 24.371-18.432 15.565 1.229 47.002 14.746 56.525 24.269 7.987 7.987 8.397 13.107 1.843 29.594-7.578 19.558-5.53 29.184 9.933 44.544 15.36 15.36 24.781 17.51 44.646 9.933 15.36-5.939 19.968-6.042 26.726-0.819 7.168 5.632 16.282 21.914 22.938 41.062 3.277 9.523 3.891 12.595 3.891 20.173 0.102 8.294-0.102 9.011-2.97 12.595-3.277 4.096-5.632 5.427-19.046 11.571-13.312 6.144-18.227 11.776-20.992 24.576-3.379 16.384-0.205 32.973 8.294 41.779 3.072 3.277 9.318 6.861 17.92 10.24 9.216 3.584 15.872 9.626 16.998 15.258 1.638 9.216-2.765 26.317-11.878 45.363-6.349 13.312-11.162 19.968-17.101 23.45-6.349 3.686-10.957 3.379-24.064-1.536-5.939-2.355-12.902-4.403-15.36-4.608-10.445-1.024-21.504 4.506-32.154 15.974-13.21 14.131-14.95 23.962-7.578 43.213 5.018 13.312 5.427 18.125 1.741 24.371-2.56 4.301-3.686 5.427-9.523 9.626-4.096 2.867-17.92 9.728-24.474 12.083-2.765 1.024-5.53 2.253-6.144 2.662-0.512 0.307-5.018 1.638-9.933 2.867-20.378 4.915-26.419 1.946-35.123-17.613-7.578-16.998-13.517-21.914-29.594-24.474-5.939-0.922-9.933-0.922-16.589 0-16.077 2.15-22.733 7.168-29.798 22.63-6.144 13.414-6.758 14.541-11.059 18.022-3.072 2.458-4.71 2.97-10.035 3.174-3.482 0.102-7.475 0-8.909-0.205zM536.064 558.182c20.787-4.506 39.936-14.848 54.989-29.594 38.912-38.093 45.261-97.485 15.462-143.36-9.728-15.053-28.877-31.539-45.773-39.629-24.474-11.571-52.736-13.926-78.95-6.656-36.557 10.24-66.048 39.014-77.619 75.776-4.608 14.438-5.939 37.069-3.277 52.531 8.602 48.538 47.002 85.197 97.28 92.774 6.144 0.922 30.925-0.307 37.888-1.843z" />
+<glyph unicode="&#xea65;" glyph-name="Modifier-download" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 14.336-79.258 50.483-152.576 104.96-212.992 50.893-56.422 113.971-97.69 186.368-121.856 20.992-7.066 53.453-14.746 72.704-17.306 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 19.866 8.090 48.64 22.63 62.976 31.846 15.36 9.83 20.378 13.21 30.72 20.787 6.451 4.813 13.414 10.138 15.462 11.878s5.939 5.018 8.704 7.27c13.005 10.65 33.28 30.822 47.104 46.899 44.339 51.507 74.342 108.646 91.853 174.797 2.867 10.752 8.499 37.888 9.318 45.056 0.307 2.56 0.717 6.042 1.024 7.68 2.97 16.794 4.301 66.97 2.355 90.624-1.024 13.824-4.403 39.014-6.758 50.176-19.354 94.618-66.355 177.152-137.421 240.742-67.174 60.211-156.57 99.84-243.61 108.032-3.686 0.307-7.987 0.819-9.728 1.126-3.686 0.512-61.542 1.434-62.054 0.922zM544.256 779.162c65.331-6.861 122.266-29.696 174.387-70.246 13.926-10.854 41.267-37.99 52.634-52.326 41.677-52.429 65.024-109.67 71.885-176.333 1.536-14.336 1.843-45.158 0.614-58.368-1.638-16.998-1.946-19.866-4.096-31.949-18.125-104.038-86.118-194.15-181.76-240.947-36.659-17.92-77.21-29.184-117.248-32.666-10.752-0.922-54.682-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-36.25 4.71-70.963 15.565-104.96 32.666-23.245 11.776-45.875 26.726-65.741 43.418-6.144 5.222-30.003 28.877-35.942 35.635-41.062 47.206-69.53 109.875-78.029 172.339-2.662 19.763-3.482 52.122-1.843 73.728 4.506 60.518 28.57 123.187 66.15 172.544 48.435 63.59 117.043 107.52 193.741 124.314 6.451 1.434 13.414 2.765 15.36 3.072s4.915 0.819 6.554 1.126c3.482 0.512 20.787 2.458 26.726 2.867 10.035 0.819 44.134 0.307 55.296-0.922zM434.483 650.342c-11.264-4.198-18.842-12.083-22.835-23.552-2.048-5.939-2.048-8.294-2.048-98.611v-92.467h-57.344c-31.539 0-57.344-0.205-57.344-0.512 0-0.41 21.094-21.197 43.008-42.496 8.704-8.499 16.998-16.589 87.962-86.016 57.549-56.32 55.091-54.067 63.078-57.958 12.083-5.837 24.269-7.066 36.659-3.584 11.776 3.277 12.8 3.994 55.603 46.080 30.925 30.31 91.546 89.6 102.195 99.738 4.506 4.403 16.691 16.282 26.829 26.419l18.637 18.33h-114.483v92.058c0 86.221-0.102 92.467-1.843 98.099-3.584 11.264-10.445 19.046-21.197 24.064l-5.12 2.355-145.408 0.41-6.349-2.355z" />
+<glyph unicode="&#xea66;" glyph-name="mon_reseau" d="M409.6 453.12v-215.040h61.44v430.080h-61.44v-215.040zM522.24 637.542v-30.822l7.475-0.102c14.848-0.205 27.546-1.229 47.309-4.096 7.885-1.126 15.155-2.253 16.077-2.56 1.024-0.307 3.072-0.819 4.608-1.024 7.066-1.331 20.275-4.71 31.539-8.090 95.744-29.082 176.23-96.461 221.184-185.344 4.608-9.011 9.318-18.637 10.445-21.504 18.534-43.213 29.184-92.672 29.901-137.933l0.102-7.987h61.747l-0.717 17.203c-0.41 9.421-1.126 20.582-1.638 24.781s-1.229 10.24-1.536 13.312c-5.427 49.562-25.088 108.544-52.224 156.774-28.058 49.766-69.12 96.461-115.814 131.686-40.141 30.413-89.395 55.091-137.626 69.12-15.974 4.608-45.261 11.059-57.856 12.595-2.253 0.307-5.018 0.717-6.144 1.024-1.126 0.205-6.144 0.717-11.264 1.126-5.018 0.307-9.523 0.819-9.83 1.024s-8.499 0.614-18.227 1.024l-17.51 0.614v-30.822zM296.96 396.8v-158.72h61.44v317.44h-61.44v-158.72zM522.24 524.902v-30.822l6.451-0.102c7.168-0.205 8.294-0.205 19.661-1.331 47.411-4.506 96.051-24.371 134.144-54.989 10.65-8.499 31.13-28.979 39.424-39.322 30.72-38.502 50.074-85.914 54.886-133.939 0.922-9.728 1.229-14.029 1.331-20.378l0.102-5.939h61.645l-0.614 14.131c-0.307 7.68-0.819 16.077-1.126 18.637-5.222 42.906-15.462 76.8-34.202 113.254-30.31 58.778-79.77 107.827-139.059 137.523-41.267 20.685-82.842 31.437-129.536 33.587l-13.107 0.512v-30.822zM184.32 340.48v-102.4h61.44v204.8h-61.44v-102.4zM522.24 412.262v-30.822l3.891-0.102c27.853-0.512 58.573-11.059 80.896-27.75 10.547-7.885 24.371-21.811 31.437-31.539 16.486-22.938 26.624-53.043 27.034-80.589l0.102-3.379h61.645l-0.614 11.059c-1.946 31.949-9.83 59.699-24.371 86.426-12.698 23.347-29.491 43.418-53.043 63.386-5.53 4.71-25.6 17.408-34.304 21.709-25.907 13.005-52.838 20.173-80.896 21.811l-11.776 0.717v-30.925zM71.68 284.16v-46.080h61.44v92.16h-61.44v-46.080zM546.611 318.464c-8.397-2.253-14.438-5.837-20.787-12.186-10.957-11.059-15.258-23.962-13.107-39.014 5.325-37.376 51.098-52.531 77.619-25.702 9.216 9.318 13.824 20.070 13.824 32.358s-4.608 23.040-13.824 32.358c-11.571 11.674-28.467 16.384-43.725 12.186z" />
+<glyph unicode="&#xea67;" glyph-name="money" d="M76.8 473.6v-256h819.2v512h-819.2v-256zM768.41 671.744c2.867-27.648 18.022-49.869 42.189-61.85 9.728-4.813 16.896-6.861 26.829-7.885l7.373-0.717v-255.693h-3.789c-10.957-0.102-27.238-5.427-38.502-12.8-19.763-12.698-33.792-37.581-34.406-60.621l-0.102-3.379h-563.2l-0.102 2.355c-0.614 30.208-20.787 58.47-49.459 69.427-4.813 1.843-19.046 5.222-20.787 4.915-0.512-0.102-2.048-0.102-3.584 0l-2.867 0.102v255.693l7.066 0.717c27.546 2.765 50.995 19.456 62.976 44.954 3.072 6.451 6.656 21.504 6.758 27.648v3.789h562.893l0.717-6.656zM467.763 626.074c-63.078-8.192-114.176-53.043-129.741-113.766-3.994-15.36-4.198-17.203-4.71-35.123-0.512-21.094 0.717-30.106 7.168-50.688 12.902-41.267 43.213-74.957 84.173-93.491 10.24-4.608 23.757-8.602 37.581-10.957 11.469-2.048 39.834-2.048 49.254-0.102 2.867 0.614 6.246 1.331 7.68 1.536 20.992 3.994 47.206 16.896 65.126 31.949 28.16 23.552 45.67 53.453 53.248 90.522 1.946 9.626 2.56 38.195 1.126 48.128-5.427 35.635-20.685 65.638-45.67 90.010-22.938 22.221-49.357 35.226-84.070 41.574-6.042 1.024-33.894 1.331-41.165 0.41zM236.544 511.386c-6.656-1.229-16.282-6.349-20.582-10.854-21.197-22.118-10.035-58.163 19.866-64.41 3.379-0.717 7.066-1.126 8.294-0.922s4.198 0.614 6.656 0.922c15.974 2.355 30.822 20.070 30.822 36.864 0 23.859-22.118 42.598-45.056 38.4zM724.992 511.693c-28.877-3.994-43.11-36.147-26.726-60.006 13.414-19.354 41.267-22.016 57.856-5.427 18.944 18.944 14.131 49.562-9.421 61.542-6.451 3.277-15.258 4.813-21.709 3.891zM921.6 422.4v-230.4h-793.6v-51.2h844.8v512h-51.2v-230.4z" />
+<glyph unicode="&#xea68;" glyph-name="More_dots" d="M186.88 548.762c-20.378-3.584-39.014-13.312-54.272-28.57-19.661-19.558-30.003-44.544-30.003-72.192 0-56.627 45.466-102.195 102.298-102.195 16.282 0 30.31 3.277 45.466 10.752 46.080 22.733 67.789 76.186 50.995 125.235-11.878 34.509-42.701 60.723-79.155 67.072-9.421 1.638-25.702 1.638-35.328-0.102zM494.592 548.762c-35.226-6.042-64.512-29.798-77.722-63.181-5.222-13.107-7.168-24.781-6.758-40.141 0.717-27.853 10.24-50.176 29.696-69.632 20.685-20.685 45.67-30.618 75.264-29.798 55.296 1.434 99.123 46.285 99.123 101.478 0 50.278-35.123 92.467-84.48 101.274-9.523 1.741-25.293 1.741-35.123 0zM799.539 548.352c-11.059-2.253-14.95-3.584-23.347-7.475-10.752-5.018-20.378-11.878-29.184-20.685-15.155-15.155-23.859-31.437-28.16-52.634-10.547-52.531 21.914-104.243 74.342-118.579 9.011-2.458 11.878-2.765 26.010-2.765 13.824 0.102 17.101 0.41 25.805 2.765 38.707 10.342 66.355 40.038 74.957 80.589 2.048 9.626 1.331 31.949-1.229 42.496-8.397 33.075-30.72 58.47-63.078 71.68-15.258 6.144-39.424 8.192-56.115 4.608z" />
+<glyph unicode="&#xea69;" glyph-name="move_to_folder" d="M102.4 652.8v-128h128v27.546c0 29.798 0.41 32.563 5.734 39.629 1.536 1.946 4.915 4.813 7.475 6.349 3.994 2.355 5.837 2.765 12.39 2.765 6.451 0 8.499-0.512 11.981-2.56 4.096-2.458 51.61-48.742 123.187-119.808 31.949-31.642 33.69-33.69 37.171-41.062 9.011-19.149 9.011-37.376 0-56.218-3.482-7.168-5.837-9.728-34.509-38.4-63.386-63.078-121.651-119.91-125.338-122.061-9.011-5.53-22.118-3.686-30.208 4.096-7.373 7.27-7.885 9.933-7.885 41.882v27.443h-128v-60.621c0-68.301 0.102-68.71 7.27-83.558 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-128zM256 537.702v-38.502l-85.197-0.102c-46.899 0-86.63-0.307-88.371-0.512-5.427-0.922-15.258-6.144-19.866-10.752-2.458-2.458-5.939-7.475-7.68-11.162l-3.174-6.656v-120.832l3.174-6.656c5.325-10.854 13.107-17.613 24.166-20.89 5.12-1.434 14.95-1.638 91.341-1.638h85.606v-76.8l5.427 5.222c2.867 2.97 27.034 26.624 53.453 52.634 26.522 26.010 56.934 56.013 67.686 66.458 16.589 16.179 20.173 20.275 23.040 26.010 3.174 6.349 3.482 7.578 3.379 16.077-0.102 7.68-0.614 10.24-2.867 15.258-2.97 6.758 2.56 1.024-90.726 92.774-26.624 26.214-50.893 50.074-53.862 53.043l-5.53 5.53v-38.502z" />
+<glyph unicode="&#xea6a;" glyph-name="multi_sim" d="M207.36 881.766c-11.366-3.584-19.046-10.24-24.371-20.992l-3.277-6.758v-684.032l3.174-6.656c4.198-8.602 10.342-14.848 18.739-18.842l6.758-3.174 124.416-0.614v51.302h-40.243c-45.978 0-47.002 0.102-54.579 7.782-7.373 7.27-7.578 9.114-7.578 54.886v39.731h102.4v25.6h-102.4v102.4h102.4v25.6h-102.4v40.243c0 46.182 0.102 47.104 7.885 54.682 7.578 7.27 9.114 7.475 54.784 7.475h39.731v86.323c0 96.563-0.102 94.208 7.27 109.056 7.885 16.077 23.347 28.365 41.472 32.973 7.578 1.946 11.776 2.048 107.11 2.048 54.477 0 99.123 0.205 99.123 0.512s-22.835 23.347-50.688 51.2l-50.688 50.688-137.523-0.102c-108.032 0-138.342-0.307-141.517-1.331zM387.789 754.074c-13.517-3.174-25.498-15.462-28.365-28.979-0.717-3.584-0.922-110.592-0.819-344.166l0.307-338.944 3.174-6.656c4.096-8.499 10.445-14.848 18.842-18.842l6.656-3.174 198.144-0.307c129.843-0.102 199.782 0.102 202.957 0.819 11.776 2.458 21.402 10.138 26.829 21.504l3.174 6.656 0.307 279.757 0.205 279.859-153.6 153.6-136.909-0.102c-75.469-0.102-138.752-0.512-140.902-1.024zM512 371.2v-51.2h-102.502l0.307 42.291c0.307 47.309 0 45.056 8.090 52.941 7.168 6.861 7.782 6.963 53.453 7.066l40.653 0.102v-51.2zM640 307.2v-115.2h-230.4v102.4h128v128h102.4v-115.2zM750.694 420.864c6.144-2.15 10.65-5.939 13.926-11.571l2.867-4.813 0.307-42.189 0.307-42.291h-102.502v102.4h40.346c33.382 0 41.062-0.307 44.749-1.536zM768 243.2v-51.2h-102.4v102.4h102.4v-51.2zM512 115.2v-51.2h-41.267l-41.165 0.102-5.53 2.765c-3.072 1.536-6.861 4.403-8.499 6.451-5.632 7.066-5.837 8.192-5.939 52.429v40.653h102.4v-51.2zM640 115.2v-51.2h-102.4v102.4h102.4v-51.2zM767.795 124.211c-0.307-47.206 0-45.056-7.885-52.941-7.066-7.066-8.704-7.27-54.067-7.27h-40.243v102.4h102.502l-0.307-42.189z" />
+<glyph unicode="&#xea6b;" glyph-name="multiple_timezone" d="M363.418 908.39c-0.205-0.205-4.301-0.614-9.011-1.024-37.683-2.765-79.36-14.438-116.326-32.358-104.448-50.893-175.411-153.907-185.651-269.517-1.434-16.589-0.717-58.88 1.229-70.451 0.307-1.434 0.717-4.403 1.024-6.656 7.373-56.934 33.382-115.712 72.602-164.352 9.318-11.469 35.533-37.274 48.333-47.514 36.762-29.389 79.462-50.79 124.826-62.669 12.39-3.174 14.848-4.403 14.95-7.168 0-0.614 1.638-6.963 3.584-14.234 9.83-35.738 25.293-69.427 45.363-98.816 5.734-8.294 14.95-20.89 16.589-22.528 0.307-0.307 2.97-3.482 6.042-7.168 8.294-9.933 28.979-30.413 40.038-39.526 52.326-43.622 116.736-70.144 184.32-75.981 11.571-0.922 47.411-0.922 58.88 0.102 120.627 10.65 226.611 87.552 275.354 199.68 9.011 20.582 17.613 48.538 20.992 67.789 0.614 3.379 1.331 7.27 1.638 8.704 4.608 22.426 5.53 69.939 2.048 97.28-7.578 57.958-29.286 111.411-64.41 158.208-9.626 12.8-18.227 22.426-32.768 36.864-40.038 39.731-89.6 68.506-143.974 83.456-6.451 1.843-13.517 3.789-15.77 4.506l-3.891 1.126-3.379 13.312c-10.854 42.701-32.051 86.016-59.187 120.627-10.445 13.21-12.39 15.462-27.341 30.515-52.531 53.043-117.555 85.197-194.048 95.642-10.957 1.536-60.826 3.277-62.054 2.15zM399.77 815.104c10.547-5.018 18.432-14.746 20.992-26.214 0.717-2.867 1.126-38.605 1.126-97.382 0-88.371-0.102-93.082-1.946-99.021-1.126-3.482-3.072-7.782-4.506-9.626-3.994-5.325-91.034-91.546-95.13-94.413-10.752-7.27-27.853-8.090-38.605-1.843-20.582 11.981-26.624 35.635-13.926 55.091 1.843 2.765 20.275 21.914 40.858 42.496l37.478 37.376v82.125c0 76.902 0.102 82.432 1.843 88.166 4.096 13.005 14.541 22.733 28.365 26.214 1.126 0.307 5.53 0.307 9.83 0.205 5.734-0.307 9.216-1.126 13.619-3.174zM675.226 573.542c34.099-4.813 66.56-16.179 95.846-33.69 9.728-5.734 10.547-6.349 25.088-17.203 10.342-7.68 30.925-27.238 40.038-38.093 16.486-19.661 31.642-44.954 41.267-69.018 7.475-18.432 14.234-43.93 16.077-60.211 0.307-3.379 1.024-8.397 1.434-11.264 1.331-8.294 0.41-46.899-1.331-58.88-6.963-46.182-24.678-87.859-52.429-123.392-34.304-43.93-84.685-76.493-139.264-90.214-34.406-8.602-75.162-9.728-110.080-2.97-64.614 12.493-121.651 48.947-160.051 102.605-17.92 24.883-35.021 62.157-40.653 88.371-3.379 16.179-3.994 19.456-4.71 25.088-0.307 3.379-0.922 8.192-1.331 10.752-1.741 10.854-0.922 44.749 1.434 60.416 1.331 9.114 1.741 11.469 5.12 27.136 1.331 5.939 8.397 26.829 11.981 35.328 9.011 21.402 22.528 44.134 36.557 61.747 6.246 7.782 25.498 27.853 33.075 34.304 39.322 33.69 93.696 56.832 141.619 60.211 5.018 0.41 9.421 0.819 9.626 1.024 1.229 1.024 39.834-0.512 50.688-2.048zM628.634 535.142c-10.752-3.482-18.534-10.547-23.859-21.606-2.15-4.506-2.15-5.734-2.662-76.493l-0.512-71.987-39.014-39.117c-45.363-45.67-44.749-44.749-44.851-61.235-0.102-8.499 0.307-10.445 2.56-15.462 10.138-21.606 36.966-29.696 55.91-16.794 2.15 1.434 24.781 23.347 50.176 48.742 41.779 41.677 46.592 46.797 48.64 52.019l2.355 5.734v84.48c0 78.95-0.102 84.787-1.843 88.986-4.506 11.162-13.312 19.354-24.371 22.733-7.68 2.355-15.053 2.355-22.528 0z" />
+<glyph unicode="&#xea6c;" glyph-name="Music_artist" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM646.656 393.728c6.144-2.765 13.312-9.933 16.179-16.179l2.253-4.813 0.307-104.141c0.205-90.419 0-105.165-1.331-111.002-8.192-35.328-47.309-53.043-78.848-35.635-11.674 6.451-22.528 20.48-26.214 33.69-2.15 7.987-1.741 22.221 1.024 30.413 7.782 23.45 31.642 39.424 55.501 37.274l6.656-0.717v50.995c-0.102 50.381-0.102 50.995-2.15 50.688-1.126-0.205-19.354-4.813-40.448-10.138s-47.616-11.878-58.88-14.643c-11.264-2.867-22.221-5.53-24.269-6.144l-3.891-1.126v-75.981c-0.102-96.87-0.102-95.437-1.638-102.093-5.837-24.883-27.136-41.984-52.634-42.086-14.643 0-27.648 5.325-38.093 15.667-7.578 7.578-11.162 13.722-14.029 24.371-5.222 18.739-0.205 37.786 13.722 51.712 11.878 11.981 28.058 17.92 43.213 15.872 3.482-0.41 5.427-0.307 5.734 0.41 0.205 0.614 0.307 39.731 0.205 87.040 0 85.094 0 85.914 2.048 86.733 1.126 0.41 17.92 4.506 37.376 9.114s45.67 10.854 58.368 13.926c12.698 3.072 26.726 6.451 31.232 7.578s16.691 3.994 27.136 6.554c10.445 2.458 19.866 4.813 20.992 5.12 4.096 1.024 15.77-0.307 20.48-2.458z" />
+<glyph unicode="&#xea6d;" glyph-name="music_file" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM643.379 520.909c8.090-3.789 14.438-10.24 18.534-18.637l3.174-6.656 0.307-122.88c0.307-137.728 0.614-130.458-7.168-146.022-13.21-26.522-46.080-40.653-74.547-32.154-32.666 9.83-52.429 44.134-44.032 76.698 7.68 30.208 35.021 50.278 65.843 48.435l8.909-0.614v60.416c0 33.178-0.102 60.314-0.307 60.314-0.102 0-28.57-7.168-63.181-15.872s-69.12-17.306-76.493-19.149l-13.619-3.277v-101.99c0-98.202-0.102-102.4-2.048-109.978-3.686-14.336-13.107-28.365-24.883-36.864-14.848-10.752-36.966-14.541-54.989-9.216-21.606 6.246-38.4 23.859-44.134 46.285-5.427 21.197 1.024 44.032 16.896 60.006 12.902 13.005 26.419 18.432 45.978 18.534h11.981v102.605c0 96.768 0.102 102.605 1.843 103.117 0.922 0.307 6.554 1.638 12.493 3.072s16.794 3.994 24.064 5.734c7.373 1.843 14.029 3.379 14.848 3.584 2.355 0.512 21.299 5.12 69.632 16.794 9.318 2.253 22.016 5.222 28.16 6.758 18.432 4.403 57.139 13.619 59.392 14.234 5.325 1.331 17.101-0.307 23.347-3.277zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xea6e;" glyph-name="Music_genre" d="M848.077 889.446c-2.97-1.024-6.656-2.97-8.090-4.301-9.83-8.806-109.056-108.851-109.773-110.797-0.512-1.229-0.922-9.83-1.024-19.149l-0.102-16.896-178.79-178.79-7.373 5.632c-21.914 16.589-46.592 28.57-70.349 33.997-11.469 2.662-36.966 2.662-47.104 0-15.667-4.096-31.539-13.414-42.598-24.883-15.565-16.077-23.757-35.226-25.088-58.982-0.717-14.131-2.56-22.528-6.554-30.618-6.246-12.493-14.95-21.709-26.624-28.262-11.878-6.656-19.763-8.090-44.442-8.294-10.138-0.102-20.070-0.307-22.016-0.512-2.048-0.307-6.861-0.717-10.854-1.126-24.986-2.253-53.76-10.65-74.24-21.709-53.862-28.979-89.19-82.432-95.642-144.691-1.331-12.493-1.434-35.738-0.205-45.056 0.41-2.56 0.922-6.656 1.229-9.216 2.765-21.504 11.878-49.664 23.654-72.909 23.859-47.104 64.717-88.269 111.923-112.845 33.894-17.613 66.765-26.112 103.424-26.726 61.133-0.922 115.2 23.552 151.962 69.018 22.733 28.058 36.454 62.669 40.038 100.966 0.41 3.994 0.819 8.806 1.024 10.752s0.512 12.39 0.614 23.040c0.205 23.142 1.434 30.72 7.066 41.984 7.475 14.848 20.378 26.419 35.635 31.744 7.578 2.662 11.264 3.277 24.781 3.994 25.19 1.536 43.11 9.626 60.416 27.136 25.702 26.214 32.358 61.235 18.842 100.352-6.554 19.149-19.251 42.496-33.485 61.645l-2.15 2.97 179.098 179.2h15.462c8.499 0 17.101 0.307 18.944 0.717 5.018 0.922 112.64 108.544 115.814 115.814 2.867 6.144 2.765 15.053-0.102 21.094-2.97 5.939-79.36 82.33-84.89 84.787-5.939 2.662-12.288 2.97-18.432 0.922zM437.76 433.562c26.522-5.837 48.435-25.6 56.627-51.098 2.765-8.806 3.277-11.674 3.789-20.787 1.946-43.11-32.973-79.667-76.186-79.565-20.89 0.102-38.4 6.963-53.146 20.787-30.106 28.467-31.949 76.493-4.198 107.008 18.125 19.968 47.206 29.389 73.114 23.654z" />
+<glyph unicode="&#xea6f;" glyph-name="music_player" d="M428.032 843.981c-0.307-0.205-4.915-0.717-10.24-1.126-38.502-2.458-90.317-14.848-122.573-29.389-2.355-1.126-4.506-1.946-4.813-1.946s-6.861-3.072-14.643-6.758c-96.358-46.694-170.496-130.765-203.878-231.322-8.499-25.395-14.131-50.074-17.101-73.728-0.922-7.27-1.843-14.95-2.15-16.896-0.922-6.758-1.229-55.808-0.307-65.536 0.819-9.933 1.126-12.595 3.072-27.136 1.638-12.39 5.837-32.154 10.24-48.23 13.312-48.64 35.021-92.57 66.355-134.042 11.776-15.565 19.354-24.064 37.376-41.984 67.277-66.97 153.805-106.394 249.958-114.074 11.776-0.922 56.73-0.717 65.536 0.41 16.691 1.946 36.659 4.915 41.984 6.144 3.379 0.717 8.704 1.946 11.776 2.56 43.52 9.318 93.491 31.027 133.427 58.061 24.883 16.794 37.376 27.648 75.469 65.434 132.71 131.789 203.981 203.469 208.077 209.306 22.733 32.461 22.733 75.059 0 107.52-3.994 5.632-164.966 167.424-227.021 228.147-44.954 44.032-93.082 73.626-152.576 94.208-23.654 8.192-59.085 15.872-83.149 18.227-3.277 0.307-7.27 0.717-9.011 1.024-4.096 0.717-55.194 1.638-55.808 1.126zM605.082 689.562c13.312-3.072 26.214-13.722 31.437-26.214l2.97-6.963v-288.768l-3.174-8.909c-5.53-15.565-14.234-27.443-26.522-36.147-24.371-17.51-55.706-18.944-81.51-3.994-9.933 5.837-22.118 18.637-27.238 28.57-6.861 13.619-7.987 18.534-7.987 34.304 0.102 12.186 0.41 14.746 2.867 22.016 3.789 11.264 9.114 20.070 17.613 28.672s16.589 13.722 28.774 18.227c8.602 3.072 9.933 3.277 22.938 3.277h13.824l-0.205 64c-0.102 35.226-0.205 64.717-0.205 65.638-0.102 1.536-0.717 1.536-6.963-0.307-7.168-1.946-9.626-2.56-67.379-17.715-18.534-4.813-37.888-9.933-43.008-11.264-5.018-1.331-14.746-3.891-21.504-5.632s-13.005-3.379-13.824-3.584c-0.819-0.307-5.939-1.638-11.264-2.97-10.24-2.662-28.877-7.68-37.069-9.933l-4.71-1.331v-122.88c0-106.701-0.205-123.904-1.638-129.741-6.349-27.443-24.576-46.797-51.814-55.296-9.933-3.072-28.672-3.379-38.912-0.614-18.227 4.915-33.075 15.667-43.418 31.437-24.883 37.888-8.397 89.6 33.997 106.906 9.626 3.891 16.998 5.12 29.901 5.018h11.776v126.771c0 69.837 0.102 126.874 0.205 126.874s13.722 3.482 30.208 7.782c16.486 4.301 38.502 10.035 48.947 12.698 10.445 2.765 25.395 6.554 33.28 8.704 7.885 2.048 22.426 5.734 32.256 8.294 29.798 7.782 50.688 13.21 72.192 18.842 60.826 15.974 64.717 16.691 75.162 14.234zM766.976 565.76c0.307-0.307 11.571-10.65 25.088-23.040s26.931-24.576 29.696-27.238c2.867-2.56 13.926-12.698 24.576-22.528 10.752-9.728 21.811-19.866 24.576-22.528 8.704-7.987 18.227-16.691 21.811-19.866l3.379-2.97-2.867-2.662c-12.39-11.162-26.726-24.371-27.955-25.6-0.819-0.819-9.114-8.499-18.432-16.896-9.318-8.499-17.408-15.77-18.022-16.384-0.614-0.512-5.837-5.427-11.674-10.752s-13.722-12.493-17.408-15.974c-3.686-3.379-8.909-8.192-11.674-10.752-2.765-2.458-6.042-5.427-7.168-6.554-1.229-1.126-7.27-6.656-13.414-12.288s-14.029-12.902-17.51-16.077c-3.379-3.277-6.554-5.939-6.861-5.939-0.41 0-0.717 63.181-0.717 140.39v140.39l12.083-11.059c6.554-6.144 12.186-11.366 12.493-11.674z" />
+<glyph unicode="&#xea70;" glyph-name="Mute_microphone" d="M484.045 472.576l-434.995-435.098 13.21-13.107c7.168-7.168 19.456-19.456 27.238-27.136l14.029-14.131 870.298 870.298-27.136 27.238c-14.95 14.95-27.341 27.136-27.443 27.034-0.102 0-195.994-195.789-435.2-435.098zM485.376 881.050c-20.89-3.379-35.123-7.782-52.736-16.486-54.886-27.136-91.648-79.872-98.816-141.619-0.614-5.939-1.024-58.982-0.922-148.48 0-112.435 0.307-141.312 1.434-149.811 1.331-10.138 4.096-22.528 5.222-23.654 0.307-0.307 78.336 77.312 173.466 172.544l173.056 172.954-1.536 5.939c-2.15 8.294-8.090 23.245-13.005 32.973-24.474 48.23-71.168 83.763-123.699 94.106-20.685 4.096-43.622 4.608-62.464 1.536zM232.96 523.469c-11.469-3.891-19.558-10.854-24.474-21.197l-3.174-6.656v-36.864c0.102-40.55 0.922-50.074 6.758-76.698 5.325-24.269 12.186-44.339 22.733-66.355 3.482-7.27 6.554-13.107 6.861-13.107s13.312 12.8 28.877 28.467l28.365 28.365-5.018 14.95c-4.403 12.902-8.397 30.106-10.752 45.466-0.41 2.253-0.819 14.95-1.126 28.16-0.922 50.176-0.614 46.899-4.198 54.272-6.349 13.414-17.818 21.299-32.358 22.118-5.427 0.205-9.83-0.102-12.493-0.922zM770.355 523.264c-10.547-2.97-19.251-10.445-24.269-20.992l-3.174-6.656-0.717-35.84c-0.717-37.581-0.717-37.478-3.994-54.989-5.222-28.365-18.125-60.109-34.304-83.968-22.528-33.485-48.742-57.242-83.354-75.878-4.198-2.253-8.090-4.403-8.704-4.813-2.355-1.638-25.6-10.547-33.894-12.902-46.182-13.414-95.949-12.493-139.776 2.662l-11.674 3.994-28.365-28.365c-15.667-15.565-28.467-28.774-28.467-29.184 0-0.922 18.125-9.626 29.184-14.029 19.149-7.578 47.821-15.36 66.048-17.818l8.704-1.229 0.307-39.629 0.205-39.629h-46.899c-29.286 0-49.254-0.41-53.043-1.126-19.354-3.482-36.147-20.070-40.243-39.629-0.614-2.97-1.126-12.288-1.126-20.685v-15.36h358.502l-0.102 16.384c-0.102 10.035-0.717 18.432-1.536 21.606-4.915 18.637-20.685 33.792-39.219 37.683-3.482 0.717-22.221 1.126-52.941 1.126h-47.616v39.322c0 44.442-0.922 39.834 8.704 41.062 8.397 0.922 24.781 4.608 37.888 8.294 50.074 14.336 94.822 40.653 132.198 77.722 51.2 50.893 82.125 116.531 89.395 189.952 0.512 4.813 0.819 23.654 0.717 41.984l-0.102 33.28-3.174 6.656c-8.090 17.101-27.341 26.010-45.158 20.992zM579.072 386.56c-61.338-61.338-111.309-111.718-111.104-111.923 1.126-0.922 11.366-2.97 20.992-4.301 19.149-2.56 43.008-1.434 63.181 3.072 57.754 12.902 107.213 56.32 127.898 112.333 3.174 8.806 8.397 28.57 9.626 36.659 0.717 5.12 1.946 67.174 1.331 72.397-0.307 3.277-4.096-0.41-111.923-108.237z" />
+<glyph unicode="&#xea71;" glyph-name="my_account" d="M487.834 881.664c-28.979-4.301-53.76-13.619-77.21-28.979-11.571-7.578-18.022-13.005-29.696-24.678-27.853-28.058-44.749-61.645-51.405-102.502-1.638-10.342-1.638-44.544 0.102-54.272 3.482-20.275 9.114-37.683 17.51-54.477 24.064-48.026 66.97-82.739 118.682-96.154 64.922-16.794 134.144 3.072 179.917 51.61 25.19 26.726 41.574 59.597 48.128 96.461 2.253 12.595 2.56 46.080 0.512 57.856-1.843 11.059-6.758 29.491-9.933 37.581-18.534 47.514-54.067 84.48-100.352 104.243-15.258 6.554-25.498 9.421-47.514 13.312-7.578 1.434-39.424 1.331-48.742 0zM346.624 525.414c-1.126-0.717-6.656-4.301-12.288-7.987-56.218-36.352-94.515-98.406-102.605-166.195-0.41-3.891-0.819-62.259-0.819-129.536v-122.368l2.662-9.728c6.349-22.733 19.456-42.394 37.274-55.808 8.602-6.451 20.275-12.595 29.901-15.77 16.384-5.427 5.632-5.222 258.56-5.222h234.394l-0.41 168.243c-0.205 92.467-0.717 169.984-1.126 172.237-3.072 17.408-6.246 31.846-8.499 38.912-16.998 53.965-51.2 98.509-98.816 128.41-5.427 3.482-10.445 6.246-11.059 6.246s-2.867-1.536-4.915-3.482c-24.986-23.142-63.488-43.827-97.894-52.429-21.299-5.427-34.714-7.066-57.958-7.066-20.992 0-29.901 0.819-47.309 4.198-29.184 5.632-58.573 17.818-83.763 34.509-8.909 5.939-23.962 17.715-27.546 21.606-2.765 2.97-4.71 3.277-7.782 1.229zM683.622 408.781c12.083-4.403 20.070-11.469 25.702-22.835 11.674-23.757-1.229-52.941-26.829-60.314-23.347-6.861-48.23 6.963-54.272 30.003-6.451 24.064 7.68 48.128 31.744 54.067 6.349 1.536 18.022 1.126 23.654-0.922zM712.704 201.011c0-59.597 0.41-95.949 1.126-100.147 2.048-13.005 7.475-19.558 17.613-21.094 2.867-0.41 5.632-0.922 6.144-1.024 0.41-0.102 1.434-0.205 2.253-0.307 1.229-0.102 1.536-1.638 1.536-7.27v-7.168h-130.048v7.168c0 3.994 0.102 7.168 0.307 7.27 0.102 0 2.56 0.307 5.325 0.512 7.885 0.819 15.974 5.222 18.432 10.138 1.946 3.994 2.048 6.451 2.355 84.992 0.307 79.565-0.102 90.214-3.072 96.461-1.946 4.096-8.704 7.475-16.589 8.192l-6.758 0.614v15.053h101.376v-93.389z" />
+<glyph unicode="&#xea72;" glyph-name="my_bill_uk" d="M179.2 755.2v-102.4h26.112c14.336 0 26.112 0.41 26.112 0.819 0 1.331 9.523 7.987 13.824 9.626 14.234 5.53 30.31 1.843 40.755-9.318 7.68-8.192 10.342-14.95 10.342-26.726 0.102-9.011-0.102-10.24-3.277-16.589-6.042-12.288-17.51-20.173-31.437-21.811-8.909-1.024-20.582 3.174-28.57 10.138l-2.97 2.662h-50.893v-307.2h53.453l2.97 2.458c6.656 5.632 21.299 8.499 31.642 6.246 10.547-2.253 20.992-10.957 26.317-21.914 2.458-5.018 2.765-6.963 2.765-14.95 0-6.963-0.614-10.547-2.253-14.848-6.963-17.715-28.262-28.058-46.285-22.426-4.915 1.536-12.083 6.246-16.282 10.547l-3.584 3.686h-48.845l0.307-71.373c0.41-69.018 0.41-71.68 2.458-78.131 8.909-27.853 29.389-47.002 57.549-53.965 6.246-1.536 31.949-1.638 306.176-1.741l299.213-0.102-0.205 377.856c-0.307 359.014-0.41 378.163-2.15 384-8.704 29.491-30.618 50.176-59.597 56.32-6.246 1.331-46.797 1.536-305.357 1.536h-298.291v-102.4zM729.293 664.781c11.981-7.168 16.486-22.426 10.035-34.099-3.072-5.53-4.915-7.373-10.24-10.547l-4.608-2.662-159.13-0.307c-179.507-0.307-165.478-0.922-173.773 7.68-12.902 13.312-7.885 35.635 9.421 41.779 3.379 1.229 29.696 1.434 163.738 1.229l159.744-0.205 4.813-2.867zM729.293 536.883c19.046-11.264 16.486-39.014-4.198-46.387-3.891-1.331-23.654-1.536-161.894-1.536-136.704 0-158.003 0.205-161.792 1.536-17.715 6.246-23.040 28.774-9.728 41.984 8.090 8.090-5.734 7.578 173.056 7.373l159.744-0.205 4.813-2.765zM585.216 409.395c15.258-8.192 18.432-28.57 6.246-40.653-8.090-8.192-3.379-7.782-100.045-7.782-74.035 0-86.221 0.205-90.112 1.536-17.92 6.349-23.040 28.672-9.523 42.086 7.782 7.782 3.174 7.475 101.786 7.27l87.552-0.205 4.096-2.253zM715.366 318.976c14.234-2.253 24.166-7.27 32.666-16.691 7.066-7.782 11.776-16.896 11.776-22.733 0-8.704-7.475-15.36-17.408-15.36-8.090 0.102-11.264 2.355-16.384 11.674-6.246 11.674-13.722 15.77-27.136 14.848-7.066-0.41-11.674-2.355-15.974-6.861-5.837-5.939-7.066-11.264-7.68-31.744l-0.614-18.125h17.51c19.149 0 22.938-0.819 26.010-5.427 3.686-5.632 2.048-15.77-3.174-19.661-2.458-1.843-4.506-2.048-20.685-2.253-9.83 0-18.227-0.205-18.534-0.205-0.307-0.102-0.614-4.813-0.512-10.547 0.102-24.474-3.277-39.117-11.878-51.2l-1.946-2.867h46.694c44.237 0 46.899-0.102 50.586-1.946 2.355-1.229 4.403-3.277 5.222-5.222 1.536-3.789 0.819-10.342-1.536-13.926-3.686-5.632-3.072-5.632-74.752-5.325l-65.946 0.307-3.072 2.97c-3.891 3.789-5.53 8.704-4.915 14.438 0.819 6.042 2.97 9.011 10.547 14.438 7.782 5.632 10.752 8.909 14.029 15.974 3.584 7.68 4.915 16.486 4.71 30.003-0.205 13.824 0.102 13.517-10.65 13.21-8.704-0.102-13.824 1.638-16.179 5.734-2.355 3.891-2.458 11.059-0.307 15.258 2.355 4.506 6.963 6.246 16.998 6.246h8.192l-0.205 19.251c-0.102 21.606 1.126 28.774 6.656 39.629 10.65 20.378 37.786 30.822 67.891 26.112z" />
+<glyph unicode="&#xea73;" glyph-name="my_boutique" d="M496.128 882.586c-23.654-2.765-40.96-7.578-60.723-16.896-60.109-28.262-100.659-89.907-102.4-155.75l-0.205-5.939h-153.6v-310.989c0-333.312-0.205-315.597 5.018-330.445 2.765-7.885 9.933-19.251 16.282-25.805 9.728-10.035 20.378-16.589 35.021-21.299l6.656-2.15 267.264-0.205c292.966-0.205 273.408-0.512 288.461 5.837 21.197 9.011 37.581 27.75 44.544 50.688 1.741 5.837 1.843 20.89 2.048 320.307l0.307 314.061h-153.6l-0.102 5.939c0 3.174-0.205 6.554-0.307 7.373-0.205 0.819-0.614 4.608-1.024 8.294-2.355 23.552-12.902 53.043-26.726 74.342-29.696 45.773-75.059 74.445-128.922 81.715-10.035 1.331-29.798 1.843-37.99 0.922zM537.088 829.44c25.702-5.53 46.49-16.794 65.024-35.328 22.323-22.221 35.43-50.893 37.581-81.613l0.614-8.499h-256.614l0.614 8.499c3.072 44.954 30.413 85.606 71.168 106.086 12.595 6.246 24.576 9.933 42.189 12.698 6.246 1.024 31.744-0.102 39.424-1.843zM337.408 587.674c11.059-15.974 33.485-15.155 43.315 1.536l2.765 4.71 0.307 25.907 0.41 25.805 3.072-1.741c1.638-1.024 5.53-4.506 8.499-7.68 26.726-28.774 12.288-75.264-26.317-84.582-6.758-1.741-20.685-0.819-27.75 1.638-38.707 13.722-46.49 65.638-13.517 89.498l4.096 2.97 0.512-26.010 0.512-26.112 4.096-5.939zM642.867 590.029c6.451-13.005 23.552-17.92 35.942-10.24 5.427 3.379 10.138 9.626 11.366 15.258 0.512 2.15 1.024 14.541 1.024 27.341v23.347l3.174-1.843c5.222-3.072 13.926-13.21 17.101-20.070 9.933-20.89 5.53-44.032-11.366-59.699-15.974-14.848-39.117-17.715-59.597-7.27-6.451 3.277-16.998 14.643-20.787 22.426-10.752 22.016-3.994 49.254 15.667 63.488l4.096 2.97 0.512-25.395c0.512-23.962 0.614-25.702 2.867-30.31zM538.931 496.23c24.678-5.632 45.158-16.896 63.181-34.918 32.768-32.666 45.978-81.408 32.666-121.139-2.662-8.090-13.619-30.822-21.299-44.237-1.536-2.765-3.891-6.963-5.222-9.216-3.994-7.066-49.152-87.45-56.32-100.352-9.83-17.51-30.208-53.965-35.226-62.669-2.253-4.096-4.506-7.475-4.813-7.475-0.41 0-1.638 1.741-2.765 3.891-1.126 2.253-6.963 12.698-13.005 23.347-9.318 16.384-17.715 31.232-32.051 56.73-1.434 2.56-9.728 17.306-18.432 32.768s-16.998 30.208-18.432 32.768c-1.434 2.56-7.68 13.619-13.824 24.576-24.064 42.598-29.286 57.344-29.184 83.354 0.307 62.259 48.845 116.429 111.411 124.518 10.445 1.434 33.075 0.307 43.315-1.946zM547.84 407.962c-17.715-7.885-33.587-14.95-35.328-15.667-1.638-0.819-16.896-7.578-33.792-14.95-16.896-7.475-31.13-13.926-31.539-14.336s9.523-3.584 22.221-7.168c12.698-3.584 23.45-6.758 23.962-7.066 0.41-0.307 2.15-10.957 3.686-23.654s3.174-24.678 3.482-26.624l0.819-3.482 6.554 10.65c3.584 5.939 8.499 13.722 10.854 17.408 3.482 5.427 30.618 49.152 51.61 82.944 2.56 4.198 5.939 9.626 7.475 12.083 1.536 2.355 2.662 4.301 2.56 4.198-0.205 0-14.848-6.451-32.563-14.336z" />
+<glyph unicode="&#xea74;" glyph-name="my_essential" d="M660.378 895.078c-0.205-0.205-4.301-0.717-9.114-1.024-11.366-1.024-29.286-4.096-41.779-7.27-101.376-25.805-180.019-105.677-204.493-207.77-5.734-23.859-6.861-35.226-7.373-76.902-0.307-21.402-0.614-39.014-0.717-39.014 0-0.102-17.613-0.41-39.014-0.717-47.514-0.614-62.362-2.458-92.16-11.469-110.080-33.178-188.314-128-199.885-242.176-1.024-10.342-1.024-46.694 0-56.32 7.578-67.482 36.557-127.078 84.48-173.466 44.544-43.11 99.533-69.427 162.509-77.517 15.565-2.048 68.608-1.536 72.192 0.614 0.307 0.205 3.379 0.717 6.656 1.024 3.379 0.41 6.451 0.922 6.758 1.126s4.096 1.024 8.397 1.946c65.126 13.414 127.898 54.989 168.448 111.411 27.853 38.707 46.694 88.576 50.893 134.349 0.41 3.994 0.819 8.806 1.024 10.752s0.41 18.432 0.41 36.454l0.102 32.973 38.707 0.512c21.197 0.205 39.731 0.717 41.165 1.024s5.325 0.819 8.704 1.229c24.883 2.662 60.416 13.414 85.811 25.805 87.654 42.906 146.022 126.157 156.877 224.051 1.331 11.674 1.434 50.586 0.102 58.675-0.307 1.843-1.024 7.066-1.638 11.776-5.734 42.906-25.088 89.6-52.224 126.259-45.466 61.338-117.35 103.526-189.952 111.616-2.765 0.307-6.246 0.819-7.68 1.126-2.867 0.614-46.592 1.434-47.206 0.922zM696.218 843.264c10.24-1.331 15.974-3.379 20.173-7.373 4.198-3.891 5.53-8.806 5.53-19.558 0-11.674 1.434-18.022 5.632-23.757 9.933-14.029 35.942-22.528 49.766-16.179 2.56 1.126 8.602 5.734 13.414 10.24 10.445 9.83 11.878 10.752 18.227 10.752 8.397-0.102 18.432-6.451 32.666-20.48 12.288-12.186 20.275-23.962 20.787-30.618 0.614-6.963-1.126-10.342-10.138-19.968-9.83-10.547-12.8-16.077-13.21-24.371-0.41-10.752 6.042-27.341 13.722-35.43 6.349-6.554 12.083-8.806 23.142-9.216 16.998-0.614 19.866-1.229 24.064-5.12 6.349-5.632 9.011-16.998 9.114-38.298 0.102-20.582-2.97-32.973-9.626-38.81-3.789-3.379-6.349-3.891-22.528-4.506-12.39-0.614-17.613-2.56-23.859-9.011-5.632-5.837-11.981-19.149-13.414-28.058-2.048-12.8 0.307-18.739 12.186-31.642 4.71-5.018 8.909-10.342 9.523-11.776 3.891-9.421-2.56-22.118-19.968-39.322-14.336-14.131-24.269-20.378-32.461-20.378-6.246 0-7.885 0.922-18.227 10.752-4.813 4.506-10.752 9.011-13.312 10.138-8.704 3.891-20.173 2.867-32.973-2.97-8.294-3.789-14.643-9.011-18.33-15.155-3.277-5.325-3.379-6.042-4.096-20.173-0.41-8.090-1.331-15.667-1.946-16.794-1.536-2.867-7.066-7.475-10.342-8.806-7.475-2.867-19.046-3.789-49.971-3.789l-32.051-0.102v102.4h29.491c33.485 0.102 36.864 0.307 50.893 3.584 11.776 2.765 18.227 5.12 29.491 10.854 12.698 6.451 19.866 11.776 31.539 23.45 18.944 18.944 29.798 39.014 35.328 65.536 2.355 10.854 2.56 36.966 0.512 47.616-9.933 50.893-48.845 91.034-99.123 102.093-13.517 2.97-38.707 3.174-51.507 0.512-55.091-11.776-95.232-54.784-102.4-109.568-0.512-4.403-1.024-21.402-1.024-37.683v-29.594h-102.4v31.027c0 39.629 1.434 50.074 8.090 57.344 4.096 4.506 8.192 5.734 19.661 5.939 10.957 0.205 18.842 1.741 23.040 4.506 7.68 5.018 14.336 15.667 17.92 28.672 3.891 14.336 1.434 22.118-11.059 35.533-9.83 10.342-10.547 11.571-10.65 18.022-0.205 7.987 6.144 18.534 19.456 31.949 14.336 14.541 25.498 21.709 33.792 21.811 6.144 0 7.987-1.024 18.33-10.854 9.728-9.114 15.36-12.083 23.45-12.493 10.854-0.512 28.262 6.144 35.942 13.824 7.066 7.066 8.499 11.264 9.318 27.546 0.819 15.565 1.536 17.408 7.475 21.914 3.994 2.97 8.499 4.506 16.691 5.734 8.806 1.229 26.317 1.331 36.25 0.102zM550.81 376.627c-0.102-82.637-0.512-112.026-1.434-120.115-11.366-92.058-82.125-164.352-174.080-178.074-10.342-1.536-17.51-1.843-32.256-1.638-20.070 0.41-21.197 0.512-37.683 3.686-66.662 12.8-125.338 62.362-150.221 126.874-14.234 36.864-17.408 79.565-8.806 118.477 13.619 61.85 57.344 115.405 115.814 142.029 17.306 7.885 41.984 14.643 61.44 16.896 4.198 0.41 57.139 0.922 117.555 1.024l109.773 0.102-0.102-109.261zM327.168 407.552c-28.774-4.608-50.483-15.667-71.27-36.352-24.474-24.474-36.557-52.531-37.274-87.040-0.819-35.328 10.854-65.741 34.714-90.829 18.022-18.944 39.014-31.027 65.126-37.171 11.776-2.867 37.581-3.482 50.176-1.126 25.805 4.71 48.538 16.794 67.686 35.84 25.907 26.010 37.888 55.91 37.274 92.774-0.41 21.606-3.994 36.25-13.414 55.296-17.408 34.714-49.664 59.29-88.986 67.686-10.445 2.15-33.178 2.662-44.032 0.922z" />
+<glyph unicode="&#xea75;" glyph-name="my_essential_tablet" d="M660.378 895.078c-0.205-0.205-4.301-0.717-9.114-1.024-11.366-1.024-29.286-4.096-41.779-7.27-101.376-25.805-180.019-105.677-204.493-207.77-5.734-23.859-6.861-35.226-7.373-76.902-0.307-21.402-0.614-39.014-0.717-39.014 0-0.102-17.613-0.41-39.014-0.717-47.514-0.614-62.362-2.458-92.16-11.469-110.080-33.178-188.314-128-199.885-242.176-1.024-10.342-1.024-46.694 0-56.32 7.578-67.482 36.557-127.078 84.48-173.466 44.544-43.11 99.533-69.427 162.509-77.517 15.565-2.048 68.608-1.536 72.192 0.614 0.307 0.205 3.379 0.717 6.656 1.024 3.379 0.41 6.451 0.922 6.758 1.126s4.096 1.024 8.397 1.946c65.126 13.414 127.898 54.989 168.448 111.411 27.853 38.707 46.694 88.576 50.893 134.349 0.41 3.994 0.819 8.806 1.024 10.752s0.41 18.432 0.41 36.454l0.102 32.973 38.707 0.512c21.197 0.205 39.731 0.717 41.165 1.024s5.325 0.819 8.704 1.229c24.883 2.662 60.416 13.414 85.811 25.805 87.654 42.906 146.022 126.157 156.877 224.051 1.331 11.674 1.434 50.586 0.102 58.675-0.307 1.843-1.024 7.066-1.638 11.776-5.734 42.906-25.088 89.6-52.224 126.259-45.466 61.338-117.35 103.526-189.952 111.616-2.765 0.307-6.246 0.819-7.68 1.126-2.867 0.614-46.592 1.434-47.206 0.922zM704.512 816.947c30.413-3.891 61.645-15.36 86.528-31.846 48.538-32.051 79.77-80.282 90.214-138.957 2.56-14.541 2.56-50.176 0-64.512-7.987-44.134-25.395-78.848-55.398-109.875-26.214-27.238-58.778-46.49-94.72-55.808-21.606-5.632-31.642-6.554-70.349-6.758l-33.075-0.205v76.902h29.491c33.485 0.102 36.864 0.307 50.893 3.584 11.776 2.765 18.227 5.12 29.491 10.854 12.698 6.451 19.866 11.776 31.539 23.45 18.944 18.944 29.798 39.014 35.328 65.536 2.355 10.854 2.56 36.966 0.512 47.616-9.933 50.893-48.845 91.034-99.123 102.093-13.517 2.97-38.707 3.174-51.507 0.512-55.091-11.776-95.232-54.784-102.4-109.568-0.512-4.403-1.024-21.402-1.024-37.683v-29.594h-77.005l0.512 36.659c0.307 20.070 0.819 38.195 1.126 40.038 0.307 1.946 1.331 7.578 2.15 12.493 7.885 45.466 35.738 91.853 73.216 121.856 29.389 23.552 70.758 40.653 105.472 43.52 4.198 0.41 7.885 0.819 8.090 1.024 1.024 0.819 30.515-0.102 40.038-1.331zM550.81 376.627c-0.102-82.637-0.512-112.026-1.434-120.115-11.366-92.058-82.125-164.352-174.080-178.074-10.342-1.536-17.51-1.843-32.256-1.638-20.070 0.41-21.197 0.512-37.683 3.686-66.662 12.8-125.338 62.362-150.221 126.874-14.234 36.864-17.408 79.565-8.806 118.477 13.619 61.85 57.344 115.405 115.814 142.029 17.306 7.885 41.984 14.643 61.44 16.896 4.198 0.41 57.139 0.922 117.555 1.024l109.773 0.102-0.102-109.261zM327.168 407.552c-28.774-4.608-50.483-15.667-71.27-36.352-24.474-24.474-36.557-52.531-37.274-87.040-0.819-35.328 10.854-65.741 34.714-90.829 18.022-18.944 39.014-31.027 65.126-37.171 11.776-2.867 37.581-3.482 50.176-1.126 25.805 4.71 48.538 16.794 67.686 35.84 25.907 26.010 37.888 55.91 37.274 92.774-0.41 21.606-3.994 36.25-13.414 55.296-17.408 34.714-49.664 59.29-88.986 67.686-10.445 2.15-33.178 2.662-44.032 0.922z" />
+<glyph unicode="&#xea76;" glyph-name="my_livebox" d="M496.128 830.362c-10.138-2.253-20.787-6.861-28.877-12.595-3.789-2.765-17.51-15.667-30.413-28.877-12.8-13.21-42.803-43.725-66.662-67.994-23.757-24.166-48.23-49.050-54.272-55.296-6.042-6.144-31.13-31.744-55.706-56.832-24.678-25.088-49.152-49.971-54.477-55.501-27.648-28.365-96.051-97.792-98.918-100.454-1.843-1.741-3.379-3.482-3.379-3.994 0-0.41 34.304-0.819 76.288-0.819h76.288l0.205-160.461 0.307-160.563 2.355-7.68c7.885-25.6 27.546-44.749 54.17-52.941 5.632-1.638 17.203-1.843 195.379-2.048 171.52-0.307 190.157-0.205 197.632 1.331 31.744 6.451 55.706 31.232 60.928 62.976 0.614 4.301 1.024 60.416 1.024 163.021v156.365h153.702l-7.475 7.578c-23.859 24.064-104.448 105.882-119.603 121.446-9.83 10.035-39.117 39.731-65.024 66.048s-53.965 54.886-62.464 63.488c-112.435 114.893-112.538 114.995-131.789 121.446-11.776 3.994-27.648 4.915-39.219 2.355zM672.563 598.118c25.088-8.704 42.086-31.13 43.52-57.446 1.638-28.058-16.589-54.477-43.725-63.693-17.613-6.042-37.786-3.584-54.17 6.554l-3.891 2.458-32.256-24.166c-19.046-14.234-32.154-24.678-31.744-25.395 8.499-19.456 11.981-33.894 12.083-50.278 0.102-13.21-0.614-19.661-3.277-30.31-3.789-14.541-9.114-26.317-17.613-38.093-2.662-3.789-4.915-7.373-4.915-7.782 0-0.512 1.024-2.048 2.355-3.379s6.656-7.475 11.981-13.722c5.325-6.144 11.469-13.312 13.722-15.872 2.355-2.56 5.325-6.042 6.758-7.782 3.482-4.096 15.77-18.227 16.384-18.842 0.307-0.307 2.355-2.662 4.403-5.325 3.686-4.506 4.096-4.71 7.168-3.789 5.734 1.741 17.408 2.15 23.757 1.024 13.21-2.458 27.955-12.595 34.509-23.757 10.342-17.613 9.523-39.219-2.048-56.115-6.554-9.728-19.763-18.33-31.437-20.48-7.987-1.536-20.685-0.614-27.341 1.946-26.624 10.035-40.243 38.195-31.232 64.512 1.434 4.198 2.355 8.192 1.946 8.806-0.41 0.717-2.355 3.072-4.301 5.222s-6.144 6.861-9.216 10.547c-3.072 3.686-5.837 6.861-6.144 7.168s-6.349 7.168-13.312 15.36c-14.029 16.282-16.282 18.739-22.323 25.6l-4.096 4.608-8.602-4.301c-17.92-9.011-34.304-12.595-55.091-12.083-31.232 0.614-59.187 13.005-80.282 35.43-25.19 26.829-35.635 60.211-30.31 97.587 3.277 23.142 16.691 48.435 34.202 64.922 43.213 40.448 106.906 42.598 152.986 5.325 3.789-3.072 6.963-4.915 7.68-4.403 0.717 0.41 6.451 4.608 12.902 9.421 10.854 8.192 21.811 16.384 41.677 31.232 4.403 3.277 8.192 6.144 8.397 6.246 0.205 0.205-0.41 2.97-1.229 6.246-5.222 20.173 0.102 42.701 13.722 58.47 4.608 5.325 13.926 12.288 20.582 15.36 5.734 2.662 8.806 3.686 17.818 5.837 1.126 0.307 6.656 0.307 12.288 0.102 7.578-0.307 12.186-1.024 17.715-2.97z" />
+<glyph unicode="&#xea77;" glyph-name="my_media" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 281.19 0.512 259.686-7.27 275.456-7.885 16.077-23.347 28.365-41.472 32.973-7.782 2.048-12.186 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM546.816 598.63c23.142-4.506 39.014-9.728 57.651-19.251 32.051-16.384 57.344-38.81 77.926-69.222 10.24-15.053 22.528-41.267 26.317-56.013 6.246-24.064 7.987-38.605 7.578-61.952-0.205-10.138-0.614-19.558-0.922-20.992s-1.024-5.53-1.536-9.216c-7.68-47.923-36.659-96.256-76.186-126.771-27.546-21.299-57.242-34.304-93.389-40.755-14.131-2.56-48.845-2.56-63.693-0.102-39.629 6.656-73.421 22.426-102.707 47.923-21.504 18.739-37.99 40.346-50.176 65.638-13.619 28.467-19.456 53.555-19.968 85.811-0.41 26.010 2.253 43.827 9.83 67.072 23.552 71.475 85.811 125.338 159.642 137.728 16.282 2.662 16.486 2.662 38.4 2.458 15.258-0.102 22.016-0.614 31.232-2.355zM460.8 397.21v-139.878l6.451 5.12c10.445 8.192 25.805 20.275 46.899 36.557 10.957 8.397 22.221 17.203 25.088 19.456s12.698 9.933 22.016 17.101c9.216 7.168 27.648 21.504 40.858 31.846s27.136 21.094 31.027 24.064l6.861 5.222-7.373 5.837c-14.336 11.366-18.842 14.848-32.563 25.6-7.578 5.939-17.51 13.619-22.016 17.101s-9.114 7.066-10.24 7.987c-1.126 1.024-14.95 11.878-30.72 24.166-15.77 12.39-39.424 30.822-52.429 41.062l-23.859 18.637v-139.878z" />
+<glyph unicode="&#xea78;" glyph-name="My_Office_Phone" d="M76.8 482.611c0-321.434-0.205-303.616 5.12-318.054 2.662-6.963 4.506-10.445 9.318-17.101 10.24-14.029 21.402-22.323 38.502-28.467l9.011-3.277 808.448-0.512v298.189c0 321.331 0.205 303.616-5.12 318.054-9.421 25.19-32.563 43.93-59.597 48.333-4.301 0.614-138.547 1.024-406.016 1.024h-399.667v-298.189zM348.774 700.723c9.626-6.246 10.445-11.162 7.578-41.779-1.024-10.445-2.15-23.040-2.458-28.16-0.41-5.018-0.922-10.854-1.126-12.8s-0.717-7.27-1.024-11.776c-0.922-11.776-2.867-17.92-7.27-22.426-7.066-7.27-9.523-7.782-38.81-7.782h-25.907l-3.174-2.56c-3.789-3.277-7.373-10.752-10.752-22.221-2.662-9.114-6.246-29.491-7.27-40.755-0.307-3.686-0.922-10.547-1.434-15.36-1.024-11.469-1.126-56.32 0-68.608 1.434-16.896 2.048-21.709 4.198-34.816 3.482-21.402 9.114-37.786 14.848-43.213 2.458-2.253 3.072-2.355 29.798-2.867 24.269-0.41 27.75-0.717 31.334-2.458 9.216-4.608 13.21-11.981 14.336-26.214 0.614-7.885 1.229-14.95 2.15-24.064 0.307-2.765 0.717-8.806 1.024-13.312s0.819-9.523 1.024-11.264c0.205-1.638 0.922-9.933 1.638-18.432 1.126-15.053 1.126-15.462-1.126-20.275-2.662-5.632-6.861-9.216-12.8-10.957-2.867-0.819-14.234-1.024-38.4-0.819-36.864 0.41-35.43 0.205-46.592 6.144-35.021 18.637-64 82.637-74.65 164.659-3.482 26.317-4.198 39.219-4.198 72.192 0 33.075 0.819 46.285 4.198 72.704 0.512 4.198 4.301 27.443 5.018 30.925 13.824 67.686 38.707 115.302 69.632 133.427 9.523 5.53 14.438 6.042 51.712 5.837l34.304-0.205 4.198-2.765zM831.693 700.621c2.662-1.536 6.042-4.403 7.578-6.349 5.632-7.475 5.53-5.325 5.53-105.984 0-104.243 0.41-98.611-7.578-106.803-8.192-8.499 5.53-7.885-171.622-7.885s-163.43-0.614-171.622 7.885c-7.987 8.192-7.578 2.458-7.578 107.315 0 105.062-0.41 99.533 7.68 107.52 8.090 8.090-5.734 7.578 173.056 7.373l159.744-0.205 4.813-2.867zM831.693 393.421c14.746-8.602 17.408-28.16 5.53-40.038-8.294-8.397 5.222-7.782-171.52-7.782-99.328 0-158.618 0.41-160.768 1.024-8.294 2.355-15.36 9.83-17.715 18.637-3.277 12.493 5.53 27.546 17.818 30.515 1.843 0.512 75.059 0.717 162.611 0.717l159.232-0.205 4.813-2.867zM827.699 267.162c2.765-0.922 6.758-3.482 9.318-5.939 13.722-13.414 8.090-36.659-10.24-42.189-6.963-2.048-317.338-2.048-323.174 0-9.523 3.379-17.203 13.926-17.203 23.45 0 5.325 2.15 11.878 5.222 16.179 2.56 3.584 9.318 8.090 13.722 9.216 1.741 0.41 73.83 0.717 160.358 0.819 141.517 0.102 157.696-0.102 161.997-1.536z" />
+<glyph unicode="&#xea79;" glyph-name="my_orange" d="M462.848 907.162c-72.397-9.523-132.301-62.874-150.016-133.53-3.891-15.462-4.813-22.938-5.12-40.96-0.41-18.739 0.922-30.925 5.12-47.411 18.022-71.475 79.974-125.44 153.6-133.734 11.776-1.331 39.424-0.512 50.074 1.434 68.301 12.288 122.675 60.723 141.824 126.464 5.53 18.944 6.656 27.955 6.656 51.2-0.102 18.432-0.41 22.528-2.765 33.382-11.674 55.398-44.646 99.123-93.901 124.723-17.613 9.114-34.918 14.746-57.344 18.534-7.987 1.331-37.581 1.331-48.128-0.102zM325.632 548.25c-56.32-30.31-99.021-85.504-113.971-147.456-6.554-26.931-6.349-21.299-6.349-154.522 0-114.176 0.102-121.754 1.843-128 3.277-11.469 4.813-15.667 9.011-23.859 12.186-24.064 34.099-42.906 58.982-50.688 16.794-5.325 14.131-5.222 137.318-5.325h114.893v181.658c0 128.717 0.307 183.296 1.126 187.187 3.994 19.149 20.48 35.635 39.629 39.629 3.686 0.819 32.358 1.126 90.317 1.126 46.797 0 84.992 0.205 84.992 0.512 0 3.277-16.896 29.798-26.624 41.882-13.517 16.691-33.69 35.021-52.326 47.514-8.704 5.734-26.522 15.565-28.365 15.565-0.717 0-3.891-2.15-7.168-4.813-10.138-8.294-28.774-19.866-42.701-26.522-34.304-16.384-65.126-23.040-103.424-22.426-22.221 0.41-25.088 0.717-42.291 4.198-34.099 6.861-69.12 22.938-95.642 44.134-3.789 2.97-7.475 5.427-8.192 5.427s-5.734-2.355-11.059-5.222zM570.88 421.069c-8.602-3.379-13.824-8.397-16.486-15.974-1.126-2.97-1.331-42.803-1.434-199.373 0-219.853-0.614-202.547 7.68-210.842 8.090-8.192 0.819-7.782 128.102-7.475l112.538 0.307 4.71 2.765c2.56 1.536 5.939 4.403 7.475 6.451 6.144 7.987 5.734-5.632 5.53 209.92l-0.307 197.632-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-7.885 6.042-2.355 5.734-124.006 5.632-83.046 0-112.538-0.41-114.79-1.229zM778.24 222.72v-153.6h-184.32v307.2h184.32v-153.6zM696.73 45.568c7.578-4.608 11.776-16.179 8.704-23.757-3.789-9.523-11.878-14.746-21.197-13.824-16.384 1.741-23.962 19.763-13.926 33.075 5.427 7.27 18.432 9.523 26.419 4.506z" />
+<glyph unicode="&#xea7a;" glyph-name="my_plug" d="M144.384 856.883c-14.336-2.458-29.901-14.131-36.352-27.341-6.042-12.288-5.632 15.565-5.632-380.723 0-262.554 0.307-365.773 1.126-369.664 3.994-19.149 20.48-35.635 39.629-39.629 3.891-0.819 107.11-1.126 369.664-1.126 312.115 0 365.056 0.205 369.766 1.536 18.022 4.71 32.666 19.046 37.171 36.25 1.638 6.349 1.741 30.106 1.741 370.995 0.102 262.144-0.205 365.773-1.024 369.664-3.994 19.149-20.48 35.635-39.629 39.629-3.891 0.819-107.213 1.126-369.664 1.024-200.294-0.102-365.363-0.41-366.797-0.614zM545.28 779.059c64.819-6.656 123.802-30.822 175.206-71.68 14.336-11.469 39.424-36.557 50.995-50.995 25.6-32.154 44.442-67.174 57.344-106.496 6.246-19.354 11.776-45.158 14.438-68.608 1.331-11.981 1.331-50.586 0-64.512-5.734-58.573-26.624-114.893-59.187-160.256-15.462-21.504-39.219-47.616-56.422-62.054-53.76-44.954-119.091-72.294-186.982-78.131-10.65-0.922-54.579-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-39.834 5.12-83.456 19.763-118.067 39.526-17.715 10.035-40.038 25.702-54.784 38.4-4.71 3.994-30.31 29.798-34.406 34.509-44.851 52.531-71.885 116.224-79.155 186.47-1.024 9.933-1.024 46.899 0 59.392 10.342 128.205 96.563 240.23 218.829 284.467 17.408 6.349 47.616 14.029 62.464 15.974 2.56 0.307 6.554 0.922 8.909 1.229 18.227 2.56 53.862 2.867 74.547 0.717zM496.435 728.064c-29.696-6.144-53.453-30.106-59.699-60.416-6.861-33.485 10.138-68.096 40.96-83.354 12.288-6.042 19.354-7.68 34.304-7.68s21.914 1.536 34.304 7.782c19.558 9.728 33.178 26.112 39.526 47.411 2.765 9.114 3.379 26.931 1.331 36.352-5.222 24.269-21.914 45.056-44.134 54.886-13.005 5.837-32.563 7.885-46.592 5.018zM528.486 701.133c35.942-12.595 46.285-57.446 19.456-84.275-11.059-11.059-24.781-16.179-40.038-14.848-43.418 3.584-62.669 56.013-31.846 86.733 7.066 7.066 14.848 11.571 23.962 13.824 7.066 1.843 21.094 1.126 28.467-1.434zM323.072 524.186c-1.126-0.205-4.608-0.922-7.68-1.536-16.179-3.277-35.328-15.974-44.954-30.003-10.65-15.462-14.643-29.184-13.926-48.23 0.819-25.395 13.926-47.718 35.942-61.542 43.418-27.136 101.171-4.198 114.688 45.67 2.253 8.294 2.662 25.907 0.922 34.509-6.758 31.642-31.642 55.706-62.976 60.621-6.451 1.126-17.818 1.331-22.016 0.512zM680.448 524.083c-44.851-6.246-74.957-51.405-63.488-95.437 6.758-26.317 27.955-47.514 54.784-54.989 9.114-2.56 29.594-2.56 38.912 0 35.43 9.626 59.597 43.315 56.934 79.462-1.741 24.678-14.131 45.67-34.714 59.187-15.462 10.035-34.406 14.234-52.429 11.776z" />
+<glyph unicode="&#xea7b;" glyph-name="my_services" d="M307.2 779.059c0-1.638 0-106.291 0-232.755 0-155.546 0.307-231.731 1.024-235.52 2.97-15.565 15.155-30.515 30.31-36.864 8.090-3.482 8.192-3.482 27.443-3.891 18.534-0.41 19.354-0.307 18.534 1.434-0.512 1.126-1.946 6.144-3.277 11.162-2.15 7.885-2.458 10.854-2.048 20.48 0.307 6.349 1.229 13.926 2.253 17.408 1.024 3.379 13.517 34.509 27.853 69.12 14.438 34.611 26.931 65.024 27.955 67.584s2.56 6.349 3.482 8.397l1.638 3.891-6.451 6.861c-32.461 34.714-55.706 70.246-68.608 104.858-6.349 17.101-8.294 26.522-8.294 40.858-0.102 19.866-0.102 20.070 22.426 42.598 26.419 26.624 30.003 27.853 43.315 14.746 5.837-5.734 32.154-38.605 36.864-45.875 9.523-14.95 8.090-19.763-11.776-40.346l-12.902-13.312 0.614-5.939c0.922-10.035 8.192-23.142 22.118-39.834l6.246-7.475 1.946 4.403c1.024 2.458 6.758 16.282 12.698 30.618 63.078 152.474 81.818 197.222 84.070 200.192 1.536 1.946 4.915 4.813 7.578 6.349 4.096 2.458 5.939 2.867 11.981 2.867 6.758-0.102 8.704-0.717 33.28-10.957 61.030-25.395 98.304-40.755 98.816-40.755 1.126 0-0.512 20.070-2.048 25.088-4.301 13.824-12.8 24.166-26.214 31.642-10.445 5.837 0 5.632-198.246 5.632l-182.579 0.102v-2.765zM583.68 737.28c0-0.819-0.41-2.355-1.024-3.379-0.512-0.922-5.53-12.8-11.162-26.317-5.53-13.517-19.661-47.616-31.334-75.776s-25.498-61.542-30.72-74.24c-5.222-12.698-22.938-55.296-39.219-94.72s-37.274-90.112-46.592-112.64c-9.318-22.528-17.51-43.008-18.022-45.568-3.686-15.77 1.229-33.587 12.595-45.875 7.885-8.602 7.373-8.397 74.342-36.045 12.698-5.222 33.894-14.029 47.104-19.456 34.918-14.541 74.445-30.925 104.96-43.52 14.643-6.042 36.352-15.053 48.128-19.968 35.43-14.746 71.578-29.594 73.011-29.901 0.819-0.205 2.355 2.048 3.686 5.325 1.331 3.072 16.794 40.448 34.406 82.944s32.563 78.746 33.28 80.384c1.331 2.867 44.032 106.189 56.832 137.216 3.277 7.885 13.824 33.485 23.552 56.832 26.624 64.102 26.522 63.898 27.955 70.349 4.608 19.558-4.198 42.291-20.582 53.453-3.174 2.15-14.848 7.578-25.805 12.083-10.957 4.608-41.882 17.408-68.608 28.467s-62.874 26.112-80.384 33.28c-17.408 7.27-61.85 25.6-98.611 40.858-36.864 15.258-67.072 27.75-67.379 27.75-0.205 0-0.41-0.717-0.41-1.536zM705.331 570.982c46.899-10.342 84.378-38.707 105.472-79.974 12.8-24.883 18.022-47.616 17.203-75.264-2.15-71.782-51.61-130.253-123.494-145.92-12.8-2.867-37.581-3.482-51.2-1.434-52.122 7.987-95.027 39.731-117.248 86.733-9.728 20.582-14.029 39.117-14.336 62.669-0.307 16.282 0.512 24.269 3.994 38.912 12.8 54.17 56.013 98.202 110.285 112.23 15.77 4.096 23.142 4.813 41.882 4.506 13.21-0.307 20.378-0.922 27.443-2.458zM670.72 552.141c-1.946-0.512-7.27-1.024-11.776-1.126-14.541-0.307-17.408-3.584-5.837-6.656 3.891-1.126 4.608-1.741 6.861-6.758 1.331-3.072 3.379-6.656 4.608-7.885 1.741-1.843 2.048-3.174 1.638-6.042-0.41-2.355 0-4.403 1.024-5.939 3.379-4.71-1.126-7.066-6.144-3.072-3.072 2.355-3.379 4.198-1.024 6.451 2.355 2.458 0.819 3.686-4.71 3.686-3.379 0-6.349 0.717-8.909 2.253l-3.891 2.355 4.403-5.222c4.403-5.222 5.325-7.475 3.072-7.68-2.662-0.307-4.506 0.307-8.704 2.458-4.301 2.15-4.403 2.15-7.475 0.307-1.741-1.024-4.198-1.946-5.427-2.15-6.861-0.819-10.752-2.15-14.438-4.813-2.15-1.536-4.813-2.867-5.837-2.867-2.458 0-5.734-3.686-6.554-7.27-1.024-4.506-2.458-4.506-4.198-0.205-2.15 5.222-4.096 7.27-9.933 10.138-4.608 2.355-5.018 2.458-7.168 0.819-1.229-1.024-4.915-5.018-8.192-9.011-5.53-6.861-5.734-7.373-3.789-8.192 1.331-0.614 3.789-0.512 6.656 0.102 6.246 1.434 7.373 0.512 5.325-4.506-1.331-3.482-1.331-4.198 0-5.939 0.819-1.126 2.867-4.71 4.608-7.987 4.506-8.397 7.885-10.957 14.438-11.059 4.506-0.102 6.861-0.922 14.438-5.325 8.090-4.71 9.83-6.246 14.643-13.005 5.53-7.885 11.162-16.282 15.565-23.245 1.331-2.15 5.12-6.144 8.499-8.806 10.65-8.704 10.547-11.366-1.331-23.245-9.728-9.626-11.571-10.65-23.347-13.824-4.813-1.331-11.469-3.789-14.848-5.53-3.277-1.741-7.27-3.174-8.806-3.174s-5.734-1.126-9.318-2.458c-3.584-1.331-8.602-2.765-11.162-3.174-7.066-1.126-12.288-3.584-12.288-5.632 0-0.922-1.638-3.482-3.789-5.632-3.277-3.379-3.482-3.994-2.048-4.813 1.024-0.512 1.741-1.946 1.741-3.174 0.102-2.662 4.096-8.294 12.083-16.486 41.37-42.803 105.984-52.941 158.208-24.883 7.168 3.891 7.885 4.506 7.373 6.861-0.307 1.434-0.717 10.035-1.024 19.149l-0.512 16.589 4.608 4.506c2.56 2.56 4.71 5.325 4.71 6.246 0.102 0.922 0.205 2.253 0.205 2.97 0.102 0.614-0.307 3.789-0.717 6.861-1.126 6.861-0.819 10.035 1.024 12.698 2.97 4.198 1.843 6.349-7.27 13.414-1.843 1.434-5.734 2.867-9.626 3.584-7.168 1.331-14.336 4.301-16.794 6.963-0.922 1.024-2.97 5.632-4.71 10.445l-3.072 8.602 3.277 7.578c4.096 9.523 6.349 11.776 13.824 13.926 3.277 0.922 7.578 2.765 9.421 4.301 2.765 1.946 4.403 2.458 7.168 2.048 1.946-0.205 7.27-0.922 11.674-1.536 13.517-1.741 24.781-7.885 20.070-10.854-1.843-1.126-1.126-2.458 2.56-4.813 1.946-1.331 3.789-3.174 4.198-4.096 0.307-1.024 1.946-2.765 3.584-3.994 2.867-1.946 3.174-2.048 4.915-0.512 2.56 2.355 3.379 2.15 8.909-2.458 2.662-2.253 5.12-3.891 5.325-3.686 0.614 0.717 0.41 11.366-0.307 15.36-0.41 1.946-1.126 3.379-1.741 3.072-0.512-0.307-0.614-1.434-0.307-2.56 0.512-1.536 0.102-1.946-2.048-1.946-2.253 0-2.662 0.41-2.355 1.843 0.307 1.024 0 2.662-0.717 3.686-0.717 0.922-1.126 2.662-0.819 3.789 0.41 1.331-0.307 3.072-1.946 4.813-1.331 1.536-3.277 3.994-4.198 5.632-1.024 1.536-2.458 2.765-3.277 2.765-1.741 0-2.048-1.638-0.512-2.56 0.614-0.307 1.024-1.434 1.024-2.355s1.229-2.765 2.867-4.096c1.843-1.536 2.355-2.56 1.536-2.867-0.717-0.307-1.331-1.229-1.331-1.946 0-2.253-6.042-3.072-8.090-1.024-1.536 1.536-1.331 1.638 2.253 1.024 5.018-0.922 5.12 1.126 0.307 6.349-1.843 2.15-3.584 4.813-3.789 5.939-0.307 1.434-1.638 2.355-4.506 2.97-2.253 0.41-5.12 1.331-6.451 1.946-1.638 0.819-2.662 0.717-3.482-0.102-0.717-0.717-2.56-1.229-4.096-1.229s-3.686-0.819-4.813-1.946c-3.686-3.686-6.656-3.482-10.752 0.614s-4.198 6.144-0.922 11.162c1.946 3.072 4.813 3.072 9.83 0 4.096-2.56 7.885-2.458 7.885 0.102 0 0.819-1.024 2.867-2.15 4.608-2.765 3.891-1.331 5.12 3.891 3.379 2.765-0.922 5.018-1.024 10.035 0 3.482 0.614 7.27 0.819 8.294 0.41 3.994-1.536 5.325-1.024 5.837 2.458 0.307 2.048-0.102 4.198-1.126 5.837-1.024 1.434-2.253 3.686-2.867 5.12-1.741 3.994-12.8 18.33-18.637 24.269-5.837 5.837-17.818 15.77-21.606 17.715-1.843 0.922-2.56 0.922-3.174 0s-1.331-0.922-2.867-0.102c-3.072 1.638-4.096 1.331-1.741-0.512 2.048-1.638 2.048-1.638 0-1.126-4.301 1.126-24.781 3.994-29.184 4.096-3.482 0-5.837-0.717-8.909-2.867-5.018-3.277-7.782-2.97-12.083 1.229-3.379 3.379-7.987 12.8-7.475 15.462 0.205 0.922 1.946 2.253 3.891 2.97 2.355 0.717 3.072 1.331 2.048 1.741-2.867 1.024-13.824 1.229-17.408 0.307zM768.717 492.032c0.717-1.024 1.024-2.662 0.717-3.379-0.307-0.819 0.512-3.686 1.741-6.246 1.229-2.662 1.946-5.12 1.536-5.427-0.41-0.41-2.662-0.205-5.12 0.512-2.355 0.614-5.325 0.819-6.554 0.512-2.56-0.614-3.174 1.434-0.717 2.355 0.819 0.41 1.331 1.024 1.024 1.434-0.512 0.819 1.126 2.355 2.867 2.662 0.41 0.102 1.024 0.205 1.434 0.307 0.307 0-0.102 0.922-0.922 1.946-2.253 2.56-2.867 4.915-1.536 6.246 1.741 1.741 4.198 1.331 5.53-0.922zM759.194 490.394c2.048-0.819 2.048-1.843 0-3.891-1.741-1.843-5.222-2.15-7.578-0.614-1.229 0.717-1.024 1.229 0.922 2.97 2.56 2.253 3.994 2.56 6.656 1.536zM560.845 487.731c-20.992-36.25-24.064-82.33-7.782-118.989 1.843-4.301 2.253-4.608 3.584-3.174 0.922 0.819 2.458 2.048 3.584 2.56 1.126 0.614 1.946 2.15 1.946 3.686 0 1.741 1.536 4.198 4.608 7.373 4.096 4.096 8.192 10.342 15.667 24.064 2.867 5.222 2.458 8.294-2.355 17.92-3.994 8.090-5.12 14.746-3.584 20.89 0.922 3.379 2.765 5.939 7.782 10.65 3.584 3.379 6.554 6.861 6.554 7.782 0 1.638-1.229 2.97-8.397 9.011-2.458 2.048-4.096 4.403-4.506 6.656-0.41 2.56-1.843 4.506-5.12 6.861-2.355 1.843-4.915 4.608-5.632 6.246-1.638 3.891-3.379 3.482-6.349-1.536zM276.48 670.208c-2.56-1.024-9.216-3.789-14.848-6.144s-11.571-4.813-13.312-5.632c-1.638-0.717-9.523-3.994-17.408-7.168-7.885-3.277-21.197-8.806-29.696-12.288-8.397-3.584-38.195-15.872-66.048-27.443s-54.579-22.63-59.392-24.678c-5.427-2.253-8.602-4.096-8.499-4.915 0.307-1.536 73.83-179.814 77.107-186.88 1.126-2.458 2.048-4.71 2.048-5.018 0-0.41 1.126-3.277 2.56-6.451 1.331-3.174 7.475-17.92 13.722-32.87 6.144-14.95 22.323-54.067 35.942-87.040s29.389-71.168 35.123-84.89c5.734-13.824 12.083-27.75 14.234-30.925 9.011-13.517 24.883-21.709 41.677-21.606 10.65 0 12.595 0.614 41.062 12.493 13.824 5.734 36.659 15.155 50.688 20.992 78.541 32.563 96.87 40.243 97.485 40.755 0.307 0.41-0.307 1.024-1.331 1.331-1.024 0.41-13.414 5.53-27.546 11.366-25.805 10.752-34.099 15.36-46.080 25.395l-5.222 4.403-28.058 0.512c-30.515 0.512-34.816 1.126-48.23 6.861-14.029 5.939-24.781 15.565-31.846 28.365-3.072 5.632-4.506 7.373-5.837 7.066-12.902-3.891-23.859-2.56-34.509 4.301-7.27 4.71-12.186 11.571-17.203 23.757-7.782 19.354-79.462 192.717-79.974 193.536-0.205 0.307 11.469 5.53 25.907 11.571 14.438 5.939 43.11 17.818 63.693 26.317 20.582 8.602 37.683 15.872 38.195 16.282 0.41 0.41 0.614 25.395 0.512 55.603l-0.307 54.989-4.608-1.946zM264.704 528.282c-8.397-3.686-23.654-10.138-33.792-14.438-10.138-4.198-19.763-8.294-21.504-9.011-1.638-0.819-6.554-2.867-10.752-4.608-9.83-4.096-12.288-5.325-12.288-6.144 0-0.307 3.482-8.909 7.782-19.046 4.301-10.035 13.517-31.949 20.582-48.538s16.691-39.424 21.504-50.688c4.71-11.264 9.421-22.323 10.445-24.576s3.379-7.885 5.325-12.493c1.946-4.71 3.789-8.499 4.198-8.499s6.246 2.355 13.005 5.222l12.39 5.222v97.178c0 53.453-0.307 97.178-0.717 97.075-0.512 0-7.68-2.97-16.179-6.656z" />
+<glyph unicode="&#xea7c;" glyph-name="my_travels" d="M498.995 853.914c-11.776-2.458-23.245-10.547-30.31-21.197-1.946-2.867-10.65-17.715-19.456-32.973-8.704-15.155-28.672-49.766-44.237-76.8-15.667-27.034-29.389-50.79-30.515-52.736-3.482-6.246-21.299-37.069-26.829-46.592-2.97-5.018-27.853-48.128-55.296-95.744-64.102-111.104-68.506-118.682-74.24-128.512-16.691-28.365-21.811-37.99-23.654-44.339-5.632-20.275-0.819-38.4 14.131-53.35l7.68-7.475 12.8 22.323c7.066 12.39 14.029 24.474 15.36 27.034 1.434 2.56 4.096 7.168 5.939 10.24s7.782 13.517 13.312 23.040c26.010 45.261 104.755 181.35 116.736 201.728 2.97 5.12 28.058 48.435 55.808 96.256 27.648 47.923 51.507 88.576 53.043 90.522 3.277 4.403 9.626 10.138 14.438 13.107 9.933 6.246 25.907 8.192 37.888 4.813 6.963-1.946 8.192-2.56 123.494-69.222 18.022-10.445 49.869-28.774 70.656-40.755 20.89-11.981 43.315-24.986 49.869-28.877 6.554-3.789 12.39-6.963 12.8-6.963 0.512 0 2.15 3.379 3.789 7.475 4.096 10.342 4.813 23.245 1.843 33.178-2.765 8.806-8.499 17.818-15.462 24.166-4.506 3.994-33.178 20.992-64.614 38.4-2.56 1.434-5.018 2.867-5.632 3.277-0.512 0.41-3.072 1.946-5.632 3.379-15.155 8.397-54.989 31.027-128 72.704-31.642 18.022-29.184 16.589-42.598 24.064-6.144 3.482-13.722 7.27-16.691 8.397-7.066 2.56-18.432 3.174-26.419 1.434zM525.312 748.749c-10.854-3.072-21.402-10.65-27.648-19.763-1.741-2.355-8.090-13.005-14.234-23.654-6.042-10.547-19.763-34.202-30.31-52.531s-24.474-42.496-31.027-53.76c-27.75-48.128-45.67-79.258-49.357-85.504-2.15-3.686-8.909-15.36-15.155-26.112-6.144-10.65-26.726-46.387-45.773-79.36s-38.093-65.843-42.291-73.216c-4.198-7.27-8.499-14.95-9.626-16.896s-9.011-15.565-17.51-30.106c-17.101-29.491-20.378-36.25-22.221-44.954-3.686-18.022 0.922-32.358 14.95-46.285 6.349-6.349 11.059-9.421 40.96-26.522 18.534-10.752 44.544-25.702 57.754-33.382 20.275-11.776 73.114-42.291 83.456-48.128 1.741-1.024 10.445-6.042 19.456-11.264 39.834-23.040 50.483-29.184 55.296-31.232 13.619-5.939 28.877-5.632 43.008 0.922 11.469 5.325 19.046 13.005 27.853 28.57 5.939 10.445 6.144 10.854 33.792 58.573 44.032 75.981 101.786 175.923 104.038 179.712 2.15 3.789 66.97 115.917 83.149 143.872 51.507 88.781 49.869 85.504 49.869 100.864 0 6.246-0.717 10.65-2.253 15.36-2.253 6.656-9.421 18.637-13.005 21.606-1.024 0.922-13.312 8.192-27.443 16.282-14.029 8.090-34.099 19.661-44.544 25.702-10.445 5.939-29.491 16.998-42.496 24.474-22.323 12.902-58.88 33.997-65.536 37.888-2.97 1.741-19.763 11.366-27.034 15.565-1.946 1.126-14.336 8.192-27.443 15.872-13.107 7.578-26.522 14.746-29.798 15.872-7.168 2.662-22.221 3.482-28.877 1.536zM445.542 585.318c2.048-2.048 2.97-3.994 2.97-6.246 0-4.403-4.813-9.216-9.216-9.216s-9.216 4.813-9.216 9.216c0 4.403 4.813 9.216 9.216 9.216 2.253 0 4.198-0.922 6.246-2.97zM473.6 569.242c7.066-7.68-1.741-19.558-10.854-14.746-2.97 1.638-5.222 6.861-4.506 10.342 1.536 6.861 10.752 9.421 15.36 4.403zM501.248 553.062c3.584-3.584 4.198-7.066 1.843-11.059-4.403-7.578-15.872-5.325-16.794 3.277-0.307 3.584 0.205 5.325 2.662 7.68 3.379 3.482 8.909 3.482 12.288 0.102zM528.486 537.805c2.355-1.741 3.994-5.325 3.994-8.397 0-3.891-5.12-8.704-9.216-8.704s-9.216 4.813-9.216 8.704c0 5.734 3.686 9.626 9.216 9.626 1.946 0 4.301-0.512 5.222-1.229zM557.568 520.192c4.915-4.813 2.56-13.824-4.096-15.462-6.144-1.536-12.595 4.71-11.264 10.957 1.536 6.656 10.547 9.421 15.36 4.506zM585.114 504.115c5.734-5.018 3.379-14.336-3.789-15.667-6.349-1.229-10.854 2.56-10.957 9.011 0 7.885 8.806 11.878 14.746 6.656zM611.942 489.165c2.253-1.536 4.506-5.837 4.506-8.602 0-1.536-1.126-3.994-2.458-5.632-1.946-2.253-3.277-2.867-6.758-2.867-7.475 0-11.264 6.861-7.68 13.824 0.819 1.536 2.048 3.072 2.765 3.379 2.048 0.819 8.397 0.819 9.626-0.102zM642.56 470.221c5.427-7.782-3.277-17.92-11.571-13.619-7.373 3.789-5.734 15.565 2.355 17.203 2.97 0.614 7.475-1.126 9.216-3.584zM669.389 454.963c4.608-4.301 3.686-11.878-1.843-14.643-4.198-2.253-6.451-1.843-10.035 1.434-4.915 4.608-4.198 11.776 1.536 14.746 3.277 1.741 7.373 1.126 10.342-1.536zM697.139 438.989c5.12-3.277 3.994-11.776-2.048-15.053-3.584-1.946-3.891-1.946-7.373-0.205-4.71 2.253-6.349 5.632-5.12 10.752 0.717 2.867 1.843 4.198 4.506 5.53 3.686 1.843 5.939 1.638 10.035-1.024zM542.208 431.002c2.97-1.229 4.71-6.349 4.71-13.926 0-7.885-4.096-22.733-9.523-34.611-3.584-7.987-18.227-44.851-18.227-45.978 0-0.41 12.083-18.944 26.931-41.165 14.746-22.221 28.774-43.622 31.13-47.616l4.198-7.373-5.632-10.035c-3.174-5.632-5.837-10.342-6.042-10.547-0.102-0.205-1.434 0.717-2.765 2.048-2.867 2.867-46.49 45.056-62.157 60.109-5.939 5.734-10.957 10.342-11.264 10.342-0.819 0-50.176-68.301-50.176-69.427 0-0.614 5.018-7.475 11.059-15.155 18.432-23.552 16.896-20.992 14.848-24.781-1.024-1.741-2.15-3.174-2.56-3.174-0.307 0-7.475 3.994-15.872 8.909-13.517 7.885-21.504 12.493-32.256 18.637-22.938 13.005-52.736 30.31-53.453 30.925-0.41 0.41 0 2.15 1.024 3.891 2.15 3.686 2.97 3.789 16.794 1.741s22.426-3.072 26.931-3.174h3.789l13.312 29.184c7.373 16.077 14.95 32.563 16.896 36.659s3.789 8.499 4.096 9.728c0.717 2.662 4.301 1.434-36.864 13.005-14.029 3.994-26.726 7.68-28.16 8.192-1.434 0.41-9.728 2.765-18.432 5.222s-16.077 4.506-16.282 4.608c-0.922 0.717 10.752 19.763 12.288 20.173 2.97 0.819 35.226-0.205 58.266-1.843 3.072-0.205 10.752-0.614 16.896-1.024 6.246-0.307 12.902-0.819 14.848-1.024s8.192-0.717 13.824-1.024l10.24-0.614 14.848 19.251c8.192 10.547 16.896 21.914 19.354 25.088 10.65 14.131 21.299 22.733 31.539 25.395 0.102 0 0.922-0.307 1.843-0.614zM724.89 423.014c2.15-1.638 3.994-6.554 3.379-9.318-1.638-8.806-14.848-9.421-17.715-0.819-2.765 8.397 7.373 15.667 14.336 10.138z" />
+<glyph unicode="&#xea7d;" glyph-name="Nature" d="M515.072 849.92c-40.448-5.12-78.438-21.606-107.827-47.002-19.046-16.384-36.25-37.99-45.773-57.344l-3.277-6.554-11.162-1.741c-83.866-12.902-157.389-67.686-193.843-144.384-12.595-26.522-20.070-52.736-23.654-82.944-1.434-12.698-1.741-41.37-0.41-52.224 0.41-3.891 1.126-9.216 1.331-11.776 2.253-19.251 10.24-47.514 19.251-68.096 21.914-49.766 59.802-92.16 107.418-120.115 8.909-5.12 28.467-14.746 32.87-16.077 1.331-0.41 3.789-1.331 5.427-2.048 6.042-2.662 22.733-7.68 33.792-10.138 19.968-4.506 33.587-6.042 54.272-6.144 22.938-0.102 33.382 0.717 50.483 3.891l12.595 2.253-0.614-10.752c-0.307-5.939-0.717-14.541-1.024-19.046s-0.717-13.926-1.024-20.992c-0.307-7.066-0.717-15.974-1.024-19.968-0.307-3.891-0.717-12.698-1.024-19.456s-0.819-15.053-1.024-18.432c-1.024-15.258-1.946-37.581-1.946-45.568 0.102-6.963 0.614-9.83 2.662-14.336 3.174-6.963 9.318-13.414 16.384-17.101l5.427-2.867h117.76l5.632 2.662c13.312 6.349 20.685 19.149 19.968 34.406-1.126 23.859-1.638 33.485-2.048 39.219-0.307 3.686-0.717 12.186-1.024 18.944s-0.819 15.77-1.024 19.968c-0.307 4.198-0.717 12.8-1.024 18.944-0.307 6.246-0.717 14.95-1.024 19.456-0.205 4.506-0.717 13.414-1.126 19.763-0.307 6.246-0.205 11.469 0.307 11.469 0.41 0 4.506-1.126 9.011-2.56 8.704-2.765 29.082-7.066 38.4-8.192 9.421-1.126 40.96-1.331 50.176-0.41 18.534 2.048 43.008 8.090 60.621 15.155 55.808 22.221 101.786 68.096 122.982 122.573 10.752 27.648 15.155 51.814 14.541 81.306-0.205 9.83-0.614 19.763-0.819 22.016-7.782 63.59-43.827 120.832-98.202 156.262-11.571 7.475-32.87 18.022-45.363 22.426-15.667 5.632-14.131 4.301-13.312 10.957 0.307 3.072 0.614 11.469 0.614 18.637-0.102 68.71-40.96 132.608-106.086 165.683-17.306 8.806-39.117 15.77-59.904 19.251-13.107 2.253-43.622 2.765-57.344 1.024zM544.051 357.171c7.987-4.096 8.704-6.963 9.523-36.762 0.41-14.029 0.717-27.648 0.819-30.31 0.102-5.325 0.614-5.837 3.482-3.072 1.126 0.922 5.837 5.427 10.547 9.933 23.962 23.040 25.19 24.064 28.57 24.064 2.662 0 4.71-1.331 10.854-7.373 6.554-6.246 7.578-7.782 7.578-10.854 0-3.686 0.717-2.867-24.166-28.877-11.776-12.288-24.064-25.293-30.413-32.154l-4.813-5.222 0.512-16.896c0.307-9.318 0.717-24.064 1.024-32.768 1.331-42.906 1.638-52.941 2.15-67.584 0.717-19.354-0.307-23.142-7.27-27.136-4.198-2.56-4.506-2.56-30.106-2.56-28.672 0-30.822 0.41-35.226 6.554-2.048 2.97-2.253 4.198-2.15 18.534 0.102 13.21 0.614 38.502 1.946 81.408 0.205 5.939 0.614 22.323 1.024 36.352 0.307 14.131 0.819 30.413 1.024 36.352s0.717 22.938 1.024 37.888c1.024 38.195 1.024 39.014 2.765 43.11 1.638 3.789 5.837 7.475 9.523 8.397 1.126 0.205 10.24 0.512 20.275 0.614 15.155 0.102 18.739-0.205 21.504-1.638z" />
+<glyph unicode="&#xea7e;" glyph-name="Network_add" d="M203.571 717.312c-11.674-2.458-15.155-3.584-24.474-8.192-11.878-5.734-19.046-10.957-28.058-19.968-13.926-13.926-22.118-28.365-27.341-48.026-3.072-11.469-3.277-35.43-0.41-46.694 14.029-55.501 65.638-88.781 120.422-77.619 13.926 2.867 24.269 7.168 37.478 15.77 1.843 1.229 2.97 0.922 11.162-3.789 5.018-2.867 9.626-5.427 10.342-5.734 1.126-0.41 3.789 3.789 26.522 43.11 9.728 16.896 12.595 22.63 11.571 23.347-0.717 0.41-4.608 2.662-8.499 5.018l-7.27 4.096v17.101c0 20.685-1.536 27.75-9.83 46.285-8.397 18.432-28.774 38.605-48.23 47.514-20.173 9.216-43.008 11.981-63.386 7.782zM778.752 716.8c-40.858-9.318-71.578-41.472-78.848-82.33-0.819-4.71-1.229-13.312-1.126-21.709l0.307-13.926-10.854-6.144c-5.939-3.379-27.853-15.974-48.742-27.955-20.787-11.981-38.502-22.016-39.117-22.221-0.717-0.307-3.482 1.331-6.144 3.482-16.077 13.414-34.509 22.426-55.091 27.034-11.981 2.765-36.352 3.379-48.128 1.331-22.118-3.891-43.827-13.824-60.723-27.955l-5.939-4.915-7.578 4.301c-4.198 2.458-7.987 4.096-8.294 3.789-0.41-0.41-3.379-5.325-6.554-10.957-3.277-5.632-11.674-20.070-18.637-32.154-6.861-11.981-12.595-22.118-12.595-22.528 0-0.307 3.686-2.56 8.090-5.018l7.885-4.403-1.331-8.397c-1.741-10.854-1.126-32.563 1.126-43.213 5.632-26.112 16.589-46.285 35.43-65.024 14.029-14.131 25.088-21.504 42.803-28.672l8.397-3.482v-115.814l-7.27-3.482c-26.419-12.8-45.978-37.888-53.76-68.71-2.97-11.878-2.56-35.123 0.922-48.23 10.035-37.99 40.346-66.56 79.053-74.547 18.432-3.789 40.755-1.843 57.856 5.222 19.456 7.885 36.454 21.811 47.309 38.707 8.090 12.493 11.674 20.89 14.643 33.997l1.741 7.987 4.813-7.475c19.046-29.082 46.797-52.224 79.36-66.15 13.517-5.734 27.648-9.728 45.67-12.902 6.144-1.126 35.942-1.434 44.032-0.512 46.592 5.53 88.371 27.853 117.555 62.874 22.016 26.419 35.226 56.013 40.448 90.726 1.741 11.366 1.536 43.11-0.307 52.736-5.53 28.877-13.619 49.357-28.16 71.168-18.022 27.238-42.189 48.128-72.602 62.464-26.931 12.8-49.664 17.613-79.974 16.896-20.787-0.512-34.611-2.662-51.405-8.090-30.618-9.933-58.573-28.365-79.872-52.634-23.552-27.034-38.707-60.928-42.906-95.949-0.41-3.379-0.819-6.861-1.024-7.68-0.102-0.819-0.307-6.246-0.307-12.083l-0.102-10.65-6.861 6.349c-8.192 7.373-14.848 11.981-24.781 16.998l-7.27 3.686v115.2l4.403 1.331c6.349 1.843 20.173 8.806 28.365 14.234 27.443 18.125 47.514 47.514 54.477 79.872 2.867 13.312 3.072 39.117 0.512 52.736-0.102 0.512 2.15 2.253 4.915 3.994 4.403 2.662 81.203 46.797 93.389 53.658l4.301 2.458 5.427-3.379c27.546-17.51 62.669-20.787 92.774-8.909 31.334 12.493 54.989 40.141 62.362 73.114 1.331 5.939 1.843 12.288 1.741 23.040 0 12.8-0.41 16.282-2.867 25.088-10.547 38.81-41.267 67.072-80.998 74.65-11.981 2.253-27.546 1.843-39.936-0.922zM527.872 523.059c28.672-6.349 50.074-26.726 58.368-55.603 2.662-9.216 2.765-29.594 0.102-38.912-7.475-26.829-27.75-47.104-54.886-54.886-8.909-2.56-29.491-2.56-38.707 0-43.52 11.878-67.686 57.037-53.248 99.328 5.325 15.565 15.872 29.184 29.798 38.707 9.011 6.144 16.589 9.114 31.949 12.493 4.096 0.922 20.582 0.205 26.624-1.126zM793.088 317.44c25.907-5.427 45.875-16.282 65.126-35.328 18.739-18.637 29.696-38.912 35.43-65.536 2.253-10.752 2.458-36.864 0.41-47.616-5.837-30.106-22.63-57.958-46.285-76.902-44.134-35.226-106.086-37.274-152.986-5.018-9.421 6.554-26.522 23.757-32.461 32.768-9.83 14.95-16.282 30.208-19.968 47.616-2.458 11.878-2.458 38.093 0.102 49.664 5.53 25.6 16.589 46.080 34.406 64.102 10.65 10.854 17.203 15.974 28.16 22.118 21.094 11.776 41.165 16.794 66.048 16.179 7.782-0.205 17.408-1.024 22.016-2.048zM749.568 293.069c-1.434-0.614-3.584-3.277-4.813-5.837-2.253-4.403-2.355-5.325-2.355-37.069v-32.563h-32.563c-31.744 0-32.666-0.102-37.069-2.253-2.56-1.331-5.222-3.482-5.837-4.915-0.922-1.741-1.331-7.885-1.331-18.534 0-14.848 0.205-16.179 2.355-19.354 3.789-5.632 6.042-5.939 41.984-6.042l32.461-0.102v-31.949c0-28.979 0.205-32.461 1.946-36.25 3.584-7.987 5.325-8.602 23.654-8.602 14.95 0 16.282 0.205 19.456 2.355 5.632 3.789 5.939 6.042 6.042 41.984l0.102 32.461h32.563c31.744 0 32.666 0.102 37.069 2.253 2.56 1.331 5.222 3.482 5.837 4.915 0.922 1.741 1.331 7.885 1.331 18.227 0 17.101-0.717 19.866-5.837 23.347-2.662 1.843-5.427 1.946-36.864 2.253l-34.099 0.307-0.102 32.461c-0.102 35.84-0.41 38.093-6.042 41.984-3.174 2.048-4.506 2.253-19.354 2.253-10.65 0-16.794-0.41-18.534-1.331zM363.725 574.669c-0.819-1.126-7.475-12.493-29.082-50.074-4.403-7.68-7.987-14.336-7.987-14.848 0-0.819 18.739-11.776 20.992-12.288 0.512-0.205 4.096 5.12 7.782 11.776 3.789 6.554 11.981 20.89 18.227 31.744 6.349 10.854 11.674 20.378 11.981 21.094 0.717 1.946-20.685 14.131-21.914 12.595z" />
+<glyph unicode="&#xea7f;" glyph-name="Network_livebox" d="M784.896 706.048c-22.426-4.608-38.707-13.414-54.784-29.696-19.661-19.661-30.106-45.568-29.798-73.728 0-6.451 0.717-14.746 1.434-18.432l1.331-6.656-21.606-15.258c-11.776-8.397-26.214-18.637-31.846-22.63l-10.445-7.373-7.987 5.53c-30.72 21.197-70.144 28.262-105.779 19.149-23.859-6.246-45.363-18.842-62.362-36.557l-6.451-6.758-15.974 7.066-16.077 6.963-3.686-8.806c-2.048-4.915-4.506-10.547-5.427-12.493-2.355-5.018-17.101-38.912-18.227-41.677-0.922-2.56-1.434-2.253 20.275-11.674l10.445-4.403-0.307-13.517c-0.41-19.149 1.843-33.28 8.192-50.176 14.131-37.888 45.875-67.482 84.378-78.848l7.68-2.253 0.205-37.171c0.205-20.48 0.102-38.298-0.205-39.526s-1.536-2.56-2.867-2.867c-4.608-1.434-18.637-9.011-24.678-13.312-6.861-4.915-18.125-15.872-23.45-23.040-23.757-31.744-27.75-76.288-9.83-111.821 18.33-36.352 56.832-59.904 96.666-59.085 28.774 0.512 54.477 11.469 74.24 31.539 19.763 19.968 30.106 43.315 31.232 70.758 1.331 30.618-9.318 58.061-31.13 79.974-10.547 10.547-17.306 15.36-30.515 21.709l-8.499 3.994 0.307 41.37 0.205 41.267 4.608 1.741c7.475 2.765 16.282 7.475 25.088 13.107 28.16 18.33 48.128 48.128 55.398 82.534 2.048 9.216 2.662 35.533 1.229 45.568-0.717 4.608-4.096 18.534-5.427 22.118-0.307 0.922 9.728 8.602 30.822 23.552l31.437 22.118 7.782-4.71c41.267-24.883 93.901-18.534 128 15.462 14.95 14.95 24.576 33.075 29.286 55.603 1.434 6.554 1.434 28.774 0 36.352-7.578 40.755-36.659 72.602-76.288 83.456-13.21 3.686-33.075 4.301-46.592 1.536zM577.024 503.91c20.275-5.325 39.117-20.685 48.64-39.526 5.939-11.776 7.68-19.661 7.68-34.816 0-12.288-0.307-14.746-2.867-22.63-6.554-20.173-20.48-36.25-39.117-45.466-42.496-20.992-92.672 1.126-107.008 47.104-2.56 8.397-3.584 25.498-1.946 34.304 5.837 31.232 30.208 56.115 60.826 62.054 8.806 1.741 25.293 1.126 33.792-1.024zM199.68 688.538c-15.462-1.638-32.973-7.987-45.978-16.691-7.885-5.222-22.118-18.637-26.829-25.19-7.782-10.752-14.438-25.498-17.92-39.424-2.253-8.909-2.56-34.918-0.512-43.52 5.222-22.221 14.131-38.605 28.877-53.35 20.378-20.378 46.285-30.925 74.854-30.515 26.214 0.307 49.459 9.216 68.198 26.010l5.427 4.813 13.005-5.632c7.168-3.174 13.312-5.427 13.619-5.018 0.614 0.614 16.691 37.581 25.805 58.88 1.229 2.867 1.638 5.222 1.126 5.734-0.512 0.41-6.042 2.97-12.288 5.734l-11.366 4.813v8.397c-0.102 63.283-53.658 111.718-116.019 104.96zM358.195 539.853c-3.174-7.373-9.523-21.914-14.029-32.256l-8.192-18.842 5.837-2.56c3.174-1.434 7.885-3.482 10.445-4.608s8.090-3.584 12.39-5.427l7.885-3.277 14.029 32.154c7.987 18.227 13.722 32.563 13.21 33.075-1.024 0.922-33.894 15.36-35.021 15.36-0.41 0-3.379-6.144-6.554-13.619z" />
+<glyph unicode="&#xea80;" glyph-name="networks" d="M152.883 831.898c-11.162-1.946-14.95-6.246-28.16-31.642-22.63-43.725-39.322-97.28-44.851-144.384-0.614-5.325-1.331-11.059-1.536-12.8-2.253-15.872-2.355-70.246-0.102-83.456 0.205-1.434 0.717-5.734 1.126-9.728 1.229-12.698 5.53-36.454 9.83-53.76 7.782-31.539 19.251-62.669 34.304-92.058 13.414-26.522 15.565-29.594 23.45-33.485 16.486-7.987 35.328 2.662 36.762 20.89 0.41 5.734-1.331 11.469-5.734 18.944-4.403 7.373-14.438 27.546-18.842 37.786-15.155 35.123-25.395 73.933-28.979 109.875-0.614 5.632-1.331 13.005-1.638 16.384-0.819 7.782-0.819 43.827 0 52.634 5.53 62.362 20.070 111.002 48.538 162.406 6.042 10.957 7.27 17.408 4.71 24.986-3.994 12.288-16.179 19.558-28.877 17.408zM862.208 831.898c-6.451-1.024-9.421-2.355-13.619-5.939-5.325-4.813-8.192-11.571-8.090-19.456 0-5.632 0.614-7.578 4.301-14.336 7.475-13.926 19.149-38.298 23.347-48.742 36.352-91.648 36.454-193.331 0.205-284.672-5.12-12.902-12.288-28.058-22.528-47.514-5.222-9.933-6.144-12.493-6.144-16.896 0.205-14.131 9.421-24.166 23.757-25.805 5.325-0.614 6.554-0.41 12.493 2.56 7.373 3.584 9.318 5.837 16.589 19.046 19.251 34.816 34.099 73.626 42.906 112.128 5.53 24.166 8.090 41.779 10.65 72.602 0.819 11.059 0.717 43.213-0.307 56.934-4.198 58.368-20.582 116.429-47.411 168.448-4.198 8.090-9.318 17.203-11.264 20.173-5.734 8.704-15.155 13.005-24.883 11.469zM239.616 780.902c-10.65-3.482-15.155-9.318-28.467-36.966-30.618-63.898-39.936-137.523-26.214-206.848 7.373-37.171 21.299-74.138 38.912-103.526 7.168-11.981 19.354-16.691 31.642-12.083 13.414 5.018 20.48 22.016 14.131 34.406-1.024 2.15-4.71 9.216-8.090 15.667-6.656 12.902-9.216 18.432-13.21 29.184-17.51 46.387-22.528 96.154-14.848 144.384 5.222 32.256 14.438 59.29 31.027 90.624 6.861 13.107 7.27 14.234 7.27 20.48 0 9.83-4.301 17.101-13.005 22.426-4.198 2.56-14.541 3.789-19.149 2.253zM767.181 780.083c-9.728-4.096-15.77-13.312-15.872-24.269-0.102-5.734 0.41-7.168 6.042-17.51 6.963-13.005 15.77-31.744 15.77-33.587 0-0.717 0.41-1.741 0.922-2.355 1.229-1.229 7.578-21.094 10.752-33.69 3.789-15.36 5.734-26.624 7.168-42.803 3.379-38.195-0.819-75.878-12.698-112.23-5.222-16.384-9.728-26.726-19.763-46.182-7.373-14.336-8.192-16.384-8.090-21.606 0.102-19.251 18.739-31.232 36.25-23.245 6.861 3.174 9.933 6.963 18.022 22.323 8.090 15.155 15.36 32.358 21.094 49.357 4.403 13.005 10.138 34.202 11.366 41.779 0.307 1.946 1.024 6.144 1.536 9.216 9.421 53.248 4.506 111.411-13.722 164.659-5.837 16.691-8.090 22.016-18.33 42.394-8.806 17.51-13.107 23.347-19.456 26.624-5.837 2.867-15.258 3.379-20.992 1.126zM332.698 732.57c-9.011-1.331-14.029-5.325-20.582-16.691-12.595-21.504-22.528-48.64-27.341-74.342-4.096-22.118-4.506-53.862-1.024-75.264 3.891-23.552 11.162-46.899 20.787-66.458 8.397-17.203 11.571-21.299 18.637-24.781 17.408-8.499 36.864 3.686 36.557 22.835-0.102 5.837-0.717 7.782-6.246 18.534-14.541 28.467-20.89 54.067-20.787 84.685 0 33.178 7.475 60.211 25.498 92.672 3.277 5.837 3.686 7.475 3.686 13.824 0 5.427-0.512 8.192-2.15 11.264-5.427 10.24-15.667 15.462-27.034 13.722zM683.008 728.576c-12.083-3.482-19.558-12.902-19.661-24.678-0.102-5.427 0.614-7.475 6.144-18.637 12.493-25.088 18.432-44.646 20.378-67.789 2.97-33.997-3.174-67.072-17.92-96.256-2.56-5.018-5.53-11.059-6.656-13.312-10.752-21.402 13.312-44.442 34.816-33.382 6.349 3.174 10.035 8.294 18.227 24.986 21.197 43.725 27.853 87.45 20.89 136.909-1.331 9.114-6.963 31.334-10.65 41.779-5.734 16.486-16.589 37.99-21.811 43.52-5.325 5.53-16.794 8.909-23.757 6.861zM493.261 701.338c-20.89-3.789-39.014-13.312-54.272-28.672-38.605-38.81-39.731-101.069-2.458-141.312 3.686-3.994 9.216-9.216 12.39-11.571l5.53-4.301-2.97-8.909c-1.741-4.915-4.608-13.312-6.554-18.637-1.843-5.325-6.963-19.866-11.264-32.256-15.258-43.827-29.389-84.070-32.256-92.16-1.638-4.506-6.451-18.33-10.752-30.72s-9.421-26.931-11.264-32.256c-1.843-5.325-5.53-15.974-8.192-23.552-2.56-7.578-5.222-14.95-5.734-16.179-0.512-1.331-1.946-5.325-3.072-8.704-1.126-3.482-3.379-10.035-5.018-14.541s-7.782-22.016-13.619-38.912c-5.939-16.896-16.589-47.411-23.757-67.789-10.65-30.413-12.902-38.093-12.902-42.803 0-18.022 19.251-30.31 35.43-22.63 6.963 3.277 11.264 7.885 13.926 14.746 2.15 5.939 13.722 38.605 15.258 43.213 0.41 1.434 3.891 11.264 7.578 21.914s6.758 19.456 6.758 19.661c0 0.205 56.422 0.41 125.338 0.41h125.338l1.536-4.301c24.166-69.222 29.389-83.968 30.31-85.606 0.614-1.126 3.174-3.891 5.734-6.144 16.179-14.234 41.882-2.355 41.779 19.251-0.102 4.506-2.253 11.776-10.547 35.328-12.186 34.816-16.794 47.821-23.757 68.096-2.765 8.192-5.53 15.77-5.939 16.896-0.512 1.126-4.915 13.619-9.83 27.648-4.813 14.131-13.414 38.707-19.046 54.784s-12.288 35.226-14.848 42.496c-2.458 7.373-5.632 16.282-6.963 19.968s-5.734 16.077-9.728 27.648c-3.994 11.571-9.011 25.6-10.957 31.232-2.048 5.632-3.994 11.366-4.506 12.8-0.41 1.434-3.379 9.933-6.554 18.944s-6.246 17.51-6.656 18.944c-1.024 3.072-14.541 41.677-16.691 47.821l-1.638 4.301 5.325 3.994c51.814 39.219 53.453 118.272 3.277 159.846-23.45 19.354-53.965 27.443-83.763 22.016zM533.914 459.469c7.066-20.48 12.902-37.376 12.902-37.683 0-0.205-15.872-0.41-35.328-0.41s-35.328 0.102-35.328 0.307c0 0.205 5.734 16.896 12.8 37.171 7.066 20.173 13.107 37.274 13.312 37.99 0.512 1.536 15.872 2.253 17.51 0.819 0.717-0.512 6.963-17.715 14.131-38.195zM565.76 368.333c1.741-4.71 16.896-48.23 16.896-48.742 0-0.307-32.051-0.614-71.168-0.614s-71.168 0.205-71.168 0.307c0 0.205 2.15 6.349 4.71 13.619s6.451 18.432 8.602 24.781c2.253 6.349 4.198 11.878 4.506 12.288 0.205 0.41 24.371 0.614 53.658 0.41 49.459-0.205 53.248-0.41 53.965-2.048zM602.419 263.475c0.922-2.458 3.482-9.728 5.734-16.179s5.427-15.77 7.168-20.685c1.741-5.018 3.174-9.216 3.174-9.523s-48.23-0.512-107.11-0.512c-85.299 0-107.008 0.307-106.701 1.331 0.307 0.614 4.301 12.186 9.011 25.6l8.499 24.269h178.586l1.638-4.301z" />
+<glyph unicode="&#xea81;" glyph-name="new" d="M448.205 880.026c-13.414-3.174-24.986-13.517-29.696-26.726-0.922-2.56-1.331-37.478-1.741-139.776l-0.512-136.294-55.296 21.402c-30.413 11.776-59.904 23.245-65.536 25.395s-19.456 7.475-30.72 11.878c-11.264 4.301-21.402 8.294-22.528 8.806-3.174 1.331-35.123 13.722-53.248 20.582-14.643 5.53-17.101 6.144-24.064 6.144-12.186 0-22.528-5.018-30.208-14.643-3.994-4.915-4.915-7.373-14.336-34.202-3.482-10.138-7.373-21.197-8.602-24.576-1.331-3.379-2.867-7.987-3.686-10.24-2.867-8.704-10.854-31.334-15.462-44.032-4.506-12.288-4.813-14.029-4.915-23.040 0-8.397 0.41-10.547 2.662-15.565 2.97-6.554 9.626-14.234 15.36-17.818 3.584-2.253 14.234-6.042 76.595-27.034 13.21-4.506 57.037-19.251 97.28-32.768 40.243-13.619 74.24-25.088 75.469-25.395 1.331-0.41 2.355-1.126 2.458-1.536 0-0.512-1.741-3.277-3.891-6.144-6.963-9.318-67.072-88.883-125.645-166.4-33.28-44.032-32.768-43.11-32.768-58.573-0.102-7.68 0.307-9.523 3.174-15.36 1.741-3.686 4.71-8.397 6.554-10.445 2.765-2.97 38.81-29.798 87.757-65.229 25.088-18.227 30.106-20.378 42.701-19.251 13.312 1.229 22.63 7.68 32.461 22.221 2.458 3.686 9.83 14.541 16.384 24.064 14.131 20.685 28.774 42.291 43.418 64 5.939 8.704 19.661 28.877 30.413 44.749 10.854 15.974 27.238 40.243 36.557 53.965 9.318 13.824 17.101 25.088 17.408 25.088s4.71-5.837 9.83-13.005c5.12-7.168 22.323-31.232 38.298-53.453s40.755-56.832 55.194-76.8c14.336-19.968 32.87-45.875 41.267-57.549 19.763-27.546 24.986-31.744 41.984-33.28 5.222-0.41 8.397-0.102 13.824 1.536 6.349 1.946 11.059 5.12 46.49 31.437 21.606 16.179 40.755 30.31 42.496 31.539 10.752 7.475 22.221 16.589 25.498 20.275 2.048 2.355 5.018 6.861 6.554 10.035 2.355 5.12 2.662 6.963 2.662 16.486-0.102 9.83-0.307 11.264-2.97 16.384-1.638 3.072-5.53 9.011-8.704 13.312-3.277 4.198-14.541 19.251-25.19 33.28-10.65 14.131-28.57 37.786-39.834 52.736-11.162 14.95-30.106 39.936-41.984 55.603s-22.323 29.491-23.142 30.72c-0.819 1.229-5.837 7.885-10.957 14.746-5.222 6.861-9.523 12.902-9.523 13.312s10.035 4.096 22.323 8.090c125.133 40.96 230.81 76.595 234.701 79.053 16.691 10.547 22.118 29.696 14.643 50.893-7.475 21.094-27.034 76.8-33.178 94.72-5.837 16.794-6.042 17.101-10.24 22.835-9.011 11.981-26.214 18.432-39.526 14.848-2.15-0.512-22.733-7.987-45.875-16.486-23.040-8.499-79.77-29.389-125.952-46.387l-83.968-30.925-0.512 136.909-0.512 136.806-3.277 6.656c-5.325 10.957-15.667 19.456-27.136 22.323-5.837 1.434-120.934 1.536-127.078 0.102z" />
+<glyph unicode="&#xea82;" glyph-name="newspaper" d="M153.6 491.315c0-285.389 0-289.587-2.048-292.864-5.12-8.397-16.384-8.397-21.504 0-2.048 3.174-2.048 6.963-2.048 236.544v233.165h-51.2v-241.869c0-260.506-0.205-247.398 5.12-261.734 2.662-6.963 4.506-10.445 9.318-17.101 10.547-14.336 22.426-23.040 39.834-28.877l8.704-2.867h371.2c361.677 0 371.405 0 378.368 1.946 27.341 7.475 47.923 27.75 55.501 54.886 1.741 6.349 1.843 18.432 1.843 264.192v257.536l-2.765 9.83c-6.144 22.528-19.456 42.394-36.966 55.501-14.131 10.445-25.702 15.667-42.701 19.149-9.83 2.048-15.053 2.048-360.346 2.048h-350.31v-289.485zM847.258 700.723c13.312-6.349 21.299-17.306 22.733-31.437 1.741-15.974-7.066-31.232-22.118-38.4l-6.656-3.174h-581.632l-6.758 3.277c-8.704 4.301-14.848 10.445-18.739 18.739-2.867 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c3.584 7.578 8.499 13.005 15.36 16.998 9.83 5.734-9.933 5.427 302.49 5.222l289.28-0.205 6.042-2.765zM498.381 533.504c3.277-0.819 8.499-2.765 11.571-4.301 7.373-3.584 18.33-14.541 21.914-21.914 5.939-12.288 5.734-6.349 5.734-137.933v-121.037h-131.277c-105.882 0-132.403 0.307-136.499 1.434-19.661 5.222-34.816 21.094-38.298 39.936-0.819 4.198-1.126 44.237-1.126 125.747v119.603h131.072c113.459 0 131.789-0.205 136.909-1.536zM864.768 532.378c9.421-4.915 13.414-17.51 8.397-27.034-1.331-2.56-4.403-5.939-6.758-7.68l-4.403-3.072h-228.966l-4.403 3.174c-10.752 7.782-11.981 22.221-2.765 31.232 2.253 2.15 5.632 4.403 7.373 4.915 1.843 0.614 50.176 0.922 115.302 0.819 111.616-0.205 112.128-0.205 116.224-2.355zM863.846 450.97c15.258-7.168 15.258-29.389 0-36.659l-4.813-2.15-225.69 0.512-3.891 2.458c-7.885 4.813-11.366 14.234-8.806 23.347 1.536 5.632 7.066 11.674 12.186 13.312 2.56 0.819 36.966 1.126 114.995 1.229l111.309 0.102 4.71-2.15zM864.768 368.538c9.421-4.915 13.414-17.51 8.397-27.034-1.331-2.56-4.403-5.939-6.758-7.68l-4.403-3.072h-228.659l-3.891 2.458c-7.885 4.813-11.366 14.234-8.806 23.347 1.536 5.632 7.066 11.674 12.186 13.312 2.56 0.819 36.147 1.126 115.712 1.024 111.616-0.205 112.128-0.205 116.224-2.355zM769.229 288.256c4.813-1.331 11.469-7.885 13.107-12.902 2.97-8.909-1.434-20.070-9.728-24.371-3.994-2.15-5.12-2.15-71.782-2.15h-67.686l-4.198 2.97c-6.554 4.506-8.909 9.011-8.909 16.998 0.102 5.018 0.614 7.578 2.355 10.24 2.458 4.096 7.27 7.987 11.366 9.216 4.096 1.331 130.97 1.229 135.475 0z" />
+<glyph unicode="&#xea83;" glyph-name="nfc" d="M690.688 881.971c-6.861-1.434-14.95-5.018-22.221-9.728-11.469-7.578-16.998-16.486-17.92-29.389-0.922-12.595 3.072-26.112 15.667-52.736 3.584-7.475 6.554-13.824 6.554-13.926 0-0.205 2.15-4.813 4.71-10.445 7.987-16.896 18.842-44.032 27.546-68.403 16.794-47.514 28.57-94.822 36.864-148.992 0.512-2.97 3.277-26.931 3.994-34.304 0.512-5.325 1.126-12.8 2.253-29.184 1.331-19.046 0.614-70.758-1.126-90.112-0.307-2.56-0.717-7.578-1.024-11.264-0.512-7.066-1.434-16.282-2.048-20.48-0.205-1.434-0.922-6.451-1.536-11.264-2.867-22.426-10.24-60.314-15.974-82.944-14.643-56.627-32.563-105.779-59.802-163.328-11.571-24.371-15.36-35.942-15.974-47.821-0.717-16.896 7.578-29.901 24.883-38.912 24.371-12.8 42.291-6.554 59.187 20.89 7.27 11.674 25.498 47.616 36.557 71.987 31.232 68.915 52.736 139.264 63.693 208.384 3.174 19.866 3.379 20.89 4.71 32.768 0.614 5.325 1.331 11.162 1.536 12.8 0.205 1.741 0.717 7.27 1.024 12.288 0.41 5.12 0.922 10.65 1.126 12.288 0.717 6.144 1.843 42.394 1.843 57.856 0 16.691-1.229 50.586-1.843 55.808-0.307 1.741-0.717 6.758-1.126 11.264-0.819 11.264-1.434 16.589-3.174 30.208-0.922 6.451-1.843 13.619-2.048 15.872-0.307 2.253-1.741 10.547-3.072 18.432-11.776 66.56-29.696 126.874-55.706 187.904-9.421 21.914-16.077 36.25-30.31 64.819-12.698 25.293-16.077 30.925-24.064 38.81-9.626 9.728-21.094 13.414-33.178 10.854zM523.264 794.010c-5.734-1.536-11.264-4.096-18.125-8.294-16.589-10.342-22.63-25.395-18.33-45.875 1.843-9.216 4.608-16.077 14.131-35.84 24.781-51.405 43.213-105.165 52.122-151.962 2.458-13.107 4.915-28.57 6.042-37.478 0.614-5.325 1.331-11.571 1.536-13.722 1.638-13.21 2.048-24.883 2.048-52.326 0-32.768-1.126-51.814-4.096-71.68-10.035-66.355-26.624-120.32-55.296-180.224-10.854-22.63-12.595-26.726-15.462-36.147-2.765-8.909-3.482-18.842-1.946-26.010 4.506-20.582 35.226-38.912 55.501-33.075 16.589 4.813 27.034 17.92 48.435 60.928 24.269 48.435 42.496 101.274 53.146 154.112 4.096 20.378 8.192 48.435 9.728 67.379 0.307 3.789 0.819 9.728 1.126 13.312 2.56 30.003 2.048 82.637-1.126 113.357-1.536 15.77-4.506 38.707-5.53 44.544-5.632 29.491-7.885 40.141-11.366 53.76-10.854 42.496-25.088 81.51-43.725 119.706-21.709 44.851-33.587 60.006-50.381 65.024-6.042 1.843-12.902 1.946-18.432 0.512zM361.472 709.939c-13.414-2.048-31.539-14.541-37.581-26.112-8.090-15.155-6.554-27.648 7.168-55.398 25.395-51.507 36.762-87.040 43.622-136.090 3.789-26.522 3.584-65.638-0.512-93.491-6.451-44.851-18.33-81.818-41.882-129.536-10.752-21.709-12.902-28.262-12.902-39.424-0.205-15.258 8.090-28.16 23.654-37.274 9.011-5.325 15.667-7.27 24.576-7.27 16.896 0 28.774 10.65 45.978 41.267 23.347 41.37 40.141 87.757 49.152 135.885 3.789 20.173 4.813 27.443 7.168 55.808 0.819 9.421 0.614 62.874-0.307 69.12-0.205 1.741-0.717 6.349-1.024 10.24-3.174 35.226-14.848 81.818-29.491 118.272-6.758 16.794-21.402 46.592-30.208 61.44-9.011 15.155-20.582 27.341-28.979 30.413-7.27 2.765-11.469 3.174-18.432 2.15zM201.728 626.176c-16.179-2.867-33.178-17.101-38.4-32.358-4.506-13.005-1.126-27.238 11.162-47.923 28.365-47.718 35.738-98.406 21.504-147.558-4.813-16.589-10.035-28.467-21.299-48.538-8.704-15.872-10.854-20.582-12.39-27.75-3.379-16.486 2.662-31.642 17.101-42.496 28.365-21.299 51.712-13.005 77.824 27.648 19.046 29.696 31.13 67.482 36.25 113.152 0.41 3.686 0.922 7.782 1.126 9.216 0.922 5.427 1.229 42.803 0.307 48.64-0.41 3.379-1.126 8.499-1.434 11.264-4.813 40.858-22.938 84.070-48.538 115.507-13.21 16.282-28.467 23.757-43.213 21.197z" />
+<glyph unicode="&#xea84;" glyph-name="NFC_tag" d="M494.182 893.85c-14.541-2.56-26.726-7.578-40.55-16.691-5.632-3.686-17.408-14.95-31.642-30.31-4.198-4.506-10.957-11.674-14.848-15.872-3.994-4.198-10.957-11.674-15.462-16.486s-11.878-12.595-16.384-17.408c-4.506-4.813-11.571-12.39-15.77-16.794-4.198-4.506-11.366-12.083-15.872-16.896-7.066-7.475-29.184-31.027-38.81-41.472-2.765-2.97-6.861-7.168-24.166-25.6-4.301-4.608-11.469-12.186-15.974-16.998s-11.878-12.595-16.384-17.408c-8.806-9.421-31.744-33.792-42.496-45.363-3.686-3.891-11.162-11.776-16.589-17.408l-10.035-10.342 0.307-251.392 0.205-251.392 2.867-10.035c5.222-18.637 13.517-32.973 26.829-46.285 15.565-15.565 33.485-24.883 55.501-28.672 7.987-1.434 37.888-1.536 251.187-1.331l242.176 0.307 10.035 2.765c17.92 4.915 33.075 13.824 46.285 26.931 11.674 11.571 19.968 24.986 25.088 40.448 5.325 15.77 5.12 6.042 5.12 271.36v247.296l-8.499 8.704c-7.373 7.782-18.432 19.456-47.309 50.176-12.493 13.21-36.966 39.322-45.568 48.538-7.578 8.090-18.022 19.149-32.768 34.816-4.198 4.506-8.602 9.114-9.728 10.342s-8.499 9.114-16.384 17.51c-22.63 24.064-28.57 30.413-29.696 31.642-0.512 0.717-7.066 7.578-14.438 15.462-7.475 7.782-14.95 15.872-16.794 17.818-42.496 46.080-51.917 54.477-69.325 62.464-18.022 8.192-40.346 10.957-60.109 7.578zM524.39 778.957c23.757-4.506 43.622-23.45 49.664-47.309 7.782-30.515-9.114-63.283-38.605-74.65-20.582-8.090-42.906-5.325-60.621 7.373-35.533 25.395-35.533 78.438-0.102 103.731 14.643 10.445 31.949 14.234 49.664 10.854zM621.158 535.142c6.042-2.765 9.728-7.782 18.842-25.702 13.21-26.112 24.371-53.248 32.154-78.336 3.072-9.728 9.626-35.635 10.957-42.906 2.048-11.571 5.018-31.232 5.632-37.478 0.307-3.686 0.819-7.782 1.126-9.216 0.205-1.434 0.614-14.336 0.819-28.672 0.922-62.464-9.523-115.2-34.816-175.104-8.397-19.866-22.426-46.899-27.443-52.634-4.608-5.53-10.65-8.704-16.179-8.806-5.018 0-15.565 5.427-19.354 10.035-7.373 8.909-6.554 17.203 4.301 40.653 9.318 20.275 9.523 20.787 14.438 33.382 13.722 35.226 23.654 76.083 27.034 111.514 1.024 11.059 1.024 60.723 0 70.144-5.632 51.2-17.818 93.798-40.346 141.824-11.981 25.498-13.21 34.304-5.734 43.008 7.578 8.806 19.661 12.39 28.57 8.294zM529.613 490.086c8.602-2.048 14.95-9.728 25.805-31.539 19.046-37.99 29.901-76.595 33.997-120.627 1.024-10.752 1.126-48.538 0.205-60.928-2.765-34.918-11.981-72.602-25.395-103.629-5.53-12.698-15.155-31.334-19.354-37.581-8.704-12.8-18.022-15.872-30.003-9.83-9.728 4.915-14.131 10.957-14.131 19.661 0 6.554 1.331 11.059 6.554 22.221 4.403 9.216 7.782 16.691 10.445 22.63 7.066 16.282 14.541 40.653 18.637 61.44 2.048 10.035 2.355 11.878 3.994 24.576 1.536 11.878 0.922 56.32-1.024 69.12-5.325 34.816-14.131 62.464-31.027 97.997-9.011 19.046-9.83 29.491-2.765 37.274 2.048 2.253 6.042 5.12 8.909 6.451 8.704 4.096 9.216 4.096 15.155 2.765zM444.928 444.518c6.554-2.765 11.878-9.421 20.787-26.214 26.214-49.254 33.792-106.701 21.504-163.84-6.246-29.491-24.064-69.427-35.738-80.384-5.325-4.915-11.469-7.168-16.589-6.042-8.806 1.843-18.739 9.83-21.094 16.691-2.662 7.987-1.638 11.981 7.885 31.846 15.258 32.154 21.504 58.368 21.504 90.624 0 32.768-6.144 57.651-23.040 93.082-7.27 15.258-8.602 21.094-6.451 27.853 1.741 5.222 5.325 9.421 11.162 13.107 7.782 4.915 13.722 5.837 20.070 3.277zM362.598 399.36c4.608-2.458 8.704-6.451 14.029-13.619 16.179-21.811 24.678-51.098 23.347-79.565-0.717-15.36-1.434-21.094-5.12-38.298-4.198-19.354-18.534-44.646-29.594-52.019-6.963-4.608-12.493-5.222-19.354-2.15-16.589 7.68-20.992 21.299-11.878 37.069 5.734 10.035 10.957 21.709 13.619 30.822 3.379 11.264 4.301 30.413 2.048 42.086-1.843 9.626-6.656 22.426-11.878 31.949-7.68 14.029-8.192 15.462-8.294 21.811-0.102 4.915 0.41 6.861 2.867 10.854 3.174 5.12 10.65 10.854 16.179 12.493 3.789 1.126 10.24 0.512 14.029-1.434z" />
+<glyph unicode="&#xea85;" glyph-name="no_sim" d="M218.112 881.562c-8.704-2.355-15.974-6.246-22.323-12.186-7.27-6.758-11.878-14.336-14.541-23.859-2.048-7.27-2.048-11.264-2.048-397.722 0-425.574-0.41-394.547 5.734-407.245 3.686-7.475 14.541-18.33 22.016-22.016 12.493-6.042 2.253-5.734 182.682-5.734h165.888l-9.83 9.933c-11.469 11.674-18.944 20.992-27.546 34.304-3.379 5.222-6.144 8.909-6.144 8.294 0-1.024-13.517-1.331-64-1.331h-64v128h104.448v2.458c0 1.331 0.922 6.963 2.048 12.39s2.048 10.138 2.048 10.342c0 0.205-58.982 0.41-131.072 0.41h-131.072v128h153.6v153.6h128l0.102-116.429c0-90.624 0.307-116.122 1.229-114.586 6.861 10.854 13.722 20.787 18.534 26.726l5.734 7.168v43.52h54.272l9.011 4.506c20.378 10.24 42.086 16.589 67.482 19.866 6.554 0.819 34.714 1.024 42.803 0.205l5.12-0.41 0.307 167.117 0.205 167.117-179.2 179.2-156.979-0.102c-134.144 0-157.696-0.205-162.509-1.536zM358.4 435.2v-64h-128v53.146c0 56.832 0.102 57.549 5.222 64.717 2.355 3.277 7.782 7.066 12.698 8.909 2.048 0.717 21.094 1.126 56.627 1.126l53.453 0.102v-64zM651.981 496.23c5.12-2.97 7.373-5.222 10.752-10.854l2.355-4.096 0.307-54.989 0.307-55.091h-128.102v128.102l110.080-0.614 4.301-2.458zM358.4 128v-64h-53.043c-60.109 0-59.597-0.102-67.277 7.68-7.782 7.68-7.68 7.168-7.68 67.277v53.043h128v-64zM667.136 343.962c-26.829-3.584-55.808-14.848-78.234-30.413-23.654-16.384-44.954-41.062-57.856-66.97-18.227-36.659-23.552-78.029-14.95-118.067 14.234-65.946 64.614-118.374 130.253-135.578 16.179-4.198 25.702-5.222 46.387-5.12 20.48 0.102 29.286 1.229 46.592 6.042 70.144 19.661 120.73 78.95 129.946 152.064 1.741 13.926 0.614 40.858-2.355 55.091-15.667 75.571-74.035 130.97-150.63 143.053-8.499 1.331-39.014 1.331-49.152-0.102zM727.347 238.899l36.045 36.045 36.454-36.25-72.294-72.294 72.294-72.294-36.454-36.25-36.045 36.147-36.147 36.045-72.192-72.192-18.227 18.125-18.125 18.227 36.045 36.045c19.866 19.866 35.738 36.454 35.328 36.864s-16.691 16.691-36.147 36.147l-35.328 35.43 18.227 18.125 18.125 18.227 72.294-72.294 36.147 36.147z" />
+<glyph unicode="&#xea86;" glyph-name="Notification" d="M402.33 857.19c-0.205-0.205-6.144-0.614-13.21-1.024-15.77-0.819-23.45-1.536-43.008-4.198-6.451-0.819-18.432-2.97-26.624-4.71-19.149-3.994-15.36-3.072-40.96-9.626l-22.323-5.632h-77.005v-793.6h76.8v321.126l6.451 1.638c3.482 0.819 16.486 4.198 28.877 7.373 30.925 8.090 53.248 12.39 74.752 14.541 2.867 0.307 6.554 0.717 8.192 0.922 20.173 2.662 108.339 2.662 121.856 0 1.126-0.205 5.018-0.717 8.704-1.024 17.101-1.536 44.032-6.554 68.096-12.8 41.574-10.752 48.026-12.39 57.446-14.234 23.040-4.71 45.875-7.68 70.042-9.114 25.293-1.434 89.19-0.614 101.888 1.229 1.741 0.307 5.632 0.717 8.704 1.024 11.059 1.024 27.853 3.686 40.755 6.349 7.168 1.536 14.234 2.97 15.872 3.174l2.765 0.512v236.032c0 156.672-0.307 235.725-1.024 235.315-2.765-1.741-43.213-8.909-57.344-10.24-3.686-0.41-7.782-0.819-9.216-1.126-15.974-2.662-98.202-2.56-121.856 0.102-1.946 0.307-5.837 0.717-8.704 1.024-11.981 1.331-26.419 3.686-38.4 6.042-12.39 2.458-20.378 4.403-58.368 14.336-22.835 5.837-46.080 10.547-61.952 12.39-2.765 0.307-6.246 0.819-7.68 1.024s-6.246 0.717-10.752 1.126c-4.506 0.41-9.83 0.819-11.776 1.024-4.71 0.614-80.486 1.536-80.998 1.024zM568.218 753.357c7.373-3.994 7.27-3.379 7.27-55.706v-46.797l7.987 2.97c4.301 1.638 23.757 8.909 43.11 16.282s36.557 13.414 38.4 13.414c3.379 0 8.090-2.56 10.24-5.734 0.819-1.024 2.15-3.994 2.97-6.554 0.922-2.56 4.198-11.981 7.373-20.992 4.506-12.902 5.632-17.306 5.222-20.48-0.922-7.885-2.662-8.704-50.278-24.474-23.654-7.782-43.213-14.336-43.418-14.541-0.307-0.205 33.28-45.363 48.026-64.41 2.662-3.379 5.325-7.168 5.939-8.397 1.741-3.174 1.536-10.752-0.41-13.517-1.638-2.355-34.406-27.136-39.219-29.696-2.867-1.638-9.421-0.922-12.8 1.229-1.946 1.331-30.822 40.653-50.176 68.506-3.482 4.915-6.554 8.909-6.861 9.011-0.614 0-45.67-65.843-49.459-72.294-1.024-1.741-3.789-4.301-5.939-5.53-7.066-3.994-9.523-2.97-30.515 12.39-10.342 7.578-19.558 14.848-20.582 16.282-2.458 3.379-2.97 7.987-1.434 11.981 1.024 2.458 18.739 26.931 24.371 33.587 3.686 4.506 30.515 40.653 30.208 40.858-0.102 0.205-19.661 6.861-43.315 14.848-23.859 7.987-43.827 15.258-44.851 16.282-2.765 2.867-4.71 9.114-3.789 12.902 0.41 1.741 3.174 9.83 6.042 18.022 2.97 8.192 6.042 16.998 6.758 19.558 2.048 6.554 7.578 11.162 13.21 11.162 1.536 0 6.656-1.536 11.674-3.482 12.698-5.018 60.928-23.859 68.608-26.726l6.349-2.458v46.797c0 43.418 0.102 47.104 1.843 50.278 3.584 6.656 6.042 7.27 31.437 7.27 19.866 0 22.938-0.205 26.010-1.843z" />
+<glyph unicode="&#xea87;" glyph-name="Notification_Bell" d="M502.272 908.186c-1.126-0.205-4.608-0.922-7.68-1.536-12.595-2.56-27.341-10.752-37.069-20.685-14.746-15.053-22.221-33.792-22.323-55.194 0-7.066-0.307-9.011-1.434-9.011-0.819 0-6.554-1.536-12.698-3.482-96.768-30.413-172.237-105.677-202.445-202.035-4.71-15.155-9.728-38.298-11.264-51.507-0.307-3.072-1.024-9.114-1.434-13.312-0.512-4.198-0.922-69.53-1.024-145.203l-0.102-137.523-20.173-33.485c-11.059-18.432-23.552-39.014-27.648-45.875-8.909-14.95-10.445-19.661-8.806-27.546 1.638-7.475 5.837-13.517 11.981-17.408l5.018-3.072h693.453l4.915 2.867c5.837 3.482 10.138 9.114 11.981 15.667 2.355 8.294 0.41 14.643-9.421 30.925-4.71 7.68-9.011 14.95-9.626 16.077s-9.318 15.565-19.149 31.949l-18.022 30.003-0.41 141.517c-0.307 92.672-0.819 143.77-1.536 147.763-0.614 3.379-1.331 8.499-1.741 11.264-1.946 15.77-9.216 43.213-16.384 62.464-5.222 14.336-18.432 40.755-27.238 54.784-39.219 62.566-100.045 109.773-168.96 131.277l-13.926 4.301-0.614 11.776c-0.717 13.312-2.458 21.094-7.066 30.822-9.421 19.968-28.365 35.738-49.459 41.472-6.042 1.536-25.702 2.867-29.696 1.946zM410.112 106.394c2.662-32.154 21.811-62.771 49.459-79.053 17.51-10.24 35.226-14.746 55.501-14.131 18.944 0.614 33.792 4.813 49.664 14.336 27.955 16.691 46.694 47.002 49.357 79.77l0.614 7.885h-205.312l0.717-8.806z" />
+<glyph unicode="&#xea88;" glyph-name="nouveau_contract_social" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM464.794 523.162c9.216-2.048 21.402-8.704 29.286-15.974 3.686-3.379 6.656-6.554 6.451-7.066s-15.36-16.179-33.69-34.918c-58.266-59.392-60.211-61.542-59.29-63.283 0.512-0.819 6.554-7.066 13.517-13.926 13.312-13.005 19.046-16.691 29.389-18.944 6.349-1.331 16.077-0.717 22.323 1.434 10.445 3.584 14.438 7.27 66.662 60.928l14.643 15.053 17.613-18.125c9.728-9.933 33.485-34.304 52.941-54.067 51.814-52.736 53.35-54.374 55.398-58.88 5.53-11.981-1.536-27.648-14.029-31.13-2.15-0.614-5.427-1.126-7.27-1.126-7.782 0-10.854 2.56-47.514 40.038-19.558 19.968-39.731 40.55-44.851 45.773-10.035 10.24-12.083 11.059-16.896 7.27-1.843-1.434-2.662-3.072-2.662-5.325 0-3.686-2.15-1.434 56.832-61.542 37.99-38.81 38.81-40.038 34.816-53.555-1.741-5.837-7.68-12.39-13.005-14.336-5.12-1.843-12.083-1.536-16.998 0.717-2.56 1.229-7.885 5.632-12.698 10.445-42.086 43.315-79.462 81.101-80.998 81.92-3.277 1.741-7.885-0.102-9.421-3.584-1.843-4.403-0.41-7.68 5.939-13.824 6.349-6.042 70.554-71.68 78.234-79.872 5.632-6.042 7.27-9.318 7.782-16.077 0.614-7.066-1.229-11.878-6.861-17.51-5.427-5.325-8.397-6.554-16.179-6.554-6.451 0-10.65 2.458-21.094 12.595-12.902 12.493-19.456 15.77-31.13 15.667l-4.915-0.102v5.734c0 20.275-16.077 36.966-35.942 37.171l-5.734 0.102-0.614 7.885c-1.331 19.251-15.053 33.382-34.406 35.43l-7.373 0.717-0.307 6.349c-0.717 13.824-8.397 25.907-20.48 32.051-6.656 3.379-7.68 3.584-16.896 3.584-14.336-0.102-18.022-2.253-37.376-22.016l-15.36-15.565-8.704 9.011c-14.848 15.565-19.763 23.347-23.757 37.99-2.253 8.090-2.97 22.733-1.434 30.106 2.15 11.162 7.066 22.221 13.414 30.413 3.072 4.096 68.301 71.27 79.565 81.92 17.203 16.486 39.629 22.528 63.078 16.998zM588.595 524.186c4.301-0.819 11.776-3.482 16.589-5.837 8.090-3.891 10.035-5.53 28.672-24.269 34.304-34.509 63.898-64.922 67.789-69.632 9.114-11.162 14.438-27.136 14.438-43.008-0.102-17.92-6.349-34.099-18.125-46.694l-6.656-7.066-12.902 13.312c-7.168 7.373-30.003 30.618-50.688 51.712s-45.773 46.694-55.603 56.832l-18.125 18.432-12.902-13.312c-7.168-7.27-24.781-25.395-39.322-40.038-23.962-24.371-26.829-26.931-32.154-28.979-6.861-2.56-12.595-2.765-19.968-0.512-4.301 1.229-7.066 3.174-13.517 9.318-4.403 4.301-8.090 8.090-8.090 8.602 0 0.41 1.946 2.765 4.403 5.325 19.763 20.275 84.992 86.835 92.262 94.003 4.915 5.018 11.366 10.65 14.336 12.493 14.848 9.728 31.949 12.902 49.562 9.318zM403.763 338.125c11.776-5.018 17.408-19.558 12.083-30.925-2.662-5.734-27.238-30.515-32.358-32.768-11.981-5.222-26.931 1.741-30.31 14.029-1.536 5.734-0.614 13.926 2.048 18.227 3.482 5.837 28.57 30.31 32.154 31.539 4.71 1.536 12.595 1.434 16.384-0.102zM446.464 294.707c11.162-4.506 16.896-19.558 11.674-30.72-2.458-5.12-26.419-29.594-31.642-32.358-5.427-2.867-13.926-2.867-19.661 0.102-10.957 5.632-15.667 20.070-9.933 31.027 2.458 4.915 26.829 29.286 31.539 31.539 4.915 2.458 12.493 2.56 18.022 0.41zM486.4 252.416c4.915-1.331 10.854-6.451 13.517-11.571 2.97-5.632 3.072-14.95 0.205-20.48-1.126-2.048-8.090-10.035-15.565-17.613-12.083-12.186-14.234-13.926-19.149-15.462-14.643-4.608-28.365 5.939-28.365 21.811 0 4.915 0.512 7.27 2.355 10.445 2.15 3.482 18.944 21.504 26.726 28.57 5.12 4.608 13.107 6.349 20.275 4.301zM531.866 208.179c4.608-2.253 9.83-8.499 11.469-13.414 1.843-5.734 1.434-13.107-1.024-17.818-2.048-4.096-24.883-27.75-29.696-30.72-14.131-9.011-33.382 1.843-33.382 18.739 0 9.626 1.536 12.186 16.589 27.648 11.571 11.878 15.053 14.746 19.046 16.077 5.12 1.843 13.005 1.536 16.998-0.512zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xea89;" glyph-name="numero_unique" d="M593.715 754.688c-0.102-0.102-3.789-0.614-7.987-0.922-11.264-1.126-14.95-1.536-24.064-3.277-46.182-8.806-87.552-27.955-124.928-57.651-12.39-9.83-35.635-32.87-41.062-40.653-1.331-1.946-1.946-2.15-5.325-1.229-6.758 1.741-30.72 1.843-39.936 0.205-49.357-8.806-86.63-46.080-94.822-94.925l-1.126-7.27-13.824-2.662c-78.234-15.565-140.288-75.059-159.13-152.576-3.994-16.486-5.018-26.214-5.12-46.080-0.102-21.094 0.205-25.19 3.379-41.472 14.95-78.131 75.571-141.312 153.19-159.642 23.245-5.53 7.168-5.222 302.080-5.222 263.373 0 274.842 0.102 284.672 1.946 48.333 9.011 88.371 39.117 110.387 83.046 6.451 13.005 11.981 29.696 13.619 40.96 0.205 1.741 0.614 4.198 1.024 5.632 1.331 5.939 1.229 34.509-0.205 44.032-5.734 36.659-23.142 68.403-51.507 93.594l-4.506 3.994 1.126 4.71c1.229 4.813 2.867 15.974 4.096 27.75 1.229 11.059 0.717 48.947-0.717 59.904-6.349 48.742-22.938 91.546-50.586 130.458-6.963 9.728-7.373 10.24-17.51 21.914-44.237 50.893-105.984 83.968-174.182 93.491-10.445 1.434-55.808 3.072-57.037 1.946zM476.672 575.59c5.325-2.253 15.155-12.493 31.846-33.485 24.064-30.003 28.979-38.4 27.648-47.309-1.024-6.656-5.222-12.595-19.866-27.443-7.168-7.373-13.414-14.438-13.824-15.565-1.741-4.506 0-13.926 4.198-22.528 7.885-16.486 22.323-34.202 50.79-62.669 30.208-30.208 51.302-46.797 67.379-53.146 6.656-2.56 14.541-3.379 18.33-1.843 1.024 0.41 7.885 6.656 15.36 13.926 15.565 15.053 20.48 18.637 27.443 19.558 8.909 1.229 16.998-3.482 44.442-25.395 37.274-29.798 41.062-34.918 35.123-47.309-3.891-7.885-41.779-45.67-49.357-49.254-18.637-8.806-51.302-3.994-88.474 12.8-67.994 30.822-138.547 95.334-183.501 167.834-1.946 3.174-2.662 4.506-9.318 16.589-18.33 33.587-28.365 72.294-24.371 93.696 2.048 10.957 4.915 15.053 23.962 34.304 27.853 28.262 32.461 31.232 42.189 27.238z" />
+<glyph unicode="&#xea8a;" glyph-name="office" d="M512 832v-51.2h-51.2v-25.6h-179.2v-256.102l-51.2-51.2v-409.498h-25.6v-25.6h588.8v25.6h-25.6v204.8l-51.2 51.2v460.8h-51.2v25.6h-51.2v51.2h-25.6v-51.2h-51.2v102.4h-25.6v-51.2zM408.576 665.6v-38.4h-75.776v76.8h75.776v-38.4zM537.6 696.832c0.102-3.891 0.102-14.746 0.102-24.064s0-23.347-0.102-31.232v-14.336h-76.8v76.8h76.8v-7.168zM665.6 665.6v-38.4h-76.8v76.8h76.8v-38.4zM409.6 537.6v-38.4h-75.776v76.8h75.776v-38.4zM537.6 537.6v-38.4h-76.8v76.8h76.8v-38.4zM665.907 546.509c-0.102-16.179-0.205-33.382-0.307-38.298v-9.011h-76.8v76.8h77.312l-0.205-29.491zM409.6 409.6v-38.4h-76.8v76.8h76.8v-38.4zM537.6 409.6v-38.4h-76.8v76.8h76.8v-38.4zM665.6 409.6v-38.4h-76.8v76.8h76.8v-38.4zM409.6 281.6v-38.4h-76.8v76.8h76.8v-38.4zM537.6 281.6v-38.4h-76.8v76.8h76.8v-38.4zM665.6 281.6v-38.4h-76.8v76.8h76.8v-38.4zM409.6 153.6v-38.4h-76.8v76.8h76.8v-38.4zM537.6 153.6v-38.4h-76.8v76.8h76.8v-38.4zM665.6 153.6v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xea8b;" glyph-name="oil-and-gas" d="M665.498 856.371c-0.41-4.915-1.024-9.523-1.946-16.179-0.614-4.198-1.229-9.933-1.536-12.8-0.512-5.53-1.434-13.824-2.048-17.92-0.205-1.434-1.331-10.854-2.56-20.992-1.126-10.138-3.072-26.010-4.096-35.328-1.126-9.318-2.253-18.739-2.56-20.992-0.205-2.253-1.126-10.342-2.048-17.92-0.819-7.578-1.741-15.155-2.048-16.896-0.205-1.638-1.638-13.619-3.072-26.624-1.434-12.902-2.867-24.678-3.072-26.112s-1.126-9.216-2.048-17.408c-0.819-8.192-2.253-20.173-3.072-26.624s-1.946-15.872-2.458-20.992c-0.922-7.987-1.741-15.053-4.813-40.448-0.307-2.56-0.717-6.246-0.922-8.192s-0.922-7.27-1.434-11.776c-0.614-4.506-2.048-16.691-3.174-27.136-1.229-10.445-2.355-20.582-2.56-22.528-0.307-1.946-1.331-11.674-2.56-21.504-1.126-9.83-2.355-19.661-2.662-21.709l-0.614-3.891h-50.995v80.794c0 86.221-0.205 89.805-5.222 104.858-9.523 28.672-31.949 52.224-60.006 63.283-13.005 5.12-21.606 6.554-38.707 6.451-12.186 0-15.872-0.512-24.371-2.765-18.125-4.915-33.178-13.722-46.285-26.829-15.462-15.565-26.419-36.659-28.774-55.603-0.41-3.174-0.819-6.554-1.024-7.373-0.102-0.819-0.307-3.277-0.307-5.325l-0.102-3.891h-51.2v-51.2h-51.2v-128h563.2v25.6h-25.395l-0.614 3.891c-0.614 3.584-0.819 5.632-2.15 18.125-0.307 2.867-0.819 6.758-1.024 8.704-0.614 4.813-3.174 26.112-5.632 48.128-1.126 9.83-2.56 21.402-3.072 25.6-0.614 4.198-1.229 10.24-1.536 13.312s-1.434 12.8-2.56 21.504c-1.024 8.704-2.253 18.432-2.56 21.504s-1.536 13.21-2.662 22.528c-1.024 9.318-2.867 24.986-3.994 34.816s-2.765 23.654-3.584 30.72c-0.922 7.066-1.741 14.541-2.048 16.589-0.205 2.15-1.126 9.728-2.048 16.896-0.819 7.168-1.741 15.462-2.048 18.227-0.307 2.867-0.819 6.758-1.024 8.704-0.614 4.813-4.096 34.509-7.168 61.44-1.434 12.083-2.765 23.45-3.072 25.088-0.205 1.741-0.717 5.632-1.024 8.704s-0.717 7.066-1.024 8.704c-0.41 3.072-1.536 12.083-1.946 16.896-0.205 1.434-0.41 3.174-0.41 3.891-0.205 0.922-8.704 1.229-38.605 1.229-30.003 0-38.4-0.307-38.502-1.229zM719.974 830.259c0-1.024 0.205-2.765 0.41-3.891 0.41-1.946 1.229-7.987 2.048-15.36 1.126-9.728 1.741-15.565 3.072-26.112 0.819-6.451 1.741-14.336 2.048-17.408s1.024-8.602 1.536-12.288c0.512-3.686 1.229-8.909 1.434-11.776 0.512-5.018 3.277-28.57 4.096-34.816 0.307-1.638 0.717-5.837 1.126-9.216 0.717-6.246 0.819-7.475 2.048-16.077l0.717-4.915h-69.018l0.717 4.915c0.922 7.27 1.331 10.752 3.072 25.293 2.867 24.269 4.71 38.912 5.12 42.189 0.307 1.741 0.922 7.475 1.536 12.8 0.614 5.222 2.662 22.528 4.608 38.502s3.584 29.184 3.584 29.389c0 0.307 7.168 0.512 15.872 0.512 14.438 0 15.872-0.205 15.974-1.741zM739.635 651.571c-1.331-1.638-27.853-39.731-37.069-53.043-6.758-9.933-15.667-22.63-19.558-28.16-1.229-1.638-4.403-6.246-7.168-10.24-17.306-24.781-23.552-33.587-24.166-34.202-0.41-0.307-0.41 1.024-0.102 2.97 0.41 1.946 1.638 10.957 2.765 19.968s2.253 18.022 2.56 19.968c0.307 1.946 1.638 12.8 3.072 24.064 5.632 44.442 6.656 52.326 7.27 56.115l0.614 3.789h36.352c28.979 0 36.147-0.307 35.43-1.229zM747.11 602.317c1.229-10.752 6.042-53.146 7.066-61.133 0.205-1.946 0.922-8.192 1.536-13.824 1.843-16.486 1.946-17.613 4.096-35.738 1.126-9.523 1.946-17.408 1.741-17.613-0.205-0.307-26.214-0.307-57.754-0.205l-57.344 0.307 14.746 20.992c8.090 11.571 17.203 24.678 20.378 29.184 3.072 4.506 9.421 13.619 14.029 20.173 15.258 21.811 40.038 57.344 44.646 64 2.458 3.584 4.71 6.246 5.018 5.939s1.126-5.734 1.843-12.083zM765.747 440.115c0.614-4.403 1.331-10.138 1.638-12.8l0.614-4.915h-128.102l0.512 3.379c0.307 1.741 0.819 6.246 1.229 9.933s0.819 7.373 1.024 8.192c0.102 0.819 0.307 2.15 0.307 2.867 0.102 0.922 13.005 1.229 60.928 1.229h60.826l1.024-7.885zM256 332.8v-38.4h563.2v76.8h-563.2v-38.4zM358.4 140.8v-128h76.8v256h-76.8v-128zM640 140.8v-128h76.8v256h-76.8v-128z" />
+<glyph unicode="&#xea8c;" glyph-name="On_board_unit" d="M115.405 753.664c-18.944-5.222-34.099-21.299-37.478-39.834-1.638-8.704-1.536-550.298 0-557.875 3.891-18.637 18.944-34.202 37.888-39.219 8.294-2.253 784.077-2.253 792.371 0 19.251 5.12 34.509 21.094 37.888 39.834 1.638 8.806 1.536 550.298 0 557.875-3.994 18.842-18.842 34.202-37.888 39.219-7.987 2.15-785.101 2.15-792.781 0zM870.4 435.2v-243.2h-716.8v486.4h716.8v-243.2zM332.8 601.6v-25.6h-102.4v-128h51.2v76.8h51.2l0.205-25.395 0.307-25.395 50.176 37.581c27.546 20.685 50.278 37.99 50.483 38.605 0.102 0.512-22.528 18.022-50.483 39.014l-50.688 37.99v-25.6zM504.73 468.173c-7.578-5.939-11.571-9.011-50.586-39.014-15.155-11.776-30.822-23.757-34.816-26.829-3.891-3.072-13.005-10.035-20.070-15.462-7.168-5.53-22.63-17.408-34.304-26.419-26.010-19.968-38.195-29.389-44.954-34.611-2.765-2.15-7.68-5.837-10.752-8.192-3.072-2.253-7.987-6.042-10.854-8.294-2.867-2.355-6.758-5.325-8.602-6.758-3.686-2.765-60.109-46.080-70.246-53.965-3.482-2.765-13.824-10.65-23.040-17.715l-16.589-12.8 165.99-0.307c91.341-0.102 240.845-0.102 332.186 0l166.195 0.307-30.003 23.040c-16.589 12.698-35.942 27.546-43.008 33.075-24.064 18.432-35.43 27.238-52.634 40.346-9.318 7.27-20.685 15.872-25.088 19.354-4.403 3.379-18.125 13.926-30.515 23.45s-28.979 22.323-36.864 28.365c-7.885 6.144-18.432 14.234-23.552 18.125-5.018 3.891-16.896 13.005-26.317 20.275-9.318 7.168-23.347 17.92-31.027 23.859s-18.33 14.131-23.552 18.227c-5.222 3.994-9.626 7.373-9.83 7.27-0.205 0-3.482-2.458-7.168-5.325zM525.312 435.2v-12.8h-26.624v25.6h26.624v-12.8zM525.312 371.2v-25.6h-26.624v51.2h26.624v-25.6zM525.312 268.8v-25.6h-26.624v51.2h26.624v-25.6z" />
+<glyph unicode="&#xea8d;" glyph-name="online_help" d="M166.605 753.664c-18.637-5.12-33.69-20.787-37.478-39.219-0.819-3.891-1.126-75.674-1.126-251.085v-245.76h768v245.76c0 175.411-0.307 247.194-1.126 251.085-4.096 19.558-20.89 36.045-40.448 39.629-4.198 0.819-105.984 1.126-344.371 1.024-278.221-0.102-339.456-0.307-343.45-1.434zM844.8 486.4v-217.6h-665.6v435.2h665.6v-217.6zM495.718 650.65c-10.547-2.048-20.787-10.24-25.6-20.378-2.253-4.813-2.662-7.066-2.662-14.848 0-7.885 0.41-10.035 2.765-15.155 5.427-11.469 16.998-19.661 29.491-20.582 15.053-1.126 28.365 6.451 35.635 20.275 2.355 4.608 2.662 6.451 2.765 14.95 0 8.397-0.41 10.547-2.662 15.36-4.198 9.114-15.053 18.227-23.45 19.866-5.734 1.126-11.981 1.331-16.282 0.512zM448.102 537.19c0.102-3.277 0.41-6.451 0.717-6.963s2.765-1.024 5.53-1.126c2.662-0.205 6.963-1.331 9.523-2.56 3.789-1.946 4.915-3.277 6.554-7.475 1.946-4.813 2.048-7.885 2.15-74.65 0-76.902 0-77.414-6.042-81.818-4.198-3.072-6.144-3.789-12.8-4.608l-5.53-0.614v-4.608c0.102-2.56 0.102-5.222 0.205-5.837 0.102-1.024 12.288-1.331 57.446-1.331h57.344v11.981l-6.144 0.614c-8.397 0.717-13.312 3.379-15.872 8.397-1.946 3.994-2.048 6.451-2.355 90.419l-0.307 86.221h-90.522l0.102-6.042zM76.8 164.557c0-22.938 0.307-28.365 1.741-32.461 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.816-1.638h414.106l5.734 2.765c3.072 1.536 6.963 4.403 8.602 6.349 5.53 6.758 6.042 10.138 6.042 40.243v27.443h-358.195l-0.614-3.789c-1.434-8.397-6.554-15.155-14.95-19.866-2.048-1.126-13.107-1.536-59.29-1.741-64.614-0.307-63.488-0.41-71.373 7.578-3.994 4.198-7.578 11.571-7.578 15.974 0 1.741-6.554 1.843-179.2 1.843h-179.2v-27.443z" />
+<glyph unicode="&#xea8e;" glyph-name="orangewallet" d="M166.4 754.483c-13.824-1.741-27.648-6.656-41.165-14.848-19.763-11.878-36.864-33.792-43.725-56.115-4.608-14.95-4.506-8.192-4.506-248.832-0.102-219.443 0-228.147 1.843-237.056 8.192-39.117 36.762-69.018 75.878-79.565l8.602-2.355 732.672-0.512v178.893l-8.397 0.717c-35.021 2.867-65.434 23.245-82.432 54.989-13.414 24.883-15.053 57.344-4.198 84.89 12.288 31.027 40.243 54.886 72.499 61.85 9.626 2.048 12.698 2.458 18.227 2.56l4.301 0.102v179.2h-76.8v76.8l-324.813-0.102c-178.688-0.102-326.246-0.41-327.987-0.614zM793.6 704v-25.6h-296.243c-332.493 0-302.080-0.717-310.477 7.68-13.21 13.107-8.499 34.611 9.011 41.677 3.994 1.638 24.474 1.741 301.056 1.741l296.653 0.102v-25.6zM509.338 574.566c5.018-2.048 9.011-7.68 16.589-23.040 19.558-39.936 31.949-79.77 35.738-115.814 0.41-3.686 0.922-7.578 1.229-8.704 0.922-3.482 1.126-50.79 0.307-57.856-0.512-3.686-1.126-9.421-1.536-12.8-3.891-35.533-16.998-77.005-35.84-114.074-12.493-24.474-18.432-28.57-31.334-21.811-7.066 3.686-10.138 8.090-10.138 14.643 0 5.837 1.638 10.957 7.578 23.757 15.667 33.69 26.522 69.222 29.798 97.894 0.41 3.072 0.819 6.246 1.024 7.168 1.536 8.294 2.15 39.526 1.024 53.862-0.512 7.475-2.56 24.576-3.174 27.546-0.307 1.126-0.922 4.71-1.434 7.782-3.379 19.661-13.107 49.869-23.245 72.704-12.8 28.467-13.312 30.515-10.957 37.376 1.741 5.12 4.096 7.578 10.138 10.342 5.837 2.765 9.421 3.072 14.234 1.024zM442.982 537.6c10.24-6.656 27.034-42.803 35.635-76.902 2.253-8.909 5.632-29.184 6.451-39.322 1.434-17.306 0.717-48.23-1.331-61.952-4.71-32.154-12.902-57.139-28.467-87.45-4.71-9.318-12.083-16.896-17.203-17.92-9.523-1.741-22.323 7.987-22.323 16.998 0 3.891 2.97 13.005 6.656 20.275 10.035 20.070 19.354 48.128 22.528 68.608 0.41 2.56 0.922 5.53 1.229 6.656 0.819 3.891 1.741 20.48 1.741 31.232 0.102 31.846-7.066 63.693-21.094 94.72-9.523 20.992-10.342 23.245-10.445 29.286-0.102 7.27 3.072 11.776 10.854 15.77 5.837 2.867 11.366 2.867 15.77 0zM373.658 503.398c4.403-2.355 7.373-5.939 13.005-15.974 11.059-19.661 19.251-43.93 21.504-63.181 0.307-2.97 0.922-7.987 1.331-11.059 1.536-12.698 0.307-34.304-3.072-52.429-5.018-27.238-20.787-62.157-31.334-69.427-4.71-3.174-11.162-3.072-16.998 0.307-5.325 3.174-7.373 5.325-9.216 9.933-2.253 5.53-1.126 10.65 5.325 24.576 7.373 15.667 9.626 21.709 12.8 34.509 3.482 14.029 3.789 16.282 4.198 33.075 0.512 18.842-1.331 31.539-7.168 50.074-2.56 8.090-4.71 13.21-11.981 28.774-4.608 9.83-5.222 12.493-3.891 17.408 1.434 5.427 5.632 10.035 11.264 12.698 6.246 2.867 9.523 3.072 14.234 0.717zM311.194 467.354c4.506-3.277 11.776-13.107 15.974-21.402 12.186-24.474 14.029-51.712 5.53-82.637-4.813-17.613-15.258-33.894-24.678-38.81-4.506-2.355-11.264-1.434-16.486 2.253-5.837 4.198-8.090 7.68-8.602 13.414-0.512 4.506 0 6.042 4.608 14.848 9.318 17.92 12.595 30.208 12.083 44.851-0.41 11.264-3.072 20.48-10.138 34.304-5.325 10.547-6.246 13.107-6.246 18.125-0.102 4.915 0.307 6.246 3.072 9.626 6.861 8.602 17.51 10.854 24.883 5.427zM880.128 471.859c-42.598-9.114-69.325-52.224-58.368-94.413 7.168-27.546 29.594-49.254 57.446-55.398 7.168-1.536 13.005-2.048 27.648-2.048 21.811 0 26.010 1.024 32.768 7.782 7.578 7.578 7.578 7.373 7.578 69.939-0.102 42.598-0.41 55.706-1.434 58.675-2.15 6.042-7.373 11.776-13.414 14.541-5.325 2.56-6.144 2.662-25.293 2.56-13.414 0-22.118-0.512-26.931-1.638z" />
+<glyph unicode="&#xea8f;" glyph-name="orange_assistant" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM472.986 802.816c10.342-5.734 16.179-16.384 15.053-27.546-0.922-9.216-3.789-14.029-13.312-22.426-17.306-15.155-25.498-33.28-23.859-53.35 4.096-51.302 65.638-75.264 103.014-40.038 11.878 11.162 18.125 24.781 19.149 41.472 1.229 18.125-6.861 37.683-20.173 48.64-16.282 13.414-20.48 23.757-15.258 37.581 2.662 7.168 6.758 11.981 13.414 15.667l5.53 3.072 160.256 0.614v-691.302l-160.256 0.512-5.53 3.072c-17.818 9.83-20.48 33.178-5.427 46.694 15.462 13.722 19.763 19.558 24.576 32.87 3.686 10.138 3.891 26.317 0.512 37.171-7.782 24.678-29.286 41.472-55.194 43.213-24.166 1.638-47.923-12.39-58.573-34.509-5.12-10.752-6.758-19.149-5.939-30.822 1.331-17.715 7.27-29.286 22.63-43.52 9.011-8.397 11.059-10.752 12.902-15.667 4.198-11.162 0.614-24.883-8.499-32.051-8.602-6.861-2.765-6.451-90.726-6.758l-80.077-0.307 0.205 150.835 0.307 150.835 3.174 5.632c7.68 13.619 23.757 18.842 37.786 12.186 3.174-1.536 7.066-4.813 11.571-10.138 3.789-4.301 9.216-9.626 11.981-11.776 20.070-15.258 47.821-16.794 68.915-3.789 14.848 9.114 23.552 21.094 27.955 37.888 8.499 32.87-13.414 67.379-47.206 74.547-20.582 4.403-41.984-2.355-56.218-17.715-3.584-3.789-8.192-8.704-10.138-10.752-5.222-5.53-13.21-8.397-21.504-7.578-11.162 1.126-18.637 6.144-24.064 16.384l-2.253 4.198-0.307 150.323-0.205 150.221 160.256-0.512 5.53-3.072zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56z" />
+<glyph unicode="&#xea90;" glyph-name="orange_cash" d="M115.405 881.664c-12.595-3.482-24.678-12.493-31.334-23.45-1.843-3.072-4.301-9.011-5.325-13.107-1.946-7.168-1.946-17.92-1.946-397.517 0-334.643 0.205-391.066 1.536-395.776 4.813-18.33 19.149-32.666 37.478-37.478 8.294-2.253 425.677-2.253 433.971 0 18.432 4.813 32.563 19.046 37.478 37.478 1.331 4.71 1.536 59.904 1.536 395.366 0 281.19-0.307 391.373-1.126 395.264-3.994 19.251-20.48 35.635-39.629 39.629-8.602 1.843-426.086 1.434-432.64-0.41zM377.549 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM537.6 460.8v-345.6h-409.6v691.2h409.6v-345.6zM340.378 88.166c6.349-1.946 11.264-5.734 14.643-11.674 2.458-4.096 2.867-5.939 2.867-12.493s-0.41-8.397-2.765-12.39c-5.325-9.011-14.541-13.824-24.678-12.8-7.066 0.717-10.957 2.56-16.077 7.782-9.523 9.728-9.318 25.6 0.512 35.328 6.963 6.963 15.872 9.114 25.498 6.246zM337.101 599.962c-46.387-6.656-78.95-39.936-92.365-94.31l-1.126-4.403h-10.752c-14.95 0-20.378-2.56-25.293-11.776-1.638-3.072-2.15-5.939-2.253-11.366 0-6.246 0.41-7.885 3.072-12.186 4.506-7.27 9.728-9.626 21.299-9.728h8.909v-22.323l-10.035-0.41c-9.011-0.307-10.547-0.614-14.336-3.174-5.12-3.379-8.397-9.318-9.114-16.691-0.717-7.066 2.867-15.053 8.602-18.842 3.482-2.253 5.222-2.56 15.974-2.867l11.981-0.41 0.614-2.765c7.987-36.25 30.72-67.891 59.29-82.227 15.667-7.987 30.618-11.162 53.76-11.571 18.227-0.41 28.877 0.717 41.677 3.994 26.317 6.861 46.694 24.371 59.699 51.2 5.734 11.878 5.222 19.661-1.843 27.443-10.65 11.776-28.467 12.39-38.4 1.331-1.024-1.126-3.277-5.018-5.018-8.704-10.957-23.245-23.962-30.925-52.531-30.925-29.389 0.102-49.050 9.83-61.133 30.618-2.97 5.018-9.011 19.354-9.011 21.402 0 0.205 20.582 0.41 45.875 0.41 28.57 0 47.206 0.41 49.562 1.126 15.667 4.301 17.51 31.539 2.56 38.707-4.301 2.048-5.734 2.15-53.248 2.15h-48.845v22.528h56.934c40.448 0 58.163 0.307 61.030 1.229 4.915 1.434 11.571 8.397 13.005 13.722 3.379 12.083-2.253 24.986-12.493 28.774-2.355 0.819-18.842 1.229-57.856 1.229l-54.579 0.102 0.614 2.355c2.15 7.066 7.885 19.558 11.469 24.883 13.005 19.046 29.286 27.853 53.043 28.467 29.184 0.819 43.315-7.475 55.296-32.358 3.994-8.397 6.451-11.469 11.776-15.155 4.915-3.482 16.896-3.584 23.040-0.307 9.626 5.222 13.21 11.059 13.21 21.299 0 6.144-0.512 8.294-3.686 15.155-13.722 29.082-35.021 45.978-66.765 53.146-11.776 2.662-37.683 3.277-51.61 1.229zM871.322 651.366c-9.626-3.379-14.746-8.909-15.565-16.691-0.717-6.144 1.024-11.878 9.421-30.31 21.402-47.206 31.642-84.48 35.533-129.229 1.434-16.179 0.819-54.784-1.126-66.048-0.205-1.434-0.922-6.246-1.536-10.752-4.608-32.666-16.589-71.987-32.256-105.472-9.421-20.070-11.366-26.829-9.523-33.997 2.56-10.65 18.33-18.637 27.955-14.131 5.632 2.765 10.65 9.83 20.173 28.877 23.245 46.387 36.454 91.034 41.165 139.571 1.331 13.722 1.434 55.501 0.205 68.096-4.301 41.882-15.36 83.661-32.358 122.47-6.963 15.77-18.33 37.888-21.299 41.37-5.837 7.066-12.8 9.114-20.787 6.246zM794.726 610.714c-7.168-2.15-14.848-8.602-15.974-13.619-1.946-8.192-1.126-11.776 7.373-30.31 10.957-24.371 14.746-34.816 20.275-56.013 5.734-21.811 7.987-40.141 7.885-63.795 0-38.502-8.909-75.981-27.034-114.688-7.27-15.565-9.114-20.685-9.318-27.034-0.205-4.71 0.307-6.246 2.867-9.933 3.277-4.608 11.264-9.728 16.691-10.445 10.752-1.638 17.203 4.608 29.286 28.57 16.691 33.382 26.931 69.734 30.003 106.906 1.434 17.51 0.819 54.886-1.126 66.56-0.307 1.434-1.229 7.27-2.048 13.005-2.765 17.818-8.909 40.243-16.384 59.494-3.891 10.138-15.667 34.304-19.251 39.526-7.168 10.547-14.643 14.234-23.245 11.776zM716.288 570.675c-4.915-1.741-11.776-6.861-13.824-10.342-4.403-7.27-3.482-15.36 3.174-27.955 5.018-9.318 13.005-30.31 15.77-41.062 5.632-22.426 7.066-44.851 4.096-65.331-3.072-22.016-7.987-37.581-19.251-60.928-3.072-6.451-5.939-13.722-6.349-16.077-1.331-8.499 3.072-16.486 11.571-21.094 15.872-8.602 25.6-0.922 40.55 32.051 12.493 27.443 18.022 52.941 18.534 84.992 0.512 27.341-2.253 46.182-9.83 69.12-4.198 12.595-4.608 13.722-11.264 27.648-12.186 25.6-20.992 33.28-33.178 28.979zM642.867 531.456c-5.939-1.434-12.595-6.758-15.258-12.083-3.584-6.861-2.458-13.619 4.096-25.293 10.957-19.558 15.155-39.322 12.39-57.651-1.741-10.957-5.018-20.070-12.39-34.304-5.325-10.24-6.042-12.288-6.042-17.408 0.102-4.71 0.614-6.656 2.867-9.933 5.734-8.294 15.667-12.698 23.552-10.342 12.083 3.584 26.931 27.648 32.358 52.531 8.499 38.605 3.072 73.421-15.258 99.123-9.318 13.107-17.203 17.715-26.317 15.36z" />
+<glyph unicode="&#xea91;" glyph-name="orange_corporate" d="M451.482 882.79c-0.205-0.205-5.12-0.717-10.854-1.024-5.734-0.41-11.469-0.922-12.8-1.126s-7.68-1.126-14.131-2.048c-19.149-2.765-36.25-6.656-58.368-13.517-131.482-40.653-234.086-149.504-266.752-282.931-5.427-22.323-9.011-44.134-10.547-64-0.922-13.107-0.922-50.381 0-62.976 12.083-159.334 121.344-297.37 274.227-346.624 27.955-9.011 61.030-15.565 89.6-17.715 12.39-0.922 50.79-0.922 63.488 0.102 51.917 3.994 103.526 18.739 150.528 43.11 16.179 8.294 35.533 20.173 49.050 30.003 5.018 3.686 9.626 6.758 10.24 7.066 0.614 0.205 34.406-32.87 75.059-73.626 50.893-50.893 75.776-75.059 79.667-77.414 8.294-5.018 17.306-7.27 27.955-6.861 39.526 1.331 62.259 44.442 41.267 78.029-1.638 2.662-36.25 38.195-76.902 78.848s-73.626 74.445-73.318 75.059c0.41 0.614 4.403 6.246 8.909 12.595 15.462 21.504 31.027 49.562 41.779 75.162 14.541 34.816 23.142 67.891 28.365 108.954 2.56 20.070 2.56 74.957 0 88.678-0.205 1.024-0.717 4.71-1.024 8.090-2.15 19.866-9.114 49.766-16.998 73.523-33.075 99.021-105.062 182.17-198.246 228.864-41.165 20.685-88.576 34.816-132.506 39.629-3.072 0.307-7.475 0.819-9.728 1.126-5.325 0.614-57.344 1.536-57.958 1.024zM506.88 804.864c20.582-2.662 38.605-6.144 54.886-10.854 104.448-29.901 188.006-112.538 218.419-216.064 4.096-14.234 6.758-25.088 7.885-32.154 0.307-2.253 0.922-5.939 1.434-8.192s1.126-7.066 1.536-10.752c0.307-3.686 1.024-10.342 1.536-14.848 1.229-11.981 0.922-44.134-0.614-58.368-10.342-96.563-62.157-181.555-142.746-234.598-43.418-28.467-89.19-44.851-143.36-50.995-12.595-1.434-53.76-1.536-66.048-0.102-75.162 8.806-142.234 41.267-193.741 93.798-25.907 26.522-42.701 49.869-58.675 81.818-17.101 33.997-25.907 63.795-31.846 107.008-1.434 10.24-1.843 51.61-0.717 64.614 10.854 120.013 89.498 224.973 201.523 269.005 22.835 8.909 51.2 16.486 70.144 18.637 3.379 0.41 6.349 0.922 6.656 1.024 0.41 0.205 5.018 0.717 10.24 1.024 5.325 0.41 9.933 0.922 10.138 1.126 0.614 0.614 47.821-0.41 53.35-1.126zM271.872 651.776c-14.746-2.765-29.389-13.824-35.84-27.034-5.837-11.981-5.632-4.301-5.632-160.563v-143.974l6.246-8.602c9.216-12.39 21.914-26.726 33.894-38.298l10.547-10.035 0.307 156.365 0.205 156.365h384l0.205-156.365 0.307-156.262 11.469 10.957c11.981 11.469 21.094 21.811 32.461 36.659l6.758 9.011v143.258c0 100.762-0.307 144.998-1.126 148.787-3.891 18.637-18.944 34.202-37.888 39.219-4.71 1.331-35.226 1.536-203.674 1.434-108.954-0.102-199.987-0.512-202.24-0.922zM517.632 625.562c3.994-1.843 7.782-8.499 7.066-12.39-0.922-4.71-3.277-8.192-6.963-9.933-3.072-1.434-8.602-1.638-44.134-1.638-46.182 0-46.387 0-49.664 7.475-2.867 6.451-0.614 13.517 5.325 16.384 2.97 1.434 8.602 1.741 44.134 1.741 35.226 0 41.37-0.205 44.237-1.638zM332.8 442.88v-15.36h276.48v30.72h-276.48v-15.36zM332.8 381.44v-15.36h245.76v30.72h-245.76v-15.36zM332.8 320v-15.36h215.040v30.72h-215.040v-15.36z" />
+<glyph unicode="&#xea92;" glyph-name="Orange_Detente" d="M114.074 864.051c-5.53-7.782-10.854-15.36-11.776-16.794l-1.843-2.662 18.637-13.21c10.24-7.27 19.968-14.131 21.709-15.36 1.741-1.126 16.179-11.264 32.256-22.528s44.851-31.539 64-44.954c19.149-13.414 37.171-26.112 40.038-28.262 14.541-10.752 18.227-21.402 21.402-62.362 0.307-4.198 0.819-9.728 1.024-12.288s0.922-10.547 1.536-17.92c0.614-7.27 1.229-15.565 1.536-18.432 0.307-2.765 1.434-16.179 2.56-29.696 2.662-31.539 3.072-35.84 3.584-41.472 0.205-2.56 0.717-8.090 1.024-12.288 0.614-7.68 1.229-15.872 2.048-24.576 0.307-2.56 0.922-10.342 1.536-17.408 1.434-16.691 2.048-23.962 2.56-30.208 0.307-2.765 0.717-8.294 1.024-12.288 0.307-3.891 0.819-9.216 1.024-11.776 0.307-2.56 0.717-7.782 1.024-11.776 0.307-3.891 0.717-9.421 1.024-12.288 0.717-9.011 1.638-19.354 2.048-23.552 0.205-2.253 0.717-7.27 1.024-11.264 0.819-10.342 1.536-18.637 2.048-25.088 0.307-3.072 0.717-8.806 1.024-12.8 0.717-9.216 1.536-18.739 2.048-22.016 0.205-1.434 0.614-6.656 1.024-11.776 0.307-5.018 0.819-11.059 1.024-13.312s0.717-7.066 1.024-10.752c0.307-3.686 0.922-11.674 1.434-17.92 0.614-6.144 1.331-15.155 1.741-19.968 0.307-4.813 0.819-9.421 0.922-10.445 0.205-0.922 0.717-6.861 1.024-13.312 0.41-6.349 0.922-11.776 1.024-12.083 0.205-0.307 0.614-5.53 1.024-11.776 0.307-6.144 0.819-11.981 1.024-12.8s0.717-5.427 1.024-10.24c0.307-4.813 0.717-10.342 1.024-12.288 0.205-1.946 0.614-7.27 1.024-11.776 0.307-4.506 0.819-10.24 1.024-12.8 0.41-4.506 1.024-11.366 2.048-24.064 0.307-3.379 0.819-8.704 1.024-11.776 0.307-3.072 0.819-8.806 1.126-12.595 0.307-3.891 0.717-8.294 0.819-9.728 0.205-1.536 0.717-7.168 1.126-12.493 0.307-5.325 0.819-10.854 1.024-12.288s0.717-6.758 1.024-11.981c0.41-5.12 0.819-10.24 1.024-11.264s0.41-3.072 0.41-4.608l0.102-2.867h306.995l0.717 6.451c0.307 3.482 0.819 7.987 1.024 9.933s0.717 7.27 1.024 11.776c0.41 4.506 0.819 10.752 1.126 13.824 0.819 9.523 1.229 14.541 1.946 22.528 0.614 7.27 0.819 10.342 2.048 22.323 0.205 2.662 0.717 8.499 1.024 13.005s0.819 9.626 1.024 11.264c0.205 1.741 0.717 6.758 1.024 11.264 0.717 9.933 1.434 17.92 2.048 24.064 0.307 2.56 0.717 7.885 1.024 11.776 0.307 3.994 0.819 9.216 1.024 11.776 0.307 2.56 0.717 7.578 1.024 11.264 0.614 8.294 1.434 17.51 2.048 23.552 0.307 2.56 0.717 8.090 1.024 12.288s0.717 9.318 1.024 11.264c0.41 3.277 0.717 7.27 2.048 24.064 0.307 3.379 0.717 8.192 1.024 10.752s0.717 8.090 1.024 12.288c0.41 4.198 0.819 9.318 1.024 11.264s0.717 7.782 1.024 12.8c0.41 5.12 0.819 10.342 1.024 11.776s0.717 6.042 1.024 10.24c0.307 4.198 0.819 9.728 1.024 12.288s0.717 8.090 1.024 12.288c0.307 4.198 0.819 9.318 1.024 11.264s0.717 7.066 1.024 11.264c0.307 4.198 0.717 9.728 1.024 12.288 0.819 7.885 2.56 27.853 3.072 35.328 0.307 3.994 0.717 8.806 0.922 10.752 0.307 1.946 0.819 7.27 1.126 11.776 0.41 4.506 0.819 10.035 1.024 12.288s0.717 7.578 1.024 11.776c0.307 4.198 0.819 9.318 1.024 11.264s0.717 7.066 1.024 11.264c0.307 4.198 0.819 9.728 1.024 12.288s0.717 8.090 1.126 12.288c0.41 4.198 0.819 9.114 0.922 10.752 0.205 1.741 0.614 7.475 1.024 12.8s0.819 10.854 1.126 12.288c0.205 1.434 0.717 7.168 1.024 12.8s0.819 10.547 1.024 10.854c0.205 0.307 0.614 6.144 1.024 12.8 0.614 11.981 0.512 12.288-2.355 17.818-3.174 6.246-9.421 11.571-15.462 13.312-2.56 0.614-61.030 1.024-177.562 1.024-164.864 0-173.875 0.102-173.978 1.843 0 0.922-0.205 2.867-0.41 4.301-0.307 2.867-1.024 11.162-2.56 29.184-0.512 6.758-1.331 15.258-1.638 18.944-0.614 7.168-3.686 21.299-6.144 28.672-3.994 11.674-14.029 26.931-22.938 34.611-3.379 2.97-58.88 42.496-82.432 58.675-3.891 2.662-18.842 13.107-32.973 23.142-14.234 10.035-32.87 23.142-41.472 29.184-8.602 5.939-18.33 12.8-21.504 15.053l-5.837 4.198-9.933-14.029zM685.67 597.811c-1.638-16.486-2.253-23.757-3.174-34.611-0.307-4.506-0.819-10.035-1.024-12.288s-0.717-7.782-1.024-12.288c-0.307-4.506-0.819-9.83-1.024-11.776s-0.717-7.066-1.024-11.264c-0.819-10.342-1.638-17.818-2.15-18.534-0.717-1.229-13.21-6.861-22.426-10.138-14.131-4.915-29.901-7.27-49.152-7.27-9.011 0-17.51 0.205-18.944 0.512-1.434 0.205-4.813 0.717-7.578 1.126-17.92 2.253-37.171 9.83-61.030 23.962-9.421 5.53-23.859 12.39-32.563 15.462-22.733 7.885-60.826 9.421-88.269 3.482-4.198-0.922-8.192-2.048-8.806-2.56-0.717-0.614-0.819-2.867-0.307-6.758 0.41-3.277 1.024-9.83 1.434-14.643s0.819-10.035 1.024-11.776c0.205-1.638 0.614-6.758 1.024-11.264 0.307-4.506 0.819-10.035 1.024-12.288s0.717-7.27 1.024-11.264c0.41-3.891 0.819-8.499 1.024-10.24 0.205-1.638 0.717-6.758 1.024-11.264 0.614-8.294 1.229-15.155 2.048-22.528 0.205-2.253 0.717-7.27 1.024-11.264 0.307-3.891 0.717-9.011 1.024-11.264 0.205-2.253 0.717-7.782 1.024-12.288 0.41-4.506 0.819-9.216 1.024-10.445s0.614-6.246 1.024-11.264c0.307-4.915 0.819-10.65 1.024-12.595s0.717-6.758 1.024-10.752c0.307-3.891 0.819-9.011 1.024-11.264s0.717-7.27 1.024-11.264c0.307-3.891 0.819-9.011 1.024-11.264 0.819-8.499 1.536-15.565 2.048-21.197 0.307-3.277 0.717-8.397 1.024-11.264 0.307-2.97 0.717-8.192 1.024-11.571 0.512-6.144 1.229-14.336 2.048-23.040 0.41-4.198 1.741-19.354 3.072-35.328 0.307-3.379 0.819-7.987 1.024-10.24 0.512-5.018 1.946-19.968 4.198-45.568 0.205-3.072 0.614-7.885 0.922-10.752 0.41-4.915 0.614-7.27 2.048-23.552 0.41-3.891 0.819-8.499 1.024-10.24 0.205-1.638 0.614-6.246 1.024-10.24 0.307-3.891 0.819-9.114 1.126-11.469l0.512-4.403h-18.534c-14.029 0-18.432 0.307-18.534 1.331 0 0.614-0.205 1.946-0.307 2.765-0.205 0.819-0.614 5.837-1.024 10.957-0.41 5.222-0.922 10.547-1.126 11.776-0.205 1.331-0.614 6.042-1.024 10.547s-0.819 9.83-1.024 11.776c-0.205 1.946-0.614 7.27-1.024 11.674s-0.819 8.806-1.024 9.728c-0.102 0.922-0.614 6.246-1.024 11.878s-0.819 10.957-1.024 11.776c-0.102 0.819-0.614 5.222-0.922 9.728-0.41 4.506-0.922 10.24-1.126 12.8-0.307 2.56-0.717 7.373-1.024 10.752s-0.717 8.499-1.024 11.264c-0.307 2.867-0.717 7.885-1.024 11.264s-0.717 8.499-1.024 11.264c-0.307 2.867-1.434 15.77-2.662 28.672-1.126 13.005-2.253 25.19-2.458 27.136s-0.614 7.27-1.024 11.776c-0.614 8.192-1.229 13.926-2.048 21.504-0.205 2.253-0.717 7.373-1.024 11.264-1.024 11.878-1.536 18.227-2.048 22.528-0.205 2.253-0.717 7.782-1.024 12.288-0.41 4.506-0.819 9.318-1.024 10.752s-0.717 6.758-1.024 11.776c-0.41 5.12-0.819 10.342-1.024 11.776s-0.717 6.246-1.024 10.752c-0.307 4.506-0.819 9.83-1.024 11.776-0.41 3.379-1.126 10.957-2.048 21.504-0.717 7.578-1.638 17.613-2.048 22.016-0.205 2.253-0.922 10.138-1.536 17.408-0.614 7.373-1.331 15.155-1.536 17.408s-0.717 6.861-1.024 10.24c-0.307 3.379-0.819 8.499-1.024 11.264-0.307 2.867-0.717 7.885-1.024 11.264s-0.717 8.602-1.024 11.571c-0.922 9.216-1.434 15.667-2.56 28.877-0.614 7.066-1.331 14.438-1.536 16.384s-0.717 6.451-1.024 10.035l-0.614 6.349h344.371l-0.614-6.861zM688.64 826.266c-41.472-6.246-77.21-24.781-105.472-54.886-28.262-30.003-44.544-66.56-48.128-108.032l-0.614-7.475h12.8c12.698 0 12.902 0 12.902 2.355 0.307 14.336 7.066 40.243 14.848 56.525 21.606 45.261 63.488 76.902 113.152 85.504 14.643 2.56 41.779 2.355 54.784-0.41 65.434-13.824 113.254-64.205 122.88-129.638 1.843-12.288 1.331-36.25-0.922-48.64-5.734-31.334-20.378-59.085-42.803-81.101-24.986-24.678-50.79-37.683-86.835-43.725-1.434-0.307-3.789-0.512-5.222-0.512-2.662-0.102-2.765-0.307-3.379-9.011-0.41-5.018-0.922-10.854-1.229-13.005l-0.512-3.994 7.987 0.614c36.659 2.765 77.722 22.118 105.779 49.766 36.659 36.045 55.398 82.534 53.862 133.222-0.922 28.877-6.042 49.562-18.534 74.854-26.112 52.634-75.981 88.781-134.963 97.69-11.878 1.741-38.298 1.741-50.381-0.102zM690.688 780.083c-6.554-0.922-24.986-6.758-32.87-10.445-10.035-4.71-24.474-13.824-26.522-16.794s-1.946-7.782 0.307-11.059c1.946-2.867 73.421-74.65 74.342-74.65 1.229 0 0.717 105.267-0.512 107.827-0.614 1.331-2.355 3.174-3.994 4.096-2.867 1.741-4.506 1.843-10.752 1.024zM726.016 779.162c-5.222-3.789-5.018-1.638-5.12-59.085v-53.965l36.659 36.557c20.070 20.173 37.376 37.786 38.298 39.219 4.301 6.042 1.434 11.366-9.626 18.534-15.36 9.83-36.762 18.022-52.326 19.866-4.198 0.512-5.837 0.205-7.885-1.126zM609.69 731.238c-2.765-1.946-10.547-13.619-15.155-22.938-3.789-7.578-10.24-25.805-11.162-31.437-0.307-1.638-0.819-5.018-1.229-7.373-0.922-5.427 0.614-9.626 4.506-11.878 2.662-1.536 8.090-1.741 56.32-1.741h53.453l-37.171 37.171c-20.48 20.48-38.195 37.786-39.424 38.4-3.072 1.638-7.578 1.536-10.138-0.205zM807.424 731.648c-1.126-0.512-18.739-17.715-39.219-38.298l-37.171-37.478h107.622l3.277 2.97c3.072 2.765 3.379 3.482 3.174 8.602-0.614 17.408-15.565 52.531-26.829 62.976-2.56 2.355-7.066 2.867-10.854 1.229zM768.819 603.648c23.347-23.245 38.912-38.093 40.55-38.502 5.734-1.434 9.114 0.819 15.36 10.342 9.83 14.746 16.896 32.461 20.070 50.483 0.922 5.325 0.819 6.861-0.512 9.83-0.922 1.843-2.765 3.891-4.198 4.608-1.843 0.819-18.125 1.126-55.808 1.126h-53.35l37.888-37.888zM737.178 611.226c0-2.15-0.205-4.71-0.41-5.734-0.102-0.922-0.614-5.53-0.922-10.24-0.41-4.608-1.126-13.517-1.638-19.763-1.434-14.541-1.741-18.944-3.072-33.28-0.512-6.451-1.229-14.848-1.638-18.637-0.41-4.403-0.205-6.963 0.41-6.963s4.403 0.614 8.602 1.434c16.998 3.277 33.792 10.138 48.64 19.866 10.138 6.656 12.493 11.059 9.011 17.408-0.819 1.536-14.336 15.667-30.208 31.334l-28.672 28.672-0.102-4.096z" />
+<glyph unicode="&#xea93;" glyph-name="orange_events" d="M334.336 849.613c-7.987-2.97-10.957-4.813-15.667-9.523-9.83-9.83-11.469-16.179-11.469-43.622v-21.811h-179.2l0.307-326.861c0.205-310.579 0.307-327.27 2.048-332.902 8.704-28.365 29.491-48.435 57.037-54.886 8.602-2.048 12.083-2.048 358.707-2.15h349.901v323.584c0 283.955-0.205 324.608-1.536 331.162-6.758 32.768-32.666 57.037-65.536 61.44-2.253 0.307-28.365 0.512-58.061 0.614h-53.862l-0.41 23.859-0.307 23.757-3.174 6.656c-3.789 7.987-9.523 13.926-18.125 18.534-5.939 3.174-6.963 3.482-16.077 3.482-8.806 0-10.342-0.307-16.384-3.174-8.499-3.994-14.848-10.342-18.842-18.842l-3.174-6.656-0.307-23.757-0.307-23.859h-255.795l-0.307 23.859-0.307 23.757-3.174 6.656c-6.246 13.21-18.33 21.299-32.973 22.118-6.042 0.41-9.114 0-13.005-1.434zM310.886 669.184c3.994-8.499 10.445-14.848 18.842-18.842 5.837-2.765 7.782-3.174 15.872-3.174 8.192 0 9.933 0.307 15.872 3.174 8.499 4.096 14.848 10.445 18.842 18.842l3.174 6.656 1.024 61.44 6.758-6.963c11.264-11.366 16.896-24.371 17.92-41.165 2.355-37.274-29.594-69.12-67.174-66.765-16.179 1.024-30.003 7.168-41.062 18.227-25.088 24.986-25.6 65.331-1.126 89.805l6.861 6.861 1.024-61.44 3.174-6.656zM643.686 669.184c4.096-8.602 9.728-14.234 18.432-18.534 6.451-3.174 7.885-3.482 16.282-3.482 8.192 0 9.933 0.307 15.872 3.174 10.342 4.915 16.896 12.186 20.275 22.426 1.946 5.53 2.15 8.909 2.253 34.202 0 15.462 0.307 28.365 0.614 28.672 0.205 0.307 3.379-2.458 6.861-6.144 24.269-25.395 23.859-64.922-0.819-89.498-22.835-22.63-57.651-25.088-83.763-5.837-30.208 22.323-33.587 67.994-7.168 95.027l6.963 7.066 1.024-60.416 3.174-6.656zM307.2 441.856v-51.2h-102.4v102.4h102.4v-51.2zM435.2 441.856v-51.2h-102.4v102.4h102.4v-51.2zM563.2 454.758v-38.195l-6.963-6.042c-3.789-3.277-9.626-9.114-12.902-12.902l-6.042-6.963h-76.493v102.4h102.4v-38.298zM691.2 462.234c0-28.979-0.102-30.822-1.741-30.106-26.010 10.138-50.688 12.083-79.667 6.144-2.765-0.614-14.643-4.403-19.149-6.144-1.741-0.717-1.843 1.126-1.843 30.106v30.822h102.4v-30.822zM819.2 441.856v-51.2h-75.674l-13.312 13.414-13.414 13.312v75.674h102.4v-51.2zM643.789 412.467c3.789-7.168 20.685-37.683 27.546-50.074l3.482-6.246 17.203-3.277c37.786-7.168 50.381-9.83 50.381-10.342-0.102-0.614-5.222-6.349-15.667-17.408-9.933-10.445-18.944-20.070-26.010-27.648l-5.222-5.632 0.819-5.12c0.41-2.765 1.126-7.885 1.434-11.264 0.41-3.379 1.331-11.162 2.15-17.408 0.819-6.144 1.741-13.824 2.048-16.896 0.41-3.072 1.024-8.397 1.536-11.776 0.41-3.379 0.717-6.246 0.614-6.349s-25.6 11.674-56.627 26.317l-6.349 2.97-8.499-3.891c-4.71-2.15-12.39-5.837-17.203-8.090-14.131-6.554-26.829-12.595-31.744-14.848-2.56-1.229-4.915-2.355-5.325-2.56-0.307-0.205-0.512 0.922-0.307 2.56 1.331 10.138 2.765 22.016 3.174 25.907 0.307 2.56 0.717 5.53 0.922 6.758 0.205 1.126 0.717 4.608 1.024 7.68s1.024 8.806 1.536 12.698c0.512 3.994 1.024 8.602 1.229 10.342 0.307 3.584 0.512 3.277-23.859 29.082-22.733 24.064-23.552 25.088-21.606 25.395 3.891 0.717 38.605 7.373 52.122 10.035l14.643 2.765 6.246 11.366c3.482 6.246 7.373 13.21 8.602 15.462s3.174 5.734 4.301 7.68c1.126 1.946 3.994 7.168 6.349 11.469 6.554 12.083 7.782 14.131 8.397 14.131 0.307 0 1.434-1.741 2.662-3.789zM307.2 313.856v-51.2h-102.4v102.4h102.4v-51.2zM435.2 313.856v-51.2h-102.4v102.4h102.4v-51.2zM521.728 363.315c-7.168-18.33-9.011-28.672-9.011-49.459s1.946-31.13 9.011-49.357c0.717-1.741-1.126-1.843-30.106-1.843h-30.822v102.4h30.822c28.979 0 30.822-0.102 30.106-1.741zM819.2 313.856v-51.2h-30.72c-16.896 0-30.72 0.205-30.72 0.512 0 0.205 0.922 2.867 2.15 5.837 1.126 2.97 3.277 10.24 4.813 16.179 2.355 9.626 2.662 12.698 2.662 28.672 0 19.149-1.536 28.058-7.168 43.622-1.331 3.789-2.458 7.066-2.458 7.168 0 0.205 13.824 0.41 30.72 0.41h30.72v-51.2zM307.2 185.856v-51.2h-102.4v102.4h102.4v-51.2zM435.2 185.856v-51.2h-102.4v102.4h102.4v-51.2zM549.786 223.642l13.414-13.312v-75.674h-102.4v102.4h75.674l13.312-13.414zM819.2 185.856v-51.2h-102.4v75.674l13.107 13.21 13.005 13.312 76.288 0.205v-51.2zM596.582 193.434c24.371-9.114 57.139-9.728 82.33-1.434 4.813 1.638 9.523 3.174 10.547 3.584 1.638 0.717 1.741-1.126 1.741-30.106v-30.822h-102.4v30.72c0 16.896 0.205 30.72 0.41 30.72s3.482-1.229 7.373-2.662z" />
+<glyph unicode="&#xea94;" glyph-name="Orange_Experts_Class_Training" d="M509.85 895.078c-0.512-0.512-31.744-11.674-44.954-16.077-3.072-1.024-12.288-4.198-20.48-7.066-8.192-2.97-19.866-7.066-26.112-9.216-6.144-2.15-24.576-8.602-40.96-14.336-16.282-5.734-35.43-12.493-42.496-14.848-7.066-2.458-18.739-6.554-26.112-9.216-7.27-2.56-16.486-5.837-20.48-7.168-13.312-4.506-30.515-10.65-30.925-11.162-0.205-0.205 1.536-1.126 3.994-1.946 7.885-2.765 44.749-15.667 76.595-26.829 17.203-5.939 34.918-12.186 39.424-13.824 18.227-6.451 83.251-29.286 103.936-36.352 7.066-2.458 16.896-5.837 21.811-7.578l9.114-3.277 8.294 3.072c11.469 4.096 53.043 18.842 60.621 21.402 3.379 1.229 12.8 4.506 20.992 7.373 8.192 2.97 22.016 7.782 30.72 10.854s20.992 7.373 27.136 9.626c6.246 2.15 19.251 6.758 28.979 10.138l17.613 6.246v-170.906l-5.12-25.293c-2.765-13.926-5.12-25.498-5.12-25.702s9.421-0.307 20.992-0.307c11.571 0 20.992 0.307 20.992 0.614 0 0.41-0.512 2.355-1.024 4.403-0.614 2.048-3.072 13.21-5.632 24.781l-4.608 21.197v89.19c0 70.451 0.307 89.395 1.331 89.702 0.614 0.307 9.626 3.277 19.968 6.758s18.534 6.451 18.33 6.758c-0.41 0.307-28.058 10.138-35.533 12.595-1.434 0.41-14.541 5.12-29.184 10.24-14.643 5.222-32.358 11.366-39.424 13.824-14.643 5.018-45.158 15.77-90.624 31.744-9.011 3.174-18.944 6.656-22.016 7.68s-12.288 4.301-20.48 7.168c-16.282 5.837-18.637 6.554-19.558 5.734zM358.502 685.773c0-31.334 0.512-60.518 1.024-64.717 4.813-38.707 23.962-74.138 53.658-98.918 6.451-5.427 19.354-14.746 20.378-14.746 0.41 0 2.355-1.024 4.506-2.355 9.216-5.734 30.413-13.619 43.008-16.077 17.408-3.277 42.291-3.584 58.061-0.614 36.147 6.656 69.018 26.010 91.546 53.862 2.048 2.56 3.994 4.813 4.301 5.12 0.41 0.307 2.765 3.789 5.427 7.885 9.114 14.234 17.613 33.485 20.685 47.411 4.096 18.125 4.506 24.678 4.506 83.149v57.037l-2.765-0.922c-1.638-0.41-6.042-2.048-10.035-3.379-6.861-2.56-21.094-7.475-103.424-36.25l-37.888-13.21-4.608 1.741c-2.56 1.024-27.853 9.933-56.32 19.866s-56.115 19.661-61.44 21.504c-5.325 1.946-14.438 5.12-20.275 7.066l-10.445 3.584 0.102-57.037zM573.645 458.547l-61.747-49.459-61.44 49.152c-44.339 35.533-62.054 49.152-63.898 49.152-3.789 0-24.269-6.861-34.099-11.366-24.883-11.469-47.206-29.798-64.307-52.838-12.186-16.282-23.859-41.882-28.058-61.235-3.482-15.565-3.891-25.088-3.994-75.469l-0.102-50.995h230.4v32.358l-6.349 5.018c-28.058 22.528-24.781 65.229 6.451 83.763 15.565 9.216 36.762 8.909 52.019-0.819 30.515-19.251 32.768-62.976 4.198-83.968l-5.12-3.789v-32.563h230.502l-0.41 55.091c-0.205 30.208-0.717 56.422-1.024 58.061-0.41 1.741-1.434 6.656-2.253 11.059-5.325 26.829-20.992 57.242-40.448 78.131-21.504 23.142-49.357 39.834-79.565 47.821l-9.011 2.458-61.747-49.562zM144.998 228.352c-9.216-3.277-15.974-12.288-16.794-22.426-0.41-5.734 1.536-11.469 15.053-43.418 2.765-6.554 11.981-28.57 20.378-48.845l15.36-36.864 25.805-0.614v-76.698h614.4v76.8h25.293l1.638 3.891c3.277 7.373 21.197 51.507 21.197 52.019 0 0.205 0.922 2.355 1.946 4.813 4.198 9.216 23.552 56.934 24.576 60.723 3.277 11.776-2.355 24.064-13.414 29.491l-5.427 2.56h-363.008c-306.278 0-363.622-0.205-367.002-1.434z" />
+<glyph unicode="&#xea95;" glyph-name="Orange_Experts_Copy_Keep" d="M102.4 476.979c0-338.125-0.614-310.579 7.27-326.758 7.782-16.077 23.142-28.262 41.472-32.973 7.782-2.048 13.107-2.048 389.222-2.048h381.235v252.723c0 217.805-0.205 253.645-1.536 259.789-4.915 23.347-23.552 42.598-47.206 48.64-7.782 2.048-11.776 2.048-209.92 2.048h-201.933l-2.253 2.867c-1.229 1.536-18.534 24.474-38.298 50.893l-36.147 48.128-281.907 0.512v-303.821zM553.779 574.464c20.070-3.789 35.328-11.981 49.459-26.317 11.469-11.776 19.251-25.293 23.552-41.267 1.946-7.066 2.253-11.674 2.662-33.485l0.512-25.395h6.349c12.39 0 20.685-4.198 25.907-13.107l2.867-4.813 0.307-106.189 0.205-106.291h-117.043c-131.686 0-123.187-0.512-131.277 7.68-8.090 8.090-7.68 1.126-7.68 118.477v104.243h35.84v21.299c0.102 23.45 0.307 25.907 3.072 37.274 6.246 25.6 24.269 47.718 48.64 59.904 16.998 8.499 38.195 11.469 56.627 7.987zM526.848 533.811c-13.312-2.458-28.774-14.336-34.611-26.419-5.018-10.342-5.837-16.077-5.837-38.605v-20.787h102.502l-0.102 21.402c-0.102 13.824-0.614 23.245-1.434 26.419-2.56 9.421-6.861 16.998-13.824 23.962-12.698 12.595-28.774 17.51-46.694 14.029zM529.306 395.878c-16.282-3.379-29.082-18.739-30.106-35.942-0.614-12.083 7.782-28.57 17.101-33.382 2.867-1.434 2.97-1.741 2.355-7.373-0.41-3.174-0.819-6.554-1.024-7.373s-0.717-4.096-1.024-7.168c-0.41-3.072-1.536-12.083-2.662-19.866-1.024-7.885-1.946-14.643-1.946-15.155 0-0.41 11.571-0.819 25.702-0.819h25.702l-0.614 3.891c-0.307 2.048-1.024 7.68-1.638 12.493s-1.331 9.83-1.536 11.264c-0.205 1.434-0.922 6.451-1.434 11.264-0.614 4.813-1.331 10.547-1.638 12.902-0.614 3.994-0.41 4.301 2.765 6.246 4.096 2.355 9.933 9.318 12.902 15.155 9.318 18.637 0.717 41.984-18.944 51.302-6.144 2.867-17.101 4.096-23.962 2.56z" />
+<glyph unicode="&#xea96;" glyph-name="orange_experts_expert" d="M377.856 882.483c-7.27-2.355-12.493-6.349-15.974-12.288-2.458-4.096-2.97-6.042-2.97-12.083 0-6.758 0.614-8.602 9.523-30.208 5.222-12.698 10.752-25.498 12.186-28.467 9.523-19.558 36.864-19.354 45.978 0.205 4.506 9.728 3.891 12.698-8.909 43.725-12.902 31.027-15.053 34.304-24.064 37.683-5.222 2.048-12.186 2.662-15.77 1.434zM630.886 881.459c-7.782-2.765-12.288-8.397-18.432-23.347-16.691-40.243-17.51-42.496-17.51-47.206 0-7.885 2.048-12.8 7.68-18.33 8.192-8.192 18.842-10.035 28.979-5.018 7.578 3.789 10.445 7.885 17.408 24.883 3.482 8.192 8.397 20.070 11.059 26.214 4.301 9.933 4.813 12.186 4.915 18.944 0.102 6.656-0.307 8.294-2.765 12.493-6.451 11.059-19.149 15.667-31.334 11.366zM493.466 780.39c-0.205-0.205-3.584-0.717-7.578-1.126-17.715-1.638-42.394-7.987-60.928-15.565-65.741-26.829-116.429-83.866-134.963-151.859-5.939-21.709-7.578-34.099-7.885-57.856-0.41-27.955 1.843-44.851 9.216-69.632 6.349-21.299 16.179-42.394 29.389-62.464 9.933-15.36 14.131-22.016 14.131-22.63 0-0.307 1.638-3.072 3.584-6.144s3.584-5.837 3.584-6.042c0-0.307 1.229-2.458 2.662-4.71 3.482-5.53 19.456-37.581 25.498-51.098 18.637-41.779 33.28-88.883 38.912-125.952 2.867-18.637 9.523-28.877 22.835-35.123l6.861-3.277 71.373-0.307c70.349-0.205 71.475-0.205 77.824 1.946 8.909 2.97 15.667 8.192 20.787 16.282 3.174 5.12 4.198 8.704 7.168 25.907 11.366 66.97 41.984 140.595 88.064 212.173 25.088 39.117 37.069 77.722 37.888 122.88 0.717 38.81-6.042 70.246-22.426 104.448-18.637 38.81-46.080 69.837-83.046 94.003-25.498 16.589-59.392 29.594-87.552 33.485-4.813 0.717-10.957 1.638-13.722 2.048-4.915 0.819-40.96 1.331-41.677 0.614zM197.632 696.934c-7.066-2.15-12.493-6.656-15.974-13.414-2.355-4.403-2.56-17.51-0.512-21.504 3.174-5.734 7.578-10.138 12.595-12.493 2.97-1.434 15.77-6.963 28.467-12.186 21.709-9.114 23.45-9.626 30.208-9.626 7.987 0.102 13.312 2.253 18.125 7.373 11.366 11.981 8.090 32.87-6.349 40.243-1.946 1.024-14.95 6.451-28.774 12.186-26.010 10.65-30.208 11.674-37.786 9.421zM812.544 697.139c-1.126-0.307-3.379-1.126-5.12-1.843-1.638-0.819-13.414-5.632-26.112-10.854-24.986-10.445-28.57-12.698-32.358-20.89-8.192-17.51 5.734-37.99 24.474-36.045 6.656 0.614 56.934 20.992 62.054 25.088 5.632 4.608 8.806 11.776 8.806 20.173-0.102 10.957-4.915 18.432-14.848 22.938-4.403 2.048-11.878 2.662-16.896 1.434zM246.272 446.054c-9.421-3.584-42.906-17.715-48.333-20.173-19.866-9.421-19.354-37.786 0.922-46.49 7.987-3.379 14.541-2.458 31.027 4.403 7.373 3.072 19.354 7.987 26.624 11.059 10.138 4.198 14.336 6.451 17.51 9.626 11.776 11.776 9.216 31.539-5.12 39.936-6.246 3.686-15.667 4.301-22.63 1.638zM761.242 446.976c-11.571-2.662-19.763-14.848-18.534-27.341 0.717-6.554 4.403-13.414 9.318-17.203 1.843-1.434 15.565-7.578 30.618-13.824 30.72-12.698 33.69-13.312 43.213-8.806 13.414 6.349 18.739 21.197 12.186 34.202-1.434 2.97-4.198 6.656-6.144 8.192-2.97 2.458-42.598 19.763-55.603 24.269-4.71 1.638-9.83 1.843-15.053 0.512zM409.6 100.659c0-24.576 0.41-41.779 1.024-44.032 1.741-5.939 7.066-12.186 13.312-15.36 5.325-2.662 5.939-2.662 24.474-2.765s19.046-0.205 20.582-2.458c0.819-1.229 3.686-4.506 6.349-7.373 19.149-20.48 51.917-21.094 72.294-1.229 2.458 2.355 5.325 5.734 6.451 7.578l2.048 3.277 40.653 0.614 5.939 4.096c4.198 2.97 6.656 5.53 8.602 9.216l2.56 5.018 0.614 83.558h-204.902v-40.141z" />
+<glyph unicode="&#xea97;" glyph-name="orange_experts_insurance" d="M505.344 853.402c-16.691-10.957-33.792-20.48-57.856-32.256-64.819-31.846-137.933-53.862-204.8-61.85-5.325-0.614-11.059-1.331-12.8-1.536-7.27-0.922-34.304-2.458-44.851-2.56h-5.939l0.41-157.389c0.205-86.63 0.614-158.822 1.024-160.563 0.307-1.638 1.126-7.168 1.741-12.288 10.957-92.262 54.067-180.326 123.392-252.314 19.251-19.968 51.2-47.821 70.656-61.44 39.731-27.955 73.83-47.002 114.688-64.307 22.221-9.421 19.661-9.011 30.515-4.813 55.296 21.709 110.387 54.477 157.491 93.696 14.848 12.39 48.333 45.568 59.392 58.675 31.13 37.376 56.218 77.517 72.090 115.302 3.174 7.578 6.144 14.746 6.656 15.872 10.138 23.654 21.299 69.12 25.088 102.4 0.307 2.867 0.922 6.963 1.229 9.216s0.717 74.752 1.024 161.075l0.41 156.877-6.451 0.102c-12.493 0.102-36.147 1.434-44.339 2.458-1.638 0.307-5.837 0.717-9.216 1.024-9.83 0.922-31.539 4.403-48.128 7.782-73.933 14.746-152.269 45.466-213.811 84.070-6.144 3.789-11.264 6.963-11.264 6.861-0.102 0-2.97-1.843-6.349-4.096zM652.39 448h140.39l-0.614-5.325c-0.307-2.97-0.922-7.987-1.229-11.059-4.096-39.322-18.022-84.685-37.786-123.392-37.069-72.806-98.202-136.090-175.923-181.862-14.131-8.397-43.622-23.552-56.013-28.774l-8.704-3.789-0.307 177.152-0.205 177.050h-280.371l-0.512 3.379c-0.922 5.222-0.819 255.898 0 255.386 0.512-0.205 3.789-0.102 7.475 0.41 3.686 0.41 9.421 1.126 12.8 1.434 3.379 0.41 6.861 0.922 7.68 1.024 0.819 0.205 5.222 0.819 9.728 1.434 8.499 1.229 11.162 1.741 29.184 5.325 44.646 8.806 97.075 25.293 142.438 44.954 21.094 9.114 54.374 25.805 67.994 33.997l3.072 1.843 0.307-174.592 0.205-174.592h140.39z" />
+<glyph unicode="&#xea98;" glyph-name="Orange_Experts_One2One_Coach" d="M320.512 837.632c-55.091-8.192-100.864-41.574-124.826-91.034-11.264-23.142-15.77-43.11-15.872-70.246-0.102-24.781 2.97-41.677 11.674-63.078 21.094-51.814 67.072-88.883 123.29-99.43 14.234-2.662 45.875-2.355 59.494 0.614 15.462 3.277 28.365 7.782 41.984 14.541 15.667 7.782 28.979 17.306 41.574 29.798l9.933 9.83-0.614 4.506c-1.024 6.246-0.922 38.81 0.102 47.411 3.379 28.877 14.234 60.518 29.286 85.402 2.867 4.71 5.222 9.114 5.222 9.83 0 0.614-1.434 5.427-3.174 10.65-18.534 55.91-63.795 96.358-122.266 109.363-13.722 2.97-41.779 3.994-55.808 1.843zM657.92 761.754c-35.738-5.53-66.355-20.685-91.443-45.363-26.624-26.214-42.291-57.139-47.923-94.822-1.331-9.011-1.229-36.864 0.102-46.080 1.946-12.902 7.885-32.256 13.824-45.056 8.397-18.125 24.678-40.346 38.093-51.814 3.584-3.072 6.656-5.837 6.963-6.144 2.15-2.765 21.504-15.053 30.925-19.661 23.142-11.366 41.574-15.872 67.891-16.589 27.034-0.819 49.869 3.789 73.523 14.643 37.99 17.613 70.861 52.941 84.275 90.522 4.915 13.824 5.222 15.36 9.114 35.123 0.41 1.741 0.819 10.035 1.126 18.432 0.717 25.907-3.277 46.797-13.722 70.963-18.842 43.418-59.494 78.746-104.858 91.136-20.787 5.734-48.64 7.68-67.891 4.71zM194.97 506.266c-46.592-24.166-82.637-72.192-93.491-124.314-1.126-5.632-2.458-11.878-2.867-13.824-1.331-6.656-1.638-187.29-0.307-193.536 4.198-19.456 20.48-35.84 39.731-39.834 3.789-0.819 41.882-1.126 125.645-1.126h120.32l0.102 73.011c0 40.038 0.205 75.264 0.512 78.029 3.891 41.574 16.077 77.517 37.786 110.592 17.408 26.726 39.731 49.357 65.946 66.97 4.813 3.277 10.342 6.758 12.186 7.68 1.741 0.922 3.277 2.048 3.277 2.56s-2.458 4.813-5.53 9.626c-2.97 4.813-7.373 12.698-9.728 17.613-2.867 5.837-4.71 8.499-5.53 7.987-0.717-0.41-3.789-2.765-6.861-5.325-16.179-13.21-43.11-27.955-62.464-34.202-28.672-9.318-43.11-11.571-74.24-11.366-12.39 0.102-23.040 0.717-29.286 1.843-35.328 5.837-69.018 20.070-95.334 40.243-4.71 3.584-9.728 7.373-11.162 8.499l-2.662 1.946-6.042-3.072zM535.45 430.694c-30.72-15.462-58.675-42.189-75.878-72.602-10.445-18.534-16.998-36.25-21.606-58.573-2.15-10.445-2.15-13.312-2.56-103.731-0.307-101.683-0.512-98.611 5.632-111.309 5.837-12.186 20.89-23.552 34.918-26.522 3.891-0.819 69.53-1.126 228.147-1.126h222.72l-0.41 115.507c-0.102 63.488-0.512 116.326-0.922 117.453-0.307 1.126-0.922 4.403-1.229 7.168-1.024 6.656-5.12 22.938-7.68 30.31-15.77 44.442-47.923 81.408-89.498 103.117l-7.885 4.198-6.963-5.222c-25.395-19.354-52.429-32.154-82.637-39.219-5.632-1.331-12.493-2.662-15.36-3.072-2.765-0.41-6.246-0.922-7.68-1.126-5.427-1.024-40.858-1.229-48.64-0.307-40.141 4.813-77.722 19.968-108.646 44.032l-6.246 4.813-7.578-3.789zM822.682 361.574c6.144-2.97 10.65-7.578 14.131-14.234 1.843-3.379 2.253-6.042 2.355-13.005 0-7.782-0.307-9.318-3.072-14.234-11.981-21.709-42.291-21.709-54.272 0.102-2.662 4.813-3.072 6.451-3.072 14.131 0 7.782 0.307 9.318 3.072 14.234 4.096 7.373 11.878 13.619 19.456 15.565 5.632 1.536 15.565 0.307 21.402-2.56zM841.933 202.035c0.307-61.030 0.614-77.824 1.638-80.384 1.638-3.789 7.475-7.066 14.541-7.885 2.56-0.307 4.71-0.512 4.915-0.512 0.102-0.102 0.205-2.355 0.205-5.222v-5.12h-100.352v5.12c0 2.867 0.102 5.12 0.307 5.12 0.102 0.102 2.048 0.307 4.301 0.614s6.144 1.536 8.704 2.765c8.294 3.994 8.192 2.56 7.885 75.469-0.205 59.802-0.307 63.181-2.15 66.765-2.253 4.403-6.144 6.554-13.722 7.578l-5.325 0.717v11.981h78.746l0.307-77.005z" />
+<glyph unicode="&#xea99;" glyph-name="orange_experts_orange_business_consultant" d="M496.64 857.293c-0.307-0.307-3.277-0.819-6.656-1.126-25.395-2.765-51.405-12.186-73.728-26.931-21.606-14.234-37.069-29.696-51.098-51.2-36.25-55.398-37.376-128.922-2.97-184.627 27.443-44.339 70.042-72.909 122.163-81.92 3.686-0.614 13.722-1.331 22.426-1.638 48.947-1.434 94.31 16.691 128.512 51.302 14.541 14.643 23.654 27.443 32.87 46.080 7.987 16.384 12.493 30.618 16.384 52.736 1.024 6.144 1.331 32.87 0.41 41.677-6.656 64.512-49.357 120.32-110.080 144.077-19.968 7.782-36.147 10.854-59.802 11.469-9.933 0.307-18.227 0.307-18.432 0.102zM354.099 520.806c-54.272-33.075-88.986-86.528-97.587-150.63-2.048-15.053-2.15-243.098-0.102-254.464 3.379-19.046 11.469-34.918 25.088-48.947 11.059-11.571 24.474-19.558 41.677-24.986l9.114-2.867 435.712-0.512-0.102 160.461c-0.102 141.619-0.41 169.37-2.253 177.971-0.307 1.126-0.819 4.096-1.229 6.656-2.458 15.36-9.83 36.966-18.432 54.272-17.715 35.226-48.333 67.379-82.33 86.323l-4.608 2.458-6.451-5.53c-28.774-24.371-61.542-40.448-97.587-47.821-18.227-3.789-26.726-4.506-47.616-4.198-34.099 0.614-62.464 7.475-92.16 22.426-16.589 8.397-28.058 15.872-41.779 27.238l-9.728 8.090-9.626-5.939zM532.582 430.797c0-0.922 0.205-2.662 0.41-3.789 0.102-1.126 0.614-4.608 0.922-7.68 0.41-3.072 0.922-7.475 1.229-9.728 3.891-28.877 13.21-100.557 14.848-114.688 0.512-4.506 1.229-9.318 1.434-10.752s1.843-13.619 3.584-27.136c1.741-13.517 3.379-25.907 3.584-27.648 0.307-1.638 0.922-6.963 1.536-11.776 0.512-4.813 1.229-9.626 1.434-10.854 1.741-8.909 1.946-8.397-13.21-28.16-7.885-10.24-17.51-22.835-21.402-27.955s-9.011-11.674-11.366-14.541l-4.301-5.325-25.6 33.382-25.6 33.28 0.819 4.71c0.307 2.56 0.922 7.066 1.331 9.83 0.614 5.222 6.246 47.104 7.27 54.067 0.307 2.048 0.717 5.53 1.024 7.68 0.614 4.813 1.331 9.83 2.048 15.053 0.307 2.253 1.434 11.059 2.56 19.456 1.126 8.499 2.253 16.998 2.56 18.944 1.024 6.861 8.602 62.976 12.902 96.461l1.126 8.909h20.378c18.432 0 20.378-0.205 20.48-1.741z" />
+<glyph unicode="&#xea9a;" glyph-name="orange_experts_orange_startup_smartphone" d="M293.786 881.357c-17.203-4.506-31.437-19.149-36.25-37.171-2.253-8.294-2.253-784.077 0-792.371 4.813-18.022 19.046-32.666 36.25-37.171 6.246-1.638 21.606-1.741 218.214-1.741s211.968 0.102 218.214 1.741c17.203 4.506 31.437 19.149 36.25 37.171 1.331 4.71 1.536 60.723 1.536 395.366 0 280.678-0.307 391.373-1.126 395.264-3.994 19.251-20.992 36.147-39.834 39.731-3.482 0.614-80.896 1.024-215.962 0.922-195.584 0-211.046-0.102-217.293-1.741zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.749-2.048-39.834 0-41.574 0.102-44.851 2.048-3.379 2.15-6.349 7.27-6.349 11.264 0 3.482 2.97 8.090 6.451 10.24 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM520.499 87.962c20.582-6.963 22.733-36.659 3.379-46.387-10.445-5.222-21.606-3.482-29.696 4.608-19.149 19.046 0.717 50.483 26.317 41.779zM459.264 625.664c-13.926-3.789-29.696-11.981-34.202-17.818-3.482-4.608-3.482-9.83 0.307-19.046 5.325-13.21 3.482-21.914-6.963-32.051-10.752-10.65-18.125-12.083-32.768-6.349-9.83 3.789-13.926 3.686-18.739-0.41-6.656-5.53-17.203-29.286-18.432-41.165-1.024-9.728 1.741-13.312 14.336-18.33 11.981-4.813 17.101-12.902 17.101-27.136s-4.915-22.016-17.101-27.136c-9.523-3.994-12.186-6.042-13.722-10.445-1.536-4.813-0.717-11.264 2.97-21.914 5.222-15.053 11.059-24.883 17.101-28.57 4.403-2.765 8.090-2.355 17.92 1.638 12.902 5.325 22.118 2.97 32.87-8.499 9.318-10.035 10.65-17.408 5.427-30.413-3.482-8.499-3.891-11.981-2.15-16.282 1.843-4.403 7.782-8.909 17.613-13.517 20.685-9.728 34.202-11.059 39.219-3.789 1.024 1.536 3.174 5.734 4.71 9.421 3.174 7.578 6.554 11.469 12.39 14.643 3.482 1.946 5.734 2.253 14.848 2.15 15.565-0.102 20.787-2.97 26.214-14.643 1.434-3.174 3.379-7.27 4.301-9.216 4.506-9.83 17.51-9.421 40.243 1.126 14.438 6.861 20.173 13.005 18.944 20.582-0.307 1.843-1.741 6.246-3.277 9.933-5.427 12.902-3.072 21.914 8.397 32.666 10.138 9.523 17.613 10.957 30.208 5.734 9.216-3.686 12.39-4.096 16.794-1.946 4.608 2.15 8.806 7.68 13.312 17.306 5.018 10.65 7.373 17.818 8.192 24.269 1.331 10.342-1.741 14.848-12.698 19.251-14.541 5.632-19.354 13.722-18.33 30.515 0.819 13.414 5.427 19.558 19.251 25.293 10.445 4.403 13.005 8.499 11.776 18.739-0.922 7.475-7.68 24.883-12.698 32.666-6.861 10.752-12.39 12.288-25.19 7.066s-21.094-3.584-31.232 6.042c-10.957 10.547-13.005 19.251-7.578 32.768 3.379 8.294 3.789 14.234 1.126 18.33-3.994 6.042-24.269 16.282-38.195 19.149-12.186 2.458-16.998-0.41-22.426-13.414-5.222-12.8-12.8-17.408-28.16-17.408-12.39 0-20.48 4.915-25.293 15.36-1.331 3.072-3.277 7.168-4.198 9.114-3.174 6.861-10.854 8.806-22.221 5.734zM526.336 543.846c33.382-6.451 58.982-31.437 65.843-64.205 2.048-9.626 1.638-26.522-0.819-36.25-7.782-30.515-32.973-54.477-63.59-60.314-15.462-2.867-28.979-1.741-44.237 3.686-19.354 7.066-37.478 23.552-45.568 41.882-6.246 14.131-7.987 22.938-7.373 38.298 0.922 26.522 14.438 50.278 36.966 65.024 16.998 11.059 39.526 15.667 58.778 11.878z" />
+<glyph unicode="&#xea9b;" glyph-name="orange_experts_recycle" d="M413.696 792.371c-20.48-3.174-38.093-11.878-52.429-25.702-7.782-7.475-11.366-12.493-26.419-37.581-5.734-9.523-12.902-21.299-15.872-26.112s-10.752-17.715-17.408-28.672c-13.824-22.835-24.678-40.653-30.31-49.869l-3.891-6.246 4.813-2.867c5.427-3.072 26.829-15.667 50.381-29.594 8.704-5.222 23.757-14.029 33.28-19.661 9.626-5.632 25.395-15.053 35.226-20.787 14.029-8.294 17.92-10.24 18.637-9.114 0.512 0.819 17.408 28.877 37.478 62.362 19.968 33.485 37.478 62.566 38.707 64.512 4.506 6.963 77.312 128.922 77.312 129.536s-145.51 0.41-149.504-0.205zM615.936 791.962c-2.765-0.614-8.602-2.765-12.698-4.813-12.186-5.939-16.998-11.571-33.075-38.605-7.68-12.902-19.354-32.461-25.805-43.418-6.554-10.957-11.878-20.48-11.878-21.197s4.096-8.090 9.114-16.486c27.648-46.285 45.158-75.981 45.158-76.8-0.102-0.41-2.97-2.458-6.451-4.506-18.739-10.752-37.274-21.914-38.605-23.142-1.126-1.024-1.229-1.331-0.102-1.331 1.229 0 57.754-18.432 152.678-49.869 29.696-9.83 33.485-10.342 40.448-5.018 5.12 3.994 7.168 9.114 10.138 25.702 1.434 7.885 4.71 25.907 7.27 39.936 2.662 14.131 5.12 27.955 5.632 30.72 0.922 5.734 2.97 16.896 9.114 50.176 2.253 12.39 4.403 23.859 4.608 25.498 0.307 1.638 1.024 5.325 1.536 8.192 0.614 2.867 1.331 6.963 1.638 9.216 0.307 2.15 0.819 4.301 1.126 4.813s0.307 0.922 0 0.922c-0.307 0-10.957-6.246-23.757-13.824l-23.347-13.824-10.752 18.227c-5.939 9.933-18.944 31.744-28.774 48.333-13.926 23.45-19.251 31.642-24.064 36.454-6.451 6.554-15.462 11.674-24.576 14.131-6.246 1.638-17.613 1.843-24.576 0.512zM258.56 512.922c-11.264-4.198-39.834-14.848-63.488-23.654-54.272-20.173-87.245-32.461-91.136-33.997-3.379-1.331-5.222-0.205 32.768-20.48 5.632-3.072 10.65-5.837 11.162-6.349 0.512-0.41-2.56-7.168-6.861-14.95-9.626-17.715-38.912-71.782-42.598-78.643-9.011-16.691-9.523-34.816-1.331-51.712 3.482-7.066 12.698-16.896 19.763-21.197 10.342-6.144 11.366-6.246 71.168-6.349l54.374-0.102 13.107 24.269c7.27 13.414 13.926 25.805 14.848 27.443 0.922 1.741 3.686 6.758 6.144 11.264 5.734 10.65 16.589 30.618 16.896 30.925 0.102 0.205 10.752-5.427 23.552-12.493 12.902-6.963 23.654-12.493 23.859-12.288 0.205 0.102-0.41 3.891-1.434 8.294-0.922 4.506-2.048 9.728-2.458 11.674-1.229 5.837-12.288 55.501-13.312 59.904-1.946 8.397-5.325 23.552-13.824 61.952-4.813 21.709-9.523 41.165-10.445 43.315-2.867 6.554-10.035 11.059-17.715 10.854-1.434 0-11.776-3.482-23.040-7.68zM836.096 476.877c-3.891-2.15-17.101-9.318-29.184-15.974-25.702-14.131-24.269-13.312-59.392-32.563-14.95-8.192-28.774-15.77-30.72-16.896s-6.656-3.686-10.445-5.837c-6.554-3.686-6.861-3.994-5.53-6.042 1.434-2.253 16.794-28.16 55.91-94.413 11.981-20.275 37.274-62.874 56.115-94.72s34.918-59.085 35.738-60.621c0.819-1.638 1.843-2.867 2.15-2.867 0.41 0 5.734 8.704 11.981 19.251 11.264 19.251 37.274 63.078 53.248 89.805 15.155 25.395 17.92 33.075 18.432 53.248 0.41 11.571 0.102 14.541-2.048 22.938-1.434 5.325-3.789 12.493-5.427 15.872-2.355 5.018-26.214 43.315-47.821 76.902-5.837 9.114-12.39 19.354-15.462 24.269-5.939 9.626-20.070 31.539-20.173 31.539s-3.379-1.843-7.373-3.891zM654.746 276.070c-6.758-5.939-23.552-20.787-37.376-32.87-13.722-12.083-30.925-27.238-38.298-33.69-7.27-6.451-21.606-18.944-31.744-27.648-10.035-8.806-20.275-17.818-22.528-20.070-6.758-6.758-7.987-15.053-3.379-23.040 1.126-1.946 12.083-12.186 24.269-22.835 12.186-10.547 23.552-20.378 25.19-22.016 1.741-1.536 6.758-5.939 11.264-9.933 4.506-3.891 8.397-7.373 8.704-7.68s3.994-3.482 8.192-7.168c6.656-5.837 13.005-11.366 16.794-14.848 0.614-0.614 6.451-5.734 12.902-11.366 6.451-5.734 17.818-15.667 25.088-22.118l13.312-11.776 0.307 28.467 0.205 28.467 59.187 0.307c58.061 0.307 59.187 0.307 65.024 2.56 30.925 11.674 44.442 46.387 29.491 75.981-1.638 3.277-11.264 20.89-21.402 39.117-10.035 18.227-19.866 36.045-21.811 39.629l-3.482 6.349h-107.008l-0.205 28.57-0.307 28.467-12.39-10.854zM133.427 228.557c0.205-0.717 15.974-27.034 34.918-58.368 18.944-31.437 34.406-57.344 34.406-57.549 0-1.638 8.294-12.902 13.517-18.534 12.902-13.722 28.672-22.426 48.23-26.522 5.837-1.331 21.606-1.536 91.648-1.536h84.685l-0.102 81.715v81.613l-153.907 0.307c-124.621 0.205-153.805 0-153.395-1.126z" />
+<glyph unicode="&#xea9c;" glyph-name="orange_experts_repair" d="M283.648 804.864c-11.469-1.638-19.661-3.379-27.238-5.734l-6.144-1.946 51.507-51.405c36.966-37.069 52.122-52.736 53.658-56.013 3.072-6.554 3.584-13.107 1.434-19.661-1.741-5.12-4.71-8.397-43.315-47.206-28.57-28.57-43.008-42.394-46.182-44.032-6.861-3.482-17.306-3.277-23.654 0.512-2.56 1.434-27.238 25.293-55.194 53.35-27.853 27.853-50.893 50.483-51.302 50.278-1.331-0.819-4.301-12.902-6.656-26.624-1.946-11.162-2.253-16.282-2.048-31.744 0.307-19.866 0.512-21.606 3.789-36.352 5.427-25.088 17.306-50.074 33.792-71.68 8.806-11.571 27.238-28.672 39.834-37.171 24.269-16.179 46.387-24.883 74.65-29.389 16.998-2.765 45.056-2.048 61.44 1.434l11.776 2.458 198.144-198.042c108.954-108.954 200.192-199.475 202.752-201.216 37.581-25.293 85.709-20.582 116.326 11.469 15.974 16.794 24.269 36.864 24.883 60.109 0.512 18.432-5.734 38.605-16.691 53.965-2.048 2.867-92.57 94.003-201.216 202.752l-197.632 197.632 1.638 6.656c5.632 24.064 5.53 55.706-0.205 80.384-5.632 24.781-19.661 53.555-35.123 72.192-28.058 33.997-66.048 56.32-109.261 64.102-12.083 2.15-42.189 2.662-53.76 0.922z" />
+<glyph unicode="&#xea9d;" glyph-name="orange_experts_tranquil" d="M323.584 856.269c-5.427-1.741-13.619-10.445-15.258-16.282-2.355-8.499-1.126-13.926 9.114-38.707 11.469-27.75 13.21-31.334 17.613-35.533 12.493-11.981 33.587-7.475 40.96 8.704 3.686 8.192 2.867 14.234-4.608 32.051-3.584 8.704-8.602 20.89-11.059 27.034-6.963 17.51-14.848 24.269-28.16 23.962-2.765-0.102-6.656-0.614-8.602-1.229zM680.96 855.45c-5.632-2.458-9.83-6.349-12.288-11.162-1.024-1.946-6.349-14.438-11.776-27.648-7.475-17.818-10.138-25.6-10.547-29.901-1.229-15.258 10.138-27.648 25.395-27.648 5.734 0 12.698 2.355 16.384 5.53 4.198 3.584 7.782 10.547 17.92 35.021 9.626 23.45 10.957 27.238 10.854 32.461-0.102 18.534-19.251 30.925-35.942 23.347zM486.912 728.986c-55.91-5.734-101.376-21.709-145.408-51.098-18.739-12.493-28.262-20.275-44.954-36.659-49.254-48.538-78.541-106.701-89.395-177.869-2.253-14.848-2.56-64-0.512-78.336 3.277-22.016 9.933-49.971 15.053-63.181 0.717-1.741-2.662-1.843-61.235-1.843-67.174 0-66.56 0-74.138-5.734-1.843-1.331-4.608-4.71-6.144-7.373-2.458-4.096-2.867-5.939-2.867-12.493s0.41-8.397 2.867-12.493c3.174-5.427 8.090-9.626 13.722-11.674 3.277-1.126 74.65-1.331 417.587-1.434 282.010 0 414.925 0.307 417.485 1.024 5.734 1.638 12.186 7.066 15.053 12.8 3.891 7.373 3.789 17.613-0.205 24.269-3.174 5.427-8.090 9.626-13.722 11.674-3.072 1.024-16.794 1.331-66.048 1.434h-62.157l1.536 4.915c1.741 5.222 7.373 25.088 8.090 28.365 6.246 28.877 7.68 43.315 7.168 73.728-0.307 27.955-2.15 43.418-7.68 66.56-22.835 95.846-90.522 175.206-181.76 212.89-26.419 10.957-47.718 16.486-82.944 21.606-5.12 0.717-53.76 1.434-59.392 0.922zM93.184 625.869c-5.018-1.638-13.619-10.547-15.155-15.667-3.072-10.342-0.922-19.251 6.451-26.522 4.71-4.71 7.066-5.939 32.256-16.179 23.654-9.728 27.853-11.162 32.973-11.059 10.24 0 18.534 5.12 22.938 14.029 6.246 12.8 1.434 27.853-10.854 34.202-2.048 1.024-14.438 6.349-27.648 11.878-20.992 8.704-24.883 10.035-30.72 10.24-3.686 0.205-8.294-0.205-10.24-0.922zM914.432 626.483c-4.71-1.638-49.152-20.275-52.326-21.811-4.403-2.355-9.83-8.294-11.878-13.21-2.458-5.837-1.946-14.643 1.126-20.992 4.403-9.011 12.902-14.131 23.142-14.029 5.018 0 9.216 1.434 29.798 9.83 30.515 12.595 32.154 13.414 36.762 18.637 8.909 10.24 8.397 24.781-1.536 34.611-3.174 3.277-6.656 5.632-9.318 6.451-4.301 1.229-12.902 1.536-15.77 0.512zM247.398 216.064c-10.342-3.686-16.486-12.902-16.486-24.576 0-6.042 0.512-7.987 2.867-12.083 3.277-5.53 9.421-10.445 15.053-11.981 2.56-0.717 92.672-0.922 265.421-0.819l261.632 0.307 5.018 3.072c16.691 10.342 16.691 33.69 0 44.032l-5.018 3.072-262.246 0.205c-221.184 0.205-262.861 0-266.24-1.229zM375.501 113.766c-5.632-2.048-10.547-6.246-13.722-11.674-2.458-4.096-2.867-5.939-2.867-12.493s0.41-8.397 2.867-12.493c3.174-5.427 8.090-9.626 13.722-11.674 5.734-2.048 267.264-2.048 272.998 0 5.632 2.048 10.547 6.246 13.722 11.674 2.458 4.096 2.867 5.939 2.867 12.493s-0.41 8.397-2.867 12.493c-1.536 2.662-4.301 6.042-6.144 7.373-7.885 6.042-0.41 5.734-144.486 5.734-107.725-0.102-132.915-0.307-136.090-1.434z" />
+<glyph unicode="&#xea9e;" glyph-name="Orange_Football_Club" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-8.704-0.717-20.275-2.048-28.16-3.277-23.654-3.584-34.714-5.939-55.194-11.776-39.117-11.059-80.691-29.491-112.23-49.869-15.872-10.24-18.739-12.186-25.907-17.408-70.349-51.61-124.006-123.597-153.498-206.029-9.626-27.136-18.637-64.717-21.299-89.6-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.432-2.56-75.674 0.614-100.147 1.638-11.776 1.638-11.981 4.096-25.293 7.373-40.755 20.173-78.95 39.014-116.736 33.382-66.458 82.227-122.163 145.306-165.478 50.79-35.021 120.218-61.952 179.712-69.939 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 85.709 7.885 160.768 36.454 226.816 86.016 4.506 3.379 9.83 7.578 11.878 9.318s5.939 5.018 8.704 7.27c5.939 4.915 16.384 14.643 26.419 24.678 53.76 53.76 92.57 121.344 112.23 195.789 2.56 9.626 7.68 33.69 8.704 40.448 0.307 2.765 0.819 5.939 1.024 7.066 0.307 1.126 0.717 4.71 1.024 7.885 0.41 3.174 0.819 6.861 1.126 8.294 1.946 11.571 2.662 62.054 1.126 80.896-1.024 13.824-4.403 39.014-6.758 50.176-17.818 87.347-58.368 162.714-120.832 224.973-50.79 50.483-113.971 88.064-182.784 108.442-19.251 5.632-44.544 11.264-60.621 13.21-2.765 0.41-5.734 0.819-6.554 1.024s-5.222 0.717-9.728 1.126c-4.506 0.307-9.318 0.819-10.752 1.126-3.174 0.512-61.030 1.434-61.542 0.922zM398.746 786.432c-15.667-30.618-15.872-31.232-13.517-32.154 1.331-0.512 17.101-6.758 35.123-13.926s46.080-18.227 62.259-24.678l29.491-11.674 61.645 24.678c33.894 13.619 62.669 25.088 64 25.6 2.253 0.819 1.843 1.638-13.107 31.744-8.499 16.998-15.36 31.027-15.155 31.232 0.205 0.102 3.994-0.819 8.499-2.048 84.992-24.781 158.208-77.21 208.794-149.504 4.301-6.144 7.68-11.264 7.578-11.366-0.307-0.307-8.090 0.922-49.869 7.68-10.854 1.741-19.968 3.072-20.070 2.867-0.41-0.307-1.229-10.65-2.048-23.859-0.307-5.018-0.819-12.39-1.024-16.384-0.307-3.891-0.717-11.059-1.024-15.872s-0.717-11.674-1.024-15.36c-0.307-3.686-0.717-11.469-1.126-17.408-0.307-5.939-0.717-12.39-0.922-14.336-0.307-3.994-1.843-30.003-1.946-33.28 0-2.56 86.323-107.008 88.166-106.701 0.717 0.102 12.39 11.264 25.907 24.678s24.986 24.166 25.395 23.757c0.922-1.024 0.922-43.52 0-55.398-5.325-63.386-25.805-124.109-60.006-176.64-10.854-16.794-26.214-36.966-26.931-35.533-0.41 0.717-1.741 7.885-2.97 16.077-1.229 8.090-2.458 15.77-2.662 16.896-0.614 3.584-4.608 29.594-5.222 33.792-0.307 2.253-0.819 4.403-1.126 4.813-0.41 0.41-6.656-0.819-14.029-2.765-7.27-1.843-28.058-7.168-46.080-11.776s-42.086-10.752-53.555-13.722l-20.787-5.222-13.21-20.992c-7.27-11.571-17.51-27.75-22.733-36.147-16.794-26.624-24.474-38.912-31.027-49.459l-6.349-10.24 9.318-4.813c9.114-4.71 31.437-16.282 48.64-25.293 9.728-5.018 10.24-3.994-5.018-9.421-42.803-15.155-83.558-22.118-129.024-22.016-20.070 0-26.317 0.307-48.128 2.765-16.691 1.946-40.755 6.861-58.368 11.981-15.77 4.506-37.478 12.288-36.762 13.107 0.205 0.205 14.746 7.578 32.154 16.486 17.51 8.806 32.154 16.384 32.666 16.896 1.024 0.922-1.024 4.301-19.354 32.973-1.126 1.843-7.373 11.571-13.722 21.709-6.451 10.138-13.21 20.787-14.95 23.552-1.843 2.867-7.782 12.288-13.312 20.992-5.427 8.704-10.65 16.589-11.366 17.408-0.819 0.819-6.451 2.765-12.493 4.198-6.042 1.536-35.84 9.011-66.15 16.691-30.413 7.68-55.296 13.824-55.398 13.722-0.102-0.205-1.331-7.68-2.867-16.691-5.837-35.533-9.011-54.272-9.318-54.477-0.512-0.512-11.981 14.746-20.275 26.829-28.672 42.086-49.664 92.058-58.675 139.571-0.819 4.301-1.741 8.806-1.946 9.933-0.41 2.253-3.277 22.733-4.198 30.208-0.819 7.066-1.536 53.35-0.819 57.242l0.614 3.379 24.678-24.678c13.619-13.517 24.986-24.678 25.395-24.678 0.307 0 7.066 7.68 14.848 17.203 7.885 9.421 27.648 33.28 44.032 53.043l29.901 36.045-0.41 4.403c-0.205 2.458-0.614 10.035-1.024 16.794-0.307 6.758-0.819 13.414-1.024 14.848s-0.717 7.885-1.024 14.336c-0.307 6.451-0.819 14.541-1.024 17.92-0.307 3.379-0.717 9.83-1.024 14.336s-0.717 10.957-1.024 14.336c-0.205 3.379-0.717 10.342-1.024 15.36-0.819 13.517-1.741 24.576-1.946 24.781s-23.142-2.867-31.846-4.301c-3.072-0.512-6.861-1.126-26.112-3.994-5.325-0.819-9.83-1.331-10.035-1.126-0.819 0.819 16.179 24.166 26.317 36.352 49.459 58.982 116.531 102.912 189.030 123.494 4.506 1.229 8.294 2.355 8.397 2.355 0.205 0.102-6.861-13.926-15.667-31.13zM409.6 588.8v-12.8h-64.717l0.41-40.653 0.41-40.755 2.867-9.216c6.144-20.173 17.818-35.635 35.43-47.104 6.144-3.994 18.842-9.728 21.504-9.728 2.253 0 7.168-3.174 7.168-4.71 0-2.15 3.686-12.698 6.758-19.558 11.059-24.166 35.226-45.466 60.518-53.453l5.939-1.843 0.307-14.541c0.205-13.414 0.102-14.438-1.638-14.438-3.584 0-11.059-3.174-14.746-6.144-4.096-3.379-9.011-12.595-9.011-16.794 0-2.15-0.512-2.662-2.458-2.662-7.68 0-18.637-8.602-21.504-16.896-3.277-9.728-11.776-8.704 75.264-8.704h77.005l-0.614 3.584c-0.922 5.53-4.915 12.698-8.806 15.974-3.482 2.867-11.059 6.042-14.541 6.042-1.229 0-1.843 1.229-2.355 4.198-1.741 10.752-10.342 19.251-21.299 20.992l-3.891 0.717v14.234c0 12.595 0.205 14.234 1.843 14.746 22.323 6.963 41.984 20.378 54.374 37.069 6.758 9.216 12.8 21.094 16.077 31.949l2.662 8.806 5.325 1.229c7.987 1.843 22.835 9.626 30.515 15.974 13.107 10.854 23.142 26.522 27.648 43.11 2.048 7.578 2.253 11.059 2.662 48.435l0.41 40.141h-64.717v25.6h-204.8v-12.8zM409.6 502.272c0-26.419-0.205-48.128-0.512-48.128s-3.174 1.331-6.451 2.97c-16.589 8.602-27.955 24.166-30.925 42.394-0.512 3.584-0.922 16.589-0.922 28.774l0.102 22.118h38.707v-48.128zM653.005 524.083c-0.41-23.552-0.614-27.136-2.56-33.178-4.403-13.517-15.462-26.624-27.955-33.178-3.789-1.946-7.168-3.584-7.475-3.584s-0.614 21.709-0.614 48.128v48.128h39.014l-0.41-26.317z" />
+<glyph unicode="&#xea9f;" glyph-name="orange_foundation" d="M296.448 818.483c-4.608-1.741-11.059-6.349-14.848-10.752-1.843-2.15-9.114-9.933-16.077-17.408-7.066-7.475-13.517-14.438-14.438-15.462-1.024-1.126-7.168-7.68-13.722-14.643s-13.107-14.029-14.746-15.77c-1.536-1.638-8.090-8.806-14.643-15.77s-12.288-13.21-12.902-13.824c-1.331-1.434-26.010-28.058-28.672-30.925-13.722-14.541-28.058-29.798-30.413-32.461-7.373-8.192-9.728-18.637-6.451-28.467 2.048-6.144 6.042-10.445 30.72-33.178 7.27-6.758 16.486-15.36 20.48-19.046 3.891-3.686 11.059-10.342 15.872-14.848 4.813-4.403 11.776-11.059 15.667-14.746l6.963-6.656-1.229-8.192c-1.434-9.318-1.843-43.52-0.717-54.477 5.222-51.302 24.986-97.997 57.651-136.499 8.192-9.626 41.165-41.677 56.934-55.398 1.024-0.922 8.192-7.578 15.974-14.848 7.782-7.373 21.299-19.968 30.003-28.058 8.704-8.192 18.842-17.613 22.528-20.992 3.686-3.482 10.547-9.933 15.36-14.336 4.813-4.506 11.674-10.957 15.36-14.336 3.686-3.482 9.83-9.216 13.824-12.902 3.891-3.584 7.885-7.27 8.704-8.090s4.813-4.506 8.704-8.192c3.994-3.686 11.162-10.342 15.974-14.848 4.71-4.506 14.643-13.722 21.914-20.582 7.373-6.861 15.667-14.541 18.432-17.203 13.824-12.902 28.979-15.974 43.827-9.011 19.456 9.114 27.238 31.949 17.408 50.893-2.97 5.734-4.198 6.861-39.731 39.936-7.27 6.758-14.848 13.926-16.998 15.872-2.048 1.946-5.837 5.427-8.294 7.68-2.355 2.253-11.264 10.547-19.763 18.432-8.397 7.782-18.125 16.794-21.504 20.070-3.379 3.174-7.782 7.373-9.728 9.114-5.222 4.813-26.726 24.883-28.365 26.419-8.499 8.397-1.331 23.245 10.035 20.992 4.301-0.717 5.632-1.638 13.005-8.602 6.246-5.837 49.050-45.773 50.995-47.514 2.867-2.662 28.262-26.317 34.816-32.563 4.096-3.891 8.294-7.782 9.421-8.704s7.782-7.168 14.746-13.824c7.066-6.554 13.926-13.005 15.258-14.131s5.939-5.427 10.138-9.421c4.301-4.096 13.722-12.902 20.992-19.661 13.414-12.493 23.45-21.811 37.376-34.816 4.198-3.994 10.445-9.83 13.824-12.902 9.728-9.011 20.992-19.558 28.16-26.317 3.686-3.482 9.626-7.885 13.312-9.728 6.042-2.97 7.475-3.277 15.872-3.277 7.987 0 10.035 0.41 15.565 2.97 20.070 9.216 27.75 35.021 15.974 53.35-2.97 4.506-2.458 4.096-24.986 25.088-8.704 8.192-22.016 20.582-29.491 27.546-7.475 7.066-14.438 13.517-15.36 14.336-1.024 0.922-7.373 6.758-14.029 13.005-6.656 6.349-13.824 12.902-15.77 14.746s-9.011 8.499-15.77 14.746c-6.656 6.246-13.005 12.083-14.131 13.005-1.024 0.922-8.704 8.090-16.998 15.872-12.8 12.186-21.299 20.070-28.877 27.034-0.922 0.819-7.578 7.066-14.95 13.926-7.27 6.861-15.872 14.848-19.149 17.818-6.861 6.246-8.909 9.728-8.909 14.643 0 8.192 10.854 14.336 18.022 10.138 2.15-1.331 17.203-15.155 59.187-54.477 3.891-3.686 7.578-7.066 8.192-7.68 0.717-0.512 4.915-4.506 9.318-8.704 4.506-4.198 11.469-10.65 15.36-14.336 3.994-3.686 10.65-9.83 14.848-13.824 4.198-3.891 14.336-13.414 22.528-20.992s18.33-16.998 22.528-20.992c4.198-3.891 8.090-7.578 8.806-8.192 1.024-0.922 19.661-18.33 34.714-32.461 3.379-3.174 7.782-7.27 9.728-9.011 7.68-7.066 28.467-26.419 35.635-33.28 13.824-13.107 21.299-16.486 34.509-15.667 18.944 1.229 32.256 14.438 34.611 34.509 1.126 9.83-4.301 22.323-13.414 31.027-3.277 2.97-12.698 11.878-21.197 19.763-8.397 7.782-18.125 16.896-21.504 20.070-3.379 3.277-7.168 6.758-8.294 7.782-1.229 1.024-8.294 7.578-15.77 14.643s-14.336 13.517-15.36 14.336c-2.56 2.253-25.6 23.757-35.328 32.87-4.506 4.301-9.523 9.114-11.264 10.65-4.71 4.198-25.6 23.654-34.816 32.358-4.506 4.198-12.083 11.366-16.896 15.77s-12.186 11.366-16.384 15.258c-15.053 14.029-34.406 32.051-40.755 37.99-3.584 3.379-7.168 7.373-8.090 9.114-3.072 5.939 0.819 15.053 7.373 16.896 5.325 1.434 9.421-0.205 16.282-6.554 21.914-20.48 29.696-27.75 31.642-29.491 1.229-1.024 5.734-5.222 9.933-9.216 4.301-4.096 11.162-10.547 15.36-14.438s10.957-10.138 14.848-13.824c3.994-3.686 10.445-9.728 14.336-13.414 3.994-3.686 13.517-12.595 21.197-19.763 7.68-7.27 15.053-14.131 16.384-15.258s5.837-5.325 10.035-9.318c4.301-4.096 13.414-12.698 20.378-19.149 7.066-6.451 14.234-13.107 15.974-14.848 1.843-1.638 8.806-8.192 15.462-14.438 18.33-17.101 19.149-17.818 22.426-20.275 7.885-5.939 20.173-8.499 30.208-6.246 10.138 2.15 20.275 10.547 25.293 20.787 2.56 5.222 2.867 6.963 2.867 15.565-0.102 8.499-0.41 10.445-2.97 15.667-3.584 7.27-3.277 6.861-39.014 40.141-7.27 6.758-16.691 15.565-20.992 19.661-4.198 3.994-8.704 8.192-9.83 9.216-2.355 1.946-22.016 20.275-36.147 33.587-4.813 4.506-11.776 10.957-15.462 14.336-3.686 3.482-9.626 9.011-13.21 12.288-3.584 3.379-7.578 7.066-8.704 8.192-4.506 4.198-16.794 15.565-25.293 23.552-18.022 16.998-36.147 33.894-37.786 35.328-0.922 0.819-7.27 6.758-14.029 13.107s-13.312 12.39-14.438 13.312c-1.126 1.024-8.499 7.885-16.384 15.36s-15.462 14.541-16.998 15.667c-7.68 6.042-7.578 15.77 0.307 21.094 6.554 4.403 11.162 2.662 23.859-9.421 12.493-11.878 34.509-32.461 36.557-34.202 1.741-1.536 19.661-18.227 36.454-33.997 10.138-9.523 12.595-11.571 18.432-14.541 15.462-8.090 33.382-7.475 48.947 1.741 6.144 3.482 14.95 13.312 18.33 20.275 7.475 15.36 6.451 34.099-2.662 48.333-2.765 4.301-15.974 17.613-35.43 35.43-1.946 1.843-9.011 8.397-15.77 14.746-6.656 6.246-13.312 12.493-14.848 13.824-1.434 1.331-5.632 5.222-9.318 8.704-3.686 3.379-9.933 9.216-13.824 12.902-9.216 8.499-21.402 19.968-31.846 29.696-4.506 4.198-13.926 13.005-20.89 19.456s-15.974 14.848-19.866 18.637c-21.709 20.378-37.274 32.256-57.549 43.725-49.766 28.16-113.254 38.195-169.677 26.624l-10.035-2.048-3.277 2.765c-1.741 1.434-6.758 6.042-10.957 10.035-4.301 3.994-13.926 13.005-21.504 20.070s-17.408 16.282-21.914 20.48c-13.414 12.493-21.402 19.968-24.166 22.426-6.656 6.042-19.661 8.909-27.136 6.042zM384.819 638.464c10.342-2.662 23.347-9.114 30.925-15.462 3.277-2.765 6.349-5.018 6.656-5.018 0.41 0 2.97 2.048 5.837 4.506 13.005 11.366 33.075 18.33 52.531 18.227 22.528-0.102 42.086-8.192 57.856-23.859 29.082-28.877 32.563-75.264 7.987-108.134-2.56-3.379-7.987-9.421-34.611-38.707-8.704-9.523-22.323-24.576-30.208-33.28s-14.541-16.077-14.848-16.384c-0.41-0.41-7.066-7.68-22.835-25.088-1.024-1.126-6.349-6.963-11.776-13.107l-9.933-11.059-2.458 2.867c-1.331 1.638-6.656 7.475-11.776 13.107-27.546 30.106-31.642 34.611-41.574 45.568-4.813 5.325-13.517 14.95-19.456 21.504s-14.438 15.974-18.944 20.89c-4.506 5.018-9.523 10.547-11.162 12.288-9.728 10.445-17.306 19.149-20.070 22.938-5.427 7.475-10.24 18.227-12.902 28.57-2.048 8.294-2.355 11.571-2.048 21.709 0.614 17.101 4.301 29.286 13.107 42.803 11.059 16.998 26.317 28.058 48.333 35.123 10.035 3.174 28.57 3.174 41.37 0z" />
+<glyph unicode="&#xeaa0;" glyph-name="Orange_garden" d="M500.736 875.315c-28.365-20.685-54.886-43.93-76.8-67.482-13.107-14.029-19.149-21.299-33.485-39.834-5.427-7.066-17.715-25.19-17.715-26.112 0-0.512 1.536-1.946 3.379-3.174 5.12-3.686 21.094-16.384 27.341-21.914 8.602-7.578 28.467-27.75 35.84-36.352 29.798-34.918 55.296-80.896 68.813-124.109 1.843-6.144 3.584-11.059 3.891-11.059s2.355 5.632 4.506 12.595c22.118 69.325 66.765 132.096 124.928 175.923 6.246 4.608 9.728 7.885 9.421 8.806-1.024 2.458-11.162 17.101-20.173 28.979-23.757 31.232-52.531 60.621-84.685 86.323-10.957 8.806-33.28 25.293-34.202 25.293-0.102 0-5.12-3.584-11.059-7.885zM179.507 600.269c0.307-162.406 0.512-181.658 2.048-193.126 5.734-41.574 16.077-75.366 34.099-110.49 9.523-18.534 16.589-30.003 29.184-46.797 13.005-17.408 16.077-20.89 33.075-37.99 30.822-30.72 61.030-51.098 105.574-71.066 15.053-6.861 46.49-16.077 67.891-20.070l9.421-1.741v-29.389c0-16.589 0.512-31.949 1.126-35.43 4.198-22.938 26.112-41.267 49.254-41.37 21.914 0 41.882 13.824 48.947 33.997 2.867 8.192 2.867 8.909 2.97 41.882l0.102 30.413 9.523 1.741c18.432 3.277 49.357 12.083 61.645 17.408 1.741 0.819 6.554 2.867 10.752 4.608s13.21 6.042 19.968 9.626c68.301 35.635 122.778 94.208 152.883 164.454 9.011 20.992 16.384 44.954 20.48 66.56 6.246 32.154 6.144 30.31 6.246 222.515l0.102 174.899-5.325-0.512c-2.97-0.307-8.602-0.819-12.595-1.126-62.669-5.12-126.157-30.618-176.23-70.758-51.814-41.574-88.576-94.106-108.954-156.058-10.65-32.358-15.258-59.085-16.794-98.918-0.205-4.506-1.024-9.523-1.741-11.162-4.301-8.806-16.486-9.421-22.016-1.024-1.126 1.741-1.741 5.53-1.946 11.981-1.331 33.28-4.608 56.627-11.366 81.203-18.637 67.686-55.706 125.235-109.261 169.677-54.989 45.568-120.422 71.475-192.512 76.083l-6.963 0.41 0.41-180.429z" />
+<glyph unicode="&#xeaa1;" glyph-name="orange_gesture" d="M76.8 596.787c0.102-260.71 0.307-313.344 1.536-319.795 3.994-21.606 13.107-39.014 28.672-54.784 13.21-13.414 27.238-21.504 47.718-27.443 7.475-2.15 8.499-2.15 132.198-2.458l124.621-0.41 9.933-18.637c10.445-19.558 12.698-23.757 19.866-37.069 35.43-65.331 94.31-114.074 163.43-135.578 19.354-5.939 30.515-8.397 52.122-11.469 11.981-1.741 53.453-1.741 65.536-0.102 5.12 0.717 11.059 1.536 13.312 1.843s9.216 1.638 15.36 3.072c132.71 30.003 224.461 147.046 221.286 282.522-0.307 10.752-0.717 20.173-1.024 20.992-0.205 0.819-0.717 4.301-1.024 7.68-2.15 21.504-10.035 50.995-20.173 74.547-5.325 12.288-7.987 17.715-20.378 40.653-3.789 7.066-9.523 17.92-12.8 24.064-3.277 6.246-6.758 12.698-7.68 14.336-1.024 1.741-4.198 7.68-7.168 13.312s-6.656 12.595-8.192 15.36c-1.536 2.867-4.71 8.806-7.168 13.312-2.355 4.506-6.042 11.469-8.192 15.36-2.15 3.994-6.246 11.776-9.216 17.408s-5.734 10.752-6.144 11.264c-0.41 0.614-3.584 6.554-7.168 13.312-18.739 35.635-23.654 42.598-40.038 56.32-3.584 2.97-13.107 9.114-18.022 11.674l-4.301 2.15-0.41 97.075c-0.307 103.834-0.102 99.123-5.325 114.483-11.674 34.406-43.213 61.235-79.258 67.379-8.704 1.434-40.141 1.638-320.819 1.638h-311.091v-312.013zM634.061 807.834c9.421-6.144 22.118-14.336 28.16-18.33 42.394-27.443 49.562-32.461 52.122-36.352 4.813-7.27 4.301-16.896-1.229-23.45-1.331-1.638-10.342-8.090-20.070-14.336-9.728-6.349-23.654-15.462-31.027-20.173-7.27-4.813-22.016-14.438-32.768-21.402-10.65-6.963-22.221-14.541-25.6-16.691l-6.144-3.994-0.307 24.678-0.205 24.678-13.107 0.205c-44.032 0.819-92.672 13.517-136.397 35.533-20.992 10.65-36.147 14.95-52.122 14.95-19.866 0-41.267-7.68-53.453-19.251l-3.789-3.482-6.963 5.734c-10.957 9.011-24.678 15.258-39.834 18.022-5.632 1.024-23.552 0.717-29.082-0.512l-3.379-0.819 2.867 4.506c25.088 39.014 61.747 62.874 108.442 70.656 8.602 1.434 15.258 1.741 28.16 1.434 9.318-0.205 18.534-0.614 20.48-1.024 23.245-4.301 37.478-9.011 59.597-19.866 9.216-4.506 20.378-9.626 24.883-11.469 27.75-11.162 58.675-17.613 84.48-17.818h8.704l0.307 26.317 0.205 26.317 10.035-6.451c5.427-3.482 17.613-11.469 27.034-17.613zM296.243 726.63c8.192-2.867 15.667-7.27 21.299-12.595 7.68-7.27 6.963-6.042 35.738-59.699 2.048-3.891 6.042-11.264 8.704-16.384 2.662-5.018 6.144-11.469 7.68-14.336 1.536-2.765 4.915-9.011 7.373-13.824 2.56-4.813 7.885-14.643 11.776-22.016 3.994-7.27 9.626-17.92 12.595-23.552s6.451-12.083 7.68-14.336c2.15-3.891 6.349-11.674 14.848-27.648 2.15-3.891 9.114-17.101 15.565-29.184 6.554-12.083 14.029-26.112 16.691-31.232 5.632-10.854 7.373-13.107 5.12-6.656-2.048 5.734-2.765 21.299-1.434 28.16 0.614 2.867 2.867 8.806 5.018 13.414 13.722 28.672 48.435 40.653 77.005 26.522 13.517-6.656 19.763-13.517 29.901-32.563 3.277-6.042 6.042-10.957 6.246-10.957s-0.307 1.946-1.229 4.403c-2.765 7.066-2.458 26.010 0.512 34.714 2.253 6.349 7.782 15.974 12.186 20.787 12.902 14.438 34.611 21.402 53.862 17.408 14.029-2.867 28.262-11.878 35.533-22.528 1.638-2.355 5.632-9.216 8.806-15.258 6.042-11.469 7.68-13.722 4.71-6.451-2.765 6.861-2.355 27.853 0.717 36.045 11.162 28.877 39.731 43.93 69.12 36.352 10.854-2.765 17.306-6.451 25.805-14.848 7.373-7.373 8.294-8.806 28.57-47.104 2.662-5.018 6.144-11.469 7.68-14.336 1.536-2.765 5.018-9.216 7.68-14.336 2.662-5.018 9.626-17.92 15.36-28.672 5.734-10.65 12.698-23.552 15.36-28.672 2.765-5.018 6.144-11.469 7.68-14.336 32.256-60.006 34.406-64.41 41.574-87.962 2.15-7.066 4.813-18.637 6.144-26.214 0.205-1.434 0.614-3.482 0.922-4.608 2.56-11.776 2.662-50.074 0.102-67.072-11.571-77.005-58.88-141.824-128.102-175.206-24.781-11.981-50.79-19.558-76.8-22.221-11.162-1.126-44.134-0.717-53.76 0.614-64.614 9.421-119.091 41.677-157.286 93.389-5.222 7.066-14.746 22.938-21.914 36.352-2.97 5.632-6.656 12.595-8.192 15.36-1.536 2.867-6.861 12.698-11.776 22.016s-10.24 19.251-11.776 22.016c-1.536 2.867-10.035 18.739-18.944 35.328-8.806 16.589-17.92 33.587-20.070 37.683-2.253 3.994-5.734 10.752-7.987 14.848-2.15 3.994-5.837 11.059-8.294 15.565-2.355 4.506-5.12 9.626-6.144 11.264-0.922 1.741-4.608 8.499-8.090 15.053-3.482 6.656-7.373 14.029-8.704 16.384-1.229 2.458-4.608 8.602-7.27 13.619-2.662 5.12-6.349 11.981-8.192 15.36-3.789 6.963-5.632 10.547-27.136 50.688-8.602 16.077-17.715 33.075-20.173 37.888-2.56 4.813-5.939 11.059-7.475 13.824-1.536 2.867-4.608 8.602-6.861 12.8s-9.216 17.101-15.36 28.672c-6.246 11.571-13.722 25.6-16.691 31.232s-6.144 11.674-7.168 13.312c-1.024 1.741-4.71 8.602-8.192 15.36-3.584 6.758-8.499 15.974-10.957 20.48-12.493 22.528-15.974 33.075-15.155 45.773 1.638 26.112 18.842 46.797 44.544 53.453 7.987 2.048 23.347 1.434 31.027-1.331z" />
+<glyph unicode="&#xeaa2;" glyph-name="orange_jobs" d="M269.722 609.69c-0.205-0.41-0.41-35.84-0.512-78.848 0-45.67-0.41-80.794-1.024-84.275-1.331-7.782-4.301-13.21-9.421-16.691-3.584-2.458-5.325-2.97-12.595-3.277-10.854-0.41-17.408 1.638-22.221 6.963-5.632 6.246-7.68 13.926-7.782 29.594l-0.102 9.421h-44.032l0.41-16.077c0.512-18.842 1.536-24.781 6.349-34.611 6.349-13.107 14.95-21.606 28.57-28.16 12.8-6.144 20.070-7.578 37.888-7.578 24.474-0.102 38.195 4.301 51.61 16.486 11.162 10.035 17.203 22.221 19.456 39.117 1.741 12.902 1.536 168.038-0.102 168.141-8.602 0.41-46.182 0.205-46.49-0.205zM521.114 609.997l-2.765-0.307v-109.568c-0.102-60.211 0.205-109.466 0.614-109.568 1.126-0.102 35.226-0.102 38.298 0l2.765 0.102 0.307 9.933 0.307 9.83 2.867-4.506c7.987-12.493 26.010-19.456 49.357-18.944 10.035 0.205 13.619 0.717 19.558 2.867 22.221 7.885 38.298 28.262 43.827 55.808 3.277 16.077 2.458 41.574-1.843 57.037-5.53 19.661-18.944 36.864-34.816 44.442-10.547 5.12-15.77 6.349-26.931 6.451-19.456 0.102-35.84-6.349-46.182-18.022l-4.301-4.915v39.629c0 36.966-0.102 39.526-1.741 39.629-8.397 0.205-37.274 0.307-39.322 0.102zM612.147 517.734c9.626-4.915 17.51-16.179 20.787-29.798 1.946-8.090 1.741-27.546-0.41-36.966-3.277-14.336-11.981-25.498-23.040-29.696-7.475-2.765-19.251-2.355-26.317 1.126-13.722 6.656-22.016 23.552-22.323 45.568-0.102 11.469 0.819 18.33 3.482 26.419 4.096 12.288 12.698 21.606 22.835 24.883 6.349 2.15 19.558 1.331 24.986-1.536zM756.736 553.677c-8.704-0.41-23.654-3.379-30.106-5.734-14.234-5.325-23.962-14.746-28.877-27.75-2.56-6.758-2.662-25.805-0.102-31.334 5.325-11.878 16.998-20.173 36.045-25.498 6.246-1.741 12.698-3.379 14.336-3.686 7.27-1.229 30.515-7.782 35.533-9.933 5.53-2.458 10.957-7.68 11.162-10.752 0.819-10.854-3.584-17.306-14.541-21.299-6.144-2.253-19.354-2.253-26.726-0.102-10.547 3.174-18.944 12.083-19.558 20.992-0.102 2.458-0.717 3.277-2.253 3.379-7.066 0.205-39.629 0-39.834-0.205s0.307-4.096 1.126-8.602c3.686-21.914 19.149-36.966 44.851-43.622 10.65-2.765 37.99-3.584 50.176-1.536 37.069 6.349 55.501 29.389 50.278 63.283-0.922 5.837-6.963 15.565-12.493 19.866-9.728 7.68-19.251 11.162-48.845 17.715-21.811 4.915-28.774 7.475-33.69 12.39-3.379 3.379-3.891 4.506-3.891 8.499 0 9.318 8.090 14.438 22.938 14.438 10.342 0 17.818-1.843 22.938-5.53 4.096-2.97 7.27-8.192 7.578-12.698 0.307-2.97-1.434-2.765 21.811-2.765 7.066 0 14.541 0 16.794 0l3.891 0.102-1.434 7.475c-4.096 20.070-19.251 34.714-41.779 40.141-7.168 1.741-26.726 3.277-35.328 2.765zM399.36 551.936c-37.478-8.090-60.621-37.376-61.85-78.029-1.024-33.997 11.469-60.518 35.43-75.264 14.438-8.909 28.57-12.186 49.459-11.571 16.486 0.41 26.112 2.56 37.069 8.090 20.685 10.342 32.973 26.112 39.424 50.074 1.843 6.861 2.253 11.264 2.253 24.269 0.102 16.794-0.717 21.914-5.222 34.304-9.318 25.395-28.467 41.779-56.013 47.923-8.499 1.946-32.256 2.048-40.55 0.205zM435.2 517.53c10.445-4.915 17.818-15.462 20.89-30.106 1.536-6.963 1.638-29.389 0.205-35.226-4.198-17.613-12.39-27.546-25.702-31.334-7.885-2.355-19.558-1.638-26.931 1.536-6.554 2.867-13.824 10.445-17.203 18.022-5.12 11.571-6.656 33.69-3.482 48.538 3.379 15.36 12.288 26.214 24.883 30.31 6.861 2.253 20.48 1.331 27.341-1.741z" />
+<glyph unicode="&#xeaa3;" glyph-name="orange_messenger" d="M102.707 556.339c0.205-261.427 0.307-276.070 2.048-281.702 9.523-31.027 33.997-52.224 65.229-56.525 1.434-0.205 27.136-0.41 57.139-0.41l54.477-0.102v-153.6l153.6 153.6h486.4l-0.102 273.203c-0.102 299.11 0.307 279.245-6.042 294.298-9.114 21.299-26.214 36.454-50.176 44.237l-6.656 2.15-756.224 0.512 0.307-275.661zM750.49 676.864c18.022-6.349 23.245-28.672 9.83-41.984-8.397-8.397 14.643-7.782-250.368-7.475-225.178 0.307-236.237 0.41-239.411 2.15-5.53 2.97-11.059 9.318-12.902 14.541-4.915 14.643 2.458 28.57 17.818 33.587 0.819 0.307 107.11 0.614 236.134 0.614 203.366 0.102 235.213-0.102 238.899-1.434zM750.694 548.864c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493 0-6.656-0.41-8.397-2.867-12.595-3.379-5.734-9.114-10.138-15.258-11.878-3.379-0.922-61.645-1.126-239.923-0.922-228.659 0.307-235.622 0.41-239.104 2.253-1.946 1.024-5.018 3.482-6.861 5.325-5.427 5.632-6.861 9.318-6.861 17.818-0.102 6.656 0.307 8.294 2.765 12.493 3.277 5.325 8.090 9.523 13.824 11.571 3.174 1.126 41.677 1.434 238.387 1.434 206.848 0.102 235.213-0.102 239.104-1.434zM520.192 420.864c10.854-3.789 16.896-12.698 16.794-24.576 0-5.939-0.512-7.987-2.867-12.083-3.277-5.53-7.987-9.523-13.619-11.571-3.174-1.126-26.112-1.331-122.778-1.434-133.837 0-125.952-0.41-133.939 7.578-10.24 10.24-10.24 26.112 0.102 36.045 8.090 7.885-0.922 7.373 132.506 7.475 103.219 0.102 120.013-0.102 123.802-1.434z" />
+<glyph unicode="&#xeaa4;" glyph-name="Orange_Messenger_1" d="M102.707 556.339c0.205-261.427 0.307-276.070 2.048-281.702 9.523-31.027 33.997-52.224 65.229-56.525 1.434-0.205 27.136-0.41 57.139-0.41l54.477-0.102v-179.302l179.2 179.302h460.8l-0.102 273.203c-0.102 299.11 0.307 279.245-6.042 294.298-9.114 21.299-26.214 36.454-50.176 44.237l-6.656 2.15-756.224 0.512 0.307-275.661zM469.504 762.47c26.010-8.294 44.646-26.522 52.326-51.302 0.819-2.56 1.434-5.12 1.434-5.734s-2.15-2.56-4.813-4.301c-11.469-7.373-24.166-21.504-32.051-35.43-6.246-11.366-10.752-26.829-11.981-42.086-0.307-3.891-1.024-7.475-1.638-7.782-5.427-3.584-32.563-4.506-43.418-1.638-35.123 9.626-58.368 40.653-57.242 76.493 0.41 12.493 2.458 20.992 7.475 31.642 10.035 20.787 29.798 36.25 53.043 41.472 9.421 2.15 28.16 1.434 36.864-1.331zM590.234 692.531c28.877-5.325 52.736-27.443 60.723-56.525 2.15-7.885 2.458-28.467 0.41-36.454-11.571-46.182-60.928-71.475-104.243-53.453-50.278 21.094-63.283 86.323-24.883 124.928 12.186 12.288 26.214 19.149 45.056 22.118 4.506 0.717 17.408 0.307 22.938-0.614zM465.101 585.011c15.155-2.56 14.234-1.946 19.149-12.186 2.458-5.018 6.656-12.186 9.523-15.974 5.837-7.987 18.227-20.070 24.269-23.859 2.253-1.434 4.198-2.765 4.198-3.072s-2.867-1.946-6.349-3.482c-25.498-11.674-49.971-35.021-64-61.030-7.373-13.517-13.824-33.587-15.258-47.104-0.41-3.686-0.819-7.373-1.024-8.192-0.102-0.819-0.307-16.896-0.307-35.533l-0.102-34.099h-28.877c-21.299 0-30.413 0.41-34.304 1.434-19.354 5.12-34.509 20.992-38.195 40.038-0.819 4.301-1.024 20.787-0.819 56.32l0.41 50.176 2.662 9.728c4.403 15.565 8.192 23.962 16.691 36.864 16.998 25.702 45.466 44.134 76.288 49.459 9.728 1.638 27.853 1.946 36.045 0.512zM602.214 511.59c20.89-4.915 37.786-14.029 53.146-28.467 17.203-16.179 28.365-35.43 33.997-58.47 2.15-8.602 2.253-11.776 2.56-82.33l0.41-73.523h-92.672c-63.693 0-94.413 0.307-98.099 1.126-16.589 3.482-30.413 15.258-37.478 31.949l-2.662 6.349-0.307 50.176c-0.205 39.629 0.102 52.019 1.229 58.88 5.53 33.178 23.552 60.416 52.224 79.053 13.824 8.909 26.317 13.517 48.64 17.613 6.246 1.126 30.515-0.307 39.014-2.355z" />
+<glyph unicode="&#xeaa5;" glyph-name="orange_money" d="M882.176 666.522c-6.349-1.024-15.974-4.71-21.709-8.499-3.789-2.458-41.882-39.834-105.472-103.526l-99.635-99.635v61.85c0 38.093-0.41 64.41-1.126 68.403-3.482 21.606-22.323 40.653-44.749 45.158-12.902 2.662-29.389-0.614-41.062-8.090-12.083-7.782-22.323-23.142-24.678-36.966-0.819-4.71-1.024-46.899-0.819-142.336l0.307-135.68 2.662-6.861c7.168-18.534 22.016-31.744 40.448-36.147 5.018-1.229 27.75-1.434 140.186-1.434 86.733 0 136.090 0.41 139.776 1.024 9.83 1.843 20.173 7.578 28.262 15.667 11.981 11.981 17.51 26.419 16.486 42.598-1.024 15.155-6.963 27.955-18.022 38.093-7.27 6.758-13.722 10.24-23.654 13.005-7.373 2.048-10.035 2.15-71.066 2.15h-63.488l100.147 100.147c63.693 63.693 101.376 102.093 103.526 105.574 5.939 9.421 8.192 17.51 8.192 29.798 0 8.499-0.512 12.186-2.355 17.613-5.837 16.794-18.739 29.798-35.635 35.738-5.939 2.048-20.070 3.277-26.522 2.355zM157.184 630.067c-15.155-2.867-31.642-15.872-38.707-30.515-15.565-32.563 2.765-70.963 37.786-79.36 4.813-1.229 18.432-1.434 69.427-1.536h63.386l-100.045-100.045c-63.386-63.488-101.376-102.195-103.526-105.677-7.578-11.878-10.547-29.286-7.27-42.086 7.987-31.539 38.605-50.176 68.915-41.984 4.71 1.229 11.366 3.994 14.746 6.042 4.71 2.867 30.925 28.467 106.496 104.038l100.25 100.25 0.102-62.874c0-34.611 0.307-64.307 0.512-66.048 1.843-11.366 7.475-22.221 16.077-31.027 10.035-10.24 22.221-15.462 37.581-16.077 17.101-0.717 31.334 5.222 43.11 17.613 6.758 7.27 12.288 18.022 14.131 27.443 0.922 4.608 1.126 40.858 0.922 142.336l-0.307 136.192-2.662 6.861c-7.168 18.534-21.504 31.334-40.346 36.147-5.325 1.331-23.245 1.536-140.8 1.434-79.872-0.102-136.704-0.512-139.776-1.126z" />
+<glyph unicode="&#xeaa6;" glyph-name="orange_Photography" d="M128.205 523.059c0.307-293.478 0.41-309.35 2.15-315.187 2.765-9.421 10.24-23.859 15.77-30.72 6.963-8.602 17.51-16.998 27.136-21.914 4.608-2.253 8.602-3.891 9.011-3.686 0.307 0.205 0.614 140.902 0.512 312.73 0 311.501 0 312.32 2.048 312.627 1.126 0.205 142.029 0.307 313.139 0.307l310.989-0.102-0.614 2.048c-1.126 3.789-7.578 14.95-11.571 20.378-8.192 11.059-20.48 20.48-34.304 26.214-15.974 6.656 5.325 6.246-329.933 6.246h-304.538l0.205-308.941zM210.534 749.158c-0.205-0.307-0.205-138.854-0.102-307.814l0.102-307.2 2.253-8.090c7.27-26.214 24.269-45.568 49.152-55.91 15.36-6.451-5.018-6.042 328.704-6.144h305.357v305.459c0 297.882-0.102 305.562-2.048 314.982-5.222 25.395-22.528 47.002-46.285 57.856-5.018 2.253-12.288 4.608-19.763 6.349-3.789 0.922-616.858 1.434-617.37 0.512zM820.429 691.405c7.475-3.686 15.36-12.186 18.33-19.968l2.253-5.837 0.102-189.952c0.102-104.448 0-190.362-0.205-190.771-0.205-0.512-2.048 1.126-4.096 3.584-2.15 2.355-7.27 8.294-11.469 13.21-4.198 4.813-13.005 14.95-19.456 22.426s-16.998 19.661-23.45 27.034c-6.349 7.373-12.595 14.541-13.824 15.974s-9.523 11.059-18.534 21.402c-9.011 10.342-18.022 20.787-19.968 23.040-1.946 2.355-10.957 12.698-19.968 23.142s-25.395 29.184-36.25 41.779c-10.854 12.595-20.787 23.45-22.016 24.269-2.15 1.434-5.734 1.946-10.547 1.638-2.56-0.102-9.318-6.451-17.818-16.486-3.072-3.686-6.758-7.987-8.192-9.728-1.536-1.638-10.035-11.571-18.944-22.016-9.011-10.445-22.118-25.6-29.082-33.792-7.066-8.090-23.142-26.726-35.738-41.472-12.595-14.643-25.19-29.389-28.16-32.666-2.867-3.277-5.734-6.758-6.451-7.68-0.922-1.126-1.536-1.331-2.048-0.512-59.187 83.046-76.8 107.213-79.258 108.954-8.499 6.144-13.722 3.379-31.232-16.384-13.722-15.462-18.022-20.173-21.402-23.962-1.126-1.229-5.222-5.837-9.216-10.342-3.891-4.403-7.68-8.499-8.192-9.114-0.614-0.614-4.506-5.018-8.704-9.83s-7.885-8.909-8.192-9.216c-0.307-0.307-6.042-6.758-12.8-14.336s-14.131-15.872-16.486-18.432c-2.355-2.56-6.451-7.27-9.216-10.445s-5.53-5.837-6.042-5.837c-1.536-0.102-10.957 9.83-13.619 14.336-5.53 9.216-5.325 1.536-5.325 188.518v172.851l549.376-0.512 5.837-2.867zM394.65 623.002c-5.837-0.717-16.486-4.096-21.606-6.861-9.216-4.915-19.763-16.179-24.883-26.522-15.36-31.13-0.717-69.12 31.744-82.33 22.323-9.011 47.206-3.891 64.614 13.414 12.595 12.493 18.534 27.443 17.818 45.056-0.614 15.77-6.144 28.16-17.92 39.936-13.414 13.517-31.232 19.661-49.766 17.306z" />
+<glyph unicode="&#xeaa7;" glyph-name="orange_pro" d="M76.902 493.875c0-277.094 0.102-287.334 1.946-296.243 8.192-39.117 36.762-69.018 75.878-79.565l8.602-2.355 783.872-0.512-0.205 289.485-0.307 289.587-2.765 9.83c-10.752 39.014-40.243 66.662-79.667 74.65-9.83 2.048-15.155 2.048-398.746 2.048h-388.71l0.102-286.925zM323.891 676.864c40.448-7.066 71.987-35.942 82.33-75.059 3.686-13.926 3.891-36.352 0.512-49.766-11.674-46.182-52.429-78.336-99.533-78.234-27.238 0-52.122 10.138-71.27 28.979-13.722 13.619-22.733 28.774-27.75 47.104-2.458 9.114-2.765 11.981-2.765 26.112 0 16.384 0.717 20.48 5.734 35.328 7.987 23.040 26.726 44.032 49.664 55.91 19.046 9.728 42.394 13.312 63.078 9.626zM827.904 676.659c10.547-3.584 17.818-15.053 16.589-26.419-0.717-6.554-2.662-10.65-7.782-15.77-7.68-7.68 0.307-7.27-132.813-7.27-129.536 0-123.085-0.307-131.072 5.734-11.776 9.011-12.698 27.341-1.843 37.888 8.192 7.885-0.819 7.373 132.608 7.475 108.544 0.102 119.808-0.102 124.314-1.638zM828.826 574.054c19.456-8.397 21.299-34.509 3.174-45.568l-5.12-3.174-121.446-0.307c-119.91-0.205-121.549-0.205-126.362 1.843-5.222 2.253-10.65 7.27-13.517 12.493-1.331 2.355-1.843 5.632-1.843 11.059 0 6.554 0.512 8.499 2.867 12.493 1.536 2.662 4.301 6.042 6.246 7.475 7.578 5.734 1.331 5.53 131.379 5.53 116.429 0.102 120.115 0 124.621-1.843zM238.592 468.173c13.824-9.011 31.334-15.77 48.128-18.432 9.421-1.536 34.918-1.741 40.96-0.307 1.434 0.307 4.915 1.126 7.68 1.741 16.896 3.789 39.936 14.643 50.79 24.064 1.434 1.229 2.458 0.922 7.68-2.765 33.587-23.45 54.682-55.398 64.205-97.178 2.15-9.523 2.15-11.981 2.56-96.563l0.307-86.835-122.163 0.41c-111.821 0.205-122.675 0.41-127.898 2.048-23.654 7.168-41.984 23.142-50.995 44.442-6.144 14.234-6.451 18.33-5.939 74.752 0.205 28.058 0.717 52.634 1.126 54.579s1.434 6.758 2.253 10.65c3.072 14.848 11.059 34.406 19.558 48.026 10.547 17.101 27.648 34.714 43.827 45.568l6.144 4.096 2.56-1.946c1.434-1.126 5.53-3.994 9.216-6.349zM806.4 396.8h38.4l-31.744-31.744c-17.408-17.51-31.744-32.051-31.744-32.256 0-0.307 14.029-14.541 31.232-31.744s31.232-31.437 31.232-31.744c0-0.307-16.998-0.512-37.888-0.512h-37.888v-37.888c0-20.787-0.205-37.888-0.512-37.888s-14.643 14.131-31.846 31.334c-27.546 27.546-31.437 31.13-32.973 29.901-0.922-0.717-15.155-14.848-31.642-31.232-16.384-16.486-30.106-30.003-30.413-30.003s-0.614 17.101-0.614 37.888v37.888h-37.888c-20.787 0-37.888 0.205-37.888 0.512s14.029 14.541 31.232 31.642c17.203 17.203 31.232 31.437 31.232 31.744s-14.234 14.848-31.744 32.358l-31.744 31.744h76.8l0.205 38.195 0.307 38.093 31.437-31.437c18.944-18.944 31.949-31.232 32.768-30.925 0.717 0.307 15.155 14.438 32.051 31.437l30.72 30.925 0.307-38.093 0.205-38.195h38.4zM296.448 425.267c-0.307-1.331-6.963-34.816-14.848-74.445-7.885-39.731-14.643-73.216-14.95-74.445-0.512-1.946 2.867-5.734 19.968-22.835l20.582-20.582 20.582 20.582c16.794 16.794 20.48 20.992 19.968 22.733-0.41 1.741-16.691 83.558-19.354 96.973-0.205 1.434-2.355 11.981-4.813 23.552-2.355 11.571-4.403 21.914-4.71 23.040-0.205 1.126-0.614 3.277-1.024 4.915l-0.614 2.765h-10.138c-9.626 0-10.138-0.102-10.65-2.253z" />
+<glyph unicode="&#xeaa8;" glyph-name="orange_protect" d="M502.272 831.488c-0.512-0.205-4.506-1.126-8.704-2.048-14.643-3.379-25.395-9.728-37.99-22.323-9.318-9.216-104.243-105.677-117.555-119.398-5.325-5.427-30.618-31.13-56.32-57.242s-52.941-53.862-60.518-61.645c-15.667-15.974-95.642-97.28-108.954-110.797-4.813-4.813-8.806-9.114-8.806-9.421s34.304-0.614 76.288-0.614h76.288v-157.184c0-139.674 0.205-158.106 1.638-165.171 5.837-28.467 26.317-50.381 55.398-59.29 5.632-1.638 17.203-1.843 195.379-2.048 171.52-0.307 190.157-0.205 197.632 1.331 31.744 6.451 55.706 31.232 60.928 62.976 0.614 4.301 1.024 60.416 1.024 163.021v156.365h153.702l-7.475 7.578c-11.162 11.264-94.72 96.256-109.261 111.104-6.963 7.066-33.69 34.304-59.494 60.518s-53.043 53.862-60.518 61.645c-22.835 23.245-99.942 101.683-112.23 114.074-17.203 17.203-28.16 23.859-45.875 27.546-6.656 1.331-21.606 1.946-24.576 1.024zM521.728 449.024c30.31-4.813 54.579-26.829 62.464-56.422 8.192-30.925-4.608-64.717-31.232-82.842-3.379-2.355-6.042-4.506-5.734-4.915 0.205-0.41 0.717-3.891 1.024-7.885 0.41-3.891 0.922-9.011 1.126-11.264 0.922-8.090 1.434-13.414 2.048-20.48 0.307-3.891 0.819-8.499 1.024-10.24 0.205-1.638 0.614-6.246 1.024-10.24 0.307-3.891 0.819-8.499 1.024-10.24 0.205-1.638 0.614-6.246 1.024-10.24 0.307-3.891 0.819-8.499 1.024-10.24 0.614-4.506 1.434-13.414 3.072-30.72 0.307-3.891 0.819-8.909 1.126-10.957l0.512-3.891h-102.707l0.717 6.451c0.307 3.482 0.819 7.475 1.024 8.909s0.614 6.042 1.024 10.24c0.41 4.198 0.819 8.806 1.024 10.24s0.614 6.246 1.024 10.752c0.41 4.506 0.819 9.318 1.024 10.752s0.614 5.325 0.922 8.704c0.307 3.379 1.229 12.8 2.15 20.992 0.819 8.192 1.741 17.818 2.15 21.504 0.307 3.686 0.717 7.68 0.922 8.909s0.614 6.246 1.024 11.264l0.717 9.114-5.53 3.584c-15.258 10.24-26.931 27.034-31.437 45.67-2.458 9.933-2.253 27.238 0.307 37.171 5.734 21.504 20.173 39.117 40.141 49.050 14.643 7.27 30.208 9.83 45.978 7.27z" />
+<glyph unicode="&#xeaa9;" glyph-name="orange_radio" d="M142.336 728.883c-16.384-2.867-31.642-10.65-43.008-21.811-8.294-8.294-16.486-22.221-20.173-34.304-1.741-5.837-1.843-18.022-2.048-221.389-0.307-210.842-0.307-215.45 1.638-224.461 6.758-30.925 31.744-54.682 62.566-59.392 5.734-0.922 99.021-1.126 375.296-0.922 350.72 0.307 367.923 0.41 373.76 2.15 26.931 8.090 46.797 28.262 54.477 55.194 1.741 6.144 1.843 17.818 1.843 223.539 0 211.046-0.102 217.293-1.946 224.256-7.987 28.877-30.003 50.074-58.573 56.115-6.144 1.331-53.248 1.536-374.17 1.536-201.933 0-368.23-0.307-369.664-0.512zM190.566 623.514c6.042-4.198 8.602-8.909 8.602-16.282 0-7.885-2.765-13.312-8.806-17.408-3.891-2.662-5.427-3.072-11.366-3.072s-7.373 0.41-11.162 3.072c-6.246 4.403-9.318 10.752-8.704 18.022 0.614 9.114 5.53 15.36 14.438 18.534 4.198 1.536 12.902 0 16.998-2.867zM272.794 623.411c11.264-7.987 11.162-25.702-0.205-33.382-10.752-7.27-25.498-2.867-30.515 9.114-4.198 10.035 1.843 23.347 11.878 26.829 5.734 1.843 14.131 0.717 18.842-2.56zM354.406 623.514c6.042-4.198 8.602-8.909 8.602-16.282 0-7.782-2.662-13.21-8.602-17.408-3.789-2.662-5.222-3.072-11.366-3.072s-7.578 0.41-11.366 3.072c-6.246 4.403-9.318 10.752-8.704 18.125 0.512 7.066 3.482 12.288 8.704 15.667 5.018 3.072 6.758 3.584 13.312 3.072 3.789-0.307 6.656-1.229 9.421-3.174zM434.79 624.435c2.253-1.126 5.325-3.994 7.066-6.349 2.56-3.686 3.072-5.325 3.072-10.65 0-7.987-2.662-13.414-8.602-17.613-3.789-2.662-5.222-3.072-11.366-3.072s-7.578 0.41-11.366 3.072c-6.349 4.506-9.421 10.752-8.806 18.125 0.307 3.379 1.434 7.373 2.662 9.318 2.15 3.482 8.192 8.192 11.981 9.216 3.686 1.024 11.366 0 15.36-2.048zM518.246 623.514c6.042-4.198 8.602-8.909 8.602-16.282 0-7.885-2.765-13.312-8.806-17.408-3.891-2.662-5.427-3.072-11.366-3.072s-7.373 0.41-11.162 3.072c-6.246 4.403-9.318 10.752-8.704 18.022 0.614 9.114 5.53 15.36 14.438 18.534 4.198 1.536 12.902 0 16.998-2.867zM716.8 563.2v-64h-25.6v51.2h-25.6v-51.2h-25.6v51.2h-25.6v-51.2h-25.6v128h128v-64zM870.4 563.2v-64h-25.6v51.2h-25.6v-51.2h-25.6v51.2h-25.6v-51.2h-25.6v128h128v-64zM190.874 541.491c8.499-6.042 11.059-18.842 5.53-27.546-4.198-6.554-9.114-9.114-17.408-9.114-5.939 0-7.373 0.41-11.162 3.072-10.65 7.578-12.083 21.709-2.97 31.13 4.813 4.915 8.806 6.349 16.282 5.734 3.994-0.307 6.758-1.229 9.728-3.277zM272.486 541.594c6.246-4.301 8.602-8.909 8.602-16.896 0-5.734-0.41-7.373-2.97-10.957-5.325-7.68-13.926-10.854-22.835-8.499-5.222 1.434-11.878 7.782-13.619 13.005-1.638 4.813-0.717 12.902 2.048 17.203 2.048 3.379 8.192 8.090 11.878 9.114 4.506 1.331 12.902-0.205 16.896-2.97zM353.69 542.31c1.843-1.229 4.71-4.096 6.349-6.349 3.789-5.53 4.198-14.541 0.819-20.89-4.506-8.602-16.589-13.005-25.395-9.216-5.018 2.15-10.342 7.782-11.981 12.493-2.458 7.475 1.536 19.661 7.475 23.040 7.68 4.403 16.486 4.71 22.733 0.922zM435.61 542.31c1.843-1.229 4.71-4.096 6.349-6.349 3.789-5.427 4.198-14.541 0.922-20.787-6.144-11.571-22.118-14.234-31.642-5.222-6.246 5.837-8.090 12.698-5.734 21.094 1.331 4.71 7.68 11.366 12.39 13.005 4.915 1.638 13.619 0.717 17.715-1.741zM518.246 541.594c6.042-4.198 8.602-8.909 8.602-16.282 0-7.782-2.765-13.312-8.499-17.203-14.336-9.728-33.28 1.434-31.642 18.534 0.717 6.554 3.482 11.366 8.704 14.848 5.12 3.277 6.758 3.789 13.414 3.277 3.789-0.307 6.656-1.229 9.421-3.174zM189.030 460.595c2.253-1.126 5.325-3.994 7.066-6.349 2.56-3.686 3.072-5.325 3.072-10.65 0-7.885-2.56-13.107-8.397-17.306-9.114-6.656-21.914-4.198-28.467 5.427-2.662 3.891-3.072 5.427-3.072 11.162 0 5.12 0.512 7.475 2.355 10.342 2.253 3.686 8.192 8.397 12.083 9.421 3.686 1.024 11.366 0 15.36-2.048zM270.95 460.595c2.253-1.126 5.325-3.994 7.066-6.349 2.56-3.686 3.072-5.325 3.072-10.65 0-7.987-2.662-13.414-8.602-17.613-3.789-2.662-5.222-3.072-11.162-3.072-8.192 0-13.21 2.56-17.408 9.011-3.584 5.325-3.891 14.541-0.614 20.685 2.15 4.096 8.294 9.216 12.186 10.138 3.994 0.922 11.571-0.102 15.462-2.15zM354.714 459.571c5.427-3.891 8.294-9.626 8.294-16.691 0-7.27-2.867-12.902-8.806-16.896-3.891-2.662-5.427-3.072-11.366-3.072s-7.373 0.41-11.162 3.072c-10.547 7.475-12.083 22.118-3.072 31.13 4.71 4.71 9.216 6.246 16.384 5.734 4.096-0.307 6.758-1.229 9.728-3.277zM436.326 459.674c6.042-4.198 8.602-8.909 8.602-16.282 0-11.674-7.168-19.763-18.534-20.582-4.915-0.41-6.861 0-10.65 1.946-12.186 6.349-14.848 22.733-5.325 32.256 2.15 2.15 5.427 4.403 7.373 5.12 5.632 1.843 13.926 0.819 18.534-2.458zM518.246 459.674c6.042-4.198 8.602-8.909 8.602-16.282 0-7.782-2.662-13.21-8.602-17.408-3.789-2.662-5.222-3.072-11.162-3.072-8.192 0-13.21 2.56-17.408 9.011-3.584 5.325-3.891 14.541-0.614 20.685 2.15 4.096 8.294 9.216 12.186 10.138 4.915 1.126 13.005-0.307 16.998-3.072zM819.405 389.632c28.365-7.168 48.64-31.027 50.688-59.802 2.15-30.822-16.384-57.856-46.694-68.301-8.192-2.867-23.45-3.584-32.87-1.536-7.782 1.638-22.118 7.987-26.624 11.878-16.794 14.131-25.293 30.208-26.317 49.664-2.458 44.339 39.117 78.848 81.818 68.096zM190.874 377.651c8.499-6.042 11.059-18.842 5.53-27.546-4.198-6.554-9.114-9.114-17.408-9.114-5.939 0-7.373 0.41-11.162 3.072-6.246 4.403-9.318 10.752-8.704 18.125 0.512 7.066 3.482 12.288 8.704 15.667 5.018 3.174 6.758 3.584 13.312 3.072 4.096-0.307 6.758-1.229 9.728-3.277zM267.571 380.314c5.222-1.434 11.366-7.885 13.005-13.722 2.458-8.806-1.229-18.432-8.909-23.142-3.072-1.946-5.325-2.458-10.752-2.458-5.939 0-7.373 0.41-11.162 3.072-10.547 7.475-12.083 21.709-3.174 30.925 5.734 5.837 12.8 7.68 20.992 5.325zM354.304 377.958c6.042-3.994 8.704-9.114 8.704-16.998 0-7.987-2.662-13.005-9.011-17.203-3.482-2.253-5.325-2.765-10.854-2.765-8.090 0-13.107 2.56-17.306 9.011-3.584 5.325-3.891 14.541-0.614 20.685 2.15 4.096 8.294 9.216 12.186 10.138 4.71 1.126 13.107-0.307 16.896-2.867zM431.514 380.211c15.77-4.813 18.534-27.136 4.403-36.454-3.482-2.355-5.325-2.765-11.059-2.765-6.042 0-7.475 0.41-11.264 3.072-10.547 7.475-12.083 22.118-3.072 31.13 5.734 5.734 12.8 7.475 20.992 5.018zM513.434 380.211c8.704-2.662 15.053-13.107 13.517-22.528s-8.909-16.077-18.842-16.794c-18.432-1.434-28.672 20.787-15.77 34.099 5.837 5.939 12.8 7.68 21.094 5.222zM190.874 295.731c8.499-6.042 11.059-18.842 5.53-27.546-4.198-6.554-9.114-9.114-17.408-9.114-5.939 0-7.373 0.41-11.162 3.072-10.547 7.475-12.083 22.118-3.072 31.13 4.71 4.71 9.216 6.246 16.384 5.734 4.096-0.307 6.758-1.229 9.728-3.277zM272.486 295.834c6.042-4.198 8.602-8.909 8.602-16.282 0-7.782-2.662-13.21-8.602-17.408-3.789-2.662-5.222-3.072-11.162-3.072-5.427 0-7.68 0.512-10.752 2.458-11.162 6.861-13.107 22.528-3.994 31.642 2.15 2.15 5.427 4.403 7.373 5.12 5.632 1.843 13.926 0.819 18.534-2.458zM354.406 295.834c6.042-4.198 8.602-8.909 8.602-16.282 0-7.782-2.662-13.21-8.602-17.408-3.789-2.662-5.222-3.072-11.366-3.072s-7.578 0.41-11.366 3.072c-6.246 4.403-9.318 10.752-8.704 18.022 0.614 9.114 5.53 15.36 14.438 18.534 4.198 1.536 12.902 0 16.998-2.867zM434.79 296.755c2.253-1.126 5.325-3.994 7.066-6.349 2.56-3.686 3.072-5.325 3.072-10.65 0-7.987-2.662-13.414-8.602-17.613-3.789-2.662-5.222-3.072-11.366-3.072s-7.578 0.41-11.366 3.072c-6.349 4.506-9.421 10.752-8.806 18.125 0.307 3.379 1.434 7.373 2.662 9.318 2.15 3.482 8.192 8.192 11.981 9.216 3.686 1.024 11.366 0 15.36-2.048zM513.229 298.291c5.632-1.638 11.469-7.578 13.005-13.414 3.686-12.902-4.71-24.883-18.022-25.907-7.68-0.614-13.824 2.355-18.227 8.909-2.56 3.789-3.072 5.53-3.072 10.65 0 7.782 2.458 13.005 8.090 16.794 6.246 4.301 11.059 5.12 18.227 2.97z" />
+<glyph unicode="&#xeaaa;" glyph-name="orange_reflections" d="M141.312 881.562c-19.354-5.12-34.406-20.992-37.786-39.731-0.819-4.403-1.126-119.603-1.126-395.264 0-321.024 0.307-390.144 1.434-394.342 4.915-18.739 19.149-32.973 37.581-37.888 8.602-2.355 578.253-2.253 587.162 0 19.149 4.915 34.406 20.48 38.298 39.219 0.717 3.686 1.126 27.341 1.126 71.885v66.56h-51.2v-76.8h-563.2v716.8h383.59l1.126 8.499c1.946 13.824 6.963 26.214 15.258 36.864l4.506 5.837-205.619-0.102c-176.742 0-206.336-0.205-211.149-1.536zM448.205 86.016c19.763-11.571 14.95-41.677-7.475-46.694-11.162-2.458-22.835 2.765-27.853 12.595-9.421 18.227 3.891 38.605 24.269 37.171 4.506-0.307 7.885-1.229 11.059-3.072zM602.112 881.562c-16.589-4.403-29.286-15.974-35.942-32.666l-2.458-6.144-0.614-164.454-51.098-51.2-51.2-51.098 102.4-102.502v-104.858c0-72.602 0.307-106.496 1.126-110.285 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 269.21-1.638 276.89 0 19.763 4.096 36.352 21.197 39.731 40.858 0.819 4.813 1.024 87.962 0.819 294.912l-0.307 288.256-2.458 6.144c-6.451 16.077-17.613 26.726-33.382 31.846l-7.168 2.355h-135.168c-115.917 0-135.987-0.205-140.8-1.536zM870.4 576v-256h-256v512h256v-256zM751.104 292.659c14.643-4.915 21.094-23.245 13.107-36.864-11.981-20.582-44.032-14.029-47.002 9.626-2.355 19.149 15.462 33.587 33.894 27.238z" />
+<glyph unicode="&#xeaab;" glyph-name="Orange_rewards" d="M507.187 882.074c-2.355-0.41-5.632-1.536-7.27-2.355s-17.101-15.667-34.304-32.87c-17.203-17.203-31.539-31.232-31.744-31.232s-9.114 2.355-19.763 5.12c-10.65 2.867-25.088 6.758-32.154 8.602-37.478 10.035-35.533 9.728-43.52 7.68-5.018-1.229-13.005-7.578-15.258-12.083-0.819-1.434-2.867-7.987-4.608-14.438s-6.861-25.293-11.264-41.882c-4.506-16.486-8.499-30.413-9.011-30.822-0.614-0.717-13.21-4.198-32.563-9.216-17.408-4.506-49.971-13.517-52.838-14.746-8.192-3.379-14.336-13.107-14.336-22.426 0-4.403 3.072-18.227 8.294-36.557 1.434-5.222 8.909-32.87 9.626-35.84 0.307-1.434 1.434-5.632 2.56-9.421l2.048-6.963-31.949-31.949c-28.774-28.877-32.154-32.563-33.894-37.478-2.253-6.554-1.843-14.336 1.229-20.275 1.126-2.253 15.872-17.715 33.28-35.123l31.13-31.13-2.253-8.806c-4.813-18.022-9.011-33.997-14.541-54.374-3.789-13.722-5.734-22.835-5.632-26.419 0.102-6.758 3.379-13.619 8.909-18.33 5.12-4.301 3.379-3.789 75.264-22.938 8.704-2.355 15.974-4.301 16.179-4.506s7.066-25.498 16.179-59.904c7.27-27.238 8.806-30.925 15.667-35.738 3.789-2.765 6.758-3.789 12.39-4.608 3.789-0.512 10.547 1.024 37.376 8.192 18.022 4.813 37.478 9.933 43.315 11.469l10.547 2.662 31.437-31.334c34.099-34.099 36.045-35.533 46.285-35.635 10.445 0 12.902 1.946 46.592 35.738 16.896 16.998 31.334 30.822 32.051 30.822s14.336-3.482 30.208-7.782c52.326-14.029 55.501-14.746 59.904-14.234 5.53 0.717 9.216 2.15 13.312 5.222 6.246 4.813 8.909 10.957 14.643 34.406 0.922 3.789 10.035 37.683 14.336 53.146l2.15 7.885 16.077 4.198c37.581 9.933 65.434 17.51 69.427 19.046 4.915 1.946 10.752 7.987 13.107 13.517 3.174 7.578 2.355 12.8-9.523 56.627l-11.264 41.472 31.334 31.437c17.203 17.306 32.154 33.075 33.178 35.123 2.97 5.734 3.379 12.698 1.229 19.558-1.741 5.632-3.277 7.373-33.792 37.99-17.613 17.715-31.846 32.666-31.642 33.382 0.307 0.717 5.325 19.456 11.366 41.677 11.674 43.315 12.288 47.718 8.806 55.603-3.789 8.192-9.523 12.493-21.197 15.565-3.379 0.922-10.547 2.867-15.872 4.198-12.083 3.277-40.755 10.957-51.712 13.824-4.506 1.229-8.602 2.56-9.011 2.97-0.819 0.717-3.379 9.318-8.909 30.208-9.114 34.918-14.643 54.477-15.872 56.73-3.686 7.168-13.926 13.312-22.118 13.414-2.56 0-9.421-1.331-15.36-2.97-5.837-1.638-24.781-6.758-42.086-11.366l-31.437-8.397-31.539 31.539c-21.606 21.504-32.87 32.051-35.635 33.28-5.325 2.253-10.24 2.867-15.565 1.843zM533.504 728.064c26.214-3.072 47.104-9.216 69.837-20.48 54.784-27.136 94.515-77.722 108.237-137.728 6.758-29.389 6.451-67.277-0.922-95.334-19.046-73.114-75.674-129.843-148.48-148.378-15.974-4.096-26.010-5.325-46.592-5.734-26.726-0.41-45.875 2.355-69.837 10.445-63.181 21.197-114.176 75.674-131.379 140.083-5.427 20.378-6.656 31.539-6.554 56.422 0.205 48.026 16.691 92.262 48.538 130.048 28.672 33.894 73.728 60.518 114.586 67.584 1.946 0.307 3.789 0.717 4.096 0.922 0.717 0.41 8.806 1.434 20.070 2.56 8.294 0.819 30.208 0.614 38.4-0.41zM490.803 702.362c-80.691-9.318-145.306-73.011-156.467-154.419-1.434-10.138-1.434-39.731 0-47.718 5.018-29.389 13.312-51.405 27.546-73.318 28.774-44.134 76.902-74.24 128.102-80.077 8.397-1.024 38.605-0.922 45.875 0.102 58.88 8.192 110.080 44.851 136.397 97.792 17.92 35.942 23.142 75.366 15.258 115.814-8.704 44.851-37.581 87.552-76.698 113.254-35.328 23.347-77.722 33.382-120.013 28.57zM273.408 252.723c-5.325-9.216-11.571-20.173-13.926-24.166-2.355-4.096-7.578-13.107-11.674-20.173-3.994-7.066-8.397-14.643-9.728-16.896-4.608-8.090-27.955-48.333-33.792-58.368-3.277-5.632-6.963-12.083-8.192-14.336-1.331-2.253-5.632-9.728-9.626-16.691-6.861-11.981-7.066-12.493-4.403-11.878 1.536 0.41 24.371 6.144 50.893 12.8 26.419 6.656 48.333 11.674 48.64 11.162 0.307-0.41 6.042-23.245 12.8-50.586s12.493-49.766 12.8-49.766c0.307 0 6.042 9.318 12.8 20.787 6.758 11.366 14.848 25.088 17.92 30.413 3.174 5.325 9.83 16.486 14.643 24.883 18.842 31.949 26.624 45.056 41.165 69.837 8.294 14.131 16.282 27.648 17.715 30.208s3.686 6.349 5.018 8.499c1.434 2.253 2.355 4.096 2.15 4.301-0.205 0.102-8.602-2.048-18.739-4.71-32.973-9.011-45.978-12.186-51.2-12.595-18.637-1.434-39.936 10.65-48.333 27.546-1.741 3.482-5.939 16.998-9.523 30.72-3.584 13.517-6.758 24.883-7.066 25.293-0.307 0.307-5.018-6.963-10.342-16.282zM739.021 264.602c-0.922-3.072-2.867-10.138-4.301-15.77-8.806-33.28-10.445-37.581-18.534-46.49-11.469-12.8-29.491-19.149-45.773-16.282-2.97 0.512-17.306 4.198-31.949 8.192-14.643 3.891-27.75 7.373-29.082 7.578-1.434 0.307-2.867 0.717-3.379 1.024-0.41 0.307-0.819 0.307-0.819 0.102 0-0.41 39.219-67.379 68.506-116.941 4.301-7.27 15.667-26.522 25.19-42.701s17.613-29.082 18.022-28.672c0.307 0.41 6.246 22.938 13.005 50.176s12.493 49.664 12.698 49.869c0.205 0.205 23.142-5.325 50.995-12.288s50.688-12.595 50.79-12.493c0.102 0.102-3.789 7.168-8.704 15.565-14.541 24.986-43.725 75.469-45.875 79.36-2.253 3.994-30.003 52.019-36.147 62.464-2.15 3.686-5.939 10.24-8.499 14.746l-4.608 8.090-1.536-5.53z" />
+<glyph unicode="&#xeaac;" glyph-name="Orange_security_suite" d="M501.76 876.442c-20.787-14.234-53.453-32.461-75.776-42.394-5.325-2.355-11.981-5.427-14.848-6.656-31.334-14.029-80.179-28.877-117.248-35.738-4.813-0.922-10.957-2.15-13.824-2.662-2.765-0.512-7.373-1.229-10.24-1.536-2.765-0.307-6.246-0.819-7.68-1.024-5.12-0.922-30.413-3.482-40.448-4.096-5.632-0.41-12.493-0.819-15.36-1.024-2.765-0.205-15.872-0.41-28.979-0.41l-23.859-0.102 0.41-158.925c0.205-87.45 0.717-160.154 0.922-161.587 0.307-1.434 0.819-5.734 1.229-9.728 3.174-34.816 11.571-74.957 23.347-111.104 35.635-109.568 103.936-200.602 196.915-262.451 37.786-25.19 75.981-43.93 121.446-59.597l13.926-4.813 12.186 4.096c63.59 21.094 128.307 57.651 173.466 97.997 37.171 33.28 62.976 62.874 88.269 101.376 36.147 54.886 62.362 119.603 74.957 184.32 3.584 18.534 4.71 25.907 6.656 44.544 0.614 5.325 1.434 11.571 1.741 13.824 0.41 2.253 0.922 75.674 1.126 163.123l0.41 158.925-23.859 0.102c-13.107 0-26.112 0.205-28.979 0.41-2.765 0.205-10.138 0.614-16.384 1.024-6.144 0.307-12.493 0.819-14.131 0.922-1.536 0.205-5.632 0.717-9.216 1.024-6.656 0.717-19.558 2.355-24.781 3.277-1.638 0.205-5.837 0.922-9.216 1.434-24.474 3.789-60.006 12.698-88.166 22.118-11.674 3.891-40.243 14.848-49.050 18.842-31.334 14.131-59.494 29.696-85.709 47.309-5.018 3.277-9.114 5.939-9.216 5.837-0.205 0-4.71-2.97-10.035-6.656zM555.52 676.864c14.336-2.253 19.354-3.277 30.72-6.144 85.402-22.118 152.781-89.702 174.592-175.616 2.56-9.933 5.734-29.082 6.656-39.117l0.717-7.987h-77.005l-0.102-10.445c-0.205-36.762-9.421-67.482-28.877-95.949-11.162-16.282-28.774-34.099-43.11-43.418l-4.71-3.174v-51.814h-179.2v51.814l-7.68 5.325c-4.198 2.97-7.68 5.734-7.68 6.144s16.282 16.998 36.25 36.966l36.352 36.25 6.144-2.765c32.768-14.746 72.294 1.126 85.402 34.202 7.066 17.92 6.246 35.43-2.458 53.248-14.643 29.594-52.429 43.008-82.739 29.184-2.97-1.434-5.53-2.56-5.734-2.56s-72.192 72.090-73.011 73.114c-1.024 1.229 20.992 15.36 32.666 20.89 24.986 12.083 47.514 16.589 82.637 16.589h2.253v77.005l7.885-0.717c4.403-0.41 8.909-0.922 10.035-1.024zM438.17 509.338c29.901-30.003 54.374-54.067 54.374-53.453 0 0.512 2.15 3.174 4.813 5.939 15.36 15.77 40.55 15.36 56.013-1.024 8.090-8.602 11.776-24.166 8.397-35.738-8.909-30.515-47.002-37.99-67.277-13.21l-2.765 3.277-53.555-53.658c-29.491-29.594-53.862-53.76-54.17-53.76-0.922 0-20.89 19.866-29.696 29.696-18.125 20.070-31.232 38.502-39.936 56.013-4.71 9.626-10.24 24.269-10.24 27.443 0 1.331 9.318 1.536 73.626 1.536h73.523l3.482 2.355c6.144 4.096 7.782 10.752 3.994 16.794-4.096 6.758-0.512 6.451-81.408 6.451-71.475 0-73.216 0-73.216 1.946 0 1.126 1.434 6.042 3.174 11.059 9.626 27.136 28.365 54.17 60.211 86.63 8.704 8.806 15.974 16.077 16.077 16.077s24.678-24.474 54.579-54.374z" />
+<glyph unicode="&#xeaad;" glyph-name="orange_travel" d="M429.158 780.083c-6.349-1.229-14.746-9.114-17.51-16.384-1.946-5.12-2.048-8.090-2.048-45.363v-39.834l-107.725-0.307c-99.738-0.307-108.237-0.512-113.971-2.15-28.57-8.499-49.869-29.901-57.549-58.061-1.741-6.246-1.843-18.534-1.843-221.696 0-241.459-0.717-219.341 7.68-236.544 11.059-22.835 33.894-39.629 59.187-43.52 4.608-0.717 108.851-1.024 321.229-0.819l314.368 0.307 9.216 3.277c29.184 10.138 49.152 33.382 53.658 62.464 1.638 10.445 1.638 419.226 0 429.67-5.12 32.973-29.901 58.88-62.669 65.638-6.758 1.434-21.094 1.638-112.23 1.638h-104.448l-0.307 41.779c-0.307 40.448-0.41 41.779-2.56 45.773-2.867 5.427-7.987 10.138-13.619 12.698-4.506 2.048-6.246 2.15-85.504 1.946-44.442 0-82.022-0.307-83.354-0.512zM580.301 748.851c1.741-1.024 4.301-3.482 5.632-5.632 2.355-3.789 2.355-4.403 2.662-34.304l0.307-30.515h-153.805l0.102 28.058c0.102 18.227 0.512 29.389 1.331 31.949 1.536 5.018 6.656 10.138 11.674 11.469 2.56 0.717 25.805 1.024 66.355 0.922 57.037-0.205 62.771-0.41 65.741-1.946zM256 396.8v-256h-25.6v512h25.6v-256zM793.6 396.8v-256h-25.6v512h25.6v-256zM674.816 546.816c1.638-0.819 3.584-2.56 4.198-3.789 2.765-5.12 0.717-16.486-5.018-27.955-4.506-9.114-10.957-18.33-39.219-56.013-15.258-20.378-27.955-37.581-28.16-38.195-0.307-0.717 11.059-35.84 25.19-78.131 14.029-42.291 25.6-78.438 25.6-80.282 0-4.403 0-4.403-13.414-17.818l-11.469-11.571-7.68 13.005c-4.198 7.168-8.499 14.234-9.523 15.77-1.126 1.434-1.946 2.97-1.946 3.277s-3.174 5.837-6.963 12.083c-3.891 6.349-16.589 27.75-28.365 47.411-11.674 19.763-22.118 37.376-23.245 39.219l-2.048 3.277-8.294-6.861c-4.608-3.789-10.445-8.602-13.005-10.65-23.552-19.149-59.699-48.64-67.277-54.886-5.222-4.198-9.523-8.192-9.523-8.704 0-0.922 2.56-6.963 8.192-19.763 1.024-2.253 3.789-8.704 6.144-14.336s5.222-12.288 6.349-14.746c5.427-11.981 5.325-13.824-0.102-19.046l-3.277-2.97-124.826 124.826 3.789 3.789c2.048 2.15 4.813 3.891 5.939 3.891 1.229 0 15.565-5.734 31.846-12.698l29.594-12.595 3.072 3.584c1.741 2.048 6.349 7.68 10.24 12.493 3.994 4.915 16.179 19.866 27.136 33.28 32.87 40.346 38.912 47.821 38.912 48.64 0 0.512-1.536 1.741-3.277 2.867-1.843 1.126-31.437 18.944-65.843 39.629-34.304 20.787-62.669 37.888-62.874 37.99-0.717 0.614 20.89 22.118 23.654 23.552 1.536 0.819 4.096 1.434 5.632 1.434s37.171-11.571 79.155-25.6c41.882-14.131 76.8-25.6 77.619-25.6 0.717 0 18.432 12.8 39.424 28.57 20.992 15.667 40.653 30.106 43.725 32.051 17.715 11.264 32.358 15.462 39.936 11.571z" />
+<glyph unicode="&#xeaae;" glyph-name="orange_tv" d="M76.8 488.96v-266.24h153.6v-81.92h563.2v81.92h153.6v532.48h-870.4v-266.24zM885.76 488.96v-204.8h-747.52v409.6h747.52v-204.8zM522.957 246.067c16.691-6.246 24.269-25.805 16.282-42.189-11.162-22.835-44.851-22.016-55.194 1.331-10.957 24.678 13.517 50.381 38.912 40.858z" />
+<glyph unicode="&#xeaaf;" glyph-name="orange_wallet" d="M166.4 754.483c-13.824-1.741-27.648-6.656-41.165-14.848-19.763-11.878-36.864-33.792-43.725-56.115-4.608-14.95-4.506-8.192-4.506-248.832-0.102-219.443 0-228.147 1.843-237.056 8.192-39.117 36.762-69.018 75.878-79.565l8.602-2.355 732.672-0.512v178.893l-8.397 0.717c-35.021 2.867-65.434 23.245-82.432 54.989-13.414 24.883-15.053 57.344-4.198 84.89 12.288 31.027 40.243 54.886 72.499 61.85 9.626 2.048 12.698 2.458 18.227 2.56l4.301 0.102v179.2h-76.8v76.8l-324.813-0.102c-178.688-0.102-326.246-0.41-327.987-0.614zM793.6 704v-25.6h-296.243c-332.493 0-302.080-0.717-310.477 7.68-13.21 13.107-8.499 34.611 9.011 41.677 3.994 1.638 24.474 1.741 301.056 1.741l296.653 0.102v-25.6zM509.338 574.566c5.018-2.048 9.011-7.68 16.589-23.040 19.558-39.936 31.949-79.77 35.738-115.814 0.41-3.686 0.922-7.578 1.229-8.704 0.922-3.482 1.126-50.79 0.307-57.856-0.512-3.686-1.126-9.421-1.536-12.8-3.891-35.533-16.998-77.005-35.84-114.074-12.493-24.474-18.432-28.57-31.334-21.811-7.066 3.686-10.138 8.090-10.138 14.643 0 5.837 1.638 10.957 7.578 23.757 15.667 33.69 26.522 69.222 29.798 97.894 0.41 3.072 0.819 6.246 1.024 7.168 1.536 8.294 2.15 39.526 1.024 53.862-0.512 7.475-2.56 24.576-3.174 27.546-0.307 1.126-0.922 4.71-1.434 7.782-3.379 19.661-13.107 49.869-23.245 72.704-12.8 28.467-13.312 30.515-10.957 37.376 1.741 5.12 4.096 7.578 10.138 10.342 5.837 2.765 9.421 3.072 14.234 1.024zM442.982 537.6c10.24-6.656 27.034-42.803 35.635-76.902 2.253-8.909 5.632-29.184 6.451-39.322 1.434-17.306 0.717-48.23-1.331-61.952-4.71-32.154-12.902-57.139-28.467-87.45-4.71-9.318-12.083-16.896-17.203-17.92-9.523-1.741-22.323 7.987-22.323 16.998 0 3.891 2.97 13.005 6.656 20.275 10.035 20.070 19.354 48.128 22.528 68.608 0.41 2.56 0.922 5.53 1.229 6.656 0.819 3.891 1.741 20.48 1.741 31.232 0.102 31.846-7.066 63.693-21.094 94.72-9.523 20.992-10.342 23.245-10.445 29.286-0.102 7.27 3.072 11.776 10.854 15.77 5.837 2.867 11.366 2.867 15.77 0zM373.658 503.398c4.403-2.355 7.373-5.939 13.005-15.974 11.059-19.661 19.251-43.93 21.504-63.181 0.307-2.97 0.922-7.987 1.331-11.059 1.536-12.698 0.307-34.304-3.072-52.429-5.018-27.238-20.787-62.157-31.334-69.427-4.71-3.174-11.162-3.072-16.998 0.307-5.325 3.174-7.373 5.325-9.216 9.933-2.253 5.53-1.126 10.65 5.325 24.576 7.373 15.667 9.626 21.709 12.8 34.509 3.482 14.029 3.789 16.282 4.198 33.075 0.512 18.842-1.331 31.539-7.168 50.074-2.56 8.090-4.71 13.21-11.981 28.774-4.608 9.83-5.222 12.493-3.891 17.408 1.434 5.427 5.632 10.035 11.264 12.698 6.246 2.867 9.523 3.072 14.234 0.717zM311.194 467.354c4.506-3.277 11.776-13.107 15.974-21.402 12.186-24.474 14.029-51.712 5.53-82.637-4.813-17.613-15.258-33.894-24.678-38.81-4.506-2.355-11.264-1.434-16.486 2.253-5.837 4.198-8.090 7.68-8.602 13.414-0.512 4.506 0 6.042 4.608 14.848 9.318 17.92 12.595 30.208 12.083 44.851-0.41 11.264-3.072 20.48-10.138 34.304-5.325 10.547-6.246 13.107-6.246 18.125-0.102 4.915 0.307 6.246 3.072 9.626 6.861 8.602 17.51 10.854 24.883 5.427zM880.128 471.859c-42.598-9.114-69.325-52.224-58.368-94.413 7.168-27.546 29.594-49.254 57.446-55.398 7.168-1.536 13.005-2.048 27.648-2.048 21.811 0 26.010 1.024 32.768 7.782 7.578 7.578 7.578 7.373 7.578 69.939-0.102 42.598-0.41 55.706-1.434 58.675-2.15 6.042-7.373 11.776-13.414 14.541-5.325 2.56-6.144 2.662-25.293 2.56-13.414 0-22.118-0.512-26.931-1.638z" />
+<glyph unicode="&#xeab0;" glyph-name="orange_wifi" d="M489.37 882.79c-0.205-0.205-5.632-0.614-11.981-1.024s-12.083-0.922-12.8-1.126c-0.717-0.205-3.789-0.614-6.861-1.024-16.691-1.741-44.749-7.373-62.464-12.39-83.046-23.654-155.648-69.837-212.378-135.066-15.258-17.613-37.683-49.050-46.694-65.536-1.843-3.379-3.686-6.554-4.096-7.168-0.512-0.512-4.506-8.397-9.011-17.408-65.434-131.072-60.416-286.618 13.312-412.979 26.214-44.851 63.488-88.269 103.014-119.808 12.493-9.933 48.128-35.021 49.766-35.021 0.205 0 4.403-2.355 9.421-5.222 27.034-15.565 59.699-29.286 92.365-38.81 18.227-5.325 44.954-11.264 57.549-12.698 2.56-0.307 6.451-0.819 8.806-1.126 15.77-2.355 33.28-3.277 58.778-3.072 15.462 0.205 30.515 0.614 33.28 0.922 2.867 0.307 6.963 0.819 9.216 1.126 2.253 0.205 6.861 0.717 10.24 1.126 22.63 2.355 57.651 10.547 84.48 19.763 63.078 21.504 118.989 56.422 166.4 103.936 56.013 56.013 94.208 122.47 114.074 198.349 2.867 10.957 7.27 32.461 8.909 42.906 0.307 2.56 0.819 5.325 0.922 6.144s0.614 4.813 1.024 8.704c0.41 3.994 0.819 8.602 1.024 10.24 1.843 15.053 2.458 56.525 1.126 71.168-1.229 14.029-1.741 18.227-3.174 29.184-3.686 27.648-8.704 49.357-17.613 76.8-4.915 14.95-13.414 36.864-18.227 46.592-1.536 3.072-4.198 8.602-5.939 12.288-25.907 53.555-70.554 108.134-120.627 147.763-46.592 36.762-101.888 64-160.154 79.053-22.221 5.734-40.243 8.909-70.656 12.39-5.53 0.614-60.416 1.536-61.030 1.024zM555.52 691.814c5.632-0.614 12.288-1.434 14.848-1.741 2.56-0.41 6.042-0.819 7.68-1.024 1.741-0.205 4.71-0.614 6.656-1.024 1.946-0.307 4.71-0.819 6.144-1.024 20.378-3.584 44.544-9.728 64-16.282 58.88-19.968 109.568-49.254 156.16-90.112 5.939-5.222 11.674-10.445 12.698-11.674l2.048-2.253-21.402-21.402c-11.878-11.878-21.811-21.402-22.118-21.299-0.41 0.205-3.789 3.277-7.68 6.861-25.088 23.245-58.675 46.080-91.955 62.362-38.912 18.944-86.426 32.768-126.566 36.557-3.686 0.41-7.782 0.922-9.216 1.229-6.042 1.126-57.549 0.922-70.349-0.307-65.946-6.349-128.205-28.774-182.579-65.741-14.336-9.728-32.666-24.269-43.52-34.406-3.891-3.686-7.373-6.656-7.68-6.758-0.307 0-10.24 9.728-22.016 21.606l-21.504 21.504 7.168 6.758c63.488 59.494 148.48 100.966 235.008 114.483 1.946 0.307 4.71 0.717 6.144 1.024 1.434 0.205 5.12 0.717 8.294 1.024s6.758 0.717 7.885 1.024c1.126 0.205 6.758 0.717 12.595 1.024 5.837 0.41 10.854 0.922 10.957 1.126 0.922 0.717 59.29-0.512 68.301-1.536zM545.28 569.344c59.29-6.963 108.646-25.293 155.136-57.754 10.035-6.963 31.437-24.371 35.84-29.184l2.458-2.765-43.213-43.213-4.506 4.198c-39.731 36.966-98.509 62.976-152.678 67.482-19.661 1.638-47.206 0.922-65.741-1.638-38.195-5.427-79.974-22.118-112.64-45.056-7.68-5.427-25.293-19.661-27.853-22.63l-2.253-2.56-21.811 21.709-21.709 21.811 3.994 4.096c5.734 5.939 25.805 21.914 37.376 29.901 35.43 24.269 77.619 42.189 119.398 50.381 18.944 3.789 19.354 3.789 39.322 5.734 8.499 0.819 50.79 0.41 58.88-0.512zM541.696 445.952c30.72-4.608 62.464-16.998 86.528-33.792 9.421-6.656 23.040-17.818 23.040-18.944 0-0.614-9.626-10.65-21.299-22.323l-21.402-21.299-4.506 3.686c-18.125 15.258-39.117 25.293-62.874 30.31-14.746 3.072-41.267 3.379-55.296 0.512-23.45-4.608-48.64-16.589-65.434-30.925l-4.096-3.584-21.709 21.709c-16.384 16.384-21.402 22.016-20.582 22.835 4.096 3.994 18.842 15.462 25.498 19.866 29.082 19.149 56.934 28.774 96.051 33.382 6.349 0.717 38.195-0.205 46.080-1.434zM526.541 318.566c48.128-9.216 75.264-59.494 56.73-105.062-4.915-12.083-14.848-24.474-25.907-32.358-21.504-15.462-49.152-18.944-73.216-9.216-45.466 18.432-62.464 73.216-35.226 114.074 16.589 25.088 48.026 38.195 77.619 32.563z" />
+<glyph unicode="&#xeab1;" glyph-name="Orange-Guest" d="M478.003 881.664c-5.734-2.15-10.854-6.349-13.926-11.674l-2.765-4.71v-117.76l2.765-4.813c3.584-6.042 9.933-10.65 16.589-12.083 3.379-0.819 15.462-1.126 34.918-0.819 28.774 0.307 29.798 0.41 33.792 2.662 2.253 1.331 5.53 3.994 7.373 5.939 6.451 7.27 6.451 7.27 6.451 67.891 0 34.611-0.41 56.32-1.024 58.675-1.638 5.734-7.066 12.186-12.8 15.053l-5.018 2.662-31.334 0.205c-24.576 0.205-32.051-0.102-35.021-1.229zM292.045 804.864c-25.395-5.53-46.49-22.938-55.91-46.285-5.939-14.438-5.53 8.499-5.53-348.979 0-286.925 0.205-329.626 1.536-335.77 4.813-22.938 20.275-42.803 41.267-53.043 16.691-8.090-5.837-7.373 235.008-7.782 194.15-0.205 215.859-0.102 223.232 1.434 31.846 6.349 55.398 30.925 60.826 63.386 0.922 5.427 1.126 87.654 0.922 336.384-0.307 314.368-0.41 329.523-2.15 335.36-2.765 9.114-8.704 20.685-13.926 27.034-10.752 13.414-20.992 20.48-39.014 26.829l-6.656 2.355-142.643 0.717-0.41-31.539c-0.41-31.13-0.41-31.642-3.072-37.888-5.325-12.595-14.234-22.323-25.702-27.853-10.342-4.915-15.258-5.427-51.917-5.018-31.539 0.41-33.587 0.614-38.81 2.765-17.203 7.066-29.286 20.992-32.768 37.786-0.614 3.174-1.126 16.998-1.126 33.485v28.16l-68.301-0.102c-53.862 0-69.734-0.41-74.854-1.434zM700.518 549.478c18.432-3.072 35.226-18.944 40.346-38.093 2.253-8.294 2.253-400.077 0-408.371-3.482-13.414-12.083-24.883-23.962-31.846-13.107-7.68 2.15-7.168-204.902-7.168-157.696 0-186.675 0.205-191.386 1.536-18.33 4.813-32.666 19.149-37.478 37.478-2.253 8.294-2.253 400.077 0 408.371 4.813 18.227 18.944 32.461 37.376 37.581 3.584 0.922 45.158 1.229 189.44 1.331 107.622 0.102 187.187-0.307 190.566-0.819zM508.723 493.363c-1.536-3.277-6.861-14.438-11.878-24.883-13.414-27.648-32.461-67.379-38.707-80.589-3.072-6.349-6.042-11.571-6.656-11.571-1.638 0-67.174-10.957-71.066-11.878-0.512-0.102-5.632-0.922-11.264-1.741-9.626-1.536-40.141-6.656-43.52-7.373-3.482-0.717-12.902-1.946-13.517-1.741-2.765 0.717 1.126-3.277 16.384-16.691 9.421-8.397 19.661-17.613 22.733-20.378 3.174-2.867 7.475-6.861 9.728-8.806 2.253-2.048 14.029-12.493 26.112-23.245s23.859-21.197 26.010-23.142l3.994-3.482-17.613-70.554c-9.626-38.81-17.51-70.861-17.51-71.373 0-0.41 1.843 0.41 4.096 1.843s4.301 2.56 4.608 2.56c0.307 0 4.096 2.048 8.499 4.506 4.301 2.458 11.162 6.144 15.053 8.294 3.994 2.15 9.011 4.915 11.264 6.144s6.656 3.686 9.728 5.325c3.072 1.741 21.402 11.674 40.55 22.221 19.251 10.445 35.635 19.046 36.352 19.046 0.819 0 3.482-1.229 5.939-2.56 2.458-1.434 8.909-5.018 14.336-7.885s10.342-5.53 10.854-5.939c0.614-0.41 5.222-2.97 10.24-5.632 5.12-2.662 13.414-7.27 18.432-10.035 5.12-2.765 12.698-6.963 16.896-9.216s10.342-5.632 13.619-7.475c3.277-1.946 6.042-3.482 6.246-3.482s7.782-4.096 16.794-9.114c9.114-5.018 16.589-8.704 16.589-8.192 0 0.41-7.782 32.154-17.408 70.554-9.523 38.298-17.408 70.042-17.408 70.451 0 0.512 4.915 5.222 10.957 10.547 5.939 5.325 11.366 10.138 11.981 10.65 0.614 0.614 5.018 4.506 9.83 8.704s8.909 7.885 9.216 8.192c0.307 0.307 14.746 13.107 32.051 28.57 28.058 24.883 32.154 29.082 29.594 29.389-0.41 0-2.355 0.41-4.301 0.717-1.946 0.41-23.347 3.994-47.616 7.987-24.166 3.891-45.158 7.373-46.592 7.68-11.674 2.048-39.117 6.554-39.936 6.554-0.512 0-3.072 4.506-5.734 10.035-2.56 5.427-9.318 19.354-14.848 30.822-5.632 11.469-10.138 20.992-10.138 21.197 0 0.102-4.506 9.626-10.035 21.094s-12.083 25.088-14.643 30.31c-2.458 5.12-4.71 9.421-5.018 9.421s-1.843-2.662-3.277-5.837zM520.806 364.954c13.619-2.458 27.238-13.107 33.178-25.805 14.541-30.925-5.837-65.434-39.834-67.584-29.798-1.946-54.17 24.883-49.357 54.477 1.638 9.933 6.246 18.739 13.619 26.112 11.674 11.571 25.805 15.872 42.394 12.8zM477.491 266.957c13.619-9.216 31.642-12.595 47.002-8.909 7.168 1.638 20.070 7.373 23.45 10.342 2.56 2.355 4.198 1.741 11.264-4.096 11.264-9.318 18.637-22.016 21.811-37.274 1.638-7.373 2.355-47.821 0.922-47.002-2.15 1.229-31.13 17.715-35.123 19.968-2.56 1.434-11.366 6.349-19.661 11.059l-15.053 8.602-31.539-17.51c-17.306-9.626-33.587-18.637-35.942-20.070l-4.506-2.56 0.512 22.835c0.512 29.286 2.253 36.25 12.698 50.893 4.506 6.246 15.872 16.486 18.534 16.589 0.717 0 3.277-1.331 5.632-2.867z" />
+<glyph unicode="&#xeab2;" glyph-name="organisation" d="M400.486 881.459c-2.458-0.922-6.451-3.584-8.806-5.939-8.090-7.987-7.68-2.458-7.68-107.008 0-100.762-0.102-98.304 5.632-105.882 1.638-2.15 5.018-5.018 7.578-6.554l4.71-2.765 107.93-0.307c121.856-0.307 114.278-0.717 122.573 7.475 7.885 7.987 7.578 3.174 7.578 108.032 0 104.448 0.41 99.021-7.68 107.008-8.090 8.192-0.819 7.68-120.73 7.578-93.798 0-107.11-0.205-111.104-1.638zM486.4 550.4v-76.8h-129.843c-88.883 0-131.789-0.307-135.987-1.126-12.8-2.355-26.010-11.264-33.178-22.426-1.843-2.867-4.403-8.499-5.734-12.595l-2.355-7.373-0.102-80.589v-80.691h51.2v153.6h256v-153.6h51.2v153.6h256v-153.6h51.2v80.179c-0.102 86.221 0.102 84.378-5.53 96.154-6.554 13.722-22.016 25.395-37.069 27.853-1.638 0.205-61.85 0.512-133.734 0.512l-130.867 0.102v153.6h-51.2v-76.8zM93.286 241.459c-2.458-0.922-6.451-3.584-8.806-5.939-8.090-8.090-7.782-2.355-7.475-109.158l0.307-94.618 2.355-4.813c2.662-5.427 8.602-10.65 14.336-12.698 3.072-1.126 24.986-1.331 109.773-1.331 58.266 0 107.622 0.307 109.773 0.819 5.632 1.331 12.186 6.246 15.667 11.776l3.072 5.018v194.765l-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-7.782 5.939-2.765 5.734-118.886 5.632-93.798 0-107.11-0.205-111.104-1.638zM400.486 241.459c-5.53-1.946-11.878-8.192-14.541-14.234-1.843-4.506-1.946-7.987-1.946-98.611 0-105.779-0.41-100.147 7.68-108.134 8.090-8.090 0.922-7.68 120.32-7.68 116.326 0 111.206-0.307 118.886 6.042 1.946 1.638 4.813 5.53 6.349 8.704l2.765 5.734-0.205 95.949-0.307 96.051-2.97 4.915c-3.277 5.53-7.987 9.523-13.619 11.571-3.174 1.126-24.064 1.331-110.899 1.331-93.901-0.102-107.52-0.205-111.514-1.638zM707.686 241.459c-2.458-0.922-6.451-3.584-8.806-5.939-8.090-7.987-7.68-2.355-7.68-107.93 0.102-74.752 0.41-94.515 1.434-97.587 2.048-5.734 7.27-11.674 12.698-14.336l4.813-2.355h219.136l4.915 2.97c5.53 3.277 9.523 7.987 11.571 13.619 1.126 3.174 1.331 22.016 1.434 97.69 0 105.574 0.41 99.942-7.68 107.93-8.090 8.192-0.819 7.68-120.73 7.578-93.798 0-107.11-0.205-111.104-1.638z" />
+<glyph unicode="&#xeab3;" glyph-name="outbox" d="M503.296 882.586c-1.126-0.205-4.096-1.024-6.656-1.638-6.451-1.536-17.101-7.27-22.118-11.878-2.355-2.048-52.941-52.122-112.435-111.309-59.597-59.085-119.296-118.477-132.813-131.789l-24.474-24.371h153.6v-156.365c0-101.786 0.41-158.72 1.024-162.918 4.915-29.798 25.907-53.248 56.013-62.362 5.427-1.638 13.21-1.741 94.003-1.946 95.232-0.307 93.798-0.307 108.339 5.325 7.782 2.97 20.070 11.366 26.419 18.022 8.602 9.011 14.336 18.944 18.739 32.461 2.15 6.758 2.15 6.861 2.458 167.322l0.205 160.461h153.6l-24.986 24.883c-13.824 13.619-72.806 72.294-131.174 130.253-58.368 58.061-108.544 107.725-111.411 110.387-6.554 6.042-15.258 11.366-22.426 13.517-5.427 1.638-22.016 2.867-25.907 1.946zM77.107 235.315c0.307-135.475 0.307-135.987 2.458-144.179 9.421-35.123 34.406-62.054 67.584-73.114 15.872-5.325-3.379-5.018 368.435-4.813l346.112 0.102 7.885 2.355c38.605 11.162 64.512 37.376 74.854 75.469 2.15 8.192 2.15 8.397 2.458 144.179l0.41 135.885h-128.102v-230.4h-614.4v230.4h-128l0.307-135.885z" />
+<glyph unicode="&#xeab4;" glyph-name="outdoor_sports_mountain_biking" d="M524.288 830.362c-17.101-3.584-34.406-16.691-42.291-31.846-18.842-36.147-2.048-77.824 36.864-91.546 7.885-2.765 23.962-3.482 33.075-1.434 40.755 9.318 61.85 54.374 43.008 91.75-12.8 25.395-42.291 39.219-70.656 33.075zM436.224 702.464c-8.090-2.253-15.462-6.042-20.89-10.854-4.915-4.301-108.032-132.608-113.357-141.107-3.891-6.042-5.939-12.902-6.656-22.733-1.229-14.746 3.891-28.058 14.848-38.707 6.963-6.861 4.915-5.53 137.011-84.89l26.829-16.077 0.614-141.312 3.174-6.656c4.096-8.499 10.445-14.848 18.842-18.842 5.939-2.765 7.68-3.174 15.872-3.174s9.933 0.41 15.872 3.174c8.499 4.096 14.848 10.445 18.842 18.842l3.174 6.656 0.307 82.944c0.205 53.248-0.102 84.685-0.819 87.757-2.458 11.469-6.963 17.203-24.064 30.515-48.128 37.581-106.496 84.378-106.394 85.402 0.205 1.741 57.651 73.421 58.573 72.909 0.41-0.205 8.806-3.686 18.637-7.782s19.968-8.294 22.426-9.421c2.56-1.126 6.246-2.662 8.192-3.379 2.048-0.717 34.816-14.336 72.806-30.208s71.27-29.389 73.933-30.003c10.035-2.355 21.606 2.867 27.136 12.288 2.355 4.096 2.867 6.042 2.867 12.595s-0.41 8.397-2.765 12.39c-1.536 2.56-4.301 5.837-6.144 7.27-6.451 4.813-224.563 129.126-230.195 131.072-7.578 2.765-21.299 3.379-28.672 1.331zM736.768 472.474c-54.374-7.373-99.021-40.755-121.549-90.522-4.198-9.421-8.090-21.709-10.752-34.304-2.765-13.005-2.458-43.827 0.614-57.651 8.909-41.472 32.051-75.674 66.15-98.099 55.706-36.557 128.819-33.28 180.019 8.090 51.917 41.882 71.373 110.797 48.64 172.749-18.637 50.79-63.693 88.883-116.531 98.304-11.571 2.048-36.557 2.867-46.592 1.434zM775.987 420.25c39.117-8.090 69.734-37.581 79.155-76.186 13.21-54.579-20.48-109.875-75.366-123.494-12.288-3.072-31.13-3.482-43.622-0.922-40.243 8.294-70.144 37.274-80.384 77.824-2.97 11.571-2.662 34.202 0.512 46.49 9.114 35.021 33.894 61.952 67.379 73.216 15.565 5.222 35.84 6.451 52.326 3.072zM250.061 344.371c-66.15-8.499-119.91-59.392-131.891-125.030-0.819-4.608-1.843-14.336-2.15-21.709-3.072-71.27 44.749-135.782 114.381-154.112 14.131-3.686 22.118-4.608 38.912-4.608 16.179 0 24.474 0.922 37.376 4.198 57.549 14.438 100.864 59.904 113.254 118.682 3.174 15.053 3.379 41.984 0.512 57.344-11.059 59.392-55.194 106.906-112.538 121.344-6.349 1.536-13.312 3.174-15.565 3.482-7.373 1.126-34.611 1.434-42.291 0.41zM294.912 291.021c12.902-3.686 20.685-7.168 30.515-13.722 22.835-15.155 38.605-38.298 44.032-64.922 10.547-50.688-19.251-101.581-68.915-117.76-16.179-5.325-39.424-6.144-55.296-2.048-39.526 10.24-68.301 40.141-76.083 79.258-6.758 33.792 3.277 67.174 27.648 92.16 14.95 15.155 34.714 25.498 55.603 28.979 12.083 2.048 31.539 1.126 42.496-1.946z" />
+<glyph unicode="&#xeab5;" glyph-name="outdoor_sports_skiing" d="M840.192 816.947c-28.16-3.891-51.405-23.654-60.211-50.995-4.301-13.722-3.994-30.515 0.819-45.056 1.946-5.939 8.602-17.51 12.902-22.63 22.426-26.624 59.085-33.894 89.907-17.818 43.213 22.528 52.019 80.896 17.408 115.61-15.872 15.872-39.219 23.859-60.826 20.89zM330.854 812.851c-11.571-2.253-14.541-17.92-5.018-26.522 1.229-1.229 18.739-11.674 38.707-23.142 19.968-11.571 40.96-23.654 46.592-26.931s11.878-6.758 13.824-7.885c1.946-1.126 10.957-6.349 19.968-11.571 23.757-13.824 67.891-39.322 73.114-42.291 2.56-1.434 6.963-3.891 9.728-5.632 2.867-1.638 7.27-4.198 9.83-5.632s5.427-3.072 6.451-3.789c1.536-1.126-3.482-4.301-38.912-24.678-30.003-17.203-42.291-24.883-46.49-28.877-12.493-11.674-17.51-31.232-12.186-46.899 2.355-6.963 0.819-4.198 71.066-125.645 10.035-17.306 18.125-31.642 17.92-31.846s-12.595-7.373-27.546-15.974c-14.95-8.602-43.52-25.088-63.488-36.659-73.114-42.291-69.53-40.243-71.782-39.117-1.126 0.614-20.378 11.776-42.701 24.781s-41.984 24.474-43.725 25.395c-1.638 1.024-5.837 3.379-9.216 5.325-16.589 9.626-36.864 21.402-68.096 39.526-18.842 11.059-38.4 22.323-43.315 25.19-5.018 2.867-9.83 5.734-10.752 6.246-17.306 10.24-24.064 11.878-35.84 8.806-6.349-1.741-14.438-8.909-18.022-15.667-5.734-11.264-3.482-26.214 5.325-35.328 1.741-1.741 7.475-5.734 12.698-8.806 7.68-4.506 189.338-109.568 228.147-131.994 33.178-19.149 97.178-56.218 104.96-60.723 5.12-2.97 20.992-12.186 35.328-20.48s30.31-17.51 35.328-20.48c5.12-2.97 24.678-14.234 43.52-25.088s39.629-22.835 46.080-26.624c14.029-8.294 95.437-55.296 100.454-58.061 14.95-8.397 34.202-2.867 42.394 12.083 2.253 4.301 3.072 7.168 3.379 13.414 0.41 7.373 0.205 8.499-2.765 14.541-3.994 8.192-6.963 10.752-22.221 19.456-6.656 3.891-16.282 9.421-21.402 12.39-7.373 4.403-166.912 96.461-178.176 102.912-1.638 0.922-12.083 6.963-23.040 13.312s-30.822 17.715-44.032 25.395c-13.21 7.578-25.395 14.643-27.034 15.565l-2.97 1.843 2.458 1.536c1.946 1.229 108.237 62.669 160.051 92.467 14.336 8.294 21.402 14.848 25.907 24.166 6.656 13.619 6.656 27.034 0.205 41.267-1.638 3.584-24.166 64.205-26.522 71.168-0.512 1.434-2.765 7.578-5.018 13.824-2.253 6.144-3.994 11.264-3.891 11.264 0.102 0.102 8.090 4.096 17.613 9.011 9.626 4.813 23.552 11.981 31.13 15.872l13.722 7.066 26.214-15.053c14.438-8.294 28.365-16.179 30.822-17.613 2.56-1.434 24.883-14.131 49.562-28.365 24.678-14.131 47.104-26.317 49.664-27.034 14.029-4.096 29.491 3.072 36.25 16.691 1.741 3.686 2.253 6.349 2.253 13.312 0 7.68-0.307 9.318-2.97 14.029-1.536 2.867-4.096 6.451-5.632 7.885-2.867 2.765-90.112 53.555-109.363 63.693-6.349 3.277-11.571 6.246-11.571 6.554s8.909 5.325 19.763 11.162c30.208 16.384 36.659 21.094 42.394 30.618 2.355 3.994 2.867 6.042 2.867 11.981 0 8.704 0.819 6.861-21.094 45.056-18.125 31.539-22.528 37.99-29.389 43.11-12.39 9.523-32.154 10.854-45.773 3.072-16.896-9.728-57.958-33.382-81.203-46.899-24.678-14.234-28.262-16.077-30.208-15.053-1.229 0.614-6.349 3.584-11.469 6.554-5.018 2.97-51.405 29.798-102.912 59.494s-99.021 57.139-105.472 60.826c-15.462 8.909-17.818 9.728-24.474 8.499z" />
+<glyph unicode="&#xeab6;" glyph-name="Package" d="M166.605 830.464c-18.637-5.12-33.69-20.89-37.478-39.219-0.819-3.891-1.126-100.762-1.126-344.064 0-369.050-0.41-342.733 5.734-355.43 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-13.619-5.734 355.43-5.734 243.302 0 340.173 0.307 344.064 1.126 16.998 3.584 31.437 16.179 37.888 33.28l2.355 6.042 0.205 341.504c0.205 293.478 0.102 342.323-1.229 347.034-5.018 18.944-20.48 33.894-39.219 37.888-8.602 1.843-681.984 1.434-688.64-0.41zM409.6 681.267c0-40.755 0-75.264 0-76.902 0-2.56 3.789 0.102 51.2 35.635l51.2 38.4 102.4-76.8v153.6h204.8v-614.4h-614.4v614.4h204.8v-73.933zM495.411 469.402c-2.048-2.458-22.118-25.498-44.544-51.098l-40.858-46.592 25.395-0.307 25.395-0.205v-102.4h76.8v102.4h51.2l-40.141 45.875c-22.118 25.293-42.291 48.333-44.851 51.302l-4.608 5.427-3.789-4.403zM701.542 470.835c-1.331-1.536-3.789-4.506-5.53-6.451-1.843-1.946-7.885-8.909-13.517-15.36s-11.674-13.414-13.414-15.36c-4.096-4.608-13.21-14.95-16.691-18.944-1.434-1.638-10.65-12.186-20.378-23.245l-17.613-20.275h51.2v-102.4h76.8v102.4h51.2l-32.973 37.683c-18.022 20.685-35.533 40.55-38.707 44.237s-7.987 9.216-10.752 12.288c-7.885 9.114-7.168 8.704-9.626 5.427zM460.8 217.6v-25.6h281.6v51.2h-281.6v-25.6z" />
+<glyph unicode="&#xeab7;" glyph-name="Package_content" d="M307.61 780.595c-0.717-1.126-0.512-462.438 0.205-467.149 1.741-11.571 6.246-20.787 14.234-28.877 6.451-6.554 11.981-9.933 19.866-12.186 6.861-2.048 11.162-2.458 27.546-3.072 11.366-0.41 14.541-0.307 14.541 0.717 0 0.717-0.922 3.891-1.946 7.066-3.174 9.421-4.198 20.173-2.97 30.413 1.536 13.21 2.97 17.203 21.709 62.157l7.68 18.432-3.584 1.229c-5.12 1.843-14.336 8.192-17.92 12.493-7.885 9.523-11.469 22.733-9.318 34.918 3.686 21.299 21.402 36.147 42.803 35.942l7.373-0.102-0.102 74.24c0 44.851 0.307 74.65 0.922 75.162 0.512 0.41 20.070 5.837 43.52 11.981l42.701 11.162 7.168 17.408c3.994 9.523 14.131 33.997 22.528 54.272s16.077 38.4 16.998 40.243c4.608 9.011 14.848 14.95 23.757 13.824 6.963-0.819 6.861-0.717 70.042-26.931 51.302-21.299 59.29-24.576 60.109-24.576 1.331 0 0.512 15.258-1.331 22.733-1.536 6.451-6.349 15.667-11.162 21.402-3.174 3.789-10.752 9.626-15.77 12.186-11.674 5.837 1.126 5.53-197.018 5.53-100.25 0.102-182.374-0.205-182.579-0.614zM562.79 685.773c-11.776-28.57-22.221-53.76-23.245-56.013s-5.222-12.39-9.421-22.528c-18.842-45.67-32.768-79.258-45.261-109.568-7.475-18.022-20.275-48.845-28.467-68.608-8.192-19.661-22.426-54.272-31.744-76.8-9.421-22.528-17.715-43.725-18.637-47.104-4.403-16.998 0.41-34.816 12.902-47.514 7.578-7.782 9.933-8.909 54.17-27.238 46.899-19.456 95.744-39.629 155.648-64.512 26.726-11.059 65.946-27.341 87.040-36.045s41.062-16.998 44.339-18.432c3.174-1.434 6.144-2.458 6.451-2.15 0.205 0.307 16.794 40.141 36.864 88.474 19.968 48.435 39.014 94.413 42.394 102.298 3.277 7.885 10.854 26.112 16.691 40.448 5.939 14.336 26.522 64.102 45.773 110.592s35.635 87.245 36.352 90.624c5.222 21.606-3.584 43.315-22.323 55.194-2.867 1.843-31.846 14.336-64.205 27.648-52.531 21.709-62.464 25.907-74.24 30.822-1.638 0.717-20.582 8.602-41.984 17.408s-65.536 27.136-97.997 40.55c-32.461 13.414-59.187 24.474-59.392 24.474s-9.933-23.45-21.709-52.019zM703.181 557.773c1.843-1.331 13.824-19.661 33.075-50.586 27.034-43.622 30.106-48.947 30.515-53.555 0.307-3.789-0.922-10.445-4.403-25.088-2.662-10.957-5.12-21.811-5.325-24.064l-0.512-4.096 16.794-3.891c38.605-9.114 42.906-10.24 46.080-12.288 5.12-3.584 6.963-6.861 7.168-12.595 0.41-9.011-6.861-16.794-15.36-16.794-2.458 0-40.141 8.397-75.059 16.691-7.885 1.946-12.493 5.018-14.746 9.83-1.946 4.403-1.741 9.421 0.922 20.173 3.686 14.541 5.837 24.166 5.53 24.474-0.205 0.205-4.506-2.253-9.523-5.325-5.12-3.174-14.029-8.806-19.968-12.39-5.939-3.686-11.366-7.27-12.083-7.885-1.024-0.922 2.867-7.885 18.944-33.894 29.184-47.002 29.184-47.002 29.696-51.917 0.41-5.018-2.458-10.957-7.168-14.438-4.301-3.174-11.981-2.765-29.901 1.638-8.397 2.15-26.419 6.349-39.936 9.523-56.832 13.21-55.808 12.902-60.006 20.275-5.12 9.318 1.229 21.504 11.981 22.938 3.994 0.512 14.95-1.638 52.634-10.547 8.192-1.946 15.974-3.789 17.306-4.096 3.174-0.717 2.867 0-5.12 12.595-3.482 5.53-6.861 10.957-7.475 12.083s-7.066 11.571-14.336 23.245l-13.21 21.299-3.174-1.946c-9.626-5.939-26.624-16.486-40.858-25.395-8.909-5.53-18.125-11.264-20.48-12.698s-20.89-12.902-41.165-25.498c-37.683-23.245-43.52-26.214-50.483-24.986-4.403 0.819-9.933 6.554-11.162 11.469-1.843 7.373 1.024 13.722 8.499 18.739 3.482 2.458 38.502 24.269 69.53 43.418 62.771 38.81 154.931 96.256 155.853 97.178 1.229 1.126-1.434 6.144-15.36 27.955l-2.765 4.301-16.589-10.342c-35.123-21.914-37.786-23.347-42.598-23.347-9.728 0-16.077 6.451-16.077 16.282 0 4.198 0.614 6.554 2.253 8.806 1.946 2.867 25.498 18.125 61.235 39.731 12.8 7.782 13.517 8.090 18.534 7.68 3.072-0.307 6.451-1.331 8.294-2.662zM807.424 544.768c13.107-5.837 21.606-22.221 18.432-35.84-3.584-15.667-16.691-26.522-31.744-26.317-7.27 0-12.8 1.741-18.637 5.632-19.763 13.517-18.33 43.93 2.56 55.296 9.318 5.018 19.866 5.53 29.389 1.229zM272.384 667.75c-4.813-1.843-41.37-16.998-81.408-33.587-39.936-16.691-84.173-34.918-98.304-40.755-14.029-5.734-25.805-10.65-26.010-10.752-0.102-0.205 2.662-7.475 6.349-16.077s15.462-37.069 26.317-63.283c10.854-26.214 23.552-57.037 28.365-68.608s10.24-24.678 12.083-29.184c2.765-6.963 35.738-86.63 89.805-217.088 15.053-36.352 17.101-40.346 24.986-48.23 10.138-10.138 22.426-14.848 36.864-14.234 9.216 0.512 14.541 2.253 44.851 14.848 25.498 10.65 88.371 36.762 124.723 51.814 9.523 3.891 17.203 7.373 17.203 7.68s-1.741 1.331-3.789 2.15c-2.15 0.922-12.595 5.12-23.347 9.523-22.835 9.216-31.334 13.722-43.93 23.245-7.168 5.325-10.138 6.963-12.902 7.066-1.946 0-12.595 0.205-23.552 0.41-22.221 0.307-33.997 1.741-44.339 5.222-18.432 6.144-32.461 19.763-40.038 38.605-3.482 8.806-6.554 20.48-7.373 28.672-0.41 3.482-0.819 7.066-1.024 7.885-0.102 0.819-0.307 1.843-0.307 2.253-0.102 0.41-2.765 2.56-5.939 4.71-11.264 7.68-19.046 17.715-27.034 34.611l-5.018 10.65h-5.018c-6.963 0-19.558 3.482-27.034 7.373-8.806 4.71-20.787 16.896-24.986 25.498-9.421 19.149-8.909 40.448 1.331 58.778 3.891 6.758 14.95 17.818 21.914 21.709 13.107 7.475 30.31 10.035 44.237 6.861l6.042-1.434 7.578 7.885c4.096 4.403 10.24 10.035 13.619 12.595l6.246 4.608-0.512 33.28c-0.307 18.33-0.717 41.574-0.922 51.712s-0.41 29.389-0.512 42.803c-0.102 13.312-0.205 24.269-0.307 24.269-0.102-0.102-4.096-1.638-8.909-3.482zM473.088 573.030l-9.728-2.662-0.307-24.986c-0.102-13.824-0.102-24.883 0.205-24.576 0.205 0.205 5.325 12.39 11.366 27.034s11.162 26.931 11.469 27.443c0.717 1.229-2.765 0.614-13.005-2.253z" />
+<glyph unicode="&#xeab8;" glyph-name="parabole_tv" d="M207.974 789.402c-14.438-41.062-23.45-83.968-26.522-125.85-1.434-20.48-0.614-77.107 1.331-87.040 0.205-1.126 0.717-4.608 1.024-7.68 6.554-62.874 31.13-135.066 65.536-192.102 10.342-16.998 22.733-35.226 30.413-44.544 2.15-2.662 3.891-5.222 3.891-5.837 0-0.512-2.765-3.789-6.246-7.27l-6.246-6.246 2.662-3.174c3.174-3.789 3.379-6.656 0.512-9.728l-2.048-2.253 2.253-2.15 2.355-2.15-21.094-21.299c-21.402-21.504-26.112-27.443-28.877-35.942-2.253-6.963-2.458-12.39-2.56-77.005l-0.102-59.085-3.072-1.229c-5.632-2.355-6.144-4.096-6.144-20.173v-14.643h66.56v14.643c0 16.384-0.614 18.125-6.656 20.173l-3.584 1.229v59.187c0 32.461 0.307 60.723 0.717 62.566 0.512 2.765 4.506 7.475 18.534 21.606l18.022 18.227 2.15-2.048 2.253-2.048 2.355 2.048c3.072 2.662 5.325 2.56 9.011-0.41l2.97-2.56 5.427 5.53 5.427 5.427 10.342-8.909c78.643-68.403 176.538-108.954 282.726-117.555 13.21-1.024 63.59-1.024 76.8 0 46.592 3.789 84.275 11.776 126.976 27.034 5.632 2.048 10.342 3.789 10.547 3.891 0.102 0.102-2.662 7.066-6.246 15.565-39.117 91.443-100.25 193.229-163.738 272.486l-10.035 12.493v153.6h-152.781l-14.541 11.571c-54.477 43.725-115.712 83.763-181.35 118.682-28.877 15.462-75.878 37.274-97.485 45.466l-6.246 2.355-5.222-14.848zM276.787 731.75c17.101-8.806 31.949-16.794 50.278-27.136 30.822-17.51 78.643-49.050 109.056-71.987l8.602-6.451h-7.066c-29.286-0.205-110.285 0-110.49 0.205-3.891 5.325-22.118 32.563-30.72 45.978-10.138 15.77-32.256 52.531-32.256 53.555 0 0.205-1.843 3.584-4.096 7.373-3.891 6.758-4.71 8.602-3.584 8.602 0.307 0 9.421-4.506 20.275-10.138zM600.064 589.619c0-0.307-29.594-30.31-65.741-66.56l-65.741-65.843-7.578 7.987c-9.626 10.035-28.058 29.798-33.997 36.454-2.56 2.867-6.246 7.066-8.294 9.318s-5.12 5.734-6.656 7.68c-1.638 1.946-3.174 3.789-3.584 4.096-3.379 2.765-50.586 61.133-53.555 66.355-0.614 0.922 24.166 1.229 122.163 1.229 67.686 0 122.982-0.307 122.982-0.717zM630.579 377.344l-0.307-61.44-5.734 4.301c-3.174 2.458-7.475 5.734-9.728 7.475-15.565 11.878-54.067 43.213-63.898 52.122-2.56 2.355-8.090 7.168-12.288 10.854s-10.65 9.421-14.336 12.8c-12.493 11.674-19.661 18.432-23.245 21.811l-3.482 3.379 132.71 133.12 0.307-61.542c0.102-33.792 0.102-89.088 0-122.88zM685.466 376.013c22.938-32.051 47.514-70.554 67.891-106.189 9.728-17.101 12.698-22.426 24.883-45.466l5.427-10.035-5.018 2.867c-28.467 16.282-68.71 41.472-95.642 60.006l-16.896 11.571-0.307 57.242-0.205 57.242 3.379-4.506c1.946-2.458 9.318-12.698 16.486-22.733z" />
+<glyph unicode="&#xeab9;" glyph-name="parental_control" d="M501.76 876.442c-20.787-14.234-53.453-32.461-75.776-42.394-5.325-2.355-12.186-5.427-15.155-6.758-29.901-13.517-80.589-28.979-116.941-35.635-4.813-0.922-10.957-2.15-13.824-2.662-2.765-0.512-7.373-1.229-10.24-1.536-2.765-0.307-6.246-0.819-7.68-1.024-5.12-0.922-30.413-3.482-40.448-4.096-5.632-0.41-12.493-0.819-15.36-1.024-2.765-0.205-15.872-0.41-28.979-0.41l-23.859-0.102 0.41-158.925c0.205-87.45 0.717-160.154 0.922-161.587 0.307-1.434 0.819-5.734 1.229-9.728 3.174-34.816 11.571-74.957 23.347-111.104 35.635-109.568 103.936-200.602 196.915-262.451 37.786-25.19 75.981-43.93 121.446-59.597l13.926-4.813 12.186 4.096c63.59 21.094 128.307 57.651 173.466 97.997 37.171 33.28 62.976 62.874 88.269 101.376 36.147 54.886 62.362 119.603 74.957 184.32 3.584 18.534 4.71 25.907 6.656 44.544 0.614 5.325 1.434 11.571 1.741 13.824 0.41 2.253 0.922 75.674 1.126 163.123l0.41 158.925-23.859 0.102c-13.107 0-26.112 0.205-28.979 0.41-2.765 0.205-10.138 0.614-16.384 1.024-6.144 0.307-12.493 0.819-14.131 0.922-1.536 0.205-5.632 0.717-9.216 1.024-6.656 0.717-19.558 2.355-24.781 3.277-1.638 0.205-5.837 0.922-9.216 1.434-24.474 3.789-60.006 12.698-88.166 22.118-11.674 3.891-40.243 14.848-49.050 18.842-31.334 14.131-59.494 29.696-85.709 47.309-5.018 3.277-9.114 5.939-9.216 5.837-0.205 0-4.71-2.97-10.035-6.656zM526.336 754.79c20.48-2.355 41.267-11.059 57.549-24.064 47.923-38.093 57.754-106.598 22.528-156.774-2.56-3.686-8.602-10.547-13.414-15.36-25.088-24.883-58.061-36.25-93.798-32.358-39.014 4.301-74.24 29.696-91.136 65.843-7.68 16.486-10.752 31.846-10.24 52.019 0.614 24.986 7.782 45.568 22.733 65.536 24.781 32.87 64.512 49.869 105.779 45.158zM428.851 527.36c22.63-16.896 52.531-27.034 80.486-27.443 15.258-0.102 24.166 0.922 38.195 4.403 18.534 4.71 36.045 13.312 51.712 25.395l5.837 4.506 6.963-4.301c36.762-23.040 60.928-61.133 65.843-103.936 0.819-7.066 1.024-30.31 0.717-74.752l-0.41-64.512-2.662-12.39c-11.059-50.278-41.267-90.317-86.118-114.074-34.816-18.432-76.288-23.552-115.814-14.234-54.886 12.8-100.659 54.682-118.682 108.749-8.192 24.371-8.806 32.358-8.704 105.677 0 48.742 0.307 63.386 1.536 70.656 4.915 30.106 17.101 54.886 37.581 76.186 8.704 9.011 15.462 14.643 25.498 21.094 4.608 3.072 8.602 5.632 8.806 5.632 0.102 0 4.301-2.97 9.216-6.656zM465.92 447.386c-16.486-4.403-30.106-19.558-33.075-36.762-5.53-32.154 25.088-60.723 56.115-52.326 31.027 8.294 44.646 43.725 27.034 70.144-11.059 16.486-30.925 24.064-50.074 18.944zM432.64 351.437c-9.011-6.656-16.384-17.203-20.582-29.389-1.741-5.018-1.946-9.011-1.946-38.912 0-29.594 0.205-33.997 1.946-39.424 8.806-28.672 33.382-48.538 61.952-50.381 35.533-2.253 66.253 22.016 72.704 57.549 0.717 3.584 1.126 17.92 1.126 33.997-0.102 24.678-0.41 28.774-2.15 35.328-2.458 8.806-7.475 18.125-12.902 23.962-3.994 4.198-13.312 11.674-14.643 11.674-0.41 0-3.686-1.946-7.27-4.403-19.661-13.107-45.773-13.005-66.253 0.307l-6.246 3.994-5.734-4.301z" />
+<glyph unicode="&#xeaba;" glyph-name="Parrasol" d="M394.752 881.562c-28.262-2.662-61.542-9.318-88.064-17.613l-9.216-2.867-37.069-73.933 82.739-82.739c48.435-48.435 83.456-82.739 84.378-82.534 0.819 0.205 17.51 8.294 37.069 18.125l35.635 17.92 18.432-18.432-18.227-36.352c-9.933-19.968-18.125-36.762-18.125-37.171s33.075-33.792 73.421-74.24c70.349-70.349 73.626-73.421 76.083-72.397 1.434 0.614 17.715 8.704 36.25 17.92 18.534 9.318 34.202 16.896 34.816 16.896s5.12-3.994 9.933-8.806l8.909-8.806-18.33-36.659c-10.035-20.173-18.33-36.864-18.33-37.171 0-0.205 37.274-37.683 82.944-83.251l82.842-82.944 73.728 36.864 3.584 11.366c1.946 6.144 5.018 17.101 6.758 24.269 3.482 14.234 3.686 15.053 5.12 23.347 0.512 3.072 1.434 8.397 2.048 11.776 0.512 3.379 1.331 8.499 1.638 11.264 0.205 2.867 0.717 6.042 0.922 7.168 2.662 13.005 2.765 79.155 0.102 100.864-5.53 47.104-15.872 88.166-32.563 130.048-10.342 25.907-26.931 59.29-38.093 76.8-1.331 1.946-4.301 6.861-6.758 10.752-12.083 19.251-34.509 49.152-49.459 65.843l-5.018 5.53 11.162 11.162c6.963 7.066 11.878 12.902 13.312 15.974 7.885 16.794-4.813 36.557-23.347 36.454-9.216-0.102-14.131-2.97-27.034-15.667l-11.469-11.264-1.946 2.15c-2.56 2.867-23.859 20.070-36.762 29.696-40.55 30.31-92.16 57.549-142.336 74.957-39.424 13.824-77.517 21.811-124.416 26.214-14.234 1.331-58.675 1.024-75.264-0.512zM297.267 270.336l-220.467-220.57 18.432-18.534 18.432-18.432 220.672 220.774c121.344 121.446 220.672 220.979 220.672 221.286 0 1.126-35.328 36.147-36.352 36.147-0.512 0-100.25-99.328-221.389-220.672z" />
+<glyph unicode="&#xeabb;" glyph-name="pass_video" d="M128.307 530.739c0.205-362.598 0.307-378.368 2.15-384.307 6.963-22.938 22.63-41.165 43.418-50.278l5.325-2.458v763.904l665.6 0.512-3.174 6.554c-9.318 19.968-27.443 35.123-49.562 41.779-5.837 1.741-22.118 1.843-335.155 2.15l-328.909 0.205 0.307-378.061zM204.8 458.547c0-242.79 0.41-376.013 1.024-380.621 3.789-25.6 21.606-48.64 45.773-58.88 15.155-6.554-9.933-6.042 345.702-6.144l324.301-0.102-0.102 375.501c-0.102 329.216-0.307 376.525-1.638 382.771-6.554 30.72-32.051 55.091-62.566 59.802-5.12 0.819-100.352 1.126-329.83 1.126h-322.662v-373.453zM332.8 742.4v-38.4h-76.8v76.8h76.8v-38.4zM725.504 779.059c2.97-0.922 6.758-3.379 9.216-5.939 8.294-8.192 7.68 3.584 7.68-158.208 0-161.69 0.512-150.733-7.475-159.027-8.397-8.602 5.734-7.987-173.875-7.68l-159.334 0.307-4.915 3.072c-5.427 3.379-9.933 9.114-11.674 14.95-0.819 2.56-1.126 47.309-1.126 148.070 0 160.563-0.512 149.606 6.963 158.003 2.662 2.97 5.53 4.813 9.421 6.144 5.427 1.946 11.469 1.946 162.918 2.048 143.667 0 157.696-0.102 162.202-1.741zM870.4 742.4v-38.4h-76.8v76.8h76.8v-38.4zM332.8 614.4v-38.4h-76.8v76.8h76.8v-38.4zM870.4 614.4v-38.4h-76.8v76.8h76.8v-38.4zM332.8 486.4v-38.4h-76.8v76.8h76.8v-38.4zM870.4 486.4v-38.4h-76.8v76.8h76.8v-38.4zM332.8 358.4v-38.4h-76.8v76.8h76.8v-38.4zM725.197 395.366c5.734-2.048 11.674-7.27 14.336-12.698l2.355-4.813 0.307-145.408c0.205-126.669 0-146.022-1.331-150.63-1.638-5.837-6.963-12.186-12.8-15.36-3.482-1.843-8.602-1.946-162.816-2.253-178.893-0.307-165.274-0.819-173.568 7.475-8.294 8.192-7.68-3.686-7.68 158.208 0 161.997-0.512 151.040 7.578 159.232 8.192 8.090-5.53 7.475 171.622 7.578 128.102 0 158.925-0.205 161.997-1.331zM870.4 358.4v-38.4h-76.8v76.8h76.8v-38.4zM332.8 230.4v-38.4h-76.8v76.8h76.8v-38.4zM870.4 230.4v-38.4h-76.8v76.8h76.8v-38.4zM332.8 102.4v-38.4h-76.8v76.8h76.8v-38.4zM870.4 102.4v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xeabc;" glyph-name="Pause" d="M128 448v-384h307.2v768h-307.2v-384zM588.8 448v-384h307.2v768h-307.2v-384z" />
+<glyph unicode="&#xeabd;" glyph-name="Payment_euro" d="M102.4 448v-256h819.2v512h-819.2v-256zM793.6 649.216c0-2.048 0.717-7.27 1.638-11.571 6.861-33.382 34.509-58.163 68.608-61.338l6.554-0.614v-255.386l-7.066-0.717c-35.942-3.584-63.898-30.618-69.12-66.662-0.205-1.638-0.512-4.608-0.512-6.349l-0.102-3.379h-563.2v3.891c-0.102 12.083-7.373 31.949-15.667 42.496-11.878 15.155-29.901 26.317-46.49 28.877-2.15 0.41-4.813 0.819-5.939 1.024s-3.584 0.41-5.325 0.41l-3.379 0.102v255.693l7.475 0.717c7.373 0.717 20.89 4.506 26.829 7.475 19.354 10.035 35.328 29.798 39.936 49.766 2.048 9.011 2.355 10.957 2.458 15.36l0.102 3.789h563.2v-3.584zM495.616 600.883c-8.397-0.922-24.576-4.608-33.178-7.578-54.886-18.944-94.106-66.253-102.502-123.802-1.741-12.288-1.331-37.376 0.922-49.152 10.24-54.579 49.459-100.045 101.478-117.658 25.805-8.704 56.627-10.445 82.944-4.608 32.563 7.168 65.229 27.238 84.992 52.122 2.253 2.867 4.403 5.325 4.71 5.632 0.41 0.307 2.867 3.891 5.53 8.090 12.493 19.251 20.48 40.858 23.859 63.898 1.434 10.138 0.717 37.478-1.229 47.821-8.499 44.954-36.454 83.968-76.288 106.394-22.426 12.698-44.851 18.637-71.27 19.046-9.011 0.102-18.022 0-19.968-0.205zM539.238 543.744c19.558-2.355 36.352-14.131 44.749-31.437 5.939-12.186 5.018-19.251-3.277-24.678-3.277-2.15-4.915-2.662-8.909-2.253-6.656 0.512-9.421 2.867-14.848 12.902-7.987 14.643-16.179 19.046-34.304 18.125-16.282-0.717-27.648-8.294-34.714-22.835-1.946-3.891-3.789-8.294-4.096-9.728l-0.614-2.56 33.587 0.102c24.371 0.102 34.406-0.205 36.659-1.126 8.397-3.379 10.138-17.51 2.97-24.166l-2.662-2.458-74.547-0.614v-14.131l31.642-0.307c30.003-0.307 31.744-0.41 33.894-2.355 6.656-6.042 5.222-20.173-2.355-22.63-1.229-0.41-15.155-0.819-30.925-0.922l-28.672-0.102 0.307-2.458c0.512-5.12 6.349-15.053 11.776-20.173 8.294-7.885 14.541-9.933 30.413-9.933 10.854-0.102 13.517 0.307 17.408 2.048 6.246 2.867 10.752 7.578 14.746 15.667 4.506 8.909 6.554 10.547 13.21 11.162 9.318 0.717 18.125-5.837 18.125-13.517 0-6.963-9.523-22.835-18.125-30.106-19.661-16.896-60.518-18.842-85.094-4.096-9.216 5.632-19.046 16.998-24.781 28.877-2.765 5.734-5.632 13.005-6.349 16.282-0.717 3.174-1.536 5.837-1.843 5.939s-3.277 0.205-6.656 0.307c-3.482 0.102-7.578 0.819-9.318 1.434-6.451 2.662-8.704 12.288-4.506 19.046 2.458 4.096 6.451 5.734 13.824 5.734h5.222v7.168l-0.102 7.168h-5.427c-7.168 0-11.878 2.253-14.029 6.861-2.15 4.506-2.253 9.011-0.205 13.824 2.355 5.632 5.734 7.27 14.643 7.373l7.578 0.102 2.048 7.168c4.813 16.282 11.366 28.262 20.070 36.966 15.667 15.667 36.25 21.709 63.488 18.33zM261.632 485.478c-33.792-6.451-42.394-51.302-13.312-69.734 19.661-12.493 45.261-4.813 55.398 16.589 7.373 15.667 1.843 36.557-12.493 46.694-9.114 6.349-18.637 8.499-29.594 6.451zM751.104 486.195c-16.282-2.765-27.648-12.186-32.256-26.829-3.482-11.162-2.048-22.118 4.301-32.051 16.282-25.702 55.296-22.323 67.379 5.734 7.066 16.486 0.717 37.376-14.131 46.797-7.373 4.608-18.637 7.475-25.293 6.349z" />
+<glyph unicode="&#xeabe;" glyph-name="pda_device" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 3.891-0.819 66.048-1.126 215.552-1.126 229.069 0 216.371-0.307 228.352 5.734 11.981 6.144 23.347 21.299 26.214 35.021 0.819 3.891 1.126 72.806 1.126 240.333 0 129.229-0.205 235.008-0.512 235.008s-11.878-11.264-25.6-25.088l-25.088-25.088v-363.52h-409.6v691.2h409.6v-90.624c0-49.869 0.205-90.624 0.512-90.624s11.776 11.264 25.6 25.088l25.088 25.088v80.896c0 54.989-0.41 82.534-1.126 86.221-3.994 19.251-20.992 36.147-39.834 39.731-8.602 1.638-425.062 1.229-431.821-0.41zM559.206 853.914c2.355-2.355 3.277-4.403 3.686-7.68 0.512-5.427-1.126-8.806-5.734-11.878l-3.482-2.355h-41.677c-41.574 0-41.677 0-45.158 2.355-1.946 1.331-4.096 3.994-4.915 6.246-2.048 5.325 0 11.366 4.915 14.643l3.584 2.458 85.606-0.614 3.174-3.174zM524.493 86.221c5.837-3.379 8.397-6.349 10.957-12.288 6.758-15.77-3.686-33.485-20.685-35.226-13.005-1.331-24.474 7.066-27.546 20.173-2.867 12.288 5.018 25.702 17.613 29.798 4.813 1.638 14.95 0.307 19.661-2.458zM649.421 519.987l-235.418-235.315-14.541-24.166c-8.090-13.517-14.746-25.805-15.053-27.75-0.717-3.994 1.126-8.294 4.608-11.571 1.638-1.331 3.789-1.946 7.578-1.946 4.915 0 6.554 0.717 20.48 9.114 8.294 5.12 19.046 11.571 23.859 14.438 8.294 4.915 21.197 17.715 199.168 195.584l190.362 190.362 8.499-8.397c4.608-4.71 8.704-8.806 9.114-9.114 1.126-1.024 41.062 39.629 45.773 46.49 4.813 7.066 8.090 14.336 10.957 23.757 2.56 9.011 2.662 29.286 0 38.912s-9.114 22.118-14.95 28.979l-5.018 5.837-235.418-235.213z" />
+<glyph unicode="&#xeabf;" glyph-name="pdf_file" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM364.032 470.426c18.33-5.632 31.232-16.077 38.195-30.822 5.325-11.059 6.554-16.384 6.963-30.003 0.614-20.070-5.018-35.533-17.51-48.128-10.24-10.342-23.347-16.486-39.424-18.33-2.56-0.307-15.053-0.512-27.853-0.512l-23.347-0.102v-73.728h-45.056v204.902l49.971-0.307c49.664-0.41 49.869-0.41 58.061-2.97zM541.696 471.552c29.798-5.734 49.869-20.992 62.259-47.206 7.782-16.384 10.547-31.846 9.933-56.73-0.41-21.197-4.096-37.581-11.674-52.531-11.162-21.914-30.106-37.069-54.374-43.315-8.294-2.15-11.059-2.355-60.621-2.662l-52.019-0.41v204.902l48.435-0.102c42.496 0 49.562-0.307 58.061-1.946zM768 454.656v-18.944h-82.944v-47.104h69.632v-34.816h-69.632v-84.992h-45.056v204.8h128v-18.944zM301.056 408.064v-30.822l17.715 0.102c9.626 0.102 20.070 0.614 23.142 1.229 15.872 2.867 23.757 12.493 23.859 29.082 0 7.987-1.331 13.619-4.71 18.33-6.758 9.83-17.306 12.8-44.544 12.8h-15.462v-30.72zM480.256 371.2v-64.512h22.323c24.986 0 31.437 1.024 41.37 6.349 10.547 5.632 18.842 17.306 22.938 32.154 2.355 8.806 2.867 32.256 0.819 43.93-3.174 17.818-9.83 29.389-21.402 37.171-11.162 7.578-20.48 9.318-48.333 9.421h-17.715v-64.512zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xeac0;" glyph-name="Pencil" d="M711.578 857.395c-13.824-1.229-29.286-7.373-40.858-16.077-3.686-2.765-113.050-111.514-243.098-241.766-206.336-206.541-236.544-237.158-237.67-240.947-9.83-32.256-35.123-115.507-44.544-146.637-6.656-21.914-13.824-45.466-15.872-52.224-7.066-23.040-14.029-46.080-14.848-49.152-0.512-1.638-3.482-11.571-6.656-22.016-4.915-16.077-5.734-19.763-5.325-24.678 1.536-17.51 18.227-28.877 35.533-24.166 3.072 0.819 11.162 3.174 17.92 5.325 6.758 2.048 19.661 5.939 28.672 8.704s35.533 10.854 58.88 17.92c23.347 7.168 44.544 13.619 47.104 14.336 3.789 1.024 95.334 28.774 111.616 33.792 2.56 0.819 9.011 2.765 14.336 4.403l9.728 3.072 237.261 237.363c130.56 130.662 239.206 240.026 241.562 243.098 5.427 7.066 11.366 19.866 13.824 29.184 2.048 8.294 2.765 24.883 1.331 33.792-1.843 11.981-7.578 25.395-15.258 35.942-5.632 7.475-127.795 129.536-135.373 135.168-17.203 12.595-36.045 17.715-58.266 15.565zM731.75 763.597l8.397-8.499-470.426-470.835 39.014-39.219 38.912-39.219 471.245 470.733 9.728-9.728 9.626-9.728-470.63-470.835 18.944-18.842c10.445-10.445 18.944-19.149 18.944-19.456s-3.584-1.536-7.885-2.765c-4.403-1.229-15.36-4.506-24.371-7.27-9.011-2.867-28.57-8.806-43.52-13.312-14.95-4.608-38.605-11.776-52.736-16.077-14.029-4.301-27.853-8.499-30.72-9.318-2.765-0.717-8.602-2.458-12.902-3.891l-7.782-2.458-68.71 68.915 8.397 27.648c4.71 15.258 9.421 30.925 10.65 34.816 13.312 43.725 28.774 94.618 31.744 104.755 2.048 6.861 3.891 12.493 4.301 12.493 0.307 0 9.011-8.499 19.354-18.842l18.739-18.739 235.11 235.315c199.168 199.373 235.315 235.11 236.646 234.086 0.922-0.717 5.325-5.018 9.933-9.728z" />
+<glyph unicode="&#xeac1;" glyph-name="personal_smartphone_trainer" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM502.272 674.304c-5.018-2.253-39.322-16.896-76.186-32.563-36.762-15.77-66.458-28.877-65.946-29.184s34.714-11.878 75.878-25.702l74.957-24.986 15.053 4.915c8.397 2.765 32.87 11.059 54.579 18.432 21.709 7.27 39.731 13.312 40.141 13.312 0.512 0 0.819-16.896 0.819-37.478 0-36.659 0-37.581-2.56-47.821-1.434-5.734-2.867-11.264-3.174-12.186-0.512-1.741 0.819-1.843 17.408-1.843 9.933 0 18.022 0.307 18.022 0.819 0 0.41-1.229 5.53-2.662 11.469-2.662 10.547-2.765 11.366-3.072 52.941l-0.41 42.086 4.403 1.638c2.355 0.922 6.758 2.458 9.83 3.482l5.632 1.843-8.704 3.686c-4.71 2.048-24.064 10.24-42.906 18.227-63.078 26.829-101.478 43.008-101.683 43.008-0.102 0-4.301-1.843-9.421-4.096zM423.219 537.907c0.41-22.733 0.717-26.829 2.56-33.075 9.728-31.642 32.256-53.658 63.59-62.157 10.342-2.867 32.154-3.072 42.086-0.41 29.184 7.885 52.019 27.75 61.85 54.067 5.12 13.517 5.837 19.149 5.939 43.622 0 12.595-0.205 23.142-0.512 23.45-0.512 0.41-10.035-2.662-67.277-22.221l-19.968-6.861-44.032 14.746c-24.166 8.090-44.134 14.643-44.339 14.643s-0.205-11.674 0.102-25.805zM429.568 434.176c-23.245-14.746-38.4-33.28-43.622-53.658-1.843-7.27-2.048-11.469-1.946-62.054 0-57.754 0.205-59.494 5.12-69.427 7.066-14.131 22.835-27.034 36.864-30.31 2.97-0.717 41.37-1.126 109.363-1.126h104.653l0.102 74.035c0.102 40.653 0 75.776-0.102 77.926-0.102 2.253-1.024 7.373-2.048 11.469-5.53 21.606-22.016 40.755-48.845 56.627-4.301 2.458-5.632 2.867-6.656 1.843-3.789-3.789-13.517-10.24-20.787-13.824-17.101-8.602-31.13-11.571-52.736-10.957-16.691 0.41-18.637 0.717-30.106 4.301-13.312 4.198-25.395 10.65-35.942 19.149l-3.072 2.458-10.24-6.451z" />
+<glyph unicode="&#xeac2;" glyph-name="phone_advisor" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM489.882 672.461c-0.614-0.41-3.379-9.728-6.042-20.685-5.734-22.938-6.758-25.088-41.165-88.576-11.981-22.118-16.077-29.798-27.648-51.507-7.782-14.541-14.336-22.118-24.371-27.955l-6.144-3.584-0.307-59.904c-0.205-40.141 0.102-61.952 0.819-66.458 4.301-24.986 26.214-47.309 55.296-56.525l7.68-2.355h134.144l5.325 2.458c5.939 2.662 11.981 8.602 14.234 14.029 0.819 1.946 1.638 6.246 1.843 9.626 0.614 11.469-4.813 21.606-13.824 25.805-2.662 1.331-4.915 2.56-5.018 2.867 0 0.307 4.506 0.614 10.035 0.717 16.486 0.205 26.624 5.427 31.539 16.179 3.277 6.861 3.277 14.643 0 21.504-3.789 8.192-11.469 13.619-22.938 16.282l-5.837 1.331 8.704 0.614c16.691 1.229 26.829 7.168 31.642 18.432 2.765 6.349 2.765 12.39-0.102 19.661-4.301 11.264-14.746 16.794-32.563 17.203-5.632 0.102-10.24 0.41-10.24 0.717s0.922 0.614 2.048 0.717c3.379 0.307 12.595 5.018 16.077 8.192 5.53 5.325 7.987 11.059 7.885 19.354 0 6.349-0.41 7.987-3.072 12.288-4.096 6.656-10.342 11.162-19.149 13.926-7.168 2.15-8.909 2.253-52.634 2.253-24.986 0.102-45.363 0.307-45.363 0.614s1.843 6.554 3.994 13.824c2.253 7.373 9.83 32.563 16.998 56.218 11.674 38.912 12.8 43.418 12.39 48.64-0.717 7.27-1.946 11.469-4.813 16.282-5.632 9.523-13.107 14.541-24.474 16.384-12.186 2.048-13.824 2.253-14.95 1.434z" />
+<glyph unicode="&#xeac3;" glyph-name="phone_fund" d="M360.858 877.978c-17.408-15.462-35.942-36.454-47.514-53.658-23.45-34.918-33.792-68.403-34.202-111.104l-0.205-16.896-22.528-22.528c-47.923-47.923-74.547-86.528-91.034-131.686l-1.741-4.71h-23.654c-23.142 0-23.962-0.102-30.208-2.662-15.77-6.451-27.648-21.402-31.539-39.424-2.15-10.24-2.048-164.352 0.102-174.797 4.096-19.354 17.818-35.021 35.738-40.55 2.56-0.717 12.39-1.229 26.931-1.331l22.835-0.102 3.789-6.451c5.222-8.909 13.005-18.432 24.474-30.208 13.005-13.21 24.986-23.45 59.29-50.893 15.77-12.493 28.877-23.040 29.184-23.245 0.307-0.307 0.717-25.702 1.126-56.422l0.512-56.013 2.765-7.68c5.325-14.643 15.36-26.112 27.853-31.949 4.915-2.253 6.246-2.355 37.478-2.662 30.822-0.307 32.666-0.205 38.81 1.843 11.878 3.994 21.811 13.005 27.955 25.19 6.042 11.981 7.066 16.589 7.578 35.43 0.41 11.776 0.922 17.203 1.741 17.203 0.614 0 3.891-1.024 7.27-2.15 15.258-5.12 45.875-12.288 67.584-15.77 4.301-0.717 20.787-2.56 28.877-3.174 14.746-1.126 51.2-0.41 61.747 1.126 1.434 0.205 5.939 0.717 10.138 1.024 4.198 0.41 8.602 0.922 9.728 1.126s5.734 0.819 10.24 1.434c28.365 3.789 67.379 12.595 90.112 20.48 3.379 1.126 6.349 2.048 6.758 2.048s0.819-8.294 0.819-18.33c0.102-20.685 1.229-26.829 6.861-38.502 6.349-13.005 17.203-23.142 29.082-27.034 6.042-1.946 8.909-2.15 33.792-2.15 20.070 0 28.672 0.41 32.666 1.434 16.589 4.506 31.027 20.89 35.942 41.165 1.843 7.373 2.048 12.186 2.048 53.146 0 24.781 0 52.429 0.102 61.542v16.486l6.246 6.554c7.066 7.373 15.974 17.51 18.944 21.504 1.024 1.434 3.789 5.12 6.042 8.192 4.403 5.734 14.438 21.709 17.203 27.034 20.378 40.243 29.798 71.987 35.021 118.784 0.307 2.867 0.819 6.042 1.024 7.168 1.946 9.626 2.765 70.042 1.229 89.6-2.662 33.382-12.8 72.704-27.034 105.472-28.979 66.765-81.306 125.338-147.763 165.683-33.894 20.48-73.523 36.864-113.459 46.797-21.402 5.325-36.045 7.782-66.253 11.264-2.253 0.307-16.794 0.717-32.256 0.922-43.315 0.614-73.216-2.867-115.2-13.312-11.674-2.867-37.888-11.059-45.773-14.234-1.741-0.717-1.843 0.307-1.843 12.902 0 7.578-0.717 18.33-1.536 23.962-3.584 23.757-13.926 53.862-25.498 74.138l-2.355 4.301-6.042-5.325zM595.968 765.133c1.434-0.307 5.53-0.819 9.216-1.229 19.968-1.843 54.784-9.114 74.752-15.565l5.632-1.843 0.205-18.739c0.205-12.493-0.102-18.534-0.819-18.022-2.15 1.331-21.709 7.578-32.768 10.547-15.974 4.198-35.021 7.782-46.49 8.909-3.379 0.307-7.27 0.819-8.704 1.126-4.301 0.922-52.224 1.229-60.416 0.307-15.974-1.741-30.515-4.301-44.339-7.782-7.885-2.048-28.16-8.909-32.154-10.957-6.554-3.379-6.451-3.686-6.451 16.589v18.33l8.499 3.072c22.426 8.090 47.002 13.414 70.656 15.155 4.608 0.41 8.602 0.819 8.806 1.024 0.717 0.614 51.2-0.307 54.374-0.922zM598.016 628.326c3.072-0.512 7.475-1.331 9.626-1.638 6.246-0.922 19.251-4.403 27.443-7.27 30.618-11.059 54.989-30.31 66.253-52.429 6.246-12.39 7.885-29.696 3.789-41.267-6.656-18.944-22.733-30.208-42.598-29.901-14.643 0.205-22.835 6.042-39.322 28.262-12.288 16.589-19.251 22.323-31.949 26.317-8.602 2.765-23.552 3.789-31.13 2.15-13.005-2.765-26.010-12.39-31.334-23.347-6.042-12.39-4.608-26.317 4.915-45.978l3.482-7.066 23.962-0.102c18.739-0.102 25.498-0.512 30.72-1.843 20.992-5.427 32.666-21.811 30.618-43.11-1.024-10.138-4.506-17.306-11.469-23.552-11.469-10.342-20.070-12.8-44.851-12.8-13.619 0-18.227-0.307-18.534-1.229-0.307-0.717-0.614-3.584-0.717-6.451-0.717-13.21-7.168-33.075-17.613-53.965l-3.994-7.987h72.602c45.056 0 74.65-0.41 78.029-1.024 8.704-1.638 17.818-6.451 23.757-12.595 6.144-6.246 8.704-12.39 9.626-22.835 1.843-22.835-13.619-40.448-37.99-43.213-8.192-0.922-213.606-0.717-220.262 0.205-15.36 2.15-25.395 8.192-30.925 18.739-4.096 7.68-5.837 16.794-5.12 26.829 0.614 9.626 4.096 17.613 11.981 27.75 12.698 16.282 20.378 29.798 24.064 42.496 2.458 8.294 6.656 28.57 6.656 31.949 0 1.024-4.096 1.331-19.149 1.331-23.142 0-29.286 0.922-38.912 5.632-14.746 7.27-21.709 20.787-20.173 39.117 0.819 10.24 3.891 17.306 10.547 23.859 9.523 9.523 18.33 12.39 37.888 12.493 6.861 0.102 12.39 0.205 12.39 0.307s-0.922 3.174-2.048 6.758c-6.042 18.739-7.782 29.184-7.475 45.568 0.205 14.029 4.813 30.925 10.752 39.526 1.024 1.434 1.843 2.97 1.843 3.379 0 1.434 7.885 10.547 15.667 18.227 20.685 20.275 51.098 33.894 87.245 39.117 10.445 1.434 42.803 1.229 51.712-0.41z" />
+<glyph unicode="&#xeac4;" glyph-name="phone_protection" d="M293.786 881.357c-17.203-4.506-31.437-19.149-36.25-37.171-2.253-8.294-2.253-784.077 0-792.371 5.018-18.944 21.197-34.509 39.424-37.99 3.482-0.614 80.896-1.024 215.962-0.922 195.584 0 211.046 0.102 217.293 1.741 17.203 4.506 31.437 19.149 36.25 37.171 1.331 4.71 1.536 41.677 1.536 252.109v246.477h-155.546c-170.394 0-159.846-0.41-167.936 6.042-2.048 1.638-4.915 5.222-6.246 7.987l-2.56 4.915-0.307 119.808c-0.102 65.946-0.102 136.397 0 156.672l0.307 36.864 165.581-165.581c91.136-91.136 165.888-165.683 166.195-165.683 1.126 0 0.512 285.491-0.614 291.021-3.994 19.251-20.992 36.147-39.834 39.731-3.482 0.614-80.896 1.024-215.962 0.922-195.584 0-211.046-0.102-217.293-1.741z" />
+<glyph unicode="&#xeac5;" glyph-name="Photo_dialer" d="M425.472 831.386c-1.126-0.205-4.608-0.922-7.68-1.536-21.402-4.301-41.574-20.582-52.224-42.394-6.246-12.698-13.517-20.685-23.552-26.010-10.24-5.427-15.36-6.246-40.96-6.246-39.219 0-43.11 1.536-66.662 27.238-14.746 15.974-34.406 24.064-57.242 23.552-20.787-0.614-37.581-7.68-52.122-22.118-9.83-9.728-15.872-20.378-20.685-36.762-1.434-4.813-1.843-23.45-0.717-30.822 2.458-15.565 11.469-31.949 23.245-42.394 17.203-15.36 22.938-23.45 25.6-36.25 0.819-3.891 1.126-62.464 1.126-202.24 0-214.63 0.205-204.698-5.837-216.064-2.765-5.12-7.885-10.752-21.606-23.552-16.077-15.053-24.064-34.611-23.347-57.037 0.717-23.859 9.933-42.701 28.16-57.446 8.397-6.861 14.131-10.035 23.757-13.107 9.626-3.174 10.65-3.379 22.426-3.789 22.118-0.717 41.882 7.27 56.832 23.142 19.149 20.275 24.576 24.064 37.786 26.522 8.704 1.638 473.498 1.536 481.075 0 12.902-2.662 19.251-7.27 36.557-25.805 15.872-17.203 37.274-25.498 61.235-23.859 25.19 1.741 48.128 16.179 61.030 38.605 1.536 2.56 3.891 7.885 5.222 11.878 10.24 29.184 2.765 60.826-19.149 81.101-18.842 17.306-23.552 23.859-26.214 36.762-1.638 7.68-1.638 397.21 0 404.89 0.614 2.97 2.56 8.397 4.198 11.981 3.072 6.554 5.837 9.728 21.709 24.678 10.035 9.421 19.456 24.781 21.504 34.918 0.307 1.331 1.024 5.018 1.638 8.090 1.946 9.83 0.922 23.962-2.56 35.328-7.168 23.142-26.010 42.394-48.64 49.562-9.83 3.174-10.752 3.277-22.528 3.686-26.010 0.819-48.026-10.035-64.819-31.744-6.144-8.090-18.534-15.667-29.286-17.818-8.602-1.843-51.61-1.331-59.085 0.614-7.885 1.946-16.179 6.451-22.016 11.878-4.71 4.301-13.21 16.282-13.21 18.637 0 1.946-9.523 15.974-13.926 20.48-30.413 31.232-79.053 32.154-109.261 2.048-11.878-11.776-19.661-26.624-22.118-42.086-0.922-5.632-1.126-5.12-3.584 5.53-5.837 26.214-26.522 47.616-53.862 55.706-6.349 1.946-25.6 3.379-30.208 2.253zM793.6 458.547c0-239.821 0.205-227.738-5.837-239.206-3.789-7.168-15.053-18.227-22.016-21.606-10.547-5.12-14.234-5.632-45.466-5.734l-29.082-0.102v50.176c0 45.363-0.205 51.2-2.048 62.259-7.27 43.008-32.154 78.541-70.451 100.25-4.301 2.458-8.499 4.506-9.216 4.506-0.819 0-3.584-1.843-6.144-4.198-6.451-5.632-22.835-16.384-30.413-19.866-13.107-5.939-25.907-9.933-39.424-12.288-8.602-1.434-26.931-1.741-36.864-0.614-28.058 3.277-51.2 12.902-72.704 30.31-4.506 3.686-8.806 6.656-9.523 6.656-1.843 0-15.667-8.090-23.962-13.926-15.565-10.957-33.587-32.256-42.803-50.483-4.403-8.909-9.318-22.938-11.981-34.406-2.048-8.602-2.253-12.8-2.56-63.693l-0.41-54.579h-102.298v220.16c0 155.443 0.307 221.696 1.126 225.485 3.891 18.637 19.558 34.816 38.093 39.322 4.198 1.024 60.928 1.229 264.704 1.331l259.277 0.102v-219.853zM469.914 339.763c11.571-12.595 19.558-24.166 19.558-28.467 0-2.56-3.174-6.963-9.421-13.312-2.56-2.56-5.018-5.837-5.325-7.27-1.536-6.042 6.758-18.125 24.986-36.25 14.131-14.131 24.474-21.504 30.925-22.221 4.301-0.512 4.915-0.205 9.114 3.789 9.523 9.114 11.162 10.24 14.643 10.24 3.891 0 10.854-4.608 23.654-15.462 9.114-7.578 11.366-10.752 10.445-14.438-0.922-3.379-18.227-20.378-23.040-22.528-5.018-2.355-11.981-2.253-21.709 0.205-48.026 12.288-108.544 78.746-108.544 119.194 0 8.192 2.458 12.902 10.854 21.094 13.722 13.312 16.077 13.824 23.859 5.427zM499.2 626.586c-27.341-3.482-52.429-16.077-70.656-35.43-33.894-35.942-41.267-88.474-18.637-132.301 15.155-29.389 43.11-51.098 76.186-59.085 7.066-1.741 12.493-2.253 24.883-2.355 19.046-0.102 28.16 1.536 44.237 7.987 31.744 12.902 57.549 41.062 66.97 73.318 21.811 74.547-32.87 148.173-110.080 148.275-5.427 0-11.162-0.205-12.902-0.41z" />
+<glyph unicode="&#xeac6;" glyph-name="picture_messaging" d="M102.707 556.339c0.205-261.427 0.307-276.070 2.048-281.702 9.523-31.027 33.997-52.224 65.229-56.525 1.434-0.205 27.136-0.41 57.139-0.41l54.477-0.102v-153.6l153.6 153.6h486.4l-0.102 273.203c-0.102 299.11 0.307 279.245-6.042 294.298-9.114 21.299-26.214 36.454-50.176 44.237l-6.656 2.15-756.224 0.512 0.307-275.661zM858.726 777.216c3.072-1.946 6.144-5.018 8.090-8.090l3.072-5.018 0.205-221.798 0.307-221.798-3.891 4.096c-2.15 2.253-8.397 9.421-14.029 15.872s-10.445 11.981-10.752 12.288c-0.41 0.307-12.493 14.131-27.034 30.72s-27.955 31.846-29.696 33.792c-1.741 1.946-9.83 11.162-18.022 20.48s-15.258 17.408-15.872 18.022c-0.512 0.614-3.584 3.994-6.656 7.68-5.018 5.837-14.029 15.974-15.36 17.306-0.307 0.307-3.482 3.994-7.168 8.192-3.584 4.198-6.861 7.885-7.168 8.192s-4.915 5.53-10.24 11.674c-5.325 6.144-12.186 14.029-15.258 17.408-7.987 8.909-11.059 12.493-18.534 21.094-3.686 4.198-7.066 8.192-7.68 8.806-1.843 1.946-13.21 14.95-17.715 20.378-8.909 10.342-13.21 13.107-19.968 12.902-4.813-0.102-8.499-2.048-12.595-6.451-1.741-1.843-13.824-18.33-26.829-36.659-20.070-28.058-53.453-74.957-85.402-119.603-9.83-13.722-22.016-30.822-31.949-44.442l-7.885-11.059-13.005 16.179c-7.066 8.806-20.787 25.805-30.413 37.581-9.626 11.878-25.293 31.232-34.816 43.008-9.523 11.878-19.046 23.552-21.197 26.112-2.048 2.56-7.27 8.909-11.571 14.029-8.602 10.65-11.878 12.8-19.046 12.8-6.451-0.102-10.035-2.56-18.534-12.902-3.686-4.608-24.064-29.491-45.261-55.398-63.795-77.824-72.499-88.474-80.282-97.997l-7.578-9.114-4.301 3.891c-10.957 9.933-17.51 21.606-19.968 35.533-0.819 4.198-1.126 68.608-1.126 201.011v194.867l700.109-0.512 5.018-3.072zM266.24 727.962c-10.035-2.15-17.92-5.325-26.010-10.65-16.486-10.854-27.238-25.6-32.87-45.056-2.56-8.909-2.662-29.491-0.102-38.707 7.68-28.365 30.106-49.766 58.47-55.603 15.974-3.277 30.413-2.048 45.261 3.994 19.866 8.090 37.376 26.931 43.52 46.797 4.301 13.722 4.71 33.485 1.024 45.056-8.602 26.726-27.136 45.261-52.941 52.838-9.114 2.765-26.931 3.379-36.352 1.331z" />
+<glyph unicode="&#xeac7;" glyph-name="Pills" d="M708.608 856.474c-78.438-8.704-144.589-65.536-164.25-141.005-6.656-25.19-6.042-3.277-6.349-262.349-0.307-243.405-0.307-243.2 3.584-261.632 5.632-27.136 16.998-52.531 33.792-75.264 26.522-36.045 66.662-62.464 110.182-72.704 25.395-5.837 55.603-6.451 80.384-1.536 73.114 14.541 129.843 67.686 149.299 139.776 1.126 4.198 2.97 12.083 3.994 17.408 1.741 9.216 1.843 21.606 1.843 245.76 0 129.843-0.307 239.104-0.717 242.79-4.813 42.598-23.962 82.022-54.886 113.254-31.13 31.334-72.294 51.098-115.61 55.501-10.957 1.126-30.822 1.126-41.267 0zM758.272 802.406c30.413-6.656 56.934-22.221 76.902-44.954 12.902-14.746 21.504-29.594 27.443-47.309 7.68-23.142 7.168-12.8 7.578-144.077l0.307-118.067h-256.102v-123.085c0-120.422-0.102-123.29-2.048-126.464-3.789-6.246-11.059-8.090-17.101-4.403-7.066 4.198-6.451-16.794-6.349 244.429 0 132.403 0.41 239.514 1.024 243.507 3.891 31.13 17.92 59.494 40.448 82.022 21.606 21.606 47.002 34.509 78.234 39.834 11.264 1.946 37.99 1.229 49.664-1.434zM269.824 727.962c-47.821-6.246-90.829-29.696-122.88-67.379-13.824-16.077-27.648-41.062-34.714-62.362-4.403-13.517-6.451-22.835-8.806-40.141-0.922-7.27-0.614-39.424 0.512-45.056 0.307-1.638 1.434-8.090 2.662-14.131 2.458-13.312 8.602-31.232 15.462-45.568 5.837-12.083 18.227-30.925 26.419-40.346 3.072-3.482 77.824-78.541 165.99-166.81 170.291-170.189 170.086-169.984 191.898-182.374 20.582-11.571 42.496-19.251 67.072-23.347 7.578-1.331 40.346-2.048 46.592-1.126l4.096 0.614-6.656 3.994c-6.246 3.789-17.715 11.776-22.733 15.77-11.981 9.626-20.787 18.125-30.106 28.979-6.451 7.68-8.192 9.114-12.8 10.65-14.131 4.506-31.232 15.053-45.261 27.648-13.21 11.878-330.957 330.24-332.39 333.005-2.662 5.222-0.512 12.8 4.506 16.077 3.482 2.253 10.035 2.355 13.414 0.205 1.434-1.024 41.267-40.448 88.576-87.757l85.914-85.914 145.408 145.408v143.462l-45.568 45.466c-46.899 46.694-56.525 55.194-74.65 65.946-18.534 10.957-38.81 18.739-60.621 23.142-17.101 3.584-42.803 4.301-61.338 1.946z" />
+<glyph unicode="&#xeac8;" glyph-name="pioneering" d="M144.282 881.869c-10.957-3.072-19.866-10.65-24.883-21.197l-3.174-6.656-0.307-420.659-0.205-420.557h76.8v409.6h118.067c76.595 0 120.218-0.41 124.518-1.126 34.611-5.53 61.338-34.304 64.102-68.813 0.307-3.789 0.717-9.933 1.024-13.722 2.662-33.997 28.672-62.362 62.976-68.813 3.686-0.614 63.078-1.024 175.923-1.126 143.258 0 170.086 0.205 168.96 1.331-0.717 0.819-6.861 7.373-13.619 14.541s-13.005 13.824-13.926 14.746c-0.819 0.922-8.397 9.011-16.794 18.022s-18.33 19.558-22.016 23.45c-3.686 3.891-7.578 8.090-8.704 9.318-1.126 1.126-5.53 5.837-9.728 10.342-10.854 11.469-33.997 36.147-37.888 40.346-5.53 6.042-15.36 16.486-23.45 25.088-30.822 32.563-44.032 46.899-44.032 47.616s2.662 3.686 44.442 48.128c3.891 4.198 7.68 8.090 8.192 8.806 0.614 0.614 7.475 7.987 15.36 16.384 7.885 8.294 15.667 16.589 17.203 18.33 1.638 1.638 7.987 8.397 14.029 14.848s12.493 13.414 14.336 15.36c5.12 5.53 28.262 30.208 36.966 39.424 4.301 4.506 10.752 11.366 14.336 15.258s10.957 11.674 16.384 17.408l9.933 10.342-21.197 0.205c-11.571 0.205-83.763 0.41-160.358 0.614-138.138 0.205-139.366 0.307-145.92 2.355-25.907 8.397-43.622 25.088-52.019 49.050-2.56 7.373-3.994 16.179-4.71 29.184-1.946 35.533-26.419 63.693-61.645 71.168-5.939 1.229-27.443 1.536-138.752 1.536h-131.686l-0.512 11.059c-0.41 9.728-0.819 11.878-3.584 17.715-6.246 13.005-18.534 21.402-32.461 22.118-3.994 0.102-9.421-0.307-11.981-1.024z" />
+<glyph unicode="&#xeac9;" glyph-name="Play" d="M128 448v-409.702l11.059 5.837c6.042 3.174 14.234 7.475 18.125 9.626 3.994 2.048 13.21 6.963 20.48 10.752 12.39 6.451 16.998 8.806 41.779 21.914 5.12 2.765 14.541 7.578 20.685 10.854 6.246 3.277 15.462 8.090 20.48 10.752 18.125 9.523 28.877 15.155 38.912 20.48 5.632 2.97 14.438 7.578 19.456 10.24 5.12 2.662 14.746 7.68 21.504 11.264s15.974 8.397 20.48 10.752c4.506 2.355 17.613 9.318 29.184 15.36s25.702 13.517 31.539 16.486c5.734 3.072 15.36 8.090 21.504 11.264 6.042 3.174 14.234 7.475 18.125 9.626 3.994 2.15 13.21 6.963 20.48 10.752 15.155 7.885 29.491 15.462 39.936 20.992 9.318 5.018 127.283 68.915 134.656 73.011 7.578 4.198 13.722 7.475 27.136 14.541 6.246 3.277 11.776 6.246 12.288 6.656 0.614 0.41 12.595 6.963 26.624 14.541 14.131 7.68 45.466 24.576 69.632 37.683 24.269 13.107 47.002 25.498 50.688 27.443s14.029 7.578 23.040 12.493c9.011 4.915 19.251 10.445 22.733 12.288 3.584 1.843 6.451 3.686 6.451 4.096s-4.506 3.072-9.933 5.939c-5.53 2.97-12.288 6.656-15.155 8.192-2.765 1.638-9.728 5.325-15.36 8.397-5.632 2.97-12.493 6.656-15.36 8.192-4.506 2.458-41.984 22.835-59.392 32.256-8.294 4.403-41.472 22.426-49.152 26.624-3.379 1.843-9.318 5.018-13.312 7.168-3.891 2.15-9.421 5.12-12.288 6.656-2.765 1.536-8.294 4.506-12.288 6.656-3.891 2.15-9.421 5.12-12.288 6.656-11.366 6.246-42.496 23.040-49.664 26.931-13.21 7.066-18.842 10.138-22.016 11.981-1.638 1.024-7.168 3.994-12.288 6.656-5.018 2.662-11.469 6.144-14.336 7.68-2.765 1.536-13.414 7.27-23.552 12.8-10.138 5.427-21.299 11.571-24.781 13.414-10.445 5.734-35.635 18.944-74.035 39.117-5.939 3.072-13.926 7.373-17.92 9.421-3.891 2.048-12.698 6.656-19.456 10.24-6.758 3.482-16.384 8.602-21.504 11.264-17.613 9.318-28.774 15.155-41.984 22.016-7.27 3.789-15.565 8.192-18.432 9.728-2.765 1.536-11.059 5.939-18.432 9.728-7.27 3.891-16.486 8.704-20.48 10.752-3.891 2.048-14.029 7.373-22.528 11.776-8.397 4.403-16.691 8.704-18.432 9.728-1.638 1.024-10.445 5.632-19.456 10.24-16.896 8.704-28.467 14.848-40.96 21.504-3.891 2.048-12.698 6.656-19.456 10.24-6.758 3.482-16.384 8.602-21.504 11.264-5.018 2.662-14.131 7.475-20.173 10.65l-11.059 5.837v-409.702z" />
+<glyph unicode="&#xeaca;" glyph-name="play_and_win" d="M230.4 870.4v-38.4h-153.702l0.41-101.069c0.307-98.509 0.41-101.478 2.458-112.435 6.144-31.232 15.667-54.886 31.949-79.462 23.45-35.328 58.675-63.181 98.714-78.131 9.933-3.686 32.563-9.83 36.352-9.83 1.434 0 2.458-1.024 3.174-3.277 2.97-8.499 16.998-37.171 21.299-43.418 1.126-1.638 4.71-6.963 8.090-11.878 10.445-15.36 14.438-20.48 25.498-32.461 33.485-36.25 78.234-64.819 122.573-78.131l7.987-2.355v-112.947l-19.661-0.512c-10.854-0.307-21.606-1.024-23.859-1.741-20.992-6.246-35.635-16.691-46.285-32.973-7.27-11.162-10.752-21.402-12.186-35.123l-0.717-6.656h358.707v3.584c0 5.734-2.867 18.33-5.939 25.805-9.318 22.938-32.768 42.086-56.115 45.875-2.765 0.512-5.427 0.922-6.042 1.024-0.512 0.102-8.499 0.307-17.613 0.307l-16.691 0.205v113.254l4.915 1.229c8.806 2.355 27.136 9.523 40.653 15.974 35.123 16.794 69.837 43.93 94.208 73.728 2.253 2.765 5.325 6.451 6.758 8.192 11.878 14.541 31.13 48.435 38.195 67.277l1.741 4.608 9.011 1.741c21.504 3.994 49.869 15.77 69.632 28.774 13.414 8.909 21.197 15.155 32.154 26.010 32.358 31.846 51.814 70.758 59.699 118.989 0.41 2.56 0.922 49.869 1.126 105.267l0.41 100.557h-153.702v76.8h-563.2v-38.4zM531.456 722.432c10.24-30.72 18.842-56.013 19.149-56.32 0.205-0.307 25.907-0.512 56.934-0.512 31.13 0 56.422-0.41 56.32-0.819s-20.173-16.691-44.544-36.147c-24.371-19.456-45.568-36.454-47.002-37.786l-2.662-2.253 19.251-57.446 19.149-57.446-12.288 8.397c-6.758 4.608-14.848 10.138-18.022 12.39-3.174 2.15-19.046 13.107-35.226 24.269-16.179 11.264-29.901 20.378-30.413 20.378-0.614 0-4.71-2.458-9.011-5.53-4.403-3.072-15.155-10.445-23.859-16.486-8.704-5.939-20.89-14.336-27.136-18.637-29.082-20.070-34.816-23.859-35.021-23.142-0.205 0.614 21.402 66.458 36.454 110.899 0.819 2.458-1.638 4.506-46.592 40.448-26.112 20.89-47.411 38.093-47.514 38.4 0 0.307 25.19 0.512 56.115 0.41 30.822 0 56.525 0.102 57.139 0.307s9.626 25.907 19.968 57.139c10.342 31.13 19.149 56.32 19.558 56.013 0.307-0.41 9.011-25.805 19.251-56.525zM230.502 654.131c0-110.49 0.205-122.47 1.434-131.584 0.41-3.072 0.205-3.891-1.024-3.891-0.819 0-6.861 2.765-13.414 6.144-40.96 21.094-66.662 54.989-76.902 101.376-1.536 6.656-1.741 17.101-2.15 76.083l-0.307 68.301h92.262l0.102-116.429zM885.76 706.355c0-70.554-0.307-75.366-6.144-94.925-3.994-13.21-12.39-30.413-20.378-41.574-7.885-11.059-22.323-25.6-33.075-33.382-8.090-5.837-30.413-17.818-33.178-17.818-0.922 0-1.229 1.229-0.819 4.403 0.205 2.355 0.614 6.349 0.819 8.909 0.307 2.56 0.512 57.242 0.512 121.651l0.102 116.941h92.16v-64.205zM301.056 63.283c-5.018-1.638-10.752-5.325-13.312-8.397-5.939-7.578-6.144-9.114-6.144-39.629v-28.058h460.902l-0.307 29.491c-0.307 32.87-0.307 32.563-8.090 40.141-7.987 7.782 10.547 7.168-222.515 7.066-114.995 0-209.715-0.307-210.534-0.614z" />
+<glyph unicode="&#xeacb;" glyph-name="playmode_random" d="M768 767.488v-63.488l-58.061-0.102c-32.051 0-58.88-0.205-59.699-0.307-0.819-0.205-5.427-0.614-10.138-1.024-12.902-1.024-33.894-5.222-48.742-9.728-57.139-17.408-106.394-54.374-139.674-105.062-22.016-33.587-34.406-67.379-40.448-110.592-0.307-2.253-0.819-11.674-1.229-20.992-1.229-36.25-6.042-56.934-18.944-80.794-6.963-13.005-15.155-23.757-27.443-35.942-25.805-25.6-58.061-40.96-93.286-44.442-3.072-0.307-47.923-0.614-99.533-0.614h-94.003v-102.502l102.093 0.41c56.218 0.205 104.243 0.717 106.803 1.126 22.323 3.379 42.496 8.397 59.904 14.95 64.102 24.064 117.248 74.342 144.896 137.318 3.994 8.909 11.776 31.13 12.698 35.738 0.205 1.434 1.434 6.246 2.56 10.752 2.765 11.059 5.12 28.467 5.734 43.213 1.229 27.136 1.741 32.973 3.686 42.803 6.042 29.901 19.661 55.091 41.882 77.414 16.179 16.179 32.051 26.931 50.688 34.406 27.034 10.752 32.256 11.366 103.219 11.469l57.037 0.102v-128.307l5.939 5.53c3.174 3.072 10.035 9.216 15.053 13.824 5.12 4.506 22.63 20.378 38.912 35.226 16.384 14.848 33.792 30.72 38.912 35.226 5.018 4.608 11.981 10.854 15.36 13.926 3.379 3.174 10.752 9.83 16.384 14.848s10.957 9.83 11.878 10.752c0.922 0.819 5.53 5.018 10.24 9.216 20.582 18.33 24.986 24.781 26.112 38.195 0.512 5.939 0.205 8.704-1.434 13.824-3.789 11.264-2.458 9.83-46.797 49.869-6.758 6.042-14.336 12.902-16.896 15.258-6.246 5.734-28.262 25.702-33.28 30.208-2.253 2.048-13.517 12.288-25.088 22.63-11.571 10.445-23.757 21.504-27.136 24.678-11.469 10.752-26.931 24.474-27.546 24.474-0.307 0-0.614-28.57-0.614-63.488zM76.8 652.8v-51.2h94.003c51.61-0.102 96.461-0.307 99.533-0.614 46.49-4.403 89.702-31.232 115.61-71.68 2.867-4.403 5.222-8.704 5.222-9.318 0-0.717 0.41-1.331 0.819-1.331s2.355 4.915 4.198 10.957c8.602 28.16 22.118 55.808 39.014 79.462 9.83 13.926 9.728 11.776 1.024 20.275-37.786 36.557-79.155 58.778-129.024 69.325-23.245 4.915-31.846 5.325-134.349 5.325h-96.051v-51.2zM768 357.888v-63.59l-61.133 0.307c-58.163 0.41-61.747 0.512-70.963 2.662-31.949 7.168-55.808 20.070-77.926 42.086-11.264 11.264-17.203 18.637-24.166 30.31l-5.018 8.294-2.765-9.728c-7.987-27.443-23.45-59.085-40.243-82.33-9.011-12.595-8.909-10.854-1.331-18.227 46.080-45.261 100.659-70.144 164.25-75.162 2.253-0.205 30.003-0.307 61.747-0.41l57.549-0.102v-128.307l5.939 5.53c3.174 3.072 9.933 9.216 14.95 13.722s9.626 8.704 10.24 9.318c0.614 0.512 9.011 8.090 18.534 16.794 14.746 13.312 28.058 25.293 37.99 34.304 1.229 1.126 3.994 3.686 6.144 5.632 2.253 1.946 9.114 8.192 15.258 13.722 6.246 5.632 15.872 14.438 21.402 19.456 5.632 5.12 10.65 9.83 11.264 10.342 2.048 1.843 19.558 17.51 23.552 21.094 8.192 7.27 13.926 19.354 13.926 29.491 0 10.445-5.837 22.63-14.541 30.31-4.506 3.994-54.477 48.947-55.091 49.664-1.024 1.024-12.902 11.878-21.914 19.968-5.018 4.506-9.626 8.704-10.24 9.216-1.638 1.536-41.062 37.171-44.032 39.936-7.475 6.656-13.005 11.674-21.504 19.456-5.53 5.12-10.445 9.421-10.957 9.523-0.512 0.205-0.922-25.907-0.922-63.283z" />
+<glyph unicode="&#xeacc;" glyph-name="polls" d="M76.8 483.43c0-332.902-0.717-303.411 7.68-320.614 7.987-16.589 22.63-31.334 39.731-39.834 16.794-8.499-23.245-7.782 423.424-7.782h399.565v297.779c0 290.918 0 298.086-1.946 305.562-7.475 29.082-35.533 55.91-64.102 61.133-4.301 0.819-121.344 1.126-405.197 1.126h-399.155v-297.37zM808.243 634.982c4.403-3.072 5.632-4.301 7.782-7.782 5.018-8.294 2.355-14.746-14.336-35.328-5.939-7.27-18.534-22.938-28.058-34.816-9.523-11.776-27.648-34.406-40.346-50.176s-26.931-33.485-31.642-39.424c-4.71-5.939-10.035-12.083-11.878-13.619-8.499-7.68-20.685-8.602-30.413-2.253-2.048 1.331-13.926 14.336-26.522 28.877-12.493 14.541-24.269 28.058-26.010 30.003-15.872 18.022-18.022 21.709-18.022 30.413 0 14.029 10.24 24.883 23.859 25.498 12.595 0.512 14.95-1.331 39.629-30.208 15.36-18.022 17.92-20.070 23.552-18.534 2.253 0.614 7.066 5.12 18.432 17.408 1.434 1.536 6.042 6.451 10.24 10.854 13.005 13.824 25.498 26.931 41.984 44.442 40.141 42.598 39.834 42.189 43.418 44.544 5.53 3.584 13.312 3.686 18.33 0.102zM468.173 625.971c8.499-2.56 16.896-13.107 17.408-22.016 0.512-8.294-1.126-13.312-5.837-18.534-8.499-9.421 2.662-8.704-132.915-9.114-134.349-0.512-125.747-0.922-134.451 7.066-5.837 5.427-7.987 11.162-7.373 19.763 0.922 10.957 7.578 19.456 17.613 22.63 5.837 1.843 239.411 2.048 245.555 0.205zM392.294 523.264c21.094-7.475 23.245-36.454 3.379-46.592l-5.018-2.56h-166.912l-4.403 2.355c-21.299 11.162-18.944 40.448 3.891 47.411 1.434 0.41 39.014 0.819 83.558 0.819 70.042 0.102 81.613-0.102 85.504-1.434zM716.493 361.165c11.878-6.144 16.794-21.914 10.547-33.894-1.024-2.048-8.397-10.24-16.282-18.125-7.987-7.987-14.438-14.95-14.438-15.36 0-0.512 6.451-7.373 14.438-15.258 16.998-16.794 18.842-19.661 18.739-29.696 0-8.499-2.355-13.722-8.192-18.944-5.222-4.506-9.933-6.349-16.794-6.349-9.421-0.102-13.21 2.253-30.003 19.046l-15.155 15.053-15.053-15.053c-10.035-10.138-16.486-15.77-19.456-17.101-5.53-2.355-14.643-2.56-19.763-0.41-5.734 2.355-11.674 8.397-14.234 14.234-2.765 6.451-2.458 14.541 0.819 20.89 1.126 2.15 8.090 10.035 15.565 17.306 7.373 7.373 13.824 14.131 14.438 15.053 0.717 1.434-1.741 4.403-13.824 16.589-8.090 8.192-15.565 16.589-16.589 18.739-2.765 5.53-2.56 16.794 0.307 22.323 4.608 8.602 13.107 13.824 22.733 13.824s13.107-2.253 29.901-19.046l15.053-15.053 14.131 14.131c7.782 7.68 15.77 15.155 17.818 16.486 7.066 4.71 16.998 4.915 25.293 0.614zM468.070 318.771c4.71-1.331 11.162-6.656 14.234-11.571 3.174-5.12 4.198-13.107 2.458-19.763-1.843-6.861-5.53-11.776-11.571-15.36l-4.71-2.765h-245.76l-4.096 2.253c-8.909 4.71-13.926 12.902-13.926 22.221 0 11.469 7.782 21.914 18.637 25.088 5.325 1.434 239.718 1.434 244.736-0.102z" />
+<glyph unicode="&#xeacd;" glyph-name="portfolio" d="M103.424 476.57c0-339.046-0.717-308.736 7.27-325.222 7.168-14.95 19.661-25.805 36.454-31.744l7.987-2.867 765.44-0.512-0.205 255.693-0.307 255.795-2.97 7.68c-6.349 16.486-17.408 29.184-31.437 36.045-15.258 7.475 0.819 6.963-221.389 6.963-156.57 0-200.397 0.307-202.445 1.331-1.434 0.717-19.046 23.142-39.936 51.098l-37.376 49.869-281.088 0.102v-304.23zM523.264 601.702c33.485-8.602 58.982-35.942 64.819-69.427 7.782-45.158-19.763-87.859-64.307-99.738-9.933-2.662-30.618-3.174-39.424-1.024-31.642 7.68-54.682 28.365-64.717 58.163-13.107 39.117 3.686 82.842 39.731 103.322 19.149 10.752 43.008 14.029 63.898 8.704zM432.128 430.592c17.92-14.848 43.213-24.474 65.331-24.781 28.57-0.512 50.483 6.349 71.373 22.016 3.789 2.97 7.782 5.939 8.704 6.656 1.536 1.126 2.867 0.614 9.318-3.789 20.787-13.926 35.226-32.87 42.906-56.32 5.53-16.998 5.427-15.462 5.632-101.683l0.205-80.691h-111.206c-94.515 0-112.128 0.307-117.658 1.536-16.589 3.891-29.184 15.258-35.123 31.846-2.15 5.939-2.253 7.475-2.458 64.41-0.102 52.224 0.102 59.494 1.741 68.813 4.608 25.907 17.203 48.128 36.557 64.205 6.656 5.53 17.101 12.902 18.227 12.902 0.205 0 3.174-2.253 6.451-5.12z" />
+<glyph unicode="&#xeace;" glyph-name="POS_payment" d="M361.779 881.459c-6.042-2.15-12.902-9.011-14.95-15.155-1.536-4.403-1.741-11.264-1.741-58.061v-53.043h25.6v46.387c0 34.918 0.307 46.899 1.331 48.845 0.717 1.331 2.867 3.584 4.71 4.813 3.379 2.253 4.301 2.355 24.269 2.355h20.89v-102.4h51.2v102.4h84.48c93.389 0 88.576 0.307 92.672-6.451 1.946-3.072 2.048-5.427 2.048-49.562v-46.387h25.702l-0.307 55.091-0.307 54.989-2.867 4.813c-1.536 2.662-4.301 6.042-6.144 7.373-7.885 6.042 0.819 5.734-157.286 5.632-126.157 0-145.613-0.307-149.299-1.638zM568.115 831.078c-4.608-1.536-9.626-5.018-12.493-8.806-5.325-6.963-5.734-9.728-5.734-39.526v-27.546h51.2v27.955c-0.102 20.582-0.41 28.877-1.434 31.744-3.482 9.626-12.186 16.077-22.528 16.691-3.482 0.205-7.475 0-9.011-0.512zM307.507 728.166c-18.432-4.506-34.304-20.787-38.093-39.322-0.819-3.686-1.126-42.086-1.126-123.085v-117.76l51.2-51.2v-168.243c0-116.429 0.307-170.189 1.126-174.387 3.482-19.251 20.275-36.25 39.629-40.243 3.891-0.819 48.64-1.126 152.064-1.126 123.494 0 147.456 0.307 152.166 1.536 18.944 5.018 33.997 20.582 37.888 39.219 0.819 3.789 1.126 54.989 1.126 174.285v168.858l51.2 51.2v118.579c0 99.123-0.307 119.501-1.536 124.109-5.018 19.251-21.094 34.509-39.834 37.888-9.421 1.741-398.643 1.434-405.811-0.307zM677.888 563.2v-89.6h-332.8v179.2h332.8v-89.6zM441.446 368.845c5.53-3.686 6.042-5.632 6.042-23.245s-0.512-19.558-6.042-23.245c-3.379-2.355-3.994-2.355-32.256-2.355-26.726 0-28.979 0.102-32.051 2.048-5.734 3.379-6.451 6.246-6.451 23.757 0 17.306 0.512 19.354 6.042 23.040 3.379 2.355 3.994 2.355 32.358 2.355s28.979 0 32.358-2.355zM542.822 369.664c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-32.051-2.048-28.262 0-28.877 0-32.256 2.355-5.53 3.686-6.042 5.734-6.042 23.040 0 17.51 0.717 20.378 6.451 23.757 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM645.222 369.664c6.144-3.174 7.066-6.349 7.066-24.064 0-17.613-0.512-19.558-6.042-23.245-3.379-2.355-3.994-2.355-32.358-2.355s-28.979 0-32.358 2.355c-5.53 3.686-6.042 5.632-6.042 23.245s0.512 19.558 6.042 23.245c3.379 2.355 3.994 2.355 32.051 2.355 23.757 0 29.082-0.307 31.642-1.536zM440.422 292.864c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM542.72 293.069c1.331-0.717 3.584-2.867 4.813-4.71 2.15-3.277 2.355-4.506 2.355-19.251 0-17.613-0.717-20.48-6.451-23.859-3.072-1.946-5.325-2.048-32.051-2.048-28.262 0-28.877 0-32.256 2.355-5.53 3.686-6.042 5.734-6.042 23.040 0 17.51 0.717 20.378 6.451 23.757 3.072 1.946 5.325 2.048 31.949 2.048 20.89 0 29.389-0.41 31.232-1.331zM645.222 292.864c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM441.446 215.245c5.53-3.686 6.042-5.734 6.042-23.040 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 32.051 2.048 28.262 0 28.877 0 32.256-2.355zM542.822 216.064c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-32.051-2.048-28.262 0-28.877 0-32.256 2.355-5.53 3.686-6.042 5.734-6.042 23.040 0 17.51 0.717 20.378 6.451 23.757 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM647.168 215.040c4.506-4.096 5.12-6.758 5.12-23.040 0-17.306-0.819-20.173-6.451-23.552-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.070 6.451 23.654c3.072 1.843 4.915 1.946 33.075 1.741 28.262-0.307 30.003-0.41 32.154-2.355zM440.422 139.264c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM542.822 139.264c6.144-3.277 7.066-6.349 7.066-24.371 0-14.848-0.205-16.486-2.15-19.251-4.096-5.837-5.325-6.042-36.454-6.042-26.419 0-28.672 0.102-31.744 2.048-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM646.246 138.445c5.53-3.686 6.042-5.734 6.042-23.040 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 32.051 2.048 28.262 0 28.877 0 32.256-2.355z" />
+<glyph unicode="&#xeacf;" glyph-name="power" d="M500.224 856.474c-13.414-2.765-28.877-14.541-34.611-26.522-6.144-12.902-5.837-0.717-5.837-202.445 0-130.765 0.307-186.061 1.126-189.952 4.71-22.733 24.269-39.219 47.514-40.243 22.835-1.024 41.165 10.854 50.586 32.563l2.662 6.349 0.307 186.88c0.205 136.090 0 188.518-0.819 193.024-3.277 17.408-16.384 32.563-33.485 38.605-6.861 2.458-19.866 3.277-27.443 1.741zM309.248 742.195c-14.029-2.56-30.618-14.234-54.886-38.707-52.019-52.326-86.426-120.627-98.202-195.072-0.307-1.946-0.717-4.301-1.024-5.12-0.205-0.819-0.717-4.71-1.024-8.704-0.41-3.891-0.922-8.499-1.126-10.24-1.024-6.144-1.229-52.531-0.307-63.488 8.909-110.49 69.325-211.251 163.226-272.077 49.152-31.846 106.598-51.302 164.864-55.91 11.981-0.922 47.718-0.922 58.88 0 107.11 9.318 201.933 63.898 264.499 152.371 18.022 25.498 36.966 63.488 46.49 93.184 5.837 18.227 12.39 46.387 14.234 61.44 0.307 3.072 0.819 6.554 1.024 7.68 2.867 15.462 2.662 63.795-0.512 89.088-3.789 29.594-13.619 66.56-23.757 89.293-1.126 2.355-1.946 4.506-1.946 4.813 0 1.331-11.981 25.293-17.613 35.226-9.933 17.51-26.829 41.574-38.195 54.374-17.203 19.558-34.202 35.942-50.688 48.845-23.757 18.637-52.224 18.022-71.782-1.536-10.752-10.854-15.36-22.528-14.848-37.888 0.512-16.282 5.734-25.907 22.426-41.165 26.726-24.678 40.55-40.038 54.17-60.416 15.872-23.757 25.395-44.544 34.611-75.162 2.048-6.861 6.042-29.389 7.066-39.424 0.922-10.035 0.819-46.080-0.205-50.688-0.205-1.126-0.819-4.813-1.229-8.192-3.891-33.792-18.739-73.216-39.117-104.448-20.685-31.642-50.074-60.109-81.92-79.258-32.051-19.149-61.952-29.491-103.219-35.328-7.782-1.126-43.008-1.536-52.736-0.512-60.416 5.837-115.2 31.744-157.798 74.547-41.165 41.37-65.638 92.16-73.011 151.654-2.15 16.998-1.434 50.79 1.434 67.584 9.421 57.037 35.328 107.008 75.571 145.92 6.451 6.246 15.565 14.95 20.275 19.558 9.216 8.909 13.312 15.974 15.667 26.829 2.458 11.674 0.205 25.805-5.632 35.942-6.656 11.264-19.046 20.685-31.744 24.064-5.018 1.331-17.101 1.843-21.914 0.922z" />
+<glyph unicode="&#xead0;" glyph-name="powerpoint_file" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM400.998 498.176c30.618-5.018 52.634-16.077 73.626-37.274 15.053-15.155 24.678-30.822 31.13-50.586 4.608-13.926 6.144-25.805 5.734-43.213-0.922-33.792-12.902-61.645-37.274-86.118-18.637-18.534-38.605-29.491-65.024-35.43-10.24-2.355-40.243-2.253-50.586 0-26.214 5.939-45.978 16.794-64.819 35.533-18.637 18.534-29.594 38.605-35.328 65.024-2.56 11.571-2.56 37.786-0.102 49.562 5.427 25.395 16.179 45.875 33.485 64 19.968 20.787 46.285 34.304 74.65 38.4 7.373 1.024 28.058 1.126 34.509 0.102zM776.294 497.664c6.144-2.15 10.65-5.939 13.926-11.571 2.458-4.096 2.867-5.939 2.867-12.493s-0.512-8.499-2.765-12.39c-3.174-5.427-8.294-9.626-14.234-11.674-5.939-2.15-164.147-2.253-170.086-0.102-17.51 6.246-22.63 28.57-9.626 41.882 7.782 8.090 3.277 7.68 94.515 7.782 69.427 0 81.715-0.205 85.402-1.434zM780.493 393.421c14.746-8.602 17.408-28.262 5.427-40.141-7.885-7.987-4.506-7.68-95.232-7.68-90.214 0-86.221-0.307-94.208 7.68-4.608 4.608-7.68 11.776-7.68 18.022 0 10.547 7.987 21.402 18.227 24.474 1.536 0.512 40.141 0.819 85.709 0.717l82.944-0.205 4.813-2.867zM776.294 292.864c17.715-6.042 22.938-28.774 9.626-41.984-7.987-7.987-3.994-7.68-94.208-7.68-90.112 0-87.347-0.205-94.822 7.27-5.939 5.939-8.397 12.288-7.782 19.558 0.922 10.854 7.373 19.558 16.896 22.938 2.97 1.024 20.582 1.331 84.787 1.434 70.042 0 81.51-0.205 85.504-1.536zM369.664 472.678c-21.606-3.174-42.803-13.926-58.266-29.594-25.498-25.907-35.43-62.464-26.419-97.485 9.933-38.502 41.984-68.198 81.51-75.264 11.162-2.048 31.13-1.331 41.677 1.331 35.021 9.216 61.133 33.28 72.909 67.277 2.97 8.294 5.325 22.733 5.325 31.846 0 7.987-1.741 21.811-2.97 23.859-0.614 0.922-13.517-1.946-48.333-10.65-26.112-6.554-48.333-12.083-49.357-12.39s11.981 17.818 28.877 40.346l30.72 40.96-3.584 2.765c-8.602 6.554-24.678 13.21-39.834 16.384-5.018 1.126-26.112 1.434-32.256 0.614zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xead1;" glyph-name="presentation" d="M93.286 855.859c-5.939-2.048-12.8-9.216-14.848-15.36-2.15-6.144-2.253-36.659-0.205-42.496 3.072-8.499 11.366-15.36 20.48-16.896l3.686-0.614v-270.541c0-303.514-0.717-276.275 7.68-284.672 8.397-8.499-32.973-7.68 401.306-7.68 227.021 0 388.813 0.41 391.168 1.024 5.632 1.229 11.878 6.042 15.462 11.776l3.072 4.915 0.307 272.589 0.205 272.589 3.686 0.614c9.114 1.536 17.408 8.397 20.48 16.896 1.946 5.53 1.946 36.454-0.102 42.086-2.048 6.042-6.246 11.059-11.674 14.234l-4.71 2.765-415.744 0.205c-374.886 0.102-416.154 0-420.25-1.434zM870.4 524.8v-256h-716.8v512h716.8v-256zM317.44 677.683c-12.902-1.536-34.816-8.602-45.67-14.643-33.485-18.739-57.139-50.995-64.614-87.962-2.458-11.981-2.56-34.406-0.41-46.694 4.71-25.805 15.77-47.514 33.894-66.458 19.661-20.582 43.827-33.178 73.216-38.093 10.138-1.638 32.87-1.229 43.622 0.922 24.166 4.813 45.568 16.077 63.795 33.587 19.251 18.33 31.437 40.448 37.171 67.482 1.331 6.451 1.741 13.005 1.741 25.6-0.102 14.746-0.41 18.33-2.765 27.955-6.349 25.6-17.92 45.67-36.454 63.386-17.818 16.998-38.093 27.648-63.078 33.28-6.963 1.536-32.768 2.56-40.448 1.638zM353.28 650.65c24.883-5.325 46.182-18.842 61.030-38.4 5.222-6.963 12.493-20.070 14.131-25.498 0.512-1.843-2.662-3.174-36.557-15.258-43.11-15.462-54.784-19.558-57.242-20.582-1.741-0.717-1.843 2.15-1.843 50.688v51.507l7.987-0.717c4.301-0.41 9.933-1.229 12.493-1.741zM512 627.2v-25.6h256v51.2h-256v-25.6zM512 550.4v-25.6h307.2v51.2h-307.2v-25.6zM512 473.6v-25.6h256v51.2h-256v-25.6zM486.4 128v-64h-39.731c-43.008 0-46.080-0.307-52.838-5.53-1.946-1.434-4.71-4.813-6.349-7.475-2.867-4.813-2.97-5.427-3.277-21.504l-0.41-16.691h256.205v14.643c0 17.818-1.331 22.63-7.885 28.979-7.578 7.475-8.602 7.578-54.272 7.578h-40.243v128h-51.2v-64z" />
+<glyph unicode="&#xead2;" glyph-name="previous" d="M481.894 878.592c-2.15-2.253-18.125-18.637-35.43-36.352s-33.894-34.816-36.864-37.888c-2.97-3.072-19.046-19.558-35.738-36.659s-35.123-35.942-40.858-41.984c-5.837-6.042-23.962-24.678-40.346-41.37-16.282-16.691-32.461-33.28-35.84-36.864-3.482-3.584-20.582-21.094-38.093-39.117-17.51-17.92-34.816-35.738-38.502-39.526s-16.486-16.896-28.57-29.286c-26.726-27.341-32.768-34.816-39.117-48.026-7.373-15.565-9.523-25.498-9.523-43.52 0-16.998 2.15-27.75 8.192-40.96 7.475-16.077 10.957-20.48 40.858-50.995 11.981-12.186 24.576-25.19 28.16-28.877 3.482-3.686 20.48-21.197 37.888-38.912 17.306-17.715 34.099-35.021 37.376-38.4 3.174-3.379 14.643-15.155 25.498-26.214 45.773-46.797 85.709-87.859 90.726-93.082 2.97-3.072 19.968-20.582 37.888-38.912s35.43-36.25 38.912-39.936c12.595-13.107 37.171-37.888 37.478-37.888 0.205 0 0.41 51.61 0.41 114.688v114.688h182.579c125.44 0 184.525 0.307 188.723 1.126 15.667 2.765 29.082 9.728 40.755 21.197 7.066 6.861 10.547 11.776 15.36 21.299 7.782 15.667 7.27 3.789 7.27 160.666 0 151.245 0.307 143.77-5.325 157.594-7.27 17.92-23.962 34.611-41.37 41.677-14.746 5.939 0.717 5.427-201.83 5.734l-186.163 0.307-0.205 114.995-0.307 114.893-3.994-4.096z" />
+<glyph unicode="&#xead3;" glyph-name="printer" d="M230.4 627.2v-153.6l-53.965-0.102c-29.798 0-55.296-0.307-56.832-0.512-19.456-3.277-36.045-18.739-41.37-38.605-1.126-4.403-1.434-29.184-1.434-139.162 0-94.31 0.307-135.373 1.126-139.264 3.891-18.637 18.944-34.202 37.888-39.219 8.294-2.253 784.077-2.253 792.371 0 16.896 4.506 29.901 16.282 36.147 32.87l2.355 6.042 0.307 136.499c0.205 122.47 0.102 137.114-1.434 142.848-4.608 18.227-18.637 32.154-37.274 37.069-4.608 1.229-15.565 1.536-60.109 1.536h-54.579v102.4l-204.8 204.8h-358.4v-153.6zM563.2 662.733c0-61.85 0.102-67.482 1.946-74.138 4.813-18.637 20.89-33.69 39.424-37.069 3.994-0.717 29.082-1.126 71.987-1.126h65.843v-204.8h-460.8v384h281.6v-66.867zM520.704 215.859c14.336-4.813 21.197-23.347 13.517-36.454-3.072-5.222-5.018-6.963-10.854-10.035-19.968-10.342-42.906 9.523-35.43 30.72 4.813 13.926 18.739 20.582 32.768 15.77z" />
+<glyph unicode="&#xead4;" glyph-name="profileringtone" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM546.816 541.798v-96.973l-5.837 0.819c-3.277 0.41-9.626 0.819-14.131 0.819-26.624-0.205-49.869-23.142-51.098-50.278-0.41-10.138 1.126-17.51 5.53-26.522 6.554-13.21 17.101-22.733 30.515-27.341 8.704-2.97 24.269-3.174 33.075-0.512 6.349 2.048 16.282 7.578 20.787 11.776 3.584 3.379 11.162 14.848 12.902 19.661 3.994 11.059 3.994 12.698 4.096 116.122 0 55.194 0.205 100.454 0.41 100.659 0.102 0.205 3.891-0.102 8.397-0.717 28.979-3.789 42.701-13.517 61.44-43.725 1.843-3.072 5.837-3.891 10.547-2.458l3.891 1.126-1.229 7.373c-0.717 4.096-1.638 9.626-1.946 12.186-0.922 7.066-4.301 19.558-7.168 26.522-3.891 9.83-8.806 17.306-15.974 24.576-11.571 11.571-25.805 18.125-44.646 20.48-5.018 0.614-10.24 1.331-11.571 1.536-1.331 0.307-10.445 0.717-20.275 1.126l-17.715 0.717v-96.973zM391.168 481.894c-16.179-16.179-28.365-41.062-33.28-67.789-1.946-10.547-2.15-17.101-1.126-28.57 1.946-21.402 6.554-38.093 14.643-53.248 8.192-15.462 21.914-31.949 27.546-33.382 3.072-0.819 7.27 1.126 8.090 3.789 0.819 2.56-2.662 9.83-7.168 14.746-2.048 2.253-5.734 7.066-8.090 10.752-13.722 20.48-20.275 43.11-19.558 67.584 0.717 28.365 10.138 52.634 28.16 73.318 5.837 6.656 8.090 12.186 6.246 15.667-0.717 1.126-1.946 2.253-2.97 2.253-0.922 0.102-2.867 0.307-4.301 0.41-1.843 0.205-3.994-1.229-8.192-5.53zM420.966 466.33c-2.765-1.126-11.878-10.65-17.51-18.534-11.571-16.282-15.462-30.618-14.848-54.579 0.614-24.064 6.246-40.96 20.275-59.904 6.861-9.318 11.059-13.312 14.029-13.312 6.042 0 9.523 6.144 6.349 11.162-0.922 1.434-4.096 5.632-6.963 9.318-6.861 8.602-13.21 21.299-15.974 31.949-3.072 11.776-2.97 30.72 0.102 42.291 3.072 11.366 9.114 23.142 16.998 32.768 3.686 4.506 6.656 8.806 6.758 9.523 0.102 0.614 0.205 1.843 0.307 2.56 0.614 3.994-5.325 8.294-9.523 6.758zM442.368 443.392c-1.434-0.717-4.301-3.482-6.349-5.939-15.258-18.33-19.661-42.291-12.186-66.253 3.277-10.65 13.312-25.293 19.354-28.57 4.915-2.56 11.469 2.867 10.138 8.294-0.41 1.331-2.56 4.915-4.813 7.987-11.571 15.36-15.155 31.232-10.854 48.026 1.946 7.68 5.325 14.131 11.366 22.118 5.12 6.758 5.632 9.216 2.458 13.21-2.355 2.97-5.222 3.277-9.114 1.126z" />
+<glyph unicode="&#xead5;" glyph-name="public_transport" d="M42.701 625.562c-5.325-1.638-11.571-7.168-14.746-12.902-1.741-3.174-1.843-12.698-2.15-199.168l-0.205-195.686 5.837-0.614c3.277-0.307 8.499-0.819 11.571-1.126s7.68-0.819 10.24-1.024c2.56-0.307 12.902-1.229 23.040-2.048 10.138-0.922 20.275-1.843 22.528-2.048s7.066-0.717 10.752-1.024c3.686-0.307 8.704-0.819 11.264-1.024s7.885-0.717 11.776-1.024c7.475-0.614 14.234-1.229 22.016-2.048 2.56-0.205 8.090-0.717 12.288-1.024s8.806-0.819 10.24-1.126c2.56-0.41 2.662-0.205 3.891 6.758 3.379 19.968 13.619 39.219 28.672 54.17s33.178 24.371 54.17 28.16c10.138 1.843 31.13 1.434 40.55-0.819 43.52-10.445 75.776-47.821 79.258-91.955l0.614-7.987h230.093v2.355c0.205 13.312 4.506 30.208 10.752 43.008 13.619 27.546 39.014 47.514 69.632 54.579 10.854 2.56 34.816 2.56 44.544 0 20.582-5.325 34.816-13.21 49.152-27.136 18.33-17.92 30.208-44.851 30.618-69.939l0.102-2.867h79.258c70.144 0 79.667 0.205 83.149 1.638 5.837 2.458 10.445 6.349 13.517 11.571l2.765 4.71v398.438l-2.662 5.018c-2.867 5.734-9.318 11.162-15.053 12.8-2.56 0.717-151.245 1.024-468.173 0.922-406.016 0-464.998-0.205-469.299-1.536zM275.558 573.645c1.843-1.229 3.994-3.482 4.71-4.813 1.024-1.946 1.331-18.022 1.331-69.632 0-64.717-0.102-67.174-2.048-70.349-4.096-6.861 1.536-6.451-100.352-6.451s-96.256-0.41-100.352 6.451c-1.946 3.174-2.048 5.632-2.048 70.144 0 73.83-0.205 70.963 6.451 74.957 3.174 1.946 5.837 2.048 96.051 2.048h92.774l3.482-2.355zM530.534 574.464c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.174 2.048-5.632 2.048-70.451v-67.174l-2.355-3.482c-1.229-1.843-3.482-3.994-4.813-4.71-2.048-1.024-23.142-1.331-95.027-1.331-102.093 0-96.461-0.41-100.557 6.451-1.946 3.174-2.048 5.632-2.048 70.144 0 70.963-0.102 69.837 4.71 74.035 1.126 1.024 2.867 1.946 3.994 2.253 1.126 0.205 43.418 0.512 94.003 0.614 81.203 0.102 92.365-0.102 95.027-1.434zM790.118 571.494l3.482-3.994v-67.686c0-65.331-0.102-67.789-2.048-70.963-4.096-6.861 1.536-6.451-100.352-6.451s-96.256-0.41-100.352 6.451c-1.946 3.174-2.048 5.632-2.048 70.144 0 73.83-0.205 70.861 6.451 74.957 3.174 2.048 5.427 2.048 97.382 1.843l94.003-0.307 3.482-3.994zM940.749 573.952c6.963-4.198 6.451 6.861 6.451-151.757 0-140.698 0-143.77-2.048-146.944-3.891-6.451-3.789-6.451-49.357-6.451-45.056 0-44.544 0-48.64 6.042l-2.355 3.482v143.77c0 158.822-0.512 147.661 6.451 151.859 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM264.704 266.854c-42.394-10.138-68.198-52.531-57.344-94.208 9.011-34.918 42.496-59.392 78.234-57.139 24.883 1.536 45.875 13.414 59.699 33.69 14.95 22.221 17.101 51.302 5.427 76.083-9.114 19.456-28.16 35.226-49.152 40.858-9.83 2.662-27.136 2.97-36.864 0.717zM703.693 267.674c-28.877-4.813-53.248-27.238-61.235-56.218-2.56-9.114-2.56-29.696-0.102-38.707 9.421-33.69 37.99-56.32 72.397-57.139 23.040-0.614 41.984 7.27 58.163 24.166 17.613 18.432 24.678 46.387 18.227 71.373-5.837 22.221-22.528 41.882-43.418 51.2-12.493 5.53-30.106 7.68-44.032 5.325z" />
+<glyph unicode="&#xead6;" glyph-name="publish" d="M97.587 770.56c-16.077-5.632-22.835-18.33-21.299-39.834 0.41-5.427 0.819-10.035 1.024-10.342s0.614-3.994 1.024-8.192c0.307-4.198 0.819-8.397 1.024-9.216s0.717-4.506 1.024-8.192c0.307-3.686 1.536-14.029 2.56-23.040 1.126-9.011 2.253-18.637 2.56-21.504 1.638-14.848 2.662-23.552 3.072-26.419 0.205-1.843 0.614-5.837 1.024-8.909 0.307-3.072 0.819-7.27 1.126-9.216 0.205-1.946 1.536-13.21 2.97-25.088 3.379-28.262 4.198-35.226 5.018-41.267 0.307-2.048 2.15-16.486 4.198-31.949 1.946-15.462 3.789-29.286 3.994-30.72 0.307-1.434 1.024-6.246 1.638-10.752 0.717-4.506 1.434-9.114 1.638-10.24s0.922-4.813 1.536-8.090c4.301-23.859 16.896-33.69 33.075-25.805 4.301 2.15 10.65 7.885 29.184 26.829 13.005 13.312 23.962 23.962 24.576 23.757 0.819-0.307 20.48-19.354 83.354-80.794l21.504-20.992-1.126-7.68c-0.614-4.301-0.922-16.998-0.819-29.594 0.307-22.733 1.638-32.768 6.861-52.224s15.462-41.882 27.648-60.416c30.106-45.978 78.746-79.053 133.018-90.624 4.198-0.922 9.523-1.843 11.776-2.15s7.373-0.922 11.264-1.434c7.475-0.922 41.062-0.614 48.128 0.512 16.077 2.458 32.051 6.451 46.49 11.571 9.933 3.482 32.256 14.746 42.086 21.197 41.779 27.443 73.114 69.018 87.45 116.224 3.072 10.342 6.349 25.702 7.168 34.304 0.41 3.379 0.922 8.192 1.229 10.752 0.717 5.018 0.614 26.931 0 32.768-0.205 1.946-0.717 6.349-1.126 9.728-0.307 3.379-0.819 6.963-1.126 7.885-0.614 1.946-3.174-0.717 44.237 45.466 49.357 48.23 54.989 53.658 55.706 53.658 0.41 0 10.957-10.547 23.45-23.552 18.33-18.842 23.859-23.962 28.262-26.112 8.499-3.994 16.486-2.97 21.709 2.662 6.349 6.963 7.782 13.005 15.565 61.85 1.126 7.373 3.482 21.811 5.12 32.256s4.506 28.365 6.246 39.936c1.741 11.571 3.379 22.118 3.584 23.552 1.126 6.554 5.018 33.792 8.704 60.416 4.096 28.774 4.608 32.666 5.632 41.267 0.307 2.355 0.819 5.427 1.024 6.861s0.614 4.608 0.922 7.168c0.307 2.56 1.331 11.469 2.253 19.866 2.253 20.89 1.229 29.798-4.506 38.298-6.144 9.318-16.282 13.722-30.618 13.517-4.915 0-10.138-0.205-11.571-0.41s-6.246-0.717-10.752-1.024c-4.506-0.41-9.523-0.922-11.264-1.126-1.638-0.205-6.758-0.717-11.264-1.024s-9.523-0.819-11.264-1.024c-1.638-0.205-6.758-0.717-11.264-1.024-4.506-0.41-9.83-0.819-11.776-1.024s-7.066-0.614-11.264-1.024c-4.198-0.307-8.806-0.819-10.24-1.024s-6.246-0.717-10.752-1.024c-4.506-0.307-12.8-1.024-18.432-1.536-16.691-1.638-21.914-2.15-38.912-3.686-3.379-0.307-7.782-0.717-9.728-0.922-5.427-0.614-12.595-1.331-25.6-2.56-6.451-0.614-13.619-1.331-15.872-1.536-2.253-0.307-10.752-1.229-18.944-2.15-8.192-0.819-15.974-1.638-17.408-1.946-1.434-0.205-5.325-0.614-8.704-1.024-6.349-0.614-14.643-1.843-26.112-3.789-7.475-1.229-17.818-5.53-21.197-8.909-6.246-6.042-7.27-14.848-2.867-23.757 2.662-5.12 5.427-8.192 36.147-39.731l13.619-13.926-21.914-21.504c-12.083-11.776-36.147-35.328-53.453-52.224l-31.437-30.72-22.733-0.102c-12.39-0.102-23.757-0.41-25.19-0.819-2.867-0.614-0.102-3.072-62.464 57.651-17.203 16.794-35.738 34.816-41.165 40.141l-9.933 9.626 22.835 23.040c25.088 25.293 28.467 30.003 28.467 39.117-0.102 6.042-2.355 10.035-7.885 14.029-6.144 4.403-12.186 5.734-45.568 10.342-16.589 2.253-32.256 4.403-34.816 4.71-5.632 0.819-7.168 1.024-14.336 1.946-3.072 0.307-10.24 1.331-15.872 2.048-5.632 0.819-12.493 1.741-15.36 2.048-4.301 0.512-15.667 1.946-23.552 3.072-6.451 0.819-43.52 5.222-55.808 6.656-5.325 0.614-10.854 1.229-12.288 1.536-1.434 0.205-5.12 0.614-8.192 0.922s-9.83 1.024-14.848 1.638c-16.077 1.741-29.491 3.072-36.352 3.686-3.686 0.307-7.782 0.819-9.216 1.024s-8.806 0.614-16.384 0.819c-11.469 0.307-14.746 0.102-19.149-1.434zM528.896 461.824c55.091-7.987 98.202-50.278 107.52-105.472 2.15-13.005 1.434-35.123-1.741-48.64-5.632-24.269-20.787-49.562-39.834-66.15-23.757-20.685-51.2-31.232-82.33-31.437-20.992-0.102-37.683 3.482-55.808 11.878-32.563 15.155-58.163 45.466-68.096 80.691-4.71 16.896-5.632 41.779-2.15 58.778 8.806 42.291 37.478 76.493 78.029 92.774 8.192 3.379 23.45 7.27 32.154 8.294 8.294 1.024 22.426 0.717 32.256-0.717z" />
+<glyph unicode="&#xead7;" glyph-name="Quirky_stories" d="M468.992 788.992c-38.298-3.994-60.416-8.294-97.28-19.149-77.722-22.733-163.533-69.325-229.888-124.826-14.234-11.878-15.565-13.21-13.517-14.438 0.922-0.41 3.277-2.355 5.325-4.198 21.094-19.354 73.318-56.218 101.888-72.192 2.56-1.331 7.578-4.198 11.264-6.349 11.776-6.758 46.182-23.654 60.928-30.003 32.461-13.722 64.922-24.474 95.846-31.539 9.216-2.048 16.998-3.994 17.203-4.096 0.41-0.41-1.331-4.198-14.234-31.642-7.885-16.589-28.672-60.826-32.256-68.608-1.843-3.891-5.325-11.264-7.68-16.384-2.355-5.018-5.837-12.39-7.68-16.384-1.843-3.891-5.53-11.776-8.192-17.408s-7.885-16.691-11.469-24.576c-3.686-7.885-9.626-20.48-13.21-28.058-3.584-7.475-6.554-13.824-6.554-13.926 0-0.205-3.891-8.499-8.704-18.432s-8.704-18.227-8.704-18.432c0-0.102-2.662-5.939-6.042-12.902-5.734-12.288-7.578-16.179-16.998-36.25-2.355-5.018-5.837-12.39-7.68-16.179-1.741-3.891-3.072-7.168-2.97-7.27 1.843-1.638 13.312-8.294 20.070-11.776 21.504-10.752 46.49-18.637 81.715-25.6 8.499-1.638 17.203-3.277 19.456-3.584 22.118-2.765 29.696-3.686 35.84-4.198 3.994-0.307 8.602-0.819 10.24-1.024 10.854-1.331 34.304-2.048 64.512-2.048 31.027 0 45.363 0.41 64 2.048 25.805 2.15 26.214 2.253 48.128 5.222 40.346 5.53 81.203 15.667 109.568 27.034 7.782 3.072 25.907 12.186 27.238 13.619 0.922 0.922-0.102 3.891-4.096 11.981-2.867 5.939-6.656 14.029-8.499 17.92-3.174 6.963-8.806 19.046-20.378 43.418-3.072 6.349-5.53 11.674-5.53 11.878 0 0.102-3.072 6.656-6.758 14.438-3.789 7.885-8.294 17.51-10.138 21.402-5.222 11.366-33.997 72.499-40.038 85.402-3.072 6.349-5.53 11.776-5.53 11.878 0 0.205-3.379 7.373-7.578 16.077-4.096 8.602-8.704 18.227-10.138 21.299-1.331 3.072-7.987 17.203-14.541 31.232-6.656 14.131-13.414 28.57-15.053 32.051-1.638 3.584-2.765 6.758-2.56 7.066 0.307 0.307 6.656 1.843 14.234 3.379 53.453 11.469 114.79 35.533 167.731 65.843 39.834 22.733 83.968 53.862 110.592 77.926l4.096 3.686-3.686 3.379c-26.214 22.938-61.85 48.845-94.618 68.506-73.318 44.134-147.354 71.68-221.389 82.227-32.256 4.608-75.571 5.632-106.291 2.56zM557.568 737.382c13.824-1.434 18.637-1.946 29.184-3.277 59.29-7.475 120.115-24.576 179.712-50.278 14.131-6.144 58.163-27.955 57.651-28.57-0.205-0.205-6.144 1.024-13.107 2.765-23.142 5.632-81.306 16.691-103.936 19.763-2.253 0.307-10.547 1.536-18.432 2.56-14.234 2.048-45.773 5.53-59.392 6.758-3.891 0.307-9.216 0.717-11.776 1.024-2.56 0.205-9.011 0.717-14.336 1.024-5.325 0.41-11.674 0.819-13.926 1.024-30.31 2.458-123.494 2.458-151.45 0-2.253-0.205-8.499-0.614-13.824-1.024-5.325-0.307-11.571-0.819-13.824-1.024s-7.27-0.717-11.264-1.024c-3.891-0.307-9.011-0.819-11.264-1.024s-6.861-0.717-10.24-1.024c-16.794-1.638-50.176-6.042-66.048-8.704-3.072-0.512-7.68-1.229-10.24-1.536-15.36-2.15-62.464-11.469-87.040-17.306-5.837-1.434-10.854-2.458-10.957-2.253-0.512 0.41 45.466 23.245 56.525 28.058 69.427 30.31 146.944 49.766 215.040 54.067 5.632 0.41 10.445 0.819 10.65 1.024 0.512 0.41 66.867-0.512 72.294-1.024zM543.539 583.168c46.49-4.301 80.794-17.715 85.197-33.178 1.024-3.584 1.024-5.325-0.102-8.499-1.741-5.325-10.24-13.414-18.944-17.92-8.806-4.71-25.907-10.547-27.136-9.318-0.512 0.512-4.506 8.704-8.909 18.227l-8.090 17.408-7.066 2.458c-12.595 4.301-25.293 6.246-43.93 6.758-23.245 0.512-37.376-1.229-54.682-6.861l-6.451-2.048-8.090-16.896c-4.403-9.318-8.090-17.306-8.090-17.818 0-1.536-2.56-1.126-10.445 1.741-23.347 8.397-36.25 20.275-34.202 31.437 0.819 4.608 6.042 10.547 13.21 15.155 24.678 15.974 84.275 24.371 137.728 19.354zM524.698 369.254c13.21-5.837 21.606-17.715 22.528-31.949 1.843-27.955-26.726-47.718-51.917-35.942-17.92 8.294-26.010 27.75-19.456 46.49 3.584 10.035 13.517 19.661 23.757 22.733 6.758 2.048 18.842 1.434 25.088-1.331zM438.579 337.306c1.229-0.614 10.752-9.523 21.197-19.763 15.667-15.462 20.173-19.354 26.317-22.528 14.95-7.68 24.064-9.421 35.635-6.758 10.65 2.355 16.282 6.554 38.195 28.16 11.469 11.264 21.606 20.787 22.528 21.197 3.379 1.331 8.909 0.819 12.288-1.229 5.427-3.379 7.987-11.878 5.018-17.101-0.717-1.229-12.698-13.824-26.624-27.853l-25.395-25.702v-56.627c0-51.507-0.102-56.934-1.741-60.109-2.867-5.632-7.168-7.168-19.866-7.168h-11.059v60.416h-6.144v-60.416h-12.595c-14.336 0-18.227 1.331-21.402 7.27-1.741 3.174-1.843 7.168-1.843 60.109v56.627l-25.293 25.6c-28.262 28.467-29.594 30.31-26.931 37.99 2.56 7.373 11.264 11.162 17.715 7.885z" />
+<glyph unicode="&#xead8;" glyph-name="Quiz" d="M281.6 806.4v-25.6h-153.702l0.41-87.757c0.205-48.333 0.717-89.907 1.126-92.467 3.584-22.426 10.138-43.725 19.149-62.464 25.702-53.35 73.216-92.57 132.096-109.056l5.734-1.638 1.843-8.294c6.349-29.389 23.859-64.717 44.749-90.624 7.987-9.728 23.654-25.498 33.075-33.178 24.474-19.866 56.525-36.352 85.811-44.134l8.909-2.355v-82.432h-16.077c-10.445 0-18.022-0.512-21.402-1.434-20.378-5.427-35.328-21.606-38.502-41.779l-1.126-7.68-7.782-1.229c-22.528-3.379-40.141-21.914-42.701-44.851l-0.614-5.427h358.912l-0.717 5.734c-2.458 21.094-17.613 38.4-38.605 43.93-3.072 0.819-7.066 1.536-8.806 1.536-3.072 0-3.379 0.307-3.379 3.379 0 4.813-2.56 13.414-5.837 20.070-5.837 11.878-21.197 23.859-33.69 26.317-2.15 0.512-4.301 0.922-4.71 1.024-0.512 0.102-7.987 0.205-16.691 0.307l-15.872 0.102v82.432l11.059 2.97c52.224 14.131 99.328 48.64 130.56 95.846 13.312 20.070 26.522 50.688 31.027 71.578l1.741 8.294 4.198 1.126c36.557 9.523 69.939 29.082 96.358 56.32 16.077 16.691 25.907 30.413 36.25 51.098 9.83 19.661 14.643 35.226 20.173 65.024 0.41 2.253 0.922 43.622 1.126 91.955l0.41 87.757h-153.702v51.2h-460.8v-25.6zM281.6 606.208c0-81.51-0.307-123.392-1.024-123.392-2.15 0-20.378 8.704-27.955 13.414-38.605 23.859-63.488 61.235-71.987 107.93-0.41 2.253-0.922 31.437-1.126 64.819l-0.41 60.621h102.502v-123.392zM844.595 668.467c-0.41-58.982-0.512-61.645-2.765-71.475-6.963-31.027-20.378-56.32-41.165-77.21-9.83-10.035-23.757-20.787-33.178-25.907-7.68-4.198-22.63-11.059-24.064-11.059-0.717 0-1.024 41.165-1.024 123.392v123.392h102.502l-0.307-61.133zM536.678 675.021c22.938-4.608 44.646-15.872 59.802-30.925 22.733-22.733 31.334-52.326 24.986-85.914-6.656-35.021-30.003-59.802-67.686-71.782-7.475-2.355-9.011-3.174-9.114-5.018-0.102-6.656-1.229-13.21-3.072-19.456-6.758-22.63-38.298-30.31-55.501-13.517-4.301 4.096-8.192 11.674-9.83 19.046-1.434 6.246-0.819 49.562 0.717 54.374 2.662 8.090 10.547 13.005 25.907 16.282 18.739 3.994 25.395 6.963 32.768 14.541 3.994 3.994 5.427 6.554 7.168 12.288 6.963 22.733-7.987 41.267-33.382 41.267-7.27 0-9.011-0.41-14.848-3.277-7.578-3.789-11.981-7.68-20.275-18.022-7.578-9.523-11.878-13.517-18.125-16.896-6.758-3.584-18.944-3.789-26.317-0.41-13.414 6.042-20.582 18.637-19.763 35.021 0.717 15.872 6.758 28.774 19.354 41.472 16.486 16.691 41.472 28.467 69.222 32.563 5.939 0.922 30.822-0.205 37.99-1.638zM520.909 420.25c9.933-3.174 19.149-11.469 23.757-21.402 2.253-4.813 2.662-6.963 2.662-15.36 0-8.499-0.41-10.547-2.97-16.077-3.584-7.885-11.571-15.667-19.763-19.558-5.018-2.253-7.373-2.765-15.155-2.765-13.926 0-24.064 5.12-31.539 16.077-13.312 19.456-7.885 43.827 12.39 55.808 8.499 5.018 21.197 6.451 30.618 3.277z" />
+<glyph unicode="&#xead9;" glyph-name="Radiography" d="M95.027 830.976c-4.506-1.331-9.626-4.915-12.493-8.704-6.144-8.090-5.734 20.992-5.734-374.17 0-329.011 0.102-362.701 1.638-367.002 2.15-6.451 8.909-13.21 15.258-15.36 4.608-1.638 35.942-1.741 418.304-1.741 380.621 0 413.696 0.102 418.304 1.638 5.222 1.843 11.571 7.373 14.541 12.902 1.741 3.277 1.843 18.842 2.15 367.411 0.205 335.258 0.102 364.339-1.434 369.050-2.15 6.451-8.909 13.107-15.462 15.36-4.301 1.536-42.189 1.638-418.509 1.536-227.635 0-415.027-0.41-416.563-0.922zM815.104 699.699c-44.646-44.646-84.070-84.89-87.757-89.395-19.251-23.859-32.256-52.736-37.786-83.968-1.946-10.854-2.458-17.51-2.867-35.84-0.307-11.264-0.922-17.408-2.56-23.245-3.686-13.926-12.186-28.672-22.118-38.093-4.506-4.301-11.878-10.035-12.39-9.523-0.205 0.102-1.024 3.789-1.946 8.090-5.427 26.624-16.998 47.923-36.352 67.379-16.384 16.486-33.178 26.931-54.784 33.792-18.432 5.939-23.962 11.264-29.286 28.365-11.264 35.84-36.147 65.126-69.12 81.613-9.011 4.403-25.702 10.035-33.69 11.366-8.192 1.229-8.090 1.126-4.403 6.349 4.301 5.939 13.824 14.746 20.582 19.046 15.258 9.728 27.341 13.005 49.664 13.517 18.637 0.307 24.371 0.922 39.014 3.789 27.443 5.325 55.501 18.33 78.438 36.454 3.994 3.174 17.51 15.974 30.208 28.57l23.040 22.835h235.315l-81.203-81.101zM420.762 598.528c28.979-8.397 49.562-29.286 58.47-59.392 4.403-15.155 11.776-27.136 23.347-38.195 10.035-9.421 20.070-15.053 35.533-19.763 30.925-9.421 52.634-32.563 59.392-63.386 2.253-10.445 1.638-29.389-1.331-39.424-8.499-28.57-29.491-49.459-57.651-57.651-6.861-2.048-14.029-2.662-34.202-3.174-8.397-0.307-19.456-1.229-24.576-2.048-31.846-5.734-61.133-18.739-85.504-38.195-3.072-2.458-41.165-39.936-84.582-83.251l-78.95-78.848h-102.707v132.608l67.686 67.584c37.171 37.171 70.963 71.475 75.059 76.288 28.877 33.69 44.134 74.65 44.544 119.501 0.205 21.504 2.355 31.642 9.421 45.363 11.162 21.606 32.666 38.195 55.808 43.008 12.288 2.458 29.696 2.048 40.243-1.024zM870.4 268.8v-25.6h-179.2v51.2h179.2v-25.6zM870.4 166.4v-25.6h-179.2v51.2h179.2v-25.6z" />
+<glyph unicode="&#xeada;" glyph-name="ratings_stars" d="M229.683 562.688c-0.614-1.434-2.765-8.090-4.915-14.848-2.048-6.758-5.53-17.818-7.782-24.576-6.451-20.275-15.258-48.64-15.258-49.152 0-0.307-22.221-0.614-49.357-0.717l-49.357-0.307 10.65-7.68c15.053-10.752 66.97-48.333 67.379-48.64 0.205-0.205-2.355-9.933-5.734-21.709-17.101-58.982-20.582-70.963-21.197-73.011-0.717-2.253 1.843-0.307 52.531 39.117 11.469 8.909 21.606 16.794 22.63 17.408 1.536 0.922 6.349-2.458 30.925-21.811 15.974-12.493 33.178-26.010 38.093-29.901 5.734-4.403 8.909-6.349 8.602-5.12-0.307 1.024-1.536 5.12-2.662 9.011-1.126 3.994-2.765 9.728-3.584 12.8s-2.253 8.294-3.072 11.571c-9.83 36.045-15.872 57.651-16.384 59.085-0.922 2.253-0.819 2.253 40.243 32.358l36.147 26.522-48.128 0.307-48.128 0.205-0.512 2.355c-0.205 1.229-6.554 19.968-14.029 41.677-7.373 21.709-14.029 41.267-14.746 43.52-1.331 3.994-1.331 4.096-2.355 1.536zM510.259 560.435c-0.614-2.458-6.042-19.866-12.083-38.707-5.939-18.842-11.878-37.376-13.005-41.165l-2.15-6.963-49.254-0.205-49.254-0.307 7.168-5.12c9.216-6.554 70.554-50.79 70.963-51.2 0.205-0.205-2.458-10.138-5.939-22.221-6.963-24.166-19.149-66.355-20.48-70.656-0.512-1.638-0.614-2.867-0.41-2.867 0.717 0 4.813 3.174 25.088 18.944 28.365 22.118 50.176 38.912 51.098 39.219 0.717 0.205 13.414-9.421 43.52-33.178 17.203-13.517 32.051-24.986 32.461-24.986 0.307 0-3.994 16.486-9.626 36.659-8.704 31.437-13.414 48.742-15.565 57.037-0.512 1.741 5.53 6.554 37.888 30.208l38.605 28.16-48.128 0.307-48.23 0.205-0.512 2.355c-0.922 4.301-29.491 87.245-30.31 88.064-0.41 0.41-1.229-1.229-1.843-3.584zM790.016 554.701c-1.638-5.427-4.71-15.258-6.758-21.709s-7.066-22.528-11.162-35.533l-7.475-23.859-49.152-0.205-49.152-0.307 38.195-27.648c21.094-15.155 38.707-27.955 39.219-28.262 0.512-0.41-0.922-7.066-3.379-15.36-2.253-8.090-4.813-16.998-5.632-19.866-0.819-2.765-5.12-17.715-9.523-32.973-4.506-15.36-7.885-27.955-7.475-27.955 0.307 0 17.203 13.005 37.478 28.774s37.376 28.979 38.093 29.286c1.024 0.41 13.107-8.704 48.947-37.069 16.691-13.107 26.931-20.992 27.443-20.992 0.307 0 0 2.15-0.819 4.915-0.819 2.662-2.15 7.373-2.97 10.445-3.994 15.053-8.806 32.563-9.728 35.328-0.512 1.741-2.458 8.602-4.198 15.36-1.843 6.758-4.403 16.179-5.734 20.89-1.434 4.71-2.355 8.704-2.253 8.806 0.205 0.102 17.51 12.8 38.605 28.262l38.298 28.058-48.128 0.307-48.23 0.205-0.512 2.355c-0.205 1.229-6.554 19.968-14.029 41.677-7.373 21.709-14.029 41.165-14.541 43.315-0.614 2.048-1.331 3.789-1.741 3.789-0.307 0-1.946-4.506-3.686-10.035z" />
+<glyph unicode="&#xeadb;" glyph-name="Real_time" d="M450.867 906.752c-6.042-2.662-11.981-9.011-14.029-14.848-1.331-4.096-1.638-9.626-1.638-32.461v-27.443h25.6v-28.57l-3.789-0.614c-64.819-9.83-118.784-30.106-169.779-63.693-26.010-17.203-42.189-30.515-66.15-54.477-49.664-49.869-84.582-109.67-103.731-178.074-4.71-16.589-10.342-44.237-11.469-56.422-0.307-3.174-0.717-6.349-0.922-7.066-1.024-3.174-2.048-26.112-2.048-46.285 0-27.238 1.331-46.285 4.608-64.512 0.512-3.072 1.229-7.475 1.638-9.728 0.717-5.222 4.915-23.45 7.68-33.28 1.126-4.198 2.458-9.318 2.97-11.264 3.277-12.8 14.643-41.472 24.166-61.030 28.16-57.856 71.27-109.67 124.109-149.197 41.677-31.13 91.75-55.091 142.029-67.789 18.944-4.813 34.509-7.578 57.344-10.445 18.125-2.15 66.867-2.458 84.992-0.512 13.107 1.434 38.605 5.53 47.104 7.578 69.222 16.179 123.29 42.906 176.64 87.245 12.902 10.752 40.448 38.4 51.302 51.814 43.725 53.35 73.011 114.586 85.811 179.2 4.096 20.582 5.12 28.365 7.168 52.224 0.922 10.547 0.614 59.085-0.41 66.56-0.307 2.56-1.229 10.24-2.15 17.203-2.662 22.323-9.421 51.917-17.306 75.469-16.077 48.026-38.195 87.757-73.421 132.301-0.717 0.819 4.915 7.066 18.842 21.094 11.059 10.957 20.787 21.606 21.914 23.859 2.765 5.632 2.662 16.896-0.307 22.426-3.379 6.349-47.309 49.664-53.248 52.531-5.837 2.765-14.95 2.662-21.299-0.41-2.355-1.126-12.698-10.65-25.293-23.142-11.674-11.674-21.606-21.299-21.914-21.299-0.41 0-5.632 3.174-11.571 7.066-43.52 28.262-92.262 47.923-144.998 58.368-5.632 1.024-12.493 2.253-15.36 2.662-2.765 0.307-6.349 0.922-7.885 1.126l-2.867 0.614v28.467h25.702l-0.307 29.491-0.307 29.594-3.072 5.018c-3.584 5.734-9.728 10.342-15.462 11.674-2.15 0.512-28.877 0.922-59.29 0.922-51.61 0-55.603-0.205-59.597-1.946zM544.768 728.166c1.946-0.307 6.144-0.819 9.216-1.126 3.072-0.41 5.837-0.819 6.144-1.024 0.307-0.102 2.97-0.512 5.939-0.922 12.288-1.434 36.659-7.68 54.784-13.926 123.187-42.394 210.739-154.317 222.618-284.16 1.536-17.101 0.922-58.368-1.126-71.168-0.205-1.434-0.717-4.813-1.126-7.68-7.68-57.139-34.918-118.067-73.626-164.352-54.272-64.922-128.205-105.472-214.118-117.248-14.438-2.048-54.682-2.867-69.12-1.536-104.448 9.933-193.946 63.488-251.085 150.016-29.286 44.544-46.797 94.925-52.736 152.064-1.024 9.728-1.024 46.797 0 58.88 11.674 140.493 114.278 260.198 251.802 293.786 19.354 4.71 28.467 6.246 52.531 8.806 7.578 0.819 53.76 0.41 59.904-0.41zM488.96 703.181c-16.179-0.922-42.189-5.632-61.235-11.059-109.978-31.437-193.843-121.754-216.576-233.472-2.253-10.752-2.458-11.981-4.403-26.522-2.048-14.643-1.536-71.475 0.614-75.264 0.102-0.307 0.512-2.765 0.922-5.632 1.331-10.65 5.837-31.232 9.83-43.93 29.798-96.768 104.448-172.339 200.704-203.264 30.208-9.728 56.32-13.722 90.112-13.824 33.382-0.102 48.128 1.434 75.571 8.192 52.224 12.8 97.587 37.274 137.83 74.342l7.066 6.554-217.395 217.498v307.302l-8.909-0.307c-5.018-0.205-11.264-0.41-14.131-0.614z" />
+<glyph unicode="&#xeadc;" glyph-name="recommend" d="M315.29 858.214c-0.205-0.205-3.891-0.614-8.090-1.024-45.978-3.891-93.594-23.040-133.12-53.658-11.264-8.704-33.485-31.027-42.394-42.394-24.883-32.154-42.189-69.632-49.664-107.827-1.638-8.397-3.277-17.613-3.584-20.48-1.229-9.216-1.536-44.851-0.512-54.784 3.379-32.768 12.39-63.59 27.136-92.058 12.288-23.654 22.118-37.581 43.725-61.44 6.349-6.963 12.288-13.619 13.312-14.848s4.096-4.506 6.656-7.27c2.662-2.867 8.909-9.728 14.029-15.36 5.018-5.632 11.059-12.288 13.414-14.848 2.253-2.56 6.861-7.578 10.24-11.264 3.277-3.686 10.24-11.264 15.36-16.896s14.541-15.974 20.89-23.040c6.349-7.066 13.517-14.848 15.77-17.408 2.355-2.56 10.65-11.776 18.534-20.48s16.384-18.125 19.046-20.992c9.114-9.933 18.022-19.661 31.642-34.816 7.578-8.397 21.197-23.347 30.106-33.28 9.011-9.83 20.070-22.016 24.576-27.034 4.608-5.018 8.806-9.626 9.318-10.24 0.614-0.614 12.083-13.312 25.6-28.262s24.986-27.648 25.6-28.262c0.512-0.614 4.71-5.222 9.318-10.24 8.909-9.933 35.226-38.81 50.176-55.296 5.222-5.734 9.83-10.138 10.24-9.728 0.512 0.307 4.813 5.018 9.626 10.342s9.216 10.24 9.728 10.854c0.614 0.614 5.222 5.632 10.342 11.264 8.090 8.909 19.558 21.504 49.562 54.682 11.878 13.107 39.014 43.008 51.098 56.32 16.077 17.715 19.354 21.299 28.058 30.925 4.301 4.813 8.909 9.83 10.24 11.264 1.229 1.331 5.939 6.656 10.547 11.674 17.408 19.251 41.882 46.182 46.899 51.712 2.867 3.072 8.704 9.523 12.902 14.234s8.192 9.011 8.704 9.626c0.614 0.614 3.789 4.096 7.168 7.782 3.277 3.686 9.728 10.854 14.336 15.872 4.608 5.12 15.667 17.306 24.576 27.136s20.070 22.118 24.781 27.238c4.71 5.12 9.318 10.24 10.342 11.366 1.946 2.355 11.366 12.698 31.846 35.123 23.245 25.395 36.557 44.544 48.845 70.144 12.288 25.395 20.89 56.013 23.654 83.456 1.434 14.131 0.819 49.766-1.126 62.464-6.861 45.67-25.395 88.576-53.453 123.904-9.523 11.981-30.618 32.87-42.394 41.882-39.424 30.413-85.299 48.742-132.608 53.146-10.752 0.922-40.858 0.922-50.893-0.102-52.531-5.222-101.478-26.522-142.438-61.85l-11.059-9.626-9.83 8.704c-39.834 35.123-88.576 56.525-142.131 62.566-10.342 1.126-43.725 1.946-44.646 1.126zM354.304 754.688c25.6-3.891 48.947-13.414 69.325-28.365 9.523-7.066 7.066-4.813 57.754-53.146 10.342-9.933 21.299-20.378 24.371-23.347 3.072-2.867 5.939-5.222 6.349-5.222s2.765 1.946 5.325 4.403c2.458 2.355 13.619 13.107 24.781 23.757 23.245 22.118 39.936 38.195 42.394 40.55 20.070 19.763 50.278 35.123 79.462 40.448 11.059 2.048 34.304 2.56 47.104 1.126 15.155-1.638 36.147-8.192 50.381-15.77 51.814-27.443 83.149-78.746 83.046-136.499-0.102-41.984-14.336-76.288-45.773-110.080-2.048-2.253-8.294-9.114-13.824-15.36-5.53-6.144-12.288-13.517-14.848-16.384-2.662-2.765-8.909-9.728-13.926-15.36s-11.264-12.493-13.824-15.36c-2.662-2.765-11.162-12.288-19.046-20.992-21.299-23.654-53.453-59.29-57.651-64-2.048-2.253-8.090-8.909-13.414-14.848s-11.571-12.8-13.926-15.36c-9.114-10.035-25.702-28.365-48.435-53.76-13.21-14.643-26.317-29.184-29.184-32.256s-14.95-16.384-26.726-29.389c-11.776-13.107-21.709-23.859-22.118-23.859-0.307 0-3.584 3.277-7.168 7.373-8.397 9.318-7.68 8.602-13.722 15.155-2.765 3.174-9.011 10.035-13.824 15.36s-11.264 12.493-14.336 15.872c-12.186 13.414-23.040 25.498-24.064 26.522-0.512 0.614-4.915 5.53-9.728 10.854s-8.909 9.933-9.216 10.24c-0.307 0.307-6.349 6.963-13.312 14.848-7.066 7.885-13.517 15.053-14.336 15.872-0.922 0.819-5.734 6.144-10.752 11.776s-11.059 12.288-13.414 14.848c-4.71 5.12-29.389 32.461-38.707 42.906-3.277 3.686-10.035 11.162-14.848 16.486s-10.65 11.776-12.902 14.336c-2.253 2.458-4.506 5.12-5.12 5.734-1.638 1.843-18.022 19.763-24.064 26.522-3.072 3.379-9.318 10.342-13.926 15.36-47.104 52.122-49.971 55.501-57.651 68.506-10.854 18.33-16.486 34.611-20.48 59.494-1.638 9.626-0.512 38.298 1.843 49.152 10.547 48.128 39.424 85.709 82.637 107.418 14.336 7.27 28.672 11.571 49.050 14.848 7.885 1.229 30.72 1.024 40.448-0.41z" />
+<glyph unicode="&#xeadd;" glyph-name="record" d="M484.352 882.586c-82.432-6.758-148.582-29.286-214.016-72.704-109.773-72.909-181.658-194.765-192.205-325.53-1.229-15.258-0.819-65.843 0.614-79.36 10.752-102.298 54.477-193.843 126.771-265.83 69.734-69.53 158.515-112.026 258.867-124.006 21.504-2.56 73.421-2.56 95.232 0.102 53.043 6.246 99.021 19.661 145.408 42.598 108.032 53.35 188.928 149.197 224.256 265.83 6.349 20.992 13.517 56.525 15.36 76.186 0.41 4.198 1.126 11.366 1.536 15.872 1.024 11.162 1.024 54.17-0.102 65.536-2.048 22.426-3.174 30.822-5.939 45.568-8.806 47.002-25.19 92.672-48.333 134.144-7.987 14.234-20.378 33.075-31.334 47.718-62.566 83.456-152.781 141.824-253.747 164.147-16.179 3.584-36.147 6.861-47.616 7.782-4.198 0.41-8.806 0.922-10.24 1.229-3.174 0.614-58.163 1.229-64.512 0.717z" />
+<glyph unicode="&#xeade;" glyph-name="Record_1" d="M115.405 753.664c-18.944-5.222-34.099-21.299-37.478-39.834-0.819-4.301-1.126-84.070-1.126-267.264 0-284.57-0.41-265.421 5.734-278.016 3.891-7.987 14.541-18.432 23.040-22.426 3.686-1.741 9.83-3.686 13.824-4.301 8.397-1.229 605.286-0.922 610.202 0.307 10.957 2.97 23.962 12.493 30.106 22.118 3.379 5.12 6.758 13.722 7.68 19.149 0.205 1.638 0.512 40.448 0.512 86.323l0.102 83.251 6.963-6.554c12.493-11.878 34.202-31.846 53.453-48.947 10.445-9.318 19.661-17.613 20.582-18.432 0.819-0.819 3.379-3.072 5.632-5.018 4.403-3.891 22.118-19.763 22.938-20.582 0.307-0.307 2.867-2.56 5.632-5.018 2.867-2.458 7.475-6.656 10.24-9.216 8.806-8.090 19.354-17.101 22.016-18.842 3.686-2.355 13.517-3.379 17.613-1.741 5.632 2.253 10.138 6.144 12.186 10.65 1.843 4.096 1.946 11.366 1.946 218.726s-0.102 214.63-1.946 218.726c-4.506 9.933-19.251 14.643-29.184 9.421-1.331-0.717-9.933-8.192-19.149-16.691-9.114-8.397-17.408-16.077-18.33-16.896-1.024-0.922-7.066-6.451-13.517-12.493s-12.595-11.776-13.824-12.8c-1.126-1.024-7.475-6.861-14.234-13.107-18.637-17.306-33.894-31.437-39.834-36.864-10.547-9.728-23.757-21.914-26.214-24.371l-2.97-2.97v84.89c0 72.806-0.205 85.709-1.536 90.931-4.403 16.896-14.95 29.082-31.539 36.25l-6.349 2.662-304.128 0.205c-249.651 0.102-305.050-0.102-309.043-1.229zM645.222 555.725c31.949-8.499 53.658-29.082 61.235-57.754 1.126-4.096 2.253-9.011 2.56-10.752l0.614-3.379h-45.056v2.355c0 4.198-5.939 14.541-11.469 20.070-12.595 12.698-32.256 16.998-50.995 11.366-18.33-5.427-30.515-20.378-36.557-44.544-2.662-10.957-2.458-39.219 0.512-49.766 3.379-12.39 8.704-22.016 16.486-29.594 11.264-11.059 22.221-14.95 40.141-14.131 9.421 0.512 11.674 1.024 17.51 3.686 12.288 5.939 21.197 18.33 25.088 34.918 1.434 6.042 2.15 7.27 3.891 7.373 8.909 0.41 40.448 0 41.267-0.512 1.843-1.126-2.662-21.094-7.27-31.846-9.318-22.118-26.419-38.4-49.357-46.899-13.005-4.813-37.683-6.554-53.76-3.891-41.984 7.168-71.782 37.478-80.486 81.715-2.458 12.493-2.458 37.581 0 49.971 9.011 46.080 39.629 76.902 83.046 83.456 9.626 1.434 34.099 0.41 42.598-1.843zM260.71 551.936c28.467-6.349 46.285-29.594 44.954-58.88-0.922-19.763-7.885-33.587-21.709-43.11-2.458-1.741-5.837-3.584-7.475-4.198-3.994-1.331-3.891-2.15 0.819-3.789 8.602-3.072 17.101-11.981 20.787-21.606 2.765-7.168 4.813-19.046 5.53-31.027 1.536-25.907 2.355-30.925 7.168-41.984 0.717-1.638-0.614-1.741-22.118-1.536l-22.835 0.307-1.741 7.168c-1.024 3.994-2.15 10.854-2.458 15.36-0.819 13.517-2.662 28.365-4.096 33.894-3.789 14.95-11.571 22.221-25.395 23.757-5.018 0.512-44.134 0.819-52.019 0.307-1.434-0.102-1.536-4.506-1.536-40.243v-40.243h-45.875l-0.102 103.629v103.629l5.12 0.307c2.867 0.205 29.901 0.205 60.211 0.102 47.104-0.102 56.218-0.41 62.771-1.843zM494.592 553.574c1.331-0.102 1.536-2.867 1.434-18.739-0.102-10.342-0.205-18.944-0.307-19.251s-24.781-0.512-54.886-0.41l-54.784 0.102v-44.749l50.381-0.205 50.483-0.307v-34.816l-49.152-0.205c-27.034 0-49.766-0.102-50.381-0.205-1.024-0.102-1.331-5.837-1.331-25.19s0.307-25.088 1.331-25.19c0.614-0.102 25.907-0.205 56.013-0.307l54.784-0.102 0.102-19.251 0.102-19.149-157.901 0.512-0.102 103.629v103.629l5.632 0.307c4.506 0.205 142.438 0.102 148.582-0.102zM178.79 517.632c-0.205-0.307-0.307-13.414-0.205-29.184l0.102-28.672 27.136-0.102c38.093-0.102 44.954 1.741 51.098 13.414 2.355 4.506 2.662 6.349 2.662 15.36 0 12.083-1.331 16.384-6.554 21.709-6.758 7.066-11.264 7.885-44.954 7.987-15.974 0-29.184-0.205-29.286-0.512z" />
+<glyph unicode="&#xeadf;" glyph-name="recycle_device" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM463.155 589.824c-9.728-2.97-15.77-7.987-22.323-18.33-7.27-11.366-29.184-48.026-29.184-48.64 0-0.512 51.507-31.437 54.374-32.666 0.614-0.307 4.813 6.554 42.701 69.939 8.704 14.643 16.589 27.648 17.408 28.979l1.434 2.253-30.003-0.102c-21.914 0-31.334-0.41-34.406-1.434zM544.256 589.414c-6.451-2.97-7.782-4.608-18.842-23.347l-10.547-17.613 9.011-15.155c5.018-8.294 9.83-16.589 10.854-18.432l1.741-3.277-8.602-5.222c-4.813-2.867-8.704-5.427-8.704-5.632 0-0.819 69.018-23.040 71.68-23.040 3.891 0 6.758 3.789 7.68 9.933 0.41 2.765 2.253 13.722 4.198 24.371 1.946 10.752 3.994 21.811 4.506 24.576 0.512 2.867 1.434 7.578 1.946 10.65 0.614 2.97 1.126 6.144 1.126 6.861 0 0.819-3.482-0.717-9.011-4.096l-9.011-5.427-11.571 19.354c-6.349 10.547-12.493 20.275-13.722 21.402-6.144 5.734-15.565 7.475-22.733 4.096zM416.768 482.816c-2.56-1.126-18.125-6.963-34.714-13.107l-30.003-11.162 9.011-4.915c5.018-2.662 9.318-5.018 9.523-5.222 0.205-0.102-4.608-9.421-10.752-20.48-10.854-19.968-11.059-20.378-11.059-27.136-0.102-6.042 0.307-7.475 2.97-11.366 1.843-2.56 5.018-5.325 7.68-6.656 4.301-2.253 5.734-2.355 26.214-2.355h21.709l8.806 15.974c4.813 8.704 8.806 16.179 8.806 16.589s0.717 1.536 1.536 2.662c1.331 1.843 1.638 1.741 7.373-1.434 3.277-1.843 7.475-4.198 9.318-5.222l3.277-1.946-0.512 2.355c-0.307 1.229-1.229 5.222-1.946 8.909-0.819 3.686-3.072 14.234-5.12 23.552-2.15 9.318-4.506 20.173-5.427 24.064-2.662 12.288-3.277 14.336-4.608 16.179-2.048 2.662-6.861 2.97-12.083 0.717zM619.008 458.957c-9.626-5.222-21.504-11.776-26.624-14.438-11.878-6.349-12.698-7.066-10.752-10.138 1.126-1.741 15.667-26.419 25.6-43.213 19.661-33.485 30.925-52.326 31.539-52.941 0.41-0.41 7.578 10.65 15.77 24.576 18.125 30.413 19.456 34.304 16.589 47.821-0.922 4.506-2.458 7.168-16.794 29.696-7.168 11.264-14.029 22.221-15.258 24.371-1.331 2.048-2.355 3.789-2.458 3.789s-8.090-4.301-17.613-9.523zM544.256 371.507c-35.226-31.027-35.328-31.232-35.328-34.611 0-3.277-0.102-3.174 35.635-34.714l22.733-20.173v22.528l48.947 0.614 4.506 3.072c5.734 3.994 9.216 10.854 9.216 17.92-0.102 4.301-1.024 6.963-5.427 15.155-6.144 11.469-8.192 15.053-12.39 22.528l-2.97 5.325h-41.779l-0.614 22.118-22.528-19.763zM364.851 368.435c0.307-0.512 5.837-9.83 12.493-20.787 6.554-10.957 13.414-22.426 15.155-25.395 3.789-6.246 9.728-11.571 16.794-14.848 4.71-2.15 6.349-2.253 39.526-2.56l34.509-0.307v32.358l-0.102 32.256h-59.392c-32.666 0-59.187-0.307-58.982-0.717z" />
+<glyph unicode="&#xeae0;" glyph-name="Redo" d="M373.965 810.803l72.499-72.499-88.474-88.576c-91.546-91.75-99.226-100.045-115.405-124.416-10.752-16.077-14.95-23.45-22.938-39.936-18.842-38.81-28.979-76.902-32.768-122.88-0.614-6.656-0.614-41.37-0.102-45.568 0.205-1.434 0.717-6.246 1.024-10.752 2.15-24.269 9.728-56.73 19.149-82.125 35.226-94.515 110.49-167.424 206.336-199.885 23.859-8.090 52.736-13.926 79.77-16.077 17.51-1.434 59.494-0.614 64.41 1.229 1.331 0.512-6.144 8.602-30.822 33.382-37.274 37.376-33.178 33.178-40.038 42.086-20.992 27.443-32.256 64.205-30.515 99.021 0.614 12.902 1.536 18.739 4.608 31.232 4.915 19.968 15.872 41.882 29.082 58.368 2.253 2.867 50.483 51.507 107.11 108.339l103.014 103.117 144.896-144.896v236.544c0 204.288-0.205 237.67-1.536 244.429-5.427 28.774-26.624 51.302-55.808 59.802-6.451 1.843-15.258 1.946-246.272 2.253l-239.616 0.205 72.397-72.397z" />
+<glyph unicode="&#xeae1;" glyph-name="relationship" d="M312.832 864.563c-88.986-7.373-166.707-59.29-207.36-138.547-43.52-84.685-36.25-186.675 18.739-264.192 6.656-9.421 18.022-23.347 22.118-27.136 0.922-0.922 3.482-3.686 5.734-6.246 2.253-2.458 8.090-8.909 12.902-14.234s18.637-20.582 30.618-33.792c11.981-13.21 25.6-28.16 30.106-33.178 4.608-5.018 9.114-10.035 10.138-11.264s5.734-6.246 10.342-11.366c9.421-10.24 39.322-43.11 70.246-77.312 9.523-10.547 17.203-19.046 30.208-33.178 0.614-0.614 4.71-5.325 9.216-10.342 4.506-5.12 8.704-9.626 9.318-10.24 0.614-0.512 5.734-6.042 11.264-12.288 14.643-16.282 23.859-26.317 32.154-35.328 0.819-0.922 4.813-5.325 8.704-9.83 3.994-4.403 7.68-8.499 8.294-9.114 1.024-0.922 36.557-40.038 44.544-49.050 1.843-2.15 4.608-5.222 6.042-6.758s6.451-7.066 11.264-12.39c4.813-5.222 10.854-11.878 13.414-14.746 2.662-2.765 6.349-6.861 8.192-8.909l3.482-3.891 21.504 23.654c11.878 13.005 22.528 24.883 23.859 26.317 1.331 1.536 4.301 4.813 6.656 7.373s8.704 9.421 14.029 15.36c5.325 5.939 11.366 12.595 13.414 14.848 2.15 2.253 4.71 5.018 5.734 6.246s5.734 6.451 10.547 11.776c8.704 9.626 29.286 32.256 31.232 34.304 0.614 0.614 4.506 4.915 8.704 9.626s9.114 10.035 10.752 11.878c1.741 1.741 6.042 6.656 9.728 10.752s7.168 7.885 7.782 8.499c1.229 1.331 30.515 33.485 42.803 47.206 8.806 9.626 19.763 21.811 21.606 23.654 0.512 0.614 4.301 4.71 8.192 9.114 3.994 4.403 7.68 8.499 8.192 9.114 0.614 0.614 12.39 13.619 26.112 28.774 13.824 15.258 27.136 29.901 29.696 32.666s5.12 5.53 5.632 6.144c3.174 3.482 22.938 25.395 26.522 29.286 2.355 2.56 8.602 9.421 13.926 15.36s12.083 13.312 14.95 16.384c2.867 3.072 7.27 7.987 9.728 10.752 2.458 2.867 4.71 5.325 5.018 5.632 2.458 2.253 16.589 22.426 22.016 31.334 14.848 24.371 26.624 54.374 31.642 80.282 10.138 52.531 5.427 102.605-14.234 150.016-28.467 68.813-87.040 122.778-158.208 145.613-12.698 4.096-29.491 7.885-44.032 10.035-13.21 1.946-41.779 2.56-55.91 1.229-7.68-0.717-27.546-3.584-30.106-4.301-0.819-0.205-2.662-0.614-4.096-0.922-4.506-0.717-24.781-6.758-33.792-10.035-27.853-9.933-64.307-32.461-84.378-52.122l-5.018-4.813-8.806 7.782c-39.526 35.43-89.395 57.856-141.722 63.693-13.21 1.434-36.659 1.843-49.357 0.819z" />
+<glyph unicode="&#xeae2;" glyph-name="reload" d="M492.442 857.19c-0.205-0.205-5.222-0.614-11.162-0.922-49.050-2.867-102.707-17.51-150.118-40.755-30.208-14.848-60.723-35.021-86.835-57.344-10.24-8.806-37.581-36.557-46.182-47.002-31.846-38.4-56.32-81.203-71.68-124.928-2.048-5.939-4.096-11.878-4.608-13.312-4.198-11.776-11.571-42.701-14.336-60.416-0.512-3.686-1.229-7.578-1.434-8.806s-0.717-5.837-1.126-10.24c-0.41-4.403-1.126-11.571-1.536-15.77-1.126-12.083-0.819-49.357 0.614-64.512 1.843-19.968 2.355-23.552 5.12-38.912 15.155-82.432 53.453-155.341 112.538-214.63 22.323-22.323 39.117-36.352 61.952-51.61 5.325-3.482 10.957-7.27 12.493-8.294 11.162-7.68 43.622-24.064 62.362-31.437 32.051-12.8 55.808-19.251 92.058-25.293 22.118-3.584 67.891-5.427 91.648-3.482 88.678 6.963 171.008 41.062 237.056 98.099 10.035 8.602 21.504 19.763 21.504 20.787 0 0.512-24.269 25.088-53.862 54.682l-53.862 53.862-4.301-3.994c-7.578-7.373-10.24-9.626-18.534-16.077-19.149-15.053-35.942-24.883-61.952-36.25-13.722-6.042-39.731-13.005-59.392-15.974-14.234-2.253-49.357-2.97-63.59-1.331-49.254 5.427-97.382 25.395-134.451 55.808-46.182 37.786-78.438 90.931-89.498 147.661-4.096 20.787-4.813 27.955-4.813 50.688 0 24.166 0.922 33.28 5.325 54.17 10.342 48.845 33.485 91.341 69.325 127.078 24.678 24.678 50.483 42.086 81.51 55.296 17.306 7.373 41.37 14.131 60.416 16.896 4.198 0.614 8.806 1.434 10.24 1.741s12.493 0.614 24.576 0.819c17.408 0.307 25.088-0.102 36.864-1.638 53.76-7.168 99.84-28.672 140.493-65.536l7.987-7.168-103.834-103.834 129.536-0.307c92.877-0.205 131.174 0 135.578 0.819 18.842 3.584 34.918 18.842 39.936 37.99 1.229 4.608 1.536 26.726 1.536 136.909v131.379l-47.104-47.206-47.206-47.206-9.933 9.421c-46.899 44.134-105.677 77.312-168.653 95.13-35.84 10.138-70.656 14.95-110.182 15.155-11.059 0.102-20.275 0-20.48-0.205z" />
+<glyph unicode="&#xeae3;" glyph-name="remote_control" d="M357.888 907.571c-18.432-3.482-35.328-20.48-39.322-39.526-1.638-7.68-1.638-832.41 0-840.090 3.994-19.149 20.48-35.635 39.629-39.629 3.789-0.819 49.459-1.126 154.112-1.126 161.69 0 155.136-0.205 166.707 5.734 2.867 1.434 8.397 5.837 12.39 9.728 7.782 7.782 12.186 15.974 14.029 26.214 0.819 3.994 1.126 128 1.126 401.92v396.083l-81.92 81.92-130.765-0.102c-78.029-0.102-132.915-0.512-135.987-1.126zM524.595 839.373c10.342-4.608 18.125-16.486 18.125-27.853 0-10.957-7.168-22.426-16.896-27.136-19.866-9.83-42.394 2.97-44.237 24.883-0.614 8.090 1.741 15.77 6.861 21.811 3.277 4.096 10.854 9.011 15.872 10.24 4.915 1.331 15.053 0.307 20.275-1.946zM543.744 687.411l21.504-21.299h-106.394l26.317 26.419 26.317 26.317 5.427-5.12c2.97-2.765 15.155-14.643 26.829-26.317zM633.139 544.154l-26.931-26.726v106.906l26.931-26.726 26.829-26.726-26.829-26.726zM416.768 570.88c0-28.672-0.205-52.224-0.512-52.224s-12.186 11.776-26.419 26.112l-25.907 26.010 25.702 26.112c14.029 14.336 25.907 26.112 26.419 26.112 0.41 0.102 0.717-23.347 0.717-52.122zM521.83 615.834c8.909-2.15 16.077-6.144 22.528-12.595 10.547-10.65 14.95-23.552 13.005-38.195-1.434-10.854-5.325-18.739-13.005-26.522-18.432-18.33-46.285-18.33-64.614 0-15.36 15.36-18.022 37.888-6.861 56.422 9.933 16.282 30.925 25.293 48.947 20.89zM564.224 476.058c0-0.41-11.366-12.083-25.293-26.112s-25.6-25.907-25.907-26.522c-0.307-0.512-12.698 11.162-27.546 26.112l-26.931 27.136h52.838c29.082 0 52.838-0.307 52.838-0.614zM423.322 336.998c10.752-5.222 16.384-14.643 16.486-27.238 0-10.138-3.482-17.715-10.957-23.552-12.595-10.035-29.594-9.216-40.755 2.048-11.264 11.162-12.083 28.979-1.946 41.267 3.379 4.198 10.547 8.704 15.565 10.035 5.939 1.536 15.667 0.307 21.606-2.56zM525.824 336.998c18.534-9.114 22.426-34.099 7.68-48.742-19.866-19.968-53.862-4.506-51.917 23.654 0.819 13.005 10.24 24.371 22.733 27.648 5.632 1.536 15.462 0.307 21.504-2.56zM628.326 336.896c14.95-7.373 21.094-26.829 13.005-41.574-9.626-17.818-33.894-21.606-48.026-7.578-6.349 6.349-8.806 11.981-9.216 20.378-1.024 23.859 22.63 39.322 44.237 28.774zM423.322 234.598c18.739-9.114 22.63-34.304 7.68-48.845-18.739-18.227-49.357-6.963-51.814 18.944-2.15 23.859 22.426 40.55 44.134 29.901zM524.39 235.315c6.656-2.97 11.469-7.68 14.848-14.336 2.458-4.813 2.97-6.963 2.97-13.517-0.102-16.998-11.469-29.184-28.365-30.515-25.6-1.946-41.677 27.648-26.419 48.64 8.090 11.264 24.064 15.36 36.966 9.728zM628.326 234.496c9.83-4.813 16.794-16.282 16.794-27.75 0-6.963-3.789-15.565-9.216-20.89-18.125-18.227-49.152-7.27-51.814 18.227-2.56 24.166 22.118 41.165 44.237 30.413zM423.526 132.096c10.752-5.222 17.613-17.51 16.486-29.389-1.946-21.606-24.269-34.509-43.622-25.19-10.138 4.813-16.077 13.517-17.203 24.781-2.15 23.859 22.528 40.448 44.339 29.798zM524.493 132.813c11.469-5.018 18.842-17.408 17.92-29.696-1.229-15.872-12.493-27.238-28.16-28.57-8.294-0.614-16.077 1.946-22.528 7.373-9.933 8.499-13.005 24.474-7.066 36.557 7.168 14.643 24.781 20.992 39.834 14.336zM628.122 132.198c13.926-6.758 20.378-23.347 14.95-37.786-6.451-17.203-25.805-24.781-42.496-16.589-9.523 4.608-16.896 16.179-16.896 26.419 0 23.245 23.654 38.093 44.442 27.955z" />
+<glyph unicode="&#xeae4;" glyph-name="Remote_control_1" d="M357.069 908.288c-18.022-4.915-32.256-19.354-37.069-37.478-2.253-8.294-2.253-835.277 0-843.571 4.813-18.33 19.149-32.666 37.478-37.478 4.71-1.331 28.365-1.536 152.166-1.536 103.117 0 148.275 0.307 152.064 1.126 19.149 3.994 35.635 20.48 39.629 39.629 0.819 3.891 1.126 120.934 1.126 420.864 0 357.786-0.205 416.256-1.536 420.966-5.018 18.944-20.48 33.894-39.219 37.888-8.499 1.741-297.984 1.434-304.64-0.41zM403.763 856.986c6.758-2.253 13.312-8.909 15.565-15.77 5.53-16.691-6.861-33.792-24.576-33.792-9.933 0-20.275 7.68-23.552 17.408-6.758 20.275 12.288 39.117 32.563 32.154zM439.398 677.888c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.734 3.379-6.451 6.246-6.451 23.757 0 17.306 0.512 19.354 6.042 23.040 3.379 2.355 3.994 2.355 32.051 2.355 23.757 0 29.082-0.307 31.642-1.536zM541.696 678.093c1.331-0.717 3.584-2.867 4.813-4.71 2.15-3.277 2.355-4.506 2.355-19.251 0-17.613-0.717-20.48-6.451-23.859-3.072-1.946-5.325-2.048-31.949-2.048-31.437 0-32.051 0.102-36.045 6.042-2.253 3.277-2.355 4.506-2.355 19.456 0 17.715 0.512 19.661 6.042 23.347 3.379 2.355 3.994 2.355 32.256 2.355 20.992 0 29.491-0.41 31.334-1.331zM644.198 677.888c6.144-3.174 7.066-6.349 7.066-24.064 0-13.926-0.205-16.282-2.048-19.149-3.891-6.451-5.018-6.554-37.888-6.246-27.75 0.307-29.594 0.41-31.744 2.355-4.506 4.096-5.12 6.758-5.12 23.040 0 17.306 0.819 20.173 6.451 23.552 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM439.398 575.488c6.144-3.174 7.066-6.349 7.066-24.064 0-13.926-0.205-16.282-2.048-19.149-3.891-6.451-5.018-6.554-37.888-6.246-27.75 0.307-29.594 0.41-31.744 2.355-4.506 4.096-5.12 6.758-5.12 23.040 0 17.306 0.819 20.173 6.451 23.552 3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM541.798 575.488c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM644.096 575.693c1.331-0.717 3.584-2.867 4.813-4.71 2.15-3.277 2.355-4.506 2.355-19.251 0-17.613-0.717-20.48-6.451-23.859-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.734 3.379-6.451 6.246-6.451 23.757 0 17.306 0.512 19.354 6.042 23.040 3.379 2.355 3.994 2.355 32.256 2.355 20.992 0 29.491-0.41 31.334-1.331zM439.398 473.088c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM541.798 473.088c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552 0 16.077 0.614 19.046 4.71 22.63 1.126 1.024 2.867 1.946 3.994 2.253 1.126 0.205 14.643 0.512 30.003 0.614 23.45 0.102 28.467-0.205 31.027-1.434zM644.198 473.088c6.144-3.174 7.066-6.451 7.066-23.859 0-17.51-0.717-20.378-6.451-23.757-3.072-1.946-5.325-2.048-31.949-2.048s-28.877 0.102-31.949 2.048c-5.632 3.379-6.451 6.246-6.451 23.552s0.819 20.173 6.451 23.552c3.072 1.946 5.325 2.048 31.744 2.048 23.654 0 28.979-0.307 31.539-1.536zM529.306 344.883c11.981-2.048 23.757-5.939 33.894-11.162 8.909-4.608 18.432-11.059 18.432-12.493 0-0.41-7.987-8.704-17.715-18.432l-17.818-17.715-6.042 2.97c-18.432 9.318-39.424 9.523-57.651 0.614l-7.475-3.686-18.33 18.227-18.227 18.227 6.349 4.506c13.005 9.114 33.178 17.203 49.357 19.558 9.011 1.331 25.702 1.126 35.226-0.614zM612.25 285.184c18.227-34.202 17.51-77.107-1.843-110.797-2.355-4.096-5.632-9.114-7.27-11.059l-2.97-3.584-18.125 18.125-18.125 18.022 3.584 7.066c9.216 17.408 9.011 40.243-0.41 57.958l-3.174 5.939 18.227 18.33 18.33 18.33 3.789-5.325c2.15-2.97 5.734-8.806 7.987-13.005zM439.194 284.774l17.715-17.715-2.765-5.427c-9.626-19.046-10.035-39.322-1.024-58.266l3.686-7.68-36.352-36.352-3.891 5.325c-12.595 17.51-21.299 44.134-21.299 65.741 0 18.842 5.12 39.424 13.722 55.194 4.915 9.011 10.445 16.998 11.674 16.998 0.41 0 8.704-7.987 18.534-17.818zM526.336 266.035c8.499-3.994 14.746-10.24 18.842-18.739 2.765-5.837 3.072-7.782 3.174-15.872 0-8.192-0.307-9.933-3.174-15.974-3.994-8.397-10.24-14.541-18.842-18.739-5.939-2.867-7.68-3.174-15.872-3.174s-9.933 0.41-15.872 3.174c-8.499 3.994-14.848 10.342-18.842 18.842-2.867 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c6.963 14.541 19.968 22.63 35.738 22.118 6.656-0.205 9.523-0.922 14.848-3.379zM481.075 174.592c18.227-9.523 40.243-9.318 59.802 0.512l5.325 2.662 18.227-18.227 18.227-18.33-9.421-6.246c-20.48-13.312-44.544-19.763-68.608-18.33-21.504 1.229-37.888 6.451-55.706 17.51-11.776 7.373-12.493 5.325 7.885 25.702 9.728 9.83 17.92 17.818 18.125 17.818 0.102 0 2.97-1.331 6.144-3.072z" />
+<glyph unicode="&#xeae5;" glyph-name="remove_modifier" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-63.078-50.893-109.875-116.941-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.728-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-55.706 74.547-136.294 130.253-225.69 156.16-25.805 7.475-52.941 12.8-75.776 14.95-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM545.28 779.059c64.819-6.656 123.802-30.822 175.206-71.68 14.336-11.469 39.424-36.557 50.995-50.995 25.6-32.154 44.442-67.174 57.344-106.496 6.246-19.354 11.776-45.158 14.438-68.608 1.331-11.981 1.331-50.586 0-64.512-5.734-58.573-26.624-114.893-59.187-160.256-15.462-21.504-39.219-47.616-56.422-62.054-53.76-44.954-119.091-72.294-186.982-78.131-10.65-0.922-54.579-0.717-61.44 0.307-1.946 0.307-7.475 1.024-12.288 1.741-39.834 5.12-83.456 19.763-118.067 39.526-17.715 10.035-40.038 25.702-54.784 38.4-4.71 3.994-30.31 29.798-34.406 34.509-44.851 52.531-71.885 116.224-79.155 186.47-1.024 9.933-1.024 46.899 0 59.392 10.342 128.205 96.563 240.23 218.829 284.467 17.408 6.349 47.616 14.029 62.464 15.974 2.56 0.307 6.554 0.922 8.909 1.229 18.227 2.56 53.862 2.867 74.547 0.717zM273.408 523.878c-6.963-2.15-11.469-5.837-14.95-12.39-1.843-3.379-1.946-6.963-1.946-63.488 0-59.392 0-59.904 2.253-64 2.458-4.71 5.53-7.68 10.547-10.342 3.482-1.843 11.469-1.946 239.616-2.253 176.333-0.205 237.466 0 241.562 0.922 4.403 0.922 6.451 2.15 10.342 6.042 7.373 7.27 7.373 6.963 6.963 72.704-0.307 56.422-0.307 56.832-2.56 61.133-2.97 5.427-8.602 10.035-14.234 11.469-5.12 1.331-473.293 1.434-477.594 0.205z" />
+<glyph unicode="&#xeae6;" glyph-name="Replay_boxed_arrow" d="M405.402 892.723c-1.434-1.536-7.475-7.475-13.312-13.107-5.939-5.632-20.378-19.558-32.256-30.822-11.776-11.366-23.040-22.118-24.986-23.962s-8.909-8.397-15.36-14.746c-16.794-16.179-55.091-52.941-59.392-56.934-1.946-1.843-12.493-11.878-23.45-22.426-10.957-10.445-21.811-20.89-24.166-23.142-68.403-65.229-75.366-72.294-79.155-80.384-8.397-17.408-8.499-33.894-0.512-51.2 3.174-6.758 5.427-9.421 18.637-22.528 13.107-13.005 49.254-47.821 62.566-60.314 2.56-2.355 13.517-13.005 24.474-23.45 10.957-10.547 22.016-21.197 24.576-23.654 5.12-4.813 11.878-11.264 45.67-43.725 12.39-11.981 24.166-23.142 26.112-24.986 5.939-5.53 44.544-42.598 59.392-57.037l13.824-13.517 0.307 89.6 0.205 89.498h257.024v-256h-167.731c-188.518 0-174.797 0.614-182.886-7.578-8.192-8.090-7.782-2.458-7.782-107.725 0-101.376-0.205-97.792 5.632-105.472 1.331-1.741 4.71-4.608 7.373-6.144l4.915-2.97 251.392-0.205c227.021-0.205 252.109-0.102 258.56 1.331 31.232 7.168 54.784 31.949 59.802 62.976 0.717 4.403 1.126 100.352 1.126 294.605 0 258.56-0.205 288.87-1.638 295.936-6.144 30.31-29.696 53.76-60.006 60.006-7.066 1.434-30.003 1.638-216.883 1.638h-208.896l-0.205 89.702-0.307 89.702-2.662-2.97z" />
+<glyph unicode="&#xeae7;" glyph-name="Reply_boxed_arrow" d="M380.416 891.904c-1.843-2.048-25.498-26.522-69.734-72.090-8.499-8.806-17.51-18.125-19.968-20.685-3.891-4.096-40.755-42.291-61.338-63.386-8.602-8.909-54.067-55.91-61.44-63.488-5.837-6.042-44.134-45.568-61.85-63.795-5.53-5.734-11.878-12.698-14.131-15.462-18.944-23.654-19.354-61.133-0.819-85.094 3.994-5.12 9.216-10.752 35.635-37.888 14.131-14.541 59.085-60.928 70.246-72.602 3.277-3.379 13.21-13.619 22.016-22.733 23.45-24.064 67.584-69.734 73.421-75.776 2.765-2.97 15.872-16.486 29.082-30.106 13.21-13.722 26.112-27.034 28.672-29.696 2.56-2.56 11.162-11.469 19.251-19.661l14.541-14.95v204.595h281.6v-193.843c0-212.787-0.41-198.758 6.042-206.643 1.638-1.946 5.12-4.608 7.885-6.042l5.018-2.56 120.32-0.307c135.066-0.307 126.157-0.717 134.451 7.373 8.704 8.397 7.885-22.938 7.885 313.958 0 206.95-0.307 301.568-1.126 305.766-4.813 26.829-23.347 49.459-48.333 58.778-14.234 5.325-0.922 5.12-266.65 5.12h-247.091v101.888c0 56.013-0.307 101.888-0.717 101.786-0.512 0-1.741-1.126-2.867-2.458z" />
+<glyph unicode="&#xeae8;" glyph-name="Reply_curved_arrow" d="M240.845 679.629c-95.642-95.949-168.448-169.779-170.189-172.544-5.427-8.602-8.090-14.643-10.24-23.142-5.837-22.323-1.536-45.568 11.674-64.102 2.048-2.765 78.746-80.282 170.598-172.237l166.912-167.117v204.8l150.323-0.41c82.637-0.205 151.859-0.717 153.805-1.126s6.758-1.434 10.752-2.253c22.118-4.608 47.002-16.794 64.614-31.744 32.154-27.136 49.869-60.723 55.091-104.346 0.307-2.253 0.512-24.986 0.614-50.483v-46.387l7.885 6.451c12.39 10.035 35.738 33.894 46.49 47.411 33.997 42.701 56.422 90.317 66.867 141.824 2.765 13.824 2.867 14.643 4.915 30.72 2.048 16.282 1.638 59.699-0.614 76.595-7.27 53.965-24.883 101.274-53.862 144.589-11.674 17.306-24.371 32.563-41.472 49.664-24.678 24.678-47.206 41.677-76.8 57.754-32.87 17.92-75.571 32.154-109.056 36.352-2.56 0.307-5.734 0.819-7.066 1.126-1.434 0.205-6.656 0.819-11.776 1.126-5.12 0.41-10.035 0.819-10.854 1.024-0.819 0.102-57.446 0.307-125.645 0.307l-124.211 0.102v101.888c0 56.013-0.307 101.888-0.717 101.786-0.512 0-76.083-75.469-168.038-167.629z" />
+<glyph unicode="&#xeae9;" glyph-name="report" d="M485.274 857.19c-0.205-0.205-5.837-0.717-12.39-1.024-6.656-0.41-13.107-0.922-14.336-1.126-1.331-0.205-5.12-0.614-8.499-1.024-41.882-4.506-87.45-15.565-127.283-30.822-50.483-19.456-95.642-46.285-133.837-79.667-25.907-22.733-51.2-52.531-68.71-81.101-22.938-37.376-37.171-78.643-41.882-121.754-1.331-12.39-1.536-51.61-0.205-57.344 0.307-1.126 0.819-4.813 1.229-8.192 1.741-15.974 6.042-33.587 12.902-54.272 25.293-75.162 84.378-142.746 165.274-189.133 26.214-15.053 60.006-30.003 88.883-39.322l11.981-3.891v-175.821l153.395 153.395 19.763 0.717c10.957 0.41 20.787 0.922 21.914 1.126s5.53 0.717 9.728 1.024c52.122 3.994 115.61 20.378 163.84 42.496 22.528 10.342 50.688 26.010 67.482 37.581 7.885 5.53 28.058 20.582 31.949 24.064 1.536 1.331 5.018 4.301 7.68 6.554 23.040 19.661 47.923 48.23 65.434 75.162 7.475 11.366 23.142 41.472 27.034 51.712 14.438 37.888 20.173 67.789 20.275 104.96 0.307 79.053-32.87 154.726-94.822 215.962-48.435 47.821-107.622 82.739-178.688 105.472-33.997 10.854-76.288 19.456-108.646 22.118-4.506 0.41-9.523 0.922-11.264 1.126-3.686 0.614-67.686 1.536-68.198 1.024zM699.29 676.864c6.042-2.048 11.059-6.246 14.234-11.674 2.355-3.994 2.765-5.939 2.765-12.39s-0.41-8.397-2.765-12.39c-1.536-2.56-4.403-5.939-6.349-7.475-8.090-6.144 4.403-5.734-194.56-5.734-204.902 0-189.542-0.614-197.632 7.578-9.011 9.011-10.138 22.835-2.765 33.28 2.662 3.686 9.421 8.294 13.619 9.318 1.843 0.41 85.709 0.819 186.266 0.922 158.003 0.102 183.501-0.102 187.187-1.434zM698.778 548.966c9.728-2.97 16.384-10.854 17.613-21.094 1.229-10.445-3.584-19.968-12.698-25.395l-4.813-2.765h-372.838l-4.915 2.56c-15.36 7.885-18.534 28.262-6.246 40.448 8.090 8.090-8.294 7.475 196.198 7.578 154.931 0.102 183.603-0.102 187.699-1.331zM520.192 420.864c10.854-3.789 16.896-12.698 16.794-24.576 0-5.939-0.512-7.987-2.867-12.083-3.277-5.53-7.987-9.523-13.619-11.571-3.174-1.126-22.118-1.331-98.406-1.434h-94.515l-5.53 2.662c-20.582 9.626-19.149 39.117 2.15 46.899 6.144 2.253 189.645 2.355 195.994 0.102z" />
+<glyph unicode="&#xeaea;" glyph-name="responsible" d="M616.96 799.539c-21.299-2.355-43.93-11.264-61.44-24.269-5.222-3.891-42.803-40.653-105.37-103.219l-97.178-97.178 2.97-3.174c9.626-10.24 22.528-22.118 27.034-24.986 7.475-4.71 18.125-7.782 27.648-8.090 10.65-0.307 16.077 0.819 26.624 5.837l8.704 4.096 71.885 71.782c39.526 39.526 72.397 71.987 73.011 72.192s58.982-57.549 129.741-128.307l128.717-128.717 8.397 8.806c11.981 12.493 18.022 20.89 24.474 33.894 10.342 21.094 13.312 33.792 13.21 57.344-0.102 12.698-0.512 18.432-2.253 25.702-4.198 18.534-11.878 35.123-22.938 49.971-7.782 10.445-155.136 157.389-165.171 164.659-15.053 11.059-35.021 19.354-54.272 22.733-7.373 1.229-26.010 1.741-33.792 0.922zM370.176 797.184c-18.022-3.174-35.942-10.547-51.302-21.094-9.523-6.554-155.648-152.166-164.864-164.25-11.366-14.95-19.251-32.768-23.552-52.736-2.048-9.83-2.355-35.533-0.512-45.568 3.482-19.149 12.288-39.731 23.45-54.886 3.379-4.403 14.029-16.077 23.757-25.907l17.715-17.715 4.198 4.915c5.837 6.963 46.285 47.309 51.302 51.2 19.558 15.258 46.49 18.842 70.042 9.216 26.112-10.547 43.418-37.171 42.803-65.741l-0.205-8.294 9.933-0.102c40.038-0.205 70.656-32.051 69.734-72.397l-0.205-7.168h10.445c17.51-0.102 33.178-6.042 45.466-17.306 15.872-14.541 23.245-30.822 23.347-51.507v-10.445l7.68 0.102c13.926 0.205 24.781-2.458 36.147-8.704 7.27-4.096 11.162-7.475 28.467-24.576 16.077-15.872 21.606-18.637 36.25-18.534 11.366 0.102 16.282 1.434 24.371 6.861 5.939 3.994 12.595 12.493 15.36 19.558 4.506 11.571 2.765 27.443-4.096 37.99-1.434 2.253-39.322 40.755-84.070 85.606-44.749 44.749-81.92 82.534-82.739 83.968-4.301 7.782 1.331 18.022 10.854 19.661 6.656 1.126 6.861 0.922 91.341-83.558 48.742-48.742 84.070-83.354 86.835-84.992 7.885-4.608 13.21-6.042 22.016-6.042 16.282 0.102 29.491 8.192 37.171 22.528 7.68 14.541 6.246 30.822-3.994 44.749-2.15 2.867-40.038 41.267-84.275 85.504-60.928 60.723-80.794 81.203-81.408 83.763-3.174 11.059 7.782 20.787 18.739 16.691 1.331-0.614 39.834-38.298 85.504-83.866 89.702-89.702 86.528-86.835 100.25-89.395 16.589-3.174 34.099 4.608 43.315 19.149 6.963 11.162 7.782 27.136 2.048 39.834-3.174 6.963-6.861 10.752-119.808 123.802l-116.531 116.634-60.826-60.826c-33.485-33.485-62.874-62.464-65.434-64.512-27.648-22.426-67.994-24.371-98.509-4.813-3.789 2.458-15.974 13.619-29.798 27.341l-23.347 23.142 178.79 178.893-9.728 9.216c-10.445 9.83-21.709 17.818-33.28 23.654-7.27 3.584-24.474 9.523-30.515 10.445-1.843 0.307-5.837 0.922-8.909 1.434-9.216 1.536-28.365 1.024-39.424-0.922zM284.672 456.806c-11.264-2.458-14.643-4.915-39.219-29.184-12.902-12.698-24.678-25.19-26.317-27.648-9.421-14.029-9.933-31.232-1.434-45.773 3.584-6.042 11.366-13.005 18.432-16.384 5.53-2.662 7.066-2.97 17.306-2.97 10.854 0 11.571 0.205 18.432 3.482 6.144 3.072 10.138 6.656 31.539 27.955 20.787 20.89 24.883 25.395 27.443 30.822 5.939 12.8 6.042 24.986 0.205 37.274-7.987 16.794-27.955 26.419-46.387 22.426zM362.803 377.446c-10.24-2.662-14.643-6.144-39.834-31.232-26.726-26.726-28.979-29.901-31.334-42.496-5.12-27.238 19.661-52.838 47.002-48.538 13.619 2.048 16.691 4.301 43.93 31.437 21.914 21.914 25.088 25.498 28.058 31.744 6.656 14.029 5.018 30.515-4.301 43.008-4.608 6.246-13.824 13.107-20.070 15.053-4.915 1.434-19.251 2.048-23.45 1.024zM446.464 298.803c-4.813-0.717-12.8-3.686-16.896-6.246-6.963-4.403-50.893-49.254-53.965-55.091-3.686-6.963-5.12-13.005-5.12-20.378 0.102-27.853 26.931-47.821 53.658-40.038 9.421 2.765 16.794 8.602 40.243 32.461 17.51 17.818 23.142 24.269 25.293 28.672 10.138 20.89 1.843 45.875-18.637 56.218-7.68 3.789-16.998 5.53-24.576 4.403zM518.861 217.6c-3.277-1.024-7.782-3.072-10.035-4.608-5.53-3.584-49.254-47.411-52.326-52.429-12.493-19.968-6.861-45.466 13.005-58.163 13.619-8.704 31.334-8.602 45.261 0.307 7.168 4.608 50.79 48.947 53.555 54.374 8.909 17.613 5.939 37.376-7.475 50.483-11.264 10.854-27.341 14.746-41.984 10.035z" />
+<glyph unicode="&#xeaeb;" glyph-name="Restaurant" d="M301.056 882.483c-5.018-1.638-10.752-5.325-13.312-8.397-6.554-8.397-6.144 1.843-6.144-145.51 0-146.739-0.205-141.21 6.042-156.57 7.066-17.408 21.914-32.461 40.346-40.858l4.813-2.253v-235.008c0-167.526 0.307-236.442 1.126-240.333 8.192-39.014 55.91-53.76 85.299-26.317 7.27 6.758 12.902 16.794 14.848 26.317 0.819 3.789 1.126 74.65 1.126 240.333v234.906l8.499 4.301c19.968 10.035 33.587 26.419 40.243 48.538 1.741 5.734 1.946 14.336 2.15 142.643 0.205 90.726 0 137.83-0.717 140.39-1.536 5.734-6.349 11.878-11.981 15.155-6.758 3.994-16.896 4.096-24.371 0.205-5.734-2.867-11.162-9.318-12.8-15.053-0.614-2.458-1.024-39.322-1.024-107.93v-104.243h-25.6v104.243c0 68.608-0.41 105.472-1.024 107.93-1.638 5.632-7.066 12.186-12.595 14.95-12.493 6.451-26.931 2.355-34.202-9.83l-2.867-4.813-0.307-106.189-0.205-106.291h-25.6l-0.205 106.291c-0.307 119.296 0.41 108.646-8.090 116.941-5.837 5.734-16.794 8.704-23.45 6.451zM700.211 882.176c-27.75-3.277-55.501-17.51-76.083-39.014-18.739-19.558-30.413-43.93-34.202-71.066-0.614-4.403-1.024-82.534-1.024-203.981l-0.102-196.915h51.2v-156.16c0-109.978 0.307-157.696 1.126-161.485 5.632-26.829 32.768-44.954 59.494-39.731 19.968 3.789 36.557 20.070 40.755 39.936 0.819 4.198 1.024 107.11 0.819 408.576-0.307 385.946-0.41 403.046-2.15 406.323-2.867 5.325-9.523 11.162-14.746 12.902-5.018 1.741-13.517 1.946-25.088 0.614z" />
+<glyph unicode="&#xeaec;" glyph-name="restore_to_phone" d="M463.36 907.366c-11.264-3.584-19.558-10.752-24.474-21.094l-3.174-6.656-0.307-74.957-0.307-75.059h-37.786c-20.89 0-37.888-0.307-37.888-0.717 0-0.512 1.741-2.662 3.891-4.915 2.048-2.253 7.27-7.987 11.469-12.8s8.192-9.216 8.704-9.83c1.536-1.638 12.595-14.131 28.16-31.642 7.475-8.397 16.691-18.842 20.48-23.040 12.39-13.926 33.997-38.298 41.37-46.592 16.691-19.046 22.733-23.040 35.942-23.859 8.704-0.512 16.384 1.331 23.040 5.837 2.56 1.638 9.216 8.192 14.848 14.541s10.752 11.981 11.264 12.595c1.024 1.126 13.517 15.155 19.456 22.016 1.741 1.843 3.584 3.994 4.198 4.608 0.512 0.614 4.403 5.018 8.602 9.83s7.885 8.909 8.192 9.216c0.717 0.614 47.309 52.941 53.76 60.314 2.253 2.56 6.042 6.758 8.397 9.318l4.301 4.608-38.298 0.307-38.298 0.205-0.307 75.059-0.307 74.957-3.277 6.656c-5.325 10.957-13.722 18.125-24.474 20.992-7.987 2.048-90.726 2.15-97.178 0.102zM295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.661 34.816-37.274 39.322-1.741 0.512-28.262 1.024-59.085 1.126l-56.115 0.41v-76.902h102.4v-691.2h-409.6v691.2h102.4v76.8l-54.477-0.102c-39.936 0-56.013-0.41-59.904-1.331zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56z" />
+<glyph unicode="&#xeaed;" glyph-name="Restrictied_content" d="M184.832 779.264c-23.040-4.301-42.906-13.005-59.494-26.214-22.118-17.613-37.478-41.574-45.158-70.758l-2.867-10.547-0.307-278.221-0.205-278.323h870.4l-0.307 277.811c-0.205 263.168-0.41 278.118-2.15 285.389-6.451 27.034-16.896 45.978-35.43 64.512-15.667 15.667-30.822 25.088-51.405 31.744-19.968 6.451 2.765 6.042-346.931 5.939-255.59 0-320.41-0.307-326.144-1.331zM526.643 702.362c24.371-5.734 44.749-24.474 51.814-48.026 3.072-9.933 3.789-25.498 1.741-35.328-3.072-14.95-12.8-29.594-27.034-41.062-7.475-5.939-7.68-8.397-3.891-40.858 0.41-3.891 1.741-16.896 6.349-62.464 0.307-3.072 0.717-7.27 0.922-9.216s0.614-6.656 1.024-10.445l0.717-6.963h-93.491l0.614 5.427c1.024 9.523 1.536 14.438 2.048 20.685 0.307 3.379 0.717 7.782 1.024 9.728 0.205 1.946 1.126 10.957 2.048 19.968s1.843 18.022 2.048 19.968c0.205 1.946 0.717 6.554 1.024 10.24 0.717 6.963 1.126 10.752 2.048 18.432 2.048 17.306 1.434 20.070-5.734 25.6-20.173 15.462-29.696 35.43-28.262 59.29 1.638 26.317 15.258 47.309 38.4 58.88 14.234 7.066 32.154 9.421 46.592 6.144zM222.413 369.254c6.554-2.765 10.035-6.656 23.962-26.522 6.656-9.728 12.493-17.51 12.902-17.306 0.41 0.102 6.042 7.885 12.493 17.203 13.312 19.149 16.998 23.245 23.962 26.726 3.891 1.843 6.451 2.355 13.005 2.355 10.957-0.102 18.33-3.482 23.962-11.059 7.475-9.933 9.114-20.275 4.915-30.413-2.048-4.813-13.926-22.938-27.238-41.472-8.704-12.083-11.571-16.896-11.571-19.456 0-1.638 2.048-5.837 5.018-10.035 2.765-4.096 11.264-16.384 18.739-27.341 15.258-22.016 17.51-26.829 16.896-36.557-0.614-11.571-6.963-20.685-17.92-25.805-4.506-2.048-7.27-2.56-13.824-2.662-7.168 0-8.909 0.41-13.619 2.97-5.734 3.277-9.011 6.758-17.715 19.558-3.072 4.506-5.939 8.704-6.554 9.318-0.512 0.717-3.072 4.301-5.632 7.987s-4.915 6.758-5.222 6.758c-0.307 0-2.048-2.15-3.686-4.813-7.68-11.878-22.323-31.744-25.293-34.406-6.042-5.427-11.571-7.373-20.582-7.27-13.414 0-21.709 5.018-27.341 16.589-2.97 5.939-3.379 7.782-3.277 14.541 0.102 5.632 0.614 8.806 2.15 11.776 1.229 2.253 9.933 15.36 19.456 29.082 19.046 27.648 19.763 28.57 19.763 30.925 0 0.922-1.536 3.686-3.379 6.144-1.946 2.458-7.885 10.957-13.21 18.842-5.427 7.885-11.981 17.306-14.541 20.992-9.011 12.698-10.342 15.974-10.342 25.088 0 6.861 0.512 9.011 2.765 13.312 2.97 5.632 9.011 12.186 13.312 14.438 7.475 3.891 19.354 4.096 27.648 0.512zM474.112 369.357c6.758-2.867 11.366-8.090 24.576-27.136 6.451-9.421 12.083-17.101 12.39-17.101s2.355 2.662 4.608 5.837c25.907 38.093 28.877 40.755 44.954 40.653 6.963 0 9.114-0.41 14.234-2.97 9.523-4.813 16.998-16.589 16.998-27.034 0-9.011-2.253-13.517-19.354-37.99-20.89-30.106-22.733-32.973-22.016-35.226 0.512-2.048 5.632-10.035 12.493-19.558 13.517-19.046 25.6-37.683 27.034-41.984 2.253-6.656 1.741-16.896-1.126-22.733-2.97-5.939-8.704-11.366-15.462-14.541-4.506-2.048-7.168-2.56-13.824-2.662-14.131 0-17.715 2.867-35.84 28.979-6.656 9.728-12.39 17.613-12.698 17.613-0.41 0-1.741-1.741-3.174-3.891-12.39-18.637-24.986-34.816-29.389-37.786-8.192-5.53-17.51-6.758-27.136-3.584-8.090 2.662-13.619 7.578-17.51 15.462-2.765 5.632-3.277 7.885-3.277 13.926 0 5.018 0.717 8.499 2.15 11.776 1.741 3.789 28.058 42.701 37.171 54.989 3.174 4.301 2.56 6.349-5.325 17.408-16.077 22.221-32.358 47.411-33.485 51.61-3.994 14.541 5.222 31.744 19.661 36.966 6.656 2.355 16.486 1.946 23.347-1.024zM727.040 369.357c6.861-3.072 10.24-6.554 20.378-21.197 14.234-20.685 15.974-23.040 16.486-23.040 0.307 0 5.837 7.578 12.186 16.896 18.125 26.214 22.528 29.696 37.478 29.696 7.066-0.102 9.011-0.512 14.336-3.174 14.336-7.373 20.582-24.883 14.029-39.731-1.126-2.458-5.632-9.728-10.138-16.077-28.774-41.267-28.877-41.574-28.467-44.134 0.307-1.331 3.584-6.861 7.373-12.288 33.792-48.845 34.918-50.893 33.792-61.952-2.458-24.371-33.075-36.557-51.098-20.48-2.048 1.843-9.318 11.366-16.077 21.197-6.861 9.83-12.8 18.022-13.21 18.125-0.41 0.205-5.53-6.656-11.469-15.155s-11.469-16.486-12.288-17.715c-8.090-11.469-23.245-16.589-36.147-12.083-8.499 3.072-13.414 7.373-17.306 15.36-2.867 5.837-3.379 7.885-3.277 14.029 0 4.915 0.717 8.602 2.15 11.776 1.843 4.198 28.365 43.52 35.226 52.326 4.71 5.939 4.813 10.138 0.614 14.438-0.717 0.717-5.12 6.861-9.83 13.619-28.877 42.189-29.184 42.701-28.57 52.224 0.819 13.517 10.65 26.112 22.835 29.286 4.813 1.331 15.974 0.205 20.992-1.946z" />
+<glyph unicode="&#xeaee;" glyph-name="rewards" d="M345.6 856.986c-19.149-3.584-30.925-8.090-44.032-16.691-29.286-19.251-47.104-54.579-45.261-89.702 1.638-31.13 15.974-58.573 39.936-76.595 14.336-10.854 30.003-17.101 50.893-20.48 1.434-0.205-42.701-0.512-97.997-0.614-70.554-0.102-102.195-0.41-105.984-1.229-16.691-3.584-30.413-15.36-37.478-31.949l-2.765-6.349-0.307-69.837-0.307-69.939h384.102v179.098l51.2-0.205v-178.893h384v66.56c0 44.544-0.41 68.198-1.126 71.885-3.891 18.432-18.637 33.997-36.966 38.81-6.963 1.843-12.8 1.946-108.237 2.048-55.501 0.102-99.533 0.41-97.894 0.614 15.667 2.15 32.973 8.499 44.749 16.384 21.402 14.336 35.942 35.021 43.008 61.235 3.174 11.776 3.174 36.25 0 48.23-3.584 13.414-6.656 20.275-14.336 32.154-17.613 27.136-47.206 44.032-80.589 45.773-32.358 1.638-65.946-13.619-85.197-38.81-3.379-4.403-35.942-58.88-67.277-112.64-2.867-4.915-5.427-9.011-5.734-9.011s-2.048 2.662-3.994 5.939c-1.843 3.174-8.806 15.053-15.462 26.317-54.886 93.594-52.838 90.214-63.795 100.454-19.046 17.92-41.984 27.136-68.301 27.546-7.066 0.102-13.722 0.102-14.848-0.102zM375.296 803.43c11.162-4.301 19.661-10.854 25.293-19.251 4.915-7.373 46.899-79.462 46.49-79.872-0.205-0.205-21.094-0.41-46.387-0.41-50.79 0-54.272 0.307-66.253 6.349-15.155 7.68-25.498 23.552-26.829 41.267-1.229 15.155 3.891 28.672 14.848 39.526 7.066 7.066 13.926 11.059 23.654 13.824 7.475 2.048 22.118 1.331 29.184-1.434zM677.376 804.864c28.16-7.27 44.954-35.123 37.478-62.259-1.229-4.403-3.174-9.933-4.301-12.186-3.174-6.349-14.95-17.408-21.811-20.685-11.366-5.427-16.282-5.837-65.843-5.837-25.088 0-45.773 0.205-45.978 0.41-0.307 0.307 2.253 5.018 5.53 10.547 8.704 14.643 20.992 35.43 22.323 37.786 6.758 12.39 20.582 34.611 23.45 37.683 12.083 12.8 32.461 18.842 49.152 14.541zM128 253.44c0-119.296 0.307-170.496 1.126-174.285 4.096-19.456 20.992-36.147 40.243-39.629 4.198-0.819 54.374-1.126 161.587-1.126h155.443v384h-358.4v-168.96zM537.6 230.4v-192h156.979c132.71 0 157.696 0.205 162.406 1.536 18.944 5.018 33.997 20.582 37.888 39.219 0.819 3.789 1.126 54.989 1.126 174.285v168.96h-358.4v-192z" />
+<glyph unicode="&#xeaef;" glyph-name="ringtones" d="M588.8 598.528v-208.077l-2.253 0.614c-15.053 4.301-23.142 5.53-36.147 5.53-31.642-0.102-59.29-11.674-81.715-34.099-30.31-30.31-41.062-75.776-27.648-116.736 9.318-28.467 31.232-53.862 58.163-67.379 27.648-13.824 61.235-15.565 90.624-4.915 40.141 14.643 68.813 50.278 74.65 92.57 0.819 5.53 1.126 75.059 1.126 223.13v215.142l11.059-0.717c6.042-0.41 12.083-0.922 13.517-1.024 54.17-7.373 95.642-37.376 122.88-88.883l6.349-12.083h25.702l-0.614 14.643c-3.686 82.637-36.762 141.005-96.87 170.701-15.872 7.885-28.058 11.878-50.278 16.589-8.806 1.946-14.541 2.15-59.085 2.56l-49.459 0.512v-208.077zM266.752 484.966c-10.035-4.506-39.117-41.677-53.453-68.198-14.95-27.648-26.522-62.054-30.515-90.112-0.307-2.253-0.717-5.018-1.024-6.144-3.174-15.36-2.56-64.614 1.024-83.558 0.205-0.922 0.614-3.379 0.922-5.53 4.403-27.238 19.046-66.867 34.099-92.16 14.336-24.166 39.834-55.501 48.64-60.006 13.005-6.656 27.546 6.042 22.835 19.866-0.717 2.15-3.994 6.758-7.373 10.24-9.421 10.035-11.981 13.107-20.582 24.678-19.456 26.317-32.461 53.555-40.653 85.197-9.626 37.171-10.65 76.8-3.072 113.050 0.307 1.434 0.717 3.686 1.024 5.12 0.205 1.434 1.843 7.578 3.584 13.824 10.752 38.195 31.539 74.035 60.518 104.448 2.765 2.867 5.632 6.861 6.554 8.909 3.072 7.475-0.512 16.589-8.090 20.173-5.325 2.662-9.114 2.662-14.438 0.205zM315.904 438.374c-3.891-1.638-15.667-14.336-25.088-26.726-19.046-25.293-32.051-53.965-38.4-84.992-3.891-18.944-4.506-26.010-4.096-48.64 0.41-28.365 3.277-44.442 12.595-70.758 3.379-9.626 10.547-24.474 16.896-35.226 12.698-21.299 32.461-44.646 39.424-46.592 5.734-1.536 9.523-1.229 13.517 1.126 6.042 3.686 8.397 7.987 8.294 14.95 0 5.632-1.229 7.782-7.782 14.643-24.371 25.498-42.086 60.621-47.616 94.208-9.114 55.296 6.042 110.080 41.779 151.040 3.789 4.301 8.192 9.318 9.728 11.264 11.366 13.21-3.277 32.666-19.251 25.702zM365.056 391.066c-4.096-2.15-7.782-5.632-14.95-14.643-21.811-26.931-32.666-56.73-33.28-91.238-0.614-38.605 11.162-71.578 35.84-100.557 8.294-9.728 11.878-12.288 18.022-12.902 9.728-0.922 17.818 6.451 17.715 16.179-0.102 6.042-1.229 8.090-8.192 15.872-31.539 34.816-39.219 84.582-19.558 127.283 4.096 9.114 12.595 21.811 19.456 29.389 7.066 7.782 8.192 9.83 8.294 15.872 0.102 11.878-13.005 20.173-23.347 14.746z" />
+<glyph unicode="&#xeaf0;" glyph-name="running" d="M739.84 791.347c-18.534-3.891-34.714-14.438-46.285-30.003-9.523-13.005-13.722-25.395-14.234-42.496-0.41-13.722 0.922-21.094 5.734-32.461 8.909-21.299 28.57-38.502 50.688-44.442 9.933-2.662 31.232-2.662 39.936 0 19.661 6.042 34.509 17.203 45.056 33.997 18.944 30.003 14.438 69.325-10.957 94.515-18.33 18.33-44.954 26.214-69.939 20.89zM500.736 765.85c-3.072-0.819-7.68-2.867-10.24-4.506s-34.611-33.075-71.27-69.837c-76.698-76.902-72.602-71.885-72.602-89.395 0-9.216 0.307-10.854 2.97-16.179 4.096-8.192 10.547-14.541 18.739-18.33 5.837-2.765 8.090-3.277 15.053-3.277 9.216-0.102 16.486 1.946 22.221 6.042 1.946 1.434 26.522 25.6 54.682 53.76l51.2 51.2 30.822-30.822 30.822-30.72-225.485-225.485c-244.838-244.941-229.888-229.274-231.731-242.893-2.253-16.896 6.554-33.075 21.811-40.038 7.27-3.379 12.902-4.198 20.992-3.277 13.722 1.638 5.222-6.246 160.154 148.685l142.234 142.131 68.403-68.403c37.581-37.581 68.198-68.608 67.994-68.915-0.307-0.205-38.605-0.512-85.197-0.512-84.070-0.205-84.787-0.205-90.214-2.355-16.179-6.554-25.498-20.992-24.576-38.4 1.024-18.637 15.36-33.69 33.997-35.533 3.482-0.307 64.512-0.614 135.782-0.512 145.203 0.102 135.373-0.41 146.739 7.475 15.667 10.957 20.582 34.304 10.65 50.586-1.331 2.15-37.274 38.81-79.872 81.408-42.598 42.701-77.517 77.824-77.517 78.234s19.251 19.866 42.803 43.418l42.701 42.701 1.024-96.051 2.97-5.939c5.018-10.342 13.517-17.715 24.474-21.197 3.072-0.922 26.726-1.229 98.918-1.229 52.224 0 96.563 0.307 98.509 0.717 18.944 4.096 31.949 21.709 30.208 40.858-1.229 13.824-9.318 25.395-22.016 31.642l-6.758 3.277-149.914 0.614-0.614 124.314-3.174 6.656c-2.97 6.144-10.547 14.029-96.256 99.738-51.2 51.098-95.027 94.31-97.382 95.949-8.192 5.632-20.89 7.373-32.051 4.403z" />
+<glyph unicode="&#xeaf1;" glyph-name="Scales" d="M213.402 830.464c-26.419-4.813-48.947-18.432-64.41-38.912-8.704-11.571-13.926-22.63-18.637-39.424-1.741-6.349-1.843-19.661-1.843-304.128v-297.472l2.765-9.933c9.523-34.509 35.021-61.235 68.915-71.987 4.403-1.331 11.366-2.97 15.565-3.584 5.12-0.717 102.912-1.024 296.653-1.024 318.054 0 297.267-0.41 316.006 6.246 4.813 1.638 11.981 4.915 15.872 7.27 24.064 14.131 40.141 34.816 48.23 62.259l2.97 9.728 0.307 292.352c0.307 218.522 0 294.502-0.819 301.056-5.12 37.274-28.979 67.891-63.59 81.818-3.174 1.229-9.216 3.277-13.312 4.506l-7.578 2.253-294.912 0.102c-236.749 0.205-296.346 0-302.182-1.126zM549.376 753.254c52.838-6.451 103.526-24.781 145.408-52.634 5.837-3.891 24.986-17.92 26.112-19.149 0.307-0.307 3.482-3.072 7.168-6.042 21.914-18.432 54.784-55.808 60.109-68.506 3.584-8.499 1.126-20.685-5.632-27.341-1.638-1.638-10.342-7.27-19.251-12.39-9.011-5.222-33.792-19.558-55.194-31.949-50.79-29.286-46.694-27.238-55.296-27.238-9.421 0-13.517 2.15-22.016 11.776-10.138 11.571-14.131 15.36-23.142 22.63-21.299 17.101-47.309 28.262-75.469 32.358-9.83 1.331-37.478 0.717-47.309-1.229-34.099-6.554-63.283-22.63-85.504-47.002-11.878-13.107-14.643-15.462-19.968-17.203-7.578-2.355-14.029-1.536-22.528 3.072-3.891 2.15-20.48 11.674-36.864 21.094-16.282 9.421-39.014 22.528-50.381 29.082-27.443 15.77-29.184 17.101-32.563 24.064-2.458 4.915-2.765 6.656-2.355 12.8 0.307 6.349 0.819 7.68 5.12 14.131 13.517 20.378 42.189 51.098 63.795 68.301 13.107 10.445 32.563 23.45 47.309 31.744 18.125 10.24 47.104 22.323 65.843 27.648 3.072 0.819 8.192 2.355 11.264 3.174 6.144 1.741 22.323 5.12 29.696 6.144 2.56 0.307 5.325 0.819 6.144 1.024 2.15 0.512 11.264 1.638 20.992 2.56 11.366 1.024 53.35 0.41 64.512-0.922zM629.658 696.013c-5.427-4.403-24.781-19.661-43.008-33.997s-39.629-31.13-47.514-37.376c-7.885-6.246-17.715-14.029-21.914-17.203l-7.475-5.837 4.915-0.102c6.861 0 16.691-0.717 20.378-1.331 1.741-0.307 4.915-0.819 7.168-1.229 27.034-4.096 58.368-18.022 80.896-36.045 3.994-3.174 9.318-7.782 12.083-10.342l4.813-4.506v78.029c0 42.803-0.102 77.926-0.205 77.824-0.205 0-4.71-3.584-10.138-7.885z" />
+<glyph unicode="&#xeaf2;" glyph-name="scan_ticket" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM348.16 570.88v-30.72h20.48v40.96h40.96v20.48h-61.44v-30.72zM614.4 591.36v-10.24h40.96v-40.96h20.48v61.44h-61.44v-10.24zM399.36 478.72v-71.68h20.48v143.36h-20.48v-71.68zM430.080 478.72v-71.68h40.96v143.36h-40.96v-71.68zM491.52 478.72v-71.68h20.48v143.36h-20.48v-71.68zM532.48 478.72v-71.68h10.24v143.36h-10.24v-71.68zM552.96 478.72v-71.68h20.48v143.36h-20.48v-71.68zM583.68 478.72v-71.68h40.96v143.36h-40.96v-71.68zM348.16 386.56v-30.72h61.44v20.48h-40.96v40.96h-20.48v-30.72zM655.36 396.8v-20.48h-40.96v-20.48h61.44v61.44h-20.48v-20.48zM76.8 614.605v-89.293l7.885-1.331c20.275-3.174 36.454-18.022 41.779-38.195 2.048-7.475 1.229-22.221-1.434-29.389-6.861-18.432-23.142-31.232-42.291-33.485l-5.939-0.717v-178.995h153.6v460.8h-153.6v-89.395zM793.6 473.6v-230.4h153.6v179.2l-3.072 0.102c-1.638 0.102-3.379 0.205-3.789 0.307-0.512 0.102-2.662 0.512-4.813 1.024-21.197 4.198-39.424 26.829-39.526 48.947 0 25.6 18.33 47.206 43.418 51.2l7.782 1.331v178.688h-153.6v-230.4z" />
+<glyph unicode="&#xeaf3;" glyph-name="School" d="M501.555 746.803c-10.854-8.602-54.374-43.315-57.139-45.568-0.819-0.717-14.643-11.878-30.72-24.678l-29.184-23.347-0.307-25.805-0.205-25.805-230.707-0.512-38.195-63.795-38.298-63.693v-384h-25.6v-25.6h921.6v25.6h-25.6v384l-38.298 63.693-38.195 63.795-230.707 0.512v50.79l-2.765 2.56c-1.638 1.434-4.096 3.482-5.53 4.608-2.765 2.048-20.48 16.077-32.666 26.010-3.789 3.072-11.059 8.806-15.974 12.8-5.018 3.891-9.318 7.373-9.626 7.68-0.512 0.512-7.987 6.554-16.691 13.312-1.843 1.434-10.138 8.090-18.534 14.848s-17.613 14.234-20.685 16.589l-5.427 4.403-10.547-8.397zM528.896 573.030c34.406-12.186 45.363-55.603 20.89-82.432-9.216-10.138-20.173-15.462-33.69-16.589-23.757-2.048-43.213 11.162-53.248 35.942-0.717 1.741-1.434 7.475-1.638 12.8-0.205 7.987 0.102 11.059 2.048 17.101 5.734 17.51 19.661 30.72 36.659 34.611 8.602 1.946 21.197 1.331 28.979-1.434zM230.4 358.4v-38.4h-76.8v76.8h76.8v-38.4zM384 358.4v-38.4h-76.8v76.8h76.8v-38.4zM563.2 358.4v-38.4h-102.4v76.8h102.4v-38.4zM716.8 358.4v-38.4h-76.8v76.8h76.8v-38.4zM870.4 358.4v-38.4h-76.8v76.8h76.8v-38.4zM230.4 204.8v-38.4h-76.8v76.8h76.8v-38.4zM384 204.8v-38.4h-76.8v76.8h76.8v-38.4zM522.957 241.766c19.046-4.096 35.123-20.275 39.117-39.322 0.717-3.584 1.126-23.962 1.126-59.085v-53.76h-102.4v53.76c0 35.226 0.41 55.501 1.126 59.085 1.946 9.421 6.758 18.125 14.131 25.498 12.902 12.902 29.082 17.613 46.899 13.824zM716.8 204.8v-38.4h-76.8v76.8h76.8v-38.4zM870.4 204.8v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xeaf4;" glyph-name="Science" d="M323.686 855.859c-9.011-3.174-16.486-14.029-16.486-23.859 0-8.499 5.53-17.818 13.21-22.323 4.506-2.662 5.427-2.765 21.402-3.174l16.589-0.307v-230.502l-8.909-14.95c-4.813-8.192-10.854-18.33-13.312-22.323-2.355-4.096-4.403-7.68-4.403-7.987s-0.922-1.843-1.946-3.379c-1.024-1.536-13.005-21.811-26.624-44.954-54.272-92.979-74.138-126.874-75.776-129.331-0.819-1.434-2.15-3.686-2.97-5.018-1.126-2.253-18.33-31.437-30.925-52.838-2.662-4.506-5.837-9.83-6.963-11.776s-8.090-13.926-15.565-26.624c-7.373-12.698-17.51-29.901-22.426-38.195-4.813-8.294-9.523-16.384-10.445-17.92s-3.277-5.53-5.222-8.909c-1.946-3.379-7.782-13.312-13.005-22.016-11.981-20.173-14.95-26.214-17.51-36.25-8.806-34.406 9.011-71.782 41.677-87.347 3.994-1.946 9.728-4.301 12.8-5.222 5.018-1.536 31.539-1.741 351.539-1.946 290.918-0.205 347.238 0 353.28 1.126 28.877 5.734 52.326 27.648 59.392 55.603 2.458 9.83 2.56 10.445 2.662 20.275 0 9.626-2.355 21.197-6.042 29.491-1.024 2.355-10.65 19.046-21.197 37.069s-23.040 39.219-27.648 47.104c-23.962 40.96-41.779 71.373-97.587 166.4-4.813 8.192-11.981 20.378-15.872 27.136-3.994 6.758-8.397 14.336-9.933 16.896s-10.138 17.101-18.944 32.256c-8.909 15.258-20.787 35.533-26.419 45.056-5.632 9.626-13.414 22.938-17.408 29.696s-9.421 15.974-12.186 20.582l-4.915 8.294v230.605l16.179 0.307c14.746 0.307 16.486 0.512 21.094 2.867 20.173 10.342 17.613 40.141-4.096 46.694-4.096 1.229-32.768 1.434-187.699 1.331-162.918 0-183.398-0.205-187.392-1.638zM614.4 684.237v-122.163l25.19-42.906c13.824-23.654 28.262-48.333 32.154-54.784 3.789-6.451 7.885-13.414 9.011-15.36s5.018-8.602 8.602-14.848c3.686-6.144 13.005-22.118 20.787-35.328 7.68-13.21 14.438-24.474 14.95-25.088 0.512-0.512 0.922-1.331 0.922-1.741s-15.565-0.819-34.611-0.819h-34.611l-1.843 3.686c-7.578 15.872-27.034 33.587-44.851 40.653-13.21 5.325-18.637 6.349-34.611 6.246-13.107-0.102-15.872-0.41-24.064-2.867-22.323-6.758-43.725-23.654-53.35-42.086l-2.97-5.632h-98.509c-54.272 0-98.611 0.41-98.611 0.819s0.41 1.229 0.922 1.741c0.819 0.922 25.498 42.701 46.080 78.131 3.686 6.349 7.475 12.8 8.397 14.336s8.806 15.053 17.613 30.003c8.704 14.95 20.992 35.84 27.238 46.387l11.366 19.251v244.531h204.8v-122.163zM513.536 702.259c-10.547-3.379-18.227-10.138-23.347-20.787-2.97-5.939-3.277-7.578-3.277-15.872 0-8.192 0.41-9.933 3.277-15.872 7.168-14.848 18.637-22.016 35.123-22.016 7.68 0 9.523 0.41 15.36 3.174 10.854 5.325 17.613 13.107 20.89 24.166 6.861 23.654-10.035 47.309-34.816 48.435-5.53 0.307-9.728-0.102-13.21-1.229zM483.738 573.952c-23.859-6.246-42.086-25.088-46.899-48.435-3.174-15.258-1.434-28.467 5.734-42.701 19.354-38.4 71.27-46.49 101.683-15.872 24.883 25.088 25.19 64.614 0.717 89.395-16.179 16.486-39.834 23.245-61.235 17.613z" />
+<glyph unicode="&#xeaf5;" glyph-name="Scissors" d="M211.968 805.376c-9.626-1.126-26.829-5.53-36.352-9.114-51.917-20.070-88.781-65.946-97.178-121.139-1.536-9.523-1.536-37.274-0.102-44.851 3.686-19.456 7.578-31.744 14.438-45.363 11.469-22.938 27.238-41.677 47.206-56.115 4.608-3.379 37.683-22.835 73.421-43.315 47.821-27.341 64.819-37.478 63.898-38.298-0.717-0.512-2.97-1.946-4.915-2.97-1.946-1.126-14.438-8.294-27.648-15.872s-26.112-14.95-28.672-16.384c-29.594-16.486-69.734-40.141-76.186-44.646-30.925-22.221-53.35-58.061-60.621-96.973-2.867-14.95-2.56-43.213 0.512-57.242 13.414-62.157 58.778-107.315 120.73-120.525 12.595-2.765 38.707-3.482 51.405-1.434 65.843 10.24 115.61 57.446 129.024 122.368 2.97 14.131 3.686 38.605 1.434 51.712-4.301 26.214-13.517 48.845-27.853 68.403-2.15 2.97-4.198 5.837-4.608 6.554-0.512 0.717 2.56 2.97 8.192 6.144 5.018 2.765 10.854 6.144 13.107 7.373 9.114 5.222 84.378 48.333 120.32 68.915 21.094 12.083 40.448 23.142 43.008 24.576 9.83 5.53 58.982 33.69 60.416 34.611 0.819 0.512 2.97 1.741 4.608 2.662 1.741 0.922 22.221 12.698 45.67 26.112s44.134 25.19 46.080 26.317c1.946 1.126 33.894 19.354 71.066 40.653s69.222 39.629 71.168 40.755c1.946 1.126 9.83 5.53 17.408 9.933s15.462 8.806 17.408 9.933c19.763 11.162 103.117 59.085 103.731 59.597 0.819 0.819-7.168 12.8-13.824 20.685-4.71 5.632-17.818 16.998-25.6 22.221-23.45 15.872-56.115 23.757-85.094 20.48-19.763-2.253-33.997-7.373-56.525-20.275-5.632-3.277-12.083-6.963-14.336-8.192-3.277-1.843-64-36.557-129.536-74.035-5.939-3.482-13.722-7.885-17.408-9.933s-27.341-15.667-52.736-30.208c-25.293-14.541-47.411-27.136-49.152-28.16-1.638-0.922-29.491-16.794-61.747-35.226l-58.573-33.587-29.286 16.589c-28.467 16.282-29.082 16.691-27.546 18.842 23.245 32.461 33.792 63.181 33.178 97.28-1.331 74.24-51.917 134.451-125.85 149.709-8.704 1.843-35.942 2.662-46.080 1.434zM241.664 728.576c9.523-1.638 11.162-2.048 16.179-3.994 31.539-12.493 51.507-43.827 48.947-77.107-1.946-27.136-17.92-51.098-42.086-63.59-4.506-2.253-15.667-5.837-20.992-6.656-8.806-1.331-24.781-0.717-32.256 1.229-26.829 7.066-48.23 28.262-55.398 54.886-2.048 7.885-2.765 24.781-1.331 32.768 4.608 24.883 21.504 46.285 45.056 57.139 11.981 5.427 28.877 7.68 41.882 5.325zM246.989 317.952c34.918-7.68 59.597-38.093 60.006-73.83 0.41-35.328-22.426-65.331-57.139-75.264-9.114-2.56-29.491-2.56-38.912 0-45.363 12.493-69.325 61.235-51.098 104.243 14.234 33.894 51.098 52.838 87.142 44.851zM557.568 430.797c-1.741-0.922-5.12-2.97-7.68-4.403-2.56-1.536-6.246-3.686-8.192-4.71-10.342-5.837-107.11-61.133-107.52-61.44-0.307-0.307 0.205-0.922 1.024-1.434 2.048-1.229 150.835-86.528 156.672-89.805 2.56-1.434 28.365-16.179 57.344-32.768 54.682-31.334 78.848-45.158 84.992-48.64 1.946-1.024 9.318-5.325 16.384-9.421 7.066-3.994 14.848-8.499 17.408-9.933s11.264-6.451 19.456-11.059c18.637-10.65 27.034-14.643 38.4-17.92 52.838-15.258 110.49 5.018 141.107 49.664l5.939 8.704-2.253 1.536c-1.229 0.819-4.813 2.97-7.987 4.71s-36.147 20.582-73.318 41.882c-37.171 21.299-70.554 40.448-74.24 42.496s-40.243 23.040-81.408 46.592c-41.062 23.552-76.39 43.725-78.336 44.851-3.379 1.843-9.318 5.222-24.576 14.131-36.147 20.787-68.096 38.81-69.018 38.707-0.614 0-2.56-0.819-4.198-1.741z" />
+<glyph unicode="&#xeaf6;" glyph-name="sd_card" d="M230.093 806.4l-76.493-76.595v-336.282c0-281.498 0.307-336.998 1.434-341.504 4.915-18.33 18.944-32.768 36.352-37.376 6.349-1.638 26.522-1.741 306.381-1.741 210.944-0.102 301.363 0.205 305.664 1.024 16.794 3.072 31.437 15.565 38.605 32.87l2.253 5.427 0.307 392.192c0.205 302.592 0 393.523-0.922 397.824-4.301 19.763-20.275 35.84-39.629 39.834-3.891 0.819-75.571 1.126-251.392 1.024h-245.965l-76.595-76.698zM384 755.2v-76.8h-76.8v153.6h76.8v-76.8zM486.4 755.2v-76.8h-76.8l0.102 76.8v76.8h76.698v-76.8zM588.8 755.2v-76.8h-76.8v153.6h76.8v-76.8zM691.2 755.2v-76.8h-76.8v153.6h76.8v-76.8zM793.6 755.2v-76.8h-76.8v153.6h76.8v-76.8zM281.6 652.8v-76.8h-76.8v153.6h76.8v-76.8z" />
+<glyph unicode="&#xeaf7;" glyph-name="SD_card_1" d="M312.832 855.142c-10.138-3.379-15.974-6.963-22.426-14.029-6.451-6.963-11.264-16.179-12.8-24.883-0.819-4.198-1.126-54.374-1.126-161.69 0-122.982-0.307-155.75-1.229-156.774-1.946-1.946-24.474-26.010-27.341-29.184-1.331-1.434-5.018-5.427-8.192-8.806s-12.39-13.21-20.378-21.709l-14.643-15.667 0.41-149.197c0.307-139.674 0.41-149.709 2.15-155.443 3.482-11.878 4.813-15.462 8.909-23.347 12.186-24.064 34.099-42.906 58.982-50.688 17.306-5.53 5.632-5.222 237.363-5.222 209.306 0 215.245 0 224.256 1.946 20.992 4.506 37.478 13.312 51.917 27.75 13.312 13.21 22.426 29.184 27.75 48.538l2.253 8.192v345.6c0 329.728-0.102 345.907-1.843 351.437-5.325 16.691-21.094 30.925-38.4 34.509-3.891 0.819-70.349 1.126-231.936 1.126l-226.509-0.102-7.168-2.355zM419.84 706.56v-89.6h-81.92v179.2h81.92v-89.6zM532.48 706.56v-89.6h-81.92v179.2h81.92v-89.6zM645.12 706.56v-89.6h-81.92v179.2h81.92v-89.6zM757.76 706.56v-89.6h-81.92v179.2h81.92v-89.6z" />
+<glyph unicode="&#xeaf8;" glyph-name="search" d="M402.33 857.19c-0.205-0.205-4.301-0.614-9.114-1.024-21.709-1.638-49.050-7.373-71.782-14.95-88.883-29.594-160.461-96.768-195.789-183.808-14.95-36.966-22.118-72.806-22.733-114.688-0.512-32.358 2.048-54.784 9.318-83.763 16.179-64.41 52.736-122.675 104.346-166.298 32.154-27.238 71.373-48.538 112.128-61.030 17.408-5.325 39.117-9.933 53.76-11.469 3.379-0.41 7.27-0.922 8.704-1.229 6.656-1.229 48.538-1.126 61.542 0.205 54.067 5.427 103.117 22.835 146.637 51.917l9.011 6.042 117.146-117.146c73.728-73.728 118.579-117.862 121.037-119.091 5.632-2.765 16.896-2.56 22.323 0.307 4.71 2.458 46.592 44.032 49.869 49.459s3.482 15.565 0.41 22.118c-1.946 4.096-23.654 26.317-119.296 121.958l-116.941 116.941 6.042 9.011c27.034 40.448 45.466 90.010 50.893 137.011 0.307 2.867 1.024 8.602 1.536 12.8 0.922 8.090 0.512 52.941-0.512 59.904-0.307 2.253-1.331 8.909-2.15 14.848-14.234 101.581-80.384 192.205-174.182 239.002-31.027 15.462-68.198 26.829-101.171 30.822-2.765 0.307-6.758 0.819-8.704 1.126-3.994 0.614-51.712 1.536-52.326 1.024zM450.048 753.664c50.176-7.578 91.75-28.058 125.952-62.362 34.509-34.611 55.398-77.005 62.464-126.566 1.126-8.294 1.434-42.291 0.41-50.688-4.506-36.557-16.077-67.789-36.045-97.792-34.816-52.326-93.491-88.064-155.648-94.925-9.523-1.024-41.062-1.024-50.381 0.102-24.678 2.765-55.603 12.595-77.312 24.474-63.693 34.918-106.701 98.816-113.459 168.653-1.331 13.926-0.717 42.803 1.126 54.784 11.059 71.885 54.477 131.277 119.296 163.328 24.269 11.981 48.742 18.944 77.005 21.811 5.222 0.512 41.779-0.102 46.592-0.819z" />
+<glyph unicode="&#xeaf9;" glyph-name="Send" d="M77.21 881.459c0.307-1.024 2.662-9.626 5.222-19.251 5.734-21.709 7.68-28.774 12.8-48.128 2.253-8.397 5.12-19.046 6.246-23.552 1.229-4.506 3.072-11.162 4.096-14.848s3.174-11.981 4.915-18.432c1.638-6.451 3.994-15.36 5.12-19.661 1.229-4.403 3.072-11.571 4.198-15.872 3.891-14.848 12.493-46.899 14.336-53.555 2.15-7.782 4.301-15.872 11.264-42.189 2.867-10.65 7.475-27.853 10.24-38.4 2.867-10.65 6.963-26.112 9.216-34.611 10.957-41.165 14.234-52.941 14.643-53.35s18.227-2.253 48.845-5.018c3.686-0.41 13.107-1.331 20.992-2.15 12.493-1.229 33.69-3.174 54.272-5.018 3.379-0.307 8.192-0.819 10.752-1.024 2.56-0.307 6.963-0.717 9.728-1.024 2.867-0.307 7.168-0.717 9.728-1.024 2.56-0.205 7.885-0.717 11.776-1.024 3.994-0.307 9.011-0.819 11.264-1.024 2.253-0.307 9.626-0.922 16.384-1.536s13.926-1.331 15.872-1.536c1.946-0.205 6.349-0.614 9.728-0.922 7.475-0.717 45.158-4.301 59.904-5.734 15.36-1.536 19.046-1.843 27.648-2.56 4.198-0.307 9.114-0.819 10.752-1.024 1.741-0.205 6.042-0.717 9.728-1.024s8.499-0.819 10.752-1.024c4.506-0.512 45.568-4.301 55.296-5.12 3.379-0.307 8.192-0.819 10.752-1.126 7.885-1.024 9.523-1.229 18.944-1.946 5.12-0.307 10.342-0.819 11.776-1.024s8.602-0.922 15.872-1.536c7.373-0.614 14.746-1.331 16.384-1.536 1.741-0.205 6.963-0.717 11.776-1.024s9.728-0.819 10.854-1.024c1.229-0.307 5.632-0.717 9.728-1.024 4.198-0.307 9.011-0.717 10.65-1.024 1.741-0.205 7.373-0.717 12.595-1.126 5.12-0.307 9.421-1.024 9.421-1.434 0-0.307-0.614-0.717-1.229-0.717-2.765-0.102-17.818-1.434-20.275-1.843-1.434-0.205-6.246-0.717-10.752-1.024s-9.83-0.819-11.776-1.024c-4.096-0.512-10.752-1.229-20.48-2.048-3.686-0.307-11.059-1.024-16.384-1.536s-12.698-1.229-16.384-1.536c-3.686-0.307-8.294-0.819-10.24-1.024s-9.318-0.922-16.384-1.536c-7.066-0.614-14.438-1.331-16.384-1.536s-6.349-0.614-9.728-0.922c-9.421-0.922-38.298-3.584-43.52-4.198-2.56-0.205-9.626-0.922-15.872-1.536-6.144-0.614-13.414-1.331-15.974-1.536-2.56-0.307-10.342-0.922-17.408-1.536-6.963-0.614-13.824-1.331-15.258-1.536s-6.656-0.717-11.776-1.126c-5.018-0.307-10.035-0.819-11.059-1.024s-5.427-0.614-9.728-0.922c-4.301-0.307-9.523-0.819-11.469-1.024-1.946-0.307-6.758-0.717-10.752-1.024-3.891-0.307-8.294-0.819-9.728-1.024s-6.246-0.717-10.752-1.024c-4.506-0.307-9.318-0.819-10.752-1.024s-6.042-0.717-10.24-1.024c-4.198-0.307-9.318-0.819-11.264-1.024s-9.114-0.922-15.872-1.536c-6.758-0.614-14.131-1.331-16.384-1.536-2.253-0.307-9.114-0.922-15.36-1.536-15.667-1.331-54.17-4.915-60.928-5.632-5.53-0.614-7.475-0.819-20.48-2.048-3.686-0.41-8.499-0.819-10.752-1.024s-7.27-0.717-11.264-1.024c-10.138-0.922-15.155-1.536-15.667-2.048-0.41-0.41-13.414-48.538-22.733-83.968-2.253-8.602-13.824-51.917-34.714-130.048-8.397-31.539-17.92-67.277-21.094-79.36-3.277-12.083-9.728-36.25-14.336-53.76s-8.704-32.768-9.011-33.997c-0.41-1.843 78.336 37.171 434.074 215.040 239.002 119.501 434.586 217.498 434.586 217.805s-195.686 98.304-434.79 217.907c-293.888 146.944-434.586 216.781-434.176 215.552z" />
+<glyph unicode="&#xeafa;" glyph-name="Send_to_person" d="M482.918 882.074c-73.626-11.674-131.379-63.078-151.142-134.554-5.427-19.661-7.373-49.971-4.608-71.27 9.421-72.909 63.386-135.373 133.018-153.907 19.456-5.222 31.232-6.758 50.995-6.758 13.107-0.102 15.872 0.205 31.027 2.662 60.928 10.138 114.278 52.941 138.445 111.002 25.907 62.259 15.36 134.144-27.443 186.88-24.883 30.822-62.874 54.682-99.942 63.078-22.63 5.018-49.664 6.144-70.349 2.867zM338.842 523.674c-22.528-13.619-48.947-37.171-64.102-57.242-27.75-36.762-42.496-75.366-46.899-122.368-0.205-2.253-0.41-8.602-0.41-14.029l-0.102-10.035h-29.901c-23.142 0-31.539-0.41-36.557-1.536-19.046-4.506-33.28-17.101-40.55-35.84-1.946-4.813-2.048-7.987-2.048-58.368 0-49.766 0.102-53.658 1.946-58.88 6.144-17.715 19.046-30.413 37.171-36.557 3.994-1.331 10.854-1.741 37.478-2.048l32.461-0.41 0.102-8.909c0-11.776 0.614-16.384 3.482-27.341 7.578-28.877 26.726-52.634 53.453-66.253 4.915-2.56 11.571-5.325 14.643-6.349 16.077-4.813 5.632-4.608 256.819-4.71h235.725l-0.102 164.045c-0.102 171.725-0.102 173.875-4.506 195.482-12.39 60.416-48.538 113.357-100.864 147.558-5.939 3.891-11.776 7.27-13.107 7.68-1.741 0.41-3.686-0.614-7.987-4.403-43.008-37.376-96.563-57.754-152.474-58.163-40.858-0.205-73.933 7.373-109.261 25.088-16.384 8.192-38.195 22.938-49.459 33.382-6.246 5.837-5.53 5.837-14.95 0.205zM420.659 273.101c31.642-31.334 32.461-32.563 32.461-47.821-0.102-16.691 3.686-12.083-72.192-87.859l-66.56-66.355v83.046h-72.192c-69.427 0-72.294 0.102-77.517 2.048-6.451 2.458-13.107 8.602-16.384 15.155-2.355 4.813-2.355 5.018-2.662 52.736l-0.307 48.026 2.458 5.222c2.97 6.349 7.475 11.059 13.926 14.234l4.71 2.355 147.968 0.614v84.070l39.731-39.424c21.811-21.709 51.712-51.405 66.56-66.048z" />
+<glyph unicode="&#xeafb;" glyph-name="Server" d="M93.286 855.859c-2.56-0.922-6.451-3.584-8.909-6.042-7.782-8.090-7.578-5.53-7.578-81.818 0-60.416 0.205-68.301 1.741-72.704 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.099-1.638 380.621 0 413.696 0.102 418.304 1.638 5.222 1.843 11.571 7.373 14.541 12.902 1.741 3.174 1.843 8.192 2.15 72.909 0.307 75.878 0.41 74.24-5.53 82.022-1.536 2.048-4.915 4.915-7.475 6.451l-4.71 2.765-415.744 0.205c-374.886 0.102-416.154 0-420.25-1.434zM182.272 802.611c8.499-3.994 14.848-10.342 18.842-18.739 2.765-5.837 3.072-7.782 3.174-15.872 0-8.294-0.307-9.933-3.174-15.872-4.096-8.499-10.445-14.848-18.842-18.842-5.939-2.765-7.68-3.174-15.872-3.174s-9.933 0.307-15.872 3.174c-17.101 8.090-26.112 27.443-21.094 44.851 5.12 17.613 19.968 28.365 38.502 27.853 6.246-0.102 8.909-0.717 14.336-3.379zM93.286 651.059c-2.56-0.922-6.451-3.584-8.909-6.042-7.782-8.090-7.578-5.53-7.578-81.818 0-60.416 0.205-68.301 1.741-72.704 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.099-1.638s413.798 0.102 418.099 1.638c2.765 0.922 6.758 3.482 9.318 6.042 7.987 7.68 7.782 5.837 7.782 81.818 0 36.659-0.512 68.506-1.024 70.656-1.229 5.632-6.042 11.878-11.776 15.462l-4.915 3.072-415.846 0.205c-374.989 0.102-416.256 0-420.352-1.434zM182.374 597.811c8.397-3.994 14.746-10.342 18.739-18.739 2.765-5.939 3.174-7.68 3.174-15.872s-0.307-9.933-3.174-15.872c-14.336-29.798-55.296-29.798-69.427 0-2.765 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c9.318 19.558 31.642 27.75 50.688 18.739zM93.286 446.259c-4.915-1.741-11.264-7.475-14.131-12.8-1.741-3.174-1.843-7.885-1.843-74.547v-71.168l2.355-4.813c2.662-5.427 8.602-10.65 14.336-12.698 3.072-1.126 38.195-1.331 185.344-1.434h181.453v-128h-40.346c-43.622 0-45.261-0.205-52.531-5.734-1.843-1.331-4.608-4.71-6.144-7.373l-2.867-4.813v-92.16l2.765-4.71c3.174-5.427 8.192-9.626 14.234-11.674 6.144-2.253 264.294-2.253 271.462-0.102 6.246 1.843 11.571 6.042 14.95 11.776l2.765 4.71 0.307 43.725c0.205 28.262-0.102 45.158-0.717 47.718-1.638 5.734-6.451 11.981-12.083 15.258l-4.915 2.867-84.48 0.614v127.898h181.043c203.571 0 186.982-0.614 195.379 7.782 7.68 7.68 7.578 6.042 7.578 82.432 0 73.011 0.102 71.68-5.734 79.36-1.536 1.946-4.915 4.813-7.475 6.349l-4.71 2.765-415.744 0.205c-373.043 0.102-416.154 0-420.25-1.434zM182.374 393.011c8.294-3.891 14.541-10.138 18.739-18.739 2.867-5.939 3.174-7.578 3.174-15.872-0.102-8.090-0.41-10.035-3.174-15.872-3.994-8.397-10.342-14.746-18.842-18.842-5.939-2.765-7.68-3.174-15.872-3.174s-9.933 0.307-15.872 3.174c-8.499 3.994-14.848 10.342-18.842 18.842-2.765 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c9.318 19.558 31.539 27.75 50.688 18.739zM76.8 76.8v-38.4h256v76.8h-256v-38.4zM691.2 76.8v-38.4h256v76.8h-256v-38.4z" />
+<glyph unicode="&#xeafc;" glyph-name="servers" d="M93.286 804.659c-2.56-0.922-6.451-3.584-8.909-6.042-7.885-8.192-7.578-4.096-7.578-94.72 0-87.552-0.205-84.89 5.734-92.672 1.536-1.946 4.915-4.813 7.475-6.349l4.71-2.765 415.232-0.307c376.218-0.205 415.642-0.102 420.045 1.434 6.554 2.15 13.312 8.806 15.462 15.258 1.536 4.506 1.741 13.21 1.741 85.606 0 87.552 0.205 84.89-5.734 92.672-1.536 1.946-4.915 4.813-7.475 6.349l-4.71 2.765-415.744 0.205c-374.989 0.102-416.154 0-420.25-1.434zM196.506 752.128c11.059-4.301 22.938-14.234 27.443-22.938 10.854-21.094 7.475-44.954-8.806-61.030-16.486-16.384-40.038-19.866-60.518-9.114-11.674 6.144-22.733 21.094-25.498 34.509-5.53 26.624 11.674 53.76 38.093 60.211 7.68 1.843 22.528 1.024 29.286-1.638zM702.874 726.528c19.661-10.035 17.613-39.219-3.277-46.694-3.072-1.126-40.755-1.331-199.987-1.434-220.774 0-202.138-0.717-210.432 7.885-5.427 5.632-8.090 12.8-7.27 20.275 0.717 6.656 2.765 10.752 7.987 15.872 7.885 7.578-9.318 7.066 210.33 6.861l197.632-0.205 5.018-2.56zM804.864 727.040c5.12-2.662 10.854-9.114 12.595-14.131 1.946-5.939 1.638-15.462-0.717-19.968-6.861-13.21-23.552-18.227-36.045-10.957-18.432 10.854-15.872 38.4 4.301 46.080 4.915 1.843 15.36 1.331 19.866-1.024zM879.104 727.859c15.053-5.12 21.504-24.269 12.595-37.581-3.686-5.632-7.578-8.602-13.824-10.445-6.144-1.843-10.138-1.843-16.179 0.307-15.053 5.12-21.504 24.269-12.595 37.581 6.861 10.445 18.125 14.234 30.003 10.138zM93.286 548.659c-2.458-0.922-6.451-3.584-8.806-5.939-7.987-7.987-7.68-3.994-7.68-94.822 0-87.552-0.205-84.89 5.734-92.672 1.536-1.946 4.915-4.813 7.475-6.349l4.71-2.765 414.72-0.307c315.29-0.205 415.744 0 419.123 0.922 6.144 1.741 11.878 6.144 15.258 11.878l2.867 4.915 0.307 82.33c0.307 92.877 0.614 88.474-7.475 96.768-8.294 8.602 35.328 7.782-428.442 7.68-371.61 0-413.696-0.205-417.792-1.638zM194.458 496.64c30.515-9.728 44.339-42.906 30.106-72.192-3.789-7.782-14.438-18.125-22.938-22.323-19.763-9.626-42.803-5.734-58.368 9.933-20.378 20.378-20.378 51.507 0 71.885 13.926 13.926 32.666 18.534 51.2 12.698zM699.699 471.962c6.758-2.253 13.312-8.909 15.565-15.77 3.379-10.138 0-22.016-7.987-28.058-7.987-6.144 5.632-5.734-207.974-5.734-219.136 0-201.728-0.614-209.715 7.373-6.042 6.042-8.294 12.186-7.578 20.173 0.614 7.578 3.891 13.824 9.318 17.92 7.782 5.939-5.427 5.632 207.462 5.632 177.050 0.102 196.608-0.102 200.909-1.536zM805.786 470.323c21.402-11.059 15.155-44.442-8.806-47.514-24.781-3.072-38.707 27.443-20.378 44.544 6.758 6.349 19.968 7.68 29.184 2.97zM878.694 472.064c9.523-3.379 15.974-11.469 16.998-21.197 2.458-23.859-26.317-37.683-43.213-20.787-11.366 11.366-9.728 29.696 3.482 38.81 6.758 4.71 15.053 5.837 22.733 3.174zM93.286 292.659c-6.144-2.15-12.698-9.011-14.848-15.36-1.536-4.506-1.638-13.107-1.434-86.938l0.307-81.92 2.662-5.018c2.97-5.837 9.421-11.264 15.155-12.8 2.662-0.717 135.782-0.922 419.021-0.819l415.13 0.307 4.71 2.765c2.56 1.536 5.939 4.403 7.475 6.349 5.939 7.782 5.734 5.12 5.734 92.16 0 43.93-0.512 81.818-1.024 83.968-1.229 5.632-6.042 11.878-11.776 15.462l-4.915 3.072-415.846 0.205c-374.682 0.102-416.256 0-420.352-1.434zM195.584 240.333c8.602-3.072 14.541-6.861 20.173-12.8 19.763-20.89 19.456-51.405-0.614-71.475-17.408-17.408-44.544-20.070-64.41-6.349-19.354 13.312-27.238 37.069-19.661 59.085 5.427 15.77 18.637 28.058 35.43 32.87 6.758 2.048 21.709 1.331 29.082-1.331zM700.006 215.962c20.787-8.704 22.528-36.454 2.867-46.49l-5.018-2.56-197.12-0.307c-220.262-0.205-203.162-0.819-211.046 7.066-5.12 5.12-7.066 9.216-7.782 15.77-0.819 7.578 1.843 15.053 7.373 20.48 8.090 8.192-9.933 7.475 210.022 7.578 177.766 0.102 197.12-0.102 200.704-1.536zM801.894 216.064c9.523-3.379 15.565-10.957 16.794-21.094 0.922-7.27-0.614-12.698-5.018-18.534-10.752-14.131-33.075-12.698-42.086 2.662-11.776 20.173 8.294 44.646 30.31 36.966zM878.694 216.064c6.144-2.15 10.65-5.939 13.926-11.571 2.458-4.096 2.867-5.939 2.867-12.493s-0.512-8.499-2.867-12.493c-5.325-9.114-14.848-13.926-25.293-12.698-14.234 1.741-23.859 14.234-22.118 28.672 2.048 15.77 18.33 25.907 33.485 20.582z" />
+<glyph unicode="&#xeafd;" glyph-name="settings" d="M385.536 862.72c-16.486-3.482-37.683-11.366-59.392-22.016-35.123-17.306-47.002-32.051-42.598-52.736 0.614-2.97 3.482-11.264 6.451-18.33 6.758-16.691 9.011-25.395 9.114-34.918 0.102-16.282-8.192-32.563-25.293-49.562-17.306-17.306-33.075-25.19-50.074-25.19-9.216 0-16.998 1.946-29.696 7.168-24.064 10.138-33.28 11.366-43.93 6.246-10.752-5.222-22.528-20.582-33.382-43.418-15.155-31.949-22.528-56.832-22.118-75.059 0.41-18.022 7.066-25.702 31.232-35.738 18.33-7.68 23.859-10.957 31.744-18.33 12.39-11.776 17.51-27.443 17.613-53.043 0-18.432-1.843-28.365-7.782-40.243-7.168-14.438-17.818-22.426-43.008-32.256-23.552-9.318-31.334-19.866-29.901-40.755 2.15-29.901 26.010-85.709 44.851-104.858 6.758-6.758 13.824-10.342 21.606-10.854 7.578-0.614 12.39 0.717 30.515 7.987 8.192 3.277 16.282 6.246 17.92 6.554 1.741 0.307 4.198 0.922 5.632 1.229 3.174 0.614 14.95 0.614 18.33-0.102 13.21-2.56 27.136-11.264 41.37-25.6 16.179-16.384 24.064-32.051 24.371-48.026 0.102-10.854-2.048-18.842-11.469-41.062-3.891-9.318-4.301-11.059-4.403-19.456-0.102-7.782 0.307-10.035 2.458-14.234 6.554-13.312 25.907-26.624 58.88-40.346 46.694-19.456 72.499-20.378 85.299-2.97 4.301 5.734 5.018 7.27 11.878 23.654 9.933 23.757 19.149 33.69 37.069 40.243 17.818 6.451 49.050 6.144 66.662-0.512 17.51-6.656 26.214-16.794 37.171-43.213 8.704-20.89 13.926-27.136 26.010-30.925 16.486-5.12 45.978 2.048 85.299 20.685 22.938 10.854 38.195 22.63 43.315 33.28 5.018 10.342 3.994 19.661-4.301 39.424-7.578 18.125-8.499 21.811-8.499 34.816 0.102 10.547 0.307 12.493 2.97 18.944 9.626 23.45 37.069 48.742 59.29 54.477 13.312 3.379 22.835 1.843 47.821-8.090 14.95-5.939 16.384-6.349 24.576-6.349 7.27-0.102 9.523 0.307 13.824 2.458 10.957 5.427 22.016 19.866 32.768 42.394 14.438 30.106 22.016 54.17 22.63 71.475 0.512 14.234-2.867 23.040-11.264 29.696-5.325 4.198-6.554 4.915-25.19 12.902-23.45 10.035-30.515 16.589-40.038 37.171-2.15 4.813-4.198 19.968-4.198 31.642-0.102 34.304 10.138 53.76 34.202 65.331 3.584 1.741 11.059 5.018 16.691 7.373 22.426 9.421 28.672 16.691 29.901 34.202 1.126 17.101-9.011 50.483-24.474 80.896-14.131 27.648-26.931 40.346-41.984 41.37-7.475 0.614-12.493-0.717-28.467-7.168-16.794-6.861-25.293-9.011-34.816-9.011-16.998 0-32.563 8.090-50.586 26.214-11.776 11.776-19.046 23.245-22.528 35.226-1.741 5.939-2.355 17.92-1.126 23.040 1.638 6.963 4.71 15.872 8.499 25.088 6.042 14.234 7.68 20.787 7.168 28.058-0.512 7.987-3.686 14.541-10.445 21.504-8.192 8.397-15.155 12.902-34.918 22.528-35.942 17.613-66.048 25.6-82.944 22.118-14.541-2.97-19.968-9.216-30.72-35.328-4.301-10.445-8.294-17.92-12.698-23.347-11.059-13.926-29.901-21.197-55.398-21.402-32.154-0.205-51.61 8.602-63.386 28.672-2.253 3.789-6.451 12.595-9.318 19.661-2.97 7.066-6.963 15.258-8.909 18.227-9.011 13.414-23.040 17.306-45.875 12.493zM549.376 648.294c33.075-6.246 64.102-20.48 90.624-41.574 9.83-7.885 26.931-25.088 33.894-34.304 22.118-28.979 36.147-62.669 41.267-99.328 1.843-13.107 1.434-45.67-0.717-57.958-7.987-45.158-27.546-83.046-58.778-113.766-32.768-32.358-71.373-51.098-118.579-57.651-9.728-1.331-43.315-1.434-49.664-0.205-1.434 0.307-6.042 1.126-10.24 1.741-24.371 3.891-50.483 13.824-73.728 28.262-7.782 4.813-21.811 14.95-25.19 18.227-0.614 0.614-3.379 3.277-6.144 5.837-16.486 15.258-32.768 37.069-42.803 56.934-14.848 29.901-21.914 59.187-21.914 91.955 0.102 46.182 14.643 89.293 42.701 125.952 6.554 8.704 23.757 26.214 32.87 33.587 29.184 23.552 65.434 39.117 102.912 44.134 17.613 2.355 45.568 1.536 63.488-1.843z" />
+<glyph unicode="&#xeafe;" glyph-name="setup_and_repair" d="M864.051 872.141c-4.096-3.174-9.318-7.27-11.469-8.909-2.253-1.741-6.861-5.222-10.24-7.987-3.482-2.662-9.421-7.373-13.414-10.342-3.891-3.072-15.974-12.39-26.624-20.685-10.752-8.397-21.299-16.589-23.45-18.33-2.15-1.638-6.349-4.915-9.318-7.168s-19.456-15.053-36.557-28.365l-31.13-24.371-18.842-37.581-18.739-37.683-284.877-285.184-18.944 18.944-19.046 18.944-116.326-116.429c-64-64.102-117.658-118.17-119.296-120.115-10.138-12.595-17.818-28.877-21.299-45.568-2.15-9.933-2.355-28.774-0.512-39.424 2.662-15.462 9.728-32.051 19.251-45.056 35.328-48.128 102.81-58.266 150.733-22.528 3.686 2.765 58.982 57.344 122.88 121.242l116.224 116.326-37.888 37.888 284.365 284.365 76.083 38.093 16.384 21.197c9.011 11.674 19.149 24.678 22.528 28.979 5.632 6.963 30.106 38.605 57.856 74.342 5.632 7.373 13.005 16.794 16.282 20.992 3.379 4.198 9.114 11.571 12.8 16.384l6.758 8.704-37.683 37.683c-20.685 20.685-37.888 37.581-38.298 37.581s-4.096-2.662-8.192-5.939zM340.582 328.909c4.403-3.994 5.734-10.65 3.174-15.667-0.922-1.638-40.96-42.291-88.986-90.214-65.843-65.741-88.064-87.347-89.907-87.45-5.837-0.41-8.806 0.307-11.878 2.662-4.915 3.686-6.554 11.469-3.584 16.691 0.717 1.229 86.835 87.757 151.757 152.269l25.19 25.088h5.222c4.608 0 5.837-0.512 9.011-3.379zM396.288 273.101c4.403-3.379 6.451-7.782 5.632-12.698-0.614-4.198-5.12-8.806-87.859-91.75-48.026-48.026-88.474-88.064-90.010-88.883-10.957-5.837-23.654 6.861-17.818 17.818 2.15 3.891 174.694 176.026 177.766 177.254 3.379 1.434 9.114 0.614 12.288-1.741zM254.771 876.544c-0.205-0.102-3.482-0.512-7.475-0.922-10.342-0.922-18.432-2.355-29.696-5.222-17.613-4.608-23.45 3.584 46.694-66.458 44.646-44.646 61.952-62.566 63.59-65.946 2.867-6.042 2.867-15.462 0-22.016-1.638-3.686-11.469-14.131-43.008-45.568-26.829-27.034-42.394-41.779-45.363-43.315-5.734-2.97-15.77-3.277-22.426-0.717-3.789 1.536-15.36 12.595-66.048 63.283-33.792 33.792-61.747 61.44-62.054 61.44-1.741 0-7.68-23.757-9.523-37.478-1.638-11.981-1.434-41.472 0.41-52.634 6.554-41.267 26.112-78.95 55.398-107.008 28.365-27.238 61.747-43.827 102.298-50.79 9.83-1.741 46.387-1.741 54.784-0.102l6.144 1.229 80.896-80.896 75.776 75.776c41.574 41.574 75.469 75.981 75.264 76.186-0.307 0.307-18.432 18.534-40.346 40.448l-39.834 39.936 1.331 8.090c1.434 9.421 1.843 32.051 0.717 43.827-4.096 45.158-26.931 90.112-61.747 121.242-28.57 25.702-67.994 43.213-104.858 46.694-7.27 0.614-30.413 1.331-30.925 0.922zM568.832 385.536l-75.776-75.776 133.632-133.734c73.523-73.523 137.216-136.602 141.619-140.083 19.558-15.872 45.261-24.064 71.373-22.733 20.173 0.922 37.274 6.554 53.965 17.613 50.074 33.178 63.078 101.786 28.672 150.733-4.096 5.632-43.622 45.875-141.414 143.565-74.65 74.65-135.885 135.782-136.090 135.885s-34.406-33.894-75.981-75.469z" />
+<glyph unicode="&#xeaff;" glyph-name="setup_and_repair_cog" d="M500.429 881.562c-0.102-0.102-4.301-0.41-9.421-0.717-25.702-1.741-42.701-7.475-51.098-17.203-5.939-6.963-6.861-11.162-7.782-35.738-1.126-29.389-3.482-37.376-14.234-49.357-14.336-16.077-46.080-29.696-68.506-29.594-17.51 0.102-27.75 5.222-46.285 23.142-19.456 18.739-23.347 21.094-34.714 21.197-16.282 0.102-35.328-11.981-63.795-40.55-26.419-26.522-39.014-47.206-38.093-62.771 0.614-9.318 4.403-15.565 18.944-30.515 20.275-20.992 25.6-31.13 25.6-48.64 0-13.722-3.891-28.16-12.083-44.544-10.854-21.504-22.118-31.334-42.291-36.864-1.434-0.41-12.493-1.024-24.576-1.434-18.432-0.717-22.835-1.126-26.931-2.867-19.456-7.885-27.034-31.027-26.624-81.92 0.41-47.411 8.806-70.042 28.365-75.878 4.813-1.434 10.24-1.946 23.142-2.15 19.763-0.307 22.835-0.614 31.949-3.277 8.499-2.56 17.203-8.090 23.757-15.258l5.018-5.325 34.816 34.816c25.907 26.010 34.611 35.328 34.099 36.557-1.946 5.12-2.765 39.219-1.331 56.32 0.41 5.12 1.638 14.541 2.765 20.992 8.806 51.917 33.587 99.942 70.349 136.704 41.062 40.96 89.907 65.331 147.763 73.728 24.986 3.584 59.802 2.458 83.968-2.662 34.611-7.373 62.464-18.842 90.624-37.274 15.872-10.445 26.726-19.456 40.96-33.69 40.96-41.165 65.536-92.058 72.602-150.118 1.536-12.083 1.843-46.387 0.614-55.808-0.512-3.379-1.126-8.397-1.536-11.264-2.15-18.125-9.011-42.394-17.51-62.669-25.6-61.235-76.595-111.821-138.342-136.909-24.474-10.035-47.923-15.667-76.083-18.534-6.554-0.614-35.738-0.717-40.96-0.102-1.946 0.205-6.554 0.717-10.138 1.126l-6.656 0.614-68.813-68.813 7.27-7.373c12.902-13.005 16.589-24.166 16.896-51.302 0.102-17.613 0.41-20.787 2.765-27.238 2.253-6.246 4.71-9.626 10.24-13.824 11.366-8.704 34.406-13.21 67.379-13.21 40.346 0.102 61.645 4.915 73.114 16.691 7.578 7.68 8.397 11.059 9.318 36.966 0.614 17.818 1.126 23.347 2.867 29.184 5.837 19.354 21.709 33.28 49.869 43.827 15.77 5.939 31.846 7.475 43.827 4.301 11.469-2.97 17.203-6.963 35.226-24.166 16.589-15.872 21.606-18.739 32.768-18.534 15.974 0.205 34.611 12.186 62.669 40.243 35.43 35.533 45.67 59.29 33.382 77.926-1.536 2.253-8.397 10.035-15.258 17.101-15.053 15.667-21.402 25.498-23.654 36.864-1.126 5.325-0.512 19.558 0.922 26.010 3.994 17.306 13.619 37.376 22.938 47.718 11.878 13.414 23.962 18.534 45.261 19.149 33.792 1.126 37.683 1.843 45.363 8.602 7.168 6.349 13.312 20.89 15.462 36.864 2.253 16.077 2.56 49.357 0.717 66.048-2.355 21.299-7.987 36.454-16.077 43.213-8.602 7.27-11.366 7.782-45.466 8.909-16.179 0.512-23.962 2.56-33.382 8.602-9.626 6.246-16.998 15.258-23.962 29.389-9.421 19.354-12.493 30.003-12.493 44.851 0 16.896 5.632 27.648 24.781 47.309 12.595 13.005 16.179 17.818 18.432 24.576 5.837 17.613-5.734 39.014-39.117 72.294-29.798 29.696-51.405 41.472-68.096 37.171-7.987-2.048-11.776-4.71-26.317-18.739-20.48-19.661-29.798-24.678-47.104-24.883-22.016-0.205-53.965 13.005-67.994 28.262-11.059 11.981-14.438 21.402-15.155 41.574-1.024 33.485-1.843 37.376-8.397 45.158-7.68 8.909-24.064 14.746-47.821 16.896-5.939 0.512-38.195 1.229-38.707 0.819zM508.723 651.162c-0.205-0.102-3.789-0.41-8.090-0.512-7.782-0.205-25.805-2.765-35.226-5.018-19.763-4.71-46.694-16.384-63.488-27.546-71.68-47.514-105.779-129.946-88.576-214.016l2.15-10.752-173.466-173.466 3.686-6.042c23.245-38.298 61.44-80.179 101.581-111.616 9.216-7.168 32.666-23.45 37.274-25.907 2.355-1.229 5.53 1.843 89.19 85.504l86.733 86.733 7.168-1.638c20.070-4.506 46.387-6.246 66.355-4.301 31.744 3.174 65.536 15.258 92.16 32.87 73.421 48.947 107.418 137.216 85.504 222.208-2.97 11.571-7.782 26.010-9.216 27.443-0.41 0.512-31.334-29.798-68.813-67.174-45.363-45.363-69.53-68.915-72.602-70.451-6.349-3.379-15.974-3.379-22.63 0-3.277 1.741-16.384 14.131-44.134 41.984-34.202 34.304-39.526 40.141-40.96 44.339-1.946 6.042-1.638 14.541 0.819 19.763 1.331 2.765 24.474 26.624 70.451 72.602 37.581 37.683 67.994 68.813 67.584 69.222-2.765 2.56-33.382 11.366-45.875 13.21-13.824 1.946-36.659 3.584-37.581 2.56z" />
+<glyph unicode="&#xeb00;" glyph-name="setup_internet" d="M166.605 753.664c-18.637-5.12-33.69-20.787-37.478-39.219-0.819-3.891-1.126-75.674-1.126-251.085v-245.76h768v245.76c0 175.411-0.307 247.194-1.126 251.085-4.096 19.558-20.89 36.045-40.448 39.629-4.198 0.819-105.984 1.126-344.371 1.024-278.221-0.102-339.456-0.307-343.45-1.434zM844.8 486.4v-217.6h-665.6v435.2h665.6v-217.6zM465.92 625.766c-18.33-5.427-31.744-14.336-31.744-20.992 0-1.229 0.922-4.813 2.15-8.090 3.584-9.83 4.096-13.517 2.355-18.842-2.867-8.909-13.824-18.637-22.118-19.661-2.458-0.307-6.656 0.614-12.595 2.662-11.264 3.891-14.438 3.482-19.251-2.56-10.65-13.107-16.998-36.659-11.469-42.701 1.126-1.229 5.53-3.891 9.933-5.837 11.776-5.427 15.667-12.288 14.643-26.317-0.717-10.854-3.584-14.95-14.131-19.968-4.608-2.253-9.318-5.018-10.445-6.246-7.27-8.090 6.758-44.749 18.33-47.718 1.946-0.41 5.53 0.307 11.674 2.355 5.632 1.946 10.445 2.97 12.902 2.765 9.523-0.819 21.402-12.186 23.245-22.221 0.614-3.482 0.102-6.144-2.355-13.824-1.843-5.734-2.867-10.445-2.458-11.878 1.126-4.506 5.632-8.499 14.234-12.698 11.469-5.734 18.637-7.885 25.395-7.885 7.27 0 9.216 1.638 13.722 11.264 5.734 12.39 9.933 15.155 23.040 15.258 7.373 0.102 9.523-0.307 13.824-2.458 4.608-2.355 5.53-3.482 9.216-10.957 5.12-10.342 6.963-12.39 11.571-13.21 8.397-1.638 31.437 7.27 39.219 15.053 4.813 4.813 5.018 7.475 1.434 16.486-1.434 3.584-2.765 8.090-2.97 10.035-1.126 11.366 12.902 26.931 24.474 26.931 2.458 0 8.090-1.331 12.493-2.867 9.626-3.482 12.493-3.072 17.613 2.355 6.042 6.451 14.438 27.034 14.438 35.533 0 6.042-2.56 8.806-12.8 13.722-7.475 3.686-9.011 4.915-11.469 9.011-2.458 4.198-2.765 5.939-2.867 13.619 0 7.373 0.41 9.523 2.662 13.824 2.253 4.608 3.379 5.53 11.264 9.523 10.752 5.427 13.21 7.987 13.21 13.926 0 8.909-8.397 29.184-14.848 36.045-4.506 4.71-7.782 5.222-15.258 2.56-11.981-4.403-16.282-4.71-22.118-1.638-4.71 2.458-11.059 8.602-13.926 13.517-3.686 6.246-3.686 11.981-0.102 20.992 3.277 8.090 3.379 10.547 0.819 14.746-4.403 7.168-26.214 17.203-37.581 17.306-7.885 0-9.728-1.434-14.234-11.366-1.843-3.891-4.506-8.397-6.042-9.933-6.144-6.144-23.245-7.373-32.051-2.253-3.686 2.253-5.018 3.994-8.499 11.162-2.253 4.71-5.018 9.318-6.144 10.342-2.56 2.355-10.445 2.867-16.384 1.126zM519.475 566.374c1.536-1.126 3.277-3.686 3.891-5.734 0.717-2.253 0.922-15.77 0.717-36.966-0.307-31.744-0.41-33.587-2.355-35.738-6.451-7.168-15.565-6.758-20.685 0.922-2.355 3.482-2.355 3.789-2.355 37.376 0 31.846 0.102 34.099 2.048 36.864 4.198 6.451 12.39 7.885 18.739 3.277zM476.979 544.154c2.765-1.741 5.53-8.397 4.915-11.878-0.614-3.072-2.355-5.837-6.758-10.547-19.354-20.685-18.842-51.61 1.126-71.578 24.474-24.576 65.843-17.613 81.306 13.722 9.83 19.763 6.349 41.882-9.216 58.368-7.27 7.782-8.294 15.053-2.662 20.378 6.861 6.554 13.619 5.325 22.118-3.789 30.413-32.666 27.136-83.354-7.168-111.616-23.245-19.149-55.91-22.835-83.149-9.216-23.757 11.878-39.834 36.045-41.984 62.771-0.614 8.909 1.126 23.962 3.482 29.491 6.656 15.872 12.39 24.781 20.275 31.744 6.144 5.427 11.469 6.042 17.715 2.15zM76.8 164.557c0-22.938 0.307-28.365 1.741-32.461 2.15-6.349 8.909-13.107 15.36-15.258 4.301-1.536 42.291-1.638 418.816-1.638h414.106l5.734 2.765c3.072 1.536 6.963 4.403 8.602 6.349 5.53 6.758 6.042 10.138 6.042 40.243v27.443h-358.195l-0.614-3.789c-1.434-8.397-6.554-15.155-14.95-19.866-2.048-1.126-13.107-1.536-59.29-1.741-64.614-0.307-63.488-0.41-71.373 7.578-3.994 4.198-7.578 11.571-7.578 15.974 0 1.741-6.554 1.843-179.2 1.843h-179.2v-27.443z" />
+<glyph unicode="&#xeb01;" glyph-name="share" d="M724.48 882.176c-58.675-7.066-108.749-47.616-127.488-103.322-5.837-17.306-7.475-27.443-7.578-46.694-0.102-9.523 0.41-21.094 1.126-25.6 0.922-6.349 0.922-8.499 0-9.421s-99.635-61.338-203.264-124.518c-6.042-3.686-9.011-4.915-9.933-4.198-24.064 16.896-40.653 24.678-62.976 29.594-12.595 2.765-16.077 3.072-34.304 2.97-13.619-0.102-19.763-0.614-28.058-2.355-50.381-10.445-90.522-42.701-110.899-89.19-9.011-20.48-12.8-38.4-12.902-60.928-0.307-91.853 78.95-163.021 170.291-153.088 25.498 2.765 50.278 12.186 70.963 26.726 4.608 3.379 8.806 6.042 9.318 6.042 0.614 0 34.202-20.173 45.67-27.546 1.741-1.024 16.896-10.342 33.792-20.582s36.454-22.221 43.52-26.624c7.066-4.301 23.654-14.438 36.864-22.528 13.21-7.987 25.702-15.667 27.648-16.896s8.397-5.222 14.336-8.704c5.939-3.584 10.957-6.656 11.059-6.758 0.205-0.102-0.307-4.506-1.126-9.83-0.819-5.222-1.536-15.462-1.536-22.835 0.205-77.107 57.958-142.438 134.451-151.962 8.294-1.024 34.406-0.717 41.984 0.41 6.349 1.024 26.522 6.451 32.461 8.806 12.083 4.71 24.576 11.674 35.328 19.558 30.618 22.528 51.405 54.989 59.802 93.184 3.686 17.101 3.482 46.49-0.614 63.795-9.216 39.424-33.485 74.342-66.15 95.232-27.341 17.613-54.886 25.395-86.938 24.678-24.474-0.614-44.851-5.53-65.638-15.974-9.626-4.813-24.269-14.131-26.522-16.896-1.331-1.536 7.27-6.656-103.936 61.44-19.149 11.776-39.834 24.371-46.080 28.16-10.342 6.246-64.102 39.014-64.819 39.526-0.205 0.102 0.307 4.506 1.126 9.83 1.946 11.878 1.946 32.154 0.102 44.749-0.819 5.325-1.331 9.728-1.229 9.83 0.205 0.102 13.005 7.885 28.467 17.306s30.208 18.432 32.768 20.070c2.56 1.536 23.757 14.438 47.104 28.672s44.851 27.341 47.616 29.184c2.867 1.741 13.414 8.294 23.552 14.336 10.138 6.144 21.504 13.107 25.395 15.565 6.963 4.403 9.318 5.222 10.445 3.379 1.126-1.741 17.818-12.288 26.112-16.486 43.52-21.709 93.798-21.606 137.216 0.102 15.565 7.782 27.136 16.077 39.834 28.57 22.426 22.221 36.966 50.278 43.213 83.558 1.536 7.987 1.843 36.557 0.614 46.080-4.301 32.051-20.582 64.614-43.827 87.654-15.053 14.848-35.533 28.058-54.477 35.226-7.066 2.56-23.962 7.066-30.925 8.090-7.27 1.126-33.587 1.536-40.96 0.614z" />
+<glyph unicode="&#xeb02;" glyph-name="Share_wifi" d="M495.104 856.576c-39.117-3.482-75.469-11.981-109.67-25.6-45.056-18.022-84.89-43.622-121.549-78.131l-8.090-7.578 18.022-18.227 17.92-18.227 9.114 8.602c45.67 43.52 105.984 73.523 169.165 84.275 19.866 3.379 31.13 4.198 57.344 4.198 44.749-0.102 86.528-8.806 126.976-26.419 10.752-4.608 29.389-13.926 35.123-17.51 26.317-16.282 43.008-28.877 60.826-46.080l7.373-7.066 18.022 18.33 17.92 18.33-7.475 6.963c-49.459 46.592-104.448 77.005-169.779 93.798-12.698 3.277-36.966 7.782-48.026 8.806-3.686 0.41-7.782 0.922-9.216 1.229-4.301 0.819-55.296 1.024-64 0.307zM505.651 754.688c-0.205-0.205-3.789-0.512-7.987-0.922-58.88-4.915-121.139-33.587-164.045-75.264l-5.837-5.734 17.715-18.022 17.818-18.022 5.427 5.018c18.842 17.306 40.038 31.642 60.826 41.267 21.914 10.035 47.411 17.203 71.68 19.866 14.336 1.536 44.954 0.614 59.597-1.843 21.606-3.686 41.779-9.933 60.211-18.637 8.397-3.891 24.678-13.21 31.232-17.715 6.451-4.506 23.142-18.022 28.877-23.45l4.813-4.608 35.942 36.147-7.373 6.963c-45.158 42.496-103.014 68.506-165.171 74.342-8.602 0.819-42.906 1.229-43.725 0.614zM504.832 651.674c-23.040-3.482-38.605-7.987-54.989-15.77-17.408-8.294-36.762-21.606-47.104-32.461l-3.379-3.482 17.818-17.715 17.818-17.818 7.066 5.939c14.746 12.595 31.334 21.606 48.947 26.522 13.312 3.686 21.709 4.608 37.376 4.198 19.866-0.41 35.533-4.301 52.634-13.005 9.933-4.915 15.053-8.397 25.6-16.998l7.987-6.554 17.92 17.715 17.818 17.818-7.373 6.963c-23.552 21.914-55.296 37.376-88.986 43.315-10.035 1.741-40.858 2.662-49.152 1.331zM509.44 548.864c-29.082-6.349-51.098-27.136-58.982-55.296-1.741-6.349-2.253-10.957-2.253-19.968 0-14.234 1.638-21.402 8.192-34.816 3.994-8.090 6.246-11.162 13.517-18.534 10.138-10.035 18.125-15.155 31.334-19.661 8.397-2.867 10.342-3.174 22.528-3.174 14.95-0.102 22.221 1.434 33.28 6.758 9.011 4.301 14.541 8.192 21.504 15.155 31.846 31.232 29.594 84.685-4.813 113.152-7.885 6.554-20.173 12.902-30.003 15.462-8.499 2.253-26.317 2.662-34.304 0.922zM93.798 420.864c-5.734-2.048-10.957-6.656-13.926-12.39l-2.56-4.915-0.307-94.822c-0.307-103.117-0.512-99.226 5.53-107.008 3.891-5.12 10.445-8.704 16.998-9.421 4.506-0.41 12.595 1.331 49.459 10.342 24.269 6.042 47.616 11.878 51.917 13.005l7.987 2.048 15.053-8.909c8.397-4.915 21.606-12.698 29.491-17.306 7.885-4.71 49.869-29.286 93.184-54.784 43.418-25.498 84.173-49.459 90.624-53.248 19.763-11.674 27.75-14.95 43.008-17.818 13.722-2.56 34.509-1.434 47.002 2.56 3.482 1.126 106.701 42.189 290.918 115.814 46.592 18.534 86.733 35.123 89.395 36.966 11.674 7.782 18.944 22.938 17.818 37.171-2.048 24.986-23.654 41.882-48.64 38.093-8.090-1.229-11.571-1.741-22.733-3.482-5.325-0.819-12.902-1.946-16.896-2.56-13.312-1.946-18.33-2.765-38.4-5.939-10.957-1.741-21.606-3.482-23.552-3.789-22.938-3.482-74.342-11.571-98.304-15.258-16.589-2.662-32.768-5.12-35.84-5.632s-14.848-2.355-26.112-4.096c-11.264-1.741-26.419-4.096-33.792-5.222-7.27-1.126-13.517-2.458-13.926-3.072-0.307-0.614-0.922-3.277-1.229-5.939-2.458-20.173-17.818-44.954-36.045-57.958-24.064-17.203-56.73-21.402-84.582-10.854-3.174 1.229-33.587 18.227-67.584 37.888-67.174 38.707-67.174 38.707-66.15 46.49s7.373 12.902 14.234 11.571c1.843-0.307 20.685-10.547 41.779-22.835 97.075-56.013 90.931-53.043 110.592-53.043 13.107 0 17.92 1.229 30.208 7.578 9.011 4.608 20.275 15.667 24.883 24.371 5.427 10.342 7.475 17.306 8.090 28.467 0.512 8.602 0.205 11.571-1.638 18.432-3.379 12.083-8.704 21.402-16.998 29.696-6.758 6.758-11.981 9.933-101.171 60.928-61.952 35.43-96.87 54.784-102.4 56.832l-8.397 3.072-106.496 0.205c-88.781 0.205-107.11 0-110.49-1.229zM699.29 370.79c-0.205-0.205-5.734-1.229-12.186-2.15s-15.872-2.253-20.992-3.072c-9.216-1.434-41.37-6.349-47.104-7.066-5.734-0.819-31.744-4.813-34.816-5.325-1.638-0.307-7.68-1.229-13.312-1.946-10.65-1.536-23.45-3.482-40.96-6.246-5.632-0.819-12.698-1.843-15.565-2.15-2.97-0.307-5.12-0.922-4.813-1.434 0.205-0.512 4.301-2.97 8.909-5.427 4.608-2.56 11.366-6.963 14.95-9.933l6.554-5.222 14.438 2.253c17.306 2.662 42.701 6.656 55.398 8.704 5.12 0.819 17.101 2.662 26.624 4.096 20.275 3.072 22.63 3.482 26.112 4.096 1.434 0.205 4.198 0.614 6.144 0.922 11.878 1.638 70.758 10.957 74.445 11.674 3.891 0.819 3.379 1.741-3.891 7.68-5.53 4.403-13.619 8.192-21.197 9.83-5.222 1.126-17.818 1.536-18.739 0.717zM780.288 332.288c-2.56-0.41-6.656-1.126-9.216-1.434-16.998-2.56-104.653-15.667-109.568-16.486-1.434-0.205-5.734-0.922-9.728-1.434-6.963-1.024-40.55-6.042-69.12-10.445-7.578-1.126-15.565-2.253-17.715-2.56s-4.608-0.717-5.325-0.819c-2.662-0.41-2.662-1.229-0.102-6.861 1.434-3.072 3.277-8.294 4.096-11.571 0.922-3.277 1.843-6.246 2.15-6.554 0.41-0.512 30.413 3.686 39.936 5.53 1.126 0.205 8.294 1.331 15.872 2.458 7.578 1.229 22.323 3.482 32.768 5.222 10.445 1.638 24.678 3.891 31.744 5.018s19.968 3.174 28.672 4.506c8.704 1.434 38.195 6.144 65.536 10.445s49.869 7.987 50.176 8.294c1.024 1.024-9.114 8.806-15.872 12.186-10.65 5.222-21.709 6.656-34.304 4.506z" />
+<glyph unicode="&#xeb03;" glyph-name="shipping" d="M128 550.4v-102.4h102.4v154.214l2.355 2.15c1.229 1.126 6.963 6.861 12.8 12.902l10.445 10.752v24.781h-128v-102.4zM204.8 588.8v-12.8h-51.2v25.6h51.2v-12.8zM204.8 537.6v-12.8h-51.2v25.6h51.2v-12.8zM486.4 563.2v-38.4h179.2v76.8h-179.2v-38.4zM281.6 473.6v-25.6h179.2v51.2h-179.2v-25.6zM486.4 473.6v-25.6h179.2v51.2h-179.2v-25.6zM740.762 471.347c-1.126-1.331-6.861-8.602-12.8-16.179-5.837-7.578-11.162-14.541-11.878-15.36s-4.096-5.12-7.475-9.421l-6.349-7.987h-625.562l0.102-20.173c0.205-19.354 0.307-20.48 2.662-25.6 1.434-2.97 4.198-6.758 6.144-8.294 1.946-1.638 12.493-7.475 23.347-13.005 23.45-11.878 28.262-15.155 31.13-21.197 2.355-4.915 2.56-6.042 5.427-28.467 1.024-8.704 2.15-17.51 2.458-19.456s1.434-10.957 2.56-19.968c1.126-9.011 2.253-17.92 2.56-19.661l0.614-3.379h613.069l5.53 6.963c3.072 3.789 13.107 16.589 22.323 28.365 16.282 20.787 33.894 43.315 71.68 91.648 9.933 12.698 30.618 39.219 46.080 58.88 15.36 19.763 29.594 37.786 31.539 40.243l3.482 4.301h-204.698l-1.946-2.253zM811.52 446.566c6.349-2.662 9.421-10.957 6.349-16.998-1.741-3.379-7.578-7.168-11.162-7.168-9.626 0-16.384 11.469-11.366 19.149 2.15 3.277 7.168 6.451 10.342 6.451 1.229 0 3.891-0.614 5.837-1.434zM863.334 446.464c3.789-2.048 7.066-7.168 7.066-11.264 0-6.451-6.451-12.8-13.107-12.8-3.584 0-9.421 3.789-11.162 7.168-2.867 5.734-0.614 12.902 5.12 16.384 3.994 2.458 7.987 2.56 12.083 0.512z" />
+<glyph unicode="&#xeb04;" glyph-name="Shop" d="M145.203 855.962c-6.349-1.946-13.312-8.806-15.462-15.258-1.536-4.301-1.741-10.445-1.741-45.261v-40.243h768v40.858c0 35.226-0.205 41.37-1.638 44.749-2.458 5.837-6.758 10.854-11.776 13.722l-4.506 2.56-364.032 0.205c-314.163 0.102-364.646 0-368.845-1.331zM127.898 727.859c-0.102-1.024-0.307-2.765-0.41-3.891-0.205-1.126-1.024-8.909-1.946-17.408-0.922-8.397-1.946-16.998-2.15-18.944s-0.717-6.349-1.024-9.728c-0.41-3.379-0.819-7.27-1.024-8.704s-1.331-11.571-2.56-22.528c-1.126-10.957-2.355-21.504-2.56-23.347-0.307-1.843-1.229-10.138-2.048-18.432s-1.741-16.691-2.048-18.637c-0.614-4.506-1.126-8.909-3.072-27.648-0.819-8.192-1.946-18.022-2.56-22.016-0.512-3.891-1.229-10.342-1.536-14.131-0.41-3.789-0.819-7.987-1.126-9.216-1.126-5.222-1.229-20.070-0.205-24.781 3.891-18.842 20.48-35.328 39.526-39.322 16.998-3.584 33.792 1.536 46.387 14.131 7.68 7.68 12.902 17.408 13.926 25.805 0.717 5.632 1.638 5.12 2.765-1.638 2.253-12.493 14.541-27.955 27.238-34.099 13.824-6.758 30.72-6.758 44.954 0 12.902 6.144 25.293 21.709 27.341 34.406 0.819 5.53 2.048 5.53 2.867 0 1.229-7.68 6.656-17.203 13.824-24.474 26.419-26.317 69.939-17.101 83.661 17.818 1.331 3.379 2.458 7.27 2.458 8.499 0 4.403 1.741 3.482 2.458-1.229 1.741-12.902 14.131-28.774 27.341-35.021 14.029-6.656 30.822-6.656 44.851 0 12.902 6.144 24.883 20.992 27.238 33.894 1.024 5.325 2.15 5.53 2.97 0.41 2.048-12.493 14.541-28.262 27.238-34.202 8.806-4.198 15.155-5.427 25.6-4.915 16.589 0.614 31.846 9.728 40.755 24.166 2.97 4.915 6.349 14.746 6.349 18.739 0.102 4.096 1.536 1.741 2.56-3.994 2.253-12.698 14.848-28.57 27.341-34.202 21.504-9.728 44.646-5.222 60.211 11.878 6.656 7.27 9.933 13.926 13.005 26.419l0.717 3.072 0.41-3.072c1.946-15.77 13.312-31.232 28.365-38.4 27.238-13.005 60.211 0.717 70.246 29.184 1.126 3.277 2.15 7.168 2.253 8.806 0.307 4.608 1.434 3.482 2.048-2.15 2.048-17.613 20.173-35.84 39.424-39.834 27.853-5.837 55.603 13.005 60.723 41.062 1.024 5.53 0.717 10.035-1.536 31.539-1.536 13.824-2.97 26.726-3.174 28.672-0.307 1.946-1.843 16.077-3.584 31.232-1.638 15.258-3.277 29.696-3.584 32.256s-2.765 25.6-5.632 51.2c-5.837 53.043-5.939 54.272-6.758 60.211l-0.614 4.301h-383.898c-364.851 0-383.898-0.102-384-1.741zM199.168 437.76c-18.33-14.438-45.568-18.944-69.325-11.674-1.741 0.512-1.843-9.216-1.843-193.536v-194.15h537.6v307.2h153.6v-307.2h76.8v194.15c0 188.723-0.102 194.048-1.946 193.434-24.064-7.578-51.098-2.662-71.066 13.005l-3.789 3.072-3.072-2.56c-17.408-14.746-45.158-20.582-68.096-14.438-7.885 2.048-21.197 8.704-26.726 13.312l-4.403 3.482-5.427-4.096c-18.227-13.824-43.725-18.637-66.15-12.493-8.806 2.355-20.48 8.192-26.624 13.21l-4.403 3.584-2.253-2.048c-3.891-3.584-13.619-9.216-20.378-11.981-24.678-9.83-54.682-5.837-74.752 10.035l-4.915 3.789-5.325-4.096c-6.656-5.018-17.613-10.342-26.419-12.8-9.216-2.662-28.467-2.662-38.4-0.102-8.704 2.253-22.016 8.704-27.955 13.619l-4.403 3.584-2.253-2.048c-3.891-3.482-13.414-9.114-20.173-11.878-24.576-10.035-54.784-6.042-74.957 9.933l-4.915 3.789-5.222-3.994c-12.39-9.421-26.624-14.336-42.906-15.053-19.046-0.717-36.045 4.608-49.766 15.667-2.355 1.843-4.403 3.379-4.608 3.277-0.205 0-2.662-1.843-5.53-3.994zM588.8 243.2v-102.4h-384v204.8h384v-102.4z" />
+<glyph unicode="&#xeb05;" glyph-name="shop_pin" d="M482.816 881.664c-68.403-7.578-126.669-36.352-174.899-86.221-38.605-40.038-64.922-93.184-74.035-149.504-3.174-19.661-4.198-51.098-2.253-70.963 3.789-39.322 15.258-75.674 35.942-113.459 3.584-6.554 8.294-15.155 10.445-19.149 2.15-3.891 4.608-8.499 5.632-10.24 1.024-1.638 3.686-6.554 5.939-10.752s13.824-25.6 25.805-47.616c11.981-21.914 23.45-42.906 25.395-46.592s7.373-13.517 11.981-22.016c4.608-8.397 10.138-18.534 12.288-22.528 4.198-7.782 8.499-15.77 12.595-23.040 1.331-2.56 8.499-15.667 15.77-29.184 7.373-13.517 15.77-28.979 18.739-34.304 5.939-10.65 8.192-14.848 18.432-33.792 6.451-11.981 8.909-16.384 15.872-29.184 5.12-9.318 59.085-108.442 62.054-113.869 1.536-2.97 3.174-5.427 3.584-5.427s2.56 3.584 4.915 7.987c2.253 4.301 5.939 11.162 8.090 15.053 2.15 3.994 5.837 10.65 8.090 14.848 2.355 4.198 6.554 12.083 9.523 17.408s7.68 14.131 10.445 19.456c2.867 5.325 6.554 11.878 8.090 14.643 1.638 2.662 2.97 5.018 2.97 5.222s3.482 6.758 7.782 14.541c4.301 7.782 9.626 17.715 11.981 21.914 2.253 4.198 12.186 22.426 22.016 40.448s19.456 35.738 21.402 39.424c2.048 3.686 6.451 11.776 9.83 17.92 8.090 14.746 9.83 18.125 21.709 39.936 10.445 19.149 11.469 21.094 22.016 40.448 3.584 6.451 7.782 14.234 9.318 17.203 1.638 2.867 4.301 7.782 5.939 10.752 1.536 2.867 9.933 18.227 18.534 33.997s17.101 31.437 18.944 34.816c1.843 3.379 5.12 9.421 7.168 13.312 2.15 3.994 7.373 13.414 11.571 20.992 9.83 17.818 14.746 27.648 20.173 40.96 20.992 51.302 26.317 107.418 15.36 162.099-12.493 62.566-47.309 120.934-96.154 160.973-2.765 2.253-6.451 5.325-8.192 6.758-8.602 7.27-31.539 21.402-47.206 29.082-29.901 14.746-57.549 22.835-93.696 27.648-10.138 1.331-47.821 1.331-59.904 0zM537.6 804.864c1.946-0.307 6.349-1.126 9.728-1.638 12.8-2.15 32.768-7.68 39.936-11.059 1.126-0.614 5.018-2.253 8.704-3.891 50.176-21.606 92.979-69.12 110.49-122.675 7.68-23.45 9.83-38.605 9.728-66.56-0.205-32.358-5.734-56.73-19.763-86.016-10.65-22.221-23.859-40.653-41.779-57.856-12.8-12.39-15.77-14.848-29.491-24.064-25.805-17.306-59.802-29.798-89.702-32.973-9.318-1.024-38.195-1.024-46.49-0.102-85.197 10.035-155.136 71.475-175.718 154.624-7.987 31.949-7.578 70.144 1.126 102.707 21.094 78.848 90.317 139.059 171.622 149.402 11.059 1.331 44.032 1.434 51.61 0.102zM618.496 728.371c-3.379-0.922-8.499-4.198-12.288-7.987-0.922-0.819-16.179-15.667-33.894-32.87-17.715-17.306-35.328-34.509-39.322-38.298-11.571-11.264-71.066-69.222-76.288-74.445l-4.915-4.813-5.427 5.837c-3.072 3.174-13.107 14.336-22.426 24.781-23.962 26.931-25.293 28.365-30.31 30.618-4.71 2.253-11.981 2.97-17.818 1.638-4.915-1.126-10.547-5.222-18.739-13.619-8.294-8.602-11.264-14.746-11.264-22.938 0-10.138-2.662-6.349 66.56-92.979 31.437-39.219 31.642-39.424 44.851-39.424 12.39 0.102 14.234 1.638 36.864 30.208 16.589 20.89 11.469 14.438 91.648 115.2 34.509 43.418 63.693 80.896 64.819 83.456 6.144 13.824-1.843 31.027-16.384 35.43-5.427 1.638-10.445 1.741-15.667 0.205z" />
+<glyph unicode="&#xeb06;" glyph-name="shop_subscriptions" d="M494.592 882.483c-21.914-2.867-37.683-7.066-54.272-14.336-50.381-22.221-88.883-67.482-101.786-119.706-3.789-15.258-5.325-25.702-5.632-38.502l-0.102-5.939h-153.6v-310.989c0-333.312-0.205-315.597 5.018-330.445 2.765-7.885 9.933-19.251 16.282-25.805 9.728-10.035 20.378-16.589 35.021-21.299l6.656-2.15 267.264-0.205c292.966-0.205 273.408-0.512 288.461 5.837 21.197 9.011 37.581 27.75 44.544 50.688 1.741 5.837 1.843 20.89 2.048 320.307l0.307 314.061h-153.6l-0.102 5.939c0 3.174-0.205 6.554-0.307 7.373-0.205 0.819-0.614 4.608-1.024 8.294-2.355 23.552-12.902 53.043-26.726 74.342-29.696 45.773-74.957 74.445-129.024 81.818-9.83 1.331-31.846 1.741-39.424 0.717zM537.088 829.44c25.702-5.53 46.592-16.794 65.024-35.328 22.426-22.426 35.328-51.098 37.478-83.149l0.512-6.963h-256.41l0.614 8.499c3.072 44.954 30.413 85.606 71.168 106.086 12.595 6.246 24.576 9.933 42.189 12.698 6.246 1.024 31.744-0.102 39.424-1.843zM337.408 587.674c11.059-15.974 33.485-15.155 43.315 1.536l2.765 4.71 0.307 25.907 0.41 25.805 3.072-1.741c1.638-1.024 5.53-4.506 8.499-7.68 26.726-28.774 12.288-75.264-26.317-84.582-6.758-1.741-20.685-0.819-27.75 1.638-38.707 13.722-46.49 65.638-13.517 89.498l4.096 2.97 0.512-26.010 0.512-26.112 4.096-5.939zM643.584 588.698c10.342-16.691 33.69-16.691 44.032 0l3.072 5.018 0.307 26.010 0.41 25.907 3.072-1.741c5.12-3.072 13.824-13.21 16.998-20.070 9.933-20.89 5.53-44.032-11.366-59.699-20.685-19.251-53.043-17.818-72.192 3.072-20.275 22.323-16.794 58.061 7.475 75.571l4.096 2.97 1.024-52.019 3.072-5.018zM632.73 444.621c3.686-1.638 8.602-4.301 10.957-5.939 9.933-6.758 18.637-20.173 20.89-32.154 0.819-4.403 1.024-37.069 0.819-115.712l-0.307-109.568-2.765-6.963c-1.536-3.789-4.198-8.909-5.837-11.366-7.066-10.138-20.275-18.739-32.256-20.992-8.499-1.536-215.962-1.536-224.358 0-19.251 3.584-36.352 20.378-40.346 39.629-0.819 3.891-1.126 38.298-1.126 114.176l0.102 108.749 2.355 7.168c3.072 9.523 7.782 16.794 14.541 22.938 6.656 5.837 12.186 8.909 21.094 11.469 6.042 1.741 12.8 1.843 118.067 1.638l111.616-0.205 6.554-2.867zM589.107 379.187c-2.56-1.331-24.883-22.733-53.965-51.712-38.81-38.81-50.074-49.459-52.019-49.459s-7.27 4.71-22.63 19.866c-21.811 21.709-23.245 22.63-31.539 20.173-5.12-1.536-11.878-6.758-15.667-12.083-3.686-5.222-4.506-13.722-1.843-18.637 2.765-5.018 55.603-66.15 63.693-73.626 3.584-3.277 10.138-6.349 13.824-6.349 7.68 0 10.342 2.458 32.256 30.208 11.571 14.541 22.426 28.058 24.064 30.208 5.939 7.27 9.728 11.981 30.413 37.888 11.366 14.438 24.474 30.822 28.979 36.352 12.493 15.77 13.722 19.354 9.626 27.853-4.608 9.626-16.691 14.029-25.19 9.318z" />
+<glyph unicode="&#xeb07;" glyph-name="Shopping" d="M494.592 882.483c-45.363-6.042-79.053-22.118-109.056-52.019-31.539-31.642-49.357-70.963-52.326-115.917l-0.717-10.547h-153.293v-310.989c0-333.312-0.205-315.597 5.018-330.445 2.765-7.885 9.933-19.251 16.282-25.805 9.728-10.035 20.378-16.589 35.021-21.299l6.656-2.15 267.264-0.205c292.966-0.205 273.408-0.512 288.461 5.837 21.197 9.011 37.581 27.75 44.544 50.688 1.741 5.837 1.843 20.89 2.048 320.307l0.307 314.061h-153.6l-0.102 5.939c0 3.174-0.205 6.554-0.307 7.373-0.205 0.819-0.614 4.71-1.024 8.499-2.253 23.245-13.107 53.146-26.726 74.138-29.696 45.773-74.957 74.445-129.024 81.818-9.83 1.331-31.846 1.741-39.424 0.717zM537.088 829.44c25.702-5.53 46.592-16.794 65.024-35.328 22.323-22.323 34.714-49.664 37.581-82.637l0.614-7.475h-256.614l0.614 8.499c3.072 44.954 30.413 85.606 71.168 106.086 12.595 6.246 24.576 9.933 42.189 12.698 6.246 1.024 31.744-0.102 39.424-1.843zM337.408 587.674c11.059-15.974 33.485-15.155 43.315 1.536l2.765 4.71 0.307 25.907 0.41 25.805 3.072-1.741c5.222-3.072 14.234-13.722 17.203-20.275 5.427-12.186 6.451-22.835 3.174-35.123-9.933-38.093-57.242-50.688-85.197-22.835-22.221 22.221-19.558 58.88 5.734 77.107l4.096 2.97 0.512-26.010 0.512-26.112 4.096-5.939zM643.584 588.698c10.342-16.691 33.69-16.691 44.032 0l3.072 5.018 0.307 26.010 0.41 25.907 3.072-1.741c4.813-2.867 13.414-12.698 16.486-18.842 10.547-21.197 6.349-44.954-10.854-60.928-20.685-19.251-53.043-17.818-72.192 3.072-20.275 22.323-16.794 58.061 7.475 75.571l4.096 2.97 1.024-52.019 3.072-5.018zM332.8 281.6v-166.4h-25.6v332.8h25.6v-166.4zM409.6 294.4v-153.6h-51.2v307.2h51.2v-153.6zM460.8 294.4v-153.6h-25.6v307.2h25.6v-153.6zM537.6 294.4v-153.6h-51.2v307.2h51.2v-153.6zM588.8 294.4v-153.6h-25.6v307.2h25.6v-153.6zM665.6 294.4v-153.6h-51.2v307.2h51.2v-153.6zM716.8 281.6v-166.4h-25.6v332.8h25.6v-166.4z" />
+<glyph unicode="&#xeb08;" glyph-name="Show_front_back_camera" d="M115.405 753.664c-18.944-5.222-34.099-21.299-37.478-39.834-0.819-4.301-1.126-84.070-1.126-267.264 0-284.57-0.41-265.421 5.734-278.016 3.891-7.987 14.541-18.432 23.040-22.426 3.686-1.741 9.83-3.686 13.824-4.301 8.397-1.229 605.286-0.922 610.202 0.307 10.957 2.97 23.962 12.493 30.106 22.118 3.379 5.12 6.758 13.722 7.68 19.149 0.205 1.638 0.512 40.448 0.512 86.221l0.102 83.251 6.963-6.554c14.438-13.619 35.226-32.666 53.453-48.845 10.445-9.318 19.661-17.613 20.582-18.432 0.819-0.819 3.379-3.072 5.632-5.018 4.403-3.891 22.118-19.763 22.938-20.582 0.307-0.307 2.867-2.56 5.632-5.018 2.867-2.458 7.475-6.656 10.24-9.216 8.806-8.090 19.354-17.101 22.016-18.842 3.686-2.355 13.517-3.379 17.613-1.741 5.632 2.253 10.138 6.144 12.186 10.65 1.843 4.096 1.946 11.366 1.946 218.726s-0.102 214.63-1.946 218.726c-4.506 9.933-19.251 14.643-29.184 9.421-1.331-0.717-9.933-8.192-19.149-16.691-9.114-8.397-17.408-16.077-18.33-16.896-1.024-0.922-7.066-6.451-13.517-12.493s-12.595-11.776-13.824-12.8c-1.126-1.024-7.475-6.861-14.234-13.107-18.637-17.306-33.894-31.437-39.834-36.864-10.547-9.728-23.757-21.914-26.214-24.371l-2.97-2.97v84.89c0 72.806-0.205 85.709-1.536 90.931-4.403 16.896-14.95 29.082-31.539 36.25l-6.349 2.662-304.128 0.205c-249.651 0.102-305.050-0.102-309.043-1.229zM446.157 625.664c52.224-6.861 98.304-33.485 129.229-74.752 6.246-8.294 16.486-24.166 16.486-25.6 0-0.307-13.517-0.512-30.106-0.512h-30.208l-10.138 10.035c-20.070 19.968-43.725 32.461-73.011 38.81-6.554 1.434-13.005 1.843-27.034 1.741-17.203 0-19.251-0.307-31.232-3.277-19.661-4.915-30.72-9.83-47.206-20.787-16.179-10.854-32.768-28.877-43.315-47.206l-2.765-4.915h25.19c13.824 0 25.088-0.205 25.088-0.512s-17.101-17.613-37.888-38.4l-37.888-37.888-37.888 37.888c-20.89 20.787-37.888 38.093-37.888 38.4s10.342 0.512 22.835 0.512h22.938l2.867 7.475c3.891 9.83 11.878 25.088 18.227 34.509 32.87 49.050 83.149 79.053 143.053 85.299 9.421 1.024 29.798 0.512 40.653-0.819zM616.448 435.712c20.787-20.787 37.888-38.093 37.888-38.4s-9.83-0.512-21.914-0.512h-22.016l-1.126-5.837c-3.584-17.306-15.565-45.056-26.419-61.133-26.522-39.424-62.669-65.946-108.237-79.36-26.931-7.987-64.819-9.216-92.16-3.072-53.658 12.083-97.178 43.418-125.338 90.214-4.915 8.192-13.312 25.702-14.95 31.334l-0.614 2.253h55.194l4.198-7.168c17.203-28.979 45.978-52.326 76.902-62.362 25.088-8.294 54.17-9.216 79.872-2.662 44.749 11.264 83.046 46.592 97.587 90.010l2.662 7.782h-56.218l38.195 38.298c20.89 21.094 38.195 38.4 38.298 38.4 0.205 0.102 17.306-16.896 38.195-37.786z" />
+<glyph unicode="&#xeb09;" glyph-name="Shower" d="M544.256 856.883c-36.454-4.403-66.048-14.848-94.208-33.587-38.093-25.19-66.97-63.078-81.306-106.496-6.554-19.866-9.011-33.997-9.933-56.832-0.41-8.192-0.922-15.155-1.331-15.565-0.307-0.41-39.526-13.619-87.142-29.491-47.514-15.872-88.678-30.003-91.443-31.539-9.83-5.325-17.818-15.258-22.528-27.648-2.048-5.53-2.15-8.090-2.56-43.93l-0.307-38.195h512.102v35.123c0 38.195-0.41 41.779-5.939 52.941-3.686 7.578-13.619 17.408-21.197 21.197-3.379 1.741-32.666 11.059-65.024 20.787s-61.44 18.432-64.512 19.354c-3.072 1.024-20.992 6.349-39.834 11.981l-34.202 10.138 0.614 12.8c1.638 33.997 13.619 61.030 37.581 85.094 19.968 19.968 38.195 29.491 69.632 36.352 5.837 1.331 152.781 1.741 163.328 0.512 29.901-3.482 57.446-17.408 78.438-39.731 13.005-13.824 22.528-30.003 28.467-48.128 6.656-20.378 6.246 2.048 6.246-355.021v-324.198h76.8l-0.307 331.571-0.205 331.469-2.253 11.776c-10.957 57.344-42.189 104.858-89.907 136.499-22.221 14.746-51.302 26.214-77.312 30.515-3.686 0.614-7.987 1.331-9.728 1.741-3.277 0.614-166.707 1.229-172.032 0.512zM196.506 420.966c-7.885-2.765-13.926-9.318-16.282-17.51-0.819-2.765-1.024-13.824-0.819-34.816l0.307-30.72 2.765-4.71c11.162-18.944 39.117-16.486 46.49 3.994 1.024 2.765 1.331 11.776 1.434 34.304v30.515l-2.662 5.53c-5.53 11.776-19.354 17.715-31.232 13.414zM299.827 421.376c-4.608-1.331-9.626-4.915-12.595-8.806-5.12-6.758-5.632-10.445-5.632-41.882 0-33.178 0.512-35.84 7.68-43.008 13.312-13.414 35.635-8.192 41.984 9.626 2.355 6.758 2.253 61.133-0.205 68.198-4.096 12.083-18.944 19.558-31.232 15.872zM400.998 420.864c-5.734-2.048-10.957-6.656-13.926-12.39l-2.56-4.915v-32.87c0-29.594 0.205-33.075 1.843-36.147 9.933-18.227 34.509-19.251 45.261-1.843l3.072 5.018v66.765l-2.97 4.915c-6.451 10.854-19.251 15.565-30.72 11.469zM503.398 420.762c-5.837-2.15-10.445-5.939-13.619-11.469l-2.867-4.813-0.307-31.027c-0.41-35.84 0-38.4 7.475-45.773 13.312-13.312 35.635-8.192 41.984 9.626 2.355 6.656 2.253 61.133-0.102 67.994-4.403 12.902-19.763 20.173-32.563 15.462zM605.696 420.762c-6.144-2.15-11.366-6.963-14.234-13.21l-2.662-5.53v-61.645l2.662-5.53c6.246-13.414 21.709-18.432 35.226-11.469 5.325 2.765 10.65 9.318 12.288 14.848 0.614 2.15 1.024 16.077 1.024 33.075 0 33.587-0.512 36.25-7.68 43.418-6.963 7.066-17.306 9.318-26.624 6.042zM196.813 267.264c-5.939-1.843-10.65-5.632-14.131-11.469l-2.97-4.915-0.307-30.72c-0.41-33.28 0-36.557 4.915-43.418 5.837-7.987 17.613-11.981 27.341-9.421 5.837 1.638 12.595 6.963 15.667 12.39 2.56 4.608 2.56 4.608 2.867 36.557l0.307 31.949-2.662 5.632c-5.632 11.981-18.227 17.408-31.027 13.414zM300.237 267.776c-4.096-0.922-10.957-5.632-13.414-9.114-5.018-6.963-5.222-8.806-5.222-40.96 0.102-22.323 0.41-31.334 1.434-34.099 6.246-17.51 28.979-22.63 42.189-9.523 7.066 7.066 7.578 10.342 7.578 43.93 0 16.691-0.41 30.413-1.024 32.563-2.662 9.626-14.029 18.33-23.552 18.125-2.56-0.102-6.144-0.512-7.987-0.922zM400.486 267.059c-6.144-2.15-12.698-8.909-14.746-15.155-1.434-4.198-1.741-9.728-1.741-35.226v-30.31l2.867-5.632c5.018-9.933 14.541-15.155 25.702-14.029 10.035 1.024 19.456 9.216 21.606 18.739 1.331 5.53 1.229 60.416 0 65.126-3.789 13.312-20.275 21.402-33.69 16.486zM505.242 267.776c-7.68-1.741-14.438-8.090-17.306-16.282-2.355-6.758-2.253-61.133 0.205-68.198 3.482-10.342 14.95-17.715 26.010-16.691 10.035 1.024 19.866 8.806 22.426 18.022 1.331 5.018 1.331 60.928 0 65.946-0.614 2.048-2.867 6.042-5.12 8.909-6.042 7.578-15.974 10.752-26.214 8.294zM605.286 267.059c-2.458-0.922-6.554-3.584-8.909-5.939-7.066-7.066-7.578-10.342-7.578-43.93 0-16.691 0.41-30.413 1.024-32.563 2.56-8.909 12.083-16.896 21.811-17.92 11.162-1.331 23.142 6.144 26.624 16.589 2.56 7.27 2.56 61.235 0.102 68.403-4.506 13.107-19.558 20.173-33.075 15.36zM195.686 113.459c-6.042-2.15-12.698-8.909-14.746-15.155-2.56-7.27-2.56-61.235-0.102-68.403 3.584-10.445 15.155-17.92 26.112-16.896 10.035 1.024 19.866 8.806 22.426 18.022 0.614 2.15 1.024 16.077 1.024 33.075 0 33.587-0.512 36.25-7.68 43.418-7.066 7.168-17.306 9.318-27.034 5.939zM298.701 113.766c-5.632-2.048-10.547-6.246-13.722-11.674l-2.867-4.813-0.307-31.744c-0.307-29.901-0.205-32.051 1.741-36.557 8.397-19.558 34.509-21.504 45.67-3.482l3.072 5.018 0.307 31.13c0.307 27.136 0.102 31.744-1.434 36.352-4.301 12.902-19.558 20.378-32.461 15.77zM401.101 113.562c-6.451-2.048-13.107-8.602-15.36-15.258-1.434-4.198-1.741-9.728-1.741-34.304 0-33.792 0.512-36.352 7.68-43.622 11.674-11.674 31.13-9.216 39.936 5.12l3.072 5.018 0.307 31.846c0.41 36.147 0.102 37.581-7.782 45.466-6.758 6.758-16.077 8.806-26.112 5.734zM503.501 113.766c-5.632-2.048-10.547-6.246-13.722-11.674l-2.867-4.813-0.307-30.925c-0.205-19.968 0.102-32.358 0.819-35.021 1.638-6.144 6.963-12.493 13.312-15.77 5.018-2.56 6.451-2.765 12.595-2.355 11.469 0.819 20.89 8.397 23.245 18.637 0.512 2.15 1.024 17.306 1.024 33.485v29.491l-2.662 5.53c-5.53 11.878-19.251 17.715-31.437 13.414zM605.901 113.766c-5.632-2.048-10.547-6.246-13.722-11.674l-2.867-4.813-0.307-30.72c-0.205-21.811 0-31.949 0.922-35.123 5.222-18.534 28.672-24.678 42.394-10.957 7.27 7.168 7.68 9.728 7.68 44.442v30.31l-2.867 5.632c-5.837 11.674-19.149 17.203-31.232 12.902z" />
+<glyph unicode="&#xeb0a;" glyph-name="showroom_mobile_pro" d="M487.424 817.971c-5.939-1.536-12.186-4.813-17.306-9.114-2.458-2.048-22.63-33.997-22.63-35.738 0-0.205-2.15-3.994-4.71-8.397-5.12-8.499-5.325-8.909-13.926-23.859-9.011-15.667-29.286-50.893-35.43-61.44-3.072-5.325-9.114-15.667-13.312-23.040-28.058-48.538-50.995-88.269-58.88-101.888-5.018-8.704-10.342-17.92-11.776-20.378-1.434-2.56-3.891-6.963-5.632-9.728-1.638-2.867-3.994-6.861-5.018-8.806-2.253-3.891-6.042-10.445-79.872-138.24-27.853-48.23-51.405-89.702-52.429-92.16-5.325-13.312-1.434-30.925 9.011-41.165 3.789-3.686 28.672-18.842 57.856-35.226 5.12-2.867 28.774-16.486 81.51-47.002 30.413-17.613 129.024-74.547 132.608-76.595 1.946-1.024 5.53-3.072 7.885-4.506 13.926-8.090 34.509-5.12 45.978 6.656 3.891 4.096 22.528 34.816 41.062 67.789 1.434 2.56 6.861 11.981 12.083 20.992 8.397 14.438 32.563 56.32 38.195 66.048 9.318 16.179 30.72 53.35 76.8 133.12 20.070 34.611 41.472 71.782 47.616 82.432 10.957 19.046 19.661 33.997 41.677 72.192 6.042 10.445 17.92 31.13 26.522 46.080s16.077 27.648 16.486 28.16c0.41 0.614 1.843 3.994 3.072 7.578 4.813 14.541-0.307 32.563-11.878 41.779-2.253 1.741-18.944 11.776-37.274 22.323s-65.946 38.093-105.984 61.235c-39.936 23.040-80.282 46.387-89.6 51.712-52.429 30.31-51.405 29.798-61.85 30.31-2.867 0.205-7.782-0.307-10.854-1.126zM527.565 739.738c21.606-12.493 40.653-23.45 42.291-24.474 5.939-3.379 110.387-63.693 164.762-95.13 11.776-6.758 21.811-12.698 22.221-13.107 0.717-0.717-9.216-18.33-45.67-81.203-6.349-10.957-15.77-27.341-20.992-36.352s-13.005-22.63-17.408-30.208c-4.403-7.578-17.51-30.31-29.184-50.586-11.674-20.173-22.016-38.093-23.040-39.936-1.024-1.741-6.861-11.878-13.005-22.63-6.246-10.65-28.467-49.152-49.459-85.504s-39.014-67.686-40.141-69.632c-12.902-22.63-22.835-39.629-23.757-40.653-0.819-0.922-3.072 0-9.318 3.686-7.066 4.198-44.339 25.805-53.248 30.822-1.638 0.922-13.619 7.885-26.624 15.36-21.504 12.39-31.334 18.125-40.653 23.45-1.843 1.024-15.155 8.704-29.491 16.998-30.515 17.715-23.962 13.926-65.024 37.581-18.022 10.342-35.84 20.685-39.731 22.835-3.789 2.253-6.861 4.403-6.861 4.813s2.97 5.837 6.656 12.083c3.686 6.246 7.782 13.312 9.114 15.667s4.096 7.168 6.144 10.752c9.626 16.691 11.264 19.354 13.107 22.733 1.946 3.277 47.718 82.637 61.747 107.008 3.277 5.632 10.854 18.739 16.896 29.184s14.438 25.088 18.739 32.563c4.403 7.373 11.469 19.661 15.77 27.136 4.301 7.373 10.24 17.715 13.107 22.733 5.12 8.909 28.57 49.664 73.011 126.464 11.469 19.968 22.733 39.424 24.986 43.315 2.15 3.789 4.403 6.861 4.915 6.861 0.41 0 18.534-10.24 40.141-22.63zM634.778 723.046c11.059-6.349 21.914-12.698 24.166-13.926 9.011-5.018 11.059-6.554 12.39-9.933 1.229-2.867 1.229-3.891 0.102-6.656-3.482-8.294-8.806-8.294-22.835-0.102-5.53 3.277-16.998 9.933-25.395 14.643-8.397 4.813-16.486 9.933-18.125 11.469-4.096 3.686-4.096 9.011 0 13.21 5.018 5.018 7.27 4.301 29.696-8.704zM348.16 210.432c4.915-2.662 10.24-11.674 10.24-17.51 0-3.891-3.379-10.752-6.758-13.926-12.288-11.162-32.461-2.253-32.461 14.438 0 14.336 16.179 23.859 28.979 16.998zM283.648 790.835c-1.946-1.126-13.005-7.885-24.474-14.848l-20.992-12.698-27.034 9.318c-14.95 5.12-27.238 9.114-27.443 8.909-0.205-0.102 2.662-12.902 6.246-28.16l6.554-27.955-17.408-23.040c-10.957-14.438-16.896-23.142-16.077-23.347 0.717-0.307 5.018-0.717 9.523-1.126 4.506-0.307 10.752-0.819 13.824-1.024 10.035-0.922 17.715-1.536 25.088-2.15 3.994-0.307 7.68-1.126 8.397-1.741 0.717-0.717 7.475-10.24 15.155-21.197 17.92-25.805 17.101-24.781 17.92-23.859 0.41 0.41 5.427 12.083 11.264 25.907 5.734 13.824 10.752 25.395 11.162 25.805 0.41 0.512 12.902 4.506 27.75 9.114 14.95 4.608 27.238 8.397 27.341 8.499 0.205 0.102-8.602 7.885-19.456 17.203-10.752 9.318-20.685 17.818-21.914 18.944-2.15 1.946-2.15 2.15-1.638 30.822 0.307 15.872 0.41 28.877 0.205 28.877s-2.048-1.024-3.994-2.253zM857.498 426.394c-3.277-2.253-10.752-7.373-16.589-11.264l-10.445-7.168-13.107 3.686c-7.168 2.048-15.462 4.403-18.534 5.222-2.97 0.819-5.939 1.741-6.349 2.048-1.434 0.819-1.229 0 4.608-20.070l5.53-18.944-11.162-16.282c-6.144-9.011-10.854-16.589-10.65-16.896 0.614-0.512 5.427-0.819 25.498-1.229l14.234-0.307 8.294-10.65c4.506-5.939 9.933-12.8 11.878-15.36s3.994-4.71 4.506-4.71c0.819-0.102 1.843 2.458 9.728 24.576l4.506 12.39 17.51 6.349c9.626 3.482 18.125 6.656 18.842 7.168 1.024 0.614-2.867 4.198-13.722 12.493-8.294 6.451-15.462 11.878-15.872 12.186s-1.024 9.523-1.434 20.48c-0.307 10.957-0.819 20.070-0.922 20.173-0.205 0.205-2.97-1.536-6.349-3.891zM805.376 262.758c-0.922-0.819-21.094-13.722-51.917-33.075-4.403-2.662-8.397-4.915-8.909-4.915-0.614 0-3.072 0.614-5.427 1.434-3.379 1.126-58.266 18.739-63.898 20.582-0.922 0.307 1.536-10.035 13.517-57.037 3.482-13.824 3.584-14.131 1.741-16.896-1.024-1.536-10.752-15.053-21.504-29.901-10.854-14.848-19.558-27.238-19.251-27.546 0.41-0.512 1.229-0.512 20.48-1.741 6.246-0.307 13.619-0.819 16.384-1.024 2.867-0.205 10.24-0.614 16.384-1.024 16.794-0.922 20.378-1.434 21.094-2.867 0.41-0.614 5.632-7.885 11.571-16.077 6.042-8.192 15.258-20.992 20.685-28.365 5.427-7.475 9.933-13.619 10.035-13.619 0.205 0 6.451 15.462 14.029 34.304l13.619 34.304 17.51 5.734c49.664 16.077 52.736 17.203 51.814 18.227-0.512 0.614-13.21 11.264-28.16 23.654l-27.238 22.528v37.171c0 20.378-0.41 37.069-0.819 37.069s-1.229-0.41-1.741-0.922z" />
+<glyph unicode="&#xeb0b;" glyph-name="signal_1-5" d="M128 102.4v-38.4h153.6v76.8h-153.6v-38.4zM332.8 102.4v-38.4h153.6v76.8h-153.6v-38.4zM537.6 102.4v-38.4h153.6v76.8h-153.6v-38.4zM742.4 102.4v-38.4h153.6v76.8h-153.6v-38.4z" />
+<glyph unicode="&#xeb0c;" glyph-name="signal_2-5" d="M128 217.6v-153.6h153.6v307.2h-153.6v-153.6zM332.8 102.4v-38.4h153.6v76.8h-153.6v-38.4zM537.6 102.4v-38.4h153.6v76.8h-153.6v-38.4zM742.4 102.4v-38.4h153.6v76.8h-153.6v-38.4z" />
+<glyph unicode="&#xeb0d;" glyph-name="signal_3-5" d="M332.8 294.4v-230.4h153.6v460.8h-153.6v-230.4zM128 217.6v-153.6h153.6v307.2h-153.6v-153.6zM537.6 102.4v-38.4h153.6v76.8h-153.6v-38.4zM742.4 102.4v-38.4h153.6v76.8h-153.6v-38.4z" />
+<glyph unicode="&#xeb0e;" glyph-name="signal_4-5" d="M537.6 371.2v-307.2h153.6v614.4h-153.6v-307.2zM332.8 294.4v-230.4h153.6v460.8h-153.6v-230.4zM128 217.6v-153.6h153.6v307.2h-153.6v-153.6zM742.4 102.4v-38.4h153.6v76.8h-153.6v-38.4z" />
+<glyph unicode="&#xeb0f;" glyph-name="signal_5-5" d="M742.4 448v-384h153.6v768h-153.6v-384zM537.6 371.2v-307.2h153.6v614.4h-153.6v-307.2zM332.8 294.4v-230.4h153.6v460.8h-153.6v-230.4zM128 217.6v-153.6h153.6v307.2h-153.6v-153.6z" />
+<glyph unicode="&#xeb10;" glyph-name="signal_boost" d="M492.032 814.49c-12.186-2.56-14.848-3.482-25.088-8.499-16.384-8.090-18.33-9.83-76.186-67.891-23.757-23.757-98.304-98.509-165.888-166.195l-122.675-122.88h153.805v-157.696c0-140.186 0.205-158.618 1.638-165.683 5.837-28.467 26.317-50.381 55.398-59.29 5.632-1.638 17.203-1.843 195.379-2.048 171.52-0.307 190.157-0.205 197.632 1.331 31.744 6.451 55.706 31.232 60.928 62.976 0.614 4.301 1.024 60.518 1.024 163.43v156.979l152.986 0.512-172.134 172.237c-185.856 185.958-178.688 179.2-197.12 186.778-13.005 5.325-22.528 7.373-37.171 7.68-10.24 0.205-15.462-0.205-22.528-1.741zM503.091 547.43c6.861-3.379 8.294-6.554 8.499-18.534 0.102-5.325-0.512-15.258-1.229-22.016s-1.536-14.848-1.946-17.92c-0.614-6.451-1.638-13.926-2.15-16.896-0.205-1.126-0.717-3.686-1.024-5.632-2.458-13.824-7.168-21.094-15.462-23.654-2.15-0.614-12.595-1.331-23.347-1.536-10.65-0.307-20.48-0.717-21.709-1.024-3.789-0.717-9.114-6.246-11.878-12.083-7.373-15.462-10.445-39.526-10.445-82.022 0-56.218 5.632-84.48 18.637-93.286 3.072-2.048 5.018-2.253 24.064-2.765 21.914-0.512 26.522-1.331 31.334-5.325 5.222-4.301 9.011-16.077 10.854-33.28 0.307-3.072 0.819-7.68 1.126-10.24 3.789-29.491 4.198-46.49 1.229-51.814-1.024-2.048-3.584-4.198-6.554-5.632-4.813-2.458-5.427-2.458-36.659-2.458h-31.744l-6.656 3.584c-24.883 13.21-49.050 57.446-60.314 110.592-2.56 11.878-5.018 26.214-5.734 33.792-0.307 3.072-0.819 6.554-1.024 7.68-1.946 9.421-2.765 66.253-1.229 83.968 1.638 18.637 5.427 45.363 7.885 54.784 0.512 1.946 2.15 8.192 3.482 13.824 8.909 35.123 23.962 66.253 41.062 84.378 6.246 6.656 12.39 11.059 19.866 14.029 5.325 2.15 6.758 2.253 35.84 2.15 29.594-0.205 30.413-0.307 35.226-2.662zM642.56 478.822c17.92-22.733 31.846-51.917 38.912-81.51 7.27-29.798 7.066-66.458-0.41-97.997-6.042-25.702-19.149-53.555-35.226-75.366-6.144-8.294-9.626-12.493-10.445-12.493s-10.65 8.294-17.306 14.438l-4.096 3.789 4.198 4.915c15.565 18.842 29.798 47.821 35.533 72.602 9.216 40.038 4.71 83.558-12.595 119.808-5.939 12.39-14.541 26.419-21.606 35.123-2.867 3.584-5.12 6.861-4.915 7.373 0.614 1.843 20.685 18.432 21.299 17.715 0.41-0.512 3.379-4.198 6.656-8.397zM599.654 441.651c29.901-39.014 39.219-88.166 25.498-135.578-3.072-10.24-8.397-22.426-14.541-33.075-5.018-8.499-14.541-21.606-15.77-21.606-0.41 0-5.427 3.994-11.059 8.806-9.216 7.885-10.24 9.114-9.114 10.65 19.354 26.214 27.341 47.514 27.955 75.264 0.717 27.443-7.68 54.272-23.552 75.162l-5.837 7.68 3.482 3.072c9.114 8.397 16.794 14.848 17.715 14.95 0.614 0 2.867-2.458 5.222-5.325zM553.677 408.371c22.835-28.774 27.341-66.765 11.878-99.43-2.253-4.915-10.24-17.408-12.698-20.070-0.717-0.819-8.397 5.018-18.125 13.926l-4.403 3.994 2.662 3.174c3.891 4.608 9.318 15.872 11.264 23.45 1.946 7.475 2.253 23.040 0.512 29.696-2.56 10.138-7.782 20.992-12.595 26.214-1.126 1.331-1.946 2.56-1.638 2.765 1.638 1.638 20.992 18.022 21.299 18.022 0.205 0 1.024-0.819 1.843-1.741zM498.176 368.538c16.077-7.578 19.763-28.57 7.066-40.858-10.342-10.035-25.293-10.138-35.635-0.102-5.734 5.632-8.294 12.902-7.373 20.89 2.048 17.51 20.070 27.648 35.942 20.070z" />
+<glyph unicode="&#xeb11;" glyph-name="Silent" d="M582.656 826.573c-2.56-2.355-12.39-11.162-21.914-19.661-9.626-8.397-22.016-19.456-27.75-24.576-16.486-14.746-22.938-20.378-73.728-65.536-26.419-23.45-49.971-44.442-52.224-46.49s-7.782-6.861-12.288-10.854c-4.506-3.891-8.397-7.373-8.704-7.68s-6.554-5.939-13.926-12.595l-13.517-11.981h-118.17c-128.819 0-123.392 0.205-135.987-5.837-7.373-3.584-18.227-14.438-21.914-21.914-5.939-12.39-5.734-5.12-5.734-150.63 0-93.491 0.307-135.475 1.126-139.264 3.994-19.046 20.582-35.635 39.629-39.629 3.789-0.819 41.165-1.126 123.187-1.126h117.76l22.733-20.173c12.493-11.162 24.371-21.709 26.317-23.45s8.397-7.475 14.336-12.8c5.939-5.222 14.438-12.8 18.944-16.794 4.506-4.096 31.232-27.853 59.392-52.838s51.712-45.875 52.326-46.49c0.614-0.512 4.506-3.994 8.704-7.68s12.083-10.752 17.51-15.667l10.035-9.011v383.488c0 210.944-0.307 383.59-0.717 383.59-0.512 0-2.867-1.946-5.427-4.403zM841.421 560.845l-47.718-47.718-47.104 47.002c-25.907 25.907-47.514 47.206-48.026 47.411-0.922 0.307-64.717-62.874-64.717-64.102 0-0.41 21.299-22.016 47.309-48.026l47.411-47.411-47.411-47.411c-26.010-26.010-47.309-47.616-47.309-47.923 0-0.41 14.541-15.155 32.256-32.87l32.154-32.256 47.718 47.616 47.718 47.718 47.821-47.718 47.821-47.821 32.051 32.051c17.51 17.613 31.949 32.461 31.949 33.075s-21.299 22.323-47.309 48.333l-47.206 47.206 44.954 44.954c24.678 24.781 46.182 46.285 47.718 47.923l2.765 2.867-32.563 32.461-32.461 32.461-47.821-47.821z" />
+<glyph unicode="&#xeb12;" glyph-name="sim" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.251 20.48-35.635 39.629-39.629 3.891-0.819 69.12-1.126 228.864-1.126 243.2 0 227.635-0.307 240.23 5.734 7.475 3.686 18.33 14.541 22.016 22.016 6.144 12.698 5.734-12.186 5.734 340.070v323.277l-89.6 89.702-89.702 89.6-156.877-0.102c-121.754-0.102-158.106-0.41-162.202-1.331zM435.2 435.2v-64h-128v52.531c0 58.163 0.102 59.494 6.349 66.355 8.602 9.318 6.246 9.011 68.198 9.114h53.453v-64zM588.8 358.4v-140.8h-281.6v128h153.6v153.6h128v-140.8zM729.6 495.616c5.837-3.584 10.445-9.728 11.776-15.462 0.512-2.15 1.024-27.648 1.024-56.422v-52.531h-128v128.102l110.285-0.614 4.915-3.072zM742.4 281.6v-64h-128v128h128v-64zM435.2 128v-64h-53.453c-40.858 0.102-54.374 0.41-57.242 1.434-5.53 1.946-10.957 6.554-14.029 11.776l-2.765 4.71-0.307 55.091-0.307 54.989h128.102v-64zM588.8 128v-64h-128v128h128v-64zM742.4 139.469c0-56.934-0.102-58.675-5.53-65.741-1.536-1.946-4.915-4.813-7.578-6.349l-4.813-2.867-110.080-0.614v128.102h128v-52.531z" />
+<glyph unicode="&#xeb13;" glyph-name="simple_mode" d="M295.629 882.074c-14.746-3.482-27.034-13.005-33.997-26.214-6.042-11.674-5.632 18.33-5.632-407.347 0-426.394-0.41-395.264 5.734-407.962 3.379-6.963 14.234-18.022 21.504-21.811 11.981-6.451-3.277-6.042 228.966-6.042 194.867-0.102 212.173 0.102 217.6 1.638 15.258 4.403 26.317 13.824 33.382 28.16l4.301 8.704v792.576l-2.56 6.451c-5.427 13.824-16.077 24.269-30.515 30.106l-5.837 2.355-214.528 0.205c-124.416 0-216.166-0.307-218.419-0.819zM554.189 856.474c9.933-2.56 11.674-16.896 2.662-22.426-3.277-1.946-5.018-2.048-44.339-2.048-36.966 0-41.267 0.205-44.544 1.843-9.523 4.71-8.602 19.866 1.331 22.528 4.506 1.229 80.179 1.331 84.89 0.102zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM523.878 86.733c13.005-6.656 17.408-23.654 9.318-35.738-4.608-6.861-10.65-10.65-18.125-11.264-11.264-1.024-19.661 3.174-25.293 12.8-3.686 6.246-3.891 16.896-0.614 23.245 6.758 12.8 21.914 17.613 34.714 10.957zM419.533 574.771c-24.986-9.933-31.846-41.574-13.107-60.211 7.066-7.066 13.619-10.24 22.63-10.957 19.456-1.638 36.25 10.957 39.834 29.798 3.072 16.486-4.915 32.256-20.582 40.141-7.782 3.994-20.378 4.506-28.774 1.229zM577.536 575.283c-25.498-9.216-33.485-40.038-15.565-59.904 19.866-21.914 56.32-12.595 62.976 16.179 3.994 16.998-3.379 33.075-18.842 41.37-5.53 2.867-7.578 3.379-15.155 3.686-6.349 0.307-10.138-0.102-13.414-1.331zM399.974 429.056c-8.397-2.97-13.722-10.957-14.643-22.016-0.819-9.523 1.434-15.974 8.397-24.576 23.962-29.594 51.507-46.694 87.962-54.477 13.722-2.97 41.37-3.174 55.91-0.512 26.112 4.813 51.712 17.203 70.656 33.997 8.090 7.168 10.138 9.318 18.125 19.046s9.728 13.21 10.342 20.89c1.331 17.101-8.704 29.184-24.269 29.184-10.035 0-16.589-3.994-27.238-16.691-38.093-45.363-104.038-47.718-143.77-5.12-14.234 15.155-16.691 17.408-20.992 19.558-5.222 2.662-14.234 2.97-20.48 0.717z" />
+<glyph unicode="&#xeb14;" glyph-name="Simplicity" d="M504.627 748.954c-23.142-19.661-72.397-72.704-90.419-97.382-13.414-18.432-17.92-24.781-24.269-34.304-10.138-14.95-24.371-38.81-24.371-40.653 0-0.307 4.301-3.379 9.523-6.861 44.851-29.901 81.613-69.12 107.418-114.586 10.854-19.149 21.094-42.291 26.522-59.597 1.331-4.403 2.662-7.987 2.97-7.987s1.843 3.994 3.379 9.011c6.246 19.354 15.053 39.117 26.112 58.573 14.848 26.317 30.618 46.797 53.965 70.246 19.149 19.251 31.027 29.082 50.79 42.394 7.578 5.12 12.8 9.318 12.288 9.83s-2.048 2.97-3.379 5.53c-18.432 33.28-47.821 73.728-79.974 110.080-9.933 11.162-45.466 46.694-55.706 55.603l-7.373 6.451-7.475-6.349zM179.507 511.898c0.307-49.562 0.819-92.57 1.126-95.642 1.331-9.933 5.632-34.099 7.373-40.448 0.922-3.379 2.048-7.987 2.56-10.138 3.994-16.486 17.101-47.616 28.365-67.174 30.31-52.634 74.035-94.515 127.898-122.573 26.522-13.824 58.675-24.883 86.835-29.901 3.379-0.614 7.066-1.331 8.192-1.536s5.018-0.717 8.704-1.126c3.686-0.41 7.578-0.922 8.704-1.126s10.547-0.717 20.992-1.024l18.944-0.717-0.205 12.698c-0.205 6.963-0.41 48.23-0.614 91.546-0.205 43.418-0.614 79.77-0.922 80.896s-0.922 4.813-1.331 8.192c-1.229 11.059-5.632 32.256-9.216 44.339-14.643 50.074-40.448 93.389-77.722 130.867-26.829 26.829-50.995 44.237-84.070 60.518-33.997 16.691-68.403 26.522-107.008 30.618-2.56 0.307-12.39 0.717-21.811 1.126l-17.203 0.512 0.41-89.907zM815.821 600.986c-0.102-0.102-3.891-0.41-8.397-0.717-4.506-0.41-9.114-0.819-10.24-1.126-1.126-0.205-4.608-0.717-7.68-1.126s-6.554-0.922-7.68-1.126c-52.019-9.626-99.226-31.027-140.8-63.898-13.21-10.547-37.888-35.123-48.333-48.128-27.034-33.997-46.387-71.987-57.242-112.435-2.765-10.342-6.656-29.901-7.578-37.581-0.41-3.379-0.922-7.27-1.331-8.704-0.307-1.434-0.717-43.725-0.922-94.106l-0.41-91.546 18.739 0.614c10.342 0.41 19.661 0.922 20.787 1.126s4.813 0.717 8.192 1.126c37.683 4.198 80.896 18.739 115.712 38.707 41.37 23.859 73.523 53.453 103.424 95.437 5.427 7.578 14.643 23.654 20.992 36.352 11.059 22.221 17.408 39.526 23.040 62.976 8.090 33.587 8.499 39.322 8.602 139.059l0.102 85.811-14.336-0.205c-7.885-0.205-14.541-0.41-14.643-0.512zM51.61 407.859c0.41-8.090 0.922-15.565 1.126-16.691s0.717-4.71 1.024-7.987c0.307-3.277 0.819-6.554 1.024-7.168 0.205-0.717 0.614-2.867 0.922-4.813 1.946-13.107 7.475-34.304 13.005-49.664 5.427-14.848 6.349-17.101 14.438-33.28 42.291-85.402 124.518-147.558 220.467-166.81 11.059-2.15 14.131-2.662 23.552-3.686 3.379-0.41 7.27-0.922 8.704-1.331 2.97-0.614 142.029-1.638 141.312-0.922-0.307 0.307-4.403 0.717-9.216 1.126-64.41 4.915-132.301 31.539-183.808 72.090-29.901 23.654-61.44 57.651-82.33 88.986-18.432 27.648-31.642 58.266-39.834 92.467-3.686 15.36-5.734 27.341-7.987 46.387l-0.614 5.837h-102.4l0.614-14.541zM870.298 421.171c0-0.717-0.205-2.662-0.41-4.403-0.205-1.638-0.717-5.837-1.024-9.216-2.662-26.317-12.595-62.669-24.371-89.6-21.914-50.176-72.192-108.339-123.597-142.95-49.050-32.973-101.171-51.712-162.304-58.266-11.059-1.229-5.837-1.331 53.248-1.331 71.68 0 81.715 0.614 110.49 6.451 56.422 11.571 111.821 40.038 152.576 78.336 39.322 37.069 66.56 79.36 82.637 128.307 6.144 18.637 10.752 38.81 12.8 54.989 0.307 3.072 0.819 6.758 0.922 8.192 0.205 1.434 0.717 8.909 1.126 16.691l0.717 14.029h-51.405c-40.346 0-51.302-0.307-51.405-1.229z" />
+<glyph unicode="&#xeb15;" glyph-name="Skip_backward" d="M90.112 447.488v-320h230.4l0.205 148.275 0.307 148.173 14.848-14.438c8.192-7.987 17.408-16.896 20.48-19.866 4.608-4.403 32.563-31.437 62.566-60.416 3.174-3.072 16.589-15.974 29.696-28.672s29.901-28.877 37.171-35.942c7.373-7.168 17.408-16.896 22.323-21.504 13.619-13.21 52.634-50.893 59.699-57.754 3.482-3.379 17.51-16.998 31.232-30.208s25.805-24.986 26.829-26.010c1.741-1.946 1.843 2.253 1.843 146.534v148.582l5.427-5.12c2.867-2.867 11.059-10.752 18.125-17.613 22.221-21.504 46.899-45.363 73.216-70.758 14.029-13.517 31.539-30.413 38.912-37.478 7.27-7.168 16.282-15.872 19.968-19.354s17.51-16.896 30.72-29.696c13.21-12.8 26.624-25.702 29.696-28.672s16.896-16.282 30.72-29.696c13.824-13.312 27.136-26.214 29.696-28.672 2.56-2.355 10.445-10.138 17.715-17.203l13.005-12.902v640.717l-10.957-10.752c-6.144-5.837-14.95-14.438-19.763-18.944-9.83-9.421-13.312-12.8-40.55-38.81-10.65-10.24-21.402-20.582-23.962-22.938-4.403-4.096-14.131-13.414-38.4-36.762-15.77-15.155-51.302-49.152-56.934-54.477-2.662-2.458-13.722-13.107-24.576-23.552-10.957-10.445-21.094-20.173-22.528-21.504-4.096-3.789-43.93-41.984-57.242-54.886l-11.776-11.469-0.307 147.046-0.205 147.046-9.011-8.806c-4.915-4.71-10.957-10.65-13.517-13.005-2.56-2.458-14.029-13.414-25.498-24.474-11.571-11.059-22.63-21.709-24.678-23.654-24.576-23.347-55.808-53.248-78.234-74.854-6.246-5.939-13.517-12.902-16.077-15.36-2.662-2.458-13.414-12.902-24.064-23.142-10.65-10.138-21.197-20.275-23.45-22.323-7.475-7.066-59.187-56.525-79.258-75.981l-12.902-12.39-0.307 146.842-0.205 146.842h-230.4v-320z" />
+<glyph unicode="&#xeb16;" glyph-name="Skip_forward" d="M90.112 447.59c0-268.288 0.205-320 1.331-318.874 5.734 5.53 54.374 52.634 58.982 57.037 7.68 7.373 53.248 51.302 71.782 69.325 8.192 7.987 16.486 15.974 18.432 17.818s15.155 14.541 29.184 28.16c14.131 13.722 27.955 27.034 30.72 29.696 2.867 2.662 16.896 16.282 31.232 30.208 28.058 27.136 47.309 45.773 58.266 56.218l6.758 6.451 0.307-148.173 0.205-148.275 12.083 11.776c6.554 6.554 14.131 13.824 16.691 16.282s16.077 15.667 30.208 29.184c14.029 13.619 28.16 27.238 31.437 30.413 3.277 3.072 17.306 16.589 31.13 30.106 13.824 13.414 27.341 26.419 30.003 28.979s16.486 15.974 30.822 29.798c14.336 13.824 27.853 26.829 30.003 28.979 2.15 2.048 15.565 14.95 29.696 28.672s27.341 26.419 29.286 28.262c1.946 1.843 10.547 10.138 19.149 18.534s15.872 15.258 16.179 15.258c0.307 0 0.512-66.56 0.512-147.968v-147.968h230.4v640h-230.4v-294.195l-8.909 8.704c-5.018 4.813-14.336 13.722-20.685 19.866-10.035 9.523-21.299 20.275-40.038 38.298-2.048 1.946-12.902 12.39-24.166 23.040-11.162 10.752-25.395 24.371-31.642 30.413-6.144 5.939-13.107 12.595-15.36 14.643-2.253 2.15-13.107 12.493-24.064 23.040s-22.016 21.094-24.576 23.552c-4.506 4.198-36.864 35.226-56.32 53.862-5.325 5.222-11.366 10.957-13.414 12.8-3.584 3.379-43.93 42.086-46.592 44.749-1.229 1.126-1.434-22.426-1.638-145.613l-0.307-146.944-12.39 11.981c-13.722 13.414-50.893 49.050-57.242 54.989-2.253 2.048-13.312 12.595-24.474 23.45-11.264 10.752-21.914 20.992-23.757 22.63-1.741 1.741-12.083 11.674-23.040 22.118-10.957 10.547-21.504 20.582-23.45 22.426s-12.493 11.878-23.45 22.426c-26.931 25.805-31.027 29.798-51.507 49.254-9.728 9.318-22.528 21.606-28.467 27.238-5.939 5.734-13.005 12.595-15.872 15.258-2.765 2.662-9.114 8.704-14.029 13.517l-9.011 8.806v-320.205z" />
+<glyph unicode="&#xeb17;" glyph-name="Sleep" d="M467.968 881.357c-7.68-0.614-33.69-4.608-42.496-6.451-5.018-1.126-11.264-2.458-13.824-2.97-12.186-2.458-44.237-12.595-61.338-19.354-14.029-5.632-33.894-15.053-48.23-23.040-60.109-33.075-113.664-82.33-152.269-139.878-38.195-57.037-64.307-129.434-70.451-195.072-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.344-0.307-67.072 2.253-24.576 2.56-27.136 5.837-45.568 12.595-71.578 44.442-141.517 89.805-197.12 46.080-56.525 104.038-100.045 171.11-128.307 30.515-12.902 73.011-24.781 103.424-28.774 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 28.57 2.662 53.965 7.066 78.336 13.619 146.022 39.322 262.042 152.781 304.538 298.086 4.915 16.794 9.728 38.195 11.878 52.736 0.922 5.837 1.843 11.674 2.048 13.107s0.717 5.837 1.024 9.728c0.41 3.994 0.922 7.987 1.126 9.011 0.922 3.174-1.024 1.741-6.758-5.018-6.451-7.578-20.787-21.606-31.232-30.72-42.803-36.966-96.051-62.771-153.088-74.035-23.040-4.506-35.123-5.632-64-5.53-31.949 0-45.978 1.536-74.24 7.987-79.053 17.92-149.402 65.331-197.222 132.608-31.334 44.032-52.224 98.304-58.368 151.45-0.307 3.072-0.819 6.451-1.126 7.68-0.922 4.096-1.126 51.302-0.307 60.006 4.506 44.544 14.131 79.974 32.256 117.453 19.251 40.141 45.67 74.65 81.408 106.598 3.482 3.072 3.482 3.174 1.024 2.97-1.434-0.102-4.198-0.307-6.144-0.512zM824.32 874.803c-4.608-9.933-24.576-51.405-28.467-59.187l-3.789-7.68-7.168-1.126c-29.184-4.71-75.571-12.698-76.083-13.107-0.307-0.307 5.222-5.325 34.611-31.437 10.445-9.216 20.89-18.637 23.347-20.89l4.403-4.096-10.445-41.267c-5.632-22.733-10.138-41.574-9.83-41.779 0.41-0.512 11.674 5.325 18.33 9.523 2.15 1.331 4.096 2.355 4.403 2.355s4.506 2.253 9.421 4.915c5.018 2.765 12.698 6.963 17.203 9.421 4.506 2.355 9.626 5.12 11.264 6.144 10.445 6.042 16.691 9.011 17.51 8.192 0.512-0.41 3.482-2.253 6.554-3.891 17.101-9.216 61.44-33.485 64.307-35.226 1.843-1.126 3.686-1.843 3.994-1.434 0.41 0.307-3.994 19.149-9.728 41.779l-10.342 41.267 4.403 4.096c3.994 3.686 23.552 21.094 28.877 25.805 1.229 1.024 6.042 5.325 10.752 9.523s10.957 9.83 13.926 12.493l5.325 4.813-3.277 0.614c-1.843 0.307-10.138 1.638-18.637 3.072-8.397 1.331-25.907 4.198-38.81 6.349l-23.45 3.891-11.469 23.552c-6.246 12.902-14.131 29.184-17.408 36.147-3.277 6.861-6.246 12.493-6.554 12.493-0.41 0-1.741-2.458-3.174-5.325zM607.949 593.715c-3.072-6.656-8.704-18.33-12.39-26.010l-6.758-13.926-13.517-2.253c-17.101-2.867-16.179-2.765-32.051-5.325-7.27-1.229-13.619-2.56-14.131-2.867-0.41-0.41 2.355-3.482 6.144-6.963 7.987-6.963 37.581-33.28 37.99-33.587 0.102-0.102-3.174-13.824-7.373-30.515-7.066-28.467-7.578-32.666-4.096-29.491 0.512 0.41 3.891 2.458 7.578 4.403s15.258 8.294 25.805 14.029l19.251 10.547 13.517-7.373c7.475-4.096 16.589-9.114 20.275-11.059s9.83-5.427 13.722-7.578c3.891-2.15 7.373-3.789 7.782-3.686 0.307 0.205-2.765 13.926-6.861 30.515-7.066 28.365-7.373 30.31-5.734 31.539 1.024 0.717 3.686 3.072 5.939 5.12 2.253 2.15 11.571 10.445 20.787 18.534 9.114 8.090 16.589 14.95 16.589 15.36s-3.584 1.229-7.885 1.843c-6.758 1.024-13.107 2.048-35.123 5.837-1.434 0.205-5.939 1.024-10.035 1.638l-7.475 1.229-5.939 12.39c-13.517 28.467-19.046 39.629-19.558 39.629-0.41 0-3.277-5.427-6.451-11.981z" />
+<glyph unicode="&#xeb18;" glyph-name="Smart_electric_meter" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-72.192-5.53-144.179-30.618-205.824-71.578-84.48-56.218-147.661-141.722-176.026-238.285-6.656-22.528-12.493-49.971-14.438-68.096-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.534-2.56-74.65 0.717-100.352 15.872-125.338 83.046-235.008 188.314-307.302 48.23-33.178 109.568-57.958 168.141-67.994 29.696-5.12 42.496-6.144 75.571-6.144 26.419 0 33.28 0.41 56.218 3.174 61.133 7.373 125.133 30.72 179.2 65.434 16.486 10.65 41.267 29.491 55.398 42.291 71.578 64.922 117.965 147.149 136.602 241.869 1.331 7.066 2.765 14.848 3.072 17.408 0.614 5.018 1.536 12.083 2.15 16.896 2.048 14.029 2.765 62.362 1.229 81.408-1.229 16.794-4.506 39.629-7.885 55.296-27.546 130.355-112.435 240.538-231.219 300.032-41.779 20.89-90.829 36.352-131.891 41.472-2.765 0.41-5.734 0.819-6.554 1.024s-5.222 0.717-9.728 1.126c-4.506 0.307-9.318 0.819-10.752 1.126-2.97 0.512-61.030 1.331-61.542 0.922zM546.816 804.966c1.434-0.307 8.090-1.229 14.848-2.15 13.619-1.741 15.77-2.15 34.816-6.656 127.181-30.106 230.605-131.994 262.554-258.662 4.198-16.896 5.632-24.064 8.806-45.466 2.048-14.234 2.765-53.35 1.331-73.421-1.946-26.214-8.602-58.88-17.306-84.582-18.227-53.658-48.026-101.478-87.859-140.595l-7.782-7.578-54.067 54.067 9.011 8.909 8.909 8.909 18.125-17.92 18.022-17.92 4.608 5.12c13.722 15.36 29.389 37.274 39.834 55.296 6.246 10.854 13.926 26.317 13.312 26.726-0.205 0.205-10.854 4.608-23.552 9.83l-23.245 9.523 4.608 10.957c2.458 5.939 4.915 11.264 5.325 11.674s11.059-3.584 23.757-8.806c12.595-5.325 23.040-9.523 23.245-9.421 0.819 0.717 7.885 23.040 10.547 33.587 5.12 20.378 9.216 48.742 9.523 65.741l0.102 3.072h-25.395l-25.395-0.102 0.307 12.902 0.307 12.8h50.176l-0.102 4.608c-0.307 15.974-3.994 40.96-9.114 61.952-3.072 12.8-8.909 31.846-10.65 34.918-0.41 0.717-8.806-2.355-23.552-8.499-12.698-5.222-23.347-9.216-23.757-8.806-0.41 0.512-2.867 5.734-5.325 11.776l-4.608 10.854 23.245 9.523c12.698 5.222 23.347 9.626 23.552 9.83 0.614 0.41-5.53 13.005-11.469 23.347-11.366 20.070-24.576 38.81-39.014 55.501l-7.27 8.499-36.147-36.147-9.011 8.909-9.011 8.806 18.022 18.227 18.125 18.125-2.458 2.15c-9.421 8.397-22.221 18.637-30.822 24.781-15.053 10.65-34.202 21.914-34.714 20.378-0.307-1.024-4.403-22.221-7.168-38.093-0.307-1.638-1.741-9.011-3.072-16.384-1.331-7.27-5.53-29.901-9.216-50.176-3.789-20.275-8.192-44.237-9.83-53.248s-3.686-20.070-4.506-24.576c-1.229-7.168-6.451-35.533-20.48-111.104-4.096-22.426-4.915-25.907-7.782-33.587-9.011-24.781-29.389-46.592-53.76-57.651-3.686-1.741-11.162-4.301-16.589-5.734-8.704-2.458-11.878-2.765-25.293-2.765-12.902-0.102-16.794 0.307-24.474 2.355-39.322 10.24-67.482 39.629-76.493 79.462-1.843 8.602-2.048 28.672-0.307 37.888 3.584 18.432 8.806 29.491 23.654 50.381 6.042 8.602 16.179 22.835 22.528 31.744 6.246 8.909 43.52 61.338 82.637 116.531s70.861 100.659 70.451 101.069c-1.434 1.434-29.082 7.987-44.134 10.547-13.824 2.355-29.286 3.994-37.99 4.096h-3.584v-50.79l-25.6 0.614-0.102 24.064c-0.102 13.21-0.205 24.678-0.307 25.395-0.102 1.024-1.331 1.229-4.915 0.819-2.765-0.307-8.397-0.819-12.595-1.126-9.626-0.717-25.19-3.072-38.093-5.632-17.101-3.584-47.411-12.698-46.49-14.234 2.355-3.789 18.944-45.67 18.33-46.285-0.512-0.41-5.734-2.867-11.674-5.325l-10.957-4.608-9.523 23.040c-5.222 12.595-9.933 23.142-10.342 23.45s-4.198-1.229-8.192-3.277c-27.546-14.234-51.507-30.413-73.318-49.562l-5.325-4.608 36.25-36.25-18.022-17.818-36.147 36.147-7.27-8.499c-9.728-11.366-16.282-19.866-24.166-31.437-10.854-15.872-27.034-45.261-26.010-46.899 0.307-0.512 10.854-5.12 23.45-10.445l23.040-9.421-4.608-10.957c-2.458-5.939-4.915-11.162-5.325-11.674-0.41-0.41-11.059 3.584-23.757 8.806-12.595 5.325-23.040 9.523-23.245 9.421-0.614-0.512-6.451-18.432-8.909-27.034-4.71-16.998-8.909-40.243-10.24-56.422-1.434-17.306-1.434-18.432-0.205-18.534 0.717-0.102 11.571-0.307 24.269-0.41s23.654-0.307 24.371-0.41c0.922-0.102 1.229-3.379 1.229-12.698v-12.595l-24.269 0.102c-13.414 0.102-24.883-0.102-25.498-0.307-1.536-0.41-1.024-10.854 1.741-32.461 2.355-18.534 8.909-46.080 14.848-62.669l2.662-7.27 3.789 1.536c26.829 11.366 42.598 17.613 43.213 16.998 0.41-0.512 2.867-5.734 5.325-11.674l4.608-10.957-23.245-9.523c-12.698-5.222-23.347-9.626-23.552-9.83-0.717-0.512 9.421-20.275 16.896-32.563 10.854-18.022 18.842-28.877 39.322-53.043 1.434-1.638 2.867-0.41 19.661 16.384l18.022 18.022 18.022-17.818-27.136-27.034-27.034-27.136-6.656 6.451c-60.314 58.061-97.997 138.035-106.291 224.973-1.536 15.872-0.717 61.747 1.331 73.933 0.205 1.331 0.922 6.042 1.536 10.547 11.776 81.818 54.886 160.461 118.682 216.269 56.422 49.357 129.843 80.691 203.366 86.938 4.506 0.307 8.397 0.819 8.602 1.024 0.512 0.512 55.603-0.41 58.47-1.024zM537.702 237.773l-11.059-38.605 26.624-0.205 26.624-0.307-16.794-19.558c-9.216-10.752-30.106-35.123-46.285-54.067-16.282-18.944-29.696-34.406-29.901-34.406s0.614 3.072 1.741 6.963c1.024 3.789 2.867 9.83 3.891 13.517 2.765 9.728 10.035 35.226 12.493 43.52 1.126 3.994 2.355 8.397 2.867 10.035 0.614 1.946 0.512 2.765-0.307 2.867-0.717 0.102-12.39 0.205-26.010 0.307-13.722 0-24.986 0.41-25.088 0.717-0.205 0.41 14.746 18.33 37.786 44.954 15.155 17.613 50.176 58.47 51.917 60.518 1.126 1.536 2.253 2.662 2.355 2.56s-4.813-17.51-10.854-38.81zM629.76 746.803c-10.957-15.36-28.774-40.653-39.834-56.115-33.894-47.923-62.669-88.474-103.526-145.92-21.606-30.413-41.062-58.778-43.213-62.976-9.523-18.944-10.342-41.677-2.355-62.054 17.613-44.339 70.861-61.85 111.923-36.864 14.541 8.909 27.648 25.498 32.563 41.472 1.126 3.789 9.626 47.514 13.722 71.27 0.922 5.222 7.373 40.038 13.926 75.776 2.048 10.752 5.222 27.955 7.066 38.4 7.168 38.912 14.336 77.926 21.094 114.176 1.638 9.011 3.686 20.275 4.506 25.088 0.922 4.813 2.253 12.288 3.174 16.691s1.434 8.294 1.126 8.499c-0.205 0.205-9.318-12.186-20.173-27.443z" />
+<glyph unicode="&#xeb19;" glyph-name="Smart_heating_switch" d="M166.605 830.464c-18.637-5.12-33.69-20.89-37.478-39.219-0.819-3.891-1.126-100.25-1.126-344.064 0-289.894 0.205-339.456 1.536-344.166 5.018-18.944 20.582-33.997 39.219-37.888 7.68-1.638 678.81-1.638 686.49 0 19.558 4.096 36.147 20.89 39.629 40.243 0.819 4.403 1.126 105.165 1.126 344.064 0 289.382-0.205 338.842-1.536 343.552-5.018 18.944-20.48 33.894-39.219 37.888-8.602 1.843-681.984 1.434-688.64-0.41zM535.552 676.864c23.859-2.765 47.104-9.626 68.096-20.173 21.914-11.059 36.147-21.606 54.886-40.755 49.562-50.483 69.12-122.163 52.224-191.488-15.565-63.59-62.157-116.941-123.494-141.312-33.894-13.414-75.162-17.613-111.104-11.162-41.062 7.373-79.974 27.75-109.773 57.549-20.070 20.070-38.605 50.176-48.333 78.438-12.595 36.454-13.926 80.384-3.789 119.398 15.258 57.958 60.416 110.080 116.122 134.042 18.534 7.987 40.346 13.824 57.549 15.462 3.994 0.41 7.27 0.819 7.373 0.922 1.229 1.024 29.184 0.41 40.243-0.922zM640 204.8v-12.8h25.6v-25.6h-25.6v-25.6h-25.6v25.6h-25.6v25.6h25.6v25.6h25.6v-12.8zM435.2 179.2v-12.8h-76.8v25.6h76.8v-12.8zM582.144 625.869c-6.656-2.662-8.806-5.325-19.763-24.064-19.661-33.894-25.6-44.646-26.317-47.923-0.819-4.198 0.819-10.957 3.789-15.36s11.059-8.602 16.589-8.602c5.018 0 11.571 2.867 14.541 6.246 1.229 1.331 10.24 16.282 19.968 33.178 17.613 30.413 17.818 30.822 17.818 36.864 0 7.885-2.458 13.005-8.397 16.998-5.12 3.584-13.21 4.813-18.227 2.662z" />
+<glyph unicode="&#xeb1a;" glyph-name="smart_home" d="M492.032 814.49c-12.186-2.56-14.848-3.482-25.088-8.499-16.384-8.090-18.33-9.83-76.186-67.891-23.757-23.757-98.304-98.509-165.888-166.195l-122.675-122.88h153.805v-157.696c0-140.186 0.205-158.618 1.638-165.683 5.837-28.467 26.317-50.381 55.398-59.29 5.632-1.638 17.203-1.843 195.379-2.048 171.52-0.307 190.157-0.205 197.632 1.331 31.744 6.451 55.706 31.232 60.928 62.976 0.614 4.301 1.024 60.518 1.024 163.43v156.979l152.986 0.512-172.134 172.237c-185.856 185.958-178.688 179.2-197.12 186.778-13.005 5.325-22.528 7.373-37.171 7.68-10.24 0.205-15.462-0.205-22.528-1.741zM345.088 394.24c47.104-6.861 87.45-22.835 125.338-49.459 14.746-10.342 39.219-32.87 51.61-47.514 40.141-47.206 63.283-106.291 66.355-169.574l0.614-12.493h-46.285v6.451c-0.102 7.475-0.717 15.258-2.048 23.757-0.614 3.379-1.331 7.782-1.638 9.728-0.922 5.939-4.506 19.456-7.782 29.184-24.576 73.83-89.498 136.499-163.328 157.594-18.125 5.222-30.515 7.373-48.64 8.397l-12.083 0.717v45.978l14.131-0.717c7.68-0.307 18.432-1.229 23.757-2.048zM321.741 302.182c71.27-4.301 137.728-54.886 161.894-123.187 7.475-21.197 11.776-45.363 11.059-61.952-0.102-1.741-1.843-1.843-22.426-1.843h-22.426l-0.614 10.035c-2.15 34.611-16.282 66.048-40.653 90.317-20.48 20.48-44.339 32.973-74.035 38.81-10.24 1.946-18.944 3.072-24.474 3.174h-2.765v22.221c-0.102 22.016 0.205 24.269 3.379 23.347 0.614-0.205 5.632-0.614 11.059-0.922zM325.018 207.258c22.323-3.891 45.773-19.354 58.982-38.81 10.24-15.155 15.36-29.696 16.896-48.333l0.307-4.915h-46.49l-1.331 7.68c-2.253 13.824-10.547 26.010-22.016 32.768-5.222 3.072-16.589 6.554-21.299 6.656h-2.867v47.104l5.939-0.512c3.174-0.307 8.499-1.024 11.878-1.638z" />
+<glyph unicode="&#xeb1b;" glyph-name="smart_lightswitch" d="M145.818 830.566c-5.939-1.843-11.264-6.246-14.541-11.776l-2.765-4.71-0.307-364.032c-0.205-408.678-1.024-369.971 7.475-378.47 8.397-8.294-28.365-7.578 376.832-7.578 332.698 0 361.984 0.102 366.592 1.638 5.222 1.843 11.571 7.373 14.541 12.902 1.741 3.277 1.843 18.842 2.15 367.309 0.102 236.237-0.102 365.158-0.819 367.616-1.434 5.427-6.656 11.981-12.083 15.258l-4.813 2.765-364.032 0.205c-295.629 0.102-364.851-0.102-368.23-1.126zM601.6 649.216c5.837-3.584 10.445-9.728 11.776-15.462 0.614-2.355 1.024-80.691 1.024-187.085v-183.091l-2.662-5.53c-1.434-3.072-4.301-6.963-6.349-8.704-7.68-6.349-6.042-6.246-96.154-5.939l-81.92 0.307-4.915 3.072c-5.837 3.584-10.445 9.728-11.776 15.462-0.614 2.355-1.024 80.384-1.024 186.368 0 200.499-0.41 187.187 6.144 195.174 1.741 2.048 5.53 4.915 8.499 6.349l5.325 2.662 167.117-0.512 4.915-3.072zM271.872 496.64c2.867-0.922 6.246-2.458 7.578-3.277 2.458-1.536 2.253-1.741-32.256-36.25-19.046-19.046-35.021-34.714-35.328-34.714-1.024 0-3.994 7.782-5.632 14.336-6.451 26.522 10.65 54.17 37.786 61.030 6.758 1.741 21.094 1.126 27.853-1.126zM786.432 495.616c3.994-1.536 7.168-3.072 7.168-3.379 0-1.126-69.53-70.349-70.042-69.837-0.205 0.307-1.638 3.482-3.174 7.168-3.277 8.090-4.301 22.118-2.15 30.208 4.915 18.739 18.739 32.666 37.478 37.888 8.294 2.253 21.709 1.434 30.72-2.048zM303.206 467.251c3.072-8.192 3.072-7.987 3.482-17.818 1.536-29.798-24.576-54.886-54.579-52.326-7.27 0.614-15.462 2.97-19.558 5.53-2.458 1.536-2.253 1.741 32.256 36.25 19.046 19.046 35.021 34.714 35.328 34.714 0.41 0 1.741-2.867 3.072-6.349zM815.616 466.227c3.277-8.397 4.198-18.842 2.355-28.467-4.915-26.726-33.69-45.773-60.211-39.936-5.53 1.229-15.36 5.12-15.36 6.042 0 0.819 68.915 69.734 69.734 69.734 0.307 0 1.946-3.379 3.482-7.373zM435.2 473.6v-153.6h153.6v307.2h-153.6v-153.6z" />
+<glyph unicode="&#xeb1c;" glyph-name="smart_powerstation" d="M500.224 882.586c-22.938-3.379-41.37-11.776-57.549-26.522-6.861-6.144-16.077-17.92-19.661-24.986l-2.355-4.403-6.758 6.963c-16.179 16.486-34.918 24.166-57.446 23.552-20.787-0.512-37.376-7.578-52.122-22.016-13.926-13.824-22.733-34.304-22.733-53.248 0-5.222-0.102-5.427-2.253-4.813-14.438 4.096-30.208 4.506-42.803 1.229-12.8-3.379-26.522-11.571-36.25-21.606-32.768-33.997-26.010-91.341 13.722-116.736 8.602-5.427 12.595-7.27 22.835-10.342l8.397-2.458h246.989l1.741-20.685c1.024-11.469 2.048-21.709 2.15-22.835 0.205-1.126 0.614-5.734 1.024-10.24s0.922-9.114 1.024-10.24c0.205-1.126 0.614-5.325 0.922-9.318 0.41-3.994 0.819-8.192 1.024-9.216 0.205-1.126 0.717-6.042 1.126-10.957l0.717-9.011 108.646 0.41c115.814 0.41 110.592 0.102 124.211 5.12 20.582 7.578 39.219 24.166 48.947 43.622 22.938 45.875 3.891 100.557-42.598 121.856-10.445 4.813-24.064 8.090-33.792 8.294h-2.765l3.994 7.475c19.456 36.147 2.662 78.131-36.864 92.058-8.397 2.97-24.883 3.379-34.714 0.717-7.578-2.048-15.667-5.632-20.787-9.318-2.867-1.946-2.867-1.946-2.867 0 0 4.813-5.222 22.016-9.011 29.696-6.144 12.493-10.957 19.251-20.173 28.365-15.258 15.258-31.949 24.064-54.272 28.672-3.994 0.819-25.702 1.536-29.696 0.922zM150.118 571.699c-0.307-2.458-0.819-6.656-1.126-9.523-1.434-15.462-3.686-37.376-4.096-40.448-0.819-7.475-2.048-18.022-3.072-28.16-0.307-3.379-1.024-9.626-1.536-13.824s-1.229-10.24-1.536-13.312c-0.307-3.072-1.229-10.957-2.048-17.408s-1.741-14.541-2.048-17.92c-0.307-3.379-0.819-7.782-1.024-9.728-0.307-1.946-0.717-5.632-1.024-8.192s-0.717-6.246-1.024-8.192c-0.205-1.946-0.717-6.144-1.024-9.216s-0.819-7.27-1.024-9.216c-1.024-8.192-1.536-12.39-3.072-25.088-0.819-7.27-1.946-16.794-2.56-20.992-0.512-4.198-1.741-13.414-2.56-20.48-0.922-7.066-1.843-13.926-2.048-15.36s-0.922-6.451-1.536-11.264c-0.512-4.813-1.229-9.83-1.434-11.264s-0.717-4.71-1.024-7.27c-0.41-2.56-0.819-5.837-1.024-7.168-0.307-1.331-0.717-4.608-1.024-7.168-0.41-2.56-0.819-5.837-1.126-7.168-1.024-6.656-2.56-17.306-3.072-21.402-0.819-6.042-7.475-49.152-8.704-56.32-0.614-3.072-2.867-17.101-5.12-31.232-5.222-32.666-6.042-37.376-6.656-40.448-0.307-1.434-1.229-6.451-2.048-11.264s-2.458-14.234-3.584-20.992c-1.229-6.758-2.458-13.619-2.662-15.36-0.307-1.638-1.229-6.554-2.048-10.752-1.024-5.325-1.434-15.462-1.434-32.973v-25.395h870.4v281.6h-51.2v204.8h-51.2v-204.8h-120.525l-1.229 7.987c-0.717 4.301-1.638 10.24-2.15 13.005-0.614 2.867-2.355 14.131-4.096 25.088s-3.482 22.323-4.096 25.088c-0.512 2.867-1.126 6.963-1.434 9.216-0.614 3.789-2.97 19.046-10.752 67.072-1.741 10.445-4.301 26.317-5.734 35.328s-2.867 17.613-3.174 19.251l-0.614 2.765h-183.091l0.41-3.789c0.41-3.277 2.253-19.661 4.301-37.171 0.205-2.56 0.717-6.246 0.922-8.192 0.307-1.946 0.819-5.837 1.126-8.704 0.512-5.018 0.819-7.987 1.946-16.384 0.205-2.253 0.717-6.144 0.922-8.704 0.307-2.56 1.229-10.342 2.15-17.408 0.819-7.066 1.741-14.848 2.048-17.408s0.819-6.451 1.126-8.704c0.205-2.253 0.614-5.427 0.819-7.168 0.717-6.144 4.813-36.966 5.222-39.424 0.205-1.434 1.126-7.885 2.048-14.336 0.819-6.451 2.765-19.558 4.198-29.184 3.174-21.709 9.626-63.795 10.138-66.765 0.205-1.229 0.819-5.837 1.536-10.24 0.614-4.403 1.536-10.24 2.15-13.107 0.512-2.765 3.994-23.347 7.68-45.568s7.066-42.496 7.578-45.056c0.41-2.56 2.048-11.469 3.482-19.968 1.536-8.397 2.97-15.974 3.174-16.589 0.307-1.024-5.222-1.331-25.6-1.331-23.859 0-26.010 0.102-26.522 1.843-0.717 2.355-10.65 59.494-16.896 97.485-4.506 27.648-6.451 39.834-10.342 64.512-1.126 6.861-6.758 44.851-7.68 51.2-0.307 1.946-0.717 4.71-1.024 6.144-0.205 1.434-0.717 4.915-1.024 7.68-0.307 2.867-1.536 11.571-2.662 19.456s-2.458 17.613-2.97 21.504c-0.512 3.994-1.434 11.059-2.048 15.872s-1.331 10.342-1.536 12.288c-0.819 6.349-4.403 36.147-5.12 42.496-0.41 3.277-0.819 6.758-1.024 7.68-0.102 0.819-0.614 4.813-0.922 8.704-0.41 3.994-0.922 8.294-1.126 9.728s-0.614 4.608-0.922 7.168c-0.307 2.56-1.024 8.499-1.536 13.312-0.614 4.813-1.331 11.469-1.638 14.848-0.41 3.379-0.819 7.27-1.024 8.704-0.512 3.277-1.229 9.318-2.56 22.016-0.614 5.632-1.331 11.674-1.536 13.312-0.205 1.741-0.717 5.837-1.024 9.216-0.41 3.379-0.819 7.27-1.024 8.704s-0.717 6.246-1.126 10.752c-0.307 4.506-0.819 9.011-1.024 10.138-0.307 1.843-0.819 6.451-1.946 17.51-1.434 15.155-2.662 26.112-3.174 30.515l-0.717 4.813h-294.4l-0.614-4.301zM691.2 166.4v-25.6h-51.2v51.2h51.2v-25.6zM793.6 166.4v-25.6h-51.2v51.2h51.2v-25.6zM896 166.4v-25.6h-51.2v51.2h51.2v-25.6zM691.2 64v-25.6h-51.2v51.2h51.2v-25.6zM793.6 64v-25.6h-51.2v51.2h51.2v-25.6zM896 64v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xeb1d;" glyph-name="Smart_Sensor" d="M233.984 829.952c-39.219-6.963-73.421-32.051-91.443-67.072-6.451-12.39-9.011-19.968-13.107-38.4-0.512-1.946-1.024-151.347-1.126-332.083l-0.307-328.397h324.198c287.642 0 325.427 0.205 334.95 1.638 47.104 6.963 86.938 40.448 102.195 85.811 1.434 4.198 3.379 10.752 4.301 14.643 1.638 6.451 1.741 29.901 2.048 336.486l0.307 329.421-325.837-0.102c-307.917-0.102-326.554-0.205-336.179-1.946zM343.552 651.264c33.997-3.277 64.205-9.728 94.925-20.070 91.034-30.515 170.803-94.515 219.648-176.026 8.090-13.414 9.421-15.974 16.282-29.696 19.968-40.243 31.642-78.029 38.81-126.464 0.205-1.638 0.717-6.042 1.126-9.728 0.307-3.686 0.717-7.68 0.922-9.011s0.717-10.24 1.126-19.763l0.717-17.306h-70.963l-0.102 7.475c-0.102 3.994-0.205 8.499-0.307 9.933-0.205 1.434-0.614 7.168-1.024 12.8-0.922 13.722-4.198 33.997-7.885 49.459-14.643 60.928-44.646 114.586-88.781 158.822-14.746 14.746-16.589 16.384-28.877 26.214-36.864 29.594-79.053 50.893-124.416 62.976-17.613 4.71-40.346 8.704-55.808 9.83-5.325 0.41-10.445 0.819-11.264 1.024-0.819 0.102-5.837 0.307-10.957 0.307l-9.523 0.102v70.861l16.179-0.717c8.806-0.307 17.92-0.819 20.173-1.024zM336.896 520.294c1.434-0.205 5.12-0.717 8.192-1.126 22.938-2.662 53.862-11.469 77.21-22.221 32.358-14.746 58.982-33.587 84.173-59.29 17.818-18.125 30.106-34.304 42.291-55.603 4.506-7.782 14.438-27.648 14.438-28.877 0-0.307 1.126-2.97 2.458-5.837 5.734-12.493 13.722-42.086 16.384-60.518 1.946-13.21 2.662-21.197 3.072-33.69l0.41-9.933-35.43 0.205-35.43 0.307-0.307 8.704c-3.174 93.901-71.475 174.899-164.147 194.458-5.325 1.126-13.21 2.355-17.408 2.765s-8.397 0.819-9.216 1.024c-0.819 0.102-4.915 0.307-8.909 0.307l-7.475 0.102v70.963l13.619-0.717c7.373-0.307 14.643-0.819 16.077-1.024zM330.342 388.915c49.971-7.987 92.16-40.96 111.821-87.347 6.758-15.974 10.957-34.406 11.366-50.381l0.205-7.987h-70.451l-0.614 7.987c-1.741 21.914-13.619 42.496-32.256 55.603-10.24 7.27-27.443 13.107-38.81 13.414l-4.403 0.102v70.451l7.373-0.205c3.994-0.102 11.162-0.819 15.77-1.638z" />
+<glyph unicode="&#xeb1e;" glyph-name="smart_tap" d="M412.16 907.469c-10.65-3.584-19.251-10.65-23.654-19.354l-2.458-4.915h-60.723c-67.072 0-68.198-0.102-77.312-6.349-6.963-4.813-10.24-8.602-13.824-16.179-2.867-5.939-3.277-7.68-3.277-15.872s0.307-9.933 3.174-15.872c5.222-11.059 14.643-18.842 26.214-21.504 2.662-0.614 28.467-1.024 64.102-1.024h59.597v-76.595l-18.637-0.41c-17.101-0.512-19.251-0.717-25.088-3.072-16.486-6.861-28.467-20.89-31.949-37.478-0.614-3.174-1.126-16.998-1.126-33.485v-28.16h-179.2v-179.2h271.36c194.048 0 272.794-0.307 276.685-1.126 19.149-3.994 35.738-20.582 39.629-39.629 0.717-3.379 1.126-21.299 1.126-48.23 0-46.285 0.205-47.821 5.632-54.989 1.331-1.741 4.71-4.608 7.373-6.144l4.915-2.97 140.8-0.614 5.632 2.662c6.042 2.867 11.264 8.499 13.414 14.643 2.048 5.837 1.946 116.736-0.102 134.861-5.325 45.158-24.474 85.197-56.73 118.477-32.461 33.587-70.656 52.736-120.934 60.826-2.56 0.41-43.725 0.922-91.648 1.126-47.821 0.205-87.040 0.512-87.245 0.717-0.102 0.102-0.307 13.107-0.307 28.979-0.102 20.89-0.512 30.208-1.536 34.099-4.915 18.739-20.685 33.894-39.219 37.786-2.97 0.614-12.288 1.126-20.685 1.126h-15.36v76.8h60.416c58.266 0 60.723 0.102 66.765 2.15 10.547 3.482 18.125 10.445 23.142 21.094 2.355 5.12 2.765 7.27 2.765 15.155 0 8.192-0.41 9.933-3.174 15.872-3.994 8.499-10.342 14.848-18.842 18.842l-6.656 3.174-126.464 0.614-2.56 4.915c-5.837 11.674-18.227 19.456-32.051 20.173-4.915 0.205-9.421-0.102-11.981-0.922zM801.587 235.827c-2.048-3.584-9.523-16.589-16.691-28.979s-14.131-24.474-15.462-26.829c-1.331-2.355-8.192-14.131-15.053-26.112-16.998-29.286-18.022-31.13-20.173-37.069-2.97-8.192-4.096-13.005-4.71-21.709-2.458-32.461 16.384-63.386 46.387-76.083 19.046-8.192 43.52-7.885 61.747 0.717 20.685 9.626 35.84 27.341 42.086 48.947 1.843 6.246 2.355 10.752 2.355 19.866 0 6.451-0.307 13.21-0.614 14.848-0.41 1.741-1.024 4.506-1.434 6.144-1.331 6.349-6.144 15.974-19.149 38.4-26.010 44.954-50.688 87.859-52.326 91.034-0.922 1.741-2.048 3.174-2.458 3.174s-2.458-2.867-4.506-6.349zM794.112 92.365c-3.072-7.373-11.264-13.005-18.944-13.005-11.059 0-20.48 9.83-20.48 21.299 0 4.403 0.614 5.632 17.306 34.509 8.090 14.131 16.077 27.955 17.715 30.72 1.638 2.867 3.482 6.246 4.198 7.578 1.024 2.048 1.331-5.222 1.536-37.478 0.205-33.69 0-40.55-1.331-43.622z" />
+<glyph unicode="&#xeb1f;" glyph-name="smart_watch" d="M371.405 907.264c-18.534-5.12-33.69-20.89-37.478-39.219-0.717-3.584-1.126-23.859-1.126-59.085v-53.76h307.2v54.579c-0.102 58.982-0.102 59.699-5.734 71.27-3.686 7.475-14.541 18.33-21.914 21.914-12.595 6.042-7.987 5.837-126.976 5.734-86.528-0.102-110.080-0.41-113.971-1.434zM244.019 728.166c-18.739-4.608-34.714-21.299-38.093-39.936-1.536-8.602-1.536-471.859 0-480.461 3.584-19.661 20.48-36.557 40.346-40.346 4.506-0.819 70.246-1.024 244.224-0.819l238.080 0.307 6.349 2.662c17.613 7.578 29.491 22.118 32.461 39.834 0.307 1.434 0.512 61.44 0.512 133.427l0.102 130.765h20.48c22.528 0 24.576 0.41 28.57 6.042 2.048 2.867 2.15 4.301 2.15 31.846 0 31.846-0.205 33.075-6.451 36.864-2.97 1.843-5.222 2.048-23.962 2.048h-20.787v66.56c0 44.442-0.41 68.301-1.126 71.885-3.994 19.046-20.582 35.635-39.629 39.629-8.294 1.741-475.955 1.434-483.226-0.307zM716.8 448v-230.4h-460.8v460.8h460.8v-230.4zM477.491 651.059c-2.458-0.819-6.349-3.482-8.909-5.837-8.294-8.090-7.885-2.048-7.578-109.773l0.307-95.13 2.765-4.608c1.536-2.56 26.522-28.365 56.832-58.47 48.742-48.538 54.579-54.067 59.085-55.603 6.144-2.048 10.138-2.048 16.179-0.205 6.246 1.843 11.571 6.042 14.95 11.776 2.355 3.994 2.765 5.837 2.765 12.39s-0.512 8.499-2.765 12.288c-1.536 2.56-24.474 26.214-50.893 52.736l-48.23 48.128v86.118c0 97.075 0.41 92.262-7.782 100.352-6.861 6.963-17.306 9.216-26.726 5.837zM332.8 87.040c0-35.226 0.41-55.501 1.126-59.085 4.096-19.558 21.504-36.659 40.653-39.834 3.379-0.512 50.483-0.922 113.357-0.922 116.838 0 112.23-0.205 124.314 5.837 6.963 3.482 18.227 14.438 21.299 20.787 6.451 13.107 5.939 7.578 6.246 69.939l0.307 57.037h-307.302v-53.76z" />
+<glyph unicode="&#xeb20;" glyph-name="social_network" d="M700.211 831.488c-0.205-0.205-3.072-0.614-6.451-1.024-14.336-1.536-32.154-6.451-47.104-12.698-58.982-25.088-100.864-81.306-107.93-145.101-1.946-18.125-0.922-40.243 2.458-55.194 0.819-3.277 1.331-6.144 1.229-6.349-0.205-0.205-29.594-14.438-56.525-27.341l-13.21-6.349-4.608 5.632c-7.168 8.806-22.118 23.040-32.358 30.72-27.136 20.378-53.658 31.334-90.624 37.478-8.602 1.434-39.629 1.434-50.176-0.102-71.987-10.138-130.867-57.651-155.75-125.747-2.765-7.475-4.608-14.541-7.987-29.798-2.253-10.035-3.072-21.709-2.662-38.912 0.205-9.523 0.614-19.046 1.024-20.992 4.915-29.594 12.595-51.507 25.6-73.114 30.618-50.995 83.456-85.504 141.312-92.467 10.752-1.229 42.906-0.922 51.712 0.614 20.89 3.584 38.298 9.011 55.808 17.613 20.685 10.035 36.454 21.504 53.453 38.605l9.421 9.626 10.035-5.632c5.53-3.072 14.234-7.885 19.251-10.65 42.189-22.528 48.64-26.419 48.128-28.467-7.68-28.979-8.602-58.266-2.458-86.528 18.227-84.89 95.334-144.589 182.17-141.005 85.094 3.584 154.726 64.819 169.574 149.197 1.843 10.65 2.662 38.605 1.331 49.664-1.331 12.186-4.71 26.931-8.499 37.99-22.426 64.614-78.541 110.49-146.534 119.706-22.323 3.072-58.163 0-77.312-6.656-27.853-9.626-49.971-23.040-70.246-42.394l-10.957-10.547-24.166 13.312c-13.312 7.27-30.515 16.691-38.195 20.89-7.782 4.198-14.336 7.987-14.643 8.499-0.307 0.41 0.614 5.12 1.946 10.445 1.331 5.222 2.765 12.083 3.174 15.155s0.922 6.554 1.126 7.68c0.307 1.126 0.717 8.499 1.024 16.384 0.717 15.462-0.512 31.232-3.482 45.773l-1.843 8.806 15.974 7.782c8.704 4.198 24.371 11.776 34.714 16.794l18.842 9.114 7.27-8.192c45.568-51.61 119.194-72.499 185.242-52.531 40.96 12.493 76.083 38.912 99.226 74.854 33.792 52.224 37.581 120.422 9.83 176.128-26.829 53.76-77.619 90.214-137.114 98.202-8.704 1.126-39.117 1.946-40.038 1.126zM726.016 754.176c22.221-4.198 38.912-24.474 38.912-47.002 0-16.691-8.499-32.051-22.528-41.062-14.438-9.318-35.226-9.626-50.074-0.717-27.034 16.179-31.642 53.453-9.421 75.469 11.776 11.571 27.136 16.384 43.11 13.312zM673.792 651.571c2.56-2.048 7.885-5.325 11.776-7.27 27.443-13.722 60.518-8.090 81.613 13.926l3.891 3.994 3.789-2.867c6.042-4.608 10.957-10.138 13.517-15.258 4.915-9.83 5.12-12.698 4.915-54.784l-0.205-39.424-6.656-4.301c-12.8-8.499-27.853-14.746-44.237-18.33-11.059-2.56-38.502-2.56-49.971-0.102-17.101 3.686-33.894 10.65-46.080 19.046l-5.632 3.891v41.37c0 38.195 0.102 41.779 1.946 46.49 3.379 8.909 9.421 16.794 16.384 21.402l3.994 2.662 3.174-3.379c1.741-1.843 5.222-5.018 7.782-7.066zM332.698 574.464c24.883-5.939 43.11-28.467 43.315-53.658 0.205-22.323-11.264-41.37-30.72-51.098-22.528-11.264-47.821-7.066-65.638 11.059-16.691 16.896-20.685 43.52-9.728 64.717 11.674 22.63 38.093 34.816 62.771 28.979zM273.818 452.096c6.963-4.71 15.155-8.602 24.269-11.366 10.957-3.379 31.744-3.379 43.213-0.102 13.926 3.994 27.955 12.288 37.478 22.118l4.506 4.608 4.301-2.97c9.933-6.861 18.432-19.661 20.89-31.539 0.717-3.379 1.126-19.866 1.126-43.213v-37.786l-6.758-4.813c-15.155-10.854-32.256-18.739-49.050-22.835-12.288-2.97-15.155-3.277-31.232-3.686-14.029-0.41-18.022-0.102-31.744 2.662-16.384 3.174-37.888 12.595-52.429 22.938l-7.987 5.734v37.786c0 23.552 0.41 39.834 1.126 43.213 2.458 11.674 10.445 23.962 20.378 31.13l4.608 3.379 6.144-5.939c3.379-3.174 8.397-7.373 11.162-9.318zM726.016 344.576c22.221-4.198 38.912-24.474 38.912-47.002 0-13.517-4.506-24.064-14.336-33.894-13.722-13.824-32.358-18.022-50.483-11.674-13.926 4.915-26.931 19.661-30.31 34.304-3.891 16.589 2.56 36.454 15.36 47.309 5.018 4.403 15.565 9.933 18.739 9.933 1.229 0 2.765 0.41 3.482 0.922 2.048 1.229 12.288 1.331 18.637 0.102zM673.792 241.971c6.144-4.915 17.408-10.445 25.6-12.595 8.090-2.15 24.883-2.458 32.768-0.614 12.698 3.072 24.576 9.626 34.099 19.046l4.915 4.71 3.789-2.765c7.066-5.222 13.005-13.107 16.179-21.402 1.843-4.71 1.946-8.294 1.946-46.592v-41.472l-5.632-3.789c-12.186-8.192-29.491-15.462-45.056-18.842-11.981-2.56-35.226-2.765-47.616-0.512-17.818 3.277-35.738 10.445-48.64 19.456l-5.632 3.891-0.307 38.81c-0.102 23.757 0.205 40.755 0.819 43.725 2.253 10.65 10.138 22.118 18.944 27.546l3.072 1.843 3.072-3.379c1.741-1.843 5.12-5.12 7.68-7.066z" />
+<glyph unicode="&#xeb21;" glyph-name="software_update" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.445-0.922-11.264-1.126s-4.301-0.614-7.68-1.024c-5.837-0.614-22.221-3.072-26.624-3.994-1.126-0.205-5.734-1.229-10.24-2.15-21.811-4.608-58.982-15.974-71.68-22.016-1.126-0.512-5.018-2.15-8.704-3.686-9.728-3.891-35.635-16.998-47.002-23.654-32.973-19.354-61.030-41.062-88.064-67.994-51.712-51.507-89.805-115.098-110.080-184.218-4.71-15.77-10.854-41.779-10.854-45.568 0-1.331 7.782-1.536 65.434-1.536h65.434l0.614 3.584c1.229 6.144 8.806 28.16 14.029 40.346 44.442 103.526 142.336 174.899 253.952 185.139 21.914 2.048 63.59 0.41 81.818-3.277 20.378-3.994 26.112-5.427 41.472-10.445 47.718-15.565 89.395-41.37 124.109-76.8 10.547-10.65 23.757-26.317 29.594-34.611l3.686-5.427-48.742-48.742c-26.829-26.829-48.742-48.947-48.742-49.254s51.814-0.512 114.995-0.512c111.309 0 115.302 0.102 122.982 2.048 10.957 2.765 17.306 6.451 25.702 14.848s12.083 14.746 14.848 25.702c1.946 7.68 2.048 11.674 2.048 122.982 0 63.181-0.205 114.995-0.41 114.995-0.307 0-20.89-20.275-45.773-45.158-24.883-24.781-45.568-44.749-45.978-44.237-0.512 0.41-3.482 4.096-6.656 7.987-45.568 56.013-107.622 101.376-176.128 128.717-34.611 13.824-79.053 24.781-114.176 28.058-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM122.368 370.176c-16.486-3.379-32.154-15.155-39.219-29.798-6.451-13.21-6.144-6.758-6.246-134.349l-0.102-116.531 45.67 45.67c25.19 25.19 46.080 45.363 46.49 44.851 0.41-0.41 4.198-4.915 8.397-10.035 58.163-70.451 139.776-121.958 227.942-143.872 38.605-9.626 65.126-12.8 106.701-12.8 26.419 0 33.28 0.41 56.218 3.174 52.941 6.451 112.742 26.419 160.051 53.658 18.227 10.547 45.158 28.979 57.242 39.322 2.048 1.741 5.939 5.018 8.704 7.27 19.354 15.974 45.978 44.032 64.307 68.096 37.581 48.947 65.229 108.749 78.541 169.779 1.638 7.475 2.97 14.234 2.97 15.053 0 1.331-8.602 1.536-65.434 1.536h-65.434l-0.614-3.584c-2.458-13.21-15.667-46.080-26.317-65.536-46.694-85.914-129.434-143.77-226.202-158.208-23.962-3.584-63.898-3.584-88.371 0.102-65.536 9.626-125.133 39.424-171.827 85.914-13.005 12.902-35.738 39.936-35.738 42.394 0 0.307 22.118 22.63 49.152 49.766l49.254 49.152-116.019-0.102c-63.795-0.102-117.862-0.512-120.115-0.922z" />
+<glyph unicode="&#xeb22;" glyph-name="Sport_channel" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM738.304 726.63c13.517-4.301 27.443-16.282 33.894-29.082 6.451-12.595 8.090-26.419 4.813-40.141-2.56-10.957-7.27-19.149-15.667-27.75-25.907-26.317-69.837-22.118-89.907 8.602-7.27 11.162-9.728 19.661-9.728 33.485 0 10.24 3.174 22.016 8.192 29.696 8.704 13.619 22.733 23.552 38.195 27.034 6.861 1.536 22.835 0.512 30.208-1.843zM546.714 706.867c6.144-2.867 147.251-143.462 150.426-149.914 1.229-2.355 2.355-5.53 2.662-7.168 0.205-1.638 0.512-23.552 0.512-48.742l0.102-45.875h114.381l6.349-3.174c13.312-6.656 19.661-22.118 14.541-35.635-3.482-9.318-10.445-15.872-19.763-18.637-2.048-0.614-31.437-1.024-76.595-1.024-71.987 0-73.421 0-79.053 2.15-6.758 2.458-13.107 8.806-16.384 16.179-1.946 4.506-2.048 6.758-2.15 40.448 0 19.558-0.307 35.533-0.614 35.533s-15.258-14.643-33.178-32.563l-32.461-32.461 59.802-59.802c42.189-42.189 60.518-61.133 62.157-64.512 1.946-3.789 2.458-6.349 2.458-12.902 0-7.168-0.41-8.909-3.072-13.722-3.482-6.246-10.957-12.39-17.51-14.234-3.072-0.922-31.642-1.229-106.086-1.229-114.688 0-108.339-0.41-117.35 7.68-8.192 7.373-11.878 19.456-9.011 29.286 2.867 9.523 11.264 18.022 20.48 20.48 2.867 0.819 24.576 1.126 67.994 1.229 35.021 0 63.693 0.307 63.693 0.614s-23.45 24.064-52.019 52.634l-52.122 52.122-108.749-108.749c-120.422-120.422-113.152-113.869-126.669-113.766-20.48 0.102-34.202 20.275-26.931 39.629 2.15 5.837 8.397 12.186 175.104 178.995l172.851 172.851-23.45 23.552-23.552 23.45-40.55-40.448c-37.274-37.171-40.96-40.653-46.285-42.598-19.661-7.475-39.526 6.246-39.526 27.136 0 13.005-1.024 11.674 54.989 67.789 27.648 27.75 52.122 51.712 54.272 53.248 8.192 5.734 20.89 6.656 30.31 2.15z" />
+<glyph unicode="&#xeb23;" glyph-name="Start_services" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.318-3.891-34.509-16.486-46.182-23.347-41.062-23.757-76.8-53.35-110.49-91.341-6.861-7.782-16.077-19.456-23.45-29.696-3.994-5.632-7.578-10.65-8.090-11.264-1.843-2.355-13.517-21.094-17.408-27.75-24.371-41.984-44.544-98.509-51.405-143.565-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-55.706 74.547-136.294 130.253-225.69 156.16-25.805 7.475-52.941 12.8-75.776 14.95-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM526.746 701.030c10.342-4.506 17.203-12.186 20.992-23.45 2.15-6.144 2.15-7.987 2.15-100.864 0-103.117 0.102-100.557-5.939-110.899-3.379-5.939-13.619-14.131-19.968-15.974-6.656-1.946-19.866-1.638-25.293 0.512-10.65 4.403-18.842 13.107-22.528 23.859-1.946 5.53-2.048 9.523-2.048 101.069 0 78.95 0.307 96.358 1.434 100.864 3.174 11.674 13.005 22.016 24.883 25.907 7.578 2.56 19.149 2.048 26.317-1.024zM397.312 612.864c5.939-1.536 14.541-7.373 19.149-13.107 8.704-10.65 10.752-26.624 5.018-39.322-1.331-3.174-5.837-9.216-10.752-14.643-21.606-23.552-33.28-47.309-37.99-76.8-1.331-7.782-1.638-29.696-0.614-37.786 6.042-47.206 35.328-88.474 77.722-109.363 32.666-16.179 71.782-18.842 105.882-7.475 47.514 15.872 82.33 53.965 93.491 102.4 2.56 11.059 3.482 20.378 3.277 33.792-0.307 35.43-13.312 67.072-39.014 94.925-4.506 4.915-9.011 10.445-9.933 12.186-4.506 8.806-5.632 19.968-2.867 29.286 5.632 18.739 24.371 30.208 43.725 26.726 8.704-1.638 16.384-6.349 25.395-15.974 30.413-32.154 50.688-73.114 57.242-115.917 12.902-84.787-23.962-167.936-95.744-215.45-69.018-45.875-160.256-47.718-231.424-4.71-20.48 12.39-42.906 32.051-57.754 50.688-67.789 84.89-62.771 205.824 11.674 284.979 14.336 15.258 26.931 19.763 43.52 15.565z" />
+<glyph unicode="&#xeb24;" glyph-name="startup_wizard" d="M394.24 866.202c-19.456-2.97-41.472-10.547-67.072-22.938-22.118-10.752-35.738-21.504-40.96-32.256-5.427-11.059-4.71-17.92 4.813-41.574 8.806-22.016 10.342-33.28 6.349-47.002-4.403-15.155-18.125-33.075-35.635-46.182-13.926-10.547-24.269-14.541-37.478-14.438-9.626 0-17.408 2.048-34.304 8.806-16.282 6.554-22.63 8.192-29.696 7.475-19.354-1.946-37.99-27.136-55.808-75.469-7.578-20.48-9.83-31.13-9.626-46.080 0.102-18.637 6.963-25.907 34.714-37.376 18.739-7.68 27.955-14.234 35.226-25.293 13.107-19.456 14.541-60.928 3.174-84.48-6.656-13.517-16.282-21.094-39.834-31.13-16.589-7.066-21.811-10.24-26.931-16.282-11.571-13.414-8.192-40.96 10.24-83.968 16.179-37.888 31.334-55.91 48.64-57.958 7.27-0.819 13.312 0.614 30.31 7.475 20.275 8.192 29.184 10.035 40.653 8.397 14.336-2.048 27.853-9.933 43.008-24.986 14.438-14.541 21.709-26.522 24.371-40.141 2.56-13.312 1.024-21.606-8.090-43.827-2.97-7.27-5.939-15.974-6.656-19.354-4.198-20.378 8.909-36.147 44.544-53.248 32.154-15.565 61.44-24.064 78.336-22.938 16.691 1.229 25.702 10.035 34.816 34.099 0.512 1.126 2.97 6.554 5.632 12.083 7.27 15.462 16.282 23.757 32.563 30.31 15.258 6.144 47.104 6.042 65.126-0.205 18.227-6.349 27.443-16.589 38.093-42.701 10.752-26.112 18.33-32.87 37.274-33.382 17.818-0.41 44.851 7.68 75.264 22.426 21.606 10.547 31.642 17.613 39.629 27.853 9.011 11.674 8.499 23.142-2.253 47.206-6.451 14.131-9.216 29.082-7.475 39.936 2.662 17.101 17.613 38.4 37.171 52.941 14.336 10.65 24.269 14.336 37.888 14.234 9.728 0 15.77-1.638 33.792-8.909 16.282-6.451 22.733-8.090 29.696-7.373 16.486 1.741 31.539 18.944 47.002 53.965 17.613 40.038 22.733 66.253 15.974 81.613-3.994 9.421-11.674 14.95-32.358 23.45-23.859 9.728-34.202 19.046-40.653 36.25-3.686 9.728-5.222 20.378-5.018 35.328 0.205 29.798 8.602 47.923 27.546 59.904 2.56 1.638 10.957 5.632 18.637 8.806 14.848 6.246 22.528 10.65 26.931 15.36 13.107 14.029 9.626 42.803-10.854 89.088-16.077 36.25-30.618 52.838-47.718 54.374-6.861 0.614-15.053-1.434-31.232-8.192-15.77-6.451-22.016-8.090-31.642-8.090-17.101-0.102-30.822 6.554-49.664 24.269-6.451 6.042-16.589 19.251-20.070 26.010-5.53 11.059-7.27 23.142-5.018 35.226 0.717 3.789 4.096 13.926 7.475 22.528 3.482 8.499 6.758 18.022 7.373 21.094 3.994 19.046-8.294 34.406-40.346 50.688-5.734 2.867-12.288 6.042-14.541 6.963-31.437 13.312-47.309 17.613-64 17.613-20.173 0.102-27.136-5.632-37.786-31.13-9.83-23.142-16.282-32.461-27.546-39.322-18.022-10.957-50.688-13.619-74.65-6.144-20.89 6.554-29.286 16.179-42.394 48.026-6.656 16.486-13.926 24.576-24.371 27.546-5.427 1.536-14.234 1.946-20.582 1.024zM523.878 693.043c10.035-3.277 18.125-10.547 22.63-20.275l2.867-6.144v-199.68l-2.765-5.939c-3.379-7.168-11.981-15.974-18.739-19.251-4.301-2.048-6.758-2.355-15.872-2.458-10.342 0-11.059 0.102-17.203 3.482-7.68 4.198-13.824 10.547-17.408 18.33l-2.765 5.837v199.68l2.662 5.734c4.71 9.933 12.8 17.306 23.245 20.992 5.325 1.946 17.306 1.741 23.347-0.307zM403.046 624.128c6.451-3.174 14.336-10.65 17.408-16.486 2.355-4.71 4.301-14.746 3.891-20.070-1.024-11.264-4.608-17.613-16.589-29.696-33.997-33.894-50.176-78.848-45.158-125.235 9.728-90.112 96.768-152.064 184.73-131.584 59.699 13.926 105.37 61.85 115.814 121.754 1.741 9.933 2.458 33.792 1.229 44.134-3.994 34.611-21.914 69.632-47.616 93.696-10.24 9.523-14.746 19.763-14.029 31.846 0.717 13.517 9.728 26.522 22.118 32.256 5.632 2.56 7.68 2.97 15.667 2.97 8.397 0 9.933-0.307 16.077-3.379 7.066-3.482 19.661-14.95 30.618-27.853 18.33-21.606 32.461-46.592 41.779-73.421 3.584-10.445 8.704-31.539 9.83-40.243 0.41-3.072 0.922-6.554 1.229-7.68 0.922-3.789 1.126-41.984 0.307-48.128-0.41-3.379-1.126-8.704-1.434-11.776-2.56-19.968-10.854-46.182-21.504-67.584-55.808-112.026-191.181-158.208-303.206-103.424-64.41 31.539-109.363 89.395-123.904 159.539-3.277 15.565-4.096 24.781-4.096 45.261 0 20.275 0.717 27.853 4.198 44.954 9.114 45.158 30.003 83.968 63.078 117.043 14.029 14.029 21.402 17.51 35.533 16.691 5.837-0.307 9.011-1.126 14.029-3.584z" />
+<glyph unicode="&#xeb25;" glyph-name="stocks" d="M153.6 491.315c0-285.389 0-289.587-2.048-292.864-5.12-8.397-16.384-8.397-21.504 0-2.048 3.174-2.048 6.963-2.048 236.544v233.165h-51.2v-241.869c0-260.506-0.205-247.398 5.12-261.734 2.662-6.963 4.506-10.445 9.318-17.101 10.547-14.336 22.426-23.040 39.834-28.877l8.704-2.867h371.2c361.677 0 371.405 0 378.368 1.946 27.341 7.475 47.923 27.75 55.501 54.886 1.741 6.349 1.843 18.432 1.843 264.192v257.536l-2.765 9.83c-6.144 22.528-19.456 42.394-36.966 55.501-14.131 10.445-25.702 15.667-42.701 19.149-9.83 2.048-15.053 2.048-360.346 2.048h-350.31v-289.485zM847.258 700.723c13.312-6.349 21.299-17.306 22.733-31.437 1.741-15.974-7.066-31.232-22.118-38.4l-6.656-3.174h-581.632l-6.758 3.277c-8.704 4.301-14.848 10.445-18.739 18.739-2.867 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c3.584 7.578 8.499 13.005 15.36 16.998 9.83 5.734-9.933 5.427 302.49 5.222l289.28-0.205 6.042-2.765zM281.6 409.6v-166.4h562.176v-25.6h-562.176v-25.6h-25.6v25.6h-25.6v25.6h25.6v332.8h25.6v-166.4zM843.776 422.4v-153.6h-536.576l76.8 102.4 51.2-51.2 102.4 102.4 51.2-51.2 41.677 33.485c23.040 18.432 46.387 37.171 52.019 41.779s31.027 24.986 56.32 45.261c25.395 20.275 59.187 47.616 75.264 60.518 16.077 13.005 29.286 23.654 29.491 23.654 0.102 0.102 0.205-69.018 0.205-153.498z" />
+<glyph unicode="&#xeb26;" glyph-name="stop_secret" d="M501.76 876.442c-20.787-14.234-53.453-32.461-75.776-42.394-5.325-2.355-11.981-5.427-14.848-6.656-31.334-14.029-80.179-28.877-117.248-35.738-4.813-0.922-10.957-2.15-13.824-2.662-2.765-0.512-7.373-1.229-10.24-1.536-2.765-0.307-6.246-0.819-7.68-1.024-5.12-0.922-30.413-3.482-40.448-4.096-5.632-0.41-12.493-0.819-15.36-1.024-2.765-0.205-15.872-0.41-28.979-0.41l-23.859-0.102 0.41-158.925c0.205-87.45 0.717-160.154 0.922-161.587 0.307-1.434 0.819-5.734 1.229-9.728 3.174-34.816 11.571-74.957 23.347-111.104 35.635-109.568 103.936-200.602 196.915-262.451 37.786-25.19 75.981-43.93 121.446-59.597l13.926-4.813 12.186 4.096c63.59 21.094 128.307 57.651 173.466 97.997 37.171 33.28 62.976 62.874 88.269 101.376 36.147 54.886 62.362 119.603 74.957 184.32 3.584 18.534 4.71 25.907 6.656 44.544 0.614 5.325 1.434 11.571 1.741 13.824 0.41 2.253 0.922 75.674 1.126 163.123l0.41 158.925-23.859 0.102c-13.107 0-26.112 0.205-28.979 0.41-2.765 0.205-10.24 0.614-16.486 1.024-6.246 0.307-12.902 0.819-14.848 1.024-1.946 0.307-5.734 0.717-8.602 1.024-12.186 1.434-22.733 2.765-25.088 3.174-1.434 0.307-5.325 0.922-8.704 1.434-24.064 3.686-60.006 12.698-88.166 22.118-11.674 3.891-40.243 14.848-49.050 18.842-31.334 14.131-59.494 29.696-85.709 47.309-5.018 3.277-9.114 5.939-9.216 5.837-0.205 0-4.71-2.97-10.035-6.656zM365.466 645.12c11.981-8.704 51.712-58.163 58.675-72.909 6.656-14.131 3.994-20.378-19.251-44.339-14.438-14.95-16.589-17.51-17.101-21.197-2.867-17.613 15.462-45.773 58.061-89.293 50.995-51.917 86.323-74.957 103.219-67.379 1.536 0.717 9.83 8.192 18.432 16.589 18.125 17.715 23.757 21.402 32.666 21.504 10.138 0 21.709-7.373 57.856-37.069 25.907-21.094 31.539-27.955 31.539-37.683 0-7.987-5.939-15.974-29.798-39.629-23.347-23.245-23.552-23.347-31.027-26.112-16.486-6.144-36.352-4.813-68.608 4.506-13.414 3.891-41.779 16.691-59.699 27.034-13.926 8.090-40.653 26.214-51.405 34.816-50.074 40.448-90.112 83.456-120.218 129.126-40.038 60.826-56.115 119.296-41.165 149.709 2.458 5.018 7.373 10.65 24.883 28.467 22.835 23.142 27.443 27.034 35.43 28.979 5.837 1.536 10.342 0.205 17.51-5.12z" />
+<glyph unicode="&#xeb27;" glyph-name="Stop_video" d="M484.352 475.648l-435.2-435.2 54.272-54.272 870.4 870.4-14.029 14.131c-7.782 7.68-19.968 19.866-27.238 27.136l-13.005 13.005-435.2-435.2zM115.405 753.664c-18.944-5.222-34.099-21.299-37.478-39.834-0.819-4.301-1.126-84.070-1.126-267.264 0-283.546-0.307-265.523 5.53-277.504 1.434-2.97 4.198-7.168 6.144-9.421l3.584-3.994 599.654 599.552-285.696-0.102c-233.062-0.102-286.618-0.307-290.611-1.434zM918.118 676.864c-3.277-1.126-5.632-2.97-12.902-9.728-3.174-2.97-17.203-15.974-26.522-24.576-15.974-14.643-24.576-22.63-54.374-50.176-8.192-7.578-16.896-15.565-19.354-17.92-2.458-2.253-5.734-5.222-7.27-6.656-1.434-1.434-7.68-7.168-13.824-12.8s-12.186-11.264-13.517-12.595l-2.355-2.253-0.205 18.944-0.307 18.944-437.248-437.248h196.608c130.56 0 198.144 0.41 201.216 1.126 13.414 3.072 28.365 14.746 34.202 26.624 5.837 12.083 5.734 9.728 5.734 100.557v83.763l6.963-6.554c11.162-10.547 33.792-31.334 44.237-40.653 5.325-4.813 9.933-8.909 10.24-9.216s4.198-3.789 8.704-7.68c4.506-3.994 8.602-7.68 9.216-8.294 0.512-0.614 5.427-5.018 10.752-9.728s9.933-8.806 10.24-9.114c0.307-0.307 6.963-6.246 14.848-13.312 7.885-6.963 15.974-14.234 17.92-15.974 13.926-12.595 17.613-14.746 25.702-14.746 7.578 0 15.36 5.018 18.432 11.674 1.843 3.994 1.946 12.083 1.946 219.034 0 212.48 0 214.835-2.048 218.829-4.71 9.216-16.486 13.517-27.034 9.728z" />
+<glyph unicode="&#xeb28;" glyph-name="Storage_cloud" d="M584.192 753.562c-12.288-1.434-32.051-4.813-37.888-6.554-52.634-15.565-83.661-32.051-118.886-62.976-5.837-5.018-21.914-21.606-26.214-26.829l-5.427-6.554-4.608 0.717c-8.499 1.331-30.106 1.229-38.4-0.102-43.52-6.963-79.667-39.219-92.16-82.022-1.434-5.018-2.97-11.674-3.379-14.746l-0.717-5.632-9.728-1.638c-63.693-10.854-118.17-51.098-147.661-108.954-10.445-20.582-16.486-39.834-20.275-64.205-1.434-9.83-1.843-16.794-1.536-31.539 0.205-10.445 0.614-20.070 0.819-21.504 0.307-1.434 1.024-5.939 1.638-10.035 4.608-30.925 20.992-67.379 41.984-93.389 8.909-11.059 27.443-29.286 35.43-34.816 28.979-20.070 51.712-30.618 79.155-36.966 21.709-4.915 14.131-4.813 303.821-4.608 149.811 0.102 273.818 0.512 275.456 0.922 1.741 0.41 5.632 1.229 8.704 1.843 9.114 1.741 22.426 5.939 31.232 9.933 43.93 19.866 75.366 57.242 86.938 103.219 3.174 12.8 3.584 15.462 4.301 30.618 1.741 32.154-7.27 64.512-25.702 92.16-7.373 11.059-15.462 20.275-27.034 30.515l-4.403 3.994 1.638 8.294c0.922 4.608 1.843 10.957 2.253 14.029 0.307 3.072 0.819 6.758 1.126 8.192 0.205 1.434 0.614 11.366 0.922 22.016 2.15 87.040-34.611 167.629-101.99 223.846-38.195 31.846-89.088 54.477-137.728 61.338-4.506 0.614-9.523 1.331-11.264 1.638-7.578 1.229-48.742 1.126-60.416-0.205z" />
+<glyph unicode="&#xeb29;" glyph-name="store_locator" d="M496.128 882.586c-23.654-2.765-40.96-7.578-60.723-16.896-60.109-28.262-100.659-89.907-102.4-155.75l-0.205-5.939h-153.6v-310.989c0-333.312-0.205-315.597 5.018-330.445 2.765-7.885 9.933-19.251 16.282-25.805 9.728-10.035 20.378-16.589 35.021-21.299l6.656-2.15 267.264-0.205c292.966-0.205 273.408-0.512 288.461 5.837 21.197 9.011 37.581 27.75 44.544 50.688 1.741 5.837 1.843 20.89 2.048 320.307l0.307 314.061h-153.6l-0.102 5.939c0 3.174-0.205 6.554-0.307 7.373-0.205 0.819-0.614 4.608-1.024 8.294-2.355 23.552-12.902 53.043-26.726 74.342-29.696 45.773-75.059 74.445-128.922 81.715-10.035 1.331-29.798 1.843-37.99 0.922zM537.088 829.44c25.702-5.53 46.49-16.794 65.024-35.328 22.323-22.221 35.43-50.893 37.581-81.613l0.614-8.499h-256.614l0.614 8.499c3.072 44.954 30.413 85.606 71.168 106.086 12.595 6.246 24.576 9.933 42.189 12.698 6.246 1.024 31.744-0.102 39.424-1.843zM337.408 587.674c11.059-15.974 33.485-15.155 43.315 1.536l2.765 4.71 0.307 25.907 0.41 25.805 3.072-1.741c1.638-1.024 5.53-4.506 8.499-7.68 26.726-28.774 12.288-75.264-26.317-84.582-6.758-1.741-20.685-0.819-27.75 1.638-38.707 13.722-46.49 65.638-13.517 89.498l4.096 2.97 0.512-26.010 0.512-26.112 4.096-5.939zM642.867 590.029c6.451-13.005 23.552-17.92 35.942-10.24 5.427 3.379 10.138 9.626 11.366 15.258 0.512 2.15 1.024 14.541 1.024 27.341v23.347l3.174-1.843c5.222-3.072 13.926-13.21 17.101-20.070 9.933-20.89 5.53-44.032-11.366-59.699-15.974-14.848-39.117-17.715-59.597-7.27-6.451 3.277-16.998 14.643-20.787 22.426-10.752 22.016-3.994 49.254 15.667 63.488l4.096 2.97 0.512-25.395c0.512-23.962 0.614-25.702 2.867-30.31zM538.931 496.23c24.678-5.632 45.158-16.896 63.181-34.918 32.768-32.666 45.978-81.408 32.666-121.139-2.662-8.090-13.619-30.822-21.299-44.237-1.536-2.765-3.891-6.963-5.222-9.216-3.994-7.066-49.152-87.45-56.32-100.352-9.83-17.51-30.208-53.965-35.226-62.669-2.253-4.096-4.506-7.475-4.813-7.475-0.41 0-1.638 1.741-2.765 3.891-1.126 2.253-6.963 12.698-13.005 23.347-9.318 16.384-17.715 31.232-32.051 56.73-1.434 2.56-9.728 17.306-18.432 32.768s-16.998 30.208-18.432 32.768c-1.434 2.56-7.68 13.619-13.824 24.576-24.064 42.598-29.286 57.344-29.184 83.354 0.307 62.259 48.845 116.429 111.411 124.518 10.445 1.434 33.075 0.307 43.315-1.946zM547.84 407.962c-17.715-7.885-33.587-14.95-35.328-15.667-1.638-0.819-16.896-7.578-33.792-14.95-16.896-7.475-31.13-13.926-31.539-14.336s9.523-3.584 22.221-7.168c12.698-3.584 23.45-6.758 23.962-7.066 0.41-0.307 2.15-10.957 3.686-23.654s3.174-24.678 3.482-26.624l0.819-3.482 6.554 10.65c3.584 5.939 8.499 13.722 10.854 17.408 3.482 5.427 30.618 49.152 51.61 82.944 2.56 4.198 5.939 9.626 7.475 12.083 1.536 2.355 2.662 4.301 2.56 4.198-0.205 0-14.848-6.451-32.563-14.336z" />
+<glyph unicode="&#xeb2a;" glyph-name="Street" d="M198.963 701.952c-4.813-2.867-6.451-6.861-6.451-15.872v-7.68h-7.885c-6.144 0-8.806-0.512-11.264-2.048-6.349-3.789-6.451-4.608-6.451-41.472v-33.28h-102.4v-198.861l3.379 2.458c1.741 1.434 18.739 13.824 37.581 27.443 18.842 13.722 40.55 29.491 48.128 35.021s22.323 16.179 32.768 23.757l18.944 13.722 4.608-3.379c2.56-1.843 8.397-6.042 13.005-9.318 10.957-7.987 36.352-26.317 42.803-31.13 13.619-10.035 21.914-16.077 38.4-27.955 9.83-7.168 23.45-16.998 30.208-22.016 6.758-4.915 15.155-10.957 18.534-13.312l6.246-4.403 29.082 21.197c15.974 11.674 31.437 22.835 34.202 24.986 7.27 5.427 45.261 32.973 47.923 34.816 1.229 0.819 11.162 8.090 22.118 16.077l19.866 14.541 4.71-3.379c2.56-1.843 26.112-18.944 52.326-37.99s49.254-35.84 51.302-37.274c2.048-1.434 13.107-9.421 24.474-17.715 15.872-11.571 21.094-14.848 22.426-14.234 0.922 0.512 5.939 4.096 11.059 7.987 11.674 8.602 68.301 49.766 74.547 54.17 2.458 1.843 16.384 11.878 30.925 22.528 14.541 10.547 28.467 20.685 31.027 22.528l4.608 3.277 26.112-18.944c14.336-10.342 29.082-21.094 32.768-23.757 3.686-2.765 22.118-16.077 40.96-29.798s35.84-26.010 37.683-27.443l3.277-2.458v198.861h-102.4v33.28c0 36.864-0.102 37.683-6.451 41.472-2.458 1.536-5.12 2.048-11.162 2.048h-7.987v7.68c0 9.011-1.638 13.005-6.451 15.872-4.198 2.56-8.499 2.56-12.698 0-4.813-2.867-6.451-6.861-6.451-15.872v-7.68h-7.885c-6.144 0-8.806-0.512-11.264-2.048-6.349-3.789-6.451-4.608-6.451-41.472v-33.28h-230.4v33.587c0 36.659-0.102 36.864-6.042 40.858-2.867 1.946-4.813 2.355-11.469 2.355h-8.090v7.782c0 4.198-0.512 8.704-1.126 9.933-5.018 9.626-16.998 10.342-22.426 1.434-1.536-2.458-2.048-5.12-2.048-11.059v-7.885l-8.602-0.307c-6.758-0.307-9.318-0.819-11.571-2.56-5.325-3.994-5.427-4.506-5.427-40.55v-33.587h-230.4v33.587c0 31.437-0.102 33.69-2.048 36.762-2.867 4.813-6.861 6.451-15.872 6.451h-7.68v7.987c0 6.042-0.512 8.704-2.048 11.162-3.789 6.246-11.059 8.090-17.101 4.403zM165.888 444.826c-21.709-15.667-53.248-38.605-70.144-50.893l-30.72-22.323-0.307-102.605-0.205-102.605h179.2v128h51.2v-128h51.2l-0.205 102.502-0.307 102.605-32.256 23.45c-17.715 12.902-35.226 25.702-38.912 28.365-11.366 8.397-67.277 48.947-68.301 49.562-0.512 0.307-18.637-12.288-40.243-28.058zM192.512 256v-38.4h-76.8v76.8h76.8v-38.4zM497.562 462.746c-8.090-5.837-16.077-11.776-17.818-13.005-2.662-2.048-78.131-56.934-99.635-72.499l-7.885-5.632-0.307-102.605-0.205-102.605h179.2v128h51.2v-128h51.2l-0.205 102.605-0.307 102.605-30.72 22.323c-16.896 12.288-34.816 25.395-39.936 29.082-53.76 39.117-67.174 48.845-68.608 49.766-0.717 0.41-7.475-3.891-15.974-10.035zM499.712 256v-38.4h-76.8v76.8h76.8v-38.4zM780.288 444.928c-21.709-15.77-53.248-38.707-70.144-50.995l-30.72-22.323-0.307-102.605-0.205-102.605h179.2v128h51.2v-128h51.2l-0.205 102.605-0.307 102.605-70.144 50.995c-38.605 28.058-70.144 50.995-70.144 50.995s-17.715-12.902-39.424-28.672zM806.912 256v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xeb2b;" glyph-name="Stretcher" d="M67.789 676.659c-2.355-0.819-6.349-3.584-8.909-6.042-11.776-11.878-9.421-30.925 5.018-39.834l5.018-3.072 84.685-0.614v-383.898h-40.243c-45.773 0-46.694-0.102-54.374-7.68-11.878-11.571-9.523-31.027 4.915-39.936l5.018-3.072 438.374-0.307c241.152-0.205 440.832 0 443.699 0.307 7.066 0.819 14.131 5.632 18.227 12.186 2.765 4.506 3.072 5.939 3.072 12.902 0 6.554-0.512 8.499-2.867 12.493-1.536 2.662-4.403 6.042-6.349 7.578-6.861 5.222-9.83 5.53-52.941 5.53h-39.731v384h40.346c43.622 0 45.261 0.205 52.531 5.734 1.843 1.331 4.608 4.71 6.144 7.373 5.734 9.728 3.072 24.781-5.734 32.051-7.987 6.554 31.027 6.042-452.096 5.939-388.71 0-439.91-0.205-443.802-1.638zM624.128 599.142c12.186-5.632 18.022-18.842 13.824-31.334-1.946-5.734-5.53-10.035-11.776-14.234l-4.096-2.662-76.288-0.512c-61.030-0.41-76.8-0.819-78.643-1.843-3.482-2.048-6.554-9.318-5.427-13.107 1.638-5.325 2.253-6.451 5.018-8.294 2.662-1.741 10.547-1.843 163.021-2.355l160.256-0.512 6.656-3.174c8.499-4.096 14.336-9.933 18.637-18.534 2.97-6.144 3.277-7.68 3.379-16.077 0-8.397-0.307-10.035-3.174-15.974-4.096-8.499-10.445-14.848-18.842-18.842l-6.656-3.174-96.768-0.512c-73.011-0.41-97.28-0.819-98.918-1.741-7.373-4.198-7.475-17.818-0.102-22.016 1.741-1.024 23.040-1.434 99.021-1.843l96.768-0.512 6.656-3.174c8.602-4.096 14.848-10.445 18.842-18.842 2.765-5.837 3.072-7.782 3.174-15.872 0-8.294-0.307-9.933-3.277-15.872-5.018-10.445-12.186-16.896-22.528-20.378-6.349-2.15-6.963-2.15-163.738-2.15-177.152 0-162.714 0.717-166.4-7.782-1.126-2.355-1.638-5.12-1.331-6.246 1.946-5.939 3.072-7.68 6.042-9.523 3.277-2.048 5.018-2.048 76.595-2.048 83.661 0 80.179 0.307 88.166-8.192 12.186-13.005 8.192-32.973-8.090-40.55l-5.12-2.458h-94.925c-103.014 0-102.81 0-117.248 5.734-17.613 7.066-31.949 20.378-40.55 37.786-7.782 15.77-7.373 9.318-7.373 123.904v102.4l3.277 9.216c4.198 12.186 9.216 20.582 17.51 29.389 11.366 11.981 26.010 20.070 41.677 22.835 5.427 1.024 30.003 1.331 102.4 1.434l95.232 0.102 5.12-2.458zM281.498 497.766c18.432-3.584 35.738-16.691 44.032-33.485 7.27-14.746 9.011-29.594 5.325-44.134-11.469-44.954-63.386-63.386-100.659-35.84-10.035 7.373-17.613 17.92-22.016 30.618-2.355 6.963-2.765 9.523-2.662 20.275 0 9.523 0.41 13.722 2.048 18.637 5.53 16.691 17.51 30.822 32.256 38.195 13.926 6.861 26.726 8.602 41.677 5.734z" />
+<glyph unicode="&#xeb2c;" glyph-name="subscription_package" d="M307.2 574.157c0-163.533 0.307-234.086 1.126-238.285 1.843-10.24 6.246-18.33 13.926-26.010 12.186-12.186 22.221-15.462 46.694-15.462 14.234 0 16.179 0.205 15.667 1.536-3.994 10.547-5.12 16.998-5.12 29.184 0 15.667 0.614 18.33 11.469 44.544 1.638 3.994 11.366 27.443 21.606 52.224s19.046 45.978 19.558 47.104c0.512 1.126 3.994 9.421 7.68 18.432s8.602 20.685 10.854 25.907c2.15 5.222 3.994 10.138 3.994 10.752 0 0.717-4.403 5.632-9.83 10.957-32.358 31.846-60.928 72.806-74.65 106.701-8.397 20.787-11.162 33.075-11.264 49.459 0 17.51 0.819 19.046 22.118 40.55 16.794 16.998 24.781 23.45 29.286 23.45 6.656 0 13.414-5.632 26.931-22.426 4.198-5.222 9.626-11.878 12.083-14.746 7.168-8.499 16.384-22.938 17.613-27.341 2.15-8.090-0.512-12.902-15.77-28.467-6.246-6.349-11.981-13.005-12.698-14.746-4.506-10.65 7.68-31.846 35.328-61.542 2.56-2.765 4.71-4.813 4.813-4.608 0.205 0.205 3.379 7.885 7.27 17.203 3.789 9.318 10.752 26.112 15.462 37.376 4.608 11.264 17.51 42.394 28.57 69.12s20.685 50.074 21.402 51.712c0.717 1.741 3.584 8.499 6.349 15.155s6.246 13.619 7.782 15.565c4.403 5.325 11.264 8.090 19.763 8.090 6.656-0.102 8.704-0.717 27.136-8.499 10.957-4.71 23.757-10.035 28.467-11.981 12.8-5.325 23.040-9.523 50.278-20.787 13.722-5.734 25.088-10.342 25.293-10.342 1.024 0 0.205 15.565-1.024 21.606-3.584 16.896-15.974 31.13-32.87 37.888l-6.144 2.458-369.152 0.512v-232.243zM583.066 766.669c-0.819-2.048-5.325-12.8-9.83-23.757-19.046-46.182-21.402-51.814-22.323-53.76-0.922-2.15-31.334-75.469-35.328-85.504-1.229-3.072-7.373-17.818-13.619-32.768-48.128-115.507-95.334-230.81-96.358-235.315-3.584-17.101 1.536-33.792 14.131-46.285 7.578-7.373 11.264-9.523 33.382-18.432 8.499-3.379 16.282-6.656 17.408-7.168s13.312-5.632 27.136-11.366c13.824-5.632 45.158-18.637 69.632-28.774s48.23-19.968 52.736-21.811c4.506-1.843 39.526-16.282 77.722-32.154s69.632-28.672 69.734-28.57c0.102 0.205 12.083 29.082 26.624 64.307s28.16 68.198 30.31 73.216c4.71 11.264 37.786 91.034 42.394 102.4 6.144 15.053 55.808 135.066 58.266 140.8 8.499 19.558 19.354 47.104 20.787 52.531 3.072 11.981 0.102 28.877-7.168 40.243-3.994 6.349-13.005 14.131-20.173 17.51-3.686 1.741-53.658 22.63-111.104 46.387s-130.048 53.862-161.28 66.765c-31.232 13.005-57.856 23.962-59.085 24.474-2.048 0.717-2.56 0.41-3.994-2.97zM599.654 653.414c40.346-15.974 245.658-101.99 248.832-104.141 11.878-8.090 18.33-23.962 15.667-37.99-0.41-2.56-15.36-39.834-33.28-82.842-32.461-78.336-36.762-88.678-46.49-112.538-2.867-6.963-5.427-12.902-5.53-13.107-0.205-0.205-10.035 3.686-21.709 8.602-11.776 4.813-22.426 9.216-23.552 9.626-2.15 0.819-3.072-1.126-16.794-34.406-8.090-19.354-14.746-35.123-14.848-35.021-0.205 0.205-7.475 17.818-16.384 39.219-8.806 21.402-17.818 43.11-19.866 48.128-2.15 5.12-4.096 9.933-4.403 10.752s-11.469 6.042-24.986 11.674c-13.517 5.53-31.334 13.005-39.834 16.486-8.397 3.482-27.853 11.571-43.11 17.92-30.31 12.493-34.816 15.258-40.346 24.269-4.813 7.987-6.349 13.926-5.837 22.835 0.41 6.554 1.536 10.24 7.885 25.6 4.096 9.83 7.987 19.354 8.704 20.992 0.819 1.741 7.475 17.818 14.848 35.84 7.475 18.022 15.258 36.966 17.408 41.984 2.15 5.12 7.168 17.306 11.264 27.136 3.994 9.83 7.885 19.354 8.704 20.992 4.403 10.342 6.861 16.282 9.523 23.040 4.198 10.547 7.27 17.408 7.68 17.408 0.205 0 3.072-1.126 6.451-2.458zM181.248 662.426c-54.886-22.835-103.014-42.803-107.008-44.339-4.813-1.946-7.066-3.482-6.861-4.403 0.205-1.331 49.971-122.368 53.965-131.379 1.126-2.56 24.064-57.958 32.768-79.36 1.331-3.072 5.12-12.288 8.499-20.48s11.264-27.238 17.51-42.496c6.246-15.155 11.878-28.57 12.39-29.696s8.806-21.197 18.432-44.544c37.274-90.522 34.406-84.378 43.11-93.082 11.674-11.878 29.286-17.203 45.568-13.824 5.427 1.024 30.72 11.162 78.234 31.027 6.451 2.765 32.051 13.414 56.832 23.654s45.158 18.739 45.261 18.842c0.102 0.102-6.349 2.867-14.336 6.144-37.581 15.565-46.694 19.661-54.477 25.088l-8.192 5.632-27.136 0.102c-24.166 0.205-28.058 0.41-35.635 2.458-13.824 3.584-23.962 9.011-34.304 18.534-6.144 5.632-15.053 18.022-17.203 24.064-1.536 4.096-1.126 3.994-8.294 2.15-10.445-2.662-22.733-0.307-31.232 6.246-9.011 6.861-10.035 8.602-21.197 35.84-4.096 10.035-14.746 35.738-23.654 57.139-8.806 21.402-22.733 55.091-30.822 74.752-8.192 19.763-16.077 38.707-17.51 42.291-1.536 3.789-2.355 6.758-1.741 7.27 0.819 0.717 46.899 19.866 109.978 45.875 8.704 3.482 16.179 6.861 16.589 7.27 0.512 0.512 0.717 25.6 0.614 55.808l-0.307 54.886-99.84-41.472zM186.368 525.414c0-0.205 3.174-7.782 6.963-17.101l6.963-16.794 7.168-2.97c3.891-1.638 22.118-9.114 40.653-16.589l33.587-13.619-0.614 28.672-30.208 12.288c-57.242 23.347-64.512 26.317-64.512 26.112z" />
+<glyph unicode="&#xeb2d;" glyph-name="Sudoku" d="M128.102 482.099c0.102-376.627-0.205-354.816 5.222-369.357 2.56-6.861 10.035-18.842 15.258-24.269 9.523-9.933 22.938-18.125 36.25-22.118 5.837-1.741 22.528-1.843 358.707-2.048l352.461-0.307v348.979c0 243.814-0.307 350.822-1.126 355.123-5.734 31.642-29.184 55.706-60.826 62.362-6.246 1.331-52.634 1.536-356.659 1.536h-349.389l0.102-349.901zM844.8 614.4v-166.4h-332.8v-332.8h-332.8v332.8h332.8v332.8h332.8v-166.4zM359.424 703.386c17.408-3.277 32.973-14.95 40.243-30.106 2.97-6.349 5.222-14.131 5.325-18.944 0-0.614-6.554-1.024-17.613-1.024l-17.715-0.102-1.638 5.12c-2.355 6.963-10.547 15.36-16.794 16.998-6.246 1.741-14.541 0.717-19.866-2.458-7.885-4.608-15.565-16.384-18.944-29.286-1.536-6.042-3.994-22.835-3.482-23.859 0.307-0.41 1.741 0.922 3.277 3.072 9.83 13.517 32.154 20.173 51.814 15.565 14.95-3.584 29.286-13.824 36.147-25.805 11.776-20.685 10.854-51.405-2.048-71.578-9.626-15.155-22.426-24.064-40.141-28.16-9.728-2.15-28.058-1.331-37.274 1.741-11.776 3.891-21.402 10.445-28.877 19.661-13.107 16.282-19.661 39.936-19.661 71.475-0.102 26.931 4.71 47.411 15.462 66.048 5.325 9.318 18.534 21.914 27.853 26.522 12.595 6.144 28.57 8.090 43.93 5.12zM703.283 275.251l-0.307-92.979-37.376-0.41v60.416c0 56.73-0.102 60.314-1.741 60.416-1.024 0-11.469 0.102-23.347 0.205l-21.504 0.205-0.102 14.131-0.205 14.029 4.813 0.102c10.138 0.102 20.89 2.56 28.672 6.451 9.626 4.915 18.637 16.691 20.275 26.522l0.614 3.789h30.413l-0.205-92.877zM659.149 681.267c-8.090-10.854-26.317-35.328-40.448-54.374l-25.805-34.509v-34.509l38.502 0.102c21.197 0.102 38.912-0.205 39.526-0.512 0.614-0.41 1.024-8.602 0.922-21.709l-0.102-20.992 17.92-0.205 17.92-0.102v21.606c0 19.763 0.102 21.504 1.843 21.606 0.922 0 6.246 0.102 11.776 0.102 8.192 0.102 10.138 0.41 10.752 1.741s0.819 22.63 0.307 28.467c-0.102 0.922-2.867 1.229-10.035 1.229-5.53-0.102-11.059-0.102-12.288 0l-2.355 0.102v111.616h-33.792l-14.643-19.661zM671.949 621.568c0-17.306-0.307-31.642-0.614-31.949-0.922-1.024-47.206-0.717-47.206 0.307 0 1.229 46.899 64 47.411 63.488 0.205-0.205 0.41-14.541 0.41-31.846zM325.632 370.586c-13.926-2.97-23.040-7.987-31.642-17.408-15.565-16.998-22.938-45.056-22.016-83.558 1.536-60.416 25.395-91.648 69.53-90.829 35.635 0.614 56.73 21.402 64.717 63.795 2.15 11.776 2.662 46.285 0.819 59.802-5.325 38.707-22.016 61.235-50.483 67.891-7.578 1.741-23.45 1.946-30.925 0.307zM350.925 338.33c8.294-3.994 14.029-13.107 17.306-27.546 2.458-10.445 2.97-53.965 0.819-66.048-2.662-15.155-7.885-26.317-14.336-30.925-9.114-6.554-23.757-5.53-31.232 2.15-6.349 6.349-11.366 19.968-12.902 34.918-1.434 14.131-0.717 46.49 1.229 57.037 2.15 12.083 7.373 23.245 13.005 27.75 7.066 5.632 17.51 6.656 26.112 2.662zM334.848 610.406c-13.005-3.379-21.094-14.131-22.221-29.594-1.536-20.89 9.83-36.557 27.648-38.298 8.602-0.717 15.36 2.15 21.709 9.216 12.493 13.722 11.264 41.062-2.15 52.941-6.861 6.042-16.077 8.090-24.986 5.734z" />
+<glyph unicode="&#xeb2e;" glyph-name="support" d="M320.512 837.632c-55.091-8.192-100.864-41.574-124.826-91.034-11.264-23.142-15.77-43.11-15.872-70.246-0.102-24.781 2.97-41.677 11.674-63.078 21.094-51.814 67.072-88.883 123.29-99.43 14.234-2.662 45.875-2.355 59.494 0.614 15.462 3.277 28.365 7.782 41.984 14.541 15.667 7.782 28.979 17.306 41.574 29.798l9.933 9.83-0.614 4.506c-1.024 6.246-0.922 38.81 0.102 47.411 3.379 28.877 14.234 60.518 29.286 85.402 2.867 4.71 5.222 9.114 5.222 9.83 0 0.614-1.434 5.427-3.174 10.65-18.534 55.91-63.795 96.358-122.266 109.363-13.722 2.97-41.779 3.994-55.808 1.843zM657.92 761.754c-35.738-5.53-66.355-20.685-91.443-45.363-26.624-26.214-42.291-57.139-47.923-94.822-1.331-9.011-1.229-36.864 0.102-46.080 1.946-12.902 7.885-32.256 13.824-45.056 8.397-18.125 24.678-40.346 38.093-51.814 3.584-3.072 6.656-5.837 6.963-6.144 2.15-2.765 21.504-15.053 30.925-19.661 23.142-11.366 41.574-15.872 67.891-16.589 27.034-0.819 49.869 3.789 73.523 14.643 37.99 17.613 70.861 52.941 84.275 90.522 4.915 13.824 5.222 15.36 9.114 35.123 0.41 1.741 0.819 10.035 1.126 18.432 0.717 25.907-3.277 46.797-13.722 70.963-18.842 43.418-59.494 78.746-104.858 91.136-20.787 5.734-48.64 7.68-67.891 4.71zM194.97 506.266c-46.592-24.166-82.637-72.192-93.491-124.314-1.126-5.632-2.458-11.878-2.867-13.824-1.331-6.656-1.638-187.29-0.307-193.536 4.198-19.456 20.48-35.84 39.731-39.834 3.789-0.819 41.882-1.126 125.645-1.126h120.32l0.102 73.011c0 40.038 0.205 75.264 0.512 78.029 3.891 41.574 16.077 77.517 37.786 110.592 17.408 26.726 39.731 49.357 65.946 66.97 4.813 3.277 10.342 6.758 12.186 7.68 1.741 0.922 3.277 2.048 3.277 2.56s-2.458 4.813-5.53 9.626c-2.97 4.813-7.373 12.698-9.728 17.613-2.867 5.837-4.71 8.499-5.53 7.987-0.717-0.41-3.789-2.765-6.861-5.325-16.179-13.21-43.11-27.955-62.464-34.202-28.672-9.318-43.11-11.571-74.24-11.366-12.39 0.102-23.040 0.717-29.286 1.843-35.328 5.837-69.018 20.070-95.334 40.243-4.71 3.584-9.728 7.373-11.162 8.499l-2.662 1.946-6.042-3.072zM207.36 360.243c15.872-5.018 26.624-19.251 27.853-36.659l0.614-8.602 45.773-45.875c31.334-31.334 46.592-47.309 48.128-50.483 5.632-11.059 0.614-26.522-10.342-32.358-7.68-3.994-18.432-3.584-24.986 0.922-1.638 1.126-23.45 22.426-48.435 47.309l-45.261 45.261-7.987 0.614c-13.21 0.922-23.45 6.042-30.822 15.77-4.813 6.246-8.294 15.462-8.499 22.528s1.024 15.667 2.15 15.667c0.512 0 6.144-5.222 12.493-11.571 12.698-12.698 15.258-14.438 18.637-13.517 3.174 1.024 18.842 16.691 19.661 19.763 0.819 3.482-1.126 6.144-14.438 19.456-7.782 7.68-11.162 11.674-10.24 12.083 6.144 2.355 17.613 2.253 25.702-0.307zM535.45 430.694c-30.72-15.462-58.675-42.189-75.878-72.602-10.445-18.534-16.998-36.25-21.606-58.573-2.15-10.445-2.15-13.312-2.56-103.731-0.307-101.683-0.512-98.611 5.632-111.309 5.837-12.186 20.89-23.552 34.918-26.522 3.891-0.819 69.53-1.126 228.147-1.126h222.72l-0.41 115.507c-0.102 63.488-0.512 116.326-0.922 117.453-0.307 1.126-0.922 4.403-1.229 7.168-1.024 6.656-5.12 22.938-7.68 30.31-15.77 44.442-47.923 81.408-89.498 103.117l-7.885 4.198-6.963-5.222c-25.395-19.354-52.429-32.154-82.637-39.219-5.632-1.331-12.493-2.662-15.36-3.072-2.765-0.41-6.246-0.922-7.68-1.126-5.427-1.024-40.858-1.229-48.64-0.307-40.141 4.813-77.722 19.968-108.646 44.032l-6.246 4.813-7.578-3.789zM822.682 361.574c6.144-2.97 10.65-7.578 14.131-14.234 1.843-3.379 2.253-6.042 2.355-13.005 0-7.782-0.307-9.318-3.072-14.234-11.981-21.709-42.291-21.709-54.272 0.102-2.662 4.813-3.072 6.451-3.072 14.131 0 7.782 0.307 9.318 3.072 14.234 4.096 7.373 11.878 13.619 19.456 15.565 5.632 1.536 15.565 0.307 21.402-2.56zM841.933 202.035c0.307-61.030 0.614-77.824 1.638-80.384 1.638-3.789 7.475-7.066 14.541-7.885 2.56-0.307 4.71-0.512 4.915-0.512 0.102-0.102 0.205-2.355 0.205-5.222v-5.12h-100.352v5.12c0 2.867 0.102 5.12 0.307 5.12 0.102 0.102 2.048 0.307 4.301 0.614s6.144 1.536 8.704 2.765c8.294 3.994 8.192 2.56 7.885 75.469-0.205 59.802-0.307 63.181-2.15 66.765-2.253 4.403-6.144 6.554-13.722 7.578l-5.325 0.717v11.981h78.746l0.307-77.005z" />
+<glyph unicode="&#xeb2f;" glyph-name="surveillance_camera" d="M283.648 856.883c-3.174-1.126-6.349-5.018-9.83-12.083-2.048-3.891-6.144-11.776-9.114-17.408-8.192-15.667-17.92-34.202-26.624-51.2-7.578-14.746-12.8-24.781-28.16-54.272-17.51-33.587-17.408-33.28-16.794-37.274 1.126-7.373 1.331-7.475 34.714-24.678 18.022-9.318 35.942-18.637 53.248-27.648 17.203-9.011 35.328-18.33 52.224-27.136 8.499-4.403 19.968-10.342 25.6-13.312s17.613-9.216 26.624-13.824c18.227-9.421 36.25-18.842 53.248-27.648 6.246-3.174 17.715-9.216 25.6-13.312s19.456-10.035 25.6-13.312c6.246-3.277 18.637-9.728 27.648-14.336 9.011-4.71 20.582-10.65 25.6-13.312 5.12-2.662 17.51-9.114 27.648-14.336s21.709-11.162 25.6-13.312c30.208-16.179 44.032-22.733 47.514-22.733 2.048 0 18.432 4.608 36.454 10.342s40.858 13.005 50.688 16.179c39.219 12.39 43.827 13.824 51.2 16.179 4.198 1.331 25.907 8.192 48.128 15.258 22.221 6.963 45.261 14.234 51.098 16.077 14.643 4.71 17.613 7.885 16.486 17.818-0.614 5.427-1.126 5.734-41.984 26.829-11.571 5.939-23.245 12.083-26.112 13.619-2.765 1.536-13.414 7.066-23.552 12.288s-24.166 12.493-31.232 16.179c-7.066 3.584-18.534 9.626-25.6 13.312-7.066 3.584-16.896 8.806-22.016 11.469-5.018 2.662-17.92 9.318-28.672 14.848-10.65 5.53-22.63 11.674-26.624 13.824-3.891 2.15-15.462 8.090-25.6 13.312s-22.528 11.674-27.648 14.336c-5.018 2.662-16.998 8.909-26.624 13.824-9.523 4.915-20.582 10.65-24.576 12.8-3.891 2.15-14.95 7.885-24.576 12.8-9.523 4.915-22.426 11.571-28.672 14.848-6.144 3.277-17.715 9.216-25.6 13.312s-19.354 10.035-25.6 13.312c-16.179 8.397-46.592 24.269-79.872 41.472-8.397 4.403-19.968 10.342-25.6 13.312-62.157 32.563-65.741 34.304-69.222 34.202-1.946 0-4.198-0.307-5.018-0.614zM172.749 650.342c-22.426-43.008-22.323-42.906-22.323-49.459 0-3.379 0.614-7.782 1.434-9.728 2.355-5.632 8.294-11.571 15.36-15.155 8.602-4.403 37.786-19.558 50.381-26.112 5.632-2.97 17.203-8.909 25.6-13.312 8.499-4.403 19.968-10.342 25.6-13.312s18.125-9.421 27.648-14.336c9.626-5.018 21.811-11.366 27.238-14.234l9.83-5.12-0.307-11.776c-0.102-6.554 0.205-15.053 0.717-19.046 2.253-15.36 9.626-33.075 19.046-45.67l5.427-7.168-36.966-73.933c-20.275-40.653-37.376-74.342-37.888-74.957-0.614-0.614-20.992-0.922-53.35-1.024-51.302 0-52.326 0-53.146 2.048-0.41 1.126-1.536 6.656-2.458 12.288s-2.97 15.36-4.608 21.709c-15.974 60.109-49.562 100.557-86.63 104.346l-6.554 0.717v-358.912l6.042 0.614c24.678 2.662 47.002 19.866 65.126 50.176 12.493 20.992 23.45 53.043 27.648 80.998 0.307 2.253 0.819 5.222 1.126 6.656l0.512 2.56h66.15c70.963 0 74.445 0.205 82.842 5.12 9.83 5.734 11.469 8.397 35.635 56.73 12.595 25.088 32.563 64.819 44.237 88.166l21.402 42.496 11.264 0.102c12.8 0.102 25.19 2.765 36.864 7.782 7.27 3.174 20.582 11.571 27.136 16.998 3.584 3.072 3.584 3.072 7.168 1.331 3.379-1.638 26.624-13.722 48.64-25.19 5.632-2.97 16.691-8.704 24.576-12.8s18.944-9.83 24.576-12.8c5.632-2.97 18.534-9.626 28.672-14.848s21.709-11.162 25.6-13.312c3.994-2.048 17.306-9.011 29.696-15.462 21.914-11.264 22.733-11.571 29.184-11.674 5.12 0 7.782 0.614 11.674 2.56 7.782 3.994 7.373 3.277 29.696 46.592 6.144 11.878 13.312 25.702 15.974 30.72 5.427 10.342 13.005 24.986 28.774 55.296 5.837 11.264 14.131 27.136 18.432 35.328 4.198 8.192 7.68 14.95 7.578 15.053 0 0.102-8.806-2.56-19.456-5.939-43.827-13.824-52.941-16.691-93.696-29.594-23.347-7.373-48.23-15.258-55.296-17.51-14.643-4.608-20.582-5.325-29.082-3.277-5.222 1.229-25.805 11.162-49.254 23.859-2.765 1.536-13.824 7.27-24.576 12.8-10.65 5.53-23.142 11.981-27.648 14.336s-15.565 8.192-24.576 12.8c-9.011 4.608-21.914 11.366-28.672 14.848s-18.739 9.728-26.624 13.824c-7.885 4.096-19.354 10.138-25.6 13.312-17.613 9.216-35.533 18.534-51.2 26.624-7.885 4.096-19.354 10.035-25.6 13.312-6.144 3.174-18.637 9.728-27.648 14.336-9.011 4.71-20.48 10.65-25.6 13.312-5.018 2.662-16.589 8.704-25.6 13.312s-19.558 10.138-23.552 12.288c-3.891 2.048-16.794 8.806-28.672 14.95-31.642 16.282-35.43 18.432-39.424 21.709l-3.686 3.072-4.813-9.421zM845.824 441.958c-1.638-3.379-3.994-7.885-5.222-10.035s-7.066-13.312-13.005-24.883c-5.939-11.571-15.36-29.696-20.89-40.448-5.53-10.65-11.571-22.323-13.312-25.702l-3.174-6.349 10.752-13.619c35.328-44.646 41.165-51.507 46.080-53.965 9.728-5.018 24.678-1.946 31.027 6.349 2.15 2.867 13.107 24.781 27.648 55.398 2.458 5.12 7.578 15.872 11.571 24.064 32.154 66.867 29.901 61.645 29.901 68.403-0.102 9.933-5.734 19.149-14.848 24.064-3.994 2.15-5.325 2.253-43.725 2.56l-39.629 0.307-3.174-6.144z" />
+<glyph unicode="&#xeb30;" glyph-name="Syncronise" d="M491.315 857.19c-0.102-0.205-4.915-0.614-10.547-1.024-22.016-1.331-47.821-5.53-70.758-11.469-12.595-3.277-35.942-10.445-40.858-12.698-1.126-0.41-6.861-2.765-12.8-5.12-72.499-28.979-140.902-84.992-185.037-151.552-30.618-46.285-49.152-91.034-61.338-148.173l-0.41-2.355h158.515l0.717 3.072c2.355 10.547 15.565 39.117 25.395 54.784 19.661 31.232 46.899 59.187 77.005 79.053 31.334 20.582 65.741 33.894 101.888 39.219 4.198 0.614 8.806 1.434 10.24 1.741s12.493 0.614 24.576 0.819c17.408 0.307 25.088-0.102 36.864-1.638 53.76-7.168 99.84-28.672 140.493-65.536l7.885-7.168-103.834-103.834 129.536-0.307c92.877-0.205 131.277 0 135.68 0.819 18.944 3.584 34.918 18.739 39.936 37.99 1.229 4.608 1.536 26.726 1.536 136.909v131.379l-47.104-47.206-47.206-47.206-10.957 10.24c-49.562 46.387-111.821 80.384-177.357 96.87-13.312 3.379-30.822 6.963-39.424 8.192-2.253 0.307-5.222 0.717-6.656 1.024-2.662 0.41-11.162 1.229-25.6 2.458-8.499 0.819-49.664 1.331-50.381 0.717zM167.219 369.766c-18.432-4.506-34.202-20.787-38.093-39.322-1.126-5.427-1.741-265.421-0.614-265.421 0.307 0 21.504 20.992 47.206 46.694l46.694 46.694 6.349-6.042c47.718-46.387 110.797-82.227 175.206-99.43 15.872-4.301 27.648-6.758 49.152-10.342 14.336-2.355 32.256-3.584 55.296-3.584 29.286-0.102 46.080 0.922 65.536 4.096 1.741 0.205 4.71 0.717 6.656 1.024 61.645 9.83 125.338 37.274 177.664 76.595 41.062 30.925 81.203 75.469 105.062 116.634 1.946 3.379 4.198 7.27 5.12 8.806 17.92 29.901 37.069 80.384 43.93 115.302 0.614 3.379 1.434 6.963 1.638 7.987 0.512 1.638-3.686 1.741-78.746 1.741h-79.36l-0.717-2.765c-1.638-6.554-8.294-23.040-13.517-33.485-13.107-26.214-27.955-46.694-48.947-67.686-24.986-25.088-48.947-41.165-84.48-56.627-13.722-6.042-39.731-13.005-59.392-15.974-14.234-2.253-49.357-2.97-63.59-1.331-31.334 3.482-59.802 11.878-88.064 26.010-21.811 10.854-39.322 22.938-57.958 39.834l-8.397 7.68 104.346 104.346-131.277-0.102c-101.376-0.102-132.608-0.41-136.704-1.331z" />
+<glyph unicode="&#xeb31;" glyph-name="target_location" d="M471.040 869.376v-39.322l-3.277-0.512c-1.843-0.307-7.066-1.024-11.571-1.638-21.504-3.072-48.23-9.626-70.144-17.203-135.68-47.206-235.213-168.448-254.362-309.965-0.307-2.253-0.922-5.837-1.229-7.885l-0.614-3.891h-78.643v-81.92h78.643l0.614-2.765c0.307-1.638 0.819-5.12 1.126-7.987 2.56-22.323 9.728-51.917 18.637-76.8 30.31-85.606 93.798-161.382 171.827-205.005 16.486-9.216 20.992-11.469 34.099-17.306 33.28-14.746 67.072-24.474 103.117-29.491 2.253-0.307 5.837-0.922 7.987-1.229l3.789-0.614v-78.643h81.92v39.424c0 21.709 0.307 39.424 0.819 39.526 0.41 0 1.434 0.205 2.253 0.307 0.819 0.205 4.301 0.614 7.578 1.024 8.090 0.922 36.045 6.349 45.67 9.011 46.387 12.288 88.986 32.563 128.512 61.133 5.12 3.686 9.421 6.963 9.728 7.27s2.56 2.15 5.12 4.096c6.349 4.915 22.63 19.661 30.822 27.75 55.091 55.296 92.365 126.157 106.291 202.138 1.126 6.246 2.253 13.824 2.662 16.896 0.307 3.072 0.819 6.861 1.126 8.499l0.614 2.765h78.643v81.92h-78.746l-0.512 3.379c-0.307 1.741-1.024 6.963-1.638 11.469-8.090 60.211-34.611 123.597-73.523 175.206-60.518 80.486-152.678 135.066-251.085 148.992-4.813 0.614-9.626 1.331-10.752 1.536-1.126 0.102-2.355 0.307-2.765 0.307-0.512 0.102-0.819 17.818-0.819 39.526v39.424h-81.92v-39.424zM471.040 715.264v-36.864h81.92v73.728h2.355c7.27 0 40.55-8.090 56.832-13.824 96.154-33.485 169.677-112.23 196.301-210.022 2.765-9.83 7.68-34.099 7.68-37.478 0-1.741-2.15-1.843-36.864-1.843h-36.864v-81.92h73.83l-0.614-5.325c-0.41-2.97-1.331-8.909-2.15-13.107-18.637-93.082-79.462-172.749-164.25-215.142-25.293-12.698-50.176-21.197-77.107-26.624-8.294-1.638-16.077-2.97-17.203-2.97-1.843 0-1.946 1.024-1.946 36.864v36.864h-81.92v-73.728h-2.253c-1.331 0-9.114 1.331-17.306 3.072-121.242 24.576-215.962 119.296-240.538 240.538-1.741 8.192-3.072 15.974-3.072 17.306v2.253h73.728v81.92h-74.035l0.717 5.427c1.536 11.264 7.168 34.611 11.878 48.845 33.28 100.864 115.2 177.152 217.6 202.752 12.595 3.174 26.214 5.837 31.027 6.042l2.253 0.102v-36.864z" />
+<glyph unicode="&#xeb32;" glyph-name="tarif" d="M525.107 882.688c-0.205-0.102-3.482-0.512-7.475-0.922-97.485-9.011-188.314-77.824-238.899-181.146-6.451-13.107-16.179-36.454-19.763-47.309-0.717-2.253-1.843-4.608-2.355-5.222-0.614-0.717-6.963-4.198-14.131-7.885-17.203-8.806-35.84-20.48-51.814-32.461-19.866-14.95-24.371-18.842-44.237-38.81-25.498-25.498-47.616-55.296-64.512-86.528-5.632-10.547-6.349-14.541-3.072-19.763 3.891-6.451 10.547-7.782 17.92-3.789 10.445 5.734 13.517 6.963 21.914 9.114 14.848 3.891 33.178 2.048 46.694-4.813 11.674-6.042 23.142-17.51 29.184-29.594 6.246-12.39 7.27-17.715 7.68-42.803 0.41-21.402 1.126-36.762 2.048-42.086 0.205-1.434 0.717-5.325 1.024-8.704 4.71-46.694 19.866-97.69 42.086-142.131 38.298-76.493 99.635-135.68 170.701-164.454 26.112-10.547 45.773-15.462 78.541-19.456 11.366-1.434 49.766-0.614 62.464 1.331 39.117 5.837 73.114 18.022 107.622 38.502 27.853 16.589 60.211 44.237 81.203 69.632l2.867 3.482 7.885-0.41c51.098-2.355 90.214 4.71 124.006 22.733 11.059 5.837 13.312 7.578 13.312 10.035s-18.739 20.173-30.822 29.389c-28.16 21.197-64.41 37.171-92.774 40.858l-5.427 0.717-3.686 7.27c-17.408 33.997-51.507 65.434-97.69 89.907-8.499 4.506-11.264 5.53-13.005 4.813-1.331-0.512-2.355-1.434-2.458-2.15 0-0.717-0.205-2.048-0.307-2.867-1.434-7.578-2.253-44.237-1.229-52.736 0.205-1.638 0.717-6.246 1.126-10.24 2.867-29.901 14.848-65.843 29.696-89.088l3.584-5.632-6.246-5.837c-42.189-39.834-106.189-50.688-157.389-26.726-42.906 19.968-74.445 67.072-80.589 120.218-0.41 3.379-0.922 7.168-1.126 8.602-0.614 3.584-0.614 46.49 0 52.736 0.307 2.867 0.819 8.090 1.126 11.776 1.536 17.101 5.427 39.424 9.933 56.32 2.048 8.090 8.499 28.774 9.933 32.256 0.512 1.126 2.662 6.451 4.71 11.776 4.301 10.752 19.763 42.496 23.040 47.104 1.126 1.536 2.048 3.174 2.048 3.482 0 1.126 14.95 24.166 23.347 35.942 18.637 26.112 39.219 50.483 64.205 76.083 12.698 13.107 26.419 26.624 30.208 29.901 1.434 1.229 3.994 3.482 5.632 5.018 7.27 6.554 46.592 38.298 58.061 46.694 3.891 2.97 39.014 30.515 40.346 31.744 0.717 0.512 7.066 5.632 14.336 11.264 49.459 38.605 62.566 49.869 74.547 64.41 18.944 22.63 22.528 39.322 12.698 58.778-11.571 22.938-38.4 28.262-93.696 18.637-40.038-7.066-90.522-25.907-127.078-47.514-12.186-7.27-14.848-7.578-19.763-2.765-3.174 3.277-3.686 6.554-1.741 10.854 2.253 4.915 37.069 23.757 64.307 34.816 6.451 2.662 12.186 5.12 12.595 5.632 1.843 1.638-32.768 12.698-52.634 16.794-20.275 4.198-33.075 5.53-51.302 5.53-9.318 0-17.203-0.102-17.408-0.307zM505.651 801.28c14.336-6.349 22.426-23.654 18.125-38.605-3.686-12.902-12.186-21.197-24.883-24.371-16.077-4.096-33.178 5.018-39.219 20.89-2.867 7.68-2.355 18.944 1.126 26.214 8.090 16.794 27.443 23.552 44.851 15.872z" />
+<glyph unicode="&#xeb33;" glyph-name="tariff" d="M314.573 668.262c-139.162-139.264-215.962-216.986-219.034-221.286-26.112-37.786-24.371-90.522 4.096-124.928 2.867-3.482 239.206-240.333 271.053-271.667 16.998-16.794 25.702-23.245 39.219-28.979 14.541-6.246 23.654-7.987 41.677-7.987 14.131 0 16.998 0.307 26.010 2.765 12.493 3.482 26.522 10.138 35.635 17.101 3.789 2.867 103.014 101.376 220.467 218.829l213.504 213.504v185.446c0 167.117-0.205 186.061-1.638 192.102-4.71 19.149-18.944 33.485-37.99 38.4-5.53 1.434-26.010 1.638-192.41 1.536l-186.266-0.102-214.323-214.733zM837.325 803.021c34.918-14.029 44.134-57.446 17.818-83.763-20.275-20.275-51.61-20.275-71.885 0-15.667 15.667-19.558 38.195-9.933 58.368 6.042 12.698 19.968 23.962 34.099 27.341 8.192 1.946 22.426 1.024 29.901-1.946z" />
+<glyph unicode="&#xeb34;" glyph-name="task_list" d="M502.272 908.186c-1.126-0.205-4.608-0.922-7.68-1.536-12.288-2.458-27.443-10.957-36.966-20.582-5.939-6.042-13.21-16.691-16.282-23.757l-1.946-4.608-63.386-0.614-5.939-4.096c-4.198-2.97-6.656-5.53-8.602-9.216l-2.56-5.018-0.614-109.158h307.405l-0.307 55.091-0.307 54.989-2.97 4.915c-1.536 2.662-4.403 6.042-6.349 7.475-6.451 5.018-10.65 5.53-42.086 5.53h-29.082l-1.946 4.71c-9.933 23.142-32.154 40.653-57.446 45.261-5.12 1.024-19.558 1.331-22.938 0.614zM522.342 855.347c9.83-4.198 15.872-14.541 14.95-25.395-2.048-24.064-32.666-31.949-46.387-11.981-9.318 13.517-2.97 32.358 12.8 38.298 4.403 1.638 13.517 1.126 18.637-0.922zM218.419 804.966c-13.414-3.277-27.955-14.643-33.382-26.214-6.349-13.312-5.837 15.77-5.837-369.664 0-383.283-0.41-355.84 5.734-368.538 3.686-7.475 14.541-18.33 22.016-22.016 12.595-6.144-8.806-5.734 303.514-5.734 202.24 0 288.666 0.307 292.864 1.126 18.842 3.379 34.816 18.637 39.936 37.888 2.253 8.294 2.253 707.277 0 715.571-3.584 13.722-14.541 27.546-26.112 33.178-11.981 5.734-13.21 5.837-71.885 5.837h-54.067v-102.4h-358.4v102.4l-54.477-0.102c-39.936 0-56.013-0.41-59.904-1.331zM765.235 597.504c2.867-3.277 3.482-6.963 1.638-10.342-0.614-1.229-4.813-6.349-9.318-11.469-8.499-9.728-8.909-10.24-18.227-21.197-3.072-3.686-5.837-6.861-6.144-7.168s-3.277-3.686-6.656-7.68c-3.379-3.891-6.349-7.373-6.656-7.68s-4.198-4.915-8.704-10.24c-13.517-15.974-18.944-21.299-22.118-22.016-6.656-1.536-8.090-0.41-27.238 21.811-10.035 11.571-19.046 22.221-19.968 23.654-3.584 5.222-2.048 9.933 5.12 15.77 4.301 3.482 5.325 3.891 9.318 3.482 4.096-0.41 5.325-1.434 15.974-11.981 6.349-6.349 11.776-11.571 11.981-11.674 0.307 0 4.403 3.379 9.114 7.578s10.854 9.728 13.722 12.288c2.765 2.458 7.885 7.066 11.264 10.24 18.944 17.408 30.822 27.75 33.792 29.594 3.482 2.048 9.933 0.614 13.107-2.97zM571.699 574.362c10.752-3.686 18.022-15.155 16.794-26.829-1.024-10.138-9.114-19.558-18.739-21.709-2.253-0.614-60.006-1.024-135.168-1.024-147.046 0-136.806-0.512-145.101 7.578-9.216 8.909-10.342 22.835-2.662 33.485 2.355 3.277 8.909 7.885 13.21 9.216 1.434 0.41 62.054 0.819 134.758 0.819 118.477 0.102 132.608-0.102 136.909-1.536zM765.235 469.504c5.837-6.554 6.144-6.042-26.829-44.134-10.445-12.083-24.474-28.365-31.232-36.25-14.234-16.486-14.336-16.589-18.842-17.51-5.632-1.126-8.909 1.229-19.968 14.234-5.734 6.861-13.926 16.282-18.227 21.094-12.39 13.926-12.8 15.974-5.12 23.962 4.813 5.018 5.325 5.325 10.24 5.325h5.222l11.981-11.981 12.083-11.981 5.12 4.813c2.867 2.662 6.554 5.939 8.192 7.373 2.662 2.253 24.576 22.016 27.75 25.088 9.318 8.704 24.064 21.402 26.522 22.938 3.482 2.048 9.933 0.614 13.107-2.97zM575.795 444.621c16.896-9.933 17.101-33.894 0.307-44.237l-5.018-3.072-133.53-0.307c-90.522-0.205-134.861 0.102-137.523 0.819-2.253 0.614-5.939 2.56-8.294 4.403-12.186 9.421-13.312 27.238-2.458 38.093 8.090 8.090-2.765 7.578 147.456 7.373l134.144-0.205 4.915-2.867zM571.494 318.464c6.144-2.15 10.65-5.939 13.926-11.571 2.458-4.096 2.867-5.939 2.867-12.493 0-6.656-0.41-8.397-2.97-12.595-1.536-2.662-4.403-6.042-6.144-7.373-7.782-5.939-0.512-5.632-143.872-5.632-148.582 0-137.933-0.614-146.125 7.885-13.107 13.414-7.885 35.635 9.728 41.882 2.97 1.024 31.027 1.331 135.885 1.434 115.814 0 132.813-0.205 136.704-1.536zM691.2 294.4v-25.6h-51.2v51.2h51.2v-25.6zM576.102 188.416c16.691-10.342 16.589-34.304-0.307-44.237l-4.915-2.867-133.018-0.307c-150.016-0.307-140.39-0.717-148.48 7.373-10.138 10.138-10.24 25.498-0.205 35.84 8.090 8.192-2.97 7.68 147.661 7.475l134.246-0.205 5.018-3.072zM691.2 166.4v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xeb35;" glyph-name="Taxi" d="M384 742.4l-25.6-38.4h-53.76c-35.226 0-55.501-0.41-59.085-1.126-7.68-1.638-16.998-6.246-22.835-11.366-3.072-2.662-36.352-46.285-83.968-109.875-43.418-57.958-79.565-106.598-80.486-108.032s-2.765-5.325-4.096-8.704l-2.458-6.144-0.41-197.632 2.355-7.373c5.632-17.306 18.944-30.003 36.352-34.611 3.174-0.819 11.571-1.434 21.299-1.536 8.806 0 16.179-0.205 16.282-0.307s0.41-4.301 0.819-9.421c4.198-55.706 44.646-102.4 99.942-115.302 13.005-3.072 39.117-3.379 52.224-0.614 17.715 3.789 32.461 9.933 47.514 19.968 8.909 5.837 26.317 22.938 32.563 31.949 13.926 19.763 22.835 46.387 23.245 69.427l0.102 4.301h230.4l0.102-4.301c0.307-22.221 8.499-47.002 22.118-67.789 6.656-10.035 24.474-27.546 35.123-34.509 22.016-14.234 41.882-20.378 67.584-20.992 35.533-0.717 65.741 10.957 91.238 35.226 24.166 22.938 39.219 56.422 39.731 88.064l0.102 4.301h28.16c16.486 0 30.31 0.512 33.485 1.126 19.558 4.096 35.942 20.787 39.731 40.346 0.819 4.403 1.024 30.413 0.819 90.112l-0.307 83.968-2.458 6.144c-6.861 17.101-19.763 28.57-36.966 32.666-3.686 0.819-28.979 5.734-56.32 10.854s-51.507 9.728-53.76 10.24c-2.253 0.512-6.656 1.434-9.83 1.946-5.939 1.024-7.68 2.458-22.426 18.534-1.843 1.946-6.554 7.066-10.65 11.264-11.469 12.083-35.84 38.093-38.912 41.472-2.458 2.662-14.541 15.462-38.707 40.96-3.686 3.891-7.987 8.602-9.523 10.24-3.072 3.277-14.643 15.565-26.624 28.16-3.994 4.198-15.053 15.974-24.576 26.112-18.944 20.070-22.221 23.040-29.389 26.726-9.933 5.12-14.541 5.53-58.88 5.53h-41.267l-22.221 33.587c-12.288 18.432-22.528 33.69-22.835 33.997s-1.843 2.458-3.379 4.915l-2.765 4.301h-51.2l-25.6-38.4zM396.288 573.952v-74.752h-121.958c-67.072 0-121.754 0.41-121.549 0.819 0.205 0.512 25.19 34.099 55.603 74.752l55.296 73.933h132.608v-74.752zM591.872 643.891c2.355-2.765 8.090-8.806 12.595-13.619s11.981-12.595 16.486-17.408c4.506-4.813 11.674-12.39 15.872-16.896 4.301-4.506 14.234-15.155 22.118-23.552s17.613-18.739 21.709-23.040c3.994-4.198 8.704-9.318 10.547-11.264 3.994-4.403 15.258-16.282 24.986-26.624 3.994-4.198 8.192-8.704 9.216-9.933l1.946-2.355h-254.259v149.504h114.483l4.301-4.813zM401.408 444.006c5.837-2.97 9.728-6.656 12.8-11.878 2.56-4.301 46.49-124.109 49.766-135.68 2.458-8.294 2.458-11.674 0-16.998-2.253-4.915-6.861-8.090-14.131-9.728-6.656-1.536-11.571-0.512-15.462 3.174-4.301 4.096-6.042 7.782-9.523 19.763-1.638 5.632-3.174 10.445-3.584 10.854-0.307 0.307-15.258 0.614-33.178 0.717h-32.563l-3.277-11.264c-3.891-13.312-4.813-15.36-9.216-19.763-3.994-3.994-8.704-5.12-15.77-3.482-15.258 3.379-19.456 14.234-12.595 32.563 1.434 3.789 12.186 33.178 23.757 65.331 11.674 32.051 22.221 60.416 23.552 62.976 2.15 4.096 5.939 8.397 10.957 12.186 6.349 4.813 20.48 5.427 28.467 1.229zM689.357 444.314c3.482-1.843 7.782-7.373 9.114-11.776 0.614-2.15 1.024-30.515 1.024-75.571v-71.987l-2.662-5.53c-3.072-6.246-7.68-9.626-14.131-10.342-9.011-1.024-16.077 2.867-20.275 11.059l-2.253 4.506-0.102 68.096c-0.102 37.478 0.205 70.963 0.512 74.547 1.024 9.83 6.451 16.896 14.541 18.534 4.301 0.922 10.752 0.205 14.234-1.536zM525.312 442.368c2.56-1.741 9.728-10.65 19.558-24.166 15.36-20.992 15.565-21.299 17.306-19.046 0.922 1.229 7.168 10.138 13.824 19.661 6.656 9.626 13.21 18.637 14.643 20.173 6.349 6.861 19.149 9.216 25.907 4.608 7.68-5.12 10.752-17.306 6.656-25.702-1.126-2.15-10.445-15.258-20.787-28.979-16.691-22.323-18.637-25.395-17.51-27.034 0.717-1.024 11.571-15.36 23.962-31.846 12.493-16.486 23.45-31.437 24.371-33.28 3.174-6.349 1.331-16.282-4.096-22.733-4.198-4.813-9.933-6.246-17.101-4.301-7.885 2.253-12.902 7.066-25.293 24.269-6.451 8.909-14.95 20.787-18.944 26.214l-7.373 9.83-18.637-26.214c-20.378-28.672-23.859-32.256-33.075-34.202-6.554-1.331-9.83-0.717-14.131 2.867-5.734 4.813-8.909 14.643-6.963 21.504 0.512 2.048 11.776 18.022 25.498 36.25 13.414 18.022 24.474 33.075 24.474 33.485 0 0.512-1.946 3.379-4.403 6.451-14.029 17.92-33.792 44.749-35.635 48.333-4.608 9.011-0.922 21.197 7.987 26.010 4.506 2.458 14.746 1.331 19.763-2.15zM303.616 442.778c2.253-0.614 5.222-2.048 6.656-3.174 8.192-6.451 8.192-20.378-0.102-26.726-4.915-3.686-9.011-4.403-22.733-4.403-6.758 0.102-12.39-0.307-12.698-0.819s-0.614-28.672-0.717-62.566l-0.102-61.645-3.072-5.018c-4.301-6.963-10.138-9.933-18.33-9.318-7.066 0.614-12.186 4.096-15.462 10.547-1.946 3.891-2.048 6.349-2.355 66.253-0.102 34.202-0.614 62.157-1.024 62.259s-6.963 0.205-14.541 0.307c-15.667 0.205-19.456 1.434-24.576 7.68-2.56 2.97-3.072 4.608-3.072 9.011 0 2.867 0.41 6.451 0.922 7.782 1.434 3.584 6.554 8.397 10.547 9.626 4.813 1.536 95.13 1.741 100.659 0.205zM386.867 399.77c-0.922-3.072-5.222-16.589-9.523-30.106s-8.294-25.805-8.704-27.341l-0.819-2.662 20.89-0.102c11.469-0.102 20.89 0 20.89 0.205s-1.331 4.403-2.97 9.421c-1.638 5.12-5.734 18.227-9.216 29.184s-6.963 21.504-7.68 23.45l-1.331 3.379-1.536-5.427z" />
+<glyph unicode="&#xeb36;" glyph-name="team_connect" d="M278.733 804.454c-40.141-10.957-59.699-54.17-41.165-91.034 2.253-4.301 6.861-11.059 10.24-15.053 10.035-11.571 11.674-21.709 5.018-32.768-3.584-5.837-8.806-10.035-14.746-11.674-2.867-0.819-31.642-1.126-95.539-1.126h-91.341l0.307-236.237c0.102-130.048 0.614-237.978 1.126-239.923 5.632-23.962 20.48-43.11 41.574-53.453 16.589-8.090-5.018-7.373 228.557-7.68l208.691-0.307-4.096 5.325c-7.475 9.933-13.005 23.552-14.746 36.147-0.307 2.253-0.512 40.141-0.614 84.275v80.077l-7.373-6.246c-8.806-7.27-22.63-14.438-34.099-17.408-9.011-2.355-28.365-3.482-36.352-1.946-34.918 6.349-61.235 29.491-71.885 62.976-3.174 9.626-3.277 11.162-3.277 25.088 0.102 11.776 0.512 16.486 2.253 23.040 10.035 37.478 43.315 64.614 81.613 66.765 23.962 1.331 47.821-6.963 64.819-22.528l4.301-4.096v80.384c0 68.198-0.205 81.203-1.536 86.323-4.403 17.203-16.589 30.72-33.075 36.762-5.53 2.048-8.602 2.15-66.253 2.662-59.494 0.512-60.518 0.512-64.512 2.765-11.469 6.144-16.896 18.432-13.414 30.31 1.126 3.686 3.584 7.68 8.294 13.312 10.957 13.107 15.565 24.166 16.589 39.629 1.536 24.986-12.186 49.050-34.509 60.416-13.414 6.861-31.13 8.909-44.851 5.222zM228.352 562.176c12.493-1.741 23.757-7.782 34.304-18.432 13.722-13.722 19.251-27.853 18.534-47.104-1.024-23.757-13.926-43.93-35.021-54.579-41.267-20.787-90.522 8.397-92.16 54.579-0.922 24.986 11.162 46.285 33.075 58.675 12.39 6.963 25.088 9.011 41.267 6.861zM230.4 408.678c29.798-3.994 58.368-26.010 69.632-53.76 6.758-16.691 6.554-13.005 6.963-91.546l0.307-71.475-69.939 0.307c-68.813 0.41-70.042 0.41-75.366 2.56-16.998 6.861-29.389 21.299-32.87 38.093-1.741 8.397-1.434 93.696 0.41 103.014 9.216 47.923 52.429 79.155 100.864 72.806zM739.43 804.25c-33.792-8.602-54.784-43.622-46.182-77.107 2.048-8.090 7.782-20.070 11.674-24.371 1.229-1.331 3.789-4.301 5.837-6.656 6.758-7.578 8.602-19.763 4.301-28.467-2.662-5.325-8.704-10.65-14.336-12.8-5.325-1.946-8.090-2.048-94.003-2.048h-88.576l4.096-5.325c5.325-7.066 10.547-17.92 12.902-26.931 1.843-6.758 1.946-12.493 1.946-93.696v-86.528l-2.253-4.096c-5.018-9.318-11.981-13.312-23.347-13.312-9.523 0-11.878 1.024-21.811 9.421-25.907 21.914-63.078 20.48-86.938-3.482-24.883-24.986-24.781-64.614 0.205-89.805 18.944-19.149 47.616-24.269 71.885-13.005 6.349 3.072 15.974 9.626 18.637 12.8 5.222 6.246 21.914 8.499 30.31 3.994 5.427-2.867 9.114-6.963 11.674-12.698 2.048-4.608 2.15-6.451 2.15-87.552 0.102-89.805-0.102-87.654 5.734-99.635 3.584-7.373 14.541-18.33 21.914-21.914 12.698-6.246-0.512-5.837 212.48-5.837h195.072v233.984c0 257.536 0.41 241.254-6.144 256.717-7.168 16.794-20.685 31.13-37.069 39.014-14.029 6.758-16.179 7.066-52.531 7.475-67.174 0.819-65.126 0.717-69.632 3.174-8.704 4.608-13.926 12.493-14.336 21.709-0.41 7.782 1.843 13.21 8.294 20.685 10.957 12.595 16.486 25.6 17.408 40.858 2.662 42.803-37.581 76.083-79.36 65.434zM771.584 560.947c20.787-5.632 37.069-20.992 44.339-41.677 2.15-6.144 2.56-9.216 2.56-20.070 0.102-10.957-0.205-13.824-2.253-19.456-3.789-10.65-8.090-17.408-16.384-25.6-19.968-19.866-49.254-24.474-74.035-11.674-10.138 5.222-22.733 17.818-27.136 27.034-5.939 12.186-6.758 15.974-6.861 29.184-0.102 10.854 0.307 13.21 2.765 20.685 11.059 32.154 44.646 50.381 77.005 41.574zM773.632 407.45c9.83-1.843 23.142-7.578 32.256-13.722 13.005-8.704 26.010-24.576 31.744-38.81 6.758-16.691 6.554-13.005 6.963-91.443l0.307-71.475h-66.56c-44.646 0-68.301 0.41-71.987 1.126-8.397 1.741-17.613 6.656-24.269 12.8s-10.035 11.264-13.619 20.48c-2.355 6.042-2.355 6.349-2.355 56.73 0 49.562 0.102 50.893 2.355 59.187 9.83 36.147 41.37 63.488 76.493 66.458 3.379 0.307 6.349 0.717 6.451 0.819 0.819 0.717 14.438-0.614 22.221-2.15z" />
+<glyph unicode="&#xeb37;" glyph-name="temperature" d="M495.616 882.176c-27.443-3.277-52.941-15.974-73.83-36.762-15.565-15.667-25.19-31.232-31.642-51.507-6.246-19.558-5.939-5.53-6.042-250.982l-0.102-225.075-7.27-8.397c-17.613-20.378-31.437-46.387-37.786-71.373-4.301-16.691-5.222-24.166-5.632-41.984-0.614-26.931 2.867-46.694 12.39-70.554 15.155-37.99 43.93-70.656 79.565-90.214 74.035-40.858 165.99-24.678 221.696 38.912 58.573 66.97 58.675 168.141 0.307 235.11l-7.27 8.294-0.307 227.738c-0.205 214.938-0.41 228.147-2.15 235.418-6.451 27.136-16.998 46.285-35.328 64.512-11.571 11.469-20.787 18.227-33.792 24.678-21.914 10.752-47.718 15.155-72.806 12.186zM535.654 828.006c26.317-8.499 45.67-30.106 51.507-57.446 1.229-5.53 1.434-44.544 1.536-240.947l0.102-234.189 12.083-12.083c16.282-16.077 25.907-31.13 32.358-50.381 4.915-14.746 6.246-23.859 6.246-41.984-0.102-14.746-0.41-18.227-2.765-27.648-8.909-35.738-29.798-64-59.904-81.51-22.221-12.8-42.291-18.022-67.379-17.408-26.726 0.717-47.104 7.168-69.53 21.811-10.035 6.656-28.16 24.986-34.714 35.43-15.053 23.552-20.685 43.11-20.582 71.373 0 14.848 0.307 18.227 2.765 27.955 6.451 25.702 16.384 43.213 35.738 62.464l12.083 11.981v306.176h20.787c18.739 0 20.992 0.205 23.962 2.048 7.782 4.71 8.499 14.541 1.331 20.992-2.048 1.843-3.994 2.048-24.166 2.355l-21.914 0.307v25.498h20.48c22.835 0 25.088 0.512 28.672 6.451 2.56 4.198 2.56 8.499 0 12.698-3.584 5.939-5.837 6.451-28.672 6.451h-20.48v25.6h20.89c19.968 0 20.89 0.102 24.269 2.355 8.090 5.427 8.090 15.462 0 20.89-3.379 2.253-4.301 2.355-24.474 2.355h-20.89l0.512 19.763c0.614 25.19 2.458 32.154 12.493 47.821 10.547 16.384 26.829 27.955 45.568 32.256 4.198 0.922 8.192 1.946 8.704 2.15 0.614 0.205 6.144 0.205 12.288 0 9.114-0.307 13.107-1.024 21.094-3.584zM501.76 548.864c-11.264-3.174-20.378-10.957-25.395-21.811l-2.765-5.837-0.307-131.584-0.205-131.584-4.506-2.867c-6.042-3.789-15.974-13.824-20.685-20.89-12.8-19.251-16.077-45.466-8.397-67.379 8.294-23.859 28.365-42.496 53.043-49.357 9.114-2.458 29.594-2.458 38.912 0.102 18.022 4.915 33.28 15.872 44.237 31.642 13.926 20.275 16.896 48.435 7.475 71.475-5.12 12.8-17.306 27.853-27.853 34.509l-4.403 2.765-0.205 131.584-0.307 131.584-2.765 5.837c-8.192 17.51-27.853 26.829-45.875 21.811z" />
+<glyph unicode="&#xeb38;" glyph-name="terms_conditions" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM699.494 574.464c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493s-0.41-8.397-2.765-12.39c-3.379-5.734-8.704-9.933-14.95-11.776-3.789-1.229-35.533-1.434-187.597-1.434-200.704 0-185.958-0.41-194.253 5.837-11.571 8.806-12.39 27.136-1.741 37.786 7.987 7.987-7.475 7.475 197.12 7.475 161.178 0.102 183.501-0.102 187.392-1.434zM699.699 471.962c6.758-2.253 13.312-8.909 15.565-15.77 3.379-10.138 0-22.016-7.987-28.058-7.987-6.144 4.403-5.734-195.174-5.734-205.926 0-189.030-0.717-197.325 7.885-11.264 11.571-9.626 29.491 3.584 38.605 2.253 1.638 5.632 3.277 7.475 3.686s85.709 0.819 186.266 0.922c164.966 0.102 183.296-0.102 187.597-1.536zM699.29 369.562c5.734-1.638 11.981-6.963 14.95-12.8 4.71-8.909 2.458-21.606-5.12-29.184-8.192-8.192 7.168-7.578-197.12-7.578-204.8 0-189.030-0.614-197.12 7.782-10.035 10.342-10.035 25.702 0 35.738 8.090 8.090-8.294 7.475 196.198 7.578 162.509 0.102 183.398-0.102 188.211-1.536zM746.701 277.504c5.018-1.741 10.24-6.349 12.8-11.162 2.15-4.096 2.253-13.517 0.102-17.51-0.922-1.638-12.186-15.258-25.088-30.208s-32.154-37.274-42.803-49.664c-27.034-31.437-37.786-43.93-38.4-44.544-0.307-0.307-10.445-11.981-22.426-26.112-12.083-14.029-23.142-26.726-24.576-27.955-4.198-3.891-8.192-5.53-14.438-6.042-9.523-0.922-15.053 2.253-25.6 14.643-4.813 5.53-9.421 10.752-10.24 11.674s-3.789 4.301-6.656 7.68c-5.939 6.963-12.083 14.131-12.8 14.848-2.765 2.765-38.605 44.954-40.448 47.616-4.506 6.758-4.301 15.872 0.717 22.63 3.584 4.813 15.155 14.746 19.046 16.384 4.608 1.843 11.981 2.048 17.51 0.307 4.403-1.331 14.336-10.65 43.93-41.677l8.192-8.499 21.811 19.661c12.083 10.854 24.474 22.016 27.546 24.883 3.174 2.867 7.987 7.27 10.752 9.728 2.867 2.458 8.806 7.782 13.312 11.878s15.565 14.029 24.576 22.016c9.011 8.090 20.173 18.125 24.781 22.323 16.282 14.643 18.125 16.077 22.835 17.408 5.325 1.536 10.342 1.434 15.565-0.307zM443.904 267.162c5.222-1.843 11.571-7.373 14.541-12.902 1.229-2.355 1.843-5.632 1.843-11.059 0-6.554-0.41-8.397-2.765-12.39-1.536-2.56-4.403-5.939-6.349-7.475-7.578-5.734-7.373-5.734-67.072-5.734-61.747 0-61.542 0-68.813 7.27-5.12 5.12-7.066 9.216-7.782 15.77-0.819 7.782 1.843 15.053 7.578 20.685 7.68 7.373 6.963 7.373 69.018 7.373 48.333 0.102 55.398-0.102 59.802-1.536zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xeb39;" glyph-name="text_alerts" d="M102.707 556.339c0.205-261.427 0.307-276.070 2.048-281.702 9.523-31.027 33.997-52.224 65.229-56.525 1.434-0.205 27.136-0.41 57.139-0.41l54.477-0.102v-153.6l153.6 153.6h486.4l-0.102 273.203c-0.102 299.11 0.307 279.245-6.042 294.298-9.114 21.299-26.214 36.454-50.176 44.237l-6.656 2.15-756.224 0.512 0.307-275.661zM521.83 728.474c9.728-1.741 18.534-6.554 26.010-14.131 6.451-6.554 12.186-15.77 50.79-82.842 1.229-2.15 17.51-30.003 36.25-62.157 18.739-32.051 34.918-59.699 35.84-61.44 4.608-7.987 9.933-16.998 21.504-36.864 6.861-11.776 13.414-22.835 14.336-24.576 1.024-1.638 8.397-14.336 16.384-28.058 8.090-13.824 15.565-27.648 16.691-30.72 2.662-7.168 3.277-21.094 1.229-28.774-2.15-8.192-6.246-15.77-11.878-21.914-6.451-7.066-13.312-11.469-22.733-14.541l-7.373-2.355-186.061-0.102c-203.264 0-190.771-0.41-203.571 5.837-7.782 3.789-18.227 14.438-22.221 22.835-5.939 12.39-6.963 26.726-2.56 38.912 1.024 3.174 10.138 19.763 20.173 36.864 10.035 17.203 19.046 32.666 19.968 34.304 4.301 7.373 19.046 32.768 64.512 110.592 26.624 45.67 49.357 84.582 50.586 86.63 1.126 2.15 8.397 14.438 15.974 27.546 14.336 24.678 20.173 32.461 28.467 37.683 11.469 7.373 23.962 9.83 37.683 7.27zM492.851 625.152c-6.554-3.994-6.656-4.301-6.144-45.363 0.307-31.642 0.717-38.912 2.56-49.869 1.126-7.066 4.198-26.829 6.758-44.032s4.915-32.768 5.222-34.509l0.614-3.379h20.275l0.614 3.891c0.307 2.048 0.922 5.427 1.229 7.373s0.717 4.506 0.819 5.632c0.205 1.126 1.331 8.704 2.56 16.896 1.126 8.192 2.355 16.486 2.662 18.432s2.048 13.517 3.994 25.6c3.277 21.504 3.379 22.835 3.482 56.627 0.205 38.195 0.102 38.81-6.349 42.701-2.867 1.843-5.222 2.048-19.149 2.048s-16.282-0.205-19.149-2.048zM486.4 396.8v-25.6h51.2v51.2h-51.2v-25.6z" />
+<glyph unicode="&#xeb3a;" glyph-name="Thumb_down" d="M272.384 856.986c-32.461-5.018-56.627-26.010-65.126-56.73-2.56-9.011-2.56-29.491 0-38.912 2.253-8.499 7.68-19.558 12.8-26.317l4.096-5.325-5.837-1.126c-22.938-4.506-40.243-15.77-51.917-33.792-9.114-14.029-12.8-26.931-12.39-44.032 0.512-19.046 7.066-35.738 19.354-49.050 2.048-2.253 3.789-4.403 3.789-4.608 0-0.307-1.638-1.229-3.584-2.048-6.246-2.662-17.203-10.342-23.245-16.384-21.709-21.709-28.365-56.218-16.077-84.173 2.765-6.349 9.933-17.306 14.131-21.606 1.741-1.843 3.174-3.482 3.174-3.789s-2.15-1.536-4.813-2.765c-28.058-12.698-46.182-43.213-43.93-73.933 1.741-25.498 13.926-46.387 34.611-59.802 9.011-5.837 14.848-8.294 25.395-10.65 8.192-1.843 14.541-1.946 114.995-1.946 58.368 0 106.189-0.205 106.189-0.41s-0.717-4.198-1.638-8.909c-0.922-4.71-1.741-9.523-1.946-10.65-0.102-1.126-3.584-21.606-7.475-45.568-12.493-74.854-13.926-85.094-13.926-105.472-0.102-18.33 0.307-23.040 2.867-37.376 7.885-44.339 29.286-76.902 60.314-92.058 10.547-5.12 19.763-7.066 29.901-6.451 26.419 1.843 48.538 19.046 57.037 44.442 2.253 6.758 2.253 8.090 2.662 58.061l0.307 50.995 38.707 77.517c24.166 48.128 40.653 79.974 43.725 84.173 26.214 35.738 66.97 60.314 109.978 66.458 4.198 0.614 8.704 1.331 10.035 1.638l2.253 0.41v384h-22.63c-17.203 0-24.166 0.41-28.774 1.638-3.686 0.922-32.768 14.848-70.656 33.792-67.686 33.894-70.451 35.123-82.739 38.605-7.578 2.15-9.011 2.15-122.368 2.355-63.078 0.102-115.814 0-117.248-0.205zM781.824 804.966c-19.251-4.915-34.304-20.378-38.298-39.322-1.843-8.704-1.536-348.16 0.307-355.021 5.222-19.661 20.89-34.714 40.038-38.4 4.301-0.819 19.968-1.024 51.712-0.819 50.483 0.512 49.766 0.41 61.44 7.475 11.162 6.758 19.558 18.33 23.040 31.334 2.253 8.294 2.253 346.214 0 356.557-1.946 9.421-5.939 16.384-13.824 24.371-7.168 7.168-14.029 11.162-24.064 13.722-8.090 2.048-92.16 2.15-100.352 0.102zM847.974 751.411c8.294-3.891 14.643-10.24 18.739-18.739 2.867-5.939 3.174-7.68 3.174-15.872s-0.41-9.933-3.174-15.872c-3.994-8.499-10.342-14.848-18.842-18.842-5.939-2.867-7.68-3.174-15.872-3.174s-9.933 0.41-15.872 3.174c-8.499 4.096-14.848 10.445-18.842 18.842-2.765 5.837-3.174 7.68-3.174 15.872s0.307 9.933 3.174 15.872c6.963 14.643 20.173 22.733 36.352 22.118 6.246-0.307 9.216-0.922 14.336-3.379z" />
+<glyph unicode="&#xeb3b;" glyph-name="Thumb_up" d="M560.333 881.152c-22.63-5.939-39.834-23.040-46.182-45.875-1.946-6.963-2.048-10.65-2.15-56.627l-0.102-49.152-39.219-78.541c-26.317-52.429-40.858-80.486-44.032-84.48-12.902-16.486-24.678-27.546-41.472-39.117-20.173-13.619-45.158-23.142-69.939-26.419l-9.523-1.331-0.307-192.205-0.205-192.205h22.63c17.203 0 24.166-0.41 28.774-1.638 3.686-0.922 32.768-14.848 70.861-33.894 35.533-17.818 67.482-33.382 70.963-34.714 16.794-6.349 10.138-6.042 138.035-6.042 109.261 0 117.146 0.102 123.187 1.843 35.84 10.138 59.392 42.496 57.242 78.438-1.024 15.872-6.042 30.003-15.053 41.779-3.891 5.222-3.994 5.427-1.741 5.837 20.685 3.789 33.485 10.035 45.773 22.323 15.36 15.36 22.733 34.202 22.016 56.627-0.512 19.149-7.373 35.942-19.866 49.459-1.741 1.843-3.174 3.584-3.174 3.686 0 0.205 3.379 2.048 7.475 4.198 12.288 6.349 21.197 14.438 29.286 26.726 8.704 13.107 12.39 26.419 11.981 43.418-0.307 11.878-2.355 20.685-6.861 30.413-2.662 5.632-10.752 17.51-14.848 21.504-1.946 2.048-1.946 2.048 2.97 4.198 6.451 2.97 18.022 11.162 23.040 16.486 14.95 15.77 22.733 36.557 21.402 57.139-1.331 20.378-8.192 35.84-22.016 50.074-10.035 10.342-21.811 16.998-37.069 20.685-8.602 2.15-10.445 2.15-115.098 2.253-58.573 0-106.598 0.205-106.803 0.307-0.205 0.205 0.819 6.554 2.253 14.131 2.048 11.469 13.517 80.282 15.462 93.594 0.41 2.253 0.819 5.018 1.024 6.144 1.843 10.957 3.584 23.757 5.325 37.888 0.922 7.782 0.922 31.539-0.102 40.96-5.12 51.61-27.955 90.726-62.464 107.315-14.746 7.066-27.238 8.499-41.472 4.813zM141.619 523.366c-18.739-4.608-34.714-21.299-38.093-39.936-1.536-8.602-1.536-343.962 0-352.461 3.482-19.354 20.070-36.147 39.629-40.243 7.27-1.536 88.781-1.536 97.075 0 19.354 3.482 36.147 20.070 40.243 39.629 1.638 7.68 1.638 346.010 0 353.69-3.891 18.637-18.944 34.202-37.888 39.219-7.475 2.048-92.774 2.048-100.966 0.102zM207.974 213.811c29.696-14.029 29.696-55.091-0.102-69.325-5.939-2.765-7.68-3.174-15.872-3.174s-9.933 0.307-15.872 3.174c-8.397 3.994-14.746 10.342-18.842 18.842-2.867 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c9.216 19.456 31.642 27.75 50.688 18.739z" />
+<glyph unicode="&#xeb3c;" glyph-name="tick" d="M814.080 778.854c-8.602-2.355-12.902-4.301-19.661-8.602-6.963-4.506-5.222-2.97-39.424-36.25-16.077-15.667-32.768-31.846-37.069-36.045-14.234-13.824-70.861-68.915-91.648-89.19-11.162-10.957-22.835-22.221-25.702-25.088-2.97-2.765-19.763-19.251-37.478-36.454-17.715-17.306-34.918-33.997-38.298-37.274s-14.95-14.541-25.702-24.986c-55.091-53.76-87.142-84.992-91.443-89.088-2.56-2.458-7.066-6.758-9.83-9.523l-5.222-4.915-8.294 9.421c-4.608 5.222-9.421 10.65-10.752 12.083-2.048 2.15-73.626 82.022-100.557 112.128-9.626 10.752-9.728 10.752-16.589 15.36-20.89 13.824-48.333 14.131-70.451 0.819-6.963-4.198-38.605-35.226-45.363-44.442-14.541-20.070-16.486-47.411-4.915-69.427 2.253-4.198 17.306-24.064 36.966-48.845 57.856-72.704 113.664-142.848 141.722-178.074 14.95-18.739 28.262-35.533 29.696-37.376 15.77-20.89 25.498-28.979 41.472-34.304 23.347-7.885 49.357-1.843 66.765 15.565 2.662 2.662 8.704 9.728 13.312 15.667s11.264 14.234 14.643 18.432c3.379 4.198 8.294 10.445 10.957 13.824 29.389 37.069 50.893 64 56.627 71.168 3.891 4.813 17.306 21.606 29.798 37.376 21.299 26.726 48.333 60.826 78.746 98.918 7.066 8.909 18.637 23.45 25.702 32.358s27.341 34.406 45.056 56.627c17.715 22.221 37.683 47.411 44.442 55.808 23.859 30.106 52.531 66.048 81.306 102.195 32.87 41.165 34.611 43.622 38.298 53.043 12.595 31.642-1.229 68.096-31.539 83.763-13.414 6.861-31.846 9.011-45.568 5.325z" />
+<glyph unicode="&#xeb3d;" glyph-name="tick_circle" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-9.83-4.096-35.738-17.101-47.002-23.757-32.768-19.251-61.030-41.062-88.064-67.891-45.978-45.773-81.101-101.171-103.219-162.816-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-52.531 70.246-126.566 123.494-210.842 151.552-27.955 9.318-63.693 16.998-90.624 19.558-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM724.48 674.406c15.565-7.27 24.678-22.733 23.552-40.141-0.922-13.312-1.536-14.131-72.192-102.298-2.97-3.686-8.192-10.24-70.144-88.064-20.275-25.498-47.002-59.085-59.392-74.65s-29.798-37.478-38.81-48.742c-8.909-11.264-17.613-22.323-19.456-24.474-14.234-18.022-18.944-22.016-29.594-25.293-14.541-4.506-29.901-0.512-40.55 10.65-2.765 2.97-16.179 19.354-29.798 36.557s-25.498 32.154-26.419 33.28c-0.922 1.126-5.222 6.451-9.421 11.776s-8.192 10.445-8.909 11.264c-1.229 1.434-33.075 41.574-53.248 66.867-10.138 12.902-13.619 20.070-14.131 30.208-0.717 14.746 3.789 23.654 20.685 40.346 9.728 9.626 13.619 12.698 19.354 15.36 6.451 3.072 7.885 3.379 16.794 3.379 8.704 0 10.445-0.307 16.384-3.174 7.373-3.482 9.421-5.325 19.968-17.203 3.994-4.403 7.885-8.806 8.704-9.728 0.922-0.922 5.325-5.734 9.728-10.854 4.506-5.018 9.011-10.138 10.138-11.264 1.024-1.126 10.65-11.878 21.402-23.859l19.558-21.811 9.216 9.216c5.12 5.018 12.39 12.083 16.077 15.565 3.686 3.584 19.763 19.251 35.635 34.714 15.974 15.462 33.894 32.973 39.834 38.707 6.042 5.837 24.986 24.371 42.189 41.062 17.203 16.794 34.509 33.69 38.605 37.581 3.994 3.891 19.558 19.046 34.611 33.69 33.997 33.075 38.195 35.738 54.989 34.918 6.144-0.307 9.523-1.126 14.643-3.584z" />
+<glyph unicode="&#xeb3e;" glyph-name="tickets" d="M128 537.6v-345.6l108.954 0.512 18.227 50.176c10.035 27.546 18.227 50.483 18.227 50.893 0 0.512-21.197 0.819-47.104 0.819h-47.104v486.4h271.872l12.698 35.123c6.963 19.251 13.005 35.328 13.414 35.84 0.41 0.41 25.395-8.192 55.603-19.251 30.208-10.957 55.194-19.968 55.501-19.968s0.512 15.872 0.512 35.328v35.328h-178.688l-1.331-7.885c-5.734-36.454-47.002-54.784-78.234-34.816-10.752 6.861-19.456 19.456-22.221 32.256-0.614 2.97-1.024 5.734-1.024 6.144 0.102 0.41 0.102 1.536 0 2.56-0.102 1.638-5.12 1.741-89.702 1.741h-89.6v-345.6zM491.622 817.459c-0.512-1.331-13.21-36.25-28.262-77.619s-28.672-78.746-30.208-82.944c-42.803-117.555-94.31-259.072-97.28-267.264-2.15-5.939-12.083-33.075-22.016-60.416s-19.661-53.76-21.402-58.88c-1.843-5.018-10.547-28.979-19.354-53.248-8.806-24.166-16.179-44.646-16.282-45.363-0.205-0.922 7.27-4.198 23.245-10.035 13.005-4.71 29.082-10.65 35.84-13.107s33.28-12.083 58.88-21.402c25.6-9.318 47.309-17.203 48.23-17.613 1.331-0.512 2.048 0.205 2.97 2.97 2.56 7.885 13.005 19.046 22.528 24.064 15.155 7.987 31.334 8.192 47.002 0.512 20.48-10.035 31.846-33.178 27.136-55.501-1.843-8.704-1.946-8.090 1.229-8.806 2.355-0.614 18.022-6.246 35.738-12.902 2.867-1.024 15.974-5.837 29.184-10.65 54.477-19.763 78.95-28.672 89.088-32.358 5.939-2.15 11.059-3.584 11.366-3.277 0.307 0.41 15.974 42.906 34.714 94.413s39.322 108.237 45.773 125.952c6.451 17.715 14.746 40.55 18.432 50.688 3.584 10.138 7.27 20.070 7.987 22.016 0.819 1.946 10.752 29.184 22.118 60.416s21.299 58.675 22.118 60.928c0.819 2.253 2.355 6.451 3.379 9.216 2.662 7.066 21.914 60.006 26.624 73.216 2.15 5.939 13.619 37.478 25.6 70.144 11.878 32.666 22.016 60.518 22.528 61.952 0.41 1.434 2.253 6.349 3.994 10.957 1.638 4.608 2.765 8.602 2.355 8.909-0.512 0.307-28.877 10.65-63.181 23.142s-64 23.347-66.048 24.064c-34.099 13.005-39.834 14.541-39.936 10.24 0-1.741-5.837-9.83-10.547-14.746-19.456-19.968-52.531-19.866-72.294 0-12.186 12.39-17.51 31.232-13.517 47.821 0.717 2.97 1.229 5.632 1.024 5.734-0.205 0.205-34.304 12.698-75.674 27.648-41.37 15.053-78.848 28.774-83.149 30.413-4.403 1.638-8.192 2.97-8.499 2.97s-0.922-1.024-1.434-2.253zM516.71 702.054c6.144-2.15 72.192-26.214 146.842-53.35s140.083-50.995 145.408-52.941c28.262-10.138 32.768-11.981 32.768-13.107 0-0.717-8.806-25.395-19.558-54.886-19.354-52.941-24.064-65.843-31.642-86.938-2.15-5.939-5.837-16.077-8.192-22.528-5.427-14.848-11.366-31.232-16.384-45.056-2.15-5.939-9.523-26.214-16.384-45.056s-14.029-38.4-15.872-43.52c-1.843-5.018-7.066-19.558-11.776-32.256-24.064-66.048-37.581-103.014-41.062-112.947-2.253-6.144-4.198-11.469-4.506-11.981-0.205-0.41-4.096 0.512-8.397 2.048-8.090 2.867-141.619 51.405-172.339 62.669-9.318 3.379-21.914 8.090-28.16 10.24-6.144 2.253-16.077 5.837-22.016 7.987s-15.77 5.734-22.016 7.987c-15.667 5.734-78.643 28.672-81.715 29.798l-2.56 1.024 11.674 32.051c6.451 17.613 13.517 36.864 15.667 42.803 3.891 10.342 10.035 27.341 16.998 46.592 1.843 5.12 5.222 14.336 7.475 20.48 2.253 6.246 12.493 34.304 22.733 62.464 23.962 65.843 26.112 71.578 30.72 84.48 9.933 27.443 27.955 76.8 29.696 81.408 5.632 14.746 30.72 84.48 30.72 85.402 0 1.434-0.717 1.638 11.878-2.867zM520.704 672.256c-0.41-0.614-2.56-6.246-4.813-12.595-2.253-6.246-5.53-15.155-7.168-19.661s-4.096-11.162-5.325-14.848c-1.331-3.686-10.752-29.696-21.094-57.856-10.24-28.16-19.558-53.76-20.685-56.832-2.355-6.554-25.293-69.427-29.696-81.408-1.638-4.506-5.018-13.722-7.373-20.48-5.939-16.384-24.781-68.301-27.238-74.752-1.843-4.915-5.837-15.77-18.842-51.61-3.174-8.704-5.734-16.384-5.734-17.101s3.994-2.662 9.011-4.301c4.915-1.741 20.48-7.27 34.509-12.493 14.131-5.12 28.57-10.445 32.256-11.674 3.686-1.331 36.659-13.312 73.216-26.726 36.659-13.312 71.373-26.010 77.312-28.16s21.811-7.885 35.328-12.698c13.517-4.915 25.088-9.114 25.702-9.318s1.843 1.843 2.662 4.403c2.458 7.27 40.653 112.435 58.368 160.461 1.638 4.506 3.584 10.035 4.403 12.288 0.717 2.253 4.403 12.39 8.090 22.528 3.789 10.138 7.782 20.992 8.806 24.064 1.126 3.072 16.691 45.978 34.714 95.232l32.563 89.6-3.174 1.126c-1.741 0.614-36.25 13.21-76.698 27.955-40.346 14.643-75.878 27.546-78.848 28.672-2.867 1.024-28.365 10.24-56.525 20.582-73.83 26.931-73.114 26.624-73.728 25.6zM648.806 490.598l10.342-3.789-3.482-9.421c-1.946-5.222-4.301-11.674-5.325-14.541-1.024-2.765-14.848-40.96-30.822-84.787-27.238-74.65-29.082-79.565-31.13-78.95-1.229 0.41-9.83 3.482-19.149 6.963l-17.101 6.246 19.968 54.784c10.957 30.106 20.992 57.549 22.323 60.928l2.355 6.144-2.662 1.229c-2.458 1.024-30.31 11.264-40.346 14.746-2.15 0.717-3.891 1.843-3.891 2.458 0 0.512 2.253 7.066 4.915 14.336 3.584 9.626 5.325 13.21 6.451 12.902 0.819-0.307 5.632-1.536 10.65-2.867 23.552-6.246 42.906-0.205 54.272 16.896l2.765 4.198 4.71-1.843c2.662-1.024 9.523-3.584 15.155-5.632zM204.8 537.6v-217.6h78.541l2.355 6.451c1.229 3.482 4.71 13.005 7.68 21.197s9.216 25.19 13.824 37.888c4.608 12.698 14.848 40.755 22.733 62.464s15.872 43.622 17.715 48.64c1.843 5.12 12.595 34.816 24.064 66.048 11.366 31.232 27.955 76.902 36.864 101.376s19.661 53.965 23.859 65.536c4.198 11.571 7.987 22.016 8.397 23.347l0.614 2.253h-236.646v-217.6z" />
+<glyph unicode="&#xeb3f;" glyph-name="Top_10" d="M493.773 810.701c-16.794-51.2-25.702-78.746-43.213-132.301-7.373-22.835-14.541-44.646-15.872-48.64-1.331-3.891-7.27-22.323-13.312-40.96-6.042-18.534-11.366-34.202-11.776-34.611-0.41-0.512-73.011-0.922-161.382-0.922h-160.666l3.072-2.458c2.867-2.253 21.606-15.872 91.648-66.458 15.462-11.162 34.611-24.986 42.496-30.72 17.408-12.595 40.243-29.082 85.606-61.85l34.406-24.883-10.445-33.382c-5.734-18.432-11.981-38.298-13.722-44.237-1.843-5.939-3.789-11.878-4.198-13.312-0.512-1.434-3.072-9.421-5.632-17.92-2.662-8.397-5.12-16.486-5.632-17.92s-2.355-7.373-4.198-13.312c-1.741-5.939-4.506-14.848-6.144-19.968-2.662-8.602-5.632-18.022-20.070-64-3.072-9.83-6.144-19.968-6.963-22.528-0.717-2.56-3.891-12.902-7.168-23.040-3.174-10.138-7.066-22.733-8.602-27.955l-2.867-9.421 3.174 2.355c1.741 1.331 16.282 11.981 32.358 23.757 16.077 11.674 31.539 23.040 34.304 25.088 2.867 2.048 14.848 10.854 26.624 19.456 11.878 8.602 29.798 21.811 39.936 29.184s35.021 25.6 55.296 40.448c20.275 14.848 43.008 31.437 50.586 37.069 13.722 10.035 13.722 10.035 16.384 8.294 1.434-0.922 18.534-12.902 37.99-26.726s47.821-33.997 62.976-44.749c15.258-10.752 45.363-32.256 67.072-47.616s47.718-33.894 57.856-41.062c10.138-7.168 22.016-15.667 26.419-18.842s8.294-5.632 8.499-5.427c0.205 0.307-5.325 17.715-12.288 38.81-28.57 86.63-75.981 229.99-82.022 247.91l-6.349 19.046 14.438 10.547c7.987 5.837 19.558 14.336 25.702 18.944 6.246 4.506 34.816 25.498 63.488 46.592 28.774 21.094 65.024 47.821 80.691 59.29 15.77 11.571 36.966 27.136 47.104 34.611 10.24 7.475 19.251 14.234 20.070 15.053 1.126 1.126-24.064 1.331-154.112 1.434-85.606 0-156.262 0-157.184 0.102-1.229 0-2.662 3.174-5.222 11.059-2.048 6.042-10.547 31.949-19.046 57.549-26.829 81.51-62.362 189.235-68.915 209.408-3.482 10.752-6.656 19.763-6.963 20.173-0.41 0.41-6.758-18.022-14.234-40.96zM532.48 417.792v-113.152h-40.96v163.84h-61.44v23.45l3.379 0.512c1.741 0.307 6.554 0.819 10.445 1.126 17.92 1.638 30.003 6.042 38.502 14.029 5.53 5.222 8.090 8.806 12.186 17.101l3.174 6.246h34.714v-113.152z" />
+<glyph unicode="&#xeb40;" glyph-name="top_up_dollar" d="M495.309 881.459c-12.186-2.048-24.678-7.475-36.045-15.462-2.765-2.048-35.533-33.997-72.704-70.963-37.171-37.069-113.459-113.050-169.472-168.755l-101.888-101.376 192-0.102 0.102-159.437c0.102-87.757 0.205-160.666 0.307-162.099 3.072-30.925 9.114-52.838 21.402-77.312 8.294-16.691 16.896-29.286 29.901-44.032 8.704-9.933 8.499-9.728 17.92-18.022 27.955-24.474 60.518-40.448 97.792-47.616 13.005-2.56 16.486-2.765 37.376-2.765 20.685 0 24.474 0.307 37.274 2.765 17.101 3.277 38.195 10.138 51.098 16.589 10.445 5.325 23.142 12.595 27.853 16.077 30.822 22.835 51.712 46.899 66.458 76.288 11.981 23.962 19.968 52.224 21.504 76.493 0.205 3.379 0.512 77.414 0.512 164.659l0.102 158.413 192 0.102-110.797 110.285c-60.928 60.621-137.011 136.397-168.96 168.243-31.949 31.949-61.030 60.109-64.512 62.566-19.866 14.541-43.827 19.866-69.222 15.462zM537.088 369.050c48.742-8.397 90.112-38.81 111.923-82.33 10.854-21.709 15.565-40.858 16.077-65.024 0.41-17.715-0.819-28.672-5.018-44.544-12.698-47.514-49.254-87.142-96.358-104.243-30.925-11.162-68.71-11.469-100.966-0.717-43.622 14.541-79.77 50.074-95.437 93.696-5.734 16.077-7.987 29.082-8.397 48.64-0.41 16.794 0.717 26.829 4.608 41.984 9.114 35.942 33.178 69.325 64.614 89.702 19.456 12.595 45.466 21.914 67.994 24.269 10.035 1.024 30.72 0.307 40.96-1.434zM507.597 357.786c-3.277-1.946-4.813-7.475-4.813-17.203s-0.307-10.342-5.734-10.342c-4.403 0-18.125-4.096-25.702-7.68-14.336-6.758-26.010-21.709-29.491-37.786-1.638-7.782-1.229-25.907 0.922-32.461 4.71-15.053 14.95-26.317 30.413-33.587 3.174-1.536 11.162-4.608 17.715-6.861l11.878-3.994v-67.994l-4.301 1.536c-6.042 2.048-13.414 7.68-16.998 12.902-1.638 2.458-4.915 9.421-7.168 15.565-4.915 12.902-6.349 15.36-10.24 17.408-10.445 5.427-23.962 0.819-28.058-9.523-2.765-7.168 0.205-22.221 6.758-33.178 3.584-6.144 13.005-16.384 18.842-20.378 9.83-6.758 26.112-12.902 38.093-14.336 2.56-0.307 2.56-0.307 3.072-14.131 0.614-16.998 2.253-20.48 9.626-20.48s8.806 3.277 9.011 20.787l0.102 13.619 8.192 1.331c15.667 2.458 30.618 9.728 40.346 19.661 8.397 8.602 12.186 14.95 15.565 26.010 6.656 21.299 1.843 44.442-12.083 59.29-9.318 9.933-17.818 14.438-39.526 21.094l-12.288 3.789-0.102 30.31c-0.102 16.691 0 30.413 0.307 30.413 1.638 0 8.192-3.482 11.469-6.246 5.427-4.301 8.499-9.114 11.366-17.818 3.482-10.65 10.035-15.872 19.456-15.872 4.301 0.102 10.854 3.686 13.926 7.782 2.662 3.379 2.97 4.71 2.97 11.059 0 6.246-0.512 8.397-3.686 14.95-3.686 7.475-10.24 16.077-15.974 20.89-8.294 6.861-21.299 12.186-33.587 13.722l-6.144 0.717-0.205 10.138c-0.102 5.632-0.717 11.366-1.331 12.902-1.843 4.506-8.294 6.451-12.595 3.994zM502.784 274.432v-28.16l-4.301 1.741c-5.325 2.048-14.029 7.475-16.384 10.138-4.813 5.427-6.451 16.998-3.789 25.907 0.717 2.355 2.867 5.939 4.915 7.885 3.379 3.277 13.21 8.602 19.354 10.547 0.102 0.102 0.205-12.595 0.205-28.058zM533.299 197.837c8.499-4.096 15.053-9.933 17.101-15.36 6.042-15.872-1.741-33.485-18.022-40.55-2.458-1.024-5.939-2.253-7.68-2.662l-3.277-0.614v31.744l0.102 31.846 2.662-0.614c1.434-0.41 5.53-2.048 9.114-3.789z" />
+<glyph unicode="&#xeb41;" glyph-name="top_up_euro" d="M495.309 881.459c-12.186-2.048-24.678-7.475-36.045-15.462-2.765-2.048-35.533-33.997-72.704-70.963-37.171-37.069-113.459-113.050-169.472-168.755l-101.888-101.376 192-0.102 0.102-159.437c0.102-87.757 0.205-160.666 0.307-162.099 3.072-30.925 9.114-52.838 21.402-77.312 8.294-16.691 16.896-29.286 29.901-44.032 8.704-9.933 8.499-9.728 17.92-18.022 27.955-24.474 60.518-40.448 97.792-47.616 13.005-2.56 16.486-2.765 37.376-2.765 20.685 0 24.474 0.307 37.274 2.765 17.101 3.277 38.195 10.138 51.098 16.589 10.445 5.325 23.142 12.595 27.853 16.077 30.822 22.835 51.712 46.899 66.458 76.288 11.981 23.962 19.968 52.224 21.504 76.493 0.205 3.379 0.512 77.414 0.512 164.659l0.102 158.413 192 0.102-110.797 110.285c-60.928 60.621-137.011 136.397-168.96 168.243-31.949 31.949-61.030 60.109-64.512 62.566-19.866 14.541-43.827 19.866-69.222 15.462zM537.088 369.050c55.091-9.421 100.966-47.616 119.603-99.738 10.138-28.467 11.366-61.952 3.379-91.955-15.667-58.982-66.15-103.322-127.59-112.026-10.65-1.536-36.659-0.922-47.616 1.126-63.181 11.674-112.23 60.621-124.006 123.597-2.15 11.571-2.662 37.99-0.922 49.050 6.144 39.424 24.576 72.090 54.784 97.178 22.016 18.33 52.634 31.13 81.408 34.202 9.933 1.024 30.72 0.307 40.96-1.434zM498.176 331.366c-33.894-7.578-53.555-29.594-65.638-73.523-0.205-0.922-2.765-1.331-8.090-1.331-4.301 0-9.216-0.614-11.162-1.434-9.626-3.994-11.674-19.046-3.584-26.829 2.765-2.662 3.891-2.97 11.264-3.379l8.090-0.307-0.205-7.885-0.307-7.782-6.963-0.205c-5.427-0.102-7.782-0.614-10.445-2.56-6.349-4.301-8.397-13.824-4.71-21.197 3.072-5.837 6.246-7.475 15.565-7.782 4.403-0.205 8.397-0.614 9.011-0.922 0.512-0.307 1.229-2.458 1.638-4.71 1.946-11.264 10.24-28.058 19.661-39.526 14.95-18.022 34.304-26.726 61.235-27.648 27.955-0.922 49.050 6.246 62.157 20.992 9.626 10.957 16.794 25.395 15.872 32.154-1.126 8.192-9.728 14.95-18.944 15.053-8.602 0-13.005-3.789-18.739-15.872-3.277-6.861-10.854-14.234-16.998-16.384-7.578-2.662-25.907-3.277-35.328-1.126-8.806 1.946-17.613 6.861-22.938 12.595-3.994 4.403-10.547 16.998-11.264 22.016l-0.614 3.379h34.304c33.28 0 34.406 0.102 37.274 2.15 9.011 6.656 9.011 20.685 0.102 27.341-2.56 1.946-4.403 2.048-38.912 2.048h-36.147l-0.512 5.734c-0.307 3.174-0.307 6.758-0.102 8.090l0.307 2.253h42.291c25.907 0 43.315 0.41 45.158 1.024 7.168 2.56 11.059 16.179 6.656 23.347-1.229 1.843-3.584 4.198-5.427 5.325-3.174 1.946-5.222 2.048-43.622 2.048h-40.346l0.717 3.379c0.41 1.741 2.458 6.963 4.608 11.469 5.018 10.445 12.493 18.432 21.504 22.835 8.602 4.198 9.83 4.506 21.606 4.915 19.763 0.614 30.003-5.12 38.195-21.402 2.048-4.096 4.198-8.090 4.915-9.011 5.939-7.27 20.173-7.168 27.136 0.307 5.53 5.939 5.734 13.21 0.717 23.859-9.83 20.787-24.781 32.87-47.002 37.99-10.342 2.458-32.358 2.662-41.984 0.512z" />
+<glyph unicode="&#xeb42;" glyph-name="top_up_uk_bank" d="M495.309 881.459c-12.186-2.048-24.678-7.475-36.045-15.462-2.765-2.048-35.533-33.997-72.704-70.963-37.171-37.069-113.459-113.050-169.472-168.755l-101.888-101.376 192-0.102 0.102-159.437c0.102-87.757 0.205-160.666 0.307-162.099 3.072-30.925 9.114-52.838 21.402-77.312 8.294-16.691 16.896-29.286 29.901-44.032 8.704-9.933 8.499-9.728 17.92-18.022 27.955-24.474 60.518-40.448 97.792-47.616 13.005-2.56 16.486-2.765 37.376-2.765 20.685 0 24.474 0.307 37.274 2.765 17.101 3.277 38.195 10.138 51.098 16.589 10.445 5.325 23.142 12.595 27.853 16.077 30.822 22.835 51.712 46.899 66.458 76.288 11.981 23.962 19.968 52.224 21.504 76.493 0.205 3.379 0.512 77.414 0.512 164.659l0.102 158.413 192 0.102-110.797 110.285c-60.928 60.621-137.011 136.397-168.96 168.243-31.949 31.949-61.030 60.109-64.512 62.566-19.866 14.541-43.827 19.866-69.222 15.462zM537.088 369.050c48.742-8.294 90.112-38.81 111.923-82.33 10.854-21.709 15.565-40.858 16.077-65.024 0.41-17.715-0.819-28.672-5.018-44.544-12.698-47.514-49.254-87.142-96.358-104.243-30.925-11.162-68.71-11.469-100.966-0.717-52.122 17.306-91.648 63.181-101.888 117.862-2.15 11.571-2.662 37.99-0.922 49.050 6.144 39.424 24.576 72.090 54.784 97.178 22.016 18.33 52.634 31.13 81.408 34.202 9.933 1.024 30.72 0.307 40.96-1.434zM505.651 335.36c-21.709-3.891-36.762-15.872-43.52-34.304-2.867-7.885-3.994-19.149-3.686-36.864l0.307-17.51-8.090 0.102c-10.24 0.205-14.234-1.126-17.203-5.53-4.301-6.246-2.56-17.613 3.072-20.787 1.229-0.717 7.066-1.536 13.005-1.843l10.752-0.512v-15.872c0-13.619-0.41-16.896-2.355-23.040-2.97-9.318-7.68-15.667-16.589-22.118-7.987-5.837-11.264-10.752-11.264-16.998 0.102-5.53 3.379-12.186 7.373-14.643 3.277-1.946 5.018-2.048 70.554-2.048 73.011 0 72.602 0 76.288 5.632 4.301 6.554 2.56 16.384-3.482 20.173l-3.789 2.355h-97.587l2.56 4.096c8.909 14.438 12.186 28.262 12.083 52.019v10.957h18.432c12.595 0 19.251 0.41 20.89 1.331 8.499 4.301 9.626 18.944 1.843 24.474-2.97 2.15-4.198 2.253-22.528 2.355h-19.354l0.512 18.432c0.614 20.378 1.946 26.522 6.963 32.563 7.782 9.523 26.010 11.162 37.581 3.482 2.97-1.946 5.12-4.71 7.987-10.445 4.608-9.318 7.885-11.981 15.155-12.595 10.138-0.819 18.842 5.632 19.866 14.848 0.717 6.758-5.222 18.227-14.029 26.931-11.366 11.162-22.426 15.155-43.622 15.872-7.27 0.205-15.462 0-18.125-0.512z" />
+<glyph unicode="&#xeb43;" glyph-name="touch_screen" d="M151.654 830.464c-37.376-8.499-58.266-47.104-44.954-83.456 1.126-3.072 2.97-7.27 4.198-9.216s35.84-50.586 76.902-108.032c116.531-163.021 122.47-171.315 122.47-171.93 0-0.307-1.126-2.97-2.458-5.939-4.915-10.752-6.144-16.179-6.144-27.955 0-12.083 1.536-19.251 6.246-28.57 2.15-4.198 40.96-67.277 48.947-79.462 2.15-3.277 23.962-38.298 53.862-86.528 17.408-28.058 26.624-41.984 33.178-50.176 37.786-47.206 90.829-80.589 148.992-93.798 23.347-5.325 35.635-6.554 62.976-6.554 27.341 0.102 45.978 2.662 71.066 9.83 44.134 12.595 82.227 35.123 115.405 67.994 45.261 45.056 71.066 99.43 78.131 164.864 1.331 11.981 0.512 49.562-1.331 60.928-2.867 18.227-3.686 22.118-7.27 35.123-5.325 19.558-14.541 41.984-24.576 60.109-5.427 9.728-17.92 27.853-48.128 70.144-3.379 4.71-12.083 16.998-19.354 27.341-13.824 19.456-31.232 44.134-52.736 74.24-13.414 18.842-18.534 24.166-28.262 28.979-22.118 11.059-49.254 5.632-66.15-13.21-9.728-10.752-13.619-20.89-13.619-35.635-0.102-5.837-0.205-10.547-0.307-10.547 0 0-3.482 4.71-7.578 10.547-13.414 18.842-22.938 26.112-39.834 30.515-16.896 4.301-37.069 0.819-51.507-9.216-10.65-7.373-19.866-18.842-24.576-30.822-3.686-9.421-5.325-23.142-3.789-30.31 0.41-1.946 0.512-3.482 0.102-3.482s-2.56 2.56-4.71 5.632c-29.798 43.315-97.485 32.358-114.79-18.637-3.686-10.65-4.301-24.678-1.536-34.509 1.024-3.789 1.638-6.554 1.331-6.246s-12.698 17.51-27.443 38.195c-14.746 20.685-28.058 39.219-29.491 41.165-3.482 4.71-38.605 53.76-49.971 69.837-15.974 22.426-37.376 52.326-44.544 62.157-3.789 5.325-9.114 12.698-11.674 16.384-32.666 46.797-41.165 57.139-52.429 63.386-13.005 7.373-30.618 10.035-44.646 6.861z" />
+<glyph unicode="&#xeb44;" glyph-name="town" d="M222.72 868.557c-4.506-7.885-9.626-16.998-11.366-20.070-2.765-5.018-15.77-28.16-24.474-43.622-1.638-2.765-5.734-10.138-9.216-16.384-3.482-6.144-15.565-27.648-26.829-47.616s-21.709-38.605-23.347-41.472c-1.536-2.765-4.198-7.68-5.939-10.752s-3.686-6.554-4.506-7.68c-1.126-1.638-1.331-36.454-1.331-203.469v-201.523l18.739 14.95c10.24 8.192 19.558 15.667 20.685 16.691 1.126 0.922 6.144 4.915 11.162 8.806 4.915 3.994 14.438 11.571 21.094 16.896s17.306 13.824 23.757 18.944c6.349 5.018 11.776 9.421 12.083 9.728s3.482 2.867 7.066 5.632c3.584 2.867 9.318 7.475 12.8 10.24 3.379 2.867 10.342 8.397 15.258 12.288 15.565 12.288 17.51 13.926 19.661 15.667 1.126 0.922 5.325 4.301 9.216 7.373 10.035 7.885 10.65 8.397 14.234 11.264 6.758 5.53 6.144 5.427 10.547 1.843 2.253-1.843 5.837-4.813 8.090-6.554 2.15-1.843 11.366-9.216 20.378-16.384 9.011-7.27 17.613-14.131 19.046-15.258 1.536-1.126 7.885-6.144 14.234-11.264 13.005-10.445 39.424-31.642 55.296-44.339 5.939-4.71 12.39-9.933 14.336-11.469 1.946-1.638 7.782-6.246 13.005-10.445 5.12-4.096 14.541-11.571 20.787-16.691 6.349-5.018 12.698-10.138 14.234-11.264 1.434-1.126 6.758-5.325 11.674-9.523l9.011-7.475 4.301 3.379c2.355 1.843 10.035 7.987 17.101 13.619 6.963 5.632 13.926 11.162 15.462 12.288 2.56 1.946 17.92 14.131 56.218 44.954 5.325 4.301 10.445 8.397 11.264 9.114s4.813 3.789 8.704 6.861c3.994 3.072 7.373 5.837 7.68 6.144s4.915 3.994 10.24 8.192c11.571 9.114 13.21 10.445 14.746 11.776 0.614 0.614 4.813 3.994 9.318 7.578 4.506 3.482 9.114 7.168 10.24 8.090 2.458 2.048 37.376 29.901 38.912 31.027 1.126 0.819 2.97-0.512 25.395-18.637 4.506-3.584 9.626-7.68 11.469-9.114 3.072-2.355 20.992-16.691 30.106-24.064 2.15-1.638 5.632-4.506 7.885-6.349 2.15-1.741 8.806-7.066 14.643-11.776 5.734-4.608 11.776-9.421 13.312-10.547 1.434-1.126 7.27-5.734 12.8-10.24 5.632-4.506 11.571-9.318 13.312-10.752 23.654-18.739 38.4-30.515 40.038-31.949 1.126-0.922 4.506-3.686 7.578-6.144 3.072-2.355 7.987-6.349 11.059-8.806l5.427-4.301v172.032h-76.8v199.68c0 220.672 0.512 203.674-6.451 207.872-2.97 1.843-5.222 2.048-23.962 2.048h-20.787v25.6h-204.8v-25.6h-20.48c-22.835 0-25.088-0.512-28.672-6.451-2.048-3.174-2.048-6.349-2.048-151.962v-148.787h-179.2v64.307c0 52.122-0.307 64.614-1.331 66.253-0.819 1.126-3.174 5.325-5.325 9.216-2.15 3.994-6.758 12.288-10.24 18.432-8.704 15.258-10.65 18.739-13.619 24.064-1.434 2.56-7.68 13.619-13.824 24.576s-12.39 22.016-13.824 24.576c-1.434 2.56-5.53 9.933-9.216 16.384s-8.090 14.336-9.728 17.408c-1.741 3.072-4.198 7.373-5.53 9.421-1.331 2.15-2.355 3.994-2.355 4.301 0 0.205-4.096 7.68-9.216 16.589-5.018 8.806-9.216 16.282-9.216 16.384s-2.253 4.198-5.12 9.114c-2.765 4.915-5.12 9.216-5.12 9.728 0 3.482-2.662 0-9.728-12.595zM627.712 780.8v-25.6h-51.2v51.2h51.2v-25.6zM704.512 780.8v-25.6h-51.2v51.2h51.2v-25.6zM781.312 780.8v-25.6h-51.2v51.2h51.2v-25.6zM627.712 704v-25.6h-51.2v51.2h51.2v-25.6zM704.512 704v-25.6h-51.2v51.2h51.2v-25.6zM781.312 704v-25.6h-51.2v51.2h51.2v-25.6zM247.091 674.509c8.499-4.198 14.541-10.342 18.534-18.637 2.765-5.939 3.174-7.68 3.174-15.872s-0.307-9.933-3.174-15.872c-4.198-8.704-9.626-14.234-18.33-18.534-6.554-3.174-7.885-3.482-16.384-3.482-8.192 0-9.933 0.307-15.872 3.174-8.499 4.096-14.848 10.445-18.842 18.842-2.765 5.939-3.174 7.68-3.174 15.872s0.41 9.933 3.174 15.872c6.963 14.643 20.378 22.835 36.454 22.221 6.349-0.307 9.114-1.024 14.438-3.584zM627.712 627.2v-25.6h-51.2v51.2h51.2v-25.6zM704.512 627.2v-25.6h-51.2v51.2h51.2v-25.6zM781.312 627.2v-25.6h-51.2v51.2h51.2v-25.6zM627.712 550.4v-25.6h-51.2v51.2h51.2v-25.6zM704.512 550.4v-25.6h-51.2v51.2h51.2v-25.6zM781.312 550.4v-25.6h-51.2v51.2h51.2v-25.6zM295.322 386.97c-6.758-5.427-13.107-10.547-14.234-11.469s-6.451-5.222-11.776-9.523c-5.325-4.198-13.414-10.65-17.92-14.234s-14.848-11.878-23.040-18.432c-8.192-6.554-22.835-18.33-32.666-26.214-18.33-14.643-30.822-24.678-44.134-35.226-4.198-3.277-13.414-10.752-20.48-16.384-7.066-5.734-13.414-10.65-14.131-10.957-0.922-0.41-1.229-24.576-1.229-116.122v-115.61h230.4v153.6h76.8v-153.6h76.8l-0.205 115.405-0.307 115.302-10.342 8.294c-10.752 8.704-31.437 25.19-47.104 37.786-28.365 22.63-35.942 28.672-37.786 30.208-1.126 1.024-6.451 5.222-11.776 9.421s-9.933 7.885-10.24 8.192c-0.307 0.307-3.277 2.765-6.656 5.427-8.294 6.554-23.552 18.739-35.328 28.16-10.342 8.397-11.674 9.421-24.371 19.354l-8.090 6.349-12.186-9.728zM269.312 128v-38.4h-76.8v76.8h76.8v-38.4zM715.674 395.366c-0.922-0.614-3.482-2.662-5.632-4.403-7.578-6.042-36.045-28.774-77.722-62.157-23.040-18.432-42.906-34.304-44.032-35.226s-6.451-5.222-11.776-9.421c-5.325-4.198-10.547-8.397-11.469-9.216-1.024-0.819-10.24-8.192-20.685-16.384l-18.944-14.848v-115.405l-0.102-115.507h230.4v153.6h76.8v-153.6h76.8l-0.205 115.405-0.307 115.405-5.12 4.096c-2.867 2.355-7.066 5.632-9.216 7.373-2.253 1.843-11.674 9.318-20.992 16.794s-18.432 14.746-20.275 16.282c-1.946 1.434-10.24 8.090-18.432 14.746-8.294 6.554-18.637 14.848-23.040 18.432-4.506 3.482-11.162 8.909-14.95 11.981s-9.626 7.68-12.8 10.24c-3.277 2.56-8.806 6.963-12.288 9.728-3.482 2.867-8.192 6.554-10.445 8.294-22.221 17.818-38.195 30.618-39.834 32.051-3.379 2.867-3.994 3.072-5.734 1.741zM678.912 128v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xeb45;" glyph-name="townhall" d="M506.163 868.864c-6.656-3.994-6.451-2.355-6.451-64 0-31.744-0.41-55.808-0.922-55.808s-8.090-3.482-16.998-7.68c-8.806-4.198-16.179-7.68-16.384-7.68-0.102 0-6.451-2.97-13.926-6.554-12.186-5.734-68.301-32.256-90.726-42.701-9.83-4.608-21.402-10.035-35.123-16.589-5.325-2.458-13.824-6.554-18.944-8.909-5.018-2.355-13.107-6.144-17.92-8.397s-19.968-9.421-33.792-15.872c-13.824-6.554-29.184-13.722-34.304-16.179-5.018-2.355-24.883-11.674-44.032-20.787-19.149-9.011-39.834-18.739-46.080-21.709-6.144-2.97-14.029-6.656-17.408-8.192s-11.469-5.325-17.92-8.397c-6.451-3.072-13.312-6.246-15.155-7.066l-3.277-1.434v-77.312l21.709 0.102c11.981 0 23.552 0 25.702 0l3.789-0.102v-358.4h-25.6v-25.6h-25.6v-25.6h-25.6v-25.6h921.6v25.6h-25.6v25.6h-25.6v25.6h-25.6v358.4l3.379 0.102c1.741 0 13.312 0 25.6 0h22.221v77.21l-3.277 1.434c-1.843 0.819-12.595 5.837-23.859 11.162-44.749 21.094-52.838 24.883-61.44 28.877-3.379 1.536-11.674 5.427-18.432 8.704-6.758 3.174-19.149 9.114-27.648 13.005-25.293 11.878-31.232 14.643-41.984 19.763-5.632 2.662-14.131 6.656-18.944 8.909-7.885 3.789-48.947 23.040-69.12 32.563-4.506 2.15-12.8 6.042-18.432 8.704s-13.926 6.554-18.432 8.704c-4.506 2.15-12.083 5.734-16.896 7.987-20.89 9.83-29.594 13.926-36.352 17.101-3.891 1.843-16.179 7.578-27.136 12.8-10.957 5.12-24.474 11.469-29.901 14.029l-10.035 4.71v31.437h140.288v76.8h-139.878l-1.434 4.301c-2.765 7.987-11.264 11.264-18.125 6.963zM518.349 695.91c3.584-1.638 10.342-4.813 15.155-7.066s12.39-5.734 16.896-7.885c4.506-2.048 12.39-5.734 17.408-8.192 5.12-2.458 25.088-11.878 44.544-20.992 41.37-19.456 48.333-22.835 61.44-28.979 34.918-16.384 79.77-37.478 87.552-41.165 14.131-6.656 43.008-20.275 52.736-24.883 32.461-15.155 66.048-31.13 66.355-31.437 0.205-0.205-165.376-0.307-367.821-0.307-202.547 0-368.23 0.205-368.23 0.41 0 0.307 4.301 2.56 9.523 4.915 5.12 2.458 14.029 6.656 19.661 9.318s13.005 6.144 16.384 7.68c3.379 1.536 10.957 5.12 16.896 7.987 11.162 5.325 23.45 11.059 37.376 17.613 4.506 2.15 12.083 5.734 16.896 7.987s20.685 9.728 35.328 16.589c14.643 6.861 30.31 14.234 34.816 16.384s28.467 13.414 53.248 25.088c45.158 21.299 57.139 26.931 68.608 32.256 20.992 9.83 53.555 25.293 55.296 26.419 2.765 1.638 2.662 1.638 9.933-1.741zM229.171 473.702c0.922-0.102 1.229-36.659 1.229-179.302v-179.2h-51.2v358.298l6.451 0.307c5.018 0.205 37.478 0.102 43.52-0.102zM355.635 473.6h2.765v-358.4h-51.2v358.298l2.867 0.307c2.15 0.205 27.853 0.205 45.568-0.205zM713.523 473.702l3.277-0.102v-358.4h-51.2v358.298l4.915 0.307c3.891 0.205 25.907 0.205 43.008-0.102zM840.499 473.702l4.301-0.102v-358.4h-51.2v358.298l4.403 0.307c3.584 0.205 18.739 0.205 42.496-0.102zM527.155 369.766c14.95-3.072 27.341-9.626 37.99-20.070 12.288-12.083 19.456-25.395 22.528-41.984 0.614-3.482 1.024-41.267 1.126-99.021v-93.491h-153.702l0.307 97.075 0.307 96.973 2.867 8.192c9.421 26.829 28.57 44.749 54.989 51.507 9.626 2.458 23.962 2.867 33.587 0.819zM501.043 651.776c-9.011-2.15-15.053-5.018-21.197-10.138-23.142-19.354-25.498-52.634-5.222-74.445 10.035-10.854 22.528-16.077 37.888-16.077 18.739 0 34.714 9.421 44.339 26.214 3.277 5.734 6.349 17.613 6.349 24.576 0 32.256-31.13 57.242-62.157 49.869z" />
+<glyph unicode="&#xeb46;" glyph-name="track_your_delivery" d="M166.605 768c-18.637-5.12-33.69-20.89-37.478-39.219-1.536-7.475-1.638-488.038 0-499.61 3.174-24.166 15.053-47.821 32.666-65.638 40.346-40.55 103.834-45.261 150.118-11.162 23.245 17.101 41.574 47.411 45.056 74.65 0.41 2.97 0.819 6.144 1.024 6.963 0.102 0.819 0.307 3.072 0.307 4.915l0.102 3.277h102.4c96.87 0 102.4-0.102 102.4-1.741 0.41-20.48 9.933-47.206 22.733-64.307 18.022-23.962 44.544-40.038 74.035-45.056 10.24-1.843 32.256-1.331 41.984 0.819 49.766 11.059 86.63 52.634 91.238 102.912l0.717 7.373h102.093v100.659c0 83.456-0.307 101.478-1.536 106.086-4.403 16.896-16.384 30.003-32.973 36.25-5.734 2.15-7.782 2.253-49.869 2.765l-43.93 0.512-78.029 130.048c-84.992 141.722-82.432 137.933-95.949 144.589-13.926 6.861 2.253 6.451-220.467 6.349-163.635-0.102-202.65-0.307-206.643-1.434zM421.888 664.269c34.202-8.294 61.747-29.696 77.21-60.109 8.602-16.794 11.878-29.696 12.493-48.64 0.512-18.637-2.048-29.184-12.186-50.074-4.096-8.602-29.798-51.61-76.493-128.102-6.349-10.445-14.848-24.371-18.842-30.925l-7.27-12.083-4.096 6.656c-2.253 3.686-8.602 14.131-14.234 23.245-5.53 9.216-13.21 21.811-16.998 27.955-38.093 62.157-62.464 102.912-66.97 111.923-6.042 12.083-10.035 23.654-11.981 34.406-1.434 8.499-0.717 26.624 1.536 36.966 10.342 47.514 48.23 83.149 96.358 90.624 9.318 1.434 32.051 0.41 41.472-1.843zM387.277 589.312c-6.451-1.434-16.179-6.963-21.709-12.493-16.282-16.384-16.077-43.827 0.614-60.518 16.896-16.998 44.032-17.101 61.133-0.102 22.426 22.323 14.336 59.802-15.565 71.475-5.325 2.048-18.33 2.97-24.474 1.638z" />
+<glyph unicode="&#xeb47;" glyph-name="track_your_order" d="M661.504 799.539c-57.549-7.066-103.117-50.586-111.923-107.008-4.198-26.419-0.717-46.080 12.698-73.011 6.246-12.493 112.23-186.88 113.562-186.88 0.41 0 5.12 7.27 10.445 16.179 5.427 8.806 16.077 26.419 23.859 39.117s16.077 26.317 18.432 30.208c2.355 3.994 15.053 24.883 28.365 46.592 41.677 68.301 46.080 78.643 46.285 107.008 0.205 24.064-3.072 37.786-13.824 58.675-22.221 43.213-65.946 69.837-114.074 69.53-6.144-0.102-12.39-0.307-13.824-0.41zM685.261 717.21c9.011-1.946 16.179-5.939 22.835-12.595 18.432-18.842 18.432-45.978 0.102-64.614-20.787-20.992-54.272-17.613-70.758 7.27-12.083 18.125-9.523 41.677 6.144 57.344 11.059 11.162 26.419 15.77 41.677 12.595zM153.6 516.096v-140.902l35.84-35.84-35.942-35.942 0.41-73.318c0.307-66.662 0.512-74.035 2.15-79.565 7.885-26.624 27.341-46.080 54.682-54.477 5.53-1.741 24.883-1.843 332.8-2.048l326.861-0.307-0.307 250.061c-0.205 236.749-0.307 250.47-2.048 256.102-6.042 19.866-19.456 37.274-35.84 46.592-4.301 2.458-5.837 2.253-5.837-0.819 0-4.301-6.758-21.811-13.824-36.045-5.632-11.366-60.314-103.014-76.8-128.819-1.229-1.946-5.12-8.192-8.499-13.926l-6.246-10.342 2.048-5.53c3.789-9.933 4.71-18.33 3.072-28.058-3.994-23.040-22.733-40.141-46.080-42.086-29.594-2.458-55.398 21.299-55.398 50.995 0 5.837 2.458 17.101 4.71 21.504 1.434 2.765 1.126 3.482-9.933 21.504-6.246 10.342-13.107 21.504-15.258 24.883-4.71 7.68-38.4 62.874-49.766 81.408-17.818 29.389-27.136 51.405-30.618 71.987l-0.614 3.789h-369.562v-140.8zM316.006 498.381l16.691-16.794-17.818-17.818c-9.83-9.83-18.022-17.818-18.227-17.818-0.307 0-29.082 28.467-33.485 33.178l-2.458 2.765 17.818 17.818c14.848 14.848 18.022 17.613 19.354 16.589 0.819-0.717 9.011-8.704 18.125-17.92zM244.326 428.954l18.022-18.022-2.97-3.072c-8.192-8.704-32.461-32.563-32.973-32.563-0.922 0-34.816 34.099-35.123 35.328-0.205 0.717 33.382 35.738 34.816 36.25 0.102 0.102 8.294-7.987 18.227-17.92zM386.97 427.418c9.626-9.626 17.51-17.818 17.51-18.125 0-0.41-7.987-8.704-17.715-18.432l-17.818-17.715-36.147 36.352 17.715 17.715c9.626 9.728 17.92 17.715 18.33 17.715 0.307 0 8.499-7.885 18.125-17.51zM601.498 358.502l17.92-17.92-17.92-17.92c-9.83-9.933-18.022-18.022-18.227-18.022-0.512 0-34.918 34.816-35.226 35.635-0.205 0.819 34.304 36.045 35.328 36.045 0.205 0 8.397-7.987 18.125-17.818zM459.674 354.714c9.626-9.626 17.51-17.715 17.51-17.818 0-0.205-8.090-8.397-17.92-18.227l-17.92-17.92-16.179 16.179c-8.806 8.909-16.896 17.101-17.92 18.227-1.741 1.946-1.434 2.355 15.872 19.558 9.728 9.626 18.022 17.51 18.432 17.51 0.307 0 8.499-7.885 18.125-17.51zM529.203 285.901l17.818-17.818-18.125-18.125-18.125-18.022-17.818 17.818c-9.83 9.728-17.818 18.022-17.818 18.227 0 0.819 34.918 35.635 35.738 35.635 0.307 0 8.602-7.987 18.33-17.715z" />
+<glyph unicode="&#xeb48;" glyph-name="Trading" d="M115.405 753.664c-16.282-4.506-29.594-16.794-35.84-33.075l-2.253-5.837-0.307-263.68c-0.205-203.981 0-264.909 0.922-269.312 3.994-18.125 16.282-31.539 35.738-39.014 2.97-1.229 69.222-1.434 394.752-1.741 286.618-0.205 392.806 0 397.312 0.819 13.926 2.662 29.491 14.336 35.533 26.624 6.349 12.902 5.939-7.066 5.939 279.552 0 285.594 0.41 265.933-5.734 279.245-5.222 11.469-19.558 22.835-33.69 26.522-7.578 2.048-784.998 1.946-792.371-0.102zM896 448v-256h-768v512h768v-256zM666.624 677.888c0-0.307 16.998-17.613 37.888-38.502l37.888-37.786-179.302-179.2-102.298 102.298-153.088-153.088c-84.173-84.173-153.088-153.293-153.088-153.498 0-0.307 22.835-0.512 50.688-0.512h50.688l204.8 204.8 102.4-102.502 230.4 230.4 37.888-37.786c20.787-20.89 38.093-37.888 38.4-37.888s0.512 45.875 0.512 101.888v101.888h-101.888c-56.013 0-101.888-0.205-101.888-0.512zM793.6 365.773v-148.173h76.8v219.648l-76.8 76.8v-148.275zM729.293 449.741l-38.093-38.093v-194.048h76.8v135.168c0 74.342-0.102 135.168-0.307 135.168-0.102 0-17.408-17.203-38.4-38.195zM422.093 347.341l-38.093-38.093v-91.648h76.8v83.968c0 46.182-0.102 83.968-0.307 83.968-0.102 0-17.408-17.203-38.4-38.195zM626.893 347.341l-38.093-38.093v-91.648h76.8v83.968c0 46.182-0.102 83.968-0.307 83.968-0.102 0-17.408-17.203-38.4-38.195zM486.4 288.973v-71.373h76.8v66.048l-76.8 76.8v-71.475zM325.12 250.368l-32.768-32.768h66.048v32.768c0 18.022-0.102 32.768-0.307 32.768-0.102 0-14.95-14.746-32.973-32.768z" />
+<glyph unicode="&#xeb49;" glyph-name="trash" d="M422.605 881.664c-17.92-4.915-32.358-19.456-37.069-37.478-1.024-3.686-1.536-10.957-1.536-21.606v-16.179h-67.584c-73.933 0-76.083-0.102-90.214-6.042-21.197-8.909-37.888-27.853-44.544-50.79-1.434-5.12-1.843-11.776-2.15-38.605l-0.512-32.563h665.907l-0.102 30.003c-0.102 25.395-0.41 31.13-2.048 38.093-5.427 23.245-19.968 41.677-41.062 51.917-15.565 7.68-11.776 7.373-90.726 7.68l-70.963 0.41v16.077c0 10.65-0.512 17.92-1.536 21.606-4.813 18.227-19.251 32.666-37.478 37.478-7.885 2.15-170.906 2.048-178.381 0zM588.8 819.2v-12.8h-153.6v25.6h153.6v-12.8zM230.4 332.8v-320h563.2v640h-563.2v-320zM370.278 572.826c5.632-2.867 11.059-9.318 12.698-15.053 0.717-2.56 1.024-75.776 1.024-225.075 0-195.379-0.205-221.901-1.536-225.792-2.15-6.144-5.734-10.445-11.469-13.824-4.198-2.56-5.939-2.97-12.595-2.97-6.554 0-8.397 0.41-12.493 2.867-2.662 1.536-6.042 4.301-7.373 6.144-6.144 7.987-5.734-7.987-5.734 233.574 0 248.627-0.717 227.328 7.68 235.622 7.885 7.885 19.763 9.728 29.798 4.506zM520.704 574.259c6.451-2.15 13.005-8.704 15.155-15.155 1.638-4.608 1.741-22.938 1.741-226.406 0-241.562 0.41-225.587-5.734-233.574-1.331-1.843-4.71-4.608-7.373-6.144-3.994-2.355-5.939-2.867-12.493-2.867-8.806 0-12.288 1.434-18.432 7.782-7.782 8.090-7.168-11.981-6.963 237.056l0.307 223.334 3.072 4.915c6.758 10.854 18.637 15.155 30.72 11.059zM678.298 572.518c5.325-3.072 9.421-8.090 11.469-13.619 1.126-3.174 1.331-43.11 1.434-225.69 0-247.808 0.614-227.635-7.27-235.52-6.042-6.042-9.523-7.475-18.33-7.475-6.656-0.102-8.397 0.307-12.595 2.765-5.734 3.379-10.138 9.114-11.878 15.258-0.922 3.277-1.126 58.778-0.922 226.611l0.307 222.31 2.56 4.915c2.867 5.632 8.090 10.342 13.926 12.493 5.939 2.253 15.667 1.331 21.299-2.048z" />
+<glyph unicode="&#xeb4a;" glyph-name="tv_plus" d="M76.8 488.96v-266.24h153.6v-81.92h563.2v81.92h153.6v286.106l-5.222-7.578c-13.824-20.070-31.949-37.99-50.893-50.074l-5.325-3.379v-163.635h-747.52v409.6h501.453l2.867 4.403c13.824 20.89 30.208 37.786 50.688 51.814l7.578 5.222h-624.026v-266.24zM522.957 246.067c16.691-6.246 24.269-25.805 16.282-42.189-11.162-22.835-44.851-22.016-55.194 1.331-10.957 24.678 13.517 50.381 38.912 40.858zM777.728 754.381c-8.192-0.819-25.395-4.608-33.69-7.475-52.736-18.022-91.136-62.771-101.581-118.17-2.253-11.674-2.662-36.659-0.922-48.64 6.861-46.285 33.28-86.016 73.216-110.285 14.643-8.806 30.925-15.053 50.586-19.251 9.83-2.048 37.683-2.867 48.538-1.229 68.403 9.83 121.446 61.952 131.379 129.229 8.294 56.525-13.517 110.49-58.982 145.408-17.715 13.619-44.134 25.293-64.512 28.57-14.848 2.355-32.051 3.174-44.032 1.843zM814.080 663.040v-40.96h81.92v-40.96h-81.92v-81.92h-40.96v81.92h-81.92v40.96h81.92v81.92h40.96v-40.96z" />
+<glyph unicode="&#xeb4b;" glyph-name="TV_series" d="M102.4 547.942c0-184.832 0.307-260.096 1.126-263.987 4.403-21.197 22.733-37.786 44.339-40.346l5.734-0.717v512.307h614.4v2.56c0 9.626-5.837 23.347-13.517 31.846-6.246 6.758-10.752 9.83-20.173 13.517l-6.758 2.765-625.152 0.512v-258.458zM179.2 471.757c0-180.838 0.307-259.686 1.126-263.987 3.482-19.354 19.968-36.045 39.629-40.243 2.97-0.614 6.554-1.126 7.885-1.126h2.56v512h614.605l-0.717 6.451c-2.355 20.48-17.715 37.786-38.502 43.213-4.71 1.331-50.483 1.536-316.006 1.536h-310.579v-257.843zM256.307 391.987c0.102-143.565 0.614-262.246 1.024-263.987 1.843-6.861 7.373-16.282 13.107-22.426 6.656-7.168 16.691-12.8 26.317-14.848 3.891-0.819 91.136-1.126 315.085-1.126h309.76v258.56c0 184.73-0.307 259.994-1.126 263.885-3.891 18.432-18.637 33.997-36.966 38.81-7.168 1.843-16.589 1.946-317.44 1.946h-310.067l0.307-260.813zM358.4 576v-25.6h-51.2v51.2h51.2v-25.6zM460.8 576v-25.6h-51.2v51.2h51.2v-25.6zM563.2 576v-25.6h-51.2v51.2h51.2v-25.6zM665.6 576v-25.6h-51.2v51.2h51.2v-25.6zM768 576v-25.6h-51.2v51.2h51.2v-25.6zM870.4 576v-25.6h-51.2v51.2h51.2v-25.6zM563.2 371.2v-128h-256v256h256v-128zM870.4 371.2v-128h-256v256h256v-128zM358.4 166.4v-25.6h-51.2v51.2h51.2v-25.6zM460.8 166.4v-25.6h-51.2v51.2h51.2v-25.6zM563.2 166.4v-25.6h-51.2v51.2h51.2v-25.6zM665.6 166.4v-25.6h-51.2v51.2h51.2v-25.6zM768 166.4v-25.6h-51.2v51.2h51.2v-25.6zM870.4 166.4v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xeb4c;" glyph-name="Undo" d="M240.64 881.562c-15.667-3.379-28.365-10.342-39.834-22.016-10.65-10.854-18.022-25.6-20.48-40.96-0.717-4.403-1.126-84.275-1.126-242.586v-236.032l144.896 144.896 104.448-104.653c112.947-113.254 112.435-112.64 123.187-134.451 24.781-49.869 21.094-109.158-9.523-154.112-8.192-12.186-12.698-16.998-47.002-51.2-16.589-16.589-29.901-30.515-29.491-30.822 1.331-1.331 25.19-2.56 44.237-2.355 25.293 0.307 45.978 2.765 69.53 8.192 61.645 14.336 115.712 44.237 159.334 87.962 16.486 16.384 18.227 18.432 28.877 31.949 38.4 49.152 61.952 108.032 68.71 171.827 0.922 9.626 0.922 53.965-0.102 65.536-1.741 19.763-7.68 48.23-14.234 69.12-2.355 7.373-10.342 28.365-11.878 31.334-0.614 1.126-3.072 6.349-5.632 11.776-9.728 20.89-24.371 43.827-41.984 65.946-4.915 6.144-43.827 45.978-96.563 98.816l-88.474 88.576 144.896 144.896-237.568-0.102c-200.090 0-238.592-0.307-244.224-1.536z" />
+<glyph unicode="&#xeb4d;" glyph-name="unique" d="M510.259 880.435c-0.41-1.024-2.765-5.325-5.222-9.523-2.56-4.198-5.53-9.318-6.656-11.264s-7.27-12.8-13.824-24.064c-22.426-38.707-30.208-52.224-39.629-68.608-5.222-9.011-13.005-22.63-17.408-30.208s-13.722-23.757-20.685-35.84l-12.595-22.016-266.24-1.024 3.584-5.939c3.584-5.939 10.854-18.534 44.851-77.517 9.523-16.589 19.968-34.611 23.040-39.936s6.451-11.059 7.373-12.8c1.024-1.638 9.523-16.384 18.944-32.768 21.402-37.069 20.787-35.942 23.859-41.37 1.434-2.56 3.891-6.963 5.632-9.728 6.349-10.65 6.451-8.704-1.024-21.402-6.144-10.547-35.328-61.133-39.936-69.325-1.126-1.946-6.349-10.957-11.571-19.968s-11.981-20.48-14.848-25.6c-2.867-5.018-11.674-20.275-19.456-33.792s-14.95-25.907-15.872-27.648c-1.024-1.638-6.861-11.776-13.005-22.528l-11.264-19.456 265.523-0.512 23.962-41.574c13.21-22.835 25.19-43.418 26.522-45.773 1.843-3.379 35.021-60.723 46.49-80.589 1.126-1.946 2.56-4.506 3.174-5.632 5.53-10.035 17.613-30.208 18.125-30.208 0.41 0 1.434 1.229 2.253 2.867 1.434 2.662 6.963 12.39 18.33 31.949 3.072 5.325 15.36 26.522 27.136 47.104 11.878 20.582 32.461 56.32 45.773 79.36l24.166 41.984 266.035 1.024-9.216 15.872c-5.12 8.704-10.24 17.715-11.571 19.968-3.277 5.837-50.893 88.269-57.242 99.328-8.397 14.336-16.282 28.058-36.25 62.771l-18.432 32.051 6.963 11.981c12.902 22.221 48.845 84.685 51.2 88.781 1.229 2.253 5.632 9.83 9.728 16.896s15.462 26.624 25.19 43.52c9.728 16.896 22.63 39.219 28.672 49.664l10.957 18.944-265.626 0.512-9.318 16.179c-10.547 18.227-50.176 86.938-53.35 92.365-1.126 1.946-3.584 6.349-5.53 9.728-16.077 27.648-23.040 39.731-25.805 44.646-10.752 19.251-23.654 40.858-24.371 40.858-0.512 0-1.229-0.819-1.536-1.741zM513.434 692.736c0.41-3.584 1.126-9.83 1.638-13.824 1.638-12.39 2.97-23.347 3.686-28.672 0.307-2.765 0.717-6.246 0.922-7.68s0.922-6.656 1.536-11.776c1.126-9.318 1.536-12.698 2.56-20.992 0.307-2.56 0.819-6.349 1.024-8.397 0.307-2.15 0.717-5.632 1.024-7.68 0.41-3.584 1.126-8.909 3.686-29.491 0.512-4.506 1.229-9.83 1.434-11.776s0.717-5.837 1.024-8.704c0.307-2.765 0.717-5.837 1.024-6.656 0.205-0.819 0.614-4.71 1.024-8.499 0.307-3.789 0.819-7.782 1.024-8.704 0.102-0.922 0.614-4.506 0.922-7.885 0.819-6.554 1.638-12.083 1.946-12.39 0.205-0.205 70.861 29.389 85.709 35.84 1.946 0.819 22.733 9.523 46.080 19.354s47.923 20.173 54.579 23.040c6.554 2.765 11.981 5.018 11.981 4.813s-20.070-15.872-44.646-35.021c-24.576-19.046-61.747-47.923-82.637-64.205-20.992-16.282-39.834-30.822-41.984-32.358l-3.789-2.867 9.421-7.475c5.222-4.096 11.571-9.114 14.029-11.059 2.56-2.048 5.632-4.403 6.861-5.222 1.331-0.819 23.859-18.33 50.278-38.81 26.317-20.582 57.754-44.954 69.632-54.272 11.981-9.216 21.606-16.998 21.504-17.203-0.307-0.307-26.214 10.24-31.949 13.005-2.253 1.126-65.946 27.853-73.216 30.822-2.56 1.024-24.166 10.138-48.128 20.275-23.962 10.035-43.622 18.227-43.827 18.125-0.205-0.307-2.765-18.944-5.325-40.55-0.614-4.813-1.331-10.342-1.536-12.288-0.307-1.946-2.15-16.691-4.096-32.768s-3.789-30.925-4.096-32.973c-0.307-2.15-0.717-5.632-0.922-7.68-1.024-8.294-1.843-15.258-2.15-16.691-0.307-1.536-1.126-8.602-2.15-16.896-0.205-2.253-0.922-7.27-1.434-11.264-0.512-3.891-1.229-9.216-1.434-11.776-1.434-13.312-1.946-16.384-2.765-16.384-0.512 0-0.922 1.229-1.024 2.867 0 1.536-0.205 3.686-0.41 4.813s-0.819 6.246-1.434 11.264c-1.946 15.053-2.048 15.974-3.174 25.088-0.614 4.813-1.331 10.342-1.536 12.288s-0.922 7.475-1.536 12.288c-1.741 13.824-1.946 15.565-2.56 20.992-0.307 2.867-0.717 6.042-0.922 7.168s-0.717 4.813-1.024 8.192c-0.41 3.379-0.922 7.578-1.126 9.216-0.307 1.741-1.229 8.806-2.048 15.872-0.922 7.066-1.843 14.438-2.048 16.384s-0.717 5.939-1.024 8.704c-0.41 2.867-0.819 6.246-1.024 7.68s-0.717 5.325-1.126 8.704c-0.307 3.379-0.819 6.963-1.024 7.885-0.102 0.922-0.614 4.813-0.922 8.499-1.434 13.21 1.741 13.21-28.672 0.41-14.643-6.144-27.546-11.674-28.672-12.186s-18.125-7.68-37.888-15.974c-19.661-8.192-37.171-15.565-38.912-16.282-11.162-5.018-64.41-27.034-64.717-26.829-0.102 0.205 12.698 10.445 28.672 22.835 15.872 12.288 44.544 34.509 63.693 49.357s36.659 28.467 38.912 30.208c2.253 1.843 9.626 7.578 16.384 12.8 19.251 14.746 23.040 17.818 23.040 18.637 0 0.717-23.142 18.944-53.76 42.394-5.018 3.994-13.619 10.65-19.046 14.848-5.427 4.301-29.696 23.142-54.067 41.984-24.269 18.842-43.93 34.406-43.827 34.611 0.307 0.205 64.512-26.522 122.061-50.893 7.885-3.379 27.955-11.878 44.544-18.842l30.208-12.698 0.717 3.174c0.41 1.843 1.024 5.325 1.229 7.885 0.614 5.632 1.638 13.926 2.15 17.408 0.205 1.434 0.717 5.325 1.024 8.704s0.819 7.27 1.024 8.704c0.41 2.458 1.024 6.758 2.15 15.872 0.205 2.253 0.922 7.373 1.434 11.264 0.512 3.994 1.126 9.216 1.434 11.776 1.126 10.035 2.765 23.142 3.174 25.6 0.205 1.434 0.717 5.325 1.024 8.704s0.819 7.27 1.024 8.704c1.024 5.734 1.434 9.114 2.56 19.149 0.614 5.734 1.229 11.264 1.536 12.39 0.205 1.024 0.614 4.403 1.024 7.475 1.229 10.342 1.638 13.722 2.048 17.306 0.307 1.946 0.819 6.963 1.229 11.059 0.717 8.602 1.843 7.885 2.765-1.843z" />
+<glyph unicode="&#xeb4e;" glyph-name="unknown_file" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM534.528 582.758c37.581-2.253 70.246-16.282 94.208-40.448 21.197-21.504 31.539-46.182 31.539-75.264-0.102-18.842-3.686-32.768-12.493-47.718-10.138-17.306-18.227-25.907-59.494-63.078-18.637-16.794-24.986-23.142-30.208-30.106-6.758-9.216-8.602-13.414-12.186-28.467-4.71-19.251-5.939-22.938-9.523-28.262-10.445-15.974-39.014-17.51-53.35-3.072-7.68 7.68-10.138 15.462-10.035 32.256 0 23.654 8.294 47.718 22.118 64.512 8.704 10.445 29.696 30.72 50.586 48.64 7.987 6.861 21.402 20.89 25.088 26.317 8.294 12.288 11.162 24.781 8.909 38.093-4.813 27.546-29.286 45.67-61.645 45.67-36.25-0.102-54.374-15.155-69.939-57.958-7.885-21.811-13.414-29.901-24.064-35.021-5.12-2.56-6.861-2.867-15.974-2.867-8.294 0.102-11.162 0.512-15.155 2.355-5.53 2.458-14.234 10.24-17.715 15.667-8.602 13.619-6.656 35.635 5.12 60.621 20.787 43.725 67.789 73.933 121.446 78.131 4.813 0.307 8.806 0.717 8.909 0.819 0.307 0.205 13.824-0.205 23.859-0.819zM526.746 226.918c26.112-9.216 36.659-43.52 20.48-66.867-4.198-5.939-13.824-12.8-21.709-15.155-26.624-8.294-53.862 7.68-57.344 33.587-2.253 16.384 2.662 30.515 14.234 40.55 11.366 9.933 29.389 13.107 44.339 7.885zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xeb4f;" glyph-name="unlimited_calls" d="M507.597 848.691c-1.946-4.403-7.885-16.691-13.005-27.443-18.227-37.786-27.136-56.218-39.936-82.944-8.704-18.227-17.306-36.045-25.6-53.248-4.096-8.397-10.035-20.89-13.312-27.648s-8.602-18.022-12.083-25.088c-3.379-7.066-9.114-19.046-12.8-26.829-5.939-12.288-7.066-14.029-9.626-14.541-1.536-0.307-18.227-3.174-36.966-6.246-18.637-3.072-35.021-5.837-36.352-6.144-1.229-0.205-4.096-0.717-6.349-1.024s-23.45-3.789-47.104-7.782c-23.654-3.994-45.568-7.578-48.64-8.090s-30.72-5.018-61.44-10.24c-30.72-5.12-57.139-9.523-58.88-9.83-9.523-1.434-9.523-0.717 1.331-10.342 9.523-8.397 12.902-11.366 34.918-31.13 5.325-4.71 16.384-14.541 24.576-21.811 8.294-7.168 16.794-14.848 19.046-16.896s12.186-10.854 22.016-19.558c9.83-8.704 19.558-17.306 21.504-19.149 1.946-1.741 4.71-4.198 6.042-5.325 1.229-1.126 5.837-5.222 10.138-9.011 11.162-10.035 28.774-25.702 32.973-29.389 14.234-12.595 21.094-18.637 22.118-19.558 0.614-0.512 4.506-3.994 8.704-7.68s10.035-8.909 12.902-11.776l5.325-5.12-4.506-17.92c-7.578-30.208-23.45-93.798-33.178-133.12-5.12-20.582-10.035-39.936-10.854-43.008-1.434-5.325-6.144-24.166-18.432-74.24-3.072-12.39-6.246-24.781-7.066-27.648-0.819-2.765-1.741-6.451-2.048-7.987l-0.717-2.867 5.427 2.97c4.608 2.56 34.509 18.842 58.163 31.744 3.686 1.946 10.547 5.734 15.36 8.397s11.674 6.451 15.36 8.397c23.142 12.595 64.819 35.328 69.12 37.683 2.867 1.536 15.462 8.499 28.16 15.36s25.498 13.824 28.467 15.462c10.342 5.734 48.026 26.214 56.32 30.72l5.53 2.97 22.63-12.493c12.493-6.861 25.088-13.722 27.853-15.258 7.066-3.789 95.027-51.712 101.376-55.194 2.867-1.536 13.005-7.066 22.528-12.288 9.626-5.222 19.763-10.752 22.528-12.288 7.987-4.403 60.723-33.178 67.584-36.864 3.379-1.843 8.090-4.403 10.445-5.734 5.837-3.379 6.451-3.174 5.222 1.229-0.512 2.048-1.126 4.506-1.331 5.427-0.41 1.946-2.662 10.854-9.728 39.014-2.867 11.571-5.427 21.709-5.632 22.528-0.922 4.198-14.029 56.525-15.36 61.44s-8.294 32.563-9.216 36.864c-0.205 0.819-1.536 6.246-2.97 11.878-1.536 5.734-2.867 11.264-3.072 12.39-0.307 1.126-0.922 3.789-1.536 6.042-0.922 3.379-7.68 30.208-8.806 35.226-0.205 0.819-2.253 9.114-4.608 18.432s-4.403 17.613-4.608 18.432c-0.205 0.819-2.253 9.114-4.506 18.33-2.355 9.318-3.789 17.101-3.277 17.408 0.922 0.614 9.933 8.602 26.214 23.142 5.632 5.12 14.131 12.698 18.944 16.896s8.909 7.885 9.216 8.192c0.307 0.307 4.403 3.994 9.216 8.192s8.909 7.885 9.216 8.192c0.307 0.307 6.246 5.632 13.312 11.776 7.066 6.246 15.155 13.414 17.92 15.974 2.867 2.56 7.168 6.554 9.728 8.704s4.813 4.198 5.12 4.506c0.307 0.307 6.554 5.837 13.824 12.288 7.373 6.451 13.824 12.186 14.438 12.8 0.614 0.512 4.506 3.994 8.704 7.68 4.096 3.686 10.035 9.011 13.21 11.776 7.987 7.168 20.89 18.637 23.552 20.992 1.229 1.126 5.53 4.915 9.626 8.499 3.994 3.584 11.776 10.547 17.203 15.36 10.957 9.728 10.854 8.909 0.819 10.445-1.946 0.307-4.71 0.717-6.144 1.024s-3.891 0.717-5.632 0.922c-1.638 0.307-7.475 1.229-12.8 2.15s-10.854 1.843-12.288 2.048c-2.97 0.512-69.837 11.674-73.728 12.288-1.434 0.205-15.053 2.458-30.31 5.018-15.155 2.56-28.979 4.813-30.72 5.12-3.072 0.614-28.774 4.813-86.426 14.438-18.842 3.072-35.635 5.939-37.274 6.246-2.56 0.512-3.584 2.15-8.806 13.107-3.174 6.758-9.011 18.842-12.8 26.726-8.397 17.306-16.896 35.123-32.256 67.072-11.264 23.45-17.92 37.376-32.87 68.403-3.994 8.294-9.216 19.251-11.674 24.269-2.458 5.12-8.602 18.022-13.824 28.672-5.12 10.752-11.264 23.45-13.619 28.467-2.253 4.915-4.506 8.909-4.813 8.909-0.41 0-2.355-3.584-4.403-7.885zM458.035 569.446c1.843-0.819 5.018-3.174 7.168-5.12 6.349-6.042 30.106-36.25 32.973-41.882 4.813-9.83 3.277-13.926-11.674-29.286-10.035-10.342-10.752-11.674-10.445-17.715 0.512-10.035 15.36-30.515 40.653-55.706 27.136-27.136 48.435-41.165 58.368-38.707 1.638 0.41 7.987 5.53 14.541 11.776 18.842 18.022 20.48 17.818 49.869-5.734 16.794-13.517 21.094-17.51 23.962-22.118 4.608-7.475 2.048-12.39-16.179-30.72-17.715-17.818-19.661-18.842-35.43-18.739-13.005 0.102-22.118 2.253-39.424 9.114-61.030 24.576-130.253 94.106-154.522 155.341-8.602 21.606-10.342 42.496-4.71 54.374 2.15 4.608 29.901 32.666 34.304 34.816 4.403 2.048 6.349 2.15 10.547 0.307z" />
+<glyph unicode="&#xeb50;" glyph-name="unlocked" d="M496.64 908.493c-0.307-0.307-3.584-0.717-7.27-1.126-23.45-2.15-50.176-10.342-72.602-22.323-46.387-24.678-81.51-65.843-98.714-115.712-4.198-12.186-8.397-30.413-9.318-41.267-0.41-3.994-0.819-8.499-1.024-10.24-0.205-1.638-0.41-45.773-0.41-97.997l-0.102-95.027h-102.4l0.307-237.261c0.205-221.184 0.41-237.773 2.048-243.098 8.397-27.546 27.238-46.49 54.886-54.886 5.325-1.638 23.654-1.843 281.498-2.048l275.661-0.307-0.307 237.261c-0.205 224.461-0.307 237.67-2.048 243.302-7.27 23.859-24.269 42.906-45.773 51.507-14.541 5.734-7.578 5.53-205.107 5.53h-181.965l0.102 96.051 0.102 95.949 2.355 11.674c4.71 22.528 12.39 38.707 27.238 56.934 26.931 33.178 70.963 50.893 113.152 45.568 29.184-3.584 54.784-16.282 75.674-37.274 20.378-20.48 32.358-45.158 36.762-75.878 0.205-1.638 0.512-34.304 0.512-72.397l0.102-69.427h76.8l-0.102 71.475c-0.102 75.264-0.307 80.179-5.018 101.581-11.162 50.278-43.11 96.358-87.142 125.747-23.040 15.462-49.766 25.907-80.282 31.437-8.294 1.536-46.49 3.277-47.616 2.253zM526.541 395.264c38.707-7.987 64.614-41.779 61.85-80.896-1.638-23.347-13.926-44.749-33.178-57.651l-5.53-3.686 0.717-9.318c0.307-5.018 0.819-9.933 1.024-10.752s0.614-5.222 1.024-9.728c0.41-4.506 0.819-9.523 1.024-11.264 0.41-3.072 1.126-9.933 2.048-20.685 0.307-3.277 0.717-7.782 1.024-10.035 0.205-2.253 0.717-6.656 1.024-9.728s1.229-12.493 2.048-20.992c0.922-8.397 1.843-17.51 2.048-20.173 0.307-2.765 0.819-7.168 1.126-10.035l0.512-5.12h-102.605l0.614 5.427c0.512 5.12 1.126 10.445 2.048 20.173 0.205 2.56 0.922 9.011 1.434 14.336 0.614 5.325 1.331 12.493 1.638 15.872 0.819 9.421 1.638 18.125 2.048 20.992 0.205 1.434 0.717 6.246 1.126 10.752 0.307 4.506 0.819 8.909 0.922 9.728 0.205 0.819 0.614 5.222 1.024 9.728s0.819 9.216 1.024 10.547c0.205 1.229 0.717 6.349 1.024 11.264l0.717 9.011-5.632 3.686c-16.384 10.957-28.57 29.798-32.358 49.971-1.536 8.704-0.614 25.907 1.843 34.304 8.806 29.389 32.256 49.869 63.078 55.091 6.042 1.024 18.432 0.614 25.293-0.819z" />
+<glyph unicode="&#xeb51;" glyph-name="Unmissable" d="M505.856 845.107c-3.072-6.349-12.39-25.6-20.787-42.803s-17.51-35.84-20.173-41.472c-2.662-5.632-11.264-23.142-18.944-38.912-7.782-15.77-16.691-34.202-19.968-40.96s-10.957-22.63-17.101-35.328c-6.246-12.698-14.336-29.389-18.125-37.069-3.789-7.782-7.27-14.131-7.68-14.131-0.512 0-11.878-1.843-25.293-4.096-49.664-8.192-157.184-25.907-240.026-39.526-40.141-6.554-40.141-6.554-39.731-7.475 0.205-0.41 3.994-3.891 8.499-7.782s8.397-7.373 8.704-7.68c0.307-0.307 11.366-10.035 24.678-21.709 13.21-11.571 24.781-21.709 25.6-22.426 0.819-0.819 4.71-4.198 8.602-7.578 3.994-3.379 7.373-6.349 7.68-6.656s7.885-7.066 16.896-14.848c9.011-7.885 16.589-14.541 16.896-14.848s9.728-8.602 20.992-18.432c11.264-9.83 20.685-18.125 20.992-18.432s4.198-3.686 8.704-7.578c4.506-3.994 8.704-7.68 9.216-8.192 0.614-0.614 6.144-5.53 12.288-10.854 6.246-5.325 11.469-9.933 11.776-10.24s6.042-5.325 12.8-11.162c6.758-5.837 12.902-11.264 13.619-11.878 1.126-1.024 0.614-4.096-2.765-16.998-2.253-8.704-10.342-40.448-17.92-70.554-41.574-164.864-53.555-212.275-54.579-215.45-0.41-1.638 0.205-1.536 4.915 1.126 3.072 1.741 9.011 4.915 13.21 7.168 14.95 7.987 22.118 11.878 28.16 15.155 3.379 1.843 15.36 8.294 26.624 14.336s23.040 12.39 26.112 14.029c3.072 1.741 15.053 8.192 26.624 14.336 24.781 13.414 32.563 17.51 39.424 21.299 2.867 1.536 8.806 4.813 13.312 7.168s10.547 5.632 13.312 7.168c2.867 1.536 8.192 4.506 12.083 6.554 3.789 2.048 9.933 5.325 13.824 7.373 3.789 2.048 9.216 5.018 11.981 6.554 2.867 1.536 10.24 5.53 16.384 8.704 6.246 3.277 11.776 6.246 12.288 6.656 0.614 0.41 5.939 3.379 11.981 6.554l11.059 5.837 21.197-11.366c11.776-6.246 22.221-11.878 23.347-12.493 3.277-1.843 30.003-16.282 45.568-24.678 4.198-2.253 10.035-5.325 12.8-6.861 2.867-1.536 8.397-4.506 12.288-6.656 3.994-2.15 9.933-5.325 13.312-7.168s18.33-9.933 33.28-17.92c14.95-7.987 30.618-16.384 34.816-18.739 4.198-2.253 10.445-5.632 13.824-7.373 3.379-1.843 14.234-7.68 24.064-13.005s23.040-12.39 29.184-15.667c6.246-3.277 12.186-6.554 13.312-7.373 1.126-0.717 2.56-1.331 3.174-1.331 0.819 0-1.741 11.571-6.861 32.051-4.506 17.51-14.234 55.706-21.606 84.685s-13.722 54.374-14.131 56.32c-0.41 1.946-4.813 19.251-9.626 38.4-20.685 80.896-23.142 91.034-22.426 91.648 3.174 2.765 96.563 84.582 101.683 89.088 3.584 3.072 7.27 6.349 8.090 7.27 1.434 1.331 42.906 37.683 66.048 57.958 3.994 3.379 9.011 7.782 11.059 9.728 2.15 1.843 12.595 10.957 23.245 20.275s19.251 16.998 19.149 17.101c-0.102 0.205-47.309 7.987-125.030 20.787-24.166 3.994-60.826 10.035-81.408 13.414s-38.298 6.349-39.424 6.451c-1.126 0.205-3.994 0.717-6.451 1.126-4.71 0.717-5.632 0.922-16.077 2.458-3.891 0.614-9.421 1.638-12.288 2.15-5.939 1.126-24.064 4.096-25.293 4.096-0.512 0-3.584 5.632-6.861 12.595-3.277 6.861-10.957 22.63-16.998 35.021-22.426 45.875-31.642 64.922-39.936 81.92-4.608 9.626-12.083 24.986-16.691 34.304-20.070 41.472-35.533 73.216-41.472 85.197-3.482 7.27-6.656 13.107-6.963 13.107s-3.072-5.222-6.042-11.469zM527.872 623.718c14.029-6.861 22.528-20.275 22.426-35.43-0.102-4.915-1.434-29.286-1.946-34.304-0.205-2.253-0.717-8.909-1.024-14.848-0.819-15.872-1.434-26.214-2.048-34.304-0.205-3.891-0.717-12.186-1.024-18.432-0.307-6.144-0.819-13.824-1.024-16.896s-0.717-10.65-1.024-16.896c-0.41-6.144-0.819-14.029-1.024-17.408s-0.717-10.752-1.024-16.384c-0.307-5.632-0.819-13.005-1.024-16.384s-0.717-10.957-1.024-16.896c-0.819-12.8-1.843-17.203-4.608-20.275-8.602-9.216-31.539-9.83-41.37-1.126-4.506 3.891-5.427 6.963-6.246 21.402-0.307 6.451-0.819 14.336-1.024 17.408-0.307 3.072-0.717 10.24-1.024 15.872s-0.717 13.517-1.024 17.408c-0.922 13.926-1.536 23.654-2.048 33.792-0.307 5.632-0.717 13.517-1.024 17.408-0.614 8.192-1.229 19.046-2.048 33.792-0.307 5.632-0.819 13.517-1.126 17.408-0.205 3.994-0.717 10.138-0.922 13.824-2.355 40.55-2.253 37.376-1.229 43.52 2.458 14.131 15.155 27.341 29.389 30.31 6.758 1.536 18.227 0.205 24.064-2.56zM526.336 317.030c14.643-5.632 25.088-22.221 23.859-37.99-1.331-16.077-11.878-29.286-27.034-33.894-36.352-11.059-64.819 32.256-40.243 61.44 9.933 11.878 28.262 16.282 43.418 10.445z" />
+<glyph unicode="&#xeb52;" glyph-name="upload" d="M499.712 882.586c-14.848-1.946-35.942-10.342-47.002-18.739-6.349-4.71-13.414-11.469-60.518-57.549-18.33-17.818-36.454-35.533-40.448-39.322-3.891-3.789-22.118-21.504-40.346-39.322-18.33-17.818-35.635-34.611-38.502-37.478-2.97-2.765-20.173-19.661-38.4-37.376-18.125-17.715-36.147-35.226-39.936-38.912-3.891-3.686-21.402-20.787-39.014-37.888-17.51-17.203-35.942-35.123-40.755-39.731-4.813-4.71-15.36-15.053-23.347-22.835l-14.438-14.234h230.195l0.102-182.477c0-100.454 0.205-183.501 0.41-184.627s0.614-3.789 1.024-5.939c1.024-7.066 5.53-18.227 10.24-25.805 11.571-18.637 31.334-31.846 52.736-35.226 9.011-1.536 271.36-1.536 280.371-0.102 16.691 2.765 33.485 11.981 44.954 24.576 9.626 10.547 16.998 26.522 19.149 41.472 0.205 1.741 0.512 85.197 0.512 185.651l0.102 182.477h230.195l-16.896 16.691c-9.421 9.114-19.661 19.149-22.835 22.221s-20.275 19.763-37.99 36.966c-17.715 17.203-35.942 35.021-40.448 39.424-4.608 4.403-22.323 21.709-39.424 38.4s-34.918 33.997-39.424 38.4c-4.608 4.506-22.323 21.709-39.424 38.4s-34.611 33.69-38.81 37.786c-4.198 4.096-21.402 20.89-38.195 37.274-52.326 50.995-54.374 52.941-60.109 57.344-17.613 13.517-35.738 19.968-57.856 20.582-6.758 0.205-13.926 0.102-15.872-0.102z" />
+<glyph unicode="&#xeb53;" glyph-name="USB" d="M486.195 882.688c-0.102-0.102-4.71-0.614-10.035-0.922-5.325-0.41-10.65-0.922-11.776-1.126s-4.301-0.717-7.168-1.024c-6.758-0.717-10.957-1.434-26.624-3.994-1.126-0.102-3.174-0.614-4.608-0.922s-6.963-1.638-12.288-2.765c-18.944-4.198-51.098-14.234-64-19.968-1.638-0.819-6.042-2.662-9.728-4.096-18.227-7.475-47.718-23.45-67.686-36.762-16.486-10.957-19.354-13.005-33.382-24.474-62.976-50.893-109.875-117.043-137.216-193.229-7.68-21.606-15.77-52.736-18.739-72.499-2.56-16.282-2.97-19.558-3.584-26.317-0.41-3.891-0.922-8.499-1.229-10.24-0.922-5.837-1.126-57.446-0.307-67.584 1.024-11.776 3.072-30.822 3.686-33.792 0.307-1.126 1.434-7.373 2.56-13.824 9.626-55.194 32.154-111.206 64.307-160.256 3.686-5.632 7.066-10.65 7.578-11.264 0.41-0.512 3.994-5.427 7.987-10.752 24.371-32.563 53.043-61.235 85.402-85.709 25.805-19.354 41.574-29.184 70.246-43.52 38.502-19.149 88.474-34.816 128.41-40.141 2.253-0.307 7.373-1.024 11.264-1.536 19.558-2.662 67.789-3.686 87.552-1.843 47.821 4.403 88.166 14.029 129.536 30.822 21.197 8.704 48.23 22.426 65.024 33.178 16.691 10.65 35.43 23.962 44.134 31.334 2.048 1.741 5.939 5.018 8.704 7.27s8.192 7.066 12.186 10.752c68.608 63.898 113.664 143.667 131.891 233.472 3.277 15.77 5.632 30.822 6.451 40.96 0.307 4.198 0.819 8.806 1.126 10.24 0.922 4.608 1.126 57.549 0.205 67.584-1.126 13.926-2.97 29.389-3.994 35.328-0.512 2.867-1.434 8.090-2.048 11.776-8.397 47.514-28.467 101.274-53.35 142.541-6.042 9.933-16.794 26.726-18.637 28.979-0.41 0.614-4.198 5.632-8.499 11.264-55.706 74.547-136.294 130.253-225.69 156.16-25.805 7.475-52.941 12.8-75.776 14.95-3.686 0.307-7.987 0.819-9.728 1.126-3.379 0.512-61.542 1.331-62.157 0.819zM516.71 799.539c2.15-3.277 17.203-26.010 33.587-50.483 16.282-24.474 31.642-47.514 33.997-51.2 2.458-3.686 4.71-7.168 5.222-7.68 0.41-0.614 6.246-9.216 12.902-19.251l11.981-18.125h-81.92v-135.168c0-74.342 0.205-135.168 0.512-135.168 0.41 0 19.251 12.083 47.104 30.208 6.246 3.994 21.197 13.722 33.28 21.504 35.021 22.733 36.966 24.064 40.755 30.31 5.734 9.523 6.451 9.114-18.227 9.114h-21.504v128h128v-128l-21.709-0.205-21.811-0.307-0.819-5.632c-1.946-14.336-9.216-28.058-20.378-38.605-5.018-4.71-12.8-10.035-49.459-33.792-5.632-3.686-18.944-12.288-29.696-19.251-58.061-37.683-57.549-37.376-61.645-43.315l-3.891-5.53v-60.621l5.632-1.741c13.926-4.198 26.112-11.674 37.069-22.63 23.142-23.347 31.744-59.187 21.606-89.907-9.933-30.003-32.768-51.507-63.283-59.699-11.059-2.867-32.461-3.072-43.008-0.307-52.122 13.722-80.691 66.355-63.488 117.146 8.397 24.781 29.901 45.875 55.808 54.784 8.806 2.97 9.421 4.198 6.656 11.571-2.15 5.53-7.782 11.469-15.462 15.974-3.379 1.946-30.72 18.432-60.826 36.659s-56.115 33.792-57.651 34.714c-26.829 15.155-40.96 33.69-43.418 56.73-0.512 5.222-0.922 5.939-3.277 6.554-7.578 1.843-21.709 10.138-28.877 16.794-5.939 5.632-13.722 16.282-17.101 23.552-11.366 24.269-9.011 53.555 5.837 75.571 10.547 15.565 27.648 27.341 46.182 31.949 8.294 2.048 28.57 1.843 36.864-0.512 22.016-6.042 40.448-21.504 49.971-41.677 13.824-29.491 7.475-64.41-15.872-87.347-9.216-8.909-17.101-13.824-29.286-18.125-3.789-1.331-3.891-1.536-3.277-5.018 1.843-9.523 6.963-13.926 39.219-32.87 2.15-1.331 94.413-56.934 97.792-58.982 0.41-0.205 0.717 72.397 0.717 161.382v161.894h-81.92l18.739 28.058c10.24 15.36 33.075 49.766 50.79 76.288s32.461 48.23 32.973 48.23c0.41 0 2.458-2.662 4.608-5.837z" />
+<glyph unicode="&#xeb54;" glyph-name="usb_key" d="M201.626 639.078c-0.205-0.205-3.174-0.614-6.554-1.024-59.904-6.144-115.712-43.93-145.818-98.406-11.162-20.275-17.613-39.834-22.118-67.072-1.434-9.011-1.741-31.437-0.614-43.213 8.806-86.528 70.963-154.214 157.286-171.008l11.264-2.253 262.144-0.307c199.885-0.307 263.168-0.102 266.547 0.819 6.144 1.741 11.878 6.144 15.258 11.878l2.867 4.915 0.307 172.032c0.307 193.229 0.819 178.074-7.475 186.368-8.397 8.397 17.613 7.68-273.408 7.68-142.643 0-259.482-0.205-259.686-0.41zM231.424 536.064c37.786-6.042 68.608-36.659 74.65-74.24 1.024-6.349 0.819-25.395-0.307-30.72-7.27-34.406-30.515-59.802-63.795-69.734-16.077-4.813-38.707-4.096-54.374 1.638-45.67 16.896-69.837 65.638-55.296 111.616 9.83 31.027 37.069 54.989 69.427 61.030 8.499 1.536 21.197 1.741 29.696 0.41zM768 447.488v-140.8h230.4v281.6h-230.4v-140.8zM870.4 511.488v-25.6h-51.2v51.2h51.2v-25.6zM870.4 383.488v-25.6h-51.2v51.2h51.2v-25.6z" />
+<glyph unicode="&#xeb55;" glyph-name="Value" d="M64.922 848.691c1.434-23.040 5.427-55.501 9.318-75.571 4.608-23.552 8.602-39.629 15.36-61.952 26.829-88.166 75.162-170.291 138.65-235.725l9.626-9.933 7.782 6.861c4.301 3.789 7.987 7.168 8.294 7.475 2.048 2.253 29.491 23.757 39.936 31.232 27.955 20.173 51.61 34.509 82.432 50.074 37.376 18.842 71.066 32.051 110.080 43.008 16.486 4.608 42.394 10.65 54.784 12.8 13.005 2.253 12.902 2.15 2.355 6.554-75.571 31.846-133.837 95.437-159.027 173.67-6.042 18.842-11.776 46.899-12.083 59.187 0 0.922-31.539 1.229-154.010 1.229h-154.010l0.512-8.909zM653.312 690.688v-89.088l-9.421-0.102c-5.222-0.102-11.776-0.205-14.643-0.41-2.765-0.205-10.138-0.614-16.384-0.922-6.144-0.41-12.595-0.819-14.336-1.126-1.638-0.205-6.042-0.614-9.728-0.922-43.827-4.198-100.659-17.92-145.408-35.123-62.259-23.962-116.531-55.91-169.882-100.147-24.064-19.866-52.122-48.333-75.469-76.288-34.202-41.165-62.157-87.040-87.040-143.053-21.197-47.616-38.605-115.098-43.93-170.291-0.41-3.686-0.819-8.499-1.024-10.752-0.307-2.253-0.717-8.602-1.024-14.029l-0.614-10.035h307.917l0.205 3.789c0.307 5.53 3.072 21.811 5.53 32.563 27.341 122.573 135.27 212.992 261.734 219.238l13.517 0.717v-179.712l84.787 84.48c46.592 46.49 112.128 111.821 145.715 145.306 33.587 33.382 62.259 62.362 63.693 64.307 15.872 21.811 16.486 52.941 1.331 75.571-3.277 4.915-40.653 42.701-129.843 131.379-68.915 68.506-134.042 133.427-144.896 144.179-10.752 10.752-19.866 19.558-20.173 19.558s-0.614-40.038-0.614-89.088z" />
+<glyph unicode="&#xeb56;" glyph-name="vehicle" d="M243.405 753.664c-7.168-1.946-15.565-6.451-20.992-11.264-5.325-4.71-161.997-213.402-165.683-220.672-5.734-11.469-5.632-8.806-5.325-115.405 0.307-97.894 0.307-98.099 2.56-103.526 6.963-16.998 21.299-29.389 37.99-32.87 2.97-0.614 12.288-1.126 20.685-1.126h15.36l0.102-4.813c0-2.765 0.205-5.632 0.307-6.451 0.205-0.819 0.717-4.301 1.126-7.68 3.891-32.87 26.214-68.198 54.886-87.040 22.938-15.053 44.032-21.402 71.578-21.504 27.341 0 48.845 6.451 71.885 21.606 15.565 10.24 34.816 32.461 43.008 49.664 7.987 16.589 13.005 36.762 13.107 52.429v3.789h230.4l0.102-3.277c0.102-10.24 2.765-25.498 6.144-35.942 6.451-19.866 16.282-35.635 31.642-50.893 26.010-26.010 55.706-37.99 92.877-37.376 26.010 0.41 46.899 6.963 69.12 21.606 9.523 6.246 27.546 24.371 33.792 33.69 10.035 15.258 17.715 33.894 20.173 49.152 0.614 3.994 1.331 8.294 1.536 9.728 0.307 1.434 0.512 5.018 0.512 7.987l0.102 5.325h28.467c30.822 0 35.328 0.614 46.285 5.837 7.987 3.891 18.33 14.541 22.221 22.835 5.632 12.186 5.632 10.957 5.222 102.4l-0.307 84.48-2.458 6.144c-5.325 13.312-14.029 22.835-26.010 28.57-7.373 3.482-18.739 6.042-70.349 15.462-7.578 1.434-15.872 3.072-18.432 3.584-2.56 0.614-14.541 2.97-26.624 5.222s-22.221 4.506-22.528 5.018c-0.307 0.41-4.198 4.71-8.704 9.421s-14.848 15.667-23.040 24.371c-8.192 8.704-18.33 19.558-22.733 24.064-4.301 4.506-8.806 9.318-10.035 10.752s-5.734 6.246-10.035 10.752c-4.403 4.608-11.571 12.186-16.077 16.998-13.824 14.541-36.762 38.912-39.424 41.882-1.434 1.434-9.011 9.523-16.896 17.92s-17.818 18.944-22.016 23.45c-17.613 18.739-23.654 23.040-36.557 25.702-9.933 2.15-349.389 2.048-356.966 0zM396.288 625.152v-74.752h-121.856c-67.072 0-121.856 0.205-121.856 0.512 0 0.205 5.632 7.987 12.595 17.203 6.861 9.216 31.846 42.701 55.501 74.24l42.906 57.549h132.71v-74.752zM592.384 694.579c2.662-2.97 11.059-11.878 18.432-19.763 7.475-7.885 14.746-15.667 16.282-17.408 1.536-1.638 6.144-6.554 10.138-10.752 7.987-8.397 32.461-34.406 42.394-45.056 11.674-12.493 14.131-15.053 28.058-29.798 7.68-8.090 15.155-16.282 16.691-18.022l2.867-3.379h-254.157v149.504h114.278l5.018-5.325z" />
+<glyph unicode="&#xeb57;" glyph-name="video" d="M102.707 479.539c0.205-310.477 0.307-327.27 2.048-332.902 7.782-25.498 24.781-43.622 49.357-52.838 11.571-4.301-1.638-4.198 393.318-4.198h374.17l-0.102 324.403c-0.102 307.507-0.205 324.71-1.843 332.493-6.246 27.648-26.522 48.742-54.886 57.242l-7.168 2.15-755.2 0.512 0.307-326.861zM230.4 716.8v-38.4h-76.8v76.8h76.8v-38.4zM358.4 716.8v-38.4h-76.8v76.8h76.8v-38.4zM486.4 716.8v-38.4h-76.8v76.8h76.8v-38.4zM614.4 716.8v-38.4h-76.8v76.8h76.8v-38.4zM742.4 716.8v-38.4h-76.8v76.8h76.8v-38.4zM870.4 716.8v-38.4h-76.8v76.8h76.8v-38.4zM469.299 625.562c2.765-0.922 6.758-3.482 9.216-5.939 8.499-8.192 7.885 5.632 7.885-172.032-0.102-127.59-0.307-158.515-1.434-161.587-2.048-5.734-7.27-11.674-12.698-14.336l-4.813-2.355-145.92-0.307c-159.027-0.205-150.323-0.512-158.208 5.53-2.048 1.536-4.915 4.915-6.451 7.475l-2.765 4.71v322.56l2.765 4.608c3.174 5.427 7.373 9.011 13.414 11.469 3.994 1.638 15.462 1.741 149.299 1.741 130.15 0.102 145.408-0.102 149.709-1.536zM856.576 624.026c5.837-3.072 11.162-9.421 12.8-15.053 0.614-2.56 1.024-55.91 1.024-161.075 0-176.435 0.614-162.816-7.68-171.315-8.090-8.294 3.174-7.782-159.232-7.782-157.901 0-148.992-0.307-156.774 6.042-1.946 1.638-4.608 5.12-6.042 7.885l-2.56 5.018-0.307 158.72c-0.307 178.79-0.819 164.864 7.578 173.158 8.294 7.987-3.994 7.475 159.642 7.27l146.432-0.205 5.12-2.662zM230.4 179.2v-38.4h-76.8v76.8h76.8v-38.4zM358.4 179.2v-38.4h-76.8v76.8h76.8v-38.4zM486.4 179.2v-38.4h-76.8v76.8h76.8v-38.4zM614.4 179.2v-38.4h-76.8v76.8h76.8v-38.4zM742.4 179.2v-38.4h-76.8v76.8h76.8v-38.4zM870.4 179.2v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xeb58;" glyph-name="video_file" d="M179.2 470.323c0-450.15-0.41-417.075 5.734-429.773 3.686-7.475 14.541-18.33 22.016-22.016 12.698-6.144-10.957-5.734 327.373-5.734h310.477v614.4l-80.589 0.102c-44.442 0-82.739 0.307-85.299 0.614-14.95 1.843-32.154 8.397-45.466 17.203-14.234 9.421-28.672 26.931-35.942 43.418-3.482 7.885-7.168 21.094-8.090 29.286-0.205 2.253-0.512 40.346-0.512 84.787l-0.102 80.589h-409.6v-412.877zM698.982 497.664c5.939-1.741 11.571-6.349 14.95-12.288l2.355-4.096 0.307-170.189 0.205-170.291h-193.843c-217.907 0-199.782-0.717-208.179 7.782-8.192 8.090-7.578-5.632-7.578 182.886v167.731h193.331c167.936 0 194.048-0.205 198.451-1.536zM332.8 448v-25.6h51.2v51.2h-51.2v-25.6zM409.6 448v-25.6h51.2v51.2h-51.2v-25.6zM486.4 448v-25.6h51.2v51.2h-51.2v-25.6zM563.2 448v-25.6h51.2v51.2h-51.2v-25.6zM640 448v-25.6h51.2v51.2h-51.2v-25.6zM332.8 320v-76.8h166.4v153.088l-166.4 0.512v-76.8zM525.107 396.083c-0.205-0.512-0.41-34.918-0.307-76.595v-75.776l166.4-0.512v153.6h-82.842c-45.67 0-83.046-0.307-83.251-0.717zM332.8 192v-25.6h51.2v51.2h-51.2v-25.6zM409.6 192v-25.6h51.2v51.2h-51.2v-25.6zM486.4 192v-25.6h51.2v51.2h-51.2v-25.6zM563.2 192v-25.6h51.2v51.2h-51.2v-25.6zM640 192v-25.6h51.2v51.2h-51.2v-25.6zM640 802.611c0.102-51.507 0.512-81.51 1.126-84.787 3.994-18.739 18.842-34.714 35.942-38.4 3.891-0.819 28.467-1.024 86.323-0.819l80.896 0.307-101.683 101.683c-55.808 55.808-101.786 101.581-102.093 101.581s-0.512-35.84-0.512-79.565z" />
+<glyph unicode="&#xeb59;" glyph-name="video_phone" d="M295.219 881.766c-18.534-4.506-34.202-20.685-38.093-39.322-1.638-7.68-1.638-781.21 0-788.89 3.994-19.149 20.48-35.635 39.629-39.629 7.68-1.638 422.81-1.638 430.49 0 19.149 3.994 35.635 20.48 39.629 39.629 1.638 7.68 1.638 781.21 0 788.89-3.789 18.022-19.558 34.611-37.274 39.424-1.741 0.41-98.918 0.922-216.064 1.024-167.834 0.102-214.118-0.102-218.317-1.126zM556.749 855.552c3.686-2.253 6.451-6.758 6.451-10.752s-2.765-8.499-6.451-10.752c-3.072-1.946-5.427-2.048-44.544-2.048-45.568 0-45.466 0-49.357 6.451-3.686 6.042-1.843 13.312 4.403 17.101 3.072 1.946 5.427 2.048 44.749 2.048s41.677-0.102 44.749-2.048zM716.8 460.8v-345.6h-409.6v691.2h409.6v-345.6zM524.8 86.118c12.493-7.373 16.384-23.962 8.499-35.84-3.584-5.427-7.066-8.192-13.21-10.342-19.456-6.861-39.117 12.595-32.154 32.154 2.765 7.885 9.011 14.131 16.691 16.589 5.12 1.638 15.053 0.41 20.173-2.56zM498.176 704.41c-7.987-1.126-20.070-3.789-26.112-5.734-38.195-12.288-70.349-44.442-82.739-82.739-7.373-22.733-8.090-50.176-1.843-73.933 10.24-39.526 42.701-74.138 82.534-88.064 38.502-13.517 85.402-6.349 117.862 17.818 23.142 17.306 39.322 39.936 47.411 66.355 7.475 24.576 7.373 52.122-0.41 77.21-14.029 44.954-55.194 80.486-101.888 87.859-8.909 1.434-28.365 2.048-34.816 1.229zM383.283 446.669c-18.33-12.083-33.69-26.726-45.568-43.418l-4.813-6.963-0.102-127.693v-127.795h358.4v255.078l-3.277 4.813c-12.493 18.637-32.051 37.171-51.814 49.152-6.349 3.891-7.168 3.994-10.445 0.922-10.957-10.138-31.13-23.040-46.080-29.491-24.269-10.445-44.237-14.234-71.68-13.722-24.781 0.512-45.568 5.222-67.072 15.36-13.722 6.349-30.72 17.306-39.936 25.805-6.758 6.042-5.12 6.246-17.613-2.048z" />
+<glyph unicode="&#xeb5a;" glyph-name="video-meeting2" d="M141.312 830.362c-18.637-4.915-33.997-20.89-37.786-39.117-1.638-7.68-1.638-499.61 0-507.29 4.096-19.456 20.582-35.738 40.346-39.629 4.608-0.922 39.731-1.126 136.704-0.922l130.56 0.307 1.638 9.728c1.741 9.933 6.861 28.877 9.626 35.533 0.819 1.946 1.536 3.994 1.536 4.506s-58.266 0.922-135.168 0.922h-135.168v486.4h691.2v-403.046l8.499-7.578c15.258-13.824 30.515-32.256 39.014-47.104l3.174-5.632 0.307 232.96c0.205 165.069-0.102 234.906-0.819 239.514-3.379 19.661-19.866 36.659-39.731 40.96-3.994 0.819-99.533 1.126-356.864 1.024-304.845 0-352.154-0.205-357.069-1.536zM338.125 701.85c-54.272-11.264-89.498-62.362-80.589-117.146 5.427-33.485 29.184-63.898 60.211-77.005 22.938-9.728 50.79-10.957 72.909-3.277 20.275 7.066 37.786 19.866 50.483 36.762 6.246 8.499 13.312 23.347 16.282 34.611 3.482 13.21 3.994 36.352 0.922 48.333-5.018 19.866-13.619 35.43-27.238 49.254-23.962 24.371-59.699 35.328-92.979 28.467zM640 676.147c-48.742-8.499-90.214-39.219-111.923-83.251-5.222-10.445-10.138-23.962-11.878-32.256-2.048-9.728-2.15-10.547-3.174-19.456-8.602-74.445 40.755-146.227 113.664-164.864 28.365-7.373 60.314-6.246 87.654 2.867 45.158 15.155 81.613 51.507 96.666 96.256 6.042 18.125 8.192 32.87 7.782 53.453-0.614 24.064-5.427 43.418-16.077 64.717-21.402 42.701-60.416 72.397-107.827 81.92-15.155 3.072-39.322 3.379-54.886 0.614zM268.8 490.086c-19.354-7.578-34.202-17.306-48.742-31.744-19.251-19.251-32.768-43.52-37.683-67.686-0.614-3.072-1.434-6.758-1.741-8.192-0.41-1.434-0.922-16.077-1.126-32.461l-0.512-30.003h257.843l6.042 9.523c16.486 25.6 42.598 50.278 69.734 65.638l7.373 4.301-5.12 6.554c-13.107 16.691-25.088 38.912-31.027 57.139l-3.072 9.523-6.656 4.198c-8.090 5.12-18.842 10.547-27.443 13.824l-6.554 2.355-6.758-4.506c-45.466-30.003-104.448-30.003-149.811 0-3.789 2.458-6.963 4.506-7.168 4.403-0.205 0-3.686-1.331-7.578-2.867zM532.89 377.139c-26.726-13.619-51.917-36.25-68.608-61.747-15.258-23.347-25.088-51.2-28.058-79.565-1.434-13.312-1.331-122.675 0.102-130.458 3.482-18.842 18.637-34.714 38.298-39.936 6.861-1.843 371.917-2.15 380.621-0.307 19.763 4.096 36.25 21.094 39.731 40.858 1.229 7.373 0.922 130.458-0.307 135.168-0.41 1.434-1.229 5.53-1.843 9.216-3.891 24.576-16.589 53.35-33.075 75.264-15.462 20.48-38.502 39.834-60.723 50.995l-7.066 3.584-3.891-3.174c-41.984-35.123-98.714-50.483-154.214-41.574-18.944 2.97-44.954 11.981-59.699 20.582-2.662 1.536-5.12 2.867-5.325 2.867-0.922 0-18.637 12.288-24.166 16.794l-5.632 4.506-6.144-3.072z" />
+<glyph unicode="&#xeb5b;" glyph-name="Vinyl" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-72.192-5.53-144.179-30.618-205.824-71.578-84.48-56.218-147.661-141.722-176.026-238.285-6.656-22.528-12.493-49.971-14.438-68.096-0.41-3.379-0.922-7.27-1.126-8.704-2.97-18.534-2.56-74.65 0.717-100.352 15.872-125.338 83.046-235.008 188.314-307.302 48.23-33.178 109.568-57.958 168.141-67.994 29.696-5.12 42.496-6.144 75.571-6.144 26.419 0 33.28 0.41 56.218 3.174 61.133 7.373 125.133 30.72 179.2 65.434 16.486 10.65 41.267 29.491 55.398 42.291 71.578 64.922 117.965 147.149 136.602 241.869 1.331 7.066 2.765 14.848 3.072 17.408 0.614 5.018 1.536 12.083 2.15 16.896 2.048 14.029 2.765 62.362 1.229 81.408-1.229 16.794-4.506 39.629-7.885 55.296-27.546 130.355-112.435 240.538-231.219 300.032-41.779 20.89-90.829 36.352-131.891 41.472-2.765 0.41-5.734 0.819-6.554 1.024s-5.222 0.717-9.728 1.126c-4.506 0.307-9.318 0.819-10.752 1.126-2.97 0.512-61.030 1.331-61.542 0.922zM360.141 814.694c2.355-5.837 4.403-10.957 4.403-11.264 0-0.41-3.994-2.458-8.909-4.71-84.48-37.581-155.443-107.827-192.819-190.976-2.97-6.451-5.53-11.981-5.734-12.186-0.614-0.717-22.118 8.499-22.528 9.626-0.819 2.048 13.824 32.358 23.962 49.664 40.55 69.325 99.738 124.518 171.725 159.949 21.299 10.445 22.323 10.957 23.962 10.752 0.819-0.102 3.482-5.018 5.939-10.854zM379.597 767.488c2.458-5.837 4.403-10.957 4.403-11.469 0-0.41-1.946-1.638-4.301-2.56-9.011-3.482-33.485-16.589-45.466-24.166-53.76-34.099-97.792-84.173-123.904-140.8-2.97-6.451-5.632-11.878-5.939-12.186-0.614-0.614-21.914 7.782-22.63 8.909-1.229 1.946 12.902 30.72 23.757 48.64 29.901 49.050 72.090 91.238 120.934 120.73 16.589 10.035 45.67 24.474 47.821 23.859 0.512-0.205 2.97-5.12 5.325-10.957zM399.462 719.77l4.71-11.162-13.926-6.758c-59.597-28.774-108.544-78.746-134.758-137.523l-3.789-8.602-3.789 1.536c-2.048 0.819-5.018 2.15-6.758 2.867-1.638 0.717-5.222 2.253-7.885 3.482-2.765 1.126-4.915 2.355-4.915 2.765 0 1.638 14.643 30.515 20.070 39.322 25.19 41.779 59.187 76.493 100.454 102.605 11.059 7.066 43.213 23.552 44.851 23.040 0.512-0.205 3.174-5.427 5.734-11.571zM418.918 672.87l4.813-11.674-13.517-6.656c-45.466-22.426-81.613-58.368-104.141-103.731l-7.27-14.541-11.366 4.71c-6.349 2.56-11.674 4.813-11.878 4.915-0.205 0.205 2.867 6.861 6.861 14.95 24.986 50.995 66.97 92.672 118.477 117.76 6.758 3.277 12.493 5.939 12.8 5.939s2.662-5.325 5.222-11.674zM434.176 636.006c0-0.102 2.048-5.222 4.608-11.264l4.506-10.854-10.957-5.53c-35.43-17.818-63.59-46.080-80.998-81.203l-5.222-10.445-10.854 4.506c-6.042 2.56-11.162 4.608-11.264 4.608-2.355 0 7.066 19.354 16.384 33.69 15.462 23.859 37.376 45.568 61.542 61.133 13.107 8.397 32.256 17.613 32.256 15.36zM543.744 598.221c40.448-9.011 73.83-31.744 96.461-65.843 10.445-15.667 19.149-37.171 22.938-56.218 2.662-13.926 2.765-38.912 0.205-53.658-10.342-59.802-54.374-108.032-112.333-122.982-14.643-3.789-24.371-4.915-42.086-4.608-21.914 0.307-37.581 3.584-57.037 11.776-47.309 20.173-81.92 63.386-91.034 113.971-2.253 12.083-2.662 37.376-0.922 48.845 10.035 66.048 58.778 116.941 123.904 129.434 11.674 2.253 13.517 2.355 31.744 2.15 13.21-0.205 18.637-0.819 28.16-2.867zM699.699 370.278c1.638-0.614 1.229-1.946-4.403-13.21-16.384-32.768-40.653-60.211-70.861-80.077-13.926-9.216-34.611-19.354-34.611-16.998 0 0.102-2.048 5.222-4.608 11.162l-4.506 10.957 10.445 5.222c35.43 17.613 63.898 46.080 81.51 81.51l5.222 10.445 9.933-4.198c5.53-2.253 10.854-4.403 11.878-4.813zM747.725 349.901c0.41-0.41-2.458-7.168-6.246-15.053-21.504-43.725-54.784-79.974-96.973-105.779-9.421-5.837-34.099-18.227-34.611-17.408-0.102 0.205-2.355 5.53-5.018 11.878l-4.71 11.571 4.608 2.048c2.56 1.024 4.813 1.946 4.915 1.946 1.126 0 23.040 12.493 29.696 16.998 33.178 21.811 61.338 53.965 79.053 90.010l6.758 13.619 10.854-4.506c6.042-2.56 11.264-4.915 11.674-5.325zM794.829 330.445c1.024-1.024-7.578-19.763-14.643-32.154-26.419-46.592-61.338-83.046-106.394-111.309-14.029-8.909-42.906-23.142-44.032-21.914-0.512 0.41-2.97 5.734-5.427 11.674l-4.506 10.854 11.776 5.427c20.89 9.728 48.947 27.955 64.717 41.984 31.539 28.16 56.627 61.645 72.192 96.666l3.789 8.602 10.957-4.608c5.939-2.458 11.162-4.813 11.571-5.222zM832 315.494c8.806-3.686 10.24-4.608 10.035-6.554-0.307-2.662-10.547-24.064-17.306-36.045-7.27-13.107-19.149-30.925-28.365-43.008-8.397-10.854-11.059-14.029-21.197-24.986-30.413-32.87-66.355-59.597-105.472-78.541-8.192-3.891-15.667-7.578-16.589-8.192-2.97-1.536-3.789-1.126-5.837 3.482-2.97 6.554-7.27 17.306-7.27 18.227 0 0.512 2.458 1.843 5.427 3.174 8.602 3.584 31.232 15.462 40.858 21.402 43.418 26.829 80.691 63.898 108.442 107.93 6.451 10.342 19.558 35.226 22.733 43.315 0.922 2.355 2.253 4.301 2.97 4.198 0.717 0 5.939-1.946 11.571-4.403zM878.182 296.346c5.632-2.253 10.547-4.608 11.059-5.018 2.253-2.15-19.354-44.442-34.714-68.096-33.587-51.61-82.944-98.304-136.192-129.024-20.378-11.776-48.23-24.986-49.562-23.45-1.229 1.229-9.728 21.914-9.216 22.323 0.205 0.205 5.222 2.56 11.162 5.222 73.011 32.666 137.011 91.648 177.050 163.123 4.301 7.68 15.053 29.798 17.408 35.84 0.819 1.741 1.741 3.277 2.15 3.277s5.325-1.843 10.854-4.198zM491.418 579.584c-39.629-6.656-73.216-29.389-94.003-63.795-15.053-24.986-21.606-58.982-16.998-87.962 8.909-55.808 50.176-98.816 105.984-110.49 11.981-2.56 37.99-2.56 50.381-0.102 44.032 8.909 80.179 37.786 97.485 78.234 7.885 18.534 10.957 35.43 10.342 57.139-1.741 60.518-43.418 111.104-102.912 125.133-12.902 3.072-37.581 3.891-50.278 1.843zM524.8 470.118c18.637-10.957 15.872-39.219-4.506-46.182-17.51-5.939-35.533 8.294-33.587 26.624 0.717 6.554 2.662 10.65 7.782 15.77 7.68 7.68 20.787 9.318 30.31 3.789z" />
+<glyph unicode="&#xeb5c;" glyph-name="vip_contact" d="M76.8 495.411c0-335.36-0.307-316.416 5.12-330.854 2.662-6.963 4.506-10.445 9.318-17.101 10.24-14.029 21.402-22.323 38.502-28.467l9.011-3.277 156.16-0.614v50.176l-3.072 3.379c-1.741 1.843-4.608 6.349-6.451 10.035-2.97 5.939-3.277 7.475-3.277 15.872 0 8.192 0.41 9.933 3.174 15.872 3.994 8.397 10.24 14.643 18.842 18.842 5.939 2.867 7.68 3.174 15.872 3.174s9.933-0.41 15.872-3.174c10.342-4.915 16.896-12.288 20.48-22.938 4.198-12.186 1.638-24.986-7.168-36.352l-4.096-5.325v-49.459h332.8v26.112c0 14.336-0.41 26.112-0.922 26.112s-2.56 2.458-4.506 5.427c-7.885 11.469-8.909 25.702-2.867 37.99 4.198 8.602 9.523 13.926 18.125 18.125 6.451 3.174 7.782 3.482 16.282 3.482 8.090-0.102 10.035-0.512 15.872-3.277 24.166-11.469 29.798-39.936 11.878-60.109l-2.662-2.97v-50.893h218.112l-0.307 314.163c-0.205 298.086-0.307 314.368-2.048 320-8.909 29.184-30.822 49.562-59.699 55.501-6.554 1.331-55.603 1.536-407.962 1.536h-400.384v-310.989zM472.269 675.533c5.427-2.662 10.65-8.602 12.698-14.336 1.126-3.072 1.331-33.997 1.434-161.587 0-176.845 0.614-163.533-7.578-171.93-5.939-6.246-11.571-7.68-29.491-7.68h-14.131l-0.102 11.059c0 6.042-0.205 11.674-0.41 12.493-0.102 0.819-0.819 4.813-1.434 8.909-7.066 45.568-45.158 84.48-91.75 93.594-9.318 1.843-33.792 1.843-43.008 0-16.384-3.277-33.382-10.752-46.49-20.685-9.114-6.861-11.162-8.704-18.125-16.486-13.722-15.258-25.088-39.117-27.443-57.651-0.41-2.867-0.922-6.042-1.126-7.168s-0.41-6.963-0.41-13.005l-0.102-11.059h-14.643c-10.752 0-15.974 0.41-19.456 1.638-5.222 1.741-11.878 7.578-14.746 12.902-1.741 3.174-1.843 11.366-2.15 162.611-0.307 178.893-0.819 165.274 7.475 173.568 8.090 8.090-4.198 7.578 159.744 7.373l146.432-0.205 4.813-2.355zM856.064 675.942c4.301-2.355 9.626-7.68 11.776-11.981 4.608-8.806 2.458-21.197-5.018-28.877-8.192-8.499 2.458-7.885-146.125-7.885-143.565 0-135.885-0.307-143.872 5.734-11.776 9.011-12.698 27.341-1.843 37.888 8.294 7.987-2.56 7.475 147.354 7.27 129.331-0.205 134.246-0.307 137.728-2.15zM853.094 548.864c6.144-2.15 10.65-5.939 13.926-11.571 2.355-3.994 2.867-5.939 2.867-12.493 0-8.806-1.434-12.186-7.578-18.33-7.782-7.782 1.946-7.373-147.661-7.066l-133.734 0.307-5.018 3.072c-14.438 8.909-16.794 28.365-4.915 39.936 8.294 8.090-2.355 7.475 145.408 7.578 115.814 0.102 132.813-0.102 136.704-1.434zM750.694 420.864c20.787-7.373 23.245-35.123 4.096-46.387l-4.71-2.765-82.33-0.307c-90.419-0.307-87.757-0.41-95.437 5.837-5.734 4.71-8.602 11.469-8.602 19.968 0 6.042 0.512 8.090 2.765 11.981 3.072 5.325 8.192 9.523 13.926 11.674 3.072 1.126 18.739 1.434 84.787 1.434 70.042 0.102 81.613-0.102 85.504-1.434zM308.224 626.483c-32.051-5.837-54.682-26.624-63.488-58.163-0.614-2.253-1.331-8.499-1.741-13.824-2.253-36.045 21.811-69.018 57.242-78.438 7.68-2.048 24.781-2.765 32.563-1.331 26.317 4.915 48.947 23.552 58.266 47.923 10.957 28.877 3.789 61.235-18.125 82.739-10.24 9.933-23.962 17.203-37.581 20.070-6.963 1.434-21.914 1.946-27.136 1.024z" />
+<glyph unicode="&#xeb5d;" glyph-name="virtual_gamepad" d="M115.405 702.464c-18.637-5.12-33.69-20.89-37.478-39.219-0.819-3.891-1.126-65.638-1.126-216.064 0-178.893 0.205-211.456 1.536-216.166 4.915-18.739 20.787-34.099 39.219-37.888 3.891-0.819 115.302-1.126 395.264-1.126 327.885 0 390.656 0.205 395.162 1.434 18.227 4.813 32.87 19.149 37.376 36.352 1.638 6.246 1.741 21.709 1.741 218.214 0.102 206.746 0.102 211.661-1.946 218.419-5.222 18.33-20.48 32.666-38.707 36.454-8.704 1.843-784.486 1.434-791.040-0.41zM844.8 448v-204.8h-691.2v409.6h691.2v-204.8zM120.934 497.664c1.638-0.922 3.994-3.072 5.018-4.915 1.946-3.072 2.048-5.427 2.048-44.749s-0.102-41.677-2.048-44.749c-5.12-8.397-16.384-8.397-21.504 0-1.946 3.072-2.048 5.427-2.048 44.544 0 45.568 0 45.466 6.451 49.357 3.994 2.458 7.987 2.56 12.083 0.512zM903.373 472.166c18.534-5.53 24.166-28.774 10.342-42.189-11.981-11.674-30.822-9.114-39.731 5.222-2.662 4.301-3.072 5.939-3.072 12.186 0 8.704 2.97 15.565 8.909 20.173 7.168 5.734 14.95 7.27 23.552 4.608zM315.392 562.893c-14.336-1.946-26.419-11.674-31.334-25.395-2.355-6.246-2.458-8.090-2.458-28.877v-22.221h-19.149c-22.938 0.102-29.389-0.614-36.147-4.096-10.342-5.222-16.691-13.005-19.968-24.474-4.506-15.462 2.765-34.202 16.282-42.086 9.216-5.427 11.981-5.837 35.43-6.144 12.083-0.205 22.323-0.307 22.835-0.41 0.41 0 0.717-9.626 0.717-21.299 0-23.757 0.922-28.979 6.144-37.171 10.65-16.486 31.949-22.528 48.947-13.926 6.758 3.482 13.722 9.83 16.384 15.155 5.018 9.83 5.325 12.186 5.325 35.533v22.118h19.763c10.752-0.102 22.118 0.307 25.19 0.819 11.878 1.741 23.347 10.752 28.467 22.221 8.294 18.432-0.102 41.37-18.227 49.562-8.192 3.789-12.288 4.301-34.918 4.198h-20.275v21.504c0 24.064-0.819 29.184-6.144 37.376-7.987 12.39-22.835 19.558-36.864 17.613zM671.949 562.586c-21.094-3.789-35.328-24.474-31.027-45.158 1.536-7.578 3.174-11.059 8.090-17.101 19.968-24.678 60.416-14.336 66.867 17.101 5.325 25.805-17.92 49.766-43.93 45.158zM593.92 485.478c-17.203-3.584-29.696-18.227-30.31-35.635-1.126-30.106 29.594-49.459 56.218-35.328 22.938 12.083 26.931 44.339 7.68 61.747-8.909 7.987-21.914 11.571-33.587 9.216zM751.104 486.195c-16.282-2.765-27.648-12.186-32.256-26.829-3.482-11.162-2.048-22.118 4.301-32.051 16.282-25.702 55.296-22.323 67.379 5.734 7.066 16.486 0.717 37.376-14.131 46.797-7.373 4.608-18.637 7.475-25.293 6.349zM674.304 409.395c-14.746-2.56-25.907-10.854-31.13-23.142-1.126-2.662-2.355-7.782-2.765-11.366-3.584-34.509 37.376-55.194 63.693-32.154 19.866 17.408 15.258 50.586-8.602 62.669-6.246 3.174-15.667 4.915-21.197 3.994z" />
+<glyph unicode="&#xeb5e;" glyph-name="visual_voicemail" d="M259.584 650.752c-40.858-4.608-81.101-22.118-111.616-48.538-38.195-33.075-62.771-78.541-69.53-128.614-2.048-15.462-1.434-45.158 1.229-60.416 11.981-66.458 53.658-121.446 114.074-150.323 12.083-5.734 33.792-12.902 46.899-15.462 5.939-1.126 12.39-2.458 14.336-2.867s115.302-0.819 251.904-0.922c261.53-0.307 256-0.41 277.606 4.096 71.578 14.95 132.506 70.963 152.883 140.39 6.451 22.221 8.294 35.738 8.294 60.416-0.102 21.606-1.229 31.232-6.042 49.971-21.094 82.125-91.546 142.848-176.742 152.269-9.523 1.024-39.936 0.717-47.104-0.512-1.946-0.307-6.349-1.126-9.728-1.638-53.965-9.011-103.834-41.677-134.656-88.166-40.243-60.826-45.363-137.626-13.414-202.547 3.174-6.451 5.939-12.083 6.042-12.493 0.205-0.512-23.347-0.819-52.429-0.819s-52.838 0.205-52.838 0.307c0 0.205 2.56 5.427 5.632 11.571 28.979 57.856 28.57 126.771-1.024 184.32-23.962 46.49-66.765 83.456-116.224 100.147-10.24 3.482-29.082 7.885-38.912 9.216-8.397 1.126-40.346 1.536-48.64 0.614zM302.182 573.338c67.584-10.854 115.507-75.674 105.677-143.155-7.066-48.64-39.322-87.654-85.402-103.424-50.586-17.203-106.803-0.922-140.493 40.653-12.493 15.462-20.275 31.334-25.395 52.429-3.174 12.493-3.379 39.629-0.614 52.736 11.264 51.917 50.79 90.829 102.093 100.352 11.981 2.253 32.051 2.458 44.134 0.41zM763.392 573.44c23.654-4.915 41.37-13.005 58.88-27.034 23.757-19.046 40.858-48.64 45.773-79.462 1.536-9.728 0.922-36.147-1.126-45.056-12.186-53.35-52.224-91.546-104.96-100.352-15.36-2.56-36.454-1.741-51.302 2.048-22.63 5.837-41.779 16.691-58.982 33.792-24.678 24.371-37.274 54.067-37.683 88.883-0.819 64.307 46.387 118.579 111.514 128.102 4.198 0.614 34.099-0.102 37.888-0.922z" />
+<glyph unicode="&#xeb5f;" glyph-name="vod_portrait" d="M153.907 479.539c0.205-355.226 0.307-378.47 2.048-383.898 5.12-16.794 14.438-30.72 27.341-41.062 5.734-4.608 19.046-11.366 27.136-13.824 5.837-1.741 21.299-1.843 333.107-2.048l326.861-0.307v374.989c0 336.384-0.205 375.91-1.638 382.771-5.939 28.16-26.624 50.278-55.296 59.085-5.734 1.741-20.992 1.843-333.005 2.048l-326.861 0.307 0.307-378.061zM281.6 768v-38.4h-76.8v76.8h76.8v-38.4zM819.2 768v-38.4h-76.8v76.8h76.8v-38.4zM281.6 640v-38.4h-76.8v76.8h76.8v-38.4zM819.2 640v-38.4h-76.8v76.8h76.8v-38.4zM508.928 529.92c22.835-14.234 51.2-31.949 62.976-39.322 11.878-7.475 31.744-19.968 44.339-27.75 12.493-7.885 22.733-14.541 22.733-14.95 0-0.614-8.909-6.451-16.179-10.65-1.024-0.512-17.408-10.854-36.557-22.835-19.149-12.083-35.533-22.323-36.352-22.835s-13.312-8.294-27.648-17.203c-14.336-9.011-32.563-20.378-40.448-25.293-7.885-4.813-20.582-12.8-28.16-17.613-7.578-4.71-14.848-9.318-16.077-10.035l-2.355-1.434v255.898l16.179-10.035c8.806-5.53 34.714-21.709 57.549-35.942zM281.6 512v-38.4h-76.8v76.8h76.8v-38.4zM819.2 512v-38.4h-76.8v76.8h76.8v-38.4zM281.6 384v-38.4h-76.8v76.8h76.8v-38.4zM819.2 384v-38.4h-76.8v76.8h76.8v-38.4zM281.6 256v-38.4h-76.8v76.8h76.8v-38.4zM819.2 256v-38.4h-76.8v76.8h76.8v-38.4zM281.6 128v-38.4h-76.8v76.8h76.8v-38.4zM819.2 128v-38.4h-76.8v76.8h76.8v-38.4z" />
+<glyph unicode="&#xeb60;" glyph-name="volte" d="M486.298 882.79c-0.205-0.205-4.506-0.717-9.626-1.024-112.128-8.499-219.443-62.874-293.99-149.197-57.856-67.072-94.618-151.45-103.322-237.466-0.41-3.686-0.922-8.294-1.126-10.24-0.307-1.946-0.717-15.565-0.922-30.208-0.512-27.648 1.024-52.941 4.198-71.168 6.349-36.454 11.264-56.115 20.582-81.92 33.587-93.286 98.099-172.749 182.067-224.358 57.856-35.635 125.952-57.856 193.024-63.078 13.619-1.024 58.163-1.024 69.632 0 38.093 3.482 71.578 10.445 103.936 21.402 134.349 45.363 239.104 154.112 278.426 288.973 7.578 25.805 13.312 54.374 15.462 76.39 0.307 3.686 1.024 10.854 1.434 15.872 0.512 5.12 0.922 91.034 0.922 190.976 0.102 195.072 0.307 188.416-5.018 204.8-9.83 30.515-34.406 55.194-65.434 65.434-16.179 5.325-8.192 5.12-205.926 5.12-101.171 0-184.115-0.102-184.32-0.307zM601.088 779.981c3.072-0.614 7.987-1.434 10.752-1.741 2.867-0.307 10.24-1.741 16.384-3.174 69.222-15.462 129.741-56.73 169.37-115.61 10.138-15.053 16.282-26.214 23.552-42.701 11.878-27.136 19.149-54.682 22.323-84.992 1.024-9.216 1.024-44.032 0.102-53.043-6.758-64.614-32.768-120.934-77.107-166.707-6.144-6.451-12.595-12.595-14.336-13.824l-3.072-2.048 3.174 3.482c8.909 9.728 22.835 30.72 32.358 49.050 24.678 47.206 35.43 105.882 28.979 158.208-1.331 11.059-1.946 14.746-4.71 27.648-16.998 79.462-67.994 146.637-141.414 186.163-26.522 14.234-68.506 27.238-97.075 29.901-4.198 0.41-8.602 0.922-9.728 1.126-3.482 0.717-36.352 0.614-44.544-0.102-54.067-4.813-107.725-25.6-147.558-57.446-3.891-3.072-7.066-5.325-7.066-4.915 0 1.229 13.619 14.746 23.552 23.347 11.366 9.83 20.582 16.998 29.184 22.528 3.379 2.253 7.987 5.222 10.24 6.758 6.656 4.301 27.853 14.848 40.038 19.763 23.757 9.728 51.712 16.589 76.186 18.739 4.198 0.307 7.885 0.819 8.090 1.024 0.922 0.819 47.002-0.512 52.326-1.434zM591.36 697.344c57.958-7.578 108.032-39.117 139.674-87.962 13.312-20.582 23.859-47.514 27.853-71.27 2.56-15.053 3.277-40.243 1.638-55.194-3.891-35.226-18.739-71.066-41.472-99.43-5.632-7.066-22.221-24.064-26.317-26.931l-3.072-2.15 2.15 2.56c5.12 5.837 14.336 20.787 20.378 33.178 7.782 15.872 12.8 30.618 16.486 48.333 2.355 11.366 2.765 15.77 2.867 33.587 0 11.264-0.307 23.45-0.717 27.136-10.854 88.474-80.384 157.696-169.677 168.858-11.571 1.434-38.093 1.126-49.152-0.512-33.178-5.018-65.638-18.33-89.6-36.659l-4.096-3.174 2.253 3.072c3.584 5.12 21.709 22.118 31.027 29.082 28.16 20.992 62.157 34.406 95.232 37.581 3.686 0.41 6.758 0.819 6.963 0.922 0.614 0.512 32.358-0.307 37.581-1.024zM297.472 624.538c8.602-4.506 20.275-16.486 40.448-41.882 6.349-7.885 12.288-15.258 13.21-16.384 1.536-1.843 10.035-13.21 15.974-21.504 6.042-8.192 10.752-20.89 10.035-26.624-1.331-10.342-6.349-17.408-28.262-39.629-11.981-12.083-17.306-18.227-18.125-20.89-1.434-4.301-0.819-14.746 1.126-19.456 0.614-1.638 1.843-4.608 2.662-6.554 5.632-13.824 21.811-36.864 41.062-58.368 14.029-15.667 42.701-44.544 58.061-58.47 3.379-3.072 6.349-5.734 6.656-6.042 1.638-1.843 19.046-15.872 25.6-20.685 19.968-14.643 34.816-21.504 47.104-21.709 9.523-0.102 9.523-0.102 28.979 19.251 23.245 23.245 29.594 27.546 40.653 27.648 5.734 0 7.782-0.512 14.438-3.789 7.782-3.891 24.986-16.282 44.954-32.461 5.939-4.813 11.571-9.421 12.698-10.24 23.142-18.227 34.714-31.027 36.045-39.424 0.819-5.939-1.434-12.493-6.861-19.866-2.355-3.174-16.077-17.408-30.413-31.642-21.606-21.299-27.341-26.419-32.563-28.979-9.011-4.403-18.739-5.939-35.226-5.427-53.555 1.536-128.205 37.683-197.632 95.539-6.451 5.325-12.288 10.24-12.902 10.854-32.666 30.003-57.958 56.115-77.21 79.872-3.584 4.506-6.861 8.397-7.168 8.704-1.434 1.229-21.709 29.082-28.262 38.912-16.384 24.371-31.027 51.814-40.96 76.39-6.656 16.794-12.902 37.786-14.336 48.947-0.41 2.253-0.922 6.144-1.434 8.499-1.331 7.68-1.126 23.142 0.512 32.563 2.97 17.101 5.12 20.275 34.611 49.971 24.166 24.269 32.666 31.539 40.141 34.304 4.198 1.638 11.776 0.922 16.384-1.434zM586.957 613.888c35.328-6.246 65.126-28.877 80.896-61.44 19.763-40.96 11.571-91.546-20.378-124.416-5.837-6.042-14.848-13.824-15.974-13.824-0.307 0 1.434 3.584 3.891 7.987 14.643 25.702 17.613 59.085 7.987 88.781-2.765 8.602-10.24 22.733-16.179 30.618-29.184 38.912-79.872 54.272-125.44 38.298-7.987-2.867-19.866-8.602-23.45-11.469-2.765-2.15 0.307 2.253 6.554 9.421 21.504 24.576 53.146 38.4 85.709 37.478 5.427-0.205 12.8-0.819 16.384-1.434z" />
+<glyph unicode="&#xeb61;" glyph-name="volume_high" d="M537.6 809.37c-13.21-11.878-27.238-24.371-31.232-27.853-3.891-3.482-11.981-10.65-17.92-15.974-13.619-12.186-14.336-12.8-35.84-31.846-9.83-8.704-18.125-16.077-18.432-16.384s-6.963-6.246-14.848-13.21c-7.885-7.066-17.818-15.77-22.016-19.558-6.349-5.734-46.899-41.677-60.723-53.965l-3.789-3.379h-117.043c-79.667 0-118.989-0.307-123.187-1.126-19.661-3.584-36.557-20.48-40.346-40.346-0.819-4.506-1.024-43.418-0.819-141.824l0.307-135.68 2.253-5.427c6.963-16.998 21.299-29.389 37.99-32.87 3.789-0.819 41.165-1.126 123.29-1.126h117.76l8.909-7.987c4.813-4.301 9.011-8.090 9.318-8.397s8.806-7.885 18.944-16.896c23.142-20.48 21.504-19.046 40.55-35.942 8.704-7.885 29.901-26.624 47.104-41.882 17.101-15.155 32.768-29.082 34.714-30.822 1.946-1.843 18.637-16.691 37.171-33.075l33.485-29.901v383.59c0 210.944-0.307 383.488-0.717 383.386-0.512 0-11.674-9.728-24.883-21.504zM848.794 752.435c-2.458-2.15-4.71-4.096-5.018-4.506-0.307-0.307-9.933-8.806-21.504-18.842s-22.118-19.251-23.45-20.582l-2.458-2.355 5.53-6.451c33.28-38.298 58.47-82.534 74.547-130.458 7.373-22.118 14.336-52.429 15.974-69.53 0.41-3.891 0.922-7.373 1.024-7.68 1.843-3.174 2.765-57.754 1.229-75.469-2.56-31.027-8.294-59.597-17.613-87.859-15.974-48.128-39.629-90.419-72.192-129.024l-8.499-9.933 2.458-2.253c3.482-3.174 51.302-44.851 53.453-46.592 2.048-1.638 2.253-1.331 12.083 10.138 40.243 47.104 73.933 110.182 90.419 169.267 7.885 28.467 11.674 47.514 15.36 78.336 2.15 17.613 2.867 62.874 1.434 83.661-3.686 50.79-16.179 101.376-36.966 149.709-4.403 10.24-16.486 34.304-21.709 43.315-2.15 3.686-4.403 7.578-5.018 8.704-9.421 16.282-29.594 44.646-43.11 60.416-2.97 3.379-6.349 7.373-7.68 9.011-1.331 1.536-2.662 2.765-3.072 2.765s-2.662-1.741-5.222-3.789zM754.176 669.491c-1.741-1.434-6.246-5.53-10.24-9.011-3.891-3.482-15.258-13.312-25.088-21.914s-18.022-15.974-18.227-16.384c-0.102-0.41 2.56-3.891 5.939-7.885 33.075-38.093 55.398-90.214 60.211-140.698 0.922-9.728 0.922-41.267 0-50.688-5.12-52.838-25.805-100.454-62.669-144.384-3.379-3.994-3.789-4.915-2.56-6.042 0.819-0.717 12.698-11.162 26.522-23.142s26.112-22.733 27.341-23.757c2.15-2.048 2.15-2.048 6.246 2.458 26.726 29.184 51.098 71.168 65.434 112.742 30.31 88.166 20.89 189.85-25.088 270.541-10.445 18.33-26.829 41.472-39.731 56.013-4.403 4.915-4.71 5.018-8.090 2.15zM640 569.754c-11.571-10.138-23.962-21.094-27.546-24.269s-6.861-5.939-7.373-6.144c-1.843-0.717-0.819-2.867 3.789-7.885 6.144-6.656 12.902-16.998 17.818-26.931 22.426-45.261 15.462-101.786-16.998-139.162-5.12-5.837-6.656-8.499-4.71-8.499 0.41 0 2.867-2.048 5.427-4.403s7.885-7.066 11.776-10.445c16.179-14.131 33.894-29.696 36.352-31.949l2.765-2.56 6.861 8.090c23.552 27.443 39.834 62.874 46.182 100.454 2.253 13.21 2.662 42.394 0.922 57.037-1.946 14.95-7.066 36.762-10.752 45.056-0.512 1.126-2.15 5.018-3.686 8.704-7.373 18.022-20.173 39.014-32.666 53.555-3.686 4.301-6.861 7.885-6.963 7.782-0.102 0-9.626-8.294-21.197-18.432z" />
+<glyph unicode="&#xeb62;" glyph-name="volume_low" d="M537.6 809.37c-13.21-11.878-27.238-24.371-31.232-27.853-3.891-3.482-11.981-10.65-17.92-15.974-13.619-12.186-14.336-12.8-35.84-31.846-9.83-8.704-18.125-16.077-18.432-16.384s-6.963-6.246-14.848-13.21c-7.885-7.066-17.818-15.77-22.016-19.558-6.349-5.734-46.899-41.677-60.723-53.965l-3.789-3.379h-117.043c-79.667 0-118.989-0.307-123.187-1.126-19.661-3.584-36.557-20.48-40.346-40.346-0.819-4.506-1.024-43.418-0.819-141.824l0.307-135.68 2.253-5.427c6.963-16.998 21.299-29.389 37.99-32.87 3.789-0.819 41.165-1.126 123.29-1.126h117.76l8.909-7.987c4.813-4.301 9.011-8.090 9.318-8.397s8.806-7.885 18.944-16.896c23.142-20.48 21.504-19.046 40.55-35.942 8.704-7.885 29.901-26.624 47.104-41.882 17.101-15.155 32.768-29.082 34.714-30.822 1.946-1.843 18.637-16.691 37.171-33.075l33.485-29.901v383.59c0 210.944-0.307 383.488-0.717 383.386-0.512 0-11.674-9.728-24.883-21.504zM640 569.754c-11.571-10.138-23.962-21.094-27.546-24.269s-6.861-5.939-7.373-6.144c-1.843-0.717-0.819-2.867 3.789-7.885 6.144-6.656 12.902-16.998 17.818-26.931 22.426-45.261 15.462-101.786-16.998-139.162-5.12-5.837-6.656-8.499-4.71-8.499 0.41 0 2.867-2.048 5.427-4.403s7.885-7.066 11.776-10.445c16.179-14.131 33.894-29.696 36.352-31.949l2.765-2.56 6.861 8.090c23.552 27.546 39.834 62.771 46.182 100.454 2.253 13.414 2.662 42.394 0.819 57.344-3.891 30.925-15.258 61.44-32.461 87.45-6.042 9.114-20.582 27.648-21.504 27.341-0.102 0-9.626-8.294-21.197-18.432z" />
+<glyph unicode="&#xeb63;" glyph-name="volume_mid" d="M537.6 809.37c-13.21-11.878-27.238-24.371-31.232-27.853-3.891-3.482-11.981-10.65-17.92-15.974-13.619-12.186-14.336-12.8-35.84-31.846-9.83-8.704-18.125-16.077-18.432-16.384s-6.963-6.246-14.848-13.21c-7.885-7.066-17.818-15.77-22.016-19.558-6.349-5.734-46.899-41.677-60.723-53.965l-3.789-3.379h-117.043c-79.667 0-118.989-0.307-123.187-1.126-19.661-3.584-36.557-20.48-40.346-40.346-0.819-4.506-1.024-43.418-0.819-141.824l0.307-135.68 2.253-5.427c6.963-16.998 21.299-29.389 37.99-32.87 3.789-0.819 41.165-1.126 123.29-1.126h117.76l8.909-7.987c4.813-4.301 9.011-8.090 9.318-8.397s8.806-7.885 18.944-16.896c23.142-20.48 21.504-19.046 40.55-35.942 8.704-7.885 29.901-26.624 47.104-41.882 17.101-15.155 32.768-29.082 34.714-30.822 1.946-1.843 18.637-16.691 37.171-33.075l33.485-29.901v383.59c0 210.944-0.307 383.488-0.717 383.386-0.512 0-11.674-9.728-24.883-21.504zM754.176 669.491c-1.741-1.434-6.246-5.53-10.24-9.011-3.891-3.482-15.258-13.312-25.088-21.914s-18.022-15.974-18.227-16.384c-0.102-0.41 2.56-3.891 5.939-7.885 33.075-38.093 55.398-90.214 60.211-140.698 0.922-9.728 0.922-41.267 0-50.688-5.12-52.838-25.805-100.454-62.669-144.384-3.379-3.994-3.789-4.915-2.56-6.042 0.819-0.717 12.698-11.162 26.522-23.142s26.112-22.733 27.341-23.757c2.15-2.048 2.15-2.048 6.246 2.458 26.726 29.184 51.098 71.168 65.434 112.742 30.31 88.166 20.89 189.85-25.088 270.541-10.445 18.33-26.829 41.472-39.731 56.013-4.403 4.915-4.71 5.018-8.090 2.15zM640 569.754c-11.571-10.138-23.962-21.094-27.546-24.269s-6.861-5.939-7.373-6.144c-1.843-0.717-0.819-2.867 3.789-7.885 6.144-6.656 12.902-16.998 17.818-26.931 22.426-45.261 15.462-101.786-16.998-139.162-5.12-5.837-6.656-8.499-4.71-8.499 0.41 0 2.867-2.048 5.427-4.403s7.885-7.066 11.776-10.445c16.179-14.131 33.894-29.696 36.352-31.949l2.765-2.56 6.861 8.090c23.552 27.443 39.834 62.874 46.182 100.454 2.253 13.21 2.662 42.394 0.922 57.037-1.946 14.95-7.066 36.762-10.752 45.056-0.512 1.126-2.15 5.018-3.686 8.704-7.373 18.022-20.173 39.014-32.666 53.555-3.686 4.301-6.861 7.885-6.963 7.782-0.102 0-9.626-8.294-21.197-18.432z" />
+<glyph unicode="&#xeb64;" glyph-name="volume_none" d="M537.6 809.37c-13.21-11.878-27.238-24.371-31.232-27.853-3.891-3.482-11.981-10.65-17.92-15.974-13.619-12.186-14.336-12.8-35.84-31.846-9.83-8.704-18.125-16.077-18.432-16.384s-6.963-6.246-14.848-13.21c-7.885-7.066-17.818-15.77-22.016-19.558-6.349-5.734-46.899-41.677-60.723-53.965l-3.789-3.379h-117.043c-79.667 0-118.989-0.307-123.187-1.126-19.661-3.584-36.557-20.48-40.346-40.346-0.819-4.506-1.024-43.418-0.819-141.824l0.307-135.68 2.253-5.427c6.963-16.998 21.299-29.389 37.99-32.87 3.789-0.819 41.165-1.126 123.29-1.126h117.76l8.909-7.987c4.813-4.301 9.011-8.090 9.318-8.397s8.806-7.885 18.944-16.896c23.142-20.48 21.504-19.046 40.55-35.942 8.704-7.885 29.901-26.624 47.104-41.882 17.101-15.155 32.768-29.082 34.714-30.822 1.946-1.843 18.637-16.691 37.171-33.075l33.485-29.901v383.59c0 210.944-0.307 383.488-0.717 383.386-0.512 0-11.674-9.728-24.883-21.504z" />
+<glyph unicode="&#xeb65;" glyph-name="vowifi" d="M489.37 882.79c-0.205-0.205-5.632-0.614-11.981-1.024s-12.083-0.922-12.8-1.126c-0.717-0.205-3.789-0.614-6.861-1.024-16.691-1.741-44.749-7.373-62.464-12.39-83.046-23.654-155.648-69.837-212.378-135.066-15.258-17.613-37.683-49.050-46.694-65.536-1.843-3.379-3.686-6.554-4.096-7.168-0.512-0.512-4.506-8.397-9.011-17.408-65.434-131.072-60.416-286.618 13.312-412.979 26.214-44.851 63.488-88.269 103.014-119.808 12.493-9.933 48.128-35.021 49.766-35.021 0.205 0 4.403-2.355 9.421-5.222 27.034-15.565 59.699-29.286 92.365-38.81 18.227-5.325 44.954-11.264 57.549-12.698 2.56-0.307 6.451-0.819 8.806-1.126 15.77-2.355 33.28-3.277 58.778-3.072 15.462 0.205 30.515 0.614 33.28 0.922 2.867 0.307 6.963 0.819 9.216 1.126 2.253 0.205 6.861 0.717 10.24 1.126 22.63 2.355 57.651 10.547 84.48 19.763 63.078 21.504 118.989 56.422 166.4 103.936 56.013 56.013 94.208 122.47 114.074 198.349 2.867 10.957 7.27 32.461 8.909 42.906 0.307 2.56 0.819 5.325 0.922 6.144s0.614 4.813 1.024 8.704c0.41 3.994 0.819 8.602 1.024 10.24 1.843 15.053 2.458 56.525 1.126 71.168-1.229 14.029-1.741 18.227-3.174 29.184-3.686 27.648-8.704 49.357-17.613 76.8-4.915 14.95-13.414 36.864-18.227 46.592-1.536 3.072-4.198 8.602-5.939 12.288-26.010 53.658-70.451 108.134-121.037 148.070-46.080 36.352-101.683 63.795-159.744 78.746-22.221 5.734-40.243 8.909-70.656 12.39-5.53 0.614-60.416 1.536-61.030 1.024zM535.552 785.408c4.813-0.307 10.138-0.819 11.776-1.024 15.974-2.15 20.787-2.97 29.696-4.71 80.794-16.179 153.395-62.259 203.878-129.434 39.834-53.043 63.898-121.037 66.15-187.392l0.307-8.192-22.835-0.205c-16.691-0.102-22.733 0.205-22.835 1.024-0.307 3.482-0.717 8.397-1.331 17.613-1.434 22.63-8.090 53.043-16.896 76.493-15.36 41.062-36.966 74.65-67.584 105.267-34.202 34.202-74.035 58.368-118.989 72.294-21.914 6.758-53.555 12.39-72.090 12.8-10.342 0.205-9.523-1.946-9.523 23.245 0 12.186 0.102 22.426 0.307 22.733 0.41 0.614 7.885 0.41 19.968-0.512zM532.48 693.248c20.070-1.536 47.104-7.987 68.096-16.179 19.661-7.578 45.773-22.835 63.488-37.069 9.523-7.578 25.805-23.654 34.202-33.792 23.757-28.467 40.653-61.44 49.664-97.28 4.198-16.794 5.837-27.75 7.27-47.821l0.41-6.861h-22.938c-21.094 0-23.040 0.102-23.142 1.741-0.102 1.946-0.717 8.602-1.331 15.053-8.294 78.438-65.536 146.944-141.312 168.858-13.21 3.891-27.341 6.554-38.502 7.373-5.325 0.41-10.445 0.819-11.264 0.922-1.331 0.205-1.536 3.584-1.741 22.63-0.102 15.258 0.205 22.63 0.922 23.040 0.614 0.41 2.56 0.614 4.301 0.41s7.066-0.614 11.878-1.024zM528.384 601.088c16.486-1.638 38.707-8.704 55.091-17.613 18.637-10.035 40.243-29.389 52.122-46.592 15.462-22.323 26.112-52.224 27.136-76.083l0.307-6.144-22.733-0.205c-12.595-0.102-22.835 0.102-22.938 0.512 0 0.41-0.205 1.434-0.307 2.253-0.205 0.819-0.614 4.301-1.024 7.68-2.765 24.883-20.275 54.17-41.574 69.734-16.179 11.776-35.123 19.251-54.272 21.299-2.56 0.307-4.71 0.512-4.71 0.512-0.41 0.205-0.102 44.749 0.205 45.363 0.205 0.307 1.638 0.512 3.277 0.307 1.536-0.205 5.734-0.614 9.421-1.024zM254.054 524.595c3.277-1.126 7.578-3.891 13.005-8.499 6.144-5.12 40.141-47.002 49.050-60.211 10.547-15.77 11.059-25.395 1.946-37.581-1.536-1.946-9.114-10.138-16.998-18.022-7.885-7.987-14.746-15.667-15.36-17.203-5.018-13.21 6.144-35.43 33.69-67.686 9.011-10.445 42.803-44.954 53.35-54.272 24.986-22.118 43.315-34.714 57.549-39.322 5.222-1.741 12.902-2.15 16.384-0.922 1.536 0.614 9.626 7.68 17.92 15.77 31.846 31.232 35.942 31.232 75.571 0 37.888-29.798 49.664-41.984 49.664-50.995 0-4.506-2.97-11.162-7.475-17.101-2.355-3.072-13.517-14.848-24.781-26.112-16.896-16.896-21.402-20.89-26.624-23.245-30.72-14.336-91.443 3.072-153.088 43.622-81.203 53.453-158.31 143.36-186.368 217.088-8.909 23.45-12.288 37.99-12.902 55.808-0.717 22.835 2.662 31.437 19.046 48.435 29.389 30.413 35.226 35.942 42.496 39.219 5.734 2.765 8.909 2.97 13.926 1.229zM526.746 503.91c14.746-4.506 27.341-15.36 34.406-29.594 5.018-10.342 6.554-18.022 5.734-29.389-1.024-15.565-7.168-28.365-18.33-38.4-11.059-10.035-23.552-14.848-38.605-14.848-16.282 0-28.979 5.325-40.346 16.794-31.334 31.437-17.613 83.251 25.293 95.846 7.987 2.355 23.245 2.15 31.846-0.41z" />
+<glyph unicode="&#xeb66;" glyph-name="vvm_message_read_full" d="M245.248 779.571c-19.046-3.584-36.045-21.197-39.424-40.755-0.819-4.608-1.024-32.87-0.819-93.184l0.307-86.528 2.765-7.066c1.638-3.789 4.403-9.114 6.349-11.776 5.53-7.373 263.27-263.27 269.619-267.571 12.39-8.499 30.925-10.752 44.646-5.53 3.891 1.434 9.216 4.096 11.981 5.939s41.267 39.424 85.709 83.354c44.339 44.032 103.834 102.912 132.198 130.97 48.026 47.616 51.712 51.507 54.989 58.266 1.946 3.994 3.994 10.24 4.608 13.926 0.614 4.198 1.024 38.81 0.922 92.16v85.504l-2.355 7.373c-1.331 4.096-3.891 9.728-5.734 12.595-6.963 10.854-19.968 19.763-32.563 22.426-6.963 1.434-525.517 1.434-533.197-0.102zM701.542 727.245c19.354-9.626 19.354-36.864 0-46.49-3.482-1.741-12.8-1.843-189.542-1.843-179.098 0-185.958 0.102-189.645 1.946-8.909 4.403-14.541 13.107-14.438 22.63 0 11.878 7.066 21.811 17.715 24.883 2.355 0.717 67.686 1.024 187.904 0.922 175.104-0.205 184.525-0.307 188.006-2.048zM547.328 624.742c6.042-2.867 11.059-7.782 13.312-13.21 2.048-5.018 2.15-14.643 0.205-19.354-2.355-5.53-8.397-11.571-14.029-14.029l-5.12-2.15-107.725 0.205c-102.298 0.307-108.032 0.41-111.616 2.15-16.384 8.192-19.558 29.184-6.349 41.984 7.27 7.066 1.741 6.758 119.706 6.758l106.496 0.102 5.12-2.458zM128 355.635c0-212.89-0.41-199.475 5.837-212.582 3.277-7.066 13.926-17.92 21.504-22.016 11.571-6.144-13.824-5.837 380.006-5.837h360.653v435.405l-3.482-3.379c-5.53-5.632-73.011-71.578-83.763-81.92-5.427-5.325-18.125-17.715-28.16-27.546-23.040-22.426-87.040-84.992-97.587-95.232-11.366-11.059-75.981-74.035-98.406-96.051-20.992-20.582-26.726-25.293-36.762-30.31-12.8-6.554-23.142-8.909-38.093-8.909-12.8 0.102-24.064 2.765-36.147 8.704-13.824 6.861-1.229-5.018-131.994 124.006-29.696 29.286-61.747 60.826-71.27 70.144-21.811 21.402-130.867 128.922-137.421 135.578l-4.915 4.915v-194.97z" />
+<glyph unicode="&#xeb67;" glyph-name="Warehouse" d="M440.32 775.168c-39.117-17.203-79.462-34.816-89.6-39.322s-34.816-15.258-54.784-23.962c-19.968-8.704-44.442-19.456-54.272-23.757s-22.938-10.138-29.184-12.8c-47.821-20.89-101.171-44.237-105.267-46.080l-4.813-2.15v-563.098h153.6v384h512v-384h153.6l-0.205 281.702-0.307 281.805-7.68 3.277c-4.198 1.843-48.435 21.197-98.304 43.11-49.869 21.811-94.106 41.062-98.304 42.906s-22.426 9.728-40.448 17.613c-18.022 7.987-35.738 15.667-39.322 17.203-3.482 1.434-7.168 3.072-8.192 3.584-1.843 1.126-116.634 51.2-117.043 51.2-0.205-0.102-32.358-14.131-71.475-31.232zM281.6 371.2v-51.2h102.4v102.4h-102.4v-51.2zM281.6 243.2v-51.2h102.4v102.4h-102.4v-51.2zM409.6 243.2v-51.2h102.4v102.4h-102.4v-51.2zM281.6 115.2v-51.2h102.4v102.4h-102.4v-51.2zM409.6 115.2v-51.2h102.4v102.4h-102.4v-51.2zM537.6 115.2v-51.2h102.4v102.4h-102.4v-51.2z" />
+<glyph unicode="&#xeb68;" glyph-name="Warningimportant" d="M498.483 797.184c-19.558-3.072-40.55-15.258-52.531-30.515-3.994-5.018-17.203-26.522-25.907-42.189-1.331-2.56-2.867-5.018-3.277-5.632-0.41-0.512-5.018-8.397-10.24-17.408-11.264-19.456-14.336-24.678-21.504-36.864-2.867-5.018-6.246-10.854-7.373-12.8-1.843-3.072-13.517-23.245-27.443-47.104-2.15-3.686-6.656-11.366-10.138-17.203-3.379-5.734-7.168-12.186-8.294-14.336-1.126-2.048-2.56-4.506-3.072-5.325-0.922-1.331-14.029-23.859-19.456-33.28-0.922-1.638-13.824-23.757-28.672-49.152-14.848-25.293-30.208-51.814-34.304-58.88-9.523-16.384-58.368-100.25-70.144-120.32-17.715-30.208-37.683-64.614-39.834-68.813-4.506-9.011-7.475-21.709-7.885-34.099-0.205-6.451 0.102-14.029 0.614-16.896 1.638-8.397 5.939-20.48 9.83-27.341 3.277-5.837 12.8-18.227 16.077-20.787 11.981-9.83 19.661-14.438 29.491-17.92 14.95-5.222-1.638-5.018 326.144-5.018 330.752-0.102 315.392-0.307 329.318 5.12 14.746 5.632 27.546 14.848 36.659 26.214 19.968 24.781 24.781 57.037 13.005 86.323-1.331 3.174-15.667 28.57-31.949 56.422-16.179 27.853-30.925 53.146-32.768 56.218-6.554 11.264-22.323 38.502-50.688 87.040-15.974 27.341-34.714 59.597-41.779 71.68-16.896 28.979-17.818 30.72-28.365 48.64-4.915 8.499-10.342 17.92-12.083 20.992-1.638 3.072-3.584 6.349-4.301 7.168-0.614 0.819-2.355 3.584-3.789 6.144-2.458 4.403-22.323 38.707-33.587 57.856-2.97 5.12-6.246 10.752-7.27 12.595-1.126 1.741-2.765 4.813-3.891 6.656-1.024 1.741-4.198 7.168-6.963 11.981-8.806 14.95-30.106 51.507-32.256 55.296-15.872 27.546-21.402 35.84-28.57 42.598-10.445 9.728-20.275 15.462-34.202 20.070-7.475 2.458-11.469 3.072-20.992 3.379-6.451 0.205-14.438 0-17.613-0.512zM521.421 677.274c18.33-3.789 33.178-18.637 37.683-37.581 1.126-4.915 0.922-22.118-0.512-36.557-0.205-2.253-0.717-9.626-1.024-16.384s-0.819-15.053-1.024-18.432c-0.307-3.379-0.717-10.752-1.024-16.384s-0.819-13.005-1.024-16.384c-0.205-3.379-0.717-10.752-1.024-16.384-1.229-20.275-1.536-25.702-2.048-33.792-0.717-11.878-1.434-23.347-2.048-33.792-0.717-13.824-1.536-25.805-2.048-33.792-0.307-3.891-0.717-11.264-1.024-16.384-0.307-5.018-0.717-12.39-1.024-16.384-0.307-3.891-0.717-11.776-1.126-17.408-0.717-13.21-2.048-17.51-6.758-22.118-11.776-11.366-42.803-10.65-53.146 1.331-3.584 4.096-4.813 8.602-5.427 20.275-0.717 11.264-1.331 21.606-2.15 33.28-0.307 4.506-0.717 12.8-1.024 18.432s-0.717 12.288-0.922 14.848c-0.307 2.56-0.717 10.138-1.024 16.896-0.41 6.758-0.922 15.053-1.126 18.432-0.307 3.379-0.717 10.752-1.024 16.384s-0.819 13.722-1.024 17.92c-0.922 13.824-1.434 22.835-1.946 32.256-0.819 12.8-1.741 27.955-2.15 32.256-0.205 1.946-0.614 10.547-1.024 18.944-0.41 8.499-0.922 15.565-1.024 15.974-1.024 1.536-1.331 33.69-0.512 37.581 5.939 25.498 31.949 42.291 57.549 36.966zM523.162 287.744c21.606-5.734 36.966-25.293 36.966-47.104-0.102-33.075-33.485-56.73-64.614-45.773-14.438 5.018-23.859 14.643-30.515 31.334-1.946 4.71-2.56 16.998-1.126 23.654 5.427 27.034 33.28 44.851 59.29 37.888z" />
+<glyph unicode="&#xeb69;" glyph-name="Warning_important" d="M486.4 882.893c-0.307-0.205-5.12-0.717-10.752-1.126-5.632-0.307-11.366-0.819-12.8-1.024s-4.813-0.717-7.68-1.126c-8.806-1.126-24.371-3.584-28.672-4.608-2.253-0.512-7.578-1.741-11.776-2.662-57.856-12.8-120.627-42.291-167.424-78.746-37.069-28.877-67.379-60.518-93.286-97.792-28.672-41.062-51.098-89.6-63.795-138.24-3.891-15.053-8.806-39.834-10.24-51.712-0.614-5.018-1.331-11.059-1.638-13.312-2.662-21.709-2.662-69.939 0-91.341 4.608-37.478 9.83-61.030 20.378-92.979 8.806-26.419 23.142-58.368 35.43-78.95 2.253-3.891 4.506-7.68 4.915-8.294 3.174-5.427 12.083-18.944 17.92-27.136 52.531-73.728 128.41-130.56 213.299-159.642 22.221-7.578 57.754-16.282 77.722-18.944 2.867-0.41 6.042-0.819 7.168-1.024 1.024-0.205 5.018-0.717 8.704-1.024 3.686-0.41 8.090-0.922 9.728-1.126 7.782-1.126 66.355-1.024 78.336 0.205 27.546 2.765 40.346 4.915 65.024 10.957 110.387 26.931 206.746 97.178 266.854 194.355 37.069 59.904 59.597 129.741 64.102 199.168 1.331 20.89 0.717 63.386-1.229 75.469-0.205 1.229-1.126 8.397-2.048 15.667-8.397 65.331-35.84 134.554-75.469 190.669-5.734 8.192-8.192 11.366-18.534 24.371-13.21 16.486-36.045 39.936-54.17 55.501-56.422 48.435-124.518 81.613-197.939 96.461-5.632 1.126-12.083 2.355-14.234 2.662s-4.915 0.717-6.144 1.024c-1.229 0.205-4.403 0.717-7.27 1.024-2.765 0.307-6.963 0.819-9.216 1.126s-5.939 0.717-8.192 1.024c-5.53 0.614-66.458 1.638-67.072 1.126zM530.022 731.648c12.186-3.994 23.142-12.288 29.491-22.426 6.246-9.933 10.65-27.136 10.24-40.55-0.102-6.758-1.434-29.696-1.946-35.328-0.102-1.946-0.614-7.68-0.922-12.8-0.717-9.626-1.331-18.33-2.15-28.672-0.307-3.379-0.717-9.626-1.024-13.824-1.229-17.818-1.638-22.221-2.048-26.624-0.205-2.56-0.717-8.090-1.024-12.288-1.024-13.824-1.434-18.842-2.458-30.72-0.614-6.451-1.331-15.462-1.638-19.968s-0.717-10.24-1.024-12.8c-0.205-2.56-0.717-7.373-1.024-10.752s-0.717-8.192-1.024-10.752c-0.205-2.56-0.717-8.294-1.024-12.8s-0.819-10.035-1.024-12.288c-0.307-2.253-0.717-6.861-1.024-10.24-1.331-14.541-2.048-21.914-3.584-34.816-0.614-5.018-1.331-11.469-1.638-14.336-1.024-9.318-2.458-14.131-5.53-18.227-5.837-7.987-13.722-11.571-26.112-11.878-13.619-0.307-22.528 3.686-28.57 12.698-2.867 4.198-3.686 6.758-4.608 14.336-0.717 5.12-1.434 10.342-1.638 11.776s-0.922 8.090-1.536 14.848c-1.024 11.674-1.638 17.715-2.56 24.576-0.205 1.741-0.717 6.758-1.024 11.264s-0.819 10.035-1.024 12.288c-0.819 7.475-1.434 15.258-2.048 23.552-0.307 4.506-0.819 9.626-1.024 11.264-0.205 1.741-0.717 7.68-1.024 13.312-0.41 5.632-0.922 11.366-1.024 12.8-0.205 1.434-0.614 6.758-1.024 11.776-0.307 5.12-0.819 10.65-1.024 12.288-0.205 1.741-0.717 7.27-1.024 12.288-0.307 5.12-0.819 11.264-1.024 13.824-0.41 4.301-1.024 12.493-2.048 25.6-0.205 3.072-0.717 9.318-1.024 13.824-0.717 9.523-1.331 17.715-2.048 27.136-0.205 3.686-0.717 10.138-1.024 14.336-0.205 4.198-0.717 11.571-1.126 16.384-2.56 32.666 1.946 52.429 15.258 66.867 14.643 15.77 38.195 21.811 58.675 15.053zM530.534 270.131c19.149-6.554 34.304-23.347 38.195-42.291 2.253-11.162 0.922-25.293-3.174-35.328-5.837-13.926-19.968-26.214-35.635-30.925-9.216-2.765-27.443-2.458-36.352 0.614-12.39 4.301-24.269 13.21-30.208 22.63-9.523 15.053-10.752 39.526-2.867 55.91 7.578 15.667 22.63 27.443 39.731 31.13 6.758 1.536 23.859 0.512 30.31-1.741z" />
+<glyph unicode="&#xeb6a;" glyph-name="web_cam" d="M491.418 805.99c-0.205-0.205-4.096-0.614-8.602-1.024-55.91-4.71-111.309-26.419-158.413-62.259-22.221-16.794-50.893-47.104-66.253-69.734-28.365-42.189-44.032-83.354-51.712-136.909-0.922-5.734-2.048-28.365-2.048-38.4 0.102-9.421 1.434-33.382 1.946-34.304 0.102-0.307 0.614-3.277 0.922-6.656 1.638-14.131 6.963-36.966 12.902-54.682 33.382-100.557 117.248-177.254 220.979-201.83 12.493-2.97 31.744-6.042 43.213-6.963 12.698-0.922 42.906-0.922 55.398 0.102 51.712 3.994 108.954 25.6 152.474 57.549 26.112 19.149 54.784 48.435 71.885 73.523 15.667 22.938 29.594 50.483 38.4 75.981 6.861 19.968 13.414 51.814 15.258 74.752 0.819 9.523 0.819 42.496 0 48.23-0.307 2.253-0.819 6.963-1.126 10.65-1.638 16.589-7.168 42.394-13.107 60.416-8.806 26.522-16.998 43.622-35.021 73.114-7.373 11.981-22.426 30.618-36.864 45.568-46.899 48.435-109.261 80.486-174.592 89.702-6.451 0.922-12.902 1.946-14.336 2.253-2.765 0.512-50.79 1.434-51.302 0.922zM536.576 624.742c49.562-10.752 86.835-46.592 99.123-95.334 6.963-27.546 3.789-58.675-8.909-85.709-11.059-23.552-34.099-47.104-57.958-58.982-8.294-4.096-21.811-8.806-31.744-10.957-9.523-2.048-33.894-2.867-43.008-1.434-28.365 4.403-50.278 15.258-72.602 35.738-9.728 8.909-23.859 30.618-29.696 45.568-12.493 32.051-10.547 70.656 5.222 102.4 18.534 37.069 52.941 62.464 94.515 69.632 10.138 1.741 35.021 1.229 45.056-0.922zM499.2 575.078l-4.096-0.614 3.072-1.741c14.336-7.987 17.613-27.853 6.349-39.526-9.933-10.445-25.088-10.957-35.84-1.331-5.427 4.915-8.090 11.059-8.090 18.944v6.246l-5.632-6.042c-26.726-29.286-26.931-73.523-0.307-103.322 22.938-25.6 61.542-32.461 92.16-16.486 33.075 17.306 48.742 55.194 37.786 91.238-7.27 23.962-28.365 44.032-53.658 51.098-6.451 1.741-24.474 2.662-31.744 1.536zM289.28 230.707c-9.421-11.571-11.366-13.926-51.814-63.283-12.698-15.462-23.859-29.389-24.883-30.925-4.403-6.758-6.144-22.733-3.584-33.178 3.072-13.005 13.722-26.829 25.19-32.973 13.005-6.861-8.397-6.349 277.299-6.349 232.755 0 259.379 0.205 265.114 1.638 22.426 5.734 38.298 25.805 38.707 48.845 0.102 7.373-1.741 16.282-4.301 20.89-1.024 1.741-14.234 18.227-29.389 36.659-25.907 31.642-33.075 40.346-49.869 61.030-3.789 4.71-7.373 8.704-7.885 8.909-0.41 0.205-3.994-2.15-7.782-5.222-45.158-35.84-102.4-59.597-163.123-67.789-23.245-3.174-67.482-2.662-90.624 1.024-56.32 8.806-106.496 30.003-151.347 63.795-6.144 4.608-11.469 8.397-11.776 8.294-0.41 0-4.813-5.12-9.933-11.366z" />
+<glyph unicode="&#xeb6b;" glyph-name="web_fax_widget" d="M230.4 627.302v-153.6l-114.176-0.614-5.632-2.56c-16.896-7.373-28.058-19.866-32.358-36.147-1.126-4.403-1.434-28.979-1.434-139.469 0-146.739-0.307-139.469 5.939-152.064 6.144-12.39 21.606-23.962 35.533-26.522 4.301-0.819 119.194-1.126 395.059-1.126 351.642 0 389.632 0.205 395.366 1.638 13.517 3.482 25.088 12.493 31.949 24.678 6.758 11.981 6.554 6.349 6.554 152.986 0 85.606-0.41 134.656-1.024 138.24-2.662 14.029-12.8 27.75-25.19 34.406-11.981 6.349-13.107 6.451-73.011 6.451h-54.374v102.4l-204.186 204.8h-359.014v-153.498zM563.2 662.733c0-61.85 0.102-67.482 1.946-74.138 4.813-18.637 20.89-33.69 39.424-37.069 3.994-0.717 29.082-1.126 71.987-1.126h65.843v-102.4h-460.8v281.6h281.6v-66.867zM552.96 395.366c1.434-0.205 7.68-1.024 13.824-1.638 27.136-2.765 56.32-8.909 78.848-16.486 45.158-15.36 76.083-39.117 80.282-61.747 0.512-2.765 0.819-17.51 0.819-32.768-0.205-27.443-0.205-27.853-2.765-32.87-2.048-4.096-3.584-5.632-7.578-7.578-4.506-2.253-6.349-2.56-16.896-2.458-6.554 0.102-18.33 0.819-26.214 1.741s-16.589 1.946-19.456 2.253c-9.523 1.024-22.528 3.584-26.522 5.12-6.246 2.458-9.421 5.12-11.571 9.83-2.867 6.042-3.379 10.854-3.482 31.027-0.102 18.33-0.614 20.685-5.325 25.19s-17.306 9.421-29.389 11.571c-1.946 0.307-4.71 0.819-6.144 1.126-3.174 0.717-10.035 1.434-22.528 2.458-10.138 0.922-72.294 0.717-76.8-0.205-1.434-0.307-5.734-0.819-9.728-1.229-24.474-2.355-42.394-8.806-47.514-17.306-1.638-2.765-1.946-5.939-2.458-24.166-0.307-11.571-1.024-22.733-1.741-24.883-3.379-11.366-13.926-15.872-44.954-19.149-5.837-0.614-12.083-1.331-13.824-1.536-8.192-1.126-23.347-2.048-30.413-1.946-13.005 0.205-17.613 2.765-20.992 11.674-2.662 7.168-3.379 58.675-0.922 67.174 9.114 31.437 70.144 62.669 142.541 73.011 21.606 3.072 21.504 3.072 34.099 3.789 6.451 0.41 11.981 0.819 12.186 1.024 0.614 0.512 61.645-0.41 64.614-1.024zM523.981 214.733c4.813-2.458 10.24-8.294 12.288-13.414 1.946-4.71 2.048-14.029 0.102-18.637-5.53-12.902-20.89-19.558-33.178-14.336-13.517 5.837-19.456 19.763-14.234 33.485 2.048 5.427 10.24 13.107 15.565 14.643 5.53 1.536 14.643 0.717 19.456-1.741z" />
+<glyph unicode="&#xeb6c;" glyph-name="Wholesale_retail" d="M440.32 775.168c-39.117-17.203-79.462-34.816-89.6-39.322s-34.816-15.258-54.784-23.962c-19.968-8.704-44.442-19.456-54.272-23.757s-22.938-10.138-29.184-12.8c-47.821-20.89-101.171-44.237-105.267-46.080l-4.813-2.15v-563.098h153.6v256h512v-256h153.6l-0.205 281.702-0.307 281.805-7.68 3.277c-4.198 1.843-48.435 21.197-98.304 43.11-49.869 21.811-94.106 41.062-98.304 42.906s-22.426 9.728-40.448 17.613c-18.022 7.987-35.738 15.667-39.322 17.203-3.482 1.434-7.168 3.072-8.192 3.584-1.843 1.126-116.634 51.2-117.043 51.2-0.205-0.102-32.358-14.131-71.475-31.232zM768 499.2v-51.2h-512v102.4h512v-51.2zM281.6 243.2v-51.2h102.4v102.4h-102.4v-51.2zM409.6 243.2v-51.2h102.4v102.4h-102.4v-51.2zM281.6 115.2v-51.2h102.4v102.4h-102.4v-51.2zM409.6 115.2v-51.2h102.4v102.4h-102.4v-51.2zM537.6 115.2v-51.2h102.4v102.4h-102.4v-51.2z" />
+<glyph unicode="&#xeb6d;" glyph-name="Widget" d="M290.611 831.488c-0.205-0.205-2.867-0.614-5.939-0.922-19.763-2.355-38.912-8.294-58.88-18.33-43.93-22.016-77.414-62.874-91.034-110.797-4.301-15.36-5.939-26.624-6.246-45.056-0.307-15.155 0.102-22.016 1.946-33.28 10.854-63.59 55.296-116.838 116.122-138.957 5.427-1.946 14.131-4.506 19.149-5.632 21.094-4.71 22.63-4.813 124.211-4.813l96.461-0.102-0.102 95.437c-0.102 93.184-0.41 105.779-3.379 119.091-2.15 9.421-3.174 13.107-5.939 21.504-20.992 64.205-78.438 111.616-146.33 120.73-8.602 1.126-39.014 1.946-40.038 1.126zM317.542 762.88c14.95-5.12 22.221-23.552 14.643-37.376-9.421-17.408-32.768-19.354-44.544-3.686-4.301 5.632-5.53 9.83-5.222 17.818 0.717 16.998 18.637 28.877 35.123 23.245zM333.005 614.707c0.307-67.072 0.41-72.192 2.15-75.366 2.253-4.198 6.758-6.963 12.595-7.885 4.198-0.614 4.506-0.922 4.506-3.686v-2.97h-87.040v2.867c0 2.662 0.41 3.072 5.222 4.096 2.867 0.717 6.554 2.15 8.090 3.277 5.632 3.994 5.632 4.506 5.632 70.144 0 56.218-0.102 60.723-1.843 65.331-2.15 5.53-5.12 7.578-12.493 8.602-4.403 0.512-4.608 0.717-4.608 3.994v3.482h67.482l0.307-71.885zM693.248 830.464c-27.238-3.789-52.019-13.005-73.83-27.238-12.595-8.192-17.818-12.595-29.696-24.371-22.528-22.63-37.581-48.742-46.080-79.974-1.741-6.246-1.638-6.144-3.891-19.456-1.843-10.957-1.946-18.33-2.048-108.851l-0.102-97.075 99.533 0.41c54.784 0.102 100.557 0.614 101.683 0.922s4.403 0.922 7.168 1.229c11.878 1.741 33.178 8.397 46.080 14.541 45.773 21.709 81.101 62.566 95.027 109.978 6.246 21.402 7.885 33.69 7.373 55.808-0.614 23.040-2.458 34.406-9.318 54.784-10.138 30.003-30.822 59.904-55.091 79.77-33.075 27.034-71.782 40.858-114.278 40.755-7.578 0-17.715-0.512-22.528-1.229zM703.386 724.992c3.789-2.97 34.611-27.648 64.512-51.712 7.987-6.451 17.203-13.722 20.275-16.077l5.53-4.198-36.147-28.979c-19.866-15.872-37.581-30.106-39.322-31.539s-6.144-4.915-9.728-7.782c-3.584-2.765-7.475-5.939-8.602-6.861s-3.686-3.072-5.734-4.608c-2.048-1.536-8.294-6.554-13.824-11.059s-11.162-9.011-12.39-10.035l-2.355-1.843v204.902l16.896-13.619c9.318-7.373 18.739-14.848 20.89-16.589zM293.786 421.99c-0.205-0.205-3.174-0.614-6.554-0.922-24.474-2.253-54.477-12.8-76.288-26.829-42.803-27.443-71.578-70.758-80.282-120.832-3.277-18.637-3.072-50.176 0.41-64 0.512-1.946 1.946-7.475 3.174-12.288 15.974-63.59 69.53-114.688 134.861-128.922 33.485-7.27 73.83-4.198 102.605 7.782 26.214 10.957 42.803 21.811 60.928 39.731 25.088 24.781 41.267 53.555 49.152 87.245 4.198 18.022 4.403 23.859 4.506 123.494l0.102 95.949h-96.051c-52.838 0-96.358-0.205-96.563-0.41zM332.8 342.221c17.51-4.506 32.666-13.107 45.466-25.702 9.421-9.216 15.053-16.998 20.582-28.16 7.987-16.077 10.854-29.798 10.24-49.254-1.434-47.104-34.918-86.426-81.92-96.256-10.035-2.048-29.901-2.15-40.038-0.102-14.438 2.867-31.642 10.957-43.418 20.378-17.51 13.926-29.798 32.768-35.533 54.272-2.355 8.602-2.662 12.083-2.662 25.805 0 13.926 0.307 17.101 2.56 25.6 9.933 36.659 38.093 64.512 74.547 73.728 10.752 2.662 12.186 2.765 27.136 2.458 10.24-0.205 15.565-0.819 23.040-2.765zM299.93 317.645c-6.042-4.096-6.042-3.584-6.042-48.845 0-39.322 0.102-41.677 2.048-44.749 3.789-6.246 5.018-6.451 36.659-6.451 28.058 0 28.672 0 32.051 2.355 6.144 4.096 7.782 10.752 3.994 16.794-3.584 5.939-5.837 6.451-28.672 6.451h-20.48v33.587c0 31.437-0.102 33.69-2.048 36.762-3.891 6.451-11.469 8.192-17.51 4.096zM537.702 326.963c0-52.531 0.512-99.226 1.024-103.731 6.758-59.904 44.032-113.357 97.69-140.083 27.546-13.722 53.043-19.354 84.48-18.637 25.395 0.512 44.646 4.608 66.56 14.131 81.92 35.533 124.928 124.006 102.502 210.637-7.885 30.618-23.757 57.651-47.718 81.408-28.57 28.365-64.512 45.67-104.96 50.586-4.198 0.512-50.893 1.024-103.731 1.024l-95.949 0.102 0.102-95.437zM732.16 343.962c9.933-2.048 17.818-5.325 26.112-10.752 23.962-15.565 36.864-41.472 35.021-70.042-1.126-16.691-4.71-26.010-17.818-46.797-21.811-34.509-26.317-42.086-37.683-62.771-2.15-3.891-4.71-8.499-5.632-10.24-0.922-1.638-4.608-8.499-8.192-15.053-3.584-6.656-6.758-12.083-7.168-12.083-0.307 0-2.867 3.994-5.632 9.011-2.662 4.915-7.987 14.234-11.776 20.685s-7.987 13.824-9.421 16.384c-6.554 11.878-16.794 29.594-23.142 40.141-21.197 35.123-27.853 53.043-26.522 71.475 3.482 46.592 46.49 79.36 91.853 70.042zM704.819 318.464c-21.914-4.813-39.219-26.624-39.219-49.664 0-27.546 23.654-51.2 51.2-51.2 27.75 0 51.302 23.654 51.2 51.507-0.102 18.739-12.083 37.581-28.979 45.568-11.366 5.325-21.709 6.451-34.202 3.789z" />
+<glyph unicode="&#xeb6e;" glyph-name="widget_tour" d="M76.8 471.040c0-222.106 0.307-311.194 1.126-315.085 3.891-18.637 18.944-34.202 37.888-39.219 8.294-2.253 784.077-2.253 792.371 0 16.896 4.506 29.901 16.282 36.147 32.87l2.355 6.042 0.307 312.627 0.205 312.525-186.061-0.307c-176.538-0.205-186.47-0.307-192.307-2.15-30.106-9.114-52.429-34.509-56.013-63.59-0.512-3.686-1.024-2.458-3.174 7.27-4.096 18.125-16.384 35.635-32.461 46.080-9.216 5.939-14.95 8.397-25.6 10.752-8.397 1.843-15.974 1.946-191.693 1.946h-183.091v-309.76zM310.682 633.958c18.534-9.114 26.726-31.437 18.227-49.971-11.366-24.781-44.442-30.31-62.669-10.342-7.782 8.499-9.626 13.312-9.728 25.395 0 9.626 0.205 10.752 3.379 17.101 5.325 10.752 16.179 19.251 27.238 21.094 6.861 1.229 17.306-0.205 23.552-3.277zM853.299 600.166c5.632-2.048 10.342-6.042 13.619-11.571 2.56-4.301 2.97-5.939 2.97-12.595 0-6.554-0.512-8.499-2.765-12.39-1.536-2.56-4.403-5.939-6.554-7.578-7.68-5.837-2.97-5.632-130.97-5.632-133.222 0-125.133-0.512-133.12 7.782-4.608 4.71-7.68 11.674-7.68 17.306 0 11.366 8.499 22.63 18.842 25.088 1.741 0.512 56.832 0.819 122.47 0.922 97.178 0 120.013-0.205 123.187-1.331zM332.8 428.339c0.102-96.768 0.102-100.454 2.253-109.773 1.946-8.704 9.421-14.438 20.070-15.155 3.174-0.205 3.277-0.41 3.277-4.608v-4.403h-128v3.994c0 4.403 0.205 4.506 7.885 5.734 2.355 0.41 6.349 2.048 9.011 3.686 8.806 5.53 8.192-1.434 8.192 101.786 0 50.176-0.307 92.365-0.717 93.901-2.048 7.27-10.854 12.186-23.040 13.005-0.819 0.102-1.331 1.638-1.331 4.198v4.096h102.4v-96.461zM853.299 497.766c5.632-2.048 10.547-6.246 13.722-11.674 2.458-4.096 2.867-5.939 2.867-12.493s-0.512-8.499-2.867-12.493c-1.536-2.662-4.301-6.042-6.144-7.373-7.885-6.042-1.638-5.734-131.686-5.734-95.846 0.102-120.115 0.307-123.187 1.434-17.51 6.246-22.63 28.57-9.626 41.882 7.987 8.294-1.229 7.68 133.222 7.782 97.587 0 120.525-0.205 123.699-1.331zM852.378 395.366c6.349-1.946 10.957-5.632 14.541-11.571 2.56-4.301 2.97-5.939 2.97-12.595 0-6.554-0.512-8.499-2.867-12.493-1.536-2.662-4.301-6.042-6.144-7.373-7.885-6.042-1.638-5.734-131.174-5.734-133.837 0-125.133-0.512-133.222 7.68-4.608 4.608-7.68 11.776-7.68 18.022 0 10.547 8.090 21.402 18.227 24.474 1.536 0.512 56.218 0.922 121.651 0.922 99.738 0.102 119.603-0.102 123.699-1.331zM751.104 292.659c6.758-2.253 13.005-8.704 15.36-15.667 3.277-9.933-0.205-22.118-8.090-28.16-7.475-5.734-6.554-5.632-79.36-5.632-75.981 0-74.752-0.102-82.125 7.27-7.475 7.475-9.626 15.872-6.554 26.112 2.355 8.090 8.602 14.131 17.92 17.101 0.819 0.307 32.256 0.614 69.734 0.614 60.826 0.102 68.71-0.102 73.114-1.638z" />
+<glyph unicode="&#xeb6f;" glyph-name="wifi" d="M482.202 807.014c-0.205-0.205-5.734-0.717-12.186-1.024-12.083-0.614-14.848-0.922-31.744-2.765-91.546-10.035-181.76-40.55-261.632-88.474-33.485-20.070-71.578-48.026-98.304-72.090-14.746-13.312-27.136-25.293-27.136-26.317 0-1.434 58.368-60.006 59.494-59.597 0.41 0.205 5.734 4.915 11.878 10.65 26.522 24.781 47.514 41.574 74.547 59.494 62.771 41.677 129.843 69.53 203.059 84.275 15.462 3.072 38.298 6.554 50.893 7.782 3.994 0.307 8.602 0.819 10.24 1.024 19.456 2.56 75.264 2.458 103.424-0.102 59.597-5.53 126.874-23.040 177.664-46.387 64.307-29.491 114.483-63.283 162.611-109.261l8.602-8.294 30.208 30.208 30.106 30.208-5.939 5.53c-3.277 3.072-8.704 8.192-12.083 11.366-32.563 30.925-77.107 63.59-120.525 88.474-14.643 8.397-57.856 30.413-59.802 30.413-0.307 0-4.301 1.638-8.909 3.686-17.92 7.885-53.146 20.378-75.981 26.931-16.691 4.813-53.76 13.21-65.536 14.95-2.253 0.307-4.813 0.717-5.632 1.024-0.819 0.205-3.789 0.614-6.656 1.024-2.765 0.307-7.885 1.024-11.264 1.536s-9.114 1.229-12.8 1.536c-3.686 0.307-7.578 0.819-8.704 1.024s-5.939 0.717-10.752 1.024c-4.813 0.41-10.342 0.922-12.288 1.229-4.403 0.614-74.24 1.536-74.854 0.922zM496.333 636.826c-0.102-0.102-6.861-0.512-15.053-0.922-8.090-0.41-15.053-0.819-15.36-1.024-0.307-0.102-3.994-0.614-8.192-0.922-4.198-0.41-14.848-1.843-23.552-3.277-55.91-9.216-107.008-26.931-156.672-54.374-26.726-14.848-54.579-34.202-78.131-54.272-9.626-8.294-14.95-13.21-27.034-24.781-1.024-1.024-1.126-1.638-0.205-2.765 0.614-0.819 14.029-14.336 29.798-30.208 24.986-25.088 28.877-28.467 30.31-27.341 1.946 1.536 2.97 2.458 11.571 10.547 3.584 3.482 9.114 8.294 12.186 10.752 3.072 2.56 5.837 4.915 6.144 5.222 1.229 1.434 21.811 16.486 30.208 22.118 53.248 35.43 121.344 59.597 181.76 64.41 4.813 0.41 10.342 0.819 12.288 1.024 5.939 0.512 49.766 0.512 52.429 0 1.229-0.307 6.042-0.819 10.547-1.126 19.763-1.434 46.49-6.246 68.608-12.39 61.133-16.896 121.446-50.79 165.478-92.979 4.198-4.096 8.294-7.782 8.909-8.090 0.614-0.41 13.722 11.878 30.925 29.082l29.798 29.901-5.939 6.042c-20.89 21.402-58.368 49.971-89.907 68.608-50.688 29.901-112.026 52.326-164.864 60.211-4.506 0.717-9.114 1.434-10.24 1.638-5.222 1.024-28.774 3.482-39.424 4.096-11.469 0.614-45.875 1.229-46.387 0.819zM479.027 464.896c-54.067-6.042-105.882-25.805-148.787-56.73-14.541-10.445-38.4-30.925-38.4-32.973 0-0.41 13.414-14.234 29.798-30.618l29.798-29.696 7.27 6.758c34.509 31.949 79.258 52.429 127.283 58.266 10.854 1.229 44.954 1.331 52.634 0 1.946-0.307 6.861-1.024 10.752-1.638 19.558-2.97 40.858-9.83 62.874-20.173 17.203-7.987 40.038-23.962 54.989-38.298l5.222-5.018 29.798 29.798c16.486 16.384 29.901 30.106 29.901 30.618 0 1.024-14.438 14.336-23.962 22.118-43.315 35.328-100.966 60.006-155.75 66.56-2.765 0.41-6.246 0.922-7.68 1.229-6.042 1.229-54.272 1.126-65.741-0.205zM499.2 293.786c-1.126-0.205-4.608-0.922-7.68-1.536-47.411-9.626-81.715-51.712-81.715-100.25-0.102-46.182 30.413-86.118 75.571-98.816 16.896-4.71 39.629-4.301 57.037 1.126 36.454 11.264 64.41 43.213 70.451 80.794 7.68 47.411-18.125 93.696-62.259 111.718-11.981 4.813-21.811 6.758-36.045 7.066-7.27 0.205-14.234 0.102-15.36-0.102z" />
+<glyph unicode="&#xeb70;" glyph-name="wifi_0" d="M498.176 293.683c-21.197-2.97-42.394-13.619-57.856-28.979-19.968-19.763-30.822-45.978-30.515-73.728 0.512-47.616 32.256-86.938 79.667-98.918 11.162-2.765 34.099-2.662 46.080 0.307 30.106 7.578 54.784 27.238 68.198 54.579 21.402 43.52 8.806 97.69-29.594 126.157-18.944 14.131-36.25 20.173-59.085 20.685-7.578 0.205-15.155 0.102-16.896-0.102z" />
+<glyph unicode="&#xeb71;" glyph-name="wifi_1" d="M479.027 464.896c-60.826-6.758-117.862-30.618-164.147-68.506-9.421-7.68-23.040-20.173-23.040-21.094 0-0.512 13.414-14.336 29.798-30.618l29.798-29.798 6.963 6.554c3.789 3.584 11.469 9.933 16.998 14.131 31.027 23.245 64.512 37.274 103.936 43.418 11.571 1.843 43.213 2.458 56.218 1.126 26.419-2.662 49.766-9.318 76.698-22.016 16.998-7.885 40.243-24.064 54.477-37.786l5.734-5.53 29.798 29.798c16.486 16.384 29.901 30.106 29.901 30.618 0 1.126-9.318 9.83-20.582 19.149-44.544 37.376-102.707 62.771-159.13 69.53-2.765 0.41-6.246 0.922-7.68 1.229-6.144 1.229-54.272 1.126-65.741-0.205zM498.176 293.683c-21.197-2.97-42.394-13.619-57.856-28.979-19.968-19.763-30.822-45.978-30.515-73.728 0.512-47.616 32.256-86.938 79.667-98.918 11.162-2.765 34.099-2.662 46.080 0.307 30.106 7.578 54.784 27.238 68.198 54.579 21.402 43.52 8.806 97.69-29.594 126.157-18.944 14.131-36.25 20.173-59.085 20.685-7.578 0.205-15.155 0.102-16.896-0.102z" />
+<glyph unicode="&#xeb72;" glyph-name="wifi_2" d="M496.333 636.826c-0.102-0.102-6.144-0.512-13.517-0.922-7.27-0.307-14.438-0.819-15.872-0.922-1.434-0.205-5.734-0.717-9.728-1.024-20.89-2.15-54.579-8.806-78.234-15.565-35.84-10.342-64-22.016-101.99-42.291-7.168-3.891-20.48-12.083-36.352-22.528-17.408-11.469-43.11-32.256-60.211-48.845l-9.626-9.216 29.901-29.901c26.010-26.010 30.208-29.798 31.539-28.672 0.922 0.717 4.915 4.403 8.909 8.090 6.246 5.939 9.523 8.909 19.763 17.408 1.229 1.126 6.758 5.427 12.288 9.523 61.542 46.49 136.499 74.24 213.197 79.053 10.547 0.614 48.333 0.614 52.429 0 1.843-0.307 6.861-0.819 11.059-1.126 13.312-1.024 33.894-4.198 49.152-7.68 69.939-15.667 135.782-50.995 187.699-100.762 3.379-3.174 6.144-5.734 6.349-5.734s13.722 13.414 30.208 29.901l29.798 29.798-5.939 6.144c-14.848 15.155-44.646 39.117-67.891 54.682-20.070 13.312-49.152 29.594-67.584 37.581-3.686 1.638-8.909 3.994-11.776 5.222-7.373 3.277-28.058 10.957-39.424 14.643-33.178 10.65-59.187 16.077-101.888 21.197-9.933 1.126-61.235 2.867-62.259 1.946zM479.027 464.896c-60.826-6.758-117.862-30.618-164.147-68.506-9.421-7.68-23.040-20.173-23.040-21.094 0-0.512 13.414-14.336 29.798-30.618l29.798-29.798 6.963 6.554c3.789 3.584 11.469 9.933 16.998 14.131 31.027 23.245 64.512 37.274 103.936 43.418 11.571 1.843 43.213 2.458 56.218 1.126 26.419-2.662 49.766-9.318 76.698-22.016 16.998-7.885 40.243-24.064 54.477-37.786l5.734-5.53 29.798 29.798c16.486 16.384 29.901 30.106 29.901 30.618 0 1.126-9.318 9.83-20.582 19.149-44.544 37.376-102.707 62.771-159.13 69.53-2.765 0.41-6.246 0.922-7.68 1.229-6.144 1.229-54.272 1.126-65.741-0.205zM498.176 293.683c-21.197-2.97-42.394-13.619-57.856-28.979-19.968-19.763-30.822-45.978-30.515-73.728 0.512-47.616 32.256-86.938 79.667-98.918 11.162-2.765 34.099-2.662 46.080 0.307 30.106 7.578 54.784 27.238 68.198 54.579 21.402 43.52 8.806 97.69-29.594 126.157-18.944 14.131-36.25 20.173-59.085 20.685-7.578 0.205-15.155 0.102-16.896-0.102z" />
+<glyph unicode="&#xeb73;" glyph-name="wps_pairing" d="M692.736 880.538c-37.888-5.12-69.53-16.794-101.888-37.478-12.083-7.782-28.672-15.053-44.646-19.763-5.018-1.434-19.251-4.403-31.642-6.656-36.352-6.656-70.861-18.739-113.254-39.936-84.173-41.984-148.48-102.912-184.73-175.002-15.36-30.618-27.955-69.632-33.178-102.502-2.458-15.872-3.072-20.48-3.686-28.16-0.307-4.506-0.819-10.957-1.126-14.336-0.614-7.373-0.614-48.333 0-54.784 1.638-16.998 1.741-19.456 0.41-19.558-0.717 0-2.253-0.205-3.379-0.41s-14.029-1.843-28.672-3.482c-14.643-1.741-32.358-3.891-39.424-4.71s-15.053-1.741-17.92-2.048c-6.144-0.717-11.162-1.536-11.469-1.843-1.331-1.331 13.107-52.326 20.48-72.397 22.733-61.952 48.64-106.291 81.715-139.878l9.114-9.318-1.434-7.066c-8.090-38.605 0.102-73.728 22.426-95.949 15.155-15.053 34.304-24.678 60.928-30.515 12.39-2.662 43.52-3.482 58.88-1.536 36.864 4.813 68.71 16.077 99.021 35.021 27.75 17.408 45.67 23.757 89.395 31.642 5.12 0.922 12.083 2.253 15.565 3.174 9.318 2.253 46.387 14.848 60.928 20.787 7.066 2.867 13.005 5.222 13.312 5.222s2.662-3.584 5.12-7.987c7.68-13.005 16.794-24.678 28.877-36.557 25.293-24.883 54.886-40.755 90.112-48.23 11.059-2.355 20.070-2.97 39.014-2.867 30.208 0.307 53.76 6.349 81.92 21.197 28.16 14.746 55.194 41.677 71.373 70.861 23.757 43.008 28.672 95.539 13.414 142.336-14.848 45.67-49.459 85.094-92.57 105.472-4.71 2.253-8.704 4.096-8.909 4.198s0.614 4.301 1.741 9.216c2.458 10.547 5.837 30.003 6.758 38.81 0.307 3.379 0.819 7.066 1.024 8.192 2.458 12.186 2.355 71.987-0.102 87.757l-0.614 3.686 5.427 1.126c6.861 1.331 23.552 4.403 42.394 7.68 7.885 1.434 18.227 3.277 23.040 4.198 4.813 0.819 10.342 1.843 12.288 2.15 7.578 1.229 18.739 3.482 19.149 3.789 0.717 0.717-7.578 31.744-13.005 48.333-23.040 71.475-53.76 126.669-91.853 165.376l-7.578 7.578 1.126 4.71c2.662 11.264 3.482 19.456 3.379 33.28-0.307 47.309-28.058 80.794-77.619 93.798-17.92 4.71-48.845 6.246-69.632 3.379zM666.317 698.982c60.928-21.709 107.725-72.909 132.301-144.896 3.482-9.933 9.318-30.003 9.318-31.744 0-0.41-11.162-2.56-49.152-9.728-16.998-3.174-15.258-1.126-13.414-15.974 1.024-8.397 0.717-54.374-0.41-63.488-2.662-20.89-14.336-65.741-17.306-66.56-39.014-9.626-72.090-29.901-96.666-59.392-18.739-22.323-31.846-48.64-37.786-75.674-1.024-4.71-2.15-5.427-17.203-11.571-14.131-5.837-36.352-13.107-51.098-16.794-6.861-1.638-13.005-3.277-13.722-3.584-0.819-0.205 5.018 5.939 12.8 13.619 56.73 56.115 93.184 120.832 106.291 188.723 3.277 16.794 4.403 32.666 4.096 54.272-0.512 29.901-1.126 33.382-5.222 32.358-2.253-0.614-72.397-13.722-76.083-14.234-1.946-0.307-2.867 3.994-3.789 17.203-4.403 59.699 10.854 119.398 42.598 166.912 12.39 18.432 27.443 36.25 34.611 40.653 10.138 6.246 22.118 6.246 39.834-0.102zM503.501 678.195c-56.422-54.989-95.539-124.109-107.622-190.259-1.536-8.499-1.843-10.752-3.584-26.624-0.922-8.090-0.614-46.080 0.41-52.224 1.229-7.578 1.536-8.294 3.379-7.782 0.922 0.307 11.878 2.458 24.269 4.71 36.762 6.861 50.074 9.318 52.326 9.728 2.662 0.614 3.277-1.536 4.198-16.896 2.56-38.195-1.843-72.909-13.619-108.134-9.523-28.365-24.269-55.091-44.134-79.77-16.486-20.48-22.733-24.576-37.683-24.371-10.752 0-22.016 3.379-38.912 11.469-49.459 23.654-87.45 66.662-110.592 125.44-4.71 11.981-14.234 43.52-13.414 44.339 0.205 0.205 6.554 1.536 14.029 2.97 7.578 1.434 19.968 3.686 27.546 5.12 15.36 2.867 21.504 4.198 22.016 4.71 0.205 0.102-0.307 5.12-1.024 11.059-2.355 19.968-1.434 55.501 2.048 77.312 2.253 13.619 8.499 38.298 11.674 46.080 0.512 1.126 2.15 5.53 3.686 9.728 3.891 10.445 12.288 27.341 19.558 38.912 24.474 39.526 60.928 71.885 106.906 94.822 18.125 9.011 28.262 13.21 47.821 19.763 12.493 4.198 39.117 11.878 42.701 12.288 0.512 0.102-4.915-5.53-11.981-12.39zM793.088 317.44c25.907-5.427 45.978-16.384 65.024-35.328 18.944-18.842 29.798-38.912 35.533-65.536 1.331-6.554 1.843-12.902 1.741-25.6 0-14.746-0.41-18.33-2.867-28.16-6.246-25.293-18.227-46.080-36.659-63.59-44.237-41.779-110.899-46.797-161.075-12.186-9.318 6.451-26.419 23.757-32.358 32.768-9.933 14.848-16.282 30.208-20.070 47.616-1.331 6.554-1.843 12.902-1.741 25.6 0.102 14.746 0.41 18.33 2.867 28.16 13.005 53.248 55.706 91.034 110.694 98.099 7.168 0.922 31.232-0.205 38.912-1.843zM749.568 293.069c-1.434-0.614-3.584-3.277-4.813-5.837-2.253-4.403-2.355-5.325-2.355-37.069v-32.563h-32.563c-31.744 0-32.666-0.102-37.069-2.253-2.56-1.331-5.222-3.482-5.837-4.915-0.922-1.741-1.331-7.885-1.331-18.534 0-14.848 0.205-16.179 2.355-19.354 3.789-5.632 6.042-5.939 41.984-6.042l32.461-0.102v-31.949c0-28.979 0.205-32.461 1.946-36.25 3.584-7.987 5.325-8.602 23.347-8.602 17.203 0 19.968 0.717 23.45 5.837 1.843 2.662 1.946 5.427 2.253 36.864l0.307 33.997 33.997 0.307c31.437 0.307 34.202 0.41 36.864 2.253 5.12 3.482 5.837 6.246 5.837 23.142s-0.717 19.661-5.837 23.142c-2.662 1.843-5.427 1.946-36.864 2.253l-34.099 0.307-0.102 32.461c-0.102 35.84-0.41 38.093-6.042 41.984-3.174 2.048-4.506 2.253-19.354 2.253-10.65 0-16.794-0.41-18.534-1.331z" />
+<glyph unicode="&#xeb74;" glyph-name="WPT" d="M507.904 907.981c-3.584-1.638-6.144-4.096-7.168-6.758-0.614-1.638-1.024-11.469-1.024-23.245v-20.378h-8.602c-13.619 0-21.504-3.789-26.931-13.107-2.765-4.608-2.867-5.427-3.277-21.402l-0.307-16.691h-7.68c-8.806 0-12.8-1.638-15.667-6.451-1.843-2.97-2.048-5.222-2.048-23.962v-20.787l9.83-12.8 9.83-12.902-0.614-5.325c-0.307-2.97-0.819-8.499-1.126-12.493-1.331-14.541-3.584-33.792-7.27-61.44-15.77-118.067-49.664-241.664-92.262-336.384-4.198-9.318-7.885-17.51-8.192-18.227-0.41-1.024 7.987-1.229 41.677-1.024l42.189 0.307 2.458 6.144c1.434 3.379 2.97 7.066 3.482 8.192 8.704 18.33 31.027 82.432 42.496 121.651l5.12 17.101h58.47l3.379-11.469c7.475-26.112 16.794-55.296 23.142-72.499 11.162-30.413 13.414-36.352 24.371-62.976l2.56-6.144 42.189-0.307c33.69-0.205 42.086 0 41.677 1.024-0.307 0.717-3.891 8.704-7.885 17.715-30.515 68.198-57.139 151.45-74.24 232.448-6.656 31.027-14.336 75.264-18.432 105.472-1.434 10.752-2.765 20.89-3.072 22.528-0.205 1.741-0.614 5.427-0.922 8.192-1.126 10.65-3.686 36.045-4.301 41.677l-0.614 5.939 9.83 12.698 9.83 12.8v20.787c0 18.842-0.205 21.094-2.048 24.064-2.867 4.813-6.861 6.451-15.872 6.451h-7.68v14.643c0 17.818-1.331 22.63-7.885 28.979-5.632 5.53-11.674 7.578-22.426 7.578h-8.499l-0.614 44.032-3.174 3.174c-3.277 3.174-9.421 4.813-12.698 3.174zM306.688 222.003c-14.029-25.805-26.214-48.23-27.136-49.971-0.922-1.638-3.584-6.554-5.837-10.752s-12.595-23.142-22.835-41.984c-10.24-18.842-20.48-37.786-22.835-41.984-2.253-4.198-5.325-9.933-6.861-12.8-1.536-2.765-10.342-18.944-19.456-35.84-9.216-16.896-18.022-33.178-19.661-36.045l-3.072-5.427h153.805l0.102 5.632c0.102 3.072 0.205 6.451 0.307 7.475 0.102 0.922 0.614 5.222 1.024 9.421 1.126 10.547 6.042 29.901 10.24 40.858 23.962 62.054 76.595 103.936 143.462 114.278 2.253 0.41 11.674 0.819 20.992 1.024 21.504 0.512 38.093-1.843 57.856-8.090 60.109-19.046 107.418-71.168 120.32-132.71 2.253-10.752 4.096-25.6 4.096-32.973v-4.915h153.702l-2.97 5.427c-3.891 6.963-21.811 40.038-27.136 49.869-2.253 4.198-4.813 9.114-5.837 10.752-1.024 1.741-3.584 6.554-5.837 10.752s-5.222 9.728-6.656 12.288c-2.765 4.915-19.354 35.533-26.214 48.128-2.253 4.198-12.186 22.528-22.118 40.755s-18.022 33.28-18.022 33.485c0 0.205-1.331 2.662-2.867 5.325-1.638 2.662-5.325 9.523-8.397 15.155-2.97 5.632-6.144 11.674-7.168 13.312-1.024 1.741-3.379 6.042-5.325 9.728s-6.042 11.162-8.909 16.691l-5.427 9.933h-360.038l-25.293-46.797z" />
+<glyph unicode="&#xeb75;" glyph-name="zoom_in" d="M402.33 857.19c-0.205-0.205-4.301-0.614-9.114-1.024-21.709-1.638-49.050-7.373-71.782-14.95-88.883-29.594-160.461-96.768-195.789-183.808-14.95-36.966-22.118-72.806-22.733-114.688-0.512-32.358 2.048-54.784 9.318-83.763 16.179-64.41 52.736-122.675 104.346-166.298 32.154-27.238 71.373-48.538 112.128-61.030 17.408-5.325 39.117-9.933 53.76-11.469 3.379-0.41 7.27-0.922 8.704-1.229 6.656-1.229 48.538-1.126 61.542 0.205 54.067 5.427 103.117 22.835 146.637 51.917l9.011 6.042 117.146-117.146c73.728-73.728 118.579-117.862 121.037-119.091 5.632-2.765 16.896-2.56 22.323 0.307 4.608 2.458 46.49 43.93 49.869 49.459 3.174 5.12 3.174 17.203 0 23.142-1.331 2.765-44.339 46.387-118.989 121.139l-116.838 116.736 6.042 9.011c27.034 40.448 45.466 90.010 50.893 137.011 0.307 2.867 1.024 8.602 1.536 12.8 0.922 8.090 0.512 52.941-0.512 59.904-0.307 2.253-1.331 8.909-2.15 14.848-14.234 101.581-80.384 192.205-174.182 239.002-31.027 15.462-68.198 26.829-101.171 30.822-2.765 0.307-6.758 0.819-8.704 1.126-3.994 0.614-51.712 1.536-52.326 1.024zM450.048 753.664c50.176-7.578 91.75-28.058 125.952-62.362 34.509-34.611 55.398-77.005 62.464-126.566 1.434-9.933 1.434-42.496 0-53.248-4.608-35.43-15.872-65.536-35.635-95.232-32.358-48.64-86.016-83.558-143.053-93.082-3.686-0.614-8.294-1.331-10.24-1.741-7.782-1.229-43.622-1.229-53.658 0.102-50.586 6.861-93.696 28.262-128.614 63.898-31.334 31.949-51.405 70.963-59.392 115.302-3.174 17.51-3.482 50.79-0.717 68.608 11.059 71.885 54.477 131.277 119.296 163.328 24.269 11.981 48.742 18.944 77.005 21.811 5.222 0.512 41.779-0.102 46.592-0.819zM401.101 676.966c-5.632-2.048-10.547-6.246-13.722-11.674l-2.867-4.813-0.307-42.189-0.307-42.291h-40.141c-24.474 0-41.677-0.41-43.93-1.024-5.734-1.638-12.186-7.066-15.053-12.8-2.458-4.71-2.662-6.144-2.97-22.835-0.41-20.787 0.717-25.702 7.066-32.051 7.885-7.885 5.734-7.578 52.941-7.885l42.189-0.307v-40.243c0-43.622 0.205-45.261 5.734-52.531 1.331-1.843 4.71-4.608 7.373-6.144 4.71-2.765 5.325-2.867 22.938-3.174 21.606-0.512 26.214 0.614 33.075 7.475 7.475 7.475 7.68 8.602 7.68 54.477v40.243h39.834c45.67 0 47.514 0.307 55.091 7.782 6.246 6.246 7.475 11.469 7.475 31.13 0 19.046-1.229 23.757-7.68 30.208-7.475 7.475-8.602 7.68-54.374 7.68h-40.243l-0.307 42.291-0.307 42.189-2.765 4.71c-3.174 5.427-8.192 9.626-14.234 11.674-5.734 2.048-36.557 2.048-42.189 0.102z" />
+<glyph unicode="&#xeb76;" glyph-name="zoom_out" d="M402.33 857.19c-0.205-0.205-4.301-0.614-9.114-1.024-21.709-1.638-49.050-7.373-71.782-14.95-88.883-29.594-160.461-96.768-195.789-183.808-14.95-36.966-22.118-72.806-22.733-114.688-0.512-32.358 2.048-54.784 9.318-83.763 16.179-64.41 52.736-122.675 104.346-166.298 32.154-27.238 71.373-48.538 112.128-61.030 17.408-5.325 39.117-9.933 53.76-11.469 3.379-0.41 7.27-0.922 8.704-1.229 6.656-1.229 48.538-1.126 61.542 0.205 54.067 5.427 103.117 22.835 146.637 51.917l9.011 6.042 117.146-117.146c73.728-73.728 118.579-117.862 121.037-119.091 5.632-2.765 16.896-2.56 22.323 0.307 4.608 2.458 46.49 43.93 49.869 49.459 3.174 5.12 3.174 17.203 0 23.142-1.331 2.765-44.339 46.387-118.989 121.139l-116.838 116.736 6.042 9.011c27.034 40.448 45.466 90.010 50.893 137.011 0.307 2.867 1.024 8.602 1.536 12.8 0.922 8.090 0.512 52.941-0.512 59.904-0.307 2.253-1.331 8.909-2.15 14.848-14.234 101.581-80.384 192.205-174.182 239.002-31.027 15.462-68.198 26.829-101.171 30.822-2.765 0.307-6.758 0.819-8.704 1.126-3.994 0.614-51.712 1.536-52.326 1.024zM450.048 753.664c50.176-7.578 91.75-28.058 125.952-62.362 30.822-30.925 50.893-67.994 59.29-109.568 3.584-17.715 3.789-19.558 4.198-40.55 0.41-20.173-0.717-32.666-4.506-50.176-18.534-84.89-86.63-150.938-172.544-167.322-12.8-2.458-21.606-3.174-40.55-3.174-19.968 0.102-27.75 0.717-41.984 3.789-44.851 9.421-81.306 29.184-112.64 61.133s-51.405 70.963-59.392 115.302c-3.174 17.51-3.482 50.79-0.717 68.608 11.059 71.885 54.477 131.277 119.296 163.328 24.269 11.981 48.742 18.944 77.005 21.811 5.222 0.512 41.779-0.102 46.592-0.819zM298.598 574.464c-5.734-2.048-10.957-6.656-13.926-12.39-2.355-4.608-2.56-6.144-2.867-22.733-0.41-20.787 0.717-25.702 7.066-32.051 8.294-8.294-3.994-7.578 130.97-7.885 136.090-0.307 127.488-0.717 135.885 7.578 6.246 6.246 7.475 11.469 7.475 31.13 0 19.046-1.229 23.757-7.68 30.208-8.090 8.192 0.614 7.68-133.53 7.68-98.816-0.102-120.115-0.307-123.392-1.536z" />
+<glyph unicode="&#xeb77;" glyph-name="checkbox_tick" d="M384.019 320.019l-192.064 192-127.936-128 320-320.064 640 640-128 128.064-512-512z" />
+<glyph unicode="&#xeb78;" glyph-name="frame-connectivity" d="M921.598 38.406l-409.612 117.278-409.591-117.278v643.277l409.706 175.923 409.497-175.923v-643.277zM0-64h1024v1024.004h-1024v-1024.004z" />
+<glyph unicode="&#xeb79;" glyph-name="frame-my-customers" d="M926.005 313.485c-13.586-41.839-69.68-62.387-95.022-97.211-25.601-35.174-27.982-94.78-63.156-120.377-34.824-25.345-92.124-9.36-133.964-22.946-40.365-13.106-77.126-60.151-121.866-60.151-44.736 0-81.497 47.041-121.866 60.151-41.839 13.586-99.136-2.399-133.964 22.946-35.174 25.598-37.555 85.203-63.156 120.377-25.341 34.824-81.435 55.371-95.018 97.207-13.11 40.369 19.764 89.78 19.764 134.52 0 44.736-32.873 94.144-19.767 134.513 13.586 41.839 69.68 62.387 95.022 97.211 25.601 35.174 27.982 94.78 63.156 120.377 34.828 25.345 92.124 9.36 133.964 22.946 40.365 13.106 77.126 60.151 121.866 60.151 44.736 0 81.497-47.041 121.866-60.151 41.839-13.586 99.136 2.399 133.964-22.946 35.174-25.598 37.555-85.203 63.156-120.377 25.341-34.824 81.435-55.371 95.022-97.207 13.106-40.369-19.767-89.78-19.767-134.516 0-44.74 32.873-94.147 19.767-134.516zM0-64h1023.996v1024h-1023.996v-1024z" />
+<glyph unicode="&#xeb7a;" glyph-name="frame-performance" d="M931.837 267.764c-120.366-24.434-215.17-119.239-239.604-239.604h-360.476c-24.434 120.366-119.235 215.17-239.601 239.604v360.472c120.366 24.438 215.166 119.239 239.601 239.604h360.476c24.434-120.366 119.239-215.17 239.604-239.604v-360.472zM0-64h1023.996v1024h-1023.996v-1024z" />
+<glyph unicode="&#xeb7b;" glyph-name="frame-security" d="M921.598 422.395c0-309.388-409.601-384.004-409.601-384.004s-409.598 74.615-409.598 384.004l-0.004 435.207h819.203v-435.207zM0-64h1024v1024h-1024v-1024z" />
+<glyph unicode="&#xeb7c;" glyph-name="frame-teamwork" d="M921.595 204.794l-409.596-204.796-409.6 204.796v486.408l409.6 204.8 409.596-204.8v-486.408zM0-64h1023.996v1024h-1023.996v-1024z" />
+<glyph unicode="&#xeb7d;" glyph-name="popout-connectivity" d="M1024.005-64l-512.016 146.598-511.989-146.598v804.096l512.133 219.904 511.871-219.904v-804.096z" />
+<glyph unicode="&#xeb7e;" glyph-name="popout-my-customers" d="M998.767 289.344c-15.994-49.252-82.026-73.441-111.858-114.435-30.137-41.407-32.94-111.573-74.346-141.706-40.994-29.835-108.447-11.018-157.699-27.012-47.517-15.428-90.791-70.808-143.458-70.808-52.663 0-95.936 55.376-143.458 70.808-49.252 15.994-116.701-2.824-157.699 27.012-41.407 30.133-44.209 100.299-74.346 141.706-29.831 40.994-95.864 65.182-111.853 114.43-15.432 47.522 23.265 105.687 23.265 158.354 0 52.663-38.698 110.824-23.27 158.346 15.994 49.252 82.026 73.441 111.858 114.435 30.137 41.407 32.94 111.573 74.346 141.706 40.998 29.835 108.447 11.018 157.699 27.012 47.517 15.428 90.791 70.808 143.458 70.808 52.663 0 95.936-55.376 143.458-70.808 49.252-15.994 116.701 2.824 157.699-27.012 41.407-30.133 44.209-100.299 74.346-141.706 29.831-40.994 95.864-65.182 111.858-114.43 15.428-47.522-23.27-105.687-23.27-158.35 0-52.667 38.698-110.828 23.27-158.35z" />
+<glyph unicode="&#xeb7f;" glyph-name="popout-performance" d="M1024 228.2c-146.787-29.798-262.402-145.413-292.2-292.2h-439.604c-29.798 146.787-145.408 262.402-292.196 292.2v439.6c146.787 29.802 262.398 145.413 292.196 292.2h439.604c29.798-146.787 145.413-262.402 292.2-292.2v-439.6z" />
+<glyph unicode="&#xeb80;" glyph-name="popout-security" d="M1023.991 415.999c0-386.731-511.995-479.999-511.995-479.999s-511.991 93.268-511.991 479.999l-0.005 544.001h1023.991v-544.001z" />
+<glyph unicode="&#xeb81;" glyph-name="popout-teamwork" d="M980.938 169.947l-468.17-234.083-468.174 234.083v555.966l468.174 234.087 468.17-234.087v-555.966z" />
+</font></defs></svg> \ No newline at end of file
diff --git a/dashboard/public/fonts/icon-orange.ttf b/dashboard/public/fonts/icon-orange.ttf
new file mode 100644
index 00000000..a2dbfc83
--- /dev/null
+++ b/dashboard/public/fonts/icon-orange.ttf
Binary files differ
diff --git a/dashboard/public/fonts/icon-orange.woff b/dashboard/public/fonts/icon-orange.woff
new file mode 100644
index 00000000..629ec7e6
--- /dev/null
+++ b/dashboard/public/fonts/icon-orange.woff
Binary files differ
diff --git a/dashboard/public/fonts/icon-orange.woff2 b/dashboard/public/fonts/icon-orange.woff2
new file mode 100644
index 00000000..82cd64df
--- /dev/null
+++ b/dashboard/public/fonts/icon-orange.woff2
Binary files differ
diff --git a/dashboard/public/img/ORANGE_LOGO_rgb.jpg b/dashboard/public/img/ORANGE_LOGO_rgb.jpg
new file mode 100644
index 00000000..1f02c46b
--- /dev/null
+++ b/dashboard/public/img/ORANGE_LOGO_rgb.jpg
Binary files differ
diff --git a/dashboard/public/img/orange_logo.svg b/dashboard/public/img/orange_logo.svg
new file mode 100644
index 00000000..3f9aedeb
--- /dev/null
+++ b/dashboard/public/img/orange_logo.svg
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 283.46 283.46"> <defs> <style>.cls-1{fill:#ff7900;}.cls-2,.cls-3{fill:#fff;} @media all and (max-width: 49.98px) { .cls-2 { display: none; } } @media all and (min-width: 50px) { .cls-3 { display: none; } } </style> </defs> <title>Master_Logo_RGB</title> <rect class="cls-1" width="283.46" height="283.46"/> <rect x="40.51" y="202.47" class="cls-3" width="202.47" height="40.5"/> <path class="cls-2" d="M111.2,256a23.23,23.23,0,0,1-13,3.92c-7.36,0-11.71-4.9-11.71-11.46,0-8.83,8.12-13.51,24.85-15.4v-2.19c0-2.87-2.18-4.53-6.2-4.53a11.76,11.76,0,0,0-9.61,4.53l-7-4q5.52-7.71,16.82-7.7c10.28,0,16,4.45,16,11.7,0,0,0,28.52,0,28.6h-9.2Zm-14.55-8.3c0,2.65,1.67,5.13,4.68,5.13,3.27,0,6.44-1.36,9.62-4.16v-9.34C101.25,240.56,96.65,243.05,96.65,247.72Z"/> <path class="cls-2" d="M129.54,221.07l8.59-1.19.94,4.68c4.85-3.55,8.7-5.44,13.55-5.44,8.12,0,12.3,4.31,12.3,12.84v27.47H154.55V233.77c0-4.83-1.26-7-5-7-3.1,0-6.19,1.43-9.71,4.38v28.3H129.54Z"/> <path class="cls-2" d="M233.69,260.18c-11.63,0-18.57-7.47-18.57-20.45s7-20.61,18.4-20.61,18.15,7.25,18.15,20.08c0,.68-.08,1.36-.08,2H225.32c.08,7.47,3.18,11.24,9.29,11.24,3.93,0,6.52-1.58,8.95-5l7.61,4.22C247.82,257.24,241.8,260.18,233.69,260.18Zm7.78-25.66c0-5.28-3-8.38-7.95-8.38-4.68,0-7.61,3-8,8.38Z"/> <path class="cls-2" d="M34.89,260.61c-10.27,0-19.52-6.54-19.52-20.82S24.62,219,34.89,219s19.52,6.55,19.52,20.82S45.15,260.61,34.89,260.61Zm0-32.86c-7.75,0-9.19,7-9.19,12s1.44,12.05,9.19,12.05,9.19-7,9.19-12.05S42.64,227.75,34.89,227.75Z"/> <path class="cls-2" d="M61.53,220H71.4v4.64a15.29,15.29,0,0,1,10.87-5.45,8.6,8.6,0,0,1,1.34.07V229h-.5c-4.52,0-9.46.7-11,4.21v26.24H61.53Z"/> <path class="cls-2" d="M190.34,251c7.88-.06,8.54-8.07,8.54-13.31,0-6.16-3-11.18-8.61-11.18-3.73,0-7.89,2.72-7.89,11.61C182.38,243,182.72,251.05,190.34,251Zm18.52-31.12v37.35c0,6.6-.5,17.45-19.31,17.57-7.75,0-14.94-3.05-16.38-9.83l10.25-1.65c.43,1.94,1.61,3.88,7.42,3.88,5.39,0,8-2.58,8-8.75v-4.59l-.14-.14c-1.65,2.94-4.16,5.74-10.19,5.74-9.19,0-16.44-6.38-16.44-19.72,0-13.19,7.47-20.57,15.86-20.58,7.87,0,10.79,3.57,11.46,5.46l-.12,0,.85-4.72Z"/> <path class="cls-2" d="M255.75,206.79h-4.08v11.3h-2.16v-11.3h-4.08v-1.74h10.32Zm17,11.3h-2.15V207.2h-.07l-4.27,10.89h-1.36l-4.27-10.89h-.06v10.89h-2.15v-13h3.32l3.89,9.9,3.83-9.9h3.29Z"/> </svg> \ No newline at end of file
diff --git a/dashboard/public/index.html b/dashboard/public/index.html
new file mode 100644
index 00000000..b432acb2
--- /dev/null
+++ b/dashboard/public/index.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width,initial-scale=1.0">
+ <link rel="icon" href="./favicon.ico">
+
+ <!--
+ Neue Helvetica is a trademark of Monotype Imaging Inc. registered in the U.S.
+ Patent and Trademark Office and may be registered in certain other jurisdictions.
+ Copyright © 2014 Monotype Imaging Inc. All rights reserved.
+ Orange Company had buy the right for used Helvetica onto digital applications.
+ If you are not autorized to used it, don't include the orangeHelvetica.css
+ See NOTICE.txt for more informations.
+ -->
+ <link rel="stylesheet" href="./css/orangeHelvetica.css" />
+ <!--
+ Orange Icons
+ Copyright (C) 2016 - 2019 Orange SA All rights reserved
+ See NOTICE.txt for more informations.
+ -->
+ <link rel="stylesheet" href="./css/orangeIcons.css" />
+
+ <!-- Boosted CSS -->
+ <link rel="stylesheet" href="./css/boosted.min.css" />
+
+ <link rel="stylesheet" href="./css/font-awesome.min.css" />
+
+ <link rel="stylesheet" href="./css/moon.css" />
+
+ <title>Moon</title>
+ </head>
+ <body>
+ <noscript>
+ <strong>We're sorry but moon_ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+ </noscript>
+ <main id="content" role="main" class="container">
+ <div id="app"></div>
+ </main>
+
+ <!-- built files will be auto injected -->
+ </body>
+</html>
diff --git a/dashboard/public/js/boosted.bundle.js b/dashboard/public/js/boosted.bundle.js
new file mode 100644
index 00000000..75cdc627
--- /dev/null
+++ b/dashboard/public/js/boosted.bundle.js
@@ -0,0 +1,8233 @@
+/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://boosted.orange.com)
+ * Copyright 2011-2019 The Boosted Authors (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
+ typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
+ (global = global || self, factory(global.boosted = {}, global.jQuery));
+}(this, function (exports, $) { 'use strict';
+
+ $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function _objectSpread(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+ var ownKeys = Object.keys(source);
+
+ if (typeof Object.getOwnPropertySymbols === 'function') {
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
+ }));
+ }
+
+ ownKeys.forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ }
+
+ return target;
+ }
+
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ subClass.__proto__ = superClass;
+ }
+
+ /**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): util.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+ /**
+ * ------------------------------------------------------------------------
+ * Private TransitionEnd Helpers
+ * ------------------------------------------------------------------------
+ */
+
+ var TRANSITION_END = 'transitionend';
+ var MAX_UID = 1000000;
+ var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
+
+ function toType(obj) {
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
+ }
+
+ function getSpecialTransitionEndEvent() {
+ return {
+ bindType: TRANSITION_END,
+ delegateType: TRANSITION_END,
+ handle: function handle(event) {
+ if ($(event.target).is(this)) {
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
+ }
+
+ return undefined; // eslint-disable-line no-undefined
+ }
+ };
+ }
+
+ function transitionEndEmulator(duration) {
+ var _this = this;
+
+ var called = false;
+ $(this).one(Util.TRANSITION_END, function () {
+ called = true;
+ });
+ setTimeout(function () {
+ if (!called) {
+ Util.triggerTransitionEnd(_this);
+ }
+ }, duration);
+ return this;
+ }
+
+ function setTransitionEndSupport() {
+ $.fn.emulateTransitionEnd = transitionEndEmulator;
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
+ }
+ /**
+ * --------------------------------------------------------------------------
+ * Public Util Api
+ * --------------------------------------------------------------------------
+ */
+
+
+ var Util = {
+ TRANSITION_END: 'bsTransitionEnd',
+ getUID: function getUID(prefix) {
+ do {
+ // eslint-disable-next-line no-bitwise
+ prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
+ } while (document.getElementById(prefix));
+
+ return prefix;
+ },
+ getSelectorFromElement: function getSelectorFromElement(element) {
+ var selector = element.getAttribute('data-target');
+
+ if (!selector || selector === '#') {
+ var hrefAttr = element.getAttribute('href');
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
+ }
+
+ try {
+ return document.querySelector(selector) ? selector : null;
+ } catch (err) {
+ return null;
+ }
+ },
+ getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
+ if (!element) {
+ return 0;
+ } // Get transition-duration of the element
+
+
+ var transitionDuration = $(element).css('transition-duration');
+ var transitionDelay = $(element).css('transition-delay');
+ var floatTransitionDuration = parseFloat(transitionDuration);
+ var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
+
+ if (!floatTransitionDuration && !floatTransitionDelay) {
+ return 0;
+ } // If multiple durations are defined, take the first
+
+
+ transitionDuration = transitionDuration.split(',')[0];
+ transitionDelay = transitionDelay.split(',')[0];
+ return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
+ },
+ reflow: function reflow(element) {
+ return element.offsetHeight;
+ },
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
+ $(element).trigger(TRANSITION_END);
+ },
+ // TODO: Remove in v5
+ supportsTransitionEnd: function supportsTransitionEnd() {
+ return Boolean(TRANSITION_END);
+ },
+ isElement: function isElement(obj) {
+ return (obj[0] || obj).nodeType;
+ },
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
+ for (var property in configTypes) {
+ if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
+ var expectedTypes = configTypes[property];
+ var value = config[property];
+ var valueType = value && Util.isElement(value) ? 'element' : toType(value);
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
+ }
+ }
+ }
+ },
+ findShadowRoot: function findShadowRoot(element) {
+ if (!document.documentElement.attachShadow) {
+ return null;
+ } // Can find the shadow root otherwise it'll return the document
+
+
+ if (typeof element.getRootNode === 'function') {
+ var root = element.getRootNode();
+ return root instanceof ShadowRoot ? root : null;
+ }
+
+ if (element instanceof ShadowRoot) {
+ return element;
+ } // when we don't find a shadow root
+
+
+ if (!element.parentNode) {
+ return null;
+ }
+
+ return Util.findShadowRoot(element.parentNode);
+ }
+ };
+ setTransitionEndSupport();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'alert';
+ var VERSION = '4.3.1';
+ var DATA_KEY = 'bs.alert';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var Selector = {
+ DISMISS: '[data-dismiss="alert"]'
+ };
+ var Event = {
+ CLOSE: "close" + EVENT_KEY,
+ CLOSED: "closed" + EVENT_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ ALERT: 'alert',
+ FADE: 'fade',
+ SHOW: 'show'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Alert =
+ /*#__PURE__*/
+ function () {
+ function Alert(element) {
+ this._element = element;
+ } // Getters
+
+
+ var _proto = Alert.prototype;
+
+ // Public
+ _proto.close = function close(element) {
+ var rootElement = this._element;
+
+ if (element) {
+ rootElement = this._getRootElement(element);
+ }
+
+ var customEvent = this._triggerCloseEvent(rootElement);
+
+ if (customEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._removeElement(rootElement);
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ this._element = null;
+ } // Private
+ ;
+
+ _proto._getRootElement = function _getRootElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ var parent = false;
+
+ if (selector) {
+ parent = document.querySelector(selector);
+ }
+
+ if (!parent) {
+ parent = $(element).closest("." + ClassName.ALERT)[0];
+ }
+
+ return parent;
+ };
+
+ _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
+ var closeEvent = $.Event(Event.CLOSE);
+ $(element).trigger(closeEvent);
+ return closeEvent;
+ };
+
+ _proto._removeElement = function _removeElement(element) {
+ var _this = this;
+
+ $(element).removeClass(ClassName.SHOW);
+
+ if (!$(element).hasClass(ClassName.FADE)) {
+ this._destroyElement(element);
+
+ return;
+ }
+
+ var transitionDuration = Util.getTransitionDurationFromElement(element);
+ $(element).one(Util.TRANSITION_END, function (event) {
+ return _this._destroyElement(element, event);
+ }).emulateTransitionEnd(transitionDuration);
+ };
+
+ _proto._destroyElement = function _destroyElement(element) {
+ $(element).detach().trigger(Event.CLOSED).remove();
+ } // Static
+ ;
+
+ Alert._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $(this);
+ var data = $element.data(DATA_KEY);
+
+ if (!data) {
+ data = new Alert(this);
+ $element.data(DATA_KEY, data);
+ }
+
+ if (config === 'close') {
+ data[config](this);
+ }
+ });
+ };
+
+ Alert._handleDismiss = function _handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault();
+ }
+
+ alertInstance.close(this);
+ };
+ };
+
+ _createClass(Alert, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Alert;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Alert._jQueryInterface;
+ $.fn[NAME].Constructor = Alert;
+
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Alert._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$1 = 'button';
+ var VERSION$1 = '4.3.1';
+ var DATA_KEY$1 = 'bs.button';
+ var EVENT_KEY$1 = "." + DATA_KEY$1;
+ var DATA_API_KEY$1 = '.data-api';
+ var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];
+ var ClassName$1 = {
+ ACTIVE: 'active',
+ BUTTON: 'btn',
+ FOCUS: 'focus'
+ };
+ var Selector$1 = {
+ DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
+ DATA_TOGGLE: '[data-toggle="buttons"]',
+ INPUT: 'input:not([type="hidden"])',
+ ACTIVE: '.active',
+ BUTTON: '.btn'
+ };
+ var Event$1 = {
+ CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
+ FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Button =
+ /*#__PURE__*/
+ function () {
+ function Button(element) {
+ this._element = element;
+ } // Getters
+
+
+ var _proto = Button.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];
+
+ var input = this._element.querySelector(Selector$1.INPUT);
+
+ if (rootElement) {
+ var activeElement = rootElement.querySelector(Selector$1.ACTIVE);
+
+ if (activeElement) {
+ activeElement.classList.remove(ClassName$1.ACTIVE);
+ }
+ }
+
+ if (input) {
+ if (input.checked) {
+ this._element.classList.add(ClassName$1.ACTIVE);
+ } else {
+ this._element.classList.remove(ClassName$1.ACTIVE);
+ }
+ } else {
+ this._element.classList.toggle(ClassName$1.ACTIVE);
+
+ this._element.setAttribute('aria-pressed', this._element.classList.contains(ClassName$1.ACTIVE));
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$1);
+ this._element = null;
+ } // Static
+ ;
+
+ Button._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$1);
+
+ if (!data) {
+ data = new Button(this);
+ $(this).data(DATA_KEY$1, data);
+ }
+
+ if (config === 'toggle') {
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Button, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$1;
+ }
+ }]);
+
+ return Button;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
+ var button = event.target;
+
+ if (!$(button).hasClass(ClassName$1.BUTTON)) {
+ button = $(button).closest(Selector$1.BUTTON);
+ }
+
+ Button._jQueryInterface.call($(button), 'toggle');
+ }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
+ var button = $(event.target).closest(Selector$1.BUTTON)[0];
+
+ if (button) {
+ $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
+ }
+ }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT > Selector$1.INPUT, function (event) {
+ var button = $(event.target).closest(Selector$1.BUTTON)[0];
+
+ if (button) {
+ $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$1] = Button._jQueryInterface;
+ $.fn[NAME$1].Constructor = Button;
+
+ $.fn[NAME$1].noConflict = function () {
+ $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;
+ return Button._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$2 = 'carousel';
+ var VERSION$2 = '4.3.1';
+ var DATA_KEY$2 = 'bs.carousel';
+ var EVENT_KEY$2 = "." + DATA_KEY$2;
+ var DATA_API_KEY$2 = '.data-api';
+ var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];
+ var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
+
+ var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
+
+ var SWIPE_THRESHOLD = 40;
+ var Default = {
+ interval: 5000,
+ keyboard: true,
+ slide: false,
+ pause: 'hover',
+ wrap: true,
+ touch: true
+ };
+ var DefaultType = {
+ interval: '(number|boolean)',
+ keyboard: 'boolean',
+ slide: '(boolean|string)',
+ pause: '(string|boolean)',
+ wrap: 'boolean',
+ touch: 'boolean'
+ };
+ var Direction = {
+ NEXT: 'next',
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
+ };
+ var Event$2 = {
+ SLIDE: "slide" + EVENT_KEY$2,
+ SLID: "slid" + EVENT_KEY$2,
+ KEYDOWN: "keydown" + EVENT_KEY$2,
+ MOUSEENTER: "mouseenter" + EVENT_KEY$2,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY$2,
+ TOUCHSTART: "touchstart" + EVENT_KEY$2,
+ TOUCHMOVE: "touchmove" + EVENT_KEY$2,
+ TOUCHEND: "touchend" + EVENT_KEY$2,
+ POINTERDOWN: "pointerdown" + EVENT_KEY$2,
+ POINTERUP: "pointerup" + EVENT_KEY$2,
+ DRAG_START: "dragstart" + EVENT_KEY$2,
+ LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2,
+ CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2
+ };
+ var ClassName$2 = {
+ CAROUSEL: 'carousel',
+ ACTIVE: 'active',
+ SLIDE: 'slide',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
+ ITEM: 'carousel-item',
+ POINTER_EVENT: 'pointer-event'
+ };
+ var Selector$2 = {
+ ACTIVE: '.active',
+ ACTIVE_ITEM: '.active.carousel-item',
+ ITEM: '.carousel-item',
+ ITEM_IMG: '.carousel-item img',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
+ INDICATORS: '.carousel-indicators',
+ DATA_SLIDE: '[data-slide], [data-slide-to]',
+ DATA_RIDE: '[data-ride="carousel"]'
+ };
+ var PointerType = {
+ TOUCH: 'touch',
+ PEN: 'pen'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Carousel =
+ /*#__PURE__*/
+ function () {
+ function Carousel(element, config) {
+ this._items = null;
+ this._interval = null;
+ this._activeElement = null;
+ this._isPaused = false;
+ this._isSliding = false;
+ this.touchTimeout = null;
+ this.touchStartX = 0;
+ this.touchDeltaX = 0;
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);
+ this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
+ this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
+
+ this._addEventListeners();
+ } // Getters
+
+
+ var _proto = Carousel.prototype;
+
+ // Public
+ _proto.next = function next() {
+ if (!this._isSliding) {
+ this._slide(Direction.NEXT);
+ }
+ };
+
+ _proto.nextWhenVisible = function nextWhenVisible() {
+ // Don't call next when the page isn't visible
+ // or the carousel or its parent isn't visible
+ if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {
+ this.next();
+ }
+ };
+
+ _proto.prev = function prev() {
+ if (!this._isSliding) {
+ this._slide(Direction.PREV);
+ }
+ };
+
+ _proto.pause = function pause(event) {
+ if (!event) {
+ this._isPaused = true;
+ }
+
+ if (this._element.querySelector(Selector$2.NEXT_PREV)) {
+ Util.triggerTransitionEnd(this._element);
+ this.cycle(true);
+ }
+
+ clearInterval(this._interval);
+ this._interval = null;
+ };
+
+ _proto.cycle = function cycle(event) {
+ if (!event) {
+ this._isPaused = false;
+ }
+
+ if (this._interval) {
+ clearInterval(this._interval);
+ this._interval = null;
+ }
+
+ if (this._config.interval && !this._isPaused) {
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
+ }
+ };
+
+ _proto.to = function to(index) {
+ var _this = this;
+
+ this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
+
+ var activeIndex = this._getItemIndex(this._activeElement);
+
+ if (index > this._items.length - 1 || index < 0) {
+ return;
+ }
+
+ if (this._isSliding) {
+ $(this._element).one(Event$2.SLID, function () {
+ return _this.to(index);
+ });
+ return;
+ }
+
+ if (activeIndex === index) {
+ this.pause();
+ this.cycle();
+ return;
+ }
+
+ var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
+
+ this._slide(direction, this._items[index]);
+ };
+
+ _proto.dispose = function dispose() {
+ $(this._element).off(EVENT_KEY$2);
+ $.removeData(this._element, DATA_KEY$2);
+ this._items = null;
+ this._config = null;
+ this._element = null;
+ this._interval = null;
+ this._isPaused = null;
+ this._isSliding = null;
+ this._activeElement = null;
+ this._indicatorsElement = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default, config);
+ Util.typeCheckConfig(NAME$2, config, DefaultType);
+ return config;
+ };
+
+ _proto._handleSwipe = function _handleSwipe() {
+ var absDeltax = Math.abs(this.touchDeltaX);
+
+ if (absDeltax <= SWIPE_THRESHOLD) {
+ return;
+ }
+
+ var direction = absDeltax / this.touchDeltaX; // swipe left
+
+ if (direction > 0) {
+ this.prev();
+ } // swipe right
+
+
+ if (direction < 0) {
+ this.next();
+ }
+ };
+
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this2 = this;
+
+ if (this._config.keyboard) {
+ $(this._element).on(Event$2.KEYDOWN, function (event) {
+ return _this2._keydown(event);
+ });
+ }
+
+ if (this._config.pause === 'hover') {
+ $(this._element).on(Event$2.MOUSEENTER, function (event) {
+ return _this2.pause(event);
+ }).on(Event$2.MOUSELEAVE, function (event) {
+ return _this2.cycle(event);
+ });
+ }
+
+ if (this._config.touch) {
+ this._addTouchEventListeners();
+ }
+ };
+
+ _proto._addTouchEventListeners = function _addTouchEventListeners() {
+ var _this3 = this;
+
+ if (!this._touchSupported) {
+ return;
+ }
+
+ var start = function start(event) {
+ if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
+ _this3.touchStartX = event.originalEvent.clientX;
+ } else if (!_this3._pointerEvent) {
+ _this3.touchStartX = event.originalEvent.touches[0].clientX;
+ }
+ };
+
+ var move = function move(event) {
+ // ensure swiping with one touch and not pinching
+ if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
+ _this3.touchDeltaX = 0;
+ } else {
+ _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
+ }
+ };
+
+ var end = function end(event) {
+ if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
+ _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
+ }
+
+ _this3._handleSwipe();
+
+ if (_this3._config.pause === 'hover') {
+ // If it's a touch-enabled device, mouseenter/leave are fired as
+ // part of the mouse compatibility events on first tap - the carousel
+ // would stop cycling until user tapped out of it;
+ // here, we listen for touchend, explicitly pause the carousel
+ // (as if it's the second time we tap on it, mouseenter compat event
+ // is NOT fired) and after a timeout (to allow for mouse compatibility
+ // events to fire) we explicitly restart cycling
+ _this3.pause();
+
+ if (_this3.touchTimeout) {
+ clearTimeout(_this3.touchTimeout);
+ }
+
+ _this3.touchTimeout = setTimeout(function (event) {
+ return _this3.cycle(event);
+ }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
+ }
+ };
+
+ $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {
+ return e.preventDefault();
+ });
+
+ if (this._pointerEvent) {
+ $(this._element).on(Event$2.POINTERDOWN, function (event) {
+ return start(event);
+ });
+ $(this._element).on(Event$2.POINTERUP, function (event) {
+ return end(event);
+ });
+
+ this._element.classList.add(ClassName$2.POINTER_EVENT);
+ } else {
+ $(this._element).on(Event$2.TOUCHSTART, function (event) {
+ return start(event);
+ });
+ $(this._element).on(Event$2.TOUCHMOVE, function (event) {
+ return move(event);
+ });
+ $(this._element).on(Event$2.TOUCHEND, function (event) {
+ return end(event);
+ });
+ }
+ };
+
+ _proto._keydown = function _keydown(event) {
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
+
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
+ this.prev();
+ break;
+
+ case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
+ this.next();
+ break;
+
+ default:
+ }
+ };
+
+ _proto._getItemIndex = function _getItemIndex(element) {
+ this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];
+ return this._items.indexOf(element);
+ };
+
+ _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
+ var isNextDirection = direction === Direction.NEXT;
+ var isPrevDirection = direction === Direction.PREV;
+
+ var activeIndex = this._getItemIndex(activeElement);
+
+ var lastItemIndex = this._items.length - 1;
+ var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
+
+ if (isGoingToWrap && !this._config.wrap) {
+ return activeElement;
+ }
+
+ var delta = direction === Direction.PREV ? -1 : 1;
+ var itemIndex = (activeIndex + delta) % this._items.length;
+ return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
+ };
+
+ _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
+ var targetIndex = this._getItemIndex(relatedTarget);
+
+ var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));
+
+ var slideEvent = $.Event(Event$2.SLIDE, {
+ relatedTarget: relatedTarget,
+ direction: eventDirectionName,
+ from: fromIndex,
+ to: targetIndex
+ });
+ $(this._element).trigger(slideEvent);
+ return slideEvent;
+ };
+
+ _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
+ if (this._indicatorsElement) {
+ var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));
+ $(indicators).removeClass(ClassName$2.ACTIVE);
+
+ var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
+
+ if (nextIndicator) {
+ $(nextIndicator).addClass(ClassName$2.ACTIVE);
+ }
+ }
+ };
+
+ _proto._slide = function _slide(direction, element) {
+ var _this4 = this;
+
+ var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
+
+ var activeElementIndex = this._getItemIndex(activeElement);
+
+ var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
+
+ var nextElementIndex = this._getItemIndex(nextElement);
+
+ var isCycling = Boolean(this._interval);
+ var directionalClassName;
+ var orderClassName;
+ var eventDirectionName;
+
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName$2.LEFT;
+ orderClassName = ClassName$2.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName$2.RIGHT;
+ orderClassName = ClassName$2.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
+
+ if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {
+ this._isSliding = false;
+ return;
+ }
+
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
+
+ if (slideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (!activeElement || !nextElement) {
+ // Some weirdness is happening, so we bail
+ return;
+ }
+
+ this._isSliding = true;
+
+ if (isCycling) {
+ this.pause();
+ }
+
+ this._setActiveIndicatorElement(nextElement);
+
+ var slidEvent = $.Event(Event$2.SLID, {
+ relatedTarget: nextElement,
+ direction: eventDirectionName,
+ from: activeElementIndex,
+ to: nextElementIndex
+ });
+
+ if ($(this._element).hasClass(ClassName$2.SLIDE)) {
+ $(nextElement).addClass(orderClassName);
+ Util.reflow(nextElement);
+ $(activeElement).addClass(directionalClassName);
+ $(nextElement).addClass(directionalClassName);
+ var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
+
+ if (nextElementInterval) {
+ this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
+ this._config.interval = nextElementInterval;
+ } else {
+ this._config.interval = this._config.defaultInterval || this._config.interval;
+ }
+
+ var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
+ $(activeElement).one(Util.TRANSITION_END, function () {
+ $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE);
+ $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName);
+ _this4._isSliding = false;
+ setTimeout(function () {
+ return $(_this4._element).trigger(slidEvent);
+ }, 0);
+ }).emulateTransitionEnd(transitionDuration);
+ } else {
+ $(activeElement).removeClass(ClassName$2.ACTIVE);
+ $(nextElement).addClass(ClassName$2.ACTIVE);
+ this._isSliding = false;
+ $(this._element).trigger(slidEvent);
+ }
+
+ if (isCycling) {
+ this.cycle();
+ }
+ } // Static
+ ;
+
+ Carousel._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$2);
+
+ var _config = _objectSpread({}, Default, $(this).data());
+
+ if (typeof config === 'object') {
+ _config = _objectSpread({}, _config, config);
+ }
+
+ var action = typeof config === 'string' ? config : _config.slide;
+
+ if (!data) {
+ data = new Carousel(this, _config);
+ $(this).data(DATA_KEY$2, data);
+ }
+
+ if (typeof config === 'number') {
+ data.to(config);
+ } else if (typeof action === 'string') {
+ if (typeof data[action] === 'undefined') {
+ throw new TypeError("No method named \"" + action + "\"");
+ }
+
+ data[action]();
+ } else if (_config.interval && _config.ride) {
+ data.pause();
+ data.cycle();
+ }
+ });
+ };
+
+ Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
+ var selector = Util.getSelectorFromElement(this);
+
+ if (!selector) {
+ return;
+ }
+
+ var target = $(selector)[0];
+
+ if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {
+ return;
+ }
+
+ var config = _objectSpread({}, $(target).data(), $(this).data());
+
+ var slideIndex = this.getAttribute('data-slide-to');
+
+ if (slideIndex) {
+ config.interval = false;
+ }
+
+ Carousel._jQueryInterface.call($(target), config);
+
+ if (slideIndex) {
+ $(target).data(DATA_KEY$2).to(slideIndex);
+ }
+
+ event.preventDefault();
+ };
+
+ _createClass(Carousel, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$2;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }]);
+
+ return Carousel;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);
+ $(window).on(Event$2.LOAD_DATA_API, function () {
+ var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));
+
+ for (var i = 0, len = carousels.length; i < len; i++) {
+ var $carousel = $(carousels[i]);
+
+ Carousel._jQueryInterface.call($carousel, $carousel.data());
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$2] = Carousel._jQueryInterface;
+ $.fn[NAME$2].Constructor = Carousel;
+
+ $.fn[NAME$2].noConflict = function () {
+ $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;
+ return Carousel._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$3 = 'collapse';
+ var VERSION$3 = '4.3.1';
+ var DATA_KEY$3 = 'bs.collapse';
+ var EVENT_KEY$3 = "." + DATA_KEY$3;
+ var DATA_API_KEY$3 = '.data-api';
+ var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];
+ var Default$1 = {
+ toggle: true,
+ parent: ''
+ };
+ var DefaultType$1 = {
+ toggle: 'boolean',
+ parent: '(string|element)'
+ };
+ var Event$3 = {
+ SHOW: "show" + EVENT_KEY$3,
+ SHOWN: "shown" + EVENT_KEY$3,
+ HIDE: "hide" + EVENT_KEY$3,
+ HIDDEN: "hidden" + EVENT_KEY$3,
+ CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3
+ };
+ var ClassName$3 = {
+ SHOW: 'show',
+ COLLAPSE: 'collapse',
+ COLLAPSING: 'collapsing',
+ COLLAPSED: 'collapsed'
+ };
+ var Dimension = {
+ WIDTH: 'width',
+ HEIGHT: 'height'
+ };
+ var Selector$3 = {
+ ACTIVES: '*:not(.multi) > .show, *:not(.multi) > .collapsing',
+ // boosted mod
+ DATA_TOGGLE: '[data-toggle="collapse"]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Collapse =
+ /*#__PURE__*/
+ function () {
+ function Collapse(element, config) {
+ this._isTransitioning = false;
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
+ var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));
+
+ for (var i = 0, len = toggleList.length; i < len; i++) {
+ var elem = toggleList[i];
+ var selector = Util.getSelectorFromElement(elem);
+ var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
+ return foundElem === element;
+ });
+
+ if (selector !== null && filterElement.length > 0) {
+ this._selector = selector;
+
+ this._triggerArray.push(elem);
+ }
+ }
+
+ this._parent = this._config.parent ? this._getParent() : null;
+
+ if (!this._config.parent) {
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
+ }
+
+ if (this._config.toggle) {
+ this.toggle();
+ }
+ } // Getters
+
+
+ var _proto = Collapse.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ if ($(this._element).hasClass(ClassName$3.SHOW)) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ };
+
+ _proto.show = function show() {
+ var _this = this;
+
+ if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {
+ return;
+ }
+
+ var actives;
+ var activesData;
+
+ if (this._parent) {
+ actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {
+ if (typeof _this._config.parent === 'string') {
+ return elem.getAttribute('data-parent') === _this._config.parent;
+ }
+
+ return elem.classList.contains(ClassName$3.COLLAPSE);
+ });
+
+ if (actives.length === 0) {
+ actives = null;
+ }
+ }
+
+ if (actives) {
+ activesData = $(actives).not(this._selector).data(DATA_KEY$3);
+
+ if (activesData && activesData._isTransitioning) {
+ return;
+ }
+ }
+
+ var startEvent = $.Event(Event$3.SHOW);
+ $(this._element).trigger(startEvent);
+
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (actives) {
+ Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
+
+ if (!activesData) {
+ $(actives).data(DATA_KEY$3, null);
+ }
+ }
+
+ var dimension = this._getDimension();
+
+ $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);
+ this._element.style[dimension] = 0;
+
+ if (this._triggerArray.length) {
+ $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);
+ }
+
+ this.setTransitioning(true);
+
+ var complete = function complete() {
+ $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);
+ _this._element.style[dimension] = '';
+
+ _this.setTransitioning(false);
+
+ $(_this._element).trigger(Event$3.SHOWN);
+ };
+
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
+ var scrollSize = "scroll" + capitalizedDimension;
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ this._element.style[dimension] = this._element[scrollSize] + "px";
+ };
+
+ _proto.hide = function hide() {
+ var _this2 = this;
+
+ if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {
+ return;
+ }
+
+ var startEvent = $.Event(Event$3.HIDE);
+ $(this._element).trigger(startEvent);
+
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ var dimension = this._getDimension();
+
+ this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
+ Util.reflow(this._element);
+ $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);
+ var triggerArrayLength = this._triggerArray.length;
+
+ if (triggerArrayLength > 0) {
+ for (var i = 0; i < triggerArrayLength; i++) {
+ var trigger = this._triggerArray[i];
+ var selector = Util.getSelectorFromElement(trigger);
+
+ if (selector !== null) {
+ var $elem = $([].slice.call(document.querySelectorAll(selector)));
+
+ if (!$elem.hasClass(ClassName$3.SHOW)) {
+ $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);
+ }
+ }
+ }
+ }
+
+ this.setTransitioning(true);
+
+ var complete = function complete() {
+ _this2.setTransitioning(false);
+
+ $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);
+ };
+
+ this._element.style[dimension] = '';
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ };
+
+ _proto.setTransitioning = function setTransitioning(isTransitioning) {
+ this._isTransitioning = isTransitioning;
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$3);
+ this._config = null;
+ this._parent = null;
+ this._element = null;
+ this._triggerArray = null;
+ this._isTransitioning = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$1, config);
+ config.toggle = Boolean(config.toggle); // Coerce string values
+
+ Util.typeCheckConfig(NAME$3, config, DefaultType$1);
+ return config;
+ };
+
+ _proto._getDimension = function _getDimension() {
+ var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
+ };
+
+ _proto._getParent = function _getParent() {
+ var _this3 = this;
+
+ var parent;
+
+ if (Util.isElement(this._config.parent)) {
+ parent = this._config.parent; // It's a jQuery object
+
+ if (typeof this._config.parent.jquery !== 'undefined') {
+ parent = this._config.parent[0];
+ }
+ } else {
+ parent = document.querySelector(this._config.parent);
+ }
+
+ var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
+ var children = [].slice.call(parent.querySelectorAll(selector));
+ $(children).each(function (i, element) {
+ _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
+ });
+ return parent;
+ };
+
+ _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
+ var isOpen = $(element).hasClass(ClassName$3.SHOW);
+
+ if (triggerArray.length) {
+ $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
+ }
+ } // Static
+ ;
+
+ Collapse._getTargetFromElement = function _getTargetFromElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ return selector ? document.querySelector(selector) : null;
+ };
+
+ Collapse._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY$3);
+
+ var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});
+
+ if (!data && _config.toggle && /show|hide|init/.test(config)) {
+ // Boosted mod
+ _config.toggle = false;
+ }
+
+ if (!data) {
+ data = new Collapse(this, _config);
+ $this.data(DATA_KEY$3, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Collapse, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$3;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$1;
+ }
+ }]);
+
+ return Collapse;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {
+ // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
+ if (event.currentTarget.tagName === 'A') {
+ event.preventDefault();
+ }
+
+ var $trigger = $(this);
+ var selector = Util.getSelectorFromElement(this);
+ var selectors = [].slice.call(document.querySelectorAll(selector));
+ $(selectors).each(function () {
+ var $target = $(this);
+ var data = $target.data(DATA_KEY$3);
+ var config = data ? 'toggle' : $trigger.data();
+
+ Collapse._jQueryInterface.call($target, config);
+ });
+ }) // Boosted mod
+ .on('DOMContentLoaded', function () {
+ $(Selector$3.DATA_TOGGLE).each(function () {
+ var target = Collapse._getTargetFromElement(this);
+
+ Collapse._jQueryInterface.call($(target), 'init');
+ });
+ }); // end mod
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$3] = Collapse._jQueryInterface;
+ $.fn[NAME$3].Constructor = Collapse;
+
+ $.fn[NAME$3].noConflict = function () {
+ $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;
+ return Collapse._jQueryInterface;
+ };
+
+ /**!
+ * @fileOverview Kickass library to create and place poppers near their reference elements.
+ * @version 1.15.0
+ * @license
+ * Copyright (c) 2016 Federico Zivolo and contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+ var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
+
+ var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
+ var timeoutDuration = 0;
+ for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
+ if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
+ timeoutDuration = 1;
+ break;
+ }
+ }
+
+ function microtaskDebounce(fn) {
+ var called = false;
+ return function () {
+ if (called) {
+ return;
+ }
+ called = true;
+ window.Promise.resolve().then(function () {
+ called = false;
+ fn();
+ });
+ };
+ }
+
+ function taskDebounce(fn) {
+ var scheduled = false;
+ return function () {
+ if (!scheduled) {
+ scheduled = true;
+ setTimeout(function () {
+ scheduled = false;
+ fn();
+ }, timeoutDuration);
+ }
+ };
+ }
+
+ var supportsMicroTasks = isBrowser && window.Promise;
+
+ /**
+ * Create a debounced version of a method, that's asynchronously deferred
+ * but called in the minimum time possible.
+ *
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Function} fn
+ * @returns {Function}
+ */
+ var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;
+
+ /**
+ * Check if the given variable is a function
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Any} functionToCheck - variable to check
+ * @returns {Boolean} answer to: is a function?
+ */
+ function isFunction(functionToCheck) {
+ var getType = {};
+ return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
+ }
+
+ /**
+ * Get CSS computed property of the given element
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Eement} element
+ * @argument {String} property
+ */
+ function getStyleComputedProperty(element, property) {
+ if (element.nodeType !== 1) {
+ return [];
+ }
+ // NOTE: 1 DOM access here
+ var window = element.ownerDocument.defaultView;
+ var css = window.getComputedStyle(element, null);
+ return property ? css[property] : css;
+ }
+
+ /**
+ * Returns the parentNode or the host of the element
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @returns {Element} parent
+ */
+ function getParentNode(element) {
+ if (element.nodeName === 'HTML') {
+ return element;
+ }
+ return element.parentNode || element.host;
+ }
+
+ /**
+ * Returns the scrolling parent of the given element
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @returns {Element} scroll parent
+ */
+ function getScrollParent(element) {
+ // Return body, `getScroll` will take care to get the correct `scrollTop` from it
+ if (!element) {
+ return document.body;
+ }
+
+ switch (element.nodeName) {
+ case 'HTML':
+ case 'BODY':
+ return element.ownerDocument.body;
+ case '#document':
+ return element.body;
+ }
+
+ // Firefox want us to check `-x` and `-y` variations as well
+
+ var _getStyleComputedProp = getStyleComputedProperty(element),
+ overflow = _getStyleComputedProp.overflow,
+ overflowX = _getStyleComputedProp.overflowX,
+ overflowY = _getStyleComputedProp.overflowY;
+
+ if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
+ return element;
+ }
+
+ return getScrollParent(getParentNode(element));
+ }
+
+ var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
+ var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
+
+ /**
+ * Determines if the browser is Internet Explorer
+ * @method
+ * @memberof Popper.Utils
+ * @param {Number} version to check
+ * @returns {Boolean} isIE
+ */
+ function isIE(version) {
+ if (version === 11) {
+ return isIE11;
+ }
+ if (version === 10) {
+ return isIE10;
+ }
+ return isIE11 || isIE10;
+ }
+
+ /**
+ * Returns the offset parent of the given element
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @returns {Element} offset parent
+ */
+ function getOffsetParent(element) {
+ if (!element) {
+ return document.documentElement;
+ }
+
+ var noOffsetParent = isIE(10) ? document.body : null;
+
+ // NOTE: 1 DOM access here
+ var offsetParent = element.offsetParent || null;
+ // Skip hidden elements which don't have an offsetParent
+ while (offsetParent === noOffsetParent && element.nextElementSibling) {
+ offsetParent = (element = element.nextElementSibling).offsetParent;
+ }
+
+ var nodeName = offsetParent && offsetParent.nodeName;
+
+ if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
+ return element ? element.ownerDocument.documentElement : document.documentElement;
+ }
+
+ // .offsetParent will return the closest TH, TD or TABLE in case
+ // no offsetParent is present, I hate this job...
+ if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
+ return getOffsetParent(offsetParent);
+ }
+
+ return offsetParent;
+ }
+
+ function isOffsetContainer(element) {
+ var nodeName = element.nodeName;
+
+ if (nodeName === 'BODY') {
+ return false;
+ }
+ return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
+ }
+
+ /**
+ * Finds the root node (document, shadowDOM root) of the given element
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} node
+ * @returns {Element} root node
+ */
+ function getRoot(node) {
+ if (node.parentNode !== null) {
+ return getRoot(node.parentNode);
+ }
+
+ return node;
+ }
+
+ /**
+ * Finds the offset parent common to the two provided nodes
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element1
+ * @argument {Element} element2
+ * @returns {Element} common offset parent
+ */
+ function findCommonOffsetParent(element1, element2) {
+ // This check is needed to avoid errors in case one of the elements isn't defined for any reason
+ if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
+ return document.documentElement;
+ }
+
+ // Here we make sure to give as "start" the element that comes first in the DOM
+ var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
+ var start = order ? element1 : element2;
+ var end = order ? element2 : element1;
+
+ // Get common ancestor container
+ var range = document.createRange();
+ range.setStart(start, 0);
+ range.setEnd(end, 0);
+ var commonAncestorContainer = range.commonAncestorContainer;
+
+ // Both nodes are inside #document
+
+ if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
+ if (isOffsetContainer(commonAncestorContainer)) {
+ return commonAncestorContainer;
+ }
+
+ return getOffsetParent(commonAncestorContainer);
+ }
+
+ // one of the nodes is inside shadowDOM, find which one
+ var element1root = getRoot(element1);
+ if (element1root.host) {
+ return findCommonOffsetParent(element1root.host, element2);
+ } else {
+ return findCommonOffsetParent(element1, getRoot(element2).host);
+ }
+ }
+
+ /**
+ * Gets the scroll value of the given element in the given side (top and left)
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @argument {String} side `top` or `left`
+ * @returns {number} amount of scrolled pixels
+ */
+ function getScroll(element) {
+ var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
+
+ var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
+ var nodeName = element.nodeName;
+
+ if (nodeName === 'BODY' || nodeName === 'HTML') {
+ var html = element.ownerDocument.documentElement;
+ var scrollingElement = element.ownerDocument.scrollingElement || html;
+ return scrollingElement[upperSide];
+ }
+
+ return element[upperSide];
+ }
+
+ /*
+ * Sum or subtract the element scroll values (left and top) from a given rect object
+ * @method
+ * @memberof Popper.Utils
+ * @param {Object} rect - Rect object you want to change
+ * @param {HTMLElement} element - The element from the function reads the scroll values
+ * @param {Boolean} subtract - set to true if you want to subtract the scroll values
+ * @return {Object} rect - The modifier rect object
+ */
+ function includeScroll(rect, element) {
+ var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ var scrollTop = getScroll(element, 'top');
+ var scrollLeft = getScroll(element, 'left');
+ var modifier = subtract ? -1 : 1;
+ rect.top += scrollTop * modifier;
+ rect.bottom += scrollTop * modifier;
+ rect.left += scrollLeft * modifier;
+ rect.right += scrollLeft * modifier;
+ return rect;
+ }
+
+ /*
+ * Helper to detect borders of a given element
+ * @method
+ * @memberof Popper.Utils
+ * @param {CSSStyleDeclaration} styles
+ * Result of `getStyleComputedProperty` on the given element
+ * @param {String} axis - `x` or `y`
+ * @return {number} borders - The borders size of the given axis
+ */
+
+ function getBordersSize(styles, axis) {
+ var sideA = axis === 'x' ? 'Left' : 'Top';
+ var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
+
+ return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);
+ }
+
+ function getSize(axis, body, html, computedStyle) {
+ return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
+ }
+
+ function getWindowSizes(document) {
+ var body = document.body;
+ var html = document.documentElement;
+ var computedStyle = isIE(10) && getComputedStyle(html);
+
+ return {
+ height: getSize('Height', body, html, computedStyle),
+ width: getSize('Width', body, html, computedStyle)
+ };
+ }
+
+ var classCallCheck = function (instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ };
+
+ var createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ }();
+
+
+
+
+
+ var defineProperty = function (obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ };
+
+ var _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ /**
+ * Given element offsets, generate an output similar to getBoundingClientRect
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Object} offsets
+ * @returns {Object} ClientRect like output
+ */
+ function getClientRect(offsets) {
+ return _extends({}, offsets, {
+ right: offsets.left + offsets.width,
+ bottom: offsets.top + offsets.height
+ });
+ }
+
+ /**
+ * Get bounding client rect of given element
+ * @method
+ * @memberof Popper.Utils
+ * @param {HTMLElement} element
+ * @return {Object} client rect
+ */
+ function getBoundingClientRect(element) {
+ var rect = {};
+
+ // IE10 10 FIX: Please, don't ask, the element isn't
+ // considered in DOM in some circumstances...
+ // This isn't reproducible in IE10 compatibility mode of IE11
+ try {
+ if (isIE(10)) {
+ rect = element.getBoundingClientRect();
+ var scrollTop = getScroll(element, 'top');
+ var scrollLeft = getScroll(element, 'left');
+ rect.top += scrollTop;
+ rect.left += scrollLeft;
+ rect.bottom += scrollTop;
+ rect.right += scrollLeft;
+ } else {
+ rect = element.getBoundingClientRect();
+ }
+ } catch (e) {}
+
+ var result = {
+ left: rect.left,
+ top: rect.top,
+ width: rect.right - rect.left,
+ height: rect.bottom - rect.top
+ };
+
+ // subtract scrollbar size from sizes
+ var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
+ var width = sizes.width || element.clientWidth || result.right - result.left;
+ var height = sizes.height || element.clientHeight || result.bottom - result.top;
+
+ var horizScrollbar = element.offsetWidth - width;
+ var vertScrollbar = element.offsetHeight - height;
+
+ // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
+ // we make this check conditional for performance reasons
+ if (horizScrollbar || vertScrollbar) {
+ var styles = getStyleComputedProperty(element);
+ horizScrollbar -= getBordersSize(styles, 'x');
+ vertScrollbar -= getBordersSize(styles, 'y');
+
+ result.width -= horizScrollbar;
+ result.height -= vertScrollbar;
+ }
+
+ return getClientRect(result);
+ }
+
+ function getOffsetRectRelativeToArbitraryNode(children, parent) {
+ var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ var isIE10 = isIE(10);
+ var isHTML = parent.nodeName === 'HTML';
+ var childrenRect = getBoundingClientRect(children);
+ var parentRect = getBoundingClientRect(parent);
+ var scrollParent = getScrollParent(children);
+
+ var styles = getStyleComputedProperty(parent);
+ var borderTopWidth = parseFloat(styles.borderTopWidth, 10);
+ var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
+
+ // In cases where the parent is fixed, we must ignore negative scroll in offset calc
+ if (fixedPosition && isHTML) {
+ parentRect.top = Math.max(parentRect.top, 0);
+ parentRect.left = Math.max(parentRect.left, 0);
+ }
+ var offsets = getClientRect({
+ top: childrenRect.top - parentRect.top - borderTopWidth,
+ left: childrenRect.left - parentRect.left - borderLeftWidth,
+ width: childrenRect.width,
+ height: childrenRect.height
+ });
+ offsets.marginTop = 0;
+ offsets.marginLeft = 0;
+
+ // Subtract margins of documentElement in case it's being used as parent
+ // we do this only on HTML because it's the only element that behaves
+ // differently when margins are applied to it. The margins are included in
+ // the box of the documentElement, in the other cases not.
+ if (!isIE10 && isHTML) {
+ var marginTop = parseFloat(styles.marginTop, 10);
+ var marginLeft = parseFloat(styles.marginLeft, 10);
+
+ offsets.top -= borderTopWidth - marginTop;
+ offsets.bottom -= borderTopWidth - marginTop;
+ offsets.left -= borderLeftWidth - marginLeft;
+ offsets.right -= borderLeftWidth - marginLeft;
+
+ // Attach marginTop and marginLeft because in some circumstances we may need them
+ offsets.marginTop = marginTop;
+ offsets.marginLeft = marginLeft;
+ }
+
+ if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
+ offsets = includeScroll(offsets, parent);
+ }
+
+ return offsets;
+ }
+
+ function getViewportOffsetRectRelativeToArtbitraryNode(element) {
+ var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ var html = element.ownerDocument.documentElement;
+ var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
+ var width = Math.max(html.clientWidth, window.innerWidth || 0);
+ var height = Math.max(html.clientHeight, window.innerHeight || 0);
+
+ var scrollTop = !excludeScroll ? getScroll(html) : 0;
+ var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;
+
+ var offset = {
+ top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
+ left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
+ width: width,
+ height: height
+ };
+
+ return getClientRect(offset);
+ }
+
+ /**
+ * Check if the given element is fixed or is inside a fixed parent
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @argument {Element} customContainer
+ * @returns {Boolean} answer to "isFixed?"
+ */
+ function isFixed(element) {
+ var nodeName = element.nodeName;
+ if (nodeName === 'BODY' || nodeName === 'HTML') {
+ return false;
+ }
+ if (getStyleComputedProperty(element, 'position') === 'fixed') {
+ return true;
+ }
+ var parentNode = getParentNode(element);
+ if (!parentNode) {
+ return false;
+ }
+ return isFixed(parentNode);
+ }
+
+ /**
+ * Finds the first parent of an element that has a transformed property defined
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @returns {Element} first transformed parent or documentElement
+ */
+
+ function getFixedPositionOffsetParent(element) {
+ // This check is needed to avoid errors in case one of the elements isn't defined for any reason
+ if (!element || !element.parentElement || isIE()) {
+ return document.documentElement;
+ }
+ var el = element.parentElement;
+ while (el && getStyleComputedProperty(el, 'transform') === 'none') {
+ el = el.parentElement;
+ }
+ return el || document.documentElement;
+ }
+
+ /**
+ * Computed the boundaries limits and return them
+ * @method
+ * @memberof Popper.Utils
+ * @param {HTMLElement} popper
+ * @param {HTMLElement} reference
+ * @param {number} padding
+ * @param {HTMLElement} boundariesElement - Element used to define the boundaries
+ * @param {Boolean} fixedPosition - Is in fixed position mode
+ * @returns {Object} Coordinates of the boundaries
+ */
+ function getBoundaries(popper, reference, padding, boundariesElement) {
+ var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ // NOTE: 1 DOM access here
+
+ var boundaries = { top: 0, left: 0 };
+ var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
+
+ // Handle viewport case
+ if (boundariesElement === 'viewport') {
+ boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
+ } else {
+ // Handle other cases based on DOM element used as boundaries
+ var boundariesNode = void 0;
+ if (boundariesElement === 'scrollParent') {
+ boundariesNode = getScrollParent(getParentNode(reference));
+ if (boundariesNode.nodeName === 'BODY') {
+ boundariesNode = popper.ownerDocument.documentElement;
+ }
+ } else if (boundariesElement === 'window') {
+ boundariesNode = popper.ownerDocument.documentElement;
+ } else {
+ boundariesNode = boundariesElement;
+ }
+
+ var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
+
+ // In case of HTML, we need a different computation
+ if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
+ var _getWindowSizes = getWindowSizes(popper.ownerDocument),
+ height = _getWindowSizes.height,
+ width = _getWindowSizes.width;
+
+ boundaries.top += offsets.top - offsets.marginTop;
+ boundaries.bottom = height + offsets.top;
+ boundaries.left += offsets.left - offsets.marginLeft;
+ boundaries.right = width + offsets.left;
+ } else {
+ // for all the other DOM elements, this one is good
+ boundaries = offsets;
+ }
+ }
+
+ // Add paddings
+ padding = padding || 0;
+ var isPaddingNumber = typeof padding === 'number';
+ boundaries.left += isPaddingNumber ? padding : padding.left || 0;
+ boundaries.top += isPaddingNumber ? padding : padding.top || 0;
+ boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
+ boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
+
+ return boundaries;
+ }
+
+ function getArea(_ref) {
+ var width = _ref.width,
+ height = _ref.height;
+
+ return width * height;
+ }
+
+ /**
+ * Utility used to transform the `auto` placement to the placement with more
+ * available space.
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Object} data - The data object generated by update method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
+ var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
+
+ if (placement.indexOf('auto') === -1) {
+ return placement;
+ }
+
+ var boundaries = getBoundaries(popper, reference, padding, boundariesElement);
+
+ var rects = {
+ top: {
+ width: boundaries.width,
+ height: refRect.top - boundaries.top
+ },
+ right: {
+ width: boundaries.right - refRect.right,
+ height: boundaries.height
+ },
+ bottom: {
+ width: boundaries.width,
+ height: boundaries.bottom - refRect.bottom
+ },
+ left: {
+ width: refRect.left - boundaries.left,
+ height: boundaries.height
+ }
+ };
+
+ var sortedAreas = Object.keys(rects).map(function (key) {
+ return _extends({
+ key: key
+ }, rects[key], {
+ area: getArea(rects[key])
+ });
+ }).sort(function (a, b) {
+ return b.area - a.area;
+ });
+
+ var filteredAreas = sortedAreas.filter(function (_ref2) {
+ var width = _ref2.width,
+ height = _ref2.height;
+ return width >= popper.clientWidth && height >= popper.clientHeight;
+ });
+
+ var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;
+
+ var variation = placement.split('-')[1];
+
+ return computedPlacement + (variation ? '-' + variation : '');
+ }
+
+ /**
+ * Get offsets to the reference element
+ * @method
+ * @memberof Popper.Utils
+ * @param {Object} state
+ * @param {Element} popper - the popper element
+ * @param {Element} reference - the reference element (the popper will be relative to this)
+ * @param {Element} fixedPosition - is in fixed position mode
+ * @returns {Object} An object containing the offsets which will be applied to the popper
+ */
+ function getReferenceOffsets(state, popper, reference) {
+ var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+
+ var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
+ return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
+ }
+
+ /**
+ * Get the outer sizes of the given element (offset size + margins)
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element
+ * @returns {Object} object containing width and height properties
+ */
+ function getOuterSizes(element) {
+ var window = element.ownerDocument.defaultView;
+ var styles = window.getComputedStyle(element);
+ var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
+ var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
+ var result = {
+ width: element.offsetWidth + y,
+ height: element.offsetHeight + x
+ };
+ return result;
+ }
+
+ /**
+ * Get the opposite placement of the given one
+ * @method
+ * @memberof Popper.Utils
+ * @argument {String} placement
+ * @returns {String} flipped placement
+ */
+ function getOppositePlacement(placement) {
+ var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
+ return placement.replace(/left|right|bottom|top/g, function (matched) {
+ return hash[matched];
+ });
+ }
+
+ /**
+ * Get offsets to the popper
+ * @method
+ * @memberof Popper.Utils
+ * @param {Object} position - CSS position the Popper will get applied
+ * @param {HTMLElement} popper - the popper element
+ * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
+ * @param {String} placement - one of the valid placement options
+ * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
+ */
+ function getPopperOffsets(popper, referenceOffsets, placement) {
+ placement = placement.split('-')[0];
+
+ // Get popper node sizes
+ var popperRect = getOuterSizes(popper);
+
+ // Add position, width and height to our offsets object
+ var popperOffsets = {
+ width: popperRect.width,
+ height: popperRect.height
+ };
+
+ // depending by the popper placement we have to compute its offsets slightly differently
+ var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
+ var mainSide = isHoriz ? 'top' : 'left';
+ var secondarySide = isHoriz ? 'left' : 'top';
+ var measurement = isHoriz ? 'height' : 'width';
+ var secondaryMeasurement = !isHoriz ? 'height' : 'width';
+
+ popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
+ if (placement === secondarySide) {
+ popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
+ } else {
+ popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
+ }
+
+ return popperOffsets;
+ }
+
+ /**
+ * Mimics the `find` method of Array
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Array} arr
+ * @argument prop
+ * @argument value
+ * @returns index or -1
+ */
+ function find(arr, check) {
+ // use native find if supported
+ if (Array.prototype.find) {
+ return arr.find(check);
+ }
+
+ // use `filter` to obtain the same behavior of `find`
+ return arr.filter(check)[0];
+ }
+
+ /**
+ * Return the index of the matching object
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Array} arr
+ * @argument prop
+ * @argument value
+ * @returns index or -1
+ */
+ function findIndex(arr, prop, value) {
+ // use native findIndex if supported
+ if (Array.prototype.findIndex) {
+ return arr.findIndex(function (cur) {
+ return cur[prop] === value;
+ });
+ }
+
+ // use `find` + `indexOf` if `findIndex` isn't supported
+ var match = find(arr, function (obj) {
+ return obj[prop] === value;
+ });
+ return arr.indexOf(match);
+ }
+
+ /**
+ * Loop trough the list of modifiers and run them in order,
+ * each of them will then edit the data object.
+ * @method
+ * @memberof Popper.Utils
+ * @param {dataObject} data
+ * @param {Array} modifiers
+ * @param {String} ends - Optional modifier name used as stopper
+ * @returns {dataObject}
+ */
+ function runModifiers(modifiers, data, ends) {
+ var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));
+
+ modifiersToRun.forEach(function (modifier) {
+ if (modifier['function']) {
+ // eslint-disable-line dot-notation
+ console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
+ }
+ var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation
+ if (modifier.enabled && isFunction(fn)) {
+ // Add properties to offsets to make them a complete clientRect object
+ // we do this before each modifier to make sure the previous one doesn't
+ // mess with these values
+ data.offsets.popper = getClientRect(data.offsets.popper);
+ data.offsets.reference = getClientRect(data.offsets.reference);
+
+ data = fn(data, modifier);
+ }
+ });
+
+ return data;
+ }
+
+ /**
+ * Updates the position of the popper, computing the new offsets and applying
+ * the new style.<br />
+ * Prefer `scheduleUpdate` over `update` because of performance reasons.
+ * @method
+ * @memberof Popper
+ */
+ function update() {
+ // if popper is destroyed, don't perform any further update
+ if (this.state.isDestroyed) {
+ return;
+ }
+
+ var data = {
+ instance: this,
+ styles: {},
+ arrowStyles: {},
+ attributes: {},
+ flipped: false,
+ offsets: {}
+ };
+
+ // compute reference element offsets
+ data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);
+
+ // compute auto placement, store placement inside the data object,
+ // modifiers will be able to edit `placement` if needed
+ // and refer to originalPlacement to know the original value
+ data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);
+
+ // store the computed placement inside `originalPlacement`
+ data.originalPlacement = data.placement;
+
+ data.positionFixed = this.options.positionFixed;
+
+ // compute the popper offsets
+ data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);
+
+ data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';
+
+ // run the modifiers
+ data = runModifiers(this.modifiers, data);
+
+ // the first `update` will call `onCreate` callback
+ // the other ones will call `onUpdate` callback
+ if (!this.state.isCreated) {
+ this.state.isCreated = true;
+ this.options.onCreate(data);
+ } else {
+ this.options.onUpdate(data);
+ }
+ }
+
+ /**
+ * Helper used to know if the given modifier is enabled.
+ * @method
+ * @memberof Popper.Utils
+ * @returns {Boolean}
+ */
+ function isModifierEnabled(modifiers, modifierName) {
+ return modifiers.some(function (_ref) {
+ var name = _ref.name,
+ enabled = _ref.enabled;
+ return enabled && name === modifierName;
+ });
+ }
+
+ /**
+ * Get the prefixed supported property name
+ * @method
+ * @memberof Popper.Utils
+ * @argument {String} property (camelCase)
+ * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)
+ */
+ function getSupportedPropertyName(property) {
+ var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];
+ var upperProp = property.charAt(0).toUpperCase() + property.slice(1);
+
+ for (var i = 0; i < prefixes.length; i++) {
+ var prefix = prefixes[i];
+ var toCheck = prefix ? '' + prefix + upperProp : property;
+ if (typeof document.body.style[toCheck] !== 'undefined') {
+ return toCheck;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Destroys the popper.
+ * @method
+ * @memberof Popper
+ */
+ function destroy() {
+ this.state.isDestroyed = true;
+
+ // touch DOM only if `applyStyle` modifier is enabled
+ if (isModifierEnabled(this.modifiers, 'applyStyle')) {
+ this.popper.removeAttribute('x-placement');
+ this.popper.style.position = '';
+ this.popper.style.top = '';
+ this.popper.style.left = '';
+ this.popper.style.right = '';
+ this.popper.style.bottom = '';
+ this.popper.style.willChange = '';
+ this.popper.style[getSupportedPropertyName('transform')] = '';
+ }
+
+ this.disableEventListeners();
+
+ // remove the popper if user explicity asked for the deletion on destroy
+ // do not use `remove` because IE11 doesn't support it
+ if (this.options.removeOnDestroy) {
+ this.popper.parentNode.removeChild(this.popper);
+ }
+ return this;
+ }
+
+ /**
+ * Get the window associated with the element
+ * @argument {Element} element
+ * @returns {Window}
+ */
+ function getWindow(element) {
+ var ownerDocument = element.ownerDocument;
+ return ownerDocument ? ownerDocument.defaultView : window;
+ }
+
+ function attachToScrollParents(scrollParent, event, callback, scrollParents) {
+ var isBody = scrollParent.nodeName === 'BODY';
+ var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;
+ target.addEventListener(event, callback, { passive: true });
+
+ if (!isBody) {
+ attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);
+ }
+ scrollParents.push(target);
+ }
+
+ /**
+ * Setup needed event listeners used to update the popper position
+ * @method
+ * @memberof Popper.Utils
+ * @private
+ */
+ function setupEventListeners(reference, options, state, updateBound) {
+ // Resize event listener on window
+ state.updateBound = updateBound;
+ getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });
+
+ // Scroll event listener on scroll parents
+ var scrollElement = getScrollParent(reference);
+ attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);
+ state.scrollElement = scrollElement;
+ state.eventsEnabled = true;
+
+ return state;
+ }
+
+ /**
+ * It will add resize/scroll events and start recalculating
+ * position of the popper element when they are triggered.
+ * @method
+ * @memberof Popper
+ */
+ function enableEventListeners() {
+ if (!this.state.eventsEnabled) {
+ this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);
+ }
+ }
+
+ /**
+ * Remove event listeners used to update the popper position
+ * @method
+ * @memberof Popper.Utils
+ * @private
+ */
+ function removeEventListeners(reference, state) {
+ // Remove resize event listener on window
+ getWindow(reference).removeEventListener('resize', state.updateBound);
+
+ // Remove scroll event listener on scroll parents
+ state.scrollParents.forEach(function (target) {
+ target.removeEventListener('scroll', state.updateBound);
+ });
+
+ // Reset state
+ state.updateBound = null;
+ state.scrollParents = [];
+ state.scrollElement = null;
+ state.eventsEnabled = false;
+ return state;
+ }
+
+ /**
+ * It will remove resize/scroll events and won't recalculate popper position
+ * when they are triggered. It also won't trigger `onUpdate` callback anymore,
+ * unless you call `update` method manually.
+ * @method
+ * @memberof Popper
+ */
+ function disableEventListeners() {
+ if (this.state.eventsEnabled) {
+ cancelAnimationFrame(this.scheduleUpdate);
+ this.state = removeEventListeners(this.reference, this.state);
+ }
+ }
+
+ /**
+ * Tells if a given input is a number
+ * @method
+ * @memberof Popper.Utils
+ * @param {*} input to check
+ * @return {Boolean}
+ */
+ function isNumeric(n) {
+ return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
+ }
+
+ /**
+ * Set the style to the given popper
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element - Element to apply the style to
+ * @argument {Object} styles
+ * Object with a list of properties and values which will be applied to the element
+ */
+ function setStyles(element, styles) {
+ Object.keys(styles).forEach(function (prop) {
+ var unit = '';
+ // add unit if the value is numeric and is one of the following
+ if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {
+ unit = 'px';
+ }
+ element.style[prop] = styles[prop] + unit;
+ });
+ }
+
+ /**
+ * Set the attributes to the given popper
+ * @method
+ * @memberof Popper.Utils
+ * @argument {Element} element - Element to apply the attributes to
+ * @argument {Object} styles
+ * Object with a list of properties and values which will be applied to the element
+ */
+ function setAttributes(element, attributes) {
+ Object.keys(attributes).forEach(function (prop) {
+ var value = attributes[prop];
+ if (value !== false) {
+ element.setAttribute(prop, attributes[prop]);
+ } else {
+ element.removeAttribute(prop);
+ }
+ });
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by `update` method
+ * @argument {Object} data.styles - List of style properties - values to apply to popper element
+ * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The same data object
+ */
+ function applyStyle(data) {
+ // any property present in `data.styles` will be applied to the popper,
+ // in this way we can make the 3rd party modifiers add custom styles to it
+ // Be aware, modifiers could override the properties defined in the previous
+ // lines of this modifier!
+ setStyles(data.instance.popper, data.styles);
+
+ // any property present in `data.attributes` will be applied to the popper,
+ // they will be set as HTML attributes of the element
+ setAttributes(data.instance.popper, data.attributes);
+
+ // if arrowElement is defined and arrowStyles has some properties
+ if (data.arrowElement && Object.keys(data.arrowStyles).length) {
+ setStyles(data.arrowElement, data.arrowStyles);
+ }
+
+ return data;
+ }
+
+ /**
+ * Set the x-placement attribute before everything else because it could be used
+ * to add margins to the popper margins needs to be calculated to get the
+ * correct popper offsets.
+ * @method
+ * @memberof Popper.modifiers
+ * @param {HTMLElement} reference - The reference element used to position the popper
+ * @param {HTMLElement} popper - The HTML element used as popper
+ * @param {Object} options - Popper.js options
+ */
+ function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {
+ // compute reference element offsets
+ var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);
+
+ // compute auto placement, store placement inside the data object,
+ // modifiers will be able to edit `placement` if needed
+ // and refer to originalPlacement to know the original value
+ var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);
+
+ popper.setAttribute('x-placement', placement);
+
+ // Apply `position` to popper before anything else because
+ // without the position applied we can't guarantee correct computations
+ setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });
+
+ return options;
+ }
+
+ /**
+ * @function
+ * @memberof Popper.Utils
+ * @argument {Object} data - The data object generated by `update` method
+ * @argument {Boolean} shouldRound - If the offsets should be rounded at all
+ * @returns {Object} The popper's position offsets rounded
+ *
+ * The tale of pixel-perfect positioning. It's still not 100% perfect, but as
+ * good as it can be within reason.
+ * Discussion here: https://github.com/FezVrasta/popper.js/pull/715
+ *
+ * Low DPI screens cause a popper to be blurry if not using full pixels (Safari
+ * as well on High DPI screens).
+ *
+ * Firefox prefers no rounding for positioning and does not have blurriness on
+ * high DPI screens.
+ *
+ * Only horizontal placement and left/right values need to be considered.
+ */
+ function getRoundedOffsets(data, shouldRound) {
+ var _data$offsets = data.offsets,
+ popper = _data$offsets.popper,
+ reference = _data$offsets.reference;
+ var round = Math.round,
+ floor = Math.floor;
+
+ var noRound = function noRound(v) {
+ return v;
+ };
+
+ var referenceWidth = round(reference.width);
+ var popperWidth = round(popper.width);
+
+ var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;
+ var isVariation = data.placement.indexOf('-') !== -1;
+ var sameWidthParity = referenceWidth % 2 === popperWidth % 2;
+ var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;
+
+ var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;
+ var verticalToInteger = !shouldRound ? noRound : round;
+
+ return {
+ left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),
+ top: verticalToInteger(popper.top),
+ bottom: verticalToInteger(popper.bottom),
+ right: horizontalToInteger(popper.right)
+ };
+ }
+
+ var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by `update` method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function computeStyle(data, options) {
+ var x = options.x,
+ y = options.y;
+ var popper = data.offsets.popper;
+
+ // Remove this legacy support in Popper.js v2
+
+ var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {
+ return modifier.name === 'applyStyle';
+ }).gpuAcceleration;
+ if (legacyGpuAccelerationOption !== undefined) {
+ console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
+ }
+ var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;
+
+ var offsetParent = getOffsetParent(data.instance.popper);
+ var offsetParentRect = getBoundingClientRect(offsetParent);
+
+ // Styles
+ var styles = {
+ position: popper.position
+ };
+
+ var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);
+
+ var sideA = x === 'bottom' ? 'top' : 'bottom';
+ var sideB = y === 'right' ? 'left' : 'right';
+
+ // if gpuAcceleration is set to `true` and transform is supported,
+ // we use `translate3d` to apply the position to the popper we
+ // automatically use the supported prefixed version if needed
+ var prefixedProperty = getSupportedPropertyName('transform');
+
+ // now, let's make a step back and look at this code closely (wtf?)
+ // If the content of the popper grows once it's been positioned, it
+ // may happen that the popper gets misplaced because of the new content
+ // overflowing its reference element
+ // To avoid this problem, we provide two options (x and y), which allow
+ // the consumer to define the offset origin.
+ // If we position a popper on top of a reference element, we can set
+ // `x` to `top` to make the popper grow towards its top instead of
+ // its bottom.
+ var left = void 0,
+ top = void 0;
+ if (sideA === 'bottom') {
+ // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
+ // and not the bottom of the html element
+ if (offsetParent.nodeName === 'HTML') {
+ top = -offsetParent.clientHeight + offsets.bottom;
+ } else {
+ top = -offsetParentRect.height + offsets.bottom;
+ }
+ } else {
+ top = offsets.top;
+ }
+ if (sideB === 'right') {
+ if (offsetParent.nodeName === 'HTML') {
+ left = -offsetParent.clientWidth + offsets.right;
+ } else {
+ left = -offsetParentRect.width + offsets.right;
+ }
+ } else {
+ left = offsets.left;
+ }
+ if (gpuAcceleration && prefixedProperty) {
+ styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';
+ styles[sideA] = 0;
+ styles[sideB] = 0;
+ styles.willChange = 'transform';
+ } else {
+ // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
+ var invertTop = sideA === 'bottom' ? -1 : 1;
+ var invertLeft = sideB === 'right' ? -1 : 1;
+ styles[sideA] = top * invertTop;
+ styles[sideB] = left * invertLeft;
+ styles.willChange = sideA + ', ' + sideB;
+ }
+
+ // Attributes
+ var attributes = {
+ 'x-placement': data.placement
+ };
+
+ // Update `data` attributes, styles and arrowStyles
+ data.attributes = _extends({}, attributes, data.attributes);
+ data.styles = _extends({}, styles, data.styles);
+ data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);
+
+ return data;
+ }
+
+ /**
+ * Helper used to know if the given modifier depends from another one.<br />
+ * It checks if the needed modifier is listed and enabled.
+ * @method
+ * @memberof Popper.Utils
+ * @param {Array} modifiers - list of modifiers
+ * @param {String} requestingName - name of requesting modifier
+ * @param {String} requestedName - name of requested modifier
+ * @returns {Boolean}
+ */
+ function isModifierRequired(modifiers, requestingName, requestedName) {
+ var requesting = find(modifiers, function (_ref) {
+ var name = _ref.name;
+ return name === requestingName;
+ });
+
+ var isRequired = !!requesting && modifiers.some(function (modifier) {
+ return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;
+ });
+
+ if (!isRequired) {
+ var _requesting = '`' + requestingName + '`';
+ var requested = '`' + requestedName + '`';
+ console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');
+ }
+ return isRequired;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by update method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function arrow(data, options) {
+ var _data$offsets$arrow;
+
+ // arrow depends on keepTogether in order to work
+ if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {
+ return data;
+ }
+
+ var arrowElement = options.element;
+
+ // if arrowElement is a string, suppose it's a CSS selector
+ if (typeof arrowElement === 'string') {
+ arrowElement = data.instance.popper.querySelector(arrowElement);
+
+ // if arrowElement is not found, don't run the modifier
+ if (!arrowElement) {
+ return data;
+ }
+ } else {
+ // if the arrowElement isn't a query selector we must check that the
+ // provided DOM node is child of its popper node
+ if (!data.instance.popper.contains(arrowElement)) {
+ console.warn('WARNING: `arrow.element` must be child of its popper element!');
+ return data;
+ }
+ }
+
+ var placement = data.placement.split('-')[0];
+ var _data$offsets = data.offsets,
+ popper = _data$offsets.popper,
+ reference = _data$offsets.reference;
+
+ var isVertical = ['left', 'right'].indexOf(placement) !== -1;
+
+ var len = isVertical ? 'height' : 'width';
+ var sideCapitalized = isVertical ? 'Top' : 'Left';
+ var side = sideCapitalized.toLowerCase();
+ var altSide = isVertical ? 'left' : 'top';
+ var opSide = isVertical ? 'bottom' : 'right';
+ var arrowElementSize = getOuterSizes(arrowElement)[len];
+
+ //
+ // extends keepTogether behavior making sure the popper and its
+ // reference have enough pixels in conjunction
+ //
+
+ // top/left side
+ if (reference[opSide] - arrowElementSize < popper[side]) {
+ data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);
+ }
+ // bottom/right side
+ if (reference[side] + arrowElementSize > popper[opSide]) {
+ data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];
+ }
+ data.offsets.popper = getClientRect(data.offsets.popper);
+
+ // compute center of the popper
+ var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;
+
+ // Compute the sideValue using the updated popper offsets
+ // take popper margin in account because we don't have this info available
+ var css = getStyleComputedProperty(data.instance.popper);
+ var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);
+ var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);
+ var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;
+
+ // prevent arrowElement from being placed not contiguously to its popper
+ sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);
+
+ data.arrowElement = arrowElement;
+ data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);
+
+ return data;
+ }
+
+ /**
+ * Get the opposite placement variation of the given one
+ * @method
+ * @memberof Popper.Utils
+ * @argument {String} placement variation
+ * @returns {String} flipped placement variation
+ */
+ function getOppositeVariation(variation) {
+ if (variation === 'end') {
+ return 'start';
+ } else if (variation === 'start') {
+ return 'end';
+ }
+ return variation;
+ }
+
+ /**
+ * List of accepted placements to use as values of the `placement` option.<br />
+ * Valid placements are:
+ * - `auto`
+ * - `top`
+ * - `right`
+ * - `bottom`
+ * - `left`
+ *
+ * Each placement can have a variation from this list:
+ * - `-start`
+ * - `-end`
+ *
+ * Variations are interpreted easily if you think of them as the left to right
+ * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`
+ * is right.<br />
+ * Vertically (`left` and `right`), `start` is top and `end` is bottom.
+ *
+ * Some valid examples are:
+ * - `top-end` (on top of reference, right aligned)
+ * - `right-start` (on right of reference, top aligned)
+ * - `bottom` (on bottom, centered)
+ * - `auto-end` (on the side with more space available, alignment depends by placement)
+ *
+ * @static
+ * @type {Array}
+ * @enum {String}
+ * @readonly
+ * @method placements
+ * @memberof Popper
+ */
+ var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];
+
+ // Get rid of `auto` `auto-start` and `auto-end`
+ var validPlacements = placements.slice(3);
+
+ /**
+ * Given an initial placement, returns all the subsequent placements
+ * clockwise (or counter-clockwise).
+ *
+ * @method
+ * @memberof Popper.Utils
+ * @argument {String} placement - A valid placement (it accepts variations)
+ * @argument {Boolean} counter - Set to true to walk the placements counterclockwise
+ * @returns {Array} placements including their variations
+ */
+ function clockwise(placement) {
+ var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ var index = validPlacements.indexOf(placement);
+ var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));
+ return counter ? arr.reverse() : arr;
+ }
+
+ var BEHAVIORS = {
+ FLIP: 'flip',
+ CLOCKWISE: 'clockwise',
+ COUNTERCLOCKWISE: 'counterclockwise'
+ };
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by update method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function flip(data, options) {
+ // if `inner` modifier is enabled, we can't use the `flip` modifier
+ if (isModifierEnabled(data.instance.modifiers, 'inner')) {
+ return data;
+ }
+
+ if (data.flipped && data.placement === data.originalPlacement) {
+ // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
+ return data;
+ }
+
+ var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);
+
+ var placement = data.placement.split('-')[0];
+ var placementOpposite = getOppositePlacement(placement);
+ var variation = data.placement.split('-')[1] || '';
+
+ var flipOrder = [];
+
+ switch (options.behavior) {
+ case BEHAVIORS.FLIP:
+ flipOrder = [placement, placementOpposite];
+ break;
+ case BEHAVIORS.CLOCKWISE:
+ flipOrder = clockwise(placement);
+ break;
+ case BEHAVIORS.COUNTERCLOCKWISE:
+ flipOrder = clockwise(placement, true);
+ break;
+ default:
+ flipOrder = options.behavior;
+ }
+
+ flipOrder.forEach(function (step, index) {
+ if (placement !== step || flipOrder.length === index + 1) {
+ return data;
+ }
+
+ placement = data.placement.split('-')[0];
+ placementOpposite = getOppositePlacement(placement);
+
+ var popperOffsets = data.offsets.popper;
+ var refOffsets = data.offsets.reference;
+
+ // using floor because the reference offsets may contain decimals we are not going to consider here
+ var floor = Math.floor;
+ var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);
+
+ var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);
+ var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);
+ var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);
+ var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);
+
+ var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;
+
+ // flip the variation if required
+ var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
+
+ // flips variation if reference element overflows boundaries
+ var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
+
+ // flips variation if popper content overflows boundaries
+ var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);
+
+ var flippedVariation = flippedVariationByRef || flippedVariationByContent;
+
+ if (overlapsRef || overflowsBoundaries || flippedVariation) {
+ // this boolean to detect any flip loop
+ data.flipped = true;
+
+ if (overlapsRef || overflowsBoundaries) {
+ placement = flipOrder[index + 1];
+ }
+
+ if (flippedVariation) {
+ variation = getOppositeVariation(variation);
+ }
+
+ data.placement = placement + (variation ? '-' + variation : '');
+
+ // this object contains `position`, we want to preserve it along with
+ // any additional property we may add in the future
+ data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));
+
+ data = runModifiers(data.instance.modifiers, data, 'flip');
+ }
+ });
+ return data;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by update method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function keepTogether(data) {
+ var _data$offsets = data.offsets,
+ popper = _data$offsets.popper,
+ reference = _data$offsets.reference;
+
+ var placement = data.placement.split('-')[0];
+ var floor = Math.floor;
+ var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
+ var side = isVertical ? 'right' : 'bottom';
+ var opSide = isVertical ? 'left' : 'top';
+ var measurement = isVertical ? 'width' : 'height';
+
+ if (popper[side] < floor(reference[opSide])) {
+ data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
+ }
+ if (popper[opSide] > floor(reference[side])) {
+ data.offsets.popper[opSide] = floor(reference[side]);
+ }
+
+ return data;
+ }
+
+ /**
+ * Converts a string containing value + unit into a px value number
+ * @function
+ * @memberof {modifiers~offset}
+ * @private
+ * @argument {String} str - Value + unit string
+ * @argument {String} measurement - `height` or `width`
+ * @argument {Object} popperOffsets
+ * @argument {Object} referenceOffsets
+ * @returns {Number|String}
+ * Value in pixels, or original string if no values were extracted
+ */
+ function toValue(str, measurement, popperOffsets, referenceOffsets) {
+ // separate value from unit
+ var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);
+ var value = +split[1];
+ var unit = split[2];
+
+ // If it's not a number it's an operator, I guess
+ if (!value) {
+ return str;
+ }
+
+ if (unit.indexOf('%') === 0) {
+ var element = void 0;
+ switch (unit) {
+ case '%p':
+ element = popperOffsets;
+ break;
+ case '%':
+ case '%r':
+ default:
+ element = referenceOffsets;
+ }
+
+ var rect = getClientRect(element);
+ return rect[measurement] / 100 * value;
+ } else if (unit === 'vh' || unit === 'vw') {
+ // if is a vh or vw, we calculate the size based on the viewport
+ var size = void 0;
+ if (unit === 'vh') {
+ size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
+ } else {
+ size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
+ }
+ return size / 100 * value;
+ } else {
+ // if is an explicit pixel unit, we get rid of the unit and keep the value
+ // if is an implicit unit, it's px, and we return just the value
+ return value;
+ }
+ }
+
+ /**
+ * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.
+ * @function
+ * @memberof {modifiers~offset}
+ * @private
+ * @argument {String} offset
+ * @argument {Object} popperOffsets
+ * @argument {Object} referenceOffsets
+ * @argument {String} basePlacement
+ * @returns {Array} a two cells array with x and y offsets in numbers
+ */
+ function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {
+ var offsets = [0, 0];
+
+ // Use height if placement is left or right and index is 0 otherwise use width
+ // in this way the first offset will use an axis and the second one
+ // will use the other one
+ var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;
+
+ // Split the offset string to obtain a list of values and operands
+ // The regex addresses values with the plus or minus sign in front (+10, -20, etc)
+ var fragments = offset.split(/(\+|\-)/).map(function (frag) {
+ return frag.trim();
+ });
+
+ // Detect if the offset string contains a pair of values or a single one
+ // they could be separated by comma or space
+ var divider = fragments.indexOf(find(fragments, function (frag) {
+ return frag.search(/,|\s/) !== -1;
+ }));
+
+ if (fragments[divider] && fragments[divider].indexOf(',') === -1) {
+ console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
+ }
+
+ // If divider is found, we divide the list of values and operands to divide
+ // them by ofset X and Y.
+ var splitRegex = /\s*,\s*|\s+/;
+ var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];
+
+ // Convert the values with units to absolute pixels to allow our computations
+ ops = ops.map(function (op, index) {
+ // Most of the units rely on the orientation of the popper
+ var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';
+ var mergeWithPrevious = false;
+ return op
+ // This aggregates any `+` or `-` sign that aren't considered operators
+ // e.g.: 10 + +5 => [10, +, +5]
+ .reduce(function (a, b) {
+ if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {
+ a[a.length - 1] = b;
+ mergeWithPrevious = true;
+ return a;
+ } else if (mergeWithPrevious) {
+ a[a.length - 1] += b;
+ mergeWithPrevious = false;
+ return a;
+ } else {
+ return a.concat(b);
+ }
+ }, [])
+ // Here we convert the string values into number values (in px)
+ .map(function (str) {
+ return toValue(str, measurement, popperOffsets, referenceOffsets);
+ });
+ });
+
+ // Loop trough the offsets arrays and execute the operations
+ ops.forEach(function (op, index) {
+ op.forEach(function (frag, index2) {
+ if (isNumeric(frag)) {
+ offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);
+ }
+ });
+ });
+ return offsets;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by update method
+ * @argument {Object} options - Modifiers configuration and options
+ * @argument {Number|String} options.offset=0
+ * The offset value as described in the modifier description
+ * @returns {Object} The data object, properly modified
+ */
+ function offset(data, _ref) {
+ var offset = _ref.offset;
+ var placement = data.placement,
+ _data$offsets = data.offsets,
+ popper = _data$offsets.popper,
+ reference = _data$offsets.reference;
+
+ var basePlacement = placement.split('-')[0];
+
+ var offsets = void 0;
+ if (isNumeric(+offset)) {
+ offsets = [+offset, 0];
+ } else {
+ offsets = parseOffset(offset, popper, reference, basePlacement);
+ }
+
+ if (basePlacement === 'left') {
+ popper.top += offsets[0];
+ popper.left -= offsets[1];
+ } else if (basePlacement === 'right') {
+ popper.top += offsets[0];
+ popper.left += offsets[1];
+ } else if (basePlacement === 'top') {
+ popper.left += offsets[0];
+ popper.top -= offsets[1];
+ } else if (basePlacement === 'bottom') {
+ popper.left += offsets[0];
+ popper.top += offsets[1];
+ }
+
+ data.popper = popper;
+ return data;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by `update` method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function preventOverflow(data, options) {
+ var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);
+
+ // If offsetParent is the reference element, we really want to
+ // go one step up and use the next offsetParent as reference to
+ // avoid to make this modifier completely useless and look like broken
+ if (data.instance.reference === boundariesElement) {
+ boundariesElement = getOffsetParent(boundariesElement);
+ }
+
+ // NOTE: DOM access here
+ // resets the popper's position so that the document size can be calculated excluding
+ // the size of the popper element itself
+ var transformProp = getSupportedPropertyName('transform');
+ var popperStyles = data.instance.popper.style; // assignment to help minification
+ var top = popperStyles.top,
+ left = popperStyles.left,
+ transform = popperStyles[transformProp];
+
+ popperStyles.top = '';
+ popperStyles.left = '';
+ popperStyles[transformProp] = '';
+
+ var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);
+
+ // NOTE: DOM access here
+ // restores the original style properties after the offsets have been computed
+ popperStyles.top = top;
+ popperStyles.left = left;
+ popperStyles[transformProp] = transform;
+
+ options.boundaries = boundaries;
+
+ var order = options.priority;
+ var popper = data.offsets.popper;
+
+ var check = {
+ primary: function primary(placement) {
+ var value = popper[placement];
+ if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {
+ value = Math.max(popper[placement], boundaries[placement]);
+ }
+ return defineProperty({}, placement, value);
+ },
+ secondary: function secondary(placement) {
+ var mainSide = placement === 'right' ? 'left' : 'top';
+ var value = popper[mainSide];
+ if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {
+ value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));
+ }
+ return defineProperty({}, mainSide, value);
+ }
+ };
+
+ order.forEach(function (placement) {
+ var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';
+ popper = _extends({}, popper, check[side](placement));
+ });
+
+ data.offsets.popper = popper;
+
+ return data;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by `update` method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function shift(data) {
+ var placement = data.placement;
+ var basePlacement = placement.split('-')[0];
+ var shiftvariation = placement.split('-')[1];
+
+ // if shift shiftvariation is specified, run the modifier
+ if (shiftvariation) {
+ var _data$offsets = data.offsets,
+ reference = _data$offsets.reference,
+ popper = _data$offsets.popper;
+
+ var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
+ var side = isVertical ? 'left' : 'top';
+ var measurement = isVertical ? 'width' : 'height';
+
+ var shiftOffsets = {
+ start: defineProperty({}, side, reference[side]),
+ end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])
+ };
+
+ data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);
+ }
+
+ return data;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by update method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function hide(data) {
+ if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {
+ return data;
+ }
+
+ var refRect = data.offsets.reference;
+ var bound = find(data.instance.modifiers, function (modifier) {
+ return modifier.name === 'preventOverflow';
+ }).boundaries;
+
+ if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {
+ // Avoid unnecessary DOM access if visibility hasn't changed
+ if (data.hide === true) {
+ return data;
+ }
+
+ data.hide = true;
+ data.attributes['x-out-of-boundaries'] = '';
+ } else {
+ // Avoid unnecessary DOM access if visibility hasn't changed
+ if (data.hide === false) {
+ return data;
+ }
+
+ data.hide = false;
+ data.attributes['x-out-of-boundaries'] = false;
+ }
+
+ return data;
+ }
+
+ /**
+ * @function
+ * @memberof Modifiers
+ * @argument {Object} data - The data object generated by `update` method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {Object} The data object, properly modified
+ */
+ function inner(data) {
+ var placement = data.placement;
+ var basePlacement = placement.split('-')[0];
+ var _data$offsets = data.offsets,
+ popper = _data$offsets.popper,
+ reference = _data$offsets.reference;
+
+ var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;
+
+ var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;
+
+ popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);
+
+ data.placement = getOppositePlacement(placement);
+ data.offsets.popper = getClientRect(popper);
+
+ return data;
+ }
+
+ /**
+ * Modifier function, each modifier can have a function of this type assigned
+ * to its `fn` property.<br />
+ * These functions will be called on each update, this means that you must
+ * make sure they are performant enough to avoid performance bottlenecks.
+ *
+ * @function ModifierFn
+ * @argument {dataObject} data - The data object generated by `update` method
+ * @argument {Object} options - Modifiers configuration and options
+ * @returns {dataObject} The data object, properly modified
+ */
+
+ /**
+ * Modifiers are plugins used to alter the behavior of your poppers.<br />
+ * Popper.js uses a set of 9 modifiers to provide all the basic functionalities
+ * needed by the library.
+ *
+ * Usually you don't want to override the `order`, `fn` and `onLoad` props.
+ * All the other properties are configurations that could be tweaked.
+ * @namespace modifiers
+ */
+ var modifiers = {
+ /**
+ * Modifier used to shift the popper on the start or end of its reference
+ * element.<br />
+ * It will read the variation of the `placement` property.<br />
+ * It can be one either `-end` or `-start`.
+ * @memberof modifiers
+ * @inner
+ */
+ shift: {
+ /** @prop {number} order=100 - Index used to define the order of execution */
+ order: 100,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: shift
+ },
+
+ /**
+ * The `offset` modifier can shift your popper on both its axis.
+ *
+ * It accepts the following units:
+ * - `px` or unit-less, interpreted as pixels
+ * - `%` or `%r`, percentage relative to the length of the reference element
+ * - `%p`, percentage relative to the length of the popper element
+ * - `vw`, CSS viewport width unit
+ * - `vh`, CSS viewport height unit
+ *
+ * For length is intended the main axis relative to the placement of the popper.<br />
+ * This means that if the placement is `top` or `bottom`, the length will be the
+ * `width`. In case of `left` or `right`, it will be the `height`.
+ *
+ * You can provide a single value (as `Number` or `String`), or a pair of values
+ * as `String` divided by a comma or one (or more) white spaces.<br />
+ * The latter is a deprecated method because it leads to confusion and will be
+ * removed in v2.<br />
+ * Additionally, it accepts additions and subtractions between different units.
+ * Note that multiplications and divisions aren't supported.
+ *
+ * Valid examples are:
+ * ```
+ * 10
+ * '10%'
+ * '10, 10'
+ * '10%, 10'
+ * '10 + 10%'
+ * '10 - 5vh + 3%'
+ * '-10px + 5vh, 5px - 6%'
+ * ```
+ * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
+ * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
+ * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
+ *
+ * @memberof modifiers
+ * @inner
+ */
+ offset: {
+ /** @prop {number} order=200 - Index used to define the order of execution */
+ order: 200,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: offset,
+ /** @prop {Number|String} offset=0
+ * The offset value as described in the modifier description
+ */
+ offset: 0
+ },
+
+ /**
+ * Modifier used to prevent the popper from being positioned outside the boundary.
+ *
+ * A scenario exists where the reference itself is not within the boundaries.<br />
+ * We can say it has "escaped the boundaries" — or just "escaped".<br />
+ * In this case we need to decide whether the popper should either:
+ *
+ * - detach from the reference and remain "trapped" in the boundaries, or
+ * - if it should ignore the boundary and "escape with its reference"
+ *
+ * When `escapeWithReference` is set to`true` and reference is completely
+ * outside its boundaries, the popper will overflow (or completely leave)
+ * the boundaries in order to remain attached to the edge of the reference.
+ *
+ * @memberof modifiers
+ * @inner
+ */
+ preventOverflow: {
+ /** @prop {number} order=300 - Index used to define the order of execution */
+ order: 300,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: preventOverflow,
+ /**
+ * @prop {Array} [priority=['left','right','top','bottom']]
+ * Popper will try to prevent overflow following these priorities by default,
+ * then, it could overflow on the left and on top of the `boundariesElement`
+ */
+ priority: ['left', 'right', 'top', 'bottom'],
+ /**
+ * @prop {number} padding=5
+ * Amount of pixel used to define a minimum distance between the boundaries
+ * and the popper. This makes sure the popper always has a little padding
+ * between the edges of its container
+ */
+ padding: 5,
+ /**
+ * @prop {String|HTMLElement} boundariesElement='scrollParent'
+ * Boundaries used by the modifier. Can be `scrollParent`, `window`,
+ * `viewport` or any DOM element.
+ */
+ boundariesElement: 'scrollParent'
+ },
+
+ /**
+ * Modifier used to make sure the reference and its popper stay near each other
+ * without leaving any gap between the two. Especially useful when the arrow is
+ * enabled and you want to ensure that it points to its reference element.
+ * It cares only about the first axis. You can still have poppers with margin
+ * between the popper and its reference element.
+ * @memberof modifiers
+ * @inner
+ */
+ keepTogether: {
+ /** @prop {number} order=400 - Index used to define the order of execution */
+ order: 400,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: keepTogether
+ },
+
+ /**
+ * This modifier is used to move the `arrowElement` of the popper to make
+ * sure it is positioned between the reference element and its popper element.
+ * It will read the outer size of the `arrowElement` node to detect how many
+ * pixels of conjunction are needed.
+ *
+ * It has no effect if no `arrowElement` is provided.
+ * @memberof modifiers
+ * @inner
+ */
+ arrow: {
+ /** @prop {number} order=500 - Index used to define the order of execution */
+ order: 500,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: arrow,
+ /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
+ element: '[x-arrow]'
+ },
+
+ /**
+ * Modifier used to flip the popper's placement when it starts to overlap its
+ * reference element.
+ *
+ * Requires the `preventOverflow` modifier before it in order to work.
+ *
+ * **NOTE:** this modifier will interrupt the current update cycle and will
+ * restart it if it detects the need to flip the placement.
+ * @memberof modifiers
+ * @inner
+ */
+ flip: {
+ /** @prop {number} order=600 - Index used to define the order of execution */
+ order: 600,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: flip,
+ /**
+ * @prop {String|Array} behavior='flip'
+ * The behavior used to change the popper's placement. It can be one of
+ * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
+ * placements (with optional variations)
+ */
+ behavior: 'flip',
+ /**
+ * @prop {number} padding=5
+ * The popper will flip if it hits the edges of the `boundariesElement`
+ */
+ padding: 5,
+ /**
+ * @prop {String|HTMLElement} boundariesElement='viewport'
+ * The element which will define the boundaries of the popper position.
+ * The popper will never be placed outside of the defined boundaries
+ * (except if `keepTogether` is enabled)
+ */
+ boundariesElement: 'viewport',
+ /**
+ * @prop {Boolean} flipVariations=false
+ * The popper will switch placement variation between `-start` and `-end` when
+ * the reference element overlaps its boundaries.
+ *
+ * The original placement should have a set variation.
+ */
+ flipVariations: false,
+ /**
+ * @prop {Boolean} flipVariationsByContent=false
+ * The popper will switch placement variation between `-start` and `-end` when
+ * the popper element overlaps its reference boundaries.
+ *
+ * The original placement should have a set variation.
+ */
+ flipVariationsByContent: false
+ },
+
+ /**
+ * Modifier used to make the popper flow toward the inner of the reference element.
+ * By default, when this modifier is disabled, the popper will be placed outside
+ * the reference element.
+ * @memberof modifiers
+ * @inner
+ */
+ inner: {
+ /** @prop {number} order=700 - Index used to define the order of execution */
+ order: 700,
+ /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
+ enabled: false,
+ /** @prop {ModifierFn} */
+ fn: inner
+ },
+
+ /**
+ * Modifier used to hide the popper when its reference element is outside of the
+ * popper boundaries. It will set a `x-out-of-boundaries` attribute which can
+ * be used to hide with a CSS selector the popper when its reference is
+ * out of boundaries.
+ *
+ * Requires the `preventOverflow` modifier before it in order to work.
+ * @memberof modifiers
+ * @inner
+ */
+ hide: {
+ /** @prop {number} order=800 - Index used to define the order of execution */
+ order: 800,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: hide
+ },
+
+ /**
+ * Computes the style that will be applied to the popper element to gets
+ * properly positioned.
+ *
+ * Note that this modifier will not touch the DOM, it just prepares the styles
+ * so that `applyStyle` modifier can apply it. This separation is useful
+ * in case you need to replace `applyStyle` with a custom implementation.
+ *
+ * This modifier has `850` as `order` value to maintain backward compatibility
+ * with previous versions of Popper.js. Expect the modifiers ordering method
+ * to change in future major versions of the library.
+ *
+ * @memberof modifiers
+ * @inner
+ */
+ computeStyle: {
+ /** @prop {number} order=850 - Index used to define the order of execution */
+ order: 850,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: computeStyle,
+ /**
+ * @prop {Boolean} gpuAcceleration=true
+ * If true, it uses the CSS 3D transformation to position the popper.
+ * Otherwise, it will use the `top` and `left` properties
+ */
+ gpuAcceleration: true,
+ /**
+ * @prop {string} [x='bottom']
+ * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.
+ * Change this if your popper should grow in a direction different from `bottom`
+ */
+ x: 'bottom',
+ /**
+ * @prop {string} [x='left']
+ * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.
+ * Change this if your popper should grow in a direction different from `right`
+ */
+ y: 'right'
+ },
+
+ /**
+ * Applies the computed styles to the popper element.
+ *
+ * All the DOM manipulations are limited to this modifier. This is useful in case
+ * you want to integrate Popper.js inside a framework or view library and you
+ * want to delegate all the DOM manipulations to it.
+ *
+ * Note that if you disable this modifier, you must make sure the popper element
+ * has its position set to `absolute` before Popper.js can do its work!
+ *
+ * Just disable this modifier and define your own to achieve the desired effect.
+ *
+ * @memberof modifiers
+ * @inner
+ */
+ applyStyle: {
+ /** @prop {number} order=900 - Index used to define the order of execution */
+ order: 900,
+ /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
+ enabled: true,
+ /** @prop {ModifierFn} */
+ fn: applyStyle,
+ /** @prop {Function} */
+ onLoad: applyStyleOnLoad,
+ /**
+ * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
+ * @prop {Boolean} gpuAcceleration=true
+ * If true, it uses the CSS 3D transformation to position the popper.
+ * Otherwise, it will use the `top` and `left` properties
+ */
+ gpuAcceleration: undefined
+ }
+ };
+
+ /**
+ * The `dataObject` is an object containing all the information used by Popper.js.
+ * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
+ * @name dataObject
+ * @property {Object} data.instance The Popper.js instance
+ * @property {String} data.placement Placement applied to popper
+ * @property {String} data.originalPlacement Placement originally defined on init
+ * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
+ * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
+ * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
+ * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
+ * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
+ * @property {Object} data.boundaries Offsets of the popper boundaries
+ * @property {Object} data.offsets The measurements of popper, reference and arrow elements
+ * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
+ * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
+ * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
+ */
+
+ /**
+ * Default options provided to Popper.js constructor.<br />
+ * These can be overridden using the `options` argument of Popper.js.<br />
+ * To override an option, simply pass an object with the same
+ * structure of the `options` object, as the 3rd argument. For example:
+ * ```
+ * new Popper(ref, pop, {
+ * modifiers: {
+ * preventOverflow: { enabled: false }
+ * }
+ * })
+ * ```
+ * @type {Object}
+ * @static
+ * @memberof Popper
+ */
+ var Defaults = {
+ /**
+ * Popper's placement.
+ * @prop {Popper.placements} placement='bottom'
+ */
+ placement: 'bottom',
+
+ /**
+ * Set this to true if you want popper to position it self in 'fixed' mode
+ * @prop {Boolean} positionFixed=false
+ */
+ positionFixed: false,
+
+ /**
+ * Whether events (resize, scroll) are initially enabled.
+ * @prop {Boolean} eventsEnabled=true
+ */
+ eventsEnabled: true,
+
+ /**
+ * Set to true if you want to automatically remove the popper when
+ * you call the `destroy` method.
+ * @prop {Boolean} removeOnDestroy=false
+ */
+ removeOnDestroy: false,
+
+ /**
+ * Callback called when the popper is created.<br />
+ * By default, it is set to no-op.<br />
+ * Access Popper.js instance with `data.instance`.
+ * @prop {onCreate}
+ */
+ onCreate: function onCreate() {},
+
+ /**
+ * Callback called when the popper is updated. This callback is not called
+ * on the initialization/creation of the popper, but only on subsequent
+ * updates.<br />
+ * By default, it is set to no-op.<br />
+ * Access Popper.js instance with `data.instance`.
+ * @prop {onUpdate}
+ */
+ onUpdate: function onUpdate() {},
+
+ /**
+ * List of modifiers used to modify the offsets before they are applied to the popper.
+ * They provide most of the functionalities of Popper.js.
+ * @prop {modifiers}
+ */
+ modifiers: modifiers
+ };
+
+ /**
+ * @callback onCreate
+ * @param {dataObject} data
+ */
+
+ /**
+ * @callback onUpdate
+ * @param {dataObject} data
+ */
+
+ // Utils
+ // Methods
+ var Popper = function () {
+ /**
+ * Creates a new Popper.js instance.
+ * @class Popper
+ * @param {Element|referenceObject} reference - The reference element used to position the popper
+ * @param {Element} popper - The HTML / XML element used as the popper
+ * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
+ * @return {Object} instance - The generated Popper.js instance
+ */
+ function Popper(reference, popper) {
+ var _this = this;
+
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ classCallCheck(this, Popper);
+
+ this.scheduleUpdate = function () {
+ return requestAnimationFrame(_this.update);
+ };
+
+ // make update() debounced, so that it only runs at most once-per-tick
+ this.update = debounce(this.update.bind(this));
+
+ // with {} we create a new object with the options inside it
+ this.options = _extends({}, Popper.Defaults, options);
+
+ // init state
+ this.state = {
+ isDestroyed: false,
+ isCreated: false,
+ scrollParents: []
+ };
+
+ // get reference and popper elements (allow jQuery wrappers)
+ this.reference = reference && reference.jquery ? reference[0] : reference;
+ this.popper = popper && popper.jquery ? popper[0] : popper;
+
+ // Deep merge modifiers options
+ this.options.modifiers = {};
+ Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {
+ _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});
+ });
+
+ // Refactoring modifiers' list (Object => Array)
+ this.modifiers = Object.keys(this.options.modifiers).map(function (name) {
+ return _extends({
+ name: name
+ }, _this.options.modifiers[name]);
+ })
+ // sort the modifiers by order
+ .sort(function (a, b) {
+ return a.order - b.order;
+ });
+
+ // modifiers have the ability to execute arbitrary code when Popper.js get inited
+ // such code is executed in the same order of its modifier
+ // they could add new properties to their options configuration
+ // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
+ this.modifiers.forEach(function (modifierOptions) {
+ if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {
+ modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);
+ }
+ });
+
+ // fire the first update to position the popper in the right place
+ this.update();
+
+ var eventsEnabled = this.options.eventsEnabled;
+ if (eventsEnabled) {
+ // setup event listeners, they will take care of update the position in specific situations
+ this.enableEventListeners();
+ }
+
+ this.state.eventsEnabled = eventsEnabled;
+ }
+
+ // We can't use class properties because they don't get listed in the
+ // class prototype and break stuff like Sinon stubs
+
+
+ createClass(Popper, [{
+ key: 'update',
+ value: function update$$1() {
+ return update.call(this);
+ }
+ }, {
+ key: 'destroy',
+ value: function destroy$$1() {
+ return destroy.call(this);
+ }
+ }, {
+ key: 'enableEventListeners',
+ value: function enableEventListeners$$1() {
+ return enableEventListeners.call(this);
+ }
+ }, {
+ key: 'disableEventListeners',
+ value: function disableEventListeners$$1() {
+ return disableEventListeners.call(this);
+ }
+
+ /**
+ * Schedules an update. It will run on the next UI update available.
+ * @method scheduleUpdate
+ * @memberof Popper
+ */
+
+
+ /**
+ * Collection of utilities useful when writing custom modifiers.
+ * Starting from version 1.7, this method is available only if you
+ * include `popper-utils.js` before `popper.js`.
+ *
+ * **DEPRECATION**: This way to access PopperUtils is deprecated
+ * and will be removed in v2! Use the PopperUtils module directly instead.
+ * Due to the high instability of the methods contained in Utils, we can't
+ * guarantee them to follow semver. Use them at your own risk!
+ * @static
+ * @private
+ * @type {Object}
+ * @deprecated since version 1.8
+ * @member Utils
+ * @memberof Popper
+ */
+
+ }]);
+ return Popper;
+ }();
+
+ /**
+ * The `referenceObject` is an object that provides an interface compatible with Popper.js
+ * and lets you use it as replacement of a real DOM node.<br />
+ * You can use this method to position a popper relatively to a set of coordinates
+ * in case you don't have a DOM node to use as reference.
+ *
+ * ```
+ * new Popper(referenceObject, popperNode);
+ * ```
+ *
+ * NB: This feature isn't supported in Internet Explorer 10.
+ * @name referenceObject
+ * @property {Function} data.getBoundingClientRect
+ * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.
+ * @property {number} data.clientWidth
+ * An ES6 getter that will return the width of the virtual reference element.
+ * @property {number} data.clientHeight
+ * An ES6 getter that will return the height of the virtual reference element.
+ */
+
+
+ Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;
+ Popper.placements = placements;
+ Popper.Defaults = Defaults;
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$4 = 'dropdown';
+ var VERSION$4 = '4.3.1';
+ var DATA_KEY$4 = 'bs.dropdown';
+ var EVENT_KEY$4 = "." + DATA_KEY$4;
+ var DATA_API_KEY$4 = '.data-api';
+ var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
+
+ var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
+
+ var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
+
+ var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
+
+ var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
+ var Event$4 = {
+ HIDE: "hide" + EVENT_KEY$4,
+ HIDDEN: "hidden" + EVENT_KEY$4,
+ SHOW: "show" + EVENT_KEY$4,
+ SHOWN: "shown" + EVENT_KEY$4,
+ CLICK: "click" + EVENT_KEY$4,
+ CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4,
+ KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4,
+ KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4
+ };
+ var ClassName$4 = {
+ DISABLED: 'disabled',
+ SHOW: 'show',
+ DROPUP: 'dropup',
+ DROPRIGHT: 'dropright',
+ DROPLEFT: 'dropleft',
+ MENURIGHT: 'dropdown-menu-right',
+ MENULEFT: 'dropdown-menu-left',
+ POSITION_STATIC: 'position-static'
+ };
+ var Selector$4 = {
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
+ FORM_CHILD: '.dropdown form',
+ MENU: '.dropdown-menu',
+ NAVBAR_NAV: '.navbar-nav',
+ // Boosted mod
+ MENU_ITEMS: '.dropdown-menu .dropdown-item',
+ FIRST_ITEM_IN_MENU: '.dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)',
+ // end mod
+ VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
+ };
+ var AttachmentMap = {
+ TOP: 'top-start',
+ TOPEND: 'top-end',
+ BOTTOM: 'bottom-start',
+ BOTTOMEND: 'bottom-end',
+ RIGHT: 'right-start',
+ RIGHTEND: 'right-end',
+ LEFT: 'left-start',
+ LEFTEND: 'left-end'
+ };
+ var Default$2 = {
+ offset: 0,
+ flip: true,
+ boundary: 'scrollParent',
+ reference: 'toggle',
+ display: 'dynamic'
+ };
+ var DefaultType$2 = {
+ offset: '(number|string|function)',
+ flip: 'boolean',
+ boundary: '(string|element)',
+ reference: '(string|element)',
+ display: 'string'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Dropdown =
+ /*#__PURE__*/
+ function () {
+ function Dropdown(element, config) {
+ this._element = element;
+ this._popper = null;
+ this._config = this._getConfig(config);
+ this._menu = this._getMenuElement();
+ this._inNavbar = this._detectNavbar();
+
+ this._addEventListeners();
+
+ this._addAccessibility(); // Boosted mod
+
+ } // Getters
+
+
+ var _proto = Dropdown.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {
+ return;
+ }
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
+
+ Dropdown._clearMenus();
+
+ if (isActive) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var showEvent = $.Event(Event$4.SHOW, relatedTarget);
+ $(parent).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented()) {
+ return;
+ } // Disable totally Popper.js for Dropdown in Navbar
+
+
+ if (!this._inNavbar) {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
+ }
+
+ var referenceElement = this._element;
+
+ if (this._config.reference === 'parent') {
+ referenceElement = parent;
+ } else if (Util.isElement(this._config.reference)) {
+ referenceElement = this._config.reference; // Check if it's jQuery element
+
+ if (typeof this._config.reference.jquery !== 'undefined') {
+ referenceElement = this._config.reference[0];
+ }
+ } // If boundary is not `scrollParent`, then set position to `static`
+ // to allow the menu to "escape" the scroll parent's boundaries
+ // https://github.com/twbs/bootstrap/issues/24251
+
+
+ if (this._config.boundary !== 'scrollParent') {
+ $(parent).addClass(ClassName$4.POSITION_STATIC);
+ }
+
+ this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
+ } // If this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+
+
+ if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {
+ $(document.body).children().on('mouseover', null, $.noop);
+ }
+
+ this._element.focus();
+
+ this._element.setAttribute('aria-expanded', true);
+
+ $(this._menu).toggleClass(ClassName$4.SHOW);
+ $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
+ };
+
+ _proto.show = function show() {
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var showEvent = $.Event(Event$4.SHOW, relatedTarget);
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ $(parent).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $(this._menu).toggleClass(ClassName$4.SHOW);
+ $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget)); // Boosted mod
+
+ $(parent).find(Selector$4.FIRST_ITEM_IN_MENU).first().trigger('focus'); // end mod
+ };
+
+ _proto.hide = function hide() {
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ $(parent).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $(this._menu).toggleClass(ClassName$4.SHOW);
+ $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$4);
+ $(this._element).off(EVENT_KEY$4);
+ this._element = null;
+ this._menu = null;
+
+ if (this._popper !== null) {
+ this._popper.destroy();
+
+ this._popper = null;
+ }
+ };
+
+ _proto.update = function update() {
+ this._inNavbar = this._detectNavbar();
+
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ } // Private
+ ;
+
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this = this;
+
+ $(this._element).on(Event$4.CLICK, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ _this.toggle();
+ });
+ };
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
+ Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
+ return config;
+ };
+
+ _proto._getMenuElement = function _getMenuElement() {
+ if (!this._menu) {
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ if (parent) {
+ this._menu = parent.querySelector(Selector$4.MENU);
+ }
+ }
+
+ return this._menu;
+ };
+
+ _proto._getPlacement = function _getPlacement() {
+ var $parentDropdown = $(this._element.parentNode);
+ var placement = AttachmentMap.BOTTOM; // Handle dropup
+
+ if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {
+ placement = AttachmentMap.TOP;
+
+ if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
+ placement = AttachmentMap.TOPEND;
+ }
+ } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {
+ placement = AttachmentMap.RIGHT;
+ } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {
+ placement = AttachmentMap.LEFT;
+ } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
+ placement = AttachmentMap.BOTTOMEND;
+ }
+
+ return placement;
+ };
+
+ _proto._detectNavbar = function _detectNavbar() {
+ return $(this._element).closest('.navbar').length > 0;
+ };
+
+ _proto._getOffset = function _getOffset() {
+ var _this2 = this;
+
+ var offset = {};
+
+ if (typeof this._config.offset === 'function') {
+ offset.fn = function (data) {
+ data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
+ return data;
+ };
+ } else {
+ offset.offset = this._config.offset;
+ }
+
+ return offset;
+ };
+
+ _proto._getPopperConfig = function _getPopperConfig() {
+ var popperConfig = {
+ placement: this._getPlacement(),
+ modifiers: {
+ offset: this._getOffset(),
+ flip: {
+ enabled: this._config.flip
+ },
+ preventOverflow: {
+ boundariesElement: this._config.boundary
+ }
+ } // Disable Popper.js if we have a static display
+
+ };
+
+ if (this._config.display === 'static') {
+ popperConfig.modifiers.applyStyle = {
+ enabled: false
+ };
+ }
+
+ return popperConfig;
+ } // Boosted mod
+ ;
+
+ _proto._addAccessibility = function _addAccessibility() {
+ $(this._element).attr('aria-haspopup', true); // ensure that dropdown-menu have the role menu
+
+ $(this._element).parent().children(Selector$4.MENU).attr('role', 'menu'); // ensure that dropdown-itm's have the role menuitem
+
+ $(this._element).parent().children(Selector$4.MENU).children('.dropdown-item').attr('role', 'menuitem');
+ } // end mod
+ // Static
+ ;
+
+ Dropdown._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$4);
+
+ var _config = typeof config === 'object' ? config : null;
+
+ if (!data) {
+ data = new Dropdown(this, _config);
+ $(this).data(DATA_KEY$4, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ Dropdown._clearMenus = function _clearMenus(event) {
+ if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
+ return;
+ }
+
+ var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));
+
+ for (var i = 0, len = toggles.length; i < len; i++) {
+ var parent = Dropdown._getParentFromElement(toggles[i]);
+
+ var context = $(toggles[i]).data(DATA_KEY$4);
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
+
+ if (event && event.type === 'click') {
+ relatedTarget.clickEvent = event;
+ }
+
+ if (!context) {
+ continue;
+ }
+
+ var dropdownMenu = context._menu;
+
+ if (!$(parent).hasClass(ClassName$4.SHOW)) {
+ continue;
+ }
+
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
+ continue;
+ }
+
+ var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
+ $(parent).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ continue;
+ } // If this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+
+
+ if ('ontouchstart' in document.documentElement) {
+ $(document.body).children().off('mouseover', null, $.noop);
+ }
+
+ toggles[i].setAttribute('aria-expanded', 'false');
+ $(dropdownMenu).removeClass(ClassName$4.SHOW);
+ $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
+ }
+ };
+
+ Dropdown._getParentFromElement = function _getParentFromElement(element) {
+ var parent;
+ var selector = Util.getSelectorFromElement(element);
+
+ if (selector) {
+ parent = document.querySelector(selector);
+ }
+
+ return parent || element.parentNode;
+ } // eslint-disable-next-line complexity
+ ;
+
+ Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
+ // If not input/textarea:
+ // - And not a key in REGEXP_KEYDOWN => not a dropdown command
+ // If input/textarea:
+ // - If space key => not a dropdown command
+ // - If key is other than escape
+ // - If key is not up or down => not a dropdown command
+ // - If trigger inside the menu => not a dropdown command
+ if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
+ return;
+ }
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {
+ return;
+ }
+
+ var parent = Dropdown._getParentFromElement(this);
+
+ var isActive = $(parent).hasClass(ClassName$4.SHOW);
+
+ if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
+ if (event.which === ESCAPE_KEYCODE) {
+ var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
+ $(toggle).trigger('focus');
+ }
+
+ $(this).trigger('click');
+ return;
+ }
+
+ var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));
+
+ if (items.length === 0) {
+ return;
+ }
+
+ var index = items.indexOf(event.target);
+
+ if (event.which === ARROW_UP_KEYCODE && index > 0) {
+ // Up
+ index--;
+ }
+
+ if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
+ // Down
+ index++;
+ }
+
+ if (index < 0) {
+ index = 0;
+ }
+
+ items[index].focus();
+ };
+
+ _createClass(Dropdown, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$4;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$2;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$2;
+ }
+ }]);
+
+ return Dropdown;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ Dropdown._jQueryInterface.call($(this), 'toggle');
+ }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {
+ e.stopPropagation();
+ }) // Boosted mod
+ .on('DOMContentLoaded', function () {
+ // Instanciate every dropdown in the DOM
+ Dropdown._jQueryInterface.call($(Selector$4.DATA_TOGGLE), 'init');
+ }); // end mod
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$4] = Dropdown._jQueryInterface;
+ $.fn[NAME$4].Constructor = Dropdown;
+
+ $.fn[NAME$4].noConflict = function () {
+ $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;
+ return Dropdown._jQueryInterface;
+ };
+
+ /* eslint no-magic-numbers: ["error", { "ignore": [1,2] }] */
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$5 = 'megamenu';
+ var VERSION$5 = '4.3.1';
+ var DATA_KEY$5 = 'bs.megamenu';
+ var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];
+ var ARROW_LEFT_KEYCODE$1 = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_RIGHT_KEYCODE$1 = 39; // KeyboardEvent.which value for right arrow key
+
+ var ARROW_UP_KEYCODE$1 = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_DOWN_KEYCODE$1 = 40; // KeyboardEvent.which value for down arrow key
+
+ var TIMEOUT = 1000; // Timeout befor focusing first element
+
+ var PERCENTAGE = 100; // Width slide proportion
+
+ var SPLITLENGHT = 4;
+ var ClassName$5 = {
+ TRANSITIONING: 'transitioning'
+ };
+ var Selector$5 = {
+ MEGAMENU: '.mega-menu',
+ ROOT_NAV: '.mega-menu > .navbar-nav',
+ MEGAMENU_PANEL: '.mega-menu-panel',
+ MEGAMENU_NAV: '.nav-link + .navbar-nav',
+ NAV_MENU: '.navbar-nav',
+ NAV_ITEM: '.nav-item',
+ NAV_LINK: '.nav-link',
+ NAV_LINK_COLLAPSE: '.nav-link[data-toggle=collapse]',
+ NAV_LINK_BACK: '.nav-link.back',
+ NAV_LINK_EXPANDED: '.nav-link[aria-expanded=true]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var MegaMenu =
+ /*#__PURE__*/
+ function () {
+ function MegaMenu(element, config) {
+ this._element = element;
+ this._$navLinks = $(this._element).find(Selector$5.NAV_LINK);
+ this._$goForwardLinks = $(this._element).find(Selector$5.MEGAMENU_NAV).prev(Selector$5.NAV_LINK);
+ this._$goBackLinks = $(this._element).find(Selector$5.NAV_LINK_BACK);
+ this._$topCollapseMenus = $(this._element).find(Selector$5.MEGAMENU_PANEL);
+ this._$navLinkCollapses = $(this._element).find(Selector$5.NAV_LINK_COLLAPSE);
+ this._config = config;
+
+ if (typeof this._config.noFocus === 'undefined') {
+ this._config.noFocus = false;
+ }
+
+ this._addEventListeners();
+
+ this._addAriaAttributes(this._element);
+
+ this.goTo = this._initPosition;
+ } // getters
+
+
+ var _proto = MegaMenu.prototype;
+
+ // public
+ // private
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this = this;
+
+ this._$goForwardLinks.on('click', function (event) {
+ return _this._goForward(event);
+ });
+
+ this._$goBackLinks.on('click', function (event) {
+ return _this._goBackward(event);
+ });
+
+ this._$navLinks.on('keydown', function (event) {
+ return _this._manageKeyDown(event);
+ });
+
+ if (!this._config.noFocus) {
+ this._$topCollapseMenus.on('shown.bs.collapse', this._collapseFocus);
+ }
+
+ this._$navLinkCollapses.on('click', function (event) {
+ return _this._handleCollapseToggle(event);
+ });
+ };
+
+ _proto._addAriaAttributes = function _addAriaAttributes(element) {
+ var $subNavs = $(element).find('.nav-link + .navbar-nav');
+ $(element).attr('role', 'application');
+ $(element).find('> .navbar-nav').attr('role', 'menu');
+ $(element).find(Selector$5.MEGAMENU_PANEL).attr('role', 'menu');
+ $(element).find('.nav-link[data-toggle=collapse]').attr('role', 'menuitem');
+ $(element).find(Selector$5.NAV_LINK_BACK).attr({
+ 'aria-hidden': true
+ });
+ $(element).find(Selector$5.NAV_ITEM).attr('role', 'presentation');
+ $subNavs.each(function () {
+ var navId = Util.getUID(NAME$5);
+ var $thisNavToggler = $(this).prev(Selector$5.NAV_LINK);
+ var $thisNav = $(this);
+ var $thisNavBackLink = $thisNav.find(Selector$5.NAV_LINK_BACK);
+ var $topMenu = $(this).closest(Selector$5.NAV_MENU).parent().closest(Selector$5.NAV_MENU).prev(Selector$5.NAV_LINK);
+ var goBackLabel = "go back to " + $topMenu.text() + " menu";
+
+ if (!$topMenu.length) {
+ goBackLabel = "go back to " + $(this).closest(Selector$5.MEGAMENU_PANEL).prev(Selector$5.NAV_LINK).text() + " menu";
+ }
+
+ $thisNav.attr({
+ id: navId,
+ role: 'menu'
+ });
+ $thisNavToggler.attr({
+ role: 'menuitem',
+ 'aria-controls': navId,
+ 'aria-expanded': false,
+ 'aria-haspopup': true
+ });
+ $thisNavBackLink.attr({
+ role: 'menuitem',
+ 'aria-controls': navId,
+ 'aria-label': goBackLabel
+ });
+ });
+ };
+
+ _proto._initPosition = function _initPosition(target) {
+ var _this2 = this;
+
+ if (!$(target).length) {
+ return;
+ }
+
+ var $target = $(target).first();
+ var position = $target.parents().index(this._element);
+ var rootPosition = $('.mega-menu-panel .nav-link').first().parents().index($('.mega-menu'));
+ var translatePercentage = -(position - rootPosition) * PERCENTAGE / 2;
+ var $thisNav = $target.closest(Selector$5.NAV_MENU);
+ var $rootNav = $(Selector$5.ROOT_NAV);
+ $rootNav.addClass(ClassName$5.TRANSITIONING); // open collapse
+
+ if ($target.attr('data-toggle') === 'collapse') {
+ $target.siblings(Selector$5.MEGAMENU_PANEL).collapse('show');
+
+ this._$topCollapseMenus.not($target.siblings(Selector$5.MEGAMENU_PANEL)).collapse('hide');
+
+ $(this._element).height('auto');
+ $rootNav.css('transform', 'translateX(0%)');
+ } else {
+ $target.closest(Selector$5.MEGAMENU_PANEL).collapse('show');
+
+ this._$topCollapseMenus.not($target.closest(Selector$5.MEGAMENU_PANEL)).collapse('hide'); // show menu and hide other
+
+
+ $target.parents(Selector$5.NAV_MENU).show(); // set aria on parent links
+
+ $target.parents(Selector$5.NAV_ITEM).find('> .nav-link').not($target).attr({
+ tabindex: -1,
+ 'aria-hidden': true,
+ 'aria-expanded': true
+ }); // translate to pos
+
+ $rootNav.css('transform', "translateX(" + translatePercentage + "%)");
+
+ if (translatePercentage) {
+ // adapt main collapse height to target height
+ $(this._element).height($thisNav.height());
+ } else {
+ $(this._element).height('auto');
+ }
+ } // set focus on target link
+
+
+ setTimeout(function () {
+ if (!_this2._config.noFocus) {
+ // set focus on target link
+ $target.trigger('focus');
+ }
+
+ $rootNav.removeClass(ClassName$5.TRANSITIONING);
+ }, TIMEOUT);
+ };
+
+ _proto._manageKeyDown = function _manageKeyDown(event) {
+ var $thisTarget = $(event.target); // test key code
+
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ } // proceed according to key code
+
+
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE$1:
+ this._goBackward(event);
+
+ break;
+
+ case ARROW_RIGHT_KEYCODE$1:
+ this._goForward(event);
+
+ break;
+
+ case ARROW_UP_KEYCODE$1:
+ // focus prev nav link
+ $thisTarget.parent().prev().find('>.nav-link').not(Selector$5.NAV_LINK_BACK).trigger('focus');
+ break;
+
+ case ARROW_DOWN_KEYCODE$1:
+ // focus next nav link
+ $thisTarget.parent().next().find('>.nav-link').trigger('focus');
+ break;
+
+ default:
+ }
+ };
+
+ _proto._collapseFocus = function _collapseFocus() {
+ $(this).find(Selector$5.NAV_LINK).not(Selector$5.NAV_LINK_BACK).first().trigger('focus');
+ };
+
+ _proto._handleCollapseToggle = function _handleCollapseToggle(e) {
+ var $this = $(e.target);
+ var $thisCollapse = $($this.attr('href'));
+
+ this._$topCollapseMenus.not($thisCollapse).collapse('hide');
+ };
+
+ _proto._goForward = function _goForward(e) {
+ e.preventDefault();
+ var $this = $(e.target);
+ var $thisNav = $this.closest(Selector$5.NAV_MENU);
+ var $targetNav = $this.next(Selector$5.NAV_MENU);
+ var $rootNav = $(Selector$5.ROOT_NAV);
+ var $thisNavToggler = $this;
+ var currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10);
+ var navWidth = $rootNav.width();
+ var currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth;
+
+ if (!$this.next(Selector$5.NAV_MENU).length || $rootNav.hasClass(ClassName$5.TRANSITIONING)) {
+ return false;
+ }
+
+ $rootNav.addClass(ClassName$5.TRANSITIONING); // hide all nav on same level
+
+ $thisNav.find(Selector$5.NAV_MENU).hide(); // show target navbar-nav
+
+ $targetNav.show(); // adapt main collapse height to target height
+
+ $(Selector$5.MEGAMENU).height($targetNav.height()); // make only visible elements focusable
+
+ if (!currentTranslatePercentage) {
+ $rootNav.find('>.nav-item .nav-link').attr({
+ tabindex: -1,
+ 'aria-hidden': true
+ });
+ }
+
+ $thisNav.find(Selector$5.NAV_LINK).attr({
+ tabindex: -1,
+ 'aria-hidden': true
+ });
+ $targetNav.find(Selector$5.NAV_LINK).attr({
+ tabindex: 0,
+ 'aria-hidden': false
+ }); // translate menu
+
+ $rootNav.css('transform', "translateX(" + (currentTranslatePercentage - PERCENTAGE) + "%)"); // focus on target nav first item
+
+ $rootNav.one('transitionend', function () {
+ $thisNavToggler.attr('aria-expanded', true);
+ $targetNav.find(Selector$5.NAV_LINK).not(Selector$5.NAV_LINK_BACK).first().trigger('focus');
+ $rootNav.removeClass(ClassName$5.TRANSITIONING);
+ });
+ return true;
+ };
+
+ _proto._goBackward = function _goBackward(e) {
+ e.preventDefault();
+ var $this = $(e.target);
+ var $thisNav = $this.closest(Selector$5.NAV_MENU);
+ var $targetNav = $thisNav.parent().closest(Selector$5.NAV_MENU);
+ var $rootNav = $(Selector$5.ROOT_NAV);
+ var $targetNavToggler = $targetNav.find(Selector$5.NAV_LINK_EXPANDED);
+ var currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10);
+ var navWidth = $rootNav.width();
+ var currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth;
+
+ if (!currentTranslatePercentage || $rootNav.hasClass(ClassName$5.TRANSITIONING)) {
+ return false;
+ }
+
+ $rootNav.addClass(ClassName$5.TRANSITIONING); // make only visible elements focusable
+
+ $targetNav.find(Selector$5.NAV_LINK).attr({
+ tabindex: 0,
+ 'aria-hidden': false
+ });
+
+ if (currentTranslatePercentage === -PERCENTAGE) {
+ // reset main collapse height
+ $(Selector$5.MEGAMENU).css('height', 'auto');
+ $rootNav.find('>.nav-item .nav-link').attr({
+ tabindex: 0,
+ 'aria-hidden': false
+ });
+ } // translate menu
+
+
+ $rootNav.css('transform', "translateX(" + (currentTranslatePercentage + PERCENTAGE) + "%)"); // focus on target nav first item
+
+ $rootNav.one('transitionend', function () {
+ $targetNavToggler.attr('aria-expanded', false);
+ $targetNavToggler.trigger('focus');
+ $thisNav.hide();
+ $rootNav.removeClass(ClassName$5.TRANSITIONING);
+ });
+ return true;
+ } // static
+ ;
+
+ MegaMenu._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ if (!$(this).is(Selector$5.MEGAMENU)) {
+ throw new TypeError('Element is not a mega menu');
+ }
+
+ if (!config) {
+ config = {};
+ } else if (config.noFocus && typeof config.noFocus !== 'boolean') {
+ // param = true
+ throw new TypeError('no-focus parameter must be boolean');
+ }
+
+ var data = $(this).data(DATA_KEY$5);
+
+ if (!data) {
+ data = new MegaMenu(this, config);
+ $(this).data(DATA_KEY$5, data);
+ }
+
+ if (config.target) {
+ if (typeof config.target !== 'string' || !/^[.#].*/.test(config.target)) {
+ throw new TypeError("Selector \"" + config.target + "\" is not supported");
+ }
+
+ data.goTo(config.target);
+ }
+ });
+ };
+
+ _createClass(MegaMenu, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$5;
+ }
+ }]);
+
+ return MegaMenu;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$5] = MegaMenu._jQueryInterface;
+ $.fn[NAME$5].Constructor = MegaMenu;
+
+ $.fn[NAME$5].noConflict = function () {
+ $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;
+ return MegaMenu._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$6 = 'modal';
+ var VERSION$6 = '4.3.1';
+ var DATA_KEY$6 = 'bs.modal';
+ var EVENT_KEY$5 = "." + DATA_KEY$6;
+ var DATA_API_KEY$5 = '.data-api';
+ var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
+ var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var Default$3 = {
+ backdrop: true,
+ keyboard: true,
+ focus: true,
+ show: true
+ };
+ var DefaultType$3 = {
+ backdrop: '(boolean|string)',
+ keyboard: 'boolean',
+ focus: 'boolean',
+ show: 'boolean'
+ };
+ var Event$5 = {
+ HIDE: "hide" + EVENT_KEY$5,
+ HIDDEN: "hidden" + EVENT_KEY$5,
+ SHOW: "show" + EVENT_KEY$5,
+ SHOWN: "shown" + EVENT_KEY$5,
+ FOCUSIN: "focusin" + EVENT_KEY$5,
+ RESIZE: "resize" + EVENT_KEY$5,
+ CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5,
+ KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5,
+ MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5,
+ MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5,
+ CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5
+ };
+ var ClassName$6 = {
+ SCROLLABLE: 'modal-dialog-scrollable',
+ SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
+ BACKDROP: 'modal-backdrop',
+ OPEN: 'modal-open',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$6 = {
+ DIALOG: '.modal-dialog',
+ MODAL_BODY: '.modal-body',
+ DATA_TOGGLE: '[data-toggle="modal"]',
+ DATA_DISMISS: '[data-dismiss="modal"]',
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .position-fixed'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Modal =
+ /*#__PURE__*/
+ function () {
+ function Modal(element, config) {
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._dialog = element.querySelector(Selector$6.DIALOG);
+ this._backdrop = null;
+ this._isShown = false;
+ this._isBodyOverflowing = false;
+ this._ignoreBackdropClick = false;
+ this._isTransitioning = false;
+ this._scrollbarWidth = 0; // Boosted mod
+
+ this._addAria(); // end mod
+
+ } // Getters
+
+
+ var _proto = Modal.prototype;
+
+ // Public
+ _proto.toggle = function toggle(relatedTarget) {
+ return this._isShown ? this.hide() : this.show(relatedTarget);
+ };
+
+ _proto.show = function show(relatedTarget) {
+ var _this = this;
+
+ if (this._isShown || this._isTransitioning) {
+ return;
+ }
+
+ if ($(this._element).hasClass(ClassName$6.FADE)) {
+ this._isTransitioning = true;
+ }
+
+ var showEvent = $.Event(Event$5.SHOW, {
+ relatedTarget: relatedTarget
+ });
+ $(this._element).trigger(showEvent);
+
+ if (this._isShown || showEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._isShown = true;
+
+ this._checkScrollbar();
+
+ this._setScrollbar();
+
+ this._setEscapeEvent();
+
+ $(this._element).on(Event$5.CLICK_DISMISS, Selector$6.DATA_DISMISS, function (event) {
+ return _this.hide(event);
+ });
+ $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {
+ $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {
+ if ($(event.target).is(_this._element)) {
+ _this._ignoreBackdropClick = true;
+ }
+ });
+ });
+
+ this._showBackdrop(function () {
+ return _this._showElement(relatedTarget);
+ });
+ };
+
+ _proto.hide = function hide(event) {
+ var _this2 = this;
+
+ if (event) {
+ event.preventDefault();
+ }
+
+ if (!this._isShown || this._isTransitioning) {
+ return;
+ }
+
+ var hideEvent = $.Event(Event$5.HIDE);
+ $(this._element).trigger(hideEvent);
+
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._isShown = false;
+ var transition = $(this._element).hasClass(ClassName$6.FADE);
+
+ if (transition) {
+ this._isTransitioning = true;
+ }
+
+ this._setEscapeEvent();
+
+ $(document).off(Event$5.FOCUSIN);
+ $(this._element).removeClass(ClassName$6.SHOW);
+ $(this._element).off(Event$5.CLICK_DISMISS);
+ $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);
+
+ if (transition) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this2._hideModal(event);
+ }).emulateTransitionEnd(transitionDuration);
+ } else {
+ this._hideModal();
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ [window, this._element, this._dialog].forEach(function (htmlElement) {
+ return $(htmlElement).off(EVENT_KEY$5);
+ });
+ /**
+ * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
+ * Do not move `document` in `htmlElements` array
+ * It will remove `Event.CLICK_DATA_API` event that should remain
+ */
+
+ $(document).off(Event$5.FOCUSIN);
+ $.removeData(this._element, DATA_KEY$6);
+ this._config = null;
+ this._element = null;
+ this._dialog = null;
+ this._backdrop = null;
+ this._isShown = null;
+ this._isBodyOverflowing = null;
+ this._ignoreBackdropClick = null;
+ this._isTransitioning = null;
+ this._scrollbarWidth = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$3, config);
+ Util.typeCheckConfig(NAME$6, config, DefaultType$3);
+ return config;
+ };
+
+ _proto._showElement = function _showElement(relatedTarget) {
+ var _this3 = this;
+
+ var transition = $(this._element).hasClass(ClassName$6.FADE);
+
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
+ // Don't move modal's DOM position
+ document.body.appendChild(this._element);
+ }
+
+ this._element.style.display = 'block';
+
+ this._element.removeAttribute('aria-hidden');
+
+ this._element.setAttribute('aria-modal', true);
+
+ if ($(this._dialog).hasClass(ClassName$6.SCROLLABLE)) {
+ this._dialog.querySelector(Selector$6.MODAL_BODY).scrollTop = 0;
+ } else {
+ this._element.scrollTop = 0;
+ }
+
+ if (transition) {
+ Util.reflow(this._element);
+ }
+
+ $(this._element).addClass(ClassName$6.SHOW);
+
+ if (this._config.focus) {
+ this._enforceFocus();
+ }
+
+ var shownEvent = $.Event(Event$5.SHOWN, {
+ relatedTarget: relatedTarget
+ });
+
+ var transitionComplete = function transitionComplete() {
+ if (_this3._config.focus) {
+ _this3._element.focus();
+ }
+
+ _this3._isTransitioning = false;
+ $(_this3._element).trigger(shownEvent);
+ };
+
+ if (transition) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
+ $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
+ } else {
+ transitionComplete();
+ }
+ };
+
+ _proto._enforceFocus = function _enforceFocus() {
+ var _this4 = this;
+
+ $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
+ .on(Event$5.FOCUSIN, function (event) {
+ if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
+ _this4._element.focus();
+ }
+ });
+ };
+
+ _proto._setEscapeEvent = function _setEscapeEvent() {
+ var _this5 = this;
+
+ if (this._isShown && this._config.keyboard) {
+ $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
+ if (event.which === ESCAPE_KEYCODE$1) {
+ event.preventDefault();
+
+ _this5.hide();
+ }
+ });
+ } else if (!this._isShown) {
+ $(this._element).off(Event$5.KEYDOWN_DISMISS);
+ }
+ };
+
+ _proto._hideModal = function _hideModal() {
+ var _this6 = this;
+
+ this._element.style.display = 'none';
+
+ this._element.setAttribute('aria-hidden', true);
+
+ this._element.removeAttribute('aria-modal');
+
+ this._isTransitioning = false;
+
+ this._showBackdrop(function () {
+ $(document.body).removeClass(ClassName$6.OPEN);
+
+ _this6._resetScrollbar();
+
+ $(_this6._element).trigger(Event$5.HIDDEN);
+ });
+ };
+
+ _proto._removeBackdrop = function _removeBackdrop() {
+ if (this._backdrop) {
+ $(this._backdrop).remove();
+ this._backdrop = null;
+ }
+ };
+
+ _proto._showBackdrop = function _showBackdrop(callback) {
+ var _this7 = this;
+
+ var animate = $(this._element).hasClass(ClassName$6.FADE) ? ClassName$6.FADE : '';
+
+ if (this._isShown && this._config.backdrop) {
+ this._backdrop = document.createElement('div');
+ this._backdrop.className = ClassName$6.BACKDROP;
+
+ if (animate) {
+ this._backdrop.classList.add(animate);
+ }
+
+ $(this._backdrop).appendTo(document.body);
+ $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
+ if (_this7._ignoreBackdropClick) {
+ _this7._ignoreBackdropClick = false;
+ return;
+ }
+
+ if (event.target !== event.currentTarget) {
+ return;
+ }
+
+ if (_this7._config.backdrop === 'static') {
+ _this7._element.focus();
+ } else {
+ _this7.hide();
+ }
+ });
+
+ if (animate) {
+ Util.reflow(this._backdrop);
+ }
+
+ $(this._backdrop).addClass(ClassName$6.SHOW);
+
+ if (!callback) {
+ return;
+ }
+
+ if (!animate) {
+ callback();
+ return;
+ }
+
+ var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
+ $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
+ } else if (!this._isShown && this._backdrop) {
+ $(this._backdrop).removeClass(ClassName$6.SHOW);
+
+ var callbackRemove = function callbackRemove() {
+ _this7._removeBackdrop();
+
+ if (callback) {
+ callback();
+ }
+ };
+
+ if ($(this._element).hasClass(ClassName$6.FADE)) {
+ var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
+
+ $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
+ } else {
+ callbackRemove();
+ }
+ } else if (callback) {
+ callback();
+ }
+ } // ----------------------------------------------------------------------
+ // the following methods are used to handle overflowing modals
+ // todo (fat): these should probably be refactored out of modal.js
+ // ----------------------------------------------------------------------
+ ;
+
+ _proto._checkScrollbar = function _checkScrollbar() {
+ var rect = document.body.getBoundingClientRect();
+ this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
+ this._scrollbarWidth = this._getScrollbarWidth();
+ };
+
+ _proto._setScrollbar = function _setScrollbar() {
+ var _this8 = this;
+
+ if (this._isBodyOverflowing) {
+ // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
+ // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
+ var fixedContent = [].slice.call(document.querySelectorAll(Selector$6.FIXED_CONTENT)); // Adjust fixed content padding
+
+ $(fixedContent).each(function (index, element) {
+ var actualRight = element.style.right;
+ var calculatedRight = $(element).css('right');
+ $(element).data('right', actualRight).css('right', parseFloat(calculatedRight) + _this8._scrollbarWidth + "px");
+ }); // Adjust body padding
+
+ var actualPadding = document.body.style.paddingRight;
+ var calculatedPadding = $(document.body).css('padding-right');
+ $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
+ }
+
+ $(document.body).addClass(ClassName$6.OPEN);
+ };
+
+ _proto._resetScrollbar = function _resetScrollbar() {
+ // Restore fixed content padding
+ var fixedContent = [].slice.call(document.querySelectorAll(Selector$6.FIXED_CONTENT));
+ $(fixedContent).each(function (index, element) {
+ var right = $(element).data('right');
+ $(element).removeData('right');
+ element.style.right = right ? right : '';
+ }); // Restore body padding
+
+ var padding = $(document.body).data('padding-right');
+ $(document.body).removeData('padding-right');
+ document.body.style.paddingRight = padding ? padding : '';
+ };
+
+ _proto._getScrollbarWidth = function _getScrollbarWidth() {
+ // thx d.walsh
+ var scrollDiv = document.createElement('div');
+ scrollDiv.className = ClassName$6.SCROLLBAR_MEASURER;
+ document.body.appendChild(scrollDiv);
+ var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
+ document.body.removeChild(scrollDiv);
+ return scrollbarWidth;
+ } // Boosted mod
+ ;
+
+ _proto._addAria = function _addAria() {
+ var $ModalPanel = $(this._element);
+ var $ModalTitle = $ModalPanel.find('.modal-title');
+ var $ModalDialog = $ModalPanel.find('.modal-dialog');
+ $ModalPanel.attr({
+ role: 'dialog',
+ 'aria-modal': true
+ });
+
+ if ($ModalTitle) {
+ var ModalTitleId = $ModalTitle.attr('id');
+
+ if (ModalTitleId) {
+ $ModalPanel.attr({
+ 'aria-labelledby': ModalTitleId
+ });
+ }
+ }
+
+ if ($ModalDialog) {
+ $ModalDialog.attr('role', 'document');
+ }
+ } // end mod
+ // Static
+ ;
+
+ Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$6);
+
+ var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});
+
+ if (!data) {
+ data = new Modal(this, _config);
+ $(this).data(DATA_KEY$6, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config](relatedTarget);
+ } else if (_config.show) {
+ data.show(relatedTarget);
+ }
+ });
+ };
+
+ _createClass(Modal, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$6;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$3;
+ }
+ }]);
+
+ return Modal;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$5.CLICK_DATA_API, Selector$6.DATA_TOGGLE, function (event) {
+ var _this9 = this;
+
+ var target;
+ var selector = Util.getSelectorFromElement(this);
+
+ if (selector) {
+ target = document.querySelector(selector);
+ }
+
+ var config = $(target).data(DATA_KEY$6) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
+
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
+ event.preventDefault();
+ }
+
+ var $target = $(target).one(Event$5.SHOW, function (showEvent) {
+ if (showEvent.isDefaultPrevented()) {
+ // Only register focus restorer if modal will actually get shown
+ return;
+ }
+
+ $target.one(Event$5.HIDDEN, function () {
+ if ($(_this9).is(':visible')) {
+ _this9.focus();
+ }
+ });
+ });
+
+ Modal._jQueryInterface.call($(target), config, this);
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$6] = Modal._jQueryInterface;
+ $.fn[NAME$6].Constructor = Modal;
+
+ $.fn[NAME$6].noConflict = function () {
+ $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;
+ return Modal._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$7 = 'navbar';
+ var VERSION$7 = '4.3.1';
+ var DATA_KEY$7 = 'bs.navbar';
+ var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
+ var BREAKPOINT = 768;
+ var Default$4 = {
+ sticky: false,
+ trigger: ''
+ };
+ var DefaultType$4 = {
+ sticky: 'boolean',
+ trigger: 'string'
+ };
+ var Selector$7 = {
+ SUPRA_BAR: '.navbar.supra',
+ MEGAMENU_PANEL: '.mega-menu.panel'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Navbar =
+ /*#__PURE__*/
+ function () {
+ function Navbar(element, config) {
+ var _this = this;
+
+ this._element = element;
+ this._supraBar = element.querySelector(Selector$7.SUPRA_BAR);
+ this._config = this._getConfig(config);
+ this._initialHeight = $(this._element).outerHeight();
+ this._initialSupraHeight = $(this._supraBar).outerHeight();
+
+ this._addAria();
+
+ if (this._config.sticky) {
+ $(this._element).addClass('fixed-top');
+ $(Selector$7.MEGAMENU_PANEL).addClass('sticky');
+ $(document.body).css('padding-top', this._initialHeight);
+ $(window).on('scroll', function () {
+ var Scroll = $(window).scrollTop();
+
+ if (Scroll > 0) {
+ $(_this._element).addClass('minimized');
+ } else {
+ $(_this._element).removeClass('minimized');
+ }
+ });
+ }
+
+ if (this._config.hideSupra) {
+ $(window).on('scroll', function () {
+ if ($(window).innerWidth() < BREAKPOINT) {
+ return;
+ }
+
+ var Scroll = $(window).scrollTop();
+
+ if (Scroll > 0) {
+ $(Selector$7.SUPRA_BAR).hide();
+ } else {
+ $(Selector$7.SUPRA_BAR).show();
+ }
+ });
+ }
+ } // getters
+
+
+ var _proto = Navbar.prototype;
+
+ // private
+ _proto._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default$4, config);
+ Util.typeCheckConfig(NAME$7, config, DefaultType$4);
+ return config;
+ };
+
+ _proto._addAria = function _addAria() {
+ $(this._element).find('.navbar .nav-link[data-toggle]').attr('aria-haspopup', true);
+ } // static
+ ;
+
+ Navbar._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$7);
+
+ var _config = _objectSpread({}, Default$4, $(this).data(), typeof config === 'object' && config ? config : {});
+
+ if (!data) {
+ data = new Navbar(this, _config);
+ $(this).data(DATA_KEY$7, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Navbar, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$7;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$4;
+ }
+ }]);
+
+ return Navbar;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$7] = Navbar._jQueryInterface;
+ $.fn[NAME$7].Constructor = Navbar;
+
+ $.fn[NAME$7].noConflict = function () {
+ $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;
+ return Navbar._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$8 = 'otab';
+ var VERSION$8 = '4.3.1';
+ var DATA_KEY$8 = 'bs.otab';
+ var EVENT_KEY$6 = "." + DATA_KEY$8;
+ var DATA_API_KEY$6 = '.data-api';
+ var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];
+ var DEFAULT_THRESHOLD = 2;
+ var Event$6 = {
+ CLICK_DATA_API: "click" + EVENT_KEY$6 + DATA_API_KEY$6
+ };
+ var ClassName$7 = {
+ ACTIVE: 'active',
+ SHOW: 'show',
+ ACCORDION_LAYOUT: 'accordion-layout'
+ };
+ var Selector$8 = {
+ OTAB_HEADING: '.o-tab-heading',
+ OTAB_CONTENT: '.o-tab-content'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Otab =
+ /*#__PURE__*/
+ function () {
+ function Otab(element) {
+ this._element = element;
+
+ this._addAccessibility();
+
+ if ($(this._element).parent().find(Selector$8.OTAB_HEADING).length > DEFAULT_THRESHOLD) {
+ $(this._element).parent().addClass(ClassName$7.ACCORDION_LAYOUT);
+ }
+ } // getters
+
+
+ var _proto = Otab.prototype;
+
+ // public
+ _proto.show = function show() {
+ var $element = $(this._element);
+
+ if ($element.next().hasClass(ClassName$7.SHOW)) {
+ return;
+ } // from parent remove all tab-content show classes
+
+
+ $element.parent().find(Selector$8.OTAB_CONTENT).removeClass(ClassName$7.SHOW); // remove all aria-expanded=true
+
+ $element.parent().find('[aria-expanded="true"]').attr('aria-expanded', false); // add show class to next tab-content
+
+ $element.next().addClass(ClassName$7.SHOW); // add aria-expanded=true to element
+
+ $element.attr('aria-expanded', true);
+ } // private
+ ;
+
+ _proto._addAccessibility = function _addAccessibility() {
+ var $tab = $(this._element);
+ var $tabpanel = $tab.next();
+ $tab.attr('id', Util.getUID(NAME$8));
+ $tabpanel.attr('id', Util.getUID(NAME$8));
+ $tab.attr({
+ 'aria-controls': $tabpanel.attr('id'),
+ role: 'tab'
+ });
+ $tabpanel.attr({
+ 'aria-labelledby': $tab.attr('id'),
+ role: 'tabpanel',
+ tabindex: 0
+ });
+
+ if ($tabpanel.hasClass(ClassName$7.SHOW)) {
+ $tab.attr('aria-expanded', true);
+ } else {
+ $tab.attr('aria-expanded', false);
+ }
+ } // static
+ ;
+
+ Otab._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY$8);
+
+ if (!data) {
+ data = new Otab(this);
+ $this.data(DATA_KEY$8, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Otab, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$8;
+ }
+ }]);
+
+ return Otab;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on('DOMContentLoaded', function () {
+ Otab._jQueryInterface.call($(Selector$8.OTAB_HEADING), 'init');
+ }).on(Event$6.CLICK_DATA_API, Selector$8.OTAB_HEADING, function (event) {
+ event.preventDefault();
+
+ Otab._jQueryInterface.call($(this), ClassName$7.SHOW);
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$8] = Otab._jQueryInterface;
+ $.fn[NAME$8].Constructor = Otab;
+
+ $.fn[NAME$8].noConflict = function () {
+ $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;
+ return Otab._jQueryInterface;
+ };
+
+ /**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): tools/sanitizer.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+ var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
+ var DefaultWhitelist = {
+ // Global attributes allowed on any supplied element below.
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
+ a: ['target', 'href', 'title', 'rel'],
+ area: [],
+ b: [],
+ br: [],
+ col: [],
+ code: [],
+ div: [],
+ em: [],
+ hr: [],
+ h1: [],
+ h2: [],
+ h3: [],
+ h4: [],
+ h5: [],
+ h6: [],
+ i: [],
+ img: ['src', 'alt', 'title', 'width', 'height'],
+ li: [],
+ ol: [],
+ p: [],
+ pre: [],
+ s: [],
+ small: [],
+ span: [],
+ sub: [],
+ sup: [],
+ strong: [],
+ u: [],
+ ul: []
+ /**
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+
+ };
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
+ /**
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
+
+ function allowedAttribute(attr, allowedAttributeList) {
+ var attrName = attr.nodeName.toLowerCase();
+
+ if (allowedAttributeList.indexOf(attrName) !== -1) {
+ if (uriAttrs.indexOf(attrName) !== -1) {
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
+ }
+
+ return true;
+ }
+
+ var regExp = allowedAttributeList.filter(function (attrRegex) {
+ return attrRegex instanceof RegExp;
+ }); // Check if a regular expression validates the attribute.
+
+ for (var i = 0, l = regExp.length; i < l; i++) {
+ if (attrName.match(regExp[i])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
+ if (unsafeHtml.length === 0) {
+ return unsafeHtml;
+ }
+
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
+ return sanitizeFn(unsafeHtml);
+ }
+
+ var domParser = new window.DOMParser();
+ var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
+ var whitelistKeys = Object.keys(whiteList);
+ var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));
+
+ var _loop = function _loop(i, len) {
+ var el = elements[i];
+ var elName = el.nodeName.toLowerCase();
+
+ if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
+ el.parentNode.removeChild(el);
+ return "continue";
+ }
+
+ var attributeList = [].slice.call(el.attributes);
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
+ attributeList.forEach(function (attr) {
+ if (!allowedAttribute(attr, whitelistedAttributes)) {
+ el.removeAttribute(attr.nodeName);
+ }
+ });
+ };
+
+ for (var i = 0, len = elements.length; i < len; i++) {
+ var _ret = _loop(i, len);
+
+ if (_ret === "continue") continue;
+ }
+
+ return createdDocument.body.innerHTML;
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$9 = 'tooltip';
+ var VERSION$9 = '4.3.1';
+ var DATA_KEY$9 = 'bs.tooltip';
+ var EVENT_KEY$7 = "." + DATA_KEY$9;
+ var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];
+ var CLASS_PREFIX = 'bs-tooltip';
+ var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
+ var DefaultType$5 = {
+ animation: 'boolean',
+ template: 'string',
+ title: '(string|element|function)',
+ trigger: 'string',
+ delay: '(number|object)',
+ html: 'boolean',
+ selector: '(string|boolean)',
+ placement: '(string|function)',
+ offset: '(number|string|function)',
+ container: '(string|element|boolean)',
+ fallbackPlacement: '(string|array)',
+ boundary: '(string|element)',
+ sanitize: 'boolean',
+ sanitizeFn: '(null|function)',
+ whiteList: 'object'
+ };
+ var AttachmentMap$1 = {
+ AUTO: 'auto',
+ TOP: 'top',
+ RIGHT: 'right',
+ BOTTOM: 'bottom',
+ LEFT: 'left'
+ };
+ var Default$5 = {
+ animation: true,
+ template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ selector: false,
+ placement: 'top',
+ offset: 0,
+ container: false,
+ fallbackPlacement: 'flip',
+ boundary: 'scrollParent',
+ sanitize: true,
+ sanitizeFn: null,
+ whiteList: DefaultWhitelist
+ };
+ var HoverState = {
+ SHOW: 'show',
+ OUT: 'out'
+ };
+ var Event$7 = {
+ HIDE: "hide" + EVENT_KEY$7,
+ HIDDEN: "hidden" + EVENT_KEY$7,
+ SHOW: "show" + EVENT_KEY$7,
+ SHOWN: "shown" + EVENT_KEY$7,
+ INSERTED: "inserted" + EVENT_KEY$7,
+ CLICK: "click" + EVENT_KEY$7,
+ FOCUSIN: "focusin" + EVENT_KEY$7,
+ FOCUSOUT: "focusout" + EVENT_KEY$7,
+ MOUSEENTER: "mouseenter" + EVENT_KEY$7,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY$7
+ };
+ var ClassName$8 = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$9 = {
+ TOOLTIP: '.tooltip',
+ TOOLTIP_INNER: '.tooltip-inner',
+ ARROW: '.arrow'
+ };
+ var Trigger = {
+ HOVER: 'hover',
+ FOCUS: 'focus',
+ CLICK: 'click',
+ MANUAL: 'manual'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Tooltip =
+ /*#__PURE__*/
+ function () {
+ function Tooltip(element, config) {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
+ } // private
+
+
+ this._isEnabled = true;
+ this._timeout = 0;
+ this._hoverState = '';
+ this._activeTrigger = {};
+ this._popper = null; // Protected
+
+ this.element = element;
+ this.config = this._getConfig(config);
+ this.tip = null;
+
+ this._setListeners();
+ } // Getters
+
+
+ var _proto = Tooltip.prototype;
+
+ // Public
+ _proto.enable = function enable() {
+ this._isEnabled = true;
+ };
+
+ _proto.disable = function disable() {
+ this._isEnabled = false;
+ };
+
+ _proto.toggleEnabled = function toggleEnabled() {
+ this._isEnabled = !this._isEnabled;
+ };
+
+ _proto.toggle = function toggle(event) {
+ if (!this._isEnabled) {
+ return;
+ }
+
+ if (event) {
+ var dataKey = this.constructor.DATA_KEY;
+ var context = $(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+
+ context._activeTrigger.click = !context._activeTrigger.click;
+
+ if (context._isWithActiveTrigger()) {
+ context._enter(null, context);
+ } else {
+ context._leave(null, context);
+ }
+ } else {
+ if ($(this.getTipElement()).hasClass(ClassName$8.SHOW)) {
+ this._leave(null, this);
+
+ return;
+ }
+
+ this._enter(null, this);
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ clearTimeout(this._timeout);
+ $.removeData(this.element, this.constructor.DATA_KEY);
+ $(this.element).off(this.constructor.EVENT_KEY);
+ $(this.element).closest('.modal').off('hide.bs.modal');
+
+ if (this.tip) {
+ $(this.tip).remove();
+ }
+
+ this._isEnabled = null;
+ this._timeout = null;
+ this._hoverState = null;
+ this._activeTrigger = null;
+
+ if (this._popper !== null) {
+ this._popper.destroy();
+ }
+
+ this._popper = null;
+ this.element = null;
+ this.config = null;
+ this.tip = null;
+ };
+
+ _proto.show = function show() {
+ var _this = this;
+
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
+
+ var showEvent = $.Event(this.constructor.Event.SHOW);
+
+ if (this.isWithContent() && this._isEnabled) {
+ $(this.element).trigger(showEvent);
+ var shadowRoot = Util.findShadowRoot(this.element);
+ var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
+
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
+ return;
+ }
+
+ var tip = this.getTipElement();
+ var tipId = Util.getUID(this.constructor.NAME);
+ tip.setAttribute('id', tipId);
+ this.element.setAttribute('aria-describedby', tipId);
+ this.setContent();
+
+ if (this.config.animation) {
+ $(tip).addClass(ClassName$8.FADE);
+ }
+
+ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; // boosted mod fix rtl
+
+ var attachment = this._getAttachment(placement);
+
+ this.addAttachmentClass(attachment);
+
+ var container = this._getContainer();
+
+ $(tip).data(this.constructor.DATA_KEY, this);
+
+ if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
+ $(tip).appendTo(container);
+ }
+
+ $(this.element).trigger(this.constructor.Event.INSERTED); // boosted mod fix rtl
+
+ var dir = document.getElementsByTagName('html')[0].dir;
+
+ if (dir === 'rtl') {
+ var hash = {
+ right: 'left',
+ left: 'right'
+ };
+ attachment = attachment.replace(/right|left/g, function (matched) {
+ return hash[matched];
+ });
+ } // end mod
+
+
+ this._popper = new Popper(this.element, tip, {
+ placement: attachment,
+ modifiers: {
+ offset: this._getOffset(),
+ flip: {
+ behavior: this.config.fallbackPlacement
+ },
+ arrow: {
+ element: Selector$9.ARROW
+ },
+ preventOverflow: {
+ boundariesElement: this.config.boundary
+ }
+ },
+ onCreate: function onCreate(data) {
+ if (data.originalPlacement !== data.placement) {
+ _this._handlePopperPlacementChange(data);
+ }
+ },
+ onUpdate: function onUpdate(data) {
+ return _this._handlePopperPlacementChange(data);
+ }
+ });
+ $(tip).addClass(ClassName$8.SHOW); // If this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+
+ if ('ontouchstart' in document.documentElement) {
+ $(document.body).children().on('mouseover', null, $.noop);
+ }
+
+ var complete = function complete() {
+ if (_this.config.animation) {
+ _this._fixTransition();
+ }
+
+ var prevHoverState = _this._hoverState;
+ _this._hoverState = null;
+ $(_this.element).trigger(_this.constructor.Event.SHOWN);
+
+ if (prevHoverState === HoverState.OUT) {
+ _this._leave(null, _this);
+ }
+ };
+
+ if ($(this.tip).hasClass(ClassName$8.FADE)) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
+ $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ }
+ };
+
+ _proto.hide = function hide(callback) {
+ var _this2 = this;
+
+ var tip = this.getTipElement();
+ var hideEvent = $.Event(this.constructor.Event.HIDE);
+
+ var complete = function complete() {
+ if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
+ tip.parentNode.removeChild(tip);
+ }
+
+ _this2._cleanTipClass();
+
+ _this2.element.removeAttribute('aria-describedby');
+
+ $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
+
+ if (_this2._popper !== null) {
+ _this2._popper.destroy();
+ }
+
+ if (callback) {
+ callback();
+ }
+ };
+
+ $(this.element).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $(tip).removeClass(ClassName$8.SHOW); // If this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+
+ if ('ontouchstart' in document.documentElement) {
+ $(document.body).children().off('mouseover', null, $.noop);
+ }
+
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
+
+ if ($(this.tip).hasClass(ClassName$8.FADE)) {
+ var transitionDuration = Util.getTransitionDurationFromElement(tip);
+ $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+
+ this._hoverState = '';
+ };
+
+ _proto.update = function update() {
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ } // Protected
+ ;
+
+ _proto.isWithContent = function isWithContent() {
+ return Boolean(this.getTitle());
+ };
+
+ _proto.addAttachmentClass = function addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
+ };
+
+ _proto.getTipElement = function getTipElement() {
+ this.tip = this.tip || $(this.config.template)[0];
+ return this.tip;
+ };
+
+ _proto.setContent = function setContent() {
+ var tip = this.getTipElement();
+ this.setElementContent($(tip.querySelectorAll(Selector$9.TOOLTIP_INNER)), this.getTitle());
+ $(tip).removeClass(ClassName$8.FADE + " " + ClassName$8.SHOW);
+ };
+
+ _proto.setElementContent = function setElementContent($element, content) {
+ if (typeof content === 'object' && (content.nodeType || content.jquery)) {
+ // Content is a DOM node or a jQuery
+ if (this.config.html) {
+ if (!$(content).parent().is($element)) {
+ $element.empty().append(content);
+ }
+ } else {
+ $element.text($(content).text());
+ }
+
+ return;
+ }
+
+ if (this.config.html) {
+ if (this.config.sanitize) {
+ content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
+ }
+
+ $element.html(content);
+ } else {
+ $element.text(content);
+ }
+ };
+
+ _proto.getTitle = function getTitle() {
+ var title = this.element.getAttribute('data-original-title');
+
+ if (!title) {
+ title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
+ }
+
+ return title;
+ } // Private
+ ;
+
+ _proto._getOffset = function _getOffset() {
+ var _this3 = this;
+
+ var offset = {};
+
+ if (typeof this.config.offset === 'function') {
+ offset.fn = function (data) {
+ data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
+ return data;
+ };
+ } else {
+ offset.offset = this.config.offset;
+ }
+
+ return offset;
+ };
+
+ _proto._getContainer = function _getContainer() {
+ if (this.config.container === false) {
+ return document.body;
+ }
+
+ if (Util.isElement(this.config.container)) {
+ return $(this.config.container);
+ }
+
+ return $(document).find(this.config.container);
+ };
+
+ _proto._getAttachment = function _getAttachment(placement) {
+ return AttachmentMap$1[placement.toUpperCase()];
+ };
+
+ _proto._setListeners = function _setListeners() {
+ var _this4 = this;
+
+ var triggers = this.config.trigger.split(' ');
+ triggers.forEach(function (trigger) {
+ if (trigger === 'click') {
+ $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
+ return _this4.toggle(event);
+ });
+ } else if (trigger !== Trigger.MANUAL) {
+ var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
+ $(_this4.element).on(eventIn, _this4.config.selector, function (event) {
+ return _this4._enter(event);
+ }).on(eventOut, _this4.config.selector, function (event) {
+ return _this4._leave(event);
+ });
+ }
+ });
+ $(this.element).closest('.modal').on('hide.bs.modal', function () {
+ if (_this4.element) {
+ _this4.hide();
+ }
+ });
+
+ if (this.config.selector) {
+ this.config = _objectSpread({}, this.config, {
+ trigger: 'manual',
+ selector: ''
+ });
+ } else {
+ this._fixTitle();
+ }
+ };
+
+ _proto._fixTitle = function _fixTitle() {
+ var titleType = typeof this.element.getAttribute('data-original-title');
+
+ if (this.element.getAttribute('title') || titleType !== 'string') {
+ this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
+ this.element.setAttribute('title', '');
+ }
+ };
+
+ _proto._enter = function _enter(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
+ context = context || $(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+
+ if (event) {
+ context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
+ }
+
+ if ($(context.getTipElement()).hasClass(ClassName$8.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
+ return;
+ }
+
+ clearTimeout(context._timeout);
+ context._hoverState = HoverState.SHOW;
+
+ if (!context.config.delay || !context.config.delay.show) {
+ context.show();
+ return;
+ }
+
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.SHOW) {
+ context.show();
+ }
+ }, context.config.delay.show);
+ };
+
+ _proto._leave = function _leave(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
+ context = context || $(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+
+ if (event) {
+ context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
+ }
+
+ if (context._isWithActiveTrigger()) {
+ return;
+ }
+
+ clearTimeout(context._timeout);
+ context._hoverState = HoverState.OUT;
+
+ if (!context.config.delay || !context.config.delay.hide) {
+ context.hide();
+ return;
+ }
+
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.OUT) {
+ context.hide();
+ }
+ }, context.config.delay.hide);
+ };
+
+ _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
+ for (var trigger in this._activeTrigger) {
+ if (this._activeTrigger[trigger]) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ _proto._getConfig = function _getConfig(config) {
+ var dataAttributes = $(this.element).data();
+ Object.keys(dataAttributes).forEach(function (dataAttr) {
+ if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
+ delete dataAttributes[dataAttr];
+ }
+ });
+ config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
+
+ if (typeof config.delay === 'number') {
+ config.delay = {
+ show: config.delay,
+ hide: config.delay
+ };
+ }
+
+ if (typeof config.title === 'number') {
+ config.title = config.title.toString();
+ }
+
+ if (typeof config.content === 'number') {
+ config.content = config.content.toString();
+ }
+
+ Util.typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
+
+ if (config.sanitize) {
+ config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
+ }
+
+ return config;
+ };
+
+ _proto._getDelegateConfig = function _getDelegateConfig() {
+ var config = {};
+
+ if (this.config) {
+ for (var key in this.config) {
+ if (this.constructor.Default[key] !== this.config[key]) {
+ config[key] = this.config[key];
+ }
+ }
+ }
+
+ return config;
+ };
+
+ _proto._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
+
+ if (tabClass !== null && tabClass.length) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
+ _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
+ var popperInstance = popperData.instance;
+ this.tip = popperInstance.popper;
+
+ this._cleanTipClass();
+
+ this.addAttachmentClass(this._getAttachment(popperData.placement));
+ };
+
+ _proto._fixTransition = function _fixTransition() {
+ var tip = this.getTipElement();
+ var initConfigAnimation = this.config.animation;
+
+ if (tip.getAttribute('x-placement') !== null) {
+ return;
+ }
+
+ $(tip).removeClass(ClassName$8.FADE);
+ this.config.animation = false;
+ this.hide();
+ this.show();
+ this.config.animation = initConfigAnimation;
+ } // Static
+ ;
+
+ Tooltip._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$9);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
+
+ if (!data) {
+ data = new Tooltip(this, _config);
+ $(this).data(DATA_KEY$9, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Tooltip, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$9;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$5;
+ }
+ }, {
+ key: "NAME",
+ get: function get() {
+ return NAME$9;
+ }
+ }, {
+ key: "DATA_KEY",
+ get: function get() {
+ return DATA_KEY$9;
+ }
+ }, {
+ key: "Event",
+ get: function get() {
+ return Event$7;
+ }
+ }, {
+ key: "EVENT_KEY",
+ get: function get() {
+ return EVENT_KEY$7;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$5;
+ }
+ }]);
+
+ return Tooltip;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$9] = Tooltip._jQueryInterface;
+ $.fn[NAME$9].Constructor = Tooltip;
+
+ $.fn[NAME$9].noConflict = function () {
+ $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;
+ return Tooltip._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$a = 'popover';
+ var VERSION$a = '4.3.1';
+ var DATA_KEY$a = 'bs.popover';
+ var EVENT_KEY$8 = "." + DATA_KEY$a;
+ var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
+ var CLASS_PREFIX$1 = 'bs-popover';
+ var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
+
+ var Default$6 = _objectSpread({}, Tooltip.Default, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
+ });
+
+ var DefaultType$6 = _objectSpread({}, Tooltip.DefaultType, {
+ content: '(string|element|function)'
+ });
+
+ var ClassName$9 = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$a = {
+ TITLE: '.popover-header',
+ CONTENT: '.popover-body'
+ };
+ var Event$8 = {
+ HIDE: "hide" + EVENT_KEY$8,
+ HIDDEN: "hidden" + EVENT_KEY$8,
+ SHOW: "show" + EVENT_KEY$8,
+ SHOWN: "shown" + EVENT_KEY$8,
+ INSERTED: "inserted" + EVENT_KEY$8,
+ CLICK: "click" + EVENT_KEY$8,
+ FOCUSIN: "focusin" + EVENT_KEY$8,
+ FOCUSOUT: "focusout" + EVENT_KEY$8,
+ MOUSEENTER: "mouseenter" + EVENT_KEY$8,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY$8
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Popover =
+ /*#__PURE__*/
+ function (_Tooltip) {
+ _inheritsLoose(Popover, _Tooltip);
+
+ function Popover() {
+ return _Tooltip.apply(this, arguments) || this;
+ }
+
+ var _proto = Popover.prototype;
+
+ // Overrides
+ _proto.isWithContent = function isWithContent() {
+ return this.getTitle() || this._getContent();
+ };
+
+ _proto.addAttachmentClass = function addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment);
+ };
+
+ _proto.getTipElement = function getTipElement() {
+ this.tip = this.tip || $(this.config.template)[0];
+ return this.tip;
+ };
+
+ _proto.setContent = function setContent() {
+ var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events
+
+ this.setElementContent($tip.find(Selector$a.TITLE), this.getTitle());
+
+ var content = this._getContent();
+
+ if (typeof content === 'function') {
+ content = content.call(this.element);
+ }
+
+ this.setElementContent($tip.find(Selector$a.CONTENT), content);
+ $tip.removeClass(ClassName$9.FADE + " " + ClassName$9.SHOW);
+ } // Private
+ ;
+
+ _proto._getContent = function _getContent() {
+ return this.element.getAttribute('data-content') || this.config.content;
+ };
+
+ _proto._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);
+
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ } // Static
+ ;
+
+ Popover._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$a);
+
+ var _config = typeof config === 'object' ? config : null;
+
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
+
+ if (!data) {
+ data = new Popover(this, _config);
+ $(this).data(DATA_KEY$a, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Popover, null, [{
+ key: "VERSION",
+ // Getters
+ get: function get() {
+ return VERSION$a;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$6;
+ }
+ }, {
+ key: "NAME",
+ get: function get() {
+ return NAME$a;
+ }
+ }, {
+ key: "DATA_KEY",
+ get: function get() {
+ return DATA_KEY$a;
+ }
+ }, {
+ key: "Event",
+ get: function get() {
+ return Event$8;
+ }
+ }, {
+ key: "EVENT_KEY",
+ get: function get() {
+ return EVENT_KEY$8;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$6;
+ }
+ }]);
+
+ return Popover;
+ }(Tooltip);
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$a] = Popover._jQueryInterface;
+ $.fn[NAME$a].Constructor = Popover;
+
+ $.fn[NAME$a].noConflict = function () {
+ $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;
+ return Popover._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$b = 'prioritynav';
+ var VERSION$b = '4.3.1';
+ var DATA_KEY$b = 'bs.prioritynav';
+ var JQUERY_NO_CONFLICT$b = $.fn[NAME$b];
+ var RESIZE_DURATION = 500;
+ var TAB_KEYCODE$1 = 9;
+ var Event$9 = {
+ RESIZE: 'resize',
+ FOCUS: 'focus'
+ };
+ var ClassName$a = {
+ PRIORITY: 'priority',
+ HIDE: 'sr-only',
+ RESIZING: 'resizing'
+ };
+ var Selector$b = {
+ NAV_ELEMENTS: 'li:not(\'.overflow-nav\')',
+ FIRST_ELEMENT: 'li:first',
+ PRIORITY_ELEMENT: '.priority'
+ };
+ var MenuLabelDefault = 'More';
+
+ function MenuTemplate(MenuLabel) {
+ return "\n <li class=\"overflow-nav nav-item dropdown\">\n <a href=\"#\" class=\"dropdown-toggle nav-link\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\">" + MenuLabel + "</a>\n <ul class=\"overflow-nav-list dropdown-menu dropdown-menu-right\"></ul>\n </li>\n";
+ }
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+
+ var PriorityNav =
+ /*#__PURE__*/
+ function () {
+ function PriorityNav(element, config) {
+ this._element = element;
+ this._config = config;
+
+ if ($(element).is('ul')) {
+ this._$menu = $(element);
+ } else {
+ this._$menu = $(element).find('ul').first();
+ }
+
+ this._initMenu();
+
+ this._$allNavElements = this._$menu.find(Selector$b.NAV_ELEMENTS);
+
+ this._bindUIActions();
+
+ this._setupMenu();
+ } // getters
+
+
+ var _proto = PriorityNav.prototype;
+
+ // public
+ // private
+ _proto._initMenu = function _initMenu() {
+ var MenuLabel = this._config;
+
+ if (typeof MenuLabel === 'undefined') {
+ MenuLabel = MenuLabelDefault;
+ } // add menu template
+
+
+ this._$menu.append(MenuTemplate(MenuLabel));
+ };
+
+ _proto._setupMenu = function _setupMenu() {
+ var $allNavElements = this._$allNavElements; // Checking top position of first item (sometimes changes)
+
+ var firstPos = this._$menu.find(Selector$b.FIRST_ELEMENT).position(); // Empty collection in which to put menu items to move
+
+
+ var $wrappedElements = $(); // Used to snag the previous menu item in addition to ones that have wrapped
+
+ var first = true; // Loop through all the nav items...
+
+ this._$allNavElements.each(function (i) {
+ var $elm = $(this); // ...in which to find wrapped elements
+
+ var pos = $elm.position();
+
+ if (pos.top !== firstPos.top) {
+ // If element is wrapped, add it to set
+ $wrappedElements = $wrappedElements.add($elm); // Add the previous one too, if first
+
+ if (first) {
+ $wrappedElements = $wrappedElements.add($allNavElements.eq(i - 1));
+ first = false;
+ }
+ }
+ });
+
+ if ($wrappedElements.length) {
+ // Clone set before altering
+ var newSet = $wrappedElements.clone(); // Hide ones that we're moving
+
+ $wrappedElements.addClass(ClassName$a.HIDE);
+ $wrappedElements.find('.nav-link').attr('tabindex', -1); // Add wrapped elements to dropdown
+
+ this._$menu.find('.overflow-nav-list').append(newSet); // Show new menu
+
+
+ this._$menu.find('.overflow-nav').addClass('show-inline-block'); // Make overflow visible again so dropdown can be seen.
+
+
+ this._$menu.find('.o-nav-local').css('overflow', 'visible'); // Check if menu doesn't overflow after process
+
+
+ if (this._$menu.find('.overflow-nav').position().top !== firstPos.top) {
+ var $item = $(this._element).find("." + ClassName$a.HIDE).first().prev();
+ var $itemDuplicate = $item.clone();
+ $item.addClass(ClassName$a.HIDE);
+ $item.find('.nav-link').attr('tabindex', -1);
+
+ this._$menu.find('.overflow-nav-list').prepend($itemDuplicate);
+ }
+ } // hide menu from AT
+
+
+ this._$menu.find('.overflow-nav').attr('aria-hidden', true);
+ };
+
+ _proto._tearDown = function _tearDown() {
+ this._$menu.find('.overflow-nav-list').empty();
+
+ this._$menu.find('.overflow-nav').removeClass('show-inline-block');
+
+ this._$allNavElements.removeClass(ClassName$a.HIDE);
+
+ this._$allNavElements.find('.nav-link').attr('tabindex', 0);
+ };
+
+ _proto._bindUIActions = function _bindUIActions() {
+ var _this = this;
+
+ $(window).on(Event$9.RESIZE, function () {
+ _this._$menu.addClass(ClassName$a.RESIZING);
+
+ setTimeout(function () {
+ _this._tearDown();
+
+ _this._setupMenu();
+
+ _this._$menu.removeClass(ClassName$a.RESIZING);
+ }, RESIZE_DURATION);
+ });
+
+ this._$menu.find('.overflow-nav .dropdown-toggle').on('keyup', function (e) {
+ if (e.which === TAB_KEYCODE$1) {
+ $(e.target).dropdown('toggle');
+ }
+ });
+ } // static
+ ;
+
+ PriorityNav._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$b);
+
+ if (!data) {
+ data = new PriorityNav(this, config);
+ $(this).data(DATA_KEY$b, data);
+ }
+
+ if (typeof config !== 'undefined' && config) {
+ if (typeof config !== 'string') {
+ throw new TypeError('Priority nav label type must be string');
+ }
+ }
+ });
+ };
+
+ _createClass(PriorityNav, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$b;
+ }
+ }]);
+
+ return PriorityNav;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$b] = PriorityNav._jQueryInterface;
+ $.fn[NAME$b].Constructor = PriorityNav;
+
+ $.fn[NAME$b].noConflict = function () {
+ $.fn[NAME$b] = JQUERY_NO_CONFLICT$b;
+ return PriorityNav._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$c = 'scrollup';
+ var VERSION$c = '4.3.1';
+ var DATA_KEY$c = 'bs.scrollup';
+ var EVENT_KEY$9 = "." + DATA_KEY$c;
+ var DATA_API_KEY$7 = '.data-api';
+ var JQUERY_NO_CONFLICT$c = $.fn[NAME$c];
+ var SCROLLANIMATE = 500;
+ var Default$7 = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+ var Event$a = {
+ SCROLL: "scroll" + EVENT_KEY$9,
+ CLICK_SCROLL: "click" + EVENT_KEY$9,
+ LOAD_DATA_API: "load" + EVENT_KEY$9 + DATA_API_KEY$7
+ };
+ var ClassName$b = {
+ SCROLL_TOP: 'o-scroll-up'
+ };
+ var Selector$c = {
+ SCROLL_TOP: '.o-scroll-up:not(.static)'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var ScrollUp =
+ /*#__PURE__*/
+ function () {
+ function ScrollUp(element) {
+ this._element = element;
+ this._scrollElement = window;
+ $(window).on(Event$a.SCROLL, $.proxy(this._process, this));
+ $(Selector$c.SCROLL_TOP).on(Event$a.CLICK_SCROLL, $.proxy(this._backToTop, this));
+ $(this._element).addClass('is-fixed');
+
+ this._process();
+ } // getters
+
+
+ var _proto = ScrollUp.prototype;
+
+ // public
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$c);
+ $(this._scrollElement).off(EVENT_KEY$9);
+ this._element = null;
+ this._scrollElement = null;
+ } // private
+ ;
+
+ _proto._process = function _process() {
+ if ($(this._scrollElement).scrollTop() > Number($(this._scrollElement).height())) {
+ $(Selector$c.SCROLL_TOP).show();
+ } else {
+ $(Selector$c.SCROLL_TOP).hide();
+ }
+ };
+
+ _proto._clear = function _clear() {
+ $(this._selector).filter(Selector$c.ACTIVE).removeClass(ClassName$b.ACTIVE);
+ };
+
+ _proto._backToTop = function _backToTop() {
+ if (typeof $.animate === 'function') {
+ $('html, body').animate({
+ scrollTop: 0
+ }, SCROLLANIMATE);
+ } else {
+ $('html, body').scrollTop(0);
+ }
+ } // static
+ ;
+
+ ScrollUp._jQueryInterface = function _jQueryInterface() {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$c);
+
+ if (!data) {
+ data = new ScrollUp(this);
+ $(this).data(DATA_KEY$c, data);
+ }
+ });
+ };
+
+ _createClass(ScrollUp, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$c;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$7;
+ }
+ }]);
+
+ return ScrollUp;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(window).on(Event$a.LOAD_DATA_API, function () {
+ var scrollUps = $.makeArray($(Selector$c.SCROLL_TOP));
+
+ for (var i = scrollUps.length; i--;) {
+ var $scrollup = $(scrollUps[i]);
+
+ ScrollUp._jQueryInterface.call($scrollup, $scrollup.data());
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$c] = ScrollUp._jQueryInterface;
+ $.fn[NAME$c].Constructor = ScrollUp;
+
+ $.fn[NAME$c].noConflict = function () {
+ $.fn[NAME$c] = JQUERY_NO_CONFLICT$c;
+ return ScrollUp._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$d = 'scrollspy';
+ var VERSION$d = '4.3.1';
+ var DATA_KEY$d = 'bs.scrollspy';
+ var EVENT_KEY$a = "." + DATA_KEY$d;
+ var DATA_API_KEY$8 = '.data-api';
+ var JQUERY_NO_CONFLICT$d = $.fn[NAME$d];
+ var Default$8 = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+ var DefaultType$7 = {
+ offset: 'number',
+ method: 'string',
+ target: '(string|element)'
+ };
+ var Event$b = {
+ ACTIVATE: "activate" + EVENT_KEY$a,
+ SCROLL: "scroll" + EVENT_KEY$a,
+ LOAD_DATA_API: "load" + EVENT_KEY$a + DATA_API_KEY$8
+ };
+ var ClassName$c = {
+ DROPDOWN_ITEM: 'dropdown-item',
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active'
+ };
+ var Selector$d = {
+ DATA_SPY: '[data-spy="scroll"]',
+ ACTIVE: '.active',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ NAV_LINKS: '.nav-link',
+ NAV_ITEMS: '.nav-item',
+ LIST_ITEMS: '.list-group-item',
+ DROPDOWN: '.dropdown',
+ DROPDOWN_ITEMS: '.dropdown-item',
+ DROPDOWN_TOGGLE: '.dropdown-toggle'
+ };
+ var OffsetMethod = {
+ OFFSET: 'offset',
+ POSITION: 'position'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var ScrollSpy =
+ /*#__PURE__*/
+ function () {
+ function ScrollSpy(element, config) {
+ var _this = this;
+
+ this._element = element;
+ this._scrollElement = element.tagName === 'BODY' ? window : element;
+ this._config = this._getConfig(config);
+ this._selector = this._config.target + " " + Selector$d.NAV_LINKS + "," + (this._config.target + " " + Selector$d.LIST_ITEMS + ",") + (this._config.target + " " + Selector$d.DROPDOWN_ITEMS);
+ this._offsets = [];
+ this._targets = [];
+ this._activeTarget = null;
+ this._scrollHeight = 0;
+ $(this._scrollElement).on(Event$b.SCROLL, function (event) {
+ return _this._process(event);
+ });
+ this.refresh();
+
+ this._process();
+ } // Getters
+
+
+ var _proto = ScrollSpy.prototype;
+
+ // Public
+ _proto.refresh = function refresh() {
+ var _this2 = this;
+
+ var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
+ var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
+ var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
+ this._offsets = [];
+ this._targets = [];
+ this._scrollHeight = this._getScrollHeight();
+ var targets = [].slice.call(document.querySelectorAll(this._selector));
+ targets.map(function (element) {
+ var target;
+ var targetSelector = Util.getSelectorFromElement(element);
+
+ if (targetSelector) {
+ target = document.querySelector(targetSelector);
+ }
+
+ if (target) {
+ var targetBCR = target.getBoundingClientRect();
+
+ if (targetBCR.width || targetBCR.height) {
+ // TODO (fat): remove sketch reliance on jQuery position/offset
+ return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
+ }
+ }
+
+ return null;
+ }).filter(function (item) {
+ return item;
+ }).sort(function (a, b) {
+ return a[0] - b[0];
+ }).forEach(function (item) {
+ _this2._offsets.push(item[0]);
+
+ _this2._targets.push(item[1]);
+ });
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$d);
+ $(this._scrollElement).off(EVENT_KEY$a);
+ this._element = null;
+ this._scrollElement = null;
+ this._config = null;
+ this._selector = null;
+ this._offsets = null;
+ this._targets = null;
+ this._activeTarget = null;
+ this._scrollHeight = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$8, typeof config === 'object' && config ? config : {});
+
+ if (typeof config.target !== 'string') {
+ var id = $(config.target).attr('id');
+
+ if (!id) {
+ id = Util.getUID(NAME$d);
+ $(config.target).attr('id', id);
+ }
+
+ config.target = "#" + id;
+ }
+
+ Util.typeCheckConfig(NAME$d, config, DefaultType$7);
+ return config;
+ };
+
+ _proto._getScrollTop = function _getScrollTop() {
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
+ };
+
+ _proto._getScrollHeight = function _getScrollHeight() {
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
+ };
+
+ _proto._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
+ };
+
+ _proto._process = function _process() {
+ var scrollTop = this._getScrollTop() + this._config.offset;
+
+ var scrollHeight = this._getScrollHeight();
+
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
+
+ if (this._scrollHeight !== scrollHeight) {
+ this.refresh();
+ }
+
+ if (scrollTop >= maxScroll) {
+ var target = this._targets[this._targets.length - 1];
+
+ if (this._activeTarget !== target) {
+ this._activate(target);
+ }
+
+ return;
+ }
+
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
+ this._activeTarget = null;
+
+ this._clear();
+
+ return;
+ }
+
+ var offsetLength = this._offsets.length;
+
+ for (var i = offsetLength; i--;) {
+ var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
+
+ if (isActiveTarget) {
+ this._activate(this._targets[i]);
+ }
+ }
+ };
+
+ _proto._activate = function _activate(target) {
+ this._activeTarget = target;
+
+ this._clear();
+
+ var queries = this._selector.split(',').map(function (selector) {
+ return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
+ });
+
+ var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
+
+ if ($link.hasClass(ClassName$c.DROPDOWN_ITEM)) {
+ $link.closest(Selector$d.DROPDOWN).find(Selector$d.DROPDOWN_TOGGLE).addClass(ClassName$c.ACTIVE);
+ $link.addClass(ClassName$c.ACTIVE);
+ } else {
+ // Set triggered link as active
+ $link.addClass(ClassName$c.ACTIVE); // Set triggered links parents as active
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
+
+ $link.parents(Selector$d.NAV_LIST_GROUP).prev(Selector$d.NAV_LINKS + ", " + Selector$d.LIST_ITEMS).addClass(ClassName$c.ACTIVE); // Handle special case when .nav-link is inside .nav-item
+
+ $link.parents(Selector$d.NAV_LIST_GROUP).prev(Selector$d.NAV_ITEMS).children(Selector$d.NAV_LINKS).addClass(ClassName$c.ACTIVE);
+ }
+
+ $(this._scrollElement).trigger(Event$b.ACTIVATE, {
+ relatedTarget: target
+ });
+ };
+
+ _proto._clear = function _clear() {
+ [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
+ return node.classList.contains(ClassName$c.ACTIVE);
+ }).forEach(function (node) {
+ return node.classList.remove(ClassName$c.ACTIVE);
+ });
+ } // Static
+ ;
+
+ ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$d);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data) {
+ data = new ScrollSpy(this, _config);
+ $(this).data(DATA_KEY$d, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(ScrollSpy, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$d;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$8;
+ }
+ }]);
+
+ return ScrollSpy;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(window).on(Event$b.LOAD_DATA_API, function () {
+ var scrollSpys = [].slice.call(document.querySelectorAll(Selector$d.DATA_SPY));
+ var scrollSpysLength = scrollSpys.length;
+
+ for (var i = scrollSpysLength; i--;) {
+ var $spy = $(scrollSpys[i]);
+
+ ScrollSpy._jQueryInterface.call($spy, $spy.data());
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$d] = ScrollSpy._jQueryInterface;
+ $.fn[NAME$d].Constructor = ScrollSpy;
+
+ $.fn[NAME$d].noConflict = function () {
+ $.fn[NAME$d] = JQUERY_NO_CONFLICT$d;
+ return ScrollSpy._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$e = 'tab';
+ var VERSION$e = '4.3.1';
+ var DATA_KEY$e = 'bs.tab';
+ var EVENT_KEY$b = "." + DATA_KEY$e;
+ var DATA_API_KEY$9 = '.data-api';
+ var JQUERY_NO_CONFLICT$e = $.fn[NAME$e]; // boosted mod
+
+ var ARROW_LEFT_KEYCODE$2 = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_UP_KEYCODE$2 = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_RIGHT_KEYCODE$2 = 39; // KeyboardEvent.which value for right arrow key
+
+ var ARROW_DOWN_KEYCODE$2 = 40; // KeyboardEvent.which value for down arrow key
+
+ var REGEXP_KEYDOWN$1 = new RegExp(ARROW_LEFT_KEYCODE$2 + "|" + ARROW_UP_KEYCODE$2 + "|" + ARROW_RIGHT_KEYCODE$2 + "|" + ARROW_DOWN_KEYCODE$2); // end mod
+
+ var Event$c = {
+ HIDE: "hide" + EVENT_KEY$b,
+ HIDDEN: "hidden" + EVENT_KEY$b,
+ SHOW: "show" + EVENT_KEY$b,
+ SHOWN: "shown" + EVENT_KEY$b,
+ CLICK_DATA_API: "click" + EVENT_KEY$b + DATA_API_KEY$9,
+ KEYDOWN_DATA_API: "keydown" + EVENT_KEY$b + DATA_API_KEY$9 // boosted mod
+
+ };
+ var ClassName$d = {
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active',
+ DISABLED: 'disabled',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$e = {
+ DROPDOWN: '.dropdown',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ ACTIVE: '.active',
+ ACTIVE_UL: '> li > .active',
+ DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
+ DROPDOWN_TOGGLE: '.dropdown-toggle',
+ DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Tab =
+ /*#__PURE__*/
+ function () {
+ function Tab(element) {
+ this._element = element;
+
+ this._addAccessibility(); // Boosted mod
+
+ } // Getters
+
+
+ var _proto = Tab.prototype;
+
+ // Public
+ _proto.show = function show() {
+ var _this = this;
+
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$d.ACTIVE) || $(this._element).hasClass(ClassName$d.DISABLED)) {
+ return;
+ }
+
+ var target;
+ var previous;
+ var listElement = $(this._element).closest(Selector$e.NAV_LIST_GROUP)[0];
+ var selector = Util.getSelectorFromElement(this._element);
+
+ if (listElement) {
+ var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$e.ACTIVE_UL : Selector$e.ACTIVE;
+ previous = $.makeArray($(listElement).find(itemSelector));
+ previous = previous[previous.length - 1];
+ }
+
+ var hideEvent = $.Event(Event$c.HIDE, {
+ relatedTarget: this._element
+ });
+ var showEvent = $.Event(Event$c.SHOW, {
+ relatedTarget: previous
+ });
+
+ if (previous) {
+ $(previous).trigger(hideEvent);
+ }
+
+ $(this._element).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (selector) {
+ target = document.querySelector(selector);
+ }
+
+ this._activate(this._element, listElement);
+
+ var complete = function complete() {
+ var hiddenEvent = $.Event(Event$c.HIDDEN, {
+ relatedTarget: _this._element
+ });
+ var shownEvent = $.Event(Event$c.SHOWN, {
+ relatedTarget: previous
+ });
+ $(previous).trigger(hiddenEvent);
+ $(_this._element).trigger(shownEvent);
+ };
+
+ if (target) {
+ this._activate(target, target.parentNode, complete);
+ } else {
+ complete();
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$e);
+ this._element = null;
+ } // Private
+ ;
+
+ _proto._activate = function _activate(element, container, callback) {
+ var _this2 = this;
+
+ var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$e.ACTIVE_UL) : $(container).children(Selector$e.ACTIVE);
+ var active = activeElements[0];
+ var isTransitioning = callback && active && $(active).hasClass(ClassName$d.FADE);
+
+ var complete = function complete() {
+ return _this2._transitionComplete(element, active, callback);
+ }; // Boosted mod
+
+
+ $(container).find('.nav-link:not(.dropdown-toggle)').attr({
+ tabIndex: '-1',
+ 'aria-selected': false
+ });
+ $(container).find('.tab-pane').attr({
+ 'aria-hidden': true,
+ tabIndex: '-1'
+ }); // end mod
+
+ if (active && isTransitioning) {
+ var transitionDuration = Util.getTransitionDurationFromElement(active);
+ $(active).removeClass(ClassName$d.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ };
+
+ _proto._transitionComplete = function _transitionComplete(element, active, callback) {
+ if (active) {
+ $(active).removeClass(ClassName$d.ACTIVE);
+ var dropdownChild = $(active.parentNode).find(Selector$e.DROPDOWN_ACTIVE_CHILD)[0];
+
+ if (dropdownChild) {
+ $(dropdownChild).removeClass(ClassName$d.ACTIVE);
+ }
+
+ if (active.getAttribute('role') === 'tab') {
+ active.setAttribute('aria-selected', false);
+ }
+ }
+
+ $(element).addClass(ClassName$d.ACTIVE);
+
+ if (element.getAttribute('role') === 'tab') {
+ element.setAttribute('aria-selected', true);
+ } // Boosted mod
+
+
+ $(element).filter('.nav-link:not(.dropdown-toggle).active').attr({
+ tabIndex: '0',
+ 'aria-selected': true
+ });
+ $(element).filter('.tab-pane.active').attr({
+ 'aria-hidden': false,
+ tabIndex: '0'
+ }); // end mod
+
+ Util.reflow(element);
+
+ if (element.classList.contains(ClassName$d.FADE)) {
+ element.classList.add(ClassName$d.SHOW);
+ }
+
+ if (element.parentNode && $(element.parentNode).hasClass(ClassName$d.DROPDOWN_MENU)) {
+ var dropdownElement = $(element).closest(Selector$e.DROPDOWN)[0];
+
+ if (dropdownElement) {
+ var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$e.DROPDOWN_TOGGLE));
+ $(dropdownToggleList).addClass(ClassName$d.ACTIVE);
+ }
+
+ element.setAttribute('aria-expanded', true);
+ }
+
+ if (callback) {
+ callback();
+ }
+ } // Boosted mod
+ ;
+
+ _proto._addAccessibility = function _addAccessibility() {
+ var $tab = $(this._element);
+ var $tabpanel = $($tab.attr('href'));
+ var $tablist = $tab.closest(Selector$e.NAV_LIST_GROUP);
+ var tabId = $tab.attr('id') || Util.getUID(NAME$e);
+ $tab.attr('id', tabId);
+
+ if ($tabpanel) {
+ $tab.attr('role', 'tab');
+ $tablist.attr('role', 'tablist'); // $li.attr('role', 'presentation')
+ }
+
+ if ($tab.hasClass(ClassName$d.ACTIVE)) {
+ $tab.attr({
+ tabIndex: '0',
+ 'aria-selected': 'true'
+ });
+
+ if ($tab.attr('href')) {
+ $tab.attr('aria-controls', $tab.attr('href').substr(1));
+ }
+
+ $tabpanel.attr({
+ role: 'tabpanel',
+ tabIndex: '0',
+ 'aria-hidden': 'false',
+ 'aria-labelledby': tabId
+ });
+ } else {
+ $tab.attr({
+ tabIndex: '-1',
+ 'aria-selected': 'false'
+ });
+
+ if ($tab.attr('href')) {
+ $tab.attr('aria-controls', $tab.attr('href').substr(1));
+ }
+
+ $tabpanel.attr({
+ role: 'tabpanel',
+ tabIndex: '-1',
+ 'aria-hidden': 'true',
+ 'aria-labelledby': tabId
+ });
+ }
+ } // end mod
+ // Static
+ // Boosted mod
+ ;
+
+ Tab._dataApiKeydownHandler = function _dataApiKeydownHandler(e) {
+ var $this = $(this);
+ var Items = $this.closest('ul[role=tablist] ').find('[role=tab]:visible');
+ var k = e.which || e.keyCode;
+ var index = 0;
+ index = Items.index(Items.filter(':focus'));
+
+ if (k === ARROW_UP_KEYCODE$2 || k === ARROW_LEFT_KEYCODE$2) {
+ index--;
+ } // up & left
+
+
+ if (k === ARROW_RIGHT_KEYCODE$2 || k === ARROW_DOWN_KEYCODE$2) {
+ index++;
+ } // down & right
+
+
+ if (index < 0) {
+ index = Items.length - 1;
+ }
+
+ if (index === Items.length) {
+ index = 0;
+ }
+
+ var nextTab = Items.eq(index);
+
+ if (nextTab.attr('role') === 'tab') {
+ nextTab.tab('show').trigger('focus');
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+ } // end mod
+ ;
+
+ Tab._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY$e);
+
+ if (!data) {
+ data = new Tab(this);
+ $this.data(DATA_KEY$e, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Tab, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$e;
+ }
+ }]);
+
+ return Tab;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$c.CLICK_DATA_API, Selector$e.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+
+ Tab._jQueryInterface.call($(this), 'show');
+ }) // Boosted mod
+ .on(Event$c.KEYDOWN_DATA_API, Selector$e.DATA_TOGGLE, function (event) {
+ if (!REGEXP_KEYDOWN$1.test(event.which)) {
+ return;
+ }
+
+ event.preventDefault();
+
+ Tab._dataApiKeydownHandler.call($(this), event);
+ }).on('DOMContentLoaded', function () {
+ Tab._jQueryInterface.call($(Selector$e.DATA_TOGGLE), 'init');
+ }); // end mod
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$e] = Tab._jQueryInterface;
+ $.fn[NAME$e].Constructor = Tab;
+
+ $.fn[NAME$e].noConflict = function () {
+ $.fn[NAME$e] = JQUERY_NO_CONFLICT$e;
+ return Tab._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$f = 'toast';
+ var VERSION$f = '4.3.1';
+ var DATA_KEY$f = 'bs.toast';
+ var EVENT_KEY$c = "." + DATA_KEY$f;
+ var JQUERY_NO_CONFLICT$f = $.fn[NAME$f];
+ var Event$d = {
+ CLICK_DISMISS: "click.dismiss" + EVENT_KEY$c,
+ HIDE: "hide" + EVENT_KEY$c,
+ HIDDEN: "hidden" + EVENT_KEY$c,
+ SHOW: "show" + EVENT_KEY$c,
+ SHOWN: "shown" + EVENT_KEY$c
+ };
+ var ClassName$e = {
+ FADE: 'fade',
+ HIDE: 'hide',
+ SHOW: 'show',
+ SHOWING: 'showing'
+ };
+ var DefaultType$8 = {
+ animation: 'boolean',
+ autohide: 'boolean',
+ delay: 'number'
+ };
+ var Default$9 = {
+ animation: true,
+ autohide: true,
+ delay: 500
+ };
+ var Selector$f = {
+ DATA_DISMISS: '[data-dismiss="toast"]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Toast =
+ /*#__PURE__*/
+ function () {
+ function Toast(element, config) {
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._timeout = null;
+
+ this._setListeners();
+ } // Getters
+
+
+ var _proto = Toast.prototype;
+
+ // Public
+ _proto.show = function show() {
+ var _this = this;
+
+ $(this._element).trigger(Event$d.SHOW);
+
+ if (this._config.animation) {
+ this._element.classList.add(ClassName$e.FADE);
+ }
+
+ var complete = function complete() {
+ _this._element.classList.remove(ClassName$e.SHOWING);
+
+ _this._element.classList.add(ClassName$e.SHOW);
+
+ $(_this._element).trigger(Event$d.SHOWN);
+
+ if (_this._config.autohide) {
+ _this.hide();
+ }
+ };
+
+ this._element.classList.remove(ClassName$e.HIDE);
+
+ this._element.classList.add(ClassName$e.SHOWING);
+
+ if (this._config.animation) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ };
+
+ _proto.hide = function hide(withoutTimeout) {
+ var _this2 = this;
+
+ if (!this._element.classList.contains(ClassName$e.SHOW)) {
+ return;
+ }
+
+ $(this._element).trigger(Event$d.HIDE);
+
+ if (withoutTimeout) {
+ this._close();
+ } else {
+ this._timeout = setTimeout(function () {
+ _this2._close();
+ }, this._config.delay);
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ clearTimeout(this._timeout);
+ this._timeout = null;
+
+ if (this._element.classList.contains(ClassName$e.SHOW)) {
+ this._element.classList.remove(ClassName$e.SHOW);
+ }
+
+ $(this._element).off(Event$d.CLICK_DISMISS);
+ $.removeData(this._element, DATA_KEY$f);
+ this._element = null;
+ this._config = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$9, $(this._element).data(), typeof config === 'object' && config ? config : {});
+ Util.typeCheckConfig(NAME$f, config, this.constructor.DefaultType);
+ return config;
+ };
+
+ _proto._setListeners = function _setListeners() {
+ var _this3 = this;
+
+ $(this._element).on(Event$d.CLICK_DISMISS, Selector$f.DATA_DISMISS, function () {
+ return _this3.hide(true);
+ });
+ };
+
+ _proto._close = function _close() {
+ var _this4 = this;
+
+ var complete = function complete() {
+ _this4._element.classList.add(ClassName$e.HIDE);
+
+ $(_this4._element).trigger(Event$d.HIDDEN);
+ };
+
+ this._element.classList.remove(ClassName$e.SHOW);
+
+ if (this._config.animation) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ } // Static
+ ;
+
+ Toast._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $(this);
+ var data = $element.data(DATA_KEY$f);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data) {
+ data = new Toast(this, _config);
+ $element.data(DATA_KEY$f, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config](this);
+ }
+ });
+ };
+
+ _createClass(Toast, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$f;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$8;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$9;
+ }
+ }]);
+
+ return Toast;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$f] = Toast._jQueryInterface;
+ $.fn[NAME$f].Constructor = Toast;
+
+ $.fn[NAME$f].noConflict = function () {
+ $.fn[NAME$f] = JQUERY_NO_CONFLICT$f;
+ return Toast._jQueryInterface;
+ };
+
+ /**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): index.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+ (function () {
+ if (typeof $ === 'undefined') {
+ throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
+ }
+
+ var version = $.fn.jquery.split(' ')[0].split('.');
+ var minMajor = 1;
+ var ltMajor = 2;
+ var minMinor = 9;
+ var minPatch = 1;
+ var maxMajor = 4;
+
+ if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
+ throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
+ }
+ })();
+
+ exports.Util = Util;
+ exports.Alert = Alert;
+ exports.Button = Button;
+ exports.Carousel = Carousel;
+ exports.Collapse = Collapse;
+ exports.Dropdown = Dropdown;
+ exports.MegaMenu = MegaMenu;
+ exports.Modal = Modal;
+ exports.Navbar = Navbar;
+ exports.Otab = Otab;
+ exports.Popover = Popover;
+ exports.PriorityNav = PriorityNav;
+ exports.ScrollUp = ScrollUp;
+ exports.Scrollspy = ScrollSpy;
+ exports.Tab = Tab;
+ exports.Toast = Toast;
+ exports.Tooltip = Tooltip;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=boosted.bundle.js.map
diff --git a/dashboard/public/js/boosted.bundle.js.map b/dashboard/public/js/boosted.bundle.js.map
new file mode 100644
index 00000000..b80f0b41
--- /dev/null
+++ b/dashboard/public/js/boosted.bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"boosted.bundle.js","sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/popper.js/dist/esm/popper.js","../../js/src/dropdown.js","../../js/src/o-megamenu.js","../../js/src/modal.js","../../js/src/o-navbar.js","../../js/src/o-tab.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/o-priority-nav.js","../../js/src/o-scroll-up.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/src/index.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n const input = this._element.querySelector(Selector.INPUT)\n\n if (rootElement) {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n activeElement.classList.remove(ClassName.ACTIVE)\n }\n }\n\n if (input) {\n if (input.checked) {\n this._element.classList.add(ClassName.ACTIVE)\n } else {\n this._element.classList.remove(ClassName.ACTIVE)\n }\n } else {\n this._element.classList.toggle(ClassName.ACTIVE)\n this._element.setAttribute('aria-pressed',\n this._element.classList.contains(ClassName.ACTIVE))\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT > Selector.INPUT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '*:not(.multi) > .show, *:not(.multi) > .collapsing', // boosted mod\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide|init/.test(config)) { // Boosted mod\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n// Boosted mod\n .on('DOMContentLoaded', () => {\n $(Selector.DATA_TOGGLE).each(function () {\n const target = Collapse._getTargetFromElement(this)\n\n Collapse._jQueryInterface.call($(target), 'init')\n })\n })\n// end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.15.0\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\n}\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.right - result.left;\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexport default Popper;\n//# sourceMappingURL=popper.js.map\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n // Boosted mod\n MENU_ITEMS : '.dropdown-menu .dropdown-item',\n FIRST_ITEM_IN_MENU : '.dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)',\n // end mod\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n // Boosted mod\n $(parent).find(Selector.FIRST_ITEM_IN_MENU).first().trigger('focus')\n // end mod\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Boosted mod\n _addAccessibility() {\n $(this._element).attr('aria-haspopup', true)\n // ensure that dropdown-menu have the role menu\n $(this._element).parent().children(Selector.MENU).attr('role', 'menu')\n // ensure that dropdown-itm's have the role menuitem\n $(this._element).parent().children(Selector.MENU).children('.dropdown-item').attr('role', 'menuitem')\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n // Boosted mod\n .on('DOMContentLoaded', () => {\n // Instanciate every dropdown in the DOM\n Dropdown._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-megamenu.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/* eslint no-magic-numbers: [\"error\", { \"ignore\": [1,2] }] */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'megamenu'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.megamenu'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst TIMEOUT = 1000 // Timeout befor focusing first element\nconst PERCENTAGE = 100 // Width slide proportion\nconst SPLITLENGHT = 4\n\nconst ClassName = {\n TRANSITIONING: 'transitioning'\n}\n\nconst Selector = {\n MEGAMENU : '.mega-menu',\n ROOT_NAV : '.mega-menu > .navbar-nav',\n MEGAMENU_PANEL : '.mega-menu-panel',\n MEGAMENU_NAV : '.nav-link + .navbar-nav',\n NAV_MENU : '.navbar-nav',\n NAV_ITEM : '.nav-item',\n NAV_LINK : '.nav-link',\n NAV_LINK_COLLAPSE : '.nav-link[data-toggle=collapse]',\n NAV_LINK_BACK : '.nav-link.back',\n NAV_LINK_EXPANDED : '.nav-link[aria-expanded=true]'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass MegaMenu {\n constructor(element, config) {\n this._element = element\n this._$navLinks = $(this._element).find(Selector.NAV_LINK)\n this._$goForwardLinks = $(this._element).find(Selector.MEGAMENU_NAV).prev(Selector.NAV_LINK)\n this._$goBackLinks = $(this._element).find(Selector.NAV_LINK_BACK)\n this._$topCollapseMenus = $(this._element).find(Selector.MEGAMENU_PANEL)\n this._$navLinkCollapses = $(this._element).find(Selector.NAV_LINK_COLLAPSE)\n this._config = config\n if (typeof this._config.noFocus === 'undefined') {\n this._config.noFocus = false\n }\n this._addEventListeners()\n this._addAriaAttributes(this._element)\n this.goTo = this._initPosition\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _addEventListeners() {\n this._$goForwardLinks.on('click', (event) => this._goForward(event))\n this._$goBackLinks.on('click', (event) => this._goBackward(event))\n this._$navLinks.on('keydown', (event) => this._manageKeyDown(event))\n if (!this._config.noFocus) {\n this._$topCollapseMenus.on('shown.bs.collapse', this._collapseFocus)\n }\n this._$navLinkCollapses.on('click', (event) => this._handleCollapseToggle(event))\n }\n\n _addAriaAttributes(element) {\n const $subNavs = $(element).find('.nav-link + .navbar-nav')\n\n $(element).attr('role', 'application')\n $(element).find('> .navbar-nav').attr('role', 'menu')\n $(element).find(Selector.MEGAMENU_PANEL).attr('role', 'menu')\n $(element).find('.nav-link[data-toggle=collapse]').attr('role', 'menuitem')\n $(element).find(Selector.NAV_LINK_BACK).attr({\n 'aria-hidden': true\n })\n $(element).find(Selector.NAV_ITEM).attr('role', 'presentation')\n\n $subNavs.each(function () {\n const navId = Util.getUID(NAME)\n const $thisNavToggler = $(this).prev(Selector.NAV_LINK)\n const $thisNav = $(this)\n const $thisNavBackLink = $thisNav.find(Selector.NAV_LINK_BACK)\n const $topMenu = $(this).closest(Selector.NAV_MENU).parent().closest(Selector.NAV_MENU).prev(Selector.NAV_LINK)\n let goBackLabel = `go back to ${$topMenu.text()} menu`\n\n if (!$topMenu.length) {\n goBackLabel = `go back to ${$(this).closest(Selector.MEGAMENU_PANEL).prev(Selector.NAV_LINK).text()} menu`\n }\n\n $thisNav.attr({\n id: navId,\n role: 'menu'\n })\n $thisNavToggler.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-expanded': false,\n 'aria-haspopup': true\n })\n $thisNavBackLink.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-label': goBackLabel\n })\n })\n }\n\n _initPosition(target) {\n if (!$(target).length) {\n return\n }\n\n const $target = $(target).first()\n const position = $target.parents().index(this._element)\n const rootPosition = $('.mega-menu-panel .nav-link').first().parents().index($('.mega-menu'))\n const translatePercentage = -(position - rootPosition) * PERCENTAGE / 2\n const $thisNav = $target.closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // open collapse\n if ($target.attr('data-toggle') === 'collapse') {\n $target.siblings(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.siblings(Selector.MEGAMENU_PANEL)).collapse('hide')\n $(this._element).height('auto')\n $rootNav.css('transform', 'translateX(0%)')\n } else {\n $target.closest(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.closest(Selector.MEGAMENU_PANEL)).collapse('hide')\n\n // show menu and hide other\n $target.parents(Selector.NAV_MENU).show()\n\n // set aria on parent links\n $target.parents(Selector.NAV_ITEM).find('> .nav-link').not($target).attr({\n tabindex: -1,\n 'aria-hidden': true,\n 'aria-expanded': true\n })\n\n // translate to pos\n $rootNav.css('transform', `translateX(${translatePercentage}%)`)\n if (translatePercentage) {\n // adapt main collapse height to target height\n $(this._element).height($thisNav.height())\n } else {\n $(this._element).height('auto')\n }\n }\n\n // set focus on target link\n setTimeout(() => {\n if (!this._config.noFocus) {\n // set focus on target link\n $target.trigger('focus')\n }\n\n $rootNav.removeClass(ClassName.TRANSITIONING)\n }, TIMEOUT)\n }\n\n _manageKeyDown(event) {\n const $thisTarget = $(event.target)\n\n // test key code\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n // proceed according to key code\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n this._goBackward(event)\n break\n case ARROW_RIGHT_KEYCODE:\n this._goForward(event)\n break\n case ARROW_UP_KEYCODE:\n // focus prev nav link\n $thisTarget.parent().prev().find('>.nav-link').not(Selector.NAV_LINK_BACK).trigger('focus')\n break\n case ARROW_DOWN_KEYCODE:\n // focus next nav link\n $thisTarget.parent().next().find('>.nav-link').trigger('focus')\n break\n default:\n }\n }\n\n _collapseFocus() {\n $(this).find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n }\n\n _handleCollapseToggle(e) {\n const $this = $(e.target)\n const $thisCollapse = $($this.attr('href'))\n\n this._$topCollapseMenus.not($thisCollapse).collapse('hide')\n }\n\n _goForward(e) {\n e.preventDefault()\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $this.next(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $thisNavToggler = $this\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!$this.next(Selector.NAV_MENU).length || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // hide all nav on same level\n $thisNav.find(Selector.NAV_MENU).hide()\n\n // show target navbar-nav\n $targetNav.show()\n\n // adapt main collapse height to target height\n $(Selector.MEGAMENU).height($targetNav.height())\n\n // make only visible elements focusable\n if (!currentTranslatePercentage) {\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n }\n $thisNav.find(Selector.NAV_LINK).attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage - PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $thisNavToggler.attr('aria-expanded', true)\n $targetNav.find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n _goBackward(e) {\n e.preventDefault()\n\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $thisNav.parent().closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $targetNavToggler = $targetNav.find(Selector.NAV_LINK_EXPANDED)\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!currentTranslatePercentage || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // make only visible elements focusable\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n if (currentTranslatePercentage === -PERCENTAGE) {\n // reset main collapse height\n $(Selector.MEGAMENU).css('height', 'auto')\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n }\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage + PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $targetNavToggler.attr('aria-expanded', false)\n $targetNavToggler.trigger('focus')\n $thisNav.hide()\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n if (!$(this).is(Selector.MEGAMENU)) {\n throw new TypeError('Element is not a mega menu')\n }\n\n if (!config) {\n config = {}\n } else if (config.noFocus && typeof config.noFocus !== 'boolean') {\n // param = true\n throw new TypeError('no-focus parameter must be boolean')\n }\n\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new MegaMenu(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (config.target) {\n if (typeof config.target !== 'string' || !/^[.#].*/.test(config.target)) {\n throw new TypeError(`Selector \"${config.target}\" is not supported`)\n }\n\n data.goTo(config.target)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = MegaMenu._jQueryInterface\n$.fn[NAME].Constructor = MegaMenu\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return MegaMenu._jQueryInterface\n}\n\nexport default MegaMenu\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .position-fixed'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n\n // Boosted mod\n this._addAria()\n // end mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._setEscapeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualRight = element.style.right\n const calculatedRight = $(element).css('right')\n $(element)\n .data('right', actualRight)\n .css('right', `${parseFloat(calculatedRight) + this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const right = $(element).data('right')\n $(element).removeData('right')\n element.style.right = right ? right : ''\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Boosted mod\n _addAria() {\n const $ModalPanel = $(this._element)\n const $ModalTitle = $ModalPanel.find('.modal-title')\n const $ModalDialog = $ModalPanel.find('.modal-dialog')\n\n $ModalPanel.attr({\n role: 'dialog',\n 'aria-modal': true\n })\n\n if ($ModalTitle) {\n const ModalTitleId = $ModalTitle.attr('id')\n if (ModalTitleId) {\n $ModalPanel.attr({\n 'aria-labelledby' : ModalTitleId\n })\n }\n }\n\n if ($ModalDialog) {\n $ModalDialog.attr('role', 'document')\n }\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-navbar.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'navbar'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.navbar'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst BREAKPOINT = 768\n\nconst Default = {\n sticky : false,\n trigger : ''\n}\n\nconst DefaultType = {\n sticky : 'boolean',\n trigger : 'string'\n}\n\nconst Selector = {\n SUPRA_BAR : '.navbar.supra',\n MEGAMENU_PANEL : '.mega-menu.panel'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Navbar {\n constructor(element, config) {\n this._element = element\n this._supraBar = element.querySelector(Selector.SUPRA_BAR)\n this._config = this._getConfig(config)\n this._initialHeight = $(this._element).outerHeight()\n this._initialSupraHeight = $(this._supraBar).outerHeight()\n\n this._addAria()\n\n if (this._config.sticky) {\n $(this._element).addClass('fixed-top')\n $(Selector.MEGAMENU_PANEL).addClass('sticky')\n $(document.body).css('padding-top', this._initialHeight)\n\n $(window).on('scroll', () => {\n const Scroll = $(window).scrollTop()\n if (Scroll > 0) {\n $(this._element).addClass('minimized')\n } else {\n $(this._element).removeClass('minimized')\n }\n })\n }\n\n if (this._config.hideSupra) {\n $(window).on('scroll', () => {\n if ($(window).innerWidth() < BREAKPOINT) {\n return\n }\n\n const Scroll = $(window).scrollTop()\n\n if (Scroll > 0) {\n $(Selector.SUPRA_BAR).hide()\n } else {\n $(Selector.SUPRA_BAR).show()\n }\n })\n }\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // private\n\n _getConfig(config) {\n config = $.extend({}, Default, config)\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _addAria() {\n $(this._element).find('.navbar .nav-link[data-toggle]').attr('aria-haspopup', true)\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Navbar(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Navbar._jQueryInterface\n$.fn[NAME].Constructor = Navbar\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Navbar._jQueryInterface\n}\n\nexport default Navbar\n","/**\n * ------------------------------------------------------------------------------------------------------\n * Boosted (v4.3.1): otab.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * ------------------------------------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'otab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.otab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst DEFAULT_THRESHOLD = 2\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ACTIVE : 'active',\n SHOW : 'show',\n ACCORDION_LAYOUT: 'accordion-layout'\n}\n\nconst Selector = {\n OTAB_HEADING: '.o-tab-heading',\n OTAB_CONTENT: '.o-tab-content'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Otab {\n constructor(element) {\n this._element = element\n this._addAccessibility()\n\n if ($(this._element).parent().find(Selector.OTAB_HEADING).length > DEFAULT_THRESHOLD) {\n $(this._element).parent().addClass(ClassName.ACCORDION_LAYOUT)\n }\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n\n // public\n show() {\n const $element = $(this._element)\n\n if ($element.next().hasClass(ClassName.SHOW)) {\n return\n }\n\n // from parent remove all tab-content show classes\n $element.parent().find(Selector.OTAB_CONTENT).removeClass(ClassName.SHOW)\n // remove all aria-expanded=true\n $element.parent().find('[aria-expanded=\"true\"]').attr('aria-expanded', false)\n // add show class to next tab-content\n $element.next().addClass(ClassName.SHOW)\n // add aria-expanded=true to element\n $element.attr('aria-expanded', true)\n }\n\n // private\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $tab.next()\n\n $tab.attr('id', Util.getUID(NAME))\n $tabpanel.attr('id', Util.getUID(NAME))\n\n $tab.attr({\n 'aria-controls': $tabpanel.attr('id'),\n role: 'tab'\n })\n $tabpanel.attr({\n 'aria-labelledby': $tab.attr('id'),\n role: 'tabpanel',\n tabindex: 0\n })\n\n if ($tabpanel.hasClass(ClassName.SHOW)) {\n $tab.attr('aria-expanded', true)\n } else {\n $tab.attr('aria-expanded', false)\n }\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Otab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on('DOMContentLoaded', () => {\n Otab._jQueryInterface.call($(Selector.OTAB_HEADING), 'init')\n })\n .on(Event.CLICK_DATA_API, Selector.OTAB_HEADING, function (event) {\n event.preventDefault()\n Otab._jQueryInterface.call($(this), ClassName.SHOW)\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Otab._jQueryInterface\n$.fn[NAME].Constructor = Otab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Otab._jQueryInterface\n}\n\nexport default Otab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div></div>',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n // boosted mod fix rtl\n let attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n // boosted mod fix rtl\n const dir = document.getElementsByTagName('html')[0].dir\n if (dir === 'rtl') {\n const hash = {\n right: 'left',\n left: 'right'\n }\n attachment = attachment.replace(/right|left/g, (matched) => hash[matched])\n }\n // end mod\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div></div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-priority-nav.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'prioritynav'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.prioritynav'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst RESIZE_DURATION = 500\nconst TAB_KEYCODE = 9\n\nconst Event = {\n RESIZE: 'resize',\n FOCUS: 'focus'\n}\n\nconst ClassName = {\n PRIORITY: 'priority',\n HIDE: 'sr-only',\n RESIZING: 'resizing'\n}\n\nconst Selector = {\n NAV_ELEMENTS: 'li:not(\\'.overflow-nav\\')',\n FIRST_ELEMENT: 'li:first',\n PRIORITY_ELEMENT: '.priority'\n}\n\nconst MenuLabelDefault = 'More'\n\nfunction MenuTemplate(MenuLabel) {\n return `\n <li class=\"overflow-nav nav-item dropdown\">\n <a href=\"#\" class=\"dropdown-toggle nav-link\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\">${MenuLabel}</a>\n <ul class=\"overflow-nav-list dropdown-menu dropdown-menu-right\"></ul>\n </li>\n`\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass PriorityNav {\n constructor(element, config) {\n this._element = element\n this._config = config\n\n if ($(element).is('ul')) {\n this._$menu = $(element)\n } else {\n this._$menu = $(element).find('ul').first()\n }\n this._initMenu()\n this._$allNavElements = this._$menu.find(Selector.NAV_ELEMENTS)\n this._bindUIActions()\n this._setupMenu()\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _initMenu() {\n let MenuLabel = this._config\n\n if (typeof MenuLabel === 'undefined') {\n MenuLabel = MenuLabelDefault\n }\n\n // add menu template\n this._$menu.append(MenuTemplate(MenuLabel))\n }\n\n _setupMenu() {\n const $allNavElements = this._$allNavElements\n\n // Checking top position of first item (sometimes changes)\n const firstPos = this._$menu.find(Selector.FIRST_ELEMENT).position()\n\n // Empty collection in which to put menu items to move\n let $wrappedElements = $()\n\n // Used to snag the previous menu item in addition to ones that have wrapped\n let first = true\n\n // Loop through all the nav items...\n this._$allNavElements.each(function (i) {\n const $elm = $(this)\n\n // ...in which to find wrapped elements\n const pos = $elm.position()\n\n if (pos.top !== firstPos.top) {\n // If element is wrapped, add it to set\n $wrappedElements = $wrappedElements.add($elm)\n\n // Add the previous one too, if first\n if (first) {\n $wrappedElements = $wrappedElements.add($allNavElements.eq(i - 1))\n first = false\n }\n }\n })\n\n if ($wrappedElements.length) {\n // Clone set before altering\n const newSet = $wrappedElements.clone()\n\n // Hide ones that we're moving\n $wrappedElements.addClass(ClassName.HIDE)\n $wrappedElements.find('.nav-link').attr('tabindex', -1)\n\n // Add wrapped elements to dropdown\n this._$menu.find('.overflow-nav-list').append(newSet)\n\n // Show new menu\n this._$menu.find('.overflow-nav').addClass('show-inline-block')\n\n // Make overflow visible again so dropdown can be seen.\n this._$menu.find('.o-nav-local').css('overflow', 'visible')\n\n // Check if menu doesn't overflow after process\n if (this._$menu.find('.overflow-nav').position().top !== firstPos.top) {\n const $item = $(this._element).find(`.${ClassName.HIDE}`).first().prev()\n const $itemDuplicate = $item.clone()\n\n $item.addClass(ClassName.HIDE)\n $item.find('.nav-link').attr('tabindex', -1)\n\n this._$menu.find('.overflow-nav-list').prepend($itemDuplicate)\n }\n }\n\n // hide menu from AT\n this._$menu.find('.overflow-nav').attr('aria-hidden', true)\n }\n\n _tearDown() {\n this._$menu.find('.overflow-nav-list').empty()\n this._$menu.find('.overflow-nav').removeClass('show-inline-block')\n this._$allNavElements.removeClass(ClassName.HIDE)\n this._$allNavElements.find('.nav-link').attr('tabindex', 0)\n }\n\n _bindUIActions() {\n $(window).on(Event.RESIZE, () => {\n this._$menu.addClass(ClassName.RESIZING)\n\n setTimeout(() => {\n this._tearDown()\n this._setupMenu()\n this._$menu.removeClass(ClassName.RESIZING)\n }, RESIZE_DURATION)\n })\n\n this._$menu.find('.overflow-nav .dropdown-toggle').on('keyup', (e) => {\n if (e.which === TAB_KEYCODE) {\n $(e.target).dropdown('toggle')\n }\n })\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new PriorityNav(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config !== 'undefined' && config) {\n if (typeof config !== 'string') {\n throw new TypeError('Priority nav label type must be string')\n }\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = PriorityNav._jQueryInterface\n$.fn[NAME].Constructor = PriorityNav\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return PriorityNav._jQueryInterface\n}\n\nexport default PriorityNav\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-scroll-up.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollup'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollup'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst SCROLLANIMATE = 500\n\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst Event = {\n SCROLL : `scroll${EVENT_KEY}`,\n CLICK_SCROLL : `click${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLL_TOP : 'o-scroll-up'\n}\n\nconst Selector = {\n SCROLL_TOP : '.o-scroll-up:not(.static)'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollUp {\n constructor(element) {\n this._element = element\n this._scrollElement = window\n\n $(window).on(Event.SCROLL, $.proxy(this._process, this))\n $(Selector.SCROLL_TOP).on(Event.CLICK_SCROLL, $.proxy(this._backToTop, this))\n $(this._element).addClass('is-fixed')\n this._process()\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n\n // public\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n }\n\n\n // private\n\n _process() {\n if ($(this._scrollElement).scrollTop() > Number($(this._scrollElement).height())) {\n $(Selector.SCROLL_TOP).show()\n } else {\n $(Selector.SCROLL_TOP).hide()\n }\n }\n\n _clear() {\n $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)\n }\n\n _backToTop() {\n if (typeof $.animate === 'function') {\n $('html, body').animate({\n scrollTop: 0\n }, SCROLLANIMATE)\n } else {\n $('html, body').scrollTop(0)\n }\n }\n\n // static\n\n static _jQueryInterface() {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n if (!data) {\n data = new ScrollUp(this)\n $(this).data(DATA_KEY, data)\n }\n })\n }\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollUps = $.makeArray($(Selector.SCROLL_TOP))\n for (let i = scrollUps.length; i--;) {\n const $scrollup = $(scrollUps[i])\n ScrollUp._jQueryInterface.call($scrollup, $scrollup.data())\n }\n})\n\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollUp._jQueryInterface\n$.fn[NAME].Constructor = ScrollUp\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollUp._jQueryInterface\n}\n\nexport default ScrollUp\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\n // Handle special case when .nav-link is inside .nav-item\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\n }\n\n $(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n [].slice.call(document.querySelectorAll(this._selector))\n .filter((node) => node.classList.contains(ClassName.ACTIVE))\n .forEach((node) => node.classList.remove(ClassName.ACTIVE))\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new ScrollSpy(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\n const scrollSpysLength = scrollSpys.length\n\n for (let i = scrollSpysLength; i--;) {\n const $spy = $(scrollSpys[i])\n ScrollSpy._jQueryInterface.call($spy, $spy.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n// boosted mod\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_LEFT_KEYCODE}|${ARROW_UP_KEYCODE}|${ARROW_RIGHT_KEYCODE}|${ARROW_DOWN_KEYCODE}`)\n// end mod\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}` // boosted mod\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active',\n DISABLED : 'disabled',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DROPDOWN : '.dropdown',\n NAV_LIST_GROUP : '.nav, .list-group',\n ACTIVE : '.active',\n ACTIVE_UL : '> li > .active',\n DATA_TOGGLE : '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n DROPDOWN_TOGGLE : '.dropdown-toggle',\n DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab {\n constructor(element) {\n this._element = element\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n show() {\n if (this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n $(this._element).hasClass(ClassName.ACTIVE) ||\n $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n let target\n let previous\n const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\n const selector = Util.getSelectorFromElement(this._element)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\n previous = $.makeArray($(listElement).find(itemSelector))\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = $.Event(Event.HIDE, {\n relatedTarget: this._element\n })\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget: previous\n })\n\n if (previous) {\n $(previous).trigger(hideEvent)\n }\n\n $(this._element).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented() ||\n hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n this._activate(\n this._element,\n listElement\n )\n\n const complete = () => {\n const hiddenEvent = $.Event(Event.HIDDEN, {\n relatedTarget: this._element\n })\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget: previous\n })\n\n $(previous).trigger(hiddenEvent)\n $(this._element).trigger(shownEvent)\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\n ? $(container).find(Selector.ACTIVE_UL)\n : $(container).children(Selector.ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\n const complete = () => this._transitionComplete(\n element,\n active,\n callback\n )\n\n // Boosted mod\n $(container).find('.nav-link:not(.dropdown-toggle)').attr({\n tabIndex : '-1',\n 'aria-selected' : false\n })\n $(container).find('.tab-pane').attr({\n 'aria-hidden' : true,\n tabIndex : '-1'\n })\n // end mod\n\n if (active && isTransitioning) {\n const transitionDuration = Util.getTransitionDurationFromElement(active)\n\n $(active)\n .removeClass(ClassName.SHOW)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n $(active).removeClass(ClassName.ACTIVE)\n\n const dropdownChild = $(active.parentNode).find(\n Selector.DROPDOWN_ACTIVE_CHILD\n )[0]\n\n if (dropdownChild) {\n $(dropdownChild).removeClass(ClassName.ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n $(element).addClass(ClassName.ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n // Boosted mod\n $(element).filter('.nav-link:not(.dropdown-toggle).active').attr({\n tabIndex : '0',\n 'aria-selected' : true\n })\n $(element).filter('.tab-pane.active').attr({\n 'aria-hidden' : false,\n tabIndex : '0'\n })\n // end mod\n\n Util.reflow(element)\n\n if (element.classList.contains(ClassName.FADE)) {\n element.classList.add(ClassName.SHOW)\n }\n\n if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\n\n if (dropdownElement) {\n const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\n\n $(dropdownToggleList).addClass(ClassName.ACTIVE)\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Boosted mod\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $($tab.attr('href'))\n const $tablist = $tab.closest(Selector.NAV_LIST_GROUP)\n const tabId = $tab.attr('id') || Util.getUID(NAME)\n\n $tab.attr('id', tabId)\n\n if ($tabpanel) {\n $tab.attr('role', 'tab')\n $tablist.attr('role', 'tablist')\n // $li.attr('role', 'presentation')\n }\n\n if ($tab.hasClass(ClassName.ACTIVE)) {\n $tab.attr({\n tabIndex : '0',\n 'aria-selected' : 'true'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '0',\n 'aria-hidden' : 'false',\n 'aria-labelledby': tabId\n })\n } else {\n $tab.attr({\n tabIndex : '-1',\n 'aria-selected' : 'false'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '-1',\n 'aria-hidden' : 'true',\n 'aria-labelledby': tabId\n })\n }\n }\n // end mod\n\n // Static\n\n // Boosted mod\n static _dataApiKeydownHandler(e) {\n const $this = $(this)\n const Items = $this.closest('ul[role=tablist] ').find('[role=tab]:visible')\n const k = e.which || e.keyCode\n\n let index = 0\n\n index = Items.index(Items.filter(':focus'))\n\n if (k === ARROW_UP_KEYCODE || k === ARROW_LEFT_KEYCODE) {\n index--\n } // up & left\n if (k === ARROW_RIGHT_KEYCODE || k === ARROW_DOWN_KEYCODE) {\n index++\n } // down & right\n\n if (index < 0) {\n index = Items.length - 1\n }\n if (index === Items.length) {\n index = 0\n }\n const nextTab = Items.eq(index)\n\n if (nextTab.attr('role') === 'tab') {\n nextTab.tab('show').trigger('focus')\n }\n\n e.preventDefault()\n e.stopPropagation()\n }\n // end mod\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Tab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n Tab._jQueryInterface.call($(this), 'show')\n })\n // Boosted mod\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, function (event) {\n if (!REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n event.preventDefault()\n Tab._dataApiKeydownHandler.call($(this), event)\n })\n .on('DOMContentLoaded', () => {\n Tab._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tab._jQueryInterface\n$.fn[NAME].Constructor = Tab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tab._jQueryInterface\n}\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Event = {\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n HIDE : 'hide',\n SHOW : 'show',\n SHOWING : 'showing'\n}\n\nconst DefaultType = {\n animation : 'boolean',\n autohide : 'boolean',\n delay : 'number'\n}\n\nconst Default = {\n animation : true,\n autohide : true,\n delay : 500\n}\n\nconst Selector = {\n DATA_DISMISS : '[data-dismiss=\"toast\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast {\n constructor(element, config) {\n this._element = element\n this._config = this._getConfig(config)\n this._timeout = null\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show() {\n $(this._element).trigger(Event.SHOW)\n\n if (this._config.animation) {\n this._element.classList.add(ClassName.FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(ClassName.SHOWING)\n this._element.classList.add(ClassName.SHOW)\n\n $(this._element).trigger(Event.SHOWN)\n\n if (this._config.autohide) {\n this.hide()\n }\n }\n\n this._element.classList.remove(ClassName.HIDE)\n this._element.classList.add(ClassName.SHOWING)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n hide(withoutTimeout) {\n if (!this._element.classList.contains(ClassName.SHOW)) {\n return\n }\n\n $(this._element).trigger(Event.HIDE)\n\n if (withoutTimeout) {\n this._close()\n } else {\n this._timeout = setTimeout(() => {\n this._close()\n }, this._config.delay)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n this._timeout = null\n\n if (this._element.classList.contains(ClassName.SHOW)) {\n this._element.classList.remove(ClassName.SHOW)\n }\n\n $(this._element).off(Event.CLICK_DISMISS)\n\n $.removeData(this._element, DATA_KEY)\n this._element = null\n this._config = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...$(this._element).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _setListeners() {\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n () => this.hide(true)\n )\n }\n\n _close() {\n const complete = () => {\n this._element.classList.add(ClassName.HIDE)\n $(this._element).trigger(Event.HIDDEN)\n }\n\n this._element.classList.remove(ClassName.SHOW)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new Toast(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Toast._jQueryInterface\n$.fn[NAME].Constructor = Toast\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Toast._jQueryInterface\n}\n\nexport default Toast\n","import $ from 'jquery'\nimport Alert from './alert'\nimport Button from './button'\nimport Carousel from './carousel'\nimport Collapse from './collapse'\nimport Dropdown from './dropdown'\nimport MegaMenu from './o-megamenu'\nimport Modal from './modal'\nimport Navbar from './o-navbar'\nimport Otab from './o-tab'\nimport Popover from './popover'\nimport PriorityNav from './o-priority-nav'\nimport ScrollUp from './o-scroll-up'\nimport Scrollspy from './scrollspy'\nimport Tab from './tab'\nimport Toast from './toast'\nimport Tooltip from './tooltip'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(() => {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n})()\n\nexport {\n Util,\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n MegaMenu,\n Modal,\n Navbar,\n Otab,\n Popover,\n PriorityNav,\n ScrollUp,\n Scrollspy,\n Tab,\n Toast,\n Tooltip\n}\n"],"names":["TRANSITION_END","MAX_UID","MILLISECONDS_MULTIPLIER","toType","obj","toString","call","match","toLowerCase","getSpecialTransitionEndEvent","bindType","delegateType","handle","event","$","target","is","handleObj","handler","apply","arguments","undefined","transitionEndEmulator","duration","called","one","Util","setTimeout","triggerTransitionEnd","setTransitionEndSupport","fn","emulateTransitionEnd","special","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","expectedTypes","value","valueType","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","NAME","VERSION","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","Selector","DISMISS","Event","CLOSE","CLOSED","CLICK_DATA_API","ClassName","ALERT","FADE","SHOW","Alert","_element","close","rootElement","_getRootElement","customEvent","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","ACTIVE","BUTTON","FOCUS","DATA_TOGGLE_CARROT","DATA_TOGGLE","INPUT","FOCUS_BLUR_DATA_API","Button","toggle","input","activeElement","classList","checked","add","setAttribute","contains","button","toggleClass","type","ARROW_LEFT_KEYCODE","ARROW_RIGHT_KEYCODE","TOUCHEVENT_COMPAT_WAIT","SWIPE_THRESHOLD","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","Direction","NEXT","PREV","LEFT","RIGHT","SLIDE","SLID","KEYDOWN","MOUSEENTER","MOUSELEAVE","TOUCHSTART","TOUCHMOVE","TOUCHEND","POINTERDOWN","POINTERUP","DRAG_START","LOAD_DATA_API","CAROUSEL","ITEM","POINTER_EVENT","ACTIVE_ITEM","ITEM_IMG","NEXT_PREV","INDICATORS","DATA_SLIDE","DATA_RIDE","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","window","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","length","direction","off","_handleSwipe","absDeltax","abs","_keydown","_addTouchEventListeners","start","originalEvent","pointerType","clientX","touches","move","end","clearTimeout","querySelectorAll","e","tagName","which","slice","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","isGoingToWrap","delta","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","slidEvent","nextElementInterval","parseInt","defaultInterval","action","TypeError","ride","_dataApiClickHandler","slideIndex","carousels","i","len","$carousel","SHOWN","HIDE","HIDDEN","COLLAPSE","COLLAPSING","COLLAPSED","Dimension","WIDTH","HEIGHT","ACTIVES","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","complete","capitalizedDimension","scrollSize","getBoundingClientRect","triggerArrayLength","$elem","isTransitioning","hasWidth","jquery","_getTargetFromElement","triggerArray","isOpen","$this","currentTarget","$trigger","selectors","$target","ESCAPE_KEYCODE","SPACE_KEYCODE","TAB_KEYCODE","ARROW_UP_KEYCODE","ARROW_DOWN_KEYCODE","RIGHT_MOUSE_BUTTON_WHICH","REGEXP_KEYDOWN","CLICK","KEYDOWN_DATA_API","KEYUP_DATA_API","DISABLED","DROPUP","DROPRIGHT","DROPLEFT","MENURIGHT","MENULEFT","POSITION_STATIC","FORM_CHILD","MENU","NAVBAR_NAV","MENU_ITEMS","FIRST_ITEM_IN_MENU","VISIBLE_ITEMS","AttachmentMap","TOP","TOPEND","BOTTOM","BOTTOMEND","RIGHTEND","LEFTEND","offset","flip","boundary","reference","display","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","_addAccessibility","disabled","_getParentFromElement","isActive","_clearMenus","showEvent","Popper","referenceElement","_getPopperConfig","body","noop","focus","find","first","hideEvent","destroy","update","scheduleUpdate","stopPropagation","constructor","_getPlacement","$parentDropdown","placement","_getOffset","offsets","popperConfig","modifiers","enabled","preventOverflow","boundariesElement","applyStyle","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","TIMEOUT","PERCENTAGE","SPLITLENGHT","TRANSITIONING","MEGAMENU","ROOT_NAV","MEGAMENU_PANEL","MEGAMENU_NAV","NAV_MENU","NAV_ITEM","NAV_LINK","NAV_LINK_COLLAPSE","NAV_LINK_BACK","NAV_LINK_EXPANDED","MegaMenu","_$navLinks","_$goForwardLinks","_$goBackLinks","_$topCollapseMenus","_$navLinkCollapses","noFocus","_addAriaAttributes","goTo","_initPosition","_goForward","_goBackward","_manageKeyDown","_collapseFocus","_handleCollapseToggle","$subNavs","navId","$thisNavToggler","$thisNav","$thisNavBackLink","$topMenu","goBackLabel","text","role","position","parents","rootPosition","translatePercentage","$rootNav","siblings","collapse","height","tabindex","$thisTarget","$thisCollapse","$targetNav","currentTranslatePos","navWidth","width","currentTranslatePercentage","$targetNavToggler","backdrop","FOCUSIN","RESIZE","CLICK_DISMISS","KEYDOWN_DISMISS","MOUSEUP_DISMISS","MOUSEDOWN_DISMISS","SCROLLABLE","SCROLLBAR_MEASURER","BACKDROP","OPEN","DIALOG","MODAL_BODY","DATA_DISMISS","FIXED_CONTENT","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_addAria","_checkScrollbar","_setScrollbar","_setEscapeEvent","_showBackdrop","_showElement","transition","_hideModal","forEach","htmlElement","Node","ELEMENT_NODE","appendChild","removeAttribute","scrollTop","_enforceFocus","shownEvent","transitionComplete","has","_resetScrollbar","_removeBackdrop","callback","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","rect","left","right","innerWidth","_getScrollbarWidth","fixedContent","actualRight","calculatedRight","actualPadding","paddingRight","calculatedPadding","padding","scrollDiv","scrollbarWidth","clientWidth","removeChild","$ModalPanel","$ModalTitle","$ModalDialog","ModalTitleId","BREAKPOINT","sticky","SUPRA_BAR","Navbar","_supraBar","_initialHeight","outerHeight","_initialSupraHeight","Scroll","hideSupra","extend","DEFAULT_THRESHOLD","ACCORDION_LAYOUT","OTAB_HEADING","OTAB_CONTENT","Otab","$tab","$tabpanel","uriAttrs","ARIA_ATTRIBUTE_PATTERN","DefaultWhitelist","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attrName","nodeName","nodeValue","regExp","attrRegex","l","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","domParser","DOMParser","createdDocument","parseFromString","whitelistKeys","keys","elements","el","elName","attributeList","attributes","whitelistedAttributes","concat","innerHTML","CLASS_PREFIX","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","html","container","fallbackPlacement","sanitize","AUTO","HoverState","OUT","INSERTED","FOCUSOUT","TOOLTIP","TOOLTIP_INNER","ARROW","Trigger","HOVER","MANUAL","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","isWithContent","shadowRoot","isInTheDom","ownerDocument","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","dir","getElementsByTagName","hash","replace","matched","behavior","arrow","onCreate","originalPlacement","_handlePopperPlacementChange","onUpdate","_fixTransition","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","empty","append","triggers","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","key","$tip","tabClass","join","popperData","popperInstance","instance","popper","initConfigAnimation","TITLE","CONTENT","Popover","_getContent","RESIZE_DURATION","PRIORITY","RESIZING","NAV_ELEMENTS","FIRST_ELEMENT","PRIORITY_ELEMENT","MenuLabelDefault","MenuTemplate","MenuLabel","PriorityNav","_$menu","_initMenu","_$allNavElements","_bindUIActions","_setupMenu","$allNavElements","firstPos","$wrappedElements","$elm","pos","top","eq","newSet","clone","$item","$itemDuplicate","prepend","_tearDown","dropdown","SCROLLANIMATE","method","SCROLL","CLICK_SCROLL","SCROLL_TOP","ScrollUp","_scrollElement","proxy","_process","_backToTop","Number","_clear","scrollUps","makeArray","$scrollup","ACTIVATE","DROPDOWN_ITEM","DROPDOWN_MENU","DATA_SPY","NAV_LIST_GROUP","NAV_LINKS","NAV_ITEMS","LIST_ITEMS","DROPDOWN","DROPDOWN_ITEMS","DROPDOWN_TOGGLE","OffsetMethod","OFFSET","POSITION","ScrollSpy","_offsets","_targets","_activeTarget","_scrollHeight","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targets","map","targetSelector","targetBCR","item","sort","pageYOffset","scrollHeight","max","_getOffsetHeight","innerHeight","maxScroll","_activate","offsetLength","isActiveTarget","queries","$link","node","scrollSpys","scrollSpysLength","$spy","ACTIVE_UL","DROPDOWN_ACTIVE_CHILD","Tab","previous","listElement","itemSelector","hiddenEvent","activeElements","active","_transitionComplete","tabIndex","dropdownChild","dropdownElement","dropdownToggleList","$tablist","tabId","substr","Items","k","keyCode","nextTab","tab","SHOWING","autohide","Toast","withoutTimeout","_close","version","minMajor","ltMajor","minMinor","minPatch","maxMajor"],"mappings":"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,EAAE,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;EACnD,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;;EAE9C,EAAE,OAAO,IAAI,CAAC;EACd,CAAC;;EAED;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,SAAS,GAAG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,EAAE;EACT;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,KAAK;EACb,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,MAAM,EAAE;EACV;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,MAAM;EACd;EACA;EACA;EACA,IAAI,MAAM,EAAE,CAAC;EACb,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,eAAe,EAAE;EACnB;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,eAAe;EACvB;EACA;EACA;EACA;EACA;EACA,IAAI,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;EAChD;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,OAAO,EAAE,CAAC;EACd;EACA;EACA;EACA;EACA;EACA,IAAI,iBAAiB,EAAE,cAAc;EACrC,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,YAAY,EAAE;EAChB;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,YAAY;EACpB,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,EAAE;EACT;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,KAAK;EACb;EACA,IAAI,OAAO,EAAE,WAAW;EACxB,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,EAAE;EACR;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,IAAI;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,QAAQ,EAAE,MAAM;EACpB;EACA;EACA;EACA;EACA,IAAI,OAAO,EAAE,CAAC;EACd;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,iBAAiB,EAAE,UAAU;EACjC;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,cAAc,EAAE,KAAK;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,uBAAuB,EAAE,KAAK;EAClC,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,EAAE;EACT;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,KAAK;EAClB;EACA,IAAI,EAAE,EAAE,KAAK;EACb,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,EAAE;EACR;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,IAAI;EACZ,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,YAAY,EAAE;EAChB;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,YAAY;EACpB;EACA;EACA;EACA;EACA;EACA,IAAI,eAAe,EAAE,IAAI;EACzB;EACA;EACA;EACA;EACA;EACA,IAAI,CAAC,EAAE,QAAQ;EACf;EACA;EACA;EACA;EACA;EACA,IAAI,CAAC,EAAE,OAAO;EACd,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,UAAU,EAAE;EACd;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,UAAU;EAClB;EACA,IAAI,MAAM,EAAE,gBAAgB;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,eAAe,EAAE,SAAS;EAC9B,GAAG;EACH,CAAC,CAAC;;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,QAAQ,GAAG;EACf;EACA;EACA;EACA;EACA,EAAE,SAAS,EAAE,QAAQ;;EAErB;EACA;EACA;EACA;EACA,EAAE,aAAa,EAAE,KAAK;;EAEtB;EACA;EACA;EACA;EACA,EAAE,aAAa,EAAE,IAAI;;EAErB;EACA;EACA;EACA;EACA;EACA,EAAE,eAAe,EAAE,KAAK;;EAExB;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,QAAQ,EAAE,SAAS,QAAQ,GAAG,EAAE;;EAElC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,QAAQ,EAAE,SAAS,QAAQ,GAAG,EAAE;;EAElC;EACA;EACA;EACA;EACA;EACA,EAAE,SAAS,EAAE,SAAS;EACtB,CAAC,CAAC;;EAEF;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAEA;EACA;EACA,IAAI,MAAM,GAAG,YAAY;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,SAAS,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE;EACrC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC;;EAErB,IAAI,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;EACzF,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;;EAEjC,IAAI,IAAI,CAAC,cAAc,GAAG,YAAY;EACtC,MAAM,OAAO,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;EACjD,KAAK,CAAC;;EAEN;EACA,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;EAEnD;EACA,IAAI,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;;EAE1D;EACA,IAAI,IAAI,CAAC,KAAK,GAAG;EACjB,MAAM,WAAW,EAAE,KAAK;EACxB,MAAM,SAAS,EAAE,KAAK;EACtB,MAAM,aAAa,EAAE,EAAE;EACvB,KAAK,CAAC;;EAEN;EACA,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;EAC9E,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;;EAE/D;EACA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;EAChC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;EACpG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;EAC5I,KAAK,CAAC,CAAC;;EAEP;EACA,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;EAC7E,MAAM,OAAO,QAAQ,CAAC;EACtB,QAAQ,IAAI,EAAE,IAAI;EAClB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;EACxC,KAAK,CAAC;EACN;EACA,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE;EAC1B,MAAM,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;EAC/B,KAAK,CAAC,CAAC;;EAEP;EACA;EACA;EACA;EACA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,eAAe,EAAE;EACtD,MAAM,IAAI,eAAe,CAAC,OAAO,IAAI,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;EACzE,QAAQ,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;EAC3G,OAAO;EACP,KAAK,CAAC,CAAC;;EAEP;EACA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;;EAElB,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;EACnD,IAAI,IAAI,aAAa,EAAE;EACvB;EACA,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;EAClC,KAAK;;EAEL,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;EAC7C,GAAG;;EAEH;EACA;;;EAGA,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;EACvB,IAAI,GAAG,EAAE,QAAQ;EACjB,IAAI,KAAK,EAAE,SAAS,SAAS,GAAG;EAChC,MAAM,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAC/B,KAAK;EACL,GAAG,EAAE;EACL,IAAI,GAAG,EAAE,SAAS;EAClB,IAAI,KAAK,EAAE,SAAS,UAAU,GAAG;EACjC,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAChC,KAAK;EACL,GAAG,EAAE;EACL,IAAI,GAAG,EAAE,sBAAsB;EAC/B,IAAI,KAAK,EAAE,SAAS,uBAAuB,GAAG;EAC9C,MAAM,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAC7C,KAAK;EACL,GAAG,EAAE;EACL,IAAI,GAAG,EAAE,uBAAuB;EAChC,IAAI,KAAK,EAAE,SAAS,wBAAwB,GAAG;EAC/C,MAAM,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAC9C,KAAK;;EAEL;EACA;EACA;EACA;EACA;;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA,GAAG,CAAC,CAAC,CAAC;EACN,EAAE,OAAO,MAAM,CAAC;EAChB,CAAC,EAAE,CAAC;;EAEJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EAGA,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE,WAAW,CAAC;EAC7E,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;EAC/B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;;EC7hF3B;;;;;;EAMA,IAAMnC,MAAI,GAAuB,UAAjC;EACA,IAAMC,SAAO,GAAoB,OAAjC;EACA,IAAMC,UAAQ,GAAmB,aAAjC;EACA,IAAMC,WAAS,SAAsBD,UAArC;EACA,IAAME,cAAY,GAAe,WAAjC;EACA,IAAMC,oBAAkB,GAAS3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAAjC;EACA,IAAM2P,cAAc,GAAa,EAAjC;;EACA,IAAMC,aAAa,GAAc,EAAjC;;EACA,IAAMC,WAAW,GAAgB,CAAjC;;EACA,IAAMC,gBAAgB,GAAW,EAAjC;;EACA,IAAMC,kBAAkB,GAAS,EAAjC;;EACA,IAAMC,wBAAwB,GAAG,CAAjC;;EACA,IAAMC,cAAc,GAAa,IAAI5Q,MAAJ,CAAcyQ,gBAAd,SAAkCC,kBAAlC,SAAwDJ,cAAxD,CAAjC;EAEA,IAAMnP,OAAK,GAAG;EACZgM,EAAAA,IAAI,WAAsBrM,WADd;EAEZsM,EAAAA,MAAM,aAAsBtM,WAFhB;EAGZY,EAAAA,IAAI,WAAsBZ,WAHd;EAIZoM,EAAAA,KAAK,YAAsBpM,WAJf;EAKZ+P,EAAAA,KAAK,YAAsB/P,WALf;EAMZQ,EAAAA,cAAc,YAAaR,WAAb,GAAyBC,cAN3B;EAOZ+P,EAAAA,gBAAgB,cAAahQ,WAAb,GAAyBC,cAP7B;EAQZgQ,EAAAA,cAAc,YAAajQ,WAAb,GAAyBC;EAR3B,CAAd;EAWA,IAAMQ,WAAS,GAAG;EAChByP,EAAAA,QAAQ,EAAU,UADF;EAEhBtP,EAAAA,IAAI,EAAc,MAFF;EAGhBuP,EAAAA,MAAM,EAAY,QAHF;EAIhBC,EAAAA,SAAS,EAAS,WAJF;EAKhBC,EAAAA,QAAQ,EAAU,UALF;EAMhBC,EAAAA,SAAS,EAAS,qBANF;EAOhBC,EAAAA,QAAQ,EAAU,oBAPF;EAQhBC,EAAAA,eAAe,EAAG;EARF,CAAlB;EAWA,IAAMrQ,UAAQ,GAAG;EACf2C,EAAAA,WAAW,EAAK,0BADD;EAEf2N,EAAAA,UAAU,EAAM,gBAFD;EAGfC,EAAAA,IAAI,EAAY,gBAHD;EAIfC,EAAAA,UAAU,EAAM,aAJD;EAKf;EACAC,EAAAA,UAAU,EAAG,+BANE;EAOfC,EAAAA,kBAAkB,EAAG,uFAPN;EAQf;EACAC,EAAAA,aAAa,EAAG;EATD,CAAjB;EAYA,IAAMC,aAAa,GAAG;EACpBC,EAAAA,GAAG,EAAS,WADQ;EAEpBC,EAAAA,MAAM,EAAM,SAFQ;EAGpBC,EAAAA,MAAM,EAAM,cAHQ;EAIpBC,EAAAA,SAAS,EAAG,YAJQ;EAKpBtM,EAAAA,KAAK,EAAO,aALQ;EAMpBuM,EAAAA,QAAQ,EAAI,WANQ;EAOpBxM,EAAAA,IAAI,EAAQ,YAPQ;EAQpByM,EAAAA,OAAO,EAAK;EARQ,CAAtB;EAWA,IAAMpN,SAAO,GAAG;EACdqN,EAAAA,MAAM,EAAM,CADE;EAEdC,EAAAA,IAAI,EAAQ,IAFE;EAGdC,EAAAA,QAAQ,EAAI,cAHE;EAIdC,EAAAA,SAAS,EAAG,QAJE;EAKdC,EAAAA,OAAO,EAAK;EALE,CAAhB;EAQA,IAAMlN,aAAW,GAAG;EAClB8M,EAAAA,MAAM,EAAM,0BADM;EAElBC,EAAAA,IAAI,EAAQ,SAFM;EAGlBC,EAAAA,QAAQ,EAAI,kBAHM;EAIlBC,EAAAA,SAAS,EAAG,kBAJM;EAKlBC,EAAAA,OAAO,EAAK;EAGd;;;;;;EARoB,CAApB;;MAcMC;;;EACJ,oBAAY1U,OAAZ,EAAqBwB,MAArB,EAA6B;EAC3B,SAAKqC,QAAL,GAAiB7D,OAAjB;EACA,SAAK2U,OAAL,GAAiB,IAAjB;EACA,SAAK7K,OAAL,GAAiB,KAAKC,UAAL,CAAgBvI,MAAhB,CAAjB;EACA,SAAKoT,KAAL,GAAiB,KAAKC,eAAL,EAAjB;EACA,SAAKC,SAAL,GAAiB,KAAKC,aAAL,EAAjB;;EAEA,SAAKvK,kBAAL;;EACA,SAAKwK,iBAAL,GAR2B;;EAS5B;;;;;EAgBD;WAEA/O,SAAA,kBAAS;EACP,QAAI,KAAKpC,QAAL,CAAcoR,QAAd,IAA0B3W,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACyP,QAApC,CAA9B,EAA6E;EAC3E;EACD;;EAED,QAAM1O,MAAM,GAAKmQ,QAAQ,CAACQ,qBAAT,CAA+B,KAAKrR,QAApC,CAAjB;;EACA,QAAMsR,QAAQ,GAAG7W,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAcjQ,QAAd,CAAuBnB,WAAS,CAACG,IAAjC,CAAjB;;EAEA+Q,IAAAA,QAAQ,CAACU,WAAT;;EAEA,QAAID,QAAJ,EAAc;EACZ;EACD;;EAED,QAAM9H,aAAa,GAAG;EACpBA,MAAAA,aAAa,EAAE,KAAKxJ;EADA,KAAtB;EAGA,QAAMwR,SAAS,GAAG/W,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACO,IAAd,EAAoB0J,aAApB,CAAlB;EAEA/O,IAAAA,CAAC,CAACiG,MAAD,CAAD,CAAUtD,OAAV,CAAkBoU,SAAlB;;EAEA,QAAIA,SAAS,CAAClR,kBAAV,EAAJ,EAAoC;EAClC;EACD,KAvBM;;;EA0BP,QAAI,CAAC,KAAK2Q,SAAV,EAAqB;EACnB;;;;EAIA,UAAI,OAAOQ,MAAP,KAAkB,WAAtB,EAAmC;EACjC,cAAM,IAAI3G,SAAJ,CAAc,mEAAd,CAAN;EACD;;EAED,UAAI4G,gBAAgB,GAAG,KAAK1R,QAA5B;;EAEA,UAAI,KAAKiG,OAAL,CAAa0K,SAAb,KAA2B,QAA/B,EAAyC;EACvCe,QAAAA,gBAAgB,GAAGhR,MAAnB;EACD,OAFD,MAEO,IAAIrF,IAAI,CAACkC,SAAL,CAAe,KAAK0I,OAAL,CAAa0K,SAA5B,CAAJ,EAA4C;EACjDe,QAAAA,gBAAgB,GAAG,KAAKzL,OAAL,CAAa0K,SAAhC,CADiD;;EAIjD,YAAI,OAAO,KAAK1K,OAAL,CAAa0K,SAAb,CAAuB1C,MAA9B,KAAyC,WAA7C,EAA0D;EACxDyD,UAAAA,gBAAgB,GAAG,KAAKzL,OAAL,CAAa0K,SAAb,CAAuB,CAAvB,CAAnB;EACD;EACF,OApBkB;EAuBnB;EACA;;;EACA,UAAI,KAAK1K,OAAL,CAAayK,QAAb,KAA0B,cAA9B,EAA8C;EAC5CjW,QAAAA,CAAC,CAACiG,MAAD,CAAD,CAAUwJ,QAAV,CAAmBvK,WAAS,CAAC+P,eAA7B;EACD;;EACD,WAAKoB,OAAL,GAAe,IAAIW,MAAJ,CAAWC,gBAAX,EAA6B,KAAKX,KAAlC,EAAyC,KAAKY,gBAAL,EAAzC,CAAf;EACD,KAvDM;EA0DP;EACA;EACA;;;EACA,QAAI,kBAAkB3V,QAAQ,CAACyC,eAA3B,IACAhE,CAAC,CAACiG,MAAD,CAAD,CAAUC,OAAV,CAAkBtB,UAAQ,CAACwQ,UAA3B,EAAuCnI,MAAvC,KAAkD,CADtD,EACyD;EACvDjN,MAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiB3H,QAAjB,GAA4BxI,EAA5B,CAA+B,WAA/B,EAA4C,IAA5C,EAAkDhH,CAAC,CAACoX,IAApD;EACD;;EAED,SAAK7R,QAAL,CAAc8R,KAAd;;EACA,SAAK9R,QAAL,CAAc0C,YAAd,CAA2B,eAA3B,EAA4C,IAA5C;;EAEAjI,IAAAA,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAclO,WAAd,CAA0BlD,WAAS,CAACG,IAApC;EACArF,IAAAA,CAAC,CAACiG,MAAD,CAAD,CACGmC,WADH,CACelD,WAAS,CAACG,IADzB,EAEG1C,OAFH,CAEW3C,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAAC+L,KAAd,EAAqB9B,aAArB,CAFX;EAGD;;WAEDuD,OAAA,gBAAO;EACL,QAAI,KAAK/M,QAAL,CAAcoR,QAAd,IAA0B3W,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACyP,QAApC,CAA1B,IAA2E3U,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAcjQ,QAAd,CAAuBnB,WAAS,CAACG,IAAjC,CAA/E,EAAuH;EACrH;EACD;;EAED,QAAM0J,aAAa,GAAG;EACpBA,MAAAA,aAAa,EAAE,KAAKxJ;EADA,KAAtB;EAGA,QAAMwR,SAAS,GAAG/W,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACO,IAAd,EAAoB0J,aAApB,CAAlB;;EACA,QAAM9I,MAAM,GAAGmQ,QAAQ,CAACQ,qBAAT,CAA+B,KAAKrR,QAApC,CAAf;;EAEAvF,IAAAA,CAAC,CAACiG,MAAD,CAAD,CAAUtD,OAAV,CAAkBoU,SAAlB;;EAEA,QAAIA,SAAS,CAAClR,kBAAV,EAAJ,EAAoC;EAClC;EACD;;EAED7F,IAAAA,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAclO,WAAd,CAA0BlD,WAAS,CAACG,IAApC;EACArF,IAAAA,CAAC,CAACiG,MAAD,CAAD,CACGmC,WADH,CACelD,WAAS,CAACG,IADzB,EAEG1C,OAFH,CAEW3C,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAAC+L,KAAd,EAAqB9B,aAArB,CAFX,EAlBK;;EAsBL/O,IAAAA,CAAC,CAACiG,MAAD,CAAD,CAAUqR,IAAV,CAAe1S,UAAQ,CAAC0Q,kBAAxB,EAA4CiC,KAA5C,GAAoD5U,OAApD,CAA4D,OAA5D,EAtBK;EAwBN;;WAED0P,OAAA,gBAAO;EACL,QAAI,KAAK9M,QAAL,CAAcoR,QAAd,IAA0B3W,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACyP,QAApC,CAA1B,IAA2E,CAAC3U,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAcjQ,QAAd,CAAuBnB,WAAS,CAACG,IAAjC,CAAhF,EAAwH;EACtH;EACD;;EAED,QAAM0J,aAAa,GAAG;EACpBA,MAAAA,aAAa,EAAE,KAAKxJ;EADA,KAAtB;EAGA,QAAMiS,SAAS,GAAGxX,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACgM,IAAd,EAAoB/B,aAApB,CAAlB;;EACA,QAAM9I,MAAM,GAAGmQ,QAAQ,CAACQ,qBAAT,CAA+B,KAAKrR,QAApC,CAAf;;EAEAvF,IAAAA,CAAC,CAACiG,MAAD,CAAD,CAAUtD,OAAV,CAAkB6U,SAAlB;;EAEA,QAAIA,SAAS,CAAC3R,kBAAV,EAAJ,EAAoC;EAClC;EACD;;EAED7F,IAAAA,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAclO,WAAd,CAA0BlD,WAAS,CAACG,IAApC;EACArF,IAAAA,CAAC,CAACiG,MAAD,CAAD,CACGmC,WADH,CACelD,WAAS,CAACG,IADzB,EAEG1C,OAFH,CAEW3C,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACiM,MAAd,EAAsBhC,aAAtB,CAFX;EAGD;;WAEDhJ,UAAA,mBAAU;EACR/F,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKT,QAAlB,EAA4Bf,UAA5B;EACAxE,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB4H,GAAjB,CAAqB1I,WAArB;EACA,SAAKc,QAAL,GAAgB,IAAhB;EACA,SAAK+Q,KAAL,GAAa,IAAb;;EACA,QAAI,KAAKD,OAAL,KAAiB,IAArB,EAA2B;EACzB,WAAKA,OAAL,CAAaoB,OAAb;;EACA,WAAKpB,OAAL,GAAe,IAAf;EACD;EACF;;WAEDqB,SAAA,kBAAS;EACP,SAAKlB,SAAL,GAAiB,KAAKC,aAAL,EAAjB;;EACA,QAAI,KAAKJ,OAAL,KAAiB,IAArB,EAA2B;EACzB,WAAKA,OAAL,CAAasB,cAAb;EACD;EACF;;;WAIDzL,qBAAA,8BAAqB;EAAA;;EACnBlM,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiByB,EAAjB,CAAoBlC,OAAK,CAAC0P,KAA1B,EAAiC,UAACzU,KAAD,EAAW;EAC1CA,MAAAA,KAAK,CAACgH,cAAN;EACAhH,MAAAA,KAAK,CAAC6X,eAAN;;EACA,MAAA,KAAI,CAACjQ,MAAL;EACD,KAJD;EAKD;;WAED8D,aAAA,oBAAWvI,MAAX,EAAmB;EACjBA,IAAAA,MAAM,qBACD,KAAK2U,WAAL,CAAiBnP,OADhB,EAED1I,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBqB,IAAjB,EAFC,EAGD1D,MAHC,CAAN;EAMAtC,IAAAA,IAAI,CAACoC,eAAL,CACEsB,MADF,EAEEpB,MAFF,EAGE,KAAK2U,WAAL,CAAiB5O,WAHnB;EAMA,WAAO/F,MAAP;EACD;;WAEDqT,kBAAA,2BAAkB;EAChB,QAAI,CAAC,KAAKD,KAAV,EAAiB;EACf,UAAMrQ,MAAM,GAAGmQ,QAAQ,CAACQ,qBAAT,CAA+B,KAAKrR,QAApC,CAAf;;EAEA,UAAIU,MAAJ,EAAY;EACV,aAAKqQ,KAAL,GAAarQ,MAAM,CAAClE,aAAP,CAAqB6C,UAAQ,CAACuQ,IAA9B,CAAb;EACD;EACF;;EACD,WAAO,KAAKmB,KAAZ;EACD;;WAEDwB,gBAAA,yBAAgB;EACd,QAAMC,eAAe,GAAG/X,CAAC,CAAC,KAAKuF,QAAL,CAAclB,UAAf,CAAzB;EACA,QAAI2T,SAAS,GAAGxC,aAAa,CAACG,MAA9B,CAFc;;EAKd,QAAIoC,eAAe,CAAC1R,QAAhB,CAAyBnB,WAAS,CAAC0P,MAAnC,CAAJ,EAAgD;EAC9CoD,MAAAA,SAAS,GAAGxC,aAAa,CAACC,GAA1B;;EACA,UAAIzV,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAcjQ,QAAd,CAAuBnB,WAAS,CAAC6P,SAAjC,CAAJ,EAAiD;EAC/CiD,QAAAA,SAAS,GAAGxC,aAAa,CAACE,MAA1B;EACD;EACF,KALD,MAKO,IAAIqC,eAAe,CAAC1R,QAAhB,CAAyBnB,WAAS,CAAC2P,SAAnC,CAAJ,EAAmD;EACxDmD,MAAAA,SAAS,GAAGxC,aAAa,CAAClM,KAA1B;EACD,KAFM,MAEA,IAAIyO,eAAe,CAAC1R,QAAhB,CAAyBnB,WAAS,CAAC4P,QAAnC,CAAJ,EAAkD;EACvDkD,MAAAA,SAAS,GAAGxC,aAAa,CAACnM,IAA1B;EACD,KAFM,MAEA,IAAIrJ,CAAC,CAAC,KAAKsW,KAAN,CAAD,CAAcjQ,QAAd,CAAuBnB,WAAS,CAAC6P,SAAjC,CAAJ,EAAiD;EACtDiD,MAAAA,SAAS,GAAGxC,aAAa,CAACI,SAA1B;EACD;;EACD,WAAOoC,SAAP;EACD;;WAEDvB,gBAAA,yBAAgB;EACd,WAAOzW,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBW,OAAjB,CAAyB,SAAzB,EAAoC+G,MAApC,GAA6C,CAApD;EACD;;WAEDgL,aAAA,sBAAa;EAAA;;EACX,QAAMlC,MAAM,GAAG,EAAf;;EAEA,QAAI,OAAO,KAAKvK,OAAL,CAAauK,MAApB,KAA+B,UAAnC,EAA+C;EAC7CA,MAAAA,MAAM,CAAC/U,EAAP,GAAY,UAAC4F,IAAD,EAAU;EACpBA,QAAAA,IAAI,CAACsR,OAAL,qBACKtR,IAAI,CAACsR,OADV,EAEK,MAAI,CAAC1M,OAAL,CAAauK,MAAb,CAAoBnP,IAAI,CAACsR,OAAzB,EAAkC,MAAI,CAAC3S,QAAvC,KAAoD,EAFzD;EAKA,eAAOqB,IAAP;EACD,OAPD;EAQD,KATD,MASO;EACLmP,MAAAA,MAAM,CAACA,MAAP,GAAgB,KAAKvK,OAAL,CAAauK,MAA7B;EACD;;EAED,WAAOA,MAAP;EACD;;WAEDmB,mBAAA,4BAAmB;EACjB,QAAMiB,YAAY,GAAG;EACnBH,MAAAA,SAAS,EAAE,KAAKF,aAAL,EADQ;EAEnBM,MAAAA,SAAS,EAAE;EACTrC,QAAAA,MAAM,EAAE,KAAKkC,UAAL,EADC;EAETjC,QAAAA,IAAI,EAAE;EACJqC,UAAAA,OAAO,EAAE,KAAK7M,OAAL,CAAawK;EADlB,SAFG;EAKTsC,QAAAA,eAAe,EAAE;EACfC,UAAAA,iBAAiB,EAAE,KAAK/M,OAAL,CAAayK;EADjB;EALR,OAFQ;;EAAA,KAArB;;EAcA,QAAI,KAAKzK,OAAL,CAAa2K,OAAb,KAAyB,QAA7B,EAAuC;EACrCgC,MAAAA,YAAY,CAACC,SAAb,CAAuBI,UAAvB,GAAoC;EAClCH,QAAAA,OAAO,EAAE;EADyB,OAApC;EAGD;;EAED,WAAOF,YAAP;EACD;;;WAGDzB,oBAAA,6BAAoB;EAClB1W,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBuN,IAAjB,CAAsB,eAAtB,EAAuC,IAAvC,EADkB;;EAGlB9S,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBU,MAAjB,GAA0BuJ,QAA1B,CAAmC5K,UAAQ,CAACuQ,IAA5C,EAAkDrC,IAAlD,CAAuD,MAAvD,EAA+D,MAA/D,EAHkB;;EAKlB9S,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBU,MAAjB,GAA0BuJ,QAA1B,CAAmC5K,UAAQ,CAACuQ,IAA5C,EAAkD3F,QAAlD,CAA2D,gBAA3D,EAA6EsD,IAA7E,CAAkF,MAAlF,EAA0F,UAA1F;EACD;EAGD;;;aAEOrM,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAMgH,OAAO,GAAG,OAAOtI,MAAP,KAAkB,QAAlB,GAA6BA,MAA7B,GAAsC,IAAtD;;EAEA,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIwP,QAAJ,CAAa,IAAb,EAAmB5K,OAAnB,CAAP;EACAxL,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD,OAP0B;;;EAU3B,UAAI,OAAOhD,IAAP,CAAYV,MAAZ,CAAJ,EAAyB;EACvB;EACD,OAZ0B;;;EAe3B,UAAI,OAAOA,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KArBM,CAAP;EAsBD;;aAEM4T,cAAP,qBAAmB/W,KAAnB,EAA0B;EACxB,QAAIA,KAAK,KAAKA,KAAK,CAACqO,KAAN,KAAgBkG,wBAAhB,IACZvU,KAAK,CAACsI,IAAN,KAAe,OAAf,IAA0BtI,KAAK,CAACqO,KAAN,KAAgB+F,WADnC,CAAT,EAC0D;EACxD;EACD;;EAED,QAAMsE,OAAO,GAAG,GAAGpK,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0BrJ,UAAQ,CAAC2C,WAAnC,CAAd,CAAhB;;EAEA,SAAK,IAAImJ,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAG8H,OAAO,CAACxL,MAA9B,EAAsCyD,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;EAClD,UAAMzK,MAAM,GAAGmQ,QAAQ,CAACQ,qBAAT,CAA+B6B,OAAO,CAAC/H,CAAD,CAAtC,CAAf;;EACA,UAAMgI,OAAO,GAAG1Y,CAAC,CAACyY,OAAO,CAAC/H,CAAD,CAAR,CAAD,CAAc9J,IAAd,CAAmBpC,UAAnB,CAAhB;EACA,UAAMuK,aAAa,GAAG;EACpBA,QAAAA,aAAa,EAAE0J,OAAO,CAAC/H,CAAD;EADF,OAAtB;;EAIA,UAAI3Q,KAAK,IAAIA,KAAK,CAACsI,IAAN,KAAe,OAA5B,EAAqC;EACnC0G,QAAAA,aAAa,CAAC4J,UAAd,GAA2B5Y,KAA3B;EACD;;EAED,UAAI,CAAC2Y,OAAL,EAAc;EACZ;EACD;;EAED,UAAME,YAAY,GAAGF,OAAO,CAACpC,KAA7B;;EACA,UAAI,CAACtW,CAAC,CAACiG,MAAD,CAAD,CAAUI,QAAV,CAAmBnB,WAAS,CAACG,IAA7B,CAAL,EAAyC;EACvC;EACD;;EAED,UAAItF,KAAK,KAAKA,KAAK,CAACsI,IAAN,KAAe,OAAf,IACV,kBAAkBzE,IAAlB,CAAuB7D,KAAK,CAACE,MAAN,CAAakO,OAApC,CADU,IACsCpO,KAAK,CAACsI,IAAN,KAAe,OAAf,IAA0BtI,KAAK,CAACqO,KAAN,KAAgB+F,WADrF,CAAL,IAEAnU,CAAC,CAACkI,QAAF,CAAWjC,MAAX,EAAmBlG,KAAK,CAACE,MAAzB,CAFJ,EAEsC;EACpC;EACD;;EAED,UAAMuX,SAAS,GAAGxX,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACgM,IAAd,EAAoB/B,aAApB,CAAlB;EACA/O,MAAAA,CAAC,CAACiG,MAAD,CAAD,CAAUtD,OAAV,CAAkB6U,SAAlB;;EACA,UAAIA,SAAS,CAAC3R,kBAAV,EAAJ,EAAoC;EAClC;EACD,OA9BiD;EAiClD;;;EACA,UAAI,kBAAkBtE,QAAQ,CAACyC,eAA/B,EAAgD;EAC9ChE,QAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiB3H,QAAjB,GAA4BrC,GAA5B,CAAgC,WAAhC,EAA6C,IAA7C,EAAmDnN,CAAC,CAACoX,IAArD;EACD;;EAEDqB,MAAAA,OAAO,CAAC/H,CAAD,CAAP,CAAWzI,YAAX,CAAwB,eAAxB,EAAyC,OAAzC;EAEAjI,MAAAA,CAAC,CAAC4Y,YAAD,CAAD,CAAgBxS,WAAhB,CAA4BlB,WAAS,CAACG,IAAtC;EACArF,MAAAA,CAAC,CAACiG,MAAD,CAAD,CACGG,WADH,CACelB,WAAS,CAACG,IADzB,EAEG1C,OAFH,CAEW3C,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACiM,MAAd,EAAsBhC,aAAtB,CAFX;EAGD;EACF;;aAEM6H,wBAAP,+BAA6BlV,OAA7B,EAAsC;EACpC,QAAIuE,MAAJ;EACA,QAAMtE,QAAQ,GAAGf,IAAI,CAACa,sBAAL,CAA4BC,OAA5B,CAAjB;;EAEA,QAAIC,QAAJ,EAAc;EACZsE,MAAAA,MAAM,GAAG1E,QAAQ,CAACQ,aAAT,CAAuBJ,QAAvB,CAAT;EACD;;EAED,WAAOsE,MAAM,IAAIvE,OAAO,CAAC2C,UAAzB;EACD;;;aAGMwU,yBAAP,gCAA8B9Y,KAA9B,EAAqC;EACnC;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAI,kBAAkB6D,IAAlB,CAAuB7D,KAAK,CAACE,MAAN,CAAakO,OAApC,IACApO,KAAK,CAACqO,KAAN,KAAgB8F,aAAhB,IAAiCnU,KAAK,CAACqO,KAAN,KAAgB6F,cAAhB,KAClClU,KAAK,CAACqO,KAAN,KAAgBiG,kBAAhB,IAAsCtU,KAAK,CAACqO,KAAN,KAAgBgG,gBAAtD,IACCpU,CAAC,CAACD,KAAK,CAACE,MAAP,CAAD,CAAgBiG,OAAhB,CAAwBtB,UAAQ,CAACuQ,IAAjC,EAAuClI,MAFN,CADjC,GAGiD,CAACsH,cAAc,CAAC3Q,IAAf,CAAoB7D,KAAK,CAACqO,KAA1B,CAHtD,EAGwF;EACtF;EACD;;EAEDrO,IAAAA,KAAK,CAACgH,cAAN;EACAhH,IAAAA,KAAK,CAAC6X,eAAN;;EAEA,QAAI,KAAKjB,QAAL,IAAiB3W,CAAC,CAAC,IAAD,CAAD,CAAQqG,QAAR,CAAiBnB,WAAS,CAACyP,QAA3B,CAArB,EAA2D;EACzD;EACD;;EAED,QAAM1O,MAAM,GAAKmQ,QAAQ,CAACQ,qBAAT,CAA+B,IAA/B,CAAjB;;EACA,QAAMC,QAAQ,GAAG7W,CAAC,CAACiG,MAAD,CAAD,CAAUI,QAAV,CAAmBnB,WAAS,CAACG,IAA7B,CAAjB;;EAEA,QAAI,CAACwR,QAAD,IAAaA,QAAQ,KAAK9W,KAAK,CAACqO,KAAN,KAAgB6F,cAAhB,IAAkClU,KAAK,CAACqO,KAAN,KAAgB8F,aAAvD,CAAzB,EAAgG;EAC9F,UAAInU,KAAK,CAACqO,KAAN,KAAgB6F,cAApB,EAAoC;EAClC,YAAMtM,MAAM,GAAG1B,MAAM,CAAClE,aAAP,CAAqB6C,UAAQ,CAAC2C,WAA9B,CAAf;EACAvH,QAAAA,CAAC,CAAC2H,MAAD,CAAD,CAAUhF,OAAV,CAAkB,OAAlB;EACD;;EAED3C,MAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ2C,OAAR,CAAgB,OAAhB;EACA;EACD;;EAED,QAAMmW,KAAK,GAAG,GAAGzK,KAAH,CAAS7O,IAAT,CAAcyG,MAAM,CAACgI,gBAAP,CAAwBrJ,UAAQ,CAAC2Q,aAAjC,CAAd,CAAd;;EAEA,QAAIuD,KAAK,CAAC7L,MAAN,KAAiB,CAArB,EAAwB;EACtB;EACD;;EAED,QAAIH,KAAK,GAAGgM,KAAK,CAACxK,OAAN,CAAcvO,KAAK,CAACE,MAApB,CAAZ;;EAEA,QAAIF,KAAK,CAACqO,KAAN,KAAgBgG,gBAAhB,IAAoCtH,KAAK,GAAG,CAAhD,EAAmD;EAAE;EACnDA,MAAAA,KAAK;EACN;;EAED,QAAI/M,KAAK,CAACqO,KAAN,KAAgBiG,kBAAhB,IAAsCvH,KAAK,GAAGgM,KAAK,CAAC7L,MAAN,GAAe,CAAjE,EAAoE;EAAE;EACpEH,MAAAA,KAAK;EACN;;EAED,QAAIA,KAAK,GAAG,CAAZ,EAAe;EACbA,MAAAA,KAAK,GAAG,CAAR;EACD;;EAEDgM,IAAAA,KAAK,CAAChM,KAAD,CAAL,CAAauK,KAAb;EACD;;;;0BApaoB;EACnB,aAAO9S,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;0BAEwB;EACvB,aAAOO,aAAP;EACD;;;;;EA6ZH;;;;;;;EAMAjJ,CAAC,CAACuB,QAAD,CAAD,CACGyF,EADH,CACMlC,OAAK,CAAC2P,gBADZ,EAC8B7P,UAAQ,CAAC2C,WADvC,EACoD6O,QAAQ,CAACyC,sBAD7D,EAEG7R,EAFH,CAEMlC,OAAK,CAAC2P,gBAFZ,EAE8B7P,UAAQ,CAACuQ,IAFvC,EAE6CiB,QAAQ,CAACyC,sBAFtD,EAGG7R,EAHH,CAGSlC,OAAK,CAACG,cAHf,SAGiCH,OAAK,CAAC4P,cAHvC,EAGyD0B,QAAQ,CAACU,WAHlE,EAIG9P,EAJH,CAIMlC,OAAK,CAACG,cAJZ,EAI4BL,UAAQ,CAAC2C,WAJrC,EAIkD,UAAUxH,KAAV,EAAiB;EAC/DA,EAAAA,KAAK,CAACgH,cAAN;EACAhH,EAAAA,KAAK,CAAC6X,eAAN;;EACAxB,EAAAA,QAAQ,CAAC3P,gBAAT,CAA0BjH,IAA1B,CAA+BQ,CAAC,CAAC,IAAD,CAAhC,EAAwC,QAAxC;EACD,CARH,EASGgH,EATH,CASMlC,OAAK,CAACG,cATZ,EAS4BL,UAAQ,CAACsQ,UATrC,EASiD,UAAChH,CAAD,EAAO;EACpDA,EAAAA,CAAC,CAAC0J,eAAF;EACD,CAXH;EAAA,CAaG5Q,EAbH,CAaM,kBAbN,EAa0B,YAAM;EAC5B;EACAoP,EAAAA,QAAQ,CAAC3P,gBAAT,CAA0BjH,IAA1B,CAA+BQ,CAAC,CAAC4E,UAAQ,CAAC2C,WAAV,CAAhC,EAAwD,MAAxD;EACD,CAhBH;;EAmBA;;;;;;EAMAvH,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAa8R,QAAQ,CAAC3P,gBAAtB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyBmP,QAAzB;;EACApW,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOyR,QAAQ,CAAC3P,gBAAhB;EACD,CAHD;;EC9iBA;;EAEA;;;;;;EAMA,IAAMnC,MAAI,GAAG,UAAb;EACA,IAAMC,SAAO,GAAG,OAAhB;EACA,IAAMC,UAAQ,GAAG,aAAjB;EACA,IAAMG,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EACA,IAAMgE,oBAAkB,GAAG,EAA3B;;EACA,IAAMC,qBAAmB,GAAG,EAA5B;;EACA,IAAM6L,kBAAgB,GAAG,EAAzB;;EACA,IAAMC,oBAAkB,GAAG,EAA3B;;EACA,IAAM0E,OAAO,GAAG,IAAhB;;EACA,IAAMC,UAAU,GAAG,GAAnB;;EACA,IAAMC,WAAW,GAAG,CAApB;EAEA,IAAM/T,WAAS,GAAG;EAChBgU,EAAAA,aAAa,EAAE;EADC,CAAlB;EAIA,IAAMtU,UAAQ,GAAG;EACfuU,EAAAA,QAAQ,EAAM,YADC;EAEfC,EAAAA,QAAQ,EAAG,0BAFI;EAGfC,EAAAA,cAAc,EAAG,kBAHF;EAIfC,EAAAA,YAAY,EAAG,yBAJA;EAKfC,EAAAA,QAAQ,EAAG,aALI;EAMfC,EAAAA,QAAQ,EAAG,WANI;EAOfC,EAAAA,QAAQ,EAAG,WAPI;EAQfC,EAAAA,iBAAiB,EAAG,iCARL;EASfC,EAAAA,aAAa,EAAG,gBATD;EAUfC,EAAAA,iBAAiB,EAAG;EAItB;;;;;;EAdiB,CAAjB;;MAoBMC;;;EACJ,oBAAYnY,OAAZ,EAAqBwB,MAArB,EAA6B;EAC3B,SAAKqC,QAAL,GAAgB7D,OAAhB;EACA,SAAKoY,UAAL,GAAkB9Z,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,CAAsB1S,UAAQ,CAAC6U,QAA/B,CAAlB;EACA,SAAKM,gBAAL,GAAwB/Z,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,CAAsB1S,UAAQ,CAAC0U,YAA/B,EAA6C/M,IAA7C,CAAkD3H,UAAQ,CAAC6U,QAA3D,CAAxB;EACA,SAAKO,aAAL,GAAqBha,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,CAAsB1S,UAAQ,CAAC+U,aAA/B,CAArB;EACA,SAAKM,kBAAL,GAA0Bja,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,CAAsB1S,UAAQ,CAACyU,cAA/B,CAA1B;EACA,SAAKa,kBAAL,GAA0Bla,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,CAAsB1S,UAAQ,CAAC8U,iBAA/B,CAA1B;EACA,SAAKlO,OAAL,GAAetI,MAAf;;EACA,QAAI,OAAO,KAAKsI,OAAL,CAAa2O,OAApB,KAAgC,WAApC,EAAiD;EAC/C,WAAK3O,OAAL,CAAa2O,OAAb,GAAuB,KAAvB;EACD;;EACD,SAAKjO,kBAAL;;EACA,SAAKkO,kBAAL,CAAwB,KAAK7U,QAA7B;;EACA,SAAK8U,IAAL,GAAY,KAAKC,aAAjB;EACD;;;;;EAQD;EAEA;WAEApO,qBAAA,8BAAqB;EAAA;;EACnB,SAAK6N,gBAAL,CAAsB/S,EAAtB,CAAyB,OAAzB,EAAkC,UAACjH,KAAD;EAAA,aAAW,KAAI,CAACwa,UAAL,CAAgBxa,KAAhB,CAAX;EAAA,KAAlC;;EACA,SAAKia,aAAL,CAAmBhT,EAAnB,CAAsB,OAAtB,EAA+B,UAACjH,KAAD;EAAA,aAAW,KAAI,CAACya,WAAL,CAAiBza,KAAjB,CAAX;EAAA,KAA/B;;EACA,SAAK+Z,UAAL,CAAgB9S,EAAhB,CAAmB,SAAnB,EAA8B,UAACjH,KAAD;EAAA,aAAW,KAAI,CAAC0a,cAAL,CAAoB1a,KAApB,CAAX;EAAA,KAA9B;;EACA,QAAI,CAAC,KAAKyL,OAAL,CAAa2O,OAAlB,EAA2B;EACzB,WAAKF,kBAAL,CAAwBjT,EAAxB,CAA2B,mBAA3B,EAAgD,KAAK0T,cAArD;EACD;;EACD,SAAKR,kBAAL,CAAwBlT,EAAxB,CAA2B,OAA3B,EAAoC,UAACjH,KAAD;EAAA,aAAW,KAAI,CAAC4a,qBAAL,CAA2B5a,KAA3B,CAAX;EAAA,KAApC;EACD;;WAEDqa,qBAAA,4BAAmB1Y,OAAnB,EAA4B;EAC1B,QAAMkZ,QAAQ,GAAG5a,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB,yBAAhB,CAAjB;EAEAtX,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAWoR,IAAX,CAAgB,MAAhB,EAAwB,aAAxB;EACA9S,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB,eAAhB,EAAiCxE,IAAjC,CAAsC,MAAtC,EAA8C,MAA9C;EACA9S,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB1S,UAAQ,CAACyU,cAAzB,EAAyCvG,IAAzC,CAA8C,MAA9C,EAAsD,MAAtD;EACA9S,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB,iCAAhB,EAAmDxE,IAAnD,CAAwD,MAAxD,EAAgE,UAAhE;EACA9S,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB1S,UAAQ,CAAC+U,aAAzB,EAAwC7G,IAAxC,CAA6C;EAC3C,qBAAe;EAD4B,KAA7C;EAGA9S,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB1S,UAAQ,CAAC4U,QAAzB,EAAmC1G,IAAnC,CAAwC,MAAxC,EAAgD,cAAhD;EAEA8H,IAAAA,QAAQ,CAAClU,IAAT,CAAc,YAAY;EACxB,UAAMmU,KAAK,GAAGja,IAAI,CAACO,MAAL,CAAYmD,MAAZ,CAAd;EACA,UAAMwW,eAAe,GAAG9a,CAAC,CAAC,IAAD,CAAD,CAAQuM,IAAR,CAAa3H,UAAQ,CAAC6U,QAAtB,CAAxB;EACA,UAAMsB,QAAQ,GAAG/a,CAAC,CAAC,IAAD,CAAlB;EACA,UAAMgb,gBAAgB,GAAGD,QAAQ,CAACzD,IAAT,CAAc1S,UAAQ,CAAC+U,aAAvB,CAAzB;EACA,UAAMsB,QAAQ,GAAGjb,CAAC,CAAC,IAAD,CAAD,CAAQkG,OAAR,CAAgBtB,UAAQ,CAAC2U,QAAzB,EAAmCtT,MAAnC,GAA4CC,OAA5C,CAAoDtB,UAAQ,CAAC2U,QAA7D,EAAuEhN,IAAvE,CAA4E3H,UAAQ,CAAC6U,QAArF,CAAjB;EACA,UAAIyB,WAAW,mBAAiBD,QAAQ,CAACE,IAAT,EAAjB,UAAf;;EAEA,UAAI,CAACF,QAAQ,CAAChO,MAAd,EAAsB;EACpBiO,QAAAA,WAAW,mBAAiBlb,CAAC,CAAC,IAAD,CAAD,CAAQkG,OAAR,CAAgBtB,UAAQ,CAACyU,cAAzB,EAAyC9M,IAAzC,CAA8C3H,UAAQ,CAAC6U,QAAvD,EAAiE0B,IAAjE,EAAjB,UAAX;EACD;;EAEDJ,MAAAA,QAAQ,CAACjI,IAAT,CAAc;EACZpB,QAAAA,EAAE,EAAEmJ,KADQ;EAEZO,QAAAA,IAAI,EAAE;EAFM,OAAd;EAIAN,MAAAA,eAAe,CAAChI,IAAhB,CAAqB;EACnBsI,QAAAA,IAAI,EAAE,UADa;EAEnB,yBAAiBP,KAFE;EAGnB,yBAAiB,KAHE;EAInB,yBAAiB;EAJE,OAArB;EAMAG,MAAAA,gBAAgB,CAAClI,IAAjB,CAAsB;EACpBsI,QAAAA,IAAI,EAAE,UADc;EAEpB,yBAAiBP,KAFG;EAGpB,sBAAcK;EAHM,OAAtB;EAKD,KA3BD;EA4BD;;WAEDZ,gBAAA,uBAAcra,MAAd,EAAsB;EAAA;;EACpB,QAAI,CAACD,CAAC,CAACC,MAAD,CAAD,CAAUgN,MAAf,EAAuB;EACrB;EACD;;EAED,QAAM+G,OAAO,GAAGhU,CAAC,CAACC,MAAD,CAAD,CAAUsX,KAAV,EAAhB;EACA,QAAM8D,QAAQ,GAAGrH,OAAO,CAACsH,OAAR,GAAkBxO,KAAlB,CAAwB,KAAKvH,QAA7B,CAAjB;EACA,QAAMgW,YAAY,GAAGvb,CAAC,CAAC,4BAAD,CAAD,CAAgCuX,KAAhC,GAAwC+D,OAAxC,GAAkDxO,KAAlD,CAAwD9M,CAAC,CAAC,YAAD,CAAzD,CAArB;EACA,QAAMwb,mBAAmB,GAAG,EAAEH,QAAQ,GAAGE,YAAb,IAA6BvC,UAA7B,GAA0C,CAAtE;EACA,QAAM+B,QAAQ,GAAG/G,OAAO,CAAC9N,OAAR,CAAgBtB,UAAQ,CAAC2U,QAAzB,CAAjB;EACA,QAAMkC,QAAQ,GAAGzb,CAAC,CAAC4E,UAAQ,CAACwU,QAAV,CAAlB;EAEAqC,IAAAA,QAAQ,CAAChM,QAAT,CAAkBvK,WAAS,CAACgU,aAA5B,EAZoB;;EAepB,QAAIlF,OAAO,CAAClB,IAAR,CAAa,aAAb,MAAgC,UAApC,EAAgD;EAC9CkB,MAAAA,OAAO,CAAC0H,QAAR,CAAiB9W,UAAQ,CAACyU,cAA1B,EAA0CsC,QAA1C,CAAmD,MAAnD;;EACA,WAAK1B,kBAAL,CAAwBxH,GAAxB,CAA4BuB,OAAO,CAAC0H,QAAR,CAAiB9W,UAAQ,CAACyU,cAA1B,CAA5B,EAAuEsC,QAAvE,CAAgF,MAAhF;;EACA3b,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBqW,MAAjB,CAAwB,MAAxB;EACAH,MAAAA,QAAQ,CAACtZ,GAAT,CAAa,WAAb,EAA0B,gBAA1B;EACD,KALD,MAKO;EACL6R,MAAAA,OAAO,CAAC9N,OAAR,CAAgBtB,UAAQ,CAACyU,cAAzB,EAAyCsC,QAAzC,CAAkD,MAAlD;;EACA,WAAK1B,kBAAL,CAAwBxH,GAAxB,CAA4BuB,OAAO,CAAC9N,OAAR,CAAgBtB,UAAQ,CAACyU,cAAzB,CAA5B,EAAsEsC,QAAtE,CAA+E,MAA/E,EAFK;;;EAKL3H,MAAAA,OAAO,CAACsH,OAAR,CAAgB1W,UAAQ,CAAC2U,QAAzB,EAAmCjH,IAAnC,GALK;;EAQL0B,MAAAA,OAAO,CAACsH,OAAR,CAAgB1W,UAAQ,CAAC4U,QAAzB,EAAmClC,IAAnC,CAAwC,aAAxC,EAAuD7E,GAAvD,CAA2DuB,OAA3D,EAAoElB,IAApE,CAAyE;EACvE+I,QAAAA,QAAQ,EAAE,CAAC,CAD4D;EAEvE,uBAAe,IAFwD;EAGvE,yBAAiB;EAHsD,OAAzE,EARK;;EAeLJ,MAAAA,QAAQ,CAACtZ,GAAT,CAAa,WAAb,kBAAwCqZ,mBAAxC;;EACA,UAAIA,mBAAJ,EAAyB;EACvB;EACAxb,QAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBqW,MAAjB,CAAwBb,QAAQ,CAACa,MAAT,EAAxB;EACD,OAHD,MAGO;EACL5b,QAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBqW,MAAjB,CAAwB,MAAxB;EACD;EACF,KA1CmB;;;EA6CpB/a,IAAAA,UAAU,CAAC,YAAO;EAChB,UAAI,CAAC,MAAI,CAAC2K,OAAL,CAAa2O,OAAlB,EAA2B;EACzB;EACAnG,QAAAA,OAAO,CAACrR,OAAR,CAAgB,OAAhB;EACD;;EAED8Y,MAAAA,QAAQ,CAACrV,WAAT,CAAqBlB,WAAS,CAACgU,aAA/B;EACD,KAPS,EAOPH,OAPO,CAAV;EAQD;;WAED0B,iBAAA,wBAAe1a,KAAf,EAAsB;EACpB,QAAM+b,WAAW,GAAG9b,CAAC,CAACD,KAAK,CAACE,MAAP,CAArB,CADoB;;EAIpB,QAAI,kBAAkB2D,IAAlB,CAAuB7D,KAAK,CAACE,MAAN,CAAakO,OAApC,CAAJ,EAAkD;EAChD;EACD,KANmB;;;EASpB,YAAQpO,KAAK,CAACqO,KAAd;EACE,WAAK9F,oBAAL;EACE,aAAKkS,WAAL,CAAiBza,KAAjB;;EACA;;EACF,WAAKwI,qBAAL;EACE,aAAKgS,UAAL,CAAgBxa,KAAhB;;EACA;;EACF,WAAKqU,kBAAL;EACE;EACA0H,QAAAA,WAAW,CAAC7V,MAAZ,GAAqBsG,IAArB,GAA4B+K,IAA5B,CAAiC,YAAjC,EAA+C7E,GAA/C,CAAmD7N,UAAQ,CAAC+U,aAA5D,EAA2EhX,OAA3E,CAAmF,OAAnF;EACA;;EACF,WAAK0R,oBAAL;EACE;EACAyH,QAAAA,WAAW,CAAC7V,MAAZ,GAAqBkG,IAArB,GAA4BmL,IAA5B,CAAiC,YAAjC,EAA+C3U,OAA/C,CAAuD,OAAvD;EACA;;EACF;EAfF;EAiBD;;WAED+X,iBAAA,0BAAiB;EACf1a,IAAAA,CAAC,CAAC,IAAD,CAAD,CAAQsX,IAAR,CAAa1S,UAAQ,CAAC6U,QAAtB,EAAgChH,GAAhC,CAAoC7N,UAAQ,CAAC+U,aAA7C,EAA4DpC,KAA5D,GAAoE5U,OAApE,CAA4E,OAA5E;EACD;;WAEDgY,wBAAA,+BAAsBzM,CAAtB,EAAyB;EACvB,QAAM0F,KAAK,GAAG5T,CAAC,CAACkO,CAAC,CAACjO,MAAH,CAAf;EACA,QAAM8b,aAAa,GAAG/b,CAAC,CAAC4T,KAAK,CAACd,IAAN,CAAW,MAAX,CAAD,CAAvB;;EAEA,SAAKmH,kBAAL,CAAwBxH,GAAxB,CAA4BsJ,aAA5B,EAA2CJ,QAA3C,CAAoD,MAApD;EACD;;WAEDpB,aAAA,oBAAWrM,CAAX,EAAc;EACZA,IAAAA,CAAC,CAACnH,cAAF;EACA,QAAM6M,KAAK,GAAG5T,CAAC,CAACkO,CAAC,CAACjO,MAAH,CAAf;EACA,QAAM8a,QAAQ,GAAGnH,KAAK,CAAC1N,OAAN,CAActB,UAAQ,CAAC2U,QAAvB,CAAjB;EACA,QAAMyC,UAAU,GAAIpI,KAAK,CAACzH,IAAN,CAAWvH,UAAQ,CAAC2U,QAApB,CAApB;EACA,QAAMkC,QAAQ,GAAGzb,CAAC,CAAC4E,UAAQ,CAACwU,QAAV,CAAlB;EACA,QAAM0B,eAAe,GAAGlH,KAAxB;EACA,QAAMqI,mBAAmB,GAAG/L,QAAQ,CAACuL,QAAQ,CAACtZ,GAAT,CAAa,WAAb,EAA0BK,KAA1B,CAAgC,GAAhC,EAAqCyW,WAArC,CAAD,EAAoD,EAApD,CAApC;EACA,QAAMiD,QAAQ,GAAGT,QAAQ,CAACU,KAAT,EAAjB;EACA,QAAMC,0BAA0B,GAAGpD,UAAU,GAAGiD,mBAAb,GAAmCC,QAAtE;;EAEA,QAAI,CAACtI,KAAK,CAACzH,IAAN,CAAWvH,UAAQ,CAAC2U,QAApB,EAA8BtM,MAA/B,IAAyCwO,QAAQ,CAACpV,QAAT,CAAkBnB,WAAS,CAACgU,aAA5B,CAA7C,EAAyF;EACvF,aAAO,KAAP;EACD;;EAEDuC,IAAAA,QAAQ,CAAChM,QAAT,CAAkBvK,WAAS,CAACgU,aAA5B,EAfY;;EAkBZ6B,IAAAA,QAAQ,CAACzD,IAAT,CAAc1S,UAAQ,CAAC2U,QAAvB,EAAiClH,IAAjC,GAlBY;;EAqBZ2J,IAAAA,UAAU,CAAC1J,IAAX,GArBY;;EAwBZtS,IAAAA,CAAC,CAAC4E,UAAQ,CAACuU,QAAV,CAAD,CAAqByC,MAArB,CAA4BI,UAAU,CAACJ,MAAX,EAA5B,EAxBY;;EA2BZ,QAAI,CAACQ,0BAAL,EAAiC;EAC/BX,MAAAA,QAAQ,CAACnE,IAAT,CAAc,sBAAd,EAAsCxE,IAAtC,CAA2C;EACzC+I,QAAAA,QAAQ,EAAE,CAAC,CAD8B;EAEzC,uBAAe;EAF0B,OAA3C;EAID;;EACDd,IAAAA,QAAQ,CAACzD,IAAT,CAAc1S,UAAQ,CAAC6U,QAAvB,EAAiC3G,IAAjC,CAAsC;EACpC+I,MAAAA,QAAQ,EAAE,CAAC,CADyB;EAEpC,qBAAe;EAFqB,KAAtC;EAIAG,IAAAA,UAAU,CAAC1E,IAAX,CAAgB1S,UAAQ,CAAC6U,QAAzB,EAAmC3G,IAAnC,CAAwC;EACtC+I,MAAAA,QAAQ,EAAE,CAD4B;EAEtC,qBAAe;EAFuB,KAAxC,EArCY;;EA2CZJ,IAAAA,QAAQ,CAACtZ,GAAT,CAAa,WAAb,mBAAwCia,0BAA0B,GAAGpD,UAArE,UA3CY;;EA8CZyC,IAAAA,QAAQ,CAAC9a,GAAT,CAAa,eAAb,EAA8B,YAAM;EAClCma,MAAAA,eAAe,CAAChI,IAAhB,CAAqB,eAArB,EAAsC,IAAtC;EACAkJ,MAAAA,UAAU,CAAC1E,IAAX,CAAgB1S,UAAQ,CAAC6U,QAAzB,EAAmChH,GAAnC,CAAuC7N,UAAQ,CAAC+U,aAAhD,EAA+DpC,KAA/D,GAAuE5U,OAAvE,CAA+E,OAA/E;EACA8Y,MAAAA,QAAQ,CAACrV,WAAT,CAAqBlB,WAAS,CAACgU,aAA/B;EACD,KAJD;EAKA,WAAO,IAAP;EACD;;WAEDsB,cAAA,qBAAYtM,CAAZ,EAAe;EACbA,IAAAA,CAAC,CAACnH,cAAF;EAEA,QAAM6M,KAAK,GAAG5T,CAAC,CAACkO,CAAC,CAACjO,MAAH,CAAf;EACA,QAAM8a,QAAQ,GAAGnH,KAAK,CAAC1N,OAAN,CAActB,UAAQ,CAAC2U,QAAvB,CAAjB;EACA,QAAMyC,UAAU,GAAGjB,QAAQ,CAAC9U,MAAT,GAAkBC,OAAlB,CAA0BtB,UAAQ,CAAC2U,QAAnC,CAAnB;EACA,QAAMkC,QAAQ,GAAGzb,CAAC,CAAC4E,UAAQ,CAACwU,QAAV,CAAlB;EACA,QAAMiD,iBAAiB,GAAGL,UAAU,CAAC1E,IAAX,CAAgB1S,UAAQ,CAACgV,iBAAzB,CAA1B;EACA,QAAMqC,mBAAmB,GAAG/L,QAAQ,CAACuL,QAAQ,CAACtZ,GAAT,CAAa,WAAb,EAA0BK,KAA1B,CAAgC,GAAhC,EAAqCyW,WAArC,CAAD,EAAoD,EAApD,CAApC;EACA,QAAMiD,QAAQ,GAAGT,QAAQ,CAACU,KAAT,EAAjB;EACA,QAAMC,0BAA0B,GAAGpD,UAAU,GAAGiD,mBAAb,GAAmCC,QAAtE;;EAEA,QAAI,CAACE,0BAAD,IAA+BX,QAAQ,CAACpV,QAAT,CAAkBnB,WAAS,CAACgU,aAA5B,CAAnC,EAA+E;EAC7E,aAAO,KAAP;EACD;;EAEDuC,IAAAA,QAAQ,CAAChM,QAAT,CAAkBvK,WAAS,CAACgU,aAA5B,EAhBa;;EAmBb8C,IAAAA,UAAU,CAAC1E,IAAX,CAAgB1S,UAAQ,CAAC6U,QAAzB,EAAmC3G,IAAnC,CAAwC;EACtC+I,MAAAA,QAAQ,EAAE,CAD4B;EAEtC,qBAAe;EAFuB,KAAxC;;EAIA,QAAIO,0BAA0B,KAAK,CAACpD,UAApC,EAAgD;EAC9C;EACAhZ,MAAAA,CAAC,CAAC4E,UAAQ,CAACuU,QAAV,CAAD,CAAqBhX,GAArB,CAAyB,QAAzB,EAAmC,MAAnC;EACAsZ,MAAAA,QAAQ,CAACnE,IAAT,CAAc,sBAAd,EAAsCxE,IAAtC,CAA2C;EACzC+I,QAAAA,QAAQ,EAAE,CAD+B;EAEzC,uBAAe;EAF0B,OAA3C;EAID,KA9BY;;;EAiCbJ,IAAAA,QAAQ,CAACtZ,GAAT,CAAa,WAAb,mBAAwCia,0BAA0B,GAAGpD,UAArE,UAjCa;;EAoCbyC,IAAAA,QAAQ,CAAC9a,GAAT,CAAa,eAAb,EAA8B,YAAM;EAClC0b,MAAAA,iBAAiB,CAACvJ,IAAlB,CAAuB,eAAvB,EAAwC,KAAxC;EACAuJ,MAAAA,iBAAiB,CAAC1Z,OAAlB,CAA0B,OAA1B;EACAoY,MAAAA,QAAQ,CAAC1I,IAAT;EACAoJ,MAAAA,QAAQ,CAACrV,WAAT,CAAqBlB,WAAS,CAACgU,aAA/B;EACD,KALD;EAMA,WAAO,IAAP;EACD;;;aAIMzS,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAI,CAAC1G,CAAC,CAAC,IAAD,CAAD,CAAQE,EAAR,CAAW0E,UAAQ,CAACuU,QAApB,CAAL,EAAoC;EAClC,cAAM,IAAI9I,SAAJ,CAAc,4BAAd,CAAN;EACD;;EAED,UAAI,CAACnN,MAAL,EAAa;EACXA,QAAAA,MAAM,GAAG,EAAT;EACD,OAFD,MAEO,IAAIA,MAAM,CAACiX,OAAP,IAAkB,OAAOjX,MAAM,CAACiX,OAAd,KAA0B,SAAhD,EAA2D;EAChE;EACA,cAAM,IAAI9J,SAAJ,CAAc,oCAAd,CAAN;EACD;;EAED,UAAIzJ,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EAEA,UAAI,CAACoC,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIiT,QAAJ,CAAa,IAAb,EAAmB3W,MAAnB,CAAP;EACAlD,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI1D,MAAM,CAACjD,MAAX,EAAmB;EACjB,YAAI,OAAOiD,MAAM,CAACjD,MAAd,KAAyB,QAAzB,IAAqC,CAAC,UAAU2D,IAAV,CAAeV,MAAM,CAACjD,MAAtB,CAA1C,EAAyE;EACvE,gBAAM,IAAIoQ,SAAJ,iBAA2BnN,MAAM,CAACjD,MAAlC,yBAAN;EACD;;EAED2G,QAAAA,IAAI,CAACyT,IAAL,CAAUnX,MAAM,CAACjD,MAAjB;EACD;EACF,KA1BM,CAAP;EA2BD;;;;0BA3RoB;EACnB,aAAOsE,SAAP;EACD;;;;;EA4RH;;;;;;;EAMAvE,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAyBuV,QAAQ,CAACpT,gBAAlC;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB4S,QAAzB;;EACA7Z,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAyB,YAAM;EAC7BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOkV,QAAQ,CAACpT,gBAAhB;EACD,CAHD;;ECrWA;;;;;;EAMA,IAAMnC,MAAI,GAAiB,OAA3B;EACA,IAAMC,SAAO,GAAc,OAA3B;EACA,IAAMC,UAAQ,GAAa,UAA3B;EACA,IAAMC,WAAS,SAAgBD,UAA/B;EACA,IAAME,cAAY,GAAS,WAA3B;EACA,IAAMC,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EACA,IAAM2P,gBAAc,GAAO,EAA3B;;EAEA,IAAMvL,SAAO,GAAG;EACd4T,EAAAA,QAAQ,EAAG,IADG;EAEd1T,EAAAA,QAAQ,EAAG,IAFG;EAGdyO,EAAAA,KAAK,EAAM,IAHG;EAId/E,EAAAA,IAAI,EAAO;EAJG,CAAhB;EAOA,IAAMrJ,aAAW,GAAG;EAClBqT,EAAAA,QAAQ,EAAG,kBADO;EAElB1T,EAAAA,QAAQ,EAAG,SAFO;EAGlByO,EAAAA,KAAK,EAAM,SAHO;EAIlB/E,EAAAA,IAAI,EAAO;EAJO,CAApB;EAOA,IAAMxN,OAAK,GAAG;EACZgM,EAAAA,IAAI,WAAuBrM,WADf;EAEZsM,EAAAA,MAAM,aAAuBtM,WAFjB;EAGZY,EAAAA,IAAI,WAAuBZ,WAHf;EAIZoM,EAAAA,KAAK,YAAuBpM,WAJhB;EAKZ8X,EAAAA,OAAO,cAAuB9X,WALlB;EAMZ+X,EAAAA,MAAM,aAAuB/X,WANjB;EAOZgY,EAAAA,aAAa,oBAAuBhY,WAPxB;EAQZiY,EAAAA,eAAe,sBAAuBjY,WAR1B;EASZkY,EAAAA,eAAe,sBAAuBlY,WAT1B;EAUZmY,EAAAA,iBAAiB,wBAAuBnY,WAV5B;EAWZQ,EAAAA,cAAc,YAAcR,WAAd,GAA0BC;EAX5B,CAAd;EAcA,IAAMQ,WAAS,GAAG;EAChB2X,EAAAA,UAAU,EAAW,yBADL;EAEhBC,EAAAA,kBAAkB,EAAG,yBAFL;EAGhBC,EAAAA,QAAQ,EAAa,gBAHL;EAIhBC,EAAAA,IAAI,EAAiB,YAJL;EAKhB5X,EAAAA,IAAI,EAAiB,MALL;EAMhBC,EAAAA,IAAI,EAAiB;EANL,CAAlB;EASA,IAAMT,UAAQ,GAAG;EACfqY,EAAAA,MAAM,EAAW,eADF;EAEfC,EAAAA,UAAU,EAAO,aAFF;EAGf3V,EAAAA,WAAW,EAAM,uBAHF;EAIf4V,EAAAA,YAAY,EAAK,wBAJF;EAKfC,EAAAA,aAAa,EAAI;EAGnB;;;;;;EARiB,CAAjB;;MAcMC;;;EACJ,iBAAY3b,OAAZ,EAAqBwB,MAArB,EAA6B;EAC3B,SAAKsI,OAAL,GAA4B,KAAKC,UAAL,CAAgBvI,MAAhB,CAA5B;EACA,SAAKqC,QAAL,GAA4B7D,OAA5B;EACA,SAAK4b,OAAL,GAA4B5b,OAAO,CAACK,aAAR,CAAsB6C,UAAQ,CAACqY,MAA/B,CAA5B;EACA,SAAKM,SAAL,GAA4B,IAA5B;EACA,SAAKC,QAAL,GAA4B,KAA5B;EACA,SAAKC,kBAAL,GAA4B,KAA5B;EACA,SAAKC,oBAAL,GAA4B,KAA5B;EACA,SAAKlM,gBAAL,GAA4B,KAA5B;EACA,SAAKmM,eAAL,GAA4B,CAA5B,CAT2B;;EAY3B,SAAKC,QAAL,GAZ2B;;EAc5B;;;;;EAYD;WAEAjW,SAAA,gBAAOoH,aAAP,EAAsB;EACpB,WAAO,KAAKyO,QAAL,GAAgB,KAAKnL,IAAL,EAAhB,GAA8B,KAAKC,IAAL,CAAUvD,aAAV,CAArC;EACD;;WAEDuD,OAAA,cAAKvD,aAAL,EAAoB;EAAA;;EAClB,QAAI,KAAKyO,QAAL,IAAiB,KAAKhM,gBAA1B,EAA4C;EAC1C;EACD;;EAED,QAAIxR,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACE,IAApC,CAAJ,EAA+C;EAC7C,WAAKoM,gBAAL,GAAwB,IAAxB;EACD;;EAED,QAAMuF,SAAS,GAAG/W,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACO,IAAd,EAAoB;EACpC0J,MAAAA,aAAa,EAAbA;EADoC,KAApB,CAAlB;EAIA/O,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBoU,SAAzB;;EAEA,QAAI,KAAKyG,QAAL,IAAiBzG,SAAS,CAAClR,kBAAV,EAArB,EAAqD;EACnD;EACD;;EAED,SAAK2X,QAAL,GAAgB,IAAhB;;EAEA,SAAKK,eAAL;;EACA,SAAKC,aAAL;;EAEA,SAAKC,eAAL;;EAEA/d,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiByB,EAAjB,CACElC,OAAK,CAAC2X,aADR,EAEE7X,UAAQ,CAACuY,YAFX,EAGE,UAACpd,KAAD;EAAA,aAAW,KAAI,CAACsS,IAAL,CAAUtS,KAAV,CAAX;EAAA,KAHF;EAMAC,IAAAA,CAAC,CAAC,KAAKsd,OAAN,CAAD,CAAgBtW,EAAhB,CAAmBlC,OAAK,CAAC8X,iBAAzB,EAA4C,YAAM;EAChD5c,MAAAA,CAAC,CAAC,KAAI,CAACuF,QAAN,CAAD,CAAiB5E,GAAjB,CAAqBmE,OAAK,CAAC6X,eAA3B,EAA4C,UAAC5c,KAAD,EAAW;EACrD,YAAIC,CAAC,CAACD,KAAK,CAACE,MAAP,CAAD,CAAgBC,EAAhB,CAAmB,KAAI,CAACqF,QAAxB,CAAJ,EAAuC;EACrC,UAAA,KAAI,CAACmY,oBAAL,GAA4B,IAA5B;EACD;EACF,OAJD;EAKD,KAND;;EAQA,SAAKM,aAAL,CAAmB;EAAA,aAAM,KAAI,CAACC,YAAL,CAAkBlP,aAAlB,CAAN;EAAA,KAAnB;EACD;;WAEDsD,OAAA,cAAKtS,KAAL,EAAY;EAAA;;EACV,QAAIA,KAAJ,EAAW;EACTA,MAAAA,KAAK,CAACgH,cAAN;EACD;;EAED,QAAI,CAAC,KAAKyW,QAAN,IAAkB,KAAKhM,gBAA3B,EAA6C;EAC3C;EACD;;EAED,QAAMgG,SAAS,GAAGxX,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACgM,IAAd,CAAlB;EAEA9Q,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyB6U,SAAzB;;EAEA,QAAI,CAAC,KAAKgG,QAAN,IAAkBhG,SAAS,CAAC3R,kBAAV,EAAtB,EAAsD;EACpD;EACD;;EAED,SAAK2X,QAAL,GAAgB,KAAhB;EACA,QAAMU,UAAU,GAAGle,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACE,IAApC,CAAnB;;EAEA,QAAI8Y,UAAJ,EAAgB;EACd,WAAK1M,gBAAL,GAAwB,IAAxB;EACD;;EAED,SAAKuM,eAAL;;EAEA/d,IAAAA,CAAC,CAACuB,QAAD,CAAD,CAAY4L,GAAZ,CAAgBrI,OAAK,CAACyX,OAAtB;EAEAvc,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBa,WAAjB,CAA6BlB,WAAS,CAACG,IAAvC;EAEArF,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB4H,GAAjB,CAAqBrI,OAAK,CAAC2X,aAA3B;EACAzc,IAAAA,CAAC,CAAC,KAAKsd,OAAN,CAAD,CAAgBnQ,GAAhB,CAAoBrI,OAAK,CAAC8X,iBAA1B;;EAGA,QAAIsB,UAAJ,EAAgB;EACd,UAAMhc,kBAAkB,GAAItB,IAAI,CAACqB,gCAAL,CAAsC,KAAKsD,QAA3C,CAA5B;EAEAvF,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CACG5E,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B,UAACa,KAAD;EAAA,eAAW,MAAI,CAACoe,UAAL,CAAgBpe,KAAhB,CAAX;EAAA,OAD5B,EAEGkB,oBAFH,CAEwBiB,kBAFxB;EAGD,KAND,MAMO;EACL,WAAKic,UAAL;EACD;EACF;;WAEDpY,UAAA,mBAAU;EACR,KAACgG,MAAD,EAAS,KAAKxG,QAAd,EAAwB,KAAK+X,OAA7B,EACGc,OADH,CACW,UAACC,WAAD;EAAA,aAAiBre,CAAC,CAACqe,WAAD,CAAD,CAAelR,GAAf,CAAmB1I,WAAnB,CAAjB;EAAA,KADX;EAGA;;;;;;EAKAzE,IAAAA,CAAC,CAACuB,QAAD,CAAD,CAAY4L,GAAZ,CAAgBrI,OAAK,CAACyX,OAAtB;EAEAvc,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKT,QAAlB,EAA4Bf,UAA5B;EAEA,SAAKgH,OAAL,GAA4B,IAA5B;EACA,SAAKjG,QAAL,GAA4B,IAA5B;EACA,SAAK+X,OAAL,GAA4B,IAA5B;EACA,SAAKC,SAAL,GAA4B,IAA5B;EACA,SAAKC,QAAL,GAA4B,IAA5B;EACA,SAAKC,kBAAL,GAA4B,IAA5B;EACA,SAAKC,oBAAL,GAA4B,IAA5B;EACA,SAAKlM,gBAAL,GAA4B,IAA5B;EACA,SAAKmM,eAAL,GAA4B,IAA5B;EACD;;;WAIDlS,aAAA,oBAAWvI,MAAX,EAAmB;EACjBA,IAAAA,MAAM,qBACDwF,SADC,EAEDxF,MAFC,CAAN;EAIAtC,IAAAA,IAAI,CAACoC,eAAL,CAAqBsB,MAArB,EAA2BpB,MAA3B,EAAmC+F,aAAnC;EACA,WAAO/F,MAAP;EACD;;WAED+a,eAAA,sBAAalP,aAAb,EAA4B;EAAA;;EAC1B,QAAMmP,UAAU,GAAGle,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACE,IAApC,CAAnB;;EAEA,QAAI,CAAC,KAAKG,QAAL,CAAclB,UAAf,IACA,KAAKkB,QAAL,CAAclB,UAAd,CAAyBtB,QAAzB,KAAsCub,IAAI,CAACC,YAD/C,EAC6D;EAC3D;EACAhd,MAAAA,QAAQ,CAAC4V,IAAT,CAAcqH,WAAd,CAA0B,KAAKjZ,QAA/B;EACD;;EAED,SAAKA,QAAL,CAAcsN,KAAd,CAAoBsD,OAApB,GAA8B,OAA9B;;EACA,SAAK5Q,QAAL,CAAckZ,eAAd,CAA8B,aAA9B;;EACA,SAAKlZ,QAAL,CAAc0C,YAAd,CAA2B,YAA3B,EAAyC,IAAzC;;EAEA,QAAIjI,CAAC,CAAC,KAAKsd,OAAN,CAAD,CAAgBjX,QAAhB,CAAyBnB,WAAS,CAAC2X,UAAnC,CAAJ,EAAoD;EAClD,WAAKS,OAAL,CAAavb,aAAb,CAA2B6C,UAAQ,CAACsY,UAApC,EAAgDwB,SAAhD,GAA4D,CAA5D;EACD,KAFD,MAEO;EACL,WAAKnZ,QAAL,CAAcmZ,SAAd,GAA0B,CAA1B;EACD;;EAED,QAAIR,UAAJ,EAAgB;EACdtd,MAAAA,IAAI,CAAC6B,MAAL,CAAY,KAAK8C,QAAjB;EACD;;EAEDvF,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBkK,QAAjB,CAA0BvK,WAAS,CAACG,IAApC;;EAEA,QAAI,KAAKmG,OAAL,CAAa6L,KAAjB,EAAwB;EACtB,WAAKsH,aAAL;EACD;;EAED,QAAMC,UAAU,GAAG5e,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAAC+L,KAAd,EAAqB;EACtC9B,MAAAA,aAAa,EAAbA;EADsC,KAArB,CAAnB;;EAIA,QAAM8P,kBAAkB,GAAG,SAArBA,kBAAqB,GAAM;EAC/B,UAAI,MAAI,CAACrT,OAAL,CAAa6L,KAAjB,EAAwB;EACtB,QAAA,MAAI,CAAC9R,QAAL,CAAc8R,KAAd;EACD;;EACD,MAAA,MAAI,CAAC7F,gBAAL,GAAwB,KAAxB;EACAxR,MAAAA,CAAC,CAAC,MAAI,CAACuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBic,UAAzB;EACD,KAND;;EAQA,QAAIV,UAAJ,EAAgB;EACd,UAAMhc,kBAAkB,GAAItB,IAAI,CAACqB,gCAAL,CAAsC,KAAKqb,OAA3C,CAA5B;EAEAtd,MAAAA,CAAC,CAAC,KAAKsd,OAAN,CAAD,CACG3c,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B2f,kBAD5B,EAEG5d,oBAFH,CAEwBiB,kBAFxB;EAGD,KAND,MAMO;EACL2c,MAAAA,kBAAkB;EACnB;EACF;;WAEDF,gBAAA,yBAAgB;EAAA;;EACd3e,IAAAA,CAAC,CAACuB,QAAD,CAAD,CACG4L,GADH,CACOrI,OAAK,CAACyX,OADb;EAAA,KAEGvV,EAFH,CAEMlC,OAAK,CAACyX,OAFZ,EAEqB,UAACxc,KAAD,EAAW;EAC5B,UAAIwB,QAAQ,KAAKxB,KAAK,CAACE,MAAnB,IACA,MAAI,CAACsF,QAAL,KAAkBxF,KAAK,CAACE,MADxB,IAEAD,CAAC,CAAC,MAAI,CAACuF,QAAN,CAAD,CAAiBuZ,GAAjB,CAAqB/e,KAAK,CAACE,MAA3B,EAAmCgN,MAAnC,KAA8C,CAFlD,EAEqD;EACnD,QAAA,MAAI,CAAC1H,QAAL,CAAc8R,KAAd;EACD;EACF,KARH;EASD;;WAED0G,kBAAA,2BAAkB;EAAA;;EAChB,QAAI,KAAKP,QAAL,IAAiB,KAAKhS,OAAL,CAAa5C,QAAlC,EAA4C;EAC1C5I,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiByB,EAAjB,CAAoBlC,OAAK,CAAC4X,eAA1B,EAA2C,UAAC3c,KAAD,EAAW;EACpD,YAAIA,KAAK,CAACqO,KAAN,KAAgB6F,gBAApB,EAAoC;EAClClU,UAAAA,KAAK,CAACgH,cAAN;;EACA,UAAA,MAAI,CAACsL,IAAL;EACD;EACF,OALD;EAMD,KAPD,MAOO,IAAI,CAAC,KAAKmL,QAAV,EAAoB;EACzBxd,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB4H,GAAjB,CAAqBrI,OAAK,CAAC4X,eAA3B;EACD;EACF;;WAEDyB,aAAA,sBAAa;EAAA;;EACX,SAAK5Y,QAAL,CAAcsN,KAAd,CAAoBsD,OAApB,GAA8B,MAA9B;;EACA,SAAK5Q,QAAL,CAAc0C,YAAd,CAA2B,aAA3B,EAA0C,IAA1C;;EACA,SAAK1C,QAAL,CAAckZ,eAAd,CAA8B,YAA9B;;EACA,SAAKjN,gBAAL,GAAwB,KAAxB;;EACA,SAAKwM,aAAL,CAAmB,YAAM;EACvBhe,MAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiB/Q,WAAjB,CAA6BlB,WAAS,CAAC8X,IAAvC;;EACA,MAAA,MAAI,CAAC+B,eAAL;;EACA/e,MAAAA,CAAC,CAAC,MAAI,CAACuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBmC,OAAK,CAACiM,MAA/B;EACD,KAJD;EAKD;;WAEDiO,kBAAA,2BAAkB;EAChB,QAAI,KAAKzB,SAAT,EAAoB;EAClBvd,MAAAA,CAAC,CAAC,KAAKud,SAAN,CAAD,CAAkB/W,MAAlB;EACA,WAAK+W,SAAL,GAAiB,IAAjB;EACD;EACF;;WAEDS,gBAAA,uBAAciB,QAAd,EAAwB;EAAA;;EACtB,QAAMC,OAAO,GAAGlf,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACE,IAApC,IACZF,WAAS,CAACE,IADE,GACK,EADrB;;EAGA,QAAI,KAAKoY,QAAL,IAAiB,KAAKhS,OAAL,CAAa8Q,QAAlC,EAA4C;EAC1C,WAAKiB,SAAL,GAAiBhc,QAAQ,CAAC4d,aAAT,CAAuB,KAAvB,CAAjB;EACA,WAAK5B,SAAL,CAAe6B,SAAf,GAA2Bla,WAAS,CAAC6X,QAArC;;EAEA,UAAImC,OAAJ,EAAa;EACX,aAAK3B,SAAL,CAAezV,SAAf,CAAyBE,GAAzB,CAA6BkX,OAA7B;EACD;;EAEDlf,MAAAA,CAAC,CAAC,KAAKud,SAAN,CAAD,CAAkB8B,QAAlB,CAA2B9d,QAAQ,CAAC4V,IAApC;EAEAnX,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiByB,EAAjB,CAAoBlC,OAAK,CAAC2X,aAA1B,EAAyC,UAAC1c,KAAD,EAAW;EAClD,YAAI,MAAI,CAAC2d,oBAAT,EAA+B;EAC7B,UAAA,MAAI,CAACA,oBAAL,GAA4B,KAA5B;EACA;EACD;;EACD,YAAI3d,KAAK,CAACE,MAAN,KAAiBF,KAAK,CAAC8T,aAA3B,EAA0C;EACxC;EACD;;EACD,YAAI,MAAI,CAACrI,OAAL,CAAa8Q,QAAb,KAA0B,QAA9B,EAAwC;EACtC,UAAA,MAAI,CAAC/W,QAAL,CAAc8R,KAAd;EACD,SAFD,MAEO;EACL,UAAA,MAAI,CAAChF,IAAL;EACD;EACF,OAbD;;EAeA,UAAI6M,OAAJ,EAAa;EACXte,QAAAA,IAAI,CAAC6B,MAAL,CAAY,KAAK8a,SAAjB;EACD;;EAEDvd,MAAAA,CAAC,CAAC,KAAKud,SAAN,CAAD,CAAkB9N,QAAlB,CAA2BvK,WAAS,CAACG,IAArC;;EAEA,UAAI,CAAC4Z,QAAL,EAAe;EACb;EACD;;EAED,UAAI,CAACC,OAAL,EAAc;EACZD,QAAAA,QAAQ;EACR;EACD;;EAED,UAAMK,0BAA0B,GAAG1e,IAAI,CAACqB,gCAAL,CAAsC,KAAKsb,SAA3C,CAAnC;EAEAvd,MAAAA,CAAC,CAAC,KAAKud,SAAN,CAAD,CACG5c,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B+f,QAD5B,EAEGhe,oBAFH,CAEwBqe,0BAFxB;EAGD,KA7CD,MA6CO,IAAI,CAAC,KAAK9B,QAAN,IAAkB,KAAKD,SAA3B,EAAsC;EAC3Cvd,MAAAA,CAAC,CAAC,KAAKud,SAAN,CAAD,CAAkBnX,WAAlB,CAA8BlB,WAAS,CAACG,IAAxC;;EAEA,UAAMka,cAAc,GAAG,SAAjBA,cAAiB,GAAM;EAC3B,QAAA,MAAI,CAACP,eAAL;;EACA,YAAIC,QAAJ,EAAc;EACZA,UAAAA,QAAQ;EACT;EACF,OALD;;EAOA,UAAIjf,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACE,IAApC,CAAJ,EAA+C;EAC7C,YAAMka,2BAA0B,GAAG1e,IAAI,CAACqB,gCAAL,CAAsC,KAAKsb,SAA3C,CAAnC;;EAEAvd,QAAAA,CAAC,CAAC,KAAKud,SAAN,CAAD,CACG5c,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4BqgB,cAD5B,EAEGte,oBAFH,CAEwBqe,2BAFxB;EAGD,OAND,MAMO;EACLC,QAAAA,cAAc;EACf;EACF,KAnBM,MAmBA,IAAIN,QAAJ,EAAc;EACnBA,MAAAA,QAAQ;EACT;EACF;EAGD;EACA;EACA;;;WAEApB,kBAAA,2BAAkB;EAChB,QAAM2B,IAAI,GAAGje,QAAQ,CAAC4V,IAAT,CAAchE,qBAAd,EAAb;EACA,SAAKsK,kBAAL,GAA0B+B,IAAI,CAACC,IAAL,GAAYD,IAAI,CAACE,KAAjB,GAAyB3T,MAAM,CAAC4T,UAA1D;EACA,SAAKhC,eAAL,GAAuB,KAAKiC,kBAAL,EAAvB;EACD;;WAED9B,gBAAA,yBAAgB;EAAA;;EACd,QAAI,KAAKL,kBAAT,EAA6B;EAC3B;EACA;EACA,UAAMoC,YAAY,GAAG,GAAGxR,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0BrJ,UAAQ,CAACwY,aAAnC,CAAd,CAArB,CAH2B;;EAM3Bpd,MAAAA,CAAC,CAAC6f,YAAD,CAAD,CAAgBnZ,IAAhB,CAAqB,UAACoG,KAAD,EAAQpL,OAAR,EAAoB;EACvC,YAAMoe,WAAW,GAAGpe,OAAO,CAACmR,KAAR,CAAc6M,KAAlC;EACA,YAAMK,eAAe,GAAG/f,CAAC,CAAC0B,OAAD,CAAD,CAAWS,GAAX,CAAe,OAAf,CAAxB;EACAnC,QAAAA,CAAC,CAAC0B,OAAD,CAAD,CACGkF,IADH,CACQ,OADR,EACiBkZ,WADjB,EAEG3d,GAFH,CAEO,OAFP,EAEmBG,UAAU,CAACyd,eAAD,CAAV,GAA8B,MAAI,CAACpC,eAFtD;EAGD,OAND,EAN2B;;EAe3B,UAAMqC,aAAa,GAAGze,QAAQ,CAAC4V,IAAT,CAActE,KAAd,CAAoBoN,YAA1C;EACA,UAAMC,iBAAiB,GAAGlgB,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiBhV,GAAjB,CAAqB,eAArB,CAA1B;EACAnC,MAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CACGvQ,IADH,CACQ,eADR,EACyBoZ,aADzB,EAEG7d,GAFH,CAEO,eAFP,EAE2BG,UAAU,CAAC4d,iBAAD,CAAV,GAAgC,KAAKvC,eAFhE;EAGD;;EAED3d,IAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiB1H,QAAjB,CAA0BvK,WAAS,CAAC8X,IAApC;EACD;;WAED+B,kBAAA,2BAAkB;EAChB;EACA,QAAMc,YAAY,GAAG,GAAGxR,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0BrJ,UAAQ,CAACwY,aAAnC,CAAd,CAArB;EACApd,IAAAA,CAAC,CAAC6f,YAAD,CAAD,CAAgBnZ,IAAhB,CAAqB,UAACoG,KAAD,EAAQpL,OAAR,EAAoB;EACvC,UAAMge,KAAK,GAAG1f,CAAC,CAAC0B,OAAD,CAAD,CAAWkF,IAAX,CAAgB,OAAhB,CAAd;EACA5G,MAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAWsE,UAAX,CAAsB,OAAtB;EACAtE,MAAAA,OAAO,CAACmR,KAAR,CAAc6M,KAAd,GAAsBA,KAAK,GAAGA,KAAH,GAAW,EAAtC;EACD,KAJD,EAHgB;;EAUhB,QAAMS,OAAO,GAAGngB,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiBvQ,IAAjB,CAAsB,eAAtB,CAAhB;EACA5G,IAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiBnR,UAAjB,CAA4B,eAA5B;EACAzE,IAAAA,QAAQ,CAAC4V,IAAT,CAActE,KAAd,CAAoBoN,YAApB,GAAmCE,OAAO,GAAGA,OAAH,GAAa,EAAvD;EACD;;WAEDP,qBAAA,8BAAqB;EAAE;EACrB,QAAMQ,SAAS,GAAG7e,QAAQ,CAAC4d,aAAT,CAAuB,KAAvB,CAAlB;EACAiB,IAAAA,SAAS,CAAChB,SAAV,GAAsBla,WAAS,CAAC4X,kBAAhC;EACAvb,IAAAA,QAAQ,CAAC4V,IAAT,CAAcqH,WAAd,CAA0B4B,SAA1B;EACA,QAAMC,cAAc,GAAGD,SAAS,CAACjN,qBAAV,GAAkCgJ,KAAlC,GAA0CiE,SAAS,CAACE,WAA3E;EACA/e,IAAAA,QAAQ,CAAC4V,IAAT,CAAcoJ,WAAd,CAA0BH,SAA1B;EACA,WAAOC,cAAP;EACD;;;WAGDzC,WAAA,oBAAW;EACT,QAAM4C,WAAW,GAAGxgB,CAAC,CAAC,KAAKuF,QAAN,CAArB;EACA,QAAMkb,WAAW,GAAGD,WAAW,CAAClJ,IAAZ,CAAiB,cAAjB,CAApB;EACA,QAAMoJ,YAAY,GAAGF,WAAW,CAAClJ,IAAZ,CAAiB,eAAjB,CAArB;EAEAkJ,IAAAA,WAAW,CAAC1N,IAAZ,CAAiB;EACfsI,MAAAA,IAAI,EAAE,QADS;EAEf,oBAAc;EAFC,KAAjB;;EAKA,QAAIqF,WAAJ,EAAiB;EACf,UAAME,YAAY,GAAGF,WAAW,CAAC3N,IAAZ,CAAiB,IAAjB,CAArB;;EACA,UAAI6N,YAAJ,EAAkB;EAChBH,QAAAA,WAAW,CAAC1N,IAAZ,CAAiB;EACf,6BAAoB6N;EADL,SAAjB;EAGD;EACF;;EAED,QAAID,YAAJ,EAAkB;EAChBA,MAAAA,YAAY,CAAC5N,IAAb,CAAkB,MAAlB,EAA0B,UAA1B;EACD;EACF;EAGD;;;UAEOrM,mBAAP,0BAAwBvD,MAAxB,EAAgC6L,aAAhC,EAA+C;EAC7C,WAAO,KAAKrI,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAMgH,OAAO,qBACR9C,SADQ,EAER1I,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,EAFQ,EAGR,OAAO1D,MAAP,KAAkB,QAAlB,IAA8BA,MAA9B,GAAuCA,MAAvC,GAAgD,EAHxC,CAAb;;EAMA,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIyW,KAAJ,CAAU,IAAV,EAAgB7R,OAAhB,CAAP;EACAxL,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ,CAAa6L,aAAb;EACD,OALD,MAKO,IAAIvD,OAAO,CAAC8G,IAAZ,EAAkB;EACvB1L,QAAAA,IAAI,CAAC0L,IAAL,CAAUvD,aAAV;EACD;EACF,KArBM,CAAP;EAsBD;;;;0BAlaoB;EACnB,aAAOxK,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;;;EA+ZH;;;;;;;EAMA1I,CAAC,CAACuB,QAAD,CAAD,CAAYyF,EAAZ,CAAelC,OAAK,CAACG,cAArB,EAAqCL,UAAQ,CAAC2C,WAA9C,EAA2D,UAAUxH,KAAV,EAAiB;EAAA;;EAC1E,MAAIE,MAAJ;EACA,MAAM0B,QAAQ,GAAGf,IAAI,CAACa,sBAAL,CAA4B,IAA5B,CAAjB;;EAEA,MAAIE,QAAJ,EAAc;EACZ1B,IAAAA,MAAM,GAAGsB,QAAQ,CAACQ,aAAT,CAAuBJ,QAAvB,CAAT;EACD;;EAED,MAAMuB,MAAM,GAAGlD,CAAC,CAACC,MAAD,CAAD,CAAU2G,IAAV,CAAepC,UAAf,IACX,QADW,qBAERxE,CAAC,CAACC,MAAD,CAAD,CAAU2G,IAAV,EAFQ,EAGR5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,EAHQ,CAAf;;EAMA,MAAI,KAAKuH,OAAL,KAAiB,GAAjB,IAAwB,KAAKA,OAAL,KAAiB,MAA7C,EAAqD;EACnDpO,IAAAA,KAAK,CAACgH,cAAN;EACD;;EAED,MAAMiN,OAAO,GAAGhU,CAAC,CAACC,MAAD,CAAD,CAAUU,GAAV,CAAcmE,OAAK,CAACO,IAApB,EAA0B,UAAC0R,SAAD,EAAe;EACvD,QAAIA,SAAS,CAAClR,kBAAV,EAAJ,EAAoC;EAClC;EACA;EACD;;EAEDmO,IAAAA,OAAO,CAACrT,GAAR,CAAYmE,OAAK,CAACiM,MAAlB,EAA0B,YAAM;EAC9B,UAAI/Q,CAAC,CAAC,MAAD,CAAD,CAAQE,EAAR,CAAW,UAAX,CAAJ,EAA4B;EAC1B,QAAA,MAAI,CAACmX,KAAL;EACD;EACF,KAJD;EAKD,GAXe,CAAhB;;EAaAgG,EAAAA,KAAK,CAAC5W,gBAAN,CAAuBjH,IAAvB,CAA4BQ,CAAC,CAACC,MAAD,CAA7B,EAAuCiD,MAAvC,EAA+C,IAA/C;EACD,CAhCD;EAkCA;;;;;;EAMAlD,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAa+Y,KAAK,CAAC5W,gBAAnB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyBoW,KAAzB;;EACArd,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAO0Y,KAAK,CAAC5W,gBAAb;EACD,CAHD;;ECziBA;;;;;;EAMA,IAAMnC,MAAI,GAAiB,QAA3B;EACA,IAAMC,SAAO,GAAc,OAA3B;EACA,IAAMC,UAAQ,GAAa,WAA3B;EACA,IAAMG,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EACA,IAAMsc,UAAU,GAAG,GAAnB;EAEA,IAAMlY,SAAO,GAAG;EACdmY,EAAAA,MAAM,EAAG,KADK;EAEdle,EAAAA,OAAO,EAAG;EAFI,CAAhB;EAKA,IAAMsG,aAAW,GAAG;EAClB4X,EAAAA,MAAM,EAAG,SADS;EAElBle,EAAAA,OAAO,EAAG;EAFQ,CAApB;EAKA,IAAMiC,UAAQ,GAAG;EACfkc,EAAAA,SAAS,EAAG,eADG;EAEfzH,EAAAA,cAAc,EAAG;EAInB;;;;;;EANiB,CAAjB;;MAYM0H;;;EACJ,kBAAYrf,OAAZ,EAAqBwB,MAArB,EAA6B;EAAA;;EAC3B,SAAKqC,QAAL,GAAwB7D,OAAxB;EACA,SAAKsf,SAAL,GAAwBtf,OAAO,CAACK,aAAR,CAAsB6C,UAAQ,CAACkc,SAA/B,CAAxB;EACA,SAAKtV,OAAL,GAAwB,KAAKC,UAAL,CAAgBvI,MAAhB,CAAxB;EACA,SAAK+d,cAAL,GAAsBjhB,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB2b,WAAjB,EAAtB;EACA,SAAKC,mBAAL,GAA2BnhB,CAAC,CAAC,KAAKghB,SAAN,CAAD,CAAkBE,WAAlB,EAA3B;;EAEA,SAAKtD,QAAL;;EAEA,QAAI,KAAKpS,OAAL,CAAaqV,MAAjB,EAAyB;EACvB7gB,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBkK,QAAjB,CAA0B,WAA1B;EACAzP,MAAAA,CAAC,CAAC4E,UAAQ,CAACyU,cAAV,CAAD,CAA2B5J,QAA3B,CAAoC,QAApC;EACAzP,MAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiBhV,GAAjB,CAAqB,aAArB,EAAoC,KAAK8e,cAAzC;EAEAjhB,MAAAA,CAAC,CAAC+L,MAAD,CAAD,CAAU/E,EAAV,CAAa,QAAb,EAAuB,YAAM;EAC3B,YAAMoa,MAAM,GAAGphB,CAAC,CAAC+L,MAAD,CAAD,CAAU2S,SAAV,EAAf;;EACA,YAAI0C,MAAM,GAAG,CAAb,EAAgB;EACdphB,UAAAA,CAAC,CAAC,KAAI,CAACuF,QAAN,CAAD,CAAiBkK,QAAjB,CAA0B,WAA1B;EACD,SAFD,MAEO;EACLzP,UAAAA,CAAC,CAAC,KAAI,CAACuF,QAAN,CAAD,CAAiBa,WAAjB,CAA6B,WAA7B;EACD;EACF,OAPD;EAQD;;EAED,QAAI,KAAKoF,OAAL,CAAa6V,SAAjB,EAA4B;EAC1BrhB,MAAAA,CAAC,CAAC+L,MAAD,CAAD,CAAU/E,EAAV,CAAa,QAAb,EAAuB,YAAM;EAC3B,YAAIhH,CAAC,CAAC+L,MAAD,CAAD,CAAU4T,UAAV,KAAyBiB,UAA7B,EAAyC;EACvC;EACD;;EAED,YAAMQ,MAAM,GAAGphB,CAAC,CAAC+L,MAAD,CAAD,CAAU2S,SAAV,EAAf;;EAEA,YAAI0C,MAAM,GAAG,CAAb,EAAgB;EACdphB,UAAAA,CAAC,CAAC4E,UAAQ,CAACkc,SAAV,CAAD,CAAsBzO,IAAtB;EACD,SAFD,MAEO;EACLrS,UAAAA,CAAC,CAAC4E,UAAQ,CAACkc,SAAV,CAAD,CAAsBxO,IAAtB;EACD;EACF,OAZD;EAaD;EACF;;;;;EAYD;WAEA7G,aAAA,oBAAWvI,MAAX,EAAmB;EACjBA,IAAAA,MAAM,GAAGlD,CAAC,CAACshB,MAAF,CAAS,EAAT,EAAa5Y,SAAb,EAAsBxF,MAAtB,CAAT;EACAtC,IAAAA,IAAI,CAACoC,eAAL,CAAqBsB,MAArB,EAA2BpB,MAA3B,EAAmC+F,aAAnC;EACA,WAAO/F,MAAP;EACD;;WAED0a,WAAA,oBAAW;EACT5d,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,CAAsB,gCAAtB,EAAwDxE,IAAxD,CAA6D,eAA7D,EAA8E,IAA9E;EACD;;;WAIMrM,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAMgH,OAAO,qBACR9C,SADQ,EAER1I,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,EAFQ,EAGR,OAAO1D,MAAP,KAAkB,QAAlB,IAA8BA,MAA9B,GAAuCA,MAAvC,GAAgD,EAHxC,CAAb;;EAMA,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIma,MAAJ,CAAW,IAAX,EAAiBvV,OAAjB,CAAP;EACAxL,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KAnBM,CAAP;EAoBD;;;;0BA3CoB;EACnB,aAAOqB,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;;;EAwCH;;;;;;;EAMA1I,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAayc,MAAM,CAACta,gBAApB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB8Z,MAAzB;;EACA/gB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOoc,MAAM,CAACta,gBAAd;EACD,CAHD;;ECpIA;;;;;;EAMA,IAAMnC,MAAI,GAAkB,MAA5B;EACA,IAAMC,SAAO,GAAe,OAA5B;EACA,IAAMC,UAAQ,GAAc,SAA5B;EACA,IAAMC,WAAS,SAAiBD,UAAhC;EACA,IAAME,cAAY,GAAU,WAA5B;EACA,IAAMC,oBAAkB,GAAI3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA5B;EACA,IAAMid,iBAAiB,GAAK,CAA5B;EAEA,IAAMzc,OAAK,GAAG;EACZG,EAAAA,cAAc,YAAWR,WAAX,GAAuBC;EADzB,CAAd;EAIA,IAAMQ,WAAS,GAAG;EAChBiC,EAAAA,MAAM,EAAU,QADA;EAEhB9B,EAAAA,IAAI,EAAY,MAFA;EAGhBmc,EAAAA,gBAAgB,EAAE;EAHF,CAAlB;EAMA,IAAM5c,UAAQ,GAAG;EACf6c,EAAAA,YAAY,EAAE,gBADC;EAEfC,EAAAA,YAAY,EAAE;EAIhB;;;;;;EANiB,CAAjB;;MAYMC;;;EACJ,gBAAYjgB,OAAZ,EAAqB;EACnB,SAAK6D,QAAL,GAAgB7D,OAAhB;;EACA,SAAKgV,iBAAL;;EAEA,QAAI1W,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBU,MAAjB,GAA0BqR,IAA1B,CAA+B1S,UAAQ,CAAC6c,YAAxC,EAAsDxU,MAAtD,GAA+DsU,iBAAnE,EAAsF;EACpFvhB,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBU,MAAjB,GAA0BwJ,QAA1B,CAAmCvK,WAAS,CAACsc,gBAA7C;EACD;EACF;;;;;EAUD;WACAlP,OAAA,gBAAO;EACL,QAAM3L,QAAQ,GAAG3G,CAAC,CAAC,KAAKuF,QAAN,CAAlB;;EAEA,QAAIoB,QAAQ,CAACwF,IAAT,GAAgB9F,QAAhB,CAAyBnB,WAAS,CAACG,IAAnC,CAAJ,EAA8C;EAC5C;EACD,KALI;;;EAQLsB,IAAAA,QAAQ,CAACV,MAAT,GAAkBqR,IAAlB,CAAuB1S,UAAQ,CAAC8c,YAAhC,EAA8Ctb,WAA9C,CAA0DlB,WAAS,CAACG,IAApE,EARK;;EAULsB,IAAAA,QAAQ,CAACV,MAAT,GAAkBqR,IAAlB,CAAuB,wBAAvB,EAAiDxE,IAAjD,CAAsD,eAAtD,EAAuE,KAAvE,EAVK;;EAYLnM,IAAAA,QAAQ,CAACwF,IAAT,GAAgBsD,QAAhB,CAAyBvK,WAAS,CAACG,IAAnC,EAZK;;EAcLsB,IAAAA,QAAQ,CAACmM,IAAT,CAAc,eAAd,EAA+B,IAA/B;EACD;;;WAGD4D,oBAAA,6BAAoB;EAClB,QAAMkL,IAAI,GAAG5hB,CAAC,CAAC,KAAKuF,QAAN,CAAd;EACA,QAAMsc,SAAS,GAAGD,IAAI,CAACzV,IAAL,EAAlB;EAEAyV,IAAAA,IAAI,CAAC9O,IAAL,CAAU,IAAV,EAAgBlS,IAAI,CAACO,MAAL,CAAYmD,MAAZ,CAAhB;EACAud,IAAAA,SAAS,CAAC/O,IAAV,CAAe,IAAf,EAAqBlS,IAAI,CAACO,MAAL,CAAYmD,MAAZ,CAArB;EAEAsd,IAAAA,IAAI,CAAC9O,IAAL,CAAU;EACR,uBAAiB+O,SAAS,CAAC/O,IAAV,CAAe,IAAf,CADT;EAERsI,MAAAA,IAAI,EAAE;EAFE,KAAV;EAIAyG,IAAAA,SAAS,CAAC/O,IAAV,CAAe;EACb,yBAAmB8O,IAAI,CAAC9O,IAAL,CAAU,IAAV,CADN;EAEbsI,MAAAA,IAAI,EAAE,UAFO;EAGbS,MAAAA,QAAQ,EAAE;EAHG,KAAf;;EAMA,QAAIgG,SAAS,CAACxb,QAAV,CAAmBnB,WAAS,CAACG,IAA7B,CAAJ,EAAwC;EACtCuc,MAAAA,IAAI,CAAC9O,IAAL,CAAU,eAAV,EAA2B,IAA3B;EACD,KAFD,MAEO;EACL8O,MAAAA,IAAI,CAAC9O,IAAL,CAAU,eAAV,EAA2B,KAA3B;EACD;EACF;;;SAIMrM,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAMkN,KAAK,GAAG5T,CAAC,CAAC,IAAD,CAAf;EACA,UAAI4G,IAAI,GAAMgN,KAAK,CAAChN,IAAN,CAAWpC,UAAX,CAAd;;EAEA,UAAI,CAACoC,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAI+a,IAAJ,CAAS,IAAT,CAAP;EACA/N,QAAAA,KAAK,CAAChN,IAAN,CAAWpC,UAAX,EAAqBoC,IAArB;EACD,OAP0B;;;EAU3B,UAAI,OAAOhD,IAAP,CAAYV,MAAZ,CAAJ,EAAyB;EACvB;EACD,OAZ0B;;;EAe3B,UAAI,OAAOA,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KArBM,CAAP;EAsBD;;;;0BAzEoB;EACnB,aAAOqB,SAAP;EACD;;;;;EA0EH;;;;;;;EAMAvE,CAAC,CAACuB,QAAD,CAAD,CACGyF,EADH,CACM,kBADN,EAC0B,YAAM;EAC5B2a,EAAAA,IAAI,CAAClb,gBAAL,CAAsBjH,IAAtB,CAA2BQ,CAAC,CAAC4E,UAAQ,CAAC6c,YAAV,CAA5B,EAAqD,MAArD;EACD,CAHH,EAIGza,EAJH,CAIMlC,OAAK,CAACG,cAJZ,EAI4BL,UAAQ,CAAC6c,YAJrC,EAImD,UAAU1hB,KAAV,EAAiB;EAChEA,EAAAA,KAAK,CAACgH,cAAN;;EACA4a,EAAAA,IAAI,CAAClb,gBAAL,CAAsBjH,IAAtB,CAA2BQ,CAAC,CAAC,IAAD,CAA5B,EAAoCkF,WAAS,CAACG,IAA9C;EACD,CAPH;EASA;;;;;;EAMArF,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAyBqd,IAAI,CAAClb,gBAA9B;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB0a,IAAzB;;EACA3hB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAyB,YAAM;EAC7BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOgd,IAAI,CAAClb,gBAAZ;EACD,CAHD;;EC9JA;;;;;;EAOA,IAAMqb,QAAQ,GAAG,CACf,YADe,EAEf,MAFe,EAGf,MAHe,EAIf,UAJe,EAKf,UALe,EAMf,QANe,EAOf,KAPe,EAQf,YARe,CAAjB;EAWA,IAAMC,sBAAsB,GAAG,gBAA/B;AAEA,EAAO,IAAMC,gBAAgB,GAAG;EAC9B;EACA,OAAK,CAAC,OAAD,EAAU,KAAV,EAAiB,IAAjB,EAAuB,MAAvB,EAA+B,MAA/B,EAAuCD,sBAAvC,CAFyB;EAG9BE,EAAAA,CAAC,EAAE,CAAC,QAAD,EAAW,MAAX,EAAmB,OAAnB,EAA4B,KAA5B,CAH2B;EAI9BC,EAAAA,IAAI,EAAE,EAJwB;EAK9BC,EAAAA,CAAC,EAAE,EAL2B;EAM9BC,EAAAA,EAAE,EAAE,EAN0B;EAO9BC,EAAAA,GAAG,EAAE,EAPyB;EAQ9BC,EAAAA,IAAI,EAAE,EARwB;EAS9BC,EAAAA,GAAG,EAAE,EATyB;EAU9BC,EAAAA,EAAE,EAAE,EAV0B;EAW9BC,EAAAA,EAAE,EAAE,EAX0B;EAY9BC,EAAAA,EAAE,EAAE,EAZ0B;EAa9BC,EAAAA,EAAE,EAAE,EAb0B;EAc9BC,EAAAA,EAAE,EAAE,EAd0B;EAe9BC,EAAAA,EAAE,EAAE,EAf0B;EAgB9BC,EAAAA,EAAE,EAAE,EAhB0B;EAiB9BC,EAAAA,EAAE,EAAE,EAjB0B;EAkB9BrS,EAAAA,CAAC,EAAE,EAlB2B;EAmB9BsS,EAAAA,GAAG,EAAE,CAAC,KAAD,EAAQ,KAAR,EAAe,OAAf,EAAwB,OAAxB,EAAiC,QAAjC,CAnByB;EAoB9BC,EAAAA,EAAE,EAAE,EApB0B;EAqB9BC,EAAAA,EAAE,EAAE,EArB0B;EAsB9BC,EAAAA,CAAC,EAAE,EAtB2B;EAuB9BC,EAAAA,GAAG,EAAE,EAvByB;EAwB9BC,EAAAA,CAAC,EAAE,EAxB2B;EAyB9BC,EAAAA,KAAK,EAAE,EAzBuB;EA0B9BC,EAAAA,IAAI,EAAE,EA1BwB;EA2B9BC,EAAAA,GAAG,EAAE,EA3ByB;EA4B9BC,EAAAA,GAAG,EAAE,EA5ByB;EA6B9BC,EAAAA,MAAM,EAAE,EA7BsB;EA8B9BC,EAAAA,CAAC,EAAE,EA9B2B;EA+B9BC,EAAAA,EAAE,EAAE;EAGN;;;;;;EAlCgC,CAAzB;EAuCP,IAAMC,gBAAgB,GAAG,6DAAzB;EAEA;;;;;;EAKA,IAAMC,gBAAgB,GAAG,qIAAzB;;EAEA,SAASC,gBAAT,CAA0BjR,IAA1B,EAAgCkR,oBAAhC,EAAsD;EACpD,MAAMC,QAAQ,GAAGnR,IAAI,CAACoR,QAAL,CAAcxkB,WAAd,EAAjB;;EAEA,MAAIskB,oBAAoB,CAAC1V,OAArB,CAA6B2V,QAA7B,MAA2C,CAAC,CAAhD,EAAmD;EACjD,QAAInC,QAAQ,CAACxT,OAAT,CAAiB2V,QAAjB,MAA+B,CAAC,CAApC,EAAuC;EACrC,aAAOphB,OAAO,CAACiQ,IAAI,CAACqR,SAAL,CAAe1kB,KAAf,CAAqBokB,gBAArB,KAA0C/Q,IAAI,CAACqR,SAAL,CAAe1kB,KAAf,CAAqBqkB,gBAArB,CAA3C,CAAd;EACD;;EAED,WAAO,IAAP;EACD;;EAED,MAAMM,MAAM,GAAGJ,oBAAoB,CAAClS,MAArB,CAA4B,UAACuS,SAAD;EAAA,WAAeA,SAAS,YAAY1gB,MAApC;EAAA,GAA5B,CAAf,CAXoD;;EAcpD,OAAK,IAAI+M,CAAC,GAAG,CAAR,EAAW4T,CAAC,GAAGF,MAAM,CAACnX,MAA3B,EAAmCyD,CAAC,GAAG4T,CAAvC,EAA0C5T,CAAC,EAA3C,EAA+C;EAC7C,QAAIuT,QAAQ,CAACxkB,KAAT,CAAe2kB,MAAM,CAAC1T,CAAD,CAArB,CAAJ,EAA+B;EAC7B,aAAO,IAAP;EACD;EACF;;EAED,SAAO,KAAP;EACD;;AAED,EAAO,SAAS6T,YAAT,CAAsBC,UAAtB,EAAkCC,SAAlC,EAA6CC,UAA7C,EAAyD;EAC9D,MAAIF,UAAU,CAACvX,MAAX,KAAsB,CAA1B,EAA6B;EAC3B,WAAOuX,UAAP;EACD;;EAED,MAAIE,UAAU,IAAI,OAAOA,UAAP,KAAsB,UAAxC,EAAoD;EAClD,WAAOA,UAAU,CAACF,UAAD,CAAjB;EACD;;EAED,MAAMG,SAAS,GAAG,IAAI5Y,MAAM,CAAC6Y,SAAX,EAAlB;EACA,MAAMC,eAAe,GAAGF,SAAS,CAACG,eAAV,CAA0BN,UAA1B,EAAsC,WAAtC,CAAxB;EACA,MAAMO,aAAa,GAAG1hB,MAAM,CAAC2hB,IAAP,CAAYP,SAAZ,CAAtB;EACA,MAAMQ,QAAQ,GAAG,GAAG5W,KAAH,CAAS7O,IAAT,CAAcqlB,eAAe,CAAC1N,IAAhB,CAAqBlJ,gBAArB,CAAsC,GAAtC,CAAd,CAAjB;;EAZ8D,6BAcrDyC,CAdqD,EAc9CC,GAd8C;EAe5D,QAAMuU,EAAE,GAAGD,QAAQ,CAACvU,CAAD,CAAnB;EACA,QAAMyU,MAAM,GAAGD,EAAE,CAAChB,QAAH,CAAYxkB,WAAZ,EAAf;;EAEA,QAAIqlB,aAAa,CAACzW,OAAd,CAAsB4W,EAAE,CAAChB,QAAH,CAAYxkB,WAAZ,EAAtB,MAAqD,CAAC,CAA1D,EAA6D;EAC3DwlB,MAAAA,EAAE,CAAC7gB,UAAH,CAAckc,WAAd,CAA0B2E,EAA1B;EAEA;EACD;;EAED,QAAME,aAAa,GAAG,GAAG/W,KAAH,CAAS7O,IAAT,CAAc0lB,EAAE,CAACG,UAAjB,CAAtB;EACA,QAAMC,qBAAqB,GAAG,GAAGC,MAAH,CAAUd,SAAS,CAAC,GAAD,CAAT,IAAkB,EAA5B,EAAgCA,SAAS,CAACU,MAAD,CAAT,IAAqB,EAArD,CAA9B;EAEAC,IAAAA,aAAa,CAAChH,OAAd,CAAsB,UAACtL,IAAD,EAAU;EAC9B,UAAI,CAACiR,gBAAgB,CAACjR,IAAD,EAAOwS,qBAAP,CAArB,EAAoD;EAClDJ,QAAAA,EAAE,CAACzG,eAAH,CAAmB3L,IAAI,CAACoR,QAAxB;EACD;EACF,KAJD;EA3B4D;;EAc9D,OAAK,IAAIxT,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGsU,QAAQ,CAAChY,MAA/B,EAAuCyD,CAAC,GAAGC,GAA3C,EAAgDD,CAAC,EAAjD,EAAqD;EAAA,qBAA5CA,CAA4C,EAArCC,GAAqC;;EAAA,6BAOjD;EAWH;;EAED,SAAOkU,eAAe,CAAC1N,IAAhB,CAAqBqO,SAA5B;EACD;;EC/GD;;;;;;EAMA,IAAMlhB,MAAI,GAAoB,SAA9B;EACA,IAAMC,SAAO,GAAiB,OAA9B;EACA,IAAMC,UAAQ,GAAgB,YAA9B;EACA,IAAMC,WAAS,SAAmBD,UAAlC;EACA,IAAMG,oBAAkB,GAAM3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA9B;EACA,IAAMmhB,YAAY,GAAY,YAA9B;EACA,IAAMC,kBAAkB,GAAM,IAAI/hB,MAAJ,aAAqB8hB,YAArB,WAAyC,GAAzC,CAA9B;EACA,IAAME,qBAAqB,GAAG,CAAC,UAAD,EAAa,WAAb,EAA0B,YAA1B,CAA9B;EAEA,IAAM1c,aAAW,GAAG;EAClB2c,EAAAA,SAAS,EAAW,SADF;EAElBC,EAAAA,QAAQ,EAAY,QAFF;EAGlBC,EAAAA,KAAK,EAAe,2BAHF;EAIlBnjB,EAAAA,OAAO,EAAa,QAJF;EAKlBojB,EAAAA,KAAK,EAAe,iBALF;EAMlBC,EAAAA,IAAI,EAAgB,SANF;EAOlBrkB,EAAAA,QAAQ,EAAY,kBAPF;EAQlBqW,EAAAA,SAAS,EAAW,mBARF;EASlBjC,EAAAA,MAAM,EAAc,0BATF;EAUlBkQ,EAAAA,SAAS,EAAW,0BAVF;EAWlBC,EAAAA,iBAAiB,EAAG,gBAXF;EAYlBjQ,EAAAA,QAAQ,EAAY,kBAZF;EAalBkQ,EAAAA,QAAQ,EAAY,SAbF;EAclBzB,EAAAA,UAAU,EAAU,iBAdF;EAelBD,EAAAA,SAAS,EAAW;EAfF,CAApB;EAkBA,IAAMjP,eAAa,GAAG;EACpB4Q,EAAAA,IAAI,EAAK,MADW;EAEpB3Q,EAAAA,GAAG,EAAM,KAFW;EAGpBnM,EAAAA,KAAK,EAAI,OAHW;EAIpBqM,EAAAA,MAAM,EAAG,QAJW;EAKpBtM,EAAAA,IAAI,EAAK;EALW,CAAtB;EAQA,IAAMX,SAAO,GAAG;EACdkd,EAAAA,SAAS,EAAW,IADN;EAEdC,EAAAA,QAAQ,EAAY,yCACF,2BADE,GAEF,yCAJJ;EAKdljB,EAAAA,OAAO,EAAa,aALN;EAMdmjB,EAAAA,KAAK,EAAe,EANN;EAOdC,EAAAA,KAAK,EAAe,CAPN;EAQdC,EAAAA,IAAI,EAAgB,KARN;EASdrkB,EAAAA,QAAQ,EAAY,KATN;EAUdqW,EAAAA,SAAS,EAAW,KAVN;EAWdjC,EAAAA,MAAM,EAAc,CAXN;EAYdkQ,EAAAA,SAAS,EAAW,KAZN;EAadC,EAAAA,iBAAiB,EAAG,MAbN;EAcdjQ,EAAAA,QAAQ,EAAY,cAdN;EAedkQ,EAAAA,QAAQ,EAAY,IAfN;EAgBdzB,EAAAA,UAAU,EAAU,IAhBN;EAiBdD,EAAAA,SAAS,EAAWzC;EAjBN,CAAhB;EAoBA,IAAMqE,UAAU,GAAG;EACjBhhB,EAAAA,IAAI,EAAG,MADU;EAEjBihB,EAAAA,GAAG,EAAI;EAFU,CAAnB;EAKA,IAAMxhB,OAAK,GAAG;EACZgM,EAAAA,IAAI,WAAgBrM,WADR;EAEZsM,EAAAA,MAAM,aAAgBtM,WAFV;EAGZY,EAAAA,IAAI,WAAgBZ,WAHR;EAIZoM,EAAAA,KAAK,YAAgBpM,WAJT;EAKZ8hB,EAAAA,QAAQ,eAAgB9hB,WALZ;EAMZ+P,EAAAA,KAAK,YAAgB/P,WANT;EAOZ8X,EAAAA,OAAO,cAAgB9X,WAPX;EAQZ+hB,EAAAA,QAAQ,eAAgB/hB,WARZ;EASZiF,EAAAA,UAAU,iBAAgBjF,WATd;EAUZkF,EAAAA,UAAU,iBAAgBlF;EAVd,CAAd;EAaA,IAAMS,WAAS,GAAG;EAChBE,EAAAA,IAAI,EAAG,MADS;EAEhBC,EAAAA,IAAI,EAAG;EAFS,CAAlB;EAKA,IAAMT,UAAQ,GAAG;EACf6hB,EAAAA,OAAO,EAAS,UADD;EAEfC,EAAAA,aAAa,EAAG,gBAFD;EAGfC,EAAAA,KAAK,EAAW;EAHD,CAAjB;EAMA,IAAMC,OAAO,GAAG;EACdC,EAAAA,KAAK,EAAI,OADK;EAEdxf,EAAAA,KAAK,EAAI,OAFK;EAGdmN,EAAAA,KAAK,EAAI,OAHK;EAIdsS,EAAAA,MAAM,EAAG;EAIX;;;;;;EARgB,CAAhB;;MAcMC;;;EACJ,mBAAYrlB,OAAZ,EAAqBwB,MAArB,EAA6B;EAC3B;;;;EAIA,QAAI,OAAO8T,MAAP,KAAkB,WAAtB,EAAmC;EACjC,YAAM,IAAI3G,SAAJ,CAAc,kEAAd,CAAN;EACD,KAP0B;;;EAU3B,SAAK2W,UAAL,GAAsB,IAAtB;EACA,SAAKC,QAAL,GAAsB,CAAtB;EACA,SAAKC,WAAL,GAAsB,EAAtB;EACA,SAAKC,cAAL,GAAsB,EAAtB;EACA,SAAK9Q,OAAL,GAAsB,IAAtB,CAd2B;;EAiB3B,SAAK3U,OAAL,GAAeA,OAAf;EACA,SAAKwB,MAAL,GAAe,KAAKuI,UAAL,CAAgBvI,MAAhB,CAAf;EACA,SAAKkkB,GAAL,GAAe,IAAf;;EAEA,SAAKC,aAAL;EACD;;;;;EAgCD;WAEAC,SAAA,kBAAS;EACP,SAAKN,UAAL,GAAkB,IAAlB;EACD;;WAEDO,UAAA,mBAAU;EACR,SAAKP,UAAL,GAAkB,KAAlB;EACD;;WAEDQ,gBAAA,yBAAgB;EACd,SAAKR,UAAL,GAAkB,CAAC,KAAKA,UAAxB;EACD;;WAEDrf,SAAA,gBAAO5H,KAAP,EAAc;EACZ,QAAI,CAAC,KAAKinB,UAAV,EAAsB;EACpB;EACD;;EAED,QAAIjnB,KAAJ,EAAW;EACT,UAAM0nB,OAAO,GAAG,KAAK5P,WAAL,CAAiBrT,QAAjC;EACA,UAAIkU,OAAO,GAAG1Y,CAAC,CAACD,KAAK,CAAC8T,aAAP,CAAD,CAAuBjN,IAAvB,CAA4B6gB,OAA5B,CAAd;;EAEA,UAAI,CAAC/O,OAAL,EAAc;EACZA,QAAAA,OAAO,GAAG,IAAI,KAAKb,WAAT,CACR9X,KAAK,CAAC8T,aADE,EAER,KAAK6T,kBAAL,EAFQ,CAAV;EAIA1nB,QAAAA,CAAC,CAACD,KAAK,CAAC8T,aAAP,CAAD,CAAuBjN,IAAvB,CAA4B6gB,OAA5B,EAAqC/O,OAArC;EACD;;EAEDA,MAAAA,OAAO,CAACyO,cAAR,CAAuBQ,KAAvB,GAA+B,CAACjP,OAAO,CAACyO,cAAR,CAAuBQ,KAAvD;;EAEA,UAAIjP,OAAO,CAACkP,oBAAR,EAAJ,EAAoC;EAClClP,QAAAA,OAAO,CAACmP,MAAR,CAAe,IAAf,EAAqBnP,OAArB;EACD,OAFD,MAEO;EACLA,QAAAA,OAAO,CAACoP,MAAR,CAAe,IAAf,EAAqBpP,OAArB;EACD;EACF,KAnBD,MAmBO;EACL,UAAI1Y,CAAC,CAAC,KAAK+nB,aAAL,EAAD,CAAD,CAAwB1hB,QAAxB,CAAiCnB,WAAS,CAACG,IAA3C,CAAJ,EAAsD;EACpD,aAAKyiB,MAAL,CAAY,IAAZ,EAAkB,IAAlB;;EACA;EACD;;EAED,WAAKD,MAAL,CAAY,IAAZ,EAAkB,IAAlB;EACD;EACF;;WAED9hB,UAAA,mBAAU;EACRiI,IAAAA,YAAY,CAAC,KAAKiZ,QAAN,CAAZ;EAEAjnB,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKtE,OAAlB,EAA2B,KAAKmW,WAAL,CAAiBrT,QAA5C;EAEAxE,IAAAA,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgByL,GAAhB,CAAoB,KAAK0K,WAAL,CAAiBpT,SAArC;EACAzE,IAAAA,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBwE,OAAhB,CAAwB,QAAxB,EAAkCiH,GAAlC,CAAsC,eAAtC;;EAEA,QAAI,KAAKia,GAAT,EAAc;EACZpnB,MAAAA,CAAC,CAAC,KAAKonB,GAAN,CAAD,CAAY5gB,MAAZ;EACD;;EAED,SAAKwgB,UAAL,GAAsB,IAAtB;EACA,SAAKC,QAAL,GAAsB,IAAtB;EACA,SAAKC,WAAL,GAAsB,IAAtB;EACA,SAAKC,cAAL,GAAsB,IAAtB;;EACA,QAAI,KAAK9Q,OAAL,KAAiB,IAArB,EAA2B;EACzB,WAAKA,OAAL,CAAaoB,OAAb;EACD;;EAED,SAAKpB,OAAL,GAAe,IAAf;EACA,SAAK3U,OAAL,GAAe,IAAf;EACA,SAAKwB,MAAL,GAAe,IAAf;EACA,SAAKkkB,GAAL,GAAe,IAAf;EACD;;WAED9U,OAAA,gBAAO;EAAA;;EACL,QAAItS,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBS,GAAhB,CAAoB,SAApB,MAAmC,MAAvC,EAA+C;EAC7C,YAAM,IAAI0B,KAAJ,CAAU,qCAAV,CAAN;EACD;;EAED,QAAMkT,SAAS,GAAG/W,CAAC,CAAC8E,KAAF,CAAQ,KAAK+S,WAAL,CAAiB/S,KAAjB,CAAuBO,IAA/B,CAAlB;;EACA,QAAI,KAAK2iB,aAAL,MAAwB,KAAKhB,UAAjC,EAA6C;EAC3ChnB,MAAAA,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBiB,OAAhB,CAAwBoU,SAAxB;EAEA,UAAMkR,UAAU,GAAGrnB,IAAI,CAACmD,cAAL,CAAoB,KAAKrC,OAAzB,CAAnB;EACA,UAAMwmB,UAAU,GAAGloB,CAAC,CAACkI,QAAF,CACjB+f,UAAU,KAAK,IAAf,GAAsBA,UAAtB,GAAmC,KAAKvmB,OAAL,CAAaymB,aAAb,CAA2BnkB,eAD7C,EAEjB,KAAKtC,OAFY,CAAnB;;EAKA,UAAIqV,SAAS,CAAClR,kBAAV,MAAkC,CAACqiB,UAAvC,EAAmD;EACjD;EACD;;EAED,UAAMd,GAAG,GAAK,KAAKW,aAAL,EAAd;EACA,UAAMK,KAAK,GAAGxnB,IAAI,CAACO,MAAL,CAAY,KAAK0W,WAAL,CAAiBvT,IAA7B,CAAd;EAEA8iB,MAAAA,GAAG,CAACnf,YAAJ,CAAiB,IAAjB,EAAuBmgB,KAAvB;EACA,WAAK1mB,OAAL,CAAauG,YAAb,CAA0B,kBAA1B,EAA8CmgB,KAA9C;EAEA,WAAKC,UAAL;;EAEA,UAAI,KAAKnlB,MAAL,CAAY0iB,SAAhB,EAA2B;EACzB5lB,QAAAA,CAAC,CAAConB,GAAD,CAAD,CAAO3X,QAAP,CAAgBvK,WAAS,CAACE,IAA1B;EACD;;EAED,UAAM4S,SAAS,GAAI,OAAO,KAAK9U,MAAL,CAAY8U,SAAnB,KAAiC,UAAjC,GACf,KAAK9U,MAAL,CAAY8U,SAAZ,CAAsBxY,IAAtB,CAA2B,IAA3B,EAAiC4nB,GAAjC,EAAsC,KAAK1lB,OAA3C,CADe,GAEf,KAAKwB,MAAL,CAAY8U,SAFhB,CAzB2C;;EA6B3C,UAAIsQ,UAAU,GAAG,KAAKC,cAAL,CAAoBvQ,SAApB,CAAjB;;EACA,WAAKwQ,kBAAL,CAAwBF,UAAxB;;EAEA,UAAMrC,SAAS,GAAG,KAAKwC,aAAL,EAAlB;;EACAzoB,MAAAA,CAAC,CAAConB,GAAD,CAAD,CAAOxgB,IAAP,CAAY,KAAKiR,WAAL,CAAiBrT,QAA7B,EAAuC,IAAvC;;EAEA,UAAI,CAACxE,CAAC,CAACkI,QAAF,CAAW,KAAKxG,OAAL,CAAaymB,aAAb,CAA2BnkB,eAAtC,EAAuD,KAAKojB,GAA5D,CAAL,EAAuE;EACrEpnB,QAAAA,CAAC,CAAConB,GAAD,CAAD,CAAO/H,QAAP,CAAgB4G,SAAhB;EACD;;EAEDjmB,MAAAA,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBiB,OAAhB,CAAwB,KAAKkV,WAAL,CAAiB/S,KAAjB,CAAuByhB,QAA/C,EAvC2C;;EAyC3C,UAAMmC,GAAG,GAAGnnB,QAAQ,CAAConB,oBAAT,CAA8B,MAA9B,EAAsC,CAAtC,EAAyCD,GAArD;;EACA,UAAIA,GAAG,KAAK,KAAZ,EAAmB;EACjB,YAAME,IAAI,GAAG;EACXlJ,UAAAA,KAAK,EAAE,MADI;EAEXD,UAAAA,IAAI,EAAE;EAFK,SAAb;EAIA6I,QAAAA,UAAU,GAAGA,UAAU,CAACO,OAAX,CAAmB,aAAnB,EAAkC,UAACC,OAAD;EAAA,iBAAaF,IAAI,CAACE,OAAD,CAAjB;EAAA,SAAlC,CAAb;EACD,OAhD0C;;;EAkD3C,WAAKzS,OAAL,GAAe,IAAIW,MAAJ,CAAW,KAAKtV,OAAhB,EAAyB0lB,GAAzB,EAA8B;EAC3CpP,QAAAA,SAAS,EAAEsQ,UADgC;EAE3ClQ,QAAAA,SAAS,EAAE;EACTrC,UAAAA,MAAM,EAAE,KAAKkC,UAAL,EADC;EAETjC,UAAAA,IAAI,EAAE;EACJ+S,YAAAA,QAAQ,EAAE,KAAK7lB,MAAL,CAAYgjB;EADlB,WAFG;EAKT8C,UAAAA,KAAK,EAAE;EACLtnB,YAAAA,OAAO,EAAEkD,UAAQ,CAAC+hB;EADb,WALE;EAQTrO,UAAAA,eAAe,EAAE;EACfC,YAAAA,iBAAiB,EAAE,KAAKrV,MAAL,CAAY+S;EADhB;EARR,SAFgC;EAc3CgT,QAAAA,QAAQ,EAAE,kBAACriB,IAAD,EAAU;EAClB,cAAIA,IAAI,CAACsiB,iBAAL,KAA2BtiB,IAAI,CAACoR,SAApC,EAA+C;EAC7C,YAAA,KAAI,CAACmR,4BAAL,CAAkCviB,IAAlC;EACD;EACF,SAlB0C;EAmB3CwiB,QAAAA,QAAQ,EAAE,kBAACxiB,IAAD;EAAA,iBAAU,KAAI,CAACuiB,4BAAL,CAAkCviB,IAAlC,CAAV;EAAA;EAnBiC,OAA9B,CAAf;EAsBA5G,MAAAA,CAAC,CAAConB,GAAD,CAAD,CAAO3X,QAAP,CAAgBvK,WAAS,CAACG,IAA1B,EAxE2C;EA2E3C;EACA;EACA;;EACA,UAAI,kBAAkB9D,QAAQ,CAACyC,eAA/B,EAAgD;EAC9ChE,QAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiB3H,QAAjB,GAA4BxI,EAA5B,CAA+B,WAA/B,EAA4C,IAA5C,EAAkDhH,CAAC,CAACoX,IAApD;EACD;;EAED,UAAMpE,QAAQ,GAAG,SAAXA,QAAW,GAAM;EACrB,YAAI,KAAI,CAAC9P,MAAL,CAAY0iB,SAAhB,EAA2B;EACzB,UAAA,KAAI,CAACyD,cAAL;EACD;;EACD,YAAMC,cAAc,GAAG,KAAI,CAACpC,WAA5B;EACA,QAAA,KAAI,CAACA,WAAL,GAAuB,IAAvB;EAEAlnB,QAAAA,CAAC,CAAC,KAAI,CAAC0B,OAAN,CAAD,CAAgBiB,OAAhB,CAAwB,KAAI,CAACkV,WAAL,CAAiB/S,KAAjB,CAAuB+L,KAA/C;;EAEA,YAAIyY,cAAc,KAAKjD,UAAU,CAACC,GAAlC,EAAuC;EACrC,UAAA,KAAI,CAACwB,MAAL,CAAY,IAAZ,EAAkB,KAAlB;EACD;EACF,OAZD;;EAcA,UAAI9nB,CAAC,CAAC,KAAKonB,GAAN,CAAD,CAAY/gB,QAAZ,CAAqBnB,WAAS,CAACE,IAA/B,CAAJ,EAA0C;EACxC,YAAMlD,kBAAkB,GAAGtB,IAAI,CAACqB,gCAAL,CAAsC,KAAKmlB,GAA3C,CAA3B;EAEApnB,QAAAA,CAAC,CAAC,KAAKonB,GAAN,CAAD,CACGzmB,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B8T,QAD5B,EAEG/R,oBAFH,CAEwBiB,kBAFxB;EAGD,OAND,MAMO;EACL8Q,QAAAA,QAAQ;EACT;EACF;EACF;;WAEDX,OAAA,cAAK4M,QAAL,EAAe;EAAA;;EACb,QAAMmI,GAAG,GAAS,KAAKW,aAAL,EAAlB;EACA,QAAMvQ,SAAS,GAAGxX,CAAC,CAAC8E,KAAF,CAAQ,KAAK+S,WAAL,CAAiB/S,KAAjB,CAAuBgM,IAA/B,CAAlB;;EACA,QAAMkC,QAAQ,GAAG,SAAXA,QAAW,GAAM;EACrB,UAAI,MAAI,CAACkU,WAAL,KAAqBb,UAAU,CAAChhB,IAAhC,IAAwC+hB,GAAG,CAAC/iB,UAAhD,EAA4D;EAC1D+iB,QAAAA,GAAG,CAAC/iB,UAAJ,CAAekc,WAAf,CAA2B6G,GAA3B;EACD;;EAED,MAAA,MAAI,CAACmC,cAAL;;EACA,MAAA,MAAI,CAAC7nB,OAAL,CAAa+c,eAAb,CAA6B,kBAA7B;;EACAze,MAAAA,CAAC,CAAC,MAAI,CAAC0B,OAAN,CAAD,CAAgBiB,OAAhB,CAAwB,MAAI,CAACkV,WAAL,CAAiB/S,KAAjB,CAAuBiM,MAA/C;;EACA,UAAI,MAAI,CAACsF,OAAL,KAAiB,IAArB,EAA2B;EACzB,QAAA,MAAI,CAACA,OAAL,CAAaoB,OAAb;EACD;;EAED,UAAIwH,QAAJ,EAAc;EACZA,QAAAA,QAAQ;EACT;EACF,KAfD;;EAiBAjf,IAAAA,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBiB,OAAhB,CAAwB6U,SAAxB;;EAEA,QAAIA,SAAS,CAAC3R,kBAAV,EAAJ,EAAoC;EAClC;EACD;;EAED7F,IAAAA,CAAC,CAAConB,GAAD,CAAD,CAAOhhB,WAAP,CAAmBlB,WAAS,CAACG,IAA7B,EA1Ba;EA6Bb;;EACA,QAAI,kBAAkB9D,QAAQ,CAACyC,eAA/B,EAAgD;EAC9ChE,MAAAA,CAAC,CAACuB,QAAQ,CAAC4V,IAAV,CAAD,CAAiB3H,QAAjB,GAA4BrC,GAA5B,CAAgC,WAAhC,EAA6C,IAA7C,EAAmDnN,CAAC,CAACoX,IAArD;EACD;;EAED,SAAK+P,cAAL,CAAoBP,OAAO,CAACpS,KAA5B,IAAqC,KAArC;EACA,SAAK2S,cAAL,CAAoBP,OAAO,CAACvf,KAA5B,IAAqC,KAArC;EACA,SAAK8f,cAAL,CAAoBP,OAAO,CAACC,KAA5B,IAAqC,KAArC;;EAEA,QAAI7mB,CAAC,CAAC,KAAKonB,GAAN,CAAD,CAAY/gB,QAAZ,CAAqBnB,WAAS,CAACE,IAA/B,CAAJ,EAA0C;EACxC,UAAMlD,kBAAkB,GAAGtB,IAAI,CAACqB,gCAAL,CAAsCmlB,GAAtC,CAA3B;EAEApnB,MAAAA,CAAC,CAAConB,GAAD,CAAD,CACGzmB,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B8T,QAD5B,EAEG/R,oBAFH,CAEwBiB,kBAFxB;EAGD,KAND,MAMO;EACL8Q,MAAAA,QAAQ;EACT;;EAED,SAAKkU,WAAL,GAAmB,EAAnB;EACD;;WAEDxP,SAAA,kBAAS;EACP,QAAI,KAAKrB,OAAL,KAAiB,IAArB,EAA2B;EACzB,WAAKA,OAAL,CAAasB,cAAb;EACD;EACF;;;WAIDqQ,gBAAA,yBAAgB;EACd,WAAOnlB,OAAO,CAAC,KAAK2mB,QAAL,EAAD,CAAd;EACD;;WAEDhB,qBAAA,4BAAmBF,UAAnB,EAA+B;EAC7BtoB,IAAAA,CAAC,CAAC,KAAK+nB,aAAL,EAAD,CAAD,CAAwBtY,QAAxB,CAAoCgW,YAApC,SAAoD6C,UAApD;EACD;;WAEDP,gBAAA,yBAAgB;EACd,SAAKX,GAAL,GAAW,KAAKA,GAAL,IAAYpnB,CAAC,CAAC,KAAKkD,MAAL,CAAY2iB,QAAb,CAAD,CAAwB,CAAxB,CAAvB;EACA,WAAO,KAAKuB,GAAZ;EACD;;WAEDiB,aAAA,sBAAa;EACX,QAAMjB,GAAG,GAAG,KAAKW,aAAL,EAAZ;EACA,SAAK0B,iBAAL,CAAuBzpB,CAAC,CAAConB,GAAG,CAACnZ,gBAAJ,CAAqBrJ,UAAQ,CAAC8hB,aAA9B,CAAD,CAAxB,EAAwE,KAAK8C,QAAL,EAAxE;EACAxpB,IAAAA,CAAC,CAAConB,GAAD,CAAD,CAAOhhB,WAAP,CAAsBlB,WAAS,CAACE,IAAhC,SAAwCF,WAAS,CAACG,IAAlD;EACD;;WAEDokB,oBAAA,2BAAkB9iB,QAAlB,EAA4B+iB,OAA5B,EAAqC;EACnC,QAAI,OAAOA,OAAP,KAAmB,QAAnB,KAAgCA,OAAO,CAAC3mB,QAAR,IAAoB2mB,OAAO,CAAClW,MAA5D,CAAJ,EAAyE;EACvE;EACA,UAAI,KAAKtQ,MAAL,CAAY8iB,IAAhB,EAAsB;EACpB,YAAI,CAAChmB,CAAC,CAAC0pB,OAAD,CAAD,CAAWzjB,MAAX,GAAoB/F,EAApB,CAAuByG,QAAvB,CAAL,EAAuC;EACrCA,UAAAA,QAAQ,CAACgjB,KAAT,GAAiBC,MAAjB,CAAwBF,OAAxB;EACD;EACF,OAJD,MAIO;EACL/iB,QAAAA,QAAQ,CAACwU,IAAT,CAAcnb,CAAC,CAAC0pB,OAAD,CAAD,CAAWvO,IAAX,EAAd;EACD;;EAED;EACD;;EAED,QAAI,KAAKjY,MAAL,CAAY8iB,IAAhB,EAAsB;EACpB,UAAI,KAAK9iB,MAAL,CAAYijB,QAAhB,EAA0B;EACxBuD,QAAAA,OAAO,GAAGnF,YAAY,CAACmF,OAAD,EAAU,KAAKxmB,MAAL,CAAYuhB,SAAtB,EAAiC,KAAKvhB,MAAL,CAAYwhB,UAA7C,CAAtB;EACD;;EAED/d,MAAAA,QAAQ,CAACqf,IAAT,CAAc0D,OAAd;EACD,KAND,MAMO;EACL/iB,MAAAA,QAAQ,CAACwU,IAAT,CAAcuO,OAAd;EACD;EACF;;WAEDF,WAAA,oBAAW;EACT,QAAI1D,KAAK,GAAG,KAAKpkB,OAAL,CAAaE,YAAb,CAA0B,qBAA1B,CAAZ;;EAEA,QAAI,CAACkkB,KAAL,EAAY;EACVA,MAAAA,KAAK,GAAG,OAAO,KAAK5iB,MAAL,CAAY4iB,KAAnB,KAA6B,UAA7B,GACJ,KAAK5iB,MAAL,CAAY4iB,KAAZ,CAAkBtmB,IAAlB,CAAuB,KAAKkC,OAA5B,CADI,GAEJ,KAAKwB,MAAL,CAAY4iB,KAFhB;EAGD;;EAED,WAAOA,KAAP;EACD;;;WAID7N,aAAA,sBAAa;EAAA;;EACX,QAAMlC,MAAM,GAAG,EAAf;;EAEA,QAAI,OAAO,KAAK7S,MAAL,CAAY6S,MAAnB,KAA8B,UAAlC,EAA8C;EAC5CA,MAAAA,MAAM,CAAC/U,EAAP,GAAY,UAAC4F,IAAD,EAAU;EACpBA,QAAAA,IAAI,CAACsR,OAAL,qBACKtR,IAAI,CAACsR,OADV,EAEK,MAAI,CAAChV,MAAL,CAAY6S,MAAZ,CAAmBnP,IAAI,CAACsR,OAAxB,EAAiC,MAAI,CAACxW,OAAtC,KAAkD,EAFvD;EAKA,eAAOkF,IAAP;EACD,OAPD;EAQD,KATD,MASO;EACLmP,MAAAA,MAAM,CAACA,MAAP,GAAgB,KAAK7S,MAAL,CAAY6S,MAA5B;EACD;;EAED,WAAOA,MAAP;EACD;;WAED0S,gBAAA,yBAAgB;EACd,QAAI,KAAKvlB,MAAL,CAAY+iB,SAAZ,KAA0B,KAA9B,EAAqC;EACnC,aAAO1kB,QAAQ,CAAC4V,IAAhB;EACD;;EAED,QAAIvW,IAAI,CAACkC,SAAL,CAAe,KAAKI,MAAL,CAAY+iB,SAA3B,CAAJ,EAA2C;EACzC,aAAOjmB,CAAC,CAAC,KAAKkD,MAAL,CAAY+iB,SAAb,CAAR;EACD;;EAED,WAAOjmB,CAAC,CAACuB,QAAD,CAAD,CAAY+V,IAAZ,CAAiB,KAAKpU,MAAL,CAAY+iB,SAA7B,CAAP;EACD;;WAEDsC,iBAAA,wBAAevQ,SAAf,EAA0B;EACxB,WAAOxC,eAAa,CAACwC,SAAS,CAAClU,WAAV,EAAD,CAApB;EACD;;WAEDujB,gBAAA,yBAAgB;EAAA;;EACd,QAAMwC,QAAQ,GAAG,KAAK3mB,MAAL,CAAYP,OAAZ,CAAoBH,KAApB,CAA0B,GAA1B,CAAjB;EAEAqnB,IAAAA,QAAQ,CAACzL,OAAT,CAAiB,UAACzb,OAAD,EAAa;EAC5B,UAAIA,OAAO,KAAK,OAAhB,EAAyB;EACvB3C,QAAAA,CAAC,CAAC,MAAI,CAAC0B,OAAN,CAAD,CAAgBsF,EAAhB,CACE,MAAI,CAAC6Q,WAAL,CAAiB/S,KAAjB,CAAuB0P,KADzB,EAEE,MAAI,CAACtR,MAAL,CAAYvB,QAFd,EAGE,UAAC5B,KAAD;EAAA,iBAAW,MAAI,CAAC4H,MAAL,CAAY5H,KAAZ,CAAX;EAAA,SAHF;EAKD,OAND,MAMO,IAAI4C,OAAO,KAAKikB,OAAO,CAACE,MAAxB,EAAgC;EACrC,YAAMgD,OAAO,GAAGnnB,OAAO,KAAKikB,OAAO,CAACC,KAApB,GACZ,MAAI,CAAChP,WAAL,CAAiB/S,KAAjB,CAAuB4E,UADX,GAEZ,MAAI,CAACmO,WAAL,CAAiB/S,KAAjB,CAAuByX,OAF3B;EAGA,YAAMwN,QAAQ,GAAGpnB,OAAO,KAAKikB,OAAO,CAACC,KAApB,GACb,MAAI,CAAChP,WAAL,CAAiB/S,KAAjB,CAAuB6E,UADV,GAEb,MAAI,CAACkO,WAAL,CAAiB/S,KAAjB,CAAuB0hB,QAF3B;EAIAxmB,QAAAA,CAAC,CAAC,MAAI,CAAC0B,OAAN,CAAD,CACGsF,EADH,CAEI8iB,OAFJ,EAGI,MAAI,CAAC5mB,MAAL,CAAYvB,QAHhB,EAII,UAAC5B,KAAD;EAAA,iBAAW,MAAI,CAAC8nB,MAAL,CAAY9nB,KAAZ,CAAX;EAAA,SAJJ,EAMGiH,EANH,CAOI+iB,QAPJ,EAQI,MAAI,CAAC7mB,MAAL,CAAYvB,QARhB,EASI,UAAC5B,KAAD;EAAA,iBAAW,MAAI,CAAC+nB,MAAL,CAAY/nB,KAAZ,CAAX;EAAA,SATJ;EAWD;EACF,KA3BD;EA6BAC,IAAAA,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBwE,OAAhB,CAAwB,QAAxB,EAAkCc,EAAlC,CACE,eADF,EAEE,YAAM;EACJ,UAAI,MAAI,CAACtF,OAAT,EAAkB;EAChB,QAAA,MAAI,CAAC2Q,IAAL;EACD;EACF,KANH;;EASA,QAAI,KAAKnP,MAAL,CAAYvB,QAAhB,EAA0B;EACxB,WAAKuB,MAAL,qBACK,KAAKA,MADV;EAEEP,QAAAA,OAAO,EAAE,QAFX;EAGEhB,QAAAA,QAAQ,EAAE;EAHZ;EAKD,KAND,MAMO;EACL,WAAKqoB,SAAL;EACD;EACF;;WAEDA,YAAA,qBAAY;EACV,QAAMC,SAAS,GAAG,OAAO,KAAKvoB,OAAL,CAAaE,YAAb,CAA0B,qBAA1B,CAAzB;;EAEA,QAAI,KAAKF,OAAL,CAAaE,YAAb,CAA0B,OAA1B,KAAsCqoB,SAAS,KAAK,QAAxD,EAAkE;EAChE,WAAKvoB,OAAL,CAAauG,YAAb,CACE,qBADF,EAEE,KAAKvG,OAAL,CAAaE,YAAb,CAA0B,OAA1B,KAAsC,EAFxC;EAKA,WAAKF,OAAL,CAAauG,YAAb,CAA0B,OAA1B,EAAmC,EAAnC;EACD;EACF;;WAED4f,SAAA,gBAAO9nB,KAAP,EAAc2Y,OAAd,EAAuB;EACrB,QAAM+O,OAAO,GAAG,KAAK5P,WAAL,CAAiBrT,QAAjC;EACAkU,IAAAA,OAAO,GAAGA,OAAO,IAAI1Y,CAAC,CAACD,KAAK,CAAC8T,aAAP,CAAD,CAAuBjN,IAAvB,CAA4B6gB,OAA5B,CAArB;;EAEA,QAAI,CAAC/O,OAAL,EAAc;EACZA,MAAAA,OAAO,GAAG,IAAI,KAAKb,WAAT,CACR9X,KAAK,CAAC8T,aADE,EAER,KAAK6T,kBAAL,EAFQ,CAAV;EAIA1nB,MAAAA,CAAC,CAACD,KAAK,CAAC8T,aAAP,CAAD,CAAuBjN,IAAvB,CAA4B6gB,OAA5B,EAAqC/O,OAArC;EACD;;EAED,QAAI3Y,KAAJ,EAAW;EACT2Y,MAAAA,OAAO,CAACyO,cAAR,CACEpnB,KAAK,CAACsI,IAAN,KAAe,SAAf,GAA2Bue,OAAO,CAACvf,KAAnC,GAA2Cuf,OAAO,CAACC,KADrD,IAEI,IAFJ;EAGD;;EAED,QAAI7mB,CAAC,CAAC0Y,OAAO,CAACqP,aAAR,EAAD,CAAD,CAA2B1hB,QAA3B,CAAoCnB,WAAS,CAACG,IAA9C,KAAuDqT,OAAO,CAACwO,WAAR,KAAwBb,UAAU,CAAChhB,IAA9F,EAAoG;EAClGqT,MAAAA,OAAO,CAACwO,WAAR,GAAsBb,UAAU,CAAChhB,IAAjC;EACA;EACD;;EAED2I,IAAAA,YAAY,CAAC0K,OAAO,CAACuO,QAAT,CAAZ;EAEAvO,IAAAA,OAAO,CAACwO,WAAR,GAAsBb,UAAU,CAAChhB,IAAjC;;EAEA,QAAI,CAACqT,OAAO,CAACxV,MAAR,CAAe6iB,KAAhB,IAAyB,CAACrN,OAAO,CAACxV,MAAR,CAAe6iB,KAAf,CAAqBzT,IAAnD,EAAyD;EACvDoG,MAAAA,OAAO,CAACpG,IAAR;EACA;EACD;;EAEDoG,IAAAA,OAAO,CAACuO,QAAR,GAAmBpmB,UAAU,CAAC,YAAM;EAClC,UAAI6X,OAAO,CAACwO,WAAR,KAAwBb,UAAU,CAAChhB,IAAvC,EAA6C;EAC3CqT,QAAAA,OAAO,CAACpG,IAAR;EACD;EACF,KAJ4B,EAI1BoG,OAAO,CAACxV,MAAR,CAAe6iB,KAAf,CAAqBzT,IAJK,CAA7B;EAKD;;WAEDwV,SAAA,gBAAO/nB,KAAP,EAAc2Y,OAAd,EAAuB;EACrB,QAAM+O,OAAO,GAAG,KAAK5P,WAAL,CAAiBrT,QAAjC;EACAkU,IAAAA,OAAO,GAAGA,OAAO,IAAI1Y,CAAC,CAACD,KAAK,CAAC8T,aAAP,CAAD,CAAuBjN,IAAvB,CAA4B6gB,OAA5B,CAArB;;EAEA,QAAI,CAAC/O,OAAL,EAAc;EACZA,MAAAA,OAAO,GAAG,IAAI,KAAKb,WAAT,CACR9X,KAAK,CAAC8T,aADE,EAER,KAAK6T,kBAAL,EAFQ,CAAV;EAIA1nB,MAAAA,CAAC,CAACD,KAAK,CAAC8T,aAAP,CAAD,CAAuBjN,IAAvB,CAA4B6gB,OAA5B,EAAqC/O,OAArC;EACD;;EAED,QAAI3Y,KAAJ,EAAW;EACT2Y,MAAAA,OAAO,CAACyO,cAAR,CACEpnB,KAAK,CAACsI,IAAN,KAAe,UAAf,GAA4Bue,OAAO,CAACvf,KAApC,GAA4Cuf,OAAO,CAACC,KADtD,IAEI,KAFJ;EAGD;;EAED,QAAInO,OAAO,CAACkP,oBAAR,EAAJ,EAAoC;EAClC;EACD;;EAED5Z,IAAAA,YAAY,CAAC0K,OAAO,CAACuO,QAAT,CAAZ;EAEAvO,IAAAA,OAAO,CAACwO,WAAR,GAAsBb,UAAU,CAACC,GAAjC;;EAEA,QAAI,CAAC5N,OAAO,CAACxV,MAAR,CAAe6iB,KAAhB,IAAyB,CAACrN,OAAO,CAACxV,MAAR,CAAe6iB,KAAf,CAAqB1T,IAAnD,EAAyD;EACvDqG,MAAAA,OAAO,CAACrG,IAAR;EACA;EACD;;EAEDqG,IAAAA,OAAO,CAACuO,QAAR,GAAmBpmB,UAAU,CAAC,YAAM;EAClC,UAAI6X,OAAO,CAACwO,WAAR,KAAwBb,UAAU,CAACC,GAAvC,EAA4C;EAC1C5N,QAAAA,OAAO,CAACrG,IAAR;EACD;EACF,KAJ4B,EAI1BqG,OAAO,CAACxV,MAAR,CAAe6iB,KAAf,CAAqB1T,IAJK,CAA7B;EAKD;;WAEDuV,uBAAA,gCAAuB;EACrB,SAAK,IAAMjlB,OAAX,IAAsB,KAAKwkB,cAA3B,EAA2C;EACzC,UAAI,KAAKA,cAAL,CAAoBxkB,OAApB,CAAJ,EAAkC;EAChC,eAAO,IAAP;EACD;EACF;;EAED,WAAO,KAAP;EACD;;WAED8I,aAAA,oBAAWvI,MAAX,EAAmB;EACjB,QAAMgnB,cAAc,GAAGlqB,CAAC,CAAC,KAAK0B,OAAN,CAAD,CAAgBkF,IAAhB,EAAvB;EAEAvD,IAAAA,MAAM,CAAC2hB,IAAP,CAAYkF,cAAZ,EACG9L,OADH,CACW,UAAC+L,QAAD,EAAc;EACrB,UAAIxE,qBAAqB,CAACrX,OAAtB,CAA8B6b,QAA9B,MAA4C,CAAC,CAAjD,EAAoD;EAClD,eAAOD,cAAc,CAACC,QAAD,CAArB;EACD;EACF,KALH;EAOAjnB,IAAAA,MAAM,qBACD,KAAK2U,WAAL,CAAiBnP,OADhB,EAEDwhB,cAFC,EAGD,OAAOhnB,MAAP,KAAkB,QAAlB,IAA8BA,MAA9B,GAAuCA,MAAvC,GAAgD,EAH/C,CAAN;;EAMA,QAAI,OAAOA,MAAM,CAAC6iB,KAAd,KAAwB,QAA5B,EAAsC;EACpC7iB,MAAAA,MAAM,CAAC6iB,KAAP,GAAe;EACbzT,QAAAA,IAAI,EAAEpP,MAAM,CAAC6iB,KADA;EAEb1T,QAAAA,IAAI,EAAEnP,MAAM,CAAC6iB;EAFA,OAAf;EAID;;EAED,QAAI,OAAO7iB,MAAM,CAAC4iB,KAAd,KAAwB,QAA5B,EAAsC;EACpC5iB,MAAAA,MAAM,CAAC4iB,KAAP,GAAe5iB,MAAM,CAAC4iB,KAAP,CAAavmB,QAAb,EAAf;EACD;;EAED,QAAI,OAAO2D,MAAM,CAACwmB,OAAd,KAA0B,QAA9B,EAAwC;EACtCxmB,MAAAA,MAAM,CAACwmB,OAAP,GAAiBxmB,MAAM,CAACwmB,OAAP,CAAenqB,QAAf,EAAjB;EACD;;EAEDqB,IAAAA,IAAI,CAACoC,eAAL,CACEsB,MADF,EAEEpB,MAFF,EAGE,KAAK2U,WAAL,CAAiB5O,WAHnB;;EAMA,QAAI/F,MAAM,CAACijB,QAAX,EAAqB;EACnBjjB,MAAAA,MAAM,CAAC2iB,QAAP,GAAkBtB,YAAY,CAACrhB,MAAM,CAAC2iB,QAAR,EAAkB3iB,MAAM,CAACuhB,SAAzB,EAAoCvhB,MAAM,CAACwhB,UAA3C,CAA9B;EACD;;EAED,WAAOxhB,MAAP;EACD;;WAEDwkB,qBAAA,8BAAqB;EACnB,QAAMxkB,MAAM,GAAG,EAAf;;EAEA,QAAI,KAAKA,MAAT,EAAiB;EACf,WAAK,IAAMknB,GAAX,IAAkB,KAAKlnB,MAAvB,EAA+B;EAC7B,YAAI,KAAK2U,WAAL,CAAiBnP,OAAjB,CAAyB0hB,GAAzB,MAAkC,KAAKlnB,MAAL,CAAYknB,GAAZ,CAAtC,EAAwD;EACtDlnB,UAAAA,MAAM,CAACknB,GAAD,CAAN,GAAc,KAAKlnB,MAAL,CAAYknB,GAAZ,CAAd;EACD;EACF;EACF;;EAED,WAAOlnB,MAAP;EACD;;WAEDqmB,iBAAA,0BAAiB;EACf,QAAMc,IAAI,GAAGrqB,CAAC,CAAC,KAAK+nB,aAAL,EAAD,CAAd;EACA,QAAMuC,QAAQ,GAAGD,IAAI,CAACvX,IAAL,CAAU,OAAV,EAAmBrT,KAAnB,CAAyBimB,kBAAzB,CAAjB;;EACA,QAAI4E,QAAQ,KAAK,IAAb,IAAqBA,QAAQ,CAACrd,MAAlC,EAA0C;EACxCod,MAAAA,IAAI,CAACjkB,WAAL,CAAiBkkB,QAAQ,CAACC,IAAT,CAAc,EAAd,CAAjB;EACD;EACF;;WAEDpB,+BAAA,sCAA6BqB,UAA7B,EAAyC;EACvC,QAAMC,cAAc,GAAGD,UAAU,CAACE,QAAlC;EACA,SAAKtD,GAAL,GAAWqD,cAAc,CAACE,MAA1B;;EACA,SAAKpB,cAAL;;EACA,SAAKf,kBAAL,CAAwB,KAAKD,cAAL,CAAoBiC,UAAU,CAACxS,SAA/B,CAAxB;EACD;;WAEDqR,iBAAA,0BAAiB;EACf,QAAMjC,GAAG,GAAG,KAAKW,aAAL,EAAZ;EACA,QAAM6C,mBAAmB,GAAG,KAAK1nB,MAAL,CAAY0iB,SAAxC;;EAEA,QAAIwB,GAAG,CAACxlB,YAAJ,CAAiB,aAAjB,MAAoC,IAAxC,EAA8C;EAC5C;EACD;;EAED5B,IAAAA,CAAC,CAAConB,GAAD,CAAD,CAAOhhB,WAAP,CAAmBlB,WAAS,CAACE,IAA7B;EACA,SAAKlC,MAAL,CAAY0iB,SAAZ,GAAwB,KAAxB;EACA,SAAKvT,IAAL;EACA,SAAKC,IAAL;EACA,SAAKpP,MAAL,CAAY0iB,SAAZ,GAAwBgF,mBAAxB;EACD;;;YAIMnkB,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAMgH,OAAO,GAAG,OAAOtI,MAAP,KAAkB,QAAlB,IAA8BA,MAA9C;;EAEA,UAAI,CAAC0D,IAAD,IAAS,eAAehD,IAAf,CAAoBV,MAApB,CAAb,EAA0C;EACxC;EACD;;EAED,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAImgB,OAAJ,CAAY,IAAZ,EAAkBvb,OAAlB,CAAP;EACAxL,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KAnBM,CAAP;EAoBD;;;;0BAvnBoB;EACnB,aAAOqB,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;0BAEiB;EAChB,aAAOpE,MAAP;EACD;;;0BAEqB;EACpB,aAAOE,UAAP;EACD;;;0BAEkB;EACjB,aAAOM,OAAP;EACD;;;0BAEsB;EACrB,aAAOL,WAAP;EACD;;;0BAEwB;EACvB,aAAOwE,aAAP;EACD;;;;;EAgmBH;;;;;;;EAMAjJ,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAayiB,OAAO,CAACtgB,gBAArB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB8f,OAAzB;;EACA/mB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOoiB,OAAO,CAACtgB,gBAAf;EACD,CAHD;;EC1wBA;;;;;;EAMA,IAAMnC,MAAI,GAAkB,SAA5B;EACA,IAAMC,SAAO,GAAe,OAA5B;EACA,IAAMC,UAAQ,GAAc,YAA5B;EACA,IAAMC,WAAS,SAAiBD,UAAhC;EACA,IAAMG,oBAAkB,GAAI3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA5B;EACA,IAAMmhB,cAAY,GAAU,YAA5B;EACA,IAAMC,oBAAkB,GAAI,IAAI/hB,MAAJ,aAAqB8hB,cAArB,WAAyC,GAAzC,CAA5B;;EAEA,IAAM/c,SAAO,qBACRqe,OAAO,CAACre,OADA;EAEXsP,EAAAA,SAAS,EAAG,OAFD;EAGXrV,EAAAA,OAAO,EAAK,OAHD;EAIX+mB,EAAAA,OAAO,EAAK,EAJD;EAKX7D,EAAAA,QAAQ,EAAI,yCACA,2BADA,GAEA,kCAFA,GAGA;EARD,EAAb;;EAWA,IAAM5c,aAAW,qBACZ8d,OAAO,CAAC9d,WADI;EAEfygB,EAAAA,OAAO,EAAG;EAFK,EAAjB;;EAKA,IAAMxkB,WAAS,GAAG;EAChBE,EAAAA,IAAI,EAAG,MADS;EAEhBC,EAAAA,IAAI,EAAG;EAFS,CAAlB;EAKA,IAAMT,UAAQ,GAAG;EACfimB,EAAAA,KAAK,EAAK,iBADK;EAEfC,EAAAA,OAAO,EAAG;EAFK,CAAjB;EAKA,IAAMhmB,OAAK,GAAG;EACZgM,EAAAA,IAAI,WAAgBrM,WADR;EAEZsM,EAAAA,MAAM,aAAgBtM,WAFV;EAGZY,EAAAA,IAAI,WAAgBZ,WAHR;EAIZoM,EAAAA,KAAK,YAAgBpM,WAJT;EAKZ8hB,EAAAA,QAAQ,eAAgB9hB,WALZ;EAMZ+P,EAAAA,KAAK,YAAgB/P,WANT;EAOZ8X,EAAAA,OAAO,cAAgB9X,WAPX;EAQZ+hB,EAAAA,QAAQ,eAAgB/hB,WARZ;EASZiF,EAAAA,UAAU,iBAAgBjF,WATd;EAUZkF,EAAAA,UAAU,iBAAgBlF;EAG5B;;;;;;EAbc,CAAd;;MAmBMsmB;;;;;;;;;;;EA+BJ;WAEA/C,gBAAA,yBAAgB;EACd,WAAO,KAAKwB,QAAL,MAAmB,KAAKwB,WAAL,EAA1B;EACD;;WAEDxC,qBAAA,4BAAmBF,UAAnB,EAA+B;EAC7BtoB,IAAAA,CAAC,CAAC,KAAK+nB,aAAL,EAAD,CAAD,CAAwBtY,QAAxB,CAAoCgW,cAApC,SAAoD6C,UAApD;EACD;;WAEDP,gBAAA,yBAAgB;EACd,SAAKX,GAAL,GAAW,KAAKA,GAAL,IAAYpnB,CAAC,CAAC,KAAKkD,MAAL,CAAY2iB,QAAb,CAAD,CAAwB,CAAxB,CAAvB;EACA,WAAO,KAAKuB,GAAZ;EACD;;WAEDiB,aAAA,sBAAa;EACX,QAAMgC,IAAI,GAAGrqB,CAAC,CAAC,KAAK+nB,aAAL,EAAD,CAAd,CADW;;EAIX,SAAK0B,iBAAL,CAAuBY,IAAI,CAAC/S,IAAL,CAAU1S,UAAQ,CAACimB,KAAnB,CAAvB,EAAkD,KAAKrB,QAAL,EAAlD;;EACA,QAAIE,OAAO,GAAG,KAAKsB,WAAL,EAAd;;EACA,QAAI,OAAOtB,OAAP,KAAmB,UAAvB,EAAmC;EACjCA,MAAAA,OAAO,GAAGA,OAAO,CAAClqB,IAAR,CAAa,KAAKkC,OAAlB,CAAV;EACD;;EACD,SAAK+nB,iBAAL,CAAuBY,IAAI,CAAC/S,IAAL,CAAU1S,UAAQ,CAACkmB,OAAnB,CAAvB,EAAoDpB,OAApD;EAEAW,IAAAA,IAAI,CAACjkB,WAAL,CAAoBlB,WAAS,CAACE,IAA9B,SAAsCF,WAAS,CAACG,IAAhD;EACD;;;WAID2lB,cAAA,uBAAc;EACZ,WAAO,KAAKtpB,OAAL,CAAaE,YAAb,CAA0B,cAA1B,KACL,KAAKsB,MAAL,CAAYwmB,OADd;EAED;;WAEDH,iBAAA,0BAAiB;EACf,QAAMc,IAAI,GAAGrqB,CAAC,CAAC,KAAK+nB,aAAL,EAAD,CAAd;EACA,QAAMuC,QAAQ,GAAGD,IAAI,CAACvX,IAAL,CAAU,OAAV,EAAmBrT,KAAnB,CAAyBimB,oBAAzB,CAAjB;;EACA,QAAI4E,QAAQ,KAAK,IAAb,IAAqBA,QAAQ,CAACrd,MAAT,GAAkB,CAA3C,EAA8C;EAC5Cod,MAAAA,IAAI,CAACjkB,WAAL,CAAiBkkB,QAAQ,CAACC,IAAT,CAAc,EAAd,CAAjB;EACD;EACF;;;YAIM9jB,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAMgH,OAAO,GAAG,OAAOtI,MAAP,KAAkB,QAAlB,GAA6BA,MAA7B,GAAsC,IAAtD;;EAEA,UAAI,CAAC0D,IAAD,IAAS,eAAehD,IAAf,CAAoBV,MAApB,CAAb,EAA0C;EACxC;EACD;;EAED,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAImkB,OAAJ,CAAY,IAAZ,EAAkBvf,OAAlB,CAAP;EACAxL,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KAnBM,CAAP;EAoBD;;;;EAjGD;0BAEqB;EACnB,aAAOqB,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;0BAEiB;EAChB,aAAOpE,MAAP;EACD;;;0BAEqB;EACpB,aAAOE,UAAP;EACD;;;0BAEkB;EACjB,aAAOM,OAAP;EACD;;;0BAEsB;EACrB,aAAOL,WAAP;EACD;;;0BAEwB;EACvB,aAAOwE,aAAP;EACD;;;;IA7BmB8d;EAqGtB;;;;;;;EAMA/mB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaymB,OAAO,CAACtkB,gBAArB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB8jB,OAAzB;;EACA/qB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOomB,OAAO,CAACtkB,gBAAf;EACD,CAHD;;ECzKA;;;;;;EAMA,IAAMnC,MAAI,GAAG,aAAb;EACA,IAAMC,SAAO,GAAG,OAAhB;EACA,IAAMC,UAAQ,GAAG,gBAAjB;EACA,IAAMG,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EACA,IAAM2mB,eAAe,GAAG,GAAxB;EACA,IAAM9W,aAAW,GAAI,CAArB;EAEA,IAAMrP,OAAK,GAAG;EACZ0X,EAAAA,MAAM,EAAE,QADI;EAEZnV,EAAAA,KAAK,EAAE;EAFK,CAAd;EAKA,IAAMnC,WAAS,GAAG;EAChBgmB,EAAAA,QAAQ,EAAE,UADM;EAEhBpa,EAAAA,IAAI,EAAE,SAFU;EAGhBqa,EAAAA,QAAQ,EAAE;EAHM,CAAlB;EAMA,IAAMvmB,UAAQ,GAAG;EACfwmB,EAAAA,YAAY,EAAE,2BADC;EAEfC,EAAAA,aAAa,EAAE,UAFA;EAGfC,EAAAA,gBAAgB,EAAE;EAHH,CAAjB;EAMA,IAAMC,gBAAgB,GAAG,MAAzB;;EAEA,SAASC,YAAT,CAAsBC,SAAtB,EAAiC;EAC/B,wLAE6GA,SAF7G;EAMD;EAGD;;;;;;;MAMMC;;;EACJ,uBAAYhqB,OAAZ,EAAqBwB,MAArB,EAA6B;EAC3B,SAAKqC,QAAL,GAAgB7D,OAAhB;EACA,SAAK8J,OAAL,GAAetI,MAAf;;EAEA,QAAIlD,CAAC,CAAC0B,OAAD,CAAD,CAAWxB,EAAX,CAAc,IAAd,CAAJ,EAAyB;EACvB,WAAKyrB,MAAL,GAAc3rB,CAAC,CAAC0B,OAAD,CAAf;EACD,KAFD,MAEO;EACL,WAAKiqB,MAAL,GAAc3rB,CAAC,CAAC0B,OAAD,CAAD,CAAW4V,IAAX,CAAgB,IAAhB,EAAsBC,KAAtB,EAAd;EACD;;EACD,SAAKqU,SAAL;;EACA,SAAKC,gBAAL,GAAwB,KAAKF,MAAL,CAAYrU,IAAZ,CAAiB1S,UAAQ,CAACwmB,YAA1B,CAAxB;;EACA,SAAKU,cAAL;;EACA,SAAKC,UAAL;EACD;;;;;EAQD;EAEA;WAEAH,YAAA,qBAAY;EACV,QAAIH,SAAS,GAAG,KAAKjgB,OAArB;;EAEA,QAAI,OAAOigB,SAAP,KAAqB,WAAzB,EAAsC;EACpCA,MAAAA,SAAS,GAAGF,gBAAZ;EACD,KALS;;;EAQV,SAAKI,MAAL,CAAY/B,MAAZ,CAAmB4B,YAAY,CAACC,SAAD,CAA/B;EACD;;WAEDM,aAAA,sBAAa;EACX,QAAMC,eAAe,GAAG,KAAKH,gBAA7B,CADW;;EAIX,QAAMI,QAAQ,GAAG,KAAKN,MAAL,CAAYrU,IAAZ,CAAiB1S,UAAQ,CAACymB,aAA1B,EAAyChQ,QAAzC,EAAjB,CAJW;;;EAOX,QAAI6Q,gBAAgB,GAAGlsB,CAAC,EAAxB,CAPW;;EAUX,QAAIuX,KAAK,GAAG,IAAZ,CAVW;;EAaX,SAAKsU,gBAAL,CAAsBnlB,IAAtB,CAA2B,UAAUgK,CAAV,EAAa;EACtC,UAAMyb,IAAI,GAAGnsB,CAAC,CAAC,IAAD,CAAd,CADsC;;EAItC,UAAMosB,GAAG,GAAGD,IAAI,CAAC9Q,QAAL,EAAZ;;EAEA,UAAI+Q,GAAG,CAACC,GAAJ,KAAYJ,QAAQ,CAACI,GAAzB,EAA8B;EAC5B;EACAH,QAAAA,gBAAgB,GAAGA,gBAAgB,CAAClkB,GAAjB,CAAqBmkB,IAArB,CAAnB,CAF4B;;EAK5B,YAAI5U,KAAJ,EAAW;EACT2U,UAAAA,gBAAgB,GAAGA,gBAAgB,CAAClkB,GAAjB,CAAqBgkB,eAAe,CAACM,EAAhB,CAAmB5b,CAAC,GAAG,CAAvB,CAArB,CAAnB;EACA6G,UAAAA,KAAK,GAAG,KAAR;EACD;EACF;EACF,KAhBD;;EAkBA,QAAI2U,gBAAgB,CAACjf,MAArB,EAA6B;EAC3B;EACA,UAAMsf,MAAM,GAAGL,gBAAgB,CAACM,KAAjB,EAAf,CAF2B;;EAK3BN,MAAAA,gBAAgB,CAACzc,QAAjB,CAA0BvK,WAAS,CAAC4L,IAApC;EACAob,MAAAA,gBAAgB,CAAC5U,IAAjB,CAAsB,WAAtB,EAAmCxE,IAAnC,CAAwC,UAAxC,EAAoD,CAAC,CAArD,EAN2B;;EAS3B,WAAK6Y,MAAL,CAAYrU,IAAZ,CAAiB,oBAAjB,EAAuCsS,MAAvC,CAA8C2C,MAA9C,EAT2B;;;EAY3B,WAAKZ,MAAL,CAAYrU,IAAZ,CAAiB,eAAjB,EAAkC7H,QAAlC,CAA2C,mBAA3C,EAZ2B;;;EAe3B,WAAKkc,MAAL,CAAYrU,IAAZ,CAAiB,cAAjB,EAAiCnV,GAAjC,CAAqC,UAArC,EAAiD,SAAjD,EAf2B;;;EAkB3B,UAAI,KAAKwpB,MAAL,CAAYrU,IAAZ,CAAiB,eAAjB,EAAkC+D,QAAlC,GAA6CgR,GAA7C,KAAqDJ,QAAQ,CAACI,GAAlE,EAAuE;EACrE,YAAMI,KAAK,GAAGzsB,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB+R,IAAjB,OAA0BpS,WAAS,CAAC4L,IAApC,EAA4CyG,KAA5C,GAAoDhL,IAApD,EAAd;EACA,YAAMmgB,cAAc,GAAGD,KAAK,CAACD,KAAN,EAAvB;EAEAC,QAAAA,KAAK,CAAChd,QAAN,CAAevK,WAAS,CAAC4L,IAAzB;EACA2b,QAAAA,KAAK,CAACnV,IAAN,CAAW,WAAX,EAAwBxE,IAAxB,CAA6B,UAA7B,EAAyC,CAAC,CAA1C;;EAEA,aAAK6Y,MAAL,CAAYrU,IAAZ,CAAiB,oBAAjB,EAAuCqV,OAAvC,CAA+CD,cAA/C;EACD;EACF,KA1DU;;;EA6DX,SAAKf,MAAL,CAAYrU,IAAZ,CAAiB,eAAjB,EAAkCxE,IAAlC,CAAuC,aAAvC,EAAsD,IAAtD;EACD;;WAED8Z,YAAA,qBAAY;EACV,SAAKjB,MAAL,CAAYrU,IAAZ,CAAiB,oBAAjB,EAAuCqS,KAAvC;;EACA,SAAKgC,MAAL,CAAYrU,IAAZ,CAAiB,eAAjB,EAAkClR,WAAlC,CAA8C,mBAA9C;;EACA,SAAKylB,gBAAL,CAAsBzlB,WAAtB,CAAkClB,WAAS,CAAC4L,IAA5C;;EACA,SAAK+a,gBAAL,CAAsBvU,IAAtB,CAA2B,WAA3B,EAAwCxE,IAAxC,CAA6C,UAA7C,EAAyD,CAAzD;EACD;;WAEDgZ,iBAAA,0BAAiB;EAAA;;EACf9rB,IAAAA,CAAC,CAAC+L,MAAD,CAAD,CAAU/E,EAAV,CAAalC,OAAK,CAAC0X,MAAnB,EAA2B,YAAM;EAC/B,MAAA,KAAI,CAACmP,MAAL,CAAYlc,QAAZ,CAAqBvK,WAAS,CAACimB,QAA/B;;EAEAtqB,MAAAA,UAAU,CAAC,YAAM;EACf,QAAA,KAAI,CAAC+rB,SAAL;;EACA,QAAA,KAAI,CAACb,UAAL;;EACA,QAAA,KAAI,CAACJ,MAAL,CAAYvlB,WAAZ,CAAwBlB,WAAS,CAACimB,QAAlC;EACD,OAJS,EAIPF,eAJO,CAAV;EAKD,KARD;;EAUA,SAAKU,MAAL,CAAYrU,IAAZ,CAAiB,gCAAjB,EAAmDtQ,EAAnD,CAAsD,OAAtD,EAA+D,UAACkH,CAAD,EAAO;EACpE,UAAIA,CAAC,CAACE,KAAF,KAAY+F,aAAhB,EAA6B;EAC3BnU,QAAAA,CAAC,CAACkO,CAAC,CAACjO,MAAH,CAAD,CAAY4sB,QAAZ,CAAqB,QAArB;EACD;EACF,KAJD;EAKD;;;gBAIMpmB,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EAEA,UAAI,CAACoC,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAI8kB,WAAJ,CAAgB,IAAhB,EAAsBxoB,MAAtB,CAAP;EACAlD,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,WAAlB,IAAiCA,MAArC,EAA6C;EAC3C,YAAI,OAAOA,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,gBAAM,IAAImN,SAAJ,CAAc,wCAAd,CAAN;EACD;EACF;EACF,KAbM,CAAP;EAcD;;;;0BA7HoB;EACnB,aAAO9L,SAAP;EACD;;;;;EA8HH;;;;;;;EAMAvE,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAyBonB,WAAW,CAACjlB,gBAArC;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyBykB,WAAzB;;EACA1rB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAyB,YAAM;EAC7BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAO+mB,WAAW,CAACjlB,gBAAnB;EACD,CAHD;;EC1MA;;;;;;EAMA,IAAMnC,MAAI,GAAiB,UAA3B;EACA,IAAMC,SAAO,GAAc,OAA3B;EACA,IAAMC,UAAQ,GAAa,aAA3B;EACA,IAAMC,WAAS,SAAgBD,UAA/B;EACA,IAAME,cAAY,GAAS,WAA3B;EACA,IAAMC,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EAEA,IAAMwoB,aAAa,GAAQ,GAA3B;EAGA,IAAMpkB,SAAO,GAAG;EACdqN,EAAAA,MAAM,EAAG,EADK;EAEdgX,EAAAA,MAAM,EAAG,MAFK;EAGd9sB,EAAAA,MAAM,EAAG;EAHK,CAAhB;EAMA,IAAM6E,OAAK,GAAG;EACZkoB,EAAAA,MAAM,aAAmBvoB,WADb;EAEZwoB,EAAAA,YAAY,YAAYxoB,WAFZ;EAGZyF,EAAAA,aAAa,WAAUzF,WAAV,GAAsBC;EAHvB,CAAd;EAMA,IAAMQ,WAAS,GAAG;EAChBgoB,EAAAA,UAAU,EAAM;EADA,CAAlB;EAIA,IAAMtoB,UAAQ,GAAG;EACfsoB,EAAAA,UAAU,EAAG;EAIf;;;;;;EALiB,CAAjB;;MAWMC;;;EACJ,oBAAYzrB,OAAZ,EAAqB;EACnB,SAAK6D,QAAL,GAAsB7D,OAAtB;EACA,SAAK0rB,cAAL,GAAsBrhB,MAAtB;EAEA/L,IAAAA,CAAC,CAAC+L,MAAD,CAAD,CAAU/E,EAAV,CAAalC,OAAK,CAACkoB,MAAnB,EAA2BhtB,CAAC,CAACqtB,KAAF,CAAQ,KAAKC,QAAb,EAAuB,IAAvB,CAA3B;EACAttB,IAAAA,CAAC,CAAC4E,UAAQ,CAACsoB,UAAV,CAAD,CAAuBlmB,EAAvB,CAA0BlC,OAAK,CAACmoB,YAAhC,EAA8CjtB,CAAC,CAACqtB,KAAF,CAAQ,KAAKE,UAAb,EAAyB,IAAzB,CAA9C;EACAvtB,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBkK,QAAjB,CAA0B,UAA1B;;EACA,SAAK6d,QAAL;EACD;;;;;EAcD;WAEAvnB,UAAA,mBAAU;EACR/F,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKT,QAAlB,EAA4Bf,UAA5B;EACAxE,IAAAA,CAAC,CAAC,KAAKotB,cAAN,CAAD,CAAuBjgB,GAAvB,CAA2B1I,WAA3B;EAEA,SAAKc,QAAL,GAAsB,IAAtB;EACA,SAAK6nB,cAAL,GAAsB,IAAtB;EACD;;;WAKDE,WAAA,oBAAW;EACT,QAAIttB,CAAC,CAAC,KAAKotB,cAAN,CAAD,CAAuB1O,SAAvB,KAAqC8O,MAAM,CAACxtB,CAAC,CAAC,KAAKotB,cAAN,CAAD,CAAuBxR,MAAvB,EAAD,CAA/C,EAAkF;EAChF5b,MAAAA,CAAC,CAAC4E,UAAQ,CAACsoB,UAAV,CAAD,CAAuB5a,IAAvB;EACD,KAFD,MAEO;EACLtS,MAAAA,CAAC,CAAC4E,UAAQ,CAACsoB,UAAV,CAAD,CAAuB7a,IAAvB;EACD;EACF;;WAEDob,SAAA,kBAAS;EACPztB,IAAAA,CAAC,CAAC,KAAKgS,SAAN,CAAD,CAAkBF,MAAlB,CAAyBlN,UAAQ,CAACuC,MAAlC,EAA0Cf,WAA1C,CAAsDlB,WAAS,CAACiC,MAAhE;EACD;;WAEDomB,aAAA,sBAAa;EACX,QAAI,OAAOvtB,CAAC,CAACkf,OAAT,KAAqB,UAAzB,EAAqC;EACnClf,MAAAA,CAAC,CAAC,YAAD,CAAD,CAAgBkf,OAAhB,CAAwB;EACtBR,QAAAA,SAAS,EAAE;EADW,OAAxB,EAEGoO,aAFH;EAGD,KAJD,MAIO;EACL9sB,MAAAA,CAAC,CAAC,YAAD,CAAD,CAAgB0e,SAAhB,CAA0B,CAA1B;EACD;EACF;;;aAIMjY,mBAAP,4BAA0B;EACxB,WAAO,KAAKC,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAI,CAACoC,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIumB,QAAJ,CAAa,IAAb,CAAP;EACAntB,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;EACF,KANM,CAAP;EAOD;;;;0BAtDoB;EACnB,aAAOrC,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;;;EAoDH;;;;;;;EAMA1I,CAAC,CAAC+L,MAAD,CAAD,CAAU/E,EAAV,CAAalC,OAAK,CAACoF,aAAnB,EAAkC,YAAM;EACtC,MAAMwjB,SAAS,GAAG1tB,CAAC,CAAC2tB,SAAF,CAAY3tB,CAAC,CAAC4E,UAAQ,CAACsoB,UAAV,CAAb,CAAlB;;EACA,OAAK,IAAIxc,CAAC,GAAGgd,SAAS,CAACzgB,MAAvB,EAA+ByD,CAAC,EAAhC,GAAqC;EACnC,QAAMkd,SAAS,GAAG5tB,CAAC,CAAC0tB,SAAS,CAAChd,CAAD,CAAV,CAAnB;;EACAyc,IAAAA,QAAQ,CAAC1mB,gBAAT,CAA0BjH,IAA1B,CAA+BouB,SAA/B,EAA0CA,SAAS,CAAChnB,IAAV,EAA1C;EACD;EACF,CAND;EASA;;;;;;EAMA5G,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAyB6oB,QAAQ,CAAC1mB,gBAAlC;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyBkmB,QAAzB;;EACAntB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAyB,YAAM;EAC7BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOwoB,QAAQ,CAAC1mB,gBAAhB;EACD,CAHD;;ECzIA;;;;;;EAMA,IAAMnC,MAAI,GAAiB,WAA3B;EACA,IAAMC,SAAO,GAAc,OAA3B;EACA,IAAMC,UAAQ,GAAa,cAA3B;EACA,IAAMC,WAAS,SAAgBD,UAA/B;EACA,IAAME,cAAY,GAAS,WAA3B;EACA,IAAMC,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EAEA,IAAMoE,SAAO,GAAG;EACdqN,EAAAA,MAAM,EAAG,EADK;EAEdgX,EAAAA,MAAM,EAAG,MAFK;EAGd9sB,EAAAA,MAAM,EAAG;EAHK,CAAhB;EAMA,IAAMgJ,aAAW,GAAG;EAClB8M,EAAAA,MAAM,EAAG,QADS;EAElBgX,EAAAA,MAAM,EAAG,QAFS;EAGlB9sB,EAAAA,MAAM,EAAG;EAHS,CAApB;EAMA,IAAM6E,OAAK,GAAG;EACZ+oB,EAAAA,QAAQ,eAAmBppB,WADf;EAEZuoB,EAAAA,MAAM,aAAmBvoB,WAFb;EAGZyF,EAAAA,aAAa,WAAUzF,WAAV,GAAsBC;EAHvB,CAAd;EAMA,IAAMQ,WAAS,GAAG;EAChB4oB,EAAAA,aAAa,EAAG,eADA;EAEhBC,EAAAA,aAAa,EAAG,eAFA;EAGhB5mB,EAAAA,MAAM,EAAU;EAHA,CAAlB;EAMA,IAAMvC,UAAQ,GAAG;EACfopB,EAAAA,QAAQ,EAAU,qBADH;EAEf7mB,EAAAA,MAAM,EAAY,SAFH;EAGf8mB,EAAAA,cAAc,EAAI,mBAHH;EAIfC,EAAAA,SAAS,EAAS,WAJH;EAKfC,EAAAA,SAAS,EAAS,WALH;EAMfC,EAAAA,UAAU,EAAQ,kBANH;EAOfC,EAAAA,QAAQ,EAAU,WAPH;EAQfC,EAAAA,cAAc,EAAI,gBARH;EASfC,EAAAA,eAAe,EAAG;EATH,CAAjB;EAYA,IAAMC,YAAY,GAAG;EACnBC,EAAAA,MAAM,EAAK,QADQ;EAEnBC,EAAAA,QAAQ,EAAG;EAGb;;;;;;EALqB,CAArB;;MAWMC;;;EACJ,qBAAYjtB,OAAZ,EAAqBwB,MAArB,EAA6B;EAAA;;EAC3B,SAAKqC,QAAL,GAAsB7D,OAAtB;EACA,SAAK0rB,cAAL,GAAsB1rB,OAAO,CAACyM,OAAR,KAAoB,MAApB,GAA6BpC,MAA7B,GAAsCrK,OAA5D;EACA,SAAK8J,OAAL,GAAsB,KAAKC,UAAL,CAAgBvI,MAAhB,CAAtB;EACA,SAAK8O,SAAL,GAAyB,KAAKxG,OAAL,CAAavL,MAAhB,SAA0B2E,UAAQ,CAACspB,SAAnC,UACG,KAAK1iB,OAAL,CAAavL,MADhB,SAC0B2E,UAAQ,CAACwpB,UADnC,WAEG,KAAK5iB,OAAL,CAAavL,MAFhB,SAE0B2E,UAAQ,CAAC0pB,cAFnC,CAAtB;EAGA,SAAKM,QAAL,GAAsB,EAAtB;EACA,SAAKC,QAAL,GAAsB,EAAtB;EACA,SAAKC,aAAL,GAAsB,IAAtB;EACA,SAAKC,aAAL,GAAsB,CAAtB;EAEA/uB,IAAAA,CAAC,CAAC,KAAKotB,cAAN,CAAD,CAAuBpmB,EAAvB,CAA0BlC,OAAK,CAACkoB,MAAhC,EAAwC,UAACjtB,KAAD;EAAA,aAAW,KAAI,CAACutB,QAAL,CAAcvtB,KAAd,CAAX;EAAA,KAAxC;EAEA,SAAKivB,OAAL;;EACA,SAAK1B,QAAL;EACD;;;;;EAYD;WAEA0B,UAAA,mBAAU;EAAA;;EACR,QAAMC,UAAU,GAAG,KAAK7B,cAAL,KAAwB,KAAKA,cAAL,CAAoBrhB,MAA5C,GACfyiB,YAAY,CAACC,MADE,GACOD,YAAY,CAACE,QADvC;EAGA,QAAMQ,YAAY,GAAG,KAAK1jB,OAAL,CAAauhB,MAAb,KAAwB,MAAxB,GACjBkC,UADiB,GACJ,KAAKzjB,OAAL,CAAauhB,MAD9B;EAGA,QAAMoC,UAAU,GAAGD,YAAY,KAAKV,YAAY,CAACE,QAA9B,GACf,KAAKU,aAAL,EADe,GACQ,CAD3B;EAGA,SAAKR,QAAL,GAAgB,EAAhB;EACA,SAAKC,QAAL,GAAgB,EAAhB;EAEA,SAAKE,aAAL,GAAqB,KAAKM,gBAAL,EAArB;EAEA,QAAMC,OAAO,GAAG,GAAGjhB,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0B,KAAK+D,SAA/B,CAAd,CAAhB;EAEAsd,IAAAA,OAAO,CACJC,GADH,CACO,UAAC7tB,OAAD,EAAa;EAChB,UAAIzB,MAAJ;EACA,UAAMuvB,cAAc,GAAG5uB,IAAI,CAACa,sBAAL,CAA4BC,OAA5B,CAAvB;;EAEA,UAAI8tB,cAAJ,EAAoB;EAClBvvB,QAAAA,MAAM,GAAGsB,QAAQ,CAACQ,aAAT,CAAuBytB,cAAvB,CAAT;EACD;;EAED,UAAIvvB,MAAJ,EAAY;EACV,YAAMwvB,SAAS,GAAGxvB,MAAM,CAACkT,qBAAP,EAAlB;;EACA,YAAIsc,SAAS,CAACtT,KAAV,IAAmBsT,SAAS,CAAC7T,MAAjC,EAAyC;EACvC;EACA,iBAAO,CACL5b,CAAC,CAACC,MAAD,CAAD,CAAUivB,YAAV,IAA0B7C,GAA1B,GAAgC8C,UAD3B,EAELK,cAFK,CAAP;EAID;EACF;;EACD,aAAO,IAAP;EACD,KApBH,EAqBG1d,MArBH,CAqBU,UAAC4d,IAAD;EAAA,aAAUA,IAAV;EAAA,KArBV,EAsBGC,IAtBH,CAsBQ,UAAC1N,CAAD,EAAIE,CAAJ;EAAA,aAAUF,CAAC,CAAC,CAAD,CAAD,GAAOE,CAAC,CAAC,CAAD,CAAlB;EAAA,KAtBR,EAuBG/D,OAvBH,CAuBW,UAACsR,IAAD,EAAU;EACjB,MAAA,MAAI,CAACd,QAAL,CAAc3c,IAAd,CAAmByd,IAAI,CAAC,CAAD,CAAvB;;EACA,MAAA,MAAI,CAACb,QAAL,CAAc5c,IAAd,CAAmByd,IAAI,CAAC,CAAD,CAAvB;EACD,KA1BH;EA2BD;;WAED3pB,UAAA,mBAAU;EACR/F,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKT,QAAlB,EAA4Bf,UAA5B;EACAxE,IAAAA,CAAC,CAAC,KAAKotB,cAAN,CAAD,CAAuBjgB,GAAvB,CAA2B1I,WAA3B;EAEA,SAAKc,QAAL,GAAsB,IAAtB;EACA,SAAK6nB,cAAL,GAAsB,IAAtB;EACA,SAAK5hB,OAAL,GAAsB,IAAtB;EACA,SAAKwG,SAAL,GAAsB,IAAtB;EACA,SAAK4c,QAAL,GAAsB,IAAtB;EACA,SAAKC,QAAL,GAAsB,IAAtB;EACA,SAAKC,aAAL,GAAsB,IAAtB;EACA,SAAKC,aAAL,GAAsB,IAAtB;EACD;;;WAIDtjB,aAAA,oBAAWvI,MAAX,EAAmB;EACjBA,IAAAA,MAAM,qBACDwF,SADC,EAED,OAAOxF,MAAP,KAAkB,QAAlB,IAA8BA,MAA9B,GAAuCA,MAAvC,GAAgD,EAF/C,CAAN;;EAKA,QAAI,OAAOA,MAAM,CAACjD,MAAd,KAAyB,QAA7B,EAAuC;EACrC,UAAIyR,EAAE,GAAG1R,CAAC,CAACkD,MAAM,CAACjD,MAAR,CAAD,CAAiB6S,IAAjB,CAAsB,IAAtB,CAAT;;EACA,UAAI,CAACpB,EAAL,EAAS;EACPA,QAAAA,EAAE,GAAG9Q,IAAI,CAACO,MAAL,CAAYmD,MAAZ,CAAL;EACAtE,QAAAA,CAAC,CAACkD,MAAM,CAACjD,MAAR,CAAD,CAAiB6S,IAAjB,CAAsB,IAAtB,EAA4BpB,EAA5B;EACD;;EACDxO,MAAAA,MAAM,CAACjD,MAAP,SAAoByR,EAApB;EACD;;EAED9Q,IAAAA,IAAI,CAACoC,eAAL,CAAqBsB,MAArB,EAA2BpB,MAA3B,EAAmC+F,aAAnC;EAEA,WAAO/F,MAAP;EACD;;WAEDksB,gBAAA,yBAAgB;EACd,WAAO,KAAKhC,cAAL,KAAwBrhB,MAAxB,GACH,KAAKqhB,cAAL,CAAoBwC,WADjB,GAC+B,KAAKxC,cAAL,CAAoB1O,SAD1D;EAED;;WAED2Q,mBAAA,4BAAmB;EACjB,WAAO,KAAKjC,cAAL,CAAoByC,YAApB,IAAoCxuB,IAAI,CAACyuB,GAAL,CACzCvuB,QAAQ,CAAC4V,IAAT,CAAc0Y,YAD2B,EAEzCtuB,QAAQ,CAACyC,eAAT,CAAyB6rB,YAFgB,CAA3C;EAID;;WAEDE,mBAAA,4BAAmB;EACjB,WAAO,KAAK3C,cAAL,KAAwBrhB,MAAxB,GACHA,MAAM,CAACikB,WADJ,GACkB,KAAK5C,cAAL,CAAoBja,qBAApB,GAA4CyI,MADrE;EAED;;WAED0R,WAAA,oBAAW;EACT,QAAM5O,SAAS,GAAM,KAAK0Q,aAAL,KAAuB,KAAK5jB,OAAL,CAAauK,MAAzD;;EACA,QAAM8Z,YAAY,GAAG,KAAKR,gBAAL,EAArB;;EACA,QAAMY,SAAS,GAAM,KAAKzkB,OAAL,CAAauK,MAAb,GACnB8Z,YADmB,GAEnB,KAAKE,gBAAL,EAFF;;EAIA,QAAI,KAAKhB,aAAL,KAAuBc,YAA3B,EAAyC;EACvC,WAAKb,OAAL;EACD;;EAED,QAAItQ,SAAS,IAAIuR,SAAjB,EAA4B;EAC1B,UAAMhwB,MAAM,GAAG,KAAK4uB,QAAL,CAAc,KAAKA,QAAL,CAAc5hB,MAAd,GAAuB,CAArC,CAAf;;EAEA,UAAI,KAAK6hB,aAAL,KAAuB7uB,MAA3B,EAAmC;EACjC,aAAKiwB,SAAL,CAAejwB,MAAf;EACD;;EACD;EACD;;EAED,QAAI,KAAK6uB,aAAL,IAAsBpQ,SAAS,GAAG,KAAKkQ,QAAL,CAAc,CAAd,CAAlC,IAAsD,KAAKA,QAAL,CAAc,CAAd,IAAmB,CAA7E,EAAgF;EAC9E,WAAKE,aAAL,GAAqB,IAArB;;EACA,WAAKrB,MAAL;;EACA;EACD;;EAED,QAAM0C,YAAY,GAAG,KAAKvB,QAAL,CAAc3hB,MAAnC;;EACA,SAAK,IAAIyD,CAAC,GAAGyf,YAAb,EAA2Bzf,CAAC,EAA5B,GAAiC;EAC/B,UAAM0f,cAAc,GAAG,KAAKtB,aAAL,KAAuB,KAAKD,QAAL,CAAcne,CAAd,CAAvB,IACnBgO,SAAS,IAAI,KAAKkQ,QAAL,CAAcle,CAAd,CADM,KAElB,OAAO,KAAKke,QAAL,CAAcle,CAAC,GAAG,CAAlB,CAAP,KAAgC,WAAhC,IACGgO,SAAS,GAAG,KAAKkQ,QAAL,CAAcle,CAAC,GAAG,CAAlB,CAHG,CAAvB;;EAKA,UAAI0f,cAAJ,EAAoB;EAClB,aAAKF,SAAL,CAAe,KAAKrB,QAAL,CAAcne,CAAd,CAAf;EACD;EACF;EACF;;WAEDwf,YAAA,mBAAUjwB,MAAV,EAAkB;EAChB,SAAK6uB,aAAL,GAAqB7uB,MAArB;;EAEA,SAAKwtB,MAAL;;EAEA,QAAM4C,OAAO,GAAG,KAAKre,SAAL,CACbxP,KADa,CACP,GADO,EAEb+sB,GAFa,CAET,UAAC5tB,QAAD;EAAA,aAAiBA,QAAjB,uBAA0C1B,MAA1C,YAAsD0B,QAAtD,gBAAwE1B,MAAxE;EAAA,KAFS,CAAhB;;EAIA,QAAMqwB,KAAK,GAAGtwB,CAAC,CAAC,GAAGqO,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0BoiB,OAAO,CAAC9F,IAAR,CAAa,GAAb,CAA1B,CAAd,CAAD,CAAf;;EAEA,QAAI+F,KAAK,CAACjqB,QAAN,CAAenB,WAAS,CAAC4oB,aAAzB,CAAJ,EAA6C;EAC3CwC,MAAAA,KAAK,CAACpqB,OAAN,CAActB,UAAQ,CAACypB,QAAvB,EAAiC/W,IAAjC,CAAsC1S,UAAQ,CAAC2pB,eAA/C,EAAgE9e,QAAhE,CAAyEvK,WAAS,CAACiC,MAAnF;EACAmpB,MAAAA,KAAK,CAAC7gB,QAAN,CAAevK,WAAS,CAACiC,MAAzB;EACD,KAHD,MAGO;EACL;EACAmpB,MAAAA,KAAK,CAAC7gB,QAAN,CAAevK,WAAS,CAACiC,MAAzB,EAFK;EAIL;;EACAmpB,MAAAA,KAAK,CAAChV,OAAN,CAAc1W,UAAQ,CAACqpB,cAAvB,EAAuC1hB,IAAvC,CAA+C3H,UAAQ,CAACspB,SAAxD,UAAsEtpB,UAAQ,CAACwpB,UAA/E,EAA6F3e,QAA7F,CAAsGvK,WAAS,CAACiC,MAAhH,EALK;;EAOLmpB,MAAAA,KAAK,CAAChV,OAAN,CAAc1W,UAAQ,CAACqpB,cAAvB,EAAuC1hB,IAAvC,CAA4C3H,UAAQ,CAACupB,SAArD,EAAgE3e,QAAhE,CAAyE5K,UAAQ,CAACspB,SAAlF,EAA6Fze,QAA7F,CAAsGvK,WAAS,CAACiC,MAAhH;EACD;;EAEDnH,IAAAA,CAAC,CAAC,KAAKotB,cAAN,CAAD,CAAuBzqB,OAAvB,CAA+BmC,OAAK,CAAC+oB,QAArC,EAA+C;EAC7C9e,MAAAA,aAAa,EAAE9O;EAD8B,KAA/C;EAGD;;WAEDwtB,SAAA,kBAAS;EACP,OAAGpf,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0B,KAAK+D,SAA/B,CAAd,EACGF,MADH,CACU,UAACye,IAAD;EAAA,aAAUA,IAAI,CAACzoB,SAAL,CAAeI,QAAf,CAAwBhD,WAAS,CAACiC,MAAlC,CAAV;EAAA,KADV,EAEGiX,OAFH,CAEW,UAACmS,IAAD;EAAA,aAAUA,IAAI,CAACzoB,SAAL,CAAetB,MAAf,CAAsBtB,WAAS,CAACiC,MAAhC,CAAV;EAAA,KAFX;EAGD;;;cAIMV,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAIE,IAAI,GAAG5G,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,CAAX;;EACA,UAAMgH,OAAO,GAAG,OAAOtI,MAAP,KAAkB,QAAlB,IAA8BA,MAA9C;;EAEA,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAI+nB,SAAJ,CAAc,IAAd,EAAoBnjB,OAApB,CAAP;EACAxL,QAAAA,CAAC,CAAC,IAAD,CAAD,CAAQ4G,IAAR,CAAapC,UAAb,EAAuBoC,IAAvB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KAfM,CAAP;EAgBD;;;;0BA1MoB;EACnB,aAAOqB,SAAP;EACD;;;0BAEoB;EACnB,aAAOmE,SAAP;EACD;;;;;EAuMH;;;;;;;EAMA1I,CAAC,CAAC+L,MAAD,CAAD,CAAU/E,EAAV,CAAalC,OAAK,CAACoF,aAAnB,EAAkC,YAAM;EACtC,MAAMsmB,UAAU,GAAG,GAAGniB,KAAH,CAAS7O,IAAT,CAAc+B,QAAQ,CAAC0M,gBAAT,CAA0BrJ,UAAQ,CAACopB,QAAnC,CAAd,CAAnB;EACA,MAAMyC,gBAAgB,GAAGD,UAAU,CAACvjB,MAApC;;EAEA,OAAK,IAAIyD,CAAC,GAAG+f,gBAAb,EAA+B/f,CAAC,EAAhC,GAAqC;EACnC,QAAMggB,IAAI,GAAG1wB,CAAC,CAACwwB,UAAU,CAAC9f,CAAD,CAAX,CAAd;;EACAie,IAAAA,SAAS,CAACloB,gBAAV,CAA2BjH,IAA3B,CAAgCkxB,IAAhC,EAAsCA,IAAI,CAAC9pB,IAAL,EAAtC;EACD;EACF,CARD;EAUA;;;;;;EAMA5G,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaqqB,SAAS,CAACloB,gBAAvB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB0nB,SAAzB;;EACA3uB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOgqB,SAAS,CAACloB,gBAAjB;EACD,CAHD;;ECtTA;;;;;;EAMA,IAAMnC,MAAI,GAAiB,KAA3B;EACA,IAAMC,SAAO,GAAc,OAA3B;EACA,IAAMC,UAAQ,GAAa,QAA3B;EACA,IAAMC,WAAS,SAAgBD,UAA/B;EACA,IAAME,cAAY,GAAS,WAA3B;EACA,IAAMC,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;;EAEA,IAAMgE,oBAAkB,GAAI,EAA5B;;EACA,IAAM8L,kBAAgB,GAAM,EAA5B;;EACA,IAAM7L,qBAAmB,GAAG,EAA5B;;EACA,IAAM8L,oBAAkB,GAAI,EAA5B;;EACA,IAAME,gBAAc,GAAa,IAAI5Q,MAAJ,CAAc2E,oBAAd,SAAoC8L,kBAApC,SAAwD7L,qBAAxD,SAA+E8L,oBAA/E,CAAjC;;EAGA,IAAMvP,OAAK,GAAG;EACZgM,EAAAA,IAAI,WAAoBrM,WADZ;EAEZsM,EAAAA,MAAM,aAAoBtM,WAFd;EAGZY,EAAAA,IAAI,WAAoBZ,WAHZ;EAIZoM,EAAAA,KAAK,YAAoBpM,WAJb;EAKZQ,EAAAA,cAAc,YAAWR,WAAX,GAAuBC,cALzB;EAMZ+P,EAAAA,gBAAgB,cAAahQ,WAAb,GAAyBC,cAN7B;;EAAA,CAAd;EASA,IAAMQ,WAAS,GAAG;EAChB6oB,EAAAA,aAAa,EAAG,eADA;EAEhB5mB,EAAAA,MAAM,EAAU,QAFA;EAGhBwN,EAAAA,QAAQ,EAAQ,UAHA;EAIhBvP,EAAAA,IAAI,EAAY,MAJA;EAKhBC,EAAAA,IAAI,EAAY;EALA,CAAlB;EAQA,IAAMT,UAAQ,GAAG;EACfypB,EAAAA,QAAQ,EAAgB,WADT;EAEfJ,EAAAA,cAAc,EAAU,mBAFT;EAGf9mB,EAAAA,MAAM,EAAkB,SAHT;EAIfwpB,EAAAA,SAAS,EAAe,gBAJT;EAKfppB,EAAAA,WAAW,EAAa,iEALT;EAMfgnB,EAAAA,eAAe,EAAS,kBANT;EAOfqC,EAAAA,qBAAqB,EAAG;EAG1B;;;;;;EAViB,CAAjB;;MAgBMC;;;EACJ,eAAYnvB,OAAZ,EAAqB;EACnB,SAAK6D,QAAL,GAAgB7D,OAAhB;;EACA,SAAKgV,iBAAL,GAFmB;;EAGpB;;;;;EAQD;WAEApE,OAAA,gBAAO;EAAA;;EACL,QAAI,KAAK/M,QAAL,CAAclB,UAAd,IACA,KAAKkB,QAAL,CAAclB,UAAd,CAAyBtB,QAAzB,KAAsCub,IAAI,CAACC,YAD3C,IAEAve,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACiC,MAApC,CAFA,IAGAnH,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBc,QAAjB,CAA0BnB,WAAS,CAACyP,QAApC,CAHJ,EAGmD;EACjD;EACD;;EAED,QAAI1U,MAAJ;EACA,QAAI6wB,QAAJ;EACA,QAAMC,WAAW,GAAG/wB,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBW,OAAjB,CAAyBtB,UAAQ,CAACqpB,cAAlC,EAAkD,CAAlD,CAApB;EACA,QAAMtsB,QAAQ,GAAGf,IAAI,CAACa,sBAAL,CAA4B,KAAK8D,QAAjC,CAAjB;;EAEA,QAAIwrB,WAAJ,EAAiB;EACf,UAAMC,YAAY,GAAGD,WAAW,CAAC7M,QAAZ,KAAyB,IAAzB,IAAiC6M,WAAW,CAAC7M,QAAZ,KAAyB,IAA1D,GAAiEtf,UAAQ,CAAC+rB,SAA1E,GAAsF/rB,UAAQ,CAACuC,MAApH;EACA2pB,MAAAA,QAAQ,GAAG9wB,CAAC,CAAC2tB,SAAF,CAAY3tB,CAAC,CAAC+wB,WAAD,CAAD,CAAezZ,IAAf,CAAoB0Z,YAApB,CAAZ,CAAX;EACAF,MAAAA,QAAQ,GAAGA,QAAQ,CAACA,QAAQ,CAAC7jB,MAAT,GAAkB,CAAnB,CAAnB;EACD;;EAED,QAAMuK,SAAS,GAAGxX,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACgM,IAAd,EAAoB;EACpC/B,MAAAA,aAAa,EAAE,KAAKxJ;EADgB,KAApB,CAAlB;EAIA,QAAMwR,SAAS,GAAG/W,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACO,IAAd,EAAoB;EACpC0J,MAAAA,aAAa,EAAE+hB;EADqB,KAApB,CAAlB;;EAIA,QAAIA,QAAJ,EAAc;EACZ9wB,MAAAA,CAAC,CAAC8wB,QAAD,CAAD,CAAYnuB,OAAZ,CAAoB6U,SAApB;EACD;;EAEDxX,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBoU,SAAzB;;EAEA,QAAIA,SAAS,CAAClR,kBAAV,MACA2R,SAAS,CAAC3R,kBAAV,EADJ,EACoC;EAClC;EACD;;EAED,QAAIlE,QAAJ,EAAc;EACZ1B,MAAAA,MAAM,GAAGsB,QAAQ,CAACQ,aAAT,CAAuBJ,QAAvB,CAAT;EACD;;EAED,SAAKuuB,SAAL,CACE,KAAK3qB,QADP,EAEEwrB,WAFF;;EAKA,QAAM/d,QAAQ,GAAG,SAAXA,QAAW,GAAM;EACrB,UAAMie,WAAW,GAAGjxB,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAACiM,MAAd,EAAsB;EACxChC,QAAAA,aAAa,EAAE,KAAI,CAACxJ;EADoB,OAAtB,CAApB;EAIA,UAAMqZ,UAAU,GAAG5e,CAAC,CAAC8E,KAAF,CAAQA,OAAK,CAAC+L,KAAd,EAAqB;EACtC9B,QAAAA,aAAa,EAAE+hB;EADuB,OAArB,CAAnB;EAIA9wB,MAAAA,CAAC,CAAC8wB,QAAD,CAAD,CAAYnuB,OAAZ,CAAoBsuB,WAApB;EACAjxB,MAAAA,CAAC,CAAC,KAAI,CAACuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBic,UAAzB;EACD,KAXD;;EAaA,QAAI3e,MAAJ,EAAY;EACV,WAAKiwB,SAAL,CAAejwB,MAAf,EAAuBA,MAAM,CAACoE,UAA9B,EAA0C2O,QAA1C;EACD,KAFD,MAEO;EACLA,MAAAA,QAAQ;EACT;EACF;;WAEDjN,UAAA,mBAAU;EACR/F,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKT,QAAlB,EAA4Bf,UAA5B;EACA,SAAKe,QAAL,GAAgB,IAAhB;EACD;;;WAID2qB,YAAA,mBAAUxuB,OAAV,EAAmBukB,SAAnB,EAA8BhH,QAA9B,EAAwC;EAAA;;EACtC,QAAMiS,cAAc,GAAGjL,SAAS,KAAKA,SAAS,CAAC/B,QAAV,KAAuB,IAAvB,IAA+B+B,SAAS,CAAC/B,QAAV,KAAuB,IAA3D,CAAT,GACnBlkB,CAAC,CAACimB,SAAD,CAAD,CAAa3O,IAAb,CAAkB1S,UAAQ,CAAC+rB,SAA3B,CADmB,GAEnB3wB,CAAC,CAACimB,SAAD,CAAD,CAAazW,QAAb,CAAsB5K,UAAQ,CAACuC,MAA/B,CAFJ;EAIA,QAAMgqB,MAAM,GAAGD,cAAc,CAAC,CAAD,CAA7B;EACA,QAAM5d,eAAe,GAAG2L,QAAQ,IAAKkS,MAAM,IAAInxB,CAAC,CAACmxB,MAAD,CAAD,CAAU9qB,QAAV,CAAmBnB,WAAS,CAACE,IAA7B,CAA/C;;EACA,QAAM4N,QAAQ,GAAG,SAAXA,QAAW;EAAA,aAAM,MAAI,CAACoe,mBAAL,CACrB1vB,OADqB,EAErByvB,MAFqB,EAGrBlS,QAHqB,CAAN;EAAA,KAAjB,CAPsC;;;EActCjf,IAAAA,CAAC,CAACimB,SAAD,CAAD,CAAa3O,IAAb,CAAkB,iCAAlB,EAAqDxE,IAArD,CAA0D;EACxDue,MAAAA,QAAQ,EAAG,IAD6C;EAExD,uBAAkB;EAFsC,KAA1D;EAIArxB,IAAAA,CAAC,CAACimB,SAAD,CAAD,CAAa3O,IAAb,CAAkB,WAAlB,EAA+BxE,IAA/B,CAAoC;EAClC,qBAAgB,IADkB;EAElCue,MAAAA,QAAQ,EAAG;EAFuB,KAApC,EAlBsC;;EAwBtC,QAAIF,MAAM,IAAI7d,eAAd,EAA+B;EAC7B,UAAMpR,kBAAkB,GAAGtB,IAAI,CAACqB,gCAAL,CAAsCkvB,MAAtC,CAA3B;EAEAnxB,MAAAA,CAAC,CAACmxB,MAAD,CAAD,CACG/qB,WADH,CACelB,WAAS,CAACG,IADzB,EAEG1E,GAFH,CAEOC,IAAI,CAAC1B,cAFZ,EAE4B8T,QAF5B,EAGG/R,oBAHH,CAGwBiB,kBAHxB;EAID,KAPD,MAOO;EACL8Q,MAAAA,QAAQ;EACT;EACF;;WAEDoe,sBAAA,6BAAoB1vB,OAApB,EAA6ByvB,MAA7B,EAAqClS,QAArC,EAA+C;EAC7C,QAAIkS,MAAJ,EAAY;EACVnxB,MAAAA,CAAC,CAACmxB,MAAD,CAAD,CAAU/qB,WAAV,CAAsBlB,WAAS,CAACiC,MAAhC;EAEA,UAAMmqB,aAAa,GAAGtxB,CAAC,CAACmxB,MAAM,CAAC9sB,UAAR,CAAD,CAAqBiT,IAArB,CACpB1S,UAAQ,CAACgsB,qBADW,EAEpB,CAFoB,CAAtB;;EAIA,UAAIU,aAAJ,EAAmB;EACjBtxB,QAAAA,CAAC,CAACsxB,aAAD,CAAD,CAAiBlrB,WAAjB,CAA6BlB,WAAS,CAACiC,MAAvC;EACD;;EAED,UAAIgqB,MAAM,CAACvvB,YAAP,CAAoB,MAApB,MAAgC,KAApC,EAA2C;EACzCuvB,QAAAA,MAAM,CAAClpB,YAAP,CAAoB,eAApB,EAAqC,KAArC;EACD;EACF;;EAEDjI,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAW+N,QAAX,CAAoBvK,WAAS,CAACiC,MAA9B;;EACA,QAAIzF,OAAO,CAACE,YAAR,CAAqB,MAArB,MAAiC,KAArC,EAA4C;EAC1CF,MAAAA,OAAO,CAACuG,YAAR,CAAqB,eAArB,EAAsC,IAAtC;EACD,KApB4C;;;EAsB7CjI,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAWoQ,MAAX,CAAkB,wCAAlB,EAA4DgB,IAA5D,CAAiE;EAC/Due,MAAAA,QAAQ,EAAG,GADoD;EAE/D,uBAAkB;EAF6C,KAAjE;EAIArxB,IAAAA,CAAC,CAAC0B,OAAD,CAAD,CAAWoQ,MAAX,CAAkB,kBAAlB,EAAsCgB,IAAtC,CAA2C;EACzC,qBAAgB,KADyB;EAEzCue,MAAAA,QAAQ,EAAG;EAF8B,KAA3C,EA1B6C;;EAgC7CzwB,IAAAA,IAAI,CAAC6B,MAAL,CAAYf,OAAZ;;EAEA,QAAIA,OAAO,CAACoG,SAAR,CAAkBI,QAAlB,CAA2BhD,WAAS,CAACE,IAArC,CAAJ,EAAgD;EAC9C1D,MAAAA,OAAO,CAACoG,SAAR,CAAkBE,GAAlB,CAAsB9C,WAAS,CAACG,IAAhC;EACD;;EAED,QAAI3D,OAAO,CAAC2C,UAAR,IAAsBrE,CAAC,CAAC0B,OAAO,CAAC2C,UAAT,CAAD,CAAsBgC,QAAtB,CAA+BnB,WAAS,CAAC6oB,aAAzC,CAA1B,EAAmF;EACjF,UAAMwD,eAAe,GAAGvxB,CAAC,CAAC0B,OAAD,CAAD,CAAWwE,OAAX,CAAmBtB,UAAQ,CAACypB,QAA5B,EAAsC,CAAtC,CAAxB;;EAEA,UAAIkD,eAAJ,EAAqB;EACnB,YAAMC,kBAAkB,GAAG,GAAGnjB,KAAH,CAAS7O,IAAT,CAAc+xB,eAAe,CAACtjB,gBAAhB,CAAiCrJ,UAAQ,CAAC2pB,eAA1C,CAAd,CAA3B;EAEAvuB,QAAAA,CAAC,CAACwxB,kBAAD,CAAD,CAAsB/hB,QAAtB,CAA+BvK,WAAS,CAACiC,MAAzC;EACD;;EAEDzF,MAAAA,OAAO,CAACuG,YAAR,CAAqB,eAArB,EAAsC,IAAtC;EACD;;EAED,QAAIgX,QAAJ,EAAc;EACZA,MAAAA,QAAQ;EACT;EACF;;;WAGDvI,oBAAA,6BAAoB;EAClB,QAAMkL,IAAI,GAAG5hB,CAAC,CAAC,KAAKuF,QAAN,CAAd;EACA,QAAMsc,SAAS,GAAG7hB,CAAC,CAAC4hB,IAAI,CAAC9O,IAAL,CAAU,MAAV,CAAD,CAAnB;EACA,QAAM2e,QAAQ,GAAG7P,IAAI,CAAC1b,OAAL,CAAatB,UAAQ,CAACqpB,cAAtB,CAAjB;EACA,QAAMyD,KAAK,GAAG9P,IAAI,CAAC9O,IAAL,CAAU,IAAV,KAAmBlS,IAAI,CAACO,MAAL,CAAYmD,MAAZ,CAAjC;EAEAsd,IAAAA,IAAI,CAAC9O,IAAL,CAAU,IAAV,EAAgB4e,KAAhB;;EAEA,QAAI7P,SAAJ,EAAe;EACbD,MAAAA,IAAI,CAAC9O,IAAL,CAAU,MAAV,EAAkB,KAAlB;EACA2e,MAAAA,QAAQ,CAAC3e,IAAT,CAAc,MAAd,EAAsB,SAAtB,EAFa;EAId;;EAED,QAAI8O,IAAI,CAACvb,QAAL,CAAcnB,WAAS,CAACiC,MAAxB,CAAJ,EAAqC;EACnCya,MAAAA,IAAI,CAAC9O,IAAL,CAAU;EACRue,QAAAA,QAAQ,EAAG,GADH;EAER,yBAAkB;EAFV,OAAV;;EAKA,UAAIzP,IAAI,CAAC9O,IAAL,CAAU,MAAV,CAAJ,EAAuB;EACrB8O,QAAAA,IAAI,CAAC9O,IAAL,CAAU,eAAV,EAA2B8O,IAAI,CAAC9O,IAAL,CAAU,MAAV,EAAkB6e,MAAlB,CAAyB,CAAzB,CAA3B;EACD;;EAED9P,MAAAA,SAAS,CAAC/O,IAAV,CAAe;EACbsI,QAAAA,IAAI,EAAG,UADM;EAEbiW,QAAAA,QAAQ,EAAG,GAFE;EAGb,uBAAgB,OAHH;EAIb,2BAAmBK;EAJN,OAAf;EAMD,KAhBD,MAgBO;EACL9P,MAAAA,IAAI,CAAC9O,IAAL,CAAU;EACRue,QAAAA,QAAQ,EAAG,IADH;EAER,yBAAkB;EAFV,OAAV;;EAKA,UAAIzP,IAAI,CAAC9O,IAAL,CAAU,MAAV,CAAJ,EAAuB;EACrB8O,QAAAA,IAAI,CAAC9O,IAAL,CAAU,eAAV,EAA2B8O,IAAI,CAAC9O,IAAL,CAAU,MAAV,EAAkB6e,MAAlB,CAAyB,CAAzB,CAA3B;EACD;;EAED9P,MAAAA,SAAS,CAAC/O,IAAV,CAAe;EACbsI,QAAAA,IAAI,EAAG,UADM;EAEbiW,QAAAA,QAAQ,EAAG,IAFE;EAGb,uBAAgB,MAHH;EAIb,2BAAmBK;EAJN,OAAf;EAMD;EACF;EAGD;EAEA;;;QACO7Y,yBAAP,gCAA8B3K,CAA9B,EAAiC;EAC/B,QAAM0F,KAAK,GAAG5T,CAAC,CAAC,IAAD,CAAf;EACA,QAAM4xB,KAAK,GAAGhe,KAAK,CAAC1N,OAAN,CAAc,mBAAd,EAAmCoR,IAAnC,CAAwC,oBAAxC,CAAd;EACA,QAAMua,CAAC,GAAG3jB,CAAC,CAACE,KAAF,IAAWF,CAAC,CAAC4jB,OAAvB;EAEA,QAAIhlB,KAAK,GAAG,CAAZ;EAEAA,IAAAA,KAAK,GAAG8kB,KAAK,CAAC9kB,KAAN,CAAY8kB,KAAK,CAAC9f,MAAN,CAAa,QAAb,CAAZ,CAAR;;EAEA,QAAI+f,CAAC,KAAKzd,kBAAN,IAA0Byd,CAAC,KAAKvpB,oBAApC,EAAwD;EACtDwE,MAAAA,KAAK;EACN,KAX8B;;;EAY/B,QAAI+kB,CAAC,KAAKtpB,qBAAN,IAA6BspB,CAAC,KAAKxd,oBAAvC,EAA2D;EACzDvH,MAAAA,KAAK;EACN,KAd8B;;;EAgB/B,QAAIA,KAAK,GAAG,CAAZ,EAAe;EACbA,MAAAA,KAAK,GAAG8kB,KAAK,CAAC3kB,MAAN,GAAe,CAAvB;EACD;;EACD,QAAIH,KAAK,KAAK8kB,KAAK,CAAC3kB,MAApB,EAA4B;EAC1BH,MAAAA,KAAK,GAAG,CAAR;EACD;;EACD,QAAMilB,OAAO,GAAGH,KAAK,CAACtF,EAAN,CAASxf,KAAT,CAAhB;;EAEA,QAAIilB,OAAO,CAACjf,IAAR,CAAa,MAAb,MAAyB,KAA7B,EAAoC;EAClCif,MAAAA,OAAO,CAACC,GAAR,CAAY,MAAZ,EAAoBrvB,OAApB,CAA4B,OAA5B;EACD;;EAEDuL,IAAAA,CAAC,CAACnH,cAAF;EACAmH,IAAAA,CAAC,CAAC0J,eAAF;EACD;;;QAGMnR,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAMkN,KAAK,GAAG5T,CAAC,CAAC,IAAD,CAAf;EACA,UAAI4G,IAAI,GAAGgN,KAAK,CAAChN,IAAN,CAAWpC,UAAX,CAAX;;EAEA,UAAI,CAACoC,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIiqB,GAAJ,CAAQ,IAAR,CAAP;EACAjd,QAAAA,KAAK,CAAChN,IAAN,CAAWpC,UAAX,EAAqBoC,IAArB;EACD,OAP0B;;;EAU3B,UAAI,OAAOhD,IAAP,CAAYV,MAAZ,CAAJ,EAAyB;EACvB;EACD,OAZ0B;;;EAe3B,UAAI,OAAOA,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EACD0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ;EACD;EACF,KArBM,CAAP;EAsBD;;;;0BAzRoB;EACnB,aAAOqB,SAAP;EACD;;;;;EA0RH;;;;;;;EAMAvE,CAAC,CAACuB,QAAD,CAAD,CACGyF,EADH,CACMlC,OAAK,CAACG,cADZ,EAC4BL,UAAQ,CAAC2C,WADrC,EACkD,UAAUxH,KAAV,EAAiB;EAC/DA,EAAAA,KAAK,CAACgH,cAAN;;EACA8pB,EAAAA,GAAG,CAACpqB,gBAAJ,CAAqBjH,IAArB,CAA0BQ,CAAC,CAAC,IAAD,CAA3B,EAAmC,MAAnC;EACD,CAJH;EAAA,CAMGgH,EANH,CAMMlC,OAAK,CAAC2P,gBANZ,EAM8B7P,UAAQ,CAAC2C,WANvC,EAMoD,UAAUxH,KAAV,EAAiB;EACjE,MAAI,CAACwU,gBAAc,CAAC3Q,IAAf,CAAoB7D,KAAK,CAACqO,KAA1B,CAAL,EAAuC;EACrC;EACD;;EACDrO,EAAAA,KAAK,CAACgH,cAAN;;EACA8pB,EAAAA,GAAG,CAAChY,sBAAJ,CAA2BrZ,IAA3B,CAAgCQ,CAAC,CAAC,IAAD,CAAjC,EAAyCD,KAAzC;EACD,CAZH,EAaGiH,EAbH,CAaM,kBAbN,EAa0B,YAAM;EAC5B6pB,EAAAA,GAAG,CAACpqB,gBAAJ,CAAqBjH,IAArB,CAA0BQ,CAAC,CAAC4E,UAAQ,CAAC2C,WAAV,CAA3B,EAAmD,MAAnD;EACD,CAfH;;EAiBA;;;;;;EAMAvH,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAausB,GAAG,CAACpqB,gBAAjB;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyB4pB,GAAzB;;EACA7wB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAwB,YAAM;EAC5BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOksB,GAAG,CAACpqB,gBAAX;EACD,CAHD;;ECxXA;;;;;;EAMA,IAAMnC,MAAI,GAAiB,OAA3B;EACA,IAAMC,SAAO,GAAc,OAA3B;EACA,IAAMC,UAAQ,GAAa,UAA3B;EACA,IAAMC,WAAS,SAAgBD,UAA/B;EACA,IAAMG,oBAAkB,GAAG3E,CAAC,CAACgB,EAAF,CAAKsD,MAAL,CAA3B;EAEA,IAAMQ,OAAK,GAAG;EACZ2X,EAAAA,aAAa,oBAAmBhY,WADpB;EAEZqM,EAAAA,IAAI,WAAmBrM,WAFX;EAGZsM,EAAAA,MAAM,aAAmBtM,WAHb;EAIZY,EAAAA,IAAI,WAAmBZ,WAJX;EAKZoM,EAAAA,KAAK,YAAmBpM;EALZ,CAAd;EAQA,IAAMS,WAAS,GAAG;EAChBE,EAAAA,IAAI,EAAM,MADM;EAEhB0L,EAAAA,IAAI,EAAM,MAFM;EAGhBzL,EAAAA,IAAI,EAAM,MAHM;EAIhB4sB,EAAAA,OAAO,EAAG;EAJM,CAAlB;EAOA,IAAMhpB,aAAW,GAAG;EAClB2c,EAAAA,SAAS,EAAG,SADM;EAElBsM,EAAAA,QAAQ,EAAI,SAFM;EAGlBnM,EAAAA,KAAK,EAAO;EAHM,CAApB;EAMA,IAAMrd,SAAO,GAAG;EACdkd,EAAAA,SAAS,EAAG,IADE;EAEdsM,EAAAA,QAAQ,EAAI,IAFE;EAGdnM,EAAAA,KAAK,EAAO;EAHE,CAAhB;EAMA,IAAMnhB,UAAQ,GAAG;EACfuY,EAAAA,YAAY,EAAG;EAGjB;;;;;;EAJiB,CAAjB;;MAUMgV;;;EACJ,iBAAYzwB,OAAZ,EAAqBwB,MAArB,EAA6B;EAC3B,SAAKqC,QAAL,GAAgB7D,OAAhB;EACA,SAAK8J,OAAL,GAAgB,KAAKC,UAAL,CAAgBvI,MAAhB,CAAhB;EACA,SAAK+jB,QAAL,GAAgB,IAAhB;;EACA,SAAKI,aAAL;EACD;;;;;EAgBD;WAEA/U,OAAA,gBAAO;EAAA;;EACLtS,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBmC,OAAK,CAACO,IAA/B;;EAEA,QAAI,KAAKmG,OAAL,CAAaoa,SAAjB,EAA4B;EAC1B,WAAKrgB,QAAL,CAAcuC,SAAd,CAAwBE,GAAxB,CAA4B9C,WAAS,CAACE,IAAtC;EACD;;EAED,QAAM4N,QAAQ,GAAG,SAAXA,QAAW,GAAM;EACrB,MAAA,KAAI,CAACzN,QAAL,CAAcuC,SAAd,CAAwBtB,MAAxB,CAA+BtB,WAAS,CAAC+sB,OAAzC;;EACA,MAAA,KAAI,CAAC1sB,QAAL,CAAcuC,SAAd,CAAwBE,GAAxB,CAA4B9C,WAAS,CAACG,IAAtC;;EAEArF,MAAAA,CAAC,CAAC,KAAI,CAACuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBmC,OAAK,CAAC+L,KAA/B;;EAEA,UAAI,KAAI,CAACrF,OAAL,CAAa0mB,QAAjB,EAA2B;EACzB,QAAA,KAAI,CAAC7f,IAAL;EACD;EACF,KATD;;EAWA,SAAK9M,QAAL,CAAcuC,SAAd,CAAwBtB,MAAxB,CAA+BtB,WAAS,CAAC4L,IAAzC;;EACA,SAAKvL,QAAL,CAAcuC,SAAd,CAAwBE,GAAxB,CAA4B9C,WAAS,CAAC+sB,OAAtC;;EACA,QAAI,KAAKzmB,OAAL,CAAaoa,SAAjB,EAA4B;EAC1B,UAAM1jB,kBAAkB,GAAGtB,IAAI,CAACqB,gCAAL,CAAsC,KAAKsD,QAA3C,CAA3B;EAEAvF,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CACG5E,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B8T,QAD5B,EAEG/R,oBAFH,CAEwBiB,kBAFxB;EAGD,KAND,MAMO;EACL8Q,MAAAA,QAAQ;EACT;EACF;;WAEDX,OAAA,cAAK+f,cAAL,EAAqB;EAAA;;EACnB,QAAI,CAAC,KAAK7sB,QAAL,CAAcuC,SAAd,CAAwBI,QAAxB,CAAiChD,WAAS,CAACG,IAA3C,CAAL,EAAuD;EACrD;EACD;;EAEDrF,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBmC,OAAK,CAACgM,IAA/B;;EAEA,QAAIshB,cAAJ,EAAoB;EAClB,WAAKC,MAAL;EACD,KAFD,MAEO;EACL,WAAKpL,QAAL,GAAgBpmB,UAAU,CAAC,YAAM;EAC/B,QAAA,MAAI,CAACwxB,MAAL;EACD,OAFyB,EAEvB,KAAK7mB,OAAL,CAAaua,KAFU,CAA1B;EAGD;EACF;;WAEDhgB,UAAA,mBAAU;EACRiI,IAAAA,YAAY,CAAC,KAAKiZ,QAAN,CAAZ;EACA,SAAKA,QAAL,GAAgB,IAAhB;;EAEA,QAAI,KAAK1hB,QAAL,CAAcuC,SAAd,CAAwBI,QAAxB,CAAiChD,WAAS,CAACG,IAA3C,CAAJ,EAAsD;EACpD,WAAKE,QAAL,CAAcuC,SAAd,CAAwBtB,MAAxB,CAA+BtB,WAAS,CAACG,IAAzC;EACD;;EAEDrF,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiB4H,GAAjB,CAAqBrI,OAAK,CAAC2X,aAA3B;EAEAzc,IAAAA,CAAC,CAACgG,UAAF,CAAa,KAAKT,QAAlB,EAA4Bf,UAA5B;EACA,SAAKe,QAAL,GAAgB,IAAhB;EACA,SAAKiG,OAAL,GAAgB,IAAhB;EACD;;;WAIDC,aAAA,oBAAWvI,MAAX,EAAmB;EACjBA,IAAAA,MAAM,qBACDwF,SADC,EAED1I,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiBqB,IAAjB,EAFC,EAGD,OAAO1D,MAAP,KAAkB,QAAlB,IAA8BA,MAA9B,GAAuCA,MAAvC,GAAgD,EAH/C,CAAN;EAMAtC,IAAAA,IAAI,CAACoC,eAAL,CACEsB,MADF,EAEEpB,MAFF,EAGE,KAAK2U,WAAL,CAAiB5O,WAHnB;EAMA,WAAO/F,MAAP;EACD;;WAEDmkB,gBAAA,yBAAgB;EAAA;;EACdrnB,IAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CAAiByB,EAAjB,CACElC,OAAK,CAAC2X,aADR,EAEE7X,UAAQ,CAACuY,YAFX,EAGE;EAAA,aAAM,MAAI,CAAC9K,IAAL,CAAU,IAAV,CAAN;EAAA,KAHF;EAKD;;WAEDggB,SAAA,kBAAS;EAAA;;EACP,QAAMrf,QAAQ,GAAG,SAAXA,QAAW,GAAM;EACrB,MAAA,MAAI,CAACzN,QAAL,CAAcuC,SAAd,CAAwBE,GAAxB,CAA4B9C,WAAS,CAAC4L,IAAtC;;EACA9Q,MAAAA,CAAC,CAAC,MAAI,CAACuF,QAAN,CAAD,CAAiB5C,OAAjB,CAAyBmC,OAAK,CAACiM,MAA/B;EACD,KAHD;;EAKA,SAAKxL,QAAL,CAAcuC,SAAd,CAAwBtB,MAAxB,CAA+BtB,WAAS,CAACG,IAAzC;;EACA,QAAI,KAAKmG,OAAL,CAAaoa,SAAjB,EAA4B;EAC1B,UAAM1jB,kBAAkB,GAAGtB,IAAI,CAACqB,gCAAL,CAAsC,KAAKsD,QAA3C,CAA3B;EAEAvF,MAAAA,CAAC,CAAC,KAAKuF,QAAN,CAAD,CACG5E,GADH,CACOC,IAAI,CAAC1B,cADZ,EAC4B8T,QAD5B,EAEG/R,oBAFH,CAEwBiB,kBAFxB;EAGD,KAND,MAMO;EACL8Q,MAAAA,QAAQ;EACT;EACF;;;UAIMvM,mBAAP,0BAAwBvD,MAAxB,EAAgC;EAC9B,WAAO,KAAKwD,IAAL,CAAU,YAAY;EAC3B,UAAMC,QAAQ,GAAG3G,CAAC,CAAC,IAAD,CAAlB;EACA,UAAI4G,IAAI,GAASD,QAAQ,CAACC,IAAT,CAAcpC,UAAd,CAAjB;;EACA,UAAMgH,OAAO,GAAI,OAAOtI,MAAP,KAAkB,QAAlB,IAA8BA,MAA/C;;EAEA,UAAI,CAAC0D,IAAL,EAAW;EACTA,QAAAA,IAAI,GAAG,IAAIurB,KAAJ,CAAU,IAAV,EAAgB3mB,OAAhB,CAAP;EACA7E,QAAAA,QAAQ,CAACC,IAAT,CAAcpC,UAAd,EAAwBoC,IAAxB;EACD;;EAED,UAAI,OAAO1D,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,YAAI,OAAO0D,IAAI,CAAC1D,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,gBAAM,IAAImN,SAAJ,wBAAkCnN,MAAlC,QAAN;EACD;;EAED0D,QAAAA,IAAI,CAAC1D,MAAD,CAAJ,CAAa,IAAb;EACD;EACF,KAjBM,CAAP;EAkBD;;;;0BA7IoB;EACnB,aAAOqB,SAAP;EACD;;;0BAEwB;EACvB,aAAO0E,aAAP;EACD;;;0BAEoB;EACnB,aAAOP,SAAP;EACD;;;;;EAsIH;;;;;;;EAMA1I,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAyB6tB,KAAK,CAAC1rB,gBAA/B;EACAzG,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW2C,WAAX,GAAyBkrB,KAAzB;;EACAnyB,CAAC,CAACgB,EAAF,CAAKsD,MAAL,EAAW4C,UAAX,GAAyB,YAAM;EAC7BlH,EAAAA,CAAC,CAACgB,EAAF,CAAKsD,MAAL,IAAaK,oBAAb;EACA,SAAOwtB,KAAK,CAAC1rB,gBAAb;EACD,CAHD;;EC1MA;;;;;;;EAOA,CAAC,YAAM;EACL,MAAI,OAAOzG,CAAP,KAAa,WAAjB,EAA8B;EAC5B,UAAM,IAAIqQ,SAAJ,CAAc,kGAAd,CAAN;EACD;;EAED,MAAMiiB,OAAO,GAAGtyB,CAAC,CAACgB,EAAF,CAAKwS,MAAL,CAAYhR,KAAZ,CAAkB,GAAlB,EAAuB,CAAvB,EAA0BA,KAA1B,CAAgC,GAAhC,CAAhB;EACA,MAAM+vB,QAAQ,GAAG,CAAjB;EACA,MAAMC,OAAO,GAAG,CAAhB;EACA,MAAMC,QAAQ,GAAG,CAAjB;EACA,MAAMC,QAAQ,GAAG,CAAjB;EACA,MAAMC,QAAQ,GAAG,CAAjB;;EAEA,MAAIL,OAAO,CAAC,CAAD,CAAP,GAAaE,OAAb,IAAwBF,OAAO,CAAC,CAAD,CAAP,GAAaG,QAArC,IAAiDH,OAAO,CAAC,CAAD,CAAP,KAAeC,QAAf,IAA2BD,OAAO,CAAC,CAAD,CAAP,KAAeG,QAA1C,IAAsDH,OAAO,CAAC,CAAD,CAAP,GAAaI,QAApH,IAAgIJ,OAAO,CAAC,CAAD,CAAP,IAAcK,QAAlJ,EAA4J;EAC1J,UAAM,IAAI9uB,KAAJ,CAAU,8EAAV,CAAN;EACD;EACF,CAfD;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file
diff --git a/dashboard/public/js/boosted.bundle.min.js b/dashboard/public/js/boosted.bundle.min.js
new file mode 100644
index 00000000..2c864c93
--- /dev/null
+++ b/dashboard/public/js/boosted.bundle.min.js
@@ -0,0 +1,12 @@
+/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://boosted.orange.com)
+ * Copyright 2011-2019 The Boosted Authors (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e((t=t||self).boosted={},t.jQuery)}(this,function(t,p){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}p=p&&p.hasOwnProperty("default")?p.default:p;var e="transitionend";function n(t){var e=this,n=!1;return p(this).one(m.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||m.triggerTransitionEnd(e)},t),this}var m={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=p(t).css("transition-duration"),n=p(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){p(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&m.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?m.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};p.fn.emulateTransitionEnd=n,p.event.special[m.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(p(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=p.fn[o],f={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},u="alert",h="fade",d="show",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){p.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=m.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=p(t).closest("."+u)[0]),n},t._triggerCloseEvent=function(t){var e=p.Event(f.CLOSE);return p(t).trigger(e),e},t._removeElement=function(e){var n=this;if(p(e).removeClass(d),p(e).hasClass(h)){var t=m.getTransitionDurationFromElement(e);p(e).one(m.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){p(t).detach().trigger(f.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(f.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),p.fn[o]=g._jQueryInterface,p.fn[o].Constructor=g,p.fn[o].noConflict=function(){return p.fn[o]=c,g._jQueryInterface};var _="button",v="bs.button",y="."+v,b=".data-api",E=p.fn[_],w="active",C="btn",T="focus",S='[data-toggle^="button"]',I='[data-toggle="buttons"]',D='input:not([type="hidden"])',A=".active",O=".btn",N={CLICK_DATA_API:"click"+y+b,FOCUS_BLUR_DATA_API:"focus"+y+b+" blur"+y+b},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=p(this._element).closest(I)[0],e=this._element.querySelector(D);if(t){var n=t.querySelector(A);n&&n.classList.remove(w)}e?e.checked?this._element.classList.add(w):this._element.classList.remove(w):(this._element.classList.toggle(w),this._element.setAttribute("aria-pressed",this._element.classList.contains(w)))},t.dispose=function(){p.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(v);t||(t=new n(this),p(this).data(v,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();p(document).on(N.CLICK_DATA_API,S,function(t){var e=t.target;p(e).hasClass(C)||(e=p(e).closest(O)),k._jQueryInterface.call(p(e),"toggle")}).on(N.FOCUS_BLUR_DATA_API,S,function(t){var e=p(t.target).closest(O)[0];e&&p(e).toggleClass(T,/^focus(in)?$/.test(t.type))}).on(N.FOCUS_BLUR_DATA_API,D<S,function(t){var e=p(t.target).closest(O)[0];e&&p(e).toggleClass(T,/^focus(in)?$/.test(t.type))}),p.fn[_]=k._jQueryInterface,p.fn[_].Constructor=k,p.fn[_].noConflict=function(){return p.fn[_]=E,k._jQueryInterface};var L="carousel",x="bs.carousel",P="."+x,j=".data-api",H=p.fn[L],F={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},M={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},R="next",W="prev",U="left",B="right",Q={SLIDE:"slide"+P,SLID:"slid"+P,KEYDOWN:"keydown"+P,MOUSEENTER:"mouseenter"+P,MOUSELEAVE:"mouseleave"+P,TOUCHSTART:"touchstart"+P,TOUCHMOVE:"touchmove"+P,TOUCHEND:"touchend"+P,POINTERDOWN:"pointerdown"+P,POINTERUP:"pointerup"+P,DRAG_START:"dragstart"+P,LOAD_DATA_API:"load"+P+j,CLICK_DATA_API:"click"+P+j},K="carousel",q="active",V="slide",$="carousel-item-right",Y="carousel-item-left",z="carousel-item-next",X="carousel-item-prev",G="pointer-event",J=".active",Z=".active.carousel-item",tt=".carousel-item",et=".carousel-item img",nt=".carousel-item-next, .carousel-item-prev",it=".carousel-indicators",ot="[data-slide], [data-slide-to]",rt='[data-ride="carousel"]',st={TOUCH:"touch",PEN:"pen"},at=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(it),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(R)},t.nextWhenVisible=function(){!document.hidden&&p(this._element).is(":visible")&&"hidden"!==p(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(W)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(nt)&&(m.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(Z);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)p(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?R:W;this._slide(i,this._items[t])}},t.dispose=function(){p(this._element).off(P),p.removeData(this._element,x),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},F,t),m.typeCheckConfig(L,t,M),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&p(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&p(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};p(this._element.querySelectorAll(et)).on(Q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(p(this._element).on(Q.POINTERDOWN,function(t){return e(t)}),p(this._element).on(Q.POINTERUP,function(t){return i(t)}),this._element.classList.add(G)):(p(this._element).on(Q.TOUCHSTART,function(t){return e(t)}),p(this._element).on(Q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),p(this._element).on(Q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(tt)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===R,i=t===W,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===W?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(Z)),o=p.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return p(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(J));p(e).removeClass(q);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&p(n).addClass(q)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(Z),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),f=Boolean(this._interval);if(o=t===R?(n=Y,i=z,U):(n=$,i=X,B),l&&p(l).hasClass(q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,f&&this.pause(),this._setActiveIndicatorElement(l);var u=p.Event(Q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(p(this._element).hasClass(V)){p(l).addClass(i),m.reflow(l),p(s).addClass(n),p(l).addClass(n);var h=parseInt(l.getAttribute("data-interval"),10);this._config.interval=h?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,h):this._config.defaultInterval||this._config.interval;var d=m.getTransitionDurationFromElement(s);p(s).one(m.TRANSITION_END,function(){p(l).removeClass(n+" "+i).addClass(q),p(s).removeClass(q+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return p(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else p(s).removeClass(q),p(l).addClass(q),this._isSliding=!1,p(this._element).trigger(u);f&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=p(this).data(x),e=l({},F,p(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),p(this).data(x,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=m.getSelectorFromElement(this);if(e){var n=p(e)[0];if(n&&p(n).hasClass(K)){var i=l({},p(n).data(),p(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(p(n),i),o&&p(n).data(x).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return F}}]),r}();p(document).on(Q.CLICK_DATA_API,ot,at._dataApiClickHandler),p(window).on(Q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(rt)),e=0,n=t.length;e<n;e++){var i=p(t[e]);at._jQueryInterface.call(i,i.data())}}),p.fn[L]=at._jQueryInterface,p.fn[L].Constructor=at,p.fn[L].noConflict=function(){return p.fn[L]=H,at._jQueryInterface};var lt="collapse",ct="bs.collapse",ft="."+ct,ut=p.fn[lt],ht={toggle:!0,parent:""},dt={toggle:"boolean",parent:"(string|element)"},pt={SHOW:"show"+ft,SHOWN:"shown"+ft,HIDE:"hide"+ft,HIDDEN:"hidden"+ft,CLICK_DATA_API:"click"+ft+".data-api"},mt="show",gt="collapse",_t="collapsing",vt="collapsed",yt="width",bt="height",Et="*:not(.multi) > .show, *:not(.multi) > .collapsing",wt='[data-toggle="collapse"]',Ct=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(wt)),i=0,o=n.length;i<o;i++){var r=n[i],s=m.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){p(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!p(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Et)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(gt)})).length&&(t=null),!(t&&(e=p(t).not(this._selector).data(ct))&&e._isTransitioning))){var i=p.Event(pt.SHOW);if(p(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(p(t).not(this._selector),"hide"),e||p(t).data(ct,null));var o=this._getDimension();p(this._element).removeClass(gt).addClass(_t),this._element.style[o]=0,this._triggerArray.length&&p(this._triggerArray).removeClass(vt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){p(n._element).removeClass(_t).addClass(gt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),p(n._element).trigger(pt.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&p(this._element).hasClass(mt)){var e=p.Event(pt.HIDE);if(p(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",m.reflow(this._element),p(this._element).addClass(_t).removeClass(gt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=m.getSelectorFromElement(r);if(null!==s)p([].slice.call(document.querySelectorAll(s))).hasClass(mt)||p(r).addClass(vt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){t.setTransitioning(!1),p(t._element).removeClass(_t).addClass(gt).trigger(pt.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){p.removeData(this._element,ct),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},ht,t)).toggle=Boolean(t.toggle),m.typeCheckConfig(lt,t,dt),t},t._getDimension=function(){return p(this._element).hasClass(yt)?yt:bt},t._getParent=function(){var t,n=this;m.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return p(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=p(t).hasClass(mt);e.length&&p(e).toggleClass(vt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=m.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=p(this),e=t.data(ct),n=l({},ht,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide|init/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ct,e)),!/init/.test(i)&&"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ht}}]),a}();p(document).on(pt.CLICK_DATA_API,wt,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=p(this),e=m.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));p(i).each(function(){var t=p(this),e=t.data(ct)?"toggle":n.data();Ct._jQueryInterface.call(t,e)})}).on("DOMContentLoaded",function(){p(wt).each(function(){var t=Ct._getTargetFromElement(this);Ct._jQueryInterface.call(p(t),"init")})}),p.fn[lt]=Ct._jQueryInterface,p.fn[lt].Constructor=Ct,p.fn[lt].noConflict=function(){return p.fn[lt]=ut,Ct._jQueryInterface};for(var Tt="undefined"!=typeof window&&"undefined"!=typeof document,St=["Edge","Trident","Firefox"],It=0,Dt=0;Dt<St.length;Dt+=1)if(Tt&&0<=navigator.userAgent.indexOf(St[Dt])){It=1;break}var At=Tt&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then(function(){e=!1,t()}))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout(function(){e=!1,t()},It))}};function Ot(t){return t&&"[object Function]"==={}.toString.call(t)}function Nt(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function kt(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function Lt(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=Nt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:Lt(kt(t))}var xt=Tt&&!(!window.MSInputMethodContext||!document.documentMode),Pt=Tt&&/MSIE 10/.test(navigator.userAgent);function jt(t){return 11===t?xt:10===t?Pt:xt||Pt}function Ht(t){if(!t)return document.documentElement;for(var e=jt(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===Nt(n,"position")?Ht(n):n:t?t.ownerDocument.documentElement:document.documentElement}function Ft(t){return null!==t.parentNode?Ft(t.parentNode):t}function Mt(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s,a,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&Ht(s.firstElementChild)!==s?Ht(l):l;var c=Ft(t);return c.host?Mt(c.host,e):Mt(t,Ft(e).host)}function Rt(t){var e="top"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=t.nodeName;if("BODY"!==n&&"HTML"!==n)return t[e];var i=t.ownerDocument.documentElement;return(t.ownerDocument.scrollingElement||i)[e]}function Wt(t,e){var n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(t["border"+n+"Width"],10)+parseFloat(t["border"+i+"Width"],10)}function Ut(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],jt(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function Bt(t){var e=t.body,n=t.documentElement,i=jt(10)&&getComputedStyle(n);return{height:Ut("Height",e,n,i),width:Ut("Width",e,n,i)}}var Qt=function(){function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}}(),Kt=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},qt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t};function Vt(t){return qt({},t,{right:t.left+t.width,bottom:t.top+t.height})}function $t(t){var e={};try{if(jt(10)){e=t.getBoundingClientRect();var n=Rt(t,"top"),i=Rt(t,"left");e.top+=n,e.left+=i,e.bottom+=n,e.right+=i}else e=t.getBoundingClientRect()}catch(t){}var o={left:e.left,top:e.top,width:e.right-e.left,height:e.bottom-e.top},r="HTML"===t.nodeName?Bt(t.ownerDocument):{},s=r.width||t.clientWidth||o.right-o.left,a=r.height||t.clientHeight||o.bottom-o.top,l=t.offsetWidth-s,c=t.offsetHeight-a;if(l||c){var f=Nt(t);l-=Wt(f,"x"),c-=Wt(f,"y"),o.width-=l,o.height-=c}return Vt(o)}function Yt(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=jt(10),o="HTML"===e.nodeName,r=$t(t),s=$t(e),a=Lt(t),l=Nt(e),c=parseFloat(l.borderTopWidth,10),f=parseFloat(l.borderLeftWidth,10);n&&o&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var u=Vt({top:r.top-s.top-c,left:r.left-s.left-f,width:r.width,height:r.height});if(u.marginTop=0,u.marginLeft=0,!i&&o){var h=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);u.top-=c-h,u.bottom-=c-h,u.left-=f-d,u.right-=f-d,u.marginTop=h,u.marginLeft=d}return(i&&!n?e.contains(a):e===a&&"BODY"!==a.nodeName)&&(u=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Rt(e,"top"),o=Rt(e,"left"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}(u,e)),u}function zt(t){if(!t||!t.parentElement||jt())return document.documentElement;for(var e=t.parentElement;e&&"none"===Nt(e,"transform");)e=e.parentElement;return e||document.documentElement}function Xt(t,e,n,i){var o=4<arguments.length&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=o?zt(t):Mt(t,e);if("viewport"===i)r=function(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=Yt(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),s=e?0:Rt(n),a=e?0:Rt(n,"left");return Vt({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:o,height:r})}(s,o);else{var a=void 0;"scrollParent"===i?"BODY"===(a=Lt(kt(e))).nodeName&&(a=t.ownerDocument.documentElement):a="window"===i?t.ownerDocument.documentElement:i;var l=Yt(a,s,o);if("HTML"!==a.nodeName||function t(e){var n=e.nodeName;if("BODY"===n||"HTML"===n)return!1;if("fixed"===Nt(e,"position"))return!0;var i=kt(e);return!!i&&t(i)}(s))r=l;else{var c=Bt(t.ownerDocument),f=c.height,u=c.width;r.top+=l.top-l.marginTop,r.bottom=f+l.top,r.left+=l.left-l.marginLeft,r.right=u+l.left}}var h="number"==typeof(n=n||0);return r.left+=h?n:n.left||0,r.top+=h?n:n.top||0,r.right-=h?n:n.right||0,r.bottom-=h?n:n.bottom||0,r}function Gt(t,e,i,n,o){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var s=Xt(i,n,r,o),a={top:{width:s.width,height:e.top-s.top},right:{width:s.right-e.right,height:s.height},bottom:{width:s.width,height:s.bottom-e.bottom},left:{width:e.left-s.left,height:s.height}},l=Object.keys(a).map(function(t){return qt({key:t},a[t],{area:(e=a[t],e.width*e.height)});var e}).sort(function(t,e){return e.area-t.area}),c=l.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight}),f=0<c.length?c[0].key:l[0].key,u=t.split("-")[1];return f+(u?"-"+u:"")}function Jt(t,e,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return Yt(n,i?zt(e):Mt(e,n),i)}function Zt(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function te(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function ee(t,e,n){n=n.split("-")[0];var i=Zt(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=e[s]+e[l]/2-i[l]/2,o[a]=n===a?e[a]-i[c]:e[te(a)],o}function ne(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function ie(t,n,e){return(void 0===e?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex(function(t){return t[e]===n});var i=ne(t,function(t){return t[e]===n});return t.indexOf(i)}(t,"name",e))).forEach(function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var e=t.function||t.fn;t.enabled&&Ot(e)&&(n.offsets.popper=Vt(n.offsets.popper),n.offsets.reference=Vt(n.offsets.reference),n=e(n,t))}),n}function oe(t,n){return t.some(function(t){var e=t.name;return t.enabled&&e===n})}function re(t){for(var e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<e.length;i++){var o=e[i],r=o?""+o+n:t;if("undefined"!=typeof document.body.style[r])return r}return null}function se(t){var e=t.ownerDocument;return e?e.defaultView:window}function ae(t,e,n,i){n.updateBound=i,se(t).addEventListener("resize",n.updateBound,{passive:!0});var o=Lt(t);return function t(e,n,i,o){var r="BODY"===e.nodeName,s=r?e.ownerDocument.defaultView:e;s.addEventListener(n,i,{passive:!0}),r||t(Lt(s.parentNode),n,i,o),o.push(s)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function le(){var t,e;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(t=this.reference,e=this.state,se(t).removeEventListener("resize",e.updateBound),e.scrollParents.forEach(function(t){t.removeEventListener("scroll",e.updateBound)}),e.updateBound=null,e.scrollParents=[],e.scrollElement=null,e.eventsEnabled=!1,e))}function ce(t){return""!==t&&!isNaN(parseFloat(t))&&isFinite(t)}function fe(n,i){Object.keys(i).forEach(function(t){var e="";-1!==["width","height","top","right","bottom","left"].indexOf(t)&&ce(i[t])&&(e="px"),n.style[t]=i[t]+e})}var ue=Tt&&/Firefox/i.test(navigator.userAgent);function he(t,e,n){var i=ne(t,function(t){return t.name===e}),o=!!i&&t.some(function(t){return t.name===n&&t.enabled&&t.order<i.order});if(!o){var r="`"+e+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+r+" modifier in order to work, be sure to include it before "+r+"!")}return o}var de=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],pe=de.slice(3);function me(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=pe.indexOf(t),i=pe.slice(n+1).concat(pe.slice(0,n));return e?i.reverse():i}var ge="flip",_e="clockwise",ve="counterclockwise";function ye(t,o,r,e){var s=[0,0],a=-1!==["right","left"].indexOf(e),n=t.split(/(\+|\-)/).map(function(t){return t.trim()}),i=n.indexOf(ne(n,function(t){return-1!==t.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(t,e){var n=(1===e?!a:a)?"height":"width",i=!1;return t.reduce(function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,i=!0,t):i?(t[t.length-1]+=e,i=!1,t):t.concat(e)},[]).map(function(t){return function(t,e,n,i){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return t;if(0!==s.indexOf("%"))return"vh"!==s&&"vw"!==s?r:("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Vt(a)[e]/100*r}(t,n,o,r)})})).forEach(function(n,i){n.forEach(function(t,e){ce(t)&&(s[i]+=t*("-"===n[e-1]?-1:1))})}),s}var be={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var o=t.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",f={start:Kt({},l,r[l]),end:Kt({},l,r[l]+r[c]-s[c])};t.offsets.popper=qt({},s,f[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n=e.offset,i=t.placement,o=t.offsets,r=o.popper,s=o.reference,a=i.split("-")[0],l=void 0;return l=ce(+n)?[+n,0]:ye(n,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,i){var e=i.boundariesElement||Ht(t.instance.popper);t.instance.reference===e&&(e=Ht(e));var n=re("transform"),o=t.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top="",o.left="",o[n]="";var l=Xt(t.instance.popper,t.instance.reference,i.padding,e,t.positionFixed);o.top=r,o.left=s,o[n]=a,i.boundaries=l;var c=i.priority,f=t.offsets.popper,u={primary:function(t){var e=f[t];return f[t]<l[t]&&!i.escapeWithReference&&(e=Math.max(f[t],l[t])),Kt({},t,e)},secondary:function(t){var e="right"===t?"left":"top",n=f[e];return f[t]>l[t]&&!i.escapeWithReference&&(n=Math.min(f[e],l[t]-("right"===t?f.width:f.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";f=qt({},f,u[e](t))}),t.offsets.popper=f,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<r(i[l])&&(t.offsets.popper[l]=r(i[l])-n[c]),n[l]>r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!he(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",f=l?"Top":"Left",u=f.toLowerCase(),h=l?"left":"top",d=l?"bottom":"right",p=Zt(i)[c];a[d]-p<s[u]&&(t.offsets.popper[u]-=s[u]-(a[d]-p)),a[u]+p>s[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Vt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g["margin"+f],10),v=parseFloat(g["border"+f+"Width"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,h,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(g,_){if(oe(g.instance.modifiers,"inner"))return g;if(g.flipped&&g.placement===g.originalPlacement)return g;var v=Xt(g.instance.popper,g.instance.reference,_.padding,_.boundariesElement,g.positionFixed),y=g.placement.split("-")[0],b=te(y),E=g.placement.split("-")[1]||"",w=[];switch(_.behavior){case ge:w=[y,b];break;case _e:w=me(y);break;case ve:w=me(y,!0);break;default:w=_.behavior}return w.forEach(function(t,e){if(y!==t||w.length===e+1)return g;y=g.placement.split("-")[0],b=te(y);var n,i=g.offsets.popper,o=g.offsets.reference,r=Math.floor,s="left"===y&&r(i.right)>r(o.left)||"right"===y&&r(i.left)<r(o.right)||"top"===y&&r(i.bottom)>r(o.top)||"bottom"===y&&r(i.top)<r(o.bottom),a=r(i.left)<r(v.left),l=r(i.right)>r(v.right),c=r(i.top)<r(v.top),f=r(i.bottom)>r(v.bottom),u="left"===y&&a||"right"===y&&l||"top"===y&&c||"bottom"===y&&f,h=-1!==["top","bottom"].indexOf(y),d=!!_.flipVariations&&(h&&"start"===E&&a||h&&"end"===E&&l||!h&&"start"===E&&c||!h&&"end"===E&&f),p=!!_.flipVariationsByContent&&(h&&"start"===E&&l||h&&"end"===E&&a||!h&&"start"===E&&f||!h&&"end"===E&&c),m=d||p;(s||u||m)&&(g.flipped=!0,(s||u)&&(y=w[e+1]),m&&(E="end"===(n=E)?"start":"start"===n?"end":n),g.placement=y+(E?"-"+E:""),g.offsets.popper=qt({},g.offsets.popper,ee(g.instance.popper,g.offsets.reference,g.placement)),g=ie(g.instance.modifiers,g,"flip"))}),g},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=te(e),t.offsets.popper=Vt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!he(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottom<n.top||e.left>n.right||e.top>n.bottom||e.right<n.left){if(!0===t.hide)return t;t.hide=!0,t.attributes["x-out-of-boundaries"]=""}else{if(!1===t.hide)return t;t.hide=!1,t.attributes["x-out-of-boundaries"]=!1}return t}},computeStyle:{order:850,enabled:!0,fn:function(t,e){var n=e.x,i=e.y,o=t.offsets.popper,r=ne(t.instance.modifiers,function(t){return"applyStyle"===t.name}).gpuAcceleration;void 0!==r&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s,a,l,c,f,u,h,d,p,m,g,_,v,y,b=void 0!==r?r:e.gpuAcceleration,E=Ht(t.instance.popper),w=$t(E),C={position:o.position},T=(s=t,a=window.devicePixelRatio<2||!ue,l=s.offsets,c=l.popper,f=l.reference,u=Math.round,h=Math.floor,d=function(t){return t},p=u(f.width),m=u(c.width),g=-1!==["left","right"].indexOf(s.placement),_=-1!==s.placement.indexOf("-"),y=a?u:d,{left:(v=a?g||_||p%2==m%2?u:h:d)(p%2==1&&m%2==1&&!_&&a?c.left-1:c.left),top:y(c.top),bottom:y(c.bottom),right:v(c.right)}),S="bottom"===n?"top":"bottom",I="right"===i?"left":"right",D=re("transform"),A=void 0,O=void 0;if(O="bottom"===S?"HTML"===E.nodeName?-E.clientHeight+T.bottom:-w.height+T.bottom:T.top,A="right"===I?"HTML"===E.nodeName?-E.clientWidth+T.right:-w.width+T.right:T.left,b&&D)C[D]="translate3d("+A+"px, "+O+"px, 0)",C[S]=0,C[I]=0,C.willChange="transform";else{var N="bottom"===S?-1:1,k="right"===I?-1:1;C[S]=O*N,C[I]=A*k,C.willChange=S+", "+I}var L={"x-placement":t.placement};return t.attributes=qt({},L,t.attributes),t.styles=qt({},C,t.styles),t.arrowStyles=qt({},t.offsets.arrow,t.arrowStyles),t},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(t){var e,n;return fe(t.instance.popper,t.styles),e=t.instance.popper,n=t.attributes,Object.keys(n).forEach(function(t){!1!==n[t]?e.setAttribute(t,n[t]):e.removeAttribute(t)}),t.arrowElement&&Object.keys(t.arrowStyles).length&&fe(t.arrowElement,t.arrowStyles),t},onLoad:function(t,e,n,i,o){var r=Jt(o,e,t,n.positionFixed),s=Gt(n.placement,r,e,t,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return e.setAttribute("x-placement",s),fe(e,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},Ee=function(){function r(t,e){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,r),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=At(this.update.bind(this)),this.options=qt({},r.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=e&&e.jquery?e[0]:e,this.options.modifiers={},Object.keys(qt({},r.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=qt({},r.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(t){return qt({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order}),this.modifiers.forEach(function(t){t.enabled&&Ot(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}return Qt(r,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=Jt(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=Gt(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=ee(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=ie(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,oe(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[re("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ae(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return le.call(this)}}]),r}();Ee.Utils=("undefined"!=typeof window?window:global).PopperUtils,Ee.placements=de,Ee.Defaults=be;var we="dropdown",Ce="bs.dropdown",Te="."+Ce,Se=".data-api",Ie=p.fn[we],De=new RegExp("38|40|27"),Ae={HIDE:"hide"+Te,HIDDEN:"hidden"+Te,SHOW:"show"+Te,SHOWN:"shown"+Te,CLICK:"click"+Te,CLICK_DATA_API:"click"+Te+Se,KEYDOWN_DATA_API:"keydown"+Te+Se,KEYUP_DATA_API:"keyup"+Te+Se},Oe="disabled",Ne="show",ke="dropup",Le="dropright",xe="dropleft",Pe="dropdown-menu-right",je="position-static",He='[data-toggle="dropdown"]',Fe=".dropdown form",Me=".dropdown-menu",Re=".navbar-nav",We=".dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)",Ue=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Be="top-start",Qe="top-end",Ke="bottom-start",qe="bottom-end",Ve="right-start",$e="left-start",Ye={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},ze={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Xe=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners(),this._addAccessibility()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)){var t=c._getParentFromElement(this._element),e=p(this._menu).hasClass(Ne);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=p.Event(Ae.SHOW,n);if(p(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof Ee)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:m.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&p(t).addClass(je),this._popper=new Ee(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===p(t).closest(Re).length&&p(document.body).children().on("mouseover",null,p.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),p(this._menu).toggleClass(Ne),p(t).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||p(this._element).hasClass(Oe)||p(this._menu).hasClass(Ne))){var t={relatedTarget:this._element},e=p.Event(Ae.SHOW,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,t)),p(n).find(We).first().trigger("focus"))}},t.hide=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)&&p(this._menu).hasClass(Ne)){var t={relatedTarget:this._element},e=p.Event(Ae.HIDE,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.HIDDEN,t)))}},t.dispose=function(){p.removeData(this._element,Ce),p(this._element).off(Te),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;p(this._element).on(Ae.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,p(this._element).data(),t),m.typeCheckConfig(we,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Me))}return this._menu},t._getPlacement=function(){var t=p(this._element.parentNode),e=Ke;return t.hasClass(ke)?(e=Be,p(this._menu).hasClass(Pe)&&(e=Qe)):t.hasClass(Le)?e=Ve:t.hasClass(xe)?e=$e:p(this._menu).hasClass(Pe)&&(e=qe),e},t._detectNavbar=function(){return 0<p(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},t._addAccessibility=function(){p(this._element).attr("aria-haspopup",!0),p(this._element).parent().children(Me).attr("role","menu"),p(this._element).parent().children(Me).children(".dropdown-item").attr("role","menuitem")},c._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(Ce);if(t||(t=new c(this,"object"==typeof e?e:null),p(this).data(Ce,t)),!/init/.test(e)&&"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(He)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=p(e[n]).data(Ce),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(p(o).hasClass(Ne)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&p.contains(o,t.target))){var l=p.Event(Ae.HIDE,s);p(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),e[n].setAttribute("aria-expanded","false"),p(a).removeClass(Ne),p(o).removeClass(Ne).trigger(p.Event(Ae.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=m.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||p(t.target).closest(Me).length)):De.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!p(this).hasClass(Oe))){var e=c._getParentFromElement(this),n=p(e).hasClass(Ne);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Ue));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(He);p(r).trigger("focus")}p(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Ye}},{key:"DefaultType",get:function(){return ze}}]),c}();p(document).on(Ae.KEYDOWN_DATA_API,He,Xe._dataApiKeydownHandler).on(Ae.KEYDOWN_DATA_API,Me,Xe._dataApiKeydownHandler).on(Ae.CLICK_DATA_API+" "+Ae.KEYUP_DATA_API,Xe._clearMenus).on(Ae.CLICK_DATA_API,He,function(t){t.preventDefault(),t.stopPropagation(),Xe._jQueryInterface.call(p(this),"toggle")}).on(Ae.CLICK_DATA_API,Fe,function(t){t.stopPropagation()}).on("DOMContentLoaded",function(){Xe._jQueryInterface.call(p(He),"init")}),p.fn[we]=Xe._jQueryInterface,p.fn[we].Constructor=Xe,p.fn[we].noConflict=function(){return p.fn[we]=Ie,Xe._jQueryInterface};var Ge="megamenu",Je="bs.megamenu",Ze=p.fn[Ge],tn="transitioning",en=".mega-menu",nn=".mega-menu > .navbar-nav",on=".mega-menu-panel",rn=".nav-link + .navbar-nav",sn=".navbar-nav",an=".nav-item",ln=".nav-link",cn=".nav-link[data-toggle=collapse]",fn=".nav-link.back",un=".nav-link[aria-expanded=true]",hn=function(){function n(t,e){this._element=t,this._$navLinks=p(this._element).find(ln),this._$goForwardLinks=p(this._element).find(rn).prev(ln),this._$goBackLinks=p(this._element).find(fn),this._$topCollapseMenus=p(this._element).find(on),this._$navLinkCollapses=p(this._element).find(cn),this._config=e,"undefined"==typeof this._config.noFocus&&(this._config.noFocus=!1),this._addEventListeners(),this._addAriaAttributes(this._element),this.goTo=this._initPosition}var t=n.prototype;return t._addEventListeners=function(){var e=this;this._$goForwardLinks.on("click",function(t){return e._goForward(t)}),this._$goBackLinks.on("click",function(t){return e._goBackward(t)}),this._$navLinks.on("keydown",function(t){return e._manageKeyDown(t)}),this._config.noFocus||this._$topCollapseMenus.on("shown.bs.collapse",this._collapseFocus),this._$navLinkCollapses.on("click",function(t){return e._handleCollapseToggle(t)})},t._addAriaAttributes=function(t){var e=p(t).find(".nav-link + .navbar-nav");p(t).attr("role","application"),p(t).find("> .navbar-nav").attr("role","menu"),p(t).find(on).attr("role","menu"),p(t).find(".nav-link[data-toggle=collapse]").attr("role","menuitem"),p(t).find(fn).attr({"aria-hidden":!0}),p(t).find(an).attr("role","presentation"),e.each(function(){var t=m.getUID(Ge),e=p(this).prev(ln),n=p(this),i=n.find(fn),o=p(this).closest(sn).parent().closest(sn).prev(ln),r="go back to "+o.text()+" menu";o.length||(r="go back to "+p(this).closest(on).prev(ln).text()+" menu"),n.attr({id:t,role:"menu"}),e.attr({role:"menuitem","aria-controls":t,"aria-expanded":!1,"aria-haspopup":!0}),i.attr({role:"menuitem","aria-controls":t,"aria-label":r})})},t._initPosition=function(t){var e=this;if(p(t).length){var n=p(t).first(),i=100*-(n.parents().index(this._element)-p(".mega-menu-panel .nav-link").first().parents().index(p(".mega-menu")))/2,o=n.closest(sn),r=p(nn);r.addClass(tn),"collapse"===n.attr("data-toggle")?(n.siblings(on).collapse("show"),this._$topCollapseMenus.not(n.siblings(on)).collapse("hide"),p(this._element).height("auto"),r.css("transform","translateX(0%)")):(n.closest(on).collapse("show"),this._$topCollapseMenus.not(n.closest(on)).collapse("hide"),n.parents(sn).show(),n.parents(an).find("> .nav-link").not(n).attr({tabindex:-1,"aria-hidden":!0,"aria-expanded":!0}),r.css("transform","translateX("+i+"%)"),i?p(this._element).height(o.height()):p(this._element).height("auto")),setTimeout(function(){e._config.noFocus||n.trigger("focus"),r.removeClass(tn)},1e3)}},t._manageKeyDown=function(t){var e=p(t.target);if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:this._goBackward(t);break;case 39:this._goForward(t);break;case 38:e.parent().prev().find(">.nav-link").not(fn).trigger("focus");break;case 40:e.parent().next().find(">.nav-link").trigger("focus")}},t._collapseFocus=function(){p(this).find(ln).not(fn).first().trigger("focus")},t._handleCollapseToggle=function(t){var e=p(t.target),n=p(e.attr("href"));this._$topCollapseMenus.not(n).collapse("hide")},t._goForward=function(t){t.preventDefault();var e=p(t.target),n=e.closest(sn),i=e.next(sn),o=p(nn),r=e,s=100*parseInt(o.css("transform").split(",")[4],10)/o.width();return!(!e.next(sn).length||o.hasClass(tn))&&(o.addClass(tn),n.find(sn).hide(),i.show(),p(en).height(i.height()),s||o.find(">.nav-item .nav-link").attr({tabindex:-1,"aria-hidden":!0}),n.find(ln).attr({tabindex:-1,"aria-hidden":!0}),i.find(ln).attr({tabindex:0,"aria-hidden":!1}),o.css("transform","translateX("+(s-100)+"%)"),o.one("transitionend",function(){r.attr("aria-expanded",!0),i.find(ln).not(fn).first().trigger("focus"),o.removeClass(tn)}),!0)},t._goBackward=function(t){t.preventDefault();var e=p(t.target).closest(sn),n=e.parent().closest(sn),i=p(nn),o=n.find(un),r=100*parseInt(i.css("transform").split(",")[4],10)/i.width();return!(!r||i.hasClass(tn))&&(i.addClass(tn),n.find(ln).attr({tabindex:0,"aria-hidden":!1}),-100===r&&(p(en).css("height","auto"),i.find(">.nav-item .nav-link").attr({tabindex:0,"aria-hidden":!1})),i.css("transform","translateX("+(r+100)+"%)"),i.one("transitionend",function(){o.attr("aria-expanded",!1),o.trigger("focus"),e.hide(),i.removeClass(tn)}),!0)},n._jQueryInterface=function(e){return this.each(function(){if(!p(this).is(en))throw new TypeError("Element is not a mega menu");if(e){if(e.noFocus&&"boolean"!=typeof e.noFocus)throw new TypeError("no-focus parameter must be boolean")}else e={};var t=p(this).data(Je);if(t||(t=new n(this,e),p(this).data(Je,t)),e.target){if("string"!=typeof e.target||!/^[.#].*/.test(e.target))throw new TypeError('Selector "'+e.target+'" is not supported');t.goTo(e.target)}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();p.fn[Ge]=hn._jQueryInterface,p.fn[Ge].Constructor=hn,p.fn[Ge].noConflict=function(){return p.fn[Ge]=Ze,hn._jQueryInterface};var dn="modal",pn="bs.modal",mn="."+pn,gn=p.fn[dn],_n={backdrop:!0,keyboard:!0,focus:!0,show:!0},vn={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},yn={HIDE:"hide"+mn,HIDDEN:"hidden"+mn,SHOW:"show"+mn,SHOWN:"shown"+mn,FOCUSIN:"focusin"+mn,RESIZE:"resize"+mn,CLICK_DISMISS:"click.dismiss"+mn,KEYDOWN_DISMISS:"keydown.dismiss"+mn,MOUSEUP_DISMISS:"mouseup.dismiss"+mn,MOUSEDOWN_DISMISS:"mousedown.dismiss"+mn,CLICK_DATA_API:"click"+mn+".data-api"},bn="modal-dialog-scrollable",En="modal-scrollbar-measure",wn="modal-backdrop",Cn="modal-open",Tn="fade",Sn="show",In=".modal-dialog",Dn=".modal-body",An='[data-toggle="modal"]',On='[data-dismiss="modal"]',Nn=".fixed-top, .fixed-bottom, .is-fixed, .position-fixed",kn=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(In),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0,this._addAria()}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){p(this._element).hasClass(Tn)&&(this._isTransitioning=!0);var n=p.Event(yn.SHOW,{relatedTarget:t});p(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._setEscapeEvent(),p(this._element).on(yn.CLICK_DISMISS,On,function(t){return e.hide(t)}),p(this._dialog).on(yn.MOUSEDOWN_DISMISS,function(){p(e._element).one(yn.MOUSEUP_DISMISS,function(t){p(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=p.Event(yn.HIDE);if(p(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=p(this._element).hasClass(Tn);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),p(document).off(yn.FOCUSIN),p(this._element).removeClass(Sn),p(this._element).off(yn.CLICK_DISMISS),p(this._dialog).off(yn.MOUSEDOWN_DISMISS),i){var o=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return p(t).off(mn)}),p(document).off(yn.FOCUSIN),p.removeData(this._element,pn),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t._getConfig=function(t){return t=l({},_n,t),m.typeCheckConfig(dn,t,vn),t},t._showElement=function(t){var e=this,n=p(this._element).hasClass(Tn);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),p(this._dialog).hasClass(bn)?this._dialog.querySelector(Dn).scrollTop=0:this._element.scrollTop=0,n&&m.reflow(this._element),p(this._element).addClass(Sn),this._config.focus&&this._enforceFocus();var i=p.Event(yn.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,p(e._element).trigger(i)};if(n){var r=m.getTransitionDurationFromElement(this._dialog);p(this._dialog).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;p(document).off(yn.FOCUSIN).on(yn.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===p(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?p(this._element).on(yn.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||p(this._element).off(yn.KEYDOWN_DISMISS)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){p(document.body).removeClass(Cn),t._resetScrollbar(),p(t._element).trigger(yn.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(p(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=p(this._element).hasClass(Tn)?Tn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=wn,n&&this._backdrop.classList.add(n),p(this._backdrop).appendTo(document.body),p(this._element).on(yn.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&m.reflow(this._backdrop),p(this._backdrop).addClass(Sn),!t)return;if(!n)return void t();var i=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){p(this._backdrop).removeClass(Sn);var o=function(){e._removeBackdrop(),t&&t()};if(p(this._element).hasClass(Tn)){var r=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(Nn));p(t).each(function(t,e){var n=e.style.right,i=p(e).css("right");p(e).data("right",n).css("right",parseFloat(i)+o._scrollbarWidth+"px")});var e=document.body.style.paddingRight,n=p(document.body).css("padding-right");p(document.body).data("padding-right",e).css("padding-right",parseFloat(n)+this._scrollbarWidth+"px")}p(document.body).addClass(Cn)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(Nn));p(t).each(function(t,e){var n=p(e).data("right");p(e).removeData("right"),e.style.right=n||""});var e=p(document.body).data("padding-right");p(document.body).removeData("padding-right"),document.body.style.paddingRight=e||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=En,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},t._addAria=function(){var t=p(this._element),e=t.find(".modal-title"),n=t.find(".modal-dialog");if(t.attr({role:"dialog","aria-modal":!0}),e){var i=e.attr("id");i&&t.attr({"aria-labelledby":i})}n&&n.attr("role","document")},o._jQueryInterface=function(n,i){return this.each(function(){var t=p(this).data(pn),e=l({},_n,p(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),p(this).data(pn,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return _n}}]),o}();p(document).on(yn.CLICK_DATA_API,An,function(t){var e,n=this,i=m.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=p(e).data(pn)?"toggle":l({},p(e).data(),p(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=p(e).one(yn.SHOW,function(t){t.isDefaultPrevented()||r.one(yn.HIDDEN,function(){p(n).is(":visible")&&n.focus()})});kn._jQueryInterface.call(p(e),o,this)}),p.fn[dn]=kn._jQueryInterface,p.fn[dn].Constructor=kn,p.fn[dn].noConflict=function(){return p.fn[dn]=gn,kn._jQueryInterface};var Ln="navbar",xn="bs.navbar",Pn=p.fn[Ln],jn={sticky:!1,trigger:""},Hn={sticky:"boolean",trigger:"string"},Fn=".navbar.supra",Mn=".mega-menu.panel",Rn=function(){function i(t,e){var n=this;this._element=t,this._supraBar=t.querySelector(Fn),this._config=this._getConfig(e),this._initialHeight=p(this._element).outerHeight(),this._initialSupraHeight=p(this._supraBar).outerHeight(),this._addAria(),this._config.sticky&&(p(this._element).addClass("fixed-top"),p(Mn).addClass("sticky"),p(document.body).css("padding-top",this._initialHeight),p(window).on("scroll",function(){0<p(window).scrollTop()?p(n._element).addClass("minimized"):p(n._element).removeClass("minimized")})),this._config.hideSupra&&p(window).on("scroll",function(){p(window).innerWidth()<768||(0<p(window).scrollTop()?p(Fn).hide():p(Fn).show())})}var t=i.prototype;return t._getConfig=function(t){return t=p.extend({},jn,t),m.typeCheckConfig(Ln,t,Hn),t},t._addAria=function(){p(this._element).find(".navbar .nav-link[data-toggle]").attr("aria-haspopup",!0)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(xn),e=l({},jn,p(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new i(this,e),p(this).data(xn,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return jn}}]),i}();p.fn[Ln]=Rn._jQueryInterface,p.fn[Ln].Constructor=Rn,p.fn[Ln].noConflict=function(){return p.fn[Ln]=Pn,Rn._jQueryInterface};var Wn="otab",Un="bs.otab",Bn=p.fn[Wn],Qn={CLICK_DATA_API:"click.bs.otab.data-api"},Kn="show",qn="accordion-layout",Vn=".o-tab-heading",$n=".o-tab-content",Yn=function(){function i(t){this._element=t,this._addAccessibility(),2<p(this._element).parent().find(Vn).length&&p(this._element).parent().addClass(qn)}var t=i.prototype;return t.show=function(){var t=p(this._element);t.next().hasClass(Kn)||(t.parent().find($n).removeClass(Kn),t.parent().find('[aria-expanded="true"]').attr("aria-expanded",!1),t.next().addClass(Kn),t.attr("aria-expanded",!0))},t._addAccessibility=function(){var t=p(this._element),e=t.next();t.attr("id",m.getUID(Wn)),e.attr("id",m.getUID(Wn)),t.attr({"aria-controls":e.attr("id"),role:"tab"}),e.attr({"aria-labelledby":t.attr("id"),role:"tabpanel",tabindex:0}),e.hasClass(Kn)?t.attr("aria-expanded",!0):t.attr("aria-expanded",!1)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Un);if(e||(e=new i(this),t.data(Un,e)),!/init/.test(n)&&"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on("DOMContentLoaded",function(){Yn._jQueryInterface.call(p(Vn),"init")}).on(Qn.CLICK_DATA_API,Vn,function(t){t.preventDefault(),Yn._jQueryInterface.call(p(this),Kn)}),p.fn[Wn]=Yn._jQueryInterface,p.fn[Wn].Constructor=Yn,p.fn[Wn].noConflict=function(){return p.fn[Wn]=Bn,Yn._jQueryInterface};var zn=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Xn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Gn=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Jn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function Zn(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===zn.indexOf(n)||Boolean(t.nodeValue.match(Gn)||t.nodeValue.match(Jn));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var ti="tooltip",ei="bs.tooltip",ni="."+ei,ii=p.fn[ti],oi="bs-tooltip",ri=new RegExp("(^|\\s)"+oi+"\\S+","g"),si=["sanitize","whiteList","sanitizeFn"],ai={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},li={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},ci={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Xn},fi="show",ui="out",hi={HIDE:"hide"+ni,HIDDEN:"hidden"+ni,SHOW:"show"+ni,SHOWN:"shown"+ni,INSERTED:"inserted"+ni,CLICK:"click"+ni,FOCUSIN:"focusin"+ni,FOCUSOUT:"focusout"+ni,MOUSEENTER:"mouseenter"+ni,MOUSELEAVE:"mouseleave"+ni},di="fade",pi="show",mi=".tooltip-inner",gi=".arrow",_i="hover",vi="focus",yi="click",bi="manual",Ei=function(){function i(t,e){if("undefined"==typeof Ee)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(pi))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(di);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();if(p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),"rtl"===document.getElementsByTagName("html")[0].dir){var c={right:"left",left:"right"};a=a.replace(/right|left/g,function(t){return c[t]})}this._popper=new Ee(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:gi},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(pi),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var f=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===ui&&e._leave(null,e)};if(p(this.tip).hasClass(di)){var u=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,f).emulateTransitionEnd(u)}else f()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==fi&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(pi),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[yi]=!1,this._activeTrigger[vi]=!1,this._activeTrigger[_i]=!1,p(this.tip).hasClass(di)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(oi+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(mi)),this.getTitle()),p(t).removeClass(di+" "+pi)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Zn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return li[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==bi){var e=t===_i?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===_i?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?vi:_i]=!0),p(e.getTipElement()).hasClass(pi)||e._hoverState===fi?e._hoverState=fi:(clearTimeout(e._timeout),e._hoverState=fi,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===fi&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?vi:_i]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=ui,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===ui&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=p(this.element).data();return Object.keys(e).forEach(function(t){-1!==si.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(ti,t,this.constructor.DefaultType),t.sanitize&&(t.template=Zn(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(ri);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(di),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(ei),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(ei,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ci}},{key:"NAME",get:function(){return ti}},{key:"DATA_KEY",get:function(){return ei}},{key:"Event",get:function(){return hi}},{key:"EVENT_KEY",get:function(){return ni}},{key:"DefaultType",get:function(){return ai}}]),i}();p.fn[ti]=Ei._jQueryInterface,p.fn[ti].Constructor=Ei,p.fn[ti].noConflict=function(){return p.fn[ti]=ii,Ei._jQueryInterface};var wi="popover",Ci="bs.popover",Ti="."+Ci,Si=p.fn[wi],Ii="bs-popover",Di=new RegExp("(^|\\s)"+Ii+"\\S+","g"),Ai=l({},Ei.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Oi=l({},Ei.DefaultType,{content:"(string|element|function)"}),Ni="fade",ki="show",Li=".popover-header",xi=".popover-body",Pi={HIDE:"hide"+Ti,HIDDEN:"hidden"+Ti,SHOW:"show"+Ti,SHOWN:"shown"+Ti,INSERTED:"inserted"+Ti,CLICK:"click"+Ti,FOCUSIN:"focusin"+Ti,FOCUSOUT:"focusout"+Ti,MOUSEENTER:"mouseenter"+Ti,MOUSELEAVE:"mouseleave"+Ti},ji=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Ii+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(Li),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(xi),e),t.removeClass(Ni+" "+ki)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Di);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Ci),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Ci,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Ai}},{key:"NAME",get:function(){return wi}},{key:"DATA_KEY",get:function(){return Ci}},{key:"Event",get:function(){return Pi}},{key:"EVENT_KEY",get:function(){return Ti}},{key:"DefaultType",get:function(){return Oi}}]),i}(Ei);p.fn[wi]=ji._jQueryInterface,p.fn[wi].Constructor=ji,p.fn[wi].noConflict=function(){return p.fn[wi]=Si,ji._jQueryInterface};var Hi="prioritynav",Fi="bs.prioritynav",Mi=p.fn[Hi],Ri="resize",Wi="sr-only",Ui="resizing",Bi="li:not('.overflow-nav')",Qi="li:first";var Ki=function(){function n(t,e){this._element=t,this._config=e,p(t).is("ul")?this._$menu=p(t):this._$menu=p(t).find("ul").first(),this._initMenu(),this._$allNavElements=this._$menu.find(Bi),this._bindUIActions(),this._setupMenu()}var t=n.prototype;return t._initMenu=function(){var t=this._config;"undefined"==typeof t&&(t="More"),this._$menu.append('\n <li class="overflow-nav nav-item dropdown">\n <a href="#" class="dropdown-toggle nav-link" data-toggle="dropdown" role="button" aria-haspopup="true">'+t+'</a>\n <ul class="overflow-nav-list dropdown-menu dropdown-menu-right"></ul>\n </li>\n')},t._setupMenu=function(){var n=this._$allNavElements,i=this._$menu.find(Qi).position(),o=p(),r=!0;if(this._$allNavElements.each(function(t){var e=p(this);e.position().top!==i.top&&(o=o.add(e),r&&(o=o.add(n.eq(t-1)),r=!1))}),o.length){var t=o.clone();if(o.addClass(Wi),o.find(".nav-link").attr("tabindex",-1),this._$menu.find(".overflow-nav-list").append(t),this._$menu.find(".overflow-nav").addClass("show-inline-block"),this._$menu.find(".o-nav-local").css("overflow","visible"),this._$menu.find(".overflow-nav").position().top!==i.top){var e=p(this._element).find("."+Wi).first().prev(),s=e.clone();e.addClass(Wi),e.find(".nav-link").attr("tabindex",-1),this._$menu.find(".overflow-nav-list").prepend(s)}}this._$menu.find(".overflow-nav").attr("aria-hidden",!0)},t._tearDown=function(){this._$menu.find(".overflow-nav-list").empty(),this._$menu.find(".overflow-nav").removeClass("show-inline-block"),this._$allNavElements.removeClass(Wi),this._$allNavElements.find(".nav-link").attr("tabindex",0)},t._bindUIActions=function(){var t=this;p(window).on(Ri,function(){t._$menu.addClass(Ui),setTimeout(function(){t._tearDown(),t._setupMenu(),t._$menu.removeClass(Ui)},500)}),this._$menu.find(".overflow-nav .dropdown-toggle").on("keyup",function(t){9===t.which&&p(t.target).dropdown("toggle")})},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(Fi);if(t||(t=new n(this,e),p(this).data(Fi,t)),"undefined"!=typeof e&&e&&"string"!=typeof e)throw new TypeError("Priority nav label type must be string")})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();p.fn[Hi]=Ki._jQueryInterface,p.fn[Hi].Constructor=Ki,p.fn[Hi].noConflict=function(){return p.fn[Hi]=Mi,Ki._jQueryInterface};var qi="scrollup",Vi="bs.scrollup",$i="."+Vi,Yi=p.fn[qi],zi={offset:10,method:"auto",target:""},Xi={SCROLL:"scroll"+$i,CLICK_SCROLL:"click"+$i,LOAD_DATA_API:"load"+$i+".data-api"},Gi={SCROLL_TOP:"o-scroll-up"},Ji={SCROLL_TOP:".o-scroll-up:not(.static)"},Zi=function(){function e(t){this._element=t,this._scrollElement=window,p(window).on(Xi.SCROLL,p.proxy(this._process,this)),p(Ji.SCROLL_TOP).on(Xi.CLICK_SCROLL,p.proxy(this._backToTop,this)),p(this._element).addClass("is-fixed"),this._process()}var t=e.prototype;return t.dispose=function(){p.removeData(this._element,Vi),p(this._scrollElement).off($i),this._element=null,this._scrollElement=null},t._process=function(){p(this._scrollElement).scrollTop()>Number(p(this._scrollElement).height())?p(Ji.SCROLL_TOP).show():p(Ji.SCROLL_TOP).hide()},t._clear=function(){p(this._selector).filter(Ji.ACTIVE).removeClass(Gi.ACTIVE)},t._backToTop=function(){"function"==typeof p.animate?p("html, body").animate({scrollTop:0},500):p("html, body").scrollTop(0)},e._jQueryInterface=function(){return this.each(function(){var t=p(this).data(Vi);t||(t=new e(this),p(this).data(Vi,t))})},s(e,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return zi}}]),e}();p(window).on(Xi.LOAD_DATA_API,function(){for(var t=p.makeArray(p(Ji.SCROLL_TOP)),e=t.length;e--;){var n=p(t[e]);Zi._jQueryInterface.call(n,n.data())}}),p.fn[qi]=Zi._jQueryInterface,p.fn[qi].Constructor=Zi,p.fn[qi].noConflict=function(){return p.fn[qi]=Yi,Zi._jQueryInterface};var to="scrollspy",eo="bs.scrollspy",no="."+eo,io=p.fn[to],oo={offset:10,method:"auto",target:""},ro={offset:"number",method:"string",target:"(string|element)"},so={ACTIVATE:"activate"+no,SCROLL:"scroll"+no,LOAD_DATA_API:"load"+no+".data-api"},ao="dropdown-item",lo="active",co='[data-spy="scroll"]',fo=".nav, .list-group",uo=".nav-link",ho=".nav-item",po=".list-group-item",mo=".dropdown",go=".dropdown-item",_o=".dropdown-toggle",vo="offset",yo="position",bo=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+uo+","+this._config.target+" "+po+","+this._config.target+" "+go,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p(this._scrollElement).on(so.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?vo:yo,o="auto"===this._config.method?t:this._config.method,r=o===yo?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=m.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[p(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){p.removeData(this._element,eo),p(this._scrollElement).off(no),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},oo,"object"==typeof t&&t?t:{})).target){var e=p(t.target).attr("id");e||(e=m.getUID(to),p(t.target).attr("id",e)),t.target="#"+e}return m.typeCheckConfig(to,t,ro),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=p([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(ao)?(n.closest(mo).find(_o).addClass(lo),n.addClass(lo)):(n.addClass(lo),n.parents(fo).prev(uo+", "+po).addClass(lo),n.parents(fo).prev(ho).children(uo).addClass(lo)),p(this._scrollElement).trigger(so.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(lo)}).forEach(function(t){return t.classList.remove(lo)})},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(eo);if(t||(t=new n(this,"object"==typeof e&&e),p(this).data(eo,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return oo}}]),n}();p(window).on(so.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(co)),e=t.length;e--;){var n=p(t[e]);bo._jQueryInterface.call(n,n.data())}}),p.fn[to]=bo._jQueryInterface,p.fn[to].Constructor=bo,p.fn[to].noConflict=function(){return p.fn[to]=io,bo._jQueryInterface};var Eo="tab",wo="bs.tab",Co="."+wo,To=".data-api",So=p.fn.tab,Io=new RegExp("37|38|39|40"),Do={HIDE:"hide"+Co,HIDDEN:"hidden"+Co,SHOW:"show"+Co,SHOWN:"shown"+Co,CLICK_DATA_API:"click"+Co+To,KEYDOWN_DATA_API:"keydown"+Co+To},Ao="dropdown-menu",Oo="active",No="disabled",ko="fade",Lo="show",xo=".dropdown",Po=".nav, .list-group",jo=".active",Ho="> li > .active",Fo='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Mo=".dropdown-toggle",Ro="> .dropdown-menu .active",Wo=function(){function i(t){this._element=t,this._addAccessibility()}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(Oo)||p(this._element).hasClass(No))){var t,i,e=p(this._element).closest(Po)[0],o=m.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Ho:jo;i=(i=p.makeArray(p(e).find(r)))[i.length-1]}var s=p.Event(Do.HIDE,{relatedTarget:this._element}),a=p.Event(Do.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=p.Event(Do.HIDDEN,{relatedTarget:n._element}),e=p.Event(Do.SHOWN,{relatedTarget:i});p(i).trigger(t),p(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){p.removeData(this._element,wo),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?p(e).children(jo):p(e).find(Ho))[0],r=n&&o&&p(o).hasClass(ko),s=function(){return i._transitionComplete(t,o,n)};if(p(e).find(".nav-link:not(.dropdown-toggle)").attr({tabIndex:"-1","aria-selected":!1}),p(e).find(".tab-pane").attr({"aria-hidden":!0,tabIndex:"-1"}),o&&r){var a=m.getTransitionDurationFromElement(o);p(o).removeClass(Lo).one(m.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){p(e).removeClass(Oo);var i=p(e.parentNode).find(Ro)[0];i&&p(i).removeClass(Oo),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(p(t).addClass(Oo),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),p(t).filter(".nav-link:not(.dropdown-toggle).active").attr({tabIndex:"0","aria-selected":!0}),p(t).filter(".tab-pane.active").attr({"aria-hidden":!1,tabIndex:"0"}),m.reflow(t),t.classList.contains(ko)&&t.classList.add(Lo),t.parentNode&&p(t.parentNode).hasClass(Ao)){var o=p(t).closest(xo)[0];if(o){var r=[].slice.call(o.querySelectorAll(Mo));p(r).addClass(Oo)}t.setAttribute("aria-expanded",!0)}n&&n()},t._addAccessibility=function(){var t=p(this._element),e=p(t.attr("href")),n=t.closest(Po),i=t.attr("id")||m.getUID(Eo);t.attr("id",i),e&&(t.attr("role","tab"),n.attr("role","tablist")),t.hasClass(Oo)?(t.attr({tabIndex:"0","aria-selected":"true"}),t.attr("href")&&t.attr("aria-controls",t.attr("href").substr(1)),e.attr({role:"tabpanel",tabIndex:"0","aria-hidden":"false","aria-labelledby":i})):(t.attr({tabIndex:"-1","aria-selected":"false"}),t.attr("href")&&t.attr("aria-controls",t.attr("href").substr(1)),e.attr({role:"tabpanel",tabIndex:"-1","aria-hidden":"true","aria-labelledby":i}))},i._dataApiKeydownHandler=function(t){var e=p(this).closest("ul[role=tablist] ").find("[role=tab]:visible"),n=t.which||t.keyCode,i=0;i=e.index(e.filter(":focus")),38!==n&&37!==n||i--,39!==n&&40!==n||i++,i<0&&(i=e.length-1),i===e.length&&(i=0);var o=e.eq(i);"tab"===o.attr("role")&&o.tab("show").trigger("focus"),t.preventDefault(),t.stopPropagation()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(wo);if(e||(e=new i(this),t.data(wo,e)),!/init/.test(n)&&"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(Do.CLICK_DATA_API,Fo,function(t){t.preventDefault(),Wo._jQueryInterface.call(p(this),"show")}).on(Do.KEYDOWN_DATA_API,Fo,function(t){Io.test(t.which)&&(t.preventDefault(),Wo._dataApiKeydownHandler.call(p(this),t))}).on("DOMContentLoaded",function(){Wo._jQueryInterface.call(p(Fo),"init")}),p.fn.tab=Wo._jQueryInterface,p.fn.tab.Constructor=Wo,p.fn.tab.noConflict=function(){return p.fn.tab=So,Wo._jQueryInterface};var Uo="toast",Bo="bs.toast",Qo="."+Bo,Ko=p.fn[Uo],qo={CLICK_DISMISS:"click.dismiss"+Qo,HIDE:"hide"+Qo,HIDDEN:"hidden"+Qo,SHOW:"show"+Qo,SHOWN:"shown"+Qo},Vo="fade",$o="hide",Yo="show",zo="showing",Xo={animation:"boolean",autohide:"boolean",delay:"number"},Go={animation:!0,autohide:!0,delay:500},Jo='[data-dismiss="toast"]',Zo=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;p(this._element).trigger(qo.SHOW),this._config.animation&&this._element.classList.add(Vo);var e=function(){t._element.classList.remove(zo),t._element.classList.add(Yo),p(t._element).trigger(qo.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove($o),this._element.classList.add(zo),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(Yo)&&(p(this._element).trigger(qo.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Yo)&&this._element.classList.remove(Yo),p(this._element).off(qo.CLICK_DISMISS),p.removeData(this._element,Bo),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},Go,p(this._element).data(),"object"==typeof t&&t?t:{}),m.typeCheckConfig(Uo,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;p(this._element).on(qo.CLICK_DISMISS,Jo,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add($o),p(t._element).trigger(qo.HIDDEN)};if(this._element.classList.remove(Yo),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Bo);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bo,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Xo}},{key:"Default",get:function(){return Go}}]),i}();p.fn[Uo]=Zo._jQueryInterface,p.fn[Uo].Constructor=Zo,p.fn[Uo].noConflict=function(){return p.fn[Uo]=Ko,Zo._jQueryInterface},function(){if("undefined"==typeof p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=p.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=m,t.Alert=g,t.Button=k,t.Carousel=at,t.Collapse=Ct,t.Dropdown=Xe,t.MegaMenu=hn,t.Modal=kn,t.Navbar=Rn,t.Otab=Yn,t.Popover=ji,t.PriorityNav=Ki,t.ScrollUp=Zi,t.Scrollspy=bo,t.Tab=Wo,t.Toast=Zo,t.Tooltip=Ei,Object.defineProperty(t,"__esModule",{value:!0})});
+//# sourceMappingURL=boosted.bundle.min.js.map \ No newline at end of file
diff --git a/dashboard/public/js/boosted.bundle.min.js.map b/dashboard/public/js/boosted.bundle.min.js.map
new file mode 100644
index 00000000..a8bc7695
--- /dev/null
+++ b/dashboard/public/js/boosted.bundle.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/popper.js/dist/esm/popper.js","../../js/src/dropdown.js","../../js/src/o-megamenu.js","../../js/src/modal.js","../../js/src/o-navbar.js","../../js/src/o-tab.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/o-priority-nav.js","../../js/src/o-scroll-up.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/src/index.js"],"names":["TRANSITION_END","transitionEndEmulator","duration","_this","this","called","$","one","Util","setTimeout","triggerTransitionEnd","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","ShadowRoot","parentNode","root","fn","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","NAME","DATA_KEY","EVENT_KEY","JQUERY_NO_CONFLICT","Event","CLOSE","CLOSED","CLICK_DATA_API","ClassName","Alert","_element","close","rootElement","_getRootElement","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","DATA_API_KEY","Selector","FOCUS_BLUR_DATA_API","Button","toggle","input","activeElement","classList","checked","add","setAttribute","contains","button","toggleClass","type","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","Direction","SLIDE","SLID","KEYDOWN","MOUSEENTER","MOUSELEAVE","TOUCHSTART","TOUCHMOVE","TOUCHEND","POINTERDOWN","POINTERUP","DRAG_START","LOAD_DATA_API","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","window","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","length","direction","off","_objectSpread","_handleSwipe","absDeltax","abs","_this2","_keydown","_addTouchEventListeners","_this3","start","originalEvent","pointerType","clientX","touches","end","clearTimeout","querySelectorAll","e","tagName","which","slice","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","directionalClassName","orderClassName","_this4","activeElementIndex","nextElement","nextElementIndex","isCycling","slidEvent","nextElementInterval","parseInt","defaultInterval","action","TypeError","ride","_dataApiClickHandler","slideIndex","carousels","i","len","$carousel","SHOW","SHOWN","HIDE","HIDDEN","Dimension","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","scrollSize","getBoundingClientRect","triggerArrayLength","isTransitioning","jquery","_getTargetFromElement","triggerArray","isOpen","$this","currentTarget","$trigger","selectors","$target","isBrowser","longerTimeoutBrowsers","timeoutDuration","userAgent","debounce","Promise","resolve","then","scheduled","isFunction","functionToCheck","getStyleComputedProperty","ownerDocument","defaultView","getComputedStyle","getParentNode","nodeName","host","getScrollParent","body","_getStyleComputedProp","overflow","overflowX","overflowY","isIE11","MSInputMethodContext","documentMode","isIE10","isIE","version","getOffsetParent","noOffsetParent","offsetParent","nextElementSibling","getRoot","node","findCommonOffsetParent","element1","element2","order","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","range","createRange","setStart","setEnd","commonAncestorContainer","firstElementChild","element1root","getScroll","upperSide","undefined","html","scrollingElement","getBordersSize","styles","axis","sideA","sideB","getSize","computedStyle","max","getWindowSizes","height","width","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","key","protoProps","staticProps","_extends","assign","source","getClientRect","offsets","right","left","bottom","top","rect","scrollTop","scrollLeft","result","sizes","clientWidth","clientHeight","horizScrollbar","offsetWidth","vertScrollbar","getOffsetRectRelativeToArbitraryNode","fixedPosition","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","subtract","modifier","includeScroll","getFixedPositionOffsetParent","parentElement","el","getBoundaries","popper","reference","padding","boundariesElement","boundaries","excludeScroll","relativeOffset","innerWidth","innerHeight","getViewportOffsetRectRelativeToArtbitraryNode","boundariesNode","isFixed","_getWindowSizes","isPaddingNumber","computeAutoPlacement","placement","refRect","rects","sortedAreas","keys","map","area","_ref","sort","a","b","filteredAreas","_ref2","computedPlacement","variation","getReferenceOffsets","state","getOuterSizes","x","marginBottom","y","marginRight","getOppositePlacement","hash","replace","matched","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","find","arr","check","Array","runModifiers","modifiers","ends","prop","findIndex","cur","forEach","console","warn","enabled","isModifierEnabled","modifierName","some","name","getSupportedPropertyName","prefixes","upperProp","charAt","toCheck","getWindow","setupEventListeners","options","updateBound","addEventListener","passive","scrollElement","attachToScrollParents","callback","scrollParents","isBody","eventsEnabled","disableEventListeners","cancelAnimationFrame","scheduleUpdate","removeEventListener","isNumeric","n","isNaN","isFinite","setStyles","unit","isFirefox","isModifierRequired","requestingName","requestedName","requesting","isRequired","_requesting","requested","placements","validPlacements","clockwise","counter","concat","reverse","BEHAVIORS","parseOffset","offset","basePlacement","useHeight","fragments","frag","divider","search","splitRegex","ops","op","mergeWithPrevious","reduce","str","toValue","index2","Defaults","positionFixed","removeOnDestroy","onCreate","onUpdate","shift","shiftvariation","_data$offsets","isVertical","side","shiftOffsets","preventOverflow","instance","transformProp","popperStyles","transform","priority","primary","escapeWithReference","secondary","min","keepTogether","floor","opSide","arrow","_data$offsets$arrow","arrowElement","sideCapitalized","altSide","arrowElementSize","center","popperMarginSide","popperBorderSide","sideValue","round","flip","flipped","originalPlacement","placementOpposite","flipOrder","behavior","step","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariationByRef","flipVariations","flippedVariationByContent","flipVariationsByContent","flippedVariation","inner","subtractLength","bound","attributes","computeStyle","legacyGpuAccelerationOption","gpuAcceleration","shouldRound","noRound","referenceWidth","popperWidth","isVariation","horizontalToInteger","verticalToInteger","offsetParentRect","position","devicePixelRatio","v","prefixedProperty","willChange","invertTop","invertLeft","x-placement","arrowStyles","applyStyle","removeAttribute","onLoad","modifierOptions","Popper","classCallCheck","requestAnimationFrame","update","isDestroyed","isCreated","enableEventListeners","removeChild","Utils","global","PopperUtils","REGEXP_KEYDOWN","ARROW_UP_KEYCODE","CLICK","KEYDOWN_DATA_API","KEYUP_DATA_API","AttachmentMap","boundary","display","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","_addAccessibility","disabled","_getParentFromElement","isActive","_clearMenus","showEvent","referenceElement","_getPopperConfig","noop","focus","first","hideEvent","destroy","stopPropagation","constructor","_getPlacement","$parentDropdown","_getOffset","popperConfig","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","MegaMenu","_$navLinks","_$goForwardLinks","_$goBackLinks","_$topCollapseMenus","_$navLinkCollapses","noFocus","_addAriaAttributes","goTo","_initPosition","_goForward","_goBackward","_manageKeyDown","_collapseFocus","_handleCollapseToggle","$subNavs","aria-hidden","navId","$thisNavToggler","$thisNav","$thisNavBackLink","$topMenu","goBackLabel","text","role","aria-controls","aria-expanded","aria-haspopup","aria-label","translatePercentage","parents","$rootNav","siblings","collapse","tabindex","$thisTarget","$thisCollapse","$targetNav","currentTranslatePercentage","$targetNavToggler","backdrop","FOCUSIN","RESIZE","CLICK_DISMISS","KEYDOWN_DISMISS","MOUSEUP_DISMISS","MOUSEDOWN_DISMISS","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_addAria","_checkScrollbar","_setScrollbar","_setEscapeEvent","_showBackdrop","_showElement","transition","_hideModal","htmlElement","ELEMENT_NODE","appendChild","_enforceFocus","shownEvent","transitionComplete","has","_this5","_this6","_resetScrollbar","_removeBackdrop","_this7","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","_getScrollbarWidth","_this8","fixedContent","actualRight","calculatedRight","actualPadding","paddingRight","calculatedPadding","scrollDiv","scrollbarWidth","$ModalPanel","$ModalTitle","$ModalDialog","aria-modal","ModalTitleId","aria-labelledby","_this9","sticky","Navbar","_supraBar","_initialHeight","outerHeight","_initialSupraHeight","hideSupra","extend","Otab","$tab","$tabpanel","uriAttrs","DefaultWhitelist","*","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","createdDocument","DOMParser","parseFromString","whitelistKeys","elements","_loop","elName","attributeList","whitelistedAttributes","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","l","allowedAttribute","innerHTML","CLASS_PREFIX","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","container","fallbackPlacement","sanitize","AUTO","TOP","RIGHT","BOTTOM","LEFT","HoverState","INSERTED","FOCUSOUT","Trigger","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","isWithContent","shadowRoot","isInTheDom","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","getElementsByTagName","dir","_handlePopperPlacementChange","complete","_fixTransition","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","empty","append","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","$tip","tabClass","join","popperData","popperInstance","initConfigAnimation","Popover","_getContent","PriorityNav","_$menu","_initMenu","_$allNavElements","_bindUIActions","_setupMenu","MenuLabel","$allNavElements","firstPos","$wrappedElements","$elm","eq","newSet","clone","$item","$itemDuplicate","prepend","_tearDown","dropdown","method","SCROLL","CLICK_SCROLL","SCROLL_TOP","ScrollUp","_scrollElement","proxy","_process","_backToTop","Number","_clear","ACTIVE","scrollUps","makeArray","$scrollup","ACTIVATE","OffsetMethod","ScrollSpy","_offsets","_targets","_activeTarget","_scrollHeight","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","pageYOffset","scrollHeight","_getOffsetHeight","maxScroll","_activate","queries","$link","scrollSpys","$spy","ARROW_LEFT_KEYCODE","Tab","previous","listElement","itemSelector","hiddenEvent","active","_transitionComplete","tabIndex","aria-selected","dropdownChild","dropdownElement","dropdownToggleList","$tablist","tabId","substr","Items","k","keyCode","nextTab","tab","autohide","Toast","withoutTimeout","_close"],"mappings":";;;;;;;;;;k6BAeA,IAAMA,EAAiB,gBAsBvB,SAASC,EAAsBC,GAAU,IAAAC,EAAAC,KACnCC,GAAS,EAYb,OAVAC,EAAEF,MAAMG,IAAIC,EAAKR,eAAgB,WAC/BK,GAAS,IAGXI,WAAW,WACJJ,GACHG,EAAKE,qBAAqBP,IAE3BD,GAEIE,KAcT,IAAMI,EAAO,CAEXR,eAAgB,kBAEhBW,OAJW,SAIJC,GACL,KAEEA,MAvDU,IAuDGC,KAAKC,UACXC,SAASC,eAAeJ,KACjC,OAAOA,GAGTK,uBAZW,SAYYC,GACrB,IAAIC,EAAWD,EAAQE,aAAa,eAEpC,IAAKD,GAAyB,MAAbA,EAAkB,CACjC,IAAME,EAAWH,EAAQE,aAAa,QACtCD,EAAWE,GAAyB,MAAbA,EAAmBA,EAASC,OAAS,GAG9D,IACE,OAAOP,SAASQ,cAAcJ,GAAYA,EAAW,KACrD,MAAOK,GACP,OAAO,OAIXC,iCA3BW,SA2BsBP,GAC/B,IAAKA,EACH,OAAO,EAIT,IAAIQ,EAAqBpB,EAAEY,GAASS,IAAI,uBACpCC,EAAkBtB,EAAEY,GAASS,IAAI,oBAE/BE,EAA0BC,WAAWJ,GACrCK,EAAuBD,WAAWF,GAGxC,OAAKC,GAA4BE,GAKjCL,EAAqBA,EAAmBM,MAAM,KAAK,GACnDJ,EAAkBA,EAAgBI,MAAM,KAAK,GA7FjB,KA+FpBF,WAAWJ,GAAsBI,WAAWF,KAP3C,GAUXK,OAnDW,SAmDJf,GACL,OAAOA,EAAQgB,cAGjBxB,qBAvDW,SAuDUQ,GACnBZ,EAAEY,GAASiB,QAAQnC,IAIrBoC,sBA5DW,WA6DT,OAAOC,QAAQrC,IAGjBsC,UAhEW,SAgEDC,GACR,OAAQA,EAAI,IAAMA,GAAKC,UAGzBC,gBApEW,SAoEKC,EAAeC,EAAQC,GACrC,IAAK,IAAMC,KAAYD,EACrB,GAAIE,OAAOC,UAAUC,eAAeC,KAAKL,EAAaC,GAAW,CAC/D,IAAMK,EAAgBN,EAAYC,GAC5BM,EAAgBR,EAAOE,GACvBO,EAAgBD,GAAS3C,EAAK8B,UAAUa,GAC1C,WAtHIZ,EAsHeY,EArHtB,GAAGE,SAASJ,KAAKV,GAAKe,MAAM,eAAe,GAAGC,eAuH/C,IAAK,IAAIC,OAAON,GAAeO,KAAKL,GAClC,MAAM,IAAIM,MACLhB,EAAciB,cAAjB,aACWd,EADX,oBACuCO,EADvC,wBAEsBF,EAFtB,MA1HZ,IAAgBX,GAkIdqB,eAtFW,SAsFI1C,GACb,IAAKH,SAAS8C,gBAAgBC,aAC5B,OAAO,KAIT,GAAmC,mBAAxB5C,EAAQ6C,YAKnB,OAAI7C,aAAmB8C,WACd9C,EAIJA,EAAQ+C,WAINzD,EAAKoD,eAAe1C,EAAQ+C,YAH1B,KAVP,IAAMC,EAAOhD,EAAQ6C,cACrB,OAAOG,aAAgBF,WAAaE,EAAO,OAxG/C5D,EAAE6D,GAAGC,qBAAuBnE,EAC5BK,EAAE+D,MAAMC,QAAQ9D,EAAKR,gBA9Bd,CACLuE,SAAUvE,EACVwE,aAAcxE,EACdyE,OAHK,SAGEJ,GACL,GAAI/D,EAAE+D,EAAMK,QAAQC,GAAGvE,MACrB,OAAOiE,EAAMO,UAAUC,QAAQC,MAAM1E,KAAM2E,aCdnD,IAAMC,EAAsB,QAEtBC,EAAsB,WACtBC,EAAS,IAAiBD,EAE1BE,EAAsB7E,EAAE6D,GAAGa,GAM3BI,EAAQ,CACZC,MAAK,QAAoBH,EACzBI,OAAM,SAAoBJ,EAC1BK,eAAc,QAAWL,EAVC,aAatBM,EACI,QADJA,EAEI,OAFJA,EAGI,OASJC,aACJ,SAAAA,EAAYvE,GACVd,KAAKsF,SAAWxE,6BAWlByE,MAAA,SAAMzE,GACJ,IAAI0E,EAAcxF,KAAKsF,SACnBxE,IACF0E,EAAcxF,KAAKyF,gBAAgB3E,IAGjBd,KAAK0F,mBAAmBF,GAE5BG,sBAIhB3F,KAAK4F,eAAeJ,MAGtBK,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,GAC5B7E,KAAKsF,SAAW,QAKlBG,gBAAA,SAAgB3E,GACd,IAAMC,EAAWX,EAAKS,uBAAuBC,GACzCiF,GAAa,EAUjB,OARIhF,IACFgF,EAASpF,SAASQ,cAAcJ,IAG7BgF,IACHA,EAAS7F,EAAEY,GAASkF,QAAX,IAAuBZ,GAAmB,IAG9CW,KAGTL,mBAAA,SAAmB5E,GACjB,IAAMmF,EAAa/F,EAAE8E,MAAMA,EAAMC,OAGjC,OADA/E,EAAEY,GAASiB,QAAQkE,GACZA,KAGTL,eAAA,SAAe9E,GAAS,IAAAf,EAAAC,KAGtB,GAFAE,EAAEY,GAASoF,YAAYd,GAElBlF,EAAEY,GAASqF,SAASf,GAAzB,CAKA,IAAM9D,EAAqBlB,EAAKiB,iCAAiCP,GAEjEZ,EAAEY,GACCX,IAAIC,EAAKR,eAAgB,SAACqE,GAAD,OAAWlE,EAAKqG,gBAAgBtF,EAASmD,KAClED,qBAAqB1C,QARtBtB,KAAKoG,gBAAgBtF,MAWzBsF,gBAAA,SAAgBtF,GACdZ,EAAEY,GACCuF,SACAtE,QAAQiD,EAAME,QACdoB,YAKEC,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAMC,EAAWvG,EAAEF,MACf0G,EAAaD,EAASC,KAAK7B,GAE1B6B,IACHA,EAAO,IAAIrB,EAAMrF,MACjByG,EAASC,KAAK7B,EAAU6B,IAGX,UAAXnE,GACFmE,EAAKnE,GAAQvC,WAKZ2G,eAAP,SAAsBC,GACpB,OAAO,SAAU3C,GACXA,GACFA,EAAM4C,iBAGRD,EAAcrB,MAAMvF,gDA/FtB,MApCwB,iBA8I5BE,EAAES,UAAUmG,GACV9B,EAAMG,eAxII,yBA0IVE,EAAMsB,eAAe,IAAItB,IAS3BnF,EAAE6D,GAAGa,GAAoBS,EAAMkB,iBAC/BrG,EAAE6D,GAAGa,GAAMmC,YAAc1B,EACzBnF,EAAE6D,GAAGa,GAAMoC,WAAc,WAEvB,OADA9G,EAAE6D,GAAGa,GAAQG,EACNM,EAAMkB,kBChKf,IAAM3B,EAAsB,SAEtBC,EAAsB,YACtBC,EAAS,IAAiBD,EAC1BoC,EAAsB,YACtBlC,EAAsB7E,EAAE6D,GAAGa,GAE3BQ,EACK,SADLA,EAEK,MAFLA,EAGK,QAGL8B,EACiB,0BADjBA,EAEiB,0BAFjBA,EAGiB,6BAHjBA,EAIiB,UAJjBA,EAKiB,OAGjBlC,EAAQ,CACZG,eAAc,QAAgBL,EAAYmC,EAC1CE,oBAAsB,QAAQrC,EAAYmC,EAApB,QACSnC,EAAYmC,GASvCG,aACJ,SAAAA,EAAYtG,GACVd,KAAKsF,SAAWxE,6BAWlBuG,OAAA,WACE,IAAM7B,EAActF,EAAEF,KAAKsF,UAAUU,QACnCkB,GACA,GAEII,EAAQtH,KAAKsF,SAASnE,cAAc+F,GAE1C,GAAI1B,EAAa,CACf,IAAM+B,EAAgB/B,EAAYrE,cAAc+F,GAE5CK,GACFA,EAAcC,UAAUlB,OAAOlB,GAI/BkC,EACEA,EAAMG,QACRzH,KAAKsF,SAASkC,UAAUE,IAAItC,GAE5BpF,KAAKsF,SAASkC,UAAUlB,OAAOlB,IAGjCpF,KAAKsF,SAASkC,UAAUH,OAAOjC,GAC/BpF,KAAKsF,SAASqC,aAAa,eACzB3H,KAAKsF,SAASkC,UAAUI,SAASxC,QAIvCS,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,GAC5B7E,KAAKsF,SAAW,QAKXiB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,GAEnB6B,IACHA,EAAO,IAAIU,EAAOpH,MAClBE,EAAEF,MAAM0G,KAAK7B,EAAU6B,IAGV,WAAXnE,GACFmE,EAAKnE,gDAlDT,MAxCwB,iBAsG5BrC,EAAES,UACCmG,GAAG9B,EAAMG,eAAgB+B,EAA6B,SAACjD,GACtD,IAAI4D,EAAS5D,EAAMK,OAEdpE,EAAE2H,GAAQ1B,SAASf,KACtByC,EAAS3H,EAAE2H,GAAQ7B,QAAQkB,IAG7BE,EAAOb,iBAAiB1D,KAAK3C,EAAE2H,GAAS,YAEzCf,GAAG9B,EAAMmC,oBAAqBD,EAA6B,SAACjD,GAC3D,IAAM4D,EAAS3H,EAAE+D,EAAMK,QAAQ0B,QAAQkB,GAAiB,GACpDW,GACF3H,EAAE2H,GAAQC,YAAY1C,EAAiB,eAAe/B,KAAKY,EAAM8D,SAGpEjB,GAAG9B,EAAMmC,oBAAmDD,EAA9BA,EAA8C,SAACjD,GAC5E,IAAM4D,EAAS3H,EAAE+D,EAAMK,QAAQ0B,QAAQkB,GAAiB,GACpDW,GACF3H,EAAE2H,GAAQC,YAAY1C,EAAiB,eAAe/B,KAAKY,EAAM8D,SAUvE7H,EAAE6D,GAAGa,GAAQwC,EAAOb,iBACpBrG,EAAE6D,GAAGa,GAAMmC,YAAcK,EACzBlH,EAAE6D,GAAGa,GAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,GAAQG,EACNqC,EAAOb,kBCvIhB,IAAM3B,EAAyB,WAEzBC,EAAyB,cACzBC,EAAS,IAAoBD,EAC7BoC,EAAyB,YACzBlC,EAAyB7E,EAAE6D,GAAGa,GAM9BoD,EAAU,CACdC,SAAW,IACXC,UAAW,EACXC,OAAW,EACXC,MAAW,QACXC,MAAW,EACXC,OAAW,GAGPC,EAAc,CAClBN,SAAW,mBACXC,SAAW,UACXC,MAAW,mBACXC,MAAW,mBACXC,KAAW,UACXC,MAAW,WAGPE,EACO,OADPA,EAEO,OAFPA,EAGO,OAHPA,EAIO,QAGPxD,EAAQ,CACZyD,MAAK,QAAoB3D,EACzB4D,KAAI,OAAoB5D,EACxB6D,QAAO,UAAoB7D,EAC3B8D,WAAU,aAAoB9D,EAC9B+D,WAAU,aAAoB/D,EAC9BgE,WAAU,aAAoBhE,EAC9BiE,UAAS,YAAoBjE,EAC7BkE,SAAQ,WAAoBlE,EAC5BmE,YAAW,cAAoBnE,EAC/BoE,UAAS,YAAoBpE,EAC7BqE,WAAU,YAAmBrE,EAC7BsE,cAAa,OAAWtE,EAAYmC,EACpC9B,eAAc,QAAWL,EAAYmC,GAGjC7B,EACY,WADZA,EAEY,SAFZA,EAGY,QAHZA,EAIY,sBAJZA,EAKY,qBALZA,EAMY,qBANZA,EAOY,qBAPZA,EASY,gBAGZ8B,EACU,UADVA,EAEU,wBAFVA,GAGU,iBAHVA,GAIU,qBAJVA,GAKU,2CALVA,GAMU,uBANVA,GAOU,gCAPVA,GAQU,yBAGVmC,GAAc,CAClBC,MAAQ,QACRC,IAAQ,OAQJC,cACJ,SAAAA,EAAY1I,EAASyB,GACnBvC,KAAKyJ,OAAiB,KACtBzJ,KAAK0J,UAAiB,KACtB1J,KAAK2J,eAAiB,KACtB3J,KAAK4J,WAAiB,EACtB5J,KAAK6J,YAAiB,EACtB7J,KAAK8J,aAAiB,KACtB9J,KAAK+J,YAAiB,EACtB/J,KAAKgK,YAAiB,EAEtBhK,KAAKiK,QAAqBjK,KAAKkK,WAAW3H,GAC1CvC,KAAKsF,SAAqBxE,EAC1Bd,KAAKmK,mBAAqBnK,KAAKsF,SAASnE,cAAc+F,IACtDlH,KAAKoK,gBAAqB,iBAAkBzJ,SAAS8C,iBAA8C,EAA3B4G,UAAUC,eAClFtK,KAAKuK,cAAqBtI,QAAQuI,OAAOC,cAAgBD,OAAOE,gBAEhE1K,KAAK2K,gDAePC,KAAA,WACO5K,KAAK6J,YACR7J,KAAK6K,OAAOrC,MAIhBsC,gBAAA,YAGOnK,SAASoK,QACX7K,EAAEF,KAAKsF,UAAUf,GAAG,aAAsD,WAAvCrE,EAAEF,KAAKsF,UAAU/D,IAAI,eACzDvB,KAAK4K,UAITI,KAAA,WACOhL,KAAK6J,YACR7J,KAAK6K,OAAOrC,MAIhBJ,MAAA,SAAMnE,GACCA,IACHjE,KAAK4J,WAAY,GAGf5J,KAAKsF,SAASnE,cAAc+F,MAC9B9G,EAAKE,qBAAqBN,KAAKsF,UAC/BtF,KAAKiL,OAAM,IAGbC,cAAclL,KAAK0J,WACnB1J,KAAK0J,UAAY,QAGnBuB,MAAA,SAAMhH,GACCA,IACHjE,KAAK4J,WAAY,GAGf5J,KAAK0J,YACPwB,cAAclL,KAAK0J,WACnB1J,KAAK0J,UAAY,MAGf1J,KAAKiK,QAAQhC,WAAajI,KAAK4J,YACjC5J,KAAK0J,UAAYyB,aACdxK,SAASyK,gBAAkBpL,KAAK8K,gBAAkB9K,KAAK4K,MAAMS,KAAKrL,MACnEA,KAAKiK,QAAQhC,cAKnBqD,GAAA,SAAGC,GAAO,IAAAxL,EAAAC,KACRA,KAAK2J,eAAiB3J,KAAKsF,SAASnE,cAAc+F,GAElD,IAAMsE,EAAcxL,KAAKyL,cAAczL,KAAK2J,gBAE5C,KAAI4B,EAAQvL,KAAKyJ,OAAOiC,OAAS,GAAKH,EAAQ,GAI9C,GAAIvL,KAAK6J,WACP3J,EAAEF,KAAKsF,UAAUnF,IAAI6E,EAAM0D,KAAM,WAAA,OAAM3I,EAAKuL,GAAGC,SADjD,CAKA,GAAIC,IAAgBD,EAGlB,OAFAvL,KAAKoI,aACLpI,KAAKiL,QAIP,IAAMU,EAAoBH,EAARD,EACd/C,EACAA,EAEJxI,KAAK6K,OAAOc,EAAW3L,KAAKyJ,OAAO8B,QAGrC1F,QAAA,WACE3F,EAAEF,KAAKsF,UAAUsG,IAAI9G,GACrB5E,EAAE4F,WAAW9F,KAAKsF,SAAUT,GAE5B7E,KAAKyJ,OAAqB,KAC1BzJ,KAAKiK,QAAqB,KAC1BjK,KAAKsF,SAAqB,KAC1BtF,KAAK0J,UAAqB,KAC1B1J,KAAK4J,UAAqB,KAC1B5J,KAAK6J,WAAqB,KAC1B7J,KAAK2J,eAAqB,KAC1B3J,KAAKmK,mBAAqB,QAK5BD,WAAA,SAAW3H,GAMT,OALAA,EAAMsJ,EAAA,GACD7D,EACAzF,GAELnC,EAAKiC,gBAAgBuC,EAAMrC,EAAQgG,GAC5BhG,KAGTuJ,aAAA,WACE,IAAMC,EAAYtL,KAAKuL,IAAIhM,KAAKgK,aAEhC,KAAI+B,GAxNuB,IAwN3B,CAIA,IAAMJ,EAAYI,EAAY/L,KAAKgK,YAGnB,EAAZ2B,GACF3L,KAAKgL,OAIHW,EAAY,GACd3L,KAAK4K,WAITD,mBAAA,WAAqB,IAAAsB,EAAAjM,KACfA,KAAKiK,QAAQ/B,UACfhI,EAAEF,KAAKsF,UACJwB,GAAG9B,EAAM2D,QAAS,SAAC1E,GAAD,OAAWgI,EAAKC,SAASjI,KAGrB,UAAvBjE,KAAKiK,QAAQ7B,OACflI,EAAEF,KAAKsF,UACJwB,GAAG9B,EAAM4D,WAAY,SAAC3E,GAAD,OAAWgI,EAAK7D,MAAMnE,KAC3C6C,GAAG9B,EAAM6D,WAAY,SAAC5E,GAAD,OAAWgI,EAAKhB,MAAMhH,KAG5CjE,KAAKiK,QAAQ3B,OACftI,KAAKmM,6BAITA,wBAAA,WAA0B,IAAAC,EAAApM,KACxB,GAAKA,KAAKoK,gBAAV,CAIA,IAAMiC,EAAQ,SAACpI,GACTmI,EAAK7B,eAAiBlB,GAAYpF,EAAMqI,cAAcC,YAAYhJ,eACpE6I,EAAKrC,YAAc9F,EAAMqI,cAAcE,QAC7BJ,EAAK7B,gBACf6B,EAAKrC,YAAc9F,EAAMqI,cAAcG,QAAQ,GAAGD,UAahDE,EAAM,SAACzI,GACPmI,EAAK7B,eAAiBlB,GAAYpF,EAAMqI,cAAcC,YAAYhJ,iBACpE6I,EAAKpC,YAAc/F,EAAMqI,cAAcE,QAAUJ,EAAKrC,aAGxDqC,EAAKN,eACsB,UAAvBM,EAAKnC,QAAQ7B,QASfgE,EAAKhE,QACDgE,EAAKtC,cACP6C,aAAaP,EAAKtC,cAEpBsC,EAAKtC,aAAezJ,WAAW,SAAC4D,GAAD,OAAWmI,EAAKnB,MAAMhH,IApS9B,IAoS+DmI,EAAKnC,QAAQhC,YAIvG/H,EAAEF,KAAKsF,SAASsH,iBAAiB1F,KAAoBJ,GAAG9B,EAAMmE,WAAY,SAAC0D,GAAD,OAAOA,EAAEhG,mBAC/E7G,KAAKuK,eACPrK,EAAEF,KAAKsF,UAAUwB,GAAG9B,EAAMiE,YAAa,SAAChF,GAAD,OAAWoI,EAAMpI,KACxD/D,EAAEF,KAAKsF,UAAUwB,GAAG9B,EAAMkE,UAAW,SAACjF,GAAD,OAAWyI,EAAIzI,KAEpDjE,KAAKsF,SAASkC,UAAUE,IAAItC,KAE5BlF,EAAEF,KAAKsF,UAAUwB,GAAG9B,EAAM8D,WAAY,SAAC7E,GAAD,OAAWoI,EAAMpI,KACvD/D,EAAEF,KAAKsF,UAAUwB,GAAG9B,EAAM+D,UAAW,SAAC9E,GAxC3B,IAACA,GAAAA,EAwCyCA,GAtC3CqI,cAAcG,SAAgD,EAArCxI,EAAMqI,cAAcG,QAAQf,OAC7DU,EAAKpC,YAAc,EAEnBoC,EAAKpC,YAAc/F,EAAMqI,cAAcG,QAAQ,GAAGD,QAAUJ,EAAKrC,cAoCnE7J,EAAEF,KAAKsF,UAAUwB,GAAG9B,EAAMgE,SAAU,SAAC/E,GAAD,OAAWyI,EAAIzI,UAIvDiI,SAAA,SAASjI,GACP,IAAI,kBAAkBZ,KAAKY,EAAMK,OAAOwI,SAIxC,OAAQ7I,EAAM8I,OACZ,KA7TyB,GA8TvB9I,EAAM4C,iBACN7G,KAAKgL,OACL,MACF,KAhUyB,GAiUvB/G,EAAM4C,iBACN7G,KAAK4K,WAMXa,cAAA,SAAc3K,GAIZ,OAHAd,KAAKyJ,OAAS3I,GAAWA,EAAQ+C,WAC7B,GAAGmJ,MAAMnK,KAAK/B,EAAQ+C,WAAW+I,iBAAiB1F,KAClD,GACGlH,KAAKyJ,OAAOwD,QAAQnM,MAG7BoM,oBAAA,SAAoBvB,EAAWpE,GAC7B,IAAM4F,EAAkBxB,IAAcnD,EAChC4E,EAAkBzB,IAAcnD,EAChCgD,EAAkBxL,KAAKyL,cAAclE,GACrC8F,EAAkBrN,KAAKyJ,OAAOiC,OAAS,EAI7C,IAHwB0B,GAAmC,IAAhB5B,GACnB2B,GAAmB3B,IAAgB6B,KAErCrN,KAAKiK,QAAQ5B,KACjC,OAAOd,EAGT,IACM+F,GAAa9B,GADDG,IAAcnD,GAAkB,EAAI,IACZxI,KAAKyJ,OAAOiC,OAEtD,OAAsB,IAAf4B,EACHtN,KAAKyJ,OAAOzJ,KAAKyJ,OAAOiC,OAAS,GAAK1L,KAAKyJ,OAAO6D,MAGxDC,mBAAA,SAAmBC,EAAeC,GAChC,IAAMC,EAAc1N,KAAKyL,cAAc+B,GACjCG,EAAY3N,KAAKyL,cAAczL,KAAKsF,SAASnE,cAAc+F,IAC3D0G,EAAa1N,EAAE8E,MAAMA,EAAMyD,MAAO,CACtC+E,cAAAA,EACA7B,UAAW8B,EACXI,KAAMF,EACNrC,GAAIoC,IAKN,OAFAxN,EAAEF,KAAKsF,UAAUvD,QAAQ6L,GAElBA,KAGTE,2BAAA,SAA2BhN,GACzB,GAAId,KAAKmK,mBAAoB,CAC3B,IAAM4D,EAAa,GAAGf,MAAMnK,KAAK7C,KAAKmK,mBAAmByC,iBAAiB1F,IAC1EhH,EAAE6N,GACC7H,YAAYd,GAEf,IAAM4I,EAAgBhO,KAAKmK,mBAAmB8D,SAC5CjO,KAAKyL,cAAc3K,IAGjBkN,GACF9N,EAAE8N,GAAeE,SAAS9I,OAKhCyF,OAAA,SAAOc,EAAW7K,GAAS,IAQrBqN,EACAC,EACAX,EAVqBY,EAAArO,KACnBuH,EAAgBvH,KAAKsF,SAASnE,cAAc+F,GAC5CoH,EAAqBtO,KAAKyL,cAAclE,GACxCgH,EAAgBzN,GAAWyG,GAC/BvH,KAAKkN,oBAAoBvB,EAAWpE,GAChCiH,EAAmBxO,KAAKyL,cAAc8C,GACtCE,EAAYxM,QAAQjC,KAAK0J,WAgB/B,GAPE+D,EAHE9B,IAAcnD,GAChB2F,EAAuB/I,EACvBgJ,EAAiBhJ,EACIoD,IAErB2F,EAAuB/I,EACvBgJ,EAAiBhJ,EACIoD,GAGnB+F,GAAerO,EAAEqO,GAAapI,SAASf,GACzCpF,KAAK6J,YAAa,OAKpB,IADmB7J,KAAKuN,mBAAmBgB,EAAad,GACzC9H,sBAIV4B,GAAkBgH,EAAvB,CAKAvO,KAAK6J,YAAa,EAEd4E,GACFzO,KAAKoI,QAGPpI,KAAK8N,2BAA2BS,GAEhC,IAAMG,EAAYxO,EAAE8E,MAAMA,EAAM0D,KAAM,CACpC8E,cAAee,EACf5C,UAAW8B,EACXI,KAAMS,EACNhD,GAAIkD,IAGN,GAAItO,EAAEF,KAAKsF,UAAUa,SAASf,GAAkB,CAC9ClF,EAAEqO,GAAaL,SAASE,GAExBhO,EAAKyB,OAAO0M,GAEZrO,EAAEqH,GAAe2G,SAASC,GAC1BjO,EAAEqO,GAAaL,SAASC,GAExB,IAAMQ,EAAsBC,SAASL,EAAYvN,aAAa,iBAAkB,IAG9EhB,KAAKiK,QAAQhC,SAFX0G,GACF3O,KAAKiK,QAAQ4E,gBAAkB7O,KAAKiK,QAAQ4E,iBAAmB7O,KAAKiK,QAAQhC,SACpD0G,GAEA3O,KAAKiK,QAAQ4E,iBAAmB7O,KAAKiK,QAAQhC,SAGvE,IAAM3G,EAAqBlB,EAAKiB,iCAAiCkG,GAEjErH,EAAEqH,GACCpH,IAAIC,EAAKR,eAAgB,WACxBM,EAAEqO,GACCrI,YAAeiI,EADlB,IAC0CC,GACvCF,SAAS9I,GAEZlF,EAAEqH,GAAerB,YAAed,EAAhC,IAAoDgJ,EAApD,IAAsED,GAEtEE,EAAKxE,YAAa,EAElBxJ,WAAW,WAAA,OAAMH,EAAEmO,EAAK/I,UAAUvD,QAAQ2M,IAAY,KAEvD1K,qBAAqB1C,QAExBpB,EAAEqH,GAAerB,YAAYd,GAC7BlF,EAAEqO,GAAaL,SAAS9I,GAExBpF,KAAK6J,YAAa,EAClB3J,EAAEF,KAAKsF,UAAUvD,QAAQ2M,GAGvBD,GACFzO,KAAKiL,YAMF1E,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,GACpBoF,EAAO4B,EAAA,GACN7D,EACA9H,EAAEF,MAAM0G,QAGS,iBAAXnE,IACT0H,EAAO4B,EAAA,GACF5B,EACA1H,IAIP,IAAMuM,EAA2B,iBAAXvM,EAAsBA,EAAS0H,EAAQ9B,MAO7D,GALKzB,IACHA,EAAO,IAAI8C,EAASxJ,KAAMiK,GAC1B/J,EAAEF,MAAM0G,KAAK7B,EAAU6B,IAGH,iBAAXnE,EACTmE,EAAK4E,GAAG/I,QACH,GAAsB,iBAAXuM,EAAqB,CACrC,GAA4B,oBAAjBpI,EAAKoI,GACd,MAAM,IAAIC,UAAJ,oBAAkCD,EAAlC,KAERpI,EAAKoI,UACI7E,EAAQhC,UAAYgC,EAAQ+E,OACrCtI,EAAK0B,QACL1B,EAAKuE,cAKJgE,qBAAP,SAA4BhL,GAC1B,IAAMlD,EAAWX,EAAKS,uBAAuBb,MAE7C,GAAKe,EAAL,CAIA,IAAMuD,EAASpE,EAAEa,GAAU,GAE3B,GAAKuD,GAAWpE,EAAEoE,GAAQ6B,SAASf,GAAnC,CAIA,IAAM7C,EAAMsJ,EAAA,GACP3L,EAAEoE,GAAQoC,OACVxG,EAAEF,MAAM0G,QAEPwI,EAAalP,KAAKgB,aAAa,iBAEjCkO,IACF3M,EAAO0F,UAAW,GAGpBuB,EAASjD,iBAAiB1D,KAAK3C,EAAEoE,GAAS/B,GAEtC2M,GACFhP,EAAEoE,GAAQoC,KAAK7B,GAAUyG,GAAG4D,GAG9BjL,EAAM4C,4DA/bN,MA3G2B,wCA+G3B,OAAOmB,WAqcX9H,EAAES,UACCmG,GAAG9B,EAAMG,eAAgB+B,GAAqBsC,GAASyF,sBAE1D/O,EAAEsK,QAAQ1D,GAAG9B,EAAMoE,cAAe,WAEhC,IADA,IAAM+F,EAAY,GAAGnC,MAAMnK,KAAKlC,SAASiM,iBAAiB1F,KACjDkI,EAAI,EAAGC,EAAMF,EAAUzD,OAAQ0D,EAAIC,EAAKD,IAAK,CACpD,IAAME,EAAYpP,EAAEiP,EAAUC,IAC9B5F,GAASjD,iBAAiB1D,KAAKyM,EAAWA,EAAU5I,WAUxDxG,EAAE6D,GAAGa,GAAQ4E,GAASjD,iBACtBrG,EAAE6D,GAAGa,GAAMmC,YAAcyC,GACzBtJ,EAAE6D,GAAGa,GAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,GAAQG,EACNyE,GAASjD,kBC1kBlB,IAAM3B,GAAsB,WAEtBC,GAAsB,cACtBC,GAAS,IAAiBD,GAE1BE,GAAsB7E,EAAE6D,GAAGa,IAE3BoD,GAAU,CACdX,QAAS,EACTtB,OAAS,IAGLwC,GAAc,CAClBlB,OAAS,UACTtB,OAAS,oBAGLf,GAAQ,CACZuK,KAAI,OAAoBzK,GACxB0K,MAAK,QAAoB1K,GACzB2K,KAAI,OAAoB3K,GACxB4K,OAAM,SAAoB5K,GAC1BK,eAAc,QAAWL,GAlBC,aAqBtBM,GACS,OADTA,GAES,WAFTA,GAGS,aAHTA,GAIS,YAGTuK,GACK,QADLA,GAEK,SAGLzI,GACU,qDADVA,GAEU,2BASV0I,cACJ,SAAAA,EAAY9O,EAASyB,GACnBvC,KAAK6P,kBAAmB,EACxB7P,KAAKsF,SAAmBxE,EACxBd,KAAKiK,QAAmBjK,KAAKkK,WAAW3H,GACxCvC,KAAK8P,cAAmB,GAAG9C,MAAMnK,KAAKlC,SAASiM,iBAC7C,mCAAmC9L,EAAQiP,GAA3C,6CAC0CjP,EAAQiP,GADlD,OAKF,IADA,IAAMC,EAAa,GAAGhD,MAAMnK,KAAKlC,SAASiM,iBAAiB1F,KAClDkI,EAAI,EAAGC,EAAMW,EAAWtE,OAAQ0D,EAAIC,EAAKD,IAAK,CACrD,IAAMa,EAAOD,EAAWZ,GAClBrO,EAAWX,EAAKS,uBAAuBoP,GACvCC,EAAgB,GAAGlD,MAAMnK,KAAKlC,SAASiM,iBAAiB7L,IAC3DoP,OAAO,SAACC,GAAD,OAAeA,IAActP,IAEtB,OAAbC,GAA4C,EAAvBmP,EAAcxE,SACrC1L,KAAKqQ,UAAYtP,EACjBf,KAAK8P,cAAcQ,KAAKL,IAI5BjQ,KAAKuQ,QAAUvQ,KAAKiK,QAAQlE,OAAS/F,KAAKwQ,aAAe,KAEpDxQ,KAAKiK,QAAQlE,QAChB/F,KAAKyQ,0BAA0BzQ,KAAKsF,SAAUtF,KAAK8P,eAGjD9P,KAAKiK,QAAQ5C,QACfrH,KAAKqH,oCAgBTA,OAAA,WACMnH,EAAEF,KAAKsF,UAAUa,SAASf,IAC5BpF,KAAK0Q,OAEL1Q,KAAK2Q,UAITA,KAAA,WAAO,IAMDC,EACAC,EAPC9Q,EAAAC,KACL,IAAIA,KAAK6P,mBACP3P,EAAEF,KAAKsF,UAAUa,SAASf,MAOxBpF,KAAKuQ,SAUgB,KATvBK,EAAU,GAAG5D,MAAMnK,KAAK7C,KAAKuQ,QAAQ3D,iBAAiB1F,KACnDiJ,OAAO,SAACF,GACP,MAAmC,iBAAxBlQ,EAAKkK,QAAQlE,OACfkK,EAAKjP,aAAa,iBAAmBjB,EAAKkK,QAAQlE,OAGpDkK,EAAKzI,UAAUI,SAASxC,OAGvBsG,SACVkF,EAAU,QAIVA,IACFC,EAAc3Q,EAAE0Q,GAASE,IAAI9Q,KAAKqQ,WAAW3J,KAAK7B,MAC/BgM,EAAYhB,mBAFjC,CAOA,IAAMkB,EAAa7Q,EAAE8E,MAAMA,GAAMuK,MAEjC,GADArP,EAAEF,KAAKsF,UAAUvD,QAAQgP,IACrBA,EAAWpL,qBAAf,CAIIiL,IACFhB,EAASrJ,iBAAiB1D,KAAK3C,EAAE0Q,GAASE,IAAI9Q,KAAKqQ,WAAY,QAC1DQ,GACH3Q,EAAE0Q,GAASlK,KAAK7B,GAAU,OAI9B,IAAMmM,EAAYhR,KAAKiR,gBAEvB/Q,EAAEF,KAAKsF,UACJY,YAAYd,IACZ8I,SAAS9I,IAEZpF,KAAKsF,SAAS4L,MAAMF,GAAa,EAE7BhR,KAAK8P,cAAcpE,QACrBxL,EAAEF,KAAK8P,eACJ5J,YAAYd,IACZ+L,KAAK,iBAAiB,GAG3BnR,KAAKoR,kBAAiB,GAEtB,IAcMC,EAAU,UADaL,EAAU,GAAGzN,cAAgByN,EAAUhE,MAAM,IAEpE1L,EAAqBlB,EAAKiB,iCAAiCrB,KAAKsF,UAEtEpF,EAAEF,KAAKsF,UACJnF,IAAIC,EAAKR,eAlBK,WACfM,EAAEH,EAAKuF,UACJY,YAAYd,IACZ8I,SAAS9I,IACT8I,SAAS9I,IAEZrF,EAAKuF,SAAS4L,MAAMF,GAAa,GAEjCjR,EAAKqR,kBAAiB,GAEtBlR,EAAEH,EAAKuF,UAAUvD,QAAQiD,GAAMwK,SAS9BxL,qBAAqB1C,GAExBtB,KAAKsF,SAAS4L,MAAMF,GAAgBhR,KAAKsF,SAAS+L,GAAlD,UAGFX,KAAA,WAAO,IAAAzE,EAAAjM,KACL,IAAIA,KAAK6P,kBACN3P,EAAEF,KAAKsF,UAAUa,SAASf,IAD7B,CAKA,IAAM2L,EAAa7Q,EAAE8E,MAAMA,GAAMyK,MAEjC,GADAvP,EAAEF,KAAKsF,UAAUvD,QAAQgP,IACrBA,EAAWpL,qBAAf,CAIA,IAAMqL,EAAYhR,KAAKiR,gBAEvBjR,KAAKsF,SAAS4L,MAAMF,GAAgBhR,KAAKsF,SAASgM,wBAAwBN,GAA1E,KAEA5Q,EAAKyB,OAAO7B,KAAKsF,UAEjBpF,EAAEF,KAAKsF,UACJ4I,SAAS9I,IACTc,YAAYd,IACZc,YAAYd,IAEf,IAAMmM,EAAqBvR,KAAK8P,cAAcpE,OAC9C,GAAyB,EAArB6F,EACF,IAAK,IAAInC,EAAI,EAAGA,EAAImC,EAAoBnC,IAAK,CAC3C,IAAMrN,EAAU/B,KAAK8P,cAAcV,GAC7BrO,EAAWX,EAAKS,uBAAuBkB,GAE7C,GAAiB,OAAbhB,EACYb,EAAE,GAAG8M,MAAMnK,KAAKlC,SAASiM,iBAAiB7L,KAC7CoF,SAASf,KAClBlF,EAAE6B,GAASmM,SAAS9I,IACjB+L,KAAK,iBAAiB,GAMjCnR,KAAKoR,kBAAiB,GAUtBpR,KAAKsF,SAAS4L,MAAMF,GAAa,GACjC,IAAM1P,EAAqBlB,EAAKiB,iCAAiCrB,KAAKsF,UAEtEpF,EAAEF,KAAKsF,UACJnF,IAAIC,EAAKR,eAZK,WACfqM,EAAKmF,kBAAiB,GACtBlR,EAAE+L,EAAK3G,UACJY,YAAYd,IACZ8I,SAAS9I,IACTrD,QAAQiD,GAAM0K,UAQhB1L,qBAAqB1C,QAG1B8P,iBAAA,SAAiBI,GACfxR,KAAK6P,iBAAmB2B,KAG1B3L,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAE5B7E,KAAKiK,QAAmB,KACxBjK,KAAKuQ,QAAmB,KACxBvQ,KAAKsF,SAAmB,KACxBtF,KAAK8P,cAAmB,KACxB9P,KAAK6P,iBAAmB,QAK1B3F,WAAA,SAAW3H,GAOT,OANAA,EAAMsJ,EAAA,GACD7D,GACAzF,IAEE8E,OAASpF,QAAQM,EAAO8E,QAC/BjH,EAAKiC,gBAAgBuC,GAAMrC,EAAQgG,IAC5BhG,KAGT0O,cAAA,WAEE,OADiB/Q,EAAEF,KAAKsF,UAAUa,SAASwJ,IACzBA,GAAkBA,MAGtCa,WAAA,WAAa,IACPzK,EADOqG,EAAApM,KAGPI,EAAK8B,UAAUlC,KAAKiK,QAAQlE,SAC9BA,EAAS/F,KAAKiK,QAAQlE,OAGoB,oBAA/B/F,KAAKiK,QAAQlE,OAAO0L,SAC7B1L,EAAS/F,KAAKiK,QAAQlE,OAAO,KAG/BA,EAASpF,SAASQ,cAAcnB,KAAKiK,QAAQlE,QAG/C,IAAMhF,EAAQ,yCAC6Bf,KAAKiK,QAAQlE,OAD1C,KAGRkI,EAAW,GAAGjB,MAAMnK,KAAKkD,EAAO6G,iBAAiB7L,IAQvD,OAPAb,EAAE+N,GAAUzH,KAAK,SAAC4I,EAAGtO,GACnBsL,EAAKqE,0BACHb,EAAS8B,sBAAsB5Q,GAC/B,CAACA,MAIEiF,KAGT0K,0BAAA,SAA0B3P,EAAS6Q,GACjC,IAAMC,EAAS1R,EAAEY,GAASqF,SAASf,IAE/BuM,EAAajG,QACfxL,EAAEyR,GACC7J,YAAY1C,IAAsBwM,GAClCT,KAAK,gBAAiBS,MAMtBF,sBAAP,SAA6B5Q,GAC3B,IAAMC,EAAWX,EAAKS,uBAAuBC,GAC7C,OAAOC,EAAWJ,SAASQ,cAAcJ,GAAY,QAGhDwF,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAMqL,EAAU3R,EAAEF,MACd0G,EAAYmL,EAAMnL,KAAK7B,IACrBoF,EAAO4B,EAAA,GACR7D,GACA6J,EAAMnL,OACY,iBAAXnE,GAAuBA,EAASA,EAAS,IAarD,IAVKmE,GAAQuD,EAAQ5C,QAAU,iBAAiBhE,KAAKd,KACnD0H,EAAQ5C,QAAS,GAGdX,IACHA,EAAO,IAAIkJ,EAAS5P,KAAMiK,GAC1B4H,EAAMnL,KAAK7B,GAAU6B,KAInB,OAAOrD,KAAKd,IAKM,iBAAXA,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDAvQT,MApFwB,wCAwFxB,OAAOyF,YA+QX9H,EAAES,UAAUmG,GAAG9B,GAAMG,eAAgB+B,GAAsB,SAAUjD,GAE/B,MAAhCA,EAAM6N,cAAchF,SACtB7I,EAAM4C,iBAGR,IAAMkL,EAAW7R,EAAEF,MACbe,EAAWX,EAAKS,uBAAuBb,MACvCgS,EAAY,GAAGhF,MAAMnK,KAAKlC,SAASiM,iBAAiB7L,IAE1Db,EAAE8R,GAAWxL,KAAK,WAChB,IAAMyL,EAAU/R,EAAEF,MAEZuC,EADU0P,EAAQvL,KAAK7B,IACN,SAAWkN,EAASrL,OAC3CkJ,GAASrJ,iBAAiB1D,KAAKoP,EAAS1P,OAIzCuE,GAAG,mBAAoB,WACtB5G,EAAEgH,IAAsBV,KAAK,WAC3B,IAAMlC,EAASsL,GAAS8B,sBAAsB1R,MAE9C4P,GAASrJ,iBAAiB1D,KAAK3C,EAAEoE,GAAS,YAWhDpE,EAAE6D,GAAGa,IAAQgL,GAASrJ,iBACtBrG,EAAE6D,GAAGa,IAAMmC,YAAc6I,GACzB1P,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACN6K,GAASrJ,kBCjYlB,IAJA,IAAI2L,GAA8B,oBAAX1H,QAA8C,oBAAb7J,SAEpDwR,GAAwB,CAAC,OAAQ,UAAW,WAC5CC,GAAkB,EACbhD,GAAI,EAAGA,GAAI+C,GAAsBzG,OAAQ0D,IAAK,EACrD,GAAI8C,IAAsE,GAAzD7H,UAAUgI,UAAUpF,QAAQkF,GAAsB/C,KAAU,CAC3EgD,GAAkB,EAClB,MA+BJ,IAWIE,GAXqBJ,IAAa1H,OAAO+H,QA3B7C,SAA2BxO,GACzB,IAAI9D,GAAS,EACb,OAAO,WACDA,IAGJA,GAAS,EACTuK,OAAO+H,QAAQC,UAAUC,KAAK,WAC5BxS,GAAS,EACT8D,SAKN,SAAsBA,GACpB,IAAI2O,GAAY,EAChB,OAAO,WACAA,IACHA,GAAY,EACZrS,WAAW,WACTqS,GAAY,EACZ3O,KACCqO,OAyBT,SAASO,GAAWC,GAElB,OAAOA,GAA8D,sBADvD,GACoB3P,SAASJ,KAAK+P,GAUlD,SAASC,GAAyB/R,EAAS2B,GACzC,GAAyB,IAArB3B,EAAQsB,SACV,MAAO,GAGT,IACIb,EADST,EAAQgS,cAAcC,YAClBC,iBAAiBlS,EAAS,MAC3C,OAAO2B,EAAWlB,EAAIkB,GAAYlB,EAUpC,SAAS0R,GAAcnS,GACrB,MAAyB,SAArBA,EAAQoS,SACHpS,EAEFA,EAAQ+C,YAAc/C,EAAQqS,KAUvC,SAASC,GAAgBtS,GAEvB,IAAKA,EACH,OAAOH,SAAS0S,KAGlB,OAAQvS,EAAQoS,UACd,IAAK,OACL,IAAK,OACH,OAAOpS,EAAQgS,cAAcO,KAC/B,IAAK,YACH,OAAOvS,EAAQuS,KAKnB,IAAIC,EAAwBT,GAAyB/R,GACjDyS,EAAWD,EAAsBC,SACjCC,EAAYF,EAAsBE,UAClCC,EAAYH,EAAsBG,UAEtC,MAAI,wBAAwBpQ,KAAKkQ,EAAWE,EAAYD,GAC/C1S,EAGFsS,GAAgBH,GAAcnS,IAGvC,IAAI4S,GAASxB,OAAgB1H,OAAOmJ,uBAAwBhT,SAASiT,cACjEC,GAAS3B,IAAa,UAAU7O,KAAKgH,UAAUgI,WASnD,SAASyB,GAAKC,GACZ,OAAgB,KAAZA,EACKL,GAEO,KAAZK,EACKF,GAEFH,IAAUG,GAUnB,SAASG,GAAgBlT,GACvB,IAAKA,EACH,OAAOH,SAAS8C,gBAQlB,IALA,IAAIwQ,EAAiBH,GAAK,IAAMnT,SAAS0S,KAAO,KAG5Ca,EAAepT,EAAQoT,cAAgB,KAEpCA,IAAiBD,GAAkBnT,EAAQqT,oBAChDD,GAAgBpT,EAAUA,EAAQqT,oBAAoBD,aAGxD,IAAIhB,EAAWgB,GAAgBA,EAAahB,SAE5C,OAAKA,GAAyB,SAAbA,GAAoC,SAAbA,GAMsB,IAA1D,CAAC,KAAM,KAAM,SAASjG,QAAQiH,EAAahB,WAA2E,WAAvDL,GAAyBqB,EAAc,YACjGF,GAAgBE,GAGlBA,EATEpT,EAAUA,EAAQgS,cAAcrP,gBAAkB9C,SAAS8C,gBA4BtE,SAAS2Q,GAAQC,GACf,OAAwB,OAApBA,EAAKxQ,WACAuQ,GAAQC,EAAKxQ,YAGfwQ,EAWT,SAASC,GAAuBC,EAAUC,GAExC,KAAKD,GAAaA,EAASnS,UAAaoS,GAAaA,EAASpS,UAC5D,OAAOzB,SAAS8C,gBAIlB,IAAIgR,EAAQF,EAASG,wBAAwBF,GAAYG,KAAKC,4BAC1DvI,EAAQoI,EAAQF,EAAWC,EAC3B9H,EAAM+H,EAAQD,EAAWD,EAGzBM,EAAQlU,SAASmU,cACrBD,EAAME,SAAS1I,EAAO,GACtBwI,EAAMG,OAAOtI,EAAK,GAClB,IA/CyB5L,EACrBoS,EA8CA+B,EAA0BJ,EAAMI,wBAIpC,GAAIV,IAAaU,GAA2BT,IAAaS,GAA2B5I,EAAMzE,SAAS8E,GACjG,MAjDe,UAFbwG,GADqBpS,EAoDDmU,GAnDD/B,WAKH,SAAbA,GAAuBc,GAAgBlT,EAAQoU,qBAAuBpU,EAkDpEkT,GAAgBiB,GAHdA,EAOX,IAAIE,EAAef,GAAQG,GAC3B,OAAIY,EAAahC,KACRmB,GAAuBa,EAAahC,KAAMqB,GAE1CF,GAAuBC,EAAUH,GAAQI,GAAUrB,MAY9D,SAASiC,GAAUtU,GACjB,IAEIuU,EAAqB,SAFK,EAAnB1Q,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,GAAmBA,UAAU,GAAK,OAE9C,YAAc,aAC3CuO,EAAWpS,EAAQoS,SAEvB,GAAiB,SAAbA,GAAoC,SAAbA,EAM3B,OAAOpS,EAAQuU,GALb,IAAIE,EAAOzU,EAAQgS,cAAcrP,gBAEjC,OADuB3C,EAAQgS,cAAc0C,kBAAoBD,GACzCF,GAsC5B,SAASI,GAAeC,EAAQC,GAC9B,IAAIC,EAAiB,MAATD,EAAe,OAAS,MAChCE,EAAkB,SAAVD,EAAmB,QAAU,SAEzC,OAAOlU,WAAWgU,EAAO,SAAWE,EAAQ,SAAU,IAAMlU,WAAWgU,EAAO,SAAWG,EAAQ,SAAU,IAG7G,SAASC,GAAQH,EAAMtC,EAAMkC,EAAMQ,GACjC,OAAOtV,KAAKuV,IAAI3C,EAAK,SAAWsC,GAAOtC,EAAK,SAAWsC,GAAOJ,EAAK,SAAWI,GAAOJ,EAAK,SAAWI,GAAOJ,EAAK,SAAWI,GAAO7B,GAAK,IAAMlF,SAAS2G,EAAK,SAAWI,IAAS/G,SAASmH,EAAc,UAAqB,WAATJ,EAAoB,MAAQ,UAAY/G,SAASmH,EAAc,UAAqB,WAATJ,EAAoB,SAAW,WAAa,GAG5U,SAASM,GAAetV,GACtB,IAAI0S,EAAO1S,EAAS0S,KAChBkC,EAAO5U,EAAS8C,gBAChBsS,EAAgBjC,GAAK,KAAOd,iBAAiBuC,GAEjD,MAAO,CACLW,OAAQJ,GAAQ,SAAUzC,EAAMkC,EAAMQ,GACtCI,MAAOL,GAAQ,QAASzC,EAAMkC,EAAMQ,IAIxC,IAMIK,GAAc,WAChB,SAASC,EAAiB/R,EAAQgS,GAChC,IAAK,IAAIlH,EAAI,EAAGA,EAAIkH,EAAM5K,OAAQ0D,IAAK,CACrC,IAAImH,EAAaD,EAAMlH,GACvBmH,EAAWC,WAAaD,EAAWC,aAAc,EACjDD,EAAWE,cAAe,EACtB,UAAWF,IAAYA,EAAWG,UAAW,GACjDhU,OAAOiU,eAAerS,EAAQiS,EAAWK,IAAKL,IAIlD,OAAO,SAAUxP,EAAa8P,EAAYC,GAGxC,OAFID,GAAYR,EAAiBtP,EAAYpE,UAAWkU,GACpDC,GAAaT,EAAiBtP,EAAa+P,GACxC/P,GAdO,GAsBd4P,GAAiB,SAAUxU,EAAKyU,EAAK7T,GAYvC,OAXI6T,KAAOzU,EACTO,OAAOiU,eAAexU,EAAKyU,EAAK,CAC9B7T,MAAOA,EACPyT,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZvU,EAAIyU,GAAO7T,EAGNZ,GAGL4U,GAAWrU,OAAOsU,QAAU,SAAU1S,GACxC,IAAK,IAAI8K,EAAI,EAAGA,EAAIzK,UAAU+G,OAAQ0D,IAAK,CACzC,IAAI6H,EAAStS,UAAUyK,GAEvB,IAAK,IAAIwH,KAAOK,EACVvU,OAAOC,UAAUC,eAAeC,KAAKoU,EAAQL,KAC/CtS,EAAOsS,GAAOK,EAAOL,IAK3B,OAAOtS,GAUT,SAAS4S,GAAcC,GACrB,OAAOJ,GAAS,GAAII,EAAS,CAC3BC,MAAOD,EAAQE,KAAOF,EAAQhB,MAC9BmB,OAAQH,EAAQI,IAAMJ,EAAQjB,SAWlC,SAAS5E,GAAsBxQ,GAC7B,IAAI0W,EAAO,GAKX,IACE,GAAI1D,GAAK,IAAK,CACZ0D,EAAO1W,EAAQwQ,wBACf,IAAImG,EAAYrC,GAAUtU,EAAS,OAC/B4W,EAAatC,GAAUtU,EAAS,QACpC0W,EAAKD,KAAOE,EACZD,EAAKH,MAAQK,EACbF,EAAKF,QAAUG,EACfD,EAAKJ,OAASM,OAEdF,EAAO1W,EAAQwQ,wBAEjB,MAAOzE,IAET,IAAI8K,EAAS,CACXN,KAAMG,EAAKH,KACXE,IAAKC,EAAKD,IACVpB,MAAOqB,EAAKJ,MAAQI,EAAKH,KACzBnB,OAAQsB,EAAKF,OAASE,EAAKD,KAIzBK,EAA6B,SAArB9W,EAAQoS,SAAsB+C,GAAenV,EAAQgS,eAAiB,GAC9EqD,EAAQyB,EAAMzB,OAASrV,EAAQ+W,aAAeF,EAAOP,MAAQO,EAAON,KACpEnB,EAAS0B,EAAM1B,QAAUpV,EAAQgX,cAAgBH,EAAOL,OAASK,EAAOJ,IAExEQ,EAAiBjX,EAAQkX,YAAc7B,EACvC8B,EAAgBnX,EAAQgB,aAAeoU,EAI3C,GAAI6B,GAAkBE,EAAe,CACnC,IAAIvC,EAAS7C,GAAyB/R,GACtCiX,GAAkBtC,GAAeC,EAAQ,KACzCuC,GAAiBxC,GAAeC,EAAQ,KAExCiC,EAAOxB,OAAS4B,EAChBJ,EAAOzB,QAAU+B,EAGnB,OAAOf,GAAcS,GAGvB,SAASO,GAAqCjK,EAAUlI,GACtD,IAAIoS,EAAmC,EAAnBxT,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,IAAmBA,UAAU,GAE/EkP,EAASC,GAAK,IACdsE,EAA6B,SAApBrS,EAAOmN,SAChBmF,EAAe/G,GAAsBrD,GACrCqK,EAAahH,GAAsBvL,GACnCwS,EAAenF,GAAgBnF,GAE/ByH,EAAS7C,GAAyB9M,GAClCyS,EAAiB9W,WAAWgU,EAAO8C,eAAgB,IACnDC,EAAkB/W,WAAWgU,EAAO+C,gBAAiB,IAGrDN,GAAiBC,IACnBE,EAAWf,IAAM9W,KAAKuV,IAAIsC,EAAWf,IAAK,GAC1Ce,EAAWjB,KAAO5W,KAAKuV,IAAIsC,EAAWjB,KAAM,IAE9C,IAAIF,EAAUD,GAAc,CAC1BK,IAAKc,EAAad,IAAMe,EAAWf,IAAMiB,EACzCnB,KAAMgB,EAAahB,KAAOiB,EAAWjB,KAAOoB,EAC5CtC,MAAOkC,EAAalC,MACpBD,OAAQmC,EAAanC,SASvB,GAPAiB,EAAQuB,UAAY,EACpBvB,EAAQwB,WAAa,GAMhB9E,GAAUuE,EAAQ,CACrB,IAAIM,EAAYhX,WAAWgU,EAAOgD,UAAW,IACzCC,EAAajX,WAAWgU,EAAOiD,WAAY,IAE/CxB,EAAQI,KAAOiB,EAAiBE,EAChCvB,EAAQG,QAAUkB,EAAiBE,EACnCvB,EAAQE,MAAQoB,EAAkBE,EAClCxB,EAAQC,OAASqB,EAAkBE,EAGnCxB,EAAQuB,UAAYA,EACpBvB,EAAQwB,WAAaA,EAOvB,OAJI9E,IAAWsE,EAAgBpS,EAAO6B,SAAS2Q,GAAgBxS,IAAWwS,GAA0C,SAA1BA,EAAarF,YACrGiE,EA1NJ,SAAuBK,EAAM1W,GAC3B,IAAI8X,EAA8B,EAAnBjU,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,IAAmBA,UAAU,GAE1E8S,EAAYrC,GAAUtU,EAAS,OAC/B4W,EAAatC,GAAUtU,EAAS,QAChC+X,EAAWD,GAAY,EAAI,EAK/B,OAJApB,EAAKD,KAAOE,EAAYoB,EACxBrB,EAAKF,QAAUG,EAAYoB,EAC3BrB,EAAKH,MAAQK,EAAamB,EAC1BrB,EAAKJ,OAASM,EAAamB,EACpBrB,EAgNKsB,CAAc3B,EAASpR,IAG5BoR,EAuDT,SAAS4B,GAA6BjY,GAEpC,IAAKA,IAAYA,EAAQkY,eAAiBlF,KACxC,OAAOnT,SAAS8C,gBAGlB,IADA,IAAIwV,EAAKnY,EAAQkY,cACVC,GAAoD,SAA9CpG,GAAyBoG,EAAI,cACxCA,EAAKA,EAAGD,cAEV,OAAOC,GAAMtY,SAAS8C,gBAcxB,SAASyV,GAAcC,EAAQC,EAAWC,EAASC,GACjD,IAAInB,EAAmC,EAAnBxT,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,IAAmBA,UAAU,GAI/E4U,EAAa,CAAEhC,IAAK,EAAGF,KAAM,GAC7BnD,EAAeiE,EAAgBY,GAA6BI,GAAU7E,GAAuB6E,EAAQC,GAGzG,GAA0B,aAAtBE,EACFC,EArFJ,SAAuDzY,GACrD,IAAI0Y,EAAmC,EAAnB7U,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,IAAmBA,UAAU,GAE/E4Q,EAAOzU,EAAQgS,cAAcrP,gBAC7BgW,EAAiBvB,GAAqCpX,EAASyU,GAC/DY,EAAQ1V,KAAKuV,IAAIT,EAAKsC,YAAarN,OAAOkP,YAAc,GACxDxD,EAASzV,KAAKuV,IAAIT,EAAKuC,aAActN,OAAOmP,aAAe,GAE3DlC,EAAa+B,EAAkC,EAAlBpE,GAAUG,GACvCmC,EAAc8B,EAA0C,EAA1BpE,GAAUG,EAAM,QASlD,OAAO2B,GAPM,CACXK,IAAKE,EAAYgC,EAAelC,IAAMkC,EAAef,UACrDrB,KAAMK,EAAa+B,EAAepC,KAAOoC,EAAed,WACxDxC,MAAOA,EACPD,OAAQA,IAsEK0D,CAA8C1F,EAAciE,OACpE,CAEL,IAAI0B,OAAiB,EACK,iBAAtBP,EAE8B,UADhCO,EAAiBzG,GAAgBH,GAAcmG,KAC5BlG,WACjB2G,EAAiBV,EAAOrG,cAAcrP,iBAGxCoW,EAD+B,WAAtBP,EACQH,EAAOrG,cAAcrP,gBAErB6V,EAGnB,IAAInC,EAAUe,GAAqC2B,EAAgB3F,EAAciE,GAGjF,GAAgC,SAA5B0B,EAAe3G,UA1EvB,SAAS4G,EAAQhZ,GACf,IAAIoS,EAAWpS,EAAQoS,SACvB,GAAiB,SAAbA,GAAoC,SAAbA,EACzB,OAAO,EAET,GAAsD,UAAlDL,GAAyB/R,EAAS,YACpC,OAAO,EAET,IAAI+C,EAAaoP,GAAcnS,GAC/B,QAAK+C,GAGEiW,EAAQjW,GA8D8BiW,CAAQ5F,GAWjDqF,EAAapC,MAXmD,CAChE,IAAI4C,EAAkB9D,GAAekD,EAAOrG,eACxCoD,EAAS6D,EAAgB7D,OACzBC,EAAQ4D,EAAgB5D,MAE5BoD,EAAWhC,KAAOJ,EAAQI,IAAMJ,EAAQuB,UACxCa,EAAWjC,OAASpB,EAASiB,EAAQI,IACrCgC,EAAWlC,MAAQF,EAAQE,KAAOF,EAAQwB,WAC1CY,EAAWnC,MAAQjB,EAAQgB,EAAQE,MASvC,IAAI2C,EAAqC,iBADzCX,EAAUA,GAAW,GAOrB,OALAE,EAAWlC,MAAQ2C,EAAkBX,EAAUA,EAAQhC,MAAQ,EAC/DkC,EAAWhC,KAAOyC,EAAkBX,EAAUA,EAAQ9B,KAAO,EAC7DgC,EAAWnC,OAAS4C,EAAkBX,EAAUA,EAAQjC,OAAS,EACjEmC,EAAWjC,QAAU0C,EAAkBX,EAAUA,EAAQ/B,QAAU,EAE5DiC,EAmBT,SAASU,GAAqBC,EAAWC,EAAShB,EAAQC,EAAWE,GACnE,IAAID,EAA6B,EAAnB1U,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,GAAmBA,UAAU,GAAK,EAElF,IAAmC,IAA/BuV,EAAUjN,QAAQ,QACpB,OAAOiN,EAGT,IAAIX,EAAaL,GAAcC,EAAQC,EAAWC,EAASC,GAEvDc,EAAQ,CACV7C,IAAK,CACHpB,MAAOoD,EAAWpD,MAClBD,OAAQiE,EAAQ5C,IAAMgC,EAAWhC,KAEnCH,MAAO,CACLjB,MAAOoD,EAAWnC,MAAQ+C,EAAQ/C,MAClClB,OAAQqD,EAAWrD,QAErBoB,OAAQ,CACNnB,MAAOoD,EAAWpD,MAClBD,OAAQqD,EAAWjC,OAAS6C,EAAQ7C,QAEtCD,KAAM,CACJlB,MAAOgE,EAAQ9C,KAAOkC,EAAWlC,KACjCnB,OAAQqD,EAAWrD,SAInBmE,EAAc3X,OAAO4X,KAAKF,GAAOG,IAAI,SAAU3D,GACjD,OAAOG,GAAS,CACdH,IAAKA,GACJwD,EAAMxD,GAAM,CACb4D,MAhDWC,EAgDGL,EAAMxD,GA/CZ6D,EAAKtE,MACJsE,EAAKvE,UAFpB,IAAiBuE,IAkDZC,KAAK,SAAUC,EAAGC,GACnB,OAAOA,EAAEJ,KAAOG,EAAEH,OAGhBK,EAAgBR,EAAYlK,OAAO,SAAU2K,GAC/C,IAAI3E,EAAQ2E,EAAM3E,MACdD,EAAS4E,EAAM5E,OACnB,OAAOC,GAASgD,EAAOtB,aAAe3B,GAAUiD,EAAOrB,eAGrDiD,EAA2C,EAAvBF,EAAcnP,OAAamP,EAAc,GAAGjE,IAAMyD,EAAY,GAAGzD,IAErFoE,EAAYd,EAAUtY,MAAM,KAAK,GAErC,OAAOmZ,GAAqBC,EAAY,IAAMA,EAAY,IAa5D,SAASC,GAAoBC,EAAO/B,EAAQC,GAC1C,IAAIjB,EAAmC,EAAnBxT,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,GAAmBA,UAAU,GAAK,KAGxF,OAAOuT,GAAqCkB,EADnBjB,EAAgBY,GAA6BI,GAAU7E,GAAuB6E,EAAQC,GACpCjB,GAU7E,SAASgD,GAAcra,GACrB,IACI4U,EADS5U,EAAQgS,cAAcC,YACfC,iBAAiBlS,GACjCsa,EAAI1Z,WAAWgU,EAAOgD,WAAa,GAAKhX,WAAWgU,EAAO2F,cAAgB,GAC1EC,EAAI5Z,WAAWgU,EAAOiD,YAAc,GAAKjX,WAAWgU,EAAO6F,aAAe,GAK9E,MAJa,CACXpF,MAAOrV,EAAQkX,YAAcsD,EAC7BpF,OAAQpV,EAAQgB,aAAesZ,GAYnC,SAASI,GAAqBtB,GAC5B,IAAIuB,EAAO,CAAEpE,KAAM,QAASD,MAAO,OAAQE,OAAQ,MAAOC,IAAK,UAC/D,OAAO2C,EAAUwB,QAAQ,yBAA0B,SAAUC,GAC3D,OAAOF,EAAKE,KAchB,SAASC,GAAiBzC,EAAQ0C,EAAkB3B,GAClDA,EAAYA,EAAUtY,MAAM,KAAK,GAGjC,IAAIka,EAAaX,GAAchC,GAG3B4C,EAAgB,CAClB5F,MAAO2F,EAAW3F,MAClBD,OAAQ4F,EAAW5F,QAIjB8F,GAAoD,IAA1C,CAAC,QAAS,QAAQ/O,QAAQiN,GACpC+B,EAAWD,EAAU,MAAQ,OAC7BE,EAAgBF,EAAU,OAAS,MACnCG,EAAcH,EAAU,SAAW,QACnCI,EAAwBJ,EAAqB,QAAX,SAStC,OAPAD,EAAcE,GAAYJ,EAAiBI,GAAYJ,EAAiBM,GAAe,EAAIL,EAAWK,GAAe,EAEnHJ,EAAcG,GADZhC,IAAcgC,EACeL,EAAiBK,GAAiBJ,EAAWM,GAE7CP,EAAiBL,GAAqBU,IAGhEH,EAYT,SAASM,GAAKC,EAAKC,GAEjB,OAAIC,MAAM7Z,UAAU0Z,KACXC,EAAID,KAAKE,GAIXD,EAAInM,OAAOoM,GAAO,GAqC3B,SAASE,GAAaC,EAAWhW,EAAMiW,GAoBrC,YAnB8BrH,IAATqH,EAAqBD,EAAYA,EAAU1P,MAAM,EA1BxE,SAAmBsP,EAAKM,EAAM7Z,GAE5B,GAAIyZ,MAAM7Z,UAAUka,UAClB,OAAOP,EAAIO,UAAU,SAAUC,GAC7B,OAAOA,EAAIF,KAAU7Z,IAKzB,IAAIG,EAAQmZ,GAAKC,EAAK,SAAUna,GAC9B,OAAOA,EAAIya,KAAU7Z,IAEvB,OAAOuZ,EAAIrP,QAAQ/J,GAcsD2Z,CAAUH,EAAW,OAAQC,KAEvFI,QAAQ,SAAUlE,GAC3BA,EAAmB,UAErBmE,QAAQC,KAAK,yDAEf,IAAIlZ,EAAK8U,EAAmB,UAAKA,EAAS9U,GACtC8U,EAASqE,SAAWvK,GAAW5O,KAIjC2C,EAAKyQ,QAAQgC,OAASjC,GAAcxQ,EAAKyQ,QAAQgC,QACjDzS,EAAKyQ,QAAQiC,UAAYlC,GAAcxQ,EAAKyQ,QAAQiC,WAEpD1S,EAAO3C,EAAG2C,EAAMmS,MAIbnS,EA8DT,SAASyW,GAAkBT,EAAWU,GACpC,OAAOV,EAAUW,KAAK,SAAU5C,GAC9B,IAAI6C,EAAO7C,EAAK6C,KAEhB,OADc7C,EAAKyC,SACDI,IAASF,IAW/B,SAASG,GAAyB9a,GAIhC,IAHA,IAAI+a,EAAW,EAAC,EAAO,KAAM,SAAU,MAAO,KAC1CC,EAAYhb,EAASib,OAAO,GAAGna,cAAgBd,EAASuK,MAAM,GAEzDoC,EAAI,EAAGA,EAAIoO,EAAS9R,OAAQ0D,IAAK,CACxC,IAAI5O,EAASgd,EAASpO,GAClBuO,EAAUnd,EAAS,GAAKA,EAASid,EAAYhb,EACjD,GAA4C,oBAAjC9B,SAAS0S,KAAKnC,MAAMyM,GAC7B,OAAOA,EAGX,OAAO,KAsCT,SAASC,GAAU9c,GACjB,IAAIgS,EAAgBhS,EAAQgS,cAC5B,OAAOA,EAAgBA,EAAcC,YAAcvI,OAoBrD,SAASqT,GAAoBzE,EAAW0E,EAAS5C,EAAO6C,GAEtD7C,EAAM6C,YAAcA,EACpBH,GAAUxE,GAAW4E,iBAAiB,SAAU9C,EAAM6C,YAAa,CAAEE,SAAS,IAG9E,IAAIC,EAAgB9K,GAAgBgG,GAKpC,OA5BF,SAAS+E,EAAsB5F,EAActU,EAAOma,EAAUC,GAC5D,IAAIC,EAAmC,SAA1B/F,EAAarF,SACtB5O,EAASga,EAAS/F,EAAazF,cAAcC,YAAcwF,EAC/DjU,EAAO0Z,iBAAiB/Z,EAAOma,EAAU,CAAEH,SAAS,IAE/CK,GACHH,EAAsB/K,GAAgB9O,EAAOT,YAAaI,EAAOma,EAAUC,GAE7EA,EAAc/N,KAAKhM,GAgBnB6Z,CAAsBD,EAAe,SAAUhD,EAAM6C,YAAa7C,EAAMmD,eACxEnD,EAAMgD,cAAgBA,EACtBhD,EAAMqD,eAAgB,EAEfrD,EA6CT,SAASsD,KAxBT,IAA8BpF,EAAW8B,EAyBnClb,KAAKkb,MAAMqD,gBACbE,qBAAqBze,KAAK0e,gBAC1B1e,KAAKkb,OA3BqB9B,EA2BQpZ,KAAKoZ,UA3BF8B,EA2Balb,KAAKkb,MAzBzD0C,GAAUxE,GAAWuF,oBAAoB,SAAUzD,EAAM6C,aAGzD7C,EAAMmD,cAActB,QAAQ,SAAUzY,GACpCA,EAAOqa,oBAAoB,SAAUzD,EAAM6C,eAI7C7C,EAAM6C,YAAc,KACpB7C,EAAMmD,cAAgB,GACtBnD,EAAMgD,cAAgB,KACtBhD,EAAMqD,eAAgB,EACfrD,IAwBT,SAAS0D,GAAUC,GACjB,MAAa,KAANA,IAAaC,MAAMpd,WAAWmd,KAAOE,SAASF,GAWvD,SAASG,GAAUle,EAAS4U,GAC1BhT,OAAO4X,KAAK5E,GAAQqH,QAAQ,SAAUH,GACpC,IAAIqC,EAAO,IAEkE,IAAzE,CAAC,QAAS,SAAU,MAAO,QAAS,SAAU,QAAQhS,QAAQ2P,IAAgBgC,GAAUlJ,EAAOkH,MACjGqC,EAAO,MAETne,EAAQoQ,MAAM0L,GAAQlH,EAAOkH,GAAQqC,IAgIzC,IAAIC,GAAYhN,IAAa,WAAW7O,KAAKgH,UAAUgI,WA8GvD,SAAS8M,GAAmBzC,EAAW0C,EAAgBC,GACrD,IAAIC,EAAajD,GAAKK,EAAW,SAAUjC,GAEzC,OADWA,EAAK6C,OACA8B,IAGdG,IAAeD,GAAc5C,EAAUW,KAAK,SAAUxE,GACxD,OAAOA,EAASyE,OAAS+B,GAAiBxG,EAASqE,SAAWrE,EAASpE,MAAQ6K,EAAW7K,QAG5F,IAAK8K,EAAY,CACf,IAAIC,EAAc,IAAMJ,EAAiB,IACrCK,EAAY,IAAMJ,EAAgB,IACtCrC,QAAQC,KAAKwC,EAAY,4BAA8BD,EAAc,4DAA8DA,EAAc,KAEnJ,OAAOD,EAoIT,IAAIG,GAAa,CAAC,aAAc,OAAQ,WAAY,YAAa,MAAO,UAAW,cAAe,QAAS,YAAa,aAAc,SAAU,eAAgB,WAAY,OAAQ,cAGhLC,GAAkBD,GAAW1S,MAAM,GAYvC,SAAS4S,GAAU1F,GACjB,IAAI2F,EAA6B,EAAnBlb,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,IAAmBA,UAAU,GAEzE4G,EAAQoU,GAAgB1S,QAAQiN,GAChCoC,EAAMqD,GAAgB3S,MAAMzB,EAAQ,GAAGuU,OAAOH,GAAgB3S,MAAM,EAAGzB,IAC3E,OAAOsU,EAAUvD,EAAIyD,UAAYzD,EAGnC,IAAI0D,GACI,OADJA,GAES,YAFTA,GAGgB,mBAiMpB,SAASC,GAAYC,EAAQnE,EAAeF,EAAkBsE,GAC5D,IAAIhJ,EAAU,CAAC,EAAG,GAKdiJ,GAA0D,IAA9C,CAAC,QAAS,QAAQnT,QAAQkT,GAItCE,EAAYH,EAAOte,MAAM,WAAW2Y,IAAI,SAAU+F,GACpD,OAAOA,EAAKpf,SAKVqf,EAAUF,EAAUpT,QAAQoP,GAAKgE,EAAW,SAAUC,GACxD,OAAgC,IAAzBA,EAAKE,OAAO,WAGjBH,EAAUE,KAAiD,IAArCF,EAAUE,GAAStT,QAAQ,MACnD+P,QAAQC,KAAK,gFAKf,IAAIwD,EAAa,cACbC,GAAmB,IAAbH,EAAiB,CAACF,EAAUrT,MAAM,EAAGuT,GAAST,OAAO,CAACO,EAAUE,GAAS3e,MAAM6e,GAAY,KAAM,CAACJ,EAAUE,GAAS3e,MAAM6e,GAAY,IAAIX,OAAOO,EAAUrT,MAAMuT,EAAU,KAAO,CAACF,GAqC9L,OAlCAK,EAAMA,EAAInG,IAAI,SAAUoG,EAAIpV,GAE1B,IAAI4Q,GAAyB,IAAV5Q,GAAe6U,EAAYA,GAAa,SAAW,QAClEQ,GAAoB,EACxB,OAAOD,EAGNE,OAAO,SAAUlG,EAAGC,GACnB,MAAwB,KAApBD,EAAEA,EAAEjP,OAAS,KAAwC,IAA3B,CAAC,IAAK,KAAKuB,QAAQ2N,IAC/CD,EAAEA,EAAEjP,OAAS,GAAKkP,EAClBgG,GAAoB,EACbjG,GACEiG,GACTjG,EAAEA,EAAEjP,OAAS,IAAMkP,EACnBgG,GAAoB,EACbjG,GAEAA,EAAEmF,OAAOlF,IAEjB,IAEFL,IAAI,SAAUuG,GACb,OAxGN,SAAiBA,EAAK3E,EAAaJ,EAAeF,GAEhD,IAAIja,EAAQkf,EAAI5d,MAAM,6BAClBH,GAASnB,EAAM,GACfqd,EAAOrd,EAAM,GAGjB,IAAKmB,EACH,OAAO+d,EAGT,GAA0B,IAAtB7B,EAAKhS,QAAQ,KAcV,MAAa,OAATgS,GAA0B,OAATA,EAYnBlc,GATM,OAATkc,EACKxe,KAAKuV,IAAIrV,SAAS8C,gBAAgBqU,aAActN,OAAOmP,aAAe,GAEtElZ,KAAKuV,IAAIrV,SAAS8C,gBAAgBoU,YAAarN,OAAOkP,YAAc,IAE/D,IAAM3W,EArBpB,IAAIjC,OAAU,EACd,OAAQme,GACN,IAAK,KACHne,EAAUib,EACV,MACF,IAAK,IACL,IAAK,KACL,QACEjb,EAAU+a,EAId,OADW3E,GAAcpW,GACbqb,GAAe,IAAMpZ,EAgFxBge,CAAQD,EAAK3E,EAAaJ,EAAeF,QAKhDkB,QAAQ,SAAU4D,EAAIpV,GACxBoV,EAAG5D,QAAQ,SAAUuD,EAAMU,GACrBpC,GAAU0B,KACZnJ,EAAQ5L,IAAU+U,GAA2B,MAAnBK,EAAGK,EAAS,IAAc,EAAI,QAIvD7J,EA2OT,IAkWI8J,GAAW,CAKb/G,UAAW,SAMXgH,eAAe,EAMf3C,eAAe,EAOf4C,iBAAiB,EAQjBC,SAAU,aAUVC,SAAU,aAOV3E,UAnZc,CASd4E,MAAO,CAEL7M,MAAO,IAEPyI,SAAS,EAETnZ,GA9HJ,SAAe2C,GACb,IAAIwT,EAAYxT,EAAKwT,UACjBiG,EAAgBjG,EAAUtY,MAAM,KAAK,GACrC2f,EAAiBrH,EAAUtY,MAAM,KAAK,GAG1C,GAAI2f,EAAgB,CAClB,IAAIC,EAAgB9a,EAAKyQ,QACrBiC,EAAYoI,EAAcpI,UAC1BD,EAASqI,EAAcrI,OAEvBsI,GAA2D,IAA9C,CAAC,SAAU,OAAOxU,QAAQkT,GACvCuB,EAAOD,EAAa,OAAS,MAC7BtF,EAAcsF,EAAa,QAAU,SAErCE,EAAe,CACjBtV,MAAOsK,GAAe,GAAI+K,EAAMtI,EAAUsI,IAC1ChV,IAAKiK,GAAe,GAAI+K,EAAMtI,EAAUsI,GAAQtI,EAAU+C,GAAehD,EAAOgD,KAGlFzV,EAAKyQ,QAAQgC,OAASpC,GAAS,GAAIoC,EAAQwI,EAAaJ,IAG1D,OAAO7a,IAgJPwZ,OAAQ,CAENzL,MAAO,IAEPyI,SAAS,EAETnZ,GA7RJ,SAAgB2C,EAAM+T,GACpB,IAAIyF,EAASzF,EAAKyF,OACdhG,EAAYxT,EAAKwT,UACjBsH,EAAgB9a,EAAKyQ,QACrBgC,EAASqI,EAAcrI,OACvBC,EAAYoI,EAAcpI,UAE1B+G,EAAgBjG,EAAUtY,MAAM,KAAK,GAErCuV,OAAU,EAsBd,OApBEA,EADEyH,IAAWsB,GACH,EAAEA,EAAQ,GAEVD,GAAYC,EAAQ/G,EAAQC,EAAW+G,GAG7B,SAAlBA,GACFhH,EAAO5B,KAAOJ,EAAQ,GACtBgC,EAAO9B,MAAQF,EAAQ,IACI,UAAlBgJ,GACThH,EAAO5B,KAAOJ,EAAQ,GACtBgC,EAAO9B,MAAQF,EAAQ,IACI,QAAlBgJ,GACThH,EAAO9B,MAAQF,EAAQ,GACvBgC,EAAO5B,KAAOJ,EAAQ,IACK,WAAlBgJ,IACThH,EAAO9B,MAAQF,EAAQ,GACvBgC,EAAO5B,KAAOJ,EAAQ,IAGxBzQ,EAAKyS,OAASA,EACPzS,GAkQLwZ,OAAQ,GAoBV0B,gBAAiB,CAEfnN,MAAO,IAEPyI,SAAS,EAETnZ,GAlRJ,SAAyB2C,EAAMoX,GAC7B,IAAIxE,EAAoBwE,EAAQxE,mBAAqBtF,GAAgBtN,EAAKmb,SAAS1I,QAK/EzS,EAAKmb,SAASzI,YAAcE,IAC9BA,EAAoBtF,GAAgBsF,IAMtC,IAAIwI,EAAgBvE,GAAyB,aACzCwE,EAAerb,EAAKmb,SAAS1I,OAAOjI,MACpCqG,EAAMwK,EAAaxK,IACnBF,EAAO0K,EAAa1K,KACpB2K,EAAYD,EAAaD,GAE7BC,EAAaxK,IAAM,GACnBwK,EAAa1K,KAAO,GACpB0K,EAAaD,GAAiB,GAE9B,IAAIvI,EAAaL,GAAcxS,EAAKmb,SAAS1I,OAAQzS,EAAKmb,SAASzI,UAAW0E,EAAQzE,QAASC,EAAmB5S,EAAKwa,eAIvHa,EAAaxK,IAAMA,EACnBwK,EAAa1K,KAAOA,EACpB0K,EAAaD,GAAiBE,EAE9BlE,EAAQvE,WAAaA,EAErB,IAAI9E,EAAQqJ,EAAQmE,SAChB9I,EAASzS,EAAKyQ,QAAQgC,OAEtBoD,EAAQ,CACV2F,QAAS,SAAiBhI,GACxB,IAAInX,EAAQoW,EAAOe,GAInB,OAHIf,EAAOe,GAAaX,EAAWW,KAAe4D,EAAQqE,sBACxDpf,EAAQtC,KAAKuV,IAAImD,EAAOe,GAAYX,EAAWW,KAE1CvD,GAAe,GAAIuD,EAAWnX,IAEvCqf,UAAW,SAAmBlI,GAC5B,IAAI+B,EAAyB,UAAd/B,EAAwB,OAAS,MAC5CnX,EAAQoW,EAAO8C,GAInB,OAHI9C,EAAOe,GAAaX,EAAWW,KAAe4D,EAAQqE,sBACxDpf,EAAQtC,KAAK4hB,IAAIlJ,EAAO8C,GAAW1C,EAAWW,IAA4B,UAAdA,EAAwBf,EAAOhD,MAAQgD,EAAOjD,UAErGS,GAAe,GAAIsF,EAAUlZ,KAWxC,OAPA0R,EAAMsI,QAAQ,SAAU7C,GACtB,IAAIwH,GAA+C,IAAxC,CAAC,OAAQ,OAAOzU,QAAQiN,GAAoB,UAAY,YACnEf,EAASpC,GAAS,GAAIoC,EAAQoD,EAAMmF,GAAMxH,MAG5CxT,EAAKyQ,QAAQgC,OAASA,EAEfzS,GA2NLub,SAAU,CAAC,OAAQ,QAAS,MAAO,UAOnC5I,QAAS,EAMTC,kBAAmB,gBAYrBgJ,aAAc,CAEZ7N,MAAO,IAEPyI,SAAS,EAETnZ,GAlgBJ,SAAsB2C,GACpB,IAAI8a,EAAgB9a,EAAKyQ,QACrBgC,EAASqI,EAAcrI,OACvBC,EAAYoI,EAAcpI,UAE1Bc,EAAYxT,EAAKwT,UAAUtY,MAAM,KAAK,GACtC2gB,EAAQ9hB,KAAK8hB,MACbd,GAAuD,IAA1C,CAAC,MAAO,UAAUxU,QAAQiN,GACvCwH,EAAOD,EAAa,QAAU,SAC9Be,EAASf,EAAa,OAAS,MAC/BtF,EAAcsF,EAAa,QAAU,SASzC,OAPItI,EAAOuI,GAAQa,EAAMnJ,EAAUoJ,MACjC9b,EAAKyQ,QAAQgC,OAAOqJ,GAAUD,EAAMnJ,EAAUoJ,IAAWrJ,EAAOgD,IAE9DhD,EAAOqJ,GAAUD,EAAMnJ,EAAUsI,MACnChb,EAAKyQ,QAAQgC,OAAOqJ,GAAUD,EAAMnJ,EAAUsI,KAGzChb,IA4fP+b,MAAO,CAELhO,MAAO,IAEPyI,SAAS,EAETnZ,GApxBJ,SAAe2C,EAAMoX,GACnB,IAAI4E,EAGJ,IAAKvD,GAAmBzY,EAAKmb,SAASnF,UAAW,QAAS,gBACxD,OAAOhW,EAGT,IAAIic,EAAe7E,EAAQhd,QAG3B,GAA4B,iBAAjB6hB,GAIT,KAHAA,EAAejc,EAAKmb,SAAS1I,OAAOhY,cAAcwhB,IAIhD,OAAOjc,OAKT,IAAKA,EAAKmb,SAAS1I,OAAOvR,SAAS+a,GAEjC,OADA3F,QAAQC,KAAK,iEACNvW,EAIX,IAAIwT,EAAYxT,EAAKwT,UAAUtY,MAAM,KAAK,GACtC4f,EAAgB9a,EAAKyQ,QACrBgC,EAASqI,EAAcrI,OACvBC,EAAYoI,EAAcpI,UAE1BqI,GAAuD,IAA1C,CAAC,OAAQ,SAASxU,QAAQiN,GAEvC7K,EAAMoS,EAAa,SAAW,QAC9BmB,EAAkBnB,EAAa,MAAQ,OACvCC,EAAOkB,EAAgBzf,cACvB0f,EAAUpB,EAAa,OAAS,MAChCe,EAASf,EAAa,SAAW,QACjCqB,EAAmB3H,GAAcwH,GAActT,GAQ/C+J,EAAUoJ,GAAUM,EAAmB3J,EAAOuI,KAChDhb,EAAKyQ,QAAQgC,OAAOuI,IAASvI,EAAOuI,IAAStI,EAAUoJ,GAAUM,IAG/D1J,EAAUsI,GAAQoB,EAAmB3J,EAAOqJ,KAC9C9b,EAAKyQ,QAAQgC,OAAOuI,IAAStI,EAAUsI,GAAQoB,EAAmB3J,EAAOqJ,IAE3E9b,EAAKyQ,QAAQgC,OAASjC,GAAcxQ,EAAKyQ,QAAQgC,QAGjD,IAAI4J,EAAS3J,EAAUsI,GAAQtI,EAAU/J,GAAO,EAAIyT,EAAmB,EAInEvhB,EAAMsR,GAAyBnM,EAAKmb,SAAS1I,QAC7C6J,EAAmBthB,WAAWH,EAAI,SAAWqhB,GAAkB,IAC/DK,EAAmBvhB,WAAWH,EAAI,SAAWqhB,EAAkB,SAAU,IACzEM,EAAYH,EAASrc,EAAKyQ,QAAQgC,OAAOuI,GAAQsB,EAAmBC,EAQxE,OALAC,EAAYziB,KAAKuV,IAAIvV,KAAK4hB,IAAIlJ,EAAO9J,GAAOyT,EAAkBI,GAAY,GAE1Exc,EAAKic,aAAeA,EACpBjc,EAAKyQ,QAAQsL,OAAmC9L,GAA1B+L,EAAsB,GAAwChB,EAAMjhB,KAAK0iB,MAAMD,IAAavM,GAAe+L,EAAqBG,EAAS,IAAKH,GAE7Jhc,GA8sBL5F,QAAS,aAcXsiB,KAAM,CAEJ3O,MAAO,IAEPyI,SAAS,EAETnZ,GA5oBJ,SAAc2C,EAAMoX,GAElB,GAAIX,GAAkBzW,EAAKmb,SAASnF,UAAW,SAC7C,OAAOhW,EAGT,GAAIA,EAAK2c,SAAW3c,EAAKwT,YAAcxT,EAAK4c,kBAE1C,OAAO5c,EAGT,IAAI6S,EAAaL,GAAcxS,EAAKmb,SAAS1I,OAAQzS,EAAKmb,SAASzI,UAAW0E,EAAQzE,QAASyE,EAAQxE,kBAAmB5S,EAAKwa,eAE3HhH,EAAYxT,EAAKwT,UAAUtY,MAAM,KAAK,GACtC2hB,EAAoB/H,GAAqBtB,GACzCc,EAAYtU,EAAKwT,UAAUtY,MAAM,KAAK,IAAM,GAE5C4hB,EAAY,GAEhB,OAAQ1F,EAAQ2F,UACd,KAAKzD,GACHwD,EAAY,CAACtJ,EAAWqJ,GACxB,MACF,KAAKvD,GACHwD,EAAY5D,GAAU1F,GACtB,MACF,KAAK8F,GACHwD,EAAY5D,GAAU1F,GAAW,GACjC,MACF,QACEsJ,EAAY1F,EAAQ2F,SAyDxB,OAtDAD,EAAUzG,QAAQ,SAAU2G,EAAMnY,GAChC,GAAI2O,IAAcwJ,GAAQF,EAAU9X,SAAWH,EAAQ,EACrD,OAAO7E,EAGTwT,EAAYxT,EAAKwT,UAAUtY,MAAM,KAAK,GACtC2hB,EAAoB/H,GAAqBtB,GAEzC,IArH0Bc,EAqHtBe,EAAgBrV,EAAKyQ,QAAQgC,OAC7BwK,EAAajd,EAAKyQ,QAAQiC,UAG1BmJ,EAAQ9hB,KAAK8hB,MACbqB,EAA4B,SAAd1J,GAAwBqI,EAAMxG,EAAc3E,OAASmL,EAAMoB,EAAWtM,OAAuB,UAAd6C,GAAyBqI,EAAMxG,EAAc1E,MAAQkL,EAAMoB,EAAWvM,QAAwB,QAAd8C,GAAuBqI,EAAMxG,EAAczE,QAAUiL,EAAMoB,EAAWpM,MAAsB,WAAd2C,GAA0BqI,EAAMxG,EAAcxE,KAAOgL,EAAMoB,EAAWrM,QAEjUuM,EAAgBtB,EAAMxG,EAAc1E,MAAQkL,EAAMhJ,EAAWlC,MAC7DyM,EAAiBvB,EAAMxG,EAAc3E,OAASmL,EAAMhJ,EAAWnC,OAC/D2M,EAAexB,EAAMxG,EAAcxE,KAAOgL,EAAMhJ,EAAWhC,KAC3DyM,EAAkBzB,EAAMxG,EAAczE,QAAUiL,EAAMhJ,EAAWjC,QAEjE2M,EAAoC,SAAd/J,GAAwB2J,GAA+B,UAAd3J,GAAyB4J,GAAgC,QAAd5J,GAAuB6J,GAA8B,WAAd7J,GAA0B8J,EAG3KvC,GAAuD,IAA1C,CAAC,MAAO,UAAUxU,QAAQiN,GAGvCgK,IAA0BpG,EAAQqG,iBAAmB1C,GAA4B,UAAdzG,GAAyB6I,GAAiBpC,GAA4B,QAAdzG,GAAuB8I,IAAmBrC,GAA4B,UAAdzG,GAAyB+I,IAAiBtC,GAA4B,QAAdzG,GAAuBgJ,GAGlQI,IAA8BtG,EAAQuG,0BAA4B5C,GAA4B,UAAdzG,GAAyB8I,GAAkBrC,GAA4B,QAAdzG,GAAuB6I,IAAkBpC,GAA4B,UAAdzG,GAAyBgJ,IAAoBvC,GAA4B,QAAdzG,GAAuB+I,GAElRO,EAAmBJ,GAAyBE,GAE5CR,GAAeK,GAAuBK,KAExC5d,EAAK2c,SAAU,GAEXO,GAAeK,KACjB/J,EAAYsJ,EAAUjY,EAAQ,IAG5B+Y,IACFtJ,EAtJY,SADUA,EAuJWA,GArJ9B,QACgB,UAAdA,EACF,MAEFA,GAoJHtU,EAAKwT,UAAYA,GAAac,EAAY,IAAMA,EAAY,IAI5DtU,EAAKyQ,QAAQgC,OAASpC,GAAS,GAAIrQ,EAAKyQ,QAAQgC,OAAQyC,GAAiBlV,EAAKmb,SAAS1I,OAAQzS,EAAKyQ,QAAQiC,UAAW1S,EAAKwT,YAE5HxT,EAAO+V,GAAa/V,EAAKmb,SAASnF,UAAWhW,EAAM,WAGhDA,GA4jBL+c,SAAU,OAKVpK,QAAS,EAOTC,kBAAmB,WAQnB6K,gBAAgB,EAQhBE,yBAAyB,GAU3BE,MAAO,CAEL9P,MAAO,IAEPyI,SAAS,EAETnZ,GArQJ,SAAe2C,GACb,IAAIwT,EAAYxT,EAAKwT,UACjBiG,EAAgBjG,EAAUtY,MAAM,KAAK,GACrC4f,EAAgB9a,EAAKyQ,QACrBgC,EAASqI,EAAcrI,OACvBC,EAAYoI,EAAcpI,UAE1B4C,GAAwD,IAA9C,CAAC,OAAQ,SAAS/O,QAAQkT,GAEpCqE,GAA6D,IAA5C,CAAC,MAAO,QAAQvX,QAAQkT,GAO7C,OALAhH,EAAO6C,EAAU,OAAS,OAAS5C,EAAU+G,IAAkBqE,EAAiBrL,EAAO6C,EAAU,QAAU,UAAY,GAEvHtV,EAAKwT,UAAYsB,GAAqBtB,GACtCxT,EAAKyQ,QAAQgC,OAASjC,GAAciC,GAE7BzS,IAkQPgK,KAAM,CAEJ+D,MAAO,IAEPyI,SAAS,EAETnZ,GA9TJ,SAAc2C,GACZ,IAAKyY,GAAmBzY,EAAKmb,SAASnF,UAAW,OAAQ,mBACvD,OAAOhW,EAGT,IAAIyT,EAAUzT,EAAKyQ,QAAQiC,UACvBqL,EAAQpI,GAAK3V,EAAKmb,SAASnF,UAAW,SAAU7D,GAClD,MAAyB,oBAAlBA,EAASyE,OACf/D,WAEH,GAAIY,EAAQ7C,OAASmN,EAAMlN,KAAO4C,EAAQ9C,KAAOoN,EAAMrN,OAAS+C,EAAQ5C,IAAMkN,EAAMnN,QAAU6C,EAAQ/C,MAAQqN,EAAMpN,KAAM,CAExH,IAAkB,IAAd3Q,EAAKgK,KACP,OAAOhK,EAGTA,EAAKgK,MAAO,EACZhK,EAAKge,WAAW,uBAAyB,OACpC,CAEL,IAAkB,IAAdhe,EAAKgK,KACP,OAAOhK,EAGTA,EAAKgK,MAAO,EACZhK,EAAKge,WAAW,wBAAyB,EAG3C,OAAOhe,IAoTPie,aAAc,CAEZlQ,MAAO,IAEPyI,SAAS,EAETnZ,GAtgCJ,SAAsB2C,EAAMoX,GAC1B,IAAI1C,EAAI0C,EAAQ1C,EACZE,EAAIwC,EAAQxC,EACZnC,EAASzS,EAAKyQ,QAAQgC,OAItByL,EAA8BvI,GAAK3V,EAAKmb,SAASnF,UAAW,SAAU7D,GACxE,MAAyB,eAAlBA,EAASyE,OACfuH,qBACiCvP,IAAhCsP,GACF5H,QAAQC,KAAK,iIAEf,IApDyBvW,EAAMoe,EAC3BtD,EACArI,EACAC,EACA+J,EACAZ,EAEAwC,EAIAC,EACAC,EAEAxD,EACAyD,EAIAC,EACAC,EAgCAP,OAAkDvP,IAAhCsP,EAA4CA,EAA8B9G,EAAQ+G,gBAEpG3Q,EAAeF,GAAgBtN,EAAKmb,SAAS1I,QAC7CkM,EAAmB/T,GAAsB4C,GAGzCwB,EAAS,CACX4P,SAAUnM,EAAOmM,UAGfnO,GA9DqBzQ,EA8DOA,EA9DDoe,EA8DOta,OAAO+a,iBAAmB,IAAMrG,GA7DlEsC,EAAgB9a,EAAKyQ,QACrBgC,EAASqI,EAAcrI,OACvBC,EAAYoI,EAAcpI,UAC1B+J,EAAQ1iB,KAAK0iB,MACbZ,EAAQ9hB,KAAK8hB,MAEbwC,EAAU,SAAiBS,GAC7B,OAAOA,GAGLR,EAAiB7B,EAAM/J,EAAUjD,OACjC8O,EAAc9B,EAAMhK,EAAOhD,OAE3BsL,GAA4D,IAA/C,CAAC,OAAQ,SAASxU,QAAQvG,EAAKwT,WAC5CgL,GAA+C,IAAjCxe,EAAKwT,UAAUjN,QAAQ,KAKrCmY,EAAqBN,EAAwB3B,EAAV4B,EAEhC,CACL1N,MAJE8N,EAAuBL,EAAwBrD,GAAcyD,GAH3CF,EAAiB,GAAMC,EAAc,EAGuC9B,EAAQZ,EAAjEwC,GAFtBC,EAAiB,GAAM,GAAKC,EAAc,GAAM,IAMtBC,GAAeJ,EAAc3L,EAAO9B,KAAO,EAAI8B,EAAO9B,MACjGE,IAAK6N,EAAkBjM,EAAO5B,KAC9BD,OAAQ8N,EAAkBjM,EAAO7B,QACjCF,MAAO+N,EAAoBhM,EAAO/B,SAsChCxB,EAAc,WAANwF,EAAiB,MAAQ,SACjCvF,EAAc,UAANyF,EAAgB,OAAS,QAKjCmK,EAAmBlI,GAAyB,aAW5ClG,OAAO,EACPE,OAAM,EAqBV,GAhBIA,EAJU,WAAV3B,EAG4B,SAA1B1B,EAAahB,UACRgB,EAAa4D,aAAeX,EAAQG,QAEpC+N,EAAiBnP,OAASiB,EAAQG,OAGrCH,EAAQI,IAIZF,EAFU,UAAVxB,EAC4B,SAA1B3B,EAAahB,UACPgB,EAAa2D,YAAcV,EAAQC,OAEnCiO,EAAiBlP,MAAQgB,EAAQC,MAGpCD,EAAQE,KAEbwN,GAAmBY,EACrB/P,EAAO+P,GAAoB,eAAiBpO,EAAO,OAASE,EAAM,SAClE7B,EAAOE,GAAS,EAChBF,EAAOG,GAAS,EAChBH,EAAOgQ,WAAa,gBACf,CAEL,IAAIC,EAAsB,WAAV/P,GAAsB,EAAI,EACtCgQ,EAAuB,UAAV/P,GAAqB,EAAI,EAC1CH,EAAOE,GAAS2B,EAAMoO,EACtBjQ,EAAOG,GAASwB,EAAOuO,EACvBlQ,EAAOgQ,WAAa9P,EAAQ,KAAOC,EAIrC,IAAI6O,EAAa,CACfmB,cAAenf,EAAKwT,WAQtB,OAJAxT,EAAKge,WAAa3N,GAAS,GAAI2N,EAAYhe,EAAKge,YAChDhe,EAAKgP,OAASqB,GAAS,GAAIrB,EAAQhP,EAAKgP,QACxChP,EAAKof,YAAc/O,GAAS,GAAIrQ,EAAKyQ,QAAQsL,MAAO/b,EAAKof,aAElDpf,GAo7BLme,iBAAiB,EAMjBzJ,EAAG,SAMHE,EAAG,SAkBLyK,WAAY,CAEVtR,MAAO,IAEPyI,SAAS,EAETnZ,GAzpCJ,SAAoB2C,GApBpB,IAAuB5F,EAAS4jB,EAoC9B,OAXA1F,GAAUtY,EAAKmb,SAAS1I,OAAQzS,EAAKgP,QAzBhB5U,EA6BP4F,EAAKmb,SAAS1I,OA7BEuL,EA6BMhe,EAAKge,WA5BzChiB,OAAO4X,KAAKoK,GAAY3H,QAAQ,SAAUH,IAE1B,IADF8H,EAAW9H,GAErB9b,EAAQ6G,aAAaiV,EAAM8H,EAAW9H,IAEtC9b,EAAQklB,gBAAgBpJ,KA0BxBlW,EAAKic,cAAgBjgB,OAAO4X,KAAK5T,EAAKof,aAAapa,QACrDsT,GAAUtY,EAAKic,aAAcjc,EAAKof,aAG7Bpf,GA2oCLuf,OA9nCJ,SAA0B7M,EAAWD,EAAQ2E,EAASoI,EAAiBhL,GAErE,IAAIW,EAAmBZ,GAAoBC,EAAO/B,EAAQC,EAAW0E,EAAQoD,eAKzEhH,EAAYD,GAAqB6D,EAAQ5D,UAAW2B,EAAkB1C,EAAQC,EAAW0E,EAAQpB,UAAU0G,KAAK9J,kBAAmBwE,EAAQpB,UAAU0G,KAAK/J,SAQ9J,OANAF,EAAOxR,aAAa,cAAeuS,GAInC8E,GAAU7F,EAAQ,CAAEmM,SAAUxH,EAAQoD,cAAgB,QAAU,aAEzDpD,GAsnCL+G,qBAAiBvP,KAuGjB6Q,GAAS,WASX,SAASA,EAAO/M,EAAWD,GACzB,IAAIpZ,EAAQC,KAER8d,EAA6B,EAAnBnZ,UAAU+G,aAA+B4J,IAAjB3Q,UAAU,GAAmBA,UAAU,GAAK,IA3jEjE,SAAUkd,EAAU9a,GACvC,KAAM8a,aAAoB9a,GACxB,MAAM,IAAIgI,UAAU,qCA0jEpBqX,CAAepmB,KAAMmmB,GAErBnmB,KAAK0e,eAAiB,WACpB,OAAO2H,sBAAsBtmB,EAAMumB,SAIrCtmB,KAAKsmB,OAAShU,GAAStS,KAAKsmB,OAAOjb,KAAKrL,OAGxCA,KAAK8d,QAAU/G,GAAS,GAAIoP,EAAOlF,SAAUnD,GAG7C9d,KAAKkb,MAAQ,CACXqL,aAAa,EACbC,WAAW,EACXnI,cAAe,IAIjBre,KAAKoZ,UAAYA,GAAaA,EAAU3H,OAAS2H,EAAU,GAAKA,EAChEpZ,KAAKmZ,OAASA,GAAUA,EAAO1H,OAAS0H,EAAO,GAAKA,EAGpDnZ,KAAK8d,QAAQpB,UAAY,GACzBha,OAAO4X,KAAKvD,GAAS,GAAIoP,EAAOlF,SAASvE,UAAWoB,EAAQpB,YAAYK,QAAQ,SAAUO,GACxFvd,EAAM+d,QAAQpB,UAAUY,GAAQvG,GAAS,GAAIoP,EAAOlF,SAASvE,UAAUY,IAAS,GAAIQ,EAAQpB,UAAYoB,EAAQpB,UAAUY,GAAQ,MAIpItd,KAAK0c,UAAYha,OAAO4X,KAAKta,KAAK8d,QAAQpB,WAAWnC,IAAI,SAAU+C,GACjE,OAAOvG,GAAS,CACduG,KAAMA,GACLvd,EAAM+d,QAAQpB,UAAUY,MAG5B5C,KAAK,SAAUC,EAAGC,GACjB,OAAOD,EAAElG,MAAQmG,EAAEnG,QAOrBzU,KAAK0c,UAAUK,QAAQ,SAAUmJ,GAC3BA,EAAgBhJ,SAAWvK,GAAWuT,EAAgBD,SACxDC,EAAgBD,OAAOlmB,EAAMqZ,UAAWrZ,EAAMoZ,OAAQpZ,EAAM+d,QAASoI,EAAiBnmB,EAAMmb,SAKhGlb,KAAKsmB,SAEL,IAAI/H,EAAgBve,KAAK8d,QAAQS,cAC7BA,GAEFve,KAAKymB,uBAGPzmB,KAAKkb,MAAMqD,cAAgBA,EAqD7B,OA9CAnI,GAAY+P,EAAQ,CAAC,CACnBvP,IAAK,SACL7T,MAAO,WACL,OA9lDN,WAEE,IAAI/C,KAAKkb,MAAMqL,YAAf,CAIA,IAAI7f,EAAO,CACTmb,SAAU7hB,KACV0V,OAAQ,GACRoQ,YAAa,GACbpB,WAAY,GACZrB,SAAS,EACTlM,QAAS,IAIXzQ,EAAKyQ,QAAQiC,UAAY6B,GAAoBjb,KAAKkb,MAAOlb,KAAKmZ,OAAQnZ,KAAKoZ,UAAWpZ,KAAK8d,QAAQoD,eAKnGxa,EAAKwT,UAAYD,GAAqBja,KAAK8d,QAAQ5D,UAAWxT,EAAKyQ,QAAQiC,UAAWpZ,KAAKmZ,OAAQnZ,KAAKoZ,UAAWpZ,KAAK8d,QAAQpB,UAAU0G,KAAK9J,kBAAmBtZ,KAAK8d,QAAQpB,UAAU0G,KAAK/J,SAG9L3S,EAAK4c,kBAAoB5c,EAAKwT,UAE9BxT,EAAKwa,cAAgBlhB,KAAK8d,QAAQoD,cAGlCxa,EAAKyQ,QAAQgC,OAASyC,GAAiB5b,KAAKmZ,OAAQzS,EAAKyQ,QAAQiC,UAAW1S,EAAKwT,WAEjFxT,EAAKyQ,QAAQgC,OAAOmM,SAAWtlB,KAAK8d,QAAQoD,cAAgB,QAAU,WAGtExa,EAAO+V,GAAazc,KAAK0c,UAAWhW,GAI/B1G,KAAKkb,MAAMsL,UAIdxmB,KAAK8d,QAAQuD,SAAS3a,IAHtB1G,KAAKkb,MAAMsL,WAAY,EACvBxmB,KAAK8d,QAAQsD,SAAS1a,MAsjDN7D,KAAK7C,QAEpB,CACD4W,IAAK,UACL7T,MAAO,WACL,OA7gDN,WAsBE,OArBA/C,KAAKkb,MAAMqL,aAAc,EAGrBpJ,GAAkBnd,KAAK0c,UAAW,gBACpC1c,KAAKmZ,OAAO6M,gBAAgB,eAC5BhmB,KAAKmZ,OAAOjI,MAAMoU,SAAW,GAC7BtlB,KAAKmZ,OAAOjI,MAAMqG,IAAM,GACxBvX,KAAKmZ,OAAOjI,MAAMmG,KAAO,GACzBrX,KAAKmZ,OAAOjI,MAAMkG,MAAQ,GAC1BpX,KAAKmZ,OAAOjI,MAAMoG,OAAS,GAC3BtX,KAAKmZ,OAAOjI,MAAMwU,WAAa,GAC/B1lB,KAAKmZ,OAAOjI,MAAMqM,GAAyB,cAAgB,IAG7Dvd,KAAKwe,wBAIDxe,KAAK8d,QAAQqD,iBACfnhB,KAAKmZ,OAAOtV,WAAW6iB,YAAY1mB,KAAKmZ,QAEnCnZ,MAu/CY6C,KAAK7C,QAErB,CACD4W,IAAK,uBACL7T,MAAO,WACL,OA18CN,WACO/C,KAAKkb,MAAMqD,gBACdve,KAAKkb,MAAQ2C,GAAoB7d,KAAKoZ,UAAWpZ,KAAK8d,QAAS9d,KAAKkb,MAAOlb,KAAK0e,kBAw8ClD7b,KAAK7C,QAElC,CACD4W,IAAK,wBACL7T,MAAO,WACL,OAAOyb,GAAsB3b,KAAK7C,UA4B/BmmB,EA7HI,GAqJbA,GAAOQ,OAA2B,oBAAXnc,OAAyBA,OAASoc,QAAQC,YACjEV,GAAOzG,WAAaA,GACpByG,GAAOlF,SAAWA,GCvhFlB,IAAMrc,GAA2B,WAE3BC,GAA2B,cAC3BC,GAAS,IAAsBD,GAC/BoC,GAA2B,YAC3BlC,GAA2B7E,EAAE6D,GAAGa,IAOhCkiB,GAA2B,IAAI1jB,OAAU2jB,YAEzC/hB,GAAQ,CACZyK,KAAI,OAAsB3K,GAC1B4K,OAAM,SAAsB5K,GAC5ByK,KAAI,OAAsBzK,GAC1B0K,MAAK,QAAsB1K,GAC3BkiB,MAAK,QAAsBliB,GAC3BK,eAAc,QAAaL,GAAYmC,GACvCggB,iBAAgB,UAAaniB,GAAYmC,GACzCigB,eAAc,QAAapiB,GAAYmC,IAGnC7B,GACc,WADdA,GAEc,OAFdA,GAGc,SAHdA,GAIc,YAJdA,GAKc,WALdA,GAMc,sBANdA,GAQc,kBAGd8B,GACY,2BADZA,GAEY,iBAFZA,GAGY,iBAHZA,GAIY,cAJZA,GAOiB,wFAPjBA,GASY,8DAGZigB,GACQ,YADRA,GAEQ,UAFRA,GAGQ,eAHRA,GAIQ,aAJRA,GAKQ,cALRA,GAOQ,aAIRnf,GAAU,CACdkY,OAAY,EACZkD,MAAY,EACZgE,SAAY,eACZhO,UAAY,SACZiO,QAAY,WAGR9e,GAAc,CAClB2X,OAAY,2BACZkD,KAAY,UACZgE,SAAY,mBACZhO,UAAY,mBACZiO,QAAY,UASRC,cACJ,SAAAA,EAAYxmB,EAASyB,GACnBvC,KAAKsF,SAAYxE,EACjBd,KAAKunB,QAAY,KACjBvnB,KAAKiK,QAAYjK,KAAKkK,WAAW3H,GACjCvC,KAAKwnB,MAAYxnB,KAAKynB,kBACtBznB,KAAK0nB,UAAY1nB,KAAK2nB,gBAEtB3nB,KAAK2K,qBACL3K,KAAK4nB,+CAmBPvgB,OAAA,WACE,IAAIrH,KAAKsF,SAASuiB,WAAY3nB,EAAEF,KAAKsF,UAAUa,SAASf,IAAxD,CAIA,IAAMW,EAAWuhB,EAASQ,sBAAsB9nB,KAAKsF,UAC/CyiB,EAAW7nB,EAAEF,KAAKwnB,OAAOrhB,SAASf,IAIxC,GAFAkiB,EAASU,eAELD,EAAJ,CAIA,IAAMva,EAAgB,CACpBA,cAAexN,KAAKsF,UAEhB2iB,EAAY/nB,EAAE8E,MAAMA,GAAMuK,KAAM/B,GAItC,GAFAtN,EAAE6F,GAAQhE,QAAQkmB,IAEdA,EAAUtiB,qBAAd,CAKA,IAAK3F,KAAK0nB,UAAW,CAKnB,GAAsB,oBAAXvB,GACT,MAAM,IAAIpX,UAAU,oEAGtB,IAAImZ,EAAmBloB,KAAKsF,SAEG,WAA3BtF,KAAKiK,QAAQmP,UACf8O,EAAmBniB,EACV3F,EAAK8B,UAAUlC,KAAKiK,QAAQmP,aACrC8O,EAAmBloB,KAAKiK,QAAQmP,UAGa,oBAAlCpZ,KAAKiK,QAAQmP,UAAU3H,SAChCyW,EAAmBloB,KAAKiK,QAAQmP,UAAU,KAOhB,iBAA1BpZ,KAAKiK,QAAQmd,UACflnB,EAAE6F,GAAQmI,SAAS9I,IAErBpF,KAAKunB,QAAU,IAAIpB,GAAO+B,EAAkBloB,KAAKwnB,MAAOxnB,KAAKmoB,oBAO3D,iBAAkBxnB,SAAS8C,iBACuB,IAAlDvD,EAAE6F,GAAQC,QAAQkB,IAAqBwE,QACzCxL,EAAES,SAAS0S,MAAMpF,WAAWnH,GAAG,YAAa,KAAM5G,EAAEkoB,MAGtDpoB,KAAKsF,SAAS+iB,QACdroB,KAAKsF,SAASqC,aAAa,iBAAiB,GAE5CzH,EAAEF,KAAKwnB,OAAO1f,YAAY1C,IAC1BlF,EAAE6F,GACC+B,YAAY1C,IACZrD,QAAQ7B,EAAE8E,MAAMA,GAAMwK,MAAOhC,UAGlCmD,KAAA,WACE,KAAI3Q,KAAKsF,SAASuiB,UAAY3nB,EAAEF,KAAKsF,UAAUa,SAASf,KAAuBlF,EAAEF,KAAKwnB,OAAOrhB,SAASf,KAAtG,CAIA,IAAMoI,EAAgB,CACpBA,cAAexN,KAAKsF,UAEhB2iB,EAAY/nB,EAAE8E,MAAMA,GAAMuK,KAAM/B,GAChCzH,EAASuhB,EAASQ,sBAAsB9nB,KAAKsF,UAEnDpF,EAAE6F,GAAQhE,QAAQkmB,GAEdA,EAAUtiB,uBAIdzF,EAAEF,KAAKwnB,OAAO1f,YAAY1C,IAC1BlF,EAAE6F,GACC+B,YAAY1C,IACZrD,QAAQ7B,EAAE8E,MAAMA,GAAMwK,MAAOhC,IAEhCtN,EAAE6F,GAAQsW,KAAKnV,IAA6BohB,QAAQvmB,QAAQ,cAI9D2O,KAAA,WACE,IAAI1Q,KAAKsF,SAASuiB,WAAY3nB,EAAEF,KAAKsF,UAAUa,SAASf,KAAwBlF,EAAEF,KAAKwnB,OAAOrhB,SAASf,IAAvG,CAIA,IAAMoI,EAAgB,CACpBA,cAAexN,KAAKsF,UAEhBijB,EAAYroB,EAAE8E,MAAMA,GAAMyK,KAAMjC,GAChCzH,EAASuhB,EAASQ,sBAAsB9nB,KAAKsF,UAEnDpF,EAAE6F,GAAQhE,QAAQwmB,GAEdA,EAAU5iB,uBAIdzF,EAAEF,KAAKwnB,OAAO1f,YAAY1C,IAC1BlF,EAAE6F,GACC+B,YAAY1C,IACZrD,QAAQ7B,EAAE8E,MAAMA,GAAM0K,OAAQlC,SAGnC3H,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAC5B3E,EAAEF,KAAKsF,UAAUsG,IAAI9G,IACrB9E,KAAKsF,SAAW,MAChBtF,KAAKwnB,MAAQ,QACTxnB,KAAKunB,UACPvnB,KAAKunB,QAAQiB,UACbxoB,KAAKunB,QAAU,SAInBjB,OAAA,WACEtmB,KAAK0nB,UAAY1nB,KAAK2nB,gBACD,OAAjB3nB,KAAKunB,SACPvnB,KAAKunB,QAAQ7I,oBAMjB/T,mBAAA,WAAqB,IAAA5K,EAAAC,KACnBE,EAAEF,KAAKsF,UAAUwB,GAAG9B,GAAMgiB,MAAO,SAAC/iB,GAChCA,EAAM4C,iBACN5C,EAAMwkB,kBACN1oB,EAAKsH,cAIT6C,WAAA,SAAW3H,GAaT,OAZAA,EAAMsJ,EAAA,GACD7L,KAAK0oB,YAAY1gB,QACjB9H,EAAEF,KAAKsF,UAAUoB,OACjBnE,GAGLnC,EAAKiC,gBACHuC,GACArC,EACAvC,KAAK0oB,YAAYngB,aAGZhG,KAGTklB,gBAAA,WACE,IAAKznB,KAAKwnB,MAAO,CACf,IAAMzhB,EAASuhB,EAASQ,sBAAsB9nB,KAAKsF,UAE/CS,IACF/F,KAAKwnB,MAAQzhB,EAAO5E,cAAc+F,KAGtC,OAAOlH,KAAKwnB,SAGdmB,cAAA,WACE,IAAMC,EAAkB1oB,EAAEF,KAAKsF,SAASzB,YACpCqW,EAAYiN,GAehB,OAZIyB,EAAgBziB,SAASf,KAC3B8U,EAAYiN,GACRjnB,EAAEF,KAAKwnB,OAAOrhB,SAASf,MACzB8U,EAAYiN,KAELyB,EAAgBziB,SAASf,IAClC8U,EAAYiN,GACHyB,EAAgBziB,SAASf,IAClC8U,EAAYiN,GACHjnB,EAAEF,KAAKwnB,OAAOrhB,SAASf,MAChC8U,EAAYiN,IAEPjN,KAGTyN,cAAA,WACE,OAAoD,EAA7CznB,EAAEF,KAAKsF,UAAUU,QAAQ,WAAW0F,UAG7Cmd,WAAA,WAAa,IAAA5c,EAAAjM,KACLkgB,EAAS,GAef,MAbmC,mBAAxBlgB,KAAKiK,QAAQiW,OACtBA,EAAOnc,GAAK,SAAC2C,GAMX,OALAA,EAAKyQ,QAALtL,EAAA,GACKnF,EAAKyQ,QACLlL,EAAKhC,QAAQiW,OAAOxZ,EAAKyQ,QAASlL,EAAK3G,WAAa,IAGlDoB,GAGTwZ,EAAOA,OAASlgB,KAAKiK,QAAQiW,OAGxBA,KAGTiI,iBAAA,WACE,IAAMW,EAAe,CACnB5O,UAAWla,KAAK2oB,gBAChBjM,UAAW,CACTwD,OAAQlgB,KAAK6oB,aACbzF,KAAM,CACJlG,QAASld,KAAKiK,QAAQmZ,MAExBxB,gBAAiB,CACftI,kBAAmBtZ,KAAKiK,QAAQmd,YAYtC,MAN6B,WAAzBpnB,KAAKiK,QAAQod,UACfyB,EAAapM,UAAUqJ,WAAa,CAClC7I,SAAS,IAIN4L,KAITlB,kBAAA,WACE1nB,EAAEF,KAAKsF,UAAU6L,KAAK,iBAAiB,GAEvCjR,EAAEF,KAAKsF,UAAUS,SAASkI,SAAS/G,IAAeiK,KAAK,OAAQ,QAE/DjR,EAAEF,KAAKsF,UAAUS,SAASkI,SAAS/G,IAAe+G,SAAS,kBAAkBkD,KAAK,OAAQ,eAMrF5K,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IASxB,GANK6B,IACHA,EAAO,IAAI4gB,EAAStnB,KAHY,iBAAXuC,EAAsBA,EAAS,MAIpDrC,EAAEF,MAAM0G,KAAK7B,GAAU6B,KAIrB,OAAOrD,KAAKd,IAKM,iBAAXA,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,WAKJylB,YAAP,SAAmB/jB,GACjB,IAAIA,GA9XyB,IA8XfA,EAAM8I,QACH,UAAf9I,EAAM8D,MAlYqB,IAkYD9D,EAAM8I,OAMlC,IAFA,IAAMgc,EAAU,GAAG/b,MAAMnK,KAAKlC,SAASiM,iBAAiB1F,KAE/CkI,EAAI,EAAGC,EAAM0Z,EAAQrd,OAAQ0D,EAAIC,EAAKD,IAAK,CAClD,IAAMrJ,EAASuhB,EAASQ,sBAAsBiB,EAAQ3Z,IAChD4Z,EAAU9oB,EAAE6oB,EAAQ3Z,IAAI1I,KAAK7B,IAC7B2I,EAAgB,CACpBA,cAAeub,EAAQ3Z,IAOzB,GAJInL,GAAwB,UAAfA,EAAM8D,OACjByF,EAAcyb,WAAahlB,GAGxB+kB,EAAL,CAIA,IAAME,EAAeF,EAAQxB,MAC7B,GAAKtnB,EAAE6F,GAAQI,SAASf,OAIpBnB,IAAyB,UAAfA,EAAM8D,MAChB,kBAAkB1E,KAAKY,EAAMK,OAAOwI,UAA2B,UAAf7I,EAAM8D,MA7Z/B,IA6ZmD9D,EAAM8I,QAChF7M,EAAE0H,SAAS7B,EAAQ9B,EAAMK,SAF7B,CAMA,IAAMikB,EAAYroB,EAAE8E,MAAMA,GAAMyK,KAAMjC,GACtCtN,EAAE6F,GAAQhE,QAAQwmB,GACdA,EAAU5iB,uBAMV,iBAAkBhF,SAAS8C,iBAC7BvD,EAAES,SAAS0S,MAAMpF,WAAWrC,IAAI,YAAa,KAAM1L,EAAEkoB,MAGvDW,EAAQ3Z,GAAGzH,aAAa,gBAAiB,SAEzCzH,EAAEgpB,GAAchjB,YAAYd,IAC5BlF,EAAE6F,GACCG,YAAYd,IACZrD,QAAQ7B,EAAE8E,MAAMA,GAAM0K,OAAQlC,WAI9Bsa,sBAAP,SAA6BhnB,GAC3B,IAAIiF,EACEhF,EAAWX,EAAKS,uBAAuBC,GAM7C,OAJIC,IACFgF,EAASpF,SAASQ,cAAcJ,IAG3BgF,GAAUjF,EAAQ+C,cAIpBslB,uBAAP,SAA8BllB,GAQ5B,IAAI,kBAAkBZ,KAAKY,EAAMK,OAAOwI,WA5cX,KA6czB7I,EAAM8I,OA9cmB,KA8cQ9I,EAAM8I,QA1cd,KA2c1B9I,EAAM8I,OA5coB,KA4cY9I,EAAM8I,OAC3C7M,EAAE+D,EAAMK,QAAQ0B,QAAQkB,IAAewE,SAAWob,GAAezjB,KAAKY,EAAM8I,UAIhF9I,EAAM4C,iBACN5C,EAAMwkB,mBAEFzoB,KAAK6nB,WAAY3nB,EAAEF,MAAMmG,SAASf,KAAtC,CAIA,IAAMW,EAAWuhB,EAASQ,sBAAsB9nB,MAC1C+nB,EAAW7nB,EAAE6F,GAAQI,SAASf,IAEpC,GAAK2iB,KAAYA,GA9dY,KA8dC9jB,EAAM8I,OA7dP,KA6dmC9I,EAAM8I,OAAtE,CAUA,IAAMqc,EAAQ,GAAGpc,MAAMnK,KAAKkD,EAAO6G,iBAAiB1F,KAEpD,GAAqB,IAAjBkiB,EAAM1d,OAAV,CAIA,IAAIH,EAAQ6d,EAAMnc,QAAQhJ,EAAMK,QA3eH,KA6ezBL,EAAM8I,OAAsC,EAARxB,GACtCA,IA7e2B,KAgfzBtH,EAAM8I,OAAgCxB,EAAQ6d,EAAM1d,OAAS,GAC/DH,IAGEA,EAAQ,IACVA,EAAQ,GAGV6d,EAAM7d,GAAO8c,aA9Bb,CACE,GA/d2B,KA+dvBpkB,EAAM8I,MAA0B,CAClC,IAAM1F,EAAStB,EAAO5E,cAAc+F,IACpChH,EAAEmH,GAAQtF,QAAQ,SAGpB7B,EAAEF,MAAM+B,QAAQ,oDA1YlB,MA/F6B,wCAmG7B,OAAOiG,uCAIP,OAAOO,YAoaXrI,EAAES,UACCmG,GAAG9B,GAAMiiB,iBAAkB/f,GAAsBogB,GAAS6B,wBAC1DriB,GAAG9B,GAAMiiB,iBAAkB/f,GAAeogB,GAAS6B,wBACnDriB,GAAM9B,GAAMG,eAHf,IAGiCH,GAAMkiB,eAAkBI,GAASU,aAC/DlhB,GAAG9B,GAAMG,eAAgB+B,GAAsB,SAAUjD,GACxDA,EAAM4C,iBACN5C,EAAMwkB,kBACNnB,GAAS/gB,iBAAiB1D,KAAK3C,EAAEF,MAAO,YAEzC8G,GAAG9B,GAAMG,eAAgB+B,GAAqB,SAAC2F,GAC9CA,EAAE4b,oBAGH3hB,GAAG,mBAAoB,WAEtBwgB,GAAS/gB,iBAAiB1D,KAAK3C,EAAEgH,IAAuB,UAU5DhH,EAAE6D,GAAGa,IAAQ0iB,GAAS/gB,iBACtBrG,EAAE6D,GAAGa,IAAMmC,YAAcugB,GACzBpnB,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNuiB,GAAS/gB,kBCxiBlB,IAAM3B,GAAO,WAEPC,GAAW,cACXE,GAAqB7E,EAAE6D,GAAGa,IAS1BQ,GACW,gBAGX8B,GACU,aADVA,GAEO,2BAFPA,GAGa,mBAHbA,GAIW,0BAJXA,GAKO,cALPA,GAMO,YANPA,GAOO,YAPPA,GAQgB,kCARhBA,GASY,iBATZA,GAUgB,gCAUhBmiB,cACJ,SAAAA,EAAYvoB,EAASyB,GACnBvC,KAAKsF,SAAWxE,EAChBd,KAAKspB,WAAappB,EAAEF,KAAKsF,UAAU+W,KAAKnV,IACxClH,KAAKupB,iBAAmBrpB,EAAEF,KAAKsF,UAAU+W,KAAKnV,IAAuB8D,KAAK9D,IAC1ElH,KAAKwpB,cAAgBtpB,EAAEF,KAAKsF,UAAU+W,KAAKnV,IAC3ClH,KAAKypB,mBAAqBvpB,EAAEF,KAAKsF,UAAU+W,KAAKnV,IAChDlH,KAAK0pB,mBAAqBxpB,EAAEF,KAAKsF,UAAU+W,KAAKnV,IAChDlH,KAAKiK,QAAU1H,EACqB,oBAAzBvC,KAAKiK,QAAQ0f,UACtB3pB,KAAKiK,QAAQ0f,SAAU,GAEzB3pB,KAAK2K,qBACL3K,KAAK4pB,mBAAmB5pB,KAAKsF,UAC7BtF,KAAK6pB,KAAO7pB,KAAK8pB,yCAanBnf,mBAAA,WAAqB,IAAA5K,EAAAC,KACnBA,KAAKupB,iBAAiBziB,GAAG,QAAS,SAAC7C,GAAD,OAAWlE,EAAKgqB,WAAW9lB,KAC7DjE,KAAKwpB,cAAc1iB,GAAG,QAAS,SAAC7C,GAAD,OAAWlE,EAAKiqB,YAAY/lB,KAC3DjE,KAAKspB,WAAWxiB,GAAG,UAAW,SAAC7C,GAAD,OAAWlE,EAAKkqB,eAAehmB,KACxDjE,KAAKiK,QAAQ0f,SAChB3pB,KAAKypB,mBAAmB3iB,GAAG,oBAAqB9G,KAAKkqB,gBAEvDlqB,KAAK0pB,mBAAmB5iB,GAAG,QAAS,SAAC7C,GAAD,OAAWlE,EAAKoqB,sBAAsBlmB,QAG5E2lB,mBAAA,SAAmB9oB,GACjB,IAAMspB,EAAWlqB,EAAEY,GAASub,KAAK,2BAEjCnc,EAAEY,GAASqQ,KAAK,OAAQ,eACxBjR,EAAEY,GAASub,KAAK,iBAAiBlL,KAAK,OAAQ,QAC9CjR,EAAEY,GAASub,KAAKnV,IAAyBiK,KAAK,OAAQ,QACtDjR,EAAEY,GAASub,KAAK,mCAAmClL,KAAK,OAAQ,YAChEjR,EAAEY,GAASub,KAAKnV,IAAwBiK,KAAK,CAC3CkZ,eAAe,IAEjBnqB,EAAEY,GAASub,KAAKnV,IAAmBiK,KAAK,OAAQ,gBAEhDiZ,EAAS5jB,KAAK,WACZ,IAAM8jB,EAAQlqB,EAAKG,OAAOqE,IACpB2lB,EAAkBrqB,EAAEF,MAAMgL,KAAK9D,IAC/BsjB,EAAWtqB,EAAEF,MACbyqB,EAAmBD,EAASnO,KAAKnV,IACjCwjB,EAAWxqB,EAAEF,MAAMgG,QAAQkB,IAAmBnB,SAASC,QAAQkB,IAAmB8D,KAAK9D,IACzFyjB,EAAW,cAAiBD,EAASE,OAA1B,QAEVF,EAAShf,SACZif,EAAW,cAAiBzqB,EAAEF,MAAMgG,QAAQkB,IAAyB8D,KAAK9D,IAAmB0jB,OAAlF,SAGbJ,EAASrZ,KAAK,CACZpB,GAAIua,EACJO,KAAM,SAERN,EAAgBpZ,KAAK,CACnB0Z,KAAM,WACNC,gBAAiBR,EACjBS,iBAAiB,EACjBC,iBAAiB,IAEnBP,EAAiBtZ,KAAK,CACpB0Z,KAAM,WACNC,gBAAiBR,EACjBW,aAAcN,SAKpBb,cAAA,SAAcxlB,GAAQ,IAAA2H,EAAAjM,KACpB,GAAKE,EAAEoE,GAAQoH,OAAf,CAIA,IAAMuG,EAAU/R,EAAEoE,GAAQgkB,QAGpB4C,EAlHS,MAgHEjZ,EAAQkZ,UAAU5f,MAAMvL,KAAKsF,UACzBpF,EAAE,8BAA8BooB,QAAQ6C,UAAU5f,MAAMrL,EAAE,gBACT,EAChEsqB,EAAWvY,EAAQjM,QAAQkB,IAC3BkkB,EAAWlrB,EAAEgH,IAEnBkkB,EAASld,SAAS9I,IAGkB,aAAhC6M,EAAQd,KAAK,gBACfc,EAAQoZ,SAASnkB,IAAyBokB,SAAS,QACnDtrB,KAAKypB,mBAAmB3Y,IAAImB,EAAQoZ,SAASnkB,KAA0BokB,SAAS,QAChFprB,EAAEF,KAAKsF,UAAU4Q,OAAO,QACxBkV,EAAS7pB,IAAI,YAAa,oBAE1B0Q,EAAQjM,QAAQkB,IAAyBokB,SAAS,QAClDtrB,KAAKypB,mBAAmB3Y,IAAImB,EAAQjM,QAAQkB,KAA0BokB,SAAS,QAG/ErZ,EAAQkZ,QAAQjkB,IAAmByJ,OAGnCsB,EAAQkZ,QAAQjkB,IAAmBmV,KAAK,eAAevL,IAAImB,GAASd,KAAK,CACvEoa,UAAW,EACXlB,eAAe,EACfU,iBAAiB,IAInBK,EAAS7pB,IAAI,YAAb,cAAwC2pB,EAAxC,MACIA,EAEFhrB,EAAEF,KAAKsF,UAAU4Q,OAAOsU,EAAStU,UAEjChW,EAAEF,KAAKsF,UAAU4Q,OAAO,SAK5B7V,WAAW,WACJ4L,EAAKhC,QAAQ0f,SAEhB1X,EAAQlQ,QAAQ,SAGlBqpB,EAASllB,YAAYd,KA9JX,SAkKd6kB,eAAA,SAAehmB,GACb,IAAMunB,EAActrB,EAAE+D,EAAMK,QAG5B,IAAI,kBAAkBjB,KAAKY,EAAMK,OAAOwI,SAKxC,OAAQ7I,EAAM8I,OACZ,KAhLqB,GAiLnB/M,KAAKgqB,YAAY/lB,GACjB,MACF,KAlLsB,GAmLpBjE,KAAK+pB,WAAW9lB,GAChB,MACF,KApLmB,GAsLjBunB,EAAYzlB,SAASiF,OAAOqR,KAAK,cAAcvL,IAAI5J,IAAwBnF,QAAQ,SACnF,MACF,KAvLqB,GAyLnBypB,EAAYzlB,SAAS6E,OAAOyR,KAAK,cAActa,QAAQ,aAM7DmoB,eAAA,WACEhqB,EAAEF,MAAMqc,KAAKnV,IAAmB4J,IAAI5J,IAAwBohB,QAAQvmB,QAAQ,YAG9EooB,sBAAA,SAAsBtd,GACpB,IAAMgF,EAAQ3R,EAAE2M,EAAEvI,QACZmnB,EAAgBvrB,EAAE2R,EAAMV,KAAK,SAEnCnR,KAAKypB,mBAAmB3Y,IAAI2a,GAAeH,SAAS,WAGtDvB,WAAA,SAAWld,GACTA,EAAEhG,iBACF,IAAMgL,EAAQ3R,EAAE2M,EAAEvI,QACZkmB,EAAW3Y,EAAM7L,QAAQkB,IACzBwkB,EAAc7Z,EAAMjH,KAAK1D,IACzBkkB,EAAWlrB,EAAEgH,IACbqjB,EAAkB1Y,EAGlB8Z,EAjNS,IA+Ma/c,SAASwc,EAAS7pB,IAAI,aAAaK,MAAM,KA9MrD,GA8MwE,IACvEwpB,EAASjV,QAG1B,SAAKtE,EAAMjH,KAAK1D,IAAmBwE,QAAU0f,EAASjlB,SAASf,OAI/DgmB,EAASld,SAAS9I,IAGlBolB,EAASnO,KAAKnV,IAAmBwJ,OAGjCgb,EAAW/a,OAGXzQ,EAAEgH,IAAmBgP,OAAOwV,EAAWxV,UAGlCyV,GACHP,EAAS/O,KAAK,wBAAwBlL,KAAK,CACzCoa,UAAW,EACXlB,eAAe,IAGnBG,EAASnO,KAAKnV,IAAmBiK,KAAK,CACpCoa,UAAW,EACXlB,eAAe,IAEjBqB,EAAWrP,KAAKnV,IAAmBiK,KAAK,CACtCoa,SAAU,EACVlB,eAAe,IAIjBe,EAAS7pB,IAAI,YAAb,eAAwCoqB,EAnPzB,KAmPf,MAGAP,EAASjrB,IAAI,gBAAiB,WAC5BoqB,EAAgBpZ,KAAK,iBAAiB,GACtCua,EAAWrP,KAAKnV,IAAmB4J,IAAI5J,IAAwBohB,QAAQvmB,QAAQ,SAC/EqpB,EAASllB,YAAYd,OAEhB,MAGT4kB,YAAA,SAAYnd,GACVA,EAAEhG,iBAEF,IACM2jB,EADQtqB,EAAE2M,EAAEvI,QACK0B,QAAQkB,IACzBwkB,EAAalB,EAASzkB,SAASC,QAAQkB,IACvCkkB,EAAWlrB,EAAEgH,IACb0kB,EAAoBF,EAAWrP,KAAKnV,IAGpCykB,EAxQS,IAsQa/c,SAASwc,EAAS7pB,IAAI,aAAaK,MAAM,KArQrD,GAqQwE,IACvEwpB,EAASjV,QAG1B,SAAKwV,GAA8BP,EAASjlB,SAASf,OAIrDgmB,EAASld,SAAS9I,IAGlBsmB,EAAWrP,KAAKnV,IAAmBiK,KAAK,CACtCoa,SAAU,EACVlB,eAAe,KAnRF,MAqRXsB,IAEFzrB,EAAEgH,IAAmB3F,IAAI,SAAU,QACnC6pB,EAAS/O,KAAK,wBAAwBlL,KAAK,CACzCoa,SAAU,EACVlB,eAAe,KAKnBe,EAAS7pB,IAAI,YAAb,eAAwCoqB,EA/RzB,KA+Rf,MAGAP,EAASjrB,IAAI,gBAAiB,WAC5ByrB,EAAkBza,KAAK,iBAAiB,GACxCya,EAAkB7pB,QAAQ,SAC1ByoB,EAAS9Z,OACT0a,EAASllB,YAAYd,OAEhB,MAKFmB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAKtG,EAAEF,MAAMuE,GAAG2C,IACd,MAAM,IAAI6H,UAAU,8BAGtB,GAAKxM,GAEE,GAAIA,EAAOonB,SAAqC,kBAAnBpnB,EAAOonB,QAEzC,MAAM,IAAI5a,UAAU,2CAHpBxM,EAAS,GAMX,IAAImE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAOxB,GALK6B,IACHA,EAAO,IAAI2iB,EAASrpB,KAAMuC,GAC1BrC,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGrBnE,EAAO+B,OAAQ,CACjB,GAA6B,iBAAlB/B,EAAO+B,SAAwB,UAAUjB,KAAKd,EAAO+B,QAC9D,MAAM,IAAIyK,UAAJ,aAA2BxM,EAAO+B,OAAlC,sBAGRoC,EAAKmjB,KAAKtnB,EAAO+B,oDAvRrB,MAvDY,iBA0VhBpE,EAAE6D,GAAGa,IAAoBykB,GAAS9iB,iBAClCrG,EAAE6D,GAAGa,IAAMmC,YAAcsiB,GACzBnpB,EAAE6D,GAAGa,IAAMoC,WAAc,WAEvB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNskB,GAAS9iB,kBCjWlB,IAAM3B,GAAqB,QAErBC,GAAqB,WACrBC,GAAS,IAAgBD,GAEzBE,GAAqB7E,EAAE6D,GAAGa,IAG1BoD,GAAU,CACd6jB,UAAW,EACX3jB,UAAW,EACXmgB,OAAW,EACX1X,MAAW,GAGPpI,GAAc,CAClBsjB,SAAW,mBACX3jB,SAAW,UACXmgB,MAAW,UACX1X,KAAW,WAGP3L,GAAQ,CACZyK,KAAI,OAAuB3K,GAC3B4K,OAAM,SAAuB5K,GAC7ByK,KAAI,OAAuBzK,GAC3B0K,MAAK,QAAuB1K,GAC5BgnB,QAAO,UAAuBhnB,GAC9BinB,OAAM,SAAuBjnB,GAC7BknB,cAAa,gBAAuBlnB,GACpCmnB,gBAAe,kBAAuBnnB,GACtConB,gBAAe,kBAAuBpnB,GACtCqnB,kBAAiB,oBAAuBrnB,GACxCK,eAAc,QAAcL,GA7BH,aAgCrBM,GACiB,0BADjBA,GAEiB,0BAFjBA,GAGiB,iBAHjBA,GAIiB,aAJjBA,GAKiB,OALjBA,GAMiB,OAGjB8B,GACa,gBADbA,GAEa,cAFbA,GAGa,wBAHbA,GAIa,yBAJbA,GAKa,wDASbklB,cACJ,SAAAA,EAAYtrB,EAASyB,GACnBvC,KAAKiK,QAAuBjK,KAAKkK,WAAW3H,GAC5CvC,KAAKsF,SAAuBxE,EAC5Bd,KAAKqsB,QAAuBvrB,EAAQK,cAAc+F,IAClDlH,KAAKssB,UAAuB,KAC5BtsB,KAAKusB,UAAuB,EAC5BvsB,KAAKwsB,oBAAuB,EAC5BxsB,KAAKysB,sBAAuB,EAC5BzsB,KAAK6P,kBAAuB,EAC5B7P,KAAK0sB,gBAAuB,EAG5B1sB,KAAK2sB,sCAgBPtlB,OAAA,SAAOmG,GACL,OAAOxN,KAAKusB,SAAWvsB,KAAK0Q,OAAS1Q,KAAK2Q,KAAKnD,MAGjDmD,KAAA,SAAKnD,GAAe,IAAAzN,EAAAC,KAClB,IAAIA,KAAKusB,WAAYvsB,KAAK6P,iBAA1B,CAII3P,EAAEF,KAAKsF,UAAUa,SAASf,MAC5BpF,KAAK6P,kBAAmB,GAG1B,IAAMoY,EAAY/nB,EAAE8E,MAAMA,GAAMuK,KAAM,CACpC/B,cAAAA,IAGFtN,EAAEF,KAAKsF,UAAUvD,QAAQkmB,GAErBjoB,KAAKusB,UAAYtE,EAAUtiB,uBAI/B3F,KAAKusB,UAAW,EAEhBvsB,KAAK4sB,kBACL5sB,KAAK6sB,gBAEL7sB,KAAK8sB,kBAEL5sB,EAAEF,KAAKsF,UAAUwB,GACf9B,GAAMgnB,cACN9kB,GACA,SAACjD,GAAD,OAAWlE,EAAK2Q,KAAKzM,KAGvB/D,EAAEF,KAAKqsB,SAASvlB,GAAG9B,GAAMmnB,kBAAmB,WAC1CjsB,EAAEH,EAAKuF,UAAUnF,IAAI6E,GAAMknB,gBAAiB,SAACjoB,GACvC/D,EAAE+D,EAAMK,QAAQC,GAAGxE,EAAKuF,YAC1BvF,EAAK0sB,sBAAuB,OAKlCzsB,KAAK+sB,cAAc,WAAA,OAAMhtB,EAAKitB,aAAaxf,UAG7CkD,KAAA,SAAKzM,GAAO,IAAAgI,EAAAjM,KAKV,GAJIiE,GACFA,EAAM4C,iBAGH7G,KAAKusB,WAAYvsB,KAAK6P,iBAA3B,CAIA,IAAM0Y,EAAYroB,EAAE8E,MAAMA,GAAMyK,MAIhC,GAFAvP,EAAEF,KAAKsF,UAAUvD,QAAQwmB,GAEpBvoB,KAAKusB,WAAYhE,EAAU5iB,qBAAhC,CAIA3F,KAAKusB,UAAW,EAChB,IAAMU,EAAa/sB,EAAEF,KAAKsF,UAAUa,SAASf,IAgB7C,GAdI6nB,IACFjtB,KAAK6P,kBAAmB,GAG1B7P,KAAK8sB,kBAEL5sB,EAAES,UAAUiL,IAAI5G,GAAM8mB,SAEtB5rB,EAAEF,KAAKsF,UAAUY,YAAYd,IAE7BlF,EAAEF,KAAKsF,UAAUsG,IAAI5G,GAAMgnB,eAC3B9rB,EAAEF,KAAKqsB,SAASzgB,IAAI5G,GAAMmnB,mBAGtBc,EAAY,CACd,IAAM3rB,EAAsBlB,EAAKiB,iCAAiCrB,KAAKsF,UAEvEpF,EAAEF,KAAKsF,UACJnF,IAAIC,EAAKR,eAAgB,SAACqE,GAAD,OAAWgI,EAAKihB,WAAWjpB,KACpDD,qBAAqB1C,QAExBtB,KAAKktB,kBAITrnB,QAAA,WACE,CAAC2E,OAAQxK,KAAKsF,SAAUtF,KAAKqsB,SAC1BtP,QAAQ,SAACoQ,GAAD,OAAiBjtB,EAAEitB,GAAavhB,IAAI9G,MAO/C5E,EAAES,UAAUiL,IAAI5G,GAAM8mB,SAEtB5rB,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAE5B7E,KAAKiK,QAAuB,KAC5BjK,KAAKsF,SAAuB,KAC5BtF,KAAKqsB,QAAuB,KAC5BrsB,KAAKssB,UAAuB,KAC5BtsB,KAAKusB,SAAuB,KAC5BvsB,KAAKwsB,mBAAuB,KAC5BxsB,KAAKysB,qBAAuB,KAC5BzsB,KAAK6P,iBAAuB,KAC5B7P,KAAK0sB,gBAAuB,QAK9BxiB,WAAA,SAAW3H,GAMT,OALAA,EAAMsJ,EAAA,GACD7D,GACAzF,GAELnC,EAAKiC,gBAAgBuC,GAAMrC,EAAQgG,IAC5BhG,KAGTyqB,aAAA,SAAaxf,GAAe,IAAApB,EAAApM,KACpBitB,EAAa/sB,EAAEF,KAAKsF,UAAUa,SAASf,IAExCpF,KAAKsF,SAASzB,YACf7D,KAAKsF,SAASzB,WAAWzB,WAAauS,KAAKyY,cAE7CzsB,SAAS0S,KAAKga,YAAYrtB,KAAKsF,UAGjCtF,KAAKsF,SAAS4L,MAAMmW,QAAU,QAC9BrnB,KAAKsF,SAAS0gB,gBAAgB,eAC9BhmB,KAAKsF,SAASqC,aAAa,cAAc,GAErCzH,EAAEF,KAAKqsB,SAASlmB,SAASf,IAC3BpF,KAAKqsB,QAAQlrB,cAAc+F,IAAqBuQ,UAAY,EAE5DzX,KAAKsF,SAASmS,UAAY,EAGxBwV,GACF7sB,EAAKyB,OAAO7B,KAAKsF,UAGnBpF,EAAEF,KAAKsF,UAAU4I,SAAS9I,IAEtBpF,KAAKiK,QAAQoe,OACfroB,KAAKstB,gBAGP,IAAMC,EAAartB,EAAE8E,MAAMA,GAAMwK,MAAO,CACtChC,cAAAA,IAGIggB,EAAqB,WACrBphB,EAAKnC,QAAQoe,OACfjc,EAAK9G,SAAS+iB,QAEhBjc,EAAKyD,kBAAmB,EACxB3P,EAAEkM,EAAK9G,UAAUvD,QAAQwrB,IAG3B,GAAIN,EAAY,CACd,IAAM3rB,EAAsBlB,EAAKiB,iCAAiCrB,KAAKqsB,SAEvEnsB,EAAEF,KAAKqsB,SACJlsB,IAAIC,EAAKR,eAAgB4tB,GACzBxpB,qBAAqB1C,QAExBksB,OAIJF,cAAA,WAAgB,IAAAjf,EAAArO,KACdE,EAAES,UACCiL,IAAI5G,GAAM8mB,SACVhlB,GAAG9B,GAAM8mB,QAAS,SAAC7nB,GACdtD,WAAasD,EAAMK,QACnB+J,EAAK/I,WAAarB,EAAMK,QACsB,IAA9CpE,EAAEmO,EAAK/I,UAAUmoB,IAAIxpB,EAAMK,QAAQoH,QACrC2C,EAAK/I,SAAS+iB,aAKtByE,gBAAA,WAAkB,IAAAY,EAAA1tB,KACZA,KAAKusB,UAAYvsB,KAAKiK,QAAQ/B,SAChChI,EAAEF,KAAKsF,UAAUwB,GAAG9B,GAAMinB,gBAAiB,SAAChoB,GAnRvB,KAoRfA,EAAM8I,QACR9I,EAAM4C,iBACN6mB,EAAKhd,UAGC1Q,KAAKusB,UACfrsB,EAAEF,KAAKsF,UAAUsG,IAAI5G,GAAMinB,oBAI/BiB,WAAA,WAAa,IAAAS,EAAA3tB,KACXA,KAAKsF,SAAS4L,MAAMmW,QAAU,OAC9BrnB,KAAKsF,SAASqC,aAAa,eAAe,GAC1C3H,KAAKsF,SAAS0gB,gBAAgB,cAC9BhmB,KAAK6P,kBAAmB,EACxB7P,KAAK+sB,cAAc,WACjB7sB,EAAES,SAAS0S,MAAMnN,YAAYd,IAC7BuoB,EAAKC,kBACL1tB,EAAEytB,EAAKroB,UAAUvD,QAAQiD,GAAM0K,aAInCme,gBAAA,WACM7tB,KAAKssB,YACPpsB,EAAEF,KAAKssB,WAAWhmB,SAClBtG,KAAKssB,UAAY,SAIrBS,cAAA,SAAc3O,GAAU,IAAA0P,EAAA9tB,KAChB+tB,EAAU7tB,EAAEF,KAAKsF,UAAUa,SAASf,IACtCA,GAAiB,GAErB,GAAIpF,KAAKusB,UAAYvsB,KAAKiK,QAAQ4hB,SAAU,CA+B1C,GA9BA7rB,KAAKssB,UAAY3rB,SAASqtB,cAAc,OACxChuB,KAAKssB,UAAU2B,UAAY7oB,GAEvB2oB,GACF/tB,KAAKssB,UAAU9kB,UAAUE,IAAIqmB,GAG/B7tB,EAAEF,KAAKssB,WAAW4B,SAASvtB,SAAS0S,MAEpCnT,EAAEF,KAAKsF,UAAUwB,GAAG9B,GAAMgnB,cAAe,SAAC/nB,GACpC6pB,EAAKrB,qBACPqB,EAAKrB,sBAAuB,EAG1BxoB,EAAMK,SAAWL,EAAM6N,gBAGG,WAA1Bgc,EAAK7jB,QAAQ4hB,SACfiC,EAAKxoB,SAAS+iB,QAEdyF,EAAKpd,UAILqd,GACF3tB,EAAKyB,OAAO7B,KAAKssB,WAGnBpsB,EAAEF,KAAKssB,WAAWpe,SAAS9I,KAEtBgZ,EACH,OAGF,IAAK2P,EAEH,YADA3P,IAIF,IAAM+P,EAA6B/tB,EAAKiB,iCAAiCrB,KAAKssB,WAE9EpsB,EAAEF,KAAKssB,WACJnsB,IAAIC,EAAKR,eAAgBwe,GACzBpa,qBAAqBmqB,QACnB,IAAKnuB,KAAKusB,UAAYvsB,KAAKssB,UAAW,CAC3CpsB,EAAEF,KAAKssB,WAAWpmB,YAAYd,IAE9B,IAAMgpB,EAAiB,WACrBN,EAAKD,kBACDzP,GACFA,KAIJ,GAAIle,EAAEF,KAAKsF,UAAUa,SAASf,IAAiB,CAC7C,IAAM+oB,EAA6B/tB,EAAKiB,iCAAiCrB,KAAKssB,WAE9EpsB,EAAEF,KAAKssB,WACJnsB,IAAIC,EAAKR,eAAgBwuB,GACzBpqB,qBAAqBmqB,QAExBC,SAEOhQ,GACTA,OASJwO,gBAAA,WACE,IAAMpV,EAAO7W,SAAS0S,KAAK/B,wBAC3BtR,KAAKwsB,mBAAqBhV,EAAKH,KAAOG,EAAKJ,MAAQ5M,OAAOkP,WAC1D1Z,KAAK0sB,gBAAkB1sB,KAAKquB,wBAG9BxB,cAAA,WAAgB,IAAAyB,EAAAtuB,KACd,GAAIA,KAAKwsB,mBAAoB,CAG3B,IAAM+B,EAAe,GAAGvhB,MAAMnK,KAAKlC,SAASiM,iBAAiB1F,KAG7DhH,EAAEquB,GAAc/nB,KAAK,SAAC+E,EAAOzK,GAC3B,IAAM0tB,EAAc1tB,EAAQoQ,MAAMkG,MAC5BqX,EAAkBvuB,EAAEY,GAASS,IAAI,SACvCrB,EAAEY,GACC4F,KAAK,QAAS8nB,GACdjtB,IAAI,QAAYG,WAAW+sB,GAAmBH,EAAK5B,gBAFtD,QAMF,IAAMgC,EAAgB/tB,SAAS0S,KAAKnC,MAAMyd,aACpCC,EAAoB1uB,EAAES,SAAS0S,MAAM9R,IAAI,iBAC/CrB,EAAES,SAAS0S,MACR3M,KAAK,gBAAiBgoB,GACtBntB,IAAI,gBAAoBG,WAAWktB,GAAqB5uB,KAAK0sB,gBAFhE,MAKFxsB,EAAES,SAAS0S,MAAMnF,SAAS9I,OAG5BwoB,gBAAA,WAEE,IAAMW,EAAe,GAAGvhB,MAAMnK,KAAKlC,SAASiM,iBAAiB1F,KAC7DhH,EAAEquB,GAAc/nB,KAAK,SAAC+E,EAAOzK,GAC3B,IAAMsW,EAAQlX,EAAEY,GAAS4F,KAAK,SAC9BxG,EAAEY,GAASgF,WAAW,SACtBhF,EAAQoQ,MAAMkG,MAAQA,GAAgB,KAIxC,IAAMiC,EAAUnZ,EAAES,SAAS0S,MAAM3M,KAAK,iBACtCxG,EAAES,SAAS0S,MAAMvN,WAAW,iBAC5BnF,SAAS0S,KAAKnC,MAAMyd,aAAetV,GAAoB,MAGzDgV,mBAAA,WACE,IAAMQ,EAAYluB,SAASqtB,cAAc,OACzCa,EAAUZ,UAAY7oB,GACtBzE,SAAS0S,KAAKga,YAAYwB,GAC1B,IAAMC,EAAiBD,EAAUvd,wBAAwB6E,MAAQ0Y,EAAUhX,YAE3E,OADAlX,SAAS0S,KAAKqT,YAAYmI,GACnBC,KAITnC,SAAA,WACE,IAAMoC,EAAc7uB,EAAEF,KAAKsF,UACrB0pB,EAAcD,EAAY1S,KAAK,gBAC/B4S,EAAeF,EAAY1S,KAAK,iBAOtC,GALA0S,EAAY5d,KAAK,CACf0Z,KAAM,SACNqE,cAAc,IAGZF,EAAa,CACf,IAAMG,EAAeH,EAAY7d,KAAK,MAClCge,GACFJ,EAAY5d,KAAK,CACfie,kBAAoBD,IAKtBF,GACFA,EAAa9d,KAAK,OAAQ,eAOvB5K,iBAAP,SAAwBhE,EAAQiL,GAC9B,OAAOxN,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAClBoF,EAAO4B,EAAA,GACR7D,GACA9H,EAAEF,MAAM0G,OACU,iBAAXnE,GAAuBA,EAASA,EAAS,IAQrD,GALKmE,IACHA,EAAO,IAAI0lB,EAAMpsB,KAAMiK,GACvB/J,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGH,iBAAXnE,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,GAAQiL,QACJvD,EAAQ0G,MACjBjK,EAAKiK,KAAKnD,8CA9Zd,MA9EuB,wCAkFvB,OAAOxF,YAsaX9H,EAAES,UAAUmG,GAAG9B,GAAMG,eAAgB+B,GAAsB,SAAUjD,GAAO,IACtEK,EADsE+qB,EAAArvB,KAEpEe,EAAWX,EAAKS,uBAAuBb,MAEzCe,IACFuD,EAAS3D,SAASQ,cAAcJ,IAGlC,IAAMwB,EAASrC,EAAEoE,GAAQoC,KAAK7B,IAC1B,SADWgH,EAAA,GAER3L,EAAEoE,GAAQoC,OACVxG,EAAEF,MAAM0G,QAGM,MAAjB1G,KAAK8M,SAAoC,SAAjB9M,KAAK8M,SAC/B7I,EAAM4C,iBAGR,IAAMoL,EAAU/R,EAAEoE,GAAQnE,IAAI6E,GAAMuK,KAAM,SAAC0Y,GACrCA,EAAUtiB,sBAKdsM,EAAQ9R,IAAI6E,GAAM0K,OAAQ,WACpBxP,EAAEmvB,GAAM9qB,GAAG,aACb8qB,EAAKhH,YAKX+D,GAAM7lB,iBAAiB1D,KAAK3C,EAAEoE,GAAS/B,EAAQvC,QASjDE,EAAE6D,GAAGa,IAAQwnB,GAAM7lB,iBACnBrG,EAAE6D,GAAGa,IAAMmC,YAAcqlB,GACzBlsB,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNqnB,GAAM7lB,kBCriBf,IAAM3B,GAAqB,SAErBC,GAAqB,YACrBE,GAAqB7E,EAAE6D,GAAGa,IAG1BoD,GAAU,CACdsnB,QAAS,EACTvtB,QAAU,IAGNwG,GAAc,CAClB+mB,OAAS,UACTvtB,QAAU,UAGNmF,GACQ,gBADRA,GAEa,mBAUbqoB,cACJ,SAAAA,EAAYzuB,EAASyB,GAAQ,IAAAxC,EAAAC,KAC3BA,KAAKsF,SAAmBxE,EACxBd,KAAKwvB,UAAmB1uB,EAAQK,cAAc+F,IAC9ClH,KAAKiK,QAAmBjK,KAAKkK,WAAW3H,GACxCvC,KAAKyvB,eAAiBvvB,EAAEF,KAAKsF,UAAUoqB,cACvC1vB,KAAK2vB,oBAAsBzvB,EAAEF,KAAKwvB,WAAWE,cAE7C1vB,KAAK2sB,WAED3sB,KAAKiK,QAAQqlB,SACfpvB,EAAEF,KAAKsF,UAAU4I,SAAS,aAC1BhO,EAAEgH,IAAyBgH,SAAS,UACpChO,EAAES,SAAS0S,MAAM9R,IAAI,cAAevB,KAAKyvB,gBAEzCvvB,EAAEsK,QAAQ1D,GAAG,SAAU,WAER,EADE5G,EAAEsK,QAAQiN,YAEvBvX,EAAEH,EAAKuF,UAAU4I,SAAS,aAE1BhO,EAAEH,EAAKuF,UAAUY,YAAY,gBAK/BlG,KAAKiK,QAAQ2lB,WACf1vB,EAAEsK,QAAQ1D,GAAG,SAAU,WACjB5G,EAAEsK,QAAQkP,aAnDH,MAyDE,EAFExZ,EAAEsK,QAAQiN,YAGvBvX,EAAEgH,IAAoBwJ,OAEtBxQ,EAAEgH,IAAoByJ,qCAkB9BzG,WAAA,SAAW3H,GAGT,OAFAA,EAASrC,EAAE2vB,OAAO,GAAI7nB,GAASzF,GAC/BnC,EAAKiC,gBAAgBuC,GAAMrC,EAAQgG,IAC5BhG,KAGToqB,SAAA,WACEzsB,EAAEF,KAAKsF,UAAU+W,KAAK,kCAAkClL,KAAK,iBAAiB,MAKzE5K,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAClBoF,EAAO4B,EAAA,GACR7D,GACA9H,EAAEF,MAAM0G,OACU,iBAAXnE,GAAuBA,EAASA,EAAS,IAQrD,GALKmE,IACHA,EAAO,IAAI6oB,EAAOvvB,KAAMiK,GACxB/J,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGH,iBAAXnE,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDAvCT,MAxEuB,wCA4EvB,OAAOyF,YA+CX9H,EAAE6D,GAAGa,IAAQ2qB,GAAOhpB,iBACpBrG,EAAE6D,GAAGa,IAAMmC,YAAcwoB,GACzBrvB,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNwqB,GAAOhpB,kBChIhB,IAAM3B,GAAsB,OAEtBC,GAAsB,UAGtBE,GAAsB7E,EAAE6D,GAAGa,IAG3BI,GAAQ,CACZG,eAAc,0BAGVC,GAEY,OAFZA,GAGc,mBAGd8B,GACU,iBADVA,GAEU,iBAUV4oB,cACJ,SAAAA,EAAYhvB,GACVd,KAAKsF,SAAWxE,EAChBd,KAAK4nB,oBA3BmB,EA6BpB1nB,EAAEF,KAAKsF,UAAUS,SAASsW,KAAKnV,IAAuBwE,QACxDxL,EAAEF,KAAKsF,UAAUS,SAASmI,SAAS9I,+BAavCuL,KAAA,WACE,IAAMlK,EAAWvG,EAAEF,KAAKsF,UAEpBmB,EAASmE,OAAOzE,SAASf,MAK7BqB,EAASV,SAASsW,KAAKnV,IAAuBhB,YAAYd,IAE1DqB,EAASV,SAASsW,KAAK,0BAA0BlL,KAAK,iBAAiB,GAEvE1K,EAASmE,OAAOsD,SAAS9I,IAEzBqB,EAAS0K,KAAK,iBAAiB,OAIjCyW,kBAAA,WACE,IAAMmI,EAAO7vB,EAAEF,KAAKsF,UACd0qB,EAAYD,EAAKnlB,OAEvBmlB,EAAK5e,KAAK,KAAM/Q,EAAKG,OAAOqE,KAC5BorB,EAAU7e,KAAK,KAAM/Q,EAAKG,OAAOqE,KAEjCmrB,EAAK5e,KAAK,CACR2Z,gBAAiBkF,EAAU7e,KAAK,MAChC0Z,KAAM,QAERmF,EAAU7e,KAAK,CACbie,kBAAmBW,EAAK5e,KAAK,MAC7B0Z,KAAM,WACNU,SAAU,IAGRyE,EAAU7pB,SAASf,IACrB2qB,EAAK5e,KAAK,iBAAiB,GAE3B4e,EAAK5e,KAAK,iBAAiB,MAMxB5K,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAMqL,EAAQ3R,EAAEF,MACZ0G,EAAUmL,EAAMnL,KAAK7B,IAQzB,GANK6B,IACHA,EAAO,IAAIopB,EAAK9vB,MAChB6R,EAAMnL,KAAK7B,GAAU6B,KAInB,OAAOrD,KAAKd,IAKM,iBAAXA,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDArET,MA3CwB,iBA4H5BrC,EAAES,UACCmG,GAAG,mBAAoB,WACtBgpB,GAAKvpB,iBAAiB1D,KAAK3C,EAAEgH,IAAwB,UAEtDJ,GAAG9B,GAAMG,eAAgB+B,GAAuB,SAAUjD,GACzDA,EAAM4C,iBACNipB,GAAKvpB,iBAAiB1D,KAAK3C,EAAEF,MAAOoF,MASxClF,EAAE6D,GAAGa,IAAoBkrB,GAAKvpB,iBAC9BrG,EAAE6D,GAAGa,IAAMmC,YAAc+oB,GACzB5vB,EAAE6D,GAAGa,IAAMoC,WAAc,WAEvB,OADA9G,EAAE6D,GAAGa,IAAQG,GACN+qB,GAAKvpB,kBCzJd,IAAM0pB,GAAW,CACf,aACA,OACA,OACA,WACA,WACA,SACA,MACA,cAKWC,GAAmB,CAE9BC,IAAK,CAAC,QAAS,MAAO,KAAM,OAAQ,OAJP,kBAK7BxV,EAAG,CAAC,SAAU,OAAQ,QAAS,OAC/BH,KAAM,GACNI,EAAG,GACHwV,GAAI,GACJC,IAAK,GACLC,KAAM,GACNC,IAAK,GACLC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJ3hB,EAAG,GACH4hB,IAAK,CAAC,MAAO,MAAO,QAAS,QAAS,UACtCC,GAAI,GACJC,GAAI,GACJC,EAAG,GACHC,IAAK,GACLC,EAAG,GACHC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,IAAK,GACLC,OAAQ,GACRC,EAAG,GACHC,GAAI,IAQAC,GAAmB,8DAOnBC,GAAmB,sIAyBlB,SAASC,GAAaC,EAAYC,EAAWC,GAClD,GAA0B,IAAtBF,EAAWtmB,OACb,OAAOsmB,EAGT,GAAIE,GAAoC,mBAAfA,EACvB,OAAOA,EAAWF,GAQpB,IALA,IACMG,GADY,IAAI3nB,OAAO4nB,WACKC,gBAAgBL,EAAY,aACxDM,EAAgB5vB,OAAO4X,KAAK2X,GAC5BM,EAAW,GAAGvlB,MAAMnK,KAAKsvB,EAAgB9e,KAAKzG,iBAAiB,MAZP4lB,EAAA,SAcrDpjB,EAAOC,GACd,IAAM4J,EAAKsZ,EAASnjB,GACdqjB,EAASxZ,EAAG/F,SAAS/P,cAE3B,IAA0D,IAAtDmvB,EAAcrlB,QAAQgM,EAAG/F,SAAS/P,eAGpC,OAFA8V,EAAGpV,WAAW6iB,YAAYzN,GAE1B,WAGF,IAAMyZ,EAAgB,GAAG1lB,MAAMnK,KAAKoW,EAAGyL,YACjCiO,EAAwB,GAAG7S,OAAOmS,EAAU,MAAQ,GAAIA,EAAUQ,IAAW,IAEnFC,EAAc3V,QAAQ,SAAC5L,IAlD3B,SAA0BA,EAAMyhB,GAC9B,IAAMC,EAAW1hB,EAAK+B,SAAS/P,cAE/B,IAAgD,IAA5CyvB,EAAqB3lB,QAAQ4lB,GAC/B,OAAoC,IAAhC5C,GAAShjB,QAAQ4lB,IACZ5wB,QAAQkP,EAAK2hB,UAAU5vB,MAAM2uB,KAAqB1gB,EAAK2hB,UAAU5vB,MAAM4uB,KASlF,IAHA,IAAMiB,EAASH,EAAqBziB,OAAO,SAAC6iB,GAAD,OAAeA,aAAqB5vB,SAGtEgM,EAAI,EAAG6jB,EAAIF,EAAOrnB,OAAQ0D,EAAI6jB,EAAG7jB,IACxC,GAAIyjB,EAAS3vB,MAAM6vB,EAAO3jB,IACxB,OAAO,EAIX,OAAO,GA+BE8jB,CAAiB/hB,EAAMwhB,IAC1B1Z,EAAG+M,gBAAgB7U,EAAK+B,aAfrB9D,EAAI,EAAGC,EAAMkjB,EAAS7mB,OAAQ0D,EAAIC,EAAKD,IAAKojB,EAA5CpjB,GAoBT,OAAO+iB,EAAgB9e,KAAK8f,UCxG9B,IAAMvuB,GAAwB,UAExBC,GAAwB,aACxBC,GAAS,IAAmBD,GAC5BE,GAAwB7E,EAAE6D,GAAGa,IAC7BwuB,GAAwB,aACxBC,GAAwB,IAAIjwB,OAAJ,UAAqBgwB,GAArB,OAAyC,KACjEE,GAAwB,CAAC,WAAY,YAAa,cAElD/qB,GAAc,CAClBgrB,UAAoB,UACpBC,SAAoB,SACpBC,MAAoB,4BACpB1xB,QAAoB,SACpB2xB,MAAoB,kBACpBne,KAAoB,UACpBxU,SAAoB,mBACpBmZ,UAAoB,oBACpBgG,OAAoB,2BACpByT,UAAoB,2BACpBC,kBAAoB,iBACpBxM,SAAoB,mBACpByM,SAAoB,UACpB3B,WAAoB,kBACpBD,UAAoB,UAGhB9K,GAAgB,CACpB2M,KAAS,OACTC,IAAS,MACTC,MAAS,QACTC,OAAS,SACTC,KAAS,QAGLlsB,GAAU,CACdurB,WAAoB,EACpBC,SAAoB,uGAGpBzxB,QAAoB,cACpB0xB,MAAoB,GACpBC,MAAoB,EACpBne,MAAoB,EACpBxU,UAAoB,EACpBmZ,UAAoB,MACpBgG,OAAoB,EACpByT,WAAoB,EACpBC,kBAAoB,OACpBxM,SAAoB,eACpByM,UAAoB,EACpB3B,WAAoB,KACpBD,UAAoB/B,IAGhBiE,GACG,OADHA,GAEG,MAGHnvB,GAAQ,CACZyK,KAAI,OAAgB3K,GACpB4K,OAAM,SAAgB5K,GACtByK,KAAI,OAAgBzK,GACpB0K,MAAK,QAAgB1K,GACrBsvB,SAAQ,WAAgBtvB,GACxBkiB,MAAK,QAAgBliB,GACrBgnB,QAAO,UAAgBhnB,GACvBuvB,SAAQ,WAAgBvvB,GACxB8D,WAAU,aAAgB9D,GAC1B+D,WAAU,aAAgB/D,IAGtBM,GACG,OADHA,GAEG,OAGH8B,GAEY,iBAFZA,GAGY,SAGZotB,GACK,QADLA,GAEK,QAFLA,GAGK,QAHLA,GAIK,SAULC,cACJ,SAAAA,EAAYzzB,EAASyB,GAKnB,GAAsB,oBAAX4jB,GACT,MAAM,IAAIpX,UAAU,mEAItB/O,KAAKw0B,YAAiB,EACtBx0B,KAAKy0B,SAAiB,EACtBz0B,KAAK00B,YAAiB,GACtB10B,KAAK20B,eAAiB,GACtB30B,KAAKunB,QAAiB,KAGtBvnB,KAAKc,QAAUA,EACfd,KAAKuC,OAAUvC,KAAKkK,WAAW3H,GAC/BvC,KAAK40B,IAAU,KAEf50B,KAAK60B,2CAmCPC,OAAA,WACE90B,KAAKw0B,YAAa,KAGpBO,QAAA,WACE/0B,KAAKw0B,YAAa,KAGpBQ,cAAA,WACEh1B,KAAKw0B,YAAcx0B,KAAKw0B,cAG1BntB,OAAA,SAAOpD,GACL,GAAKjE,KAAKw0B,WAIV,GAAIvwB,EAAO,CACT,IAAMgxB,EAAUj1B,KAAK0oB,YAAY7jB,SAC7BmkB,EAAU9oB,EAAE+D,EAAM6N,eAAepL,KAAKuuB,GAErCjM,IACHA,EAAU,IAAIhpB,KAAK0oB,YACjBzkB,EAAM6N,cACN9R,KAAKk1B,sBAEPh1B,EAAE+D,EAAM6N,eAAepL,KAAKuuB,EAASjM,IAGvCA,EAAQ2L,eAAeQ,OAASnM,EAAQ2L,eAAeQ,MAEnDnM,EAAQoM,uBACVpM,EAAQqM,OAAO,KAAMrM,GAErBA,EAAQsM,OAAO,KAAMtM,OAElB,CACL,GAAI9oB,EAAEF,KAAKu1B,iBAAiBpvB,SAASf,IAEnC,YADApF,KAAKs1B,OAAO,KAAMt1B,MAIpBA,KAAKq1B,OAAO,KAAMr1B,UAItB6F,QAAA,WACE8G,aAAa3M,KAAKy0B,UAElBv0B,EAAE4F,WAAW9F,KAAKc,QAASd,KAAK0oB,YAAY7jB,UAE5C3E,EAAEF,KAAKc,SAAS8K,IAAI5L,KAAK0oB,YAAY5jB,WACrC5E,EAAEF,KAAKc,SAASkF,QAAQ,UAAU4F,IAAI,iBAElC5L,KAAK40B,KACP10B,EAAEF,KAAK40B,KAAKtuB,SAGdtG,KAAKw0B,WAAiB,KACtBx0B,KAAKy0B,SAAiB,KACtBz0B,KAAK00B,YAAiB,MACtB10B,KAAK20B,eAAiB,QAClB30B,KAAKunB,SACPvnB,KAAKunB,QAAQiB,UAGfxoB,KAAKunB,QAAU,KACfvnB,KAAKc,QAAU,KACfd,KAAKuC,OAAU,KACfvC,KAAK40B,IAAU,QAGjBjkB,KAAA,WAAO,IAAA5Q,EAAAC,KACL,GAAuC,SAAnCE,EAAEF,KAAKc,SAASS,IAAI,WACtB,MAAM,IAAI+B,MAAM,uCAGlB,IAAM2kB,EAAY/nB,EAAE8E,MAAMhF,KAAK0oB,YAAY1jB,MAAMuK,MACjD,GAAIvP,KAAKw1B,iBAAmBx1B,KAAKw0B,WAAY,CAC3Ct0B,EAAEF,KAAKc,SAASiB,QAAQkmB,GAExB,IAAMwN,EAAar1B,EAAKoD,eAAexD,KAAKc,SACtC40B,EAAax1B,EAAE0H,SACJ,OAAf6tB,EAAsBA,EAAaz1B,KAAKc,QAAQgS,cAAcrP,gBAC9DzD,KAAKc,SAGP,GAAImnB,EAAUtiB,uBAAyB+vB,EACrC,OAGF,IAAMd,EAAQ50B,KAAKu1B,gBACbI,EAAQv1B,EAAKG,OAAOP,KAAK0oB,YAAY9jB,MAE3CgwB,EAAIjtB,aAAa,KAAMguB,GACvB31B,KAAKc,QAAQ6G,aAAa,mBAAoBguB,GAE9C31B,KAAK41B,aAED51B,KAAKuC,OAAOgxB,WACdrzB,EAAE00B,GAAK1mB,SAAS9I,IAGlB,IAAM8U,EAA8C,mBAA1Bla,KAAKuC,OAAO2X,UAClCla,KAAKuC,OAAO2X,UAAUrX,KAAK7C,KAAM40B,EAAK50B,KAAKc,SAC3Cd,KAAKuC,OAAO2X,UAEZ2b,EAAa71B,KAAK81B,eAAe5b,GACrCla,KAAK+1B,mBAAmBF,GAExB,IAAMlC,EAAY3zB,KAAKg2B,gBAUvB,GATA91B,EAAE00B,GAAKluB,KAAK1G,KAAK0oB,YAAY7jB,SAAU7E,MAElCE,EAAE0H,SAAS5H,KAAKc,QAAQgS,cAAcrP,gBAAiBzD,KAAK40B,MAC/D10B,EAAE00B,GAAK1G,SAASyF,GAGlBzzB,EAAEF,KAAKc,SAASiB,QAAQ/B,KAAK0oB,YAAY1jB,MAAMovB,UAGnC,QADAzzB,SAASs1B,qBAAqB,QAAQ,GAAGC,IAClC,CACjB,IAAMza,EAAO,CACXrE,MAAO,OACPC,KAAM,SAERwe,EAAaA,EAAWna,QAAQ,cAAe,SAACC,GAAD,OAAaF,EAAKE,KAGnE3b,KAAKunB,QAAU,IAAIpB,GAAOnmB,KAAKc,QAAS8zB,EAAK,CAC3C1a,UAAW2b,EACXnZ,UAAW,CACTwD,OAAQlgB,KAAK6oB,aACbzF,KAAM,CACJK,SAAUzjB,KAAKuC,OAAOqxB,mBAExBnR,MAAO,CACL3hB,QAASoG,IAEX0a,gBAAiB,CACftI,kBAAmBtZ,KAAKuC,OAAO6kB,WAGnChG,SAAU,SAAC1a,GACLA,EAAK4c,oBAAsB5c,EAAKwT,WAClCna,EAAKo2B,6BAA6BzvB,IAGtC2a,SAAU,SAAC3a,GAAD,OAAU3G,EAAKo2B,6BAA6BzvB,MAGxDxG,EAAE00B,GAAK1mB,SAAS9I,IAMZ,iBAAkBzE,SAAS8C,iBAC7BvD,EAAES,SAAS0S,MAAMpF,WAAWnH,GAAG,YAAa,KAAM5G,EAAEkoB,MAGtD,IAAMgO,EAAW,WACXr2B,EAAKwC,OAAOgxB,WACdxzB,EAAKs2B,iBAEP,IAAMC,EAAiBv2B,EAAK20B,YAC5B30B,EAAK20B,YAAkB,KAEvBx0B,EAAEH,EAAKe,SAASiB,QAAQhC,EAAK2oB,YAAY1jB,MAAMwK,OAE3C8mB,IAAmBnC,IACrBp0B,EAAKu1B,OAAO,KAAMv1B,IAItB,GAAIG,EAAEF,KAAK40B,KAAKzuB,SAASf,IAAiB,CACxC,IAAM9D,EAAqBlB,EAAKiB,iCAAiCrB,KAAK40B,KAEtE10B,EAAEF,KAAK40B,KACJz0B,IAAIC,EAAKR,eAAgBw2B,GACzBpyB,qBAAqB1C,QAExB80B,QAKN1lB,KAAA,SAAK0N,GAAU,IAAAnS,EAAAjM,KACP40B,EAAY50B,KAAKu1B,gBACjBhN,EAAYroB,EAAE8E,MAAMhF,KAAK0oB,YAAY1jB,MAAMyK,MAC3C2mB,EAAW,WACXnqB,EAAKyoB,cAAgBP,IAAmBS,EAAI/wB,YAC9C+wB,EAAI/wB,WAAW6iB,YAAYkO,GAG7B3oB,EAAKsqB,iBACLtqB,EAAKnL,QAAQklB,gBAAgB,oBAC7B9lB,EAAE+L,EAAKnL,SAASiB,QAAQkK,EAAKyc,YAAY1jB,MAAM0K,QAC1B,OAAjBzD,EAAKsb,SACPtb,EAAKsb,QAAQiB,UAGXpK,GACFA,KAMJ,GAFAle,EAAEF,KAAKc,SAASiB,QAAQwmB,IAEpBA,EAAU5iB,qBAAd,CAgBA,GAZAzF,EAAE00B,GAAK1uB,YAAYd,IAIf,iBAAkBzE,SAAS8C,iBAC7BvD,EAAES,SAAS0S,MAAMpF,WAAWrC,IAAI,YAAa,KAAM1L,EAAEkoB,MAGvDpoB,KAAK20B,eAAeL,KAAiB,EACrCt0B,KAAK20B,eAAeL,KAAiB,EACrCt0B,KAAK20B,eAAeL,KAAiB,EAEjCp0B,EAAEF,KAAK40B,KAAKzuB,SAASf,IAAiB,CACxC,IAAM9D,EAAqBlB,EAAKiB,iCAAiCuzB,GAEjE10B,EAAE00B,GACCz0B,IAAIC,EAAKR,eAAgBw2B,GACzBpyB,qBAAqB1C,QAExB80B,IAGFp2B,KAAK00B,YAAc,OAGrBpO,OAAA,WACuB,OAAjBtmB,KAAKunB,SACPvnB,KAAKunB,QAAQ7I,oBAMjB8W,cAAA,WACE,OAAOvzB,QAAQjC,KAAKw2B,eAGtBT,mBAAA,SAAmBF,GACjB31B,EAAEF,KAAKu1B,iBAAiBrnB,SAAYklB,GAApC,IAAoDyC,MAGtDN,cAAA,WAEE,OADAv1B,KAAK40B,IAAM50B,KAAK40B,KAAO10B,EAAEF,KAAKuC,OAAOixB,UAAU,GACxCxzB,KAAK40B,OAGdgB,WAAA,WACE,IAAMhB,EAAM50B,KAAKu1B,gBACjBv1B,KAAKy2B,kBAAkBv2B,EAAE00B,EAAIhoB,iBAAiB1F,KAA0BlH,KAAKw2B,YAC7Et2B,EAAE00B,GAAK1uB,YAAed,GAAtB,IAAwCA,OAG1CqxB,kBAAA,SAAkBhwB,EAAUiwB,GACH,iBAAZA,IAAyBA,EAAQt0B,WAAYs0B,EAAQjlB,OAa5DzR,KAAKuC,OAAOgT,MACVvV,KAAKuC,OAAOsxB,WACd6C,EAAU3E,GAAa2E,EAAS12B,KAAKuC,OAAO0vB,UAAWjyB,KAAKuC,OAAO2vB,aAGrEzrB,EAAS8O,KAAKmhB,IAEdjwB,EAASmkB,KAAK8L,GAlBV12B,KAAKuC,OAAOgT,KACTrV,EAAEw2B,GAAS3wB,SAASxB,GAAGkC,IAC1BA,EAASkwB,QAAQC,OAAOF,GAG1BjwB,EAASmkB,KAAK1qB,EAAEw2B,GAAS9L,WAiB/B4L,SAAA,WACE,IAAI/C,EAAQzzB,KAAKc,QAAQE,aAAa,uBAQtC,OANKyyB,IACHA,EAAqC,mBAAtBzzB,KAAKuC,OAAOkxB,MACvBzzB,KAAKuC,OAAOkxB,MAAM5wB,KAAK7C,KAAKc,SAC5Bd,KAAKuC,OAAOkxB,OAGXA,KAKT5K,WAAA,WAAa,IAAAzc,EAAApM,KACLkgB,EAAS,GAef,MAbkC,mBAAvBlgB,KAAKuC,OAAO2d,OACrBA,EAAOnc,GAAK,SAAC2C,GAMX,OALAA,EAAKyQ,QAALtL,EAAA,GACKnF,EAAKyQ,QACL/K,EAAK7J,OAAO2d,OAAOxZ,EAAKyQ,QAAS/K,EAAKtL,UAAY,IAGhD4F,GAGTwZ,EAAOA,OAASlgB,KAAKuC,OAAO2d,OAGvBA,KAGT8V,cAAA,WACE,OAA8B,IAA1Bh2B,KAAKuC,OAAOoxB,UACPhzB,SAAS0S,KAGdjT,EAAK8B,UAAUlC,KAAKuC,OAAOoxB,WACtBzzB,EAAEF,KAAKuC,OAAOoxB,WAGhBzzB,EAAES,UAAU0b,KAAKrc,KAAKuC,OAAOoxB,cAGtCmC,eAAA,SAAe5b,GACb,OAAOiN,GAAcjN,EAAU3W,kBAGjCsxB,cAAA,WAAgB,IAAAxmB,EAAArO,KACGA,KAAKuC,OAAOR,QAAQH,MAAM,KAElCmb,QAAQ,SAAChb,GAChB,GAAgB,UAAZA,EACF7B,EAAEmO,EAAKvN,SAASgG,GACduH,EAAKqa,YAAY1jB,MAAMgiB,MACvB3Y,EAAK9L,OAAOxB,SACZ,SAACkD,GAAD,OAAWoK,EAAKhH,OAAOpD,UAEpB,GAAIlC,IAAYuyB,GAAgB,CACrC,IAAMuC,EAAU90B,IAAYuyB,GACxBjmB,EAAKqa,YAAY1jB,MAAM4D,WACvByF,EAAKqa,YAAY1jB,MAAM8mB,QACrBgL,EAAW/0B,IAAYuyB,GACzBjmB,EAAKqa,YAAY1jB,MAAM6D,WACvBwF,EAAKqa,YAAY1jB,MAAMqvB,SAE3Bn0B,EAAEmO,EAAKvN,SACJgG,GACC+vB,EACAxoB,EAAK9L,OAAOxB,SACZ,SAACkD,GAAD,OAAWoK,EAAKgnB,OAAOpxB,KAExB6C,GACCgwB,EACAzoB,EAAK9L,OAAOxB,SACZ,SAACkD,GAAD,OAAWoK,EAAKinB,OAAOrxB,QAK/B/D,EAAEF,KAAKc,SAASkF,QAAQ,UAAUc,GAChC,gBACA,WACMuH,EAAKvN,SACPuN,EAAKqC,SAKP1Q,KAAKuC,OAAOxB,SACdf,KAAKuC,OAALsJ,EAAA,GACK7L,KAAKuC,OADV,CAEER,QAAS,SACThB,SAAU,KAGZf,KAAK+2B,eAITA,UAAA,WACE,IAAMC,SAAmBh3B,KAAKc,QAAQE,aAAa,wBAE/ChB,KAAKc,QAAQE,aAAa,UAA0B,WAAdg2B,KACxCh3B,KAAKc,QAAQ6G,aACX,sBACA3H,KAAKc,QAAQE,aAAa,UAAY,IAGxChB,KAAKc,QAAQ6G,aAAa,QAAS,QAIvC0tB,OAAA,SAAOpxB,EAAO+kB,GACZ,IAAMiM,EAAUj1B,KAAK0oB,YAAY7jB,UACjCmkB,EAAUA,GAAW9oB,EAAE+D,EAAM6N,eAAepL,KAAKuuB,MAG/CjM,EAAU,IAAIhpB,KAAK0oB,YACjBzkB,EAAM6N,cACN9R,KAAKk1B,sBAEPh1B,EAAE+D,EAAM6N,eAAepL,KAAKuuB,EAASjM,IAGnC/kB,IACF+kB,EAAQ2L,eACS,YAAf1wB,EAAM8D,KAAqBusB,GAAgBA,KACzC,GAGFp0B,EAAE8oB,EAAQuM,iBAAiBpvB,SAASf,KAAmB4jB,EAAQ0L,cAAgBP,GACjFnL,EAAQ0L,YAAcP,IAIxBxnB,aAAaqc,EAAQyL,UAErBzL,EAAQ0L,YAAcP,GAEjBnL,EAAQzmB,OAAOmxB,OAAU1K,EAAQzmB,OAAOmxB,MAAM/iB,KAKnDqY,EAAQyL,SAAWp0B,WAAW,WACxB2oB,EAAQ0L,cAAgBP,IAC1BnL,EAAQrY,QAETqY,EAAQzmB,OAAOmxB,MAAM/iB,MARtBqY,EAAQrY,WAWZ2kB,OAAA,SAAOrxB,EAAO+kB,GACZ,IAAMiM,EAAUj1B,KAAK0oB,YAAY7jB,UACjCmkB,EAAUA,GAAW9oB,EAAE+D,EAAM6N,eAAepL,KAAKuuB,MAG/CjM,EAAU,IAAIhpB,KAAK0oB,YACjBzkB,EAAM6N,cACN9R,KAAKk1B,sBAEPh1B,EAAE+D,EAAM6N,eAAepL,KAAKuuB,EAASjM,IAGnC/kB,IACF+kB,EAAQ2L,eACS,aAAf1wB,EAAM8D,KAAsBusB,GAAgBA,KAC1C,GAGFtL,EAAQoM,yBAIZzoB,aAAaqc,EAAQyL,UAErBzL,EAAQ0L,YAAcP,GAEjBnL,EAAQzmB,OAAOmxB,OAAU1K,EAAQzmB,OAAOmxB,MAAMhjB,KAKnDsY,EAAQyL,SAAWp0B,WAAW,WACxB2oB,EAAQ0L,cAAgBP,IAC1BnL,EAAQtY,QAETsY,EAAQzmB,OAAOmxB,MAAMhjB,MARtBsY,EAAQtY,WAWZ0kB,qBAAA,WACE,IAAK,IAAMrzB,KAAW/B,KAAK20B,eACzB,GAAI30B,KAAK20B,eAAe5yB,GACtB,OAAO,EAIX,OAAO,KAGTmI,WAAA,SAAW3H,GACT,IAAM00B,EAAiB/2B,EAAEF,KAAKc,SAAS4F,OAwCvC,OAtCAhE,OAAO4X,KAAK2c,GACTla,QAAQ,SAACma,IACyC,IAA7C5D,GAAsBrmB,QAAQiqB,WACzBD,EAAeC,KAUA,iBAN5B30B,EAAMsJ,EAAA,GACD7L,KAAK0oB,YAAY1gB,QACjBivB,EACkB,iBAAX10B,GAAuBA,EAASA,EAAS,KAGnCmxB,QAChBnxB,EAAOmxB,MAAQ,CACb/iB,KAAMpO,EAAOmxB,MACbhjB,KAAMnO,EAAOmxB,QAIW,iBAAjBnxB,EAAOkxB,QAChBlxB,EAAOkxB,MAAQlxB,EAAOkxB,MAAMxwB,YAGA,iBAAnBV,EAAOm0B,UAChBn0B,EAAOm0B,QAAUn0B,EAAOm0B,QAAQzzB,YAGlC7C,EAAKiC,gBACHuC,GACArC,EACAvC,KAAK0oB,YAAYngB,aAGfhG,EAAOsxB,WACTtxB,EAAOixB,SAAWzB,GAAaxvB,EAAOixB,SAAUjxB,EAAO0vB,UAAW1vB,EAAO2vB,aAGpE3vB,KAGT2yB,mBAAA,WACE,IAAM3yB,EAAS,GAEf,GAAIvC,KAAKuC,OACP,IAAK,IAAMqU,KAAO5W,KAAKuC,OACjBvC,KAAK0oB,YAAY1gB,QAAQ4O,KAAS5W,KAAKuC,OAAOqU,KAChDrU,EAAOqU,GAAO5W,KAAKuC,OAAOqU,IAKhC,OAAOrU,KAGTg0B,eAAA,WACE,IAAMY,EAAOj3B,EAAEF,KAAKu1B,iBACd6B,EAAWD,EAAKhmB,KAAK,SAASjO,MAAMmwB,IACzB,OAAb+D,GAAqBA,EAAS1rB,QAChCyrB,EAAKjxB,YAAYkxB,EAASC,KAAK,QAInClB,6BAAA,SAA6BmB,GAC3B,IAAMC,EAAiBD,EAAWzV,SAClC7hB,KAAK40B,IAAM2C,EAAepe,OAC1BnZ,KAAKu2B,iBACLv2B,KAAK+1B,mBAAmB/1B,KAAK81B,eAAewB,EAAWpd,eAGzDmc,eAAA,WACE,IAAMzB,EAAM50B,KAAKu1B,gBACXiC,EAAsBx3B,KAAKuC,OAAOgxB,UAEA,OAApCqB,EAAI5zB,aAAa,iBAIrBd,EAAE00B,GAAK1uB,YAAYd,IACnBpF,KAAKuC,OAAOgxB,WAAY,EACxBvzB,KAAK0Q,OACL1Q,KAAK2Q,OACL3Q,KAAKuC,OAAOgxB,UAAYiE,MAKnBjxB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAClBoF,EAA4B,iBAAX1H,GAAuBA,EAE9C,IAAKmE,IAAQ,eAAerD,KAAKd,MAI5BmE,IACHA,EAAO,IAAI6tB,EAAQv0B,KAAMiK,GACzB/J,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGH,iBAAXnE,GAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDAnnBT,MA7H0B,wCAiI1B,OAAOyF,gCAIP,OAAOpD,oCAIP,OAAOC,iCAIP,OAAOG,qCAIP,OAAOF,uCAIP,OAAOyD,YAumBXrI,EAAE6D,GAAGa,IAAQ2vB,GAAQhuB,iBACrBrG,EAAE6D,GAAGa,IAAMmC,YAAcwtB,GACzBr0B,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNwvB,GAAQhuB,kBCtwBjB,IAAM3B,GAAsB,UAEtBC,GAAsB,aACtBC,GAAS,IAAiBD,GAC1BE,GAAsB7E,EAAE6D,GAAGa,IAC3BwuB,GAAsB,aACtBC,GAAsB,IAAIjwB,OAAJ,UAAqBgwB,GAArB,OAAyC,KAE/DprB,GAAO6D,EAAA,GACR0oB,GAAQvsB,QADA,CAEXkS,UAAY,QACZnY,QAAY,QACZ20B,QAAY,GACZlD,SAAY,wIAMRjrB,GAAWsD,EAAA,GACZ0oB,GAAQhsB,YADI,CAEfmuB,QAAU,8BAGNtxB,GACG,OADHA,GAEG,OAGH8B,GACM,kBADNA,GAEM,gBAGNlC,GAAQ,CACZyK,KAAI,OAAgB3K,GACpB4K,OAAM,SAAgB5K,GACtByK,KAAI,OAAgBzK,GACpB0K,MAAK,QAAgB1K,GACrBsvB,SAAQ,WAAgBtvB,GACxBkiB,MAAK,QAAgBliB,GACrBgnB,QAAO,UAAgBhnB,GACvBuvB,SAAQ,WAAgBvvB,GACxB8D,WAAU,aAAgB9D,GAC1B+D,WAAU,aAAgB/D,IAStB2yB,2LAiCJjC,cAAA,WACE,OAAOx1B,KAAKw2B,YAAcx2B,KAAK03B,iBAGjC3B,mBAAA,SAAmBF,GACjB31B,EAAEF,KAAKu1B,iBAAiBrnB,SAAYklB,GAApC,IAAoDyC,MAGtDN,cAAA,WAEE,OADAv1B,KAAK40B,IAAM50B,KAAK40B,KAAO10B,EAAEF,KAAKuC,OAAOixB,UAAU,GACxCxzB,KAAK40B,OAGdgB,WAAA,WACE,IAAMuB,EAAOj3B,EAAEF,KAAKu1B,iBAGpBv1B,KAAKy2B,kBAAkBU,EAAK9a,KAAKnV,IAAiBlH,KAAKw2B,YACvD,IAAIE,EAAU12B,KAAK03B,cACI,mBAAZhB,IACTA,EAAUA,EAAQ7zB,KAAK7C,KAAKc,UAE9Bd,KAAKy2B,kBAAkBU,EAAK9a,KAAKnV,IAAmBwvB,GAEpDS,EAAKjxB,YAAed,GAApB,IAAsCA,OAKxCsyB,YAAA,WACE,OAAO13B,KAAKc,QAAQE,aAAa,iBAC/BhB,KAAKuC,OAAOm0B,WAGhBH,eAAA,WACE,IAAMY,EAAOj3B,EAAEF,KAAKu1B,iBACd6B,EAAWD,EAAKhmB,KAAK,SAASjO,MAAMmwB,IACzB,OAAb+D,GAAuC,EAAlBA,EAAS1rB,QAChCyrB,EAAKjxB,YAAYkxB,EAASC,KAAK,QAM5B9wB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAClBoF,EAA4B,iBAAX1H,EAAsBA,EAAS,KAEtD,IAAKmE,IAAQ,eAAerD,KAAKd,MAI5BmE,IACHA,EAAO,IAAI+wB,EAAQz3B,KAAMiK,GACzB/J,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGH,iBAAXnE,GAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDA3FT,MAxDwB,wCA4DxB,OAAOyF,gCAIP,OAAOpD,oCAIP,OAAOC,iCAIP,OAAOG,qCAIP,OAAOF,uCAIP,OAAOyD,UA5BWgsB,IA2GtBr0B,EAAE6D,GAAGa,IAAQ6yB,GAAQlxB,iBACrBrG,EAAE6D,GAAGa,IAAMmC,YAAc0wB,GACzBv3B,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACN0yB,GAAQlxB,kBCrKjB,IAAM3B,GAAO,cAEPC,GAAW,iBACXE,GAAqB7E,EAAE6D,GAAGa,IAI1BI,GACI,SAIJI,GAEE,UAFFA,GAGM,WAGN8B,GACU,0BADVA,GAEW,eAsBXywB,cACJ,SAAAA,EAAY72B,EAASyB,GACnBvC,KAAKsF,SAAWxE,EAChBd,KAAKiK,QAAU1H,EAEXrC,EAAEY,GAASyD,GAAG,MAChBvE,KAAK43B,OAAS13B,EAAEY,GAEhBd,KAAK43B,OAAS13B,EAAEY,GAASub,KAAK,MAAMiM,QAEtCtoB,KAAK63B,YACL73B,KAAK83B,iBAAmB93B,KAAK43B,OAAOvb,KAAKnV,IACzClH,KAAK+3B,iBACL/3B,KAAKg4B,wCAaPH,UAAA,WACE,IAAII,EAAYj4B,KAAKiK,QAEI,oBAAdguB,IACTA,EAhDmB,QAoDrBj4B,KAAK43B,OAAOhB,OAjDd,iKAiDkCqB,EAjDlC,mGAoDAD,WAAA,WACE,IAAME,EAAkBl4B,KAAK83B,iBAGvBK,EAAWn4B,KAAK43B,OAAOvb,KAAKnV,IAAwBoe,WAGtD8S,EAAmBl4B,IAGnBooB,GAAQ,EAqBZ,GAlBAtoB,KAAK83B,iBAAiBtxB,KAAK,SAAU4I,GACnC,IAAMipB,EAAOn4B,EAAEF,MAGHq4B,EAAK/S,WAET/N,MAAQ4gB,EAAS5gB,MAEvB6gB,EAAmBA,EAAiB1wB,IAAI2wB,GAGpC/P,IACF8P,EAAmBA,EAAiB1wB,IAAIwwB,EAAgBI,GAAGlpB,EAAI,IAC/DkZ,GAAQ,MAKV8P,EAAiB1sB,OAAQ,CAE3B,IAAM6sB,EAASH,EAAiBI,QAgBhC,GAbAJ,EAAiBlqB,SAAS9I,IAC1BgzB,EAAiB/b,KAAK,aAAalL,KAAK,YAAa,GAGrDnR,KAAK43B,OAAOvb,KAAK,sBAAsBua,OAAO2B,GAG9Cv4B,KAAK43B,OAAOvb,KAAK,iBAAiBnO,SAAS,qBAG3ClO,KAAK43B,OAAOvb,KAAK,gBAAgB9a,IAAI,WAAY,WAG7CvB,KAAK43B,OAAOvb,KAAK,iBAAiBiJ,WAAW/N,MAAQ4gB,EAAS5gB,IAAK,CACrE,IAAMkhB,EAAQv4B,EAAEF,KAAKsF,UAAU+W,KAAjB,IAA0BjX,IAAkBkjB,QAAQtd,OAC5D0tB,EAAiBD,EAAMD,QAE7BC,EAAMvqB,SAAS9I,IACfqzB,EAAMpc,KAAK,aAAalL,KAAK,YAAa,GAE1CnR,KAAK43B,OAAOvb,KAAK,sBAAsBsc,QAAQD,IAKnD14B,KAAK43B,OAAOvb,KAAK,iBAAiBlL,KAAK,eAAe,MAGxDynB,UAAA,WACE54B,KAAK43B,OAAOvb,KAAK,sBAAsBsa,QACvC32B,KAAK43B,OAAOvb,KAAK,iBAAiBnW,YAAY,qBAC9ClG,KAAK83B,iBAAiB5xB,YAAYd,IAClCpF,KAAK83B,iBAAiBzb,KAAK,aAAalL,KAAK,WAAY,MAG3D4mB,eAAA,WAAiB,IAAAh4B,EAAAC,KACfE,EAAEsK,QAAQ1D,GAAG9B,GAAc,WACzBjF,EAAK63B,OAAO1pB,SAAS9I,IAErB/E,WAAW,WACTN,EAAK64B,YACL74B,EAAKi4B,aACLj4B,EAAK63B,OAAO1xB,YAAYd,KAzJR,OA6JpBpF,KAAK43B,OAAOvb,KAAK,kCAAkCvV,GAAG,QAAS,SAAC+F,GA5J/C,IA6JXA,EAAEE,OACJ7M,EAAE2M,EAAEvI,QAAQu0B,SAAS,eAOpBtyB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAOxB,GALK6B,IACHA,EAAO,IAAIixB,EAAY33B,KAAMuC,GAC7BrC,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGH,oBAAXnE,GAA0BA,GACb,iBAAXA,EACT,MAAM,IAAIwM,UAAU,qFAxH1B,MA5DY,iBAiMhB7O,EAAE6D,GAAGa,IAAoB+yB,GAAYpxB,iBACrCrG,EAAE6D,GAAGa,IAAMmC,YAAc4wB,GACzBz3B,EAAE6D,GAAGa,IAAMoC,WAAc,WAEvB,OADA9G,EAAE6D,GAAGa,IAAQG,GACN4yB,GAAYpxB,kBCtMrB,IAAM3B,GAAqB,WAErBC,GAAqB,cACrBC,GAAS,IAAgBD,GAEzBE,GAAqB7E,EAAE6D,GAAGa,IAK1BoD,GAAU,CACdkY,OAAS,GACT4Y,OAAS,OACTx0B,OAAS,IAGLU,GAAQ,CACZ+zB,OAAM,SAAmBj0B,GACzBk0B,aAAY,QAAYl0B,GACxBsE,cAAa,OAAUtE,GAfE,aAkBrBM,GAAY,CAChB6zB,WAAgB,eAGZ/xB,GAAW,CACf+xB,WAAa,6BAUTC,cACJ,SAAAA,EAAYp4B,GACVd,KAAKsF,SAAiBxE,EACtBd,KAAKm5B,eAAiB3uB,OAEtBtK,EAAEsK,QAAQ1D,GAAG9B,GAAM+zB,OAAQ74B,EAAEk5B,MAAMp5B,KAAKq5B,SAAUr5B,OAClDE,EAAEgH,GAAS+xB,YAAYnyB,GAAG9B,GAAMg0B,aAAc94B,EAAEk5B,MAAMp5B,KAAKs5B,WAAYt5B,OACvEE,EAAEF,KAAKsF,UAAU4I,SAAS,YAC1BlO,KAAKq5B,sCAiBPxzB,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAC5B3E,EAAEF,KAAKm5B,gBAAgBvtB,IAAI9G,IAE3B9E,KAAKsF,SAAiB,KACtBtF,KAAKm5B,eAAiB,QAMxBE,SAAA,WACMn5B,EAAEF,KAAKm5B,gBAAgB1hB,YAAc8hB,OAAOr5B,EAAEF,KAAKm5B,gBAAgBjjB,UACrEhW,EAAEgH,GAAS+xB,YAAYtoB,OAEvBzQ,EAAEgH,GAAS+xB,YAAYvoB,UAI3B8oB,OAAA,WACEt5B,EAAEF,KAAKqQ,WAAWF,OAAOjJ,GAASuyB,QAAQvzB,YAAYd,GAAUq0B,WAGlEH,WAAA,WAC2B,mBAAdp5B,EAAE6tB,QACX7tB,EAAE,cAAc6tB,QAAQ,CACtBtW,UAAW,GAjFQ,KAoFrBvX,EAAE,cAAcuX,UAAU,MAMvBlR,iBAAP,WACE,OAAOvG,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IACnB6B,IACHA,EAAO,IAAIwyB,EAASl5B,MACpBE,EAAEF,MAAM0G,KAAK7B,GAAU6B,+CAlD3B,MAnDuB,wCAuDvB,OAAOsB,YA2DX9H,EAAEsK,QAAQ1D,GAAG9B,GAAMoE,cAAe,WAEhC,IADA,IAAMswB,EAAYx5B,EAAEy5B,UAAUz5B,EAAEgH,GAAS+xB,aAChC7pB,EAAIsqB,EAAUhuB,OAAQ0D,KAAM,CACnC,IAAMwqB,EAAY15B,EAAEw5B,EAAUtqB,IAC9B8pB,GAAS3yB,iBAAiB1D,KAAK+2B,EAAWA,EAAUlzB,WAWxDxG,EAAE6D,GAAGa,IAAoBs0B,GAAS3yB,iBAClCrG,EAAE6D,GAAGa,IAAMmC,YAAcmyB,GACzBh5B,EAAE6D,GAAGa,IAAMoC,WAAc,WAEvB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNm0B,GAAS3yB,kBCrIlB,IAAM3B,GAAqB,YAErBC,GAAqB,eACrBC,GAAS,IAAgBD,GAEzBE,GAAqB7E,EAAE6D,GAAGa,IAE1BoD,GAAU,CACdkY,OAAS,GACT4Y,OAAS,OACTx0B,OAAS,IAGLiE,GAAc,CAClB2X,OAAS,SACT4Y,OAAS,SACTx0B,OAAS,oBAGLU,GAAQ,CACZ60B,SAAQ,WAAmB/0B,GAC3Bi0B,OAAM,SAAmBj0B,GACzBsE,cAAa,OAAUtE,GAlBE,aAqBrBM,GACY,gBADZA,GAGY,SAGZ8B,GACc,sBADdA,GAGc,oBAHdA,GAIc,YAJdA,GAKc,YALdA,GAMc,mBANdA,GAOc,YAPdA,GAQc,iBARdA,GASc,mBAGd4yB,GACO,SADPA,GAEO,WASPC,cACJ,SAAAA,EAAYj5B,EAASyB,GAAQ,IAAAxC,EAAAC,KAC3BA,KAAKsF,SAAiBxE,EACtBd,KAAKm5B,eAAqC,SAApBr4B,EAAQgM,QAAqBtC,OAAS1J,EAC5Dd,KAAKiK,QAAiBjK,KAAKkK,WAAW3H,GACtCvC,KAAKqQ,UAAoBrQ,KAAKiK,QAAQ3F,OAAhB,IAA0B4C,GAA1B,IACGlH,KAAKiK,QAAQ3F,OADhB,IAC0B4C,GAD1B,IAEGlH,KAAKiK,QAAQ3F,OAFhB,IAE0B4C,GAChDlH,KAAKg6B,SAAiB,GACtBh6B,KAAKi6B,SAAiB,GACtBj6B,KAAKk6B,cAAiB,KACtBl6B,KAAKm6B,cAAiB,EAEtBj6B,EAAEF,KAAKm5B,gBAAgBryB,GAAG9B,GAAM+zB,OAAQ,SAAC90B,GAAD,OAAWlE,EAAKs5B,SAASp1B,KAEjEjE,KAAKo6B,UACLp6B,KAAKq5B,sCAePe,QAAA,WAAU,IAAAnuB,EAAAjM,KACFq6B,EAAar6B,KAAKm5B,iBAAmBn5B,KAAKm5B,eAAe3uB,OAC3DsvB,GAAsBA,GAEpBQ,EAAuC,SAAxBt6B,KAAKiK,QAAQ6uB,OAC9BuB,EAAar6B,KAAKiK,QAAQ6uB,OAExByB,EAAaD,IAAiBR,GAChC95B,KAAKw6B,gBAAkB,EAE3Bx6B,KAAKg6B,SAAW,GAChBh6B,KAAKi6B,SAAW,GAEhBj6B,KAAKm6B,cAAgBn6B,KAAKy6B,mBAEV,GAAGztB,MAAMnK,KAAKlC,SAASiM,iBAAiB5M,KAAKqQ,YAG1DkK,IAAI,SAACzZ,GACJ,IAAIwD,EACEo2B,EAAiBt6B,EAAKS,uBAAuBC,GAMnD,GAJI45B,IACFp2B,EAAS3D,SAASQ,cAAcu5B,IAG9Bp2B,EAAQ,CACV,IAAMq2B,EAAYr2B,EAAOgN,wBACzB,GAAIqpB,EAAUxkB,OAASwkB,EAAUzkB,OAE/B,MAAO,CACLhW,EAAEoE,GAAQg2B,KAAgB/iB,IAAMgjB,EAChCG,GAIN,OAAO,OAERvqB,OAAO,SAACyqB,GAAD,OAAUA,IACjBlgB,KAAK,SAACC,EAAGC,GAAJ,OAAUD,EAAE,GAAKC,EAAE,KACxBmC,QAAQ,SAAC6d,GACR3uB,EAAK+tB,SAAS1pB,KAAKsqB,EAAK,IACxB3uB,EAAKguB,SAAS3pB,KAAKsqB,EAAK,SAI9B/0B,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAC5B3E,EAAEF,KAAKm5B,gBAAgBvtB,IAAI9G,IAE3B9E,KAAKsF,SAAiB,KACtBtF,KAAKm5B,eAAiB,KACtBn5B,KAAKiK,QAAiB,KACtBjK,KAAKqQ,UAAiB,KACtBrQ,KAAKg6B,SAAiB,KACtBh6B,KAAKi6B,SAAiB,KACtBj6B,KAAKk6B,cAAiB,KACtBl6B,KAAKm6B,cAAiB,QAKxBjwB,WAAA,SAAW3H,GAMT,GAA6B,iBAL7BA,EAAMsJ,EAAA,GACD7D,GACkB,iBAAXzF,GAAuBA,EAASA,EAAS,KAGnC+B,OAAqB,CACrC,IAAIyL,EAAK7P,EAAEqC,EAAO+B,QAAQ6M,KAAK,MAC1BpB,IACHA,EAAK3P,EAAKG,OAAOqE,IACjB1E,EAAEqC,EAAO+B,QAAQ6M,KAAK,KAAMpB,IAE9BxN,EAAO+B,OAAP,IAAoByL,EAKtB,OAFA3P,EAAKiC,gBAAgBuC,GAAMrC,EAAQgG,IAE5BhG,KAGTi4B,cAAA,WACE,OAAOx6B,KAAKm5B,iBAAmB3uB,OAC3BxK,KAAKm5B,eAAe0B,YAAc76B,KAAKm5B,eAAe1hB,aAG5DgjB,iBAAA,WACE,OAAOz6B,KAAKm5B,eAAe2B,cAAgBr6B,KAAKuV,IAC9CrV,SAAS0S,KAAKynB,aACdn6B,SAAS8C,gBAAgBq3B,iBAI7BC,iBAAA,WACE,OAAO/6B,KAAKm5B,iBAAmB3uB,OAC3BA,OAAOmP,YAAc3Z,KAAKm5B,eAAe7nB,wBAAwB4E,UAGvEmjB,SAAA,WACE,IAAM5hB,EAAezX,KAAKw6B,gBAAkBx6B,KAAKiK,QAAQiW,OACnD4a,EAAe96B,KAAKy6B,mBACpBO,EAAeh7B,KAAKiK,QAAQiW,OAChC4a,EACA96B,KAAK+6B,mBAMP,GAJI/6B,KAAKm6B,gBAAkBW,GACzB96B,KAAKo6B,UAGUY,GAAbvjB,EAAJ,CACE,IAAMnT,EAAStE,KAAKi6B,SAASj6B,KAAKi6B,SAASvuB,OAAS,GAEhD1L,KAAKk6B,gBAAkB51B,GACzBtE,KAAKi7B,UAAU32B,OAJnB,CASA,GAAItE,KAAKk6B,eAAiBziB,EAAYzX,KAAKg6B,SAAS,IAAyB,EAAnBh6B,KAAKg6B,SAAS,GAGtE,OAFAh6B,KAAKk6B,cAAgB,UACrBl6B,KAAKw5B,SAKP,IADA,IACSpqB,EADYpP,KAAKg6B,SAAStuB,OACR0D,KAAM,CACRpP,KAAKk6B,gBAAkBl6B,KAAKi6B,SAAS7qB,IACxDqI,GAAazX,KAAKg6B,SAAS5qB,KACM,oBAAzBpP,KAAKg6B,SAAS5qB,EAAI,IACtBqI,EAAYzX,KAAKg6B,SAAS5qB,EAAI,KAGpCpP,KAAKi7B,UAAUj7B,KAAKi6B,SAAS7qB,SAKnC6rB,UAAA,SAAU32B,GACRtE,KAAKk6B,cAAgB51B,EAErBtE,KAAKw5B,SAEL,IAAM0B,EAAUl7B,KAAKqQ,UAClBzO,MAAM,KACN2Y,IAAI,SAACxZ,GAAD,OAAiBA,EAAjB,iBAA0CuD,EAA1C,MAAsDvD,EAAtD,UAAwEuD,EAAxE,OAED62B,EAAQj7B,EAAE,GAAG8M,MAAMnK,KAAKlC,SAASiM,iBAAiBsuB,EAAQ7D,KAAK,QAEjE8D,EAAMh1B,SAASf,KACjB+1B,EAAMn1B,QAAQkB,IAAmBmV,KAAKnV,IAA0BgH,SAAS9I,IACzE+1B,EAAMjtB,SAAS9I,MAGf+1B,EAAMjtB,SAAS9I,IAGf+1B,EAAMhQ,QAAQjkB,IAAyB8D,KAAQ9D,GAA/C,KAAsEA,IAAuBgH,SAAS9I,IAEtG+1B,EAAMhQ,QAAQjkB,IAAyB8D,KAAK9D,IAAoB+G,SAAS/G,IAAoBgH,SAAS9I,KAGxGlF,EAAEF,KAAKm5B,gBAAgBp3B,QAAQiD,GAAM60B,SAAU,CAC7CrsB,cAAelJ,OAInBk1B,OAAA,WACE,GAAGxsB,MAAMnK,KAAKlC,SAASiM,iBAAiB5M,KAAKqQ,YAC1CF,OAAO,SAACkE,GAAD,OAAUA,EAAK7M,UAAUI,SAASxC,MACzC2X,QAAQ,SAAC1I,GAAD,OAAUA,EAAK7M,UAAUlB,OAAOlB,SAKtCmB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAIE,EAAOxG,EAAEF,MAAM0G,KAAK7B,IAQxB,GALK6B,IACHA,EAAO,IAAIqzB,EAAU/5B,KAHW,iBAAXuC,GAAuBA,GAI5CrC,EAAEF,MAAM0G,KAAK7B,GAAU6B,IAGH,iBAAXnE,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDAtMT,MA3EuB,wCA+EvB,OAAOyF,YA8MX9H,EAAEsK,QAAQ1D,GAAG9B,GAAMoE,cAAe,WAIhC,IAHA,IAAMgyB,EAAa,GAAGpuB,MAAMnK,KAAKlC,SAASiM,iBAAiB1F,KAGlDkI,EAFgBgsB,EAAW1vB,OAEL0D,KAAM,CACnC,IAAMisB,EAAOn7B,EAAEk7B,EAAWhsB,IAC1B2qB,GAAUxzB,iBAAiB1D,KAAKw4B,EAAMA,EAAK30B,WAU/CxG,EAAE6D,GAAGa,IAAQm1B,GAAUxzB,iBACvBrG,EAAE6D,GAAGa,IAAMmC,YAAcgzB,GACzB75B,EAAE6D,GAAGa,IAAMoC,WAAa,WAEtB,OADA9G,EAAE6D,GAAGa,IAAQG,GACNg1B,GAAUxzB,kBClTnB,IAAM3B,GAAqB,MAErBC,GAAqB,SACrBC,GAAS,IAAgBD,GACzBoC,GAAqB,YACrBlC,GAAqB7E,EAAE6D,GAAF,IAMrB+iB,GAA2B,IAAI1jB,OAAUk4B,eAGzCt2B,GAAQ,CACZyK,KAAI,OAAoB3K,GACxB4K,OAAM,SAAoB5K,GAC1ByK,KAAI,OAAoBzK,GACxB0K,MAAK,QAAoB1K,GACzBK,eAAc,QAAWL,GAAYmC,GACrCggB,iBAAgB,UAAaniB,GAAYmC,IAGrC7B,GACY,gBADZA,GAEY,SAFZA,GAGY,WAHZA,GAIY,OAJZA,GAKY,OAGZ8B,GACoB,YADpBA,GAEoB,oBAFpBA,GAGoB,UAHpBA,GAIoB,iBAJpBA,GAKoB,kEALpBA,GAMoB,mBANpBA,GAOoB,2BASpBq0B,cACJ,SAAAA,EAAYz6B,GACVd,KAAKsF,SAAWxE,EAChBd,KAAK4nB,+CAWPjX,KAAA,WAAO,IAAA5Q,EAAAC,KACL,KAAIA,KAAKsF,SAASzB,YACd7D,KAAKsF,SAASzB,WAAWzB,WAAauS,KAAKyY,cAC3CltB,EAAEF,KAAKsF,UAAUa,SAASf,KAC1BlF,EAAEF,KAAKsF,UAAUa,SAASf,KAH9B,CAOA,IAAId,EACAk3B,EACEC,EAAcv7B,EAAEF,KAAKsF,UAAUU,QAAQkB,IAAyB,GAChEnG,EAAWX,EAAKS,uBAAuBb,KAAKsF,UAElD,GAAIm2B,EAAa,CACf,IAAMC,EAAwC,OAAzBD,EAAYvoB,UAA8C,OAAzBuoB,EAAYvoB,SAAoBhM,GAAqBA,GAE3Gs0B,GADAA,EAAWt7B,EAAEy5B,UAAUz5B,EAAEu7B,GAAapf,KAAKqf,KACvBF,EAAS9vB,OAAS,GAGxC,IAAM6c,EAAYroB,EAAE8E,MAAMA,GAAMyK,KAAM,CACpCjC,cAAexN,KAAKsF,WAGhB2iB,EAAY/nB,EAAE8E,MAAMA,GAAMuK,KAAM,CACpC/B,cAAeguB,IASjB,GANIA,GACFt7B,EAAEs7B,GAAUz5B,QAAQwmB,GAGtBroB,EAAEF,KAAKsF,UAAUvD,QAAQkmB,IAErBA,EAAUtiB,uBACV4iB,EAAU5iB,qBADd,CAKI5E,IACFuD,EAAS3D,SAASQ,cAAcJ,IAGlCf,KAAKi7B,UACHj7B,KAAKsF,SACLm2B,GAGF,IAAMrF,EAAW,WACf,IAAMuF,EAAcz7B,EAAE8E,MAAMA,GAAM0K,OAAQ,CACxClC,cAAezN,EAAKuF,WAGhBioB,EAAartB,EAAE8E,MAAMA,GAAMwK,MAAO,CACtChC,cAAeguB,IAGjBt7B,EAAEs7B,GAAUz5B,QAAQ45B,GACpBz7B,EAAEH,EAAKuF,UAAUvD,QAAQwrB,IAGvBjpB,EACFtE,KAAKi7B,UAAU32B,EAAQA,EAAOT,WAAYuyB,GAE1CA,SAIJvwB,QAAA,WACE3F,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAC5B7E,KAAKsF,SAAW,QAKlB21B,UAAA,SAAUn6B,EAAS6yB,EAAWvV,GAAU,IAAAnS,EAAAjM,KAKhC47B,IAJiBjI,GAAqC,OAAvBA,EAAUzgB,UAA4C,OAAvBygB,EAAUzgB,SAE1EhT,EAAEyzB,GAAW1lB,SAAS/G,IADtBhH,EAAEyzB,GAAWtX,KAAKnV,KAGQ,GACxBsK,EAAkB4M,GAAawd,GAAU17B,EAAE07B,GAAQz1B,SAASf,IAC5DgxB,EAAW,WAAA,OAAMnqB,EAAK4vB,oBAC1B/6B,EACA86B,EACAxd,IAcF,GAVAle,EAAEyzB,GAAWtX,KAAK,mCAAmClL,KAAK,CACxD2qB,SAAW,KACXC,iBAAkB,IAEpB77B,EAAEyzB,GAAWtX,KAAK,aAAalL,KAAK,CAClCkZ,eAAgB,EAChByR,SAAW,OAITF,GAAUpqB,EAAiB,CAC7B,IAAMlQ,EAAqBlB,EAAKiB,iCAAiCu6B,GAEjE17B,EAAE07B,GACC11B,YAAYd,IACZjF,IAAIC,EAAKR,eAAgBw2B,GACzBpyB,qBAAqB1C,QAExB80B,OAIJyF,oBAAA,SAAoB/6B,EAAS86B,EAAQxd,GACnC,GAAIwd,EAAQ,CACV17B,EAAE07B,GAAQ11B,YAAYd,IAEtB,IAAM42B,EAAgB97B,EAAE07B,EAAO/3B,YAAYwY,KACzCnV,IACA,GAEE80B,GACF97B,EAAE87B,GAAe91B,YAAYd,IAGK,QAAhCw2B,EAAO56B,aAAa,SACtB46B,EAAOj0B,aAAa,iBAAiB,GAyBzC,GArBAzH,EAAEY,GAASoN,SAAS9I,IACiB,QAAjCtE,EAAQE,aAAa,SACvBF,EAAQ6G,aAAa,iBAAiB,GAGxCzH,EAAEY,GAASqP,OAAO,0CAA0CgB,KAAK,CAC/D2qB,SAAW,IACXC,iBAAkB,IAEpB77B,EAAEY,GAASqP,OAAO,oBAAoBgB,KAAK,CACzCkZ,eAAgB,EAChByR,SAAW,MAIb17B,EAAKyB,OAAOf,GAERA,EAAQ0G,UAAUI,SAASxC,KAC7BtE,EAAQ0G,UAAUE,IAAItC,IAGpBtE,EAAQ+C,YAAc3D,EAAEY,EAAQ+C,YAAYsC,SAASf,IAA0B,CACjF,IAAM62B,EAAkB/7B,EAAEY,GAASkF,QAAQkB,IAAmB,GAE9D,GAAI+0B,EAAiB,CACnB,IAAMC,EAAqB,GAAGlvB,MAAMnK,KAAKo5B,EAAgBrvB,iBAAiB1F,KAE1EhH,EAAEg8B,GAAoBhuB,SAAS9I,IAGjCtE,EAAQ6G,aAAa,iBAAiB,GAGpCyW,GACFA,OAKJwJ,kBAAA,WACE,IAAMmI,EAAO7vB,EAAEF,KAAKsF,UACd0qB,EAAY9vB,EAAE6vB,EAAK5e,KAAK,SACxBgrB,EAAWpM,EAAK/pB,QAAQkB,IACxBk1B,EAAQrM,EAAK5e,KAAK,OAAS/Q,EAAKG,OAAOqE,IAE7CmrB,EAAK5e,KAAK,KAAMirB,GAEZpM,IACFD,EAAK5e,KAAK,OAAQ,OAClBgrB,EAAShrB,KAAK,OAAQ,YAIpB4e,EAAK5pB,SAASf,KAChB2qB,EAAK5e,KAAK,CACR2qB,SAAW,IACXC,gBAAkB,SAGhBhM,EAAK5e,KAAK,SACZ4e,EAAK5e,KAAK,gBAAiB4e,EAAK5e,KAAK,QAAQkrB,OAAO,IAGtDrM,EAAU7e,KAAK,CACb0Z,KAAO,WACPiR,SAAW,IACXzR,cAAgB,QAChB+E,kBAAmBgN,MAGrBrM,EAAK5e,KAAK,CACR2qB,SAAW,KACXC,gBAAkB,UAGhBhM,EAAK5e,KAAK,SACZ4e,EAAK5e,KAAK,gBAAiB4e,EAAK5e,KAAK,QAAQkrB,OAAO,IAGtDrM,EAAU7e,KAAK,CACb0Z,KAAO,WACPiR,SAAW,KACXzR,cAAgB,OAChB+E,kBAAmBgN,QASlBjT,uBAAP,SAA8Btc,GAC5B,IACMyvB,EADQp8B,EAAEF,MACIgG,QAAQ,qBAAqBqW,KAAK,sBAChDkgB,EAAI1vB,EAAEE,OAASF,EAAE2vB,QAEnBjxB,EAAQ,EAEZA,EAAQ+wB,EAAM/wB,MAAM+wB,EAAMnsB,OAAO,WAvRT,KAyRpBosB,GA1RoB,KA0RMA,GAC5BhxB,IAzRsB,KA2RpBgxB,GA1RoB,KA0RSA,GAC/BhxB,IAGEA,EAAQ,IACVA,EAAQ+wB,EAAM5wB,OAAS,GAErBH,IAAU+wB,EAAM5wB,SAClBH,EAAQ,GAEV,IAAMkxB,EAAUH,EAAMhE,GAAG/sB,GAEI,QAAzBkxB,EAAQtrB,KAAK,SACfsrB,EAAQC,IAAI,QAAQ36B,QAAQ,SAG9B8K,EAAEhG,iBACFgG,EAAE4b,qBAIGliB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAMqL,EAAQ3R,EAAEF,MACZ0G,EAAOmL,EAAMnL,KAAK7B,IAQtB,GANK6B,IACHA,EAAO,IAAI60B,EAAIv7B,MACf6R,EAAMnL,KAAK7B,GAAU6B,KAInB,OAAOrD,KAAKd,IAKM,iBAAXA,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAERmE,EAAKnE,iDArRT,MAvDuB,iBAwV3BrC,EAAES,UACCmG,GAAG9B,GAAMG,eAAgB+B,GAAsB,SAAUjD,GACxDA,EAAM4C,iBACN00B,GAAIh1B,iBAAiB1D,KAAK3C,EAAEF,MAAO,UAGpC8G,GAAG9B,GAAMiiB,iBAAkB/f,GAAsB,SAAUjD,GACrD6iB,GAAezjB,KAAKY,EAAM8I,SAG/B9I,EAAM4C,iBACN00B,GAAIpS,uBAAuBtmB,KAAK3C,EAAEF,MAAOiE,MAE1C6C,GAAG,mBAAoB,WACtBy0B,GAAIh1B,iBAAiB1D,KAAK3C,EAAEgH,IAAuB,UASvDhH,EAAE6D,GAAF,IAAaw3B,GAAIh1B,iBACjBrG,EAAE6D,GAAF,IAAWgD,YAAcw0B,GACzBr7B,EAAE6D,GAAF,IAAWiD,WAAa,WAEtB,OADA9G,EAAE6D,GAAF,IAAagB,GACNw2B,GAAIh1B,kBCpXb,IAAM3B,GAAqB,QAErBC,GAAqB,WACrBC,GAAS,IAAgBD,GACzBE,GAAqB7E,EAAE6D,GAAGa,IAE1BI,GAAQ,CACZgnB,cAAa,gBAAmBlnB,GAChC2K,KAAI,OAAmB3K,GACvB4K,OAAM,SAAmB5K,GACzByK,KAAI,OAAmBzK,GACvB0K,MAAK,QAAmB1K,IAGpBM,GACM,OADNA,GAEM,OAFNA,GAGM,OAHNA,GAIM,UAGNmD,GAAc,CAClBgrB,UAAY,UACZoJ,SAAY,UACZjJ,MAAY,UAGR1rB,GAAU,CACdurB,WAAY,EACZoJ,UAAY,EACZjJ,MAAY,KAGRxsB,GACW,yBASX01B,cACJ,SAAAA,EAAY97B,EAASyB,GACnBvC,KAAKsF,SAAWxE,EAChBd,KAAKiK,QAAWjK,KAAKkK,WAAW3H,GAChCvC,KAAKy0B,SAAW,KAChBz0B,KAAK60B,2CAmBPlkB,KAAA,WAAO,IAAA5Q,EAAAC,KACLE,EAAEF,KAAKsF,UAAUvD,QAAQiD,GAAMuK,MAE3BvP,KAAKiK,QAAQspB,WACfvzB,KAAKsF,SAASkC,UAAUE,IAAItC,IAG9B,IAAMgxB,EAAW,WACfr2B,EAAKuF,SAASkC,UAAUlB,OAAOlB,IAC/BrF,EAAKuF,SAASkC,UAAUE,IAAItC,IAE5BlF,EAAEH,EAAKuF,UAAUvD,QAAQiD,GAAMwK,OAE3BzP,EAAKkK,QAAQ0yB,UACf58B,EAAK2Q,QAMT,GAFA1Q,KAAKsF,SAASkC,UAAUlB,OAAOlB,IAC/BpF,KAAKsF,SAASkC,UAAUE,IAAItC,IACxBpF,KAAKiK,QAAQspB,UAAW,CAC1B,IAAMjyB,EAAqBlB,EAAKiB,iCAAiCrB,KAAKsF,UAEtEpF,EAAEF,KAAKsF,UACJnF,IAAIC,EAAKR,eAAgBw2B,GACzBpyB,qBAAqB1C,QAExB80B,OAIJ1lB,KAAA,SAAKmsB,GAAgB,IAAA5wB,EAAAjM,KACdA,KAAKsF,SAASkC,UAAUI,SAASxC,MAItClF,EAAEF,KAAKsF,UAAUvD,QAAQiD,GAAMyK,MAE3BotB,EACF78B,KAAK88B,SAEL98B,KAAKy0B,SAAWp0B,WAAW,WACzB4L,EAAK6wB,UACJ98B,KAAKiK,QAAQypB,WAIpB7tB,QAAA,WACE8G,aAAa3M,KAAKy0B,UAClBz0B,KAAKy0B,SAAW,KAEZz0B,KAAKsF,SAASkC,UAAUI,SAASxC,KACnCpF,KAAKsF,SAASkC,UAAUlB,OAAOlB,IAGjClF,EAAEF,KAAKsF,UAAUsG,IAAI5G,GAAMgnB,eAE3B9rB,EAAE4F,WAAW9F,KAAKsF,SAAUT,IAC5B7E,KAAKsF,SAAW,KAChBtF,KAAKiK,QAAW,QAKlBC,WAAA,SAAW3H,GAaT,OAZAA,EAAMsJ,EAAA,GACD7D,GACA9H,EAAEF,KAAKsF,UAAUoB,OACC,iBAAXnE,GAAuBA,EAASA,EAAS,IAGrDnC,EAAKiC,gBACHuC,GACArC,EACAvC,KAAK0oB,YAAYngB,aAGZhG,KAGTsyB,cAAA,WAAgB,IAAAzoB,EAAApM,KACdE,EAAEF,KAAKsF,UAAUwB,GACf9B,GAAMgnB,cACN9kB,GACA,WAAA,OAAMkF,EAAKsE,MAAK,QAIpBosB,OAAA,WAAS,IAAAzuB,EAAArO,KACDo2B,EAAW,WACf/nB,EAAK/I,SAASkC,UAAUE,IAAItC,IAC5BlF,EAAEmO,EAAK/I,UAAUvD,QAAQiD,GAAM0K,SAIjC,GADA1P,KAAKsF,SAASkC,UAAUlB,OAAOlB,IAC3BpF,KAAKiK,QAAQspB,UAAW,CAC1B,IAAMjyB,EAAqBlB,EAAKiB,iCAAiCrB,KAAKsF,UAEtEpF,EAAEF,KAAKsF,UACJnF,IAAIC,EAAKR,eAAgBw2B,GACzBpyB,qBAAqB1C,QAExB80B,OAMG7vB,iBAAP,SAAwBhE,GACtB,OAAOvC,KAAKwG,KAAK,WACf,IAAMC,EAAWvG,EAAEF,MACf0G,EAAaD,EAASC,KAAK7B,IAQ/B,GALK6B,IACHA,EAAO,IAAIk2B,EAAM58B,KAHgB,iBAAXuC,GAAuBA,GAI7CkE,EAASC,KAAK7B,GAAU6B,IAGJ,iBAAXnE,EAAqB,CAC9B,GAA4B,oBAAjBmE,EAAKnE,GACd,MAAM,IAAIwM,UAAJ,oBAAkCxM,EAAlC,KAGRmE,EAAKnE,GAAQvC,kDAzIjB,MArDuB,4CAyDvB,OAAOuI,mCAIP,OAAOP,YA6IX9H,EAAE6D,GAAGa,IAAoBg4B,GAAMr2B,iBAC/BrG,EAAE6D,GAAGa,IAAMmC,YAAc61B,GACzB18B,EAAE6D,GAAGa,IAAMoC,WAAc,WAEvB,OADA9G,EAAE6D,GAAGa,IAAQG,GACN63B,GAAMr2B,kBCrMf,WACE,GAAiB,oBAANrG,EACT,MAAM,IAAI6O,UAAU,kGAGtB,IAAMgF,EAAU7T,EAAE6D,GAAG0N,OAAO7P,MAAM,KAAK,GAAGA,MAAM,KAOhD,GAAImS,EAAQ,GALI,GAKYA,EAAQ,GAJnB,GAFA,IAMoCA,EAAQ,IAJ5C,IAI+DA,EAAQ,IAAmBA,EAAQ,GAHlG,GACA,GAEmHA,EAAQ,GAC1I,MAAM,IAAIzQ,MAAM,+EAbpB","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n const input = this._element.querySelector(Selector.INPUT)\n\n if (rootElement) {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n activeElement.classList.remove(ClassName.ACTIVE)\n }\n }\n\n if (input) {\n if (input.checked) {\n this._element.classList.add(ClassName.ACTIVE)\n } else {\n this._element.classList.remove(ClassName.ACTIVE)\n }\n } else {\n this._element.classList.toggle(ClassName.ACTIVE)\n this._element.setAttribute('aria-pressed',\n this._element.classList.contains(ClassName.ACTIVE))\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT > Selector.INPUT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '*:not(.multi) > .show, *:not(.multi) > .collapsing', // boosted mod\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide|init/.test(config)) { // Boosted mod\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n// Boosted mod\n .on('DOMContentLoaded', () => {\n $(Selector.DATA_TOGGLE).each(function () {\n const target = Collapse._getTargetFromElement(this)\n\n Collapse._jQueryInterface.call($(target), 'init')\n })\n })\n// end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.15.0\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\n}\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.right - result.left;\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexport default Popper;\n//# sourceMappingURL=popper.js.map\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n // Boosted mod\n MENU_ITEMS : '.dropdown-menu .dropdown-item',\n FIRST_ITEM_IN_MENU : '.dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)',\n // end mod\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n // Boosted mod\n $(parent).find(Selector.FIRST_ITEM_IN_MENU).first().trigger('focus')\n // end mod\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Boosted mod\n _addAccessibility() {\n $(this._element).attr('aria-haspopup', true)\n // ensure that dropdown-menu have the role menu\n $(this._element).parent().children(Selector.MENU).attr('role', 'menu')\n // ensure that dropdown-itm's have the role menuitem\n $(this._element).parent().children(Selector.MENU).children('.dropdown-item').attr('role', 'menuitem')\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n // Boosted mod\n .on('DOMContentLoaded', () => {\n // Instanciate every dropdown in the DOM\n Dropdown._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-megamenu.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/* eslint no-magic-numbers: [\"error\", { \"ignore\": [1,2] }] */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'megamenu'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.megamenu'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst TIMEOUT = 1000 // Timeout befor focusing first element\nconst PERCENTAGE = 100 // Width slide proportion\nconst SPLITLENGHT = 4\n\nconst ClassName = {\n TRANSITIONING: 'transitioning'\n}\n\nconst Selector = {\n MEGAMENU : '.mega-menu',\n ROOT_NAV : '.mega-menu > .navbar-nav',\n MEGAMENU_PANEL : '.mega-menu-panel',\n MEGAMENU_NAV : '.nav-link + .navbar-nav',\n NAV_MENU : '.navbar-nav',\n NAV_ITEM : '.nav-item',\n NAV_LINK : '.nav-link',\n NAV_LINK_COLLAPSE : '.nav-link[data-toggle=collapse]',\n NAV_LINK_BACK : '.nav-link.back',\n NAV_LINK_EXPANDED : '.nav-link[aria-expanded=true]'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass MegaMenu {\n constructor(element, config) {\n this._element = element\n this._$navLinks = $(this._element).find(Selector.NAV_LINK)\n this._$goForwardLinks = $(this._element).find(Selector.MEGAMENU_NAV).prev(Selector.NAV_LINK)\n this._$goBackLinks = $(this._element).find(Selector.NAV_LINK_BACK)\n this._$topCollapseMenus = $(this._element).find(Selector.MEGAMENU_PANEL)\n this._$navLinkCollapses = $(this._element).find(Selector.NAV_LINK_COLLAPSE)\n this._config = config\n if (typeof this._config.noFocus === 'undefined') {\n this._config.noFocus = false\n }\n this._addEventListeners()\n this._addAriaAttributes(this._element)\n this.goTo = this._initPosition\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _addEventListeners() {\n this._$goForwardLinks.on('click', (event) => this._goForward(event))\n this._$goBackLinks.on('click', (event) => this._goBackward(event))\n this._$navLinks.on('keydown', (event) => this._manageKeyDown(event))\n if (!this._config.noFocus) {\n this._$topCollapseMenus.on('shown.bs.collapse', this._collapseFocus)\n }\n this._$navLinkCollapses.on('click', (event) => this._handleCollapseToggle(event))\n }\n\n _addAriaAttributes(element) {\n const $subNavs = $(element).find('.nav-link + .navbar-nav')\n\n $(element).attr('role', 'application')\n $(element).find('> .navbar-nav').attr('role', 'menu')\n $(element).find(Selector.MEGAMENU_PANEL).attr('role', 'menu')\n $(element).find('.nav-link[data-toggle=collapse]').attr('role', 'menuitem')\n $(element).find(Selector.NAV_LINK_BACK).attr({\n 'aria-hidden': true\n })\n $(element).find(Selector.NAV_ITEM).attr('role', 'presentation')\n\n $subNavs.each(function () {\n const navId = Util.getUID(NAME)\n const $thisNavToggler = $(this).prev(Selector.NAV_LINK)\n const $thisNav = $(this)\n const $thisNavBackLink = $thisNav.find(Selector.NAV_LINK_BACK)\n const $topMenu = $(this).closest(Selector.NAV_MENU).parent().closest(Selector.NAV_MENU).prev(Selector.NAV_LINK)\n let goBackLabel = `go back to ${$topMenu.text()} menu`\n\n if (!$topMenu.length) {\n goBackLabel = `go back to ${$(this).closest(Selector.MEGAMENU_PANEL).prev(Selector.NAV_LINK).text()} menu`\n }\n\n $thisNav.attr({\n id: navId,\n role: 'menu'\n })\n $thisNavToggler.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-expanded': false,\n 'aria-haspopup': true\n })\n $thisNavBackLink.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-label': goBackLabel\n })\n })\n }\n\n _initPosition(target) {\n if (!$(target).length) {\n return\n }\n\n const $target = $(target).first()\n const position = $target.parents().index(this._element)\n const rootPosition = $('.mega-menu-panel .nav-link').first().parents().index($('.mega-menu'))\n const translatePercentage = -(position - rootPosition) * PERCENTAGE / 2\n const $thisNav = $target.closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // open collapse\n if ($target.attr('data-toggle') === 'collapse') {\n $target.siblings(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.siblings(Selector.MEGAMENU_PANEL)).collapse('hide')\n $(this._element).height('auto')\n $rootNav.css('transform', 'translateX(0%)')\n } else {\n $target.closest(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.closest(Selector.MEGAMENU_PANEL)).collapse('hide')\n\n // show menu and hide other\n $target.parents(Selector.NAV_MENU).show()\n\n // set aria on parent links\n $target.parents(Selector.NAV_ITEM).find('> .nav-link').not($target).attr({\n tabindex: -1,\n 'aria-hidden': true,\n 'aria-expanded': true\n })\n\n // translate to pos\n $rootNav.css('transform', `translateX(${translatePercentage}%)`)\n if (translatePercentage) {\n // adapt main collapse height to target height\n $(this._element).height($thisNav.height())\n } else {\n $(this._element).height('auto')\n }\n }\n\n // set focus on target link\n setTimeout(() => {\n if (!this._config.noFocus) {\n // set focus on target link\n $target.trigger('focus')\n }\n\n $rootNav.removeClass(ClassName.TRANSITIONING)\n }, TIMEOUT)\n }\n\n _manageKeyDown(event) {\n const $thisTarget = $(event.target)\n\n // test key code\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n // proceed according to key code\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n this._goBackward(event)\n break\n case ARROW_RIGHT_KEYCODE:\n this._goForward(event)\n break\n case ARROW_UP_KEYCODE:\n // focus prev nav link\n $thisTarget.parent().prev().find('>.nav-link').not(Selector.NAV_LINK_BACK).trigger('focus')\n break\n case ARROW_DOWN_KEYCODE:\n // focus next nav link\n $thisTarget.parent().next().find('>.nav-link').trigger('focus')\n break\n default:\n }\n }\n\n _collapseFocus() {\n $(this).find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n }\n\n _handleCollapseToggle(e) {\n const $this = $(e.target)\n const $thisCollapse = $($this.attr('href'))\n\n this._$topCollapseMenus.not($thisCollapse).collapse('hide')\n }\n\n _goForward(e) {\n e.preventDefault()\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $this.next(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $thisNavToggler = $this\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!$this.next(Selector.NAV_MENU).length || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // hide all nav on same level\n $thisNav.find(Selector.NAV_MENU).hide()\n\n // show target navbar-nav\n $targetNav.show()\n\n // adapt main collapse height to target height\n $(Selector.MEGAMENU).height($targetNav.height())\n\n // make only visible elements focusable\n if (!currentTranslatePercentage) {\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n }\n $thisNav.find(Selector.NAV_LINK).attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage - PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $thisNavToggler.attr('aria-expanded', true)\n $targetNav.find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n _goBackward(e) {\n e.preventDefault()\n\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $thisNav.parent().closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $targetNavToggler = $targetNav.find(Selector.NAV_LINK_EXPANDED)\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!currentTranslatePercentage || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // make only visible elements focusable\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n if (currentTranslatePercentage === -PERCENTAGE) {\n // reset main collapse height\n $(Selector.MEGAMENU).css('height', 'auto')\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n }\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage + PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $targetNavToggler.attr('aria-expanded', false)\n $targetNavToggler.trigger('focus')\n $thisNav.hide()\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n if (!$(this).is(Selector.MEGAMENU)) {\n throw new TypeError('Element is not a mega menu')\n }\n\n if (!config) {\n config = {}\n } else if (config.noFocus && typeof config.noFocus !== 'boolean') {\n // param = true\n throw new TypeError('no-focus parameter must be boolean')\n }\n\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new MegaMenu(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (config.target) {\n if (typeof config.target !== 'string' || !/^[.#].*/.test(config.target)) {\n throw new TypeError(`Selector \"${config.target}\" is not supported`)\n }\n\n data.goTo(config.target)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = MegaMenu._jQueryInterface\n$.fn[NAME].Constructor = MegaMenu\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return MegaMenu._jQueryInterface\n}\n\nexport default MegaMenu\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .position-fixed'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n\n // Boosted mod\n this._addAria()\n // end mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._setEscapeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualRight = element.style.right\n const calculatedRight = $(element).css('right')\n $(element)\n .data('right', actualRight)\n .css('right', `${parseFloat(calculatedRight) + this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const right = $(element).data('right')\n $(element).removeData('right')\n element.style.right = right ? right : ''\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Boosted mod\n _addAria() {\n const $ModalPanel = $(this._element)\n const $ModalTitle = $ModalPanel.find('.modal-title')\n const $ModalDialog = $ModalPanel.find('.modal-dialog')\n\n $ModalPanel.attr({\n role: 'dialog',\n 'aria-modal': true\n })\n\n if ($ModalTitle) {\n const ModalTitleId = $ModalTitle.attr('id')\n if (ModalTitleId) {\n $ModalPanel.attr({\n 'aria-labelledby' : ModalTitleId\n })\n }\n }\n\n if ($ModalDialog) {\n $ModalDialog.attr('role', 'document')\n }\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-navbar.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'navbar'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.navbar'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst BREAKPOINT = 768\n\nconst Default = {\n sticky : false,\n trigger : ''\n}\n\nconst DefaultType = {\n sticky : 'boolean',\n trigger : 'string'\n}\n\nconst Selector = {\n SUPRA_BAR : '.navbar.supra',\n MEGAMENU_PANEL : '.mega-menu.panel'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Navbar {\n constructor(element, config) {\n this._element = element\n this._supraBar = element.querySelector(Selector.SUPRA_BAR)\n this._config = this._getConfig(config)\n this._initialHeight = $(this._element).outerHeight()\n this._initialSupraHeight = $(this._supraBar).outerHeight()\n\n this._addAria()\n\n if (this._config.sticky) {\n $(this._element).addClass('fixed-top')\n $(Selector.MEGAMENU_PANEL).addClass('sticky')\n $(document.body).css('padding-top', this._initialHeight)\n\n $(window).on('scroll', () => {\n const Scroll = $(window).scrollTop()\n if (Scroll > 0) {\n $(this._element).addClass('minimized')\n } else {\n $(this._element).removeClass('minimized')\n }\n })\n }\n\n if (this._config.hideSupra) {\n $(window).on('scroll', () => {\n if ($(window).innerWidth() < BREAKPOINT) {\n return\n }\n\n const Scroll = $(window).scrollTop()\n\n if (Scroll > 0) {\n $(Selector.SUPRA_BAR).hide()\n } else {\n $(Selector.SUPRA_BAR).show()\n }\n })\n }\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // private\n\n _getConfig(config) {\n config = $.extend({}, Default, config)\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _addAria() {\n $(this._element).find('.navbar .nav-link[data-toggle]').attr('aria-haspopup', true)\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Navbar(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Navbar._jQueryInterface\n$.fn[NAME].Constructor = Navbar\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Navbar._jQueryInterface\n}\n\nexport default Navbar\n","/**\n * ------------------------------------------------------------------------------------------------------\n * Boosted (v4.3.1): otab.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * ------------------------------------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'otab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.otab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst DEFAULT_THRESHOLD = 2\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ACTIVE : 'active',\n SHOW : 'show',\n ACCORDION_LAYOUT: 'accordion-layout'\n}\n\nconst Selector = {\n OTAB_HEADING: '.o-tab-heading',\n OTAB_CONTENT: '.o-tab-content'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Otab {\n constructor(element) {\n this._element = element\n this._addAccessibility()\n\n if ($(this._element).parent().find(Selector.OTAB_HEADING).length > DEFAULT_THRESHOLD) {\n $(this._element).parent().addClass(ClassName.ACCORDION_LAYOUT)\n }\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n\n // public\n show() {\n const $element = $(this._element)\n\n if ($element.next().hasClass(ClassName.SHOW)) {\n return\n }\n\n // from parent remove all tab-content show classes\n $element.parent().find(Selector.OTAB_CONTENT).removeClass(ClassName.SHOW)\n // remove all aria-expanded=true\n $element.parent().find('[aria-expanded=\"true\"]').attr('aria-expanded', false)\n // add show class to next tab-content\n $element.next().addClass(ClassName.SHOW)\n // add aria-expanded=true to element\n $element.attr('aria-expanded', true)\n }\n\n // private\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $tab.next()\n\n $tab.attr('id', Util.getUID(NAME))\n $tabpanel.attr('id', Util.getUID(NAME))\n\n $tab.attr({\n 'aria-controls': $tabpanel.attr('id'),\n role: 'tab'\n })\n $tabpanel.attr({\n 'aria-labelledby': $tab.attr('id'),\n role: 'tabpanel',\n tabindex: 0\n })\n\n if ($tabpanel.hasClass(ClassName.SHOW)) {\n $tab.attr('aria-expanded', true)\n } else {\n $tab.attr('aria-expanded', false)\n }\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Otab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on('DOMContentLoaded', () => {\n Otab._jQueryInterface.call($(Selector.OTAB_HEADING), 'init')\n })\n .on(Event.CLICK_DATA_API, Selector.OTAB_HEADING, function (event) {\n event.preventDefault()\n Otab._jQueryInterface.call($(this), ClassName.SHOW)\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Otab._jQueryInterface\n$.fn[NAME].Constructor = Otab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Otab._jQueryInterface\n}\n\nexport default Otab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div></div>',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n // boosted mod fix rtl\n let attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n // boosted mod fix rtl\n const dir = document.getElementsByTagName('html')[0].dir\n if (dir === 'rtl') {\n const hash = {\n right: 'left',\n left: 'right'\n }\n attachment = attachment.replace(/right|left/g, (matched) => hash[matched])\n }\n // end mod\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div></div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-priority-nav.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'prioritynav'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.prioritynav'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst RESIZE_DURATION = 500\nconst TAB_KEYCODE = 9\n\nconst Event = {\n RESIZE: 'resize',\n FOCUS: 'focus'\n}\n\nconst ClassName = {\n PRIORITY: 'priority',\n HIDE: 'sr-only',\n RESIZING: 'resizing'\n}\n\nconst Selector = {\n NAV_ELEMENTS: 'li:not(\\'.overflow-nav\\')',\n FIRST_ELEMENT: 'li:first',\n PRIORITY_ELEMENT: '.priority'\n}\n\nconst MenuLabelDefault = 'More'\n\nfunction MenuTemplate(MenuLabel) {\n return `\n <li class=\"overflow-nav nav-item dropdown\">\n <a href=\"#\" class=\"dropdown-toggle nav-link\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\">${MenuLabel}</a>\n <ul class=\"overflow-nav-list dropdown-menu dropdown-menu-right\"></ul>\n </li>\n`\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass PriorityNav {\n constructor(element, config) {\n this._element = element\n this._config = config\n\n if ($(element).is('ul')) {\n this._$menu = $(element)\n } else {\n this._$menu = $(element).find('ul').first()\n }\n this._initMenu()\n this._$allNavElements = this._$menu.find(Selector.NAV_ELEMENTS)\n this._bindUIActions()\n this._setupMenu()\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _initMenu() {\n let MenuLabel = this._config\n\n if (typeof MenuLabel === 'undefined') {\n MenuLabel = MenuLabelDefault\n }\n\n // add menu template\n this._$menu.append(MenuTemplate(MenuLabel))\n }\n\n _setupMenu() {\n const $allNavElements = this._$allNavElements\n\n // Checking top position of first item (sometimes changes)\n const firstPos = this._$menu.find(Selector.FIRST_ELEMENT).position()\n\n // Empty collection in which to put menu items to move\n let $wrappedElements = $()\n\n // Used to snag the previous menu item in addition to ones that have wrapped\n let first = true\n\n // Loop through all the nav items...\n this._$allNavElements.each(function (i) {\n const $elm = $(this)\n\n // ...in which to find wrapped elements\n const pos = $elm.position()\n\n if (pos.top !== firstPos.top) {\n // If element is wrapped, add it to set\n $wrappedElements = $wrappedElements.add($elm)\n\n // Add the previous one too, if first\n if (first) {\n $wrappedElements = $wrappedElements.add($allNavElements.eq(i - 1))\n first = false\n }\n }\n })\n\n if ($wrappedElements.length) {\n // Clone set before altering\n const newSet = $wrappedElements.clone()\n\n // Hide ones that we're moving\n $wrappedElements.addClass(ClassName.HIDE)\n $wrappedElements.find('.nav-link').attr('tabindex', -1)\n\n // Add wrapped elements to dropdown\n this._$menu.find('.overflow-nav-list').append(newSet)\n\n // Show new menu\n this._$menu.find('.overflow-nav').addClass('show-inline-block')\n\n // Make overflow visible again so dropdown can be seen.\n this._$menu.find('.o-nav-local').css('overflow', 'visible')\n\n // Check if menu doesn't overflow after process\n if (this._$menu.find('.overflow-nav').position().top !== firstPos.top) {\n const $item = $(this._element).find(`.${ClassName.HIDE}`).first().prev()\n const $itemDuplicate = $item.clone()\n\n $item.addClass(ClassName.HIDE)\n $item.find('.nav-link').attr('tabindex', -1)\n\n this._$menu.find('.overflow-nav-list').prepend($itemDuplicate)\n }\n }\n\n // hide menu from AT\n this._$menu.find('.overflow-nav').attr('aria-hidden', true)\n }\n\n _tearDown() {\n this._$menu.find('.overflow-nav-list').empty()\n this._$menu.find('.overflow-nav').removeClass('show-inline-block')\n this._$allNavElements.removeClass(ClassName.HIDE)\n this._$allNavElements.find('.nav-link').attr('tabindex', 0)\n }\n\n _bindUIActions() {\n $(window).on(Event.RESIZE, () => {\n this._$menu.addClass(ClassName.RESIZING)\n\n setTimeout(() => {\n this._tearDown()\n this._setupMenu()\n this._$menu.removeClass(ClassName.RESIZING)\n }, RESIZE_DURATION)\n })\n\n this._$menu.find('.overflow-nav .dropdown-toggle').on('keyup', (e) => {\n if (e.which === TAB_KEYCODE) {\n $(e.target).dropdown('toggle')\n }\n })\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new PriorityNav(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config !== 'undefined' && config) {\n if (typeof config !== 'string') {\n throw new TypeError('Priority nav label type must be string')\n }\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = PriorityNav._jQueryInterface\n$.fn[NAME].Constructor = PriorityNav\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return PriorityNav._jQueryInterface\n}\n\nexport default PriorityNav\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-scroll-up.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollup'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollup'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst SCROLLANIMATE = 500\n\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst Event = {\n SCROLL : `scroll${EVENT_KEY}`,\n CLICK_SCROLL : `click${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLL_TOP : 'o-scroll-up'\n}\n\nconst Selector = {\n SCROLL_TOP : '.o-scroll-up:not(.static)'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollUp {\n constructor(element) {\n this._element = element\n this._scrollElement = window\n\n $(window).on(Event.SCROLL, $.proxy(this._process, this))\n $(Selector.SCROLL_TOP).on(Event.CLICK_SCROLL, $.proxy(this._backToTop, this))\n $(this._element).addClass('is-fixed')\n this._process()\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n\n // public\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n }\n\n\n // private\n\n _process() {\n if ($(this._scrollElement).scrollTop() > Number($(this._scrollElement).height())) {\n $(Selector.SCROLL_TOP).show()\n } else {\n $(Selector.SCROLL_TOP).hide()\n }\n }\n\n _clear() {\n $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)\n }\n\n _backToTop() {\n if (typeof $.animate === 'function') {\n $('html, body').animate({\n scrollTop: 0\n }, SCROLLANIMATE)\n } else {\n $('html, body').scrollTop(0)\n }\n }\n\n // static\n\n static _jQueryInterface() {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n if (!data) {\n data = new ScrollUp(this)\n $(this).data(DATA_KEY, data)\n }\n })\n }\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollUps = $.makeArray($(Selector.SCROLL_TOP))\n for (let i = scrollUps.length; i--;) {\n const $scrollup = $(scrollUps[i])\n ScrollUp._jQueryInterface.call($scrollup, $scrollup.data())\n }\n})\n\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollUp._jQueryInterface\n$.fn[NAME].Constructor = ScrollUp\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollUp._jQueryInterface\n}\n\nexport default ScrollUp\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\n // Handle special case when .nav-link is inside .nav-item\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\n }\n\n $(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n [].slice.call(document.querySelectorAll(this._selector))\n .filter((node) => node.classList.contains(ClassName.ACTIVE))\n .forEach((node) => node.classList.remove(ClassName.ACTIVE))\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new ScrollSpy(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\n const scrollSpysLength = scrollSpys.length\n\n for (let i = scrollSpysLength; i--;) {\n const $spy = $(scrollSpys[i])\n ScrollSpy._jQueryInterface.call($spy, $spy.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n// boosted mod\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_LEFT_KEYCODE}|${ARROW_UP_KEYCODE}|${ARROW_RIGHT_KEYCODE}|${ARROW_DOWN_KEYCODE}`)\n// end mod\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}` // boosted mod\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active',\n DISABLED : 'disabled',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DROPDOWN : '.dropdown',\n NAV_LIST_GROUP : '.nav, .list-group',\n ACTIVE : '.active',\n ACTIVE_UL : '> li > .active',\n DATA_TOGGLE : '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n DROPDOWN_TOGGLE : '.dropdown-toggle',\n DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab {\n constructor(element) {\n this._element = element\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n show() {\n if (this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n $(this._element).hasClass(ClassName.ACTIVE) ||\n $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n let target\n let previous\n const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\n const selector = Util.getSelectorFromElement(this._element)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\n previous = $.makeArray($(listElement).find(itemSelector))\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = $.Event(Event.HIDE, {\n relatedTarget: this._element\n })\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget: previous\n })\n\n if (previous) {\n $(previous).trigger(hideEvent)\n }\n\n $(this._element).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented() ||\n hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n this._activate(\n this._element,\n listElement\n )\n\n const complete = () => {\n const hiddenEvent = $.Event(Event.HIDDEN, {\n relatedTarget: this._element\n })\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget: previous\n })\n\n $(previous).trigger(hiddenEvent)\n $(this._element).trigger(shownEvent)\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\n ? $(container).find(Selector.ACTIVE_UL)\n : $(container).children(Selector.ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\n const complete = () => this._transitionComplete(\n element,\n active,\n callback\n )\n\n // Boosted mod\n $(container).find('.nav-link:not(.dropdown-toggle)').attr({\n tabIndex : '-1',\n 'aria-selected' : false\n })\n $(container).find('.tab-pane').attr({\n 'aria-hidden' : true,\n tabIndex : '-1'\n })\n // end mod\n\n if (active && isTransitioning) {\n const transitionDuration = Util.getTransitionDurationFromElement(active)\n\n $(active)\n .removeClass(ClassName.SHOW)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n $(active).removeClass(ClassName.ACTIVE)\n\n const dropdownChild = $(active.parentNode).find(\n Selector.DROPDOWN_ACTIVE_CHILD\n )[0]\n\n if (dropdownChild) {\n $(dropdownChild).removeClass(ClassName.ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n $(element).addClass(ClassName.ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n // Boosted mod\n $(element).filter('.nav-link:not(.dropdown-toggle).active').attr({\n tabIndex : '0',\n 'aria-selected' : true\n })\n $(element).filter('.tab-pane.active').attr({\n 'aria-hidden' : false,\n tabIndex : '0'\n })\n // end mod\n\n Util.reflow(element)\n\n if (element.classList.contains(ClassName.FADE)) {\n element.classList.add(ClassName.SHOW)\n }\n\n if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\n\n if (dropdownElement) {\n const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\n\n $(dropdownToggleList).addClass(ClassName.ACTIVE)\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Boosted mod\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $($tab.attr('href'))\n const $tablist = $tab.closest(Selector.NAV_LIST_GROUP)\n const tabId = $tab.attr('id') || Util.getUID(NAME)\n\n $tab.attr('id', tabId)\n\n if ($tabpanel) {\n $tab.attr('role', 'tab')\n $tablist.attr('role', 'tablist')\n // $li.attr('role', 'presentation')\n }\n\n if ($tab.hasClass(ClassName.ACTIVE)) {\n $tab.attr({\n tabIndex : '0',\n 'aria-selected' : 'true'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '0',\n 'aria-hidden' : 'false',\n 'aria-labelledby': tabId\n })\n } else {\n $tab.attr({\n tabIndex : '-1',\n 'aria-selected' : 'false'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '-1',\n 'aria-hidden' : 'true',\n 'aria-labelledby': tabId\n })\n }\n }\n // end mod\n\n // Static\n\n // Boosted mod\n static _dataApiKeydownHandler(e) {\n const $this = $(this)\n const Items = $this.closest('ul[role=tablist] ').find('[role=tab]:visible')\n const k = e.which || e.keyCode\n\n let index = 0\n\n index = Items.index(Items.filter(':focus'))\n\n if (k === ARROW_UP_KEYCODE || k === ARROW_LEFT_KEYCODE) {\n index--\n } // up & left\n if (k === ARROW_RIGHT_KEYCODE || k === ARROW_DOWN_KEYCODE) {\n index++\n } // down & right\n\n if (index < 0) {\n index = Items.length - 1\n }\n if (index === Items.length) {\n index = 0\n }\n const nextTab = Items.eq(index)\n\n if (nextTab.attr('role') === 'tab') {\n nextTab.tab('show').trigger('focus')\n }\n\n e.preventDefault()\n e.stopPropagation()\n }\n // end mod\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Tab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n Tab._jQueryInterface.call($(this), 'show')\n })\n // Boosted mod\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, function (event) {\n if (!REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n event.preventDefault()\n Tab._dataApiKeydownHandler.call($(this), event)\n })\n .on('DOMContentLoaded', () => {\n Tab._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tab._jQueryInterface\n$.fn[NAME].Constructor = Tab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tab._jQueryInterface\n}\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Event = {\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n HIDE : 'hide',\n SHOW : 'show',\n SHOWING : 'showing'\n}\n\nconst DefaultType = {\n animation : 'boolean',\n autohide : 'boolean',\n delay : 'number'\n}\n\nconst Default = {\n animation : true,\n autohide : true,\n delay : 500\n}\n\nconst Selector = {\n DATA_DISMISS : '[data-dismiss=\"toast\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast {\n constructor(element, config) {\n this._element = element\n this._config = this._getConfig(config)\n this._timeout = null\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show() {\n $(this._element).trigger(Event.SHOW)\n\n if (this._config.animation) {\n this._element.classList.add(ClassName.FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(ClassName.SHOWING)\n this._element.classList.add(ClassName.SHOW)\n\n $(this._element).trigger(Event.SHOWN)\n\n if (this._config.autohide) {\n this.hide()\n }\n }\n\n this._element.classList.remove(ClassName.HIDE)\n this._element.classList.add(ClassName.SHOWING)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n hide(withoutTimeout) {\n if (!this._element.classList.contains(ClassName.SHOW)) {\n return\n }\n\n $(this._element).trigger(Event.HIDE)\n\n if (withoutTimeout) {\n this._close()\n } else {\n this._timeout = setTimeout(() => {\n this._close()\n }, this._config.delay)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n this._timeout = null\n\n if (this._element.classList.contains(ClassName.SHOW)) {\n this._element.classList.remove(ClassName.SHOW)\n }\n\n $(this._element).off(Event.CLICK_DISMISS)\n\n $.removeData(this._element, DATA_KEY)\n this._element = null\n this._config = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...$(this._element).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _setListeners() {\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n () => this.hide(true)\n )\n }\n\n _close() {\n const complete = () => {\n this._element.classList.add(ClassName.HIDE)\n $(this._element).trigger(Event.HIDDEN)\n }\n\n this._element.classList.remove(ClassName.SHOW)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new Toast(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Toast._jQueryInterface\n$.fn[NAME].Constructor = Toast\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Toast._jQueryInterface\n}\n\nexport default Toast\n","import $ from 'jquery'\nimport Alert from './alert'\nimport Button from './button'\nimport Carousel from './carousel'\nimport Collapse from './collapse'\nimport Dropdown from './dropdown'\nimport MegaMenu from './o-megamenu'\nimport Modal from './modal'\nimport Navbar from './o-navbar'\nimport Otab from './o-tab'\nimport Popover from './popover'\nimport PriorityNav from './o-priority-nav'\nimport ScrollUp from './o-scroll-up'\nimport Scrollspy from './scrollspy'\nimport Tab from './tab'\nimport Toast from './toast'\nimport Tooltip from './tooltip'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(() => {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n})()\n\nexport {\n Util,\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n MegaMenu,\n Modal,\n Navbar,\n Otab,\n Popover,\n PriorityNav,\n ScrollUp,\n Scrollspy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file
diff --git a/dashboard/public/js/boosted.js b/dashboard/public/js/boosted.js
new file mode 100644
index 00000000..922cd45e
--- /dev/null
+++ b/dashboard/public/js/boosted.js
@@ -0,0 +1,5632 @@
+/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://boosted.orange.com)
+ * Copyright 2011-2019 The Boosted Authors (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
+ typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
+ (global = global || self, factory(global.boosted = {}, global.jQuery, global.Popper));
+}(this, function (exports, $, Popper) { 'use strict';
+
+ $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
+ Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function _objectSpread(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+ var ownKeys = Object.keys(source);
+
+ if (typeof Object.getOwnPropertySymbols === 'function') {
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
+ }));
+ }
+
+ ownKeys.forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ }
+
+ return target;
+ }
+
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ subClass.__proto__ = superClass;
+ }
+
+ /**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): util.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+ /**
+ * ------------------------------------------------------------------------
+ * Private TransitionEnd Helpers
+ * ------------------------------------------------------------------------
+ */
+
+ var TRANSITION_END = 'transitionend';
+ var MAX_UID = 1000000;
+ var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
+
+ function toType(obj) {
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
+ }
+
+ function getSpecialTransitionEndEvent() {
+ return {
+ bindType: TRANSITION_END,
+ delegateType: TRANSITION_END,
+ handle: function handle(event) {
+ if ($(event.target).is(this)) {
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
+ }
+
+ return undefined; // eslint-disable-line no-undefined
+ }
+ };
+ }
+
+ function transitionEndEmulator(duration) {
+ var _this = this;
+
+ var called = false;
+ $(this).one(Util.TRANSITION_END, function () {
+ called = true;
+ });
+ setTimeout(function () {
+ if (!called) {
+ Util.triggerTransitionEnd(_this);
+ }
+ }, duration);
+ return this;
+ }
+
+ function setTransitionEndSupport() {
+ $.fn.emulateTransitionEnd = transitionEndEmulator;
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
+ }
+ /**
+ * --------------------------------------------------------------------------
+ * Public Util Api
+ * --------------------------------------------------------------------------
+ */
+
+
+ var Util = {
+ TRANSITION_END: 'bsTransitionEnd',
+ getUID: function getUID(prefix) {
+ do {
+ // eslint-disable-next-line no-bitwise
+ prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
+ } while (document.getElementById(prefix));
+
+ return prefix;
+ },
+ getSelectorFromElement: function getSelectorFromElement(element) {
+ var selector = element.getAttribute('data-target');
+
+ if (!selector || selector === '#') {
+ var hrefAttr = element.getAttribute('href');
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
+ }
+
+ try {
+ return document.querySelector(selector) ? selector : null;
+ } catch (err) {
+ return null;
+ }
+ },
+ getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
+ if (!element) {
+ return 0;
+ } // Get transition-duration of the element
+
+
+ var transitionDuration = $(element).css('transition-duration');
+ var transitionDelay = $(element).css('transition-delay');
+ var floatTransitionDuration = parseFloat(transitionDuration);
+ var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
+
+ if (!floatTransitionDuration && !floatTransitionDelay) {
+ return 0;
+ } // If multiple durations are defined, take the first
+
+
+ transitionDuration = transitionDuration.split(',')[0];
+ transitionDelay = transitionDelay.split(',')[0];
+ return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
+ },
+ reflow: function reflow(element) {
+ return element.offsetHeight;
+ },
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
+ $(element).trigger(TRANSITION_END);
+ },
+ // TODO: Remove in v5
+ supportsTransitionEnd: function supportsTransitionEnd() {
+ return Boolean(TRANSITION_END);
+ },
+ isElement: function isElement(obj) {
+ return (obj[0] || obj).nodeType;
+ },
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
+ for (var property in configTypes) {
+ if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
+ var expectedTypes = configTypes[property];
+ var value = config[property];
+ var valueType = value && Util.isElement(value) ? 'element' : toType(value);
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
+ }
+ }
+ }
+ },
+ findShadowRoot: function findShadowRoot(element) {
+ if (!document.documentElement.attachShadow) {
+ return null;
+ } // Can find the shadow root otherwise it'll return the document
+
+
+ if (typeof element.getRootNode === 'function') {
+ var root = element.getRootNode();
+ return root instanceof ShadowRoot ? root : null;
+ }
+
+ if (element instanceof ShadowRoot) {
+ return element;
+ } // when we don't find a shadow root
+
+
+ if (!element.parentNode) {
+ return null;
+ }
+
+ return Util.findShadowRoot(element.parentNode);
+ }
+ };
+ setTransitionEndSupport();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'alert';
+ var VERSION = '4.3.1';
+ var DATA_KEY = 'bs.alert';
+ var EVENT_KEY = "." + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var Selector = {
+ DISMISS: '[data-dismiss="alert"]'
+ };
+ var Event = {
+ CLOSE: "close" + EVENT_KEY,
+ CLOSED: "closed" + EVENT_KEY,
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
+ };
+ var ClassName = {
+ ALERT: 'alert',
+ FADE: 'fade',
+ SHOW: 'show'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Alert =
+ /*#__PURE__*/
+ function () {
+ function Alert(element) {
+ this._element = element;
+ } // Getters
+
+
+ var _proto = Alert.prototype;
+
+ // Public
+ _proto.close = function close(element) {
+ var rootElement = this._element;
+
+ if (element) {
+ rootElement = this._getRootElement(element);
+ }
+
+ var customEvent = this._triggerCloseEvent(rootElement);
+
+ if (customEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._removeElement(rootElement);
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ this._element = null;
+ } // Private
+ ;
+
+ _proto._getRootElement = function _getRootElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ var parent = false;
+
+ if (selector) {
+ parent = document.querySelector(selector);
+ }
+
+ if (!parent) {
+ parent = $(element).closest("." + ClassName.ALERT)[0];
+ }
+
+ return parent;
+ };
+
+ _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
+ var closeEvent = $.Event(Event.CLOSE);
+ $(element).trigger(closeEvent);
+ return closeEvent;
+ };
+
+ _proto._removeElement = function _removeElement(element) {
+ var _this = this;
+
+ $(element).removeClass(ClassName.SHOW);
+
+ if (!$(element).hasClass(ClassName.FADE)) {
+ this._destroyElement(element);
+
+ return;
+ }
+
+ var transitionDuration = Util.getTransitionDurationFromElement(element);
+ $(element).one(Util.TRANSITION_END, function (event) {
+ return _this._destroyElement(element, event);
+ }).emulateTransitionEnd(transitionDuration);
+ };
+
+ _proto._destroyElement = function _destroyElement(element) {
+ $(element).detach().trigger(Event.CLOSED).remove();
+ } // Static
+ ;
+
+ Alert._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $(this);
+ var data = $element.data(DATA_KEY);
+
+ if (!data) {
+ data = new Alert(this);
+ $element.data(DATA_KEY, data);
+ }
+
+ if (config === 'close') {
+ data[config](this);
+ }
+ });
+ };
+
+ Alert._handleDismiss = function _handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault();
+ }
+
+ alertInstance.close(this);
+ };
+ };
+
+ _createClass(Alert, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Alert;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Alert._jQueryInterface;
+ $.fn[NAME].Constructor = Alert;
+
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Alert._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$1 = 'button';
+ var VERSION$1 = '4.3.1';
+ var DATA_KEY$1 = 'bs.button';
+ var EVENT_KEY$1 = "." + DATA_KEY$1;
+ var DATA_API_KEY$1 = '.data-api';
+ var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];
+ var ClassName$1 = {
+ ACTIVE: 'active',
+ BUTTON: 'btn',
+ FOCUS: 'focus'
+ };
+ var Selector$1 = {
+ DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
+ DATA_TOGGLE: '[data-toggle="buttons"]',
+ INPUT: 'input:not([type="hidden"])',
+ ACTIVE: '.active',
+ BUTTON: '.btn'
+ };
+ var Event$1 = {
+ CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
+ FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Button =
+ /*#__PURE__*/
+ function () {
+ function Button(element) {
+ this._element = element;
+ } // Getters
+
+
+ var _proto = Button.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];
+
+ var input = this._element.querySelector(Selector$1.INPUT);
+
+ if (rootElement) {
+ var activeElement = rootElement.querySelector(Selector$1.ACTIVE);
+
+ if (activeElement) {
+ activeElement.classList.remove(ClassName$1.ACTIVE);
+ }
+ }
+
+ if (input) {
+ if (input.checked) {
+ this._element.classList.add(ClassName$1.ACTIVE);
+ } else {
+ this._element.classList.remove(ClassName$1.ACTIVE);
+ }
+ } else {
+ this._element.classList.toggle(ClassName$1.ACTIVE);
+
+ this._element.setAttribute('aria-pressed', this._element.classList.contains(ClassName$1.ACTIVE));
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$1);
+ this._element = null;
+ } // Static
+ ;
+
+ Button._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$1);
+
+ if (!data) {
+ data = new Button(this);
+ $(this).data(DATA_KEY$1, data);
+ }
+
+ if (config === 'toggle') {
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Button, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$1;
+ }
+ }]);
+
+ return Button;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
+ var button = event.target;
+
+ if (!$(button).hasClass(ClassName$1.BUTTON)) {
+ button = $(button).closest(Selector$1.BUTTON);
+ }
+
+ Button._jQueryInterface.call($(button), 'toggle');
+ }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
+ var button = $(event.target).closest(Selector$1.BUTTON)[0];
+
+ if (button) {
+ $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
+ }
+ }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT > Selector$1.INPUT, function (event) {
+ var button = $(event.target).closest(Selector$1.BUTTON)[0];
+
+ if (button) {
+ $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$1] = Button._jQueryInterface;
+ $.fn[NAME$1].Constructor = Button;
+
+ $.fn[NAME$1].noConflict = function () {
+ $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;
+ return Button._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$2 = 'carousel';
+ var VERSION$2 = '4.3.1';
+ var DATA_KEY$2 = 'bs.carousel';
+ var EVENT_KEY$2 = "." + DATA_KEY$2;
+ var DATA_API_KEY$2 = '.data-api';
+ var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];
+ var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
+
+ var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
+
+ var SWIPE_THRESHOLD = 40;
+ var Default = {
+ interval: 5000,
+ keyboard: true,
+ slide: false,
+ pause: 'hover',
+ wrap: true,
+ touch: true
+ };
+ var DefaultType = {
+ interval: '(number|boolean)',
+ keyboard: 'boolean',
+ slide: '(boolean|string)',
+ pause: '(string|boolean)',
+ wrap: 'boolean',
+ touch: 'boolean'
+ };
+ var Direction = {
+ NEXT: 'next',
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
+ };
+ var Event$2 = {
+ SLIDE: "slide" + EVENT_KEY$2,
+ SLID: "slid" + EVENT_KEY$2,
+ KEYDOWN: "keydown" + EVENT_KEY$2,
+ MOUSEENTER: "mouseenter" + EVENT_KEY$2,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY$2,
+ TOUCHSTART: "touchstart" + EVENT_KEY$2,
+ TOUCHMOVE: "touchmove" + EVENT_KEY$2,
+ TOUCHEND: "touchend" + EVENT_KEY$2,
+ POINTERDOWN: "pointerdown" + EVENT_KEY$2,
+ POINTERUP: "pointerup" + EVENT_KEY$2,
+ DRAG_START: "dragstart" + EVENT_KEY$2,
+ LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2,
+ CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2
+ };
+ var ClassName$2 = {
+ CAROUSEL: 'carousel',
+ ACTIVE: 'active',
+ SLIDE: 'slide',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
+ ITEM: 'carousel-item',
+ POINTER_EVENT: 'pointer-event'
+ };
+ var Selector$2 = {
+ ACTIVE: '.active',
+ ACTIVE_ITEM: '.active.carousel-item',
+ ITEM: '.carousel-item',
+ ITEM_IMG: '.carousel-item img',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
+ INDICATORS: '.carousel-indicators',
+ DATA_SLIDE: '[data-slide], [data-slide-to]',
+ DATA_RIDE: '[data-ride="carousel"]'
+ };
+ var PointerType = {
+ TOUCH: 'touch',
+ PEN: 'pen'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Carousel =
+ /*#__PURE__*/
+ function () {
+ function Carousel(element, config) {
+ this._items = null;
+ this._interval = null;
+ this._activeElement = null;
+ this._isPaused = false;
+ this._isSliding = false;
+ this.touchTimeout = null;
+ this.touchStartX = 0;
+ this.touchDeltaX = 0;
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);
+ this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
+ this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
+
+ this._addEventListeners();
+ } // Getters
+
+
+ var _proto = Carousel.prototype;
+
+ // Public
+ _proto.next = function next() {
+ if (!this._isSliding) {
+ this._slide(Direction.NEXT);
+ }
+ };
+
+ _proto.nextWhenVisible = function nextWhenVisible() {
+ // Don't call next when the page isn't visible
+ // or the carousel or its parent isn't visible
+ if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {
+ this.next();
+ }
+ };
+
+ _proto.prev = function prev() {
+ if (!this._isSliding) {
+ this._slide(Direction.PREV);
+ }
+ };
+
+ _proto.pause = function pause(event) {
+ if (!event) {
+ this._isPaused = true;
+ }
+
+ if (this._element.querySelector(Selector$2.NEXT_PREV)) {
+ Util.triggerTransitionEnd(this._element);
+ this.cycle(true);
+ }
+
+ clearInterval(this._interval);
+ this._interval = null;
+ };
+
+ _proto.cycle = function cycle(event) {
+ if (!event) {
+ this._isPaused = false;
+ }
+
+ if (this._interval) {
+ clearInterval(this._interval);
+ this._interval = null;
+ }
+
+ if (this._config.interval && !this._isPaused) {
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
+ }
+ };
+
+ _proto.to = function to(index) {
+ var _this = this;
+
+ this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
+
+ var activeIndex = this._getItemIndex(this._activeElement);
+
+ if (index > this._items.length - 1 || index < 0) {
+ return;
+ }
+
+ if (this._isSliding) {
+ $(this._element).one(Event$2.SLID, function () {
+ return _this.to(index);
+ });
+ return;
+ }
+
+ if (activeIndex === index) {
+ this.pause();
+ this.cycle();
+ return;
+ }
+
+ var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
+
+ this._slide(direction, this._items[index]);
+ };
+
+ _proto.dispose = function dispose() {
+ $(this._element).off(EVENT_KEY$2);
+ $.removeData(this._element, DATA_KEY$2);
+ this._items = null;
+ this._config = null;
+ this._element = null;
+ this._interval = null;
+ this._isPaused = null;
+ this._isSliding = null;
+ this._activeElement = null;
+ this._indicatorsElement = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default, config);
+ Util.typeCheckConfig(NAME$2, config, DefaultType);
+ return config;
+ };
+
+ _proto._handleSwipe = function _handleSwipe() {
+ var absDeltax = Math.abs(this.touchDeltaX);
+
+ if (absDeltax <= SWIPE_THRESHOLD) {
+ return;
+ }
+
+ var direction = absDeltax / this.touchDeltaX; // swipe left
+
+ if (direction > 0) {
+ this.prev();
+ } // swipe right
+
+
+ if (direction < 0) {
+ this.next();
+ }
+ };
+
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this2 = this;
+
+ if (this._config.keyboard) {
+ $(this._element).on(Event$2.KEYDOWN, function (event) {
+ return _this2._keydown(event);
+ });
+ }
+
+ if (this._config.pause === 'hover') {
+ $(this._element).on(Event$2.MOUSEENTER, function (event) {
+ return _this2.pause(event);
+ }).on(Event$2.MOUSELEAVE, function (event) {
+ return _this2.cycle(event);
+ });
+ }
+
+ if (this._config.touch) {
+ this._addTouchEventListeners();
+ }
+ };
+
+ _proto._addTouchEventListeners = function _addTouchEventListeners() {
+ var _this3 = this;
+
+ if (!this._touchSupported) {
+ return;
+ }
+
+ var start = function start(event) {
+ if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
+ _this3.touchStartX = event.originalEvent.clientX;
+ } else if (!_this3._pointerEvent) {
+ _this3.touchStartX = event.originalEvent.touches[0].clientX;
+ }
+ };
+
+ var move = function move(event) {
+ // ensure swiping with one touch and not pinching
+ if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
+ _this3.touchDeltaX = 0;
+ } else {
+ _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
+ }
+ };
+
+ var end = function end(event) {
+ if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
+ _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
+ }
+
+ _this3._handleSwipe();
+
+ if (_this3._config.pause === 'hover') {
+ // If it's a touch-enabled device, mouseenter/leave are fired as
+ // part of the mouse compatibility events on first tap - the carousel
+ // would stop cycling until user tapped out of it;
+ // here, we listen for touchend, explicitly pause the carousel
+ // (as if it's the second time we tap on it, mouseenter compat event
+ // is NOT fired) and after a timeout (to allow for mouse compatibility
+ // events to fire) we explicitly restart cycling
+ _this3.pause();
+
+ if (_this3.touchTimeout) {
+ clearTimeout(_this3.touchTimeout);
+ }
+
+ _this3.touchTimeout = setTimeout(function (event) {
+ return _this3.cycle(event);
+ }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
+ }
+ };
+
+ $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {
+ return e.preventDefault();
+ });
+
+ if (this._pointerEvent) {
+ $(this._element).on(Event$2.POINTERDOWN, function (event) {
+ return start(event);
+ });
+ $(this._element).on(Event$2.POINTERUP, function (event) {
+ return end(event);
+ });
+
+ this._element.classList.add(ClassName$2.POINTER_EVENT);
+ } else {
+ $(this._element).on(Event$2.TOUCHSTART, function (event) {
+ return start(event);
+ });
+ $(this._element).on(Event$2.TOUCHMOVE, function (event) {
+ return move(event);
+ });
+ $(this._element).on(Event$2.TOUCHEND, function (event) {
+ return end(event);
+ });
+ }
+ };
+
+ _proto._keydown = function _keydown(event) {
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
+
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
+ this.prev();
+ break;
+
+ case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
+ this.next();
+ break;
+
+ default:
+ }
+ };
+
+ _proto._getItemIndex = function _getItemIndex(element) {
+ this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];
+ return this._items.indexOf(element);
+ };
+
+ _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
+ var isNextDirection = direction === Direction.NEXT;
+ var isPrevDirection = direction === Direction.PREV;
+
+ var activeIndex = this._getItemIndex(activeElement);
+
+ var lastItemIndex = this._items.length - 1;
+ var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
+
+ if (isGoingToWrap && !this._config.wrap) {
+ return activeElement;
+ }
+
+ var delta = direction === Direction.PREV ? -1 : 1;
+ var itemIndex = (activeIndex + delta) % this._items.length;
+ return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
+ };
+
+ _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
+ var targetIndex = this._getItemIndex(relatedTarget);
+
+ var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));
+
+ var slideEvent = $.Event(Event$2.SLIDE, {
+ relatedTarget: relatedTarget,
+ direction: eventDirectionName,
+ from: fromIndex,
+ to: targetIndex
+ });
+ $(this._element).trigger(slideEvent);
+ return slideEvent;
+ };
+
+ _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
+ if (this._indicatorsElement) {
+ var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));
+ $(indicators).removeClass(ClassName$2.ACTIVE);
+
+ var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
+
+ if (nextIndicator) {
+ $(nextIndicator).addClass(ClassName$2.ACTIVE);
+ }
+ }
+ };
+
+ _proto._slide = function _slide(direction, element) {
+ var _this4 = this;
+
+ var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
+
+ var activeElementIndex = this._getItemIndex(activeElement);
+
+ var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
+
+ var nextElementIndex = this._getItemIndex(nextElement);
+
+ var isCycling = Boolean(this._interval);
+ var directionalClassName;
+ var orderClassName;
+ var eventDirectionName;
+
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName$2.LEFT;
+ orderClassName = ClassName$2.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName$2.RIGHT;
+ orderClassName = ClassName$2.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
+
+ if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {
+ this._isSliding = false;
+ return;
+ }
+
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
+
+ if (slideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (!activeElement || !nextElement) {
+ // Some weirdness is happening, so we bail
+ return;
+ }
+
+ this._isSliding = true;
+
+ if (isCycling) {
+ this.pause();
+ }
+
+ this._setActiveIndicatorElement(nextElement);
+
+ var slidEvent = $.Event(Event$2.SLID, {
+ relatedTarget: nextElement,
+ direction: eventDirectionName,
+ from: activeElementIndex,
+ to: nextElementIndex
+ });
+
+ if ($(this._element).hasClass(ClassName$2.SLIDE)) {
+ $(nextElement).addClass(orderClassName);
+ Util.reflow(nextElement);
+ $(activeElement).addClass(directionalClassName);
+ $(nextElement).addClass(directionalClassName);
+ var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
+
+ if (nextElementInterval) {
+ this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
+ this._config.interval = nextElementInterval;
+ } else {
+ this._config.interval = this._config.defaultInterval || this._config.interval;
+ }
+
+ var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
+ $(activeElement).one(Util.TRANSITION_END, function () {
+ $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE);
+ $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName);
+ _this4._isSliding = false;
+ setTimeout(function () {
+ return $(_this4._element).trigger(slidEvent);
+ }, 0);
+ }).emulateTransitionEnd(transitionDuration);
+ } else {
+ $(activeElement).removeClass(ClassName$2.ACTIVE);
+ $(nextElement).addClass(ClassName$2.ACTIVE);
+ this._isSliding = false;
+ $(this._element).trigger(slidEvent);
+ }
+
+ if (isCycling) {
+ this.cycle();
+ }
+ } // Static
+ ;
+
+ Carousel._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$2);
+
+ var _config = _objectSpread({}, Default, $(this).data());
+
+ if (typeof config === 'object') {
+ _config = _objectSpread({}, _config, config);
+ }
+
+ var action = typeof config === 'string' ? config : _config.slide;
+
+ if (!data) {
+ data = new Carousel(this, _config);
+ $(this).data(DATA_KEY$2, data);
+ }
+
+ if (typeof config === 'number') {
+ data.to(config);
+ } else if (typeof action === 'string') {
+ if (typeof data[action] === 'undefined') {
+ throw new TypeError("No method named \"" + action + "\"");
+ }
+
+ data[action]();
+ } else if (_config.interval && _config.ride) {
+ data.pause();
+ data.cycle();
+ }
+ });
+ };
+
+ Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
+ var selector = Util.getSelectorFromElement(this);
+
+ if (!selector) {
+ return;
+ }
+
+ var target = $(selector)[0];
+
+ if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {
+ return;
+ }
+
+ var config = _objectSpread({}, $(target).data(), $(this).data());
+
+ var slideIndex = this.getAttribute('data-slide-to');
+
+ if (slideIndex) {
+ config.interval = false;
+ }
+
+ Carousel._jQueryInterface.call($(target), config);
+
+ if (slideIndex) {
+ $(target).data(DATA_KEY$2).to(slideIndex);
+ }
+
+ event.preventDefault();
+ };
+
+ _createClass(Carousel, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$2;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default;
+ }
+ }]);
+
+ return Carousel;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);
+ $(window).on(Event$2.LOAD_DATA_API, function () {
+ var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));
+
+ for (var i = 0, len = carousels.length; i < len; i++) {
+ var $carousel = $(carousels[i]);
+
+ Carousel._jQueryInterface.call($carousel, $carousel.data());
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$2] = Carousel._jQueryInterface;
+ $.fn[NAME$2].Constructor = Carousel;
+
+ $.fn[NAME$2].noConflict = function () {
+ $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;
+ return Carousel._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$3 = 'collapse';
+ var VERSION$3 = '4.3.1';
+ var DATA_KEY$3 = 'bs.collapse';
+ var EVENT_KEY$3 = "." + DATA_KEY$3;
+ var DATA_API_KEY$3 = '.data-api';
+ var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];
+ var Default$1 = {
+ toggle: true,
+ parent: ''
+ };
+ var DefaultType$1 = {
+ toggle: 'boolean',
+ parent: '(string|element)'
+ };
+ var Event$3 = {
+ SHOW: "show" + EVENT_KEY$3,
+ SHOWN: "shown" + EVENT_KEY$3,
+ HIDE: "hide" + EVENT_KEY$3,
+ HIDDEN: "hidden" + EVENT_KEY$3,
+ CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3
+ };
+ var ClassName$3 = {
+ SHOW: 'show',
+ COLLAPSE: 'collapse',
+ COLLAPSING: 'collapsing',
+ COLLAPSED: 'collapsed'
+ };
+ var Dimension = {
+ WIDTH: 'width',
+ HEIGHT: 'height'
+ };
+ var Selector$3 = {
+ ACTIVES: '*:not(.multi) > .show, *:not(.multi) > .collapsing',
+ // boosted mod
+ DATA_TOGGLE: '[data-toggle="collapse"]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Collapse =
+ /*#__PURE__*/
+ function () {
+ function Collapse(element, config) {
+ this._isTransitioning = false;
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
+ var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));
+
+ for (var i = 0, len = toggleList.length; i < len; i++) {
+ var elem = toggleList[i];
+ var selector = Util.getSelectorFromElement(elem);
+ var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
+ return foundElem === element;
+ });
+
+ if (selector !== null && filterElement.length > 0) {
+ this._selector = selector;
+
+ this._triggerArray.push(elem);
+ }
+ }
+
+ this._parent = this._config.parent ? this._getParent() : null;
+
+ if (!this._config.parent) {
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
+ }
+
+ if (this._config.toggle) {
+ this.toggle();
+ }
+ } // Getters
+
+
+ var _proto = Collapse.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ if ($(this._element).hasClass(ClassName$3.SHOW)) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ };
+
+ _proto.show = function show() {
+ var _this = this;
+
+ if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {
+ return;
+ }
+
+ var actives;
+ var activesData;
+
+ if (this._parent) {
+ actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {
+ if (typeof _this._config.parent === 'string') {
+ return elem.getAttribute('data-parent') === _this._config.parent;
+ }
+
+ return elem.classList.contains(ClassName$3.COLLAPSE);
+ });
+
+ if (actives.length === 0) {
+ actives = null;
+ }
+ }
+
+ if (actives) {
+ activesData = $(actives).not(this._selector).data(DATA_KEY$3);
+
+ if (activesData && activesData._isTransitioning) {
+ return;
+ }
+ }
+
+ var startEvent = $.Event(Event$3.SHOW);
+ $(this._element).trigger(startEvent);
+
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (actives) {
+ Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
+
+ if (!activesData) {
+ $(actives).data(DATA_KEY$3, null);
+ }
+ }
+
+ var dimension = this._getDimension();
+
+ $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);
+ this._element.style[dimension] = 0;
+
+ if (this._triggerArray.length) {
+ $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);
+ }
+
+ this.setTransitioning(true);
+
+ var complete = function complete() {
+ $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);
+ _this._element.style[dimension] = '';
+
+ _this.setTransitioning(false);
+
+ $(_this._element).trigger(Event$3.SHOWN);
+ };
+
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
+ var scrollSize = "scroll" + capitalizedDimension;
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ this._element.style[dimension] = this._element[scrollSize] + "px";
+ };
+
+ _proto.hide = function hide() {
+ var _this2 = this;
+
+ if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {
+ return;
+ }
+
+ var startEvent = $.Event(Event$3.HIDE);
+ $(this._element).trigger(startEvent);
+
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ var dimension = this._getDimension();
+
+ this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
+ Util.reflow(this._element);
+ $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);
+ var triggerArrayLength = this._triggerArray.length;
+
+ if (triggerArrayLength > 0) {
+ for (var i = 0; i < triggerArrayLength; i++) {
+ var trigger = this._triggerArray[i];
+ var selector = Util.getSelectorFromElement(trigger);
+
+ if (selector !== null) {
+ var $elem = $([].slice.call(document.querySelectorAll(selector)));
+
+ if (!$elem.hasClass(ClassName$3.SHOW)) {
+ $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);
+ }
+ }
+ }
+ }
+
+ this.setTransitioning(true);
+
+ var complete = function complete() {
+ _this2.setTransitioning(false);
+
+ $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);
+ };
+
+ this._element.style[dimension] = '';
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ };
+
+ _proto.setTransitioning = function setTransitioning(isTransitioning) {
+ this._isTransitioning = isTransitioning;
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$3);
+ this._config = null;
+ this._parent = null;
+ this._element = null;
+ this._triggerArray = null;
+ this._isTransitioning = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$1, config);
+ config.toggle = Boolean(config.toggle); // Coerce string values
+
+ Util.typeCheckConfig(NAME$3, config, DefaultType$1);
+ return config;
+ };
+
+ _proto._getDimension = function _getDimension() {
+ var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
+ };
+
+ _proto._getParent = function _getParent() {
+ var _this3 = this;
+
+ var parent;
+
+ if (Util.isElement(this._config.parent)) {
+ parent = this._config.parent; // It's a jQuery object
+
+ if (typeof this._config.parent.jquery !== 'undefined') {
+ parent = this._config.parent[0];
+ }
+ } else {
+ parent = document.querySelector(this._config.parent);
+ }
+
+ var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
+ var children = [].slice.call(parent.querySelectorAll(selector));
+ $(children).each(function (i, element) {
+ _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
+ });
+ return parent;
+ };
+
+ _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
+ var isOpen = $(element).hasClass(ClassName$3.SHOW);
+
+ if (triggerArray.length) {
+ $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
+ }
+ } // Static
+ ;
+
+ Collapse._getTargetFromElement = function _getTargetFromElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ return selector ? document.querySelector(selector) : null;
+ };
+
+ Collapse._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY$3);
+
+ var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});
+
+ if (!data && _config.toggle && /show|hide|init/.test(config)) {
+ // Boosted mod
+ _config.toggle = false;
+ }
+
+ if (!data) {
+ data = new Collapse(this, _config);
+ $this.data(DATA_KEY$3, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Collapse, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$3;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$1;
+ }
+ }]);
+
+ return Collapse;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {
+ // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
+ if (event.currentTarget.tagName === 'A') {
+ event.preventDefault();
+ }
+
+ var $trigger = $(this);
+ var selector = Util.getSelectorFromElement(this);
+ var selectors = [].slice.call(document.querySelectorAll(selector));
+ $(selectors).each(function () {
+ var $target = $(this);
+ var data = $target.data(DATA_KEY$3);
+ var config = data ? 'toggle' : $trigger.data();
+
+ Collapse._jQueryInterface.call($target, config);
+ });
+ }) // Boosted mod
+ .on('DOMContentLoaded', function () {
+ $(Selector$3.DATA_TOGGLE).each(function () {
+ var target = Collapse._getTargetFromElement(this);
+
+ Collapse._jQueryInterface.call($(target), 'init');
+ });
+ }); // end mod
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$3] = Collapse._jQueryInterface;
+ $.fn[NAME$3].Constructor = Collapse;
+
+ $.fn[NAME$3].noConflict = function () {
+ $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;
+ return Collapse._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$4 = 'dropdown';
+ var VERSION$4 = '4.3.1';
+ var DATA_KEY$4 = 'bs.dropdown';
+ var EVENT_KEY$4 = "." + DATA_KEY$4;
+ var DATA_API_KEY$4 = '.data-api';
+ var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
+
+ var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
+
+ var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
+
+ var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
+
+ var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
+ var Event$4 = {
+ HIDE: "hide" + EVENT_KEY$4,
+ HIDDEN: "hidden" + EVENT_KEY$4,
+ SHOW: "show" + EVENT_KEY$4,
+ SHOWN: "shown" + EVENT_KEY$4,
+ CLICK: "click" + EVENT_KEY$4,
+ CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4,
+ KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4,
+ KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4
+ };
+ var ClassName$4 = {
+ DISABLED: 'disabled',
+ SHOW: 'show',
+ DROPUP: 'dropup',
+ DROPRIGHT: 'dropright',
+ DROPLEFT: 'dropleft',
+ MENURIGHT: 'dropdown-menu-right',
+ MENULEFT: 'dropdown-menu-left',
+ POSITION_STATIC: 'position-static'
+ };
+ var Selector$4 = {
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
+ FORM_CHILD: '.dropdown form',
+ MENU: '.dropdown-menu',
+ NAVBAR_NAV: '.navbar-nav',
+ // Boosted mod
+ MENU_ITEMS: '.dropdown-menu .dropdown-item',
+ FIRST_ITEM_IN_MENU: '.dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)',
+ // end mod
+ VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
+ };
+ var AttachmentMap = {
+ TOP: 'top-start',
+ TOPEND: 'top-end',
+ BOTTOM: 'bottom-start',
+ BOTTOMEND: 'bottom-end',
+ RIGHT: 'right-start',
+ RIGHTEND: 'right-end',
+ LEFT: 'left-start',
+ LEFTEND: 'left-end'
+ };
+ var Default$2 = {
+ offset: 0,
+ flip: true,
+ boundary: 'scrollParent',
+ reference: 'toggle',
+ display: 'dynamic'
+ };
+ var DefaultType$2 = {
+ offset: '(number|string|function)',
+ flip: 'boolean',
+ boundary: '(string|element)',
+ reference: '(string|element)',
+ display: 'string'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Dropdown =
+ /*#__PURE__*/
+ function () {
+ function Dropdown(element, config) {
+ this._element = element;
+ this._popper = null;
+ this._config = this._getConfig(config);
+ this._menu = this._getMenuElement();
+ this._inNavbar = this._detectNavbar();
+
+ this._addEventListeners();
+
+ this._addAccessibility(); // Boosted mod
+
+ } // Getters
+
+
+ var _proto = Dropdown.prototype;
+
+ // Public
+ _proto.toggle = function toggle() {
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {
+ return;
+ }
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
+
+ Dropdown._clearMenus();
+
+ if (isActive) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var showEvent = $.Event(Event$4.SHOW, relatedTarget);
+ $(parent).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented()) {
+ return;
+ } // Disable totally Popper.js for Dropdown in Navbar
+
+
+ if (!this._inNavbar) {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
+ }
+
+ var referenceElement = this._element;
+
+ if (this._config.reference === 'parent') {
+ referenceElement = parent;
+ } else if (Util.isElement(this._config.reference)) {
+ referenceElement = this._config.reference; // Check if it's jQuery element
+
+ if (typeof this._config.reference.jquery !== 'undefined') {
+ referenceElement = this._config.reference[0];
+ }
+ } // If boundary is not `scrollParent`, then set position to `static`
+ // to allow the menu to "escape" the scroll parent's boundaries
+ // https://github.com/twbs/bootstrap/issues/24251
+
+
+ if (this._config.boundary !== 'scrollParent') {
+ $(parent).addClass(ClassName$4.POSITION_STATIC);
+ }
+
+ this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
+ } // If this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+
+
+ if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {
+ $(document.body).children().on('mouseover', null, $.noop);
+ }
+
+ this._element.focus();
+
+ this._element.setAttribute('aria-expanded', true);
+
+ $(this._menu).toggleClass(ClassName$4.SHOW);
+ $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
+ };
+
+ _proto.show = function show() {
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var showEvent = $.Event(Event$4.SHOW, relatedTarget);
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ $(parent).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $(this._menu).toggleClass(ClassName$4.SHOW);
+ $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget)); // Boosted mod
+
+ $(parent).find(Selector$4.FIRST_ITEM_IN_MENU).first().trigger('focus'); // end mod
+ };
+
+ _proto.hide = function hide() {
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
+ return;
+ }
+
+ var relatedTarget = {
+ relatedTarget: this._element
+ };
+ var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
+
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ $(parent).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $(this._menu).toggleClass(ClassName$4.SHOW);
+ $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$4);
+ $(this._element).off(EVENT_KEY$4);
+ this._element = null;
+ this._menu = null;
+
+ if (this._popper !== null) {
+ this._popper.destroy();
+
+ this._popper = null;
+ }
+ };
+
+ _proto.update = function update() {
+ this._inNavbar = this._detectNavbar();
+
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ } // Private
+ ;
+
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this = this;
+
+ $(this._element).on(Event$4.CLICK, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ _this.toggle();
+ });
+ };
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
+ Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
+ return config;
+ };
+
+ _proto._getMenuElement = function _getMenuElement() {
+ if (!this._menu) {
+ var parent = Dropdown._getParentFromElement(this._element);
+
+ if (parent) {
+ this._menu = parent.querySelector(Selector$4.MENU);
+ }
+ }
+
+ return this._menu;
+ };
+
+ _proto._getPlacement = function _getPlacement() {
+ var $parentDropdown = $(this._element.parentNode);
+ var placement = AttachmentMap.BOTTOM; // Handle dropup
+
+ if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {
+ placement = AttachmentMap.TOP;
+
+ if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
+ placement = AttachmentMap.TOPEND;
+ }
+ } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {
+ placement = AttachmentMap.RIGHT;
+ } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {
+ placement = AttachmentMap.LEFT;
+ } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
+ placement = AttachmentMap.BOTTOMEND;
+ }
+
+ return placement;
+ };
+
+ _proto._detectNavbar = function _detectNavbar() {
+ return $(this._element).closest('.navbar').length > 0;
+ };
+
+ _proto._getOffset = function _getOffset() {
+ var _this2 = this;
+
+ var offset = {};
+
+ if (typeof this._config.offset === 'function') {
+ offset.fn = function (data) {
+ data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
+ return data;
+ };
+ } else {
+ offset.offset = this._config.offset;
+ }
+
+ return offset;
+ };
+
+ _proto._getPopperConfig = function _getPopperConfig() {
+ var popperConfig = {
+ placement: this._getPlacement(),
+ modifiers: {
+ offset: this._getOffset(),
+ flip: {
+ enabled: this._config.flip
+ },
+ preventOverflow: {
+ boundariesElement: this._config.boundary
+ }
+ } // Disable Popper.js if we have a static display
+
+ };
+
+ if (this._config.display === 'static') {
+ popperConfig.modifiers.applyStyle = {
+ enabled: false
+ };
+ }
+
+ return popperConfig;
+ } // Boosted mod
+ ;
+
+ _proto._addAccessibility = function _addAccessibility() {
+ $(this._element).attr('aria-haspopup', true); // ensure that dropdown-menu have the role menu
+
+ $(this._element).parent().children(Selector$4.MENU).attr('role', 'menu'); // ensure that dropdown-itm's have the role menuitem
+
+ $(this._element).parent().children(Selector$4.MENU).children('.dropdown-item').attr('role', 'menuitem');
+ } // end mod
+ // Static
+ ;
+
+ Dropdown._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$4);
+
+ var _config = typeof config === 'object' ? config : null;
+
+ if (!data) {
+ data = new Dropdown(this, _config);
+ $(this).data(DATA_KEY$4, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ Dropdown._clearMenus = function _clearMenus(event) {
+ if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
+ return;
+ }
+
+ var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));
+
+ for (var i = 0, len = toggles.length; i < len; i++) {
+ var parent = Dropdown._getParentFromElement(toggles[i]);
+
+ var context = $(toggles[i]).data(DATA_KEY$4);
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
+
+ if (event && event.type === 'click') {
+ relatedTarget.clickEvent = event;
+ }
+
+ if (!context) {
+ continue;
+ }
+
+ var dropdownMenu = context._menu;
+
+ if (!$(parent).hasClass(ClassName$4.SHOW)) {
+ continue;
+ }
+
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
+ continue;
+ }
+
+ var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
+ $(parent).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ continue;
+ } // If this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+
+
+ if ('ontouchstart' in document.documentElement) {
+ $(document.body).children().off('mouseover', null, $.noop);
+ }
+
+ toggles[i].setAttribute('aria-expanded', 'false');
+ $(dropdownMenu).removeClass(ClassName$4.SHOW);
+ $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
+ }
+ };
+
+ Dropdown._getParentFromElement = function _getParentFromElement(element) {
+ var parent;
+ var selector = Util.getSelectorFromElement(element);
+
+ if (selector) {
+ parent = document.querySelector(selector);
+ }
+
+ return parent || element.parentNode;
+ } // eslint-disable-next-line complexity
+ ;
+
+ Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
+ // If not input/textarea:
+ // - And not a key in REGEXP_KEYDOWN => not a dropdown command
+ // If input/textarea:
+ // - If space key => not a dropdown command
+ // - If key is other than escape
+ // - If key is not up or down => not a dropdown command
+ // - If trigger inside the menu => not a dropdown command
+ if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
+ return;
+ }
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {
+ return;
+ }
+
+ var parent = Dropdown._getParentFromElement(this);
+
+ var isActive = $(parent).hasClass(ClassName$4.SHOW);
+
+ if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
+ if (event.which === ESCAPE_KEYCODE) {
+ var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
+ $(toggle).trigger('focus');
+ }
+
+ $(this).trigger('click');
+ return;
+ }
+
+ var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));
+
+ if (items.length === 0) {
+ return;
+ }
+
+ var index = items.indexOf(event.target);
+
+ if (event.which === ARROW_UP_KEYCODE && index > 0) {
+ // Up
+ index--;
+ }
+
+ if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
+ // Down
+ index++;
+ }
+
+ if (index < 0) {
+ index = 0;
+ }
+
+ items[index].focus();
+ };
+
+ _createClass(Dropdown, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$4;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$2;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$2;
+ }
+ }]);
+
+ return Dropdown;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ Dropdown._jQueryInterface.call($(this), 'toggle');
+ }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {
+ e.stopPropagation();
+ }) // Boosted mod
+ .on('DOMContentLoaded', function () {
+ // Instanciate every dropdown in the DOM
+ Dropdown._jQueryInterface.call($(Selector$4.DATA_TOGGLE), 'init');
+ }); // end mod
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$4] = Dropdown._jQueryInterface;
+ $.fn[NAME$4].Constructor = Dropdown;
+
+ $.fn[NAME$4].noConflict = function () {
+ $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;
+ return Dropdown._jQueryInterface;
+ };
+
+ /* eslint no-magic-numbers: ["error", { "ignore": [1,2] }] */
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$5 = 'megamenu';
+ var VERSION$5 = '4.3.1';
+ var DATA_KEY$5 = 'bs.megamenu';
+ var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];
+ var ARROW_LEFT_KEYCODE$1 = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_RIGHT_KEYCODE$1 = 39; // KeyboardEvent.which value for right arrow key
+
+ var ARROW_UP_KEYCODE$1 = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_DOWN_KEYCODE$1 = 40; // KeyboardEvent.which value for down arrow key
+
+ var TIMEOUT = 1000; // Timeout befor focusing first element
+
+ var PERCENTAGE = 100; // Width slide proportion
+
+ var SPLITLENGHT = 4;
+ var ClassName$5 = {
+ TRANSITIONING: 'transitioning'
+ };
+ var Selector$5 = {
+ MEGAMENU: '.mega-menu',
+ ROOT_NAV: '.mega-menu > .navbar-nav',
+ MEGAMENU_PANEL: '.mega-menu-panel',
+ MEGAMENU_NAV: '.nav-link + .navbar-nav',
+ NAV_MENU: '.navbar-nav',
+ NAV_ITEM: '.nav-item',
+ NAV_LINK: '.nav-link',
+ NAV_LINK_COLLAPSE: '.nav-link[data-toggle=collapse]',
+ NAV_LINK_BACK: '.nav-link.back',
+ NAV_LINK_EXPANDED: '.nav-link[aria-expanded=true]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var MegaMenu =
+ /*#__PURE__*/
+ function () {
+ function MegaMenu(element, config) {
+ this._element = element;
+ this._$navLinks = $(this._element).find(Selector$5.NAV_LINK);
+ this._$goForwardLinks = $(this._element).find(Selector$5.MEGAMENU_NAV).prev(Selector$5.NAV_LINK);
+ this._$goBackLinks = $(this._element).find(Selector$5.NAV_LINK_BACK);
+ this._$topCollapseMenus = $(this._element).find(Selector$5.MEGAMENU_PANEL);
+ this._$navLinkCollapses = $(this._element).find(Selector$5.NAV_LINK_COLLAPSE);
+ this._config = config;
+
+ if (typeof this._config.noFocus === 'undefined') {
+ this._config.noFocus = false;
+ }
+
+ this._addEventListeners();
+
+ this._addAriaAttributes(this._element);
+
+ this.goTo = this._initPosition;
+ } // getters
+
+
+ var _proto = MegaMenu.prototype;
+
+ // public
+ // private
+ _proto._addEventListeners = function _addEventListeners() {
+ var _this = this;
+
+ this._$goForwardLinks.on('click', function (event) {
+ return _this._goForward(event);
+ });
+
+ this._$goBackLinks.on('click', function (event) {
+ return _this._goBackward(event);
+ });
+
+ this._$navLinks.on('keydown', function (event) {
+ return _this._manageKeyDown(event);
+ });
+
+ if (!this._config.noFocus) {
+ this._$topCollapseMenus.on('shown.bs.collapse', this._collapseFocus);
+ }
+
+ this._$navLinkCollapses.on('click', function (event) {
+ return _this._handleCollapseToggle(event);
+ });
+ };
+
+ _proto._addAriaAttributes = function _addAriaAttributes(element) {
+ var $subNavs = $(element).find('.nav-link + .navbar-nav');
+ $(element).attr('role', 'application');
+ $(element).find('> .navbar-nav').attr('role', 'menu');
+ $(element).find(Selector$5.MEGAMENU_PANEL).attr('role', 'menu');
+ $(element).find('.nav-link[data-toggle=collapse]').attr('role', 'menuitem');
+ $(element).find(Selector$5.NAV_LINK_BACK).attr({
+ 'aria-hidden': true
+ });
+ $(element).find(Selector$5.NAV_ITEM).attr('role', 'presentation');
+ $subNavs.each(function () {
+ var navId = Util.getUID(NAME$5);
+ var $thisNavToggler = $(this).prev(Selector$5.NAV_LINK);
+ var $thisNav = $(this);
+ var $thisNavBackLink = $thisNav.find(Selector$5.NAV_LINK_BACK);
+ var $topMenu = $(this).closest(Selector$5.NAV_MENU).parent().closest(Selector$5.NAV_MENU).prev(Selector$5.NAV_LINK);
+ var goBackLabel = "go back to " + $topMenu.text() + " menu";
+
+ if (!$topMenu.length) {
+ goBackLabel = "go back to " + $(this).closest(Selector$5.MEGAMENU_PANEL).prev(Selector$5.NAV_LINK).text() + " menu";
+ }
+
+ $thisNav.attr({
+ id: navId,
+ role: 'menu'
+ });
+ $thisNavToggler.attr({
+ role: 'menuitem',
+ 'aria-controls': navId,
+ 'aria-expanded': false,
+ 'aria-haspopup': true
+ });
+ $thisNavBackLink.attr({
+ role: 'menuitem',
+ 'aria-controls': navId,
+ 'aria-label': goBackLabel
+ });
+ });
+ };
+
+ _proto._initPosition = function _initPosition(target) {
+ var _this2 = this;
+
+ if (!$(target).length) {
+ return;
+ }
+
+ var $target = $(target).first();
+ var position = $target.parents().index(this._element);
+ var rootPosition = $('.mega-menu-panel .nav-link').first().parents().index($('.mega-menu'));
+ var translatePercentage = -(position - rootPosition) * PERCENTAGE / 2;
+ var $thisNav = $target.closest(Selector$5.NAV_MENU);
+ var $rootNav = $(Selector$5.ROOT_NAV);
+ $rootNav.addClass(ClassName$5.TRANSITIONING); // open collapse
+
+ if ($target.attr('data-toggle') === 'collapse') {
+ $target.siblings(Selector$5.MEGAMENU_PANEL).collapse('show');
+
+ this._$topCollapseMenus.not($target.siblings(Selector$5.MEGAMENU_PANEL)).collapse('hide');
+
+ $(this._element).height('auto');
+ $rootNav.css('transform', 'translateX(0%)');
+ } else {
+ $target.closest(Selector$5.MEGAMENU_PANEL).collapse('show');
+
+ this._$topCollapseMenus.not($target.closest(Selector$5.MEGAMENU_PANEL)).collapse('hide'); // show menu and hide other
+
+
+ $target.parents(Selector$5.NAV_MENU).show(); // set aria on parent links
+
+ $target.parents(Selector$5.NAV_ITEM).find('> .nav-link').not($target).attr({
+ tabindex: -1,
+ 'aria-hidden': true,
+ 'aria-expanded': true
+ }); // translate to pos
+
+ $rootNav.css('transform', "translateX(" + translatePercentage + "%)");
+
+ if (translatePercentage) {
+ // adapt main collapse height to target height
+ $(this._element).height($thisNav.height());
+ } else {
+ $(this._element).height('auto');
+ }
+ } // set focus on target link
+
+
+ setTimeout(function () {
+ if (!_this2._config.noFocus) {
+ // set focus on target link
+ $target.trigger('focus');
+ }
+
+ $rootNav.removeClass(ClassName$5.TRANSITIONING);
+ }, TIMEOUT);
+ };
+
+ _proto._manageKeyDown = function _manageKeyDown(event) {
+ var $thisTarget = $(event.target); // test key code
+
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ } // proceed according to key code
+
+
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE$1:
+ this._goBackward(event);
+
+ break;
+
+ case ARROW_RIGHT_KEYCODE$1:
+ this._goForward(event);
+
+ break;
+
+ case ARROW_UP_KEYCODE$1:
+ // focus prev nav link
+ $thisTarget.parent().prev().find('>.nav-link').not(Selector$5.NAV_LINK_BACK).trigger('focus');
+ break;
+
+ case ARROW_DOWN_KEYCODE$1:
+ // focus next nav link
+ $thisTarget.parent().next().find('>.nav-link').trigger('focus');
+ break;
+
+ default:
+ }
+ };
+
+ _proto._collapseFocus = function _collapseFocus() {
+ $(this).find(Selector$5.NAV_LINK).not(Selector$5.NAV_LINK_BACK).first().trigger('focus');
+ };
+
+ _proto._handleCollapseToggle = function _handleCollapseToggle(e) {
+ var $this = $(e.target);
+ var $thisCollapse = $($this.attr('href'));
+
+ this._$topCollapseMenus.not($thisCollapse).collapse('hide');
+ };
+
+ _proto._goForward = function _goForward(e) {
+ e.preventDefault();
+ var $this = $(e.target);
+ var $thisNav = $this.closest(Selector$5.NAV_MENU);
+ var $targetNav = $this.next(Selector$5.NAV_MENU);
+ var $rootNav = $(Selector$5.ROOT_NAV);
+ var $thisNavToggler = $this;
+ var currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10);
+ var navWidth = $rootNav.width();
+ var currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth;
+
+ if (!$this.next(Selector$5.NAV_MENU).length || $rootNav.hasClass(ClassName$5.TRANSITIONING)) {
+ return false;
+ }
+
+ $rootNav.addClass(ClassName$5.TRANSITIONING); // hide all nav on same level
+
+ $thisNav.find(Selector$5.NAV_MENU).hide(); // show target navbar-nav
+
+ $targetNav.show(); // adapt main collapse height to target height
+
+ $(Selector$5.MEGAMENU).height($targetNav.height()); // make only visible elements focusable
+
+ if (!currentTranslatePercentage) {
+ $rootNav.find('>.nav-item .nav-link').attr({
+ tabindex: -1,
+ 'aria-hidden': true
+ });
+ }
+
+ $thisNav.find(Selector$5.NAV_LINK).attr({
+ tabindex: -1,
+ 'aria-hidden': true
+ });
+ $targetNav.find(Selector$5.NAV_LINK).attr({
+ tabindex: 0,
+ 'aria-hidden': false
+ }); // translate menu
+
+ $rootNav.css('transform', "translateX(" + (currentTranslatePercentage - PERCENTAGE) + "%)"); // focus on target nav first item
+
+ $rootNav.one('transitionend', function () {
+ $thisNavToggler.attr('aria-expanded', true);
+ $targetNav.find(Selector$5.NAV_LINK).not(Selector$5.NAV_LINK_BACK).first().trigger('focus');
+ $rootNav.removeClass(ClassName$5.TRANSITIONING);
+ });
+ return true;
+ };
+
+ _proto._goBackward = function _goBackward(e) {
+ e.preventDefault();
+ var $this = $(e.target);
+ var $thisNav = $this.closest(Selector$5.NAV_MENU);
+ var $targetNav = $thisNav.parent().closest(Selector$5.NAV_MENU);
+ var $rootNav = $(Selector$5.ROOT_NAV);
+ var $targetNavToggler = $targetNav.find(Selector$5.NAV_LINK_EXPANDED);
+ var currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10);
+ var navWidth = $rootNav.width();
+ var currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth;
+
+ if (!currentTranslatePercentage || $rootNav.hasClass(ClassName$5.TRANSITIONING)) {
+ return false;
+ }
+
+ $rootNav.addClass(ClassName$5.TRANSITIONING); // make only visible elements focusable
+
+ $targetNav.find(Selector$5.NAV_LINK).attr({
+ tabindex: 0,
+ 'aria-hidden': false
+ });
+
+ if (currentTranslatePercentage === -PERCENTAGE) {
+ // reset main collapse height
+ $(Selector$5.MEGAMENU).css('height', 'auto');
+ $rootNav.find('>.nav-item .nav-link').attr({
+ tabindex: 0,
+ 'aria-hidden': false
+ });
+ } // translate menu
+
+
+ $rootNav.css('transform', "translateX(" + (currentTranslatePercentage + PERCENTAGE) + "%)"); // focus on target nav first item
+
+ $rootNav.one('transitionend', function () {
+ $targetNavToggler.attr('aria-expanded', false);
+ $targetNavToggler.trigger('focus');
+ $thisNav.hide();
+ $rootNav.removeClass(ClassName$5.TRANSITIONING);
+ });
+ return true;
+ } // static
+ ;
+
+ MegaMenu._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ if (!$(this).is(Selector$5.MEGAMENU)) {
+ throw new TypeError('Element is not a mega menu');
+ }
+
+ if (!config) {
+ config = {};
+ } else if (config.noFocus && typeof config.noFocus !== 'boolean') {
+ // param = true
+ throw new TypeError('no-focus parameter must be boolean');
+ }
+
+ var data = $(this).data(DATA_KEY$5);
+
+ if (!data) {
+ data = new MegaMenu(this, config);
+ $(this).data(DATA_KEY$5, data);
+ }
+
+ if (config.target) {
+ if (typeof config.target !== 'string' || !/^[.#].*/.test(config.target)) {
+ throw new TypeError("Selector \"" + config.target + "\" is not supported");
+ }
+
+ data.goTo(config.target);
+ }
+ });
+ };
+
+ _createClass(MegaMenu, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$5;
+ }
+ }]);
+
+ return MegaMenu;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$5] = MegaMenu._jQueryInterface;
+ $.fn[NAME$5].Constructor = MegaMenu;
+
+ $.fn[NAME$5].noConflict = function () {
+ $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;
+ return MegaMenu._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$6 = 'modal';
+ var VERSION$6 = '4.3.1';
+ var DATA_KEY$6 = 'bs.modal';
+ var EVENT_KEY$5 = "." + DATA_KEY$6;
+ var DATA_API_KEY$5 = '.data-api';
+ var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
+ var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var Default$3 = {
+ backdrop: true,
+ keyboard: true,
+ focus: true,
+ show: true
+ };
+ var DefaultType$3 = {
+ backdrop: '(boolean|string)',
+ keyboard: 'boolean',
+ focus: 'boolean',
+ show: 'boolean'
+ };
+ var Event$5 = {
+ HIDE: "hide" + EVENT_KEY$5,
+ HIDDEN: "hidden" + EVENT_KEY$5,
+ SHOW: "show" + EVENT_KEY$5,
+ SHOWN: "shown" + EVENT_KEY$5,
+ FOCUSIN: "focusin" + EVENT_KEY$5,
+ RESIZE: "resize" + EVENT_KEY$5,
+ CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5,
+ KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5,
+ MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5,
+ MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5,
+ CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5
+ };
+ var ClassName$6 = {
+ SCROLLABLE: 'modal-dialog-scrollable',
+ SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
+ BACKDROP: 'modal-backdrop',
+ OPEN: 'modal-open',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$6 = {
+ DIALOG: '.modal-dialog',
+ MODAL_BODY: '.modal-body',
+ DATA_TOGGLE: '[data-toggle="modal"]',
+ DATA_DISMISS: '[data-dismiss="modal"]',
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .position-fixed'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Modal =
+ /*#__PURE__*/
+ function () {
+ function Modal(element, config) {
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._dialog = element.querySelector(Selector$6.DIALOG);
+ this._backdrop = null;
+ this._isShown = false;
+ this._isBodyOverflowing = false;
+ this._ignoreBackdropClick = false;
+ this._isTransitioning = false;
+ this._scrollbarWidth = 0; // Boosted mod
+
+ this._addAria(); // end mod
+
+ } // Getters
+
+
+ var _proto = Modal.prototype;
+
+ // Public
+ _proto.toggle = function toggle(relatedTarget) {
+ return this._isShown ? this.hide() : this.show(relatedTarget);
+ };
+
+ _proto.show = function show(relatedTarget) {
+ var _this = this;
+
+ if (this._isShown || this._isTransitioning) {
+ return;
+ }
+
+ if ($(this._element).hasClass(ClassName$6.FADE)) {
+ this._isTransitioning = true;
+ }
+
+ var showEvent = $.Event(Event$5.SHOW, {
+ relatedTarget: relatedTarget
+ });
+ $(this._element).trigger(showEvent);
+
+ if (this._isShown || showEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._isShown = true;
+
+ this._checkScrollbar();
+
+ this._setScrollbar();
+
+ this._setEscapeEvent();
+
+ $(this._element).on(Event$5.CLICK_DISMISS, Selector$6.DATA_DISMISS, function (event) {
+ return _this.hide(event);
+ });
+ $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {
+ $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {
+ if ($(event.target).is(_this._element)) {
+ _this._ignoreBackdropClick = true;
+ }
+ });
+ });
+
+ this._showBackdrop(function () {
+ return _this._showElement(relatedTarget);
+ });
+ };
+
+ _proto.hide = function hide(event) {
+ var _this2 = this;
+
+ if (event) {
+ event.preventDefault();
+ }
+
+ if (!this._isShown || this._isTransitioning) {
+ return;
+ }
+
+ var hideEvent = $.Event(Event$5.HIDE);
+ $(this._element).trigger(hideEvent);
+
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ this._isShown = false;
+ var transition = $(this._element).hasClass(ClassName$6.FADE);
+
+ if (transition) {
+ this._isTransitioning = true;
+ }
+
+ this._setEscapeEvent();
+
+ $(document).off(Event$5.FOCUSIN);
+ $(this._element).removeClass(ClassName$6.SHOW);
+ $(this._element).off(Event$5.CLICK_DISMISS);
+ $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);
+
+ if (transition) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this2._hideModal(event);
+ }).emulateTransitionEnd(transitionDuration);
+ } else {
+ this._hideModal();
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ [window, this._element, this._dialog].forEach(function (htmlElement) {
+ return $(htmlElement).off(EVENT_KEY$5);
+ });
+ /**
+ * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
+ * Do not move `document` in `htmlElements` array
+ * It will remove `Event.CLICK_DATA_API` event that should remain
+ */
+
+ $(document).off(Event$5.FOCUSIN);
+ $.removeData(this._element, DATA_KEY$6);
+ this._config = null;
+ this._element = null;
+ this._dialog = null;
+ this._backdrop = null;
+ this._isShown = null;
+ this._isBodyOverflowing = null;
+ this._ignoreBackdropClick = null;
+ this._isTransitioning = null;
+ this._scrollbarWidth = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$3, config);
+ Util.typeCheckConfig(NAME$6, config, DefaultType$3);
+ return config;
+ };
+
+ _proto._showElement = function _showElement(relatedTarget) {
+ var _this3 = this;
+
+ var transition = $(this._element).hasClass(ClassName$6.FADE);
+
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
+ // Don't move modal's DOM position
+ document.body.appendChild(this._element);
+ }
+
+ this._element.style.display = 'block';
+
+ this._element.removeAttribute('aria-hidden');
+
+ this._element.setAttribute('aria-modal', true);
+
+ if ($(this._dialog).hasClass(ClassName$6.SCROLLABLE)) {
+ this._dialog.querySelector(Selector$6.MODAL_BODY).scrollTop = 0;
+ } else {
+ this._element.scrollTop = 0;
+ }
+
+ if (transition) {
+ Util.reflow(this._element);
+ }
+
+ $(this._element).addClass(ClassName$6.SHOW);
+
+ if (this._config.focus) {
+ this._enforceFocus();
+ }
+
+ var shownEvent = $.Event(Event$5.SHOWN, {
+ relatedTarget: relatedTarget
+ });
+
+ var transitionComplete = function transitionComplete() {
+ if (_this3._config.focus) {
+ _this3._element.focus();
+ }
+
+ _this3._isTransitioning = false;
+ $(_this3._element).trigger(shownEvent);
+ };
+
+ if (transition) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
+ $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
+ } else {
+ transitionComplete();
+ }
+ };
+
+ _proto._enforceFocus = function _enforceFocus() {
+ var _this4 = this;
+
+ $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
+ .on(Event$5.FOCUSIN, function (event) {
+ if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
+ _this4._element.focus();
+ }
+ });
+ };
+
+ _proto._setEscapeEvent = function _setEscapeEvent() {
+ var _this5 = this;
+
+ if (this._isShown && this._config.keyboard) {
+ $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
+ if (event.which === ESCAPE_KEYCODE$1) {
+ event.preventDefault();
+
+ _this5.hide();
+ }
+ });
+ } else if (!this._isShown) {
+ $(this._element).off(Event$5.KEYDOWN_DISMISS);
+ }
+ };
+
+ _proto._hideModal = function _hideModal() {
+ var _this6 = this;
+
+ this._element.style.display = 'none';
+
+ this._element.setAttribute('aria-hidden', true);
+
+ this._element.removeAttribute('aria-modal');
+
+ this._isTransitioning = false;
+
+ this._showBackdrop(function () {
+ $(document.body).removeClass(ClassName$6.OPEN);
+
+ _this6._resetScrollbar();
+
+ $(_this6._element).trigger(Event$5.HIDDEN);
+ });
+ };
+
+ _proto._removeBackdrop = function _removeBackdrop() {
+ if (this._backdrop) {
+ $(this._backdrop).remove();
+ this._backdrop = null;
+ }
+ };
+
+ _proto._showBackdrop = function _showBackdrop(callback) {
+ var _this7 = this;
+
+ var animate = $(this._element).hasClass(ClassName$6.FADE) ? ClassName$6.FADE : '';
+
+ if (this._isShown && this._config.backdrop) {
+ this._backdrop = document.createElement('div');
+ this._backdrop.className = ClassName$6.BACKDROP;
+
+ if (animate) {
+ this._backdrop.classList.add(animate);
+ }
+
+ $(this._backdrop).appendTo(document.body);
+ $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
+ if (_this7._ignoreBackdropClick) {
+ _this7._ignoreBackdropClick = false;
+ return;
+ }
+
+ if (event.target !== event.currentTarget) {
+ return;
+ }
+
+ if (_this7._config.backdrop === 'static') {
+ _this7._element.focus();
+ } else {
+ _this7.hide();
+ }
+ });
+
+ if (animate) {
+ Util.reflow(this._backdrop);
+ }
+
+ $(this._backdrop).addClass(ClassName$6.SHOW);
+
+ if (!callback) {
+ return;
+ }
+
+ if (!animate) {
+ callback();
+ return;
+ }
+
+ var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
+ $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
+ } else if (!this._isShown && this._backdrop) {
+ $(this._backdrop).removeClass(ClassName$6.SHOW);
+
+ var callbackRemove = function callbackRemove() {
+ _this7._removeBackdrop();
+
+ if (callback) {
+ callback();
+ }
+ };
+
+ if ($(this._element).hasClass(ClassName$6.FADE)) {
+ var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
+
+ $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
+ } else {
+ callbackRemove();
+ }
+ } else if (callback) {
+ callback();
+ }
+ } // ----------------------------------------------------------------------
+ // the following methods are used to handle overflowing modals
+ // todo (fat): these should probably be refactored out of modal.js
+ // ----------------------------------------------------------------------
+ ;
+
+ _proto._checkScrollbar = function _checkScrollbar() {
+ var rect = document.body.getBoundingClientRect();
+ this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
+ this._scrollbarWidth = this._getScrollbarWidth();
+ };
+
+ _proto._setScrollbar = function _setScrollbar() {
+ var _this8 = this;
+
+ if (this._isBodyOverflowing) {
+ // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
+ // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
+ var fixedContent = [].slice.call(document.querySelectorAll(Selector$6.FIXED_CONTENT)); // Adjust fixed content padding
+
+ $(fixedContent).each(function (index, element) {
+ var actualRight = element.style.right;
+ var calculatedRight = $(element).css('right');
+ $(element).data('right', actualRight).css('right', parseFloat(calculatedRight) + _this8._scrollbarWidth + "px");
+ }); // Adjust body padding
+
+ var actualPadding = document.body.style.paddingRight;
+ var calculatedPadding = $(document.body).css('padding-right');
+ $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
+ }
+
+ $(document.body).addClass(ClassName$6.OPEN);
+ };
+
+ _proto._resetScrollbar = function _resetScrollbar() {
+ // Restore fixed content padding
+ var fixedContent = [].slice.call(document.querySelectorAll(Selector$6.FIXED_CONTENT));
+ $(fixedContent).each(function (index, element) {
+ var right = $(element).data('right');
+ $(element).removeData('right');
+ element.style.right = right ? right : '';
+ }); // Restore body padding
+
+ var padding = $(document.body).data('padding-right');
+ $(document.body).removeData('padding-right');
+ document.body.style.paddingRight = padding ? padding : '';
+ };
+
+ _proto._getScrollbarWidth = function _getScrollbarWidth() {
+ // thx d.walsh
+ var scrollDiv = document.createElement('div');
+ scrollDiv.className = ClassName$6.SCROLLBAR_MEASURER;
+ document.body.appendChild(scrollDiv);
+ var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
+ document.body.removeChild(scrollDiv);
+ return scrollbarWidth;
+ } // Boosted mod
+ ;
+
+ _proto._addAria = function _addAria() {
+ var $ModalPanel = $(this._element);
+ var $ModalTitle = $ModalPanel.find('.modal-title');
+ var $ModalDialog = $ModalPanel.find('.modal-dialog');
+ $ModalPanel.attr({
+ role: 'dialog',
+ 'aria-modal': true
+ });
+
+ if ($ModalTitle) {
+ var ModalTitleId = $ModalTitle.attr('id');
+
+ if (ModalTitleId) {
+ $ModalPanel.attr({
+ 'aria-labelledby': ModalTitleId
+ });
+ }
+ }
+
+ if ($ModalDialog) {
+ $ModalDialog.attr('role', 'document');
+ }
+ } // end mod
+ // Static
+ ;
+
+ Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$6);
+
+ var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});
+
+ if (!data) {
+ data = new Modal(this, _config);
+ $(this).data(DATA_KEY$6, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config](relatedTarget);
+ } else if (_config.show) {
+ data.show(relatedTarget);
+ }
+ });
+ };
+
+ _createClass(Modal, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$6;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$3;
+ }
+ }]);
+
+ return Modal;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$5.CLICK_DATA_API, Selector$6.DATA_TOGGLE, function (event) {
+ var _this9 = this;
+
+ var target;
+ var selector = Util.getSelectorFromElement(this);
+
+ if (selector) {
+ target = document.querySelector(selector);
+ }
+
+ var config = $(target).data(DATA_KEY$6) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
+
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
+ event.preventDefault();
+ }
+
+ var $target = $(target).one(Event$5.SHOW, function (showEvent) {
+ if (showEvent.isDefaultPrevented()) {
+ // Only register focus restorer if modal will actually get shown
+ return;
+ }
+
+ $target.one(Event$5.HIDDEN, function () {
+ if ($(_this9).is(':visible')) {
+ _this9.focus();
+ }
+ });
+ });
+
+ Modal._jQueryInterface.call($(target), config, this);
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$6] = Modal._jQueryInterface;
+ $.fn[NAME$6].Constructor = Modal;
+
+ $.fn[NAME$6].noConflict = function () {
+ $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;
+ return Modal._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$7 = 'navbar';
+ var VERSION$7 = '4.3.1';
+ var DATA_KEY$7 = 'bs.navbar';
+ var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
+ var BREAKPOINT = 768;
+ var Default$4 = {
+ sticky: false,
+ trigger: ''
+ };
+ var DefaultType$4 = {
+ sticky: 'boolean',
+ trigger: 'string'
+ };
+ var Selector$7 = {
+ SUPRA_BAR: '.navbar.supra',
+ MEGAMENU_PANEL: '.mega-menu.panel'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Navbar =
+ /*#__PURE__*/
+ function () {
+ function Navbar(element, config) {
+ var _this = this;
+
+ this._element = element;
+ this._supraBar = element.querySelector(Selector$7.SUPRA_BAR);
+ this._config = this._getConfig(config);
+ this._initialHeight = $(this._element).outerHeight();
+ this._initialSupraHeight = $(this._supraBar).outerHeight();
+
+ this._addAria();
+
+ if (this._config.sticky) {
+ $(this._element).addClass('fixed-top');
+ $(Selector$7.MEGAMENU_PANEL).addClass('sticky');
+ $(document.body).css('padding-top', this._initialHeight);
+ $(window).on('scroll', function () {
+ var Scroll = $(window).scrollTop();
+
+ if (Scroll > 0) {
+ $(_this._element).addClass('minimized');
+ } else {
+ $(_this._element).removeClass('minimized');
+ }
+ });
+ }
+
+ if (this._config.hideSupra) {
+ $(window).on('scroll', function () {
+ if ($(window).innerWidth() < BREAKPOINT) {
+ return;
+ }
+
+ var Scroll = $(window).scrollTop();
+
+ if (Scroll > 0) {
+ $(Selector$7.SUPRA_BAR).hide();
+ } else {
+ $(Selector$7.SUPRA_BAR).show();
+ }
+ });
+ }
+ } // getters
+
+
+ var _proto = Navbar.prototype;
+
+ // private
+ _proto._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default$4, config);
+ Util.typeCheckConfig(NAME$7, config, DefaultType$4);
+ return config;
+ };
+
+ _proto._addAria = function _addAria() {
+ $(this._element).find('.navbar .nav-link[data-toggle]').attr('aria-haspopup', true);
+ } // static
+ ;
+
+ Navbar._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$7);
+
+ var _config = _objectSpread({}, Default$4, $(this).data(), typeof config === 'object' && config ? config : {});
+
+ if (!data) {
+ data = new Navbar(this, _config);
+ $(this).data(DATA_KEY$7, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Navbar, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$7;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$4;
+ }
+ }]);
+
+ return Navbar;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$7] = Navbar._jQueryInterface;
+ $.fn[NAME$7].Constructor = Navbar;
+
+ $.fn[NAME$7].noConflict = function () {
+ $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;
+ return Navbar._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$8 = 'otab';
+ var VERSION$8 = '4.3.1';
+ var DATA_KEY$8 = 'bs.otab';
+ var EVENT_KEY$6 = "." + DATA_KEY$8;
+ var DATA_API_KEY$6 = '.data-api';
+ var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];
+ var DEFAULT_THRESHOLD = 2;
+ var Event$6 = {
+ CLICK_DATA_API: "click" + EVENT_KEY$6 + DATA_API_KEY$6
+ };
+ var ClassName$7 = {
+ ACTIVE: 'active',
+ SHOW: 'show',
+ ACCORDION_LAYOUT: 'accordion-layout'
+ };
+ var Selector$8 = {
+ OTAB_HEADING: '.o-tab-heading',
+ OTAB_CONTENT: '.o-tab-content'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Otab =
+ /*#__PURE__*/
+ function () {
+ function Otab(element) {
+ this._element = element;
+
+ this._addAccessibility();
+
+ if ($(this._element).parent().find(Selector$8.OTAB_HEADING).length > DEFAULT_THRESHOLD) {
+ $(this._element).parent().addClass(ClassName$7.ACCORDION_LAYOUT);
+ }
+ } // getters
+
+
+ var _proto = Otab.prototype;
+
+ // public
+ _proto.show = function show() {
+ var $element = $(this._element);
+
+ if ($element.next().hasClass(ClassName$7.SHOW)) {
+ return;
+ } // from parent remove all tab-content show classes
+
+
+ $element.parent().find(Selector$8.OTAB_CONTENT).removeClass(ClassName$7.SHOW); // remove all aria-expanded=true
+
+ $element.parent().find('[aria-expanded="true"]').attr('aria-expanded', false); // add show class to next tab-content
+
+ $element.next().addClass(ClassName$7.SHOW); // add aria-expanded=true to element
+
+ $element.attr('aria-expanded', true);
+ } // private
+ ;
+
+ _proto._addAccessibility = function _addAccessibility() {
+ var $tab = $(this._element);
+ var $tabpanel = $tab.next();
+ $tab.attr('id', Util.getUID(NAME$8));
+ $tabpanel.attr('id', Util.getUID(NAME$8));
+ $tab.attr({
+ 'aria-controls': $tabpanel.attr('id'),
+ role: 'tab'
+ });
+ $tabpanel.attr({
+ 'aria-labelledby': $tab.attr('id'),
+ role: 'tabpanel',
+ tabindex: 0
+ });
+
+ if ($tabpanel.hasClass(ClassName$7.SHOW)) {
+ $tab.attr('aria-expanded', true);
+ } else {
+ $tab.attr('aria-expanded', false);
+ }
+ } // static
+ ;
+
+ Otab._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY$8);
+
+ if (!data) {
+ data = new Otab(this);
+ $this.data(DATA_KEY$8, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Otab, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$8;
+ }
+ }]);
+
+ return Otab;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on('DOMContentLoaded', function () {
+ Otab._jQueryInterface.call($(Selector$8.OTAB_HEADING), 'init');
+ }).on(Event$6.CLICK_DATA_API, Selector$8.OTAB_HEADING, function (event) {
+ event.preventDefault();
+
+ Otab._jQueryInterface.call($(this), ClassName$7.SHOW);
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$8] = Otab._jQueryInterface;
+ $.fn[NAME$8].Constructor = Otab;
+
+ $.fn[NAME$8].noConflict = function () {
+ $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;
+ return Otab._jQueryInterface;
+ };
+
+ /**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): tools/sanitizer.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+ var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
+ var DefaultWhitelist = {
+ // Global attributes allowed on any supplied element below.
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
+ a: ['target', 'href', 'title', 'rel'],
+ area: [],
+ b: [],
+ br: [],
+ col: [],
+ code: [],
+ div: [],
+ em: [],
+ hr: [],
+ h1: [],
+ h2: [],
+ h3: [],
+ h4: [],
+ h5: [],
+ h6: [],
+ i: [],
+ img: ['src', 'alt', 'title', 'width', 'height'],
+ li: [],
+ ol: [],
+ p: [],
+ pre: [],
+ s: [],
+ small: [],
+ span: [],
+ sub: [],
+ sup: [],
+ strong: [],
+ u: [],
+ ul: []
+ /**
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+
+ };
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
+ /**
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
+
+ function allowedAttribute(attr, allowedAttributeList) {
+ var attrName = attr.nodeName.toLowerCase();
+
+ if (allowedAttributeList.indexOf(attrName) !== -1) {
+ if (uriAttrs.indexOf(attrName) !== -1) {
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
+ }
+
+ return true;
+ }
+
+ var regExp = allowedAttributeList.filter(function (attrRegex) {
+ return attrRegex instanceof RegExp;
+ }); // Check if a regular expression validates the attribute.
+
+ for (var i = 0, l = regExp.length; i < l; i++) {
+ if (attrName.match(regExp[i])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
+ if (unsafeHtml.length === 0) {
+ return unsafeHtml;
+ }
+
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
+ return sanitizeFn(unsafeHtml);
+ }
+
+ var domParser = new window.DOMParser();
+ var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
+ var whitelistKeys = Object.keys(whiteList);
+ var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));
+
+ var _loop = function _loop(i, len) {
+ var el = elements[i];
+ var elName = el.nodeName.toLowerCase();
+
+ if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
+ el.parentNode.removeChild(el);
+ return "continue";
+ }
+
+ var attributeList = [].slice.call(el.attributes);
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
+ attributeList.forEach(function (attr) {
+ if (!allowedAttribute(attr, whitelistedAttributes)) {
+ el.removeAttribute(attr.nodeName);
+ }
+ });
+ };
+
+ for (var i = 0, len = elements.length; i < len; i++) {
+ var _ret = _loop(i, len);
+
+ if (_ret === "continue") continue;
+ }
+
+ return createdDocument.body.innerHTML;
+ }
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$9 = 'tooltip';
+ var VERSION$9 = '4.3.1';
+ var DATA_KEY$9 = 'bs.tooltip';
+ var EVENT_KEY$7 = "." + DATA_KEY$9;
+ var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];
+ var CLASS_PREFIX = 'bs-tooltip';
+ var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
+ var DefaultType$5 = {
+ animation: 'boolean',
+ template: 'string',
+ title: '(string|element|function)',
+ trigger: 'string',
+ delay: '(number|object)',
+ html: 'boolean',
+ selector: '(string|boolean)',
+ placement: '(string|function)',
+ offset: '(number|string|function)',
+ container: '(string|element|boolean)',
+ fallbackPlacement: '(string|array)',
+ boundary: '(string|element)',
+ sanitize: 'boolean',
+ sanitizeFn: '(null|function)',
+ whiteList: 'object'
+ };
+ var AttachmentMap$1 = {
+ AUTO: 'auto',
+ TOP: 'top',
+ RIGHT: 'right',
+ BOTTOM: 'bottom',
+ LEFT: 'left'
+ };
+ var Default$5 = {
+ animation: true,
+ template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ selector: false,
+ placement: 'top',
+ offset: 0,
+ container: false,
+ fallbackPlacement: 'flip',
+ boundary: 'scrollParent',
+ sanitize: true,
+ sanitizeFn: null,
+ whiteList: DefaultWhitelist
+ };
+ var HoverState = {
+ SHOW: 'show',
+ OUT: 'out'
+ };
+ var Event$7 = {
+ HIDE: "hide" + EVENT_KEY$7,
+ HIDDEN: "hidden" + EVENT_KEY$7,
+ SHOW: "show" + EVENT_KEY$7,
+ SHOWN: "shown" + EVENT_KEY$7,
+ INSERTED: "inserted" + EVENT_KEY$7,
+ CLICK: "click" + EVENT_KEY$7,
+ FOCUSIN: "focusin" + EVENT_KEY$7,
+ FOCUSOUT: "focusout" + EVENT_KEY$7,
+ MOUSEENTER: "mouseenter" + EVENT_KEY$7,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY$7
+ };
+ var ClassName$8 = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$9 = {
+ TOOLTIP: '.tooltip',
+ TOOLTIP_INNER: '.tooltip-inner',
+ ARROW: '.arrow'
+ };
+ var Trigger = {
+ HOVER: 'hover',
+ FOCUS: 'focus',
+ CLICK: 'click',
+ MANUAL: 'manual'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Tooltip =
+ /*#__PURE__*/
+ function () {
+ function Tooltip(element, config) {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
+ } // private
+
+
+ this._isEnabled = true;
+ this._timeout = 0;
+ this._hoverState = '';
+ this._activeTrigger = {};
+ this._popper = null; // Protected
+
+ this.element = element;
+ this.config = this._getConfig(config);
+ this.tip = null;
+
+ this._setListeners();
+ } // Getters
+
+
+ var _proto = Tooltip.prototype;
+
+ // Public
+ _proto.enable = function enable() {
+ this._isEnabled = true;
+ };
+
+ _proto.disable = function disable() {
+ this._isEnabled = false;
+ };
+
+ _proto.toggleEnabled = function toggleEnabled() {
+ this._isEnabled = !this._isEnabled;
+ };
+
+ _proto.toggle = function toggle(event) {
+ if (!this._isEnabled) {
+ return;
+ }
+
+ if (event) {
+ var dataKey = this.constructor.DATA_KEY;
+ var context = $(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+
+ context._activeTrigger.click = !context._activeTrigger.click;
+
+ if (context._isWithActiveTrigger()) {
+ context._enter(null, context);
+ } else {
+ context._leave(null, context);
+ }
+ } else {
+ if ($(this.getTipElement()).hasClass(ClassName$8.SHOW)) {
+ this._leave(null, this);
+
+ return;
+ }
+
+ this._enter(null, this);
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ clearTimeout(this._timeout);
+ $.removeData(this.element, this.constructor.DATA_KEY);
+ $(this.element).off(this.constructor.EVENT_KEY);
+ $(this.element).closest('.modal').off('hide.bs.modal');
+
+ if (this.tip) {
+ $(this.tip).remove();
+ }
+
+ this._isEnabled = null;
+ this._timeout = null;
+ this._hoverState = null;
+ this._activeTrigger = null;
+
+ if (this._popper !== null) {
+ this._popper.destroy();
+ }
+
+ this._popper = null;
+ this.element = null;
+ this.config = null;
+ this.tip = null;
+ };
+
+ _proto.show = function show() {
+ var _this = this;
+
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
+
+ var showEvent = $.Event(this.constructor.Event.SHOW);
+
+ if (this.isWithContent() && this._isEnabled) {
+ $(this.element).trigger(showEvent);
+ var shadowRoot = Util.findShadowRoot(this.element);
+ var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
+
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
+ return;
+ }
+
+ var tip = this.getTipElement();
+ var tipId = Util.getUID(this.constructor.NAME);
+ tip.setAttribute('id', tipId);
+ this.element.setAttribute('aria-describedby', tipId);
+ this.setContent();
+
+ if (this.config.animation) {
+ $(tip).addClass(ClassName$8.FADE);
+ }
+
+ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; // boosted mod fix rtl
+
+ var attachment = this._getAttachment(placement);
+
+ this.addAttachmentClass(attachment);
+
+ var container = this._getContainer();
+
+ $(tip).data(this.constructor.DATA_KEY, this);
+
+ if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
+ $(tip).appendTo(container);
+ }
+
+ $(this.element).trigger(this.constructor.Event.INSERTED); // boosted mod fix rtl
+
+ var dir = document.getElementsByTagName('html')[0].dir;
+
+ if (dir === 'rtl') {
+ var hash = {
+ right: 'left',
+ left: 'right'
+ };
+ attachment = attachment.replace(/right|left/g, function (matched) {
+ return hash[matched];
+ });
+ } // end mod
+
+
+ this._popper = new Popper(this.element, tip, {
+ placement: attachment,
+ modifiers: {
+ offset: this._getOffset(),
+ flip: {
+ behavior: this.config.fallbackPlacement
+ },
+ arrow: {
+ element: Selector$9.ARROW
+ },
+ preventOverflow: {
+ boundariesElement: this.config.boundary
+ }
+ },
+ onCreate: function onCreate(data) {
+ if (data.originalPlacement !== data.placement) {
+ _this._handlePopperPlacementChange(data);
+ }
+ },
+ onUpdate: function onUpdate(data) {
+ return _this._handlePopperPlacementChange(data);
+ }
+ });
+ $(tip).addClass(ClassName$8.SHOW); // If this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+
+ if ('ontouchstart' in document.documentElement) {
+ $(document.body).children().on('mouseover', null, $.noop);
+ }
+
+ var complete = function complete() {
+ if (_this.config.animation) {
+ _this._fixTransition();
+ }
+
+ var prevHoverState = _this._hoverState;
+ _this._hoverState = null;
+ $(_this.element).trigger(_this.constructor.Event.SHOWN);
+
+ if (prevHoverState === HoverState.OUT) {
+ _this._leave(null, _this);
+ }
+ };
+
+ if ($(this.tip).hasClass(ClassName$8.FADE)) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
+ $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ }
+ };
+
+ _proto.hide = function hide(callback) {
+ var _this2 = this;
+
+ var tip = this.getTipElement();
+ var hideEvent = $.Event(this.constructor.Event.HIDE);
+
+ var complete = function complete() {
+ if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
+ tip.parentNode.removeChild(tip);
+ }
+
+ _this2._cleanTipClass();
+
+ _this2.element.removeAttribute('aria-describedby');
+
+ $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
+
+ if (_this2._popper !== null) {
+ _this2._popper.destroy();
+ }
+
+ if (callback) {
+ callback();
+ }
+ };
+
+ $(this.element).trigger(hideEvent);
+
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ $(tip).removeClass(ClassName$8.SHOW); // If this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+
+ if ('ontouchstart' in document.documentElement) {
+ $(document.body).children().off('mouseover', null, $.noop);
+ }
+
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
+
+ if ($(this.tip).hasClass(ClassName$8.FADE)) {
+ var transitionDuration = Util.getTransitionDurationFromElement(tip);
+ $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+
+ this._hoverState = '';
+ };
+
+ _proto.update = function update() {
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ } // Protected
+ ;
+
+ _proto.isWithContent = function isWithContent() {
+ return Boolean(this.getTitle());
+ };
+
+ _proto.addAttachmentClass = function addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
+ };
+
+ _proto.getTipElement = function getTipElement() {
+ this.tip = this.tip || $(this.config.template)[0];
+ return this.tip;
+ };
+
+ _proto.setContent = function setContent() {
+ var tip = this.getTipElement();
+ this.setElementContent($(tip.querySelectorAll(Selector$9.TOOLTIP_INNER)), this.getTitle());
+ $(tip).removeClass(ClassName$8.FADE + " " + ClassName$8.SHOW);
+ };
+
+ _proto.setElementContent = function setElementContent($element, content) {
+ if (typeof content === 'object' && (content.nodeType || content.jquery)) {
+ // Content is a DOM node or a jQuery
+ if (this.config.html) {
+ if (!$(content).parent().is($element)) {
+ $element.empty().append(content);
+ }
+ } else {
+ $element.text($(content).text());
+ }
+
+ return;
+ }
+
+ if (this.config.html) {
+ if (this.config.sanitize) {
+ content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
+ }
+
+ $element.html(content);
+ } else {
+ $element.text(content);
+ }
+ };
+
+ _proto.getTitle = function getTitle() {
+ var title = this.element.getAttribute('data-original-title');
+
+ if (!title) {
+ title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
+ }
+
+ return title;
+ } // Private
+ ;
+
+ _proto._getOffset = function _getOffset() {
+ var _this3 = this;
+
+ var offset = {};
+
+ if (typeof this.config.offset === 'function') {
+ offset.fn = function (data) {
+ data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
+ return data;
+ };
+ } else {
+ offset.offset = this.config.offset;
+ }
+
+ return offset;
+ };
+
+ _proto._getContainer = function _getContainer() {
+ if (this.config.container === false) {
+ return document.body;
+ }
+
+ if (Util.isElement(this.config.container)) {
+ return $(this.config.container);
+ }
+
+ return $(document).find(this.config.container);
+ };
+
+ _proto._getAttachment = function _getAttachment(placement) {
+ return AttachmentMap$1[placement.toUpperCase()];
+ };
+
+ _proto._setListeners = function _setListeners() {
+ var _this4 = this;
+
+ var triggers = this.config.trigger.split(' ');
+ triggers.forEach(function (trigger) {
+ if (trigger === 'click') {
+ $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
+ return _this4.toggle(event);
+ });
+ } else if (trigger !== Trigger.MANUAL) {
+ var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
+ $(_this4.element).on(eventIn, _this4.config.selector, function (event) {
+ return _this4._enter(event);
+ }).on(eventOut, _this4.config.selector, function (event) {
+ return _this4._leave(event);
+ });
+ }
+ });
+ $(this.element).closest('.modal').on('hide.bs.modal', function () {
+ if (_this4.element) {
+ _this4.hide();
+ }
+ });
+
+ if (this.config.selector) {
+ this.config = _objectSpread({}, this.config, {
+ trigger: 'manual',
+ selector: ''
+ });
+ } else {
+ this._fixTitle();
+ }
+ };
+
+ _proto._fixTitle = function _fixTitle() {
+ var titleType = typeof this.element.getAttribute('data-original-title');
+
+ if (this.element.getAttribute('title') || titleType !== 'string') {
+ this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
+ this.element.setAttribute('title', '');
+ }
+ };
+
+ _proto._enter = function _enter(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
+ context = context || $(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+
+ if (event) {
+ context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
+ }
+
+ if ($(context.getTipElement()).hasClass(ClassName$8.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
+ return;
+ }
+
+ clearTimeout(context._timeout);
+ context._hoverState = HoverState.SHOW;
+
+ if (!context.config.delay || !context.config.delay.show) {
+ context.show();
+ return;
+ }
+
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.SHOW) {
+ context.show();
+ }
+ }, context.config.delay.show);
+ };
+
+ _proto._leave = function _leave(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
+ context = context || $(event.currentTarget).data(dataKey);
+
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+
+ if (event) {
+ context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
+ }
+
+ if (context._isWithActiveTrigger()) {
+ return;
+ }
+
+ clearTimeout(context._timeout);
+ context._hoverState = HoverState.OUT;
+
+ if (!context.config.delay || !context.config.delay.hide) {
+ context.hide();
+ return;
+ }
+
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.OUT) {
+ context.hide();
+ }
+ }, context.config.delay.hide);
+ };
+
+ _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
+ for (var trigger in this._activeTrigger) {
+ if (this._activeTrigger[trigger]) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ _proto._getConfig = function _getConfig(config) {
+ var dataAttributes = $(this.element).data();
+ Object.keys(dataAttributes).forEach(function (dataAttr) {
+ if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
+ delete dataAttributes[dataAttr];
+ }
+ });
+ config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
+
+ if (typeof config.delay === 'number') {
+ config.delay = {
+ show: config.delay,
+ hide: config.delay
+ };
+ }
+
+ if (typeof config.title === 'number') {
+ config.title = config.title.toString();
+ }
+
+ if (typeof config.content === 'number') {
+ config.content = config.content.toString();
+ }
+
+ Util.typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
+
+ if (config.sanitize) {
+ config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
+ }
+
+ return config;
+ };
+
+ _proto._getDelegateConfig = function _getDelegateConfig() {
+ var config = {};
+
+ if (this.config) {
+ for (var key in this.config) {
+ if (this.constructor.Default[key] !== this.config[key]) {
+ config[key] = this.config[key];
+ }
+ }
+ }
+
+ return config;
+ };
+
+ _proto._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
+
+ if (tabClass !== null && tabClass.length) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
+ _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
+ var popperInstance = popperData.instance;
+ this.tip = popperInstance.popper;
+
+ this._cleanTipClass();
+
+ this.addAttachmentClass(this._getAttachment(popperData.placement));
+ };
+
+ _proto._fixTransition = function _fixTransition() {
+ var tip = this.getTipElement();
+ var initConfigAnimation = this.config.animation;
+
+ if (tip.getAttribute('x-placement') !== null) {
+ return;
+ }
+
+ $(tip).removeClass(ClassName$8.FADE);
+ this.config.animation = false;
+ this.hide();
+ this.show();
+ this.config.animation = initConfigAnimation;
+ } // Static
+ ;
+
+ Tooltip._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$9);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
+
+ if (!data) {
+ data = new Tooltip(this, _config);
+ $(this).data(DATA_KEY$9, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Tooltip, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$9;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$5;
+ }
+ }, {
+ key: "NAME",
+ get: function get() {
+ return NAME$9;
+ }
+ }, {
+ key: "DATA_KEY",
+ get: function get() {
+ return DATA_KEY$9;
+ }
+ }, {
+ key: "Event",
+ get: function get() {
+ return Event$7;
+ }
+ }, {
+ key: "EVENT_KEY",
+ get: function get() {
+ return EVENT_KEY$7;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$5;
+ }
+ }]);
+
+ return Tooltip;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$9] = Tooltip._jQueryInterface;
+ $.fn[NAME$9].Constructor = Tooltip;
+
+ $.fn[NAME$9].noConflict = function () {
+ $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;
+ return Tooltip._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$a = 'popover';
+ var VERSION$a = '4.3.1';
+ var DATA_KEY$a = 'bs.popover';
+ var EVENT_KEY$8 = "." + DATA_KEY$a;
+ var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
+ var CLASS_PREFIX$1 = 'bs-popover';
+ var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
+
+ var Default$6 = _objectSpread({}, Tooltip.Default, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
+ });
+
+ var DefaultType$6 = _objectSpread({}, Tooltip.DefaultType, {
+ content: '(string|element|function)'
+ });
+
+ var ClassName$9 = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$a = {
+ TITLE: '.popover-header',
+ CONTENT: '.popover-body'
+ };
+ var Event$8 = {
+ HIDE: "hide" + EVENT_KEY$8,
+ HIDDEN: "hidden" + EVENT_KEY$8,
+ SHOW: "show" + EVENT_KEY$8,
+ SHOWN: "shown" + EVENT_KEY$8,
+ INSERTED: "inserted" + EVENT_KEY$8,
+ CLICK: "click" + EVENT_KEY$8,
+ FOCUSIN: "focusin" + EVENT_KEY$8,
+ FOCUSOUT: "focusout" + EVENT_KEY$8,
+ MOUSEENTER: "mouseenter" + EVENT_KEY$8,
+ MOUSELEAVE: "mouseleave" + EVENT_KEY$8
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Popover =
+ /*#__PURE__*/
+ function (_Tooltip) {
+ _inheritsLoose(Popover, _Tooltip);
+
+ function Popover() {
+ return _Tooltip.apply(this, arguments) || this;
+ }
+
+ var _proto = Popover.prototype;
+
+ // Overrides
+ _proto.isWithContent = function isWithContent() {
+ return this.getTitle() || this._getContent();
+ };
+
+ _proto.addAttachmentClass = function addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment);
+ };
+
+ _proto.getTipElement = function getTipElement() {
+ this.tip = this.tip || $(this.config.template)[0];
+ return this.tip;
+ };
+
+ _proto.setContent = function setContent() {
+ var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events
+
+ this.setElementContent($tip.find(Selector$a.TITLE), this.getTitle());
+
+ var content = this._getContent();
+
+ if (typeof content === 'function') {
+ content = content.call(this.element);
+ }
+
+ this.setElementContent($tip.find(Selector$a.CONTENT), content);
+ $tip.removeClass(ClassName$9.FADE + " " + ClassName$9.SHOW);
+ } // Private
+ ;
+
+ _proto._getContent = function _getContent() {
+ return this.element.getAttribute('data-content') || this.config.content;
+ };
+
+ _proto._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);
+
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ } // Static
+ ;
+
+ Popover._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$a);
+
+ var _config = typeof config === 'object' ? config : null;
+
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
+
+ if (!data) {
+ data = new Popover(this, _config);
+ $(this).data(DATA_KEY$a, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Popover, null, [{
+ key: "VERSION",
+ // Getters
+ get: function get() {
+ return VERSION$a;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$6;
+ }
+ }, {
+ key: "NAME",
+ get: function get() {
+ return NAME$a;
+ }
+ }, {
+ key: "DATA_KEY",
+ get: function get() {
+ return DATA_KEY$a;
+ }
+ }, {
+ key: "Event",
+ get: function get() {
+ return Event$8;
+ }
+ }, {
+ key: "EVENT_KEY",
+ get: function get() {
+ return EVENT_KEY$8;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$6;
+ }
+ }]);
+
+ return Popover;
+ }(Tooltip);
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$a] = Popover._jQueryInterface;
+ $.fn[NAME$a].Constructor = Popover;
+
+ $.fn[NAME$a].noConflict = function () {
+ $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;
+ return Popover._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$b = 'prioritynav';
+ var VERSION$b = '4.3.1';
+ var DATA_KEY$b = 'bs.prioritynav';
+ var JQUERY_NO_CONFLICT$b = $.fn[NAME$b];
+ var RESIZE_DURATION = 500;
+ var TAB_KEYCODE$1 = 9;
+ var Event$9 = {
+ RESIZE: 'resize',
+ FOCUS: 'focus'
+ };
+ var ClassName$a = {
+ PRIORITY: 'priority',
+ HIDE: 'sr-only',
+ RESIZING: 'resizing'
+ };
+ var Selector$b = {
+ NAV_ELEMENTS: 'li:not(\'.overflow-nav\')',
+ FIRST_ELEMENT: 'li:first',
+ PRIORITY_ELEMENT: '.priority'
+ };
+ var MenuLabelDefault = 'More';
+
+ function MenuTemplate(MenuLabel) {
+ return "\n <li class=\"overflow-nav nav-item dropdown\">\n <a href=\"#\" class=\"dropdown-toggle nav-link\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\">" + MenuLabel + "</a>\n <ul class=\"overflow-nav-list dropdown-menu dropdown-menu-right\"></ul>\n </li>\n";
+ }
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+
+ var PriorityNav =
+ /*#__PURE__*/
+ function () {
+ function PriorityNav(element, config) {
+ this._element = element;
+ this._config = config;
+
+ if ($(element).is('ul')) {
+ this._$menu = $(element);
+ } else {
+ this._$menu = $(element).find('ul').first();
+ }
+
+ this._initMenu();
+
+ this._$allNavElements = this._$menu.find(Selector$b.NAV_ELEMENTS);
+
+ this._bindUIActions();
+
+ this._setupMenu();
+ } // getters
+
+
+ var _proto = PriorityNav.prototype;
+
+ // public
+ // private
+ _proto._initMenu = function _initMenu() {
+ var MenuLabel = this._config;
+
+ if (typeof MenuLabel === 'undefined') {
+ MenuLabel = MenuLabelDefault;
+ } // add menu template
+
+
+ this._$menu.append(MenuTemplate(MenuLabel));
+ };
+
+ _proto._setupMenu = function _setupMenu() {
+ var $allNavElements = this._$allNavElements; // Checking top position of first item (sometimes changes)
+
+ var firstPos = this._$menu.find(Selector$b.FIRST_ELEMENT).position(); // Empty collection in which to put menu items to move
+
+
+ var $wrappedElements = $(); // Used to snag the previous menu item in addition to ones that have wrapped
+
+ var first = true; // Loop through all the nav items...
+
+ this._$allNavElements.each(function (i) {
+ var $elm = $(this); // ...in which to find wrapped elements
+
+ var pos = $elm.position();
+
+ if (pos.top !== firstPos.top) {
+ // If element is wrapped, add it to set
+ $wrappedElements = $wrappedElements.add($elm); // Add the previous one too, if first
+
+ if (first) {
+ $wrappedElements = $wrappedElements.add($allNavElements.eq(i - 1));
+ first = false;
+ }
+ }
+ });
+
+ if ($wrappedElements.length) {
+ // Clone set before altering
+ var newSet = $wrappedElements.clone(); // Hide ones that we're moving
+
+ $wrappedElements.addClass(ClassName$a.HIDE);
+ $wrappedElements.find('.nav-link').attr('tabindex', -1); // Add wrapped elements to dropdown
+
+ this._$menu.find('.overflow-nav-list').append(newSet); // Show new menu
+
+
+ this._$menu.find('.overflow-nav').addClass('show-inline-block'); // Make overflow visible again so dropdown can be seen.
+
+
+ this._$menu.find('.o-nav-local').css('overflow', 'visible'); // Check if menu doesn't overflow after process
+
+
+ if (this._$menu.find('.overflow-nav').position().top !== firstPos.top) {
+ var $item = $(this._element).find("." + ClassName$a.HIDE).first().prev();
+ var $itemDuplicate = $item.clone();
+ $item.addClass(ClassName$a.HIDE);
+ $item.find('.nav-link').attr('tabindex', -1);
+
+ this._$menu.find('.overflow-nav-list').prepend($itemDuplicate);
+ }
+ } // hide menu from AT
+
+
+ this._$menu.find('.overflow-nav').attr('aria-hidden', true);
+ };
+
+ _proto._tearDown = function _tearDown() {
+ this._$menu.find('.overflow-nav-list').empty();
+
+ this._$menu.find('.overflow-nav').removeClass('show-inline-block');
+
+ this._$allNavElements.removeClass(ClassName$a.HIDE);
+
+ this._$allNavElements.find('.nav-link').attr('tabindex', 0);
+ };
+
+ _proto._bindUIActions = function _bindUIActions() {
+ var _this = this;
+
+ $(window).on(Event$9.RESIZE, function () {
+ _this._$menu.addClass(ClassName$a.RESIZING);
+
+ setTimeout(function () {
+ _this._tearDown();
+
+ _this._setupMenu();
+
+ _this._$menu.removeClass(ClassName$a.RESIZING);
+ }, RESIZE_DURATION);
+ });
+
+ this._$menu.find('.overflow-nav .dropdown-toggle').on('keyup', function (e) {
+ if (e.which === TAB_KEYCODE$1) {
+ $(e.target).dropdown('toggle');
+ }
+ });
+ } // static
+ ;
+
+ PriorityNav._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$b);
+
+ if (!data) {
+ data = new PriorityNav(this, config);
+ $(this).data(DATA_KEY$b, data);
+ }
+
+ if (typeof config !== 'undefined' && config) {
+ if (typeof config !== 'string') {
+ throw new TypeError('Priority nav label type must be string');
+ }
+ }
+ });
+ };
+
+ _createClass(PriorityNav, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$b;
+ }
+ }]);
+
+ return PriorityNav;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$b] = PriorityNav._jQueryInterface;
+ $.fn[NAME$b].Constructor = PriorityNav;
+
+ $.fn[NAME$b].noConflict = function () {
+ $.fn[NAME$b] = JQUERY_NO_CONFLICT$b;
+ return PriorityNav._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$c = 'scrollup';
+ var VERSION$c = '4.3.1';
+ var DATA_KEY$c = 'bs.scrollup';
+ var EVENT_KEY$9 = "." + DATA_KEY$c;
+ var DATA_API_KEY$7 = '.data-api';
+ var JQUERY_NO_CONFLICT$c = $.fn[NAME$c];
+ var SCROLLANIMATE = 500;
+ var Default$7 = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+ var Event$a = {
+ SCROLL: "scroll" + EVENT_KEY$9,
+ CLICK_SCROLL: "click" + EVENT_KEY$9,
+ LOAD_DATA_API: "load" + EVENT_KEY$9 + DATA_API_KEY$7
+ };
+ var ClassName$b = {
+ SCROLL_TOP: 'o-scroll-up'
+ };
+ var Selector$c = {
+ SCROLL_TOP: '.o-scroll-up:not(.static)'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var ScrollUp =
+ /*#__PURE__*/
+ function () {
+ function ScrollUp(element) {
+ this._element = element;
+ this._scrollElement = window;
+ $(window).on(Event$a.SCROLL, $.proxy(this._process, this));
+ $(Selector$c.SCROLL_TOP).on(Event$a.CLICK_SCROLL, $.proxy(this._backToTop, this));
+ $(this._element).addClass('is-fixed');
+
+ this._process();
+ } // getters
+
+
+ var _proto = ScrollUp.prototype;
+
+ // public
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$c);
+ $(this._scrollElement).off(EVENT_KEY$9);
+ this._element = null;
+ this._scrollElement = null;
+ } // private
+ ;
+
+ _proto._process = function _process() {
+ if ($(this._scrollElement).scrollTop() > Number($(this._scrollElement).height())) {
+ $(Selector$c.SCROLL_TOP).show();
+ } else {
+ $(Selector$c.SCROLL_TOP).hide();
+ }
+ };
+
+ _proto._clear = function _clear() {
+ $(this._selector).filter(Selector$c.ACTIVE).removeClass(ClassName$b.ACTIVE);
+ };
+
+ _proto._backToTop = function _backToTop() {
+ if (typeof $.animate === 'function') {
+ $('html, body').animate({
+ scrollTop: 0
+ }, SCROLLANIMATE);
+ } else {
+ $('html, body').scrollTop(0);
+ }
+ } // static
+ ;
+
+ ScrollUp._jQueryInterface = function _jQueryInterface() {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$c);
+
+ if (!data) {
+ data = new ScrollUp(this);
+ $(this).data(DATA_KEY$c, data);
+ }
+ });
+ };
+
+ _createClass(ScrollUp, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$c;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$7;
+ }
+ }]);
+
+ return ScrollUp;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(window).on(Event$a.LOAD_DATA_API, function () {
+ var scrollUps = $.makeArray($(Selector$c.SCROLL_TOP));
+
+ for (var i = scrollUps.length; i--;) {
+ var $scrollup = $(scrollUps[i]);
+
+ ScrollUp._jQueryInterface.call($scrollup, $scrollup.data());
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$c] = ScrollUp._jQueryInterface;
+ $.fn[NAME$c].Constructor = ScrollUp;
+
+ $.fn[NAME$c].noConflict = function () {
+ $.fn[NAME$c] = JQUERY_NO_CONFLICT$c;
+ return ScrollUp._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$d = 'scrollspy';
+ var VERSION$d = '4.3.1';
+ var DATA_KEY$d = 'bs.scrollspy';
+ var EVENT_KEY$a = "." + DATA_KEY$d;
+ var DATA_API_KEY$8 = '.data-api';
+ var JQUERY_NO_CONFLICT$d = $.fn[NAME$d];
+ var Default$8 = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+ var DefaultType$7 = {
+ offset: 'number',
+ method: 'string',
+ target: '(string|element)'
+ };
+ var Event$b = {
+ ACTIVATE: "activate" + EVENT_KEY$a,
+ SCROLL: "scroll" + EVENT_KEY$a,
+ LOAD_DATA_API: "load" + EVENT_KEY$a + DATA_API_KEY$8
+ };
+ var ClassName$c = {
+ DROPDOWN_ITEM: 'dropdown-item',
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active'
+ };
+ var Selector$d = {
+ DATA_SPY: '[data-spy="scroll"]',
+ ACTIVE: '.active',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ NAV_LINKS: '.nav-link',
+ NAV_ITEMS: '.nav-item',
+ LIST_ITEMS: '.list-group-item',
+ DROPDOWN: '.dropdown',
+ DROPDOWN_ITEMS: '.dropdown-item',
+ DROPDOWN_TOGGLE: '.dropdown-toggle'
+ };
+ var OffsetMethod = {
+ OFFSET: 'offset',
+ POSITION: 'position'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var ScrollSpy =
+ /*#__PURE__*/
+ function () {
+ function ScrollSpy(element, config) {
+ var _this = this;
+
+ this._element = element;
+ this._scrollElement = element.tagName === 'BODY' ? window : element;
+ this._config = this._getConfig(config);
+ this._selector = this._config.target + " " + Selector$d.NAV_LINKS + "," + (this._config.target + " " + Selector$d.LIST_ITEMS + ",") + (this._config.target + " " + Selector$d.DROPDOWN_ITEMS);
+ this._offsets = [];
+ this._targets = [];
+ this._activeTarget = null;
+ this._scrollHeight = 0;
+ $(this._scrollElement).on(Event$b.SCROLL, function (event) {
+ return _this._process(event);
+ });
+ this.refresh();
+
+ this._process();
+ } // Getters
+
+
+ var _proto = ScrollSpy.prototype;
+
+ // Public
+ _proto.refresh = function refresh() {
+ var _this2 = this;
+
+ var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
+ var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
+ var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
+ this._offsets = [];
+ this._targets = [];
+ this._scrollHeight = this._getScrollHeight();
+ var targets = [].slice.call(document.querySelectorAll(this._selector));
+ targets.map(function (element) {
+ var target;
+ var targetSelector = Util.getSelectorFromElement(element);
+
+ if (targetSelector) {
+ target = document.querySelector(targetSelector);
+ }
+
+ if (target) {
+ var targetBCR = target.getBoundingClientRect();
+
+ if (targetBCR.width || targetBCR.height) {
+ // TODO (fat): remove sketch reliance on jQuery position/offset
+ return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
+ }
+ }
+
+ return null;
+ }).filter(function (item) {
+ return item;
+ }).sort(function (a, b) {
+ return a[0] - b[0];
+ }).forEach(function (item) {
+ _this2._offsets.push(item[0]);
+
+ _this2._targets.push(item[1]);
+ });
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$d);
+ $(this._scrollElement).off(EVENT_KEY$a);
+ this._element = null;
+ this._scrollElement = null;
+ this._config = null;
+ this._selector = null;
+ this._offsets = null;
+ this._targets = null;
+ this._activeTarget = null;
+ this._scrollHeight = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$8, typeof config === 'object' && config ? config : {});
+
+ if (typeof config.target !== 'string') {
+ var id = $(config.target).attr('id');
+
+ if (!id) {
+ id = Util.getUID(NAME$d);
+ $(config.target).attr('id', id);
+ }
+
+ config.target = "#" + id;
+ }
+
+ Util.typeCheckConfig(NAME$d, config, DefaultType$7);
+ return config;
+ };
+
+ _proto._getScrollTop = function _getScrollTop() {
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
+ };
+
+ _proto._getScrollHeight = function _getScrollHeight() {
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
+ };
+
+ _proto._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
+ };
+
+ _proto._process = function _process() {
+ var scrollTop = this._getScrollTop() + this._config.offset;
+
+ var scrollHeight = this._getScrollHeight();
+
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
+
+ if (this._scrollHeight !== scrollHeight) {
+ this.refresh();
+ }
+
+ if (scrollTop >= maxScroll) {
+ var target = this._targets[this._targets.length - 1];
+
+ if (this._activeTarget !== target) {
+ this._activate(target);
+ }
+
+ return;
+ }
+
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
+ this._activeTarget = null;
+
+ this._clear();
+
+ return;
+ }
+
+ var offsetLength = this._offsets.length;
+
+ for (var i = offsetLength; i--;) {
+ var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
+
+ if (isActiveTarget) {
+ this._activate(this._targets[i]);
+ }
+ }
+ };
+
+ _proto._activate = function _activate(target) {
+ this._activeTarget = target;
+
+ this._clear();
+
+ var queries = this._selector.split(',').map(function (selector) {
+ return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
+ });
+
+ var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
+
+ if ($link.hasClass(ClassName$c.DROPDOWN_ITEM)) {
+ $link.closest(Selector$d.DROPDOWN).find(Selector$d.DROPDOWN_TOGGLE).addClass(ClassName$c.ACTIVE);
+ $link.addClass(ClassName$c.ACTIVE);
+ } else {
+ // Set triggered link as active
+ $link.addClass(ClassName$c.ACTIVE); // Set triggered links parents as active
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
+
+ $link.parents(Selector$d.NAV_LIST_GROUP).prev(Selector$d.NAV_LINKS + ", " + Selector$d.LIST_ITEMS).addClass(ClassName$c.ACTIVE); // Handle special case when .nav-link is inside .nav-item
+
+ $link.parents(Selector$d.NAV_LIST_GROUP).prev(Selector$d.NAV_ITEMS).children(Selector$d.NAV_LINKS).addClass(ClassName$c.ACTIVE);
+ }
+
+ $(this._scrollElement).trigger(Event$b.ACTIVATE, {
+ relatedTarget: target
+ });
+ };
+
+ _proto._clear = function _clear() {
+ [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
+ return node.classList.contains(ClassName$c.ACTIVE);
+ }).forEach(function (node) {
+ return node.classList.remove(ClassName$c.ACTIVE);
+ });
+ } // Static
+ ;
+
+ ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY$d);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data) {
+ data = new ScrollSpy(this, _config);
+ $(this).data(DATA_KEY$d, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(ScrollSpy, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$d;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$8;
+ }
+ }]);
+
+ return ScrollSpy;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(window).on(Event$b.LOAD_DATA_API, function () {
+ var scrollSpys = [].slice.call(document.querySelectorAll(Selector$d.DATA_SPY));
+ var scrollSpysLength = scrollSpys.length;
+
+ for (var i = scrollSpysLength; i--;) {
+ var $spy = $(scrollSpys[i]);
+
+ ScrollSpy._jQueryInterface.call($spy, $spy.data());
+ }
+ });
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$d] = ScrollSpy._jQueryInterface;
+ $.fn[NAME$d].Constructor = ScrollSpy;
+
+ $.fn[NAME$d].noConflict = function () {
+ $.fn[NAME$d] = JQUERY_NO_CONFLICT$d;
+ return ScrollSpy._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$e = 'tab';
+ var VERSION$e = '4.3.1';
+ var DATA_KEY$e = 'bs.tab';
+ var EVENT_KEY$b = "." + DATA_KEY$e;
+ var DATA_API_KEY$9 = '.data-api';
+ var JQUERY_NO_CONFLICT$e = $.fn[NAME$e]; // boosted mod
+
+ var ARROW_LEFT_KEYCODE$2 = 37; // KeyboardEvent.which value for left arrow key
+
+ var ARROW_UP_KEYCODE$2 = 38; // KeyboardEvent.which value for up arrow key
+
+ var ARROW_RIGHT_KEYCODE$2 = 39; // KeyboardEvent.which value for right arrow key
+
+ var ARROW_DOWN_KEYCODE$2 = 40; // KeyboardEvent.which value for down arrow key
+
+ var REGEXP_KEYDOWN$1 = new RegExp(ARROW_LEFT_KEYCODE$2 + "|" + ARROW_UP_KEYCODE$2 + "|" + ARROW_RIGHT_KEYCODE$2 + "|" + ARROW_DOWN_KEYCODE$2); // end mod
+
+ var Event$c = {
+ HIDE: "hide" + EVENT_KEY$b,
+ HIDDEN: "hidden" + EVENT_KEY$b,
+ SHOW: "show" + EVENT_KEY$b,
+ SHOWN: "shown" + EVENT_KEY$b,
+ CLICK_DATA_API: "click" + EVENT_KEY$b + DATA_API_KEY$9,
+ KEYDOWN_DATA_API: "keydown" + EVENT_KEY$b + DATA_API_KEY$9 // boosted mod
+
+ };
+ var ClassName$d = {
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active',
+ DISABLED: 'disabled',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+ var Selector$e = {
+ DROPDOWN: '.dropdown',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ ACTIVE: '.active',
+ ACTIVE_UL: '> li > .active',
+ DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
+ DROPDOWN_TOGGLE: '.dropdown-toggle',
+ DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Tab =
+ /*#__PURE__*/
+ function () {
+ function Tab(element) {
+ this._element = element;
+
+ this._addAccessibility(); // Boosted mod
+
+ } // Getters
+
+
+ var _proto = Tab.prototype;
+
+ // Public
+ _proto.show = function show() {
+ var _this = this;
+
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$d.ACTIVE) || $(this._element).hasClass(ClassName$d.DISABLED)) {
+ return;
+ }
+
+ var target;
+ var previous;
+ var listElement = $(this._element).closest(Selector$e.NAV_LIST_GROUP)[0];
+ var selector = Util.getSelectorFromElement(this._element);
+
+ if (listElement) {
+ var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$e.ACTIVE_UL : Selector$e.ACTIVE;
+ previous = $.makeArray($(listElement).find(itemSelector));
+ previous = previous[previous.length - 1];
+ }
+
+ var hideEvent = $.Event(Event$c.HIDE, {
+ relatedTarget: this._element
+ });
+ var showEvent = $.Event(Event$c.SHOW, {
+ relatedTarget: previous
+ });
+
+ if (previous) {
+ $(previous).trigger(hideEvent);
+ }
+
+ $(this._element).trigger(showEvent);
+
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
+ return;
+ }
+
+ if (selector) {
+ target = document.querySelector(selector);
+ }
+
+ this._activate(this._element, listElement);
+
+ var complete = function complete() {
+ var hiddenEvent = $.Event(Event$c.HIDDEN, {
+ relatedTarget: _this._element
+ });
+ var shownEvent = $.Event(Event$c.SHOWN, {
+ relatedTarget: previous
+ });
+ $(previous).trigger(hiddenEvent);
+ $(_this._element).trigger(shownEvent);
+ };
+
+ if (target) {
+ this._activate(target, target.parentNode, complete);
+ } else {
+ complete();
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY$e);
+ this._element = null;
+ } // Private
+ ;
+
+ _proto._activate = function _activate(element, container, callback) {
+ var _this2 = this;
+
+ var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$e.ACTIVE_UL) : $(container).children(Selector$e.ACTIVE);
+ var active = activeElements[0];
+ var isTransitioning = callback && active && $(active).hasClass(ClassName$d.FADE);
+
+ var complete = function complete() {
+ return _this2._transitionComplete(element, active, callback);
+ }; // Boosted mod
+
+
+ $(container).find('.nav-link:not(.dropdown-toggle)').attr({
+ tabIndex: '-1',
+ 'aria-selected': false
+ });
+ $(container).find('.tab-pane').attr({
+ 'aria-hidden': true,
+ tabIndex: '-1'
+ }); // end mod
+
+ if (active && isTransitioning) {
+ var transitionDuration = Util.getTransitionDurationFromElement(active);
+ $(active).removeClass(ClassName$d.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ };
+
+ _proto._transitionComplete = function _transitionComplete(element, active, callback) {
+ if (active) {
+ $(active).removeClass(ClassName$d.ACTIVE);
+ var dropdownChild = $(active.parentNode).find(Selector$e.DROPDOWN_ACTIVE_CHILD)[0];
+
+ if (dropdownChild) {
+ $(dropdownChild).removeClass(ClassName$d.ACTIVE);
+ }
+
+ if (active.getAttribute('role') === 'tab') {
+ active.setAttribute('aria-selected', false);
+ }
+ }
+
+ $(element).addClass(ClassName$d.ACTIVE);
+
+ if (element.getAttribute('role') === 'tab') {
+ element.setAttribute('aria-selected', true);
+ } // Boosted mod
+
+
+ $(element).filter('.nav-link:not(.dropdown-toggle).active').attr({
+ tabIndex: '0',
+ 'aria-selected': true
+ });
+ $(element).filter('.tab-pane.active').attr({
+ 'aria-hidden': false,
+ tabIndex: '0'
+ }); // end mod
+
+ Util.reflow(element);
+
+ if (element.classList.contains(ClassName$d.FADE)) {
+ element.classList.add(ClassName$d.SHOW);
+ }
+
+ if (element.parentNode && $(element.parentNode).hasClass(ClassName$d.DROPDOWN_MENU)) {
+ var dropdownElement = $(element).closest(Selector$e.DROPDOWN)[0];
+
+ if (dropdownElement) {
+ var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$e.DROPDOWN_TOGGLE));
+ $(dropdownToggleList).addClass(ClassName$d.ACTIVE);
+ }
+
+ element.setAttribute('aria-expanded', true);
+ }
+
+ if (callback) {
+ callback();
+ }
+ } // Boosted mod
+ ;
+
+ _proto._addAccessibility = function _addAccessibility() {
+ var $tab = $(this._element);
+ var $tabpanel = $($tab.attr('href'));
+ var $tablist = $tab.closest(Selector$e.NAV_LIST_GROUP);
+ var tabId = $tab.attr('id') || Util.getUID(NAME$e);
+ $tab.attr('id', tabId);
+
+ if ($tabpanel) {
+ $tab.attr('role', 'tab');
+ $tablist.attr('role', 'tablist'); // $li.attr('role', 'presentation')
+ }
+
+ if ($tab.hasClass(ClassName$d.ACTIVE)) {
+ $tab.attr({
+ tabIndex: '0',
+ 'aria-selected': 'true'
+ });
+
+ if ($tab.attr('href')) {
+ $tab.attr('aria-controls', $tab.attr('href').substr(1));
+ }
+
+ $tabpanel.attr({
+ role: 'tabpanel',
+ tabIndex: '0',
+ 'aria-hidden': 'false',
+ 'aria-labelledby': tabId
+ });
+ } else {
+ $tab.attr({
+ tabIndex: '-1',
+ 'aria-selected': 'false'
+ });
+
+ if ($tab.attr('href')) {
+ $tab.attr('aria-controls', $tab.attr('href').substr(1));
+ }
+
+ $tabpanel.attr({
+ role: 'tabpanel',
+ tabIndex: '-1',
+ 'aria-hidden': 'true',
+ 'aria-labelledby': tabId
+ });
+ }
+ } // end mod
+ // Static
+ // Boosted mod
+ ;
+
+ Tab._dataApiKeydownHandler = function _dataApiKeydownHandler(e) {
+ var $this = $(this);
+ var Items = $this.closest('ul[role=tablist] ').find('[role=tab]:visible');
+ var k = e.which || e.keyCode;
+ var index = 0;
+ index = Items.index(Items.filter(':focus'));
+
+ if (k === ARROW_UP_KEYCODE$2 || k === ARROW_LEFT_KEYCODE$2) {
+ index--;
+ } // up & left
+
+
+ if (k === ARROW_RIGHT_KEYCODE$2 || k === ARROW_DOWN_KEYCODE$2) {
+ index++;
+ } // down & right
+
+
+ if (index < 0) {
+ index = Items.length - 1;
+ }
+
+ if (index === Items.length) {
+ index = 0;
+ }
+
+ var nextTab = Items.eq(index);
+
+ if (nextTab.attr('role') === 'tab') {
+ nextTab.tab('show').trigger('focus');
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+ } // end mod
+ ;
+
+ Tab._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY$e);
+
+ if (!data) {
+ data = new Tab(this);
+ $this.data(DATA_KEY$e, data);
+ } // Boosted mod
+
+
+ if (/init/.test(config)) {
+ return;
+ } // end mod
+
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config]();
+ }
+ });
+ };
+
+ _createClass(Tab, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$e;
+ }
+ }]);
+
+ return Tab;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+
+ $(document).on(Event$c.CLICK_DATA_API, Selector$e.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+
+ Tab._jQueryInterface.call($(this), 'show');
+ }) // Boosted mod
+ .on(Event$c.KEYDOWN_DATA_API, Selector$e.DATA_TOGGLE, function (event) {
+ if (!REGEXP_KEYDOWN$1.test(event.which)) {
+ return;
+ }
+
+ event.preventDefault();
+
+ Tab._dataApiKeydownHandler.call($(this), event);
+ }).on('DOMContentLoaded', function () {
+ Tab._jQueryInterface.call($(Selector$e.DATA_TOGGLE), 'init');
+ }); // end mod
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME$e] = Tab._jQueryInterface;
+ $.fn[NAME$e].Constructor = Tab;
+
+ $.fn[NAME$e].noConflict = function () {
+ $.fn[NAME$e] = JQUERY_NO_CONFLICT$e;
+ return Tab._jQueryInterface;
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME$f = 'toast';
+ var VERSION$f = '4.3.1';
+ var DATA_KEY$f = 'bs.toast';
+ var EVENT_KEY$c = "." + DATA_KEY$f;
+ var JQUERY_NO_CONFLICT$f = $.fn[NAME$f];
+ var Event$d = {
+ CLICK_DISMISS: "click.dismiss" + EVENT_KEY$c,
+ HIDE: "hide" + EVENT_KEY$c,
+ HIDDEN: "hidden" + EVENT_KEY$c,
+ SHOW: "show" + EVENT_KEY$c,
+ SHOWN: "shown" + EVENT_KEY$c
+ };
+ var ClassName$e = {
+ FADE: 'fade',
+ HIDE: 'hide',
+ SHOW: 'show',
+ SHOWING: 'showing'
+ };
+ var DefaultType$8 = {
+ animation: 'boolean',
+ autohide: 'boolean',
+ delay: 'number'
+ };
+ var Default$9 = {
+ animation: true,
+ autohide: true,
+ delay: 500
+ };
+ var Selector$f = {
+ DATA_DISMISS: '[data-dismiss="toast"]'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
+
+ var Toast =
+ /*#__PURE__*/
+ function () {
+ function Toast(element, config) {
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._timeout = null;
+
+ this._setListeners();
+ } // Getters
+
+
+ var _proto = Toast.prototype;
+
+ // Public
+ _proto.show = function show() {
+ var _this = this;
+
+ $(this._element).trigger(Event$d.SHOW);
+
+ if (this._config.animation) {
+ this._element.classList.add(ClassName$e.FADE);
+ }
+
+ var complete = function complete() {
+ _this._element.classList.remove(ClassName$e.SHOWING);
+
+ _this._element.classList.add(ClassName$e.SHOW);
+
+ $(_this._element).trigger(Event$d.SHOWN);
+
+ if (_this._config.autohide) {
+ _this.hide();
+ }
+ };
+
+ this._element.classList.remove(ClassName$e.HIDE);
+
+ this._element.classList.add(ClassName$e.SHOWING);
+
+ if (this._config.animation) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ };
+
+ _proto.hide = function hide(withoutTimeout) {
+ var _this2 = this;
+
+ if (!this._element.classList.contains(ClassName$e.SHOW)) {
+ return;
+ }
+
+ $(this._element).trigger(Event$d.HIDE);
+
+ if (withoutTimeout) {
+ this._close();
+ } else {
+ this._timeout = setTimeout(function () {
+ _this2._close();
+ }, this._config.delay);
+ }
+ };
+
+ _proto.dispose = function dispose() {
+ clearTimeout(this._timeout);
+ this._timeout = null;
+
+ if (this._element.classList.contains(ClassName$e.SHOW)) {
+ this._element.classList.remove(ClassName$e.SHOW);
+ }
+
+ $(this._element).off(Event$d.CLICK_DISMISS);
+ $.removeData(this._element, DATA_KEY$f);
+ this._element = null;
+ this._config = null;
+ } // Private
+ ;
+
+ _proto._getConfig = function _getConfig(config) {
+ config = _objectSpread({}, Default$9, $(this._element).data(), typeof config === 'object' && config ? config : {});
+ Util.typeCheckConfig(NAME$f, config, this.constructor.DefaultType);
+ return config;
+ };
+
+ _proto._setListeners = function _setListeners() {
+ var _this3 = this;
+
+ $(this._element).on(Event$d.CLICK_DISMISS, Selector$f.DATA_DISMISS, function () {
+ return _this3.hide(true);
+ });
+ };
+
+ _proto._close = function _close() {
+ var _this4 = this;
+
+ var complete = function complete() {
+ _this4._element.classList.add(ClassName$e.HIDE);
+
+ $(_this4._element).trigger(Event$d.HIDDEN);
+ };
+
+ this._element.classList.remove(ClassName$e.SHOW);
+
+ if (this._config.animation) {
+ var transitionDuration = Util.getTransitionDurationFromElement(this._element);
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
+ } else {
+ complete();
+ }
+ } // Static
+ ;
+
+ Toast._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $(this);
+ var data = $element.data(DATA_KEY$f);
+
+ var _config = typeof config === 'object' && config;
+
+ if (!data) {
+ data = new Toast(this, _config);
+ $element.data(DATA_KEY$f, data);
+ }
+
+ if (typeof config === 'string') {
+ if (typeof data[config] === 'undefined') {
+ throw new TypeError("No method named \"" + config + "\"");
+ }
+
+ data[config](this);
+ }
+ });
+ };
+
+ _createClass(Toast, null, [{
+ key: "VERSION",
+ get: function get() {
+ return VERSION$f;
+ }
+ }, {
+ key: "DefaultType",
+ get: function get() {
+ return DefaultType$8;
+ }
+ }, {
+ key: "Default",
+ get: function get() {
+ return Default$9;
+ }
+ }]);
+
+ return Toast;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+
+ $.fn[NAME$f] = Toast._jQueryInterface;
+ $.fn[NAME$f].Constructor = Toast;
+
+ $.fn[NAME$f].noConflict = function () {
+ $.fn[NAME$f] = JQUERY_NO_CONFLICT$f;
+ return Toast._jQueryInterface;
+ };
+
+ /**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): index.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+ (function () {
+ if (typeof $ === 'undefined') {
+ throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
+ }
+
+ var version = $.fn.jquery.split(' ')[0].split('.');
+ var minMajor = 1;
+ var ltMajor = 2;
+ var minMinor = 9;
+ var minPatch = 1;
+ var maxMajor = 4;
+
+ if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
+ throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
+ }
+ })();
+
+ exports.Util = Util;
+ exports.Alert = Alert;
+ exports.Button = Button;
+ exports.Carousel = Carousel;
+ exports.Collapse = Collapse;
+ exports.Dropdown = Dropdown;
+ exports.MegaMenu = MegaMenu;
+ exports.Modal = Modal;
+ exports.Navbar = Navbar;
+ exports.Otab = Otab;
+ exports.Popover = Popover;
+ exports.PriorityNav = PriorityNav;
+ exports.ScrollUp = ScrollUp;
+ exports.Scrollspy = ScrollSpy;
+ exports.Tab = Tab;
+ exports.Toast = Toast;
+ exports.Tooltip = Tooltip;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=boosted.js.map
diff --git a/dashboard/public/js/boosted.js.map b/dashboard/public/js/boosted.js.map
new file mode 100644
index 00000000..c1b1000b
--- /dev/null
+++ b/dashboard/public/js/boosted.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"boosted.js","sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/o-megamenu.js","../../js/src/modal.js","../../js/src/o-navbar.js","../../js/src/o-tab.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/o-priority-nav.js","../../js/src/o-scroll-up.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/src/index.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n const input = this._element.querySelector(Selector.INPUT)\n\n if (rootElement) {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n activeElement.classList.remove(ClassName.ACTIVE)\n }\n }\n\n if (input) {\n if (input.checked) {\n this._element.classList.add(ClassName.ACTIVE)\n } else {\n this._element.classList.remove(ClassName.ACTIVE)\n }\n } else {\n this._element.classList.toggle(ClassName.ACTIVE)\n this._element.setAttribute('aria-pressed',\n this._element.classList.contains(ClassName.ACTIVE))\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT > Selector.INPUT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '*:not(.multi) > .show, *:not(.multi) > .collapsing', // boosted mod\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide|init/.test(config)) { // Boosted mod\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n// Boosted mod\n .on('DOMContentLoaded', () => {\n $(Selector.DATA_TOGGLE).each(function () {\n const target = Collapse._getTargetFromElement(this)\n\n Collapse._jQueryInterface.call($(target), 'init')\n })\n })\n// end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n // Boosted mod\n MENU_ITEMS : '.dropdown-menu .dropdown-item',\n FIRST_ITEM_IN_MENU : '.dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)',\n // end mod\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n // Boosted mod\n $(parent).find(Selector.FIRST_ITEM_IN_MENU).first().trigger('focus')\n // end mod\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Boosted mod\n _addAccessibility() {\n $(this._element).attr('aria-haspopup', true)\n // ensure that dropdown-menu have the role menu\n $(this._element).parent().children(Selector.MENU).attr('role', 'menu')\n // ensure that dropdown-itm's have the role menuitem\n $(this._element).parent().children(Selector.MENU).children('.dropdown-item').attr('role', 'menuitem')\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n // Boosted mod\n .on('DOMContentLoaded', () => {\n // Instanciate every dropdown in the DOM\n Dropdown._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-megamenu.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/* eslint no-magic-numbers: [\"error\", { \"ignore\": [1,2] }] */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'megamenu'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.megamenu'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst TIMEOUT = 1000 // Timeout befor focusing first element\nconst PERCENTAGE = 100 // Width slide proportion\nconst SPLITLENGHT = 4\n\nconst ClassName = {\n TRANSITIONING: 'transitioning'\n}\n\nconst Selector = {\n MEGAMENU : '.mega-menu',\n ROOT_NAV : '.mega-menu > .navbar-nav',\n MEGAMENU_PANEL : '.mega-menu-panel',\n MEGAMENU_NAV : '.nav-link + .navbar-nav',\n NAV_MENU : '.navbar-nav',\n NAV_ITEM : '.nav-item',\n NAV_LINK : '.nav-link',\n NAV_LINK_COLLAPSE : '.nav-link[data-toggle=collapse]',\n NAV_LINK_BACK : '.nav-link.back',\n NAV_LINK_EXPANDED : '.nav-link[aria-expanded=true]'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass MegaMenu {\n constructor(element, config) {\n this._element = element\n this._$navLinks = $(this._element).find(Selector.NAV_LINK)\n this._$goForwardLinks = $(this._element).find(Selector.MEGAMENU_NAV).prev(Selector.NAV_LINK)\n this._$goBackLinks = $(this._element).find(Selector.NAV_LINK_BACK)\n this._$topCollapseMenus = $(this._element).find(Selector.MEGAMENU_PANEL)\n this._$navLinkCollapses = $(this._element).find(Selector.NAV_LINK_COLLAPSE)\n this._config = config\n if (typeof this._config.noFocus === 'undefined') {\n this._config.noFocus = false\n }\n this._addEventListeners()\n this._addAriaAttributes(this._element)\n this.goTo = this._initPosition\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _addEventListeners() {\n this._$goForwardLinks.on('click', (event) => this._goForward(event))\n this._$goBackLinks.on('click', (event) => this._goBackward(event))\n this._$navLinks.on('keydown', (event) => this._manageKeyDown(event))\n if (!this._config.noFocus) {\n this._$topCollapseMenus.on('shown.bs.collapse', this._collapseFocus)\n }\n this._$navLinkCollapses.on('click', (event) => this._handleCollapseToggle(event))\n }\n\n _addAriaAttributes(element) {\n const $subNavs = $(element).find('.nav-link + .navbar-nav')\n\n $(element).attr('role', 'application')\n $(element).find('> .navbar-nav').attr('role', 'menu')\n $(element).find(Selector.MEGAMENU_PANEL).attr('role', 'menu')\n $(element).find('.nav-link[data-toggle=collapse]').attr('role', 'menuitem')\n $(element).find(Selector.NAV_LINK_BACK).attr({\n 'aria-hidden': true\n })\n $(element).find(Selector.NAV_ITEM).attr('role', 'presentation')\n\n $subNavs.each(function () {\n const navId = Util.getUID(NAME)\n const $thisNavToggler = $(this).prev(Selector.NAV_LINK)\n const $thisNav = $(this)\n const $thisNavBackLink = $thisNav.find(Selector.NAV_LINK_BACK)\n const $topMenu = $(this).closest(Selector.NAV_MENU).parent().closest(Selector.NAV_MENU).prev(Selector.NAV_LINK)\n let goBackLabel = `go back to ${$topMenu.text()} menu`\n\n if (!$topMenu.length) {\n goBackLabel = `go back to ${$(this).closest(Selector.MEGAMENU_PANEL).prev(Selector.NAV_LINK).text()} menu`\n }\n\n $thisNav.attr({\n id: navId,\n role: 'menu'\n })\n $thisNavToggler.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-expanded': false,\n 'aria-haspopup': true\n })\n $thisNavBackLink.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-label': goBackLabel\n })\n })\n }\n\n _initPosition(target) {\n if (!$(target).length) {\n return\n }\n\n const $target = $(target).first()\n const position = $target.parents().index(this._element)\n const rootPosition = $('.mega-menu-panel .nav-link').first().parents().index($('.mega-menu'))\n const translatePercentage = -(position - rootPosition) * PERCENTAGE / 2\n const $thisNav = $target.closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // open collapse\n if ($target.attr('data-toggle') === 'collapse') {\n $target.siblings(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.siblings(Selector.MEGAMENU_PANEL)).collapse('hide')\n $(this._element).height('auto')\n $rootNav.css('transform', 'translateX(0%)')\n } else {\n $target.closest(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.closest(Selector.MEGAMENU_PANEL)).collapse('hide')\n\n // show menu and hide other\n $target.parents(Selector.NAV_MENU).show()\n\n // set aria on parent links\n $target.parents(Selector.NAV_ITEM).find('> .nav-link').not($target).attr({\n tabindex: -1,\n 'aria-hidden': true,\n 'aria-expanded': true\n })\n\n // translate to pos\n $rootNav.css('transform', `translateX(${translatePercentage}%)`)\n if (translatePercentage) {\n // adapt main collapse height to target height\n $(this._element).height($thisNav.height())\n } else {\n $(this._element).height('auto')\n }\n }\n\n // set focus on target link\n setTimeout(() => {\n if (!this._config.noFocus) {\n // set focus on target link\n $target.trigger('focus')\n }\n\n $rootNav.removeClass(ClassName.TRANSITIONING)\n }, TIMEOUT)\n }\n\n _manageKeyDown(event) {\n const $thisTarget = $(event.target)\n\n // test key code\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n // proceed according to key code\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n this._goBackward(event)\n break\n case ARROW_RIGHT_KEYCODE:\n this._goForward(event)\n break\n case ARROW_UP_KEYCODE:\n // focus prev nav link\n $thisTarget.parent().prev().find('>.nav-link').not(Selector.NAV_LINK_BACK).trigger('focus')\n break\n case ARROW_DOWN_KEYCODE:\n // focus next nav link\n $thisTarget.parent().next().find('>.nav-link').trigger('focus')\n break\n default:\n }\n }\n\n _collapseFocus() {\n $(this).find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n }\n\n _handleCollapseToggle(e) {\n const $this = $(e.target)\n const $thisCollapse = $($this.attr('href'))\n\n this._$topCollapseMenus.not($thisCollapse).collapse('hide')\n }\n\n _goForward(e) {\n e.preventDefault()\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $this.next(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $thisNavToggler = $this\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!$this.next(Selector.NAV_MENU).length || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // hide all nav on same level\n $thisNav.find(Selector.NAV_MENU).hide()\n\n // show target navbar-nav\n $targetNav.show()\n\n // adapt main collapse height to target height\n $(Selector.MEGAMENU).height($targetNav.height())\n\n // make only visible elements focusable\n if (!currentTranslatePercentage) {\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n }\n $thisNav.find(Selector.NAV_LINK).attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage - PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $thisNavToggler.attr('aria-expanded', true)\n $targetNav.find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n _goBackward(e) {\n e.preventDefault()\n\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $thisNav.parent().closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $targetNavToggler = $targetNav.find(Selector.NAV_LINK_EXPANDED)\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!currentTranslatePercentage || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // make only visible elements focusable\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n if (currentTranslatePercentage === -PERCENTAGE) {\n // reset main collapse height\n $(Selector.MEGAMENU).css('height', 'auto')\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n }\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage + PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $targetNavToggler.attr('aria-expanded', false)\n $targetNavToggler.trigger('focus')\n $thisNav.hide()\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n if (!$(this).is(Selector.MEGAMENU)) {\n throw new TypeError('Element is not a mega menu')\n }\n\n if (!config) {\n config = {}\n } else if (config.noFocus && typeof config.noFocus !== 'boolean') {\n // param = true\n throw new TypeError('no-focus parameter must be boolean')\n }\n\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new MegaMenu(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (config.target) {\n if (typeof config.target !== 'string' || !/^[.#].*/.test(config.target)) {\n throw new TypeError(`Selector \"${config.target}\" is not supported`)\n }\n\n data.goTo(config.target)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = MegaMenu._jQueryInterface\n$.fn[NAME].Constructor = MegaMenu\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return MegaMenu._jQueryInterface\n}\n\nexport default MegaMenu\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .position-fixed'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n\n // Boosted mod\n this._addAria()\n // end mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._setEscapeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualRight = element.style.right\n const calculatedRight = $(element).css('right')\n $(element)\n .data('right', actualRight)\n .css('right', `${parseFloat(calculatedRight) + this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const right = $(element).data('right')\n $(element).removeData('right')\n element.style.right = right ? right : ''\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Boosted mod\n _addAria() {\n const $ModalPanel = $(this._element)\n const $ModalTitle = $ModalPanel.find('.modal-title')\n const $ModalDialog = $ModalPanel.find('.modal-dialog')\n\n $ModalPanel.attr({\n role: 'dialog',\n 'aria-modal': true\n })\n\n if ($ModalTitle) {\n const ModalTitleId = $ModalTitle.attr('id')\n if (ModalTitleId) {\n $ModalPanel.attr({\n 'aria-labelledby' : ModalTitleId\n })\n }\n }\n\n if ($ModalDialog) {\n $ModalDialog.attr('role', 'document')\n }\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-navbar.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'navbar'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.navbar'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst BREAKPOINT = 768\n\nconst Default = {\n sticky : false,\n trigger : ''\n}\n\nconst DefaultType = {\n sticky : 'boolean',\n trigger : 'string'\n}\n\nconst Selector = {\n SUPRA_BAR : '.navbar.supra',\n MEGAMENU_PANEL : '.mega-menu.panel'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Navbar {\n constructor(element, config) {\n this._element = element\n this._supraBar = element.querySelector(Selector.SUPRA_BAR)\n this._config = this._getConfig(config)\n this._initialHeight = $(this._element).outerHeight()\n this._initialSupraHeight = $(this._supraBar).outerHeight()\n\n this._addAria()\n\n if (this._config.sticky) {\n $(this._element).addClass('fixed-top')\n $(Selector.MEGAMENU_PANEL).addClass('sticky')\n $(document.body).css('padding-top', this._initialHeight)\n\n $(window).on('scroll', () => {\n const Scroll = $(window).scrollTop()\n if (Scroll > 0) {\n $(this._element).addClass('minimized')\n } else {\n $(this._element).removeClass('minimized')\n }\n })\n }\n\n if (this._config.hideSupra) {\n $(window).on('scroll', () => {\n if ($(window).innerWidth() < BREAKPOINT) {\n return\n }\n\n const Scroll = $(window).scrollTop()\n\n if (Scroll > 0) {\n $(Selector.SUPRA_BAR).hide()\n } else {\n $(Selector.SUPRA_BAR).show()\n }\n })\n }\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // private\n\n _getConfig(config) {\n config = $.extend({}, Default, config)\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _addAria() {\n $(this._element).find('.navbar .nav-link[data-toggle]').attr('aria-haspopup', true)\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Navbar(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Navbar._jQueryInterface\n$.fn[NAME].Constructor = Navbar\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Navbar._jQueryInterface\n}\n\nexport default Navbar\n","/**\n * ------------------------------------------------------------------------------------------------------\n * Boosted (v4.3.1): otab.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * ------------------------------------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'otab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.otab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst DEFAULT_THRESHOLD = 2\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ACTIVE : 'active',\n SHOW : 'show',\n ACCORDION_LAYOUT: 'accordion-layout'\n}\n\nconst Selector = {\n OTAB_HEADING: '.o-tab-heading',\n OTAB_CONTENT: '.o-tab-content'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Otab {\n constructor(element) {\n this._element = element\n this._addAccessibility()\n\n if ($(this._element).parent().find(Selector.OTAB_HEADING).length > DEFAULT_THRESHOLD) {\n $(this._element).parent().addClass(ClassName.ACCORDION_LAYOUT)\n }\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n\n // public\n show() {\n const $element = $(this._element)\n\n if ($element.next().hasClass(ClassName.SHOW)) {\n return\n }\n\n // from parent remove all tab-content show classes\n $element.parent().find(Selector.OTAB_CONTENT).removeClass(ClassName.SHOW)\n // remove all aria-expanded=true\n $element.parent().find('[aria-expanded=\"true\"]').attr('aria-expanded', false)\n // add show class to next tab-content\n $element.next().addClass(ClassName.SHOW)\n // add aria-expanded=true to element\n $element.attr('aria-expanded', true)\n }\n\n // private\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $tab.next()\n\n $tab.attr('id', Util.getUID(NAME))\n $tabpanel.attr('id', Util.getUID(NAME))\n\n $tab.attr({\n 'aria-controls': $tabpanel.attr('id'),\n role: 'tab'\n })\n $tabpanel.attr({\n 'aria-labelledby': $tab.attr('id'),\n role: 'tabpanel',\n tabindex: 0\n })\n\n if ($tabpanel.hasClass(ClassName.SHOW)) {\n $tab.attr('aria-expanded', true)\n } else {\n $tab.attr('aria-expanded', false)\n }\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Otab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on('DOMContentLoaded', () => {\n Otab._jQueryInterface.call($(Selector.OTAB_HEADING), 'init')\n })\n .on(Event.CLICK_DATA_API, Selector.OTAB_HEADING, function (event) {\n event.preventDefault()\n Otab._jQueryInterface.call($(this), ClassName.SHOW)\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Otab._jQueryInterface\n$.fn[NAME].Constructor = Otab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Otab._jQueryInterface\n}\n\nexport default Otab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div></div>',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n // boosted mod fix rtl\n let attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n // boosted mod fix rtl\n const dir = document.getElementsByTagName('html')[0].dir\n if (dir === 'rtl') {\n const hash = {\n right: 'left',\n left: 'right'\n }\n attachment = attachment.replace(/right|left/g, (matched) => hash[matched])\n }\n // end mod\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div></div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-priority-nav.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'prioritynav'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.prioritynav'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst RESIZE_DURATION = 500\nconst TAB_KEYCODE = 9\n\nconst Event = {\n RESIZE: 'resize',\n FOCUS: 'focus'\n}\n\nconst ClassName = {\n PRIORITY: 'priority',\n HIDE: 'sr-only',\n RESIZING: 'resizing'\n}\n\nconst Selector = {\n NAV_ELEMENTS: 'li:not(\\'.overflow-nav\\')',\n FIRST_ELEMENT: 'li:first',\n PRIORITY_ELEMENT: '.priority'\n}\n\nconst MenuLabelDefault = 'More'\n\nfunction MenuTemplate(MenuLabel) {\n return `\n <li class=\"overflow-nav nav-item dropdown\">\n <a href=\"#\" class=\"dropdown-toggle nav-link\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\">${MenuLabel}</a>\n <ul class=\"overflow-nav-list dropdown-menu dropdown-menu-right\"></ul>\n </li>\n`\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass PriorityNav {\n constructor(element, config) {\n this._element = element\n this._config = config\n\n if ($(element).is('ul')) {\n this._$menu = $(element)\n } else {\n this._$menu = $(element).find('ul').first()\n }\n this._initMenu()\n this._$allNavElements = this._$menu.find(Selector.NAV_ELEMENTS)\n this._bindUIActions()\n this._setupMenu()\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _initMenu() {\n let MenuLabel = this._config\n\n if (typeof MenuLabel === 'undefined') {\n MenuLabel = MenuLabelDefault\n }\n\n // add menu template\n this._$menu.append(MenuTemplate(MenuLabel))\n }\n\n _setupMenu() {\n const $allNavElements = this._$allNavElements\n\n // Checking top position of first item (sometimes changes)\n const firstPos = this._$menu.find(Selector.FIRST_ELEMENT).position()\n\n // Empty collection in which to put menu items to move\n let $wrappedElements = $()\n\n // Used to snag the previous menu item in addition to ones that have wrapped\n let first = true\n\n // Loop through all the nav items...\n this._$allNavElements.each(function (i) {\n const $elm = $(this)\n\n // ...in which to find wrapped elements\n const pos = $elm.position()\n\n if (pos.top !== firstPos.top) {\n // If element is wrapped, add it to set\n $wrappedElements = $wrappedElements.add($elm)\n\n // Add the previous one too, if first\n if (first) {\n $wrappedElements = $wrappedElements.add($allNavElements.eq(i - 1))\n first = false\n }\n }\n })\n\n if ($wrappedElements.length) {\n // Clone set before altering\n const newSet = $wrappedElements.clone()\n\n // Hide ones that we're moving\n $wrappedElements.addClass(ClassName.HIDE)\n $wrappedElements.find('.nav-link').attr('tabindex', -1)\n\n // Add wrapped elements to dropdown\n this._$menu.find('.overflow-nav-list').append(newSet)\n\n // Show new menu\n this._$menu.find('.overflow-nav').addClass('show-inline-block')\n\n // Make overflow visible again so dropdown can be seen.\n this._$menu.find('.o-nav-local').css('overflow', 'visible')\n\n // Check if menu doesn't overflow after process\n if (this._$menu.find('.overflow-nav').position().top !== firstPos.top) {\n const $item = $(this._element).find(`.${ClassName.HIDE}`).first().prev()\n const $itemDuplicate = $item.clone()\n\n $item.addClass(ClassName.HIDE)\n $item.find('.nav-link').attr('tabindex', -1)\n\n this._$menu.find('.overflow-nav-list').prepend($itemDuplicate)\n }\n }\n\n // hide menu from AT\n this._$menu.find('.overflow-nav').attr('aria-hidden', true)\n }\n\n _tearDown() {\n this._$menu.find('.overflow-nav-list').empty()\n this._$menu.find('.overflow-nav').removeClass('show-inline-block')\n this._$allNavElements.removeClass(ClassName.HIDE)\n this._$allNavElements.find('.nav-link').attr('tabindex', 0)\n }\n\n _bindUIActions() {\n $(window).on(Event.RESIZE, () => {\n this._$menu.addClass(ClassName.RESIZING)\n\n setTimeout(() => {\n this._tearDown()\n this._setupMenu()\n this._$menu.removeClass(ClassName.RESIZING)\n }, RESIZE_DURATION)\n })\n\n this._$menu.find('.overflow-nav .dropdown-toggle').on('keyup', (e) => {\n if (e.which === TAB_KEYCODE) {\n $(e.target).dropdown('toggle')\n }\n })\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new PriorityNav(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config !== 'undefined' && config) {\n if (typeof config !== 'string') {\n throw new TypeError('Priority nav label type must be string')\n }\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = PriorityNav._jQueryInterface\n$.fn[NAME].Constructor = PriorityNav\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return PriorityNav._jQueryInterface\n}\n\nexport default PriorityNav\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-scroll-up.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollup'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollup'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst SCROLLANIMATE = 500\n\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst Event = {\n SCROLL : `scroll${EVENT_KEY}`,\n CLICK_SCROLL : `click${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLL_TOP : 'o-scroll-up'\n}\n\nconst Selector = {\n SCROLL_TOP : '.o-scroll-up:not(.static)'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollUp {\n constructor(element) {\n this._element = element\n this._scrollElement = window\n\n $(window).on(Event.SCROLL, $.proxy(this._process, this))\n $(Selector.SCROLL_TOP).on(Event.CLICK_SCROLL, $.proxy(this._backToTop, this))\n $(this._element).addClass('is-fixed')\n this._process()\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n\n // public\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n }\n\n\n // private\n\n _process() {\n if ($(this._scrollElement).scrollTop() > Number($(this._scrollElement).height())) {\n $(Selector.SCROLL_TOP).show()\n } else {\n $(Selector.SCROLL_TOP).hide()\n }\n }\n\n _clear() {\n $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)\n }\n\n _backToTop() {\n if (typeof $.animate === 'function') {\n $('html, body').animate({\n scrollTop: 0\n }, SCROLLANIMATE)\n } else {\n $('html, body').scrollTop(0)\n }\n }\n\n // static\n\n static _jQueryInterface() {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n if (!data) {\n data = new ScrollUp(this)\n $(this).data(DATA_KEY, data)\n }\n })\n }\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollUps = $.makeArray($(Selector.SCROLL_TOP))\n for (let i = scrollUps.length; i--;) {\n const $scrollup = $(scrollUps[i])\n ScrollUp._jQueryInterface.call($scrollup, $scrollup.data())\n }\n})\n\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollUp._jQueryInterface\n$.fn[NAME].Constructor = ScrollUp\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollUp._jQueryInterface\n}\n\nexport default ScrollUp\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\n // Handle special case when .nav-link is inside .nav-item\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\n }\n\n $(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n [].slice.call(document.querySelectorAll(this._selector))\n .filter((node) => node.classList.contains(ClassName.ACTIVE))\n .forEach((node) => node.classList.remove(ClassName.ACTIVE))\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new ScrollSpy(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\n const scrollSpysLength = scrollSpys.length\n\n for (let i = scrollSpysLength; i--;) {\n const $spy = $(scrollSpys[i])\n ScrollSpy._jQueryInterface.call($spy, $spy.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n// boosted mod\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_LEFT_KEYCODE}|${ARROW_UP_KEYCODE}|${ARROW_RIGHT_KEYCODE}|${ARROW_DOWN_KEYCODE}`)\n// end mod\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}` // boosted mod\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active',\n DISABLED : 'disabled',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DROPDOWN : '.dropdown',\n NAV_LIST_GROUP : '.nav, .list-group',\n ACTIVE : '.active',\n ACTIVE_UL : '> li > .active',\n DATA_TOGGLE : '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n DROPDOWN_TOGGLE : '.dropdown-toggle',\n DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab {\n constructor(element) {\n this._element = element\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n show() {\n if (this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n $(this._element).hasClass(ClassName.ACTIVE) ||\n $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n let target\n let previous\n const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\n const selector = Util.getSelectorFromElement(this._element)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\n previous = $.makeArray($(listElement).find(itemSelector))\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = $.Event(Event.HIDE, {\n relatedTarget: this._element\n })\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget: previous\n })\n\n if (previous) {\n $(previous).trigger(hideEvent)\n }\n\n $(this._element).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented() ||\n hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n this._activate(\n this._element,\n listElement\n )\n\n const complete = () => {\n const hiddenEvent = $.Event(Event.HIDDEN, {\n relatedTarget: this._element\n })\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget: previous\n })\n\n $(previous).trigger(hiddenEvent)\n $(this._element).trigger(shownEvent)\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\n ? $(container).find(Selector.ACTIVE_UL)\n : $(container).children(Selector.ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\n const complete = () => this._transitionComplete(\n element,\n active,\n callback\n )\n\n // Boosted mod\n $(container).find('.nav-link:not(.dropdown-toggle)').attr({\n tabIndex : '-1',\n 'aria-selected' : false\n })\n $(container).find('.tab-pane').attr({\n 'aria-hidden' : true,\n tabIndex : '-1'\n })\n // end mod\n\n if (active && isTransitioning) {\n const transitionDuration = Util.getTransitionDurationFromElement(active)\n\n $(active)\n .removeClass(ClassName.SHOW)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n $(active).removeClass(ClassName.ACTIVE)\n\n const dropdownChild = $(active.parentNode).find(\n Selector.DROPDOWN_ACTIVE_CHILD\n )[0]\n\n if (dropdownChild) {\n $(dropdownChild).removeClass(ClassName.ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n $(element).addClass(ClassName.ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n // Boosted mod\n $(element).filter('.nav-link:not(.dropdown-toggle).active').attr({\n tabIndex : '0',\n 'aria-selected' : true\n })\n $(element).filter('.tab-pane.active').attr({\n 'aria-hidden' : false,\n tabIndex : '0'\n })\n // end mod\n\n Util.reflow(element)\n\n if (element.classList.contains(ClassName.FADE)) {\n element.classList.add(ClassName.SHOW)\n }\n\n if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\n\n if (dropdownElement) {\n const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\n\n $(dropdownToggleList).addClass(ClassName.ACTIVE)\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Boosted mod\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $($tab.attr('href'))\n const $tablist = $tab.closest(Selector.NAV_LIST_GROUP)\n const tabId = $tab.attr('id') || Util.getUID(NAME)\n\n $tab.attr('id', tabId)\n\n if ($tabpanel) {\n $tab.attr('role', 'tab')\n $tablist.attr('role', 'tablist')\n // $li.attr('role', 'presentation')\n }\n\n if ($tab.hasClass(ClassName.ACTIVE)) {\n $tab.attr({\n tabIndex : '0',\n 'aria-selected' : 'true'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '0',\n 'aria-hidden' : 'false',\n 'aria-labelledby': tabId\n })\n } else {\n $tab.attr({\n tabIndex : '-1',\n 'aria-selected' : 'false'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '-1',\n 'aria-hidden' : 'true',\n 'aria-labelledby': tabId\n })\n }\n }\n // end mod\n\n // Static\n\n // Boosted mod\n static _dataApiKeydownHandler(e) {\n const $this = $(this)\n const Items = $this.closest('ul[role=tablist] ').find('[role=tab]:visible')\n const k = e.which || e.keyCode\n\n let index = 0\n\n index = Items.index(Items.filter(':focus'))\n\n if (k === ARROW_UP_KEYCODE || k === ARROW_LEFT_KEYCODE) {\n index--\n } // up & left\n if (k === ARROW_RIGHT_KEYCODE || k === ARROW_DOWN_KEYCODE) {\n index++\n } // down & right\n\n if (index < 0) {\n index = Items.length - 1\n }\n if (index === Items.length) {\n index = 0\n }\n const nextTab = Items.eq(index)\n\n if (nextTab.attr('role') === 'tab') {\n nextTab.tab('show').trigger('focus')\n }\n\n e.preventDefault()\n e.stopPropagation()\n }\n // end mod\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Tab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n Tab._jQueryInterface.call($(this), 'show')\n })\n // Boosted mod\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, function (event) {\n if (!REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n event.preventDefault()\n Tab._dataApiKeydownHandler.call($(this), event)\n })\n .on('DOMContentLoaded', () => {\n Tab._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tab._jQueryInterface\n$.fn[NAME].Constructor = Tab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tab._jQueryInterface\n}\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Event = {\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n HIDE : 'hide',\n SHOW : 'show',\n SHOWING : 'showing'\n}\n\nconst DefaultType = {\n animation : 'boolean',\n autohide : 'boolean',\n delay : 'number'\n}\n\nconst Default = {\n animation : true,\n autohide : true,\n delay : 500\n}\n\nconst Selector = {\n DATA_DISMISS : '[data-dismiss=\"toast\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast {\n constructor(element, config) {\n this._element = element\n this._config = this._getConfig(config)\n this._timeout = null\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show() {\n $(this._element).trigger(Event.SHOW)\n\n if (this._config.animation) {\n this._element.classList.add(ClassName.FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(ClassName.SHOWING)\n this._element.classList.add(ClassName.SHOW)\n\n $(this._element).trigger(Event.SHOWN)\n\n if (this._config.autohide) {\n this.hide()\n }\n }\n\n this._element.classList.remove(ClassName.HIDE)\n this._element.classList.add(ClassName.SHOWING)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n hide(withoutTimeout) {\n if (!this._element.classList.contains(ClassName.SHOW)) {\n return\n }\n\n $(this._element).trigger(Event.HIDE)\n\n if (withoutTimeout) {\n this._close()\n } else {\n this._timeout = setTimeout(() => {\n this._close()\n }, this._config.delay)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n this._timeout = null\n\n if (this._element.classList.contains(ClassName.SHOW)) {\n this._element.classList.remove(ClassName.SHOW)\n }\n\n $(this._element).off(Event.CLICK_DISMISS)\n\n $.removeData(this._element, DATA_KEY)\n this._element = null\n this._config = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...$(this._element).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _setListeners() {\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n () => this.hide(true)\n )\n }\n\n _close() {\n const complete = () => {\n this._element.classList.add(ClassName.HIDE)\n $(this._element).trigger(Event.HIDDEN)\n }\n\n this._element.classList.remove(ClassName.SHOW)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new Toast(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Toast._jQueryInterface\n$.fn[NAME].Constructor = Toast\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Toast._jQueryInterface\n}\n\nexport default Toast\n","import $ from 'jquery'\nimport Alert from './alert'\nimport Button from './button'\nimport Carousel from './carousel'\nimport Collapse from './collapse'\nimport Dropdown from './dropdown'\nimport MegaMenu from './o-megamenu'\nimport Modal from './modal'\nimport Navbar from './o-navbar'\nimport Otab from './o-tab'\nimport Popover from './popover'\nimport PriorityNav from './o-priority-nav'\nimport ScrollUp from './o-scroll-up'\nimport Scrollspy from './scrollspy'\nimport Tab from './tab'\nimport Toast from './toast'\nimport Tooltip from './tooltip'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(() => {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n})()\n\nexport {\n Util,\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n MegaMenu,\n Modal,\n Navbar,\n Otab,\n Popover,\n PriorityNav,\n ScrollUp,\n Scrollspy,\n Tab,\n Toast,\n Tooltip\n}\n"],"names":["TRANSITION_END","MAX_UID","MILLISECONDS_MULTIPLIER","toType","obj","toString","call","match","toLowerCase","getSpecialTransitionEndEvent","bindType","delegateType","handle","event","$","target","is","handleObj","handler","apply","arguments","undefined","transitionEndEmulator","duration","called","one","Util","setTimeout","triggerTransitionEnd","setTransitionEndSupport","fn","emulateTransitionEnd","special","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","expectedTypes","value","valueType","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","NAME","VERSION","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","Selector","DISMISS","Event","CLOSE","CLOSED","CLICK_DATA_API","ClassName","ALERT","FADE","SHOW","Alert","_element","close","rootElement","_getRootElement","customEvent","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","ACTIVE","BUTTON","FOCUS","DATA_TOGGLE_CARROT","DATA_TOGGLE","INPUT","FOCUS_BLUR_DATA_API","Button","toggle","input","activeElement","classList","checked","add","setAttribute","contains","button","toggleClass","type","ARROW_LEFT_KEYCODE","ARROW_RIGHT_KEYCODE","TOUCHEVENT_COMPAT_WAIT","SWIPE_THRESHOLD","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","Direction","NEXT","PREV","LEFT","RIGHT","SLIDE","SLID","KEYDOWN","MOUSEENTER","MOUSELEAVE","TOUCHSTART","TOUCHMOVE","TOUCHEND","POINTERDOWN","POINTERUP","DRAG_START","LOAD_DATA_API","CAROUSEL","ITEM","POINTER_EVENT","ACTIVE_ITEM","ITEM_IMG","NEXT_PREV","INDICATORS","DATA_SLIDE","DATA_RIDE","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","window","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","length","direction","off","_handleSwipe","absDeltax","abs","_keydown","_addTouchEventListeners","start","originalEvent","pointerType","clientX","touches","move","end","clearTimeout","querySelectorAll","e","tagName","which","slice","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","isGoingToWrap","delta","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","slidEvent","nextElementInterval","parseInt","defaultInterval","action","TypeError","ride","_dataApiClickHandler","slideIndex","carousels","i","len","$carousel","SHOWN","HIDE","HIDDEN","COLLAPSE","COLLAPSING","COLLAPSED","Dimension","WIDTH","HEIGHT","ACTIVES","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","complete","capitalizedDimension","scrollSize","getBoundingClientRect","triggerArrayLength","$elem","isTransitioning","hasWidth","jquery","_getTargetFromElement","triggerArray","isOpen","$this","currentTarget","$trigger","selectors","$target","ESCAPE_KEYCODE","SPACE_KEYCODE","TAB_KEYCODE","ARROW_UP_KEYCODE","ARROW_DOWN_KEYCODE","RIGHT_MOUSE_BUTTON_WHICH","REGEXP_KEYDOWN","CLICK","KEYDOWN_DATA_API","KEYUP_DATA_API","DISABLED","DROPUP","DROPRIGHT","DROPLEFT","MENURIGHT","MENULEFT","POSITION_STATIC","FORM_CHILD","MENU","NAVBAR_NAV","MENU_ITEMS","FIRST_ITEM_IN_MENU","VISIBLE_ITEMS","AttachmentMap","TOP","TOPEND","BOTTOM","BOTTOMEND","RIGHTEND","LEFTEND","offset","flip","boundary","reference","display","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","_addAccessibility","disabled","_getParentFromElement","isActive","_clearMenus","showEvent","Popper","referenceElement","_getPopperConfig","body","noop","focus","find","first","hideEvent","destroy","update","scheduleUpdate","stopPropagation","constructor","_getPlacement","$parentDropdown","placement","_getOffset","offsets","popperConfig","modifiers","enabled","preventOverflow","boundariesElement","applyStyle","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","TIMEOUT","PERCENTAGE","SPLITLENGHT","TRANSITIONING","MEGAMENU","ROOT_NAV","MEGAMENU_PANEL","MEGAMENU_NAV","NAV_MENU","NAV_ITEM","NAV_LINK","NAV_LINK_COLLAPSE","NAV_LINK_BACK","NAV_LINK_EXPANDED","MegaMenu","_$navLinks","_$goForwardLinks","_$goBackLinks","_$topCollapseMenus","_$navLinkCollapses","noFocus","_addAriaAttributes","goTo","_initPosition","_goForward","_goBackward","_manageKeyDown","_collapseFocus","_handleCollapseToggle","$subNavs","navId","$thisNavToggler","$thisNav","$thisNavBackLink","$topMenu","goBackLabel","text","role","position","parents","rootPosition","translatePercentage","$rootNav","siblings","collapse","height","tabindex","$thisTarget","$thisCollapse","$targetNav","currentTranslatePos","navWidth","width","currentTranslatePercentage","$targetNavToggler","backdrop","FOCUSIN","RESIZE","CLICK_DISMISS","KEYDOWN_DISMISS","MOUSEUP_DISMISS","MOUSEDOWN_DISMISS","SCROLLABLE","SCROLLBAR_MEASURER","BACKDROP","OPEN","DIALOG","MODAL_BODY","DATA_DISMISS","FIXED_CONTENT","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_addAria","_checkScrollbar","_setScrollbar","_setEscapeEvent","_showBackdrop","_showElement","transition","_hideModal","forEach","htmlElement","Node","ELEMENT_NODE","appendChild","removeAttribute","scrollTop","_enforceFocus","shownEvent","transitionComplete","has","_resetScrollbar","_removeBackdrop","callback","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","rect","left","right","innerWidth","_getScrollbarWidth","fixedContent","actualRight","calculatedRight","actualPadding","paddingRight","calculatedPadding","padding","scrollDiv","scrollbarWidth","clientWidth","removeChild","$ModalPanel","$ModalTitle","$ModalDialog","ModalTitleId","BREAKPOINT","sticky","SUPRA_BAR","Navbar","_supraBar","_initialHeight","outerHeight","_initialSupraHeight","Scroll","hideSupra","extend","DEFAULT_THRESHOLD","ACCORDION_LAYOUT","OTAB_HEADING","OTAB_CONTENT","Otab","$tab","$tabpanel","uriAttrs","ARIA_ATTRIBUTE_PATTERN","DefaultWhitelist","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attrName","nodeName","nodeValue","regExp","attrRegex","l","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","domParser","DOMParser","createdDocument","parseFromString","whitelistKeys","keys","elements","el","elName","attributeList","attributes","whitelistedAttributes","concat","innerHTML","CLASS_PREFIX","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","html","container","fallbackPlacement","sanitize","AUTO","HoverState","OUT","INSERTED","FOCUSOUT","TOOLTIP","TOOLTIP_INNER","ARROW","Trigger","HOVER","MANUAL","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","isWithContent","shadowRoot","isInTheDom","ownerDocument","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","dir","getElementsByTagName","hash","replace","matched","behavior","arrow","onCreate","originalPlacement","_handlePopperPlacementChange","onUpdate","_fixTransition","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","empty","append","triggers","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","key","$tip","tabClass","join","popperData","popperInstance","instance","popper","initConfigAnimation","TITLE","CONTENT","Popover","_getContent","RESIZE_DURATION","PRIORITY","RESIZING","NAV_ELEMENTS","FIRST_ELEMENT","PRIORITY_ELEMENT","MenuLabelDefault","MenuTemplate","MenuLabel","PriorityNav","_$menu","_initMenu","_$allNavElements","_bindUIActions","_setupMenu","$allNavElements","firstPos","$wrappedElements","$elm","pos","top","eq","newSet","clone","$item","$itemDuplicate","prepend","_tearDown","dropdown","SCROLLANIMATE","method","SCROLL","CLICK_SCROLL","SCROLL_TOP","ScrollUp","_scrollElement","proxy","_process","_backToTop","Number","_clear","scrollUps","makeArray","$scrollup","ACTIVATE","DROPDOWN_ITEM","DROPDOWN_MENU","DATA_SPY","NAV_LIST_GROUP","NAV_LINKS","NAV_ITEMS","LIST_ITEMS","DROPDOWN","DROPDOWN_ITEMS","DROPDOWN_TOGGLE","OffsetMethod","OFFSET","POSITION","ScrollSpy","_offsets","_targets","_activeTarget","_scrollHeight","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targets","map","targetSelector","targetBCR","item","sort","pageYOffset","scrollHeight","max","_getOffsetHeight","innerHeight","maxScroll","_activate","offsetLength","isActiveTarget","queries","$link","node","scrollSpys","scrollSpysLength","$spy","ACTIVE_UL","DROPDOWN_ACTIVE_CHILD","Tab","previous","listElement","itemSelector","hiddenEvent","activeElements","active","_transitionComplete","tabIndex","dropdownChild","dropdownElement","dropdownToggleList","$tablist","tabId","substr","Items","k","keyCode","nextTab","tab","SHOWING","autohide","Toast","withoutTimeout","_close","version","minMajor","ltMajor","minMinor","minPatch","maxMajor"],"mappings":"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"} \ No newline at end of file
diff --git a/dashboard/public/js/boosted.min.js b/dashboard/public/js/boosted.min.js
new file mode 100644
index 00000000..b68d173c
--- /dev/null
+++ b/dashboard/public/js/boosted.min.js
@@ -0,0 +1,12 @@
+/*!
+ * Boosted v4.3.1 (https://boosted.orange.com)
+ * Copyright 2014-2019 The Boosted Authors
+ * Copyright 2014-2019 Orange
+ * Licensed under MIT (https://github.com/orange-opensource/orange-boosted-bootstrap/blob/master/LICENSE)
+ * This a fork of Bootstrap : Initial license below
+ * Bootstrap v4.3.1 (https://boosted.orange.com)
+ * Copyright 2011-2019 The Boosted Authors (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).boosted={},t.jQuery,t.Popper)}(this,function(t,g,f){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}g=g&&g.hasOwnProperty("default")?g.default:g,f=f&&f.hasOwnProperty("default")?f.default:f;var e="transitionend";function n(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css("transition-duration"),n=g(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};g.fn.emulateTransitionEnd=n,g.event.special[_.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=g.fn[o],h={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},u="alert",d="fade",m="show",p=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=g(t).closest("."+u)[0]),n},t._triggerCloseEvent=function(t){var e=g.Event(h.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(m),g(e).hasClass(d)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),g.fn[o]=p._jQueryInterface,g.fn[o].Constructor=p,g.fn[o].noConflict=function(){return g.fn[o]=c,p._jQueryInterface};var v="button",y="bs.button",E="."+y,C=".data-api",b=g.fn[v],w="active",T="btn",I="focus",S='[data-toggle^="button"]',D='[data-toggle="buttons"]',A='input:not([type="hidden"])',N=".active",O=".btn",k={CLICK_DATA_API:"click"+E+C,FOCUS_BLUR_DATA_API:"focus"+E+C+" blur"+E+C},L=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=g(this._element).closest(D)[0],e=this._element.querySelector(A);if(t){var n=t.querySelector(N);n&&n.classList.remove(w)}e?e.checked?this._element.classList.add(w):this._element.classList.remove(w):(this._element.classList.toggle(w),this._element.setAttribute("aria-pressed",this._element.classList.contains(w)))},t.dispose=function(){g.removeData(this._element,y),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(y);t||(t=new n(this),g(this).data(y,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();g(document).on(k.CLICK_DATA_API,S,function(t){var e=t.target;g(e).hasClass(T)||(e=g(e).closest(O)),L._jQueryInterface.call(g(e),"toggle")}).on(k.FOCUS_BLUR_DATA_API,S,function(t){var e=g(t.target).closest(O)[0];e&&g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}).on(k.FOCUS_BLUR_DATA_API,A<S,function(t){var e=g(t.target).closest(O)[0];e&&g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g.fn[v]=L._jQueryInterface,g.fn[v].Constructor=L,g.fn[v].noConflict=function(){return g.fn[v]=b,L._jQueryInterface};var P="carousel",j="bs.carousel",x="."+j,H=".data-api",R=g.fn[P],F={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},M={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},U="next",Q="prev",W="left",K="right",q={SLIDE:"slide"+x,SLID:"slid"+x,KEYDOWN:"keydown"+x,MOUSEENTER:"mouseenter"+x,MOUSELEAVE:"mouseleave"+x,TOUCHSTART:"touchstart"+x,TOUCHMOVE:"touchmove"+x,TOUCHEND:"touchend"+x,POINTERDOWN:"pointerdown"+x,POINTERUP:"pointerup"+x,DRAG_START:"dragstart"+x,LOAD_DATA_API:"load"+x+H,CLICK_DATA_API:"click"+x+H},B="carousel",$="active",V="slide",Y="carousel-item-right",X="carousel-item-left",z="carousel-item-next",G="carousel-item-prev",J="pointer-event",Z=".active",tt=".active.carousel-item",et=".carousel-item",nt=".carousel-item img",it=".carousel-item-next, .carousel-item-prev",ot=".carousel-indicators",rt="[data-slide], [data-slide-to]",st='[data-ride="carousel"]',at={TOUCH:"touch",PEN:"pen"},lt=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(ot),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(U)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(":visible")&&"hidden"!==g(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(Q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(it)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(tt);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?U:Q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(x),g.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},F,t),_.typeCheckConfig(P,t,M),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&g(this._element).on(q.MOUSEENTER,function(t){return e.pause(t)}).on(q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};g(this._element.querySelectorAll(nt)).on(q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(q.POINTERDOWN,function(t){return e(t)}),g(this._element).on(q.POINTERUP,function(t){return i(t)}),this._element.classList.add(J)):(g(this._element).on(q.TOUCHSTART,function(t){return e(t)}),g(this._element).on(q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),g(this._element).on(q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(et)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===U,i=t===Q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===Q?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(tt)),o=g.Event(q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(Z));g(e).removeClass($);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass($)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(tt),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===U?(n=X,i=z,W):(n=Y,i=G,K),l&&g(l).hasClass($))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass(V)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+" "+i).addClass($),g(s).removeClass($+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass($),g(l).addClass($),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(j),e=l({},F,g(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(j,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(B)){var i=l({},g(n).data(),g(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(j).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return F}}]),r}();g(document).on(q.CLICK_DATA_API,rt,lt._dataApiClickHandler),g(window).on(q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(st)),e=0,n=t.length;e<n;e++){var i=g(t[e]);lt._jQueryInterface.call(i,i.data())}}),g.fn[P]=lt._jQueryInterface,g.fn[P].Constructor=lt,g.fn[P].noConflict=function(){return g.fn[P]=R,lt._jQueryInterface};var ct="collapse",ht="bs.collapse",ut="."+ht,ft=g.fn[ct],dt={toggle:!0,parent:""},gt={toggle:"boolean",parent:"(string|element)"},_t={SHOW:"show"+ut,SHOWN:"shown"+ut,HIDE:"hide"+ut,HIDDEN:"hidden"+ut,CLICK_DATA_API:"click"+ut+".data-api"},mt="show",pt="collapse",vt="collapsing",yt="collapsed",Et="width",Ct="height",bt="*:not(.multi) > .show, *:not(.multi) > .collapsing",wt='[data-toggle="collapse"]',Tt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(wt)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(bt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(pt)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(ht))&&e._isTransitioning))){var i=g.Event(_t.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),"hide"),e||g(t).data(ht,null));var o=this._getDimension();g(this._element).removeClass(pt).addClass(vt),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(yt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(vt).addClass(pt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),g(n._element).trigger(_t.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(mt)){var e=g.Event(_t.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",_.reflow(this._element),g(this._element).addClass(vt).removeClass(pt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(mt)||g(r).addClass(yt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(vt).addClass(pt).trigger(_t.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,ht),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},dt,t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ct,t,gt),t},t._getDimension=function(){return g(this._element).hasClass(Et)?Et:Ct},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(mt);e.length&&g(e).toggleClass(yt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(ht),n=l({},dt,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide|init/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ht,e)),!/init/.test(i)&&"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return dt}}]),a}();g(document).on(_t.CLICK_DATA_API,wt,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(ht)?"toggle":n.data();Tt._jQueryInterface.call(t,e)})}).on("DOMContentLoaded",function(){g(wt).each(function(){var t=Tt._getTargetFromElement(this);Tt._jQueryInterface.call(g(t),"init")})}),g.fn[ct]=Tt._jQueryInterface,g.fn[ct].Constructor=Tt,g.fn[ct].noConflict=function(){return g.fn[ct]=ft,Tt._jQueryInterface};var It="dropdown",St="bs.dropdown",Dt="."+St,At=".data-api",Nt=g.fn[It],Ot=new RegExp("38|40|27"),kt={HIDE:"hide"+Dt,HIDDEN:"hidden"+Dt,SHOW:"show"+Dt,SHOWN:"shown"+Dt,CLICK:"click"+Dt,CLICK_DATA_API:"click"+Dt+At,KEYDOWN_DATA_API:"keydown"+Dt+At,KEYUP_DATA_API:"keyup"+Dt+At},Lt="disabled",Pt="show",jt="dropup",xt="dropright",Ht="dropleft",Rt="dropdown-menu-right",Ft="position-static",Mt='[data-toggle="dropdown"]',Ut=".dropdown form",Qt=".dropdown-menu",Wt=".navbar-nav",Kt=".dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)",qt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Bt="top-start",$t="top-end",Vt="bottom-start",Yt="bottom-end",Xt="right-start",zt="left-start",Gt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Jt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Zt=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners(),this._addAccessibility()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Lt)){var t=c._getParentFromElement(this._element),e=g(this._menu).hasClass(Pt);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=g.Event(kt.SHOW,n);if(g(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof f)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:_.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&g(t).addClass(Ft),this._popper=new f(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===g(t).closest(Wt).length&&g(document.body).children().on("mouseover",null,g.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),g(this._menu).toggleClass(Pt),g(t).toggleClass(Pt).trigger(g.Event(kt.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||g(this._element).hasClass(Lt)||g(this._menu).hasClass(Pt))){var t={relatedTarget:this._element},e=g.Event(kt.SHOW,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Pt),g(n).toggleClass(Pt).trigger(g.Event(kt.SHOWN,t)),g(n).find(Kt).first().trigger("focus"))}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Lt)&&g(this._menu).hasClass(Pt)){var t={relatedTarget:this._element},e=g.Event(kt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Pt),g(n).toggleClass(Pt).trigger(g.Event(kt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,St),g(this._element).off(Dt),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(kt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,g(this._element).data(),t),_.typeCheckConfig(It,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Vt;return t.hasClass(jt)?(e=Bt,g(this._menu).hasClass(Rt)&&(e=$t)):t.hasClass(xt)?e=Xt:t.hasClass(Ht)?e=zt:g(this._menu).hasClass(Rt)&&(e=Yt),e},t._detectNavbar=function(){return 0<g(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},t._addAccessibility=function(){g(this._element).attr("aria-haspopup",!0),g(this._element).parent().children(Qt).attr("role","menu"),g(this._element).parent().children(Qt).children(".dropdown-item").attr("role","menuitem")},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(St);if(t||(t=new c(this,"object"==typeof e?e:null),g(this).data(St,t)),!/init/.test(e)&&"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Mt)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(St),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Pt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(kt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),e[n].setAttribute("aria-expanded","false"),g(a).removeClass(Pt),g(o).removeClass(Pt).trigger(g.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(Qt).length)):Ot.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Lt))){var e=c._getParentFromElement(this),n=g(e).hasClass(Pt);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(qt));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Mt);g(r).trigger("focus")}g(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Gt}},{key:"DefaultType",get:function(){return Jt}}]),c}();g(document).on(kt.KEYDOWN_DATA_API,Mt,Zt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,Qt,Zt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Zt._clearMenus).on(kt.CLICK_DATA_API,Mt,function(t){t.preventDefault(),t.stopPropagation(),Zt._jQueryInterface.call(g(this),"toggle")}).on(kt.CLICK_DATA_API,Ut,function(t){t.stopPropagation()}).on("DOMContentLoaded",function(){Zt._jQueryInterface.call(g(Mt),"init")}),g.fn[It]=Zt._jQueryInterface,g.fn[It].Constructor=Zt,g.fn[It].noConflict=function(){return g.fn[It]=Nt,Zt._jQueryInterface};var te="megamenu",ee="bs.megamenu",ne=g.fn[te],ie="transitioning",oe=".mega-menu",re=".mega-menu > .navbar-nav",se=".mega-menu-panel",ae=".nav-link + .navbar-nav",le=".navbar-nav",ce=".nav-item",he=".nav-link",ue=".nav-link[data-toggle=collapse]",fe=".nav-link.back",de=".nav-link[aria-expanded=true]",ge=function(){function n(t,e){this._element=t,this._$navLinks=g(this._element).find(he),this._$goForwardLinks=g(this._element).find(ae).prev(he),this._$goBackLinks=g(this._element).find(fe),this._$topCollapseMenus=g(this._element).find(se),this._$navLinkCollapses=g(this._element).find(ue),this._config=e,"undefined"==typeof this._config.noFocus&&(this._config.noFocus=!1),this._addEventListeners(),this._addAriaAttributes(this._element),this.goTo=this._initPosition}var t=n.prototype;return t._addEventListeners=function(){var e=this;this._$goForwardLinks.on("click",function(t){return e._goForward(t)}),this._$goBackLinks.on("click",function(t){return e._goBackward(t)}),this._$navLinks.on("keydown",function(t){return e._manageKeyDown(t)}),this._config.noFocus||this._$topCollapseMenus.on("shown.bs.collapse",this._collapseFocus),this._$navLinkCollapses.on("click",function(t){return e._handleCollapseToggle(t)})},t._addAriaAttributes=function(t){var e=g(t).find(".nav-link + .navbar-nav");g(t).attr("role","application"),g(t).find("> .navbar-nav").attr("role","menu"),g(t).find(se).attr("role","menu"),g(t).find(".nav-link[data-toggle=collapse]").attr("role","menuitem"),g(t).find(fe).attr({"aria-hidden":!0}),g(t).find(ce).attr("role","presentation"),e.each(function(){var t=_.getUID(te),e=g(this).prev(he),n=g(this),i=n.find(fe),o=g(this).closest(le).parent().closest(le).prev(he),r="go back to "+o.text()+" menu";o.length||(r="go back to "+g(this).closest(se).prev(he).text()+" menu"),n.attr({id:t,role:"menu"}),e.attr({role:"menuitem","aria-controls":t,"aria-expanded":!1,"aria-haspopup":!0}),i.attr({role:"menuitem","aria-controls":t,"aria-label":r})})},t._initPosition=function(t){var e=this;if(g(t).length){var n=g(t).first(),i=100*-(n.parents().index(this._element)-g(".mega-menu-panel .nav-link").first().parents().index(g(".mega-menu")))/2,o=n.closest(le),r=g(re);r.addClass(ie),"collapse"===n.attr("data-toggle")?(n.siblings(se).collapse("show"),this._$topCollapseMenus.not(n.siblings(se)).collapse("hide"),g(this._element).height("auto"),r.css("transform","translateX(0%)")):(n.closest(se).collapse("show"),this._$topCollapseMenus.not(n.closest(se)).collapse("hide"),n.parents(le).show(),n.parents(ce).find("> .nav-link").not(n).attr({tabindex:-1,"aria-hidden":!0,"aria-expanded":!0}),r.css("transform","translateX("+i+"%)"),i?g(this._element).height(o.height()):g(this._element).height("auto")),setTimeout(function(){e._config.noFocus||n.trigger("focus"),r.removeClass(ie)},1e3)}},t._manageKeyDown=function(t){var e=g(t.target);if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:this._goBackward(t);break;case 39:this._goForward(t);break;case 38:e.parent().prev().find(">.nav-link").not(fe).trigger("focus");break;case 40:e.parent().next().find(">.nav-link").trigger("focus")}},t._collapseFocus=function(){g(this).find(he).not(fe).first().trigger("focus")},t._handleCollapseToggle=function(t){var e=g(t.target),n=g(e.attr("href"));this._$topCollapseMenus.not(n).collapse("hide")},t._goForward=function(t){t.preventDefault();var e=g(t.target),n=e.closest(le),i=e.next(le),o=g(re),r=e,s=100*parseInt(o.css("transform").split(",")[4],10)/o.width();return!(!e.next(le).length||o.hasClass(ie))&&(o.addClass(ie),n.find(le).hide(),i.show(),g(oe).height(i.height()),s||o.find(">.nav-item .nav-link").attr({tabindex:-1,"aria-hidden":!0}),n.find(he).attr({tabindex:-1,"aria-hidden":!0}),i.find(he).attr({tabindex:0,"aria-hidden":!1}),o.css("transform","translateX("+(s-100)+"%)"),o.one("transitionend",function(){r.attr("aria-expanded",!0),i.find(he).not(fe).first().trigger("focus"),o.removeClass(ie)}),!0)},t._goBackward=function(t){t.preventDefault();var e=g(t.target).closest(le),n=e.parent().closest(le),i=g(re),o=n.find(de),r=100*parseInt(i.css("transform").split(",")[4],10)/i.width();return!(!r||i.hasClass(ie))&&(i.addClass(ie),n.find(he).attr({tabindex:0,"aria-hidden":!1}),-100===r&&(g(oe).css("height","auto"),i.find(">.nav-item .nav-link").attr({tabindex:0,"aria-hidden":!1})),i.css("transform","translateX("+(r+100)+"%)"),i.one("transitionend",function(){o.attr("aria-expanded",!1),o.trigger("focus"),e.hide(),i.removeClass(ie)}),!0)},n._jQueryInterface=function(e){return this.each(function(){if(!g(this).is(oe))throw new TypeError("Element is not a mega menu");if(e){if(e.noFocus&&"boolean"!=typeof e.noFocus)throw new TypeError("no-focus parameter must be boolean")}else e={};var t=g(this).data(ee);if(t||(t=new n(this,e),g(this).data(ee,t)),e.target){if("string"!=typeof e.target||!/^[.#].*/.test(e.target))throw new TypeError('Selector "'+e.target+'" is not supported');t.goTo(e.target)}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();g.fn[te]=ge._jQueryInterface,g.fn[te].Constructor=ge,g.fn[te].noConflict=function(){return g.fn[te]=ne,ge._jQueryInterface};var _e="modal",me="bs.modal",pe="."+me,ve=g.fn[_e],ye={backdrop:!0,keyboard:!0,focus:!0,show:!0},Ee={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},Ce={HIDE:"hide"+pe,HIDDEN:"hidden"+pe,SHOW:"show"+pe,SHOWN:"shown"+pe,FOCUSIN:"focusin"+pe,RESIZE:"resize"+pe,CLICK_DISMISS:"click.dismiss"+pe,KEYDOWN_DISMISS:"keydown.dismiss"+pe,MOUSEUP_DISMISS:"mouseup.dismiss"+pe,MOUSEDOWN_DISMISS:"mousedown.dismiss"+pe,CLICK_DATA_API:"click"+pe+".data-api"},be="modal-dialog-scrollable",we="modal-scrollbar-measure",Te="modal-backdrop",Ie="modal-open",Se="fade",De="show",Ae=".modal-dialog",Ne=".modal-body",Oe='[data-toggle="modal"]',ke='[data-dismiss="modal"]',Le=".fixed-top, .fixed-bottom, .is-fixed, .position-fixed",Pe=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(Ae),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0,this._addAria()}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(Se)&&(this._isTransitioning=!0);var n=g.Event(Ce.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._setEscapeEvent(),g(this._element).on(Ce.CLICK_DISMISS,ke,function(t){return e.hide(t)}),g(this._dialog).on(Ce.MOUSEDOWN_DISMISS,function(){g(e._element).one(Ce.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(Ce.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(Se);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),g(document).off(Ce.FOCUSIN),g(this._element).removeClass(De),g(this._element).off(Ce.CLICK_DISMISS),g(this._dialog).off(Ce.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(pe)}),g(document).off(Ce.FOCUSIN),g.removeData(this._element,me),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t._getConfig=function(t){return t=l({},ye,t),_.typeCheckConfig(_e,t,Ee),t},t._showElement=function(t){var e=this,n=g(this._element).hasClass(Se);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),g(this._dialog).hasClass(be)?this._dialog.querySelector(Ne).scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(De),this._config.focus&&this._enforceFocus();var i=g.Event(Ce.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(i)};if(n){var r=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;g(document).off(Ce.FOCUSIN).on(Ce.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(Ce.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||g(this._element).off(Ce.KEYDOWN_DISMISS)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(Ie),t._resetScrollbar(),g(t._element).trigger(Ce.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(Se)?Se:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=Te,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(Ce.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(De),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(De);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(Se)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(Le));g(t).each(function(t,e){var n=e.style.right,i=g(e).css("right");g(e).data("right",n).css("right",parseFloat(i)+o._scrollbarWidth+"px")});var e=document.body.style.paddingRight,n=g(document.body).css("padding-right");g(document.body).data("padding-right",e).css("padding-right",parseFloat(n)+this._scrollbarWidth+"px")}g(document.body).addClass(Ie)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(Le));g(t).each(function(t,e){var n=g(e).data("right");g(e).removeData("right"),e.style.right=n||""});var e=g(document.body).data("padding-right");g(document.body).removeData("padding-right"),document.body.style.paddingRight=e||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=we,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},t._addAria=function(){var t=g(this._element),e=t.find(".modal-title"),n=t.find(".modal-dialog");if(t.attr({role:"dialog","aria-modal":!0}),e){var i=e.attr("id");i&&t.attr({"aria-labelledby":i})}n&&n.attr("role","document")},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(me),e=l({},ye,g(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(me,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ye}}]),o}();g(document).on(Ce.CLICK_DATA_API,Oe,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(me)?"toggle":l({},g(e).data(),g(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=g(e).one(Ce.SHOW,function(t){t.isDefaultPrevented()||r.one(Ce.HIDDEN,function(){g(n).is(":visible")&&n.focus()})});Pe._jQueryInterface.call(g(e),o,this)}),g.fn[_e]=Pe._jQueryInterface,g.fn[_e].Constructor=Pe,g.fn[_e].noConflict=function(){return g.fn[_e]=ve,Pe._jQueryInterface};var je="navbar",xe="bs.navbar",He=g.fn[je],Re={sticky:!1,trigger:""},Fe={sticky:"boolean",trigger:"string"},Me=".navbar.supra",Ue=".mega-menu.panel",Qe=function(){function i(t,e){var n=this;this._element=t,this._supraBar=t.querySelector(Me),this._config=this._getConfig(e),this._initialHeight=g(this._element).outerHeight(),this._initialSupraHeight=g(this._supraBar).outerHeight(),this._addAria(),this._config.sticky&&(g(this._element).addClass("fixed-top"),g(Ue).addClass("sticky"),g(document.body).css("padding-top",this._initialHeight),g(window).on("scroll",function(){0<g(window).scrollTop()?g(n._element).addClass("minimized"):g(n._element).removeClass("minimized")})),this._config.hideSupra&&g(window).on("scroll",function(){g(window).innerWidth()<768||(0<g(window).scrollTop()?g(Me).hide():g(Me).show())})}var t=i.prototype;return t._getConfig=function(t){return t=g.extend({},Re,t),_.typeCheckConfig(je,t,Fe),t},t._addAria=function(){g(this._element).find(".navbar .nav-link[data-toggle]").attr("aria-haspopup",!0)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(xe),e=l({},Re,g(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new i(this,e),g(this).data(xe,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Re}}]),i}();g.fn[je]=Qe._jQueryInterface,g.fn[je].Constructor=Qe,g.fn[je].noConflict=function(){return g.fn[je]=He,Qe._jQueryInterface};var We="otab",Ke="bs.otab",qe=g.fn[We],Be={CLICK_DATA_API:"click.bs.otab.data-api"},$e="show",Ve="accordion-layout",Ye=".o-tab-heading",Xe=".o-tab-content",ze=function(){function i(t){this._element=t,this._addAccessibility(),2<g(this._element).parent().find(Ye).length&&g(this._element).parent().addClass(Ve)}var t=i.prototype;return t.show=function(){var t=g(this._element);t.next().hasClass($e)||(t.parent().find(Xe).removeClass($e),t.parent().find('[aria-expanded="true"]').attr("aria-expanded",!1),t.next().addClass($e),t.attr("aria-expanded",!0))},t._addAccessibility=function(){var t=g(this._element),e=t.next();t.attr("id",_.getUID(We)),e.attr("id",_.getUID(We)),t.attr({"aria-controls":e.attr("id"),role:"tab"}),e.attr({"aria-labelledby":t.attr("id"),role:"tabpanel",tabindex:0}),e.hasClass($e)?t.attr("aria-expanded",!0):t.attr("aria-expanded",!1)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Ke);if(e||(e=new i(this),t.data(Ke,e)),!/init/.test(n)&&"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on("DOMContentLoaded",function(){ze._jQueryInterface.call(g(Ye),"init")}).on(Be.CLICK_DATA_API,Ye,function(t){t.preventDefault(),ze._jQueryInterface.call(g(this),$e)}),g.fn[We]=ze._jQueryInterface,g.fn[We].Constructor=ze,g.fn[We].noConflict=function(){return g.fn[We]=qe,ze._jQueryInterface};var Ge=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Je={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ze=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,tn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function en(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===Ge.indexOf(n)||Boolean(t.nodeValue.match(Ze)||t.nodeValue.match(tn));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var nn="tooltip",on="bs.tooltip",rn="."+on,sn=g.fn[nn],an="bs-tooltip",ln=new RegExp("(^|\\s)"+an+"\\S+","g"),cn=["sanitize","whiteList","sanitizeFn"],hn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},un={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},fn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Je},dn="show",gn="out",_n={HIDE:"hide"+rn,HIDDEN:"hidden"+rn,SHOW:"show"+rn,SHOWN:"shown"+rn,INSERTED:"inserted"+rn,CLICK:"click"+rn,FOCUSIN:"focusin"+rn,FOCUSOUT:"focusout"+rn,MOUSEENTER:"mouseenter"+rn,MOUSELEAVE:"mouseleave"+rn},mn="fade",pn="show",vn=".tooltip-inner",yn=".arrow",En="hover",Cn="focus",bn="click",wn="manual",Tn=function(){function i(t,e){if("undefined"==typeof f)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(pn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(mn);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();if(g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),"rtl"===document.getElementsByTagName("html")[0].dir){var c={right:"left",left:"right"};a=a.replace(/right|left/g,function(t){return c[t]})}this._popper=new f(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:yn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(pn),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var h=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===gn&&e._leave(null,e)};if(g(this.tip).hasClass(mn)){var u=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,h).emulateTransitionEnd(u)}else h()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==dn&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(pn),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[bn]=!1,this._activeTrigger[Cn]=!1,this._activeTrigger[En]=!1,g(this.tip).hasClass(mn)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(an+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(vn)),this.getTitle()),g(t).removeClass(mn+" "+pn)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=en(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return un[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==wn){var e=t===En?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===En?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Cn:En]=!0),g(e.getTipElement()).hasClass(pn)||e._hoverState===dn?e._hoverState=dn:(clearTimeout(e._timeout),e._hoverState=dn,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===dn&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Cn:En]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=gn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===gn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==cn.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(nn,t,this.constructor.DefaultType),t.sanitize&&(t.template=en(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(ln);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(mn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(on),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(on,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return fn}},{key:"NAME",get:function(){return nn}},{key:"DATA_KEY",get:function(){return on}},{key:"Event",get:function(){return _n}},{key:"EVENT_KEY",get:function(){return rn}},{key:"DefaultType",get:function(){return hn}}]),i}();g.fn[nn]=Tn._jQueryInterface,g.fn[nn].Constructor=Tn,g.fn[nn].noConflict=function(){return g.fn[nn]=sn,Tn._jQueryInterface};var In="popover",Sn="bs.popover",Dn="."+Sn,An=g.fn[In],Nn="bs-popover",On=new RegExp("(^|\\s)"+Nn+"\\S+","g"),kn=l({},Tn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Ln=l({},Tn.DefaultType,{content:"(string|element|function)"}),Pn="fade",jn="show",xn=".popover-header",Hn=".popover-body",Rn={HIDE:"hide"+Dn,HIDDEN:"hidden"+Dn,SHOW:"show"+Dn,SHOWN:"shown"+Dn,INSERTED:"inserted"+Dn,CLICK:"click"+Dn,FOCUSIN:"focusin"+Dn,FOCUSOUT:"focusout"+Dn,MOUSEENTER:"mouseenter"+Dn,MOUSELEAVE:"mouseleave"+Dn},Fn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Nn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(xn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Hn),e),t.removeClass(Pn+" "+jn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(On);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Sn),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Sn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return kn}},{key:"NAME",get:function(){return In}},{key:"DATA_KEY",get:function(){return Sn}},{key:"Event",get:function(){return Rn}},{key:"EVENT_KEY",get:function(){return Dn}},{key:"DefaultType",get:function(){return Ln}}]),i}(Tn);g.fn[In]=Fn._jQueryInterface,g.fn[In].Constructor=Fn,g.fn[In].noConflict=function(){return g.fn[In]=An,Fn._jQueryInterface};var Mn="prioritynav",Un="bs.prioritynav",Qn=g.fn[Mn],Wn="resize",Kn="sr-only",qn="resizing",Bn="li:not('.overflow-nav')",$n="li:first";var Vn=function(){function n(t,e){this._element=t,this._config=e,g(t).is("ul")?this._$menu=g(t):this._$menu=g(t).find("ul").first(),this._initMenu(),this._$allNavElements=this._$menu.find(Bn),this._bindUIActions(),this._setupMenu()}var t=n.prototype;return t._initMenu=function(){var t=this._config;"undefined"==typeof t&&(t="More"),this._$menu.append('\n <li class="overflow-nav nav-item dropdown">\n <a href="#" class="dropdown-toggle nav-link" data-toggle="dropdown" role="button" aria-haspopup="true">'+t+'</a>\n <ul class="overflow-nav-list dropdown-menu dropdown-menu-right"></ul>\n </li>\n')},t._setupMenu=function(){var n=this._$allNavElements,i=this._$menu.find($n).position(),o=g(),r=!0;if(this._$allNavElements.each(function(t){var e=g(this);e.position().top!==i.top&&(o=o.add(e),r&&(o=o.add(n.eq(t-1)),r=!1))}),o.length){var t=o.clone();if(o.addClass(Kn),o.find(".nav-link").attr("tabindex",-1),this._$menu.find(".overflow-nav-list").append(t),this._$menu.find(".overflow-nav").addClass("show-inline-block"),this._$menu.find(".o-nav-local").css("overflow","visible"),this._$menu.find(".overflow-nav").position().top!==i.top){var e=g(this._element).find("."+Kn).first().prev(),s=e.clone();e.addClass(Kn),e.find(".nav-link").attr("tabindex",-1),this._$menu.find(".overflow-nav-list").prepend(s)}}this._$menu.find(".overflow-nav").attr("aria-hidden",!0)},t._tearDown=function(){this._$menu.find(".overflow-nav-list").empty(),this._$menu.find(".overflow-nav").removeClass("show-inline-block"),this._$allNavElements.removeClass(Kn),this._$allNavElements.find(".nav-link").attr("tabindex",0)},t._bindUIActions=function(){var t=this;g(window).on(Wn,function(){t._$menu.addClass(qn),setTimeout(function(){t._tearDown(),t._setupMenu(),t._$menu.removeClass(qn)},500)}),this._$menu.find(".overflow-nav .dropdown-toggle").on("keyup",function(t){9===t.which&&g(t.target).dropdown("toggle")})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Un);if(t||(t=new n(this,e),g(this).data(Un,t)),"undefined"!=typeof e&&e&&"string"!=typeof e)throw new TypeError("Priority nav label type must be string")})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();g.fn[Mn]=Vn._jQueryInterface,g.fn[Mn].Constructor=Vn,g.fn[Mn].noConflict=function(){return g.fn[Mn]=Qn,Vn._jQueryInterface};var Yn="scrollup",Xn="bs.scrollup",zn="."+Xn,Gn=g.fn[Yn],Jn={offset:10,method:"auto",target:""},Zn={SCROLL:"scroll"+zn,CLICK_SCROLL:"click"+zn,LOAD_DATA_API:"load"+zn+".data-api"},ti={SCROLL_TOP:"o-scroll-up"},ei={SCROLL_TOP:".o-scroll-up:not(.static)"},ni=function(){function e(t){this._element=t,this._scrollElement=window,g(window).on(Zn.SCROLL,g.proxy(this._process,this)),g(ei.SCROLL_TOP).on(Zn.CLICK_SCROLL,g.proxy(this._backToTop,this)),g(this._element).addClass("is-fixed"),this._process()}var t=e.prototype;return t.dispose=function(){g.removeData(this._element,Xn),g(this._scrollElement).off(zn),this._element=null,this._scrollElement=null},t._process=function(){g(this._scrollElement).scrollTop()>Number(g(this._scrollElement).height())?g(ei.SCROLL_TOP).show():g(ei.SCROLL_TOP).hide()},t._clear=function(){g(this._selector).filter(ei.ACTIVE).removeClass(ti.ACTIVE)},t._backToTop=function(){"function"==typeof g.animate?g("html, body").animate({scrollTop:0},500):g("html, body").scrollTop(0)},e._jQueryInterface=function(){return this.each(function(){var t=g(this).data(Xn);t||(t=new e(this),g(this).data(Xn,t))})},s(e,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Jn}}]),e}();g(window).on(Zn.LOAD_DATA_API,function(){for(var t=g.makeArray(g(ei.SCROLL_TOP)),e=t.length;e--;){var n=g(t[e]);ni._jQueryInterface.call(n,n.data())}}),g.fn[Yn]=ni._jQueryInterface,g.fn[Yn].Constructor=ni,g.fn[Yn].noConflict=function(){return g.fn[Yn]=Gn,ni._jQueryInterface};var ii="scrollspy",oi="bs.scrollspy",ri="."+oi,si=g.fn[ii],ai={offset:10,method:"auto",target:""},li={offset:"number",method:"string",target:"(string|element)"},ci={ACTIVATE:"activate"+ri,SCROLL:"scroll"+ri,LOAD_DATA_API:"load"+ri+".data-api"},hi="dropdown-item",ui="active",fi='[data-spy="scroll"]',di=".nav, .list-group",gi=".nav-link",_i=".nav-item",mi=".list-group-item",pi=".dropdown",vi=".dropdown-item",yi=".dropdown-toggle",Ei="offset",Ci="position",bi=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+gi+","+this._config.target+" "+mi+","+this._config.target+" "+vi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(ci.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?Ei:Ci,o="auto"===this._config.method?t:this._config.method,r=o===Ci?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,oi),g(this._scrollElement).off(ri),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},ai,"object"==typeof t&&t?t:{})).target){var e=g(t.target).attr("id");e||(e=_.getUID(ii),g(t.target).attr("id",e)),t.target="#"+e}return _.typeCheckConfig(ii,t,li),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=g([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(hi)?(n.closest(pi).find(yi).addClass(ui),n.addClass(ui)):(n.addClass(ui),n.parents(di).prev(gi+", "+mi).addClass(ui),n.parents(di).prev(_i).children(gi).addClass(ui)),g(this._scrollElement).trigger(ci.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(ui)}).forEach(function(t){return t.classList.remove(ui)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(oi);if(t||(t=new n(this,"object"==typeof e&&e),g(this).data(oi,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ai}}]),n}();g(window).on(ci.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(fi)),e=t.length;e--;){var n=g(t[e]);bi._jQueryInterface.call(n,n.data())}}),g.fn[ii]=bi._jQueryInterface,g.fn[ii].Constructor=bi,g.fn[ii].noConflict=function(){return g.fn[ii]=si,bi._jQueryInterface};var wi="tab",Ti="bs.tab",Ii="."+Ti,Si=".data-api",Di=g.fn.tab,Ai=new RegExp("37|38|39|40"),Ni={HIDE:"hide"+Ii,HIDDEN:"hidden"+Ii,SHOW:"show"+Ii,SHOWN:"shown"+Ii,CLICK_DATA_API:"click"+Ii+Si,KEYDOWN_DATA_API:"keydown"+Ii+Si},Oi="dropdown-menu",ki="active",Li="disabled",Pi="fade",ji="show",xi=".dropdown",Hi=".nav, .list-group",Ri=".active",Fi="> li > .active",Mi='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Ui=".dropdown-toggle",Qi="> .dropdown-menu .active",Wi=function(){function i(t){this._element=t,this._addAccessibility()}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(ki)||g(this._element).hasClass(Li))){var t,i,e=g(this._element).closest(Hi)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Fi:Ri;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(Ni.HIDE,{relatedTarget:this._element}),a=g.Event(Ni.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(Ni.HIDDEN,{relatedTarget:n._element}),e=g.Event(Ni.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,Ti),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Ri):g(e).find(Fi))[0],r=n&&o&&g(o).hasClass(Pi),s=function(){return i._transitionComplete(t,o,n)};if(g(e).find(".nav-link:not(.dropdown-toggle)").attr({tabIndex:"-1","aria-selected":!1}),g(e).find(".tab-pane").attr({"aria-hidden":!0,tabIndex:"-1"}),o&&r){var a=_.getTransitionDurationFromElement(o);g(o).removeClass(ji).one(_.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(ki);var i=g(e.parentNode).find(Qi)[0];i&&g(i).removeClass(ki),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(ki),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),g(t).filter(".nav-link:not(.dropdown-toggle).active").attr({tabIndex:"0","aria-selected":!0}),g(t).filter(".tab-pane.active").attr({"aria-hidden":!1,tabIndex:"0"}),_.reflow(t),t.classList.contains(Pi)&&t.classList.add(ji),t.parentNode&&g(t.parentNode).hasClass(Oi)){var o=g(t).closest(xi)[0];if(o){var r=[].slice.call(o.querySelectorAll(Ui));g(r).addClass(ki)}t.setAttribute("aria-expanded",!0)}n&&n()},t._addAccessibility=function(){var t=g(this._element),e=g(t.attr("href")),n=t.closest(Hi),i=t.attr("id")||_.getUID(wi);t.attr("id",i),e&&(t.attr("role","tab"),n.attr("role","tablist")),t.hasClass(ki)?(t.attr({tabIndex:"0","aria-selected":"true"}),t.attr("href")&&t.attr("aria-controls",t.attr("href").substr(1)),e.attr({role:"tabpanel",tabIndex:"0","aria-hidden":"false","aria-labelledby":i})):(t.attr({tabIndex:"-1","aria-selected":"false"}),t.attr("href")&&t.attr("aria-controls",t.attr("href").substr(1)),e.attr({role:"tabpanel",tabIndex:"-1","aria-hidden":"true","aria-labelledby":i}))},i._dataApiKeydownHandler=function(t){var e=g(this).closest("ul[role=tablist] ").find("[role=tab]:visible"),n=t.which||t.keyCode,i=0;i=e.index(e.filter(":focus")),38!==n&&37!==n||i--,39!==n&&40!==n||i++,i<0&&(i=e.length-1),i===e.length&&(i=0);var o=e.eq(i);"tab"===o.attr("role")&&o.tab("show").trigger("focus"),t.preventDefault(),t.stopPropagation()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Ti);if(e||(e=new i(this),t.data(Ti,e)),!/init/.test(n)&&"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(Ni.CLICK_DATA_API,Mi,function(t){t.preventDefault(),Wi._jQueryInterface.call(g(this),"show")}).on(Ni.KEYDOWN_DATA_API,Mi,function(t){Ai.test(t.which)&&(t.preventDefault(),Wi._dataApiKeydownHandler.call(g(this),t))}).on("DOMContentLoaded",function(){Wi._jQueryInterface.call(g(Mi),"init")}),g.fn.tab=Wi._jQueryInterface,g.fn.tab.Constructor=Wi,g.fn.tab.noConflict=function(){return g.fn.tab=Di,Wi._jQueryInterface};var Ki="toast",qi="bs.toast",Bi="."+qi,$i=g.fn[Ki],Vi={CLICK_DISMISS:"click.dismiss"+Bi,HIDE:"hide"+Bi,HIDDEN:"hidden"+Bi,SHOW:"show"+Bi,SHOWN:"shown"+Bi},Yi="fade",Xi="hide",zi="show",Gi="showing",Ji={animation:"boolean",autohide:"boolean",delay:"number"},Zi={animation:!0,autohide:!0,delay:500},to='[data-dismiss="toast"]',eo=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;g(this._element).trigger(Vi.SHOW),this._config.animation&&this._element.classList.add(Yi);var e=function(){t._element.classList.remove(Gi),t._element.classList.add(zi),g(t._element).trigger(Vi.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove(Xi),this._element.classList.add(Gi),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(zi)&&(g(this._element).trigger(Vi.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(zi)&&this._element.classList.remove(zi),g(this._element).off(Vi.CLICK_DISMISS),g.removeData(this._element,qi),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},Zi,g(this._element).data(),"object"==typeof t&&t?t:{}),_.typeCheckConfig(Ki,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(Vi.CLICK_DISMISS,to,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add(Xi),g(t._element).trigger(Vi.HIDDEN)};if(this._element.classList.remove(zi),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(qi);if(e||(e=new i(this,"object"==typeof n&&n),t.data(qi,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Ji}},{key:"Default",get:function(){return Zi}}]),i}();g.fn[Ki]=eo._jQueryInterface,g.fn[Ki].Constructor=eo,g.fn[Ki].noConflict=function(){return g.fn[Ki]=$i,eo._jQueryInterface},function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=_,t.Alert=p,t.Button=L,t.Carousel=lt,t.Collapse=Tt,t.Dropdown=Zt,t.MegaMenu=ge,t.Modal=Pe,t.Navbar=Qe,t.Otab=ze,t.Popover=Fn,t.PriorityNav=Vn,t.ScrollUp=ni,t.Scrollspy=bi,t.Tab=Wi,t.Toast=eo,t.Tooltip=Tn,Object.defineProperty(t,"__esModule",{value:!0})});
+//# sourceMappingURL=boosted.min.js.map \ No newline at end of file
diff --git a/dashboard/public/js/boosted.min.js.map b/dashboard/public/js/boosted.min.js.map
new file mode 100644
index 00000000..cedb5975
--- /dev/null
+++ b/dashboard/public/js/boosted.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/o-megamenu.js","../../js/src/modal.js","../../js/src/o-navbar.js","../../js/src/o-tab.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/o-priority-nav.js","../../js/src/o-scroll-up.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/src/index.js"],"names":["TRANSITION_END","transitionEndEmulator","duration","_this","this","called","$","one","Util","setTimeout","triggerTransitionEnd","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","ShadowRoot","parentNode","root","fn","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","NAME","DATA_KEY","EVENT_KEY","JQUERY_NO_CONFLICT","Event","CLOSE","CLOSED","CLICK_DATA_API","ClassName","Alert","_element","close","rootElement","_getRootElement","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","DATA_API_KEY","Selector","FOCUS_BLUR_DATA_API","Button","toggle","input","activeElement","classList","checked","add","setAttribute","contains","button","toggleClass","type","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","Direction","SLIDE","SLID","KEYDOWN","MOUSEENTER","MOUSELEAVE","TOUCHSTART","TOUCHMOVE","TOUCHEND","POINTERDOWN","POINTERUP","DRAG_START","LOAD_DATA_API","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","window","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","length","direction","off","_objectSpread","_handleSwipe","absDeltax","abs","_this2","_keydown","_addTouchEventListeners","_this3","start","originalEvent","pointerType","clientX","touches","end","clearTimeout","querySelectorAll","e","tagName","which","slice","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","directionalClassName","orderClassName","_this4","activeElementIndex","nextElement","nextElementIndex","isCycling","slidEvent","nextElementInterval","parseInt","defaultInterval","action","TypeError","ride","_dataApiClickHandler","slideIndex","carousels","i","len","$carousel","SHOW","SHOWN","HIDE","HIDDEN","Dimension","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","scrollSize","getBoundingClientRect","triggerArrayLength","isTransitioning","jquery","_getTargetFromElement","triggerArray","isOpen","$this","currentTarget","$trigger","selectors","$target","REGEXP_KEYDOWN","ARROW_UP_KEYCODE","CLICK","KEYDOWN_DATA_API","KEYUP_DATA_API","AttachmentMap","offset","flip","boundary","reference","display","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","_addAccessibility","disabled","_getParentFromElement","isActive","_clearMenus","showEvent","Popper","referenceElement","_getPopperConfig","body","noop","focus","find","first","hideEvent","destroy","update","scheduleUpdate","stopPropagation","constructor","_getPlacement","$parentDropdown","placement","_getOffset","offsets","popperConfig","modifiers","enabled","preventOverflow","boundariesElement","applyStyle","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","MegaMenu","_$navLinks","_$goForwardLinks","_$goBackLinks","_$topCollapseMenus","_$navLinkCollapses","noFocus","_addAriaAttributes","goTo","_initPosition","_goForward","_goBackward","_manageKeyDown","_collapseFocus","_handleCollapseToggle","$subNavs","aria-hidden","navId","$thisNavToggler","$thisNav","$thisNavBackLink","$topMenu","goBackLabel","text","role","aria-controls","aria-expanded","aria-haspopup","aria-label","translatePercentage","parents","$rootNav","siblings","collapse","height","tabindex","$thisTarget","$thisCollapse","$targetNav","currentTranslatePercentage","width","$targetNavToggler","backdrop","FOCUSIN","RESIZE","CLICK_DISMISS","KEYDOWN_DISMISS","MOUSEUP_DISMISS","MOUSEDOWN_DISMISS","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_addAria","_checkScrollbar","_setScrollbar","_setEscapeEvent","_showBackdrop","_showElement","transition","_hideModal","forEach","htmlElement","Node","ELEMENT_NODE","appendChild","removeAttribute","scrollTop","_enforceFocus","shownEvent","transitionComplete","has","_this5","_this6","_resetScrollbar","_removeBackdrop","callback","_this7","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","rect","left","right","innerWidth","_getScrollbarWidth","_this8","fixedContent","actualRight","calculatedRight","actualPadding","paddingRight","calculatedPadding","padding","scrollDiv","scrollbarWidth","clientWidth","removeChild","$ModalPanel","$ModalTitle","$ModalDialog","aria-modal","ModalTitleId","aria-labelledby","_this9","sticky","Navbar","_supraBar","_initialHeight","outerHeight","_initialSupraHeight","hideSupra","extend","Otab","$tab","$tabpanel","uriAttrs","DefaultWhitelist","*","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","createdDocument","DOMParser","parseFromString","whitelistKeys","keys","elements","_loop","el","elName","nodeName","attributeList","attributes","whitelistedAttributes","concat","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","l","allowedAttribute","innerHTML","CLASS_PREFIX","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","html","container","fallbackPlacement","sanitize","AUTO","TOP","RIGHT","BOTTOM","LEFT","HoverState","INSERTED","FOCUSOUT","Trigger","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","isWithContent","shadowRoot","isInTheDom","ownerDocument","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","getElementsByTagName","dir","hash","replace","matched","behavior","arrow","onCreate","originalPlacement","_handlePopperPlacementChange","onUpdate","complete","_fixTransition","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","empty","append","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","key","$tip","tabClass","join","popperData","popperInstance","instance","popper","initConfigAnimation","Popover","_getContent","PriorityNav","_$menu","_initMenu","_$allNavElements","_bindUIActions","_setupMenu","MenuLabel","$allNavElements","firstPos","position","$wrappedElements","$elm","top","eq","newSet","clone","$item","$itemDuplicate","prepend","_tearDown","dropdown","method","SCROLL","CLICK_SCROLL","SCROLL_TOP","ScrollUp","_scrollElement","proxy","_process","_backToTop","Number","_clear","ACTIVE","scrollUps","makeArray","$scrollup","ACTIVATE","OffsetMethod","ScrollSpy","_offsets","_targets","_activeTarget","_scrollHeight","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","map","targetSelector","targetBCR","item","sort","pageYOffset","scrollHeight","max","_getOffsetHeight","innerHeight","maxScroll","_activate","queries","$link","node","scrollSpys","$spy","ARROW_LEFT_KEYCODE","Tab","previous","listElement","itemSelector","hiddenEvent","active","_transitionComplete","tabIndex","aria-selected","dropdownChild","dropdownElement","dropdownToggleList","$tablist","tabId","substr","Items","k","keyCode","nextTab","tab","autohide","Toast","withoutTimeout","_close","version"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n const input = this._element.querySelector(Selector.INPUT)\n\n if (rootElement) {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n activeElement.classList.remove(ClassName.ACTIVE)\n }\n }\n\n if (input) {\n if (input.checked) {\n this._element.classList.add(ClassName.ACTIVE)\n } else {\n this._element.classList.remove(ClassName.ACTIVE)\n }\n } else {\n this._element.classList.toggle(ClassName.ACTIVE)\n this._element.setAttribute('aria-pressed',\n this._element.classList.contains(ClassName.ACTIVE))\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT > Selector.INPUT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n if (button) {\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n }\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '*:not(.multi) > .show, *:not(.multi) > .collapsing', // boosted mod\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide|init/.test(config)) { // Boosted mod\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n// Boosted mod\n .on('DOMContentLoaded', () => {\n $(Selector.DATA_TOGGLE).each(function () {\n const target = Collapse._getTargetFromElement(this)\n\n Collapse._jQueryInterface.call($(target), 'init')\n })\n })\n// end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n // Boosted mod\n MENU_ITEMS : '.dropdown-menu .dropdown-item',\n FIRST_ITEM_IN_MENU : '.dropdown-menu .dropdown-item:not(.disabled), .dropdown-menu .nav-link:not(.disabled)',\n // end mod\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n // Boosted mod\n $(parent).find(Selector.FIRST_ITEM_IN_MENU).first().trigger('focus')\n // end mod\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Boosted mod\n _addAccessibility() {\n $(this._element).attr('aria-haspopup', true)\n // ensure that dropdown-menu have the role menu\n $(this._element).parent().children(Selector.MENU).attr('role', 'menu')\n // ensure that dropdown-itm's have the role menuitem\n $(this._element).parent().children(Selector.MENU).children('.dropdown-item').attr('role', 'menuitem')\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n // Boosted mod\n .on('DOMContentLoaded', () => {\n // Instanciate every dropdown in the DOM\n Dropdown._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-megamenu.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/* eslint no-magic-numbers: [\"error\", { \"ignore\": [1,2] }] */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'megamenu'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.megamenu'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst TIMEOUT = 1000 // Timeout befor focusing first element\nconst PERCENTAGE = 100 // Width slide proportion\nconst SPLITLENGHT = 4\n\nconst ClassName = {\n TRANSITIONING: 'transitioning'\n}\n\nconst Selector = {\n MEGAMENU : '.mega-menu',\n ROOT_NAV : '.mega-menu > .navbar-nav',\n MEGAMENU_PANEL : '.mega-menu-panel',\n MEGAMENU_NAV : '.nav-link + .navbar-nav',\n NAV_MENU : '.navbar-nav',\n NAV_ITEM : '.nav-item',\n NAV_LINK : '.nav-link',\n NAV_LINK_COLLAPSE : '.nav-link[data-toggle=collapse]',\n NAV_LINK_BACK : '.nav-link.back',\n NAV_LINK_EXPANDED : '.nav-link[aria-expanded=true]'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass MegaMenu {\n constructor(element, config) {\n this._element = element\n this._$navLinks = $(this._element).find(Selector.NAV_LINK)\n this._$goForwardLinks = $(this._element).find(Selector.MEGAMENU_NAV).prev(Selector.NAV_LINK)\n this._$goBackLinks = $(this._element).find(Selector.NAV_LINK_BACK)\n this._$topCollapseMenus = $(this._element).find(Selector.MEGAMENU_PANEL)\n this._$navLinkCollapses = $(this._element).find(Selector.NAV_LINK_COLLAPSE)\n this._config = config\n if (typeof this._config.noFocus === 'undefined') {\n this._config.noFocus = false\n }\n this._addEventListeners()\n this._addAriaAttributes(this._element)\n this.goTo = this._initPosition\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _addEventListeners() {\n this._$goForwardLinks.on('click', (event) => this._goForward(event))\n this._$goBackLinks.on('click', (event) => this._goBackward(event))\n this._$navLinks.on('keydown', (event) => this._manageKeyDown(event))\n if (!this._config.noFocus) {\n this._$topCollapseMenus.on('shown.bs.collapse', this._collapseFocus)\n }\n this._$navLinkCollapses.on('click', (event) => this._handleCollapseToggle(event))\n }\n\n _addAriaAttributes(element) {\n const $subNavs = $(element).find('.nav-link + .navbar-nav')\n\n $(element).attr('role', 'application')\n $(element).find('> .navbar-nav').attr('role', 'menu')\n $(element).find(Selector.MEGAMENU_PANEL).attr('role', 'menu')\n $(element).find('.nav-link[data-toggle=collapse]').attr('role', 'menuitem')\n $(element).find(Selector.NAV_LINK_BACK).attr({\n 'aria-hidden': true\n })\n $(element).find(Selector.NAV_ITEM).attr('role', 'presentation')\n\n $subNavs.each(function () {\n const navId = Util.getUID(NAME)\n const $thisNavToggler = $(this).prev(Selector.NAV_LINK)\n const $thisNav = $(this)\n const $thisNavBackLink = $thisNav.find(Selector.NAV_LINK_BACK)\n const $topMenu = $(this).closest(Selector.NAV_MENU).parent().closest(Selector.NAV_MENU).prev(Selector.NAV_LINK)\n let goBackLabel = `go back to ${$topMenu.text()} menu`\n\n if (!$topMenu.length) {\n goBackLabel = `go back to ${$(this).closest(Selector.MEGAMENU_PANEL).prev(Selector.NAV_LINK).text()} menu`\n }\n\n $thisNav.attr({\n id: navId,\n role: 'menu'\n })\n $thisNavToggler.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-expanded': false,\n 'aria-haspopup': true\n })\n $thisNavBackLink.attr({\n role: 'menuitem',\n 'aria-controls': navId,\n 'aria-label': goBackLabel\n })\n })\n }\n\n _initPosition(target) {\n if (!$(target).length) {\n return\n }\n\n const $target = $(target).first()\n const position = $target.parents().index(this._element)\n const rootPosition = $('.mega-menu-panel .nav-link').first().parents().index($('.mega-menu'))\n const translatePercentage = -(position - rootPosition) * PERCENTAGE / 2\n const $thisNav = $target.closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // open collapse\n if ($target.attr('data-toggle') === 'collapse') {\n $target.siblings(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.siblings(Selector.MEGAMENU_PANEL)).collapse('hide')\n $(this._element).height('auto')\n $rootNav.css('transform', 'translateX(0%)')\n } else {\n $target.closest(Selector.MEGAMENU_PANEL).collapse('show')\n this._$topCollapseMenus.not($target.closest(Selector.MEGAMENU_PANEL)).collapse('hide')\n\n // show menu and hide other\n $target.parents(Selector.NAV_MENU).show()\n\n // set aria on parent links\n $target.parents(Selector.NAV_ITEM).find('> .nav-link').not($target).attr({\n tabindex: -1,\n 'aria-hidden': true,\n 'aria-expanded': true\n })\n\n // translate to pos\n $rootNav.css('transform', `translateX(${translatePercentage}%)`)\n if (translatePercentage) {\n // adapt main collapse height to target height\n $(this._element).height($thisNav.height())\n } else {\n $(this._element).height('auto')\n }\n }\n\n // set focus on target link\n setTimeout(() => {\n if (!this._config.noFocus) {\n // set focus on target link\n $target.trigger('focus')\n }\n\n $rootNav.removeClass(ClassName.TRANSITIONING)\n }, TIMEOUT)\n }\n\n _manageKeyDown(event) {\n const $thisTarget = $(event.target)\n\n // test key code\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n // proceed according to key code\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n this._goBackward(event)\n break\n case ARROW_RIGHT_KEYCODE:\n this._goForward(event)\n break\n case ARROW_UP_KEYCODE:\n // focus prev nav link\n $thisTarget.parent().prev().find('>.nav-link').not(Selector.NAV_LINK_BACK).trigger('focus')\n break\n case ARROW_DOWN_KEYCODE:\n // focus next nav link\n $thisTarget.parent().next().find('>.nav-link').trigger('focus')\n break\n default:\n }\n }\n\n _collapseFocus() {\n $(this).find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n }\n\n _handleCollapseToggle(e) {\n const $this = $(e.target)\n const $thisCollapse = $($this.attr('href'))\n\n this._$topCollapseMenus.not($thisCollapse).collapse('hide')\n }\n\n _goForward(e) {\n e.preventDefault()\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $this.next(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $thisNavToggler = $this\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!$this.next(Selector.NAV_MENU).length || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // hide all nav on same level\n $thisNav.find(Selector.NAV_MENU).hide()\n\n // show target navbar-nav\n $targetNav.show()\n\n // adapt main collapse height to target height\n $(Selector.MEGAMENU).height($targetNav.height())\n\n // make only visible elements focusable\n if (!currentTranslatePercentage) {\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n }\n $thisNav.find(Selector.NAV_LINK).attr({\n tabindex: -1,\n 'aria-hidden': true\n })\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage - PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $thisNavToggler.attr('aria-expanded', true)\n $targetNav.find(Selector.NAV_LINK).not(Selector.NAV_LINK_BACK).first().trigger('focus')\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n _goBackward(e) {\n e.preventDefault()\n\n const $this = $(e.target)\n const $thisNav = $this.closest(Selector.NAV_MENU)\n const $targetNav = $thisNav.parent().closest(Selector.NAV_MENU)\n const $rootNav = $(Selector.ROOT_NAV)\n const $targetNavToggler = $targetNav.find(Selector.NAV_LINK_EXPANDED)\n const currentTranslatePos = parseInt($rootNav.css('transform').split(',')[SPLITLENGHT], 10)\n const navWidth = $rootNav.width()\n const currentTranslatePercentage = PERCENTAGE * currentTranslatePos / navWidth\n\n if (!currentTranslatePercentage || $rootNav.hasClass(ClassName.TRANSITIONING)) {\n return false\n }\n\n $rootNav.addClass(ClassName.TRANSITIONING)\n\n // make only visible elements focusable\n $targetNav.find(Selector.NAV_LINK).attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n if (currentTranslatePercentage === -PERCENTAGE) {\n // reset main collapse height\n $(Selector.MEGAMENU).css('height', 'auto')\n $rootNav.find('>.nav-item .nav-link').attr({\n tabindex: 0,\n 'aria-hidden': false\n })\n }\n\n // translate menu\n $rootNav.css('transform', `translateX(${currentTranslatePercentage + PERCENTAGE}%)`)\n\n // focus on target nav first item\n $rootNav.one('transitionend', () => {\n $targetNavToggler.attr('aria-expanded', false)\n $targetNavToggler.trigger('focus')\n $thisNav.hide()\n $rootNav.removeClass(ClassName.TRANSITIONING)\n })\n return true\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n if (!$(this).is(Selector.MEGAMENU)) {\n throw new TypeError('Element is not a mega menu')\n }\n\n if (!config) {\n config = {}\n } else if (config.noFocus && typeof config.noFocus !== 'boolean') {\n // param = true\n throw new TypeError('no-focus parameter must be boolean')\n }\n\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new MegaMenu(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (config.target) {\n if (typeof config.target !== 'string' || !/^[.#].*/.test(config.target)) {\n throw new TypeError(`Selector \"${config.target}\" is not supported`)\n }\n\n data.goTo(config.target)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = MegaMenu._jQueryInterface\n$.fn[NAME].Constructor = MegaMenu\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return MegaMenu._jQueryInterface\n}\n\nexport default MegaMenu\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .position-fixed'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n\n // Boosted mod\n this._addAria()\n // end mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._setEscapeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualRight = element.style.right\n const calculatedRight = $(element).css('right')\n $(element)\n .data('right', actualRight)\n .css('right', `${parseFloat(calculatedRight) + this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const right = $(element).data('right')\n $(element).removeData('right')\n element.style.right = right ? right : ''\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Boosted mod\n _addAria() {\n const $ModalPanel = $(this._element)\n const $ModalTitle = $ModalPanel.find('.modal-title')\n const $ModalDialog = $ModalPanel.find('.modal-dialog')\n\n $ModalPanel.attr({\n role: 'dialog',\n 'aria-modal': true\n })\n\n if ($ModalTitle) {\n const ModalTitleId = $ModalTitle.attr('id')\n if (ModalTitleId) {\n $ModalPanel.attr({\n 'aria-labelledby' : ModalTitleId\n })\n }\n }\n\n if ($ModalDialog) {\n $ModalDialog.attr('role', 'document')\n }\n }\n // end mod\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-navbar.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'navbar'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.navbar'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst BREAKPOINT = 768\n\nconst Default = {\n sticky : false,\n trigger : ''\n}\n\nconst DefaultType = {\n sticky : 'boolean',\n trigger : 'string'\n}\n\nconst Selector = {\n SUPRA_BAR : '.navbar.supra',\n MEGAMENU_PANEL : '.mega-menu.panel'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Navbar {\n constructor(element, config) {\n this._element = element\n this._supraBar = element.querySelector(Selector.SUPRA_BAR)\n this._config = this._getConfig(config)\n this._initialHeight = $(this._element).outerHeight()\n this._initialSupraHeight = $(this._supraBar).outerHeight()\n\n this._addAria()\n\n if (this._config.sticky) {\n $(this._element).addClass('fixed-top')\n $(Selector.MEGAMENU_PANEL).addClass('sticky')\n $(document.body).css('padding-top', this._initialHeight)\n\n $(window).on('scroll', () => {\n const Scroll = $(window).scrollTop()\n if (Scroll > 0) {\n $(this._element).addClass('minimized')\n } else {\n $(this._element).removeClass('minimized')\n }\n })\n }\n\n if (this._config.hideSupra) {\n $(window).on('scroll', () => {\n if ($(window).innerWidth() < BREAKPOINT) {\n return\n }\n\n const Scroll = $(window).scrollTop()\n\n if (Scroll > 0) {\n $(Selector.SUPRA_BAR).hide()\n } else {\n $(Selector.SUPRA_BAR).show()\n }\n })\n }\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // private\n\n _getConfig(config) {\n config = $.extend({}, Default, config)\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _addAria() {\n $(this._element).find('.navbar .nav-link[data-toggle]').attr('aria-haspopup', true)\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Navbar(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Navbar._jQueryInterface\n$.fn[NAME].Constructor = Navbar\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Navbar._jQueryInterface\n}\n\nexport default Navbar\n","/**\n * ------------------------------------------------------------------------------------------------------\n * Boosted (v4.3.1): otab.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * ------------------------------------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'otab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.otab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst DEFAULT_THRESHOLD = 2\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ACTIVE : 'active',\n SHOW : 'show',\n ACCORDION_LAYOUT: 'accordion-layout'\n}\n\nconst Selector = {\n OTAB_HEADING: '.o-tab-heading',\n OTAB_CONTENT: '.o-tab-content'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Otab {\n constructor(element) {\n this._element = element\n this._addAccessibility()\n\n if ($(this._element).parent().find(Selector.OTAB_HEADING).length > DEFAULT_THRESHOLD) {\n $(this._element).parent().addClass(ClassName.ACCORDION_LAYOUT)\n }\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n\n // public\n show() {\n const $element = $(this._element)\n\n if ($element.next().hasClass(ClassName.SHOW)) {\n return\n }\n\n // from parent remove all tab-content show classes\n $element.parent().find(Selector.OTAB_CONTENT).removeClass(ClassName.SHOW)\n // remove all aria-expanded=true\n $element.parent().find('[aria-expanded=\"true\"]').attr('aria-expanded', false)\n // add show class to next tab-content\n $element.next().addClass(ClassName.SHOW)\n // add aria-expanded=true to element\n $element.attr('aria-expanded', true)\n }\n\n // private\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $tab.next()\n\n $tab.attr('id', Util.getUID(NAME))\n $tabpanel.attr('id', Util.getUID(NAME))\n\n $tab.attr({\n 'aria-controls': $tabpanel.attr('id'),\n role: 'tab'\n })\n $tabpanel.attr({\n 'aria-labelledby': $tab.attr('id'),\n role: 'tabpanel',\n tabindex: 0\n })\n\n if ($tabpanel.hasClass(ClassName.SHOW)) {\n $tab.attr('aria-expanded', true)\n } else {\n $tab.attr('aria-expanded', false)\n }\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Otab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on('DOMContentLoaded', () => {\n Otab._jQueryInterface.call($(Selector.OTAB_HEADING), 'init')\n })\n .on(Event.CLICK_DATA_API, Selector.OTAB_HEADING, function (event) {\n event.preventDefault()\n Otab._jQueryInterface.call($(this), ClassName.SHOW)\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Otab._jQueryInterface\n$.fn[NAME].Constructor = Otab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Otab._jQueryInterface\n}\n\nexport default Otab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div></div>',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n // boosted mod fix rtl\n let attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n // boosted mod fix rtl\n const dir = document.getElementsByTagName('html')[0].dir\n if (dir === 'rtl') {\n const hash = {\n right: 'left',\n left: 'right'\n }\n attachment = attachment.replace(/right|left/g, (matched) => hash[matched])\n }\n // end mod\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div></div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-priority-nav.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'prioritynav'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.prioritynav'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst RESIZE_DURATION = 500\nconst TAB_KEYCODE = 9\n\nconst Event = {\n RESIZE: 'resize',\n FOCUS: 'focus'\n}\n\nconst ClassName = {\n PRIORITY: 'priority',\n HIDE: 'sr-only',\n RESIZING: 'resizing'\n}\n\nconst Selector = {\n NAV_ELEMENTS: 'li:not(\\'.overflow-nav\\')',\n FIRST_ELEMENT: 'li:first',\n PRIORITY_ELEMENT: '.priority'\n}\n\nconst MenuLabelDefault = 'More'\n\nfunction MenuTemplate(MenuLabel) {\n return `\n <li class=\"overflow-nav nav-item dropdown\">\n <a href=\"#\" class=\"dropdown-toggle nav-link\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\">${MenuLabel}</a>\n <ul class=\"overflow-nav-list dropdown-menu dropdown-menu-right\"></ul>\n </li>\n`\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass PriorityNav {\n constructor(element, config) {\n this._element = element\n this._config = config\n\n if ($(element).is('ul')) {\n this._$menu = $(element)\n } else {\n this._$menu = $(element).find('ul').first()\n }\n this._initMenu()\n this._$allNavElements = this._$menu.find(Selector.NAV_ELEMENTS)\n this._bindUIActions()\n this._setupMenu()\n }\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n // public\n\n // private\n\n _initMenu() {\n let MenuLabel = this._config\n\n if (typeof MenuLabel === 'undefined') {\n MenuLabel = MenuLabelDefault\n }\n\n // add menu template\n this._$menu.append(MenuTemplate(MenuLabel))\n }\n\n _setupMenu() {\n const $allNavElements = this._$allNavElements\n\n // Checking top position of first item (sometimes changes)\n const firstPos = this._$menu.find(Selector.FIRST_ELEMENT).position()\n\n // Empty collection in which to put menu items to move\n let $wrappedElements = $()\n\n // Used to snag the previous menu item in addition to ones that have wrapped\n let first = true\n\n // Loop through all the nav items...\n this._$allNavElements.each(function (i) {\n const $elm = $(this)\n\n // ...in which to find wrapped elements\n const pos = $elm.position()\n\n if (pos.top !== firstPos.top) {\n // If element is wrapped, add it to set\n $wrappedElements = $wrappedElements.add($elm)\n\n // Add the previous one too, if first\n if (first) {\n $wrappedElements = $wrappedElements.add($allNavElements.eq(i - 1))\n first = false\n }\n }\n })\n\n if ($wrappedElements.length) {\n // Clone set before altering\n const newSet = $wrappedElements.clone()\n\n // Hide ones that we're moving\n $wrappedElements.addClass(ClassName.HIDE)\n $wrappedElements.find('.nav-link').attr('tabindex', -1)\n\n // Add wrapped elements to dropdown\n this._$menu.find('.overflow-nav-list').append(newSet)\n\n // Show new menu\n this._$menu.find('.overflow-nav').addClass('show-inline-block')\n\n // Make overflow visible again so dropdown can be seen.\n this._$menu.find('.o-nav-local').css('overflow', 'visible')\n\n // Check if menu doesn't overflow after process\n if (this._$menu.find('.overflow-nav').position().top !== firstPos.top) {\n const $item = $(this._element).find(`.${ClassName.HIDE}`).first().prev()\n const $itemDuplicate = $item.clone()\n\n $item.addClass(ClassName.HIDE)\n $item.find('.nav-link').attr('tabindex', -1)\n\n this._$menu.find('.overflow-nav-list').prepend($itemDuplicate)\n }\n }\n\n // hide menu from AT\n this._$menu.find('.overflow-nav').attr('aria-hidden', true)\n }\n\n _tearDown() {\n this._$menu.find('.overflow-nav-list').empty()\n this._$menu.find('.overflow-nav').removeClass('show-inline-block')\n this._$allNavElements.removeClass(ClassName.HIDE)\n this._$allNavElements.find('.nav-link').attr('tabindex', 0)\n }\n\n _bindUIActions() {\n $(window).on(Event.RESIZE, () => {\n this._$menu.addClass(ClassName.RESIZING)\n\n setTimeout(() => {\n this._tearDown()\n this._setupMenu()\n this._$menu.removeClass(ClassName.RESIZING)\n }, RESIZE_DURATION)\n })\n\n this._$menu.find('.overflow-nav .dropdown-toggle').on('keyup', (e) => {\n if (e.which === TAB_KEYCODE) {\n $(e.target).dropdown('toggle')\n }\n })\n }\n\n // static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new PriorityNav(this, config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config !== 'undefined' && config) {\n if (typeof config !== 'string') {\n throw new TypeError('Priority nav label type must be string')\n }\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = PriorityNav._jQueryInterface\n$.fn[NAME].Constructor = PriorityNav\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return PriorityNav._jQueryInterface\n}\n\nexport default PriorityNav\n","/**\n * --------------------------------------------------------------------------\n * Boosted (v4.3.1): o-scroll-up.js\n * Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollup'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollup'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst SCROLLANIMATE = 500\n\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst Event = {\n SCROLL : `scroll${EVENT_KEY}`,\n CLICK_SCROLL : `click${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLL_TOP : 'o-scroll-up'\n}\n\nconst Selector = {\n SCROLL_TOP : '.o-scroll-up:not(.static)'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollUp {\n constructor(element) {\n this._element = element\n this._scrollElement = window\n\n $(window).on(Event.SCROLL, $.proxy(this._process, this))\n $(Selector.SCROLL_TOP).on(Event.CLICK_SCROLL, $.proxy(this._backToTop, this))\n $(this._element).addClass('is-fixed')\n this._process()\n }\n\n\n // getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n\n // public\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n }\n\n\n // private\n\n _process() {\n if ($(this._scrollElement).scrollTop() > Number($(this._scrollElement).height())) {\n $(Selector.SCROLL_TOP).show()\n } else {\n $(Selector.SCROLL_TOP).hide()\n }\n }\n\n _clear() {\n $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)\n }\n\n _backToTop() {\n if (typeof $.animate === 'function') {\n $('html, body').animate({\n scrollTop: 0\n }, SCROLLANIMATE)\n } else {\n $('html, body').scrollTop(0)\n }\n }\n\n // static\n\n static _jQueryInterface() {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n if (!data) {\n data = new ScrollUp(this)\n $(this).data(DATA_KEY, data)\n }\n })\n }\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollUps = $.makeArray($(Selector.SCROLL_TOP))\n for (let i = scrollUps.length; i--;) {\n const $scrollup = $(scrollUps[i])\n ScrollUp._jQueryInterface.call($scrollup, $scrollup.data())\n }\n})\n\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollUp._jQueryInterface\n$.fn[NAME].Constructor = ScrollUp\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollUp._jQueryInterface\n}\n\nexport default ScrollUp\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\n // Handle special case when .nav-link is inside .nav-item\n $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\n }\n\n $(this._scrollElement).trigger(Event.ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n [].slice.call(document.querySelectorAll(this._selector))\n .filter((node) => node.classList.contains(ClassName.ACTIVE))\n .forEach((node) => node.classList.remove(ClassName.ACTIVE))\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new ScrollSpy(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\n const scrollSpysLength = scrollSpys.length\n\n for (let i = scrollSpysLength; i--;) {\n const $spy = $(scrollSpys[i])\n ScrollSpy._jQueryInterface.call($spy, $spy.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n// boosted mod\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_LEFT_KEYCODE}|${ARROW_UP_KEYCODE}|${ARROW_RIGHT_KEYCODE}|${ARROW_DOWN_KEYCODE}`)\n// end mod\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}` // boosted mod\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active',\n DISABLED : 'disabled',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DROPDOWN : '.dropdown',\n NAV_LIST_GROUP : '.nav, .list-group',\n ACTIVE : '.active',\n ACTIVE_UL : '> li > .active',\n DATA_TOGGLE : '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n DROPDOWN_TOGGLE : '.dropdown-toggle',\n DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab {\n constructor(element) {\n this._element = element\n this._addAccessibility() // Boosted mod\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n show() {\n if (this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n $(this._element).hasClass(ClassName.ACTIVE) ||\n $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n let target\n let previous\n const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\n const selector = Util.getSelectorFromElement(this._element)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\n previous = $.makeArray($(listElement).find(itemSelector))\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = $.Event(Event.HIDE, {\n relatedTarget: this._element\n })\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget: previous\n })\n\n if (previous) {\n $(previous).trigger(hideEvent)\n }\n\n $(this._element).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented() ||\n hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n this._activate(\n this._element,\n listElement\n )\n\n const complete = () => {\n const hiddenEvent = $.Event(Event.HIDDEN, {\n relatedTarget: this._element\n })\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget: previous\n })\n\n $(previous).trigger(hiddenEvent)\n $(this._element).trigger(shownEvent)\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\n ? $(container).find(Selector.ACTIVE_UL)\n : $(container).children(Selector.ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\n const complete = () => this._transitionComplete(\n element,\n active,\n callback\n )\n\n // Boosted mod\n $(container).find('.nav-link:not(.dropdown-toggle)').attr({\n tabIndex : '-1',\n 'aria-selected' : false\n })\n $(container).find('.tab-pane').attr({\n 'aria-hidden' : true,\n tabIndex : '-1'\n })\n // end mod\n\n if (active && isTransitioning) {\n const transitionDuration = Util.getTransitionDurationFromElement(active)\n\n $(active)\n .removeClass(ClassName.SHOW)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n $(active).removeClass(ClassName.ACTIVE)\n\n const dropdownChild = $(active.parentNode).find(\n Selector.DROPDOWN_ACTIVE_CHILD\n )[0]\n\n if (dropdownChild) {\n $(dropdownChild).removeClass(ClassName.ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n $(element).addClass(ClassName.ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n // Boosted mod\n $(element).filter('.nav-link:not(.dropdown-toggle).active').attr({\n tabIndex : '0',\n 'aria-selected' : true\n })\n $(element).filter('.tab-pane.active').attr({\n 'aria-hidden' : false,\n tabIndex : '0'\n })\n // end mod\n\n Util.reflow(element)\n\n if (element.classList.contains(ClassName.FADE)) {\n element.classList.add(ClassName.SHOW)\n }\n\n if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\n\n if (dropdownElement) {\n const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\n\n $(dropdownToggleList).addClass(ClassName.ACTIVE)\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Boosted mod\n _addAccessibility() {\n const $tab = $(this._element)\n const $tabpanel = $($tab.attr('href'))\n const $tablist = $tab.closest(Selector.NAV_LIST_GROUP)\n const tabId = $tab.attr('id') || Util.getUID(NAME)\n\n $tab.attr('id', tabId)\n\n if ($tabpanel) {\n $tab.attr('role', 'tab')\n $tablist.attr('role', 'tablist')\n // $li.attr('role', 'presentation')\n }\n\n if ($tab.hasClass(ClassName.ACTIVE)) {\n $tab.attr({\n tabIndex : '0',\n 'aria-selected' : 'true'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '0',\n 'aria-hidden' : 'false',\n 'aria-labelledby': tabId\n })\n } else {\n $tab.attr({\n tabIndex : '-1',\n 'aria-selected' : 'false'\n })\n\n if ($tab.attr('href')) {\n $tab.attr('aria-controls', $tab.attr('href').substr(1))\n }\n\n $tabpanel.attr({\n role : 'tabpanel',\n tabIndex : '-1',\n 'aria-hidden' : 'true',\n 'aria-labelledby': tabId\n })\n }\n }\n // end mod\n\n // Static\n\n // Boosted mod\n static _dataApiKeydownHandler(e) {\n const $this = $(this)\n const Items = $this.closest('ul[role=tablist] ').find('[role=tab]:visible')\n const k = e.which || e.keyCode\n\n let index = 0\n\n index = Items.index(Items.filter(':focus'))\n\n if (k === ARROW_UP_KEYCODE || k === ARROW_LEFT_KEYCODE) {\n index--\n } // up & left\n if (k === ARROW_RIGHT_KEYCODE || k === ARROW_DOWN_KEYCODE) {\n index++\n } // down & right\n\n if (index < 0) {\n index = Items.length - 1\n }\n if (index === Items.length) {\n index = 0\n }\n const nextTab = Items.eq(index)\n\n if (nextTab.attr('role') === 'tab') {\n nextTab.tab('show').trigger('focus')\n }\n\n e.preventDefault()\n e.stopPropagation()\n }\n // end mod\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n\n if (!data) {\n data = new Tab(this)\n $this.data(DATA_KEY, data)\n }\n\n // Boosted mod\n if (/init/.test(config)) {\n return\n }\n // end mod\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n Tab._jQueryInterface.call($(this), 'show')\n })\n // Boosted mod\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, function (event) {\n if (!REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n event.preventDefault()\n Tab._dataApiKeydownHandler.call($(this), event)\n })\n .on('DOMContentLoaded', () => {\n Tab._jQueryInterface.call($(Selector.DATA_TOGGLE), 'init')\n })\n // end mod\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tab._jQueryInterface\n$.fn[NAME].Constructor = Tab\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tab._jQueryInterface\n}\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Event = {\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n HIDE : 'hide',\n SHOW : 'show',\n SHOWING : 'showing'\n}\n\nconst DefaultType = {\n animation : 'boolean',\n autohide : 'boolean',\n delay : 'number'\n}\n\nconst Default = {\n animation : true,\n autohide : true,\n delay : 500\n}\n\nconst Selector = {\n DATA_DISMISS : '[data-dismiss=\"toast\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast {\n constructor(element, config) {\n this._element = element\n this._config = this._getConfig(config)\n this._timeout = null\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show() {\n $(this._element).trigger(Event.SHOW)\n\n if (this._config.animation) {\n this._element.classList.add(ClassName.FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(ClassName.SHOWING)\n this._element.classList.add(ClassName.SHOW)\n\n $(this._element).trigger(Event.SHOWN)\n\n if (this._config.autohide) {\n this.hide()\n }\n }\n\n this._element.classList.remove(ClassName.HIDE)\n this._element.classList.add(ClassName.SHOWING)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n hide(withoutTimeout) {\n if (!this._element.classList.contains(ClassName.SHOW)) {\n return\n }\n\n $(this._element).trigger(Event.HIDE)\n\n if (withoutTimeout) {\n this._close()\n } else {\n this._timeout = setTimeout(() => {\n this._close()\n }, this._config.delay)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n this._timeout = null\n\n if (this._element.classList.contains(ClassName.SHOW)) {\n this._element.classList.remove(ClassName.SHOW)\n }\n\n $(this._element).off(Event.CLICK_DISMISS)\n\n $.removeData(this._element, DATA_KEY)\n this._element = null\n this._config = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...$(this._element).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _setListeners() {\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n () => this.hide(true)\n )\n }\n\n _close() {\n const complete = () => {\n this._element.classList.add(ClassName.HIDE)\n $(this._element).trigger(Event.HIDDEN)\n }\n\n this._element.classList.remove(ClassName.SHOW)\n if (this._config.animation) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data) {\n data = new Toast(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Toast._jQueryInterface\n$.fn[NAME].Constructor = Toast\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Toast._jQueryInterface\n}\n\nexport default Toast\n","import $ from 'jquery'\nimport Alert from './alert'\nimport Button from './button'\nimport Carousel from './carousel'\nimport Collapse from './collapse'\nimport Dropdown from './dropdown'\nimport MegaMenu from './o-megamenu'\nimport Modal from './modal'\nimport Navbar from './o-navbar'\nimport Otab from './o-tab'\nimport Popover from './popover'\nimport PriorityNav from './o-priority-nav'\nimport ScrollUp from './o-scroll-up'\nimport Scrollspy from './scrollspy'\nimport Tab from './tab'\nimport Toast from './toast'\nimport Tooltip from './tooltip'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(() => {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n})()\n\nexport {\n Util,\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n MegaMenu,\n Modal,\n Navbar,\n Otab,\n Popover,\n PriorityNav,\n ScrollUp,\n Scrollspy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file
diff --git a/dashboard/src/App.vue b/dashboard/src/App.vue
new file mode 100644
index 00000000..99c5cd0d
--- /dev/null
+++ b/dashboard/src/App.vue
@@ -0,0 +1,41 @@
+<template>
+ <div id="app">
+
+ <nav role="navigation" class="navbar navbar-expand-sm" v-if="$route.name != 'auth' && $route.name != 'error'">
+ <ul class="navbar-nav" >
+ <li class="nav-item">
+ <router-link to="/models" class="nav-link" active-class="o-active">Models</router-link>
+ </li>
+ <li class="nav-item">
+ <router-link to="/rules" class="nav-link" active-class="o-active">Rules</router-link>
+ </li>
+ <li class="nav-item">
+ <router-link to="/assignments" class="nav-link" active-class="o-active">Assignments</router-link>
+ </li>
+ <li class="nav-item">
+ <router-link to="/pdp" class="nav-link" active-class="o-active">PDP</router-link>
+ </li>
+ <li class="nav-item">
+ <router-link to="/admin" class="nav-link" active-class="o-active">Admin</router-link>
+ </li>
+ </ul>
+ <a href="#" class="btn btn-primary btn-sm active ml-auto" role="button" aria-pressed="true" @click="logout()">logout</a>
+ </nav>
+ <br>
+
+ <router-view/>
+ </div>
+</template>
+
+
+<script>
+export default {
+ methods: {
+ logout: function() {
+ localStorage.setItem("auth-key", null);
+ this.$router.push('auth');
+ }
+ }
+}
+</script>
+
diff --git a/dashboard/src/assets/logo.png b/dashboard/src/assets/logo.png
new file mode 100644
index 00000000..f3d2503f
--- /dev/null
+++ b/dashboard/src/assets/logo.png
Binary files differ
diff --git a/dashboard/src/components/FormHeader.vue b/dashboard/src/components/FormHeader.vue
new file mode 100644
index 00000000..05419179
--- /dev/null
+++ b/dashboard/src/components/FormHeader.vue
@@ -0,0 +1,27 @@
+<template>
+ <div class="form-inline row">
+ <input
+ type="search"
+ class="form-control filter col-9 mr-auto"
+ :placeholder="placeholder"
+ v-bind:value="value"
+ v-on:input="$emit('input', $event.target.value)"
+ >
+ <div class="col"></div>
+ <button v-if="needButton" type="button" class="btn btn-primary col-auto " @click="$emit('click')">
+ <span class="fa fa-plus"></span>
+ {{ buttonText }}
+ </button>
+ </div>
+</template>
+
+<script>
+export default {
+ props: {
+ value: String,
+ needButton: Boolean,
+ buttonText: String,
+ placeholder: String,
+ }
+}
+</script> \ No newline at end of file
diff --git a/dashboard/src/components/assignment/Category.vue b/dashboard/src/components/assignment/Category.vue
new file mode 100644
index 00000000..0f2f921b
--- /dev/null
+++ b/dashboard/src/components/assignment/Category.vue
@@ -0,0 +1,103 @@
+<template>
+ <details class="list-group" >
+ <summary @click="populatePolicy()">
+ <h4 class="inline-block width-200">
+ {{name}}
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="categoryHelpStrings[name.toLowerCase()]" data-toggle="tooltip" :title="categoryHelpStrings[name.toLowerCase()]"></i>
+ </h4>
+ </summary>
+ <div class="assignments-details">
+ <FormHeader
+ :placeholder="placeholder"
+ v-model="filter"
+ needButton
+ :buttonText="buttonText"
+ @click="creatingData"
+ ></FormHeader>
+ <create-data
+ class="m-3"
+ @close="creatingDataOpen = false"
+ :policy="policy"
+ :type="name.toLowerCase()"
+ :categoryId="categoryId"
+ v-if="creatingDataOpen"
+ ></create-data>
+ <br/>
+ <details class="list-group" v-for="item in filteredData" :key="item.id">
+ <summary @click="assignData(name.toLowerCase(), item)">
+ <h4 class="inline-block width-200">{{item.name}}</h4>
+ </summary>
+ <AssignPerimeter :policy="policy" :dataToAssign="dataToAssign"></AssignPerimeter>
+ </details>
+ </div>
+ </details>
+</template>
+
+<script>
+ import AssignPerimeter from "../policy/AssignPerimeter";
+ import FormHeader from "../FormHeader";
+ import CreateData from "./CreateData";
+ import util from "../../services/Util.service";
+ import PolicyService from "../../services/Policy.service";
+ import helpstrings from "../../helpstrings";
+
+ export default {
+ props:{
+ policy: Object,
+ data: Array,
+ name: String
+ },
+ name: "Assignment",
+ components: {
+ AssignPerimeter,
+ FormHeader,
+ CreateData
+ },
+ data() {
+ return{
+ placeholder: "",
+ buttonText: "",
+ creatingDataOpen: false,
+ filter: "",
+ dataToAssign: {},
+ categoryId: "",
+ categoryHelpStrings: {}
+ }
+ },
+ created() {
+ this.categoryHelpStrings = helpstrings.metarule;
+ this.placeholder = "Filter by " + this.name;
+ this.buttonText = "Create " + this.name;
+ if (this.policy.model.meta_rules.length){
+ let category = this.name.toLowerCase()+ "_categories";
+ let metaRule = this.policy.model.meta_rules[0];
+ this.categoryId = metaRule[category][0].id;
+ }
+
+ },
+ methods: {
+ populatePolicy() {
+ PolicyService.populatePolicy(this.policy);
+ },
+ assignData(type, data) {
+ this.dataToAssign = {
+ selectedData: data,
+ selectedDataType: type,
+ };
+ },
+ creatingData(){
+ this.creatingDataOpen = true;
+
+ }
+ },
+ computed: {
+ filteredData() {
+ return util.filterAndSortByName(this.data, this.filter);
+ }
+ }
+ }
+</script>
+
+<style scoped>
+
+</style> \ No newline at end of file
diff --git a/dashboard/src/components/assignment/CreateData.vue b/dashboard/src/components/assignment/CreateData.vue
new file mode 100644
index 00000000..63c69650
--- /dev/null
+++ b/dashboard/src/components/assignment/CreateData.vue
@@ -0,0 +1,75 @@
+<template>
+ <div class="list-group-item row">
+ <form>
+ <div class="form-group">
+ <label for="dataName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="dataCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="dataName"
+ />
+ </div>
+ <div class="form-group">
+ <label for="dataDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="dataCreate.description"
+ v-validate.initial="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="createData()"
+ >Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+
+export default {
+ name: "createData",
+ props: {
+ policy: Object,
+ type: String,
+ categoryId: String,
+ },
+ data: function() {
+ return {
+ dataCreate: {
+ name: "",
+ description: ""
+ }
+ };
+ },
+ methods: {
+ createData() {
+ var self = this;
+ PolicyService.createData(
+ this.type,
+ this.policy,
+ this.categoryId,
+ this.dataCreate
+ ).then(function(datas) {
+ self.$emit("dataCreated", datas[0]);
+ self.close();
+ });
+ },
+ close() {
+ this.$emit("close");
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/assignment/Policy.vue b/dashboard/src/components/assignment/Policy.vue
new file mode 100644
index 00000000..6fd4afb4
--- /dev/null
+++ b/dashboard/src/components/assignment/Policy.vue
@@ -0,0 +1,123 @@
+<template>
+ <div>
+ <template v-if="edit">
+ <form>
+ <div class="form-group" >
+ <label for="policyName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="policyEdit.name"
+ v-validate="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="policyName"
+ />
+ </div>
+ <div class="form-group">
+ <label for="policyDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="policyEdit.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <div class="form-group">
+ <label for="policyGenre">Genre</label>
+ <select
+ v-model="policyEdit.genre"
+ class="form-control"
+ id="policyGenre"
+ v-validate.initial="'required'"
+ name="genre"
+ >
+ <option>admin</option>
+ <option>authz</option>
+ </select>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="updatePolicy()"
+ >Update</button>
+ </form>
+ </template>
+ <template v-else>
+ <h3 class="list-group-item-heading inline " data-toggle="tooltip" data-placement="top" title="Tooltip on top">{{ policy.name }}</h3>
+ <div class="pull-right">
+ <button
+ type="button"
+ class="fa fa-trash btn-dark btn-sm"
+ title="Remove Policy"
+ @click="removePolicy()"
+ ></button>
+ <button
+ type="button"
+ class="fa fa-edit btn-dark btn-sm"
+ title="Edit Policy"
+ @click="updatingPolicy()"
+ ></button>
+ </div>
+ <p class="list-group-item-text">{{ policy.description }}</p>
+
+ <Category :policy="policy" :data="policy.subjectData" name="Subject" ></Category>
+ <Category :policy="policy" :data="policy.objectData" name="Object" ></Category>
+ <Category :policy="policy" :data="policy.actionData" name="Action" ></Category>
+ </template>
+ <hr />
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+import util from "./../../services/Util.service.js";
+import Category from "./Category";
+
+export default {
+ props: {
+ policy: Object
+ },
+ data() {
+ return {
+ filter: "",
+ edit: false,
+ policyEdit: {},
+ assignments: []
+ };
+ },
+ computed: {
+
+ },
+ components: {
+ Category
+ },
+ methods: {
+
+ removePolicy() {
+ if (
+ confirm(
+ "Are you sure to delete this Policy? (Associated perimeter, data an PDP will be deleted too)"
+ )
+ )
+ PolicyService.removePolicy(this.policy);
+ },
+ updatingPolicy() {
+ this.policyEdit = util.clone(this.policy);
+ this.edit = true;
+ },
+ updatePolicy() {
+ this.edit = false;
+ PolicyService.updatePolicy(this.policyEdit);
+ },
+ showAssignments(data){
+ this.assignments = this.policy[data];
+ }
+ }
+};
+</script> \ No newline at end of file
diff --git a/dashboard/src/components/model/AddCategory.vue b/dashboard/src/components/model/AddCategory.vue
new file mode 100644
index 00000000..c22ab333
--- /dev/null
+++ b/dashboard/src/components/model/AddCategory.vue
@@ -0,0 +1,126 @@
+<template>
+ <div>
+ <template v-if="categories.length > 0">
+ <h4>Select category:</h4>
+ <form data-vv-scope="select">
+ <div class="form-group">
+ <select v-model="selectedCategoryId" v-validate.initial="'required'">
+ <option disabled value>Please select one</option>
+ <option
+ v-for="category in categories"
+ :value="category.id"
+ :key="category.id"
+ >{{category.name}}</option>
+ </select>
+ </div>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any('select')"
+ class="btn btn-primary"
+ @click="addCategory()"
+ >Add</button>
+ </form>
+ <br>
+ <br>
+ <h4>Or create a new one:</h4>
+ </template>
+ <h4 v-else>Create a category:</h4>
+ <form data-vv-scope="create">
+ <div class="form-group">
+ <label for="categoryName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="categoryCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="categoryName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="modelDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="categoryCreate.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all('create')" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any('create')"
+ class="btn btn-primary"
+ @click="createCategory()"
+ >Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import ModelService from "./../../services/Model.service.js";
+import util from "./../../services/Util.service.js";
+
+var categoryMap = {
+ subject: {
+ listName: "subject_categories",
+ serviceListName: "subjectCategories"
+ },
+ object: {
+ listName: "object_categories",
+ serviceListName: "objectCategories"
+ },
+ action: {
+ listName: "action_categories",
+ serviceListName: "actionCategories"
+ }
+};
+
+export default {
+ name: "addCategory",
+ data: function() {
+ return {
+ selectedCategoryId: null,
+ categoryCreate: {
+ name: "",
+ description: ""
+ }
+ };
+ },
+ props: {
+ metarule: Object,
+ type: String
+ },
+ methods: {
+ createCategory() {
+ ModelService.createCategory(this.type, this.categoryCreate).then(category => {
+ this.selectedCategoryId = category.id;
+ this.addCategory();
+ });
+ },
+ addCategory() {
+ var category = ModelService.getCategory(this.type, this.selectedCategoryId);
+ var metaRuleCopy = util.clone(this.metarule);
+ metaRuleCopy[categoryMap[this.type].listName].push(category);
+ ModelService.updateMetaRule(metaRuleCopy);
+ this.close();
+ },
+ close() {
+ this.$emit("close");
+ }
+ },
+ computed: {
+ categories() {
+ return ModelService[categoryMap[this.type].serviceListName].filter(
+ el => !this.metarule[categoryMap[this.type].listName].includes(el)
+ );
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/AddMetarule.vue b/dashboard/src/components/model/AddMetarule.vue
new file mode 100644
index 00000000..ef6e8503
--- /dev/null
+++ b/dashboard/src/components/model/AddMetarule.vue
@@ -0,0 +1,111 @@
+<template>
+ <div>
+ <hr>
+ <template v-if="metarules.length > 0">
+ <h4>Select metarule:</h4>
+ <form data-vv-scope="select">
+ <div class="form-group">
+ <select v-model="selectedMetaruleId" v-validate.initial="'required'">
+ <option disabled value>Please select one</option>
+ <option
+ v-for="metarule in metarules"
+ :value="metarule.id"
+ :key="metarule.id"
+ >{{metarule.name}}</option>
+ </select>
+ </div>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any('select')"
+ class="btn btn-primary"
+ @click="addMetarule()"
+ >Add</button>
+ </form>
+ <br>
+ <br>
+ <h4>Or create a new one:</h4>
+ </template>
+ <h4 v-else>Create a metarule:</h4>
+ <form data-vv-scope="create">
+ <div class="form-group">
+ <label for="metaruleName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="metaruleCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="metaruleName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="modelDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="metaruleCreate.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all('create')" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any('create')"
+ class="btn btn-primary"
+ @click="createMetarule()"
+ >Create and add</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import ModelService from "./../../services/Model.service.js";
+import util from "./../../services/Util.service.js";
+
+export default {
+ name: "addMetarule",
+ data: function() {
+ return {
+ selectedMetaruleId: null,
+ metaruleCreate: {
+ name: "",
+ description: ""
+ }
+ };
+ },
+ props: {
+ model: Object
+ },
+ methods: {
+ createMetarule() {
+ ModelService.createMetaRule(this.metaruleCreate).then(metarule => {
+ this.selectedMetaruleId = metarule.id;
+ this.addMetarule();
+ });
+ },
+ addMetarule() {
+ var metaRule = ModelService.getMetaRule(this.selectedMetaruleId);
+ var modelCopy = util.clone(this.model);
+ modelCopy.meta_rules.push(metaRule);
+ ModelService.updateModel(modelCopy);
+ this.close();
+ },
+ close() {
+ this.$emit("close");
+ }
+ },
+ computed: {
+ metarules() {
+ return ModelService.metaRules.filter(
+ el => !this.model.meta_rules.includes(el)
+ );
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/Category.vue b/dashboard/src/components/model/Category.vue
new file mode 100644
index 00000000..81efb1ed
--- /dev/null
+++ b/dashboard/src/components/model/Category.vue
@@ -0,0 +1,64 @@
+<template>
+ <div>
+ <span :title="category.description">{{ category.name }}</span>
+ <button type="button" class="fa fa-trash pull-right btn btn-dark btn-sm" @click="removeCategory()" title="Remove"></button>
+ <div v-for="attribute in attributes" :key="attribute.id">
+ <b>attributes: </b> {{attribute.id}}
+ </div>
+ </div>
+</template>
+
+<script>
+import ModelService from "./../../services/Model.service.js";
+import util from "./../../services/Util.service.js";
+
+var categoryMap = {
+ subject: {
+ addTitle: "Add Subject Category",
+ removeTitleFromMetaRule:
+ "Are you sure to remove from meta rule this Subject Category?",
+ removeTitle: "Are you sure to remove this Subject Category?",
+ listName: "subject_categories",
+ serviceListName: "subjectCategories"
+ },
+ object: {
+ addTitle: "Add Object Category",
+ removeTitleFromMetaRule:
+ "Are you sure to remove from meta rule this Object Category?",
+ removeTitle: "Are you sure to remove this Object Category?",
+ listName: "object_categories",
+ serviceListName: "objectCategories"
+ },
+ action: {
+ addTitle: "Add Action Category",
+ removeTitleFromMetaRule:
+ "Are you sure to remove from meta rule this Action Category?",
+ removeTitle: "Are you sure to remove this Action Category?",
+ listName: "action_categories",
+ serviceListName: "actionCategories"
+ }
+};
+
+export default {
+ name: "category",
+ props: {
+ metarule: Object,
+ category: Object,
+ attributes: Array,
+ type: String
+ },
+ methods: {
+ removeCategory() {
+ var typeValue = categoryMap[this.type];
+ if (confirm(typeValue.removeTitleFromMetaRule)) {
+ var metaruleCopy = util.clone(this.metarule);
+ metaruleCopy[typeValue.listName].splice(
+ metaruleCopy[typeValue.listName].indexOf(this.category),
+ 1
+ );
+ ModelService.updateMetaRule(metaruleCopy);
+ }
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/CreateModel.vue b/dashboard/src/components/model/CreateModel.vue
new file mode 100644
index 00000000..d5403e7b
--- /dev/null
+++ b/dashboard/src/components/model/CreateModel.vue
@@ -0,0 +1,57 @@
+<template>
+ <div class="list-group-item row">
+ <form>
+ <div class="form-group">
+ <label for="modelName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="modelCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="modelName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="modelDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="modelCreate.description"
+ v-validate.initial="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="createModel()">Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import ModelService from "./../../services/Model.service.js";
+
+export default {
+ name: "createModel",
+ data: function() {
+ return {
+ modelCreate: {
+ name: "",
+ description: ""
+ }
+ };
+ },
+ methods: {
+ createModel() {
+ ModelService.createModel(this.modelCreate);
+ this.close();
+ },
+ close() {
+ this.$emit("close")
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/Metarule.vue b/dashboard/src/components/model/Metarule.vue
new file mode 100644
index 00000000..1cb266bd
--- /dev/null
+++ b/dashboard/src/components/model/Metarule.vue
@@ -0,0 +1,155 @@
+<template>
+ <div class="">
+ <template v-if="edit">
+ <form>
+ <div class="form-group">
+ <label for="metaruleName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="metaruleEdit.name"
+ v-validate="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="metaruleName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="modelDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="metaruleEdit.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button>
+ <span>&nbsp;</span>
+ <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="updateMetarule()">Update</button>
+ </form>
+ </template>
+ <template v-else>
+ <h3 class="list-group-item-heading inline">{{ metarule.name }}</h3>
+ <div class="pull-right">
+ <button
+ type="button"
+ class="fa fa-trash btn btn-dark btn-sm"
+ @click="removeMetarule()"
+ title="Remove Meta Rule"
+ ></button>
+ <button
+ type="button"
+ class="fa fa-edit btn btn-dark btn-sm"
+ @click="updatingMetarule()"
+ title="Edit Meta Rule"
+ ></button>
+ </div>
+ <p class="list-group-item-text">{{ metarule.description }}</p>
+ <p class="list-group-item-text"></p>
+ <table class="table categories">
+ <thead>
+ <tr>
+ <th>
+ <span>Subjects</span>
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="metaruleHelpStrings.subject" data-toggle="tooltip" :title="metaruleHelpStrings.subject"></i>
+ <button
+ type="button"
+ class="fa fa-plus pull-right btn btn-dark btn-sm"
+ @click="addSubjectCategory = true"
+ title="Add Subject"
+ ></button>
+ </th>
+ <th>
+ <span>Objects</span>
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="metaruleHelpStrings.object" data-toggle="tooltip" :title="metaruleHelpStrings.object"></i>
+ <button
+ type="button"
+ class="fa fa-plus pull-right btn btn-dark btn-sm"
+ @click="addObjectCategory = true"
+ title="Add Object"
+ ></button>
+ </th>
+ <th>
+ <span>Actions</span>
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="metaruleHelpStrings.action" data-toggle="tooltip" :title="metaruleHelpStrings.action"></i>
+ <button
+ type="button"
+ class="fa fa-plus pull-right btn btn-dark btn-sm"
+ @click="addActionCategory = true"
+ title="Add Action"
+ ></button>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <AddCategory v-if="addSubjectCategory" :metarule="metarule" type="subject" @close="addSubjectCategory = false"></AddCategory>
+ <Category v-else v-for="category in metarule.subject_categories" :key="category.id" :category="category" :metarule="metarule" :attributes="metarule.subjectAttributes" type="subject"></Category>
+ </td>
+ <td>
+ <AddCategory v-if="addObjectCategory" :metarule="metarule" type="object" @close="addObjectCategory = false"></AddCategory>
+ <Category v-else v-for="category in metarule.object_categories" :key="category.id" :category="category" :metarule="metarule" :attributes="metarule.objectAttributes" type="object"></Category>
+ </td>
+ <td>
+ <AddCategory v-if="addActionCategory" :metarule="metarule" type="action" @close="addActionCategory = false"></AddCategory>
+ <Category v-else v-for="category in metarule.action_categories" :key="category.id" :category="category" :metarule="metarule" :attributes="metarule.actionAttributes" type="action"></Category>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </template>
+ </div>
+</template>
+
+<script>
+import Category from './Category.vue'
+import AddCategory from './AddCategory.vue'
+import ModelService from "./../../services/Model.service.js";
+import util from "./../../services/Util.service.js";
+import helpstrings from "../../helpstrings";
+
+export default {
+ name: "metarule",
+ data: function() {
+ return {
+ edit: false,
+ metaruleEdit: {},
+ addSubjectCategory: false,
+ addObjectCategory: false,
+ addActionCategory: false,
+ metaruleHelpStrings: {}
+ };
+ },
+ components: {
+ Category,
+ AddCategory
+ },
+ props: {
+ metarule: Object,
+ model: Object,
+ },
+ mounted() {
+ this.metaruleHelpStrings = helpstrings.metarule;
+ },
+ methods: {
+ updatingMetarule() {
+ this.metaruleEdit = util.clone(this.metarule);
+ this.edit = true;
+ },
+ updateMetarule() {
+ this.edit = false;
+ ModelService.updateMetaRule(this.metaruleEdit);
+ },
+ removeMetarule() {
+ if (confirm('Are you sure to remove this Meta Rule from model?')) {
+ var modelCopy = util.clone(this.model);
+ modelCopy.meta_rules.splice(modelCopy.meta_rules.indexOf(this.metarule), 1);
+ ModelService.updateModel(modelCopy);
+ }
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/Model.vue b/dashboard/src/components/model/Model.vue
new file mode 100644
index 00000000..82ad992d
--- /dev/null
+++ b/dashboard/src/components/model/Model.vue
@@ -0,0 +1,112 @@
+<template>
+ <div>
+ <template v-if="edit">
+ <form>
+ <div class="form-group">
+ <label for="modelName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="modelEdit.name"
+ v-validate="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="modelName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="modelDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="modelEdit.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button>
+ <span>&nbsp;</span>
+ <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="updateModel()">Update</button>
+ </form>
+ </template>
+ <template v-else>
+ <h3 class="list-group-item-heading inline">{{ model.name }}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash btn btn-dark btn-sm" @click="removeModel()" title="Remove Model"></button>
+ <button type="button" class="fa fa-edit btn btn-dark btn-sm" @click="updatingModel()" title="Edit Model"></button>
+ </div>
+ <p class="list-group-item-text">{{ model.description }}</p>
+
+ <AddMetarule v-if="addMetarule" :model="model" @close="addMetarule = false"></AddMetarule>
+ <details class="list-group-item-text" v-else>
+ <summary>
+ <h4 class="inline-block width-200">
+ {{ model.meta_rules.length + ' meta rule' + (model.meta_rules.length > 1 ? 's' : '&nbsp;') }}
+ <i class="fa fa-question-circle" v-if="modelHelpStrings.metarule" data-toggle="tooltip" :title="modelHelpStrings.metarule"></i>
+ </h4>
+ <button
+ type="button"
+ class="fa fa-plus btn btn-dark btn-sm"
+ @click="addMetarule = true"
+ title="Add Meta Rule"
+ ></button>
+ </summary>
+ <div class="list-group">
+ <Metarule
+ v-for="metarule in model.meta_rules"
+ :key="metarule.id"
+ :metarule="metarule"
+ :model="model"
+ ></Metarule>
+ </div>
+ </details>
+ </template>
+ <hr>
+ </div>
+</template>
+
+<script>
+import Metarule from "./Metarule.vue";
+import ModelService from "./../../services/Model.service.js";
+import AddMetarule from "./AddMetarule.vue";
+import util from "./../../services/Util.service.js";
+import helpstrings from "../../helpstrings";
+
+export default {
+ name: "model",
+ data: function() {
+ return {
+ edit: false,
+ addMetarule: false,
+ modelEdit: {},
+ modelHelpStrings: {}
+ };
+ },
+ components: {
+ Metarule,
+ AddMetarule
+ },
+ props: {
+ model: Object
+ },
+ mounted() {
+ this.modelHelpStrings = helpstrings.model;
+ },
+ methods: {
+ updatingModel() {
+ this.modelEdit = util.clone(this.model);
+ this.edit = true;
+ },
+ updateModel() {
+ this.edit = false;
+ ModelService.updateModel(this.modelEdit);
+ },
+ removeModel() {
+ if (confirm('Are you sure to delete this Model?')) {
+ ModelService.removeModel(this.model);
+ }
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/OrphanCategory.vue b/dashboard/src/components/model/OrphanCategory.vue
new file mode 100644
index 00000000..316b8095
--- /dev/null
+++ b/dashboard/src/components/model/OrphanCategory.vue
@@ -0,0 +1,65 @@
+<template>
+ <div class="list-group col-lg-3">
+ <h3 class="list-group-item active">{{title}}</h3>
+ <div v-for="category in categories" class="list-group-item" :key="category.id">
+ <h4 class="list-group-item-heading inline">{{ category.name }}</h4>
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn btn-dark btn-sm"
+ @click="removeCategory(category)"
+ :title="buttonTitle"
+ ></button>
+ <p class="list-group-item-text">{{ category.description }}</p>
+ </div>
+ </div>
+</template>
+
+<script>
+import ModelService from "./../../services/Model.service.js";
+
+var categoryMap = {
+ subject: {
+ title: "Orphan Subject categories",
+ removeButtonTitle: "Remove Subject category",
+ removeTitle: "Are you sure to remove this Subject Category?",
+ listName: "subject_categories",
+ serviceListName: "subjectCategories"
+ },
+ object: {
+ title: "Orphan Object categories",
+ removeButtonTitle: "Remove Object category",
+ removeTitle: "Are you sure to remove this Object Category?",
+ listName: "object_categories",
+ serviceListName: "objectCategories"
+ },
+ action: {
+ title: "Orphan Action categories",
+ removeButtonTitle: "Remove Action category",
+ removeTitle: "Are you sure to remove this Action Category?",
+ listName: "action_categories",
+ serviceListName: "actionCategories"
+ }
+};
+
+export default {
+ props: {
+ categories: Array,
+ type: String
+ },
+ computed: {
+ title() {
+ return categoryMap[this.type].title;
+ },
+ buttonTitle() {
+ return categoryMap[this.type].removeButtonTitle;
+ }
+ },
+ methods: {
+ removeCategory(category) {
+ if (confirm(categoryMap[this.type].removeTitle)) {
+ ModelService.removeCategory(this.type, category);
+ }
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/model/Orphans.vue b/dashboard/src/components/model/Orphans.vue
new file mode 100644
index 00000000..b3c1c524
--- /dev/null
+++ b/dashboard/src/components/model/Orphans.vue
@@ -0,0 +1,79 @@
+<template>
+ <div>
+ <div class="alert alert-dismissable alert-warning">
+ <button type="button" class="close" data-dismiss="alert" @click="showOrphan = false; $emit('close')">×</button>
+ <h4>Warning!</h4>
+ <p>
+ Some metarules or categories are orphan, please check them and delete them if necessary.
+ <a
+ href
+ @click.prevent="showOrphan = true"
+ v-show="!showOrphan"
+ >Show orphans</a>
+ <a href @click.prevent="showOrphan = false" v-show="showOrphan">Hide orphans</a>
+ </p>
+ </div>
+
+ <div class="row" v-show="showOrphan">
+ <div class="list-group col-lg-3" v-if="orphanMetaRules.length">
+ <h3 class="list-group-item active">Orphan Meta rules</h3>
+ <div v-for="metaRule in orphanMetaRules" class="list-group-item" :key="metaRule.id">
+ <h4 class="list-group-item-heading inline">{{ metaRule.name }}</h4>
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn btn-dark btn-sm"
+ @click="removeMetarule(metaRule)"
+ title="Remove Meta rule"
+ ></button>
+ <p class="list-group-item-text">{{ metaRule.description }}</p>
+ </div>
+ </div>
+
+ <OrphanCategory
+ v-if="orphanSubjectCategories.length"
+ type="subject"
+ :categories="orphanSubjectCategories"
+ ></OrphanCategory>
+ <OrphanCategory
+ v-if="orphanObjectCategories.length"
+ type="object"
+ :categories="orphanObjectCategories"
+ ></OrphanCategory>
+ <OrphanCategory
+ v-if="orphanActionCategories.length"
+ type="action"
+ :categories="orphanActionCategories"
+ ></OrphanCategory>
+ </div>
+ </div>
+</template>
+
+<script>
+import ModelService from "./../../services/Model.service.js";
+import OrphanCategory from "./OrphanCategory.vue";
+
+export default {
+ props: {
+ orphanMetaRules: Array,
+ orphanSubjectCategories: Array,
+ orphanObjectCategories: Array,
+ orphanActionCategories: Array
+ },
+ components: {
+ OrphanCategory,
+ },
+ data() {
+ return {
+ showOrphan: false,
+ allowAlert: true
+ };
+ },
+ methods: {
+ removeMetarule(metarule) {
+ if (confirm("Are you sure to remove this Meta Rule?")) {
+ ModelService.removeMetaRule(metarule);
+ }
+ }
+ }
+};
+</script> \ No newline at end of file
diff --git a/dashboard/src/components/pdp/AddPolicy.vue b/dashboard/src/components/pdp/AddPolicy.vue
new file mode 100644
index 00000000..82ad07e2
--- /dev/null
+++ b/dashboard/src/components/pdp/AddPolicy.vue
@@ -0,0 +1,64 @@
+<template>
+ <div>
+ <hr>
+ <h4>Select policy:</h4>
+ <form data-vv-scope="select">
+ <div class="form-group">
+ <select v-model="selectedPolicyId" v-validate.initial="'required'">
+ <option disabled value>Please select one</option>
+ <option
+ v-for="policy in policies"
+ :value="policy.id"
+ :key="policy.id"
+ >{{policy.name}}</option>
+ </select>
+ </div>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any('select')"
+ class="btn btn-primary"
+ @click="addPolicy()"
+ >Add</button>
+ </form>
+ <br>
+ <br>
+ </div>
+</template>
+
+<script>
+import PdpService from "./../../services/Pdp.service.js";
+import util from "./../../services/Util.service.js";
+
+export default {
+ name: "addPolicy",
+ data: function() {
+ return {
+ selectedPolicyId: null,
+ };
+ },
+ props: {
+ pdp: Object
+ },
+ methods: {
+ addPolicy() {
+ var policy = PdpService.getPolicy(this.selectedPolicyId);
+ var pdpCopy = util.clone(this.pdp);
+ pdpCopy.security_pipeline.push(policy);
+ PdpService.updatePdp(pdpCopy);
+ this.close();
+ },
+ close() {
+ this.$emit("close");
+ }
+ },
+ computed: {
+ policies() {
+ return PdpService.policies.filter(
+ el => !this.pdp.security_pipeline.includes(el)
+ );
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/pdp/CreatePdp.vue b/dashboard/src/components/pdp/CreatePdp.vue
new file mode 100644
index 00000000..aca46413
--- /dev/null
+++ b/dashboard/src/components/pdp/CreatePdp.vue
@@ -0,0 +1,83 @@
+<template>
+ <div class="list-group-item row">
+ <form>
+ <div class="form-group">
+ <label for="modelName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="pdpCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="modelName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="modelDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="pdpCreate.description"
+ v-validate.initial="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <div class="form-group">
+ <label for="pdpVpi">Vim project id</label>
+ <input
+ type="text"
+ name="vim_project_id"
+ v-model="pdpCreate.vim_project_id"
+ class="form-control"
+ id="pdpVpi"
+ >
+ </div>
+ <div class="form-group">
+ <label for="pdpPolicy">Policy</label>
+ <select v-model="selectedPolicy" class="form-control" id="pdpPolicy" v-validate.initial="'required'" name="policy">
+ <option v-for="policy in policies" :key="policy.id" :value="policy.id">{{ policy.name }}</option>
+ </select>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="createModel()">Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import PdpService from "./../../services/Pdp.service.js";
+import PolicyService from "../../services/Policy.service";
+import util from "../../services/Util.service";
+
+export default {
+ data: function() {
+ return {
+ selectedPolicy: null,
+ pdpCreate: {
+ name: "",
+ description: "",
+ security_pipeline: [],
+ vim_project_id: ""
+ }
+ };
+ },
+ computed:{
+ policies() {
+ return util.sortByName(PolicyService.policies);
+ }
+ },
+ methods: {
+ createModel() {
+ this.pdpCreate.security_pipeline.push(this.selectedPolicy);
+ PdpService.createPdp(this.pdpCreate);
+ this.close();
+ },
+ close() {
+ this.$emit("close")
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/pdp/Pdp.vue b/dashboard/src/components/pdp/Pdp.vue
new file mode 100644
index 00000000..3aba3fed
--- /dev/null
+++ b/dashboard/src/components/pdp/Pdp.vue
@@ -0,0 +1,173 @@
+<template>
+ <div class="">
+ <template v-if="edit">
+ <form>
+ <div class="form-group">
+ <label for="pdpName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="pdpEdit.name"
+ v-validate="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="pdpName"
+ >
+ </div>
+ <div class="form-group">
+ <label for="pdpDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="pdpEdit.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ id="pdpDescription"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button>
+ <span>&nbsp;</span>
+ <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="updatePdp()">Update</button>
+ </form>
+ </template>
+ <template v-else>
+ <div>
+ <h3 class="list-group-item-heading inline">{{ pdp.name }}</h3>
+ <div class="pull-right">
+ <button
+ type="button"
+ class="fa fa-trash btn btn-dark btn-sm"
+ @click="removePdp(pdp)"
+ title="Remove PDP"
+ ></button>
+ <button
+ type="button"
+ class="fa fa-edit btn btn-dark btn-sm"
+ @click="updatingPdp(pdp)"
+ title="Edit PDP"
+ ></button>
+ </div>
+ <p class="list-group-item-text">{{ pdp.description }}</p>
+ <h4 class="list-group-item-text">
+ <div v-if="!changeProject">
+ Project: {{ pdp.project ? pdp.project : 'none' }}
+ <button
+ type="button"
+ class="fa fa-edit btn btn-dark btn-sm"
+ @click="changingProject()"
+ title="Change project"
+ ></button>
+ </div>
+ <form class="form-inline" v-else>
+ <label for="projectId">Project ID: </label>
+ &nbsp;
+ <input
+ type="text"
+ name="id"
+ v-model="project"
+ class="form-control"
+ id="projectId"
+ >
+ &nbsp;
+ <button type="button" class="btn btn-secondary" @click="changeProject = false">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ class="btn btn-primary"
+ @click="setProject()"
+ >OK</button>
+ </form>
+ </h4>
+
+ <UpdatePolicy v-if="updatePolicy" :pdp="pdp" @close="updatePolicy = false"></UpdatePolicy>
+ <details class="list-group-item-text" v-else>
+ <summary>
+ <h4 class="inline">
+ {{ pdp.security_pipeline.length }} {{ (pdp.security_pipeline.length > 1) ? "policies" : "policy"}}
+ </h4>
+ <button
+ type="button"
+ class="fa fa-edit btn btn-dark btn-sm"
+ @click="updatePolicy = true"
+ title="Change Policy"
+ ></button>
+ </summary>
+ <div class="list-group">
+ <div
+ v-for="policy in pdp.security_pipeline" :key="policy.id"
+ >
+ <h3 class="list-group-item-heading inline">{{ policy.name }}</h3>
+ <!--<button
+ type="button"
+ class="fa fa-trash pull-right btn btn-dark btn-sm"
+ @click="removePolicyFromPdp(policy)"
+ title="Remove Policy"
+ ></button>-->
+ <p class="list-group-item-text">{{ policy.description }}</p>
+ </div>
+ </div>
+ </details>
+ </div>
+ </template>
+ <hr>
+ </div>
+</template>
+
+<script>
+import PdpService from './../../services/Pdp.service.js';
+//import AddPolicy from "./AddPolicy.vue";
+import UpdatePolicy from "./UpdatePolicy";
+import util from "./../../services/Util.service.js";
+
+export default {
+ name: "pdp",
+ data: function() {
+ return {
+ edit: false,
+ updatePolicy: false,
+ changeProject: false,
+ project: "",
+ pdpEdit: {}
+ };
+ },
+ props: {
+ pdp: Object
+ },
+ components: {
+ //AddPolicy
+ UpdatePolicy
+ },
+ methods: {
+ changingProject() {
+ this.project = this.pdp.project;
+ this.changeProject = true;
+ },
+ removePdp() {
+ if (confirm('Are you sure to delete this PDP?'))
+ PdpService.removePdp(this.pdp);
+ },
+ updatingPdp() {
+ this.pdpEdit = util.clone(this.pdp);
+ this.edit = true;
+ },
+ updatePdp() {
+ this.edit = false;
+ PdpService.updatePdp(this.pdpEdit);
+ },
+ removePolicyFromPdp(policy) {
+ if (confirm('Are you sure to remove this Policy from PDP?')) {
+ //var pdpCopy = util.clone(this.pdp);
+ this.pdp.security_pipeline.splice(this.pdp.security_pipeline.indexOf(policy), 1);
+ PdpService.updatePdp(this.pdp);
+ }
+ },
+ setProject() {
+ var pdpCopy = util.clone(this.pdp);
+ pdpCopy.project = this.project;
+ PdpService.updatePdp(pdpCopy);
+ this.changeProject = false;
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/pdp/UpdatePolicy.vue b/dashboard/src/components/pdp/UpdatePolicy.vue
new file mode 100644
index 00000000..f84cf37e
--- /dev/null
+++ b/dashboard/src/components/pdp/UpdatePolicy.vue
@@ -0,0 +1,64 @@
+<template>
+ <div>
+ <hr>
+ <h4>Select policy:</h4>
+ <form data-vv-scope="select">
+ <div class="form-group">
+ <select v-model="selectedPolicyId" v-validate.initial="'required'">
+ <option disabled value>Please select one</option>
+ <option
+ v-for="policy in policies"
+ :value="policy.id"
+ :key="policy.id"
+ >{{policy.name}}</option>
+ </select>
+ </div>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any('select')"
+ class="btn btn-primary"
+ @click="updatePolicy()"
+ >Update</button>
+ </form>
+ <br>
+ <br>
+ </div>
+</template>
+
+<script>
+import PdpService from "./../../services/Pdp.service.js";
+import util from "./../../services/Util.service.js";
+
+export default {
+ name: "updatePolicy",
+ data: function() {
+ return {
+ selectedPolicyId: null,
+ };
+ },
+ props: {
+ pdp: Object
+ },
+ methods: {
+ updatePolicy() {
+ var policy = PdpService.getPolicy(this.selectedPolicyId);
+ var pdpCopy = util.clone(this.pdp);
+ pdpCopy.security_pipeline = [policy];
+ PdpService.updatePdp(pdpCopy);
+ this.close();
+ },
+ close() {
+ this.$emit("close");
+ }
+ },
+ computed: {
+ policies() {
+ return PdpService.policies.filter(
+ el => !this.pdp.security_pipeline.includes(el)
+ );
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/policy/AssignPerimeter.vue b/dashboard/src/components/policy/AssignPerimeter.vue
new file mode 100644
index 00000000..07814075
--- /dev/null
+++ b/dashboard/src/components/policy/AssignPerimeter.vue
@@ -0,0 +1,244 @@
+<template>
+ <div >
+ <div v-if="selectedData && loading" class="row padding-10">
+ <h4>Loading...</h4>
+ </div>
+ <div v-if="selectedData && !loading">
+ <div class="p-2">
+ <h3>Assign perimeters to {{ selectedData.name }}</h3>
+ <form-header
+ placeholder="Filter"
+ buttonText="Create Perimeter"
+ @click="creatingPerimeter = true"
+ v-model="filterPerimeter"
+ need-button
+ ></form-header>
+ </div>
+ <create-perimeter
+ v-if="creatingPerimeter"
+ :policy="policy"
+ :type="selectedDataType"
+ @close="creatingPerimeter = false"
+ @perimeterCreated="createPerimeter"
+ ></create-perimeter>
+ <div class="row mt-3" v-else>
+ <div class="col-sm">
+ <h4>
+ All perimeters
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="assignPerimeterHelpStrings.allPerimeters" data-toggle="tooltip" :title="assignPerimeterHelpStrings.allPerimeters"></i>
+ </h4>
+ <div class="w-100 height-200 scroll list-group border">
+ <button
+ class="list-group-item"
+ v-for="perimeter in allPerimetersFiltered"
+ :title="perimeter.description"
+ :key="perimeter.id"
+ @click="addPerimeter(perimeter)"
+ >{{ perimeter.name }}</button>
+ </div>
+ <p>Click to add</p>
+ </div>
+ <div class="col-sm">
+ <h4>
+ Policy perimeters
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="assignPerimeterHelpStrings.policyPerimeters" data-toggle="tooltip" :title="assignPerimeterHelpStrings.policyPerimeters"></i>
+ </h4>
+ <div class="w-100 height-200 scroll list-group list-group-flush border">
+ <div
+ @click="assign(perimeter)"
+ class="list-group-item"
+ :key="perimeter.id"
+ v-for="perimeter in perimetersFiltered"
+ >
+ <span :title="perimeter.description">{{ perimeter.name }}</span>
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn-dark btn-sm"
+ @click.stop="removePerimeterFromPolicy(perimeter)"
+ title="Remove Perimeter"
+ ></button>
+ </div>
+ </div>
+ <p>Click to assign</p>
+ </div>
+ <div class="col-sm">
+ <h4>
+ Assigned perimeters
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="assignPerimeterHelpStrings.assignedPerimeters" data-toggle="tooltip" :title="assignPerimeterHelpStrings.assignedPerimeters"></i>
+ </h4>
+ <div class="w-100 list-group border height-200 scroll">
+ <button
+ class="list-group-item"
+ :key="perimeter.id"
+ v-for="perimeter in assignmentsFiltered"
+ :title="perimeter.description"
+ @click="unassign(perimeter)"
+ >{{ perimeter.name }}</button>
+ </div>
+ <p>Click to unassign</p>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+import util from "./../../services/Util.service.js";
+import FormHeader from "./../FormHeader.vue";
+import CreatePerimeter from "./CreatePerimeter.vue";
+import helpstrings from "../../helpstrings";
+
+var categoryMap = {
+ subject: {
+ perimeterId: "subject_id"
+ },
+ object: {
+ perimeterId: "object_id"
+ },
+ action: {
+ perimeterId: "action_id"
+ }
+};
+
+export default {
+ props: {
+ dataToAssign: Object,
+ policy: Object
+ },
+ components: {
+ FormHeader,
+ CreatePerimeter
+ },
+ data() {
+ return {
+ selectedData: null,
+ selectedDataType: "",
+ loading: false,
+ perimeters: [],
+ allPerimeters: [],
+ assignments: [],
+ filterPerimeter: "",
+ creatingPerimeter: false,
+ assignPerimeterHelpStrings: {}
+ };
+ },
+ mounted() {
+ this.assignPerimeterHelpStrings = helpstrings.assignPerimeter;
+ },
+ computed: {
+ allPerimetersFiltered() {
+ return util.filterAndSortByName(this.allPerimeters, this.filterPerimeter);
+ },
+ perimetersFiltered() {
+ return util.filterAndSortByName(this.perimeters, this.filterPerimeter);
+ },
+ assignmentsFiltered() {
+ return util.filterAndSortByName(this.assignments, this.filterPerimeter);
+ }
+ },
+ watch: {
+ dataToAssign() {
+ this.selectedData = this.dataToAssign.selectedData;
+ this.selectedDataType = this.dataToAssign.selectedDataType;
+ if (this.selectedData) {
+ this.loadPerimeter();
+ }
+ }
+ },
+ methods: {
+ createPerimeter(perimeters) {
+ util.pushAll(this.perimeters, perimeters);
+ },
+ addPerimeter(perimeter) {
+ var self = this;
+ PolicyService.addPerimeterToPolicy(
+ self.selectedDataType,
+ self.policy,
+ perimeter
+ ).then(function() {
+ self.allPerimeters.splice(self.allPerimeters.indexOf(perimeter), 1);
+ self.perimeters.push(perimeter);
+ });
+ },
+ assign(perimeter) {
+ var self = this;
+ PolicyService.createAssignment(
+ self.selectedDataType,
+ self.policy,
+ perimeter,
+ self.selectedData
+ ).then(function() {
+ self.assignments.push(perimeter);
+ self.perimeters.splice(self.perimeters.indexOf(perimeter), 1);
+ });
+ },
+ unassign(perimeter) {
+ var self = this;
+ PolicyService.removeAssignment(
+ self.selectedDataType,
+ self.policy,
+ perimeter,
+ self.selectedData
+ ).then(function() {
+ self.perimeters.push(perimeter);
+ self.assignments.splice(self.assignments.indexOf(perimeter), 1);
+ });
+ },
+ removePerimeterFromPolicy(perimeter) {
+ if (
+ confirm(
+ "Are you sure to delete this Perimeter? (Associated assignments will be deleted too)"
+ )
+ ) {
+ var self = this;
+ PolicyService.removePerimeterFromPolicy(
+ self.selectedDataType,
+ self.policy,
+ perimeter
+ ).then(function() {
+ self.perimeters.splice(self.perimeters.indexOf(perimeter), 1);
+ perimeter.policy_list.splice(
+ perimeter.policy_list.indexOf(self.policy.id),
+ 1
+ );
+ if (perimeter.policy_list.length > 0) {
+ self.allPerimeters.push(perimeter);
+ }
+ });
+ }
+ },
+ loadPerimeter() {
+ var self = this;
+ self.loading = true;
+ self.perimeters = [];
+ self.allPerimeters = [];
+ self.assignments = [];
+
+ PolicyService.loadPerimetersAndAssignments(
+ self.selectedDataType,
+ self.policy
+ ).then(function(values) {
+ var category = categoryMap[self.selectedDataType];
+ self.loading = false;
+ self.perimeters = values.perimeters;
+ var index, perimeter;
+ for (index = 0; index < values.allPerimeters.length; index++) {
+ perimeter = values.allPerimeters[index];
+ if (perimeter.policy_list.indexOf(self.policy.id) < 0) {
+ self.allPerimeters.push(perimeter);
+ }
+ }
+ for (index = 0; index < values.assignments.length; index++) {
+ var assignment = values.assignments[index];
+ if (assignment.assignments.indexOf(self.selectedData.id) >= 0) {
+ perimeter = values.perimetersMap[assignment[category.perimeterId]];
+ self.assignments.push(perimeter);
+ self.perimeters.splice(self.perimeters.indexOf(perimeter), 1);
+ }
+ }
+ });
+ }
+ }
+};
+</script> \ No newline at end of file
diff --git a/dashboard/src/components/policy/CreateData.vue b/dashboard/src/components/policy/CreateData.vue
new file mode 100644
index 00000000..ca3c5183
--- /dev/null
+++ b/dashboard/src/components/policy/CreateData.vue
@@ -0,0 +1,75 @@
+<template>
+ <div class="list-group-item row">
+ <form>
+ <div class="form-group">
+ <label for="dataName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="dataCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="dataName"
+ />
+ </div>
+ <div class="form-group">
+ <label for="dataDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="dataCreate.description"
+ v-validate.initial="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="createData()"
+ >Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+
+export default {
+ name: "createData",
+ props: {
+ policy: Object,
+ type: String,
+ category: Object,
+ },
+ data: function() {
+ return {
+ dataCreate: {
+ name: "",
+ description: ""
+ }
+ };
+ },
+ methods: {
+ createData() {
+ var self = this;
+ PolicyService.createData(
+ this.type,
+ this.policy,
+ this.category.id,
+ this.dataCreate
+ ).then(function(datas) {
+ self.$emit("dataCreated", datas[0]);
+ self.close();
+ });
+ },
+ close() {
+ this.$emit("close");
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/policy/CreatePerimeter.vue b/dashboard/src/components/policy/CreatePerimeter.vue
new file mode 100644
index 00000000..b8a9d532
--- /dev/null
+++ b/dashboard/src/components/policy/CreatePerimeter.vue
@@ -0,0 +1,73 @@
+<template>
+ <div class="list-group-item row">
+ <form>
+ <div class="form-group">
+ <label for="perimeterName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="perimeterCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="perimeterName"
+ />
+ </div>
+ <div class="form-group">
+ <label for="perimeterDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="perimeterCreate.description"
+ v-validate.initial="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="createPerimeter()"
+ >Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+
+export default {
+ name: "createPerimeter",
+ props: {
+ policy: Object,
+ type: String
+ },
+ data: function() {
+ return {
+ perimeterCreate: {
+ name: "",
+ description: ""
+ }
+ };
+ },
+ methods: {
+ createPerimeter() {
+ var self = this;
+ PolicyService.createPerimeter(
+ this.type,
+ this.policy,
+ this.perimeterCreate
+ ).then(function(perimeters) {
+ self.$emit("perimeterCreated", perimeters);
+ self.close();
+ });
+ },
+ close() {
+ this.$emit("close");
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/policy/CreatePolicy.vue b/dashboard/src/components/policy/CreatePolicy.vue
new file mode 100644
index 00000000..b3e90c2d
--- /dev/null
+++ b/dashboard/src/components/policy/CreatePolicy.vue
@@ -0,0 +1,84 @@
+<template>
+ <div class="list-group-item row">
+ <form>
+ <div class="form-group">
+ <label for="policyName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="policyCreate.name"
+ v-validate.initial="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="policyName"
+ />
+ </div>
+ <div class="form-group">
+ <label for="policyDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="policyCreate.description"
+ v-validate.initial="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <div class="form-group">
+ <label for="policyGenre">Genre</label>
+ <select v-model="policyCreate.genre" class="form-control" id="policyGenre" v-validate.initial="'required'" name="genre">
+ <option>admin</option>
+ <option>authz</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="policyModel">Model</label>
+ <select v-model="policyCreate.model_id" class="form-control" id="policyModel" v-validate.initial="'required'" name="model">
+ <option v-for="model in models" :key="model.id" :value="model.id">{{ model.name }}</option>
+ </select>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="createPolicy()"
+ >Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+import ModelService from "./../../services/Model.service.js";
+import util from "./../../services/Util.service.js";
+
+export default {
+ name: "createPolicy",
+ data: function() {
+ return {
+ policyCreate: {
+ name: "",
+ description: "",
+ genre: "",
+ model_id: ""
+ }
+ };
+ },
+ computed: {
+ models() {
+ return util.sortByName(ModelService.models);
+ }
+ },
+ methods: {
+ createPolicy() {
+ PolicyService.createPolicy(this.policyCreate);
+ this.close();
+ },
+ close() {
+ this.$emit("close");
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/policy/CreateRule.vue b/dashboard/src/components/policy/CreateRule.vue
new file mode 100644
index 00000000..656fa39a
--- /dev/null
+++ b/dashboard/src/components/policy/CreateRule.vue
@@ -0,0 +1,213 @@
+<template>
+ <div class="list-group-item row">
+ <form v-if="!metaruleId">
+ <div class="form-group">
+ <label for="metarule">Select a Metarule:</label>
+ <select v-model="metaruleId" class="form-control" id="metarule" name="metarule">
+ <option
+ v-for="metarule in policy.model.meta_rules"
+ :key="metarule.id"
+ :value="metarule.id"
+ >{{ metarule.name }}</option>
+ </select>
+ </div>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ </form>
+ <form v-else>
+ <div
+ class="form-group"
+ v-for="(categoryWrapper, index) in ruleData"
+ :key="categoryWrapper.id"
+ >
+ <label
+ :for="categoryWrapper.category.name"
+ >{{ 'Select ' + categoryWrapper.type + ' data of ' + categoryWrapper.category.name + ' category' }}</label>
+ <select
+ v-model="ruleCreate.rule[index]"
+ class="form-control"
+ :id="categoryWrapper.category.name"
+ :name="categoryWrapper.category.name"
+ v-validate.initial="'required'"
+ >
+ <option
+ v-for="data in categoryWrapper.data"
+ :key="data.id"
+ :value="data.id"
+ >{{ data.name }}</option>
+ </select>
+ <create-data
+ class="m-3"
+ @close="creatingDataCategory = null"
+ @dataCreated="dataCreated(categoryWrapper, $event, index)"
+ :policy="policy"
+ :type="categoryWrapper.type"
+ :category="categoryWrapper.category"
+ v-if="creatingDataCategory == categoryWrapper.category"
+ ></create-data>
+ <button
+ v-else
+ type="button"
+ class="btn btn-primary mt-3"
+ @click="creatingDataCategory = categoryWrapper.category"
+ >Or Create one</button>
+ </div>
+ <div v-for='(attribute, index) in policy.attributes' :key="attribute.id" class="form-group">
+ <label for="ruleAttributes">Attribute {{attribute.id}}</label>
+ <select
+ v-model="attributes[index]"
+ class="form-control"
+ v-validate.initial="'required'"
+ >
+ <option
+ v-for="value in attribute.values"
+ :key="value"
+ :value="value"
+ >{{ value }}</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="ruleInstructions">Instructions</label>
+ <select
+ v-model="ruleCreate.instructions"
+ class="form-control"
+ v-validate.initial="'required'"
+ >
+ <option
+ v-for="data in instructions"
+ :key="data"
+ :value="data"
+ >{{ data }}</option>
+ </select>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="close()">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="createRule()"
+ >Create</button>
+ </form>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+import ModelService from "./../../services/Model.service.js";
+import CreateData from "./CreateData.vue";
+
+function addCategories(type, categories, data, mapArray, initArray) {
+ var dataFiltered = [];
+
+ for (var i = 0; i < categories.length; i++) {
+ var category = categories[i];
+ for (var j = 0; j < data.length; j++) {
+ var element = data[j];
+ if (element.category_id == category.id) {
+ dataFiltered.push(element);
+ }
+ }
+
+ mapArray.push({
+ id: category.id,
+ category: category,
+ data: dataFiltered,
+ type: type
+ });
+ initArray.push(dataFiltered.length > 0 ? dataFiltered[0].id : null);
+ }
+}
+
+
+export default {
+ name: "createRule",
+ props: {
+ policy: Object
+ },
+ components: {
+ CreateData
+ },
+ data: function() {
+ return {
+ metarule: null,
+ metaruleId: null,
+ creatingDataCategory: null,
+ ruleData: [],
+ ruleCreate: {
+ instructions: 'grant',
+ rule: [],
+ },
+ instructions: ['grant', 'deny'],
+ attributes: [],
+ attribute: '',
+ };
+ },
+ watch: {
+ policy() {
+ if (this.policy) {
+ this.metaruleId = null;
+ if (this.policy.model.meta_rules.length == 1) {
+ this.metaruleId = this.policy.model.meta_rules[0].id;
+ }
+ }
+ },
+ metaruleId() {
+ if (this.metaruleId) {
+ this.metarule = ModelService.getMetaRule(this.metaruleId);
+ if (this.metarule){
+ for (let i = 0; i < this.policy.attributes.length; i++){
+ let attrs = this.policy.attributes[i].default;
+ this.attributes.push(attrs);
+ }
+ }
+ addCategories(
+ "subject",
+ this.metarule.subject_categories,
+ this.policy.subjectData,
+ this.ruleData,
+ this.ruleCreate.rule
+ );
+ addCategories(
+ "object",
+ this.metarule.object_categories,
+ this.policy.objectData,
+ this.ruleData,
+ this.ruleCreate.rule
+ );
+ addCategories(
+ "action",
+ this.metarule.action_categories,
+ this.policy.actionData,
+ this.ruleData,
+ this.ruleCreate.rule
+ );
+ }
+ }
+ },
+ methods: {
+ createRule() {
+ this.ruleCreate.enabled = true;
+ const instruction = "[{\n\t\"decision\": " + "\"" + this.ruleCreate.instructions + "\"" + "\n}]";
+ this.ruleCreate.instructions = JSON.parse(instruction);
+ this.ruleCreate.meta_rule_id = this.metarule.id;
+ this.ruleCreate.policy_id = this.policy.id;
+ for (let i = 0; i < this.attributes.length; i++) {
+ this.ruleCreate.rule.push("attributes:" + this.attributes[i]);
+ }
+
+ PolicyService.addRuleToPolicy(this.policy, this.ruleCreate);
+ this.close();
+ },
+ dataCreated(wrapper, data, index) {
+ wrapper.data.push(data);
+ this.$set(this.ruleCreate.rule, index, data.id);
+ },
+ close() {
+ this.$emit("close");
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/components/policy/DataList.vue b/dashboard/src/components/policy/DataList.vue
new file mode 100644
index 00000000..40f384f3
--- /dev/null
+++ b/dashboard/src/components/policy/DataList.vue
@@ -0,0 +1,16 @@
+<template>
+ <span>
+ <span v-for="(data, index) in list" :key="data.id">
+ <span v-if="index > 0">,</span>
+ <span>{{ data.name }}</span>
+ </span>
+ </span>
+</template>
+
+<script>
+export default {
+ props: {
+ list: Array
+ }
+}
+</script> \ No newline at end of file
diff --git a/dashboard/src/components/policy/FilterRules.vue b/dashboard/src/components/policy/FilterRules.vue
new file mode 100644
index 00000000..5d685952
--- /dev/null
+++ b/dashboard/src/components/policy/FilterRules.vue
@@ -0,0 +1,24 @@
+<template>
+ <div class="form-inline">
+ <input
+ type="search"
+ class="form-control filter col mr-auto"
+ placeholder="Filter rules"
+ v-bind:value="value"
+ v-on:input="$emit('input', $event.target.value)"
+ >
+ </div>
+</template>
+
+<script>
+ export default {
+ name: "FilterRules",
+ props: {
+ value: String
+ }
+ }
+</script>
+
+<style scoped>
+
+</style> \ No newline at end of file
diff --git a/dashboard/src/components/policy/Policy.vue b/dashboard/src/components/policy/Policy.vue
new file mode 100644
index 00000000..415f6b02
--- /dev/null
+++ b/dashboard/src/components/policy/Policy.vue
@@ -0,0 +1,186 @@
+<template>
+ <div>
+ <template v-if="edit">
+ <form>
+ <div class="form-group" >
+ <label for="policyName">Name</label>
+ <input
+ type="text"
+ name="name"
+ v-model="policyEdit.name"
+ v-validate="'alpha_dash|required|min:3'"
+ class="form-control"
+ id="policyName"
+ />
+ </div>
+ <div class="form-group">
+ <label for="policyDescription">Description</label>
+ <textarea
+ name="description"
+ v-model="policyEdit.description"
+ v-validate="'required|min:3'"
+ class="form-control"
+ ></textarea>
+ </div>
+ <div class="form-group">
+ <label for="policyGenre">Genre</label>
+ <select
+ v-model="policyEdit.genre"
+ class="form-control"
+ id="policyGenre"
+ v-validate.initial="'required'"
+ name="genre"
+ >
+ <option>admin</option>
+ <option>authz</option>
+ </select>
+ </div>
+ <ul>
+ <li v-for="error in errors.all()" :key="error.id">{{ error }}</li>
+ </ul>
+ <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button>
+ <span>&nbsp;</span>
+ <button
+ type="button"
+ :disabled="errors.any()"
+ class="btn btn-primary"
+ @click="updatePolicy()"
+ >Update</button>
+ </form>
+ </template>
+ <template v-else>
+ <h3 class="list-group-item-heading inline " >{{ policy.name }}</h3>
+ <div class="pull-right">
+ <button
+ type="button"
+ class="fa fa-trash btn-dark btn-sm"
+ title="Remove Policy"
+ @click="removePolicy()"
+ ></button>
+ <button
+ type="button"
+ class="fa fa-edit btn-dark btn-sm"
+ title="Edit Policy"
+ @click="updatingPolicy()"
+ ></button>
+ </div>
+ <p class="list-group-item-text">{{ policy.description }}</p>
+
+ <unused-data :policy="policy" v-if="showAlert" @close="allowAlert = false"></unused-data>
+
+ <details class="list-group-item-text">
+ <summary @click="populatePolicy()">
+ <h4 class="inline-block width-200">
+ Rules
+ <i class="fa fa-question-circle" style="margin-left: 2%" v-if="policyHelpStrings.rules" data-toggle="tooltip" :title="policyHelpStrings.rules"></i>
+ </h4>
+ <button
+ type="button"
+ class="fa fa-plus btn-dark btn-sm"
+ @click="creatingRule = true"
+ title="Add Rule"
+ ></button>
+ </summary>
+ <create-rule v-if="creatingRule" @close="creatingRule = false" :policy="policy"></create-rule>
+ <div class="list-group" v-else>
+ <filter-rules v-model="filter" ></filter-rules>
+ <br/>
+ <p v-if="!policy.rulesPopulated" class="list-group-item-text">Loading rules...</p>
+ <div v-else>
+ <rule
+ v-for="rule in filteredRules"
+ :key="rule.id"
+ :rule="rule"
+ :selected="selectedRule == rule"
+ :policy="policy"
+ @show="selectRule($event)"
+ ></rule>
+ </div>
+ </div>
+ </details>
+ </template>
+ <hr />
+ </div>
+</template>
+
+<script>
+import UnusedData from "./UnusedData.vue";
+import PolicyService from "./../../services/Policy.service.js";
+import util from "./../../services/Util.service.js";
+import Rule from "./Rule.vue";
+import CreateRule from "./CreateRule.vue";
+import FilterRules from "./FilterRules.vue";
+
+import Vue from "vue";
+import helpstrings from "../../helpstrings";
+
+var selectedRule = new Vue({data: {rule: null}});
+
+export default {
+ props: {
+ policy: Object
+ },
+ data() {
+ return {
+ filter: "",
+ edit: false,
+ creatingRule: false,
+ allowAlert: true,
+ policyEdit: {},
+ policyHelpStrings: {}
+ };
+ },
+ mounted() {
+ this.policyHelpStrings = helpstrings.policy;
+ },
+ computed: {
+ filteredRules() {
+ let filteredRules = PolicyService.filterByRules(this.policy.rules, this.filter);
+
+
+ return filteredRules;
+ },
+ selectedRule() {
+ return selectedRule.rule;
+ },
+ showAlert() {
+ return (
+ this.allowAlert &&
+ (this.policy.unusedSubjectData.length ||
+ this.policy.unusedObjectData.length ||
+ this.policy.unusedActionData.length)
+ );
+ },
+ },
+ components: {
+ UnusedData,
+ Rule,
+ CreateRule,
+ FilterRules
+ },
+ methods: {
+ populatePolicy() {
+ PolicyService.populatePolicy(this.policy);
+ },
+ removePolicy() {
+ if (
+ confirm(
+ "Are you sure to delete this Policy? (Associated perimeter, data an PDP will be deleted too)"
+ )
+ )
+ PolicyService.removePolicy(this.policy);
+ },
+ updatingPolicy() {
+ this.policyEdit = util.clone(this.policy);
+ this.edit = true;
+ },
+ updatePolicy() {
+ this.edit = false;
+ PolicyService.updatePolicy(this.policyEdit);
+ },
+ selectRule(rule) {
+ selectedRule.rule = rule;
+ }
+ }
+};
+</script> \ No newline at end of file
diff --git a/dashboard/src/components/policy/Rule.vue b/dashboard/src/components/policy/Rule.vue
new file mode 100644
index 00000000..c8889b86
--- /dev/null
+++ b/dashboard/src/components/policy/Rule.vue
@@ -0,0 +1,231 @@
+<template>
+ <div class="list-group-item">
+ <details >
+ <summary class="list-group-item-heading" :style="ruleIsGrant ? 'background-color: var(--green)' : 'background-color: Tomato'" >
+
+ <b>Rule: </b>
+ <data-list :list="rule.subjectData"></data-list> |
+ <data-list :list="rule.actionData"></data-list> |
+ <data-list :list="rule.objectData"></data-list>
+ <span v-if="rule.attributeData.length"> | <data-list :list="rule.attributeData"></data-list></span>
+ <div class="pull-right" style="background-color: white">
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn-dark btn-sm"
+ @click="removeRuleFromPolicy()"
+ title="Remove Rule"
+ ></button>
+ <button type="button"
+ :class="ruleIsGrant ? buttonRuleIsGrant : buttonRuleIsDeny"
+ @click="changeRuleDecision()"
+ title="Change Decision"
+ ></button>
+ </div>
+ </summary>
+ <div >
+ <p class="list-group-item-text"></p>
+ <table class="table">
+ <thead>
+ <tr>
+ <th>
+ <span>
+ Subjects data
+ <i class="fa fa-question-circle" v-if="ruleHelpStrings.subjectsData" data-toggle="tooltip" :title="ruleHelpStrings.subjectsData"></i>
+ </span>
+ </th>
+ <th>
+ <span>
+ Objects data
+ <i class="fa fa-question-circle" v-if="ruleHelpStrings.objectsData" data-toggle="tooltip" :title="ruleHelpStrings.objectsData"></i>
+ </span>
+ </th>
+ <th>
+ <span>
+ Actions data
+ <i class="fa fa-question-circle" v-if="ruleHelpStrings.actionsData" data-toggle="tooltip" :title="ruleHelpStrings.actionsData"></i>
+ </span>
+ </th>
+ <th v-if="rule.attributeData.length">
+ <span>
+ Attributes
+ <i class="fa fa-question-circle" v-if="ruleHelpStrings.attributes" data-toggle="tooltip" :title="ruleHelpStrings.attributes"></i>
+ </span>
+ </th>
+ <th>
+ <span>
+ Instructions
+ <i class="fa fa-question-circle" v-if="ruleHelpStrings.instructions" data-toggle="tooltip" :title="ruleHelpStrings.instructions"></i>
+ </span>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p
+ v-for="data in rule.subjectData"
+ :key="data.id"
+ :class="{'selected-data': selectedData == data}"
+ >
+ <span :title="data.description">{{ data.name }}</span>
+ <button
+ v-if="selectedData != data"
+ type="button"
+ class="fa fa-exchange pull-right btn-dark btn-sm"
+ @click="assignData('subject', data)"
+ title="Assign to perimeters"
+ ></button>
+ <button
+ v-if="selectedData == data"
+ type="button"
+ class="fa fa-times pull-right btn-dark btn-sm"
+ @click="unassignData()"
+ title="Close"
+ ></button>
+ </p>
+ </td>
+ <td>
+ <p
+ v-for="data in rule.objectData"
+ :key="data.id"
+ :class="{'selected-data': selectedData == data}"
+ >
+ <span :title="data.description">{{ data.name }}</span>
+ <button
+ v-if="selectedData != data"
+ type="button"
+ class="fa fa-exchange pull-right btn-dark btn-sm"
+ @click="assignData('object', data)"
+ title="Assign to perimeters"
+ ></button>
+ <button
+ v-if="selectedData == data"
+ type="button"
+ class="fa fa-times pull-right btn-dark btn-sm"
+ @click="unassignData()"
+ title="Close"
+ ></button>
+ </p>
+ </td>
+ <td>
+ <p
+ v-for="data in rule.actionData"
+ :key="data.id"
+ :class="{'selected-data': selectedData == data}"
+ >
+ <span :title="data.description">{{ data.name }}</span>
+ <button
+ v-if="selectedData != data"
+ type="button"
+ class="fa fa-exchange pull-right btn-dark btn-sm"
+ @click="assignData('action', data)"
+ title="Assign to perimeters"
+ ></button>
+ <button
+ v-if="selectedData == data"
+ type="button"
+ class="fa fa-times pull-right btn-dark btn-sm"
+ @click="unassignData()"
+ title="Close"
+ ></button>
+ </p>
+ </td>
+ <td v-if="rule.attributeData.length">
+ <p
+ v-for="data in rule.attributeData"
+ :key="data.id"
+ :class="{'selected-data': selectedData == data}"
+ >
+ <span :title="data.description">{{data.id}} : {{ data.name }}</span>
+ </p>
+ </td>
+ <td>
+ <pre><code>{{rule.instructions}}</code></pre>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <assign-perimeter :policy="policy" :dataToAssign="dataToAssign"></assign-perimeter>
+
+ </div>
+ </details>
+ </div>
+</template>
+
+<script>
+ import AttributeService from "./../../services/Attribute.service"
+ import PolicyService from "./../../services/Policy.service.js";
+ import DataList from "./DataList.vue";
+ import AssignPerimeter from "./AssignPerimeter.vue";
+ import helpstrings from "../../helpstrings";
+
+ export default {
+ props: {
+ rule: Object,
+ selected: Boolean,
+ policy: Object
+ },
+ data() {
+ return {
+ dataToAssign: {
+ selectedData: null,
+ selectedDataType: "",
+ },
+ selectedData: null,
+ ruleIsGrant: false,
+ buttonRuleIsGrant: 'fa fa-toggle-on pull-right btn-dark btn-sm',
+ buttonRuleIsDeny: 'fa fa-toggle-off pull-right btn-dark btn-sm',
+ ruleHelpStrings: {}
+
+ }
+ },
+ components: {
+ DataList,
+ AssignPerimeter,
+ },
+ created() {
+ AttributeService.initialize();
+ },
+ mounted() {
+ this.ruleIsGrant = ("grant".localeCompare(this.rule.instructions[0].decision) == 0);
+ this.ruleHelpStrings = helpstrings.rule;
+ },
+ watch: {
+ selected() {
+ if (!this.selected)
+ this.unassignData();
+ }
+ },
+ methods: {
+ changeRuleDecision() {
+ var decision = ("grant".localeCompare(this.rule.instructions[0].decision) == 0) ? "deny" : "grant";
+ PolicyService.updateRule(this.policy, this.rule, decision).then(res => {
+ this.ruleIsGrant = !this.ruleIsGrant;
+ this.rule.instructions = res;
+ });
+
+ },
+ showRule() {
+ this.$emit("show", this.selected ? null : this.rule);
+ },
+ removeRuleFromPolicy() {
+ if (confirm("Are you sure to delete this Rule?"))
+ PolicyService.removeRuleFromPolicy(this.policy, this.rule);
+ },
+ assignData(type, data) {
+ this.dataToAssign = {
+ selectedData: data,
+ selectedDataType: type,
+ };
+ this.selectedData = data;
+ },
+ unassignData() {
+ this.assignData("", null);
+ }
+ }
+ };
+</script>
+
+<style scoped>
+
+</style> \ No newline at end of file
diff --git a/dashboard/src/components/policy/UnusedData.vue b/dashboard/src/components/policy/UnusedData.vue
new file mode 100644
index 00000000..48b8b642
--- /dev/null
+++ b/dashboard/src/components/policy/UnusedData.vue
@@ -0,0 +1,89 @@
+<template>
+ <div>
+ <div
+ v-if="policy.unusedSubjectData.length
+ || policy.unusedObjectData.length
+ || policy.unusedActionData.length"
+ class="alert alert-dismissable alert-warning"
+ >
+ <button type="button" class="close" data-dismiss="alert" @click="showUnused = false; $emit('close')">×</button>
+ <h4>Warning!</h4>
+ <p>
+ Some data are unused, please check them and delete them if necessary.
+ <a
+ href
+ @click.prevent="showUnused = true"
+ v-show="!showUnused"
+ >Show unused data</a>
+ <a href @click.prevent="showUnused = false" v-show="showUnused">Hide unused data</a>
+ </p>
+ </div>
+
+ <div v-if="showUnused" class="row overflow-hidden mb-3">
+ <div class="list-group col" v-if="policy.unusedSubjectData.length">
+ <h3 class="list-group-item active">Unused Subject data</h3>
+ <div v-for="subject in policy.unusedSubjectData" :key="subject.id" class="list-group-item">
+ <h4 class="list-group-item-heading inline" :title="subject.description">{{ subject.name }}</h4>
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn-dark btn-sm"
+ @click="removeData('subject', policy, subject)"
+ title="Remove Subject data"
+ ></button>
+ </div>
+ </div>
+
+ <div class="list-group col" v-if="policy.unusedObjectData.length">
+ <h3 class="list-group-item active">Unused Object data</h3>
+ <div v-for="object in policy.unusedObjectData" :key="object.id" class="list-group-item">
+ <h4 class="list-group-item-heading inline" :title="object.description">{{ object.name }}</h4>
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn-dark btn-sm"
+ @click="removeData('object', policy, object)"
+ title="Remove Object data"
+ ></button>
+ </div>
+ </div>
+
+ <div class="list-group col" v-if="policy.unusedActionData.length">
+ <h3 class="list-group-item active">Unused Action data</h3>
+ <div v-for="action in policy.unusedActionData" :key="action.id" class="list-group-item">
+ <h4 class="list-group-item-heading inline" :title="action.description">{{ action.name }}</h4>
+ <button
+ type="button"
+ class="fa fa-trash pull-right btn-dark btn-sm"
+ @click="removeData('action', policy, action)"
+ title="Remove Action data"
+ ></button>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+import PolicyService from "./../../services/Policy.service.js";
+
+
+export default {
+ props: {
+ policy: Object
+ },
+ data() {
+ return {
+ showUnused: false
+ };
+ },
+ methods: {
+ removeData(type, policy, data) {
+ if (
+ confirm(
+ "Are you sure to delete this Data? (Associated assignments and rules will be deleted too)"
+ )
+ )
+ PolicyService.removeData(type, policy, data);
+ }
+ }
+};
+</script> \ No newline at end of file
diff --git a/dashboard/src/config.js b/dashboard/src/config.js
new file mode 100644
index 00000000..2849ec7d
--- /dev/null
+++ b/dashboard/src/config.js
@@ -0,0 +1,4 @@
+export default {
+ // Moon Manager URL
+ host: 'http://127.0.0.1:8000',
+} \ No newline at end of file
diff --git a/dashboard/src/helpstrings.js b/dashboard/src/helpstrings.js
new file mode 100644
index 00000000..63751e78
--- /dev/null
+++ b/dashboard/src/helpstrings.js
@@ -0,0 +1,25 @@
+export default {
+ model: {
+ metarule: 'model.metarule'
+ },
+ metarule: {
+ subject: 'metarule.subject',
+ object: 'meterule.object',
+ action: 'meterule.action'
+ },
+ policy:{
+ rules: 'policy.rules'
+ },
+ assignPerimeter:{
+ allPerimeters: 'assignPerimeter.allPerimeters',
+ policyPerimeters: 'assignPerimeter.policyPerimeters',
+ assignedPerimeters: 'assignPerimeter.assignedPerimeters'
+ },
+ rule:{
+ subjectsData: 'rule.subjectsData',
+ objectsData: 'rule.objectsData',
+ actionsData: 'rule.actionsData',
+ attributes: 'rule.attributes',
+ instructions: 'rule.instructions',
+ }
+} \ No newline at end of file
diff --git a/dashboard/src/main.js b/dashboard/src/main.js
new file mode 100644
index 00000000..e18e3ebf
--- /dev/null
+++ b/dashboard/src/main.js
@@ -0,0 +1,58 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import VueResource from 'vue-resource'
+import VeeValidate from 'vee-validate'
+import Toasted from 'vue-toasted'
+
+Vue.config.productionTip = false
+
+Vue.use(VueResource)
+Vue.use(VeeValidate)
+Vue.use(Toasted)
+
+Vue.http.interceptors.push(function () {
+ return function (response) {
+ if (response.status == 401) {
+ router.push('auth');
+ } else if (response.status == 0) {
+ router.push('error');
+ }
+ }
+});
+
+var authKey = localStorage.getItem("auth-key")
+if (authKey) {
+ Vue.http.headers.common['x-api-key'] = authKey;
+} else {
+ router.push('auth');
+}
+
+Vue.toasted.register('toast',
+ (payload) => {
+ return `
+ <div class="toast show" role="alert" aria-live="assertive" aria-atomic="true">
+ <div class="toast-header">
+ <span class="badge badge-${payload.type}">&nbsp;</span>
+ <strong class="ml-2">${payload.title}</strong>
+ </div>
+ <div class="toast-body">
+ ${payload.message}
+ </div>
+ </div>
+ `;
+ },
+
+ {
+ className: "toast-background",
+ position: 'top-center',
+ duration: 3000
+ })
+
+
+new Vue({
+ router,
+ render: h => h(App)
+}).$mount('#app')
+
+
diff --git a/dashboard/src/router.js b/dashboard/src/router.js
new file mode 100644
index 00000000..f05d9515
--- /dev/null
+++ b/dashboard/src/router.js
@@ -0,0 +1,56 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Models from './views/Models.vue'
+import Auth from './views/Auth.vue'
+import Rules from './views/Rules.vue'
+import PDP from './views/Pdps.vue'
+import Admin from './views/Admin.vue'
+import ErrorPage from './views/Error.vue'
+import Assignments from "./views/Assignments";
+
+Vue.use(Router)
+
+export default new Router({
+ routes: [
+ {
+ path: '/auth',
+ name: 'auth',
+ component: Auth
+ },
+ {
+ path: '/',
+ redirect: { name: 'models' }
+ },
+ {
+ path: '/models',
+ name: 'models',
+ component: Models
+ },
+ {
+ path: '/rules',
+ name: 'rules',
+ component: Rules
+ },
+ {
+ path: '/assignments',
+ name: 'assignments',
+ component: Assignments
+ },
+ {
+ path: '/pdp',
+ name: 'pdp',
+ component: PDP
+ },
+ {
+ path: '/admin',
+ name: 'admin',
+ component: Admin
+ },
+ {
+ path: '/error',
+ name: 'error',
+ component: ErrorPage
+ },
+
+ ]
+})
diff --git a/dashboard/src/services/Attribute.service.js b/dashboard/src/services/Attribute.service.js
new file mode 100644
index 00000000..a00da8f1
--- /dev/null
+++ b/dashboard/src/services/Attribute.service.js
@@ -0,0 +1,46 @@
+import Vue from 'vue'
+import config from '../config.js'
+import util from './Util.service'
+
+var host = config.host;
+
+var attributeResource;
+
+var attributesMap = {};
+var attributes = [];
+
+function loadAttributes(){
+ attributeResource = Vue.resource(host + '/attributes{/id}', {});
+
+ attributeResource.query().then(res => {
+ createAttributes(res.body);
+ }, util.displayErrorFunction('Unable to load attributes'));
+}
+
+function createAttributes(attributesData){
+ attributes.splice(0, attributes.length);
+ util.cleanObject(attributesMap);
+ util.createInternal(attributesData.attributes, attributes, attributesMap);
+}
+
+function getAttribute(id){
+ return attributesMap[id];
+}
+
+function getAttributeId(name){
+ for (let i = 0; i < attributes.length; i++){
+ let attr = attributes[i];
+ for (let j = 0; j < attr.values.length; j++){
+ let value = attr.values[j];
+ if (value === name){
+ return attr.id;
+ }
+ }
+ }
+}
+
+export default {
+ initialize: loadAttributes,
+ getAttribute: getAttribute,
+ getAttributeId: getAttributeId
+} \ No newline at end of file
diff --git a/dashboard/src/services/Import.service.js b/dashboard/src/services/Import.service.js
new file mode 100644
index 00000000..f2cc77ff
--- /dev/null
+++ b/dashboard/src/services/Import.service.js
@@ -0,0 +1,16 @@
+import Vue from 'vue'
+import util from './Util.service.js'
+import config from '../config.js'
+
+var host = config.host;
+
+export default {
+ importData: async function importData(data) {
+ var importResource = Vue.resource(host + '/import/', {});
+
+ return importResource.save(null, data).then(success, util.displayErrorFunction('Unable to import data'));
+ function success() {
+ util.displaySuccess('Data imported');
+ }
+ }
+} \ No newline at end of file
diff --git a/dashboard/src/services/Model.service.js b/dashboard/src/services/Model.service.js
new file mode 100644
index 00000000..b9b96743
--- /dev/null
+++ b/dashboard/src/services/Model.service.js
@@ -0,0 +1,351 @@
+import Vue from 'vue'
+import util from './Util.service.js'
+import config from '../config.js'
+
+var host = config.host;
+
+var modelResource;
+var metaRuleResource;
+var subjectCategoryResource;
+var objectCategoryResource;
+var actionCategoryResource;
+var attributesResource;
+
+var modelsMap = {};
+var metaRulesMap = {};
+var subjectCategoriesMap = {};
+var objectCategoriesMap = {};
+var actionCategoriesMap = {};
+var attributesMap = {};
+var models = [];
+var metaRules = [];
+var orphanMetaRules = [];
+var subjectCategories = [];
+var objectCategories = [];
+var actionCategories = [];
+var attributes = [];
+var orphanSubjectCategories = [];
+var orphanObjectCategories = [];
+var orphanActionCategories = [];
+
+var categoryMap = {
+ 'subject': {
+ resource: subjectCategoryResource,
+ map: subjectCategoriesMap,
+ list: subjectCategories,
+ listName: 'subject_categories'
+ },
+ 'object': {
+ resource: objectCategoryResource,
+ map: objectCategoriesMap,
+ list: objectCategories,
+ listName: 'object_categories'
+ },
+ 'action': {
+ resource: actionCategoryResource,
+ map: actionCategoriesMap,
+ list: actionCategories,
+ listName: 'action_categories'
+ },
+ 'attribute' : {
+ resource: attributesResource,
+ map: attributesMap,
+ list: attributes,
+ listName: 'attributes'
+ }
+}
+
+
+function loadModels() {
+ modelResource = Vue.resource(host + '/models{/id}', {}, {patch: {method: 'PATCH'}});
+ metaRuleResource = Vue.resource(host + '/meta_rules{/id}', {}, {patch: {method: 'PATCH'}});
+ categoryMap['subject'].resource = subjectCategoryResource = Vue.resource(host + '/subject_categories{/id}');
+ categoryMap['object'].resource = objectCategoryResource = Vue.resource(host + '/object_categories{/id}');
+ categoryMap['action'].resource = actionCategoryResource = Vue.resource(host + '/action_categories{/id}');
+ categoryMap['attribute'].resource = attributesResource = Vue.resource(host + '/attributes{/id}');
+ var queries = [
+ modelResource.query(),
+ metaRuleResource.query(),
+ subjectCategoryResource.query(),
+ objectCategoryResource.query(),
+ actionCategoryResource.query(),
+ attributesResource.query()
+ ]
+
+ var result = Promise.all(queries).then(function (result) {
+ createModels(result[0].body, result[1].body, result[2].body, result[3].body, result[4].body, result[5].body)
+ })
+
+ return result;
+}
+
+function createModels(modelsData, metarulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData, attributesData) {
+ util.cleanObject(modelsMap);
+ util.cleanObject(metaRulesMap);
+ util.cleanObject(subjectCategoriesMap);
+ util.cleanObject(objectCategoriesMap);
+ util.cleanObject(actionCategoriesMap);
+ util.cleanObject(attributesMap);
+ models.splice(0, models.length);
+ metaRules.splice(0, metaRules.length);
+ subjectCategories.splice(0, subjectCategories.length);
+ objectCategories.splice(0, objectCategories.length);
+ actionCategories.splice(0, actionCategories.length);
+ attributes.splice(0, attributes.length);
+ if (subjectCategoriesData.subject_categories) createCategoryInternal('subject', subjectCategoriesData.subject_categories);
+ if (objectCategoriesData.object_categories) createCategoryInternal('object', objectCategoriesData.object_categories);
+ if (actionCategoriesData.action_categories) createCategoryInternal('action', actionCategoriesData.action_categories);
+ if (attributesData.attributes) createCategoryInternal('attribute', attributesData.attributes);
+ if (metarulesData.meta_rules) createMetaRuleInternal(metarulesData.meta_rules);
+ if (modelsData.models) createModelInternal(modelsData.models);
+
+ updateOrphan();
+}
+
+function mapModel(model) {
+ util.mapIdToItem(model.meta_rules, metaRulesMap);
+}
+
+function createModelInternal(data) {
+ return util.createInternal(data, models, modelsMap, mapModel);
+}
+
+function updateModelInternal(data) {
+ return util.updateInternal(data, modelsMap, mapModel);
+}
+
+function removeModelInternal(id) {
+ return util.removeInternal(id, models, modelsMap);
+}
+
+function mapIdToItemWithAttributes(categories, categoriesMap, attributes, attributesMap) {
+ let categoriesToRemove = []
+ if (categories) {
+ var index2 = 0;
+ for (var index = 0; index < categories.length; index++) {
+ var id = categories[index];
+ if (categoriesMap[id])
+ categories[index] = categoriesMap[id];
+ else {
+ if(id.includes('attributes:')){
+ const newId = id.split(':')[1];
+ if (attributesMap[newId]){
+ attributes[index2++] = attributesMap[newId];
+ }
+ categoriesToRemove.push(index)
+ }
+ }
+ }
+ for (let i = categoriesToRemove.length - 1; i >= 0; i--){
+ categories.splice(categoriesToRemove[i], 1);
+ }
+ }
+}
+
+function cleanCategoryByRemovingAttributes(categories, attributesMap){
+ let categoriesToRemove = []
+ if (categories) {
+ for (let index = 0; index < categories.length; index++){
+ var category = categories[index];
+ if (attributesMap[category.name]){
+ categoriesToRemove.push(index)
+ }
+ }
+ for (let i = categoriesToRemove.length - 1; i >= 0; i--){
+ categories.splice(categoriesToRemove[i], 1);
+ }
+ }
+}
+
+function mapMetaRule(metaRule) {
+ metaRule.subjectAttributes = [];
+ metaRule.objectAttributes = [];
+ metaRule.actionAttributes = [];
+ mapIdToItemWithAttributes(metaRule.subject_categories, subjectCategoriesMap, metaRule.subjectAttributes, attributesMap);
+ mapIdToItemWithAttributes(metaRule.object_categories, objectCategoriesMap, metaRule.objectAttributes,attributesMap);
+ mapIdToItemWithAttributes(metaRule.action_categories, actionCategoriesMap, metaRule.actionAttributes, attributesMap);
+ cleanCategoryByRemovingAttributes(subjectCategories, attributesMap);
+ cleanCategoryByRemovingAttributes(objectCategories, attributesMap);
+ cleanCategoryByRemovingAttributes(actionCategories, attributesMap);
+}
+
+function createMetaRuleInternal(data) {
+ return util.createInternal(data, metaRules, metaRulesMap, mapMetaRule);
+}
+
+function updateMetaRuleInternal(data) {
+ return util.updateInternal(data, metaRulesMap, mapMetaRule);
+}
+
+function removeMetaRuleInternal(id) {
+ return util.removeInternal(id, metaRules, metaRulesMap);
+}
+
+function createCategoryInternal(type, data) {
+ var categoryValue = categoryMap[type];
+
+ return util.createInternal(data, categoryValue.list, categoryValue.map)
+}
+
+function removeCategoryInternal(type, id) {
+ var categoryValue = categoryMap[type];
+ return util.removeInternal(id, categoryValue.list, categoryValue.map);
+}
+
+function updateOrphan() {
+ updateOrphanInternal(metaRules, orphanMetaRules, models, "meta_rules");
+ updateOrphanInternal(subjectCategories, orphanSubjectCategories, metaRules, "subject_categories");
+ updateOrphanInternal(objectCategories, orphanObjectCategories, metaRules, "object_categories");
+ updateOrphanInternal(actionCategories, orphanActionCategories, metaRules, "action_categories");
+}
+
+function updateOrphanInternal(list, orphanList, parentList, childListName) {
+ orphanList.splice(0, orphanList.length);
+ util.pushAll(orphanList, list);
+ for (var i = 0; i < parentList.length; i++) {
+ var parent = parentList[i];
+ var children = parent[childListName];
+ if (children) {
+ for (var j = 0; j < children.length; j++) {
+ var child = children[j];
+ if (child){
+ var notOrphanIndex = util.indexOf(orphanList, "id", child.id);
+ if (notOrphanIndex >= 0) {
+ orphanList.splice(notOrphanIndex, 1);
+ }
+ else{
+ for (var k = 0; k < attributes.length; k++){
+ const attr = attributes[k];
+ notOrphanIndex = util.indexOf(orphanList, "name", attr.id);
+ if (notOrphanIndex >= 0) {
+ orphanList.splice(notOrphanIndex, 1);
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+}
+
+function getAttributesForModelId(modelId) {
+ let model = modelsMap[modelId];
+ let attrs = []
+
+ for (let i = 0; i < model.meta_rules.length; i++){
+ let metaRule = model.meta_rules[i];
+ let j;
+ for (j = 0; j < metaRule.subjectAttributes.length; j++){
+ attrs.push(metaRule.subjectAttributes[j])
+ }
+ for (j = 0; j < metaRule.objectAttributes.length; j++){
+ attrs.push(metaRule.objectAttributes[j])
+ }
+ for (j = 0; j < metaRule.actionAttributes.length; j++){
+ attrs.push(metaRule.actionAttributes[j])
+ }
+ }
+ return attrs;
+}
+
+export default {
+ initialize: loadModels,
+ createModels: createModels,
+ models: models,
+ metaRules: metaRules,
+ orphanMetaRules: orphanMetaRules,
+ orphanSubjectCategories: orphanSubjectCategories,
+ orphanObjectCategories: orphanObjectCategories,
+ orphanActionCategories: orphanActionCategories,
+ subjectCategories: subjectCategories,
+ objectCategories: objectCategories,
+ actionCategories: actionCategories,
+ getModel: function getModel(id) {
+ return modelsMap[id];
+ },
+ getAttributesForModelId: getAttributesForModelId,
+ createModel: function createModel(model) {
+ model.meta_rules = [];
+ modelResource.save(null, model).then(success, util.displayErrorFunction('Unable to create model'));
+
+ function success(data) {
+ createModelInternal(data.body.models);
+ util.displaySuccess('Model created');
+ }
+ },
+ removeModel: function removeModel(model) {
+ modelResource.remove({ id: model.id }).then(success, util.displayErrorFunction('Unable to remove model'));
+
+ function success() {
+ removeModelInternal(model.id);
+ updateOrphan();
+ util.displaySuccess('Model removed');
+ }
+ },
+ updateModel: function updateModel(model) {
+ util.mapItemToId(model.meta_rules)
+ modelResource.patch({ id: model.id }, model).then(success, util.displayErrorFunction('Unable to update model'));
+
+ function success(data) {
+ updateModelInternal(data.body.models);
+
+ updateOrphan();
+ util.displaySuccess('Model updated');
+ }
+ },
+ getMetaRule: function getMetaRule(id) {
+ return metaRulesMap[id];
+ },
+ createMetaRule: function createMetaRule(metaRule) {
+ metaRule.subject_categories = [];
+ metaRule.object_categories = [];
+ metaRule.action_categories = [];
+
+ return metaRuleResource.save(null, metaRule).then(function (data) {
+ util.displaySuccess('Meta Rule created');
+ return createMetaRuleInternal(data.body.meta_rules)[0];
+ }, util.displayErrorFunction('Unable to create meta rule'))
+ },
+ updateMetaRule: function updateMetaRule(metaRule) {
+ util.mapItemToId(metaRule.subject_categories);
+ util.mapItemToId(metaRule.object_categories);
+ util.mapItemToId(metaRule.action_categories);
+ metaRuleResource.patch({ id: metaRule.id }, metaRule).then(success, util.displayErrorFunction('Unable to update meta rule'));
+
+ function success(data) {
+ updateMetaRuleInternal(data.body.meta_rules);
+ updateOrphan();
+ util.displaySuccess('Meta Rule updated');
+ }
+ },
+ removeMetaRule: function removeMetaRule(metaRule) {
+ metaRuleResource.remove({ id: metaRule.id }).then(success, util.displayErrorFunction('Unable to remove meta rule'));
+
+ function success() {
+ removeMetaRuleInternal(metaRule.id);
+ updateOrphan();
+ util.displaySuccess('Meta Rule removed');
+ }
+ },
+ getCategory: function getCategory(type, id) {
+ return categoryMap[type].map[id];
+ },
+ createCategory: function createCategory(type, category) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.resource.save(null, category).then(function (data) {
+ util.displaySuccess('Category created');
+ return createCategoryInternal(type, data.body[categoryValue.listName])[0];
+ }, util.displayErrorFunction('Unable to create category'))
+ },
+ removeCategory: function removeCategory(type, category) {
+ var categoryValue = categoryMap[type];
+ categoryValue.resource.remove({ id: category.id }).then(success, util.displayErrorFunction('Unable to remove category'));
+
+ function success() {
+ removeCategoryInternal(type, category.id);
+ updateOrphan();
+ util.displaySuccess('Category removed');
+ }
+ },
+} \ No newline at end of file
diff --git a/dashboard/src/services/Pdp.service.js b/dashboard/src/services/Pdp.service.js
new file mode 100644
index 00000000..e0c286a0
--- /dev/null
+++ b/dashboard/src/services/Pdp.service.js
@@ -0,0 +1,92 @@
+import Vue from 'vue'
+import util from './Util.service.js'
+import config from '../config.js'
+
+var host = config.host;
+
+var pdpResource;
+var policyResource;
+
+var pdpsMap = {};
+var pdps = [];
+var policiesMap = {};
+var policies = [];
+
+function loadPdps() {
+ pdpResource = Vue.resource(host + '/pdp{/id}', {}, {patch: {method: 'PATCH'}});
+ policyResource = Vue.resource(host + '/policies{/id}', {});
+
+ var queries = [
+ pdpResource.query(),
+ policyResource.query(),
+ ]
+ Promise.all(queries).then(function (result) {
+ createPdps(result[0].body, result[1].body)
+ })
+
+}
+
+function createPdps(pdpsData, policiesData) {
+ pdps.splice(0, pdps.length);
+ policies.splice(0, policies.length);
+ util.cleanObject(pdpsMap);
+ util.cleanObject(policiesMap);
+
+ util.createInternal(policiesData.policies, policies, policiesMap);
+ createPdpInternal(pdpsData.pdps);
+}
+
+function mapPdp(pdp) {
+ util.mapIdToItem(pdp.security_pipeline, policiesMap);
+ pdp.project = pdp.vim_project_id;
+}
+
+function createPdpInternal(data) {
+ return util.createInternal(data, pdps, pdpsMap, mapPdp);
+}
+
+function updatePdpInternal(data) {
+ return util.updateInternal(data, pdpsMap, mapPdp);
+}
+
+function removePdpInternal(id) {
+ return util.removeInternal(id, pdps, pdpsMap);
+}
+
+export default {
+ initialize: loadPdps,
+ createPdps: createPdps,
+ pdps: pdps,
+ policies: policies,
+ createPdp: function createPdp(pdp) {
+ pdpResource.save(null, pdp).then(success, util.displayErrorFunction('Unable to create PDP'));
+
+ function success(data) {
+ createPdpInternal(data.body.pdps);
+ util.displaySuccess('PDP created');
+ }
+ },
+ removePdp: function removePdp(pdp) {
+ pdpResource.remove({ id: pdp.id }).then(success, util.displayErrorFunction('Unable to remove PDP'));
+
+ function success() {
+ removePdpInternal(pdp.id);
+ util.displaySuccess('PDP removed');
+ }
+ },
+ updatePdp: function updatePdp(pdp) {
+ util.mapItemToId(pdp.security_pipeline);
+ pdp.vim_project_id = pdp.project;
+ pdpResource.patch({ id: pdp.id }, pdp).then(success, util.displayErrorFunction('Unable to update PDP'));
+
+ function success(data) {
+ updatePdpInternal(data.body.pdps)
+ util.displaySuccess('PDP updated');
+ }
+ },
+ getPolicy: function getPolicy(id) {
+ return policiesMap[id];
+ },
+}
+
+
diff --git a/dashboard/src/services/Policy.service.js b/dashboard/src/services/Policy.service.js
new file mode 100644
index 00000000..433680e9
--- /dev/null
+++ b/dashboard/src/services/Policy.service.js
@@ -0,0 +1,470 @@
+import Vue from 'vue'
+import util from './Util.service.js'
+import ModelService from './Model.service.js'
+import AttributeService from './Attribute.service'
+import config from '../config.js'
+
+var host = config.host;
+
+var policyResource;
+var policyRulesResource;
+
+var categoryMap = {
+ 'subject': {
+ arrayName: "subjectData",
+ mapName: "subjectDataMap",
+ responseName: "subject_data",
+ perimeterResponseName: "subjects",
+ assignmentResponseName: "subject_assignments",
+ unusedArrayName: "unusedSubjectData",
+ },
+ 'object': {
+ arrayName: "objectData",
+ mapName: "objectDataMap",
+ responseName: "object_data",
+ perimeterResponseName: "objects",
+ assignmentResponseName: "object_assignments",
+ unusedArrayName: "unusedObjectData",
+ },
+ 'action': {
+ arrayName: "actionData",
+ mapName: "actionDataMap",
+ responseName: "action_data",
+ perimeterResponseName: "actions",
+ assignmentResponseName: "action_assignments",
+ unusedArrayName: "unusedActionData",
+ }
+}
+
+var policiesMap = {};
+var policies = [];
+
+function loadPolicies() {
+ policyResource = Vue.resource(host + '/policies{/id}', {}, {patch: {method: 'PATCH'}});
+ categoryMap['subject'].policyPerimeterResource = Vue.resource(host + '/policies{/policy_id}/subjects{/perimeter_id}', {});
+ categoryMap['object'].policyPerimeterResource = Vue.resource(host + '/policies{/policy_id}/objects{/perimeter_id}', {}, );
+ categoryMap['action'].policyPerimeterResource = Vue.resource(host + '/policies{/policy_id}/actions{/perimeter_id}', {}, );
+ categoryMap['subject'].perimeterResource = Vue.resource(host + '/subjects{/perimeter_id}', {}, {patch: {method: 'PATCH'}});
+ categoryMap['object'].perimeterResource = Vue.resource(host + '/objects{/perimeter_id}', {}, {patch: {method: 'PATCH'}});
+ categoryMap['action'].perimeterResource = Vue.resource(host + '/actions{/perimeter_id}', {}, {patch: {method: 'PATCH'}});
+ categoryMap['subject'].assignmentResource = Vue.resource(host + '/policies{/policy_id}/subject_assignments{/perimeter_id}{/category_id}{/data_id}', {}, );
+ categoryMap['object'].assignmentResource = Vue.resource(host + '/policies{/policy_id}/object_assignments{/perimeter_id}{/category_id}{/data_id}', {}, );
+ categoryMap['action'].assignmentResource = Vue.resource(host + '/policies{/policy_id}/action_assignments{/perimeter_id}{/category_id}{/data_id}', {}, );
+ var queries = [
+ policyResource.query(),
+ ModelService.initialize(),
+ AttributeService.initialize()
+ ]
+
+ Promise.all(queries).then(function (result) {
+ createPolicies(result[0].body);
+ })
+}
+
+function createPolicies(policiesData) {
+ policies.splice(0, policies.length);
+ util.cleanObject(policiesMap);
+ createPolicyInternal(policiesData.policies);
+}
+
+function mapPolicy(policy) {
+ policy.rulesPopulated = false;
+ policy.rules = [];
+ policy.subjectData = [];
+ policy.objectData = [];
+ policy.actionData = [];
+ policy.unusedSubjectData = [];
+ policy.unusedObjectData = [];
+ policy.unusedActionData = [];
+ policy.attributes = [];
+ if (policy.model_id) {
+ policy.model = ModelService.getModel(policy.model_id);
+ policy.attributes = ModelService.getAttributesForModelId(policy.model_id);
+ }
+}
+
+function createPolicyInternal(data) {
+ return util.createInternal(data, policies, policiesMap, mapPolicy);
+}
+
+function removePolicyInternal(id) {
+ return util.removeInternal(id, policies, policiesMap);
+}
+
+function updatePolicyInternal(data) {
+ return util.updateInternal(data, policiesMap, mapPolicy);
+}
+
+function removeRuleInternal(policy, rule) {
+ policy.rules.splice(policy.rules.indexOf(rule), 1);
+ updateUnusedData(policy);
+}
+
+function loadPolicyRule(policy) {
+ if (!policy.rulesPopulated) {
+ policyRulesResource = Vue.resource(host + '/policies{/policy_id}/rules{/rule_id}', {}, {patch: {method: 'PATCH'}});
+ categoryMap['subject'].resource = Vue.resource(host + '/policies{/policy_id}/subject_data{/category_id}{/data_id}', {});
+ categoryMap['object'].resource = Vue.resource(host + '/policies{/policy_id}/object_data{/category_id}{/data_id}', {});
+ categoryMap['action'].resource = Vue.resource(host + '/policies{/policy_id}/action_data{/category_id}{/data_id}', {});
+ var queries = [
+ policyRulesResource.query({ policy_id: policy.id }),
+ categoryMap['subject'].resource.query({ policy_id: policy.id }),
+ categoryMap['object'].resource.query({ policy_id: policy.id }),
+ categoryMap['action'].resource.query({ policy_id: policy.id })
+ ]
+
+ Promise.all(queries).then(function (result) {
+ createRules(policy, result[0].body, result[1].body, result[2].body, result[3].body);
+ updateUnusedData(policy);
+ }, util.displayErrorFunction('Unable to load rules'))
+ }
+}
+
+function updateUnusedData(policy) {
+ policy.unusedSubjectData.splice(0, policy.unusedSubjectData.length);
+ util.pushAll(policy.unusedSubjectData, policy.subjectData);
+
+ policy.unusedObjectData.splice(0, policy.unusedObjectData.length);
+ util.pushAll(policy.unusedObjectData, policy.objectData);
+
+ policy.unusedActionData.splice(0, policy.unusedActionData.length);
+ util.pushAll(policy.unusedActionData, policy.actionData);
+
+ for (var i = 0; i < policy.rules.length; i++) {
+ var rule = policy.rules[i];
+ removeUsedData(rule.subjectData, policy.unusedSubjectData);
+ removeUsedData(rule.objectData, policy.unusedObjectData);
+ removeUsedData(rule.actionData, policy.unusedActionData);
+ }
+}
+
+function removeUsedData(list, orphanList) {
+ for (var j = 0; j < list.length; j++) {
+ var data = list[j];
+ if (data) {
+ var notOrphanIndex = util.indexOf(orphanList, "id", data.id);
+ if (notOrphanIndex >= 0) {
+ orphanList.splice(notOrphanIndex, 1);
+ }
+ }
+ }
+}
+
+function transformData(list) {
+ var result = {};
+ for (var index = 0; index < list.length; index++) {
+ var data = list[index].data;
+ for (var key in data) {
+ if (data.hasOwnProperty(key)) {
+ result[key] = data[key];
+ }
+ }
+ }
+ return result;
+}
+
+function createRules(policy, rulesData, subjectsData, objectsData, actionsData) {
+ policy.rules = rulesData ? rulesData.rules.rules : [];
+ policy.subjectDataMap = transformData(subjectsData.subject_data);
+ policy.subjectData = util.mapToArray(policy.subjectDataMap);
+ policy.objectDataMap = transformData(objectsData.object_data);
+ policy.objectData = util.mapToArray(policy.objectDataMap);
+ policy.actionDataMap = transformData(actionsData.action_data);
+ policy.actionData = util.mapToArray(policy.actionDataMap);
+ for (var i = 0; i < policy.rules.length; i++) {
+ var rule = policy.rules[i];
+ populateRule(policy, rule);
+ }
+ policy.rulesPopulated = true;
+}
+
+function populateRule(policy, rule) {
+ if (rule.meta_rule_id) {
+ rule.metaRule = ModelService.getMetaRule(rule.meta_rule_id);
+ }
+ if (rule.metaRule) {
+ var j = 0;
+ var k, id;
+ rule.subjectData = [];
+ rule.objectData = [];
+ rule.actionData = [];
+ rule.attributeData = [];
+
+ for (k = 0; k < rule.metaRule.subject_categories.length; k++) {
+ id = rule.rule[j + k];
+ if (policy.subjectDataMap[id])
+ rule.subjectData.push(policy.subjectDataMap[id]);
+ }
+ j += k;
+ for (k = 0; k < rule.metaRule.object_categories.length; k++) {
+ id = rule.rule[j + k];
+ if (policy.objectDataMap[id])
+ rule.objectData.push(policy.objectDataMap[id]);
+ }
+ j += k;
+ for (k = 0; k < rule.metaRule.action_categories.length; k++) {
+ id = rule.rule[j + k];
+ if (policy.actionDataMap[id]) {
+ rule.actionData.push(policy.actionDataMap[id]);
+ }
+ }
+
+ for (const value of rule.rule.values()){
+ if (value.includes("attributes:")){
+ let attrName = value.split(':')[1];
+ let attrId = AttributeService.getAttributeId(attrName);
+ rule.attributeData.push({id: attrId, name: attrName});
+
+ }
+ }
+ }
+ return rule;
+}
+
+function updateRule(policy, rule, decision){
+ return new Promise(resolveUpdateRule => {
+ var body = {
+ "instructions":[
+ {"decision": decision}
+ ]
+ };
+
+ policyRulesResource.patch({policy_id: policy.id, rule_id: rule.id}, body).then(success, util.displayErrorFunction('Unable to update Rule'));
+
+ function success(data){
+ resolveUpdateRule(data.body.rules[rule.id].instructions);
+ }
+ });
+}
+
+function filterRuleBySpecificItem(filteredRules, rule, items, filter){
+ items.forEach(item => {
+ if (item){
+ if (filter == null || item.name.indexOf(filter) >= 0){
+ if (!(filteredRules.includes(rule)))
+ filteredRules.push(rule)
+ }
+ }
+
+ });
+}
+
+function interArray(array1, array2){
+ let inter = [];
+
+
+ for (let i = 0; i < array1.length; i++){
+ for (let j = 0; j < array2.length; j++){
+ if (array1[i] === array2[j])
+ inter.push(array2[j]);
+ }
+ }
+ return inter;
+}
+
+
+function filterByRules(rules, filters){
+ let filteredRules = [];
+ let filteredByWords = [];
+
+
+ if (filters === ""){
+ filteredRules = rules;
+ } else {
+ filters = filters.split(' ');
+ filters.forEach( filter => {
+ if (filter !== "") {
+ let tmp = [];
+ rules.forEach((rule) => {
+
+ filterRuleBySpecificItem(tmp, rule, rule.subjectData, filter);
+ filterRuleBySpecificItem(tmp, rule, rule.objectData, filter);
+ filterRuleBySpecificItem(tmp, rule, rule.actionData, filter);
+ filterRuleBySpecificItem(tmp, rule, rule.attributeData, filter);
+
+ filteredByWords.push(tmp);
+ });
+
+ }
+ });
+
+ filteredRules = filteredByWords[0];
+ for (let i = 1; i < filteredByWords.length; i++){
+ filteredRules = interArray(filteredRules, filteredByWords[i]);
+ }
+ }
+
+ return filteredRules;
+}
+
+function policyRuleWithAttributes(policy){
+ const meta_rules = policy.model.meta_rules;
+
+ for (let i = 0; i < meta_rules.length; i++){
+ const meta_rule = meta_rules[i];
+ if (meta_rule.actionAttributes.length || meta_rule.subjectAttributes.length || meta_rule.objectAttributes.length)
+ return true;
+ }
+ return false;
+}
+
+export default {
+ policyRuleWithAttributes: policyRuleWithAttributes,
+ filterByRules: filterByRules,
+ initialize: loadPolicies,
+ createPolicies: createPolicies,
+ policies: policies,
+ getPolicy: function getPolicy(id) {
+ return policiesMap[id];
+ },
+ createPolicy: function createPolicy(policy) {
+ policyResource.save(null, policy).then(success, util.displayErrorFunction('Unable to create Policy'));
+
+ function success(data) {
+ createPolicyInternal(data.body.policies);
+ util.displaySuccess('Policy created');
+ }
+ },
+ removePolicy: function removePolicy(policy) {
+ policyResource.remove({ id: policy.id }, null).then(success, util.displayErrorFunction('Unable to remove Policy'));
+
+ function success() {
+ removePolicyInternal(policy.id);
+ util.displaySuccess('Policy removed');
+ }
+ },
+ updatePolicy: function updatePolicy(policy) {
+ policyResource.patch({ id: policy.id }, policy).then(success, util.displayErrorFunction('Unable to update Policy'));
+
+ function success(data) {
+ updatePolicyInternal(data.body.policies)
+ util.displaySuccess('Policy updated');
+ }
+ },
+ populatePolicy: loadPolicyRule,
+ createRules: createRules,
+ updateRule: updateRule,
+ addRuleToPolicy: function addRuleToPolicy(policy, rule) {
+ policyRulesResource.save({ policy_id: policy.id }, rule).then(success, util.displayErrorFunction('Unable to create Rule'));
+
+ function success(data) {
+ var rules = util.mapToArray(data.body.rules);
+ for (var i = 0; i < rules.length; i++) {
+ var rule = rules[i];
+ policy.rules.push(populateRule(policy, rule))
+ }
+ util.displaySuccess('Rule created');
+ updateUnusedData(policy);
+ }
+ },
+ removeRuleFromPolicy: function removeRuleFromPolicy(policy, rule) {
+ policyRulesResource.remove({ policy_id: policy.id, rule_id: rule.id }, null).then(success, util.displayErrorFunction('Unable to remove Rule'));
+
+ function success() {
+ removeRuleInternal(policy, rule);
+ util.displaySuccess('Rule removed');
+ }
+ },
+ createData: function createData(type, policy, categoryId, dataCategory) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.resource.save({ policy_id: policy.id, category_id: categoryId }, dataCategory).then(
+ function (data) {
+ var result = util.createInternal(data.body[categoryValue.responseName].data, policy[categoryValue.arrayName], policy[categoryValue.mapName]);
+ util.displaySuccess('Data created');
+ util.pushAll(policy[categoryValue.unusedArrayName], result);
+ return result;
+ },
+ util.displayErrorFunction('Unable to create Data')
+ );
+ },
+ removeData: function removeData(type, policy, data) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.resource.remove({ policy_id: policy.id, category_id: data.category_id, data_id: data.id }).then(
+ function () {
+ policy[categoryValue.arrayName].splice(policy.subjectData.indexOf(data), 1);
+ policy[categoryValue.unusedArrayName].splice(policy.unusedSubjectData.indexOf(data), 1);
+ delete policy[categoryValue.mapName][data.id];
+ util.displaySuccess('Data removed');
+ },
+ util.displayErrorFunction('Unable to remove Data')
+ );
+ },
+ createPerimeter: function createPerimeter(type, policy, perimeter) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.policyPerimeterResource.save({ policy_id: policy.id }, perimeter).then(
+ function (data) {
+ util.displaySuccess('Perimeter created');
+ return util.mapToArray(data.body[categoryValue.perimeterResponseName]);
+ },
+ util.displayErrorFunction('Unable to create Perimeter')
+ );
+ },
+ removePerimeterFromPolicy: function removePerimeterFromPolicy(type, policy, perimeter) {
+ var categoryValue = categoryMap[type];
+
+ return categoryValue.policyPerimeterResource.remove({ policy_id: policy.id, perimeter_id: perimeter.id }, null).then(
+ function () {
+ util.displaySuccess('Perimeter removed');
+ return perimeter;
+ },
+ util.displayErrorFunction('Unable to remove Perimeter')
+ )
+ },
+ addPerimeterToPolicy: function addPerimeterToPolicy(type, policy, perimeter) {
+ var categoryValue = categoryMap[type];
+ perimeter.policy_list.push(policy.id);
+ var perimeterClone = util.clone(perimeter);
+ delete perimeterClone.policy_list;
+ return categoryValue.policyPerimeterResource.save({ policy_id: policy.id }, perimeterClone).then(
+ function () {
+ util.displaySuccess('Perimeter added');
+ },
+ util.displayErrorFunction('Unable to add Perimeter')
+ )
+ },
+ loadPerimetersAndAssignments: function loadPerimetersAndAssignments(type, policy) {
+ var categoryValue = categoryMap[type];
+ var queries = [
+ categoryValue.perimeterResource.query(),
+ categoryValue.policyPerimeterResource.query({ policy_id: policy.id }),
+ categoryValue.assignmentResource.query({ policy_id: policy.id }),
+ ]
+
+ return Promise.all(queries).then(function (data) {
+ var result = {};
+ result.assignments = util.mapToArray(data[2].body[categoryValue.assignmentResponseName]);
+ result.perimetersMap = data[1].body[categoryValue.perimeterResponseName];
+ result.perimeters = util.mapToArray(result.perimetersMap);
+ result.allPerimeters = util.mapToArray(data[0].body[categoryValue.perimeterResponseName]);
+ return result;
+ }, util.displayErrorFunction('Unable to load Perimeters'))
+
+ },
+ createAssignment: function createAssignment(type, policy, perimeter, data) {
+ var categoryValue = categoryMap[type];
+ var assignment = {
+ "id": perimeter.id,
+ "category_id": data.category_id,
+ "data_id": data.id,
+ "policy_id": policy.id
+ }
+ return categoryValue.assignmentResource.save({ policy_id: policy.id }, assignment).then(
+ function (data) {
+ util.displaySuccess('Assignment created');
+ return util.mapToArray(data.body[categoryValue.assignmentResponseName]);
+ },
+ util.displayErrorFunction('Unable to create Assignment')
+ )
+ },
+ removeAssignment: function removeAssignment(type, policy, perimeter, data) {
+ var categoryValue = categoryMap[type];
+
+ return categoryValue.assignmentResource.remove({ policy_id: policy.id, perimeter_id: perimeter.id, category_id: data.category_id, data_id: data.id }, null).then(
+ function () {
+ util.displaySuccess('Assignment removed');
+ },
+ util.displayErrorFunction('Unable to remove Assignment')
+ )
+ },
+}
+
diff --git a/dashboard/src/services/Util.service.js b/dashboard/src/services/Util.service.js
new file mode 100644
index 00000000..a6b53d6f
--- /dev/null
+++ b/dashboard/src/services/Util.service.js
@@ -0,0 +1,153 @@
+import Vue from 'vue'
+
+export default {
+ sortByName(items) {
+ return items
+ .sort((item1, item2) => {
+ return item1.name.localeCompare(item2.name);
+ });
+ },
+ filterAndSortByName(items, filter) {
+ return items
+ .filter(item => {
+ return filter == null || item.name.indexOf(filter) >= 0;
+ })
+ .sort((item1, item2) => {
+ return item1.name.localeCompare(item2.name);
+ });
+ },
+ clone: function clone(src) {
+ return JSON.parse(JSON.stringify(src));
+ },
+
+ mapToArray: function mapToArray(map, action) {
+ var result = []
+ for (var key in map) {
+ if (map.hasOwnProperty(key)) {
+ var item = map[key];
+ item.id = key;
+ if (action != null) {
+ action(item);
+ }
+ result.push(item);
+ }
+ }
+ return result;
+ },
+
+
+ mapIdToItem: function mapIdToItem(array, map) {
+ if (array) {
+ for (var index = 0; index < array.length; index++) {
+ var id = array[index];
+ if (map[id])
+ array[index] = map[id];
+ }
+ }
+ },
+
+ mapItemToId: function mapItemToId(array) {
+ if (array) {
+ for (var index = 0; index < array.length; index++) {
+ var item = array[index];
+ array[index] = item.id;
+ }
+ }
+ },
+
+ addToMap: function addToMap(array, map) {
+ if (array) {
+ for (var index = 0; index < array.length; index++) {
+ var item = array[index];
+ map[item.id] = item;
+ }
+ }
+ },
+
+ updateObject: function updateObject(object, newObject) {
+ for (var key in newObject) {
+ if (newObject.hasOwnProperty(key)) {
+ object[key] = newObject[key];
+ }
+ }
+ },
+
+ cleanObject: function cleanObject(object) {
+ for (var key in object) {
+ if (object.hasOwnProperty(key)) {
+ delete object[key];
+ }
+ }
+ },
+
+ pushAll: function pushAll(array, arrayToPush) {
+ for (var i = 0; i < arrayToPush.length; i += 1) {
+ array.push(arrayToPush[i]);
+ }
+ },
+
+ indexOf: function indexOf(array, property, value) {
+ for (var i = 0; i < array.length; i += 1) {
+ if (array[i][property] === value) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ createInternal: function createInternal(data, array, map, action) {
+ var added = this.mapToArray(data, action)
+ this.addToMap(added, map);
+ this.pushAll(array, added);
+
+ return added;
+ },
+
+ updateInternal: function updateInternal(data, map, action) {
+ var updated = this.mapToArray(data, action)
+ var result = []
+ for (var index = 0; index < updated.length; index++) {
+ var item = updated[index];
+ this.updateObject(map[item.id], item)
+ result.push(map[item.id])
+ }
+ return result;
+ },
+
+ removeInternal: function removeInternal(id, array, map) {
+ var old = map[id];
+ delete map[old.id];
+ array.splice(array.indexOf(old), 1);
+ return old;
+ },
+
+ arrayToTitleMap: function arrayToTitleMap(array) {
+ return array.map(function (item) {
+ return { value: item.id, name: item.name }
+ }).sort(function (itemA, itemB) {
+ return itemA.name.localeCompare(itemB.name);
+ })
+ },
+
+ displayErrorFunction: function displayErrorFunction(message) {
+ return function (response) {
+ var text = message;
+ if (response && response.data && response.data.message) {
+ text += ' (' + response.data.message + ')'
+ }
+ console.log(text);
+ Vue.toasted.global.toast({message: text, type: 'danger', title: 'Error'});
+ }
+ },
+
+ displaySuccess: function displaySuccess(message) {
+ Vue.toasted.global.toast({message: message, type: 'success', title: 'Success'});
+ },
+
+ displayError: function displayError(message) {
+ Vue.toasted.global.toast({message: message, type: 'danger', title: 'Error'});
+ },
+
+
+
+} \ No newline at end of file
diff --git a/dashboard/src/views/Admin.vue b/dashboard/src/views/Admin.vue
new file mode 100644
index 00000000..414e68a0
--- /dev/null
+++ b/dashboard/src/views/Admin.vue
@@ -0,0 +1,52 @@
+<template>
+ <div>
+ <div v-if="isLoading" >
+ <div class="d-flex justify-content-center">
+ <div class="spinner-border" role="status">
+ <span class="sr-only">Loading...</span>
+ </div>
+ </div>
+ </div>
+ <div v-else class="row justify-content-center">
+ <label for="file" class="label-file btn btn-primary">
+ <span class="fa fa-upload"></span>
+ Import
+ </label>
+ <input
+ id="file"
+ class="input-file"
+ type="file"
+ @change="readFile"
+ accept="application/json, .json"
+ />
+
+
+ </div>
+ </div>
+</template>
+
+<script>
+import ImportService from "./../services/Import.service.js";
+
+export default {
+ data(){
+ return {
+ isLoading: false
+ }
+ },
+ methods: {
+ readFile(event) {
+ var reader = new FileReader();
+ reader.onload = async function() {
+ this.isLoading = true;
+ var fileContents = reader.result;
+ await ImportService.importData(JSON.parse(fileContents));
+ this.isLoading = false;
+ }.bind(this);
+ reader.readAsText(event.target.files[0]);
+ },
+ }
+};
+</script>
+
+
diff --git a/dashboard/src/views/Assignments.vue b/dashboard/src/views/Assignments.vue
new file mode 100644
index 00000000..d0e500e3
--- /dev/null
+++ b/dashboard/src/views/Assignments.vue
@@ -0,0 +1,54 @@
+<template>
+ <div>
+ <form-header
+ placeholder="Filter by Policy"
+ needButton
+ buttonText="Create Policy"
+ @click="creatingPolicy = true"
+ v-model="filter"
+ ></form-header>
+ <br/>
+
+ <CreatePolicy v-if="creatingPolicy" @close="creatingPolicy = false"></CreatePolicy>
+ <div class="list-group row" v-else>
+ <policy v-for="policy in filteredPolicies" :key="policy.id" :policy="policy"></policy>
+ </div>
+ </div>
+</template>
+
+<script>
+ import PolicyService from './../services/Policy.service.js'
+ //import util from './../services/Util.service.js'
+ import FormHeader from "./../components/FormHeader.vue"
+ import Policy from "./../components/assignment/Policy.vue"
+ import CreatePolicy from "./../components/policy/CreatePolicy.vue"
+ import util from "../services/Util.service";
+
+ export default {
+ data() {
+ return {
+ filter: "",
+ creatingPolicy: false,
+ policies: []
+ };
+ },
+ mounted() {
+ PolicyService.initialize();
+ this.policies = PolicyService.policies;
+ },
+ components: {
+ FormHeader,
+ Policy,
+ CreatePolicy,
+ },
+ computed: {
+ filteredPolicies() {
+ return util.filterAndSortByName(this.policies, this.filter);
+ }
+ }
+ }
+</script>
+
+<style scoped>
+
+</style> \ No newline at end of file
diff --git a/dashboard/src/views/Auth.vue b/dashboard/src/views/Auth.vue
new file mode 100644
index 00000000..c057e284
--- /dev/null
+++ b/dashboard/src/views/Auth.vue
@@ -0,0 +1,65 @@
+<template>
+ <div class="row justify-content-center">
+ <form>
+ <div class="form-group">
+ <label for="login">Login</label>
+ <input
+ type="text"
+ name="login"
+ v-model="name"
+ v-validate.initial="'required'"
+ class="form-control"
+ id="login"
+ />
+ </div>
+ <div class="form-group">
+ <label for="password">Password</label>
+ <input
+ type="password"
+ name="password"
+ v-model="password"
+ v-validate.initial="'required'"
+ class="form-control"
+ id="password"
+ />
+ </div>
+ <button type="button" class="btn btn-primary btn-xlg col-auto" @click="login()">Login</button>
+ </form>
+
+ </div>
+</template>
+
+<script>
+import Vue from "vue";
+import util from "./../services/Util.service.js";
+import config from '../config.js'
+
+var host = config.host;
+
+export default {
+ name: "auth",
+ data() {
+ return {
+ name: "",
+ password: ""
+ };
+ },
+ methods: {
+ login() {
+ Vue.http.headers.common["Authorization"] =
+ "Basic " + btoa(this.name + ":" + this.password);
+ Vue.http.get(host + "/auth").then(
+ response => {
+ Vue.http.headers.common["Authorization"] = "Basic ";
+ Vue.http.headers.common["x-api-key"] = response.data;
+ localStorage.setItem("auth-key", response.data);
+ this.$router.push("models");
+ },
+ response => {
+ util.displayError("Unable to log in " + response);
+ }
+ );
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/views/Error.vue b/dashboard/src/views/Error.vue
new file mode 100644
index 00000000..528fb8aa
--- /dev/null
+++ b/dashboard/src/views/Error.vue
@@ -0,0 +1,8 @@
+<template>
+ <div class="row justify-content-center">
+ /!\ Error please configure CORS on server
+ </div>
+</template>
+
+
+
diff --git a/dashboard/src/views/Models.vue b/dashboard/src/views/Models.vue
new file mode 100644
index 00000000..bdd46483
--- /dev/null
+++ b/dashboard/src/views/Models.vue
@@ -0,0 +1,80 @@
+<template>
+ <div>
+ <orphans
+ @close="allowAlert = false"
+ v-if="showAlert"
+ :orphanMetaRules="orphanMetaRules"
+ :orphanSubjectCategories="orphanSubjectCategories"
+ :orphanObjectCategories="orphanObjectCategories"
+ :orphanActionCategories="orphanActionCategories"
+ ></orphans>
+
+ <br />
+ <form-header
+ placeholder="Filter"
+ buttonText="Create Model"
+ @click="creatingModel = true"
+ v-model="filter"
+ need-button
+ ></form-header>
+ <br />
+
+ <CreateModel v-if="creatingModel" @close="creatingModel = false"></CreateModel>
+ <div class="list-group row" v-else>
+ <Model v-for="model in filteredModels" :key="model.id" :model="model"></Model>
+ </div>
+ </div>
+</template>
+
+<script>
+import Model from "./../components/model/Model.vue";
+import CreateModel from "./../components/model/CreateModel.vue";
+import ModelService from "./../services/Model.service.js";
+import util from "./../services/Util.service.js";
+import Orphans from "./../components/model/Orphans.vue";
+import FormHeader from "./../components/FormHeader.vue";
+
+export default {
+ name: "models",
+ components: {
+ Model,
+ CreateModel,
+ FormHeader,
+ Orphans
+ },
+ mounted() {
+ ModelService.initialize();
+ this.models = ModelService.models;
+ this.orphanMetaRules = ModelService.orphanMetaRules;
+ this.orphanSubjectCategories = ModelService.orphanSubjectCategories;
+ this.orphanObjectCategories = ModelService.orphanObjectCategories;
+ this.orphanActionCategories = ModelService.orphanActionCategories;
+ },
+ data() {
+ return {
+ filter: "",
+ creatingModel: false,
+ allowAlert: true,
+ orphanMetaRules: [],
+ orphanSubjectCategories: [],
+ orphanActionCategories: [],
+ orphanObjectCategories: [],
+ models: []
+ };
+ },
+ computed: {
+ showAlert() {
+ return (
+ this.allowAlert &&
+ (this.orphanMetaRules.length ||
+ this.orphanSubjectCategories.length ||
+ this.orphanActionCategories.length ||
+ this.orphanObjectCategories.length)
+ );
+ },
+ filteredModels() {
+ return util.filterAndSortByName(this.models, this.filter);
+ }
+ }
+};
+</script>
diff --git a/dashboard/src/views/Pdps.vue b/dashboard/src/views/Pdps.vue
new file mode 100644
index 00000000..778f23fe
--- /dev/null
+++ b/dashboard/src/views/Pdps.vue
@@ -0,0 +1,53 @@
+<template>
+ <div>
+ <form-header
+ placeholder="Filter"
+ buttonText="Create PDP"
+ @click="creatingPdp = true"
+ v-model="filter"
+ need-button
+ ></form-header>
+ <br />
+
+ <CreatePdp v-if="creatingPdp" @close="creatingPdp = false"></CreatePdp>
+ <div class="list-group row" v-else>
+ <pdp v-for="pdp in filteredPdps" :key="pdp.id" :pdp="pdp"></pdp>
+ </div>
+ </div>
+</template>
+
+<script>
+import PdpService from "./../services/Pdp.service.js";
+import util from "./../services/Util.service.js";
+import Pdp from "./../components/pdp/Pdp.vue";
+import CreatePdp from "./../components/pdp/CreatePdp.vue";
+import FormHeader from "./../components/FormHeader.vue";
+import PolicyService from "../services/Policy.service";
+
+export default {
+ data() {
+ return {
+ filter: "",
+ creatingPdp: false,
+ pdps: []
+ };
+ },
+ mounted() {
+ PdpService.initialize();
+ PolicyService.initialize();
+ this.pdps = PdpService.pdps;
+ },
+ components: {
+ Pdp,
+ CreatePdp,
+ FormHeader
+ },
+ computed: {
+ filteredPdps() {
+ return util.filterAndSortByName(this.pdps, this.filter);
+ }
+ }
+};
+</script>
+
+
diff --git a/dashboard/src/views/Rules.vue b/dashboard/src/views/Rules.vue
new file mode 100644
index 00000000..042b00c0
--- /dev/null
+++ b/dashboard/src/views/Rules.vue
@@ -0,0 +1,50 @@
+<template>
+ <div>
+ <form-header
+ placeholder="Filter by Policy"
+ needButton
+ buttonText="Create Policy"
+ @click="creatingPolicy = true"
+ v-model="filter"
+ ></form-header>
+ <br/>
+
+ <CreatePolicy v-if="creatingPolicy" @close="creatingPolicy = false"></CreatePolicy>
+ <div class="list-group row" v-else>
+ <policy v-for="policy in filteredPolicies" :key="policy.id" :policy="policy"></policy>
+ </div>
+ </div>
+</template>
+
+<script>
+import PolicyService from './../services/Policy.service.js'
+//import util from './../services/Util.service.js'
+import FormHeader from "./../components/FormHeader.vue"
+import Policy from "./../components/policy/Policy.vue"
+import CreatePolicy from "./../components/policy/CreatePolicy.vue"
+import util from "../services/Util.service";
+
+export default {
+ data() {
+ return {
+ filter: "",
+ creatingPolicy: false,
+ policies: []
+ };
+ },
+ mounted() {
+ PolicyService.initialize();
+ this.policies = PolicyService.policies;
+ },
+ components: {
+ FormHeader,
+ Policy,
+ CreatePolicy,
+ },
+ computed: {
+ filteredPolicies() {
+ return util.filterAndSortByName(this.policies, this.filter);
+ }
+ }
+}
+</script>
diff --git a/dashboard/vue.config.js b/dashboard/vue.config.js
new file mode 100644
index 00000000..f4726d16
--- /dev/null
+++ b/dashboard/vue.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ configureWebpack: {
+ devtool: 'source-map'
+ }
+} \ No newline at end of file
diff --git a/dashboard/yarn.lock b/dashboard/yarn.lock
new file mode 100644
index 00000000..685bcf0b
--- /dev/null
+++ b/dashboard/yarn.lock
@@ -0,0 +1,8200 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
+ integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==
+ dependencies:
+ "@babel/highlight" "^7.0.0"
+
+"@babel/core@^7.0.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f"
+ integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/generator" "^7.4.0"
+ "@babel/helpers" "^7.4.3"
+ "@babel/parser" "^7.4.3"
+ "@babel/template" "^7.4.0"
+ "@babel/traverse" "^7.4.3"
+ "@babel/types" "^7.4.0"
+ convert-source-map "^1.1.0"
+ debug "^4.1.0"
+ json5 "^2.1.0"
+ lodash "^4.17.11"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196"
+ integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==
+ dependencies:
+ "@babel/types" "^7.4.0"
+ jsesc "^2.5.1"
+ lodash "^4.17.11"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/helper-annotate-as-pure@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
+ integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f"
+ integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-call-delegate@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f"
+ integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.4.0"
+ "@babel/traverse" "^7.4.0"
+ "@babel/types" "^7.4.0"
+
+"@babel/helper-create-class-features-plugin@^7.4.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz#5bbd279c6c3ac6a60266b89bbfe7f8021080a1ef"
+ integrity sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-member-expression-to-functions" "^7.0.0"
+ "@babel/helper-optimise-call-expression" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-replace-supers" "^7.4.0"
+ "@babel/helper-split-export-declaration" "^7.4.0"
+
+"@babel/helper-define-map@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9"
+ integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/types" "^7.4.0"
+ lodash "^4.17.11"
+
+"@babel/helper-explode-assignable-expression@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6"
+ integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==
+ dependencies:
+ "@babel/traverse" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-function-name@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
+ integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.0.0"
+ "@babel/template" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-get-function-arity@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
+ integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-hoist-variables@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6"
+ integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw==
+ dependencies:
+ "@babel/types" "^7.4.0"
+
+"@babel/helper-member-expression-to-functions@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f"
+ integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-module-imports@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d"
+ integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.3":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064"
+ integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-simple-access" "^7.1.0"
+ "@babel/helper-split-export-declaration" "^7.0.0"
+ "@babel/template" "^7.2.2"
+ "@babel/types" "^7.2.2"
+ lodash "^4.17.11"
+
+"@babel/helper-optimise-call-expression@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5"
+ integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-plugin-utils@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
+ integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==
+
+"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.3":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147"
+ integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA==
+ dependencies:
+ lodash "^4.17.11"
+
+"@babel/helper-remap-async-to-generator@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f"
+ integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-wrap-function" "^7.1.0"
+ "@babel/template" "^7.1.0"
+ "@babel/traverse" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c"
+ integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.0.0"
+ "@babel/helper-optimise-call-expression" "^7.0.0"
+ "@babel/traverse" "^7.4.0"
+ "@babel/types" "^7.4.0"
+
+"@babel/helper-simple-access@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
+ integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==
+ dependencies:
+ "@babel/template" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55"
+ integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==
+ dependencies:
+ "@babel/types" "^7.4.0"
+
+"@babel/helper-wrap-function@^7.1.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa"
+ integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/template" "^7.1.0"
+ "@babel/traverse" "^7.1.0"
+ "@babel/types" "^7.2.0"
+
+"@babel/helpers@^7.4.3":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b"
+ integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q==
+ dependencies:
+ "@babel/template" "^7.4.0"
+ "@babel/traverse" "^7.4.3"
+ "@babel/types" "^7.4.0"
+
+"@babel/highlight@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
+ integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.0.0", "@babel/parser@^7.4.0", "@babel/parser@^7.4.3":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b"
+ integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==
+
+"@babel/plugin-proposal-async-generator-functions@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
+ integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-remap-async-to-generator" "^7.1.0"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+
+"@babel/plugin-proposal-class-properties@^7.0.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8"
+ integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.4.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-proposal-decorators@^7.1.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9"
+ integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.4.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-decorators" "^7.2.0"
+
+"@babel/plugin-proposal-json-strings@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
+ integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-json-strings" "^7.2.0"
+
+"@babel/plugin-proposal-object-rest-spread@^7.3.4":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4"
+ integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5"
+ integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.2.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623"
+ integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.0.0"
+ regexpu-core "^4.5.4"
+
+"@babel/plugin-syntax-async-generators@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f"
+ integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-decorators@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b"
+ integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-dynamic-import@^7.0.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
+ integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-json-strings@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470"
+ integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7"
+ integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-object-rest-spread@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e"
+ integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c"
+ integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-arrow-functions@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
+ integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-async-to-generator@^7.3.4":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0"
+ integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-remap-async-to-generator" "^7.1.0"
+
+"@babel/plugin-transform-block-scoped-functions@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190"
+ integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-block-scoping@^7.3.4":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb"
+ integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ lodash "^4.17.11"
+
+"@babel/plugin-transform-classes@^7.3.4":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz#adc7a1137ab4287a555d429cc56ecde8f40c062c"
+ integrity sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-define-map" "^7.4.0"
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-optimise-call-expression" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-replace-supers" "^7.4.0"
+ "@babel/helper-split-export-declaration" "^7.4.0"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da"
+ integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-destructuring@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz#1a95f5ca2bf2f91ef0648d5de38a8d472da4350f"
+ integrity sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-dotall-regex@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf"
+ integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.4.3"
+ regexpu-core "^4.5.4"
+
+"@babel/plugin-transform-duplicate-keys@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3"
+ integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-exponentiation-operator@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008"
+ integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-for-of@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz#c36ff40d893f2b8352202a2558824f70cd75e9fe"
+ integrity sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-function-name@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz#130c27ec7fb4f0cba30e958989449e5ec8d22bbd"
+ integrity sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-literals@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1"
+ integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-modules-amd@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6"
+ integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-modules-commonjs@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165"
+ integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.4.3"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-simple-access" "^7.1.0"
+
+"@babel/plugin-transform-modules-systemjs@^7.3.4":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1"
+ integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.4.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-modules-umd@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae"
+ integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e"
+ integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ==
+ dependencies:
+ regexp-tree "^0.1.0"
+
+"@babel/plugin-transform-new-target@^7.0.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150"
+ integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-object-super@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598"
+ integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-replace-supers" "^7.1.0"
+
+"@babel/plugin-transform-parameters@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz#e5ff62929fdf4cf93e58badb5e2430303003800d"
+ integrity sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA==
+ dependencies:
+ "@babel/helper-call-delegate" "^7.4.0"
+ "@babel/helper-get-function-arity" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-regenerator@^7.3.4":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz#2a697af96887e2bbf5d303ab0221d139de5e739c"
+ integrity sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A==
+ dependencies:
+ regenerator-transform "^0.13.4"
+
+"@babel/plugin-transform-runtime@^7.4.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz#4d6691690ecdc9f5cb8c3ab170a1576c1f556371"
+ integrity sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ resolve "^1.8.1"
+ semver "^5.5.1"
+
+"@babel/plugin-transform-shorthand-properties@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0"
+ integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-spread@^7.2.0":
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406"
+ integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-sticky-regex@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1"
+ integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.0.0"
+
+"@babel/plugin-transform-template-literals@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b"
+ integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-typeof-symbol@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2"
+ integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-unicode-regex@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz#3868703fc0e8f443dda65654b298df576f7b863b"
+ integrity sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.4.3"
+ regexpu-core "^4.5.4"
+
+"@babel/preset-env@^7.0.0 < 7.4.0":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1"
+ integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
+ "@babel/plugin-proposal-json-strings" "^7.2.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.3.4"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.2.0"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+ "@babel/plugin-syntax-json-strings" "^7.2.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-transform-arrow-functions" "^7.2.0"
+ "@babel/plugin-transform-async-to-generator" "^7.3.4"
+ "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
+ "@babel/plugin-transform-block-scoping" "^7.3.4"
+ "@babel/plugin-transform-classes" "^7.3.4"
+ "@babel/plugin-transform-computed-properties" "^7.2.0"
+ "@babel/plugin-transform-destructuring" "^7.2.0"
+ "@babel/plugin-transform-dotall-regex" "^7.2.0"
+ "@babel/plugin-transform-duplicate-keys" "^7.2.0"
+ "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
+ "@babel/plugin-transform-for-of" "^7.2.0"
+ "@babel/plugin-transform-function-name" "^7.2.0"
+ "@babel/plugin-transform-literals" "^7.2.0"
+ "@babel/plugin-transform-modules-amd" "^7.2.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.2.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.3.4"
+ "@babel/plugin-transform-modules-umd" "^7.2.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0"
+ "@babel/plugin-transform-new-target" "^7.0.0"
+ "@babel/plugin-transform-object-super" "^7.2.0"
+ "@babel/plugin-transform-parameters" "^7.2.0"
+ "@babel/plugin-transform-regenerator" "^7.3.4"
+ "@babel/plugin-transform-shorthand-properties" "^7.2.0"
+ "@babel/plugin-transform-spread" "^7.2.0"
+ "@babel/plugin-transform-sticky-regex" "^7.2.0"
+ "@babel/plugin-transform-template-literals" "^7.2.0"
+ "@babel/plugin-transform-typeof-symbol" "^7.2.0"
+ "@babel/plugin-transform-unicode-regex" "^7.2.0"
+ browserslist "^4.3.4"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.3.0"
+
+"@babel/runtime-corejs2@^7.2.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.3.tgz#40271fc260e570fb356da984e42e5990bd275860"
+ integrity sha512-anTLTF7IK8Hd5f73zpPzt875I27UaaTWARJlfMGgnmQhvEe1uNHQRKBUbXL0Gc0VEYiVzsHsTPso5XdK8NGvFg==
+ dependencies:
+ core-js "^2.6.5"
+ regenerator-runtime "^0.13.2"
+
+"@babel/runtime@^7.0.0":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc"
+ integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==
+ dependencies:
+ regenerator-runtime "^0.13.2"
+
+"@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b"
+ integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.4.0"
+ "@babel/types" "^7.4.0"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84"
+ integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/generator" "^7.4.0"
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-split-export-declaration" "^7.4.0"
+ "@babel/parser" "^7.4.3"
+ "@babel/types" "^7.4.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.11"
+
+"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c"
+ integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.11"
+ to-fast-properties "^2.0.0"
+
+"@intervolga/optimize-cssnano-plugin@^1.0.5":
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8"
+ integrity sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==
+ dependencies:
+ cssnano "^4.0.0"
+ cssnano-preset-default "^4.0.0"
+ postcss "^7.0.0"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.1.2":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
+"@sindresorhus/is@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
+
+"@soda/friendly-errors-webpack-plugin@^1.7.1":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz#706f64bcb4a8b9642b48ae3ace444c70334d615d"
+ integrity sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ==
+ dependencies:
+ chalk "^1.1.3"
+ error-stack-parser "^2.0.0"
+ string-width "^2.0.0"
+
+"@types/events@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
+ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
+
+"@types/glob@^7.1.1":
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
+ integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
+ dependencies:
+ "@types/events" "*"
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/minimatch@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
+"@types/node@*":
+ version "11.13.7"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.7.tgz#85dbb71c510442d00c0631f99dae957ce44fd104"
+ integrity sha512-suFHr6hcA9mp8vFrZTgrmqW2ZU3mbWsryQtQlY/QvwTISCw7nw/j+bCQPPohqmskhmqa5wLNuMHTTsc+xf1MQg==
+
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
+"@types/q@^1.5.1":
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
+ integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
+
+"@vue/babel-helper-vue-jsx-merge-props@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0-beta.3.tgz#e4c2e7125b3e0d2a9d493e457850b2abb0fd3cad"
+ integrity sha512-cbFQnd3dDPsfWuxbWW2phynX2zsckwC4GfAkcE1QH1lZL2ZAD2V97xY3BmvTowMkjeFObRKQt1P3KKA6AoB0hQ==
+
+"@vue/babel-plugin-transform-vue-jsx@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0-beta.3.tgz#a1a44e801d8ed615e49f145ef1b3eaca2c16e2e6"
+ integrity sha512-yn+j2B/2aEagaxXrMSK3qcAJnlidfXg9v+qmytqrjUXc4zfi8QVC/b4zCev1FDmTip06/cs/csENA4law6Xhpg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/plugin-syntax-jsx" "^7.2.0"
+ "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0-beta.3"
+ html-tags "^2.0.0"
+ lodash.kebabcase "^4.1.1"
+ svg-tags "^1.0.0"
+
+"@vue/babel-preset-app@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-3.6.0.tgz#39e12d4f81aed10696692fc7ef7d71d9328cd236"
+ integrity sha512-92CnysJemgQf+7VX/msCrHu7mNF9pgC0iwtIWPUI6jP2yUK6PUxsCbiPBmjHTcKrWtoLRri6kMBM9GU19tWRoQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/plugin-proposal-class-properties" "^7.0.0"
+ "@babel/plugin-proposal-decorators" "^7.1.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.0.0"
+ "@babel/plugin-syntax-jsx" "^7.0.0"
+ "@babel/plugin-transform-runtime" "^7.4.0"
+ "@babel/preset-env" "^7.0.0 < 7.4.0"
+ "@babel/runtime" "^7.0.0"
+ "@babel/runtime-corejs2" "^7.2.0"
+ "@vue/babel-preset-jsx" "^1.0.0-beta.3"
+ babel-plugin-dynamic-import-node "^2.2.0"
+ core-js "^2.6.5"
+
+"@vue/babel-preset-jsx@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0-beta.3.tgz#15c584bd62c0286a80f0196749ae38cde5cd703b"
+ integrity sha512-qMKGRorTI/0nE83nLEM7MyQiBZUqc62sZyjkBdVaaU7S61MHI8RKHPtbLMMZlWXb2NCJ0fQci8xJWUK5JE+TFA==
+ dependencies:
+ "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0-beta.3"
+ "@vue/babel-plugin-transform-vue-jsx" "^1.0.0-beta.3"
+ "@vue/babel-sugar-functional-vue" "^1.0.0-beta.3"
+ "@vue/babel-sugar-inject-h" "^1.0.0-beta.3"
+ "@vue/babel-sugar-v-model" "^1.0.0-beta.3"
+ "@vue/babel-sugar-v-on" "^1.0.0-beta.3"
+
+"@vue/babel-sugar-functional-vue@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0-beta.3.tgz#41a855786971dacbbe8044858eefe98de089bf12"
+ integrity sha512-CBIa0sQWn3vfBS2asfTgv0WwdyKvNTKtE/cCfulZ7MiewLBh0RlvvSmdK9BIMTiHErdeZNSGUGlU6JuSHLyYkQ==
+ dependencies:
+ "@babel/plugin-syntax-jsx" "^7.2.0"
+
+"@vue/babel-sugar-inject-h@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0-beta.3.tgz#be1d00b74a1a89fed35a9b1415a738c36f125966"
+ integrity sha512-HKMBMmFfdK9GBp3rX2bHIwILBdgc5F3ahmCB72keJxzaAQrgDAnD+ho70exUge+inAGlNF34WsQcGPElTf9QZg==
+ dependencies:
+ "@babel/plugin-syntax-jsx" "^7.2.0"
+
+"@vue/babel-sugar-v-model@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.0.0-beta.3.tgz#ea935b0e08bf58c125a1349b819156059590993c"
+ integrity sha512-et39eTEh7zW4wfZoSl9Jf0/n2r9OTT8U02LtSbXsjgYcqaDQFusN0+n7tw4bnOqvnnSVjEp7bVsQCWwykC3Wgg==
+ dependencies:
+ "@babel/plugin-syntax-jsx" "^7.2.0"
+ "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0-beta.3"
+ "@vue/babel-plugin-transform-vue-jsx" "^1.0.0-beta.3"
+ camelcase "^5.0.0"
+ html-tags "^2.0.0"
+ svg-tags "^1.0.0"
+
+"@vue/babel-sugar-v-on@^1.0.0-beta.3":
+ version "1.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0-beta.3.tgz#2f5fedb43883f603fe76010f253b85c7465855fe"
+ integrity sha512-F+GapxCiy50jf2Q2B4exw+KYBzlGdeKMAMW1Dbvb0Oa59SA0CH6tsUOIAsXb0A05jwwg/of0LaVeo+4aLefVxQ==
+ dependencies:
+ "@babel/plugin-syntax-jsx" "^7.2.0"
+ "@vue/babel-plugin-transform-vue-jsx" "^1.0.0-beta.3"
+ camelcase "^5.0.0"
+
+"@vue/cli-overlay@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.6.0.tgz#56421093f5ff90b2e4015b4bdc71180250e9211e"
+ integrity sha512-U9zcnnISJCA+dp7lLr1gTYfVqGfQ+y0jJ8LCZsZPxHpHr1QQDfMv9zqGOXQlv2+UVshvLi8ZWvD5AZSfHZ5h7w==
+
+"@vue/cli-plugin-babel@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-3.6.0.tgz#7863fca0151a60a7c9af9517b0537cc9a1420e64"
+ integrity sha512-LObyK/+B2ElmhNQuWffuOpSRGFk9WxOxnFn4g4zpE65ZRCuWJxXN3E3w8wx239my4oPe0wbnWbXmm8GPxNJ+cg==
+ dependencies:
+ "@babel/core" "^7.0.0"
+ "@vue/babel-preset-app" "^3.6.0"
+ "@vue/cli-shared-utils" "^3.6.0"
+ babel-loader "^8.0.5"
+ webpack ">=4 < 4.29"
+
+"@vue/cli-plugin-eslint@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.6.0.tgz#83bd27a3cc8166c49acd4adc15d91c1dc13c9c1e"
+ integrity sha512-jY/Lvkzv+tBdBFj6DmzZaUw4cFGom5kyxpTUPzM2swsWQITApg+0GmFq/VnH7lVY81fuOBmiFgL1YI+4WX6wKQ==
+ dependencies:
+ "@vue/cli-shared-utils" "^3.6.0"
+ babel-eslint "^10.0.1"
+ eslint-loader "^2.1.2"
+ globby "^9.2.0"
+ webpack ">=4 < 4.29"
+ optionalDependencies:
+ eslint "^4.19.1"
+ eslint-plugin-vue "^4.7.1"
+
+"@vue/cli-service@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.6.0.tgz#3b76d4229a9bea9020ea0a4d0cda03402ed334eb"
+ integrity sha512-MJeSjIf/IposSjJ93kRs5R8pfxqO7j2eXcIes2bwt3J9Ql8aoO5XAUi7IZphaxZHANIIbYJno+OUVtf90yMaqg==
+ dependencies:
+ "@intervolga/optimize-cssnano-plugin" "^1.0.5"
+ "@soda/friendly-errors-webpack-plugin" "^1.7.1"
+ "@vue/cli-overlay" "^3.6.0"
+ "@vue/cli-shared-utils" "^3.6.0"
+ "@vue/component-compiler-utils" "^2.6.0"
+ "@vue/preload-webpack-plugin" "^1.1.0"
+ "@vue/web-component-wrapper" "^1.2.0"
+ acorn "^6.1.1"
+ acorn-walk "^6.1.1"
+ address "^1.0.3"
+ autoprefixer "^9.5.1"
+ browserslist "^4.5.4"
+ cache-loader "^2.0.1"
+ case-sensitive-paths-webpack-plugin "^2.2.0"
+ chalk "^2.4.2"
+ clipboardy "^2.0.0"
+ cliui "^5.0.0"
+ copy-webpack-plugin "^4.6.0"
+ css-loader "^1.0.1"
+ cssnano "^4.1.10"
+ current-script-polyfill "^1.0.0"
+ debug "^4.1.1"
+ dotenv "^7.0.0"
+ dotenv-expand "^5.1.0"
+ escape-string-regexp "^1.0.5"
+ file-loader "^3.0.1"
+ fs-extra "^7.0.1"
+ globby "^9.2.0"
+ hash-sum "^1.0.2"
+ html-webpack-plugin "^3.2.0"
+ launch-editor-middleware "^2.2.1"
+ lodash.defaultsdeep "^4.6.0"
+ lodash.mapvalues "^4.6.0"
+ lodash.transform "^4.6.0"
+ mini-css-extract-plugin "^0.6.0"
+ minimist "^1.2.0"
+ ora "^3.4.0"
+ portfinder "^1.0.20"
+ postcss-loader "^3.0.0"
+ read-pkg "^5.0.0"
+ semver "^6.0.0"
+ slash "^2.0.0"
+ source-map-url "^0.4.0"
+ ssri "^6.0.1"
+ string.prototype.padend "^3.0.0"
+ terser-webpack-plugin "^1.2.3"
+ thread-loader "^2.1.2"
+ url-loader "^1.1.2"
+ vue-loader "^15.7.0"
+ webpack ">=4 < 4.29"
+ webpack-bundle-analyzer "^3.3.0"
+ webpack-chain "^4.11.0"
+ webpack-dev-server "^3.3.1"
+ webpack-merge "^4.2.1"
+ yorkie "^2.0.0"
+
+"@vue/cli-shared-utils@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.6.0.tgz#43937a2ea42b809dcd35d9348edf318ebc28b0d9"
+ integrity sha512-C8nTiJ7o+dncNLyOIOZF8P4bMJdOVXhWOuwyZKqn8k3CcsQVzuLyCKUHHezWc+sI+PJi4wIg2ZffCiueeIXZ+w==
+ dependencies:
+ chalk "^2.4.1"
+ execa "^1.0.0"
+ joi "^14.3.0"
+ launch-editor "^2.2.1"
+ lru-cache "^5.1.1"
+ node-ipc "^9.1.1"
+ opn "^5.3.0"
+ ora "^3.4.0"
+ request "^2.87.0"
+ request-promise-native "^1.0.7"
+ semver "^6.0.0"
+ string.prototype.padstart "^3.0.0"
+
+"@vue/component-compiler-utils@^2.5.1", "@vue/component-compiler-utils@^2.6.0":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b"
+ integrity sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==
+ dependencies:
+ consolidate "^0.15.1"
+ hash-sum "^1.0.2"
+ lru-cache "^4.1.2"
+ merge-source-map "^1.1.0"
+ postcss "^7.0.14"
+ postcss-selector-parser "^5.0.0"
+ prettier "1.16.3"
+ source-map "~0.6.1"
+ vue-template-es2015-compiler "^1.9.0"
+
+"@vue/preload-webpack-plugin@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz#d768dba004261c029b53a77c5ea2d5f9ee4f3cce"
+ integrity sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==
+
+"@vue/web-component-wrapper@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz#bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1"
+ integrity sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==
+
+"@webassemblyjs/ast@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
+ integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.7.11"
+ "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
+ "@webassemblyjs/wast-parser" "1.7.11"
+
+"@webassemblyjs/floating-point-hex-parser@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
+ integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==
+
+"@webassemblyjs/helper-api-error@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
+ integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==
+
+"@webassemblyjs/helper-buffer@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
+ integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==
+
+"@webassemblyjs/helper-code-frame@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b"
+ integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.7.11"
+
+"@webassemblyjs/helper-fsm@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
+ integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==
+
+"@webassemblyjs/helper-module-context@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
+ integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==
+
+"@webassemblyjs/helper-wasm-bytecode@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
+ integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==
+
+"@webassemblyjs/helper-wasm-section@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a"
+ integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/helper-buffer" "1.7.11"
+ "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
+ "@webassemblyjs/wasm-gen" "1.7.11"
+
+"@webassemblyjs/ieee754@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b"
+ integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63"
+ integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==
+ dependencies:
+ "@xtuc/long" "4.2.1"
+
+"@webassemblyjs/utf8@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
+ integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
+
+"@webassemblyjs/wasm-edit@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005"
+ integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/helper-buffer" "1.7.11"
+ "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
+ "@webassemblyjs/helper-wasm-section" "1.7.11"
+ "@webassemblyjs/wasm-gen" "1.7.11"
+ "@webassemblyjs/wasm-opt" "1.7.11"
+ "@webassemblyjs/wasm-parser" "1.7.11"
+ "@webassemblyjs/wast-printer" "1.7.11"
+
+"@webassemblyjs/wasm-gen@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8"
+ integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
+ "@webassemblyjs/ieee754" "1.7.11"
+ "@webassemblyjs/leb128" "1.7.11"
+ "@webassemblyjs/utf8" "1.7.11"
+
+"@webassemblyjs/wasm-opt@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7"
+ integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/helper-buffer" "1.7.11"
+ "@webassemblyjs/wasm-gen" "1.7.11"
+ "@webassemblyjs/wasm-parser" "1.7.11"
+
+"@webassemblyjs/wasm-parser@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a"
+ integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/helper-api-error" "1.7.11"
+ "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
+ "@webassemblyjs/ieee754" "1.7.11"
+ "@webassemblyjs/leb128" "1.7.11"
+ "@webassemblyjs/utf8" "1.7.11"
+
+"@webassemblyjs/wast-parser@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c"
+ integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/floating-point-hex-parser" "1.7.11"
+ "@webassemblyjs/helper-api-error" "1.7.11"
+ "@webassemblyjs/helper-code-frame" "1.7.11"
+ "@webassemblyjs/helper-fsm" "1.7.11"
+ "@xtuc/long" "4.2.1"
+
+"@webassemblyjs/wast-printer@1.7.11":
+ version "1.7.11"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813"
+ integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/wast-parser" "1.7.11"
+ "@xtuc/long" "4.2.1"
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8"
+ integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.4, accepts@~1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+ integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I=
+ dependencies:
+ mime-types "~2.1.18"
+ negotiator "0.6.1"
+
+acorn-dynamic-import@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+ integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==
+ dependencies:
+ acorn "^5.0.0"
+
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
+ dependencies:
+ acorn "^3.0.4"
+
+acorn-jsx@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
+ integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
+
+acorn-walk@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
+ integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+ integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
+
+acorn@^5.0.0, acorn@^5.5.0, acorn@^5.6.2:
+ version "5.7.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
+ integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
+
+acorn@^6.0.2, acorn@^6.0.7, acorn@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
+ integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
+
+address@^1.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/address/-/address-1.1.0.tgz#ef8e047847fcd2c5b6f50c16965f924fd99fe709"
+ integrity sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==
+
+ajv-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+ integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=
+
+ajv-keywords@^3.1.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d"
+ integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==
+
+ajv@^5.2.3, ajv@^5.3.0:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+ integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1:
+ version "6.10.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
+ integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+alphanum-sort@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+ansi-colors@^3.0.0:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
+ integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
+
+ansi-escapes@^3.0.0, ansi-escapes@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
+ integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
+
+ansi-html@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+ integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+arch@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
+ integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+ integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw=
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-flatten@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+ integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+ integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+ integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=
+
+array-union@^1.0.1, array-union@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+astral-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+ integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-limiter@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+ integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
+
+async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^9.5.1:
+ version "9.5.1"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.5.1.tgz#243b1267b67e7e947f28919d786b50d3bb0fb357"
+ integrity sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==
+ dependencies:
+ browserslist "^4.5.4"
+ caniuse-lite "^1.0.30000957"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^7.0.14"
+ postcss-value-parser "^3.3.1"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+ integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-eslint@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed"
+ integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.0.0"
+ "@babel/traverse" "^7.0.0"
+ "@babel/types" "^7.0.0"
+ eslint-scope "3.7.1"
+ eslint-visitor-keys "^1.0.0"
+
+babel-helper-vue-jsx-merge-props@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+ integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==
+
+babel-loader@^8.0.5:
+ version "8.0.5"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33"
+ integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==
+ dependencies:
+ find-cache-dir "^2.0.0"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+ util.promisify "^1.0.0"
+
+babel-plugin-dynamic-import-node@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e"
+ integrity sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==
+ dependencies:
+ object.assign "^4.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+ integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ 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"
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+ integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bfj@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48"
+ integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==
+ dependencies:
+ bluebird "^3.5.1"
+ check-types "^7.3.0"
+ hoopy "^0.1.2"
+ tryer "^1.0.0"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+ integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.3:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714"
+ integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
+body-parser@1.18.3:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
+ integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=
+ dependencies:
+ bytes "3.0.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "~1.6.3"
+ iconv-lite "0.4.23"
+ on-finished "~2.3.0"
+ qs "6.5.2"
+ raw-body "2.3.3"
+ type-is "~1.6.16"
+
+bonjour@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+ integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
+ dependencies:
+ array-flatten "^2.1.0"
+ deep-equal "^1.0.1"
+ dns-equal "^1.0.0"
+ dns-txt "^2.0.2"
+ multicast-dns "^6.0.1"
+ multicast-dns-service-types "^1.1.0"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1, braces@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ 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"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.5.4:
+ version "4.5.5"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.5.tgz#fe1a352330d2490d5735574c149a85bc18ef9b82"
+ integrity sha512-0QFO1r/2c792Ohkit5XI8Cm8pDtZxgNl2H6HU4mHrpYz7314pEYcsAVVatM0l/YmxPnEzh9VygXouj4gkFUTKA==
+ dependencies:
+ caniuse-lite "^1.0.30000960"
+ electron-to-chromium "^1.3.124"
+ node-releases "^1.1.14"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-indexof@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+ integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
+
+cacache@^10.0.4:
+ version "10.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+ integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
+ dependencies:
+ bluebird "^3.5.1"
+ chownr "^1.0.1"
+ glob "^7.1.2"
+ graceful-fs "^4.1.11"
+ lru-cache "^4.1.1"
+ mississippi "^2.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.2"
+ ssri "^5.2.4"
+ unique-filename "^1.1.0"
+ y18n "^4.0.0"
+
+cacache@^11.0.2:
+ version "11.3.2"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
+ integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
+ dependencies:
+ bluebird "^3.5.3"
+ chownr "^1.1.1"
+ figgy-pudding "^3.5.1"
+ glob "^7.1.3"
+ graceful-fs "^4.1.15"
+ lru-cache "^5.1.1"
+ mississippi "^3.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.2"
+ ssri "^6.0.1"
+ unique-filename "^1.1.1"
+ y18n "^4.0.0"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ 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"
+
+cache-loader@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-2.0.1.tgz#5758f41a62d7c23941e3c3c7016e6faeb03acb07"
+ integrity sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==
+ dependencies:
+ loader-utils "^1.1.0"
+ mkdirp "^0.5.1"
+ neo-async "^2.6.0"
+ normalize-path "^3.0.0"
+ schema-utils "^1.0.0"
+
+cacheable-request@^2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+ integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=
+ dependencies:
+ clone-response "1.0.2"
+ get-stream "3.0.0"
+ http-cache-semantics "3.8.1"
+ keyv "3.0.0"
+ lowercase-keys "1.0.0"
+ normalize-url "2.0.1"
+ responselike "1.0.2"
+
+call-me-maybe@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+ integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
+ dependencies:
+ callsites "^0.2.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+ integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camel-case@3.0.x:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000960:
+ version "1.0.30000963"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000963.tgz#5be481d5292f22aff5ee0db4a6c049b65b5798b1"
+ integrity sha512-n4HUiullc7Lw0LyzpeLa2ffP8KxFBGdxqD/8G3bSL6oB758hZ2UE2CVK+tQN958tJIi0/tfpjAc67aAtoHgnrQ==
+
+case-sensitive-paths-webpack-plugin@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e"
+ integrity sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ 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"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chardet@^0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+ integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
+
+chardet@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+ integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+check-types@^7.3.0:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4"
+ integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==
+
+chokidar@^2.0.2, chokidar@^2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d"
+ integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==
+ 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"
+
+chownr@^1.0.1, chownr@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
+ integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
+
+chrome-trace-event@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
+ integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==
+ dependencies:
+ tslib "^1.9.0"
+
+ci-info@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+ integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+ integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ 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"
+
+clean-css@4.2.x:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
+ integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==
+ dependencies:
+ source-map "~0.6.0"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-spinners@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7"
+ integrity sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA==
+
+cli-width@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+ integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
+
+clipboardy@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.0.0.tgz#3fcee421fdeca4e6a62ce72b66f3eb0c42165acd"
+ integrity sha512-XbVjHMsss0giNUkp/tV/3eEAZe8i1fZTLzmPKqjE1RGIAWOTiF5D014f6R+g53ZAq0IK3cPrJXFvqE8eQjhFYQ==
+ dependencies:
+ arch "^2.1.1"
+ execa "^1.0.0"
+
+cliui@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+ integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
+ dependencies:
+ string-width "^2.1.1"
+ strip-ansi "^4.0.0"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-response@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+coa@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+ integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ dependencies:
+ "@types/q" "^1.5.1"
+ chalk "^2.4.1"
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0, color-convert@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.5.2:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
+ integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.1.tgz#7abf5c0d38e89378284e873c207ae2172dcc8a61"
+ integrity sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.2"
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
+ integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.17.x:
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+ integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
+
+commander@^2.18.0, commander@^2.19.0:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
+ integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
+
+commander@~2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+ integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+compressible@~2.0.16:
+ version "2.0.16"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f"
+ integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==
+ dependencies:
+ mime-db ">= 1.38.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+ integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.16"
+ debug "2.6.9"
+ on-headers "~1.0.2"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.0, concat-stream@^1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+connect-history-api-fallback@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+ integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+consolidate@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+ integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==
+ dependencies:
+ bluebird "^3.1.1"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+ integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ=
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.1.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
+ integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+ integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+copy-webpack-plugin@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
+ integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
+ dependencies:
+ cacache "^10.0.4"
+ find-cache-dir "^1.0.0"
+ globby "^7.1.1"
+ is-glob "^4.0.0"
+ loader-utils "^1.1.0"
+ minimatch "^3.0.4"
+ p-limit "^1.0.0"
+ serialize-javascript "^1.4.0"
+
+core-js@^2.6.5:
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
+ integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
+ integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+ require-from-string "^2.0.1"
+
+cosmiconfig@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8"
+ integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.0"
+ parse-json "^4.0.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+ dependencies:
+ postcss "^7.0.1"
+ timsort "^0.3.0"
+
+css-loader@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
+ integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==
+ dependencies:
+ babel-code-frame "^6.26.0"
+ css-selector-tokenizer "^0.7.0"
+ icss-utils "^2.1.0"
+ loader-utils "^1.0.2"
+ lodash "^4.17.11"
+ postcss "^6.0.23"
+ postcss-modules-extract-imports "^1.2.0"
+ postcss-modules-local-by-default "^1.2.0"
+ postcss-modules-scope "^1.1.0"
+ postcss-modules-values "^1.3.0"
+ postcss-value-parser "^3.3.0"
+ source-list-map "^2.0.0"
+
+css-select-base-adapter@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+ integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-select@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede"
+ integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^2.1.2"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-selector-tokenizer@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
+ integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
+ dependencies:
+ cssesc "^0.1.0"
+ fastparse "^1.1.1"
+ regexpu-core "^1.0.0"
+
+css-tree@1.0.0-alpha.28:
+ version "1.0.0-alpha.28"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
+ integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==
+ dependencies:
+ mdn-data "~1.1.0"
+ source-map "^0.5.3"
+
+css-tree@1.0.0-alpha.29:
+ version "1.0.0-alpha.29"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
+ integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==
+ dependencies:
+ mdn-data "~1.1.0"
+ source-map "^0.5.3"
+
+css-unit-converter@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
+ integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
+
+css-url-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
+ integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=
+
+css-what@2.1, css-what@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+ integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
+cssesc@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+ integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=
+
+cssesc@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
+ integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==
+
+cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ dependencies:
+ css-declaration-sorter "^4.0.1"
+ cssnano-util-raw-cache "^4.0.1"
+ postcss "^7.0.0"
+ postcss-calc "^7.0.1"
+ postcss-colormin "^4.0.3"
+ postcss-convert-values "^4.0.1"
+ postcss-discard-comments "^4.0.2"
+ postcss-discard-duplicates "^4.0.2"
+ postcss-discard-empty "^4.0.1"
+ postcss-discard-overridden "^4.0.1"
+ postcss-merge-longhand "^4.0.11"
+ postcss-merge-rules "^4.0.3"
+ postcss-minify-font-values "^4.0.2"
+ postcss-minify-gradients "^4.0.2"
+ postcss-minify-params "^4.0.2"
+ postcss-minify-selectors "^4.0.2"
+ postcss-normalize-charset "^4.0.1"
+ postcss-normalize-display-values "^4.0.2"
+ postcss-normalize-positions "^4.0.2"
+ postcss-normalize-repeat-style "^4.0.2"
+ postcss-normalize-string "^4.0.2"
+ postcss-normalize-timing-functions "^4.0.2"
+ postcss-normalize-unicode "^4.0.1"
+ postcss-normalize-url "^4.0.1"
+ postcss-normalize-whitespace "^4.0.2"
+ postcss-ordered-values "^4.1.2"
+ postcss-reduce-initial "^4.0.3"
+ postcss-reduce-transforms "^4.0.2"
+ postcss-svgo "^4.0.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+ integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+ integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.0.0, cssnano@^4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
+csso@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
+ integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==
+ dependencies:
+ css-tree "1.0.0-alpha.29"
+
+current-script-polyfill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz#f31cf7e4f3e218b0726e738ca92a02d3488ef615"
+ integrity sha1-8xz35PPiGLBybnOMqSoC00iO9hU=
+
+cyclist@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+ integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+ integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
+
+de-indent@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+ integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.5, debug@^3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-equal@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+ integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+deepmerge@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
+ integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==
+
+default-gateway@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
+ integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
+ dependencies:
+ execa "^1.0.0"
+ ip-regex "^2.1.0"
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+del@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/del/-/del-4.1.0.tgz#049543b8290e1a9293e2bd150ab3a06f637322b8"
+ integrity sha512-C4kvKNlYrwXhKxz97BuohF8YoGgQ23Xm9lvoHmgT7JaPGprSEjk3+XFled74Yt/x0ZABUHg2D67covzAPUKx5Q==
+ dependencies:
+ globby "^6.1.0"
+ is-path-cwd "^2.0.0"
+ is-path-in-cwd "^2.0.0"
+ p-map "^2.0.0"
+ pify "^4.0.1"
+ rimraf "^2.6.3"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+detect-node@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
+ integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dir-glob@^2.0.0, dir-glob@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
+ integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+ dependencies:
+ path-type "^3.0.0"
+
+dns-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+ integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
+
+dns-packet@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
+ integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
+ dependencies:
+ ip "^1.1.0"
+ safe-buffer "^5.0.1"
+
+dns-txt@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+ integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
+ dependencies:
+ buffer-indexof "^1.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-converter@^0.2:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+ integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+ dependencies:
+ utila "~0.4"
+
+dom-serializer@0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+ integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+ dependencies:
+ domelementtype "^1.3.0"
+ entities "^1.1.1"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+ integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^1.5.1, domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+ integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
+ dependencies:
+ is-obj "^1.0.0"
+
+dotenv-expand@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
+ integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
+
+dotenv@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c"
+ integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+duplexer@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+ integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+easy-stack@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788"
+ integrity sha1-EskbMIWjfwuqM26UhurEv5Tj54g=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+ejs@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
+ integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
+
+electron-to-chromium@^1.3.124:
+ version "1.3.125"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.125.tgz#dbde0e95e64ebe322db0eca764d951f885a5aff2"
+ integrity sha512-XxowpqQxJ4nDwUXHtVtmEhRqBpm2OnjBomZmZtHD0d2Eo0244+Ojezhk3sD/MBSSe2nxCdGQFRXHIsf/LUTL9A==
+
+elliptic@^6.0.0:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
+ integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+ integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+ integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+ integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ tapable "^1.0.0"
+
+entities@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+error-stack-parser@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d"
+ integrity sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==
+ dependencies:
+ stackframe "^1.0.4"
+
+es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.1:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
+ integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
+ dependencies:
+ es-to-primitive "^1.2.0"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ is-callable "^1.1.4"
+ is-regex "^1.0.4"
+ object-keys "^1.0.12"
+
+es-to-primitive@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
+ integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+eslint-loader@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.2.tgz#453542a1230d6ffac90e4e7cb9cadba9d851be68"
+ integrity sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==
+ dependencies:
+ loader-fs-cache "^1.0.0"
+ loader-utils "^1.0.2"
+ object-assign "^4.0.1"
+ object-hash "^1.1.4"
+ rimraf "^2.6.1"
+
+eslint-plugin-vue@^4.7.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.7.1.tgz#c829b9fc62582c1897b5a0b94afd44ecca511e63"
+ integrity sha512-esETKhVMI7Vdli70Wt4bvAwnZBJeM0pxVX9Yb0wWKxdCJc2EADalVYK/q2FzMw8oKN0wPMdqVCKS8kmR89recA==
+ dependencies:
+ vue-eslint-parser "^2.0.3"
+
+eslint-plugin-vue@^5.0.0:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.2.tgz#86601823b7721b70bc92d54f1728cfc03b36283c"
+ integrity sha512-CtGWH7IB0DA6BZOwcV9w9q3Ri6Yuo8qMjx05SmOGJ6X6E0Yo3y9E/gQ5tuNxg2dEt30tRnBoFTbvtmW9iEoyHA==
+ dependencies:
+ vue-eslint-parser "^5.0.0"
+
+eslint-scope@3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+ integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^3.7.1:
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
+ integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^4.0.0, eslint-scope@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+ integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512"
+ integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==
+
+eslint-visitor-keys@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+ integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==
+
+eslint@^4.19.1:
+ version "4.19.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+ integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
+ dependencies:
+ ajv "^5.3.0"
+ babel-code-frame "^6.22.0"
+ chalk "^2.1.0"
+ concat-stream "^1.6.0"
+ cross-spawn "^5.1.0"
+ debug "^3.1.0"
+ doctrine "^2.1.0"
+ eslint-scope "^3.7.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^3.5.4"
+ esquery "^1.0.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^11.0.1"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.9.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^7.0.0"
+ progress "^2.0.0"
+ regexpp "^1.0.1"
+ require-uncached "^1.0.3"
+ semver "^5.3.0"
+ strip-ansi "^4.0.0"
+ strip-json-comments "~2.0.1"
+ table "4.0.2"
+ text-table "~0.2.0"
+
+eslint@^5.16.0:
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+ integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ ajv "^6.9.1"
+ chalk "^2.1.0"
+ cross-spawn "^6.0.5"
+ debug "^4.0.1"
+ doctrine "^3.0.0"
+ eslint-scope "^4.0.3"
+ eslint-utils "^1.3.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^5.0.1"
+ esquery "^1.0.1"
+ esutils "^2.0.2"
+ file-entry-cache "^5.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^11.7.0"
+ ignore "^4.0.6"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ inquirer "^6.2.2"
+ js-yaml "^3.13.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.11"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ progress "^2.0.0"
+ regexpp "^2.0.1"
+ semver "^5.5.1"
+ strip-ansi "^4.0.0"
+ strip-json-comments "^2.0.1"
+ table "^5.2.3"
+ text-table "^0.2.0"
+
+espree@^3.5.2, espree@^3.5.4:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+ integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+ dependencies:
+ acorn "^5.5.0"
+ acorn-jsx "^3.0.0"
+
+espree@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
+ integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==
+ dependencies:
+ acorn "^6.0.2"
+ acorn-jsx "^5.0.0"
+ eslint-visitor-keys "^1.0.0"
+
+espree@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
+ integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
+ dependencies:
+ acorn "^6.0.7"
+ acorn-jsx "^5.0.0"
+ eslint-visitor-keys "^1.0.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.0.0, esquery@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+ integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+ integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+ integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+event-pubsub@4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e"
+ integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==
+
+eventemitter3@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
+ integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==
+
+events@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
+ integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
+
+eventsource@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
+ integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
+ dependencies:
+ original "^1.0.0"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+execa@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+ integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ 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"
+
+express@^4.16.3, express@^4.16.4:
+ version "4.16.4"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
+ integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
+ dependencies:
+ accepts "~1.3.5"
+ array-flatten "1.1.1"
+ body-parser "1.18.3"
+ content-disposition "0.5.2"
+ content-type "~1.0.4"
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.1.1"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.2"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.4"
+ qs "6.5.2"
+ range-parser "~1.2.0"
+ safe-buffer "5.1.2"
+ send "0.16.2"
+ serve-static "1.13.2"
+ setprototypeof "1.1.0"
+ statuses "~1.4.0"
+ type-is "~1.6.16"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+external-editor@^2.0.4:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+ integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
+ dependencies:
+ chardet "^0.4.0"
+ iconv-lite "^0.4.17"
+ tmp "^0.0.33"
+
+external-editor@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27"
+ integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==
+ dependencies:
+ chardet "^0.7.0"
+ iconv-lite "^0.4.24"
+ tmp "^0.0.33"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ 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"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fast-deep-equal@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+ integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+ integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
+
+fast-glob@^2.2.6:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295"
+ integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ "@nodelib/fs.stat" "^1.1.2"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.3"
+ micromatch "^3.1.10"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+ integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastparse@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
+ integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+
+faye-websocket@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+ integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.1:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+ integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+figgy-pudding@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
+ integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+file-entry-cache@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+ integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+ dependencies:
+ flat-cache "^2.0.1"
+
+file-loader@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
+ integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
+ dependencies:
+ loader-utils "^1.0.2"
+ schema-utils "^1.0.0"
+
+filesize@^3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+ integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ 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"
+
+finalhandler@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+ integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.2"
+ statuses "~1.4.0"
+ unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+ integrity sha1-yN765XyKUqinhPnjHFfHQumToLk=
+ dependencies:
+ commondir "^1.0.1"
+ mkdirp "^0.5.1"
+ pkg-dir "^1.0.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-cache-dir@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+ integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^2.0.0"
+ pkg-dir "^3.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+flat-cache@^1.2.1:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
+ integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+ dependencies:
+ circular-json "^0.3.1"
+ graceful-fs "^4.1.2"
+ rimraf "~2.6.2"
+ write "^0.2.1"
+
+flat-cache@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+ integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+ dependencies:
+ flatted "^2.0.0"
+ rimraf "2.6.3"
+ write "1.0.3"
+
+flatted@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
+ integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==
+
+flush-write-stream@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+ integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.3.6"
+
+follow-redirects@^1.0.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76"
+ integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==
+ dependencies:
+ debug "^3.2.6"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+ integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+from2@^2.1.0, from2@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
+ dependencies:
+ minipass "^2.2.1"
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf"
+ integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==
+ dependencies:
+ nan "^2.12.1"
+ node-pre-gyp "^0.12.0"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ 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"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-stream@3.0.0, get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-to-regexp@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+ integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob@^7.0.3, glob@^7.1.2, glob@^7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ 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"
+
+globals@^11.0.1, globals@^11.1.0, globals@^11.7.0:
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e"
+ integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==
+
+globby@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+ integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
+ dependencies:
+ array-union "^1.0.1"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globby@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
+ integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA=
+ dependencies:
+ array-union "^1.0.1"
+ dir-glob "^2.0.0"
+ glob "^7.1.2"
+ ignore "^3.3.5"
+ pify "^3.0.0"
+ slash "^1.0.0"
+
+globby@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
+ integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^1.0.2"
+ dir-glob "^2.2.2"
+ fast-glob "^2.2.6"
+ glob "^7.1.3"
+ ignore "^4.0.3"
+ pify "^4.0.1"
+ slash "^2.0.0"
+
+got@^8.0.3:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
+ integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
+ dependencies:
+ "@sindresorhus/is" "^0.7.0"
+ cacheable-request "^2.1.1"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ into-stream "^3.1.0"
+ is-retry-allowed "^1.1.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ mimic-response "^1.0.0"
+ p-cancelable "^0.4.0"
+ p-timeout "^2.0.1"
+ pify "^3.0.0"
+ safe-buffer "^5.1.1"
+ timed-out "^4.0.1"
+ url-parse-lax "^3.0.0"
+ url-to-options "^1.0.1"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+ version "4.1.15"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
+ integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
+
+gzip-size@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.0.tgz#2db0396c71f5c902d5cf6b52add5030b93c99bd2"
+ integrity sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ==
+ dependencies:
+ duplexer "^0.1.1"
+ pify "^4.0.1"
+
+handle-thing@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
+ integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.0:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
+ integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
+ dependencies:
+ ajv "^6.5.5"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
+ integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.1, has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash-sum@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+ integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.x, he@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hoek@6.x.x:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
+ integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
+
+hoopy@^0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+ integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+ integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-comment-regex@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
+ integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
+
+html-entities@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+ integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=
+
+html-minifier@^3.2.3:
+ version "3.5.21"
+ resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
+ integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
+ dependencies:
+ camel-case "3.0.x"
+ clean-css "4.2.x"
+ commander "2.17.x"
+ he "1.2.x"
+ param-case "2.1.x"
+ relateurl "0.2.x"
+ uglify-js "3.4.x"
+
+html-tags@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b"
+ integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=
+
+html-webpack-plugin@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
+ integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s=
+ dependencies:
+ html-minifier "^3.2.3"
+ loader-utils "^0.2.16"
+ lodash "^4.17.3"
+ pretty-error "^2.0.2"
+ tapable "^1.0.0"
+ toposort "^1.0.0"
+ util.promisify "1.0.0"
+
+htmlparser2@^3.3.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+http-cache-semantics@3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+ integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+ integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
+
+http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+http-parser-js@>=0.4.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8"
+ integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==
+
+http-proxy-middleware@^0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
+ integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
+ dependencies:
+ http-proxy "^1.17.0"
+ is-glob "^4.0.0"
+ lodash "^4.17.11"
+ micromatch "^3.1.10"
+
+http-proxy@^1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a"
+ integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==
+ dependencies:
+ eventemitter3 "^3.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+iconv-lite@0.4.23:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+ integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
+
+icss-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+ integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=
+ dependencies:
+ postcss "^6.0.1"
+
+ieee754@^1.1.4:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+ integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^3.3.3, ignore@^3.3.5:
+ version "3.3.10"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+ integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
+ignore@^4.0.3, ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+import-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+ integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
+ dependencies:
+ import-from "^2.1.0"
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
+import-fresh@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390"
+ integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-from@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+ integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
+ dependencies:
+ resolve-from "^3.0.0"
+
+import-local@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+ integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+ dependencies:
+ pkg-dir "^3.0.0"
+ resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+ integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
+
+inquirer@^3.0.6:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+ integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.1.0"
+ strip-ansi "^4.0.0"
+ through "^2.3.6"
+
+inquirer@^6.2.2:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7"
+ integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==
+ dependencies:
+ ansi-escapes "^3.2.0"
+ chalk "^2.4.2"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^3.0.3"
+ figures "^2.0.0"
+ lodash "^4.17.11"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rxjs "^6.4.0"
+ string-width "^2.1.0"
+ strip-ansi "^5.1.0"
+ through "^2.3.6"
+
+internal-ip@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
+ integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
+ dependencies:
+ default-gateway "^4.2.0"
+ ipaddr.js "^1.9.0"
+
+into-stream@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+ integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=
+ dependencies:
+ from2 "^2.1.1"
+ p-is-promise "^1.1.0"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
+ integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
+
+ip-regex@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
+ integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
+
+ip@^1.1.0, ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+ integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
+ipaddr.js@1.9.0, ipaddr.js@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
+ integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+ integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
+
+is-ci@^1.0.10:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+ integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
+ dependencies:
+ ci-info "^1.5.0"
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+ integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+ integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
+
+is-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+ integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
+
+is-path-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c"
+ integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==
+
+is-path-in-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
+ integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+ dependencies:
+ is-path-inside "^2.1.0"
+
+is-path-inside@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
+ integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
+ dependencies:
+ path-is-inside "^1.0.2"
+
+is-plain-obj@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+ integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
+ dependencies:
+ has "^1.0.1"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-retry-allowed@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+ integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
+ integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
+ dependencies:
+ has-symbols "^1.0.0"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isemail@3.x.x:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c"
+ integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==
+ dependencies:
+ punycode "2.x.x"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+javascript-stringify@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
+ integrity sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=
+
+joi@^14.3.0:
+ version "14.3.1"
+ resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c"
+ integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==
+ dependencies:
+ hoek "6.x.x"
+ isemail "3.x.x"
+ topo "3.x.x"
+
+js-levenshtein@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
+ integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
+
+js-message@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15"
+ integrity sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=
+
+js-queue@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz#362213cf860f468f0125fc6c96abc1742531f948"
+ integrity sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=
+ dependencies:
+ easy-stack "^1.0.0"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.0, js-yaml@^3.9.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+ integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json3@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+ integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
+ integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
+ dependencies:
+ minimist "^1.2.0"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keyv@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+ integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
+ dependencies:
+ json-buffer "3.0.0"
+
+killable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
+ integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+ integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
+
+launch-editor-middleware@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157"
+ integrity sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==
+ dependencies:
+ launch-editor "^2.2.1"
+
+launch-editor@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.2.1.tgz#871b5a3ee39d6680fcc26d37930b6eeda89db0ca"
+ integrity sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==
+ dependencies:
+ chalk "^2.3.0"
+ shell-quote "^1.6.1"
+
+lcid@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
+ integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
+ dependencies:
+ invert-kv "^2.0.0"
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+loader-fs-cache@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086"
+ integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==
+ dependencies:
+ find-cache-dir "^0.1.1"
+ mkdirp "0.5.1"
+
+loader-runner@^2.3.0, loader-runner@^2.3.1:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+ integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
+
+loader-utils@^0.2.16:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+ integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+ object-assign "^4.0.1"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
+ integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^2.0.0"
+ json5 "^1.0.1"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+lodash.defaultsdeep@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81"
+ integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=
+
+lodash.kebabcase@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+ integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
+
+lodash.mapvalues@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
+ integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.transform@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0"
+ integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0:
+ version "4.17.11"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+ integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+ dependencies:
+ chalk "^2.0.1"
+
+loglevel@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
+ integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lower-case@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+ integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+
+lowercase-keys@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+ integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=
+
+lowercase-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
+make-dir@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+map-age-cleaner@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+ integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
+ dependencies:
+ p-defer "^1.0.0"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+mdn-data@~1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
+ integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+mem@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
+ integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
+ dependencies:
+ map-age-cleaner "^0.1.1"
+ mimic-fn "^2.0.0"
+ p-is-promise "^2.0.0"
+
+memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-source-map@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+ integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==
+ dependencies:
+ source-map "^0.6.1"
+
+merge2@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
+ integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ 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"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.40.0, "mime-db@>= 1.38.0 < 2":
+ version "1.40.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
+ integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
+
+mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19:
+ version "2.1.24"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
+ integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
+ dependencies:
+ mime-db "1.40.0"
+
+mime@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+ integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
+
+mime@^2.0.3, mime@^2.3.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78"
+ integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+mimic-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mini-css-extract-plugin@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz#a3f13372d6fcde912f3ee4cd039665704801e3b9"
+ integrity sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==
+ dependencies:
+ loader-utils "^1.1.0"
+ normalize-url "^2.0.1"
+ schema-utils "^1.0.0"
+ webpack-sources "^1.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+ integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
+
+minipass@^2.2.1, minipass@^2.3.4:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
+ integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
+ integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
+ dependencies:
+ minipass "^2.2.1"
+
+mississippi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+ integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^2.0.1"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mississippi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+ integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^3.0.0"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+multicast-dns-service-types@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+ integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
+
+multicast-dns@^6.0.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+ integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
+ dependencies:
+ dns-packet "^1.3.1"
+ thunky "^1.0.2"
+
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+ integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
+
+nan@^2.12.1:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
+ integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ 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"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+needle@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388"
+ integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg==
+ dependencies:
+ debug "^4.1.0"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+ integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=
+
+neo-async@^2.5.0, neo-async@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
+ integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+no-case@^2.2.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+ integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+ dependencies:
+ lower-case "^1.1.1"
+
+node-forge@0.7.5:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
+ integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==
+
+node-ipc@^9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz#4e245ed6938e65100e595ebc5dc34b16e8dd5d69"
+ integrity sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==
+ dependencies:
+ event-pubsub "4.3.0"
+ js-message "1.0.5"
+ js-queue "2.0.0"
+
+node-libs-browser@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77"
+ integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^3.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.11.0"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
+ integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
+ 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"
+
+node-releases@^1.1.14:
+ version "1.1.17"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.17.tgz#71ea4631f0a97d5cd4f65f7d04ecf9072eac711a"
+ integrity sha512-/SCjetyta1m7YXLgtACZGDYJdCSIBAWorDWkGCGZlydP2Ll7J48l7j/JxNYZ+xsgSPbWfdulVS/aY+GdjUsQ7Q==
+ dependencies:
+ semver "^5.3.0"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ 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"
+
+normalize-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
+ integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+normalize-url@2.0.1, normalize-url@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+ integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+ dependencies:
+ prepend-http "^2.0.0"
+ query-string "^5.0.1"
+ sort-keys "^2.0.0"
+
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+npm-bundled@^1.0.1:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
+ integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
+
+npm-packlist@^1.1.6:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
+ integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^1.0.2, nth-check@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+ integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-hash@^1.1.4:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
+ integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
+
+object-keys@^1.0.11, object-keys@^1.0.12:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ 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"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9"
+ integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.12.0"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+obuf@^1.0.0, obuf@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+ integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
+ dependencies:
+ mimic-fn "^1.0.0"
+
+opener@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
+ integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
+
+opn@^5.3.0, opn@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
+ integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
+ dependencies:
+ is-wsl "^1.1.0"
+
+optionator@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+ora@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
+ integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
+ dependencies:
+ chalk "^2.4.2"
+ cli-cursor "^2.1.0"
+ cli-spinners "^2.0.0"
+ log-symbols "^2.2.0"
+ strip-ansi "^5.2.0"
+ wcwidth "^1.0.1"
+
+original@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
+ integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
+ dependencies:
+ url-parse "^1.4.3"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
+ integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
+ dependencies:
+ execa "^1.0.0"
+ lcid "^2.0.0"
+ mem "^4.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-cancelable@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+ integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
+
+p-defer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+ integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-is-promise@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+ integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=
+
+p-is-promise@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
+ integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
+
+p-limit@^1.0.0, p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
+ integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-map@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+ integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+p-timeout@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+ integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@~1.0.5:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
+ integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
+
+parallel-transform@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+ integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=
+ dependencies:
+ cyclist "~0.2.2"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
+param-case@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
+ dependencies:
+ no-case "^2.2.0"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-asn1@^5.0.0:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc"
+ integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parseurl@~1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+ integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+ integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+ dependencies:
+ pify "^3.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.17"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
+ integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pkg-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+ integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q=
+ dependencies:
+ find-up "^1.0.0"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
+ dependencies:
+ find-up "^2.1.0"
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pluralize@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+ integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
+
+portfinder@^1.0.20:
+ version "1.0.20"
+ resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
+ integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
+ dependencies:
+ async "^1.5.2"
+ debug "^2.2.0"
+ mkdirp "0.5.x"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-calc@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436"
+ integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==
+ dependencies:
+ css-unit-converter "^1.1.1"
+ postcss "^7.0.5"
+ postcss-selector-parser "^5.0.0-rc.4"
+ postcss-value-parser "^3.3.1"
+
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+ dependencies:
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-load-config@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484"
+ integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==
+ dependencies:
+ cosmiconfig "^4.0.0"
+ import-cwd "^2.0.0"
+
+postcss-loader@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
+ integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
+ dependencies:
+ loader-utils "^1.1.0"
+ postcss "^7.0.0"
+ postcss-load-config "^2.0.0"
+ schema-utils "^1.0.0"
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ browserslist "^4.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-modules-extract-imports@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
+ integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
+ dependencies:
+ postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+ integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-scope@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+ integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-values@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+ integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
+ dependencies:
+ icss-replace-symbols "^1.1.0"
+ postcss "^6.0.1"
+
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+ integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=
+ dependencies:
+ dot-prop "^4.1.1"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.4:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
+ integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
+ dependencies:
+ cssesc "^2.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss@^6.0.1, postcss@^6.0.23:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.5:
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5"
+ integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@1.16.3:
+ version "1.16.3"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d"
+ integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==
+
+pretty-error@^2.0.2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
+ integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=
+ dependencies:
+ renderkid "^2.0.1"
+ utila "~0.4"
+
+private@^0.1.6:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+ integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+proxy-addr@~2.0.4:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
+ integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.9.0"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.24, psl@^1.1.28:
+ version "1.1.31"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
+ integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+pump@^2.0.0, pump@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+punycode@^1.2.4, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+qs@6.5.2, qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+querystringify@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
+ integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@^1.0.3, range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+ integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=
+
+raw-body@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
+ integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==
+ dependencies:
+ bytes "3.0.0"
+ http-errors "1.6.3"
+ iconv-lite "0.4.23"
+ unpipe "1.0.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-pkg@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.0.tgz#62b924384c4525a1a7a96e2d456b80df142b4390"
+ integrity sha512-NjNkqf8hlMuSxh+p8h8x8sCIfEv/MoRs/nYDmSRSAk879F9C94ADq+kHUJ4LTy5Nn0PYSmMYsy1mD4+lcXiBKg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^4.0.0"
+ type-fest "^0.4.1"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.1.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9"
+ integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+regenerate-unicode-properties@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662"
+ integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.2.1, regenerate@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+ integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+
+regenerator-runtime@^0.13.2:
+ version "0.13.2"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447"
+ integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==
+
+regenerator-transform@^0.13.4:
+ version "0.13.4"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb"
+ integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==
+ dependencies:
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp-tree@^0.1.0:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397"
+ integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==
+
+regexpp@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+ integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
+
+regexpp@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+ integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+
+regexpu-core@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+ integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regexpu-core@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae"
+ integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.0.2"
+ regjsgen "^0.5.0"
+ regjsparser "^0.6.0"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.1.0"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsgen@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
+ integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+regjsparser@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c"
+ integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@0.2.x:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+renderkid@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149"
+ integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==
+ dependencies:
+ css-select "^1.1.0"
+ dom-converter "^0.2"
+ htmlparser2 "^3.3.0"
+ strip-ansi "^3.0.0"
+ utila "^0.4.0"
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+request-promise-core@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
+ integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
+ dependencies:
+ lodash "^4.17.11"
+
+request-promise-native@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
+ integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
+ dependencies:
+ request-promise-core "1.1.2"
+ stealthy-require "^1.1.1"
+ tough-cookie "^2.3.3"
+
+request@^2.87.0:
+ version "2.88.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+ integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.0"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.4.3"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-uncached@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+ integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18"
+ integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==
+ dependencies:
+ path-parse "^1.0.6"
+
+responselike@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
+ dependencies:
+ is-promise "^2.1.0"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ dependencies:
+ aproba "^1.1.1"
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+ integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+ integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
+
+rxjs@^6.4.0:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.1.tgz#f7a005a9386361921b8524f38f54cbf80e5d08f4"
+ integrity sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==
+ dependencies:
+ tslib "^1.9.0"
+
+safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4, sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+schema-utils@^0.4.4:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
+ integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+ integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
+
+selfsigned@^1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd"
+ integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==
+ dependencies:
+ node-forge "0.7.5"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
+ integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
+
+semver@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65"
+ integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==
+
+send@0.16.2:
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+ integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.6.2"
+ mime "1.4.1"
+ ms "2.0.0"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.4.0"
+
+serialize-javascript@^1.4.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65"
+ integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==
+
+serve-index@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+ integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
+ dependencies:
+ accepts "~1.3.4"
+ batch "0.6.1"
+ debug "2.6.9"
+ escape-html "~1.0.3"
+ http-errors "~1.6.2"
+ mime-types "~2.1.17"
+ parseurl "~1.3.2"
+
+serve-static@1.13.2:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+ integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.2"
+ send "0.16.2"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+ integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slice-ansi@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+ integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+
+slice-ansi@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+ integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+ dependencies:
+ ansi-styles "^3.2.0"
+ astral-regex "^1.0.0"
+ is-fullwidth-code-point "^2.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ 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"
+
+sockjs-client@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177"
+ integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==
+ dependencies:
+ debug "^3.2.5"
+ eventsource "^1.0.7"
+ faye-websocket "~0.11.1"
+ inherits "^2.0.3"
+ json3 "^3.3.2"
+ url-parse "^1.4.3"
+
+sockjs@0.3.19:
+ version "0.3.19"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
+ integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==
+ dependencies:
+ faye-websocket "^0.10.0"
+ uuid "^3.0.1"
+
+sort-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+ integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@~0.5.10:
+ version "0.5.12"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
+ integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
+source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
+ integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
+ integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1"
+ integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==
+
+spdy-transport@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+ integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
+ dependencies:
+ debug "^4.1.0"
+ detect-node "^2.0.4"
+ hpack.js "^2.1.6"
+ obuf "^1.1.2"
+ readable-stream "^3.0.6"
+ wbuf "^1.7.3"
+
+spdy@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
+ integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
+ dependencies:
+ debug "^4.1.0"
+ handle-thing "^2.0.0"
+ http-deceiver "^1.2.7"
+ select-hose "^2.0.0"
+ spdy-transport "^3.0.0"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+ssri@^5.2.4:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+ integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+ssri@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
+ integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
+ dependencies:
+ figgy-pudding "^3.5.1"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+stackframe@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b"
+ integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+statuses@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+ integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
+
+stealthy-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
+stream-browserify@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+ integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+ integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+ integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string.prototype.padend@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0"
+ integrity sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.4.3"
+ function-bind "^1.0.2"
+
+string.prototype.padstart@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz#5bcfad39f4649bb2d031292e19bcf0b510d4b242"
+ integrity sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.4.3"
+ function-bind "^1.0.2"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
+ integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+strip-indent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+ integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
+
+strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+svg-tags@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+ integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
+
+svgo@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316"
+ integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==
+ dependencies:
+ chalk "^2.4.1"
+ coa "^2.0.2"
+ css-select "^2.0.0"
+ css-select-base-adapter "^0.1.1"
+ css-tree "1.0.0-alpha.28"
+ css-url-regex "^1.1.0"
+ csso "^3.5.1"
+ js-yaml "^3.13.1"
+ mkdirp "~0.5.1"
+ object.values "^1.1.0"
+ sax "~1.2.4"
+ stable "^0.1.8"
+ unquote "~1.1.1"
+ util.promisify "~1.0.0"
+
+table@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+ integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
+ dependencies:
+ ajv "^5.2.3"
+ ajv-keywords "^2.1.0"
+ chalk "^2.1.0"
+ lodash "^4.17.4"
+ slice-ansi "1.0.0"
+ string-width "^2.1.1"
+
+table@^5.2.3:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2"
+ integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==
+ dependencies:
+ ajv "^6.9.1"
+ lodash "^4.17.11"
+ slice-ansi "^2.1.0"
+ string-width "^3.0.0"
+
+tapable@^1.0.0, tapable@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tar@^4:
+ version "4.4.8"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
+ integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.4"
+ minizlib "^1.1.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8"
+ integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==
+ dependencies:
+ cacache "^11.0.2"
+ find-cache-dir "^2.0.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^1.4.0"
+ source-map "^0.6.1"
+ terser "^3.16.1"
+ webpack-sources "^1.1.0"
+ worker-farm "^1.5.2"
+
+terser@^3.16.1:
+ version "3.17.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2"
+ integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==
+ dependencies:
+ commander "^2.19.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.10"
+
+text-table@^0.2.0, text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+thread-loader@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.2.tgz#f585dd38e852c7f9cded5d092992108148f5eb30"
+ integrity sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w==
+ dependencies:
+ loader-runner "^2.3.1"
+ loader-utils "^1.1.0"
+ neo-async "^2.6.0"
+
+through2@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+thunky@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826"
+ integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==
+
+timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==
+ dependencies:
+ setimmediate "^1.0.4"
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+ integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ 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"
+
+topo@3.x.x:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c"
+ integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==
+ dependencies:
+ hoek "6.x.x"
+
+toposort@^1.0.0:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
+ integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
+
+tough-cookie@^2.3.3:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tough-cookie@~2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+ integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
+ dependencies:
+ psl "^1.1.24"
+ punycode "^1.4.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+tryer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+ integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+
+tslib@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+ integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+ integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-fest@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8"
+ integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==
+
+type-is@~1.6.16:
+ version "1.6.16"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+ integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.18"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+uglify-js@3.4.x:
+ version "3.4.10"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
+ integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==
+ dependencies:
+ commander "~2.19.0"
+ source-map "~0.6.1"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277"
+ integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57"
+ integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.0, unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6"
+ integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
+ integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
+
+upper-case@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+ integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
+
+uri-js@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-loader@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8"
+ integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==
+ dependencies:
+ loader-utils "^1.1.0"
+ mime "^2.0.3"
+ schema-utils "^1.0.0"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-parse@^1.4.3:
+ version "1.4.6"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.6.tgz#baf91d6e6783c8a795eb476892ffef2737fc0456"
+ integrity sha512-/B8AD9iQ01seoXmXf9z/MjLZQIdOoYl/+gvsQF6+mpnxaTfG9P7srYaiqaDMyKkR36XMXfhqSHss5MyFAO8lew==
+ dependencies:
+ querystringify "^2.0.0"
+ requires-port "^1.0.0"
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+ integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+ dependencies:
+ inherits "2.0.3"
+
+utila@^0.4.0, utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+ integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@^3.0.1, uuid@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vee-validate@^2.2.10:
+ version "2.2.10"
+ resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-2.2.10.tgz#c209b6fbcf3dd57f1c2a70d988bb8ff360b9a7a9"
+ integrity sha512-I48yS0Fvd7E7zCZpBgyyXlN2yUICyAIH6lHsyphTQ8gg/8BaTrgQOAdznSsB85qdS+tOJpJa/adwgk9Nyw3mSA==
+
+vendors@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801"
+ integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
+ dependencies:
+ indexof "0.0.1"
+
+vue-eslint-parser@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
+ integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==
+ dependencies:
+ debug "^3.1.0"
+ eslint-scope "^3.7.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^3.5.2"
+ esquery "^1.0.0"
+ lodash "^4.17.4"
+
+vue-eslint-parser@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1"
+ integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==
+ dependencies:
+ debug "^4.1.0"
+ eslint-scope "^4.0.0"
+ eslint-visitor-keys "^1.0.0"
+ espree "^4.1.0"
+ esquery "^1.0.1"
+ lodash "^4.17.11"
+
+vue-hot-reload-api@^2.3.0:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf"
+ integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==
+
+vue-loader@^15.7.0:
+ version "15.7.0"
+ resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.7.0.tgz#27275aa5a3ef4958c5379c006dd1436ad04b25b3"
+ integrity sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA==
+ dependencies:
+ "@vue/component-compiler-utils" "^2.5.1"
+ hash-sum "^1.0.2"
+ loader-utils "^1.1.0"
+ vue-hot-reload-api "^2.3.0"
+ vue-style-loader "^4.1.0"
+
+vue-nav-tabs@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/vue-nav-tabs/-/vue-nav-tabs-0.5.7.tgz#f9b8c410b43d9af1d92be6454f295af10c884e4a"
+ integrity sha512-Oqq7qnb0/JPAVSqM0haQ9TdEZaTbQq20TVn5ZCmBOu8m9qju9bI8cDdtWGHXSiMkpmhzsT83ybRb7S/+UYXRsw==
+
+vue-resource@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/vue-resource/-/vue-resource-1.5.1.tgz#0f3d685e3254d21800bebd966edcf56c34b3b6e4"
+ integrity sha512-o6V4wNgeqP+9v9b2bPXrr20CGNQPEXjpbUWdZWq9GJhqVeAGcYoeTtn/D4q059ZiyN0DIrDv/ADrQUmlUQcsmg==
+ dependencies:
+ got "^8.0.3"
+
+vue-router@^3.0.3:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.6.tgz#2e4f0f9cbb0b96d0205ab2690cfe588935136ac3"
+ integrity sha512-Ox0ciFLswtSGRTHYhGvx2L44sVbTPNS+uD2kRISuo8B39Y79rOo0Kw0hzupTmiVtftQYCZl87mwldhh2L9Aquw==
+
+vue-style-loader@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8"
+ integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==
+ dependencies:
+ hash-sum "^1.0.2"
+ loader-utils "^1.0.2"
+
+vue-template-compiler@^2.5.21:
+ version "2.6.10"
+ resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz#323b4f3495f04faa3503337a82f5d6507799c9cc"
+ integrity sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==
+ dependencies:
+ de-indent "^1.0.2"
+ he "^1.1.0"
+
+vue-template-es2015-compiler@^1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
+ integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
+
+vue-toasted@^1.1.27:
+ version "1.1.27"
+ resolved "https://registry.yarnpkg.com/vue-toasted/-/vue-toasted-1.1.27.tgz#ce0a74b875f90c2e4a9e163cce6d5fc37d78a07c"
+ integrity sha512-GVbwInwnqkVxQ4GU/XYeQt1e0dAXL8sF5Hr1H/coCBbYUan5xP0G2mEz/HRDf1lt73rFQAN/bJcLTOKkqiM6tg==
+
+vue@^2.6.10:
+ version "2.6.10"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637"
+ integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==
+
+watchpack@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+wbuf@^1.1.0, wbuf@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+ integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+webpack-bundle-analyzer@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f"
+ integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==
+ dependencies:
+ acorn "^6.0.7"
+ acorn-walk "^6.1.1"
+ bfj "^6.1.1"
+ chalk "^2.4.1"
+ commander "^2.18.0"
+ ejs "^2.6.1"
+ express "^4.16.3"
+ filesize "^3.6.1"
+ gzip-size "^5.0.0"
+ lodash "^4.17.10"
+ mkdirp "^0.5.1"
+ opener "^1.5.1"
+ ws "^6.0.0"
+
+webpack-chain@^4.11.0:
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6"
+ integrity sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==
+ dependencies:
+ deepmerge "^1.5.2"
+ javascript-stringify "^1.6.0"
+
+webpack-dev-middleware@^3.6.2:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz#f37a27ad7c09cd7dc67cd97655413abaa1f55942"
+ integrity sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg==
+ dependencies:
+ memory-fs "^0.4.1"
+ mime "^2.3.1"
+ range-parser "^1.0.3"
+ webpack-log "^2.0.0"
+
+webpack-dev-server@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.3.1.tgz#7046e49ded5c1255a82c5d942bcdda552b72a62d"
+ integrity sha512-jY09LikOyGZrxVTXK0mgIq9y2IhCoJ05848dKZqX1gAGLU1YDqgpOT71+W53JH/wI4v6ky4hm+KvSyW14JEs5A==
+ dependencies:
+ ansi-html "0.0.7"
+ bonjour "^3.5.0"
+ chokidar "^2.1.5"
+ compression "^1.7.4"
+ connect-history-api-fallback "^1.6.0"
+ debug "^4.1.1"
+ del "^4.1.0"
+ express "^4.16.4"
+ html-entities "^1.2.1"
+ http-proxy-middleware "^0.19.1"
+ import-local "^2.0.0"
+ internal-ip "^4.2.0"
+ ip "^1.1.5"
+ killable "^1.0.1"
+ loglevel "^1.6.1"
+ opn "^5.5.0"
+ portfinder "^1.0.20"
+ schema-utils "^1.0.0"
+ selfsigned "^1.10.4"
+ semver "^6.0.0"
+ serve-index "^1.9.1"
+ sockjs "0.3.19"
+ sockjs-client "1.3.0"
+ spdy "^4.0.0"
+ strip-ansi "^3.0.1"
+ supports-color "^6.1.0"
+ url "^0.11.0"
+ webpack-dev-middleware "^3.6.2"
+ webpack-log "^2.0.0"
+ yargs "12.0.5"
+
+webpack-log@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
+ integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
+ dependencies:
+ ansi-colors "^3.0.0"
+ uuid "^3.3.2"
+
+webpack-merge@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4"
+ integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==
+ dependencies:
+ lodash "^4.17.5"
+
+webpack-sources@^1.1.0, webpack-sources@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
+ integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+"webpack@>=4 < 4.29":
+ version "4.28.4"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0"
+ integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==
+ dependencies:
+ "@webassemblyjs/ast" "1.7.11"
+ "@webassemblyjs/helper-module-context" "1.7.11"
+ "@webassemblyjs/wasm-edit" "1.7.11"
+ "@webassemblyjs/wasm-parser" "1.7.11"
+ acorn "^5.6.2"
+ acorn-dynamic-import "^3.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ chrome-trace-event "^1.0.0"
+ enhanced-resolve "^4.1.0"
+ eslint-scope "^4.0.0"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ micromatch "^3.1.8"
+ mkdirp "~0.5.0"
+ neo-async "^2.5.0"
+ node-libs-browser "^2.0.0"
+ schema-utils "^0.4.4"
+ tapable "^1.1.0"
+ terser-webpack-plugin "^1.1.0"
+ watchpack "^1.5.0"
+ webpack-sources "^1.3.0"
+
+websocket-driver@>=0.5.1:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
+ integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=
+ dependencies:
+ http-parser-js ">=0.4.0"
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
+ integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
+worker-farm@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+ integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==
+ dependencies:
+ errno "~0.1.7"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+ integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+ dependencies:
+ mkdirp "^0.5.1"
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@^6.0.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+ integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
+
+"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+ integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
+ integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
+
+yargs-parser@^11.1.1:
+ version "11.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
+ integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@12.0.5:
+ version "12.0.5"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
+ integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.2.0"
+ find-up "^3.0.0"
+ get-caller-file "^1.0.1"
+ os-locale "^3.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1 || ^4.0.0"
+ yargs-parser "^11.1.1"
+
+yorkie@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"
+ integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==
+ dependencies:
+ execa "^0.8.0"
+ is-ci "^1.0.10"
+ normalize-path "^1.0.0"
+ strip-indent "^2.0.0"
diff --git a/moon_authz/Dockerfile b/moon_authz/Dockerfile
deleted file mode 100644
index fea9555d..00000000
--- a/moon_authz/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM python:3
-
-ADD . /root
-WORKDIR /root/
-RUN pip3 install -r requirements.txt
-RUN pip3 install .
-
-CMD ["python3", "-m", "moon_authz"] \ No newline at end of file
diff --git a/moon_cache/.gitignore b/moon_cache/.gitignore
new file mode 100644
index 00000000..7bff7318
--- /dev/null
+++ b/moon_cache/.gitignore
@@ -0,0 +1,105 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
diff --git a/moon_cache/Changelog b/moon_cache/Changelog
new file mode 100644
index 00000000..23ce6f5f
--- /dev/null
+++ b/moon_cache/Changelog
@@ -0,0 +1,34 @@
+# Copyright 2018 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+CHANGES
+=======
+
+0.1
+---
+- First version of the moon_cache library.
+
+0.2
+---
+- Add authentication to all requests
+- Cache the Manager API key
+- Add pipeline information in cache
+- Add getInstance method to cache to be Singleton
+- Calling update from __init__
+
+0.3
+---
+- Fix VIM project ID in Cache and Context
+
+0.4
+---
+- Fix partial update problem in cache
+- fix update_pipelines issue
+
+0.5
+---
+- Add API to allow modifications of items in cache
+- Add the global attribute in cache
diff --git a/moon_authz/LICENSE b/moon_cache/LICENSE
index d6456956..d6456956 100644
--- a/moon_authz/LICENSE
+++ b/moon_cache/LICENSE
diff --git a/moon_cache/MANIFEST.in b/moon_cache/MANIFEST.in
new file mode 100644
index 00000000..21c2cf92
--- /dev/null
+++ b/moon_cache/MANIFEST.in
@@ -0,0 +1,10 @@
+# Copyright 2018 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+include README.md
+include LICENSE
+include Changelog
+include setup.py
+include requirements.txt
diff --git a/moon_cache/README.md b/moon_cache/README.md
new file mode 100644
index 00000000..3a28813d
--- /dev/null
+++ b/moon_cache/README.md
@@ -0,0 +1,3 @@
+# moon_cache
+
+Python library that implement the cache system of the Moon engine \ No newline at end of file
diff --git a/moon_cache/moon_cache/__init__.py b/moon_cache/moon_cache/__init__.py
new file mode 100644
index 00000000..9f3c4ca0
--- /dev/null
+++ b/moon_cache/moon_cache/__init__.py
@@ -0,0 +1,13 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+__version__ = "0.7"
diff --git a/moon_cache/moon_cache/cache.py b/moon_cache/moon_cache/cache.py
new file mode 100644
index 00000000..3fb9018d
--- /dev/null
+++ b/moon_cache/moon_cache/cache.py
@@ -0,0 +1,1466 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+import time
+import copy
+from uuid import uuid4
+import moon_cache.request_wrapper as requests
+from moon_utilities import exceptions
+
+logger = logging.getLogger("moon.cache.cache")
+
+
+class Cache(object):
+ """
+ Cache object allowing to save all data for a specific moon component
+ """
+
+ __UPDATE_INTERVAL = 10
+
+ __MANAGER_API_KEY = None
+
+ __CURRENT_SERVER = None
+ __CURRENT_SERVER_API_KEY = None
+
+ __pipelines = {}
+ __PIPELINES_UPDATE = 0
+
+ __security_functions = {}
+ __SECURITY_FUNCTIONS_UPDATE = 0
+
+ __attributes = {}
+ __ATTRS_UPDATE = 0
+
+ __pdp = {}
+ __PDP_UPDATE = 0
+
+ __policies = {}
+ __POLICIES_UPDATE = 0
+
+ __models = {}
+ __MODELS_UPDATE = 0
+
+ __subjects = {}
+ __objects = {}
+ __actions = {}
+
+ __subject_assignments = {}
+ __object_assignments = {}
+ __action_assignments = {}
+
+ __subject_categories = {}
+ __SUBJECT_CATEGORIES_UPDATE = 0
+ __object_categories = {}
+ __OBJECT_CATEGORIES_UPDATE = 0
+ __action_categories = {}
+ __ACTION_CATEGORIES_UPDATE = 0
+
+ __meta_rules = {}
+ __META_RULES_UPDATE = 0
+
+ __rules = {}
+ __RULES_UPDATE = 0
+
+ __subject_data = []
+ __object_data = []
+ __action_data = []
+
+ __authz_requests = {}
+
+ __instance = None
+
+ @staticmethod
+ def getInstance(manager_url=None, incremental=True, manager_api_key=None, static_conf=None):
+ """ Static access method. """
+
+ if Cache.__instance == None:
+ Cache(manager_url, incremental, manager_api_key, static_conf)
+
+ return Cache.__instance
+
+ @staticmethod
+ def deleteInstance():
+ Cache.__instance = None
+
+ def __init__(self, manager_url=None, incremental=True, manager_api_key=None, static_conf=None):
+
+ if Cache.__instance != None:
+ raise exceptions.MoonError("This class is a singleton! use getInstance() instead")
+ else:
+ Cache.__instance = self
+
+ self.manager_url = manager_url
+ self.incremental = incremental
+ self.headers = {"X-Api-Key": manager_api_key}
+ self.__MANAGER_API_KEY = manager_api_key
+
+ if self.manager_url:
+ self.update()
+ elif static_conf:
+ self.update_from_static_conf(static_conf)
+ logger.info("Update done!")
+
+ def update(self, pdp_id=None, pipeline=None):
+ """
+ Force the update of one or more elements
+ :param pdp_id: PDP ID
+ :param pipeline: Pipeline ID
+ :return: None
+ """
+ if not self.manager_url:
+ return
+ if pipeline:
+ # if we are in wrapper, retrieve pipeline list from pdp
+ self.__update_pipelines(pipeline)
+ else:
+ # else update pdp and policy list
+ self.__update_pdp(pdp_id)
+ self.__update_policies(pdp_id)
+ if not self.incremental:
+ # if it is written in config file ; retrieve all data from Manager
+ self.__update_models()
+ self.__update_meta_rules()
+ self.__update_rules()
+ self.__update_subject_categories()
+ self.__update_object_categories()
+ self.__update_action_categories()
+ for _policy_id in self.__policies:
+ self.__update_subjects(_policy_id)
+ self.__update_objects(_policy_id)
+ self.__update_actions(_policy_id)
+ self.__update_subject_assignments(_policy_id)
+ self.__update_object_assignments(_policy_id)
+ self.__update_action_assignments(_policy_id)
+
+ def set_current_server(self, url, api_key):
+ self.__CURRENT_SERVER = url
+ self.__CURRENT_SERVER_API_KEY = api_key
+
+ @staticmethod
+ def __update_list_to_dict(data):
+ """
+ Transform a list in a dictionary
+ :param data: the list to be transformed
+ :return: a dictionary
+ """
+ return {uuid4().hex: value for value in data}
+
+ def update_from_static_conf(self, conf):
+ """
+ Get the data in the JSON file and save its content into the cache
+ :param conf: the content of the JSON file
+ :return:
+ """
+ logger.info("update_from_static_conf {}".format(conf.get("policies", [])))
+ self.__pdp = self.__update_list_to_dict(conf.get("pdp", []))
+ self.__policies = self.__update_list_to_dict(conf.get("policies", []))
+ self.__models = self.__update_list_to_dict(conf.get("models", []))
+ self.__subjects = self.__update_list_to_dict(conf.get("subjects", []))
+ self.__objects = self.__update_list_to_dict(conf.get("objects", []))
+ self.__actions = self.__update_list_to_dict(conf.get("actions", []))
+ self.__subject_categories = self.__update_list_to_dict(conf.get("subjects_categories", []))
+ self.__object_categories = self.__update_list_to_dict(conf.get("objects_categories", []))
+ self.__action_categories = self.__update_list_to_dict(conf.get("actions_categories", []))
+ # FIXME: should add DATA in Cache
+ self.__subject_data = conf.get("subjects_data", [])
+ self.__object_data = conf.get("objects_data", [])
+ self.__action_data = conf.get("actions_data", [])
+ self.__subject_assignments = self.__update_list_to_dict(conf.get("subjects_assignments", []))
+ self.__object_assignments = self.__update_list_to_dict(conf.get("objects_assignments", []))
+ self.__action_assignments = self.__update_list_to_dict(conf.get("actions_assignments", []))
+ self.__rules = conf.get("rules", [])
+ self.__meta_rules = self.__update_list_to_dict(conf.get("meta_rules", []))
+
+ @property
+ def manager_api_token(self):
+ return self.__MANAGER_API_KEY
+
+ @property
+ def authz_requests(self):
+ """
+ Authorization requests
+ :return: a dictionary
+ """
+ return self.__authz_requests
+
+ # Attributes
+
+ @property
+ def attributes(self):
+ """
+ Global attributes
+ :return: a dictionary containing attributes
+ """
+ _keys = list(self.__attributes.keys())
+ self.update_attribute()
+ return self.__attributes
+
+ def set_attribute(self, name, value=None):
+ """
+ Set one global attribute
+ :return: a dictionary containing attributes
+ """
+ self.__attributes[name] = value
+ return self.__attributes
+
+ def update_attribute(self, name=None):
+ """
+ Update one global attribute from the Manager
+ :return: a dictionary containing attributes
+ """
+ if self.manager_url:
+ if not name:
+ response = requests.get("{}/attributes".format(self.manager_url),
+ headers=self.headers)
+ for key in response.json()["attributes"]:
+ self.__attributes[key] = response.json()["attributes"][key]['value']
+ else:
+ response = requests.get("{}/attributes/{}".format(self.manager_url, name),
+ headers=self.headers)
+ self.__attributes[name] = response.json()["attributes"]['value']
+
+ # perimeter functions
+
+ def __check_policies(self, policy_ids):
+ for policy in policy_ids:
+ if policy not in self.__policies:
+ raise exceptions.PolicyUnknown
+
+ @property
+ def subjects(self):
+ """
+ Subjects
+ :return: a dictionary
+ """
+ return self.__subjects
+
+ def add_subject(self, value):
+ _id = value.get("id", uuid4().hex)
+ self.__check_policies(value.get("policy_list", []))
+ policy_id = value.get("policy_list", [])[0]
+ if policy_id not in self.__subjects:
+ self.__subjects[policy_id] = {_id: dict(value)}
+ else:
+ self.__subjects[policy_id][_id] = dict(value)
+ return {_id: dict(value)}
+
+ def delete_subject(self, policy_id=None, perimeter_id=None):
+ if not policy_id and perimeter_id:
+ self.__subjects.pop(perimeter_id)
+ return
+ elif not perimeter_id:
+ self.__subjects = {}
+ return
+ self.__check_policies([policy_id])
+ self.__subjects[perimeter_id].get("policies").remove(policy_id)
+
+ def update_subject(self, perimeter_id, value):
+ self.__check_policies(value.get("policies", []))
+ policy_id = value.get("policy_list", [])[0]
+ _policies = self.__subjects[policy_id][perimeter_id].get("policies", [])
+ for policy in value.get("policies", []):
+ if policy not in _policies:
+ _policies.append(policy)
+ value.pop("policies", None)
+ prev_dict = dict(self.__subjects[policy_id][perimeter_id])
+ prev_dict.update(value)
+ prev_dict["policies"] = _policies
+ self.__subjects[policy_id][perimeter_id] = dict(prev_dict)
+
+ def __update_subjects(self, policy_id):
+ """
+ Update all subjects in a specific policy
+ :param policy_id: the policy ID
+ :return: None
+ """
+ response = requests.get("{}/policies/{}/subjects".format(self.manager_url, policy_id),
+ headers=self.headers)
+ if 'subjects' in response.json():
+ self.__subjects[policy_id] = response.json()['subjects']
+ else:
+ raise exceptions.SubjectUnknown("Cannot find subject within policy_id {}".format(
+ policy_id))
+
+ def get_subject(self, policy_id, name):
+ """
+ Get one subject knowing its name
+ :param policy_id: the policy ID
+ :param name: the subject name
+ :return: a dictionary
+ """
+ if not policy_id:
+ raise exceptions.PolicyUnknown("Cannot find policy within policy_id {}".format(
+ policy_id))
+
+ if policy_id in self.subjects:
+ for _subject_id, _subject_dict in self.subjects[policy_id].items():
+ if _subject_id == name or _subject_dict.get("name") == name:
+ return _subject_id
+
+ if self.manager_url:
+ self.__update_subjects(policy_id)
+
+ if policy_id in self.subjects:
+ for _subject_id, _subject_dict in self.subjects[policy_id].items():
+ if _subject_id == name or _subject_dict.get("name") == name:
+ return _subject_id
+
+ raise exceptions.SubjectUnknown("Cannot find subject {}".format(name))
+
+ @property
+ def objects(self):
+ """
+ Objects
+ :return: a dictionary
+ """
+ return self.__objects
+
+ def add_object(self, value):
+ _id = value.get("id", uuid4().hex)
+ self.__check_policies(value.get("policy_list", []))
+ policy_id = value.get("policy_list", [])[0]
+ if policy_id not in self.__objects:
+ self.__objects[policy_id] = {_id: dict(value)}
+ else:
+ self.__objects[policy_id][_id] = dict(value)
+ return {_id: dict(value)}
+
+ def delete_object(self, policy_id=None, perimeter_id=None):
+ if not policy_id and perimeter_id:
+ self.__objects.pop(perimeter_id)
+ return
+ elif not perimeter_id:
+ self.__objects = {}
+ return
+ self.__check_policies([policy_id])
+ self.__objects[perimeter_id].get("policies").remove(policy_id)
+
+ def update_object(self, perimeter_id, value):
+ self.__check_policies(value.get("policies", []))
+ policy_id = value.get("policy_list", [])[0]
+ _policies = self.__objects[policy_id][perimeter_id].get("policies", [])
+ for policy in value.get("policies", []):
+ if policy not in _policies:
+ _policies.append(policy)
+ value.pop("policies", None)
+ prev_dict = dict(self.__objects[policy_id][perimeter_id])
+ prev_dict.update(value)
+ prev_dict["policies"] = _policies
+ self.__objects[policy_id][perimeter_id] = dict(prev_dict)
+
+ def __update_objects(self, policy_id):
+ """
+ Update all objects in a specific policy
+ :param policy_id: the policy ID
+ :return: None
+ """
+ response = requests.get("{}/policies/{}/objects".format(self.manager_url, policy_id),
+ headers=self.headers)
+ if 'objects' in response.json():
+ self.__objects[policy_id] = response.json()['objects']
+ else:
+ raise exceptions.ObjectUnknown("Cannot find object within policy_id {}".format(
+ policy_id))
+
+ def get_object(self, policy_id, name):
+ """
+ Get an object knowing its name
+ :param policy_id: the policy ID
+ :param name: the object name
+ :return: a dictionary
+ """
+ if not policy_id:
+ raise exceptions.PolicyUnknown("Cannot find policy within policy_id {}".format(
+ policy_id))
+
+ if policy_id in self.objects:
+ for _object_id, _object_dict in self.__objects[policy_id].items():
+ if _object_id == name or _object_dict.get("name") == name:
+ return _object_id
+
+ if self.manager_url:
+ self.__update_objects(policy_id)
+
+ if policy_id in self.objects:
+ for _object_id, _object_dict in self.__objects[policy_id].items():
+ if _object_id == name or _object_dict.get("name") == name:
+ return _object_id
+
+ raise exceptions.ObjectUnknown("Cannot find object {}".format(name))
+
+ @property
+ def actions(self):
+ """
+ Actions
+ :return: a dictionary
+ """
+ return self.__actions
+
+ def add_action(self, value):
+ _id = value.get("id", uuid4().hex)
+ self.__check_policies(value.get("policy_list", []))
+ policy_id = value.get("policy_list", [])[0]
+ if policy_id not in self.__actions:
+ self.__actions[policy_id] = {_id: dict(value)}
+ else:
+ self.__actions[policy_id][_id] = dict(value)
+ return {_id: dict(value)}
+
+ def delete_action(self, policy_id=None, perimeter_id=None):
+ if not policy_id and perimeter_id:
+ self.__actions.pop(perimeter_id)
+ return
+ elif not perimeter_id:
+ self.__actions = {}
+ return
+ self.__check_policies([policy_id])
+ self.__actions[perimeter_id].get("policies").remove(policy_id)
+
+ def update_action(self, perimeter_id, value):
+ self.__check_policies(value.get("policies", []))
+ policy_id = value.get("policy_list", [])[0]
+ _policies = self.__actions[policy_id][perimeter_id].get("policies", [])
+ for policy in value.get("policies", []):
+ if policy not in _policies:
+ _policies.append(policy)
+ value.pop("policies", None)
+ prev_dict = dict(self.__actions[policy_id][perimeter_id])
+ prev_dict.update(value)
+ prev_dict["policies"] = _policies
+ self.__actions[policy_id][perimeter_id] = dict(prev_dict)
+
+ def __update_actions(self, policy_id):
+ """
+ Update all actions in a specific policy
+ :param policy_id: the policy ID
+ :return: None
+ """
+ response = requests.get("{}/policies/{}/actions".format(self.manager_url, policy_id),
+ headers=self.headers)
+
+ if 'actions' in response.json():
+ self.__actions[policy_id] = response.json()['actions']
+ else:
+ raise exceptions.ActionUnknown("Cannot find action within policy_id {}".format(
+ policy_id))
+
+ def get_action(self, policy_id, name):
+ """
+ Get an action knowing its name
+ :param policy_id: the policy ID
+ :param name: the action name
+ :return: a dictionary
+ """
+ if not policy_id:
+ raise exceptions.PolicyUnknown("Cannot find policy within policy_id {}".format(
+ policy_id))
+
+ if policy_id in self.actions:
+ for _action_id, _action_dict in self.__actions[policy_id].items():
+ if _action_id == name or _action_dict.get("name") == name:
+ return _action_id
+
+ if self.manager_url:
+ self.__update_actions(policy_id)
+
+ for _action_id, _action_dict in self.__actions[policy_id].items():
+ if _action_id == name or _action_dict.get("name") == name:
+ return _action_id
+
+ raise exceptions.ActionUnknown("Cannot find action {}".format(name))
+
+ # meta_rule functions
+
+ @property
+ def meta_rules(self):
+ """
+ Meta Rules
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__META_RULES_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__META_RULES_UPDATE = current_time
+ self.__update_meta_rules()
+ self.__META_RULES_UPDATE = current_time
+ return self.__meta_rules
+
+ def add_meta_rule(self, value):
+ _id = uuid4().hex
+ self.__meta_rules[_id] = dict(value)
+
+ def delete_meta_rule(self, meta_rule_id):
+ self.__meta_rules.pop(meta_rule_id)
+
+ def __update_meta_rules(self):
+ """
+ Update all meta rules
+ :return: None
+ """
+ response = requests.get("{}/meta_rules".format(self.manager_url), headers=self.headers)
+
+ if 'meta_rules' in response.json():
+ self.__meta_rules = response.json()['meta_rules']
+ else:
+ raise exceptions.MetaRuleUnknown("Cannot find meta rules")
+
+ # rule functions
+
+ @property
+ def rules(self):
+ """
+ Rules
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__RULES_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__RULES_UPDATE = current_time
+ self.__update_rules()
+ self.__RULES_UPDATE = current_time
+ return self.__rules
+
+ def add_rule(self, value):
+ value = dict(value)
+ _id = value.get("policy_id")
+ if "value" in value:
+ for key in value["value"]:
+ value[key] = value["value"][key]
+ value.pop('value')
+ if _id in self.__rules:
+ self.__rules[_id]['rules'].append(value)
+ else:
+ self.__rules[_id] = {
+ "policy_id": _id,
+ "rules": [value]
+ }
+
+ def delete_rule(self, policy_id, rule_id=None):
+ if not rule_id:
+ self.__rules.pop(policy_id)
+ return
+ for _index, _rule in enumerate(self.__rules.get(policy_id, {}).get("rules")):
+ if _rule.get('id') == rule_id:
+ index = _index
+ break
+ else:
+ return
+ self.__rules.get(policy_id, {}).get("rules").pop(index)
+
+ def __update_rules(self):
+ """
+ Update all rules
+ :return: None
+ """
+ for policy_id in self.policies:
+
+ response = requests.get("{}/policies/{}/rules".format(
+ self.manager_url, policy_id), headers=self.headers)
+ if 'rules' in response.json():
+ self.__rules[policy_id] = response.json()['rules']
+ else:
+ logger.warning(" no 'rules' found within policy_id: {}".format(policy_id))
+
+ # assignment functions
+
+ def update_assignments(self, policy_id=None, perimeter_id=None):
+ """
+ Update all assignments for a specific perimeter (subject, object or action)
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :return: None
+ """
+ if self.manager_url:
+ if policy_id:
+ self.__update_subject_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ self.__update_object_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ self.__update_action_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ else:
+ for policy_id in self.__policies:
+ self.__update_subject_assignments(policy_id=policy_id,
+ perimeter_id=perimeter_id)
+ self.__update_object_assignments(policy_id=policy_id,
+ perimeter_id=perimeter_id)
+ self.__update_action_assignments(policy_id=policy_id,
+ perimeter_id=perimeter_id)
+
+ @property
+ def subject_assignments(self):
+ """
+ Subject Assignments
+ :return: a dictionary
+ """
+ return self.__subject_assignments
+
+ def __update_subject_assignments(self, policy_id, perimeter_id=None):
+ """
+ Update all assignments for a specific perimeter
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :return: None
+ """
+ if perimeter_id:
+ response = requests.get("{}/policies/{}/subject_assignments/{}".format(
+ self.manager_url, policy_id, perimeter_id), headers=self.headers)
+ else:
+ response = requests.get("{}/policies/{}/subject_assignments".format(
+ self.manager_url, policy_id), headers=self.headers)
+
+ if 'subject_assignments' in response.json():
+ if policy_id not in self.subject_assignments:
+ self.__subject_assignments[policy_id] = {}
+ self.__subject_assignments[policy_id] = response.json()['subject_assignments']
+ else:
+ raise exceptions.SubjectAssignmentUnknown(
+ "Cannot find subject assignment within policy_id {}".format(policy_id))
+
+ def get_subject_assignments(self, policy_id, perimeter_id, category_id):
+ """
+ Get all subject assignments for a specific perimeter ID and in a specific category ID
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :param category_id: the category ID
+ :return: a dictionary
+ """
+ if not policy_id:
+ raise exceptions.PolicyUnknown("Cannot find policy within policy_id {}".format(
+ policy_id))
+
+ if self.manager_url:
+ self.__update_subject_assignments(policy_id, perimeter_id)
+
+ for key, value in self.__subject_assignments[policy_id].items():
+ if all(k in value for k in ("subject_id", "category_id", "assignments")):
+ if perimeter_id == value['subject_id'] and category_id == value['category_id']:
+ return value['assignments']
+ else:
+ logger.warning("'subject_id' or 'category_id' or 'assignments'"
+ " keys are not found in subject_assignments")
+ return []
+
+ def add_subject_assignment(self, policy_id, perimeter_id, category_id, data_id):
+ self.__check_policies([policy_id])
+ for key, value in self.__subject_assignments.get(policy_id, {}).items():
+ if all(k in value for k in ("subject_id", "category_id", "assignments")):
+ if perimeter_id == value['subject_id'] and category_id == value['category_id']:
+ if data_id not in value['assignments']:
+ value['assignments'].append(data_id)
+ return value['assignments']
+ else:
+ logger.warning("'subject_id' or 'category_id' or 'assignments'"
+ " keys are not found in subject_assignments")
+ value = {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "subject_id": perimeter_id,
+ "category_id": category_id,
+ "assignments": [data_id, ],
+ }
+ if policy_id not in self.__subject_assignments:
+ self.__subject_assignments[policy_id] = {}
+ self.__subject_assignments[policy_id][value["id"]] = value
+ return value
+
+ def delete_subject_assignment(self, policy_id=None, perimeter_id=None,
+ category_id=None, data_id=None):
+ if not policy_id and not perimeter_id and not category_id and not data_id:
+ self.__subject_assignments = {}
+ return
+ self.__check_policies([policy_id])
+ for key, value in self.__subject_assignments[policy_id].items():
+ if all(k in value for k in ("subject_id", "category_id", "assignments")):
+ if perimeter_id == value['subject_id'] and category_id == value['category_id']:
+ try:
+ value['assignments'].remove(data_id)
+ except ValueError:
+ pass
+ return value['assignments']
+ else:
+ logger.warning("'subject_id' or 'category_id' or 'assignments'"
+ " keys are not found in subject_assignments")
+ return []
+
+ @property
+ def object_assignments(self):
+ """
+ Object Assignments
+ :return: a dictionary
+ """
+ return self.__object_assignments
+
+ def __update_object_assignments(self, policy_id, perimeter_id=None):
+ """
+ Update all assignments for a specific perimeter
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :return: None
+ """
+ if perimeter_id:
+ response = requests.get("{}/policies/{}/object_assignments/{}".format(
+ self.manager_url, policy_id, perimeter_id), headers=self.headers)
+ else:
+ response = requests.get("{}/policies/{}/object_assignments".format(
+ self.manager_url, policy_id), headers=self.headers)
+
+ if 'object_assignments' in response.json():
+ if policy_id not in self.object_assignments:
+ self.__object_assignments[policy_id] = {}
+
+ self.__object_assignments[policy_id] = response.json()['object_assignments']
+ else:
+ raise exceptions.ObjectAssignmentUnknown(
+ "Cannot find object assignment within policy_id {}".format(policy_id))
+
+ def get_object_assignments(self, policy_id, perimeter_id, category_id):
+ """
+ Get all object assignments for a specific perimeter ID and in a specific category ID
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :param category_id: the category ID
+ :return: a dictionary
+ """
+ if not policy_id:
+ raise exceptions.PolicyUnknown("Cannot find policy within policy_id {}".format(
+ policy_id))
+
+ if self.manager_url:
+ self.__update_object_assignments(policy_id, perimeter_id)
+
+ for key, value in self.object_assignments[policy_id].items():
+ if all(k in value for k in ("object_id", "category_id", "assignments")):
+ if perimeter_id == value['object_id'] and category_id == value['category_id']:
+ return value['assignments']
+ else:
+ logger.warning("'object_id' or 'category_id' or'assignments'"
+ " keys are not found in object_assignments")
+ return []
+
+ def add_object_assignment(self, policy_id, perimeter_id, category_id, data_id):
+ self.__check_policies([policy_id])
+ for key, value in self.__object_assignments.get(policy_id, {}).items():
+ if all(k in value for k in ("object_id", "category_id", "assignments")):
+ if perimeter_id == value['object_id'] and category_id == value['category_id']:
+ if data_id not in value['assignments']:
+ value['assignments'].append(data_id)
+ return value['assignments']
+ else:
+ logger.warning("'object_id' or 'category_id' or 'assignments'"
+ " keys are not found in object_assignments")
+ value = {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "object_id": perimeter_id,
+ "category_id": category_id,
+ "assignments": [data_id, ],
+ }
+ if policy_id not in self.__object_assignments:
+ self.__object_assignments[policy_id] = {}
+ self.__object_assignments[policy_id][value["id"]] = value
+ return value
+
+ def delete_object_assignment(self, policy_id=None, perimeter_id=None,
+ category_id=None, data_id=None):
+ if not policy_id and not perimeter_id and not category_id and not data_id:
+ self.__object_assignments = {}
+ return
+ self.__check_policies([policy_id])
+ for key, value in self.__object_assignments[policy_id].items():
+ if all(k in value for k in ("object_id", "category_id", "assignments")):
+ if perimeter_id == value['object_id'] and category_id == value['category_id']:
+ try:
+ value['assignments'].remove(data_id)
+ except ValueError:
+ pass
+ return value['assignments']
+ else:
+ logger.warning("'object_id' or 'category_id' or 'assignments'"
+ " keys are not found in object_assignments")
+ return []
+
+ @property
+ def action_assignments(self):
+ """
+ Action Assignments
+ :return: a dictionary
+ """
+ return self.__action_assignments
+
+ def __update_action_assignments(self, policy_id, perimeter_id=None):
+ """
+ Update all assignments for a specific perimeter
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :return: None
+ """
+ if perimeter_id:
+ response = requests.get("{}/policies/{}/action_assignments/{}".format(
+ self.manager_url, policy_id, perimeter_id), headers=self.headers)
+ else:
+ response = requests.get("{}/policies/{}/action_assignments".format(
+ self.manager_url, policy_id), headers=self.headers)
+
+ if 'action_assignments' in response.json():
+ if policy_id not in self.__action_assignments:
+ self.__action_assignments[policy_id] = {}
+
+ self.__action_assignments[policy_id] = response.json()['action_assignments']
+ else:
+ raise exceptions.ActionAssignmentUnknown(
+ "Cannot find action assignment within policy_id {}".format(policy_id))
+
+ def get_action_assignments(self, policy_id, perimeter_id, category_id):
+ """
+ Get all subject assignments for a specific perimeter ID and in a specific category ID
+ :param policy_id: the policy ID
+ :param perimeter_id: the perimeter ID
+ :param category_id: the category ID
+ :return: a dictionary
+ """
+ if not policy_id:
+ raise exceptions.PolicyUnknown("Cannot find policy within policy_id {}".format(
+ policy_id))
+
+ if self.manager_url:
+ # FIXME: this should be not done automatically (performance consuming)
+ self.__update_action_assignments(policy_id, perimeter_id)
+
+ for key, value in self.action_assignments[policy_id].items():
+ if all(k in value for k in ("action_id", "category_id", "assignments")):
+ if perimeter_id == value['action_id'] and category_id == value['category_id']:
+ return value['assignments']
+ else:
+ logger.warning("'action_id' or 'category_id' or'assignments'"
+ " keys are not found in action_assignments")
+ return []
+
+ def add_action_assignment(self, policy_id, perimeter_id, category_id, data_id):
+ self.__check_policies([policy_id])
+ for key, value in self.__action_assignments.get(policy_id, {}).items():
+ if all(k in value for k in ("action_id", "category_id", "assignments")):
+ if perimeter_id == value['action_id'] and category_id == value['category_id']:
+ if data_id not in value['assignments']:
+ value['assignments'].append(data_id)
+ return value['assignments']
+ else:
+ logger.warning("'action_id' or 'category_id' or 'assignments'"
+ " keys are not found in action_assignments")
+ value = {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "action_id": perimeter_id,
+ "category_id": category_id,
+ "assignments": [data_id, ],
+ }
+ if policy_id not in self.__action_assignments:
+ self.__action_assignments[policy_id] = {}
+ self.__action_assignments[policy_id][value["id"]] = value
+ return value
+
+ def delete_action_assignment(self, policy_id=None, perimeter_id=None,
+ category_id=None, data_id=None):
+ if not policy_id and not perimeter_id and not category_id and not data_id:
+ self.__action_assignments = {}
+ return
+ self.__check_policies([policy_id])
+ for key, value in self.__action_assignments[policy_id].items():
+ if all(k in value for k in ("action_id", "category_id", "assignments")):
+ if perimeter_id == value['action_id'] and category_id == value['category_id']:
+ try:
+ value['assignments'].remove(data_id)
+ except ValueError:
+ pass
+ return value['assignments']
+ else:
+ logger.warning("'action_id' or 'category_id' or 'assignments'"
+ " keys are not found in action_assignments")
+ return []
+
+ # category functions
+
+ @property
+ def subject_categories(self):
+ """
+ Subject Categories
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__SUBJECT_CATEGORIES_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__SUBJECT_CATEGORIES_UPDATE = current_time
+ self.__update_subject_categories()
+ self.__SUBJECT_CATEGORIES_UPDATE = current_time
+ return self.__subject_categories
+
+ def add_subject_category(self, value):
+ _id = uuid4().hex
+ self.__subject_categories[_id] = dict(value)
+
+ def delete_subject_category(self, category_id):
+ self.__subject_categories.pop(category_id)
+
+ def update_subject_category(self, category_id, value):
+ self.__subject_categories[category_id] = dict(value)
+
+ def __update_subject_categories(self):
+ """
+ Update all subject categories
+ :return: None
+ """
+ response = requests.get("{}/subject_categories".format(self.manager_url),
+ headers=self.headers)
+
+ if 'subject_categories' in response.json():
+ self.__subject_categories.update(response.json()['subject_categories'])
+ else:
+ raise exceptions.SubjectCategoryUnknown("Cannot find subject category")
+
+ @property
+ def object_categories(self):
+ """
+ Object Categories
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__OBJECT_CATEGORIES_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__OBJECT_CATEGORIES_UPDATE = current_time
+ self.__update_object_categories()
+ self.__OBJECT_CATEGORIES_UPDATE = current_time
+ return self.__object_categories
+
+ def add_object_category(self, value):
+ _id = uuid4().hex
+ self.__object_categories[_id] = dict(value)
+
+ def delete_object_category(self, category_id):
+ self.__object_categories.pop(category_id)
+
+ def update_object_category(self, category_id, value):
+ self.__object_categories[category_id] = dict(value)
+
+ def __update_object_categories(self):
+ """
+ Update all object categories
+ :return: None
+ """
+ response = requests.get("{}/object_categories".format(self.manager_url),
+ headers=self.headers)
+
+ if 'object_categories' in response.json():
+ self.__object_categories.update(response.json()['object_categories'])
+ else:
+ raise exceptions.ObjectCategoryUnknown("Cannot find object category")
+
+ @property
+ def action_categories(self):
+ """
+ Action Categories
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__ACTION_CATEGORIES_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__ACTION_CATEGORIES_UPDATE = current_time
+ self.__update_action_categories()
+ self.__ACTION_CATEGORIES_UPDATE = current_time
+ return self.__action_categories
+
+ def add_action_category(self, value):
+ _id = uuid4().hex
+ self.__action_categories[_id] = dict(value)
+
+ def delete_action_category(self, category_id):
+ self.__action_categories.pop(category_id)
+
+ def update_action_category(self, category_id, value):
+ self.__action_categories[category_id] = dict(value)
+
+ def __update_action_categories(self):
+ """
+ Update all action categories
+ :return: None
+ """
+ response = requests.get("{}/action_categories".format(self.manager_url),
+ headers=self.headers)
+
+ if 'action_categories' in response.json():
+ self.__action_categories.update(response.json()['action_categories'])
+ else:
+ raise exceptions.ActionCategoryUnknown("Cannot find action category")
+
+ # PDP functions
+
+ def __update_pdp(self, uuid=None):
+ """
+ Update one or all PDP
+ :param uuid: the PDP ID to update
+ :return: None
+ """
+ if not uuid:
+ response = requests.get("{}/pdp".format(self.manager_url), headers=self.headers)
+ else:
+ response = requests.get("{}/pdp/{}".format(self.manager_url, uuid),
+ headers=self.headers)
+ try:
+ pdp = response.json()
+ except Exception as e:
+ logger.error("Got an error from the server: {}".format(response.content))
+ raise e
+ if 'pdps' in pdp:
+ self.__pdp = copy.deepcopy(pdp["pdps"])
+
+ else:
+ logger.error("Receive bad response from manager: {}".format(pdp))
+ raise exceptions.DataContentError("Cannot find 'pdps' key")
+
+ @property
+ def pdp(self):
+ """Policy Decision Point
+ Example of content:
+ {
+ "pdp_id": {
+ "vim_project_id": "vim_project_id",
+ "name": "pdp1",
+ "description": "test",
+ "security_pipeline": [
+ "policy_id"
+ ]
+ }
+ }
+
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__PDP_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__PDP_UPDATE = current_time
+ self.__update_pdp()
+ self.__PDP_UPDATE = current_time
+ return self.__pdp
+
+ def add_pdp(self, pdp_id=None, data=None):
+ if not pdp_id:
+ pdp_id = uuid4().hex
+ self.__pdp[pdp_id] = data
+
+ def delete_pdp(self, pdp_id):
+ self.__pdp.pop(pdp_id)
+
+ # policy functions
+ def __update_policies(self, pdp_id=None):
+ """
+ Update all policies
+ :param pdp_id: the PDP ID (if not given, update all policies)
+ :return: None
+ """
+ response = requests.get("{}/policies".format(self.manager_url), headers=self.headers)
+ policies = response.json()
+
+ if 'policies' in policies:
+ for key, value in policies["policies"].items():
+ if not pdp_id or (pdp_id and key in self.__pdp.get("security_pipeline", [])):
+ self.__policies[key] = value
+ else:
+ raise exceptions.PolicyContentError("Cannot find 'policies' key")
+
+ @property
+ def policies(self):
+ """
+ Policies
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__POLICIES_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__POLICIES_UPDATE = current_time
+ self.__update_policies()
+ self.__POLICIES_UPDATE = current_time
+ return self.__policies
+
+ def add_policy(self, value):
+ _id = value.get("id", uuid4().hex)
+ self.__policies[_id] = dict(value)
+ return {_id: self.__policies[_id]}
+
+ def delete_policy(self, policy_id):
+ self.__policies.pop(policy_id)
+
+ def update_policy(self, policy_id, value):
+ self.__policies[policy_id] = dict(value)
+
+ # model functions
+
+ def __update_models(self):
+ """
+ Update all models
+ :return: None
+ """
+ response = requests.get("{}/models".format(self.manager_url), headers=self.headers)
+ models = response.json()
+ if 'models' in models:
+ for key, value in models["models"].items():
+ self.__models[key] = value
+ else:
+ raise exceptions.DataContentError("Cannot find 'models' key")
+
+ @property
+ def models(self):
+ """
+ Models
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__MODELS_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__MODELS_UPDATE = current_time
+ self.__update_models()
+ self.__MODELS_UPDATE = current_time
+ return self.__models
+
+ def add_model(self, value):
+ _id = value.get("id", uuid4().hex)
+ if "meta_rules" not in value:
+ value["meta_rules"] = []
+ self.__models[_id] = dict(value)
+ return {_id: self.__models[_id]}
+
+ def delete_model(self, model_id):
+ self.__models.pop(model_id)
+
+ def update_model(self, model_id, value):
+ self.__models[model_id] = dict(value)
+
+ # helper functions
+
+ def get_policy_from_meta_rules(self, meta_rule_id):
+ """
+ Get the policy ID with the given meta rule ID
+ :param meta_rule_id: the meta rule ID
+ :return: a policy ID
+ """
+ for pdp_key, pdp_value in self.pdp.items():
+ if "security_pipeline" in pdp_value:
+ for policy_id in pdp_value["security_pipeline"]:
+ if policy_id in self.policies and "model_id" in self.policies[policy_id]:
+ model_id = self.policies[policy_id]["model_id"]
+ if model_id in self.models and "meta_rules" in self.models[model_id]:
+ if meta_rule_id in self.models[model_id]["meta_rules"]:
+ return policy_id
+ else:
+ logger.warning(
+ "Cannot find model_id: {} within "
+ "models and 'meta_rules' key".format(model_id))
+ else:
+ logger.warning(
+ "Cannot find policy_id: {} "
+ "within policies and 'model_id' key".format(
+ policy_id))
+ else:
+ logger.warning("Cannot find 'security_pipeline' "
+ "key within pdp ")
+
+ def get_meta_rule_ids_from_pdp_value(self, pdp_value):
+ """
+ Get the meta rule ID given the content of a PDP
+ :param pdp_value: the content of the PDP
+ :return: a meta rule ID
+ """
+ meta_rules = []
+ if "security_pipeline" in pdp_value:
+ for policy_id in pdp_value["security_pipeline"]:
+ if policy_id not in self.policies or "model_id" not in self.policies[policy_id]:
+ raise exceptions.PolicyUnknown("Cannot find 'models' key")
+ model_id = self.policies[policy_id]["model_id"]
+ if model_id not in self.models or 'meta_rules' not in self.models[model_id]:
+ raise exceptions.DataContentError("Cannot find 'models' key")
+ for meta_rule in self.models[model_id]["meta_rules"]:
+ meta_rules.append(meta_rule)
+ return meta_rules
+ raise exceptions.PdpContentError
+
+ def get_pdp_from_vim_project(self, vim_project_id):
+ """
+ Get the PDP ID given the VIM project ID
+ :param vim_project_id: the VIM project ID
+ :return: the PDP ID
+ """
+ for pdp_key, pdp_value in self.pdp.items():
+ if "vim_project_id" in pdp_value and \
+ vim_project_id == pdp_value["vim_project_id"]:
+ return pdp_key
+
+ def get_vim_project_id_from_policy_id(self, policy_id):
+ """
+ Get the VIM project ID given the policy ID
+ :param policy_id: the policy ID
+ :return: the VIM project ID
+ """
+ for pdp_key, pdp_value in self.pdp.items():
+ if "security_pipeline" in pdp_value and \
+ "vim_project_id" in pdp_value:
+ if policy_id in pdp_value["security_pipeline"]:
+ return pdp_value["vim_project_id"]
+ else:
+ logger.warning(" 'security_pipeline','vim_project_id' "
+ "key not in pdp {}".format(pdp_value))
+
+ def get_pdp_id_from_policy_id(self, policy_id):
+ """
+ Get the PDP ID given the policy ID
+ :param policy_id: the policy ID
+ :return: the PDP ID
+ """
+ for _pdp_id in self.pdp:
+ if policy_id in self.__pdp.get(_pdp_id).get("security_pipeline"):
+ return _pdp_id
+
+ def get_vim_project_id_from_pdp_id(self, pdp_id):
+ """
+ Get the VIM project ID given the PDP ID
+ :param pdp_id: the PDP ID
+ :return: the VIM project ID
+ """
+ if pdp_id in self.pdp:
+ pdp_value = self.pdp.get(pdp_id)
+ if "security_pipeline" in pdp_value and \
+ "vim_project_id" in pdp_value:
+ return pdp_value["vim_project_id"]
+ logger.warning("Unknown PDP ID".format(pdp_id))
+
+ # pipelines functions
+
+ @property
+ def pipelines(self):
+ """
+ Pipelines
+ :return: a dictionary
+ """
+ return self.__pipelines
+
+ def add_pipeline(self, pipeline_id=None, data=None):
+ if not pipeline_id:
+ pipeline_id = uuid4().hex
+ self.__pipelines[pipeline_id] = data
+
+ def delete_pipeline(self, pipeline_id=None):
+ self.__pipelines.pop(pipeline_id)
+
+ def __update_pipelines(self, pdp_id=None):
+ """
+ Update all pipelines
+ :param pdp_id: the PDP ID
+ :return: None
+ """
+ headers = {
+ 'x-api-key': self.__CURRENT_SERVER_API_KEY
+ }
+ req = requests.get("{}/pdp".format(self.manager_url), headers=self.headers)
+ pdps = req.json().get("pdps", {})
+ for _pdp_id in pdps:
+ if pdp_id and pdp_id != _pdp_id:
+ continue
+ for policy_id in pdps[_pdp_id].get("security_pipeline", []):
+ _policy = requests.get("{}/policies/{}".format(self.manager_url, policy_id),
+ headers=self.headers)
+ req = requests.get("{}/pipelines".format(self.__CURRENT_SERVER),
+ headers=headers)
+ _pipelines = req.json().get('pipelines', {})
+ self.__pipelines[_pdp_id] = {
+ "pdp_id": _pdp_id,
+ "vim_project_id": pdps[_pdp_id].get("vim_project_id", ""),
+ "protocol": _pipelines[_pdp_id].get("protocol", "http"),
+ "host": _pipelines[_pdp_id].get("server_ip", "127.0.0.1"),
+ "port": _pipelines[_pdp_id].get("port", "8000"),
+ }
+
+ def get_pipeline_id_from_project_id(self, project_id):
+ """
+ Retrieve the pipeline ID from the project ID
+ :param project_id: the VIM project ID
+ :return: a pipeline_id
+ """
+ for _pdp_id in self.pdp:
+ if self.__pdp.get(_pdp_id).get("vim_project_id") == project_id:
+ return _pdp_id
+ # try:
+ # return self.__pdp.get(_pdp_id).get("security_pipeline")[0]
+ # except IndexError:
+ # return
+
+ def get_pipeline_url(self, project_id=None, pipeline_id=None, pdp_id=None):
+ """
+ Retrieve the URL of the pipeline
+ :param project_id: the VIM project ID
+ :param pipeline_id: the pipeline ID
+ :param pdp_id: the PDP ID
+ :return: the URL
+ """
+ self.__update_pdp()
+ if pdp_id:
+ return "{proto}://{host}:{port}".format(
+ proto=self.__pipelines[pdp_id].get("protocol", "http"),
+ host=self.__pipelines[pdp_id].get("host", "127.0.0.1"),
+ port=self.__pipelines[pdp_id].get("port", "8000"),
+ )
+ if project_id:
+ for _pdp_id in self.__pdp:
+ if self.__pdp.get(_pdp_id).get("vim_project_id") == project_id:
+ return "{proto}://{host}:{port}".format(
+ proto=self.__pipelines[_pdp_id].get("protocol", "http"),
+ host=self.__pipelines[_pdp_id].get("host", "127.0.0.1"),
+ port=self.__pipelines[_pdp_id].get("port", "8000"),
+ )
+ if pipeline_id and pipeline_id in self.pipelines:
+ return "{proto}://{host}:{port}".format(
+ proto=self.__pipelines[pipeline_id].get("protocol", "http"),
+ host=self.__pipelines[pipeline_id].get("host", "127.0.0.1"),
+ port=self.__pipelines[pipeline_id].get("port", "8000"),
+ )
+
+ def get_api_key(self, project_id=None, pipeline_id=None, pdp_id=None):
+ """
+ Retrieve the API ky of the pipeline
+ :param project_id: the VIM project ID
+ :param pipeline_id: the pipeline ID
+ :param pdp_id: the PDP ID
+ :return: the URL
+ """
+ self.__update_pdp()
+ if pdp_id:
+ return self.__pipelines[pdp_id].get("api_key", "")
+ if project_id:
+ for _pdp_id in self.__pdp:
+ if self.__pdp.get(_pdp_id).get("vim_project_id") == project_id:
+ return self.__pipelines[_pdp_id].get("api_key", "")
+ if pipeline_id and pipeline_id in self.pipelines:
+ return self.__pipelines[pipeline_id].get("api_key", "")
+
+ # security_functions functions
+
+ @property
+ def security_functions(self):
+ """
+ Security Functions
+ :return: a dictionary
+ """
+ if self.manager_url:
+ current_time = time.time()
+ if self.__SECURITY_FUNCTIONS_UPDATE + self.__UPDATE_INTERVAL < current_time:
+ self.__SECURITY_FUNCTIONS_UPDATE = current_time
+ self.__update_security_functions()
+ self.__SECURITY_FUNCTIONS_UPDATE = current_time
+ return self.__security_functions
+
+ def __update_security_functions(self):
+ """
+ Update security functions
+ :return: None
+ """
+ req = requests.get("{}/policies".format(self.manager_url), headers=self.headers)
+ for key in req.json():
+ self.__security_functions[key] = req.json()[key]
+
+ @property
+ def subject_data(self):
+ """Subject Data
+ :return: a dictionary"""
+ return self.__subject_data
+
+ def add_subject_data(self, policy_id, category_id, data):
+ for index, value in enumerate(self.__subject_data):
+ if policy_id == value["policy_id"] and category_id == value["category_id"]:
+ self.__subject_data[index]["data"][data.get('id', uuid4().hex)] = data
+ return self.__subject_data[index]
+ else:
+ _id = data.get('id', uuid4().hex)
+ data['id'] = _id
+ value = {
+ "policy_id": policy_id,
+ "category_id": category_id,
+ "data": {
+ _id: data
+ }
+ }
+ self.__subject_data.append(value)
+ return value
+
+ def delete_subject_data(self, policy_id=None, category_id=None, data_id=None):
+ if not policy_id and not category_id and not data_id:
+ self.__subject_data = []
+ for index, value in enumerate(self.__subject_data):
+ if policy_id == value["policy_id"] and category_id == value["category_id"]:
+ self.__subject_data[index]["data"].pop(data_id)
+
+ @property
+ def object_data(self):
+ """Object Data
+ :return: a dictionary"""
+ return self.__object_data
+
+ def add_object_data(self, policy_id, category_id, data):
+ for index, value in enumerate(self.__object_data):
+ if policy_id == value["policy_id"] and category_id == value["category_id"]:
+ self.__object_data[index]["data"][data.get('id', uuid4().hex)] = data
+ return self.__object_data[index]
+ else:
+ _id = data.get('id', uuid4().hex)
+ data['id'] = _id
+ value = {
+ "policy_id": policy_id,
+ "category_id": category_id,
+ "data": {
+ _id: data
+ }
+ }
+ self.__object_data.append(value)
+ return value
+
+ def delete_object_data(self, policy_id=None, category_id=None, data_id=None):
+ if not policy_id and not category_id and not data_id:
+ self.__object_data = []
+ for index, value in enumerate(self.__object_data):
+ if policy_id == value["policy_id"] and category_id == value["category_id"]:
+ self.__object_data[index]["data"].pop(data_id)
+
+ @property
+ def action_data(self):
+ """Action Data
+ :return: a dictionary"""
+ return self.__action_data
+
+ def add_action_data(self, policy_id, category_id, data):
+ for index, value in enumerate(self.__action_data):
+ if policy_id == value["policy_id"] and category_id == value["category_id"]:
+ self.__action_data[index]["data"][data.get('id', uuid4().hex)] = data
+ return self.__action_data[index]
+ else:
+ _id = data.get('id', uuid4().hex)
+ data['id'] = _id
+ value = {
+ "policy_id": policy_id,
+ "category_id": category_id,
+ "data": {
+ _id: data
+ }
+ }
+ self.__action_data.append(value)
+ return value
+
+ def delete_action_data(self, policy_id=None, category_id=None, data_id=None):
+ if not policy_id and not category_id and not data_id:
+ self.__action_data = []
+ for index, value in enumerate(self.__action_data):
+ if policy_id == value["policy_id"] and category_id == value["category_id"]:
+ self.__action_data[index]["data"].pop(data_id)
+
+
diff --git a/moon_cache/moon_cache/context.py b/moon_cache/moon_cache/context.py
new file mode 100644
index 00000000..e1a33a07
--- /dev/null
+++ b/moon_cache/moon_cache/context.py
@@ -0,0 +1,345 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import copy
+import logging
+from uuid import uuid4
+from moon_utilities import exceptions
+
+logger = logging.getLogger("moon.utilities." + __name__)
+
+
+class Context:
+
+ def __init__(self, init_context, cache):
+ if init_context is None:
+ raise Exception("Invalid context content object")
+
+ self.cache = cache
+ self.__current_request = None
+ self.__request_id = None
+ self.__meta_rule_ids = None
+ self.__pdp_set = {}
+ self.__index = -1
+ self.__pdp_id = init_context.get("pdp_id")
+
+ if self.__pdp_id:
+ self.__pdp_value = copy.deepcopy(self.cache.pdp[self.__pdp_id])
+ else:
+ self.__pdp_id = uuid4().hex
+ self.__pdp_value = self.__build_pdp()
+ self.cache.add_pdp(self.__pdp_id, self.__pdp_value)
+
+ self.__subject = init_context.get("subject_name")
+ self.__object = init_context.get("object_name")
+ self.__action = init_context.get("action_name")
+ self.__request_id = init_context.get("req_id")
+
+ self.__meta_rule_ids = self.cache.get_meta_rule_ids_from_pdp_value(self.__pdp_value)
+ self.__meta_rules = self.cache.meta_rules
+
+ def __build_pdp(self):
+ _pdp = {
+ 'name': 'abstract_pdp',
+ 'description': '',
+ 'vim_project_id': 'default',
+ 'security_pipeline': []
+ }
+ policy_id = list(self.cache.policies.keys())[0]
+ _pdp['security_pipeline'] = [policy_id]
+ return _pdp
+
+ def delete_cache(self):
+ self.cache = {}
+
+ def set_cache(self, cache):
+ self.cache = cache
+
+ def increment_index(self):
+ self.__index += 1
+ self.__init_current_request()
+ self.__init_pdp_set()
+
+ @property
+ def current_state(self):
+ self.__validate_meta_rule_content(self.__pdp_set[self.__meta_rule_ids[self.__index]])
+ return self.__pdp_set[self.__meta_rule_ids[self.__index]]['effect']
+
+ @current_state.setter
+ def current_state(self, state):
+ if state not in ("grant", "deny", "passed"):
+ state = "passed"
+ self.__validate_meta_rule_content(self.__pdp_set[self.__meta_rule_ids[self.__index]])
+ self.__pdp_set[self.__meta_rule_ids[self.__index]]['effect'] = state
+
+ @current_state.deleter
+ def current_state(self):
+ self.__validate_meta_rule_content(self.__pdp_set[self.__meta_rule_ids[self.__index]])
+ self.__pdp_set[self.__meta_rule_ids[self.__index]]['effect'] = "unset"
+
+ @property
+ def current_policy_id(self):
+ if "security_pipeline" not in self.__pdp_value:
+ raise exceptions.AuthzException('Cannot find security_pipeline key within pdp.')
+ return self.__pdp_value["security_pipeline"][self.__index]
+
+ @current_policy_id.setter
+ def current_policy_id(self, value):
+ pass
+
+ @current_policy_id.deleter
+ def current_policy_id(self):
+ pass
+
+ def __init_current_request(self):
+ if "security_pipeline" not in self.__pdp_value:
+ raise exceptions.PdpContentError
+ self.__subject = self.cache.get_subject(
+ self.__pdp_value["security_pipeline"][self.__index],
+ self.__subject)
+ self.__object = self.cache.get_object(
+ self.__pdp_value["security_pipeline"][self.__index],
+ self.__object)
+ self.__action = self.cache.get_action(
+ self.__pdp_value["security_pipeline"][self.__index],
+ self.__action)
+ self.__current_request = dict(self.initial_request)
+
+ def __init_pdp_set(self):
+ for meta_rule_id in self.__meta_rule_ids:
+ self.__pdp_set[meta_rule_id] = dict()
+ self.__pdp_set[meta_rule_id]["meta_rules"] = self.__meta_rules[meta_rule_id]
+ self.__pdp_set[meta_rule_id]["target"] = self.__add_target(meta_rule_id)
+ self.__pdp_set[meta_rule_id]["effect"] = "unset"
+ self.__pdp_set["effect"] = "deny"
+
+ def update_target(self):
+ # FIXME: not used...
+ for meta_rule_id in self.__meta_rule_ids:
+ result = dict()
+ _subject = self.__current_request["subject"]
+ _object = self.__current_request["object"]
+ _action = self.__current_request["action"]
+
+ meta_rules = self.cache.meta_rules
+ policy_id = self.cache.get_policy_from_meta_rules(meta_rule_id)
+
+ if 'subject_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'subject_categories' key not found ")
+
+ self.cache.update_assignments(policy_id)
+
+ for sub_cat in meta_rules[meta_rule_id]['subject_categories']:
+ if sub_cat not in result:
+ result[sub_cat] = []
+ result[sub_cat].extend(
+ self.cache.get_subject_assignments(policy_id, _subject, sub_cat))
+
+ if 'object_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'object_categories' key not found ")
+
+ for obj_cat in meta_rules[meta_rule_id]['object_categories']:
+ if obj_cat not in result:
+ result[obj_cat] = []
+ result[obj_cat].extend(
+ self.cache.get_object_assignments(policy_id, _object, obj_cat))
+
+ if 'action_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'action_categories' key not found ")
+
+ for act_cat in meta_rules[meta_rule_id]['action_categories']:
+ if act_cat not in result:
+ result[act_cat] = []
+ result[act_cat].extend(
+ self.cache.get_action_assignments(policy_id, _action, act_cat))
+
+ self.__pdp_set[meta_rule_id]["target"] = result
+
+ def __add_target(self, meta_rule_id):
+ """build target from meta_rule
+
+ Target is dict of categories as keys ; and the value of each category
+ will be a list of assignments
+
+ """
+ result = dict()
+ _subject = self.__current_request["subject"]
+ _object = self.__current_request["object"]
+ _action = self.__current_request["action"]
+
+ meta_rules = self.cache.meta_rules
+ policy_id = self.cache.get_policy_from_meta_rules(meta_rule_id)
+
+ if 'subject_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'subject_categories' key not found ")
+
+ for sub_cat in meta_rules[meta_rule_id]['subject_categories']:
+ if sub_cat not in result:
+ result[sub_cat] = []
+ if sub_cat.startswith("attributes:"):
+ result[sub_cat].append(
+ "attributes:" +
+ self.cache.attributes.get(sub_cat.replace("attributes:", ""), []))
+ else:
+ result[sub_cat].extend(
+ self.cache.get_subject_assignments(policy_id, _subject, sub_cat))
+
+ if 'object_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'object_categories' key not found ")
+
+ for obj_cat in meta_rules[meta_rule_id]['object_categories']:
+ if obj_cat not in result:
+ result[obj_cat] = []
+ if obj_cat.startswith("attributes:"):
+ result[obj_cat].append(
+ "attributes:" +
+ self.cache.attributes.get(obj_cat.replace("attributes:", ""), []))
+ else:
+ result[obj_cat].extend(
+ self.cache.get_object_assignments(policy_id, _object, obj_cat))
+
+ if 'action_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'action_categories' key not found ")
+
+ for act_cat in meta_rules[meta_rule_id]['action_categories']:
+ if act_cat not in result:
+ result[act_cat] = []
+ if act_cat.startswith("attributes:"):
+ result[act_cat].append(
+ "attributes:" +
+ self.cache.attributes.get(act_cat.replace("attributes:", ""), []))
+ else:
+ result[act_cat].extend(
+ self.cache.get_action_assignments(policy_id, _action, act_cat))
+
+ return result
+
+ def __repr__(self):
+ return """PDP ID: {id}
+current_request: {current_request}
+request_id: {request_id}
+index: {index}
+headers: {headers}
+pdp_set: {pdp_set}
+ """.format(
+ id=self.__pdp_id,
+ current_request=self.__current_request,
+ request_id=self.__request_id,
+ headers=self.__meta_rule_ids,
+ pdp_set=self.__pdp_set,
+ index=self.__index
+ )
+
+ def to_dict(self):
+ return {
+ "initial_request": copy.deepcopy(self.initial_request),
+ "current_request": copy.deepcopy(self.__current_request),
+ "headers": copy.deepcopy(self.__meta_rule_ids),
+ "index": copy.deepcopy(self.__index),
+ "pdp_set": copy.deepcopy(self.__pdp_set),
+ "request_id": copy.deepcopy(self.__request_id),
+ # "manager_url": copy.deepcopy(self.__manager_url),
+ # "interface_name": copy.deepcopy(self.__interface_name),
+ }
+
+ @property
+ def request_id(self):
+ return self.__request_id
+
+ @request_id.setter
+ def request_id(self, value):
+ raise Exception("You cannot update the request_id")
+
+ @request_id.deleter
+ def request_id(self):
+ raise Exception("You cannot update the request_id")
+
+ @property
+ def initial_request(self):
+ return {
+ "subject": self.__subject,
+ "object": self.__object,
+ "action": self.__action,
+ }
+
+ @initial_request.setter
+ def initial_request(self, value):
+ raise Exception("You are not allowed to update the initial_request")
+
+ @initial_request.deleter
+ def initial_request(self):
+ raise Exception("You are not allowed to delete the initial_request")
+
+ @property
+ def current_request(self):
+ if not self.__current_request:
+ self.__current_request = dict(self.initial_request)
+ return self.__current_request
+
+ @current_request.setter
+ def current_request(self, value):
+
+ self.__current_request = copy.deepcopy(value)
+ # Note (asteroide): if the current request is modified,
+ # we must update the PDP Set.
+ self.__init_pdp_set()
+
+ @current_request.deleter
+ def current_request(self):
+ self.__current_request = {}
+ self.__pdp_set = {}
+
+ '''
+ [Note ] Refactor name of headers to meta_rule_ids done ,
+ may need to refactor getter and setter of headers
+ '''
+
+ @property
+ def headers(self):
+ return self.__meta_rule_ids
+
+ @headers.setter
+ def headers(self, meta_rule_ids):
+ self.__meta_rule_ids = meta_rule_ids
+
+ @headers.deleter
+ def headers(self):
+ self.__meta_rule_ids = list()
+
+ @property
+ def index(self):
+ return self.__index
+
+ @index.setter
+ def index(self, index):
+ self.__index += 1
+
+ @index.deleter
+ def index(self):
+ self.__index = -1
+
+ @property
+ def pdp_set(self):
+ return self.__pdp_set
+
+ @pdp_set.setter
+ def pdp_set(self, value):
+ raise Exception("You are not allowed to modify the pdp_set")
+
+ @pdp_set.deleter
+ def pdp_set(self):
+ self.__pdp_set = {}
+
+ @staticmethod
+ def __validate_meta_rule_content(meta_rules):
+ if 'effect' not in meta_rules:
+ raise exceptions.PdpContentError("effect not in meta_rules")
diff --git a/moon_cache/moon_cache/request_wrapper.py b/moon_cache/moon_cache/request_wrapper.py
new file mode 100644
index 00000000..4b94507a
--- /dev/null
+++ b/moon_cache/moon_cache/request_wrapper.py
@@ -0,0 +1,35 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import sys
+import requests
+from moon_utilities import exceptions
+
+
+def get(url, **kwarg):
+ try:
+ response = requests.get(url, **kwarg)
+ except requests.exceptions.RequestException as _exc:
+ raise exceptions.MoonError("request failure ", _exc)
+ except Exception as _exc:
+ raise exceptions.MoonError("Unexpected error ", _exc)
+ return response
+
+
+def put(url, json="", **kwarg):
+ try:
+ response = requests.put(url, json=json, **kwarg)
+ except requests.exceptions.RequestException as _exc:
+ raise exceptions.MoonError("request failure ", _exc)
+ except Exception as _exc:
+ raise exceptions.MoonError("Unexpected error ", _exc)
+ return response
diff --git a/moon_cache/requirements.txt b/moon_cache/requirements.txt
new file mode 100644
index 00000000..f2293605
--- /dev/null
+++ b/moon_cache/requirements.txt
@@ -0,0 +1 @@
+requests
diff --git a/moon_cache/setup.py b/moon_cache/setup.py
new file mode 100644
index 00000000..2a116ef2
--- /dev/null
+++ b/moon_cache/setup.py
@@ -0,0 +1,51 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from setuptools import setup, find_packages
+import moon_cache
+
+with open('requirements.txt') as f:
+ required = list(filter(
+ lambda s: (len(s.strip()) > 0 and s.strip()[0] != '#'),
+ f.read().split('\n')))
+
+setup(
+
+ name='moon_cache',
+
+ version=moon_cache.__version__,
+
+ packages=find_packages(),
+
+ author='Thomas Duval',
+
+ author_email='thomas.duval@orange.com',
+
+ description='Some utilities for all the Moon components',
+
+ long_description=open('README.md').read(),
+
+ install_requires=required,
+
+ include_package_data=True,
+
+ url='',
+
+ classifiers=[
+ 'Programming Language :: Python :: 3',
+ 'Development Status :: 1 - Planning',
+ 'License :: OSI Approved',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ ],
+
+)
diff --git a/moon_cache/tests/unit_python/api/__init__.py b/moon_cache/tests/unit_python/api/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_cache/tests/unit_python/api/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_cache/tests/unit_python/api/test_attributes.py b/moon_cache/tests/unit_python/api/test_attributes.py
new file mode 100644
index 00000000..13bfc637
--- /dev/null
+++ b/moon_cache/tests/unit_python/api/test_attributes.py
@@ -0,0 +1,36 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def test_get_attribute_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'mode'
+ value = "run"
+ cache_obj.set_attribute(name=name)
+ assert cache_obj.attributes
+ assert cache_obj.attributes.get(name)
+ assert cache_obj.attributes.get(name) == "build"
+ cache_obj.set_attribute(name=name, value=value)
+ assert cache_obj.attributes
+ assert cache_obj.attributes.get(name)
+ # Note: it is the same value because the cache systematically request the Manager
+ assert cache_obj.attributes.get(name) == "build"
+
+
+def test_get_attribute_unknown(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'test'
+ assert cache_obj.attributes
+ assert not cache_obj.attributes.get(name)
+
diff --git a/moon_cache/tests/unit_python/api/test_cache.py b/moon_cache/tests/unit_python/api/test_cache.py
new file mode 100644
index 00000000..52efb4e0
--- /dev/null
+++ b/moon_cache/tests/unit_python/api/test_cache.py
@@ -0,0 +1,535 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import pytest
+import mock_repo.data as data_mock
+import mock_repo.urls as register_urls
+import requests
+import requests_mock
+from moon_utilities import exceptions
+
+
+def test_authz_request(configuration):
+ from moon_cache import cache
+ c = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ assert isinstance(c.authz_requests, dict)
+
+
+# ================================
+# tests for get (subject) in cache
+# ================================
+
+def test_get_subject_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'subject_name'
+ subject_id = cache_obj.get_subject(data_mock.shared_ids["policy"]["policy_id_1"], name)
+ assert subject_id is not None
+
+
+def test_get_subject_no_policy(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ cache_obj.get_subject(None, "")
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_get_subject_invalid_name(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'invalid name'
+ with pytest.raises(exceptions.SubjectUnknown) as exception_info:
+ cache_obj.get_subject(data_mock.shared_ids["policy"]["policy_id_1"], name)
+ assert str(exception_info.value) == '400: Subject Unknown'
+
+
+def test_get_subject_invalid_response(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'policy_id_invalid_response'
+ with pytest.raises(exceptions.SubjectUnknown) as exception_info:
+ cache_obj.get_subject(data_mock.shared_ids["policy"]["policy_id_invalid_response"], name)
+ assert str(exception_info.value) == '400: Subject Unknown'
+
+
+# ================================================
+# tests for get (object) in cache
+# ================================================
+
+def test_get_object_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'object_name'
+ object_id = cache_obj.get_object(data_mock.shared_ids["policy"]["policy_id_1"], name)
+ assert object_id is not None
+
+
+def test_get_object_no_policy(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ cache_obj.get_object(None, "")
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_get_object_invalid_name(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'invalid name'
+ with pytest.raises(exceptions.ObjectUnknown) as exception_info:
+ cache_obj.get_object(data_mock.shared_ids["policy"]["policy_id_1"], name)
+ assert str(exception_info.value) == '400: Object Unknown'
+
+
+def test_get_object_invalid_response(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'policy_id_invalid_response'
+ with pytest.raises(exceptions.ObjectUnknown) as exception_info:
+ cache_obj.get_object(data_mock.shared_ids["policy"]["policy_id_invalid_response"], name)
+ assert str(exception_info.value) == '400: Object Unknown'
+
+
+# ================================================
+# tests for get (action) in cache
+# ================================================
+
+def test_get_action_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'action_name'
+ action_id = cache_obj.get_action(data_mock.shared_ids["policy"]["policy_id_1"], name)
+ assert action_id is not None
+
+
+def test_get_action_no_policy(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ cache_obj.get_action(None, "")
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_get_action_invalid_name(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'invalid name'
+ with pytest.raises(exceptions.ActionUnknown) as exception_info:
+ cache_obj.get_action(data_mock.shared_ids["policy"]["policy_id_1"], name)
+ assert str(exception_info.value) == '400: Action Unknown'
+
+
+def test_get_action_invalid_response(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ name = 'policy_id_invalid_response'
+ with pytest.raises(exceptions.ActionUnknown) as exception_info:
+ cache_obj.get_action(data_mock.shared_ids["policy"]["policy_id_invalid_response"], name)
+ assert str(exception_info.value) == '400: Action Unknown'
+
+
+# ===========================================
+# tests for get (subject_assignment) in cache
+# ===========================================
+
+def test_get_subject_assignment_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ subject_assignments = cache_obj.get_subject_assignments(
+ data_mock.shared_ids["policy"]["policy_id_1"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert subject_assignments is not None
+
+
+def test_get_subject_assignment_no_policy(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ cache_obj.get_subject_assignments(None,
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_subject_assignment_invalid_subject_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/subject_assignments/{}'
+ .format(
+ configuration["management"]["url"],
+ data_mock.shared_ids["subject"]["invalid_subject_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'subject_assignments':
+ data_mock.subject_assignment_mock_invalid_subject_id
+ }
+ )
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ subject_assignments = cache_obj.get_subject_assignments(
+ data_mock.shared_ids["subject"]["invalid_subject_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(subject_assignments) == 0
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_subject_assignment_invalid_category_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/subject_assignments/{}'
+ .format(
+ configuration["management"]["url"],
+ data_mock.shared_ids["subject"]["invalid_category_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'subject_assignments':
+ data_mock.subject_assignment_mock_invalid_category_id
+ }
+ )
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ subject_assignments = cache_obj.get_subject_assignments(
+ data_mock.shared_ids["subject"]["invalid_category_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(subject_assignments) == 0
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_subject_assignment_invalid_assignment_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/subject_assignments/{}'
+ .format(
+ configuration["management"]["url"],
+ data_mock.shared_ids["subject"]["invalid_assignment_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'subject_assignments':
+ data_mock.subject_assignment_mock_invalid_assignment_id
+ }
+ )
+
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ subject_assignments = cache_obj.get_subject_assignments(
+ data_mock.shared_ids["subject"]["invalid_assignment_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(subject_assignments) == 0
+
+
+def test_get_subject_assignment_empty_perimeter(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ subject_assignments = cache_obj.get_subject_assignments(
+ data_mock.shared_ids["policy"]["policy_id_2"],
+ None,
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(subject_assignments) == 0
+
+
+def test_get_subject_assignment_invalid_category_failure(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ subject_assignments = cache_obj.get_subject_assignments(
+ data_mock.shared_ids["policy"]["policy_id_1"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["invalid_category_id_1"])
+ assert len(subject_assignments) == 0
+
+
+# ==========================================
+# tests for get (object_assignment) in cache
+# ==========================================
+
+def test_get_object_assignment_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ object_assignments = cache_obj.get_object_assignments(
+ data_mock.shared_ids["policy"]["policy_id_1"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_2"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert object_assignments is not None
+
+
+def test_get_object_assignment_no_policy(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ cache_obj.get_object_assignments(None,
+ data_mock.shared_ids["perimeter"]["perimeter_id_2"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_object_assignment_invalid_object_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/object_assignments/{}'
+ .format(configuration["management"]["url"],
+ data_mock.shared_ids["object"]["invalid_object_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'object_assignments':
+ data_mock.object_assignment_mock_invalid_object_id
+ }
+ )
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ object_assignments = cache_obj.get_object_assignments(
+ data_mock.shared_ids["object"]["invalid_object_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(object_assignments) == 0
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_object_assignment_invalid_category_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/object_assignments/{}'
+ .format(configuration["management"]["url"],
+ data_mock.shared_ids["object"]["invalid_category_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'object_assignments':
+ data_mock.object_assignment_mock_invalid_category_id
+ }
+ )
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ object_assignments = cache_obj.get_object_assignments(
+ data_mock.shared_ids["object"]["invalid_category_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(object_assignments) == 0
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_object_assignment_invalid_assignment_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/object_assignments/{}'
+ .format(configuration["management"]["url"],
+ data_mock.shared_ids["object"]["invalid_assignment_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'object_assignments':
+ data_mock.object_assignment_mock_invalid_assignment_id
+ }
+ )
+
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ object_assignments = cache_obj.get_object_assignments(
+ data_mock.shared_ids["object"]["invalid_assignment_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(object_assignments) == 0
+
+
+def test_get_object_assignment_none_perimeter(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ object_assignments = cache_obj.get_object_assignments(
+ data_mock.shared_ids["policy"]["policy_id_2"],
+ None,
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(object_assignments) == 0
+
+
+def test_get_object_assignment_invalid_category_failure(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ object_assignments = cache_obj.get_object_assignments(
+ data_mock.shared_ids["policy"]["policy_id_1"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_2"],
+ data_mock.shared_ids["category"]["invalid_category_id_1"])
+ assert len(object_assignments) == 0
+
+
+# ==========================================
+# tests for get (action_assignment) in cache
+# ==========================================
+
+def test_get_action_assignment_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ action_assignments = cache_obj.get_action_assignments(
+ data_mock.shared_ids["policy"]["policy_id_1"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_3"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert action_assignments is not None
+
+
+def test_get_action_assignment_no_policy(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ cache_obj.get_action_assignments(None,
+ data_mock.shared_ids["perimeter"]["perimeter_id_2"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_action_assignment_invalid_object_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/action_assignments/{}'
+ .format(configuration["management"]["url"],
+ data_mock.shared_ids["action"]["invalid_action_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'action_assignments':
+ data_mock.action_assignment_mock_invalid_action_id
+ }
+ )
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ action_assignments = cache_obj.get_action_assignments(
+ data_mock.shared_ids["action"]["invalid_action_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(action_assignments) == 0
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_action_assignment_invalid_category_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/action_assignments/{}'
+ .format(configuration["management"]["url"],
+ data_mock.shared_ids["action"]["invalid_category_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'action_assignments':
+ data_mock.action_assignment_mock_invalid_category_id
+ }
+ )
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ action_assignments = cache_obj.get_action_assignments(
+ data_mock.shared_ids["action"]["invalid_category_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(action_assignments) == 0
+
+
+@requests_mock.Mocker(kw='mock')
+def test_get_action_assignment_invalid_assignment_id(configuration, **kwargs):
+ from moon_cache import cache
+ kwargs['mock'].get('{}/policies/{}/action_assignments/{}'
+ .format(configuration["management"]["url"],
+ data_mock.shared_ids["action"]["invalid_assignment_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"]),
+ json={
+ 'action_assignments':
+ data_mock.action_assignment_mock_invalid_assignment_id
+ }
+ )
+
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ action_assignments = cache_obj.get_action_assignments(
+ data_mock.shared_ids["action"]["invalid_assignment_id"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_1"],
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(action_assignments) == 0
+
+
+def test_get_action_assignment_none_perimeter(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ action_assignments = cache_obj.get_action_assignments(
+ data_mock.shared_ids["policy"]["policy_id_2"],
+ None,
+ data_mock.shared_ids["category"]["category_id_1"])
+ assert len(action_assignments) == 0
+
+
+def test_get_action_assignment_invalid_category_failure(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration["management"]["url"])
+ action_assignments = cache_obj.get_action_assignments(
+ data_mock.shared_ids["policy"]["policy_id_1"],
+ data_mock.shared_ids["perimeter"]["perimeter_id_3"],
+ data_mock.shared_ids["category"]["invalid_category_id_1"])
+ assert len(action_assignments) == 0
+
+
+# ==================================
+# tests for helper function in cache
+# ==================================
+
+def test_get_policy_from_meta_rules_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ policy_id = cache_obj.get_policy_from_meta_rules(
+ data_mock.shared_ids["meta_rule"]["meta_rule_id_1"])
+ assert policy_id is not None
+
+
+''' tests for containers function , security pipeline in cache which not used for now
+ need to mock pdp object, /pods correctly
+'''
+
+
+def test_get_policy_from_meta_rules_failure(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ meta_rule_id = 'meta_rule_id3'
+ policy_id = cache_obj.get_policy_from_meta_rules(meta_rule_id)
+ assert policy_id is None
+
+
+def test_get_pdp_from_vim_project_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ vim_project_id = 'vim_project_id1'
+ pdp_key = cache_obj.get_pdp_from_vim_project(vim_project_id)
+ assert pdp_key is not None
+
+
+def test_get_pdp_from_vim_project_failure(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ vim_project_id = 'vim_project_id2'
+ pdp_key = cache_obj.get_pdp_from_vim_project(vim_project_id)
+ assert pdp_key is None
+
+
+def test_get_vim_project_id_from_policy_id_success(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ vim_project_id = cache_obj.get_vim_project_id_from_policy_id(
+ data_mock.shared_ids["policy"]["policy_id_1"])
+ assert vim_project_id is not None
+
+
+def test_get_vim_project_id_from_policy_id_failure(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ policy_id = 'policy_id_3'
+ vim_project_id = cache_obj.get_vim_project_id_from_policy_id(policy_id)
+ assert vim_project_id is None
+
+
+def test_get_pipeline_url(configuration):
+ from moon_cache import cache
+ cache_obj = cache.Cache.getInstance(manager_url=configuration.get("management")['url'])
+ cache_obj.set_current_server(url="http://127.0.0.1:10000", api_key="")
+ cache_obj.add_pipeline("policy_id_1", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ cache_obj.add_pipeline("policy_id_2", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20001,
+ })
+ url = cache_obj.get_pipeline_url(pipeline_id="policy_id_1")
+ assert url == "http://127.0.0.1:20000"
+ url = cache_obj.get_pipeline_url(pipeline_id="policy_id_2")
+ assert url == "http://127.0.0.1:20001"
diff --git a/moon_cache/tests/unit_python/conftest.py b/moon_cache/tests/unit_python/conftest.py
new file mode 100644
index 00000000..6b271d7a
--- /dev/null
+++ b/moon_cache/tests/unit_python/conftest.py
@@ -0,0 +1,151 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import pytest
+import requests_mock
+import yaml
+import mock_repo
+import mock_repo.urls as register_urls
+import mock_repo.data as data_mock
+
+__CONF = """
+database:
+ url: sqlite:////tmp/database_test.db
+ driver: moon_manager.plugins.sql
+ migration_dir: moon_manager.api.db.migrations
+
+management:
+ url: http://127.0.0.1:8000
+ user: admin
+ password: admin
+ token_file: /tmp/moon.pwd
+
+orchestration:
+ driver: moon_manager.plugins.pyorchestrator
+ connection: local
+ slaves:
+ port: 10000...10100
+ pipelines:
+ port: 20000...20100
+
+information:
+ driver: moon_manager.plugins.moon_openstack_plugin
+ openstack:
+ url: http://keystone:5000/v3
+ user: admin
+ password: p4ssw0rd
+ domain: default
+ project: admin
+ check_token: false
+ certificate: false
+
+plugins:
+ directory: /var/moon/plugins
+
+components:
+ manager:
+ port: 8080
+ bind: 0.0.0.0
+ hostname: manager
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(m, confessage)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(m, confessage)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
+"""
+
+
+@pytest.fixture
+def configuration():
+ return yaml.load(__CONF)
+
+
+def register_cache(m):
+ """ Modify the response from Requests module
+ """
+ conf = yaml.load(__CONF)
+ # register_urls.register_components(m, conf)
+ # register_urls.register_keystone(m, conf)
+
+ register_urls.register_pdp(m, conf)
+ register_urls.register_pipelines(m, conf)
+ register_urls.register_meta_rules(m, conf)
+ register_urls.register_policies(m, conf)
+ register_urls.register_slaves(m, conf)
+ register_urls.register_models(m, conf)
+
+ register_urls.register_policy_subject(m, conf, data_mock.shared_ids["policy"]["policy_id_1"])
+ register_urls.register_policy_subject_invalid_response(m, conf, data_mock.shared_ids["policy"]["policy_id_invalid_response"])
+
+ register_urls.register_policy_object(m, conf, data_mock.shared_ids["policy"]["policy_id_1"])
+ register_urls.register_policy_object_invalid_response(m, conf, data_mock.shared_ids["policy"]["policy_id_invalid_response"])
+
+ register_urls.register_policy_action(m, conf, data_mock.shared_ids["policy"]["policy_id_1"])
+ register_urls.register_policy_action_invalid_response(m, conf, data_mock.shared_ids["policy"]["policy_id_invalid_response"])
+
+ register_urls.register_policy_subject_assignment(m, conf, data_mock.shared_ids["policy"]["policy_id_1"], data_mock.shared_ids["perimeter"]["perimeter_id_1"])
+
+ register_urls.register_policy_subject_assignment_list(m, conf, data_mock.shared_ids["policy"]["policy_id_2"])
+
+ register_urls.register_policy_object_assignment(m, conf, data_mock.shared_ids["policy"]["policy_id_1"], data_mock.shared_ids["perimeter"]["perimeter_id_2"])
+
+ register_urls.register_policy_object_assignment_list(m, conf, data_mock.shared_ids["policy"]["policy_id_2"])
+
+ register_urls.register_policy_action_assignment(m, conf, data_mock.shared_ids["policy"]["policy_id_1"], data_mock.shared_ids["perimeter"]["perimeter_id_3"])
+
+ register_urls.register_policy_action_assignment_list(m, conf, data_mock.shared_ids["policy"]["policy_id_2"])
+
+ register_urls.register_attributes(m, conf)
+
+ # register_urls.register_policy_action_assignment(m, conf, "policy_id_2", "perimeter_id_2")
+ # register_urls.register_policy_action_assignment(m, conf, "policy_id_2", "perimeter_id_2")
+ # register_urls.register_policy_action_assignment(m, conf, "policy_id_2", "perimeter_id_2")
+
+ register_urls.register_rules(m, conf, "policy_id1")
+
+
+@pytest.fixture(autouse=True)
+def no_requests(monkeypatch):
+ """ Modify the response from Requests module
+ """
+ with requests_mock.Mocker(real_http=True) as m:
+ register_cache(m)
+ print("End registering URI")
+ yield m
diff --git a/moon_cache/tests/unit_python/mock_repo/__init__.py b/moon_cache/tests/unit_python/mock_repo/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_cache/tests/unit_python/mock_repo/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_cache/tests/unit_python/mock_repo/data.py b/moon_cache/tests/unit_python/mock_repo/data.py
new file mode 100644
index 00000000..ff5e25a8
--- /dev/null
+++ b/moon_cache/tests/unit_python/mock_repo/data.py
@@ -0,0 +1,306 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+shared_ids = {
+ "policy": {
+ "policy_id_1": "policy_id_1",
+ "policy_id_2": "policy_id_2",
+ "policy_id_3": "policy_id_3",
+ "policy_id_invalid_response": "policy_id_invalid_response"
+ },
+ "category": {
+ "category_id_1": "category_id_1",
+ "invalid_category_id_1": " invalid_category_id_1"
+ },
+ "perimeter": {
+ "perimeter_id_1": "subject_id_1",
+ "perimeter_id_2": "object_id_1",
+ "perimeter_id_3": "action_id_1"
+ },
+ "meta_rule": {
+ "meta_rule_id_1": "meta_rule_id_1",
+ "meta_rule_id_2": "meta_rule_id_2"
+ },
+ "rule": {
+ "rule_id_1": "rule_id_2",
+ "rule_id_2": "rule_id_2"
+ },
+ "model": {
+ "model_id_1": "model_id_1"
+ },
+ "subject": {
+ "subject_id_1": "subject_id_1",
+ "invalid_subject_id": "invalid_subject_id",
+ "invalid_category_id": "invalid_category_id",
+ "invalid_assignment_id": "invalid_assignment_id"
+ },
+ "object": {
+ "object_id_1": "object_id_1",
+ "invalid_object_id": "invalid_object_id",
+ "invalid_category_id": "invalid_category_id",
+ "invalid_assignment_id": "invalid_assignment_id"
+ },
+ "action": {
+ "action_id_1": "action_id_1",
+ "invalid_action_id": "invalid_action_id",
+ "invalid_category_id": "invalid_category_id",
+ "invalid_assignment_id": "invalid_assignment_id"
+ }
+}
+
+pdp_mock = {
+ "pdp_id1": {
+ "name": "...",
+ "security_pipeline": ["policy_id_1", "policy_id_2"],
+ "vim_project_id": "vim_project_id1",
+ "description": "...",
+ }
+}
+
+meta_rules_mock = {
+ shared_ids["meta_rule"]["meta_rule_id_1"]: {
+ "name": "meta_rule1",
+ "algorithm": "name of the meta rule algorithm",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ },
+ shared_ids["meta_rule"]["meta_rule_id_2"]: {
+ "name": "name of the meta rules2",
+ "algorithm": "name of the meta rule algorithm",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ }
+}
+
+policies_mock = {
+ shared_ids["policy"]["policy_id_1"]: {
+ "name": "test_policy1",
+ "model_id": shared_ids["model"]["model_id_1"],
+ "genre": "authz",
+ "description": "test",
+ },
+ shared_ids["policy"]["policy_id_2"]: {
+ "name": "test_policy2",
+ "model_id": shared_ids["model"]["model_id_1"],
+ "genre": "authz",
+ "description": "test",
+ }
+}
+
+subject_mock = {
+ shared_ids["policy"]["policy_id_1"]: {
+ "subject_id": {
+ "name": "subject_name",
+ "vim_id": "vim_project_id1",
+ "description": "a description"
+ }
+ },
+ shared_ids["policy"]["policy_id_invalid_response"]: {
+ "subject_id": {
+ "name": "subject_name",
+ "vim_id": "vim_project_id1",
+ "description": "a description"
+ }
+ }
+
+}
+
+subject_assignment_mock = {
+ shared_ids["subject"]["subject_id_1"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "subject_id": "subject_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"],
+ }
+}
+
+subject_assignment_mock_invalid_subject_id = {
+ shared_ids["subject"]["invalid_subject_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "subject_id_invalid": "subject_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"],
+ }
+}
+
+subject_assignment_mock_invalid_category_id = {
+ shared_ids["subject"]["invalid_category_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "subject_id": "subject_id_1",
+ "category_id_invalid": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"],
+ }
+}
+
+subject_assignment_mock_invalid_assignment_id = {
+ shared_ids["subject"]["invalid_assignment_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "subject_id": "subject_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments_invalid": ["data_id_1, data_id_2"],
+ }
+}
+
+object_mock = {
+ shared_ids["policy"]["policy_id_1"]: {
+ "object_id": {
+ "name": "object_name",
+ "description": "a description"
+ }
+ }
+}
+
+object_assignment_mock = {
+ shared_ids["object"]["object_id_1"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "object_id": "object_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+object_assignment_mock_invalid_object_id = {
+ shared_ids["object"]["invalid_object_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "object_id": "object_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+object_assignment_mock_invalid_category_id = {
+ shared_ids["object"]["invalid_category_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "object_id": "object_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+object_assignment_mock_invalid_assignment_id = {
+ shared_ids["object"]["invalid_assignment_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "object_id": "object_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+action_mock = {
+ shared_ids["policy"]["policy_id_1"]: {
+ "action_id": {
+ "name": "action_name",
+ "description": "a description"
+ }
+ }
+}
+
+action_assignment_mock = {
+ shared_ids["action"]["action_id_1"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "action_id": "action_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+action_assignment_mock_invalid_action_id = {
+ shared_ids["action"]["invalid_action_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "action_id": "action_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+action_assignment_mock_invalid_category_id = {
+ shared_ids["action"]["invalid_category_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "action_id": "action_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+action_assignment_mock_invalid_assignment_id = {
+ shared_ids["action"]["invalid_assignment_id"]: {
+ "policy_id": shared_ids["policy"]["policy_id_1"],
+ "action_id": "action_id_1",
+ "category_id": shared_ids["category"]["category_id_1"],
+ "assignments": ["data_id_1, data_id_2"]
+ }
+}
+
+
+models_mock = {
+ shared_ids["model"]["model_id_1"]: {
+ "name": "test_model",
+ "description": "test",
+ "meta_rules": [shared_ids["meta_rule"]["meta_rule_id_1"]]
+ }
+}
+
+rules_mock = {
+ "rules": {
+ "meta_rule_id": shared_ids["meta_rule"]["meta_rule_id_1"],
+ shared_ids["rule"]["rule_id_1"]: {
+ "rule": ["subject_data_id1",
+ "object_data_id1",
+ "action_data_id1"],
+ "instructions": (
+ {"decision": "grant"},
+ # "grant" to immediately exit,
+ # "continue" to wait for the result of next policy
+ # "deny" to deny the request
+ )
+ },
+ shared_ids["rule"]["rule_id_2"]: {
+ "rule": ["subject_data_id2",
+ "object_data_id2",
+ "action_data_id2"],
+ "instructions": (
+ {
+ "update": {
+ "operation": "add",
+ # operations may be "add" or "delete"
+ "target": "rbac:role:admin"
+ # add the role admin to the current user
+ }
+ },
+ {"chain": {"name": "rbac"}}
+ # chain with the policy named rbac
+ )
+ }
+ }
+}
+
+pipelines_mock = {
+ "policy_id_1": {
+ "starttime": 1548688120.3931532,
+ "port": 20000,
+ "server_ip": "127.0.0.1",
+ "status": "up",
+ "log": "/tmp/moon_policy_id_1.log"
+ },
+ "policy_id_2": {
+ "starttime": 1548688120.3931532,
+ "port": 20001,
+ "server_ip": "127.0.0.1",
+ "status": "up",
+ "log": "/tmp/moon_policy_id_2.log"
+ }
+}
diff --git a/moon_cache/tests/unit_python/mock_repo/urls.py b/moon_cache/tests/unit_python/mock_repo/urls.py
new file mode 100644
index 00000000..4b6d5133
--- /dev/null
+++ b/moon_cache/tests/unit_python/mock_repo/urls.py
@@ -0,0 +1,174 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import mock_repo.data as data_mock
+
+
+def register_model_any(m, conf, module_name, mocked_data, key=None):
+ if key is None:
+ key = module_name
+ m.register_uri(
+ 'GET', '{}/{}'.format(conf['management']['url'],
+ module_name),
+
+ json={key: mocked_data}
+ )
+
+
+def register_policy_any(m, conf, policy_id, module_name, mocked_data, key=None):
+ if key is None:
+ key = module_name
+ m.register_uri(
+ 'GET', '{}/{}/{}/{}'.format(conf['management']['url'],
+ 'policies',
+ policy_id,
+ module_name),
+ json={key: mocked_data}
+ )
+
+
+def register_policy(m, conf, policy_id, mocked_data):
+ m.register_uri(
+ 'GET', '{}/{}/{}'.format(conf['management']['url'],
+ 'policies',
+ policy_id),
+ json={"policies": mocked_data}
+ )
+
+
+def register_pipelines(m, conf):
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:20000/pipelines/policy_id_1',
+ json={'pipelines': data_mock.pipelines_mock}
+ )
+
+
+def register_slaves(m, conf):
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:10000/pipelines',
+ json={'pipelines': data_mock.pipelines_mock}
+ )
+
+
+def register_pdp(m, conf):
+ register_model_any(m, conf, 'pdp', data_mock.pdp_mock, 'pdps')
+
+
+def register_meta_rules(m, conf):
+ register_model_any(m, conf, 'meta_rules', data_mock.meta_rules_mock)
+
+
+def register_policies(m, conf):
+ for _policy_id in data_mock.policies_mock:
+ register_policy(m, conf, _policy_id, data_mock.policies_mock[_policy_id])
+ register_model_any(m, conf, 'policies', data_mock.policies_mock)
+
+
+def register_models(m, conf):
+ register_model_any(m, conf, 'models', data_mock.models_mock)
+
+
+def register_policy_subject(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'subjects', data_mock.subject_mock[policy_id])
+
+
+def register_policy_subject_invalid_response(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'subjects', data_mock.subject_mock[policy_id],
+ 'subjects_invalid_key')
+
+
+def register_policy_object(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'objects', data_mock.object_mock[policy_id])
+
+
+def register_policy_object_invalid_response(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'objects', data_mock.subject_mock[policy_id],
+ 'objects_invalid_key')
+
+
+def register_policy_action(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'actions', data_mock.action_mock[policy_id])
+
+
+def register_policy_action_invalid_response(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'actions', data_mock.subject_mock[policy_id],
+ 'actions_invalid_key')
+
+
+def register_policy_subject_assignment_list(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'subject_assignments',
+ data_mock.subject_assignment_mock)
+
+
+def register_policy_object_assignment_list(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'object_assignments',
+ data_mock.object_assignment_mock)
+
+
+def register_policy_action_assignment_list(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'action_assignments',
+ data_mock.action_assignment_mock)
+
+
+def register_policy_subject_assignment(m, conf, policy_id, perimeter_id):
+ m.register_uri(
+ 'GET', '{}/{}/{}/subject_assignments/{}'.format(conf['management']['url'],
+ 'policies',
+ policy_id,
+ perimeter_id),
+ json={'subject_assignments': data_mock.subject_assignment_mock}
+ )
+
+
+def register_policy_object_assignment(m, conf, policy_id, perimeter_id):
+ m.register_uri(
+ 'GET', '{}/{}/{}/object_assignments/{}'.format(conf['management']['url'],
+ 'policies',
+ policy_id,
+ perimeter_id),
+ json={'object_assignments': data_mock.object_assignment_mock}
+ )
+
+
+def register_policy_action_assignment(m, conf, policy_id, perimeter_id):
+ m.register_uri(
+ 'GET', '{}/{}/{}/action_assignments/{}'.format(conf['management']['url'],
+ 'policies',
+ policy_id,
+ perimeter_id),
+ json={'action_assignments': data_mock.action_assignment_mock}
+ )
+
+
+def register_rules(m, conf, policy_id):
+ register_policy_any(m, conf, policy_id, 'rules', data_mock.rules_mock)
+
+
+def register_attributes(m, conf):
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/attributes/mode',
+ json={
+ 'attributes': {
+ 'id': 'mode', 'value': 'build', 'values': ['build', 'run'], 'default': 'run'
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/attributes',
+ json={
+ 'attributes': {
+ 'mode': {
+ 'id': 'mode', 'value': 'build', 'values': ['build', 'run'], 'default': 'run'}
+ }
+ }
+ )
+
diff --git a/moon_cache/tests/unit_python/requirements.txt b/moon_cache/tests/unit_python/requirements.txt
new file mode 100644
index 00000000..ca33f6d4
--- /dev/null
+++ b/moon_cache/tests/unit_python/requirements.txt
@@ -0,0 +1,7 @@
+pytest
+pytest-benchmark
+pbr
+pytest-cov
+cliff
+requests_mock
+moon_utilities \ No newline at end of file
diff --git a/moon_engine/.gitignore b/moon_engine/.gitignore
new file mode 100644
index 00000000..894a44cc
--- /dev/null
+++ b/moon_engine/.gitignore
@@ -0,0 +1,104 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
diff --git a/moon_engine/Changelog b/moon_engine/Changelog
new file mode 100644
index 00000000..9c863b1c
--- /dev/null
+++ b/moon_engine/Changelog
@@ -0,0 +1,61 @@
+# Copyright 2018 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+CHANGES
+=======
+
+0.1
+---
+- First version of moon_engine
+
+0.2
+---
+- Add benchmark tests
+- Fix a bug when retrieving logging configuration
+- Update Configuration
+- Init Pipeline API
+- Init Wrapper API
+- Init Authz API
+- Add Configuration API
+- Add first authorization plugin
+- Adding authz API for wrapper and pipeline
+
+0.3
+---
+- Automatically load the API plugins at the server startup
+
+0.4
+---
+- Fix the issue in the plugin oslowrapper
+- Fix the communication issue between the Wrapper and the Pipeline
+
+0.5
+---
+- Fix subject retrieval from Oslo requests
+
+0.6
+---
+- Force the deletion of authorization requests
+- Fix the max 21 requests on Engine
+- Add performance tests
+- Fix error updating PDP with the dashboard
+- Fix update pipeline issue
+- Add the JSON import functionality
+- Fix the change of the wrapper's log after creation of a pipeline
+- Add the global attributes functionality
+
+0.7
+---
+- Adaptation following the removal of the field database > pwd_file in moon.yaml
+- Fix of pdp server deletion
+- Add of start / stop commands for standalone engine
+
+0.8
+---
+- Fix of a bug when handling requests from openstack
+- Fix of the pdp update
+- Fix of the pdp status retrieval
+- Add of a api allowing to reload the conf file of a wrapper (used by the manager after updating it)
diff --git a/moon_interface/LICENSE b/moon_engine/LICENSE
index d6456956..d6456956 100644
--- a/moon_interface/LICENSE
+++ b/moon_engine/LICENSE
diff --git a/moon_wrapper/MANIFEST.in b/moon_engine/MANIFEST.in
index cf4d2e4e..cf4d2e4e 100644
--- a/moon_wrapper/MANIFEST.in
+++ b/moon_engine/MANIFEST.in
diff --git a/moon_engine/README.md b/moon_engine/README.md
new file mode 100644
index 00000000..f9266936
--- /dev/null
+++ b/moon_engine/README.md
@@ -0,0 +1,146 @@
+# moon_engine
+
+## Installation
+
+If you want a stable version:
+
+```bash
+sudo python -m pip install moon_engine
+```
+
+If you want a development version:
+
+```bash
+ARTIFACTORY=https://artifactory-iva.si.francetelecom.fr/artifactory/api/pypi/python-virt-orange-product-devops/simple
+sudo python -m pip install --pre moon_engine -i $ARTIFACTORY
+```
+Use it at your own risk, this is an unstable version.
+
+If you want to be in development mode, and get the code:
+
+```bash
+git clone git@gitlab.forge.orange-labs.fr:moon/moon_utilities.git
+cd moon_utilities
+sudo pip install -e .
+cd ..
+git clone git@gitlab.forge.orange-labs.fr:moon/moon_cache.git
+cd moon_cache
+sudo pip install -e .
+cd ..
+git clone git@gitlab.forge.orange-labs.fr:moon/moon_engine.git
+cd moon_engine
+sudo pip install -e .
+```
+
+## Configuration
+
+You need to create 3 configuration files.
+
+### config.cfg::
+
+ # configuration for Gunicorn
+ bind = "127.0.0.1:8081"
+ workers = 2
+
+ # configuration for moon_engine
+ moon = "moon.yaml"
+
+
+### moon.yaml (feel free to update the configuration file to your need...)::
+
+
+ type: "pipeline"
+ uuid:
+ manager_url: ""
+ incremental_updates: false
+ api_token:
+ data: policy.json
+ debug: true
+
+ management:
+ password: admin
+ url: http://127.0.0.1:8000
+ user: admin
+ token_file: moon_engine_users.json
+
+ orchestration:
+ driver: moon_engine.plugins.pyorchestrator
+ connection: local
+ port: 20000...20100
+ config_dir: /tmp
+
+ authorization:
+ driver: moon_engine.plugins.authz
+
+ plugins:
+ directory: /tmp
+
+ logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon_engine.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
+
+### policy.json
+
+This file contains all data that will be imported in the Engine. As we cannot update the cache after the creation of the Engine, all data must be in this file.
+Example files lie in the conf directory.
+
+## Web server execution
+
+Execution when library is installed:
+
+For a development server:
+
+```bash
+hug -m moon_engine.server config.cfg
+```
+
+For a production server:
+
+```bash
+gunicorn moon_engine.server:__hug_wsgi__ -c config.cfg
+```
+
+or
+
+```bash
+moon_engine start config.cfg
+```
+
+If library is not installed:
+
+```bash
+gunicorn moon_engine/server:__hug_wsgi__ -c config.cfg
+```
+
+This will install an autonomous engine server.
+If you need to connect to a Manager, you must update the `moon.yaml` accordingly.
+
diff --git a/python_moondb/python_moondb/__init__.py b/moon_engine/conf/config.cfg
index b266a9d4..4a7ea99c 100644
--- a/python_moondb/python_moondb/__init__.py
+++ b/moon_engine/conf/config.cfg
@@ -1,7 +1,12 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# Copyright 2018 Orange and its contributors
# This software is distributed under the terms and conditions of the 'Apache-2.0'
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-__version__ = "1.2.8"
+# configuration for Gunicorn
+bind = "127.0.0.1:8081"
+workers = 2
+pid_file_dir = "/tmp/"
+# configuration for moon_engine
+moon = "conf/moon.yaml"
diff --git a/moon_engine/conf/moon.yaml b/moon_engine/conf/moon.yaml
new file mode 100644
index 00000000..b46c219e
--- /dev/null
+++ b/moon_engine/conf/moon.yaml
@@ -0,0 +1,58 @@
+type: "pipeline"
+uuid:
+manager_url: ""
+incremental_updates: false
+api_token:
+data: conf/policy_rbac.json
+debug: true
+
+management:
+ password: admin
+ url:
+ user: admin
+ token_file: moon_engine_users.json
+
+orchestration:
+ driver: moon_engine.plugins.pyorchestrator
+ connection: local
+ port: 20000...20100
+ config_dir: /tmp
+
+authorization:
+ driver: moon_engine.plugins.authz
+
+plugins:
+ directory: /tmp
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon_engine.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
diff --git a/moon_engine/conf/moon_engine_users.json b/moon_engine/conf/moon_engine_users.json
new file mode 100644
index 00000000..e9b18176
--- /dev/null
+++ b/moon_engine/conf/moon_engine_users.json
@@ -0,0 +1 @@
+{"_default": {}} \ No newline at end of file
diff --git a/moon_engine/conf/policy_mls.json b/moon_engine/conf/policy_mls.json
new file mode 100644
index 00000000..eac3220a
--- /dev/null
+++ b/moon_engine/conf/policy_mls.json
@@ -0,0 +1,495 @@
+{
+ "policies": [
+ {
+ "name": "MLS Policy",
+ "genre": "authz",
+ "description": "MLS policy",
+ "model": {
+ "name": "MLS"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "MLS",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "mls"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "level",
+ "description": "subject level"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "level",
+ "description": "object level"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "medium"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "mls",
+ "description": "",
+ "subject_categories": [{"name": "level"}],
+ "object_categories": [{"name": "level"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["demo", "vm1", "get_images"],
+ ["demo", "vm1", "set_image"],
+ ["demo", "vm2", "get_images"],
+ ["demo", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["demo", "vm1", "update_image"],
+ ["demo", "vm2", "set_image"],
+ ["demo", "vm2", "update_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/conf/policy_rbac.json b/moon_engine/conf/policy_rbac.json
new file mode 100644
index 00000000..a4bc959c
--- /dev/null
+++ b/moon_engine/conf/policy_rbac.json
@@ -0,0 +1,393 @@
+{
+ "policies": [
+ {
+ "name": "RBAC Policy",
+ "genre": "authz",
+ "description": "RBAC policy",
+ "model": {
+ "name": "RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "role of a user"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "user",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "admin"}]
+ },
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "identification of the object"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "vm1",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm1"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm2"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm3"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [{"name": "role"}],
+ "object_categories": [{"name": "id"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm3"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["demo", "vm1", "get_images"],
+ ["demo", "vm1", "set_image"],
+ ["demo", "vm2", "get_images"],
+ ["demo", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["demo", "vm1", "update_image"],
+ ["demo", "vm2", "set_image"],
+ ["demo", "vm2", "update_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/conf/policy_rbac_mls.json b/moon_engine/conf/policy_rbac_mls.json
new file mode 100644
index 00000000..beb4e3ec
--- /dev/null
+++ b/moon_engine/conf/policy_rbac_mls.json
@@ -0,0 +1,525 @@
+{
+ "policies": [
+ {
+ "name": "RBAC+MLS Policy",
+ "genre": "authz",
+ "description": "RBAC+MLS policy",
+ "model": {
+ "name": "RBACMLS"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "RBACMLS",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac_mls"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC+MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC+MLS Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "role of a user"
+ },
+ {
+ "name": "level",
+ "description": "subject level"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "admin",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "member",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "admin"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "member"}]
+ },
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC+MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC+MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC+MLS Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "level",
+ "description": "object level"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "medium"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac_mls",
+ "description": "",
+ "subject_categories": [{"name": "role"}, {"name": "level"}],
+ "object_categories": [{"name": "level"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac_mls"},
+ "rule": {
+ "subject_data": [{"name": "admin"}, {"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC+MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["demo", "vm1", "get_images"],
+ ["demo", "vm1", "set_image"],
+ ["demo", "vm2", "get_images"],
+ ["demo", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["demo", "vm1", "update_image"],
+ ["demo", "vm2", "set_image"],
+ ["demo", "vm2", "update_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/moon_engine/__init__.py b/moon_engine/moon_engine/__init__.py
new file mode 100644
index 00000000..0c44540e
--- /dev/null
+++ b/moon_engine/moon_engine/__init__.py
@@ -0,0 +1,30 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+__version__ = "0.8"
+
+
+def get_api_key(url, user, password):
+ import requests
+ from requests.auth import HTTPBasicAuth
+ _url = url + "/auth"
+ req = requests.get(_url, auth=HTTPBasicAuth(user, password))
+ if req.status_code != 200:
+ raise Exception("Cannot authenticate on {} with {}".format(_url, user))
+ return req.content.decode("utf-8").strip('"')
+
+
+def serve(hostname="127.0.0.1", port=8080):
+ import hug
+ import moon_engine.server
+ hug.API(moon_engine.server).http.serve(host=hostname, port=port, display_intro=False)
diff --git a/moon_engine/moon_engine/__main__.py b/moon_engine/moon_engine/__main__.py
new file mode 100644
index 00000000..16f1d322
--- /dev/null
+++ b/moon_engine/moon_engine/__main__.py
@@ -0,0 +1,113 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+import subprocess # nosec
+import os
+import sys
+import hug.interface
+from moon_engine.api import configuration
+
+
+LOGGER = logging.getLogger("moon.engine")
+
+
+@hug.cli("start_server")
+@hug.local()
+def start_server(conf_file):
+ """ Start the server of the engine """
+
+ try:
+ guni_conf_file = get_info(conf_file, "moon").strip('"\n')
+ port = get_info(conf_file, "bind").split(":")[1].strip('"\n')
+ log_dir = get_info(conf_file, "pid_file_dir").strip('"\n')
+ except ValueError:
+ return
+
+ configuration.init_logging(guni_conf_file)
+ LOGGER.setLevel(logging.ERROR)
+
+ pid_filename = log_dir + port + ".pid"
+ _command = ["gunicorn", "moon_engine.server:__hug_wsgi__", "-D", "-p", pid_filename, "-c", conf_file]
+ subprocess.Popen(_command, stdout=subprocess.PIPE, close_fds=True) # nosec
+
+
+@hug.cli("stop_server")
+@hug.local()
+def stop_server(conf_file):
+ """ Stop the server of the engine """
+
+ try:
+ guni_conf_file = get_info(conf_file, "moon").strip('"\n')
+ port = get_info(conf_file, "bind").split(":")[1].strip('"\n')
+ log_dir = get_info(conf_file, "pid_file_dir").strip('"\n')
+ except ValueError:
+ return
+
+ configuration.init_logging(guni_conf_file)
+ LOGGER.setLevel(logging.ERROR)
+
+ pid_filename = log_dir + port + ".pid"
+
+ try:
+ pid_file = open(pid_filename, 'r')
+ except FileNotFoundError:
+ LOGGER.error(f"File {pid_filename} not found. Server on port {port} not running?")
+ return
+
+ try:
+ pid = int(pid_file.read())
+ except ValueError:
+ LOGGER.error(f"The pid found in {pid_filename} is not valid")
+ return
+
+ os.kill(pid, 15)
+
+
+def get_info(conf, key):
+ with open(conf) as config:
+ lines = config.readlines()
+ for line in lines:
+ if line.startswith(key):
+ return line.split("=")[1].strip()
+ LOGGER.error(f"Key \"{key}\" missing from Gunicorn configuration file")
+ raise ValueError
+
+
+def run():
+ if len(sys.argv) > 1:
+
+ command = sys.argv[1]
+ sys.argv.pop(1)
+ # if command == "conf":
+ # configuration.get_configuration.interface.cli()
+ # elif command == "db":
+ # configuration.init_database.interface.cli()
+ if command == "start":
+ start_server.interface.cli()
+ elif command == "stop":
+ stop_server.interface.cli()
+ else:
+ LOGGER.critical("Unknown command {}".format(command))
+
+ else:
+ # TODO: update the command management by using argparse
+ print("""Possible commands are:
+ # - conf
+ # - db
+ - start
+ - stop
+ """)
+
+
+if __name__ == "__main__":
+ run()
diff --git a/moon_engine/moon_engine/api/__init__.py b/moon_engine/moon_engine/api/__init__.py
new file mode 100644
index 00000000..deafe11b
--- /dev/null
+++ b/moon_engine/moon_engine/api/__init__.py
@@ -0,0 +1,29 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+from falcon import HTTP_400, HTTP_401, HTTP_402, HTTP_403, HTTP_404, HTTP_405, \
+ HTTP_406, HTTP_407, HTTP_408, HTTP_409, HTTP_500
+
+ERROR_CODE = {
+ 400: HTTP_400,
+ 401: HTTP_401,
+ 402: HTTP_402,
+ 403: HTTP_403,
+ 404: HTTP_404,
+ 405: HTTP_405,
+ 406: HTTP_406,
+ 407: HTTP_407,
+ 408: HTTP_408,
+ 409: HTTP_409,
+ 500: HTTP_500
+}
diff --git a/moon_engine/moon_engine/api/authz/__init__.py b/moon_engine/moon_engine/api/authz/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_engine/moon_engine/api/authz/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_engine/moon_engine/api/authz/authz.py b/moon_engine/moon_engine/api/authz/authz.py
new file mode 100644
index 00000000..caf95f93
--- /dev/null
+++ b/moon_engine/moon_engine/api/authz/authz.py
@@ -0,0 +1,28 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+from moon_engine.api.authz.managers import Managers
+
+logger = logging.getLogger("moon.engine.api.authz.pipeline")
+
+
+class AuthzManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.AuthzManager = self
+
+ def get_authz(self, subject_name, object_name, action_name):
+ return self.driver.get_authz(subject_name=subject_name,
+ object_name=object_name,
+ action_name=action_name)
diff --git a/moon_engine/moon_engine/api/authz/managers.py b/moon_engine/moon_engine/api/authz/managers.py
new file mode 100644
index 00000000..dedb148d
--- /dev/null
+++ b/moon_engine/moon_engine/api/authz/managers.py
@@ -0,0 +1,20 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.engine.api.authz.managers")
+
+
+class Managers(object):
+ """Object that links managers together"""
+ AuthzManager = None
diff --git a/moon_engine/moon_engine/api/configuration.py b/moon_engine/moon_engine/api/configuration.py
new file mode 100644
index 00000000..398497a1
--- /dev/null
+++ b/moon_engine/moon_engine/api/configuration.py
@@ -0,0 +1,195 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Configuration API"""
+import hug.interface
+import os
+import logging
+import logging.config
+import yaml
+import copy
+from importlib.machinery import SourceFileLoader
+
+LOGGER = logging.getLogger("moon.engine.api.configuration")
+__CONF = {}
+CONF_FILE = ""
+
+
+def init_logging(log_file=None):
+ """Initialize the logging system
+
+ :return: nothing
+ """
+ logging_conf = get_configuration(key='logging', file=log_file)
+ if get_configuration(key='debug', default=False):
+ logging_conf.get("handlers", {}).get("console", {})['level'] = logging.DEBUG
+ LOGGER.warning("Setting debug to True!")
+ logging.config.dictConfig(logging_conf)
+
+
+def get_plugins_by_type(plugin_type):
+ """
+
+ :param plugin_type:
+ :return:
+ """
+ plugins_dir = __CONF["plugins"]["directory"]
+ LOGGER.info("Getting all plugins for {}".format(plugin_type))
+ import moon_engine.plugins
+ import glob
+ for plugname in glob.glob(os.path.join(moon_engine.plugins.__path__[0], "*.py")):
+ try:
+ plugname = os.path.basename(plugname)[:-3]
+ plug = __import__("moon_engine.plugins.{}".format(plugname), fromlist=["plugins", ])
+ if getattr(plug, "PLUGIN_TYPE", "") == plugin_type:
+ yield plug
+ LOGGER.debug("Plug {} loaded".format(plugname))
+ except ModuleNotFoundError:
+ pass
+ for plugname in glob.glob(os.path.join(plugins_dir, "*.py")):
+ m = SourceFileLoader("myplugs", os.path.join(plugins_dir, plugname+".py"))
+ plug = m.load_module()
+ if getattr(plug, "PLUGIN_TYPE", "") == plugin_type:
+ yield plug
+ LOGGER.debug("Plug {} loaded".format(plugname))
+
+
+def load_plugin(plugname):
+ """Load a python module
+
+ :param plugname: the name of the module to load
+ :return: a reference to the module
+ """
+ plugins_dir = __CONF["plugins"]["directory"]
+ LOGGER.info(f"load_plugin {plugname}")
+ try:
+ return __import__(plugname, fromlist=["plugins", ])
+ except ImportError as e:
+ LOGGER.warning("Cannot import module ({})".format(e))
+ try:
+ m = SourceFileLoader("myplugs", os.path.join(plugins_dir, plugname+".py"))
+ return m.load_module()
+ except ImportError as e:
+ LOGGER.error("Error in importing plugin {} from {}".format(plugname, plugins_dir))
+ LOGGER.exception(e)
+
+
+def get_authz_driver():
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ plug = load_plugin(__CONF["authorization"]["driver"])
+ if plug.PLUGIN_TYPE != "authz":
+ raise Exception("Trying to load a bad Authz plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad Authz plugin (cannot find Connector)")
+ return plug
+
+
+def get_orchestration_driver():
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ plug = load_plugin(__CONF["orchestration"]["driver"])
+ if plug.PLUGIN_TYPE != "orchestration":
+ raise Exception("Trying to load a bad Orchestration plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad Orchestration plugin (cannot find Connector)")
+ return plug
+
+
+def get_pipeline_driver():
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ plug = load_plugin(__CONF["information"]["driver"])
+ if plug.PLUGIN_TYPE != "information":
+ raise Exception("Trying to load a bad Information plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad Information plugin (cannot find Connector)")
+ return plug
+
+
+def search_config_file(filename):
+ """Look for the configuration file
+
+ :param filename: a filename to search for
+ :return: the content of the configuration file
+ """
+ data_config = None
+ for _filename in (filename, "moon.conf", "moon.yaml"):
+ for _dir in (
+ "{}",
+ "/conf/{}",
+ "../{}",
+ "../conf/{}",
+ "/etc/moon/{}",
+ "conf/{}",
+ ):
+ _file = _dir.format(_filename)
+ try:
+ data_config = yaml.safe_load(open(_file))
+ except FileNotFoundError:
+ data_config = None
+ continue
+ else:
+ LOGGER.warning("Configuration file: {}".format(_file))
+ break
+ if data_config:
+ break
+ if not data_config:
+ LOGGER.error("Configuration file not found ({})...".format(filename))
+ raise Exception("Configuration file not found ({})...".format(filename))
+ return data_config
+
+
+def set_configuration(conf):
+ """ Force the configuration dictionary
+
+ :param conf: the configuration dictionary
+ :return: nothing
+ """
+ global __CONF
+ __CONF = conf
+
+
+def reload_configuration():
+ global __CONF, CONF_FILE
+ __CONF = None
+ set_configuration(search_config_file(CONF_FILE))
+
+
+@hug.cli("get_conf")
+@hug.local()
+def get_configuration(key=None, default=None, file=None):
+ """
+ List configuration attributes
+ :return: JSON configuration value
+ """
+ global __CONF
+ if not __CONF:
+ if file:
+ __CONF = search_config_file(file)
+ else:
+ __CONF = search_config_file("moon.yaml")
+ init_logging()
+ if not key:
+ # TODO: delete passwords!
+ return copy.deepcopy(__CONF)
+ else:
+ return copy.deepcopy(__CONF.get(key, default))
diff --git a/moon_engine/moon_engine/api/import_json.py b/moon_engine/moon_engine/api/import_json.py
new file mode 100644
index 00000000..d1296ff1
--- /dev/null
+++ b/moon_engine/moon_engine/api/import_json.py
@@ -0,0 +1,29 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Import JSON API"""
+import hug
+
+
+@hug.local()
+@hug.post("/import/")
+def import_json(body):
+ """Import data into the cache of the pipeline
+
+ :return: OK if imported
+ """
+ if "attributes" in body:
+ description = "Will update " + ", ".join(body.get("attributes"))
+ else:
+ description = "Will update all attributes"
+ # FIXME: dev the real import functionality
+ return {"status": "OK", "description": description}
diff --git a/moon_engine/moon_engine/api/logs.py b/moon_engine/moon_engine/api/logs.py
new file mode 100644
index 00000000..b6269648
--- /dev/null
+++ b/moon_engine/moon_engine/api/logs.py
@@ -0,0 +1,25 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Test hug API (local, command-line, and HTTP access)"""
+import hug
+
+
+@hug.local()
+@hug.get("/logs/")
+def list_logs():
+ """List logs
+
+ :return: JSON status output
+ """
+
+ return {"logs": []}
diff --git a/moon_engine/moon_engine/api/orchestration/__init__.py b/moon_engine/moon_engine/api/orchestration/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_engine/moon_engine/api/orchestration/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_engine/moon_engine/api/orchestration/managers.py b/moon_engine/moon_engine/api/orchestration/managers.py
new file mode 100644
index 00000000..e07851c5
--- /dev/null
+++ b/moon_engine/moon_engine/api/orchestration/managers.py
@@ -0,0 +1,21 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.engine.api.orchestration.managers")
+
+
+class Managers(object):
+ """Object that links managers together"""
+ SlaveManager = None
+ PipelineManager = None
diff --git a/moon_engine/moon_engine/api/orchestration/pipeline.py b/moon_engine/moon_engine/api/orchestration/pipeline.py
new file mode 100644
index 00000000..47a84409
--- /dev/null
+++ b/moon_engine/moon_engine/api/orchestration/pipeline.py
@@ -0,0 +1,51 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities.security_functions import enforce
+from moon_engine.api.orchestration.managers import Managers
+
+logger = logging.getLogger("moon.engine.api.orchestration.pipeline")
+
+
+class PipelineManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.PipelineManager = self
+
+ @enforce(("read", "write"), "pipelines")
+ def update_pipeline(self, moon_user_id, pipeline_id, data):
+ return self.driver.update_pipeline(pipeline_id=pipeline_id, data=data)
+
+ @enforce("write", "pipelines")
+ def delete_pipeline(self, moon_user_id, pipeline_id):
+ return self.driver.delete_pipeline(pipeline_id=pipeline_id)
+
+ @enforce("write", "pipelines")
+ def add_pipeline(self, moon_user_id, pipeline_id=None, data=None):
+ if not pipeline_id:
+ pipeline_id = uuid4().hex
+ if data is None:
+ data = {}
+ if "plugins" not in data:
+ data["plugins"] = ["moon_engine.plugins.authz"]
+ return self.driver.add_pipeline(pipeline_id=pipeline_id, data=data)
+
+ @enforce("read", "pipelines")
+ def get_pipelines(self, moon_user_id, pipeline_id=None):
+ return self.driver.get_pipelines(pipeline_id=pipeline_id)
+
+ @enforce("read", "pipelines")
+ def get_pipeline_api_key(self, moon_user_id, pipeline_id):
+ return self.driver.get_pipeline_api_key(pipeline_id=pipeline_id)
diff --git a/moon_engine/moon_engine/api/orchestration/slave.py b/moon_engine/moon_engine/api/orchestration/slave.py
new file mode 100644
index 00000000..fa4412ba
--- /dev/null
+++ b/moon_engine/moon_engine/api/orchestration/slave.py
@@ -0,0 +1,44 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities import exceptions
+from moon_utilities.security_functions import enforce
+from moon_engine.api.orchestration.managers import Managers
+
+logger = logging.getLogger("moon.manager.api.orchestration.pod")
+
+
+class SlaveManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.SlaveManager = self
+
+ @enforce(("read", "write"), "slaves")
+ def update_slave(self, user_id, slave_id, value):
+ self.driver.update_slave(slave_id=slave_id, value=value)
+
+ @enforce("write", "slaves")
+ def delete_slave(self, user_id, slave_id):
+ self.driver.delete_slave(slave_id=slave_id)
+
+ @enforce("write", "slaves")
+ def add_slave(self, user_id, slave_id=None, data=None):
+ if not slave_id:
+ slave_id = uuid4().hex
+ self.driver.add_slave(slave_id=slave_id, data=data)
+
+ @enforce("read", "slaves")
+ def get_slaves(self, user_id, slave_id=None):
+ self.driver.get_slaves(slave_id=slave_id)
diff --git a/moon_engine/moon_engine/api/pipeline/__init__.py b/moon_engine/moon_engine/api/pipeline/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_engine/moon_engine/api/pipeline/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_engine/moon_engine/api/pipeline/authz.py b/moon_engine/moon_engine/api/pipeline/authz.py
new file mode 100644
index 00000000..02fb7d30
--- /dev/null
+++ b/moon_engine/moon_engine/api/pipeline/authz.py
@@ -0,0 +1,35 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+from moon_engine.api.pipeline.validator import Validator
+
+
+class Authz(object):
+
+ @staticmethod
+ @hug.local()
+ @hug.get("/authz/{subject_name}/{object_name}/{action_name}")
+ def get(subject_name: hug.types.text, object_name: hug.types.text,
+ action_name: hug.types.text, response):
+ """Get a response on Main Authorization request
+
+ :param subject_name: name of the subject or the request
+ :param object_name: name of the object
+ :param action_name: name of the action
+ :return:
+ "result": {true or false }
+ :internal_api: authz
+ """
+
+ validator = Validator()
+ response.status = validator.authz(subject_name, object_name, action_name)
diff --git a/moon_engine/moon_engine/api/pipeline/update.py b/moon_engine/moon_engine/api/pipeline/update.py
new file mode 100644
index 00000000..deaf9c12
--- /dev/null
+++ b/moon_engine/moon_engine/api/pipeline/update.py
@@ -0,0 +1,188 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Update API"""
+import hug
+from moon_utilities.auth_functions import api_key_authentication
+from moon_engine.api.pipeline.update_pipeline import Update
+
+
+class PipelineUpdate(object):
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/slave/{slave_id}", requires=api_key_authentication)
+ def update_slave(body, slave_id: hug.types.uuid, response):
+ """Tell the moon_engine wrapper that its cache should be updated
+ body may contain the attributes that the moon_engine should get from the manager
+ body example:
+ {
+ "name": "...",
+ "description": "..."
+ }
+ :return: 202 status code
+ """
+ update_pipeline = Update()
+ response.status = update_pipeline.update_slaves(slave_id=str(slave_id).replace("-", ""), is_delete=False,
+ data=body)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/pdp/{pdp_id}", requires=api_key_authentication)
+ def update_pdp(body, pdp_id: hug.types.uuid, response):
+ """Tell the moon_engine wrapper that its cache should be updated
+ body may contain the attributes that the moon_engine should get from the manager
+ if the attributes key is empty, all data should be retrieved
+ body example:
+ {
+ "vim_project_id": "...",
+ "security_pipeline": ["policy_id1", "policy_id2"],
+ "attributes": ["subjects", "subject_assignments", "subject_categories"]
+ }
+ :return: 202 status code
+ """
+
+ # todo call wrapper to update its pdp at the cache
+ update_pipeline = Update()
+ response.status = update_pipeline.update_pdp(is_delete=False, pdp_id=str(pdp_id).replace("-", ""), data=body)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/pdp/{pdp_id}", requires=api_key_authentication)
+ def delete_pdp(pdp_id: hug.types.uuid, response):
+ """Tell the moon_engine wrapper that its cache should be updated
+ body may contain the attributes that the moon_engine should get from the manager
+ if the attributes key is empty, all data should be retrieved
+ body example:
+ {
+ "vim_project_id": "...",
+ "security_pipeline": ["policy_id1", "policy_id2"],
+ "attributes": ["subjects", "subject_assignments", "subject_categories"]
+ }
+ :return: 202 status code
+ """
+
+ # todo call wrapper to update its pdp at the cache
+ update_pipeline = Update()
+ response.status = update_pipeline.update_pdp(is_delete=True, pdp_id=str(pdp_id).replace("-", ""))
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/policy/{policy_id}", requires=api_key_authentication)
+ def update_policy(body, policy_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_policy(is_delete=False, policy_id=str(policy_id).replace("-", ""),
+ data=body)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/policy/{policy_id}", requires=api_key_authentication)
+ def delete_policy(policy_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_policy(is_delete=True, policy_id=str(policy_id).replace("-", ""))
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/assignment/{policy_id}/{type}/", requires=api_key_authentication)
+ @hug.delete("/update/assignment/{policy_id}/{type}/{perimeter_id}",
+ requires=api_key_authentication)
+ @hug.delete("/update/assignment/{policy_id}/{type}/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ @hug.delete("/update/assignment/{policy_id}/{type}/{perimeter_id}/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete_assignment(response, policy_id: hug.types.uuid, type: hug.types.text,
+ perimeter_id: hug.types.uuid = None, category_id: hug.types.uuid = None,
+ data_id: hug.types.uuid = None, authed_user: hug.directives.user=None):
+ update_pipeline = Update()
+ response.status = update_pipeline.delete_assignment(type=type, policy_id=str(policy_id).replace("-", ""),
+ perimeter_id=str(perimeter_id).replace("-", ""),
+ category_id=str(category_id).replace("-", ""),
+ data_id=data_id)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/perimeter/{perimeter_id}/{policy_id}/{type}", requires=api_key_authentication)
+ def update_perimeter(body, perimeter_id: hug.types.uuid, policy_id: hug.types.uuid,
+ type: hug.types.text, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_perimeter(is_delete=False, type=type,
+ perimeter_id=str(perimeter_id).replace("-", ""), data=body,
+ policy_id=str(policy_id).replace("-", ""))
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/perimeter/{perimeter_id}/{policy_id}/{type}", requires=api_key_authentication)
+ def delete_perimeter(perimeter_id: hug.types.uuid, policy_id: hug.types.uuid,
+ type: hug.types.text, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_perimeter(is_delete=True, type=type,
+ perimeter_id=str(perimeter_id).replace("-", ""),
+ policy_id=str(policy_id).replace("-", ""))
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/rule/{policy_id}/{rule_id}", requires=api_key_authentication)
+ def delete_rule(policy_id: hug.types.uuid, rule_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.delete_rule(rule_id=str(rule_id).replace("-", ""), policy_id=str(policy_id).replace("-", ""))
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/model/{model_id}", requires=api_key_authentication)
+ def update_model(body, model_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_model(model_id=str(model_id).replace("-", ""), is_delete=False,
+ data=body)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/model/{model_id}", requires=api_key_authentication)
+ def delete_model(model_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_model(model_id=str(model_id).replace("-", ""), is_delete=True)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/meta_data/{category_id}/{type}", requires=api_key_authentication)
+ def delete_category(category_id: hug.types.uuid, type: hug.types.text, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.delete_category(category_id=str(category_id).replace("-", ""), type=type)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/meta_rule/{meta_rule_id}", requires=api_key_authentication)
+ def update_meta_rule(body, meta_rule_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_meta_rule(is_delete=False,
+ meta_rule_id=str(meta_rule_id).replace("-", ""), data=body)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/meta_rule/{meta_rule_id}", requires=api_key_authentication)
+ def delete_meta_rule(meta_rule_id: hug.types.uuid, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.update_meta_rule(is_delete=True,
+ meta_rule_id=str(meta_rule_id).replace("-", ""))
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/data/{data_id}/{type}", requires=api_key_authentication)
+ def delete_data(data_id: hug.types.uuid, type: hug.types.text, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.delete_data(data_id=str(data_id).replace("-", ""), type=type)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/attributes/{name}", requires=api_key_authentication)
+ def delete_data(name: hug.types.text, response):
+ update_pipeline = Update()
+ response.status = update_pipeline.delete_attributes(name=name)
diff --git a/moon_engine/moon_engine/api/pipeline/update_pipeline.py b/moon_engine/moon_engine/api/pipeline/update_pipeline.py
new file mode 100644
index 00000000..3b312efb
--- /dev/null
+++ b/moon_engine/moon_engine/api/pipeline/update_pipeline.py
@@ -0,0 +1,220 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+from moon_cache.cache import Cache
+from moon_engine.api.configuration import get_configuration
+import logging
+
+logger = logging.getLogger("moon.engine.api.pipeline.update_pipeline")
+
+
+class Update(object):
+ __CACHE = None
+
+ def __init__(self):
+ if not self.__CACHE:
+ self.__CACHE = Cache.getInstance(manager_url=get_configuration("manager_url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ def update_policy(self, is_delete, policy_id, data=None):
+
+ policies = self.__CACHE.policies
+ if is_delete:
+ if policy_id in policies:
+ del policies[policy_id]
+ else:
+ if policy_id in policies:
+ policies[policy_id] = data
+ else:
+ return hug.HTTP_208
+ return hug.HTTP_202
+
+ def update_pdp(self, is_delete, pdp_id, data=None):
+
+ pdps = self.__CACHE.pdp
+ if is_delete:
+ if pdp_id in pdps:
+ del pdps[pdp_id]
+ else:
+ if pdp_id in pdps:
+ pdps[pdp_id] = data
+ else:
+ return hug.HTTP_208
+ return hug.HTTP_202
+
+ def delete_assignment(self, type, policy_id, perimeter_id=None, category_id=None, data_id=None):
+
+ if type == "subject":
+ assignments = self.__CACHE.subject_assignments
+ if policy_id in assignments:
+ for key in assignments[policy_id]:
+ if (perimeter_id is None or assignments[policy_id][key]['subject_id'] ==
+ perimeter_id) and (
+ category_id is None or assignments[policy_id][key]['category_id'] == category_id):
+ if data_id is None or data_id in assignments[policy_id][key]['assignments']:
+ assignments[policy_id][key]['assignments'].remove(data_id)
+ if len(assignments[policy_id][key]['assignments']) == 0:
+ del assignments[policy_id][key];
+ else:
+ del assignments[policy_id][key]
+ break
+
+ elif type == "object":
+ assignments = self.__CACHE.object_assignments
+ if policy_id in assignments:
+ for key in assignments[policy_id]:
+ if (perimeter_id is None or assignments[policy_id][key]['object_id'] ==
+ perimeter_id) and (
+ category_id is None or assignments[policy_id][key]['category_id'] == category_id):
+ if data_id is None or data_id in assignments[policy_id][key]['assignments']:
+ assignments[policy_id][key]['assignments'].remove(data_id)
+ if len(assignments[policy_id][key]['assignments']) == 0:
+ del assignments[policy_id][key];
+ else:
+ del assignments[policy_id][key]
+ break
+ else:
+ assignments = self.__CACHE.action_assignments
+ if policy_id in assignments:
+ for key in assignments[policy_id]:
+ if (perimeter_id is None or assignments[policy_id][key]['action_id'] ==
+ perimeter_id) and (
+ category_id is None or assignments[policy_id][key]['category_id'] == category_id):
+ if data_id is None or data_id in assignments[policy_id][key]['assignments']:
+ assignments[policy_id][key]['assignments'].remove(data_id)
+ if len(assignments[policy_id][key]['assignments']) == 0:
+ del assignments[policy_id][key];
+ else:
+ del assignments[policy_id][key]
+ break
+ return hug.HTTP_202
+
+ def update_perimeter(self, is_delete, type, perimeter_id, data=None, policy_id=None):
+
+ if is_delete:
+ if type == "subject":
+ perimeters = self.__CACHE.subjects
+ if policy_id in perimeters and perimeter_id in perimeters[policy_id] and \
+ policy_id in perimeters[policy_id][perimeter_id]['policy_list']:
+ del perimeters[policy_id][perimeter_id]
+ elif type == "object":
+ perimeters = self.__CACHE.objects
+ if policy_id in perimeters and perimeter_id in perimeters[policy_id] and \
+ policy_id in perimeters[policy_id][perimeter_id]['policy_list']:
+ del perimeters[policy_id][perimeter_id]
+ else:
+ perimeters = self.__CACHE.actions
+ if policy_id in perimeters and perimeter_id in perimeters[policy_id] and \
+ policy_id in perimeters[policy_id][perimeter_id]['policy_list']:
+ del perimeters[policy_id][perimeter_id]
+ else:
+ if type == "subject":
+ perimeters = self.__CACHE.subjects
+ if policy_id in perimeters and perimeter_id in perimeters[policy_id] and \
+ policy_id in perimeters[policy_id][perimeter_id]['policy_list']:
+ perimeters[policy_id][perimeter_id]['name'] = data['name']
+ perimeters[policy_id][perimeter_id]['description'] = data['description']
+ else:
+ return hug.HTTP_208
+ elif type == "object":
+ perimeters = self.__CACHE.objects
+ if policy_id in perimeters and perimeter_id in perimeters[policy_id] and \
+ policy_id in perimeters[policy_id][perimeter_id]['policy_list']:
+ perimeters[policy_id][perimeter_id]['name'] = data['name']
+ perimeters[policy_id][perimeter_id]['description'] = data['description']
+ else:
+ return hug.HTTP_208
+ else:
+ perimeters = self.__CACHE.actions
+ if policy_id in perimeters and perimeter_id in perimeters[policy_id] and \
+ policy_id in perimeters[policy_id][perimeter_id]['policy_list']:
+ perimeters[policy_id][perimeter_id]['name'] = data['name']
+ perimeters[policy_id][perimeter_id]['description'] = data['description']
+ else:
+ return hug.HTTP_208
+ return hug.HTTP_202
+
+ def delete_rule(self, rule_id, policy_id):
+
+ rules = self.__CACHE.rules
+ if policy_id in rules and rule_id in rules[policy_id]:
+ del rules[policy_id][rule_id]
+ return hug.HTTP_202
+
+ def update_model(self, model_id, is_delete, data=None):
+ if is_delete:
+ models = self.__CACHE.models
+ if model_id in models:
+ del models[model_id]
+ else:
+ models = self.__CACHE.models
+ if model_id in models:
+ models[model_id] = data
+ else:
+ return hug.HTTP_208
+ return hug.HTTP_202
+
+ def delete_category(self, category_id, type):
+
+ if type == "subject":
+ categories = self.__CACHE.subject_categories
+ if category_id in categories:
+ del categories[category_id]
+ elif type == 'object':
+ categories = self.__CACHE.object_categories
+ if category_id in categories:
+ del categories[category_id]
+ else:
+ categories = self.__CACHE.action_categories
+ if category_id in categories:
+ del categories[category_id]
+ return hug.HTTP_202
+
+ def update_meta_rule(self, is_delete, meta_rule_id, data=None):
+
+ if is_delete:
+ meta_rules = self.__CACHE.meta_rules
+ if meta_rule_id in meta_rules:
+ del meta_rules[meta_rule_id]
+ else:
+ meta_rules = self.__CACHE.meta_rules
+ if meta_rule_id in meta_rules:
+ meta_rules[meta_rule_id] = data
+ else:
+ return hug.HTTP_208
+ return hug.HTTP_202
+
+ def delete_data(self, data_id, type):
+
+ if type == 'subject':
+ data = self.__CACHE.subject_data
+ if data_id in data:
+ del data[data_id]
+ elif type == 'object':
+ data = self.__CACHE.object_data
+ if data_id in data:
+ del data[data_id]
+ else:
+ data = self.__CACHE.action_data
+ if data_id in data:
+ del data[data_id]
+
+ return hug.HTTP_202
+
+ def delete_attributes(self, name):
+
+ attributes = self.__CACHE.attributes
+ self.__CACHE.set_attribute(name)
+
+ return hug.HTTP_202
diff --git a/moon_engine/moon_engine/api/pipeline/validator.py b/moon_engine/moon_engine/api/pipeline/validator.py
new file mode 100644
index 00000000..1fc8588a
--- /dev/null
+++ b/moon_engine/moon_engine/api/pipeline/validator.py
@@ -0,0 +1,125 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from moon_cache.context import Context
+from moon_utilities import exceptions
+import itertools
+import logging
+import hug
+from moon_cache.cache import Cache
+from moon_engine.api.configuration import get_configuration
+
+LOGGER = logging.getLogger("moon.authz.api." + __name__)
+
+
+class Validator(object):
+ __CACHE = None
+
+ def __init__(self):
+
+ self.__CACHE = Cache.getInstance(manager_url=get_configuration("manager_url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+ self.context = None
+
+ def authz(self, subject_name, object_name, action_name):
+
+ ctx = {
+ "pdp_id": get_configuration("uuid"),
+ "subject_name": subject_name,
+ "object_name": object_name,
+ "action_name": action_name
+ }
+ self.context = Context(ctx, self.__CACHE)
+
+ self.context.set_cache(self.__CACHE)
+ self.context.increment_index()
+ response = self.__authz_request()
+ self.context.delete_cache()
+ return response
+
+ def __authz_request(self):
+
+ LOGGER.debug("self.context.pdp_set={}".format(self.context.pdp_set))
+ result, message = self.__check_rules()
+ if result:
+ if self.__exec_instructions(result):
+ return hug.HTTP_204
+ else:
+ self.context.current_state = "deny"
+ return hug.HTTP_403
+
+ def __check_rules(self):
+
+ scopes_list = list()
+ current_header_id = self.context.headers[self.context.index]
+ if not self.context.pdp_set:
+ raise exceptions.PdpUnknown
+ if current_header_id not in self.context.pdp_set:
+ raise Exception('Invalid index')
+ current_pdp = self.context.pdp_set[current_header_id]
+ category_list = list()
+ if 'meta_rules' not in current_pdp:
+ raise exceptions.PdpContentError
+ try:
+ category_list.extend(current_pdp["meta_rules"]["subject_categories"])
+ category_list.extend(current_pdp["meta_rules"]["object_categories"])
+ category_list.extend(current_pdp["meta_rules"]["action_categories"])
+ except Exception:
+ raise exceptions.MetaRuleContentError
+ if 'target' not in current_pdp:
+ raise exceptions.PdpContentError
+ for category in category_list:
+ scope = list(current_pdp['target'][category])
+ scopes_list.append(scope)
+ if self.context.current_policy_id not in self.__CACHE.rules:
+ raise exceptions.PolicyUnknown
+ if 'rules' not in self.__CACHE.rules[self.context.current_policy_id]:
+ raise exceptions.RuleUnknown
+
+ for item in itertools.product(*scopes_list):
+ req = list(item)
+ for rule in self.__CACHE.rules[self.context.current_policy_id]["rules"]:
+ if req == rule['rule']:
+ return rule['instructions'], ""
+ if not list(itertools.product(*scopes_list)):
+ LOGGER.error("There is an error in retrieved scopes ({})".format(scopes_list))
+ cat_list = []
+ categories = dict(self.__CACHE.subject_categories)
+ categories.update(dict(self.__CACHE.object_categories))
+ categories.update(dict(self.__CACHE.action_categories))
+ for category in category_list:
+ if category.startswith("attributes:"):
+ cat_list.append(category)
+ else:
+ cat_list.append(categories[category].get('name'))
+ LOGGER.error("Categories are ({})".format(", ".join(cat_list)))
+ return False, "There is an error in retrieved scopes"
+ LOGGER.warning("No rule match the request...")
+ return False, "No rule match the request..."
+
+ def __exec_instructions(self, instructions):
+
+ for instruction in instructions:
+ for key in instruction:
+ if key == "decision":
+ if instruction["decision"] == "grant":
+ self.context.current_state = "grant"
+ LOGGER.info("__exec_instructions True {}".format(
+ self.context.current_state))
+ return True
+ else:
+ self.context.current_state = instruction["decision"].lower()
+
+ LOGGER.info("__exec_instructions False {}".format(self.context.current_state))
+
+ return False
diff --git a/moon_engine/moon_engine/api/status.py b/moon_engine/moon_engine/api/status.py
new file mode 100644
index 00000000..2a44a865
--- /dev/null
+++ b/moon_engine/moon_engine/api/status.py
@@ -0,0 +1,30 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Status API"""
+import hug
+from moon_engine.api import configuration
+
+@hug.local()
+@hug.get("/status/")
+def list_status():
+ """
+ List statuses
+ :return: JSON status output
+ """
+
+ return {"status": {
+ "uuid": configuration.get_configuration("uuid"),
+ "type": configuration.get_configuration("type"),
+ "log" : configuration.get_configuration("logging").get(
+ "handlers", {}).get("file", {}).get("filename", "")
+ }}
diff --git a/moon_engine/moon_engine/api/wrapper/__init__.py b/moon_engine/moon_engine/api/wrapper/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_engine/moon_engine/api/wrapper/api/__init__.py b/moon_engine/moon_engine/api/wrapper/api/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/api/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_engine/moon_engine/api/wrapper/api/authz.py b/moon_engine/moon_engine/api/wrapper/api/authz.py
new file mode 100644
index 00000000..4d1e4a84
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/api/authz.py
@@ -0,0 +1,43 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Authz API"""
+
+import hug
+from moon_engine.api.wrapper.router import Router
+
+
+class Authz(object):
+ """
+ Endpoint for Authz requests
+ """
+
+ @staticmethod
+ @hug.local()
+ @hug.get("/authz/{project_id}/{subject_name}/{object_name}/{action_name}")
+ def get(project_id: hug.types.text, subject_name: hug.types.text, object_name: hug.types.text,
+ action_name: hug.types.text):
+ """Get a response on Main Authorization request
+
+ :param project_id: uuid of the project
+ :param subject_name: name of the subject or the request
+ :param object_name: name of the object
+ :param action_name: name of the action
+ :return:
+ "result": {true or false }
+ :internal_api: authz
+ """
+
+ with Router(project_id, subject_name, object_name, action_name) as router:
+
+ response = router.auth_request()
+ return response
diff --git a/moon_engine/moon_engine/api/wrapper/api/pipeline.py b/moon_engine/moon_engine/api/wrapper/api/pipeline.py
new file mode 100644
index 00000000..19b9578a
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/api/pipeline.py
@@ -0,0 +1,100 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Pipeline API"""
+import hug
+from moon_utilities.auth_functions import api_key_authentication
+from moon_engine import orchestration_driver
+from moon_utilities.security_functions import validate_input
+from moon_engine.api import configuration
+from moon_cache.cache import Cache
+
+CACHE = Cache.getInstance(manager_url=configuration.get_configuration("manager_url"),
+ incremental=configuration.get_configuration("incremental_updates"),
+ manager_api_key=configuration.get_configuration("api_token"))
+
+
+class Pipeline(object):
+ """
+ Endpoint for pipelines requests
+ """
+
+ @staticmethod
+ @hug.local()
+ @hug.get("/pipelines", requires=api_key_authentication)
+ @hug.get("/pipeline/{uuid}", requires=api_key_authentication)
+ def get(uuid: hug.types.uuid=None, authed_user: hug.directives.user=None):
+ """Retrieve all pipelines
+
+ :param uuid: uuid of the pipeline
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "pipeline_id1": {
+ "name": "...",
+ "description": "... (optional)",
+ }
+ }
+ """
+ uuid = str(uuid).replace("-", "")
+ orchestration_driver.init()
+ data = orchestration_driver.PipelineManager.get_pipelines(moon_user_id=authed_user,
+ pipeline_id=uuid)
+ return {"pipelines": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/pipeline/{uuid}", requires=api_key_authentication)
+ def put(uuid: hug.types.uuid, body: validate_input("name"),
+ authed_user: hug.directives.user = None):
+ """
+ Ask for the creation of a new pipeline
+ :param uuid: uuid of the pipeline
+ :param body: body of the request
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "name": "my_pdp",
+ "description": "...",
+ "vim_project_id": "an existing ID",
+ "security_pipelines": ["an existing policy ID", ],
+ "slave": ["name of a slave", ]
+ }
+ """
+ uuid = str(uuid).replace("-", "")
+ orchestration_driver.init()
+ data = orchestration_driver.PipelineManager.add_pipeline(moon_user_id=authed_user,
+ pipeline_id=uuid,
+ data=body)
+ CACHE.add_pipeline(uuid, data)
+ return {"pipelines": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/pipeline/{uuid}", requires=api_key_authentication)
+ def delete(uuid: hug.types.uuid, authed_user: hug.directives.user = None):
+ """
+ Ask for the deletion of a new pipeline
+ :param uuid: uuid of the pipeline
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "name": "my_pdp",
+ "description": "...",
+ "vim_project_id": "an existing ID",
+ "security_pipelines": ["an existing policy ID", ],
+ "slave": ["name of a slave", ]
+ }
+ """
+ uuid = str(uuid).replace("-", "")
+ orchestration_driver.init()
+ orchestration_driver.PipelineManager.delete_pipeline(moon_user_id=authed_user,
+ pipeline_id=uuid)
+ CACHE.delete_pipeline(uuid)
+ return True
diff --git a/moon_engine/moon_engine/api/wrapper/api/update.py b/moon_engine/moon_engine/api/wrapper/api/update.py
new file mode 100644
index 00000000..7af274e5
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/api/update.py
@@ -0,0 +1,179 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Update API"""
+import hug
+from moon_utilities.auth_functions import api_key_authentication
+from moon_engine.api.wrapper.update_wrapper import UpdateWrapper as UpdateWrapper
+
+
+class WrapperUpdate(object):
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update", requires=api_key_authentication)
+ def update(body, response, authed_user: hug.directives.user):
+ """Tell the moon_engine wrapper that its own data should be updated
+ It simply reloads the conf file
+
+ :return: 204 status code
+ """
+
+ # todo call wrapper to update its pdp at the cache
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.update_wrapper(data=body, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/pdp/{pdp_id}", requires=api_key_authentication)
+ def update_pdp(body, pdp_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ """Tell the moon_engine wrapper that its cache should be updated
+ body may contain the attributes that the moon_engine should get from the manager
+ if the attributes key is empty, all data should be retrieved
+ body example:
+ {
+ "vim_project_id": "...",
+ "security_pipeline": ["policy_id1", "policy_id2"],
+ "attributes": ["subjects", "subject_assignments", "subject_categories"]
+ }
+ :return: 202 status code
+ """
+
+ # todo call wrapper to update its pdp at the cache
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.update_pdp(pdp_id=str(pdp_id).replace("-", ""), data=body, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/pdp/{pdp_id}", requires=api_key_authentication)
+ def delete_pdp(pdp_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ """Tell the moon_engine wrapper that its cache should be updated
+ body may contain the attributes that the moon_engine should get from the manager
+ if the attributes key is empty, all data should be retrieved
+ body example:
+ {
+ "vim_project_id": "...",
+ "security_pipeline": ["policy_id1", "policy_id2"],
+ "attributes": ["subjects", "subject_assignments", "subject_categories"]
+ }
+ :return: 202 status code
+ """
+
+ # todo call wrapper to update its pdp at the cache
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_pdp(pdp_id=str(pdp_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/policy/{policy_id}", requires=api_key_authentication)
+ def update_policy(body, policy_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.update_policy(policy_id=str(policy_id).replace("-", ""), data=body, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/policy/{policy_id}", requires=api_key_authentication)
+ def delete_policy(policy_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_policy(policy_id=str(policy_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/assignment/{policy_id}/{type}/", requires=api_key_authentication)
+ @hug.delete("/update/assignment/{policy_id}/{type}/{perimeter_id}", requires=api_key_authentication)
+ @hug.delete("/update/assignment/{policy_id}/{type}/{perimeter_id}/{category_id}", requires=api_key_authentication)
+ @hug.delete("/update/assignment/{policy_id}/{type}/{perimeter_id}/{category_id}/{data_id}", requires=api_key_authentication)
+ def delete_assignment(response, policy_id: hug.types.uuid, type: hug.types.text,
+ perimeter_id: hug.types.uuid = None, category_id: hug.types.uuid = None,
+ data_id: hug.types.uuid = None, authed_user: hug.directives.user=None):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_assignment(type=type, policy_id=str(policy_id).replace("-", ""),
+ perimeter_id=str(perimeter_id).replace("-", ""),
+ category_id=str(category_id).replace("-", ""),
+ data_id=data_id, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/perimeter/{perimeter_id}/{policy_id}/{type}", requires=api_key_authentication)
+ def update_perimeter(body, perimeter_id: hug.types.uuid, policy_id: hug.types.uuid,
+ type: hug.types.text, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.update_perimeter( type=type,
+ perimeter_id=str(perimeter_id).replace("-", ""), data=body,
+ policy_id=str(policy_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/perimeter/{perimeter_id}/{policy_id}/{type}", requires=api_key_authentication)
+ def delete_perimeter(perimeter_id: hug.types.uuid, policy_id: hug.types.uuid,
+ type: hug.types.text, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_perimeter(type=type,
+ perimeter_id=str(perimeter_id).replace("-", ""),
+ policy_id=str(policy_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/rule/{policy_id}/{rule_id}", requires=api_key_authentication)
+ def delete_rule(policy_id: hug.types.uuid, rule_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_rule(rule_id=str(rule_id).replace("-", ""), policy_id=str(policy_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/model/{model_id}", requires=api_key_authentication)
+ def update_model(body, model_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.update_model(model_id=str(model_id).replace("-", ""), data=body, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/model/{model_id}", requires=api_key_authentication)
+ def delete_model(model_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_model(model_id=str(model_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/meta_data/{category_id}/{type}", requires=api_key_authentication)
+ def delete_category(category_id: hug.types.uuid, type: hug.types.text, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_category(category_id=str(category_id).replace("-", ""), type=type, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/update/meta_rule/{meta_rule_id}", requires=api_key_authentication)
+ def update_meta_rule(body, meta_rule_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.update_meta_rule(meta_rule_id=str(meta_rule_id).replace("-", ""), data=body, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/meta_rule/{meta_rule_id}", requires=api_key_authentication)
+ def delete_meta_rule(meta_rule_id: hug.types.uuid, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_meta_rule(meta_rule_id=str(meta_rule_id).replace("-", ""), moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/data/{data_id}/{type}", requires=api_key_authentication)
+ def delete_data(data_id: hug.types.uuid, type: hug.types.text, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_data(data_id=str(data_id).replace("-", ""), type=type, moon_user_id=authed_user)
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/update/attributes/{name}", requires=api_key_authentication)
+ def delete_data(name: str, response, authed_user: hug.directives.user):
+ update_wrapper = UpdateWrapper()
+ response.status = update_wrapper.delete_attributes(name=name, moon_user_id=authed_user)
+
diff --git a/moon_engine/moon_engine/api/wrapper/router.py b/moon_engine/moon_engine/api/wrapper/router.py
new file mode 100644
index 00000000..db6b6e24
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/router.py
@@ -0,0 +1,115 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from moon_utilities import exceptions
+from moon_cache.cache import Cache
+from uuid import uuid4
+import logging
+import requests
+from moon_engine.api.configuration import get_configuration
+
+LOGGER = logging.getLogger("moon.engine.wrapper." + __name__)
+
+
+class Router(object):
+ __CACHE = None
+
+ def __init__(self, project_id, subject_name, object_name, action_name):
+
+ if not self.__CACHE:
+ self.__CACHE = Cache.getInstance(manager_url=get_configuration("manager_url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ self.pipeline_id = self.__check_pdp_from_cache(project_id)
+
+ self.request_id = uuid4().hex
+
+ self.ctx = {
+ "project_id": project_id,
+ "subject_name": subject_name,
+ "object_name": object_name,
+ "action_name": action_name
+ }
+
+ # ToDo add status of request
+ self.__CACHE.authz_requests[self.request_id] = {}
+
+ pdp_id = self.__CACHE.get_pdp_from_vim_project(project_id)
+ self.__CACHE.update(pipeline=pdp_id)
+ self.pipeline = []
+ if self.pipeline_id in self.__CACHE.pipelines:
+ self.pipeline = self.__CACHE.pipelines[self.pipeline_id]
+
+ if len(self.pipeline) == 0 or not all(
+ k in self.pipeline for k in ("host", "port")):
+ raise exceptions.MoonError('Void container chaining')
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.__CACHE.authz_requests.pop(self.request_id)
+
+ def auth_request(self):
+ req = None
+ endpoint = self.__CACHE.get_pipeline_url(self.ctx["project_id"])
+
+ try:
+ req = requests.get("{}/authz/{}/{}/{}".format(
+ endpoint,
+ self.ctx["subject_name"],
+ self.ctx["object_name"],
+ self.ctx["action_name"]),
+ timeout=2
+ )
+
+ if req.status_code != 200 and req.status_code != 202 and req.status_code != 204:
+ raise exceptions.AuthzException(
+ "Receive bad response from Authz function (with address - {})"
+ .format(req.status_code))
+
+ except requests.exceptions.ConnectionError:
+ LOGGER.error("Cannot connect to {}".format(
+ "{}/authz".format(endpoint))
+ )
+ except requests.exceptions.ReadTimeout:
+ LOGGER.error("Timeout error")
+ return {"result": False, "message": "Timeout during request for pipeline"}, 400
+ except Exception as e:
+ LOGGER.error("Unexpected error:", e)
+ return {"result": False, "message": e}, 400
+
+ if not req:
+ raise exceptions.AuthzException("Cannot connect to Authz function")
+
+ if req.status_code == 204:
+ return {"result": True, "message": ""}
+ return {"result": False, "message": req.content}, 400
+
+ def __check_pdp_from_cache(self, uuid):
+ """Check if a PDP exist with this ID in the cache of this component
+
+ :param uuid: Keystone Project ID
+ :return: True or False
+ """
+
+ if self.__CACHE.get_pdp_from_vim_project(uuid):
+ return self.__CACHE.get_pipeline_id_from_project_id(uuid)
+
+ self.__CACHE.update()
+
+ if self.__CACHE.get_pdp_from_vim_project(uuid):
+ return self.__CACHE.get_pipeline_id_from_project_id(uuid)
+
+ raise exceptions.MoonError("Unknown Project ID {}".format(uuid))
+
diff --git a/moon_engine/moon_engine/api/wrapper/update_wrapper.py b/moon_engine/moon_engine/api/wrapper/update_wrapper.py
new file mode 100644
index 00000000..bb388472
--- /dev/null
+++ b/moon_engine/moon_engine/api/wrapper/update_wrapper.py
@@ -0,0 +1,233 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+import sys
+
+import hug
+import requests
+from moon_engine import orchestration_driver
+from moon_cache.cache import Cache
+from moon_engine.api.configuration import get_configuration, reload_configuration
+from moon_utilities import exceptions
+
+logger = logging.getLogger("moon.engine.api.wrapper" + __name__)
+
+
+class UpdateWrapper(object):
+ __CACHE = None
+
+ def __init__(self):
+ if not self.__CACHE:
+ self.__CACHE = Cache.getInstance(
+ manager_url=get_configuration("manager_url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ def update_wrapper(self, data, moon_user_id=None):
+ reload_configuration()
+ return hug.HTTP_204
+
+ def update_pdp(self, pdp_id, data, moon_user_id=None):
+
+ url_pattern = "update/pdp/{}".format(pdp_id)
+ return self.__process_request(url_pattern, body=data, moon_user_id=moon_user_id, pdp_id=pdp_id)
+
+ def delete_pdp(self, pdp_id, moon_user_id=None):
+
+ url_pattern = "update/pdp/{}".format(pdp_id)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, pdp_id=pdp_id, delete=True)
+
+ def delete_policy(self, policy_id, moon_user_id=None):
+ url_pattern = "update/policy/{}".format(policy_id)
+ return self.__process_request(url_pattern, moon_user_id, policy_id=policy_id, delete=True)
+
+ def update_policy(self, policy_id, data=None, moon_user_id=None):
+
+ url_pattern = "update/policy/{}".format(policy_id)
+ return self.__process_request(url_pattern, body=data, moon_user_id=moon_user_id,
+ policy_id=policy_id)
+
+ def delete_assignment(self, type, policy_id, perimeter_id=None, category_id=None, data_id=None,
+ moon_user_id=None):
+
+ if policy_id and perimeter_id and category_id and data_id:
+ url_pattern = "update/assignment/{}/{}/{}/{}/{}".format(policy_id, type, perimeter_id,
+ category_id,
+ data_id)
+
+ if policy_id and perimeter_id and category_id:
+ url_pattern = "update/assignment/{}/{}/{}/{}".format(policy_id, type, perimeter_id,
+ category_id)
+
+ if policy_id and perimeter_id:
+ url_pattern = "update/assignment/{}/{}/{}".format(policy_id, type, perimeter_id)
+
+ if policy_id:
+ url_pattern = "update/assignment/{}/{}".format(policy_id, type)
+
+ return self.__process_request(url_pattern, moon_user_id, policy_id=policy_id, delete=True)
+
+ def update_perimeter(self, type, perimeter_id, data=None, policy_id=None, moon_user_id=None):
+ url_pattern = "update/perimeter/{}/{}/{}".format(perimeter_id, policy_id, type)
+ return self.__process_request(url_pattern, body=data, moon_user_id=moon_user_id,
+ policy_id=policy_id)
+
+ def delete_perimeter(self, type, perimeter_id, policy_id=None, moon_user_id=None):
+ url_pattern = "update/perimeter/{}/{}/{}".format(perimeter_id, policy_id, type)
+ return self.__process_request(url_pattern, moon_user_id, policy_id=policy_id, delete=True)
+
+ def delete_rule(self, rule_id, policy_id, moon_user_id=None):
+
+ url_pattern = "update/rule/{}/{}".format(policy_id, rule_id)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, policy_id=policy_id,
+ delete=True)
+
+ def update_model(self, model_id, data=None, moon_user_id=None):
+
+ url_pattern = "update/model/{}".format(model_id)
+ return self.__process_request(url_pattern, body=data, moon_user_id=moon_user_id)
+
+ def delete_model(self, model_id, moon_user_id=None):
+
+ url_pattern = "update/model/{}".format(model_id)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, delete=True)
+
+ def delete_category(self, category_id, type, moon_user_id=None):
+
+ url_pattern = "update/meta_data/{}/{}".format(category_id, type)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, delete=True)
+
+ def update_meta_rule(self, meta_rule_id, data=None, moon_user_id=None):
+
+ url_pattern = "update/meta_rule/{}".format(meta_rule_id, type)
+ return self.__process_request(url_pattern, body=data, moon_user_id=moon_user_id)
+
+ def delete_meta_rule(self, meta_rule_id, moon_user_id=None):
+
+ url_pattern = "update/meta_rule/{}".format(meta_rule_id, type)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, delete=True)
+
+ def delete_data(self, data_id, type, moon_user_id=None):
+
+ url_pattern = "update/data/{}/{}".format(data_id, type)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, delete=True)
+
+ def delete_attributes(self, name, moon_user_id=None):
+
+ url_pattern = "update/attributes/{}".format(name)
+ return self.__process_request(url_pattern, moon_user_id=moon_user_id, delete=True)
+
+ def __process_request(self, url_pattern, body=None, moon_user_id=None, policy_id=None,
+ pdp_id=None, delete=False):
+ if policy_id:
+ endpoint = self.__CACHE.get_pipeline_url(pipeline_id=policy_id)
+ cached_api_key = self.__CACHE.get_api_key(pipeline_id=policy_id)
+ if orchestration_driver.PipelineManager:
+ _pdp_id = self.__CACHE.get_pdp_id_from_policy_id(policy_id=policy_id)
+ api_key = orchestration_driver.PipelineManager.get_pipeline_api_key(moon_user_id=moon_user_id, pipeline_id=_pdp_id)
+ if not api_key:
+ api_key = cached_api_key
+
+ if not endpoint:
+ return hug.HTTP_208
+ if delete:
+ return self.__execute_delete_request(endpoint, url_pattern, api_key)
+ else:
+ return self.__execute_put_request(endpoint, url_pattern, api_key, body)
+
+ elif pdp_id:
+ endpoint = self.__CACHE.get_pipeline_url(pdp_id=pdp_id)
+ cached_api_key = self.__CACHE.get_api_key(pdp_id=pdp_id)
+ if orchestration_driver.PipelineManager:
+ api_key = orchestration_driver.PipelineManager.get_pipeline_api_key(moon_user_id=moon_user_id, pipeline_id=pdp_id)
+ if not api_key:
+ api_key = cached_api_key
+
+ if not endpoint:
+ return hug.HTTP_208
+ if delete:
+ return self.__execute_delete_request(endpoint, url_pattern, api_key)
+ else:
+ return self.__execute_put_request(endpoint, url_pattern, api_key, body)
+
+ else:
+ pdps = self.__CACHE.pdp
+ for _pdp_id in pdps:
+ vim_project_id = pdps.get(_pdp_id, {}).get("vim_project_id")
+ if vim_project_id:
+ cached_api_key = self.__CACHE.get_api_key(project_id=vim_project_id)
+ if orchestration_driver.PipelineManager:
+ api_key = orchestration_driver.PipelineManager.get_pipeline_api_key(moon_user_id=moon_user_id, pipeline_id=_pdp_id)
+ if not api_key:
+ api_key = cached_api_key
+
+
+ endpoint = self.__CACHE.get_pipeline_url(project_id=vim_project_id)
+
+ if delete:
+ return self.__execute_delete_request(endpoint, url_pattern, api_key)
+ else:
+ return self.__execute_put_request(endpoint, url_pattern, api_key, body)
+ return hug.HTTP_206
+
+ @staticmethod
+ def __execute_put_request(endpoint, url_pattern, api_key, body):
+ logger.info(f"Sending a PUT request on {endpoint}/{url_pattern}")
+ try:
+ req = requests.put("{}/{}".format(
+ endpoint, url_pattern), headers={"X-Api-Key": api_key}, json=body)
+ logger.info(req)
+ if req.status_code == 200:
+ return hug.HTTP_200
+ if req.status_code == 202:
+ return hug.HTTP_202
+ if req.status_code == 208:
+ return hug.HTTP_208
+
+ else:
+ raise exceptions.AuthzException(
+ "Receive bad response from Authz function "
+ "(with address - {})".format(req.status_code))
+
+ except requests.exceptions.ConnectionError:
+ logger.error("Cannot connect to {}".format(
+ "{}/authz/{}".format(endpoint, url_pattern))
+ )
+ except Exception as e:
+ logger.exception("Unexpected error:", e)
+
+ @staticmethod
+ def __execute_delete_request(endpoint, url_pattern, api_key):
+ logger.info(f"Sending a DELETE request on {endpoint}/{url_pattern}")
+ try:
+ req = requests.delete("{}/{}".format(
+ endpoint, url_pattern), headers={"X-Api-Key": api_key})
+
+ if req.status_code == 200:
+ return hug.HTTP_200
+ if req.status_code == 202:
+ return hug.HTTP_202
+ if req.status_code == 208:
+ return hug.HTTP_208
+
+ else:
+ raise exceptions.AuthzException(
+ "Receive bad response from Authz function "
+ "(with address - {})".format(req.status_code))
+
+ except requests.exceptions.ConnectionError:
+ logger.error("Cannot connect to {}".format(
+ "{}/authz/{}".format(endpoint, url_pattern))
+ )
+ except Exception as e:
+ logger.exception("Unexpected error:", e)
diff --git a/moon_engine/moon_engine/authz_driver.py b/moon_engine/moon_engine/authz_driver.py
new file mode 100644
index 00000000..d6f0284b
--- /dev/null
+++ b/moon_engine/moon_engine/authz_driver.py
@@ -0,0 +1,68 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Authorization compute Driver"""
+
+import logging
+from moon_engine.api import configuration
+from moon_engine.api.authz import authz
+
+LOGGER = logging.getLogger("moon.manager.authz_driver")
+
+
+AuthzManager = None
+
+
+class Driver:
+ """
+ Generic driver
+ """
+
+ def __init__(self, driver_name, engine_name):
+ self.name = driver_name
+ self.plug = configuration.get_authz_driver()
+ self.driver = self.plug.Connector(driver_name, engine_name)
+
+
+class AuthzDriver(Driver):
+ """
+ Driver for authorization computation
+ """
+
+ def __init__(self, driver_name, engine_name):
+ super(AuthzDriver, self).__init__(driver_name, engine_name)
+ self.engine = engine_name
+
+ def get_authz(self, subject_name, object_name, action_name):
+ """
+ Get the result of the authorization process
+ :param subject_name:
+ :param object_name:
+ :param action_name:
+ :return:
+ """
+ raise NotImplementedError() # pragma: no cover
+
+
+def init():
+ """Initialize the managers
+
+ :return: nothing
+ """
+ global AuthzManager
+
+ LOGGER.info("Initializing driver")
+ conf = configuration.get_configuration("authorization")
+
+ AuthzManager = authz.AuthzManager(
+ AuthzDriver(conf['driver'], conf.get('url'))
+ )
diff --git a/moon_engine/moon_engine/orchestration_driver.py b/moon_engine/moon_engine/orchestration_driver.py
new file mode 100644
index 00000000..85ca436d
--- /dev/null
+++ b/moon_engine/moon_engine/orchestration_driver.py
@@ -0,0 +1,100 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+from moon_engine.api import configuration
+from moon_engine.api.orchestration import pipeline
+
+logger = logging.getLogger("moon.engine.orchestration_driver")
+
+
+PipelineManager = None
+
+
+class Driver:
+
+ def __init__(self, driver_name, engine_name):
+ self.name = driver_name
+ self.plug = configuration.get_orchestration_driver()
+ self.driver = self.plug.Connector(driver_name, engine_name)
+
+
+class PipelineDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(PipelineDriver, self).__init__(driver_name, engine_name)
+ self.engine = engine_name
+
+ def update_pipeline(self, pipeline_id, data):
+ """Update a pipeline
+
+ :param pipeline_id: the ID of the pipeline
+ :param data: a dictionary {
+ "name": "the name of the pipeline",
+ "description": "the description of the pipeline",
+ "wrapper": {"url": "http://127.0.0.1:20000"},
+ # "wrapper": {"url": "local"} # if the pipeline should be configured inside the wrapper
+ "plugins": ["moon_engine.plugins.authz", ] # the first plugin is the default
+ }
+ :return: the pipeline updated
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_pipeline(self, pipeline_id):
+ """Delete the pipeline
+
+ :param pipeline_id: the ID of the pipeline
+ :return: True if the pipeline has been deleted
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def add_pipeline(self, pipeline_id=None, data=None):
+ """Create a new pipeline
+
+ :param pipeline_id: (optional) the ID of the pipeline to create
+ :param data: a dictionary {
+ "name": "the name of the pipeline",
+ "description": "the description of the pipeline",
+ "wrapper": {"url": "http://127.0.0.1:20000"},
+ # "wrapper": {"url": "local"} # if the pipeline should be configured inside the wrapper
+ "plugins": ["moon_engine.plugins.authz", ] # the first plugin is the default
+ }
+ :return: the pipeline created
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def get_pipelines(self, pipeline_id=None):
+ """List one or more pipelines
+
+ :param pipeline_id: (optional) the ID of the pipeline to list
+ :return: a list of one or more pipelines
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def get_pipeline_api_key(self, pipeline_id):
+ """Returns the api key of the pipeline with id pipeline_id
+
+ :param pipeline_id: the ID of the pipeline to list
+ :return: The api key of the pipeline
+ """
+ raise NotImplementedError() # pragma: no cover
+
+
+def init():
+ global PipelineManager
+
+ logger.info("Initializing driver")
+ conf = configuration.get_configuration("orchestration")
+
+ PipelineManager = pipeline.PipelineManager(
+ PipelineDriver(conf['driver'], conf.get('url'))
+ )
diff --git a/moon_engine/moon_engine/plugins/__init__.py b/moon_engine/moon_engine/plugins/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_engine/moon_engine/plugins/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_engine/moon_engine/plugins/authz.py b/moon_engine/moon_engine/plugins/authz.py
new file mode 100644
index 00000000..e4a9c662
--- /dev/null
+++ b/moon_engine/moon_engine/plugins/authz.py
@@ -0,0 +1,32 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+from moon_engine.authz_driver import AuthzDriver
+
+PLUGIN_TYPE = "authz"
+LOGGER = logging.getLogger("moon.engine.plugins.authz")
+
+
+class AuthzConnector(AuthzDriver):
+
+ def __init__(self, driver_name, engine_name):
+ self.driver_name = driver_name
+ self.engine_name = engine_name
+
+ def get_authz(self, subject_name, object_name, action_name):
+ # FIXME: must add the real authorization engine here
+ return True
+
+
+class Connector(AuthzConnector):
+ pass
diff --git a/moon_engine/moon_engine/plugins/oslowrapper.py b/moon_engine/moon_engine/plugins/oslowrapper.py
new file mode 100644
index 00000000..020a648a
--- /dev/null
+++ b/moon_engine/moon_engine/plugins/oslowrapper.py
@@ -0,0 +1,137 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""
+Authz is the endpoint to get authorization response
+"""
+
+import logging
+import json
+import hug
+import requests
+from moon_utilities import exceptions
+from moon_cache.cache import Cache
+from moon_engine.api.configuration import get_configuration
+
+PLUGIN_TYPE = "wrapper_api"
+LOGGER = logging.getLogger("moon.wrapper.api." + __name__)
+
+
+class OsloWrapper(object):
+ """
+ Endpoint for authz requests
+ """
+
+ def __init__(self, **kwargs):
+ self.TIMEOUT = 5
+
+ @staticmethod
+ @hug.local()
+ @hug.post("/authz/oslo", output=hug.output_format.text)
+ def post(body, response):
+ LOGGER.debug("POST {}".format(body))
+ response.status = hug.HTTP_400
+ response_data = "False"
+ response.set_header('content-type', 'application/octet-stream')
+ try:
+ oslo_wrapper_checker = OsloWrapperChecker()
+ if oslo_wrapper_checker.manage_data(body):
+ response.status = hug.HTTP_200
+ response_data = "True"
+ except exceptions.AuthzException as exception:
+ LOGGER.error(exception, exc_info=True)
+ except Exception as exception:
+ LOGGER.error(exception, exc_info=True)
+
+ return response_data
+
+
+class OsloWrapperChecker(object):
+
+ def __init__(self):
+ self.CACHE = Cache.getInstance()
+
+ @staticmethod
+ def __get_subject(target, credentials):
+ # FIXME: we should use the ID instead of the name
+ _subject = target.get("target.user.name", "")
+ if not _subject and credentials:
+ _subject = credentials.get("token", {}).get("user", {}).get(
+ "name",
+ credentials.get("user_id", "none"))
+ if not _subject:
+ _subject = target.get("user_id", "")
+ return _subject
+
+ @staticmethod
+ def __get_object(target, credentials):
+ try:
+ # note: case of Glance
+ return target['target']['name']
+ except KeyError:
+ pass
+
+ # note: default case
+ return "all"
+
+ @staticmethod
+ def __get_project_id(target, credentials):
+ project_id = credentials.get("project_id")
+ LOGGER.info("project_id {}".format(project_id))
+ return project_id
+
+ def manage_data(self, body):
+ data = body
+ if not dict(body):
+ data = json.loads(body.decode("utf-8"))
+ try:
+ target = json.loads(data.get('target', {}))
+ except TypeError:
+ target = data.get('target', {})
+ try:
+ credentials = json.loads(data.get('credentials', {}))
+ except TypeError:
+ credentials = data.get('credentials', {})
+ rule = data.get('rule', "")
+ _subject = self.__get_subject(target, credentials)
+ _object = self.__get_object(target, credentials)
+ _action = rule.strip('"')
+ _project_id = self.__get_project_id(target, credentials)
+
+ host_url = self.CACHE.get_pipeline_url(project_id=_project_id)
+ if not host_url:
+ if get_configuration("grant_if_unknown_project"):
+ LOGGER.info("No interface found for {}, "
+ "granted anyway : grant_if_unknown_project is true in the conf file".format(_project_id))
+ return True
+ LOGGER.error("No interface found for {}".format(_project_id))
+ else:
+ LOGGER.debug("interface_url={}".format(host_url))
+ _url = "{}/authz/{}/{}/{}".format(
+ host_url,
+ _subject,
+ _object,
+ _action
+ )
+ LOGGER.debug("url={}".format(_url))
+ req = requests.get(_url, timeout=2)
+
+ if req.status_code == 204:
+ LOGGER.info("The request has been granted")
+ return True
+ LOGGER.debug("authz request: {} {}".format(req.status_code, req.content))
+ raise exceptions.AuthzException("error in authz request")
+
+
+def get_apis():
+ yield OsloWrapper
+
diff --git a/moon_engine/moon_engine/plugins/pyorchestrator.py b/moon_engine/moon_engine/plugins/pyorchestrator.py
new file mode 100644
index 00000000..bf2d70f9
--- /dev/null
+++ b/moon_engine/moon_engine/plugins/pyorchestrator.py
@@ -0,0 +1,372 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+import os
+import time
+import requests
+import subprocess # nosec
+from uuid import uuid4
+import yaml
+from moon_engine.orchestration_driver import PipelineDriver
+from moon_engine.api import configuration
+from moon_engine.api.configuration import get_configuration
+from moon_engine import get_api_key
+from moon_utilities.auth_functions import xor_decode
+from moon_utilities import exceptions
+from datetime import datetime
+
+LOGGER = logging.getLogger("moon.engine.orchestrator.driver.pyorchestrator")
+
+PLUGIN_TYPE = "orchestration"
+pipelines = {}
+ports = []
+
+
+def init():
+ """Initialize the plugin by initializing wrappers
+
+ :return: nothing
+ """
+
+ # FIXME: get pipelines from Manager
+ pass
+
+
+def create_gunicorn_config(host, port, server_type, uuid):
+ """Create a Gunicorn config file in a temporary directory
+
+ :return: filename
+ """
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ # (/tmp is a fallback solution)
+ _log_config = get_configuration("logging")
+ _log_config["handlers"]["file"]["filename"] = os.path.join(config_dir,
+ "moon_{}.log".format(uuid))
+ __manager_url = get_configuration("management")["url"]
+ filename = os.path.join(config_dir, "gunicorn_{}.cfg".format(uuid4().hex))
+ fd = open(filename, "w")
+ fd.write("""bind = "{host}:{port}"
+workers = {workers}
+moon = "{moon_filename}"
+ """.format(
+ host=host,
+ port=port,
+ workers=1,
+ moon_filename=os.path.join(config_dir, "moon_{}.yaml".format(uuid)),
+ ))
+ fd.close()
+ return filename
+
+
+def create_moon_config(uuid, manager_cnx=True, policy_file=None):
+ """Create a Moon config file in a temporary directory
+
+ :return: filename
+ """
+ LOGGER.info(f"create_moon_config({uuid})")
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ _log_config = get_configuration("logging")
+ _log_config["handlers"]["file"]["filename"] = os.path.join(config_dir,
+ "moon_{}.log".format(uuid))
+ if manager_cnx:
+ __manager_url = get_configuration("management")["url"]
+ api_token = get_api_key(get_configuration("management")["url"],
+ get_configuration("management")["user"],
+ get_configuration("management")["password"])
+ else:
+ __manager_url = ""
+ api_token = ""
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ # (/tmp is a fallback solution)
+ filename = os.path.join(config_dir, "moon_{}.yaml".format(uuid))
+ config_dict = {
+ "type": "pipeline",
+ "uuid": uuid,
+ "management": {
+ "url": __manager_url,
+ "token_file": os.path.join(config_dir, "db_{}.json".format(uuid))
+ },
+ "incremental_updates": True,
+ "api_token": api_token,
+ "data": "",
+ "logging": _log_config,
+ "authorization": get_configuration("authorization",
+ {"driver": "moon_engine.plugins.authz"}),
+ "plugins": get_configuration("plugins"),
+ "debug": get_configuration(key='debug', default=False)
+ }
+ if policy_file:
+ config_dict['data'] = policy_file
+ if not manager_cnx:
+ config_dict['uuid'] = ""
+ config_dict['incremental_updates'] = False
+ LOGGER.info("Writing config file to {}".format(filename))
+ yaml.dump(config_dict, open(filename, "w"), default_flow_style=False)
+ return filename
+
+
+def kill_server(uuid):
+ """Kill the server given its UUID
+
+ :param uuid: UUID of the server
+ :return: nothing
+ """
+ LOGGER.info("pipelines={}".format(pipelines))
+ if uuid in pipelines:
+ LOGGER.info("pipeline={}".format(pipelines[uuid]))
+ # Fixme: if the server has been restarted, the process attribute is empty
+ LOGGER.info("Killing server {} after {} of uptime".format(
+ uuid,
+ str(datetime.now() - datetime.fromtimestamp(pipelines[uuid]["starttime"]))
+ ))
+ with open(pipelines[uuid]["process"], 'r') as pid_file:
+ try:
+ pid = int(pid_file.read())
+ except ValueError:
+ LOGGER.error("The pid found in {} is not valid".format(pipelines[uuid]["process"]))
+ return
+
+ os.kill(pid, 15)
+ del_server_port(pipelines[uuid]["port"])
+ pipelines.pop(uuid)
+ else:
+ LOGGER.warning("Cannot find UUID {} in wrappers or interfaces".format(uuid))
+
+
+def get_ports_range():
+ ports_range = get_configuration("orchestration")["port"]
+ return int(ports_range.split(".")[0]), int(ports_range.split(".")[-1])
+
+
+def get_next_port(server_host="127.0.0.1"):
+ port_min, port_max = get_ports_range()
+ _port = port_min
+ _ports = []
+ for _pipeline in pipelines:
+ _ports.append(pipelines[_pipeline]["port"])
+ _ports.sort()
+ if not _ports:
+ _port = port_min
+ elif _ports[-1]+1 > port_max:
+ raise Exception(
+ "Cannot add a new slave because "
+ "the port range is bounded to {}".format(port_max))
+ while True:
+ if _port in _ports:
+ _port += 1
+ continue
+ try:
+ requests.get("http://{}:{}/status".format(server_host, _port), timeout=1)
+ except requests.exceptions.ConnectionError:
+ break
+ if _port > port_max:
+ raise Exception(
+ "Cannot add a new pipeline because "
+ "the port range is bounded to {}".format(port_max))
+ _port += 1
+ return _port
+
+
+def add_server_port(port):
+ ports.append(port)
+
+
+def del_server_port(port):
+ try:
+ ports.remove(port)
+ except ValueError:
+ LOGGER.warning("port {} is not in the known port".format(port))
+
+
+def get_server_url(uuid=None):
+ if not uuid:
+ return
+ url = ""
+ try:
+ if uuid in pipelines:
+ url = "http://{}:{}".format(pipelines[uuid]["server_ip"],
+ pipelines[uuid]["port"])
+ if url:
+ response = requests.get(url + "/status")
+ if response.status_code == 200:
+ return url
+ except TimeoutError:
+ LOGGER.warning("A timeout occurred when connecting to {}".format(url))
+ # if port has not be found in local data, try to get information from remote servers
+ port_min, port_max = get_ports_range()
+ host = "127.0.0.1"
+ for _port in range(port_min, port_max):
+ try:
+ req = requests.get("http://{}:{}/status".format(host, _port), timeout=1)
+ data = req.json()
+ if "status" in data and data["status"]["uuid"] == uuid:
+ return "http://{}:{}".format(host, _port)
+ except Exception as e:
+ LOGGER.warning("Error getting information from {} ({})".format(host, str(e)))
+ return
+
+
+def start_new_server(uuid):
+ """Start a new server in a new process
+
+ :param uuid: UUID of the server
+ :return: nothing
+ """
+ _url = get_server_url(uuid)
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ server_ip = "127.0.0.1"
+ config_filename = os.path.join(config_dir, "moon_{}.yaml".format(uuid))
+ LOGGER.info("Starting server {} {}".format(_url, uuid))
+ if _url:
+ _port = int(_url.split(":")[-1])
+ add_server_port(_port)
+ config = yaml.safe_load(open(config_filename))
+ log_file = config["logging"]["handlers"]["file"]["filename"]
+ _out = {
+ "pipeline_id": uuid,
+ "starttime": time.time(),
+ "port": _port,
+ "host": server_ip,
+ "server_ip": server_ip,
+ "log_file": log_file
+ }
+ else:
+ _port = get_next_port()
+ create_moon_config(uuid=uuid)
+ pid_file = os.path.join(config_dir, uuid + ".pid")
+ # NOTE: we have actually no solution to get the actual IP address
+ # so we need to put 0.0.0.0 in the host address
+ gunicorn_config = create_gunicorn_config(
+ host="0.0.0.0", # nosec
+ port=_port,
+ server_type="pipeline",
+ uuid=uuid)
+ command = ["gunicorn", "moon_engine.server:__hug_wsgi__", "--threads", "10",
+ "-p", pid_file, "-D", "-c", gunicorn_config]
+ LOGGER.info("Executing {}".format(" ".join(command)))
+ subprocess.Popen(command, stdout=subprocess.PIPE, close_fds=True) # nosec
+ # (command attribute is safe)
+ _out = {
+ "pipeline_id": uuid,
+ "starttime": time.time(),
+ "port": _port,
+ "host": server_ip,
+ "server_ip": server_ip,
+ "process": pid_file,
+ }
+ time.sleep(1)
+ config = yaml.safe_load(open(config_filename))
+ log_file = config["logging"]["handlers"]["file"]["filename"]
+ _out["log"] = log_file
+ for cpt in range(10):
+ try:
+ f_sock = open(log_file)
+ except FileNotFoundError:
+ time.sleep(1)
+ else:
+ break
+ else:
+ LOGGER.error("Cannot find log file ({})".format(log_file))
+ return
+ p_sock = 0
+ LOGGER.info("Process running")
+ while True:
+ f_sock.seek(p_sock)
+ latest_data = f_sock.read()
+ p_sock = f_sock.tell()
+ if latest_data and "APIKEY" in latest_data:
+ _index_start = latest_data.index("APIKEY=") + len("APIKEY=")
+ _index_stop = latest_data.index("\n", _index_start)
+ key = latest_data[_index_start:_index_stop].strip()
+ # api_key = get_api_key_for_user("admin")
+ api_key = configuration.get_configuration('api_token')
+ try:
+ engine_api_key = xor_decode(key, api_key)
+ except exceptions.DecryptError:
+ engine_api_key = False
+ _out["api_key"] = engine_api_key
+ break
+ time.sleep(1)
+
+ return _out
+
+
+class PipelineConnector(PipelineDriver):
+
+ def __init__(self, driver_name, engine_name):
+ self.driver_name = driver_name
+ self.engine_name = engine_name
+
+ def update_pipeline(self, pipeline_id, data):
+ _url = get_server_url(pipeline_id)
+ if not _url:
+ self.add_pipeline(pipeline_id, data)
+ if "security_pipeline" in data:
+ req = requests.post("{}/update".format(_url), json={"attributes": "pdp"})
+ if req.status_code == 206:
+ LOGGER.warning("No pipeline available...")
+ elif req.status_code != 202:
+ LOGGER.warning("Error sending upgrade command to pipeline ({})".format(req))
+ if "vim_project_id" in data and data['vim_project_id']:
+ LOGGER.warning("Cannot update vim_project_id for the moment")
+ # FIXME: manage vim_project_id
+
+ def delete_pipeline(self, pipeline_id):
+ LOGGER.info("Deleting pipeline {}".format(pipeline_id))
+ kill_server(pipeline_id)
+
+ def add_pipeline(self, pipeline_id=None, data=None):
+ LOGGER.debug("Adding POD in Engine {} {}".format(pipeline_id, data))
+ if not pipeline_id:
+ pipeline_id = uuid4().hex
+ if not data:
+ content = dict()
+ else:
+ content = dict(data)
+ content.update(start_new_server(pipeline_id))
+ pipelines[pipeline_id] = content
+ return pipelines[pipeline_id]
+
+ def get_pipelines(self, pipeline_id=None):
+ results = {}
+ for interface in pipelines:
+ results[interface] = {
+ "starttime": pipelines[interface]["starttime"],
+ "port": pipelines[interface]["port"],
+ "server_ip": pipelines[interface]["server_ip"],
+ "status": "down",
+ "log": pipelines[interface]["log"]
+ }
+ try:
+ req = requests.get("http://{}:{}/status".format(
+ pipelines[interface]["server_ip"],
+ pipelines[interface]["port"]
+ ))
+ if req.status_code == 200:
+ results[interface]["status"] = "up"
+ except TimeoutError:
+ LOGGER.warning("Timeout connecting {} on port {}".format(
+ pipelines[interface]["server_ip"],
+ pipelines[interface]["port"]
+ ))
+ return results
+
+ def get_pipeline_api_key(self, pipeline_id):
+ return pipelines.get(pipeline_id, {}).get('api_key', "")
+
+
+class Connector(PipelineConnector):
+ pass
+
+
+init()
diff --git a/moon_engine/moon_engine/server.py b/moon_engine/moon_engine/server.py
new file mode 100644
index 00000000..0b0f28b2
--- /dev/null
+++ b/moon_engine/moon_engine/server.py
@@ -0,0 +1,288 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+from falcon.http_error import HTTPError
+import hug
+import logging.config
+import json
+import re
+import requests
+import sys
+from uuid import uuid4
+from moon_engine.api import ERROR_CODE
+from moon_engine.api import status, logs, import_json, configuration
+from moon_utilities import exceptions
+from moon_utilities import auth_functions
+from moon_utilities import json_utils
+from moon_cache import cache
+from moon_engine import authz_driver
+
+LOGGER = logging.getLogger("moon.engine.server")
+CACHE = None
+
+
+@hug.directive()
+def server_uuid(default="", **kwargs):
+ """
+ Hug directive allowing to get the UUID of the component everywhere
+ :param default:
+ :param kwargs:
+ :return: UUID of the component
+ """
+ return configuration.get_configuration("uuid")
+
+
+def get_updates_from_manager():
+ """
+ Request the Manager to get all data from the database
+ :return: None
+ """
+ LOGGER.info("Retrieving all data from Manager")
+ for attribute in (
+ "pdp",
+ "models",
+ "policies",
+ "subjects",
+ "objects",
+ "actions",
+ "subject_categories",
+ "object_categories",
+ "action_categories",
+ "subject_assignments",
+ "object_assignments",
+ "action_assignments",
+ "meta_rules",
+ # "rules",
+ ):
+ # Note: force updates by getting attributes
+ LOGGER.info("Retrieving {} from manager {}".format(
+ attribute, configuration.get_configuration("manager_url")))
+ getattr(CACHE, attribute)
+
+
+def get_updates_from_local_conf():
+ """
+ Read the local data file and update the cache
+ :return: None
+ """
+ filename = configuration.get_configuration("data")
+ LOGGER.info("Retrieving all data from configuration ({})".format(filename))
+ data = json.load(open(filename))
+ LOGGER.debug("keys={}".format(list(data.keys())))
+ tool = json_utils.JsonImport(driver_name="cache", driver=CACHE)
+ tool.import_json(body=data)
+
+
+def get_attributes_from_config(filename):
+ """
+ Retrieve the configuration from the file given in the command line
+ :param filename: filename of the configuration file
+ :return: None
+ """
+ # TODO: manage the case if the filename attribute doesn't contain a true filename
+ # => case if it doesn't start with Gunicorn
+ # => generate a temporary RAM file and point to the moon.yaml in the source code
+ for line in open(filename):
+ _match_conf = re.match(r"moon\s*=\s*\"(.+)\"", line)
+ if _match_conf:
+ yaml_filename = _match_conf.groups()[0]
+ configuration.CONF_FILE = yaml_filename
+ _conf = configuration.search_config_file(yaml_filename)
+ break
+ else:
+ LOGGER.warning("Cannot find Moon configuration filename in {}".format(filename))
+ _conf = configuration.search_config_file("moon.yaml")
+
+ configuration.set_configuration(_conf)
+
+
+def get_bind_from_configfile(filename):
+ """
+ Retrieve the binding configuration from the file given in the command line
+ :param filename: filename of the configuration file
+ :return: URL
+ """
+ # TODO: manage the case if the filename attribute doesn't contain a true filename
+ # => case if it doesn't start with Gunicorn
+ # => case during tests
+ # => generate a temporary RAM file and point to the moon.yaml in the source code
+ for line in open(filename):
+ _match_conf = re.match(r"bind\s*=\s*\"(.+)\"", line)
+ if _match_conf:
+ return "http://" + _match_conf.groups()[0].replace("0.0.0.0", "127.0.0.1") # nosec
+ else:
+ LOGGER.warning("Cannot find binding configuration in {}".format(filename))
+
+
+def init_logging_system():
+ """
+ Initialize the logging system
+ either by the configuration given in the configuration file
+ either by the configuration in the Manager
+ :return: None
+ """
+ logging_conf = configuration.get_configuration("logging")
+ manager_url = configuration.get_configuration("manager_url")
+ if logging_conf:
+ configuration.init_logging()
+ elif manager_url:
+ req = requests.get("{}/config".format(manager_url))
+ if req.status_code != 200:
+ raise Exception("Error getting configuration data "
+ "from manager (code={})".format(req.status_code))
+ logging.config.dictConfig(req.json().get("logging", {}))
+
+
+def get_policy_configuration_from_manager():
+ """
+ Retrieve all data from the Manager
+ :return: None
+ """
+ pdp_id = CACHE.get_pdp_from_vim_project(configuration.get_configuration("uuid"))
+ CACHE.update(pdp_id=pdp_id)
+
+
+def init_pipeline():
+ """
+ Initialize the pipeline configuration
+ :return: None
+ """
+ if configuration.get_configuration("management").get("url"):
+ get_policy_configuration_from_manager()
+
+
+def initialize():
+ """Adds initial data to the api on startup"""
+ global CACHE
+ LOGGER.warning("Starting the server and initializing data")
+ filename = sys.argv[-1]
+ try:
+ get_attributes_from_config(filename)
+ except FileNotFoundError:
+ LOGGER.warning("{} file not found".format(filename))
+ except IsADirectoryError:
+ LOGGER.warning("{} file is a directory.".format(filename))
+
+ init_logging_system()
+
+ LOGGER.info("management={}".format(configuration.get_configuration("management")))
+ auth_functions.init_db(configuration.get_configuration("management").get("token_file"))
+ CACHE = cache.Cache.getInstance(
+ manager_url=configuration.get_configuration("management").get('url'),
+ incremental=configuration.get_configuration("incremental_updates"),
+ manager_api_key=configuration.get_configuration("api_token"))
+
+ if configuration.get_configuration("type") == "pipeline":
+ init_pipeline()
+
+ if not configuration.get_configuration("incremental_updates"):
+ if configuration.get_configuration("manager_url"):
+ get_updates_from_manager()
+ elif configuration.get_configuration("data"):
+ get_updates_from_local_conf()
+ auth_functions.add_user("admin", uuid4().hex)
+ # NOTE: the password is not saved anywhere but
+ # the API key is printed in the log
+ # and is xor-ed with the Manager API key
+ api_key = auth_functions.get_api_key_for_user("admin")
+ LOGGER.info(f"api_key={api_key}")
+ LOGGER.info(f"configuration.get_configuration('api_token')={configuration.get_configuration('api_token')}")
+ try:
+ encrypt_key = auth_functions.xor_encode(api_key,
+ configuration.get_configuration("api_token"))
+ except exceptions.EncryptError:
+ encrypt_key = ""
+ try:
+ local_server = get_bind_from_configfile(filename)
+ CACHE.set_current_server(url=local_server, api_key=api_key)
+ except (FileNotFoundError, IsADirectoryError):
+ LOGGER.warning("Cannot find configuration file {}".format(filename))
+ LOGGER.critical("APIKEY={}".format(encrypt_key))
+ authz_driver.init()
+
+
+def __get_status_code(exception):
+ """
+ Return the status code to send depending on the exception thrown
+ :param exception: the exception that will be sent
+ :return:
+ """
+ if isinstance(exception, HTTPError):
+ return exception.status
+ status_code = getattr(exception, "code", 500)
+ if status_code in ERROR_CODE:
+ status_code = ERROR_CODE[status_code]
+ else:
+ status_code = hug.HTTP_500
+ return status_code
+
+
+@hug.exception(exceptions.MoonError)
+def handle_custom_exceptions(exception, response):
+ """
+ Handle Moon exceptions
+ :param exception: the exception that has been raised
+ :param response: the response to send to the client
+ :return: JSON data to send to the client
+ """
+ response.status = __get_status_code(exception)
+ error_message = {"result": False,
+ 'message': str(exception),
+ "code": getattr(exception, "code", 500)}
+ LOGGER.exception(exception)
+ return error_message
+
+
+@hug.exception(Exception)
+def handle_exception(exception, response):
+ """
+ Handle general exceptions
+ :param exception: the exception that has been raised
+ :param response: the response to send to the client
+ :return: JSON data to send to the client
+ """
+ response.status = __get_status_code(exception)
+ LOGGER.exception(exception)
+ return {"result": False, 'message': str(exception), "code": getattr(exception, "code", 500)}
+
+
+def get_api_from_plugins(api_type):
+ return configuration.get_plugins_by_type(api_type)
+
+
+@hug.extend_api()
+def with_other_apis():
+ """
+ Give to Hug all available APIs
+ :return: list of APIs
+ """
+ initialize()
+ _type = configuration.get_configuration("type")
+ if _type == "wrapper":
+ from moon_engine.api.wrapper.api import pipeline
+ from moon_engine.api.wrapper.api import update as wrapper_update
+ from moon_engine.api.wrapper.api import authz as wrapper_authz
+ LOGGER.info("Starting the Wrapper API interfaces")
+ return [status, logs, import_json, wrapper_update, pipeline, wrapper_authz] + \
+ list(configuration.get_plugins_by_type("wrapper_api"))
+ elif _type == "pipeline":
+ from moon_engine.api.pipeline import update as pipeline_update
+ from moon_engine.api.pipeline import authz as pipeline_authz
+ LOGGER.info("Starting the Pipeline API interfaces")
+ return [status, logs, import_json, pipeline_update, pipeline_authz] + \
+ list(configuration.get_plugins_by_type("engine_api"))
+ raise Exception("The type of component must be 'wrapper' or 'pipeline' (got {} instead)".format(
+ _type
+ ))
+
+
diff --git a/moon_engine/moon_engine_users.json b/moon_engine/moon_engine_users.json
new file mode 100644
index 00000000..73b0355c
--- /dev/null
+++ b/moon_engine/moon_engine_users.json
@@ -0,0 +1 @@
+{"_default": {"1": {"username": "admin", "password": "a5791540e51dc5cda1f7c6ffdab6e6357327b958249fb4886b3afff1d958e01b33feb1c8a43217b47d4eea2e35f1570e3596e8ed40329a0e809c8c188e6cf6e1", "salt": "4ec5fdb4037ed533bb8f9bc42dcdd60182279862da45f14196a50a418eb1625e99a755597350158fea6e3ce6877e8dfde8caee9051e3f2b1c87326fdebc0d584", "api_key": "51f80492b399063ef60316ee4d4ef11cfbdb1ee1329c14569d39116e883105465b8730580e73a600df0a939bafbe18bfb0152bf7d2908957fb66c0968727a1e6"}}} \ No newline at end of file
diff --git a/moon_engine/requirements.txt b/moon_engine/requirements.txt
new file mode 100644
index 00000000..e229ef85
--- /dev/null
+++ b/moon_engine/requirements.txt
@@ -0,0 +1,7 @@
+hug
+pyaml
+gunicorn
+
+# only needed if the SQL driver is used
+sqlalchemy
+pymysql
diff --git a/moon_engine/setup.py b/moon_engine/setup.py
new file mode 100644
index 00000000..c2e0e34d
--- /dev/null
+++ b/moon_engine/setup.py
@@ -0,0 +1,55 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from setuptools import setup, find_packages
+import moon_engine
+
+
+setup(
+
+ name='moon_engine',
+
+ version=moon_engine.__version__,
+
+ packages=find_packages(),
+
+ author="Thomas Duval",
+
+ author_email="thomas.duval@orange.com",
+
+ description="",
+
+ long_description=open('README.md').read(),
+
+ install_requires=list(filter(
+ lambda s: (len(s.strip()) > 0 and s.strip()[0] != '#'),
+ open('requirements.txt').read().split('\n'))),
+
+ include_package_data=True,
+
+ url='',
+
+ classifiers=[
+ "Programming Language :: Python",
+ "Development Status :: 1 - Planning",
+ "License :: OSI Approved",
+ "Natural Language :: French",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python :: 3",
+ ],
+
+ entry_points={
+ 'console_scripts': [
+ 'moon_engine = moon_engine.__main__:run',
+ ],
+ }
+)
diff --git a/moon_engine/tests/func_policies/moon.yaml b/moon_engine/tests/func_policies/moon.yaml
new file mode 100644
index 00000000..128948fa
--- /dev/null
+++ b/moon_engine/tests/func_policies/moon.yaml
@@ -0,0 +1,58 @@
+type: "pipeline"
+uuid:
+manager_url: ""
+incremental_updates: false
+api_token:
+data: policy_rbac.json
+debug: true
+
+management:
+ password: admin
+ url: http://127.0.0.1:8000
+ user: admin
+ token_file: moon_engine_users.json
+
+orchestration:
+ driver: moon_engine.plugins.pyorchestrator
+ connection: local
+ port: 20000...20100
+ config_dir: /tmp
+
+authorization:
+ driver: moon_engine.plugins.authz
+
+plugins:
+ directory: /tmp
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon_engine.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console] \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/opst_rbac.json b/moon_engine/tests/func_policies/opst_rbac.json
new file mode 100644
index 00000000..6f95db86
--- /dev/null
+++ b/moon_engine/tests/func_policies/opst_rbac.json
@@ -0,0 +1,59378 @@
+{
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy",
+ "genre": "authz",
+ "description": "A RBAC policy similar of what you can find through policy.json files",
+ "model": {
+ "name": "OPST_RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "OPST_RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "a role in OpenStack"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "the admin role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "member",
+ "description": "the member role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {
+ "name": "admin"
+ },
+ "category": {
+ "name": "role"
+ },
+ "assignments": [
+ {
+ "name": "admin"
+ },
+ {
+ "name": "member"
+ }
+ ]
+ }
+ ],
+ "objects": [
+ {
+ "name": "all_vm",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "the UID of each virtual machine"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm",
+ "description": "represents all virtual machines in this project",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {
+ "name": "all_vm"
+ },
+ "category": {
+ "name": "id"
+ },
+ "assignments": [
+ {
+ "name": "all_vm"
+ }
+ ]
+ }
+ ],
+ "actions": [
+ {
+ "name": "volume:create",
+ "description": "volume:create action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete",
+ "description": "volume:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get",
+ "description": "volume:get action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_all",
+ "description": "volume:get_all action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_volume_metadata",
+ "description": "volume:get_volume_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete_volume_metadata",
+ "description": "volume:delete_volume_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_volume_metadata",
+ "description": "volume:update_volume_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_volume_admin_metadata",
+ "description": "volume:get_volume_admin_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_volume_admin_metadata",
+ "description": "volume:update_volume_admin_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_snapshot",
+ "description": "volume:get_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_all_snapshots",
+ "description": "volume:get_all_snapshots action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:create_snapshot",
+ "description": "volume:create_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete_snapshot",
+ "description": "volume:delete_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_snapshot",
+ "description": "volume:update_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:extend",
+ "description": "volume:extend action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_readonly_flag",
+ "description": "volume:update_readonly_flag action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:retype",
+ "description": "volume:retype action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update",
+ "description": "volume:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:types_manage",
+ "description": "volume_extension:types_manage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:types_extra_specs",
+ "description": "volume_extension:types_extra_specs action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:access_types_qos_specs_id",
+ "description": "volume_extension:access_types_qos_specs_id action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:access_types_extra_specs",
+ "description": "volume_extension:access_types_extra_specs action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_access",
+ "description": "volume_extension:volume_type_access action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess",
+ "description": "volume_extension:volume_type_access:addProjectAccess action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess",
+ "description": "volume_extension:volume_type_access:removeProjectAccess action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_encryption",
+ "description": "volume_extension:volume_type_encryption action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_encryption_metadata",
+ "description": "volume_extension:volume_encryption_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:extended_snapshot_attributes",
+ "description": "volume_extension:extended_snapshot_attributes action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_image_metadata",
+ "description": "volume_extension:volume_image_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quotas:show",
+ "description": "volume_extension:quotas:show action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quotas:update",
+ "description": "volume_extension:quotas:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quotas:delete",
+ "description": "volume_extension:quotas:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quota_classes",
+ "description": "volume_extension:quota_classes action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use",
+ "description": "volume_extension:quota_classes:validate_setup_for_nested_quota_use action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status",
+ "description": "volume_extension:volume_admin_actions:reset_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status",
+ "description": "volume_extension:snapshot_admin_actions:reset_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status",
+ "description": "volume_extension:backup_admin_actions:reset_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete",
+ "description": "volume_extension:volume_admin_actions:force_delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach",
+ "description": "volume_extension:volume_admin_actions:force_detach action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete",
+ "description": "volume_extension:snapshot_admin_actions:force_delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete",
+ "description": "volume_extension:backup_admin_actions:force_delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume",
+ "description": "volume_extension:volume_admin_actions:migrate_volume action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion",
+ "description": "volume_extension:volume_admin_actions:migrate_volume_completion action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_host_attribute",
+ "description": "volume_extension:volume_host_attribute action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_tenant_attribute",
+ "description": "volume_extension:volume_tenant_attribute action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_mig_status_attribute",
+ "description": "volume_extension:volume_mig_status_attribute action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:hosts",
+ "description": "volume_extension:hosts action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:services:index",
+ "description": "volume_extension:services:index action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:services:update",
+ "description": "volume_extension:services:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_manage",
+ "description": "volume_extension:volume_manage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_unmanage",
+ "description": "volume_extension:volume_unmanage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:capabilities",
+ "description": "volume_extension:capabilities action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:create_transfer",
+ "description": "volume:create_transfer action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:accept_transfer",
+ "description": "volume:accept_transfer action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete_transfer",
+ "description": "volume:delete_transfer action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_all_transfers",
+ "description": "volume:get_all_transfers action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:replication:promote",
+ "description": "volume_extension:replication:promote action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:replication:reenable",
+ "description": "volume_extension:replication:reenable action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:enable_replication",
+ "description": "volume:enable_replication action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:disable_replication",
+ "description": "volume:disable_replication action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:failover_replication",
+ "description": "volume:failover_replication action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:list_replication_targets",
+ "description": "volume:list_replication_targets action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:create",
+ "description": "backup:create action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:delete",
+ "description": "backup:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:get",
+ "description": "backup:get action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:get_all",
+ "description": "backup:get_all action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:restore",
+ "description": "backup:restore action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:backup-import",
+ "description": "backup:backup-import action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:backup-export",
+ "description": "backup:backup-export action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status",
+ "description": "snapshot_extension:snapshot_actions:update_snapshot_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "snapshot_extension:snapshot_manage",
+ "description": "snapshot_extension:snapshot_manage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "snapshot_extension:snapshot_unmanage",
+ "description": "snapshot_extension:snapshot_unmanage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:create",
+ "description": "consistencygroup:create action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:delete",
+ "description": "consistencygroup:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:update",
+ "description": "consistencygroup:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get",
+ "description": "consistencygroup:get action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get_all",
+ "description": "consistencygroup:get_all action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:create_cgsnapshot",
+ "description": "consistencygroup:create_cgsnapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:delete_cgsnapshot",
+ "description": "consistencygroup:delete_cgsnapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get_cgsnapshot",
+ "description": "consistencygroup:get_cgsnapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get_all_cgsnapshots",
+ "description": "consistencygroup:get_all_cgsnapshots action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools",
+ "description": "scheduler_extension:scheduler_stats:get_pools action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_image",
+ "description": "add_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_image",
+ "description": "delete_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_image",
+ "description": "get_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_image",
+ "description": "modify_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "publicize_image",
+ "description": "publicize_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "communitize_image",
+ "description": "communitize_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "copy_from",
+ "description": "copy_from action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "download_image",
+ "description": "download_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "upload_image",
+ "description": "upload_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_image_location",
+ "description": "delete_image_location action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_image_location",
+ "description": "get_image_location action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image_location",
+ "description": "set_image_location action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_member",
+ "description": "add_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_member",
+ "description": "delete_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_member",
+ "description": "get_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_members",
+ "description": "get_members action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_member",
+ "description": "modify_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "manage_image_cache",
+ "description": "manage_image_cache action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_task",
+ "description": "get_task action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_tasks",
+ "description": "get_tasks action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_task",
+ "description": "add_task action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_task",
+ "description": "modify_task action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "tasks_api_access",
+ "description": "tasks_api_access action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "deactivate",
+ "description": "deactivate action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "reactivate",
+ "description": "reactivate action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_namespace",
+ "description": "get_metadef_namespace action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_namespaces",
+ "description": "get_metadef_namespaces action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_namespace",
+ "description": "modify_metadef_namespace action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_namespace",
+ "description": "add_metadef_namespace action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_object",
+ "description": "get_metadef_object action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_objects",
+ "description": "get_metadef_objects action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_object",
+ "description": "modify_metadef_object action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_object",
+ "description": "add_metadef_object action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "list_metadef_resource_types",
+ "description": "list_metadef_resource_types action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_resource_type",
+ "description": "get_metadef_resource_type action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_resource_type_association",
+ "description": "add_metadef_resource_type_association action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_property",
+ "description": "get_metadef_property action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_properties",
+ "description": "get_metadef_properties action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_property",
+ "description": "modify_metadef_property action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_property",
+ "description": "add_metadef_property action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_tag",
+ "description": "get_metadef_tag action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_tags",
+ "description": "get_metadef_tags action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_tag",
+ "description": "modify_metadef_tag action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_tag",
+ "description": "add_metadef_tag action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_tags",
+ "description": "add_metadef_tags action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_region",
+ "description": "identity:get_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_regions",
+ "description": "identity:list_regions action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_region",
+ "description": "identity:create_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_region",
+ "description": "identity:update_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_region",
+ "description": "identity:delete_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_service",
+ "description": "identity:get_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_services",
+ "description": "identity:list_services action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_service",
+ "description": "identity:create_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_service",
+ "description": "identity:update_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_service",
+ "description": "identity:delete_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_endpoint",
+ "description": "identity:get_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints",
+ "description": "identity:list_endpoints action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_endpoint",
+ "description": "identity:create_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_endpoint",
+ "description": "identity:update_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_endpoint",
+ "description": "identity:delete_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_registered_limit",
+ "description": "identity:get_registered_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_registered_limits",
+ "description": "identity:list_registered_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_registered_limits",
+ "description": "identity:create_registered_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_registered_limits",
+ "description": "identity:update_registered_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_registered_limit",
+ "description": "identity:delete_registered_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_limit",
+ "description": "identity:get_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_limits",
+ "description": "identity:list_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_limits",
+ "description": "identity:create_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_limits",
+ "description": "identity:update_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_limit",
+ "description": "identity:delete_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain",
+ "description": "identity:get_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_domains",
+ "description": "identity:list_domains action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_domain",
+ "description": "identity:create_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_domain",
+ "description": "identity:update_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_domain",
+ "description": "identity:delete_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_target_project_domain_id",
+ "description": "admin_and_matching_target_project_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_project_domain_id",
+ "description": "admin_and_matching_project_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_project",
+ "description": "identity:get_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects",
+ "description": "identity:list_projects action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_user_projects",
+ "description": "identity:list_user_projects action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_project",
+ "description": "identity:create_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_project",
+ "description": "identity:update_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_project",
+ "description": "identity:delete_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_project_tag",
+ "description": "identity:create_project_tag action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_project_tag",
+ "description": "identity:delete_project_tag action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_project_tag",
+ "description": "identity:get_project_tag action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_project_tags",
+ "description": "identity:list_project_tags action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_project_tags",
+ "description": "identity:delete_project_tags action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_project_tags",
+ "description": "identity:update_project_tags action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_target_user_domain_id",
+ "description": "admin_and_matching_target_user_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_user_domain_id",
+ "description": "admin_and_matching_user_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_user",
+ "description": "identity:get_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_users",
+ "description": "identity:list_users action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_user",
+ "description": "identity:create_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_user",
+ "description": "identity:update_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_user",
+ "description": "identity:delete_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_target_group_domain_id",
+ "description": "admin_and_matching_target_group_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_group_domain_id",
+ "description": "admin_and_matching_group_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_group",
+ "description": "identity:get_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_groups",
+ "description": "identity:list_groups action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_groups_for_user",
+ "description": "identity:list_groups_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_group",
+ "description": "identity:create_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_group",
+ "description": "identity:update_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_group",
+ "description": "identity:delete_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_users_in_group",
+ "description": "identity:list_users_in_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:remove_user_from_group",
+ "description": "identity:remove_user_from_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_user_in_group",
+ "description": "identity:check_user_in_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:add_user_to_group",
+ "description": "identity:add_user_to_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_credential",
+ "description": "identity:get_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_credentials",
+ "description": "identity:list_credentials action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_credential",
+ "description": "identity:create_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_credential",
+ "description": "identity:update_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_credential",
+ "description": "identity:delete_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_get_credential",
+ "description": "identity:ec2_get_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_list_credentials",
+ "description": "identity:ec2_list_credentials action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_create_credential",
+ "description": "identity:ec2_create_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_delete_credential",
+ "description": "identity:ec2_delete_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_role",
+ "description": "identity:get_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_roles",
+ "description": "identity:list_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_role",
+ "description": "identity:create_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_role",
+ "description": "identity:update_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_role",
+ "description": "identity:delete_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain_role",
+ "description": "identity:get_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_domain_roles",
+ "description": "identity:list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_domain_role",
+ "description": "identity:create_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_domain_role",
+ "description": "identity:update_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_domain_role",
+ "description": "identity:delete_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_matches_domain_role",
+ "description": "domain_admin_matches_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_domain_roles",
+ "description": "get_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_matches_target_domain_role",
+ "description": "domain_admin_matches_target_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_matches_target_domain_role",
+ "description": "project_admin_matches_target_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "list_domain_roles",
+ "description": "list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles",
+ "description": "domain_admin_matches_filter_on_list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles",
+ "description": "project_admin_matches_filter_on_list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_prior_role_domain_id",
+ "description": "admin_and_matching_prior_role_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global",
+ "description": "implied_role_matches_prior_role_domain_or_global action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_implied_role",
+ "description": "identity:get_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_implied_roles",
+ "description": "identity:list_implied_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_implied_role",
+ "description": "identity:create_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_implied_role",
+ "description": "identity:delete_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_role_inference_rules",
+ "description": "identity:list_role_inference_rules action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_implied_role",
+ "description": "identity:check_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_system_grants_for_user",
+ "description": "identity:list_system_grants_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_system_grant_for_user",
+ "description": "identity:check_system_grant_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_system_grant_for_user",
+ "description": "identity:create_system_grant_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_system_grant_for_user",
+ "description": "identity:revoke_system_grant_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_system_grants_for_group",
+ "description": "identity:list_system_grants_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_system_grant_for_group",
+ "description": "identity:check_system_grant_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_system_grant_for_group",
+ "description": "identity:create_system_grant_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_system_grant_for_group",
+ "description": "identity:revoke_system_grant_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_grant",
+ "description": "identity:check_grant action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_grants",
+ "description": "identity:list_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_grant",
+ "description": "identity:create_grant action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_grant",
+ "description": "identity:revoke_grant action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_grants",
+ "description": "domain_admin_for_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_global_role_grants",
+ "description": "domain_admin_for_global_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_domain_role_grants",
+ "description": "domain_admin_for_domain_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_grant_match",
+ "description": "domain_admin_grant_match action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_grants",
+ "description": "project_admin_for_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_global_role_grants",
+ "description": "project_admin_for_global_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_domain_role_grants",
+ "description": "project_admin_for_domain_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_list_grants",
+ "description": "domain_admin_for_list_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_list_grants",
+ "description": "project_admin_for_list_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_on_domain_filter",
+ "description": "admin_on_domain_filter action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_on_project_filter",
+ "description": "admin_on_project_filter action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_on_domain_of_project_filter",
+ "description": "admin_on_domain_of_project_filter action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_role_assignments",
+ "description": "identity:list_role_assignments action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_role_assignments_for_tree",
+ "description": "identity:list_role_assignments_for_tree action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_policy",
+ "description": "identity:get_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_policies",
+ "description": "identity:list_policies action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy",
+ "description": "identity:create_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_policy",
+ "description": "identity:update_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy",
+ "description": "identity:delete_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_token",
+ "description": "identity:check_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:validate_token",
+ "description": "identity:validate_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:validate_token_head",
+ "description": "identity:validate_token_head action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revocation_list",
+ "description": "identity:revocation_list action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_token",
+ "description": "identity:revoke_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_trust",
+ "description": "identity:create_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_trusts",
+ "description": "identity:list_trusts action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_roles_for_trust",
+ "description": "identity:list_roles_for_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_role_for_trust",
+ "description": "identity:get_role_for_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_trust",
+ "description": "identity:delete_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_trust",
+ "description": "identity:get_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_consumer",
+ "description": "identity:create_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_consumer",
+ "description": "identity:get_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_consumers",
+ "description": "identity:list_consumers action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_consumer",
+ "description": "identity:delete_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_consumer",
+ "description": "identity:update_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:authorize_request_token",
+ "description": "identity:authorize_request_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_access_token_roles",
+ "description": "identity:list_access_token_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_access_token_role",
+ "description": "identity:get_access_token_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_access_tokens",
+ "description": "identity:list_access_tokens action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_access_token",
+ "description": "identity:get_access_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_access_token",
+ "description": "identity:delete_access_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects_for_endpoint",
+ "description": "identity:list_projects_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:add_endpoint_to_project",
+ "description": "identity:add_endpoint_to_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_endpoint_in_project",
+ "description": "identity:check_endpoint_in_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints_for_project",
+ "description": "identity:list_endpoints_for_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:remove_endpoint_from_project",
+ "description": "identity:remove_endpoint_from_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_endpoint_group",
+ "description": "identity:create_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoint_groups",
+ "description": "identity:list_endpoint_groups action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_endpoint_group",
+ "description": "identity:get_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_endpoint_group",
+ "description": "identity:update_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_endpoint_group",
+ "description": "identity:delete_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group",
+ "description": "identity:list_projects_associated_with_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group",
+ "description": "identity:list_endpoints_associated_with_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_endpoint_group_in_project",
+ "description": "identity:get_endpoint_group_in_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoint_groups_for_project",
+ "description": "identity:list_endpoint_groups_for_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:add_endpoint_group_to_project",
+ "description": "identity:add_endpoint_group_to_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:remove_endpoint_group_from_project",
+ "description": "identity:remove_endpoint_group_from_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_identity_provider",
+ "description": "identity:create_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_identity_providers",
+ "description": "identity:list_identity_providers action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_identity_provider",
+ "description": "identity:get_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_identity_provider",
+ "description": "identity:update_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_identity_provider",
+ "description": "identity:delete_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_protocol",
+ "description": "identity:create_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_protocol",
+ "description": "identity:update_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_protocol",
+ "description": "identity:get_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_protocols",
+ "description": "identity:list_protocols action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_protocol",
+ "description": "identity:delete_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_mapping",
+ "description": "identity:create_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_mapping",
+ "description": "identity:get_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_mappings",
+ "description": "identity:list_mappings action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_mapping",
+ "description": "identity:delete_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_mapping",
+ "description": "identity:update_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_service_provider",
+ "description": "identity:create_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_service_providers",
+ "description": "identity:list_service_providers action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_service_provider",
+ "description": "identity:get_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_service_provider",
+ "description": "identity:update_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_service_provider",
+ "description": "identity:delete_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_catalog",
+ "description": "identity:get_auth_catalog action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_projects",
+ "description": "identity:get_auth_projects action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_domains",
+ "description": "identity:get_auth_domains action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_system",
+ "description": "identity:get_auth_system action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects_for_user",
+ "description": "identity:list_projects_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_domains_for_user",
+ "description": "identity:list_domains_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_revoke_events",
+ "description": "identity:list_revoke_events action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy_association_for_endpoint",
+ "description": "identity:create_policy_association_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_policy_association_for_endpoint",
+ "description": "identity:check_policy_association_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy_association_for_endpoint",
+ "description": "identity:delete_policy_association_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy_association_for_service",
+ "description": "identity:create_policy_association_for_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_policy_association_for_service",
+ "description": "identity:check_policy_association_for_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy_association_for_service",
+ "description": "identity:delete_policy_association_for_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy_association_for_region_and_service",
+ "description": "identity:create_policy_association_for_region_and_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_policy_association_for_region_and_service",
+ "description": "identity:check_policy_association_for_region_and_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy_association_for_region_and_service",
+ "description": "identity:delete_policy_association_for_region_and_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_policy_for_endpoint",
+ "description": "identity:get_policy_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints_for_policy",
+ "description": "identity:list_endpoints_for_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_domain_config",
+ "description": "identity:create_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain_config",
+ "description": "identity:get_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_security_compliance_domain_config",
+ "description": "identity:get_security_compliance_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_domain_config",
+ "description": "identity:update_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_domain_config",
+ "description": "identity:delete_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain_config_default",
+ "description": "identity:get_domain_config_default action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_application_credential",
+ "description": "identity:get_application_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_application_credentials",
+ "description": "identity:list_application_credentials action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_application_credential",
+ "description": "identity:create_application_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_application_credential",
+ "description": "identity:delete_application_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_subnet",
+ "description": "create_subnet action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_subnet:segment_id",
+ "description": "create_subnet:segment_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_subnet:service_types",
+ "description": "create_subnet:service_types action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_subnet",
+ "description": "get_subnet action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_subnet:segment_id",
+ "description": "get_subnet:segment_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_subnet",
+ "description": "update_subnet action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_subnet:service_types",
+ "description": "update_subnet:service_types action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_subnet",
+ "description": "delete_subnet action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_subnetpool",
+ "description": "create_subnetpool action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_subnetpool:shared",
+ "description": "create_subnetpool:shared action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_subnetpool:is_default",
+ "description": "create_subnetpool:is_default action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_subnetpool",
+ "description": "get_subnetpool action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_subnetpool",
+ "description": "update_subnetpool action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_subnetpool:is_default",
+ "description": "update_subnetpool:is_default action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_subnetpool",
+ "description": "delete_subnetpool action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_address_scope",
+ "description": "create_address_scope action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_address_scope:shared",
+ "description": "create_address_scope:shared action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_address_scope",
+ "description": "get_address_scope action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_address_scope",
+ "description": "update_address_scope action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_address_scope:shared",
+ "description": "update_address_scope:shared action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_address_scope",
+ "description": "delete_address_scope action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network",
+ "description": "create_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network",
+ "description": "get_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network:router:external",
+ "description": "get_network:router:external action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network:segments",
+ "description": "get_network:segments action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network:provider:network_type",
+ "description": "get_network:provider:network_type action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network:provider:physical_network",
+ "description": "get_network:provider:physical_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network:provider:segmentation_id",
+ "description": "get_network:provider:segmentation_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network:queue_id",
+ "description": "get_network:queue_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network_ip_availabilities",
+ "description": "get_network_ip_availabilities action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network_ip_availability",
+ "description": "get_network_ip_availability action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:shared",
+ "description": "create_network:shared action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:router:external",
+ "description": "create_network:router:external action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:is_default",
+ "description": "create_network:is_default action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:segments",
+ "description": "create_network:segments action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:provider:network_type",
+ "description": "create_network:provider:network_type action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:provider:physical_network",
+ "description": "create_network:provider:physical_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network:provider:segmentation_id",
+ "description": "create_network:provider:segmentation_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network",
+ "description": "update_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network:segments",
+ "description": "update_network:segments action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network:shared",
+ "description": "update_network:shared action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network:provider:network_type",
+ "description": "update_network:provider:network_type action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network:provider:physical_network",
+ "description": "update_network:provider:physical_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network:provider:segmentation_id",
+ "description": "update_network:provider:segmentation_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network:router:external",
+ "description": "update_network:router:external action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_network",
+ "description": "delete_network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_segment",
+ "description": "create_segment action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_segment",
+ "description": "get_segment action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_segment",
+ "description": "update_segment action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_segment",
+ "description": "delete_segment action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "network_device",
+ "description": "network_device action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port",
+ "description": "create_port action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:device_owner",
+ "description": "create_port:device_owner action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:mac_address",
+ "description": "create_port:mac_address action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:fixed_ips:ip_address",
+ "description": "create_port:fixed_ips:ip_address action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:fixed_ips:subnet_id",
+ "description": "create_port:fixed_ips:subnet_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:port_security_enabled",
+ "description": "create_port:port_security_enabled action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:binding:host_id",
+ "description": "create_port:binding:host_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:binding:profile",
+ "description": "create_port:binding:profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:mac_learning_enabled",
+ "description": "create_port:mac_learning_enabled action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_port:allowed_address_pairs",
+ "description": "create_port:allowed_address_pairs action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_port",
+ "description": "get_port action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_port:queue_id",
+ "description": "get_port:queue_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_port:binding:vif_type",
+ "description": "get_port:binding:vif_type action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_port:binding:vif_details",
+ "description": "get_port:binding:vif_details action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_port:binding:host_id",
+ "description": "get_port:binding:host_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_port:binding:profile",
+ "description": "get_port:binding:profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port",
+ "description": "update_port action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:device_owner",
+ "description": "update_port:device_owner action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:mac_address",
+ "description": "update_port:mac_address action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:fixed_ips:ip_address",
+ "description": "update_port:fixed_ips:ip_address action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:fixed_ips:subnet_id",
+ "description": "update_port:fixed_ips:subnet_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:port_security_enabled",
+ "description": "update_port:port_security_enabled action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:binding:host_id",
+ "description": "update_port:binding:host_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:binding:profile",
+ "description": "update_port:binding:profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:mac_learning_enabled",
+ "description": "update_port:mac_learning_enabled action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:allowed_address_pairs",
+ "description": "update_port:allowed_address_pairs action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_port:data_plane_status",
+ "description": "update_port:data_plane_status action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_port",
+ "description": "delete_port action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_router:ha",
+ "description": "get_router:ha action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_router",
+ "description": "create_router action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_router:external_gateway_info:enable_snat",
+ "description": "create_router:external_gateway_info:enable_snat action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_router:distributed",
+ "description": "create_router:distributed action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_router:ha",
+ "description": "create_router:ha action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_router",
+ "description": "get_router action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_router:distributed",
+ "description": "get_router:distributed action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router",
+ "description": "update_router action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router:external_gateway_info",
+ "description": "update_router:external_gateway_info action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router:external_gateway_info:network_id",
+ "description": "update_router:external_gateway_info:network_id action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router:external_gateway_info:enable_snat",
+ "description": "update_router:external_gateway_info:enable_snat action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router:distributed",
+ "description": "update_router:distributed action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router:ha",
+ "description": "update_router:ha action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_router",
+ "description": "delete_router action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_router_interface",
+ "description": "add_router_interface action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "remove_router_interface",
+ "description": "remove_router_interface action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_router:external_gateway_info:external_fixed_ips",
+ "description": "create_router:external_gateway_info:external_fixed_ips action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_router:external_gateway_info:external_fixed_ips",
+ "description": "update_router:external_gateway_info:external_fixed_ips action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_qos_queue",
+ "description": "create_qos_queue action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_qos_queue",
+ "description": "get_qos_queue action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_agent",
+ "description": "update_agent action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_agent",
+ "description": "delete_agent action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_agent",
+ "description": "get_agent action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_dhcp-network",
+ "description": "create_dhcp-network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_dhcp-network",
+ "description": "delete_dhcp-network action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_dhcp-networks",
+ "description": "get_dhcp-networks action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_l3-router",
+ "description": "create_l3-router action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_l3-router",
+ "description": "delete_l3-router action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_l3-routers",
+ "description": "get_l3-routers action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_dhcp-agents",
+ "description": "get_dhcp-agents action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_l3-agents",
+ "description": "get_l3-agents action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_loadbalancer-agent",
+ "description": "get_loadbalancer-agent action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_loadbalancer-pools",
+ "description": "get_loadbalancer-pools action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_agent-loadbalancers",
+ "description": "get_agent-loadbalancers action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_loadbalancer-hosting-agent",
+ "description": "get_loadbalancer-hosting-agent action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_floatingip",
+ "description": "create_floatingip action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_floatingip:floating_ip_address",
+ "description": "create_floatingip:floating_ip_address action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_floatingip",
+ "description": "update_floatingip action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_floatingip",
+ "description": "delete_floatingip action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_floatingip",
+ "description": "get_floatingip action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_network_profile",
+ "description": "create_network_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_network_profile",
+ "description": "update_network_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_network_profile",
+ "description": "delete_network_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network_profiles",
+ "description": "get_network_profiles action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_network_profile",
+ "description": "get_network_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_policy_profiles",
+ "description": "update_policy_profiles action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_policy_profiles",
+ "description": "get_policy_profiles action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_policy_profile",
+ "description": "get_policy_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_metering_label",
+ "description": "create_metering_label action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_metering_label",
+ "description": "delete_metering_label action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metering_label",
+ "description": "get_metering_label action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_metering_label_rule",
+ "description": "create_metering_label_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_metering_label_rule",
+ "description": "delete_metering_label_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metering_label_rule",
+ "description": "get_metering_label_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_service_provider",
+ "description": "get_service_provider action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_lsn",
+ "description": "get_lsn action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_lsn",
+ "description": "create_lsn action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_flavor",
+ "description": "create_flavor action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_flavor",
+ "description": "update_flavor action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_flavor",
+ "description": "delete_flavor action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_flavors",
+ "description": "get_flavors action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_flavor",
+ "description": "get_flavor action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_service_profile",
+ "description": "create_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_service_profile",
+ "description": "update_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_service_profile",
+ "description": "delete_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_service_profiles",
+ "description": "get_service_profiles action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_service_profile",
+ "description": "get_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_policy",
+ "description": "get_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_policy",
+ "description": "create_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_policy",
+ "description": "update_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_policy",
+ "description": "delete_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_policy_bandwidth_limit_rule",
+ "description": "get_policy_bandwidth_limit_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_policy_bandwidth_limit_rule",
+ "description": "create_policy_bandwidth_limit_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_policy_bandwidth_limit_rule",
+ "description": "delete_policy_bandwidth_limit_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_policy_bandwidth_limit_rule",
+ "description": "update_policy_bandwidth_limit_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_policy_dscp_marking_rule",
+ "description": "get_policy_dscp_marking_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_policy_dscp_marking_rule",
+ "description": "create_policy_dscp_marking_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_policy_dscp_marking_rule",
+ "description": "delete_policy_dscp_marking_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_policy_dscp_marking_rule",
+ "description": "update_policy_dscp_marking_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_rule_type",
+ "description": "get_rule_type action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_policy_minimum_bandwidth_rule",
+ "description": "get_policy_minimum_bandwidth_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_policy_minimum_bandwidth_rule",
+ "description": "create_policy_minimum_bandwidth_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_policy_minimum_bandwidth_rule",
+ "description": "delete_policy_minimum_bandwidth_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_policy_minimum_bandwidth_rule",
+ "description": "update_policy_minimum_bandwidth_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "restrict_wildcard",
+ "description": "restrict_wildcard action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_rbac_policy",
+ "description": "create_rbac_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_rbac_policy:target_tenant",
+ "description": "create_rbac_policy:target_tenant action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_rbac_policy",
+ "description": "update_rbac_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_rbac_policy:target_tenant",
+ "description": "update_rbac_policy:target_tenant action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_rbac_policy",
+ "description": "get_rbac_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_rbac_policy",
+ "description": "delete_rbac_policy action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_flavor_service_profile",
+ "description": "create_flavor_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_flavor_service_profile",
+ "description": "delete_flavor_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_flavor_service_profile",
+ "description": "get_flavor_service_profile action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_auto_allocated_topology",
+ "description": "get_auto_allocated_topology action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_trunk",
+ "description": "create_trunk action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_trunk",
+ "description": "get_trunk action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_trunk",
+ "description": "delete_trunk action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_subports",
+ "description": "get_subports action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_subports",
+ "description": "add_subports action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "remove_subports",
+ "description": "remove_subports action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_security_groups",
+ "description": "get_security_groups action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_security_group",
+ "description": "get_security_group action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_security_group",
+ "description": "create_security_group action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_security_group",
+ "description": "update_security_group action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_security_group",
+ "description": "delete_security_group action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_security_group_rules",
+ "description": "get_security_group_rules action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_security_group_rule",
+ "description": "get_security_group_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_security_group_rule",
+ "description": "create_security_group_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_security_group_rule",
+ "description": "delete_security_group_rule action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_loggable_resources",
+ "description": "get_loggable_resources action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "create_log",
+ "description": "create_log action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_log",
+ "description": "update_log action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_log",
+ "description": "delete_log action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_logs",
+ "description": "get_logs action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_log",
+ "description": "get_log action for neutron",
+ "extra": {
+ "component": "neutron"
+ },
+ "policies": []
+ },
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter",
+ "description": "cells_scheduler_filter:TargetCellFilter action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create",
+ "description": "compute:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create:attach_network",
+ "description": "compute:create:attach_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create:attach_volume",
+ "description": "compute:create:attach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create:forced_host",
+ "description": "compute:create:forced_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get",
+ "description": "compute:get action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all",
+ "description": "compute:get_all action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all_tenants",
+ "description": "compute:get_all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:update",
+ "description": "compute:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_instance_metadata",
+ "description": "compute:get_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all_instance_metadata",
+ "description": "compute:get_all_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all_instance_system_metadata",
+ "description": "compute:get_all_instance_system_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:update_instance_metadata",
+ "description": "compute:update_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:delete_instance_metadata",
+ "description": "compute:delete_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_instance_faults",
+ "description": "compute:get_instance_faults action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_diagnostics",
+ "description": "compute:get_diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_instance_diagnostics",
+ "description": "compute:get_instance_diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:start",
+ "description": "compute:start action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:stop",
+ "description": "compute:stop action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_lock",
+ "description": "compute:get_lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:lock",
+ "description": "compute:lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unlock",
+ "description": "compute:unlock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unlock_override",
+ "description": "compute:unlock_override action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_vnc_console",
+ "description": "compute:get_vnc_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_spice_console",
+ "description": "compute:get_spice_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_rdp_console",
+ "description": "compute:get_rdp_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_serial_console",
+ "description": "compute:get_serial_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_mks_console",
+ "description": "compute:get_mks_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_console_output",
+ "description": "compute:get_console_output action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:reset_network",
+ "description": "compute:reset_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:inject_network_info",
+ "description": "compute:inject_network_info action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:add_fixed_ip",
+ "description": "compute:add_fixed_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:remove_fixed_ip",
+ "description": "compute:remove_fixed_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:attach_volume",
+ "description": "compute:attach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:detach_volume",
+ "description": "compute:detach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:swap_volume",
+ "description": "compute:swap_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:attach_interface",
+ "description": "compute:attach_interface action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:detach_interface",
+ "description": "compute:detach_interface action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:set_admin_password",
+ "description": "compute:set_admin_password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:rescue",
+ "description": "compute:rescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unrescue",
+ "description": "compute:unrescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:suspend",
+ "description": "compute:suspend action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:resume",
+ "description": "compute:resume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:pause",
+ "description": "compute:pause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unpause",
+ "description": "compute:unpause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:shelve",
+ "description": "compute:shelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:shelve_offload",
+ "description": "compute:shelve_offload action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unshelve",
+ "description": "compute:unshelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:snapshot",
+ "description": "compute:snapshot action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:snapshot_volume_backed",
+ "description": "compute:snapshot_volume_backed action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:backup",
+ "description": "compute:backup action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:resize",
+ "description": "compute:resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:confirm_resize",
+ "description": "compute:confirm_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:revert_resize",
+ "description": "compute:revert_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:rebuild",
+ "description": "compute:rebuild action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:reboot",
+ "description": "compute:reboot action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:delete",
+ "description": "compute:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:soft_delete",
+ "description": "compute:soft_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:force_delete",
+ "description": "compute:force_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:security_groups:add_to_instance",
+ "description": "compute:security_groups:add_to_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:security_groups:remove_from_instance",
+ "description": "compute:security_groups:remove_from_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:restore",
+ "description": "compute:restore action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:volume_snapshot_create",
+ "description": "compute:volume_snapshot_create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:volume_snapshot_delete",
+ "description": "compute:volume_snapshot_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:accounts",
+ "description": "compute_extension:accounts action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions",
+ "description": "compute_extension:admin_actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:pause",
+ "description": "compute_extension:admin_actions:pause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:unpause",
+ "description": "compute_extension:admin_actions:unpause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:suspend",
+ "description": "compute_extension:admin_actions:suspend action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:resume",
+ "description": "compute_extension:admin_actions:resume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:lock",
+ "description": "compute_extension:admin_actions:lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:unlock",
+ "description": "compute_extension:admin_actions:unlock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:resetNetwork",
+ "description": "compute_extension:admin_actions:resetNetwork action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo",
+ "description": "compute_extension:admin_actions:injectNetworkInfo action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:createBackup",
+ "description": "compute_extension:admin_actions:createBackup action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:migrateLive",
+ "description": "compute_extension:admin_actions:migrateLive action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:resetState",
+ "description": "compute_extension:admin_actions:resetState action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:migrate",
+ "description": "compute_extension:admin_actions:migrate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:aggregates",
+ "description": "compute_extension:aggregates action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:agents",
+ "description": "compute_extension:agents action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:attach_interfaces",
+ "description": "compute_extension:attach_interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:baremetal_nodes",
+ "description": "compute_extension:baremetal_nodes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells",
+ "description": "compute_extension:cells action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:create",
+ "description": "compute_extension:cells:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:delete",
+ "description": "compute_extension:cells:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:update",
+ "description": "compute_extension:cells:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:sync_instances",
+ "description": "compute_extension:cells:sync_instances action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:certificates",
+ "description": "compute_extension:certificates action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cloudpipe",
+ "description": "compute_extension:cloudpipe action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cloudpipe_update",
+ "description": "compute_extension:cloudpipe_update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:config_drive",
+ "description": "compute_extension:config_drive action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:console_output",
+ "description": "compute_extension:console_output action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:consoles",
+ "description": "compute_extension:consoles action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:createserverext",
+ "description": "compute_extension:createserverext action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:deferred_delete",
+ "description": "compute_extension:deferred_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:disk_config",
+ "description": "compute_extension:disk_config action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:evacuate",
+ "description": "compute_extension:evacuate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_server_attributes",
+ "description": "compute_extension:extended_server_attributes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_status",
+ "description": "compute_extension:extended_status action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_availability_zone",
+ "description": "compute_extension:extended_availability_zone action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_ips",
+ "description": "compute_extension:extended_ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_ips_mac",
+ "description": "compute_extension:extended_ips_mac action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_vif_net",
+ "description": "compute_extension:extended_vif_net action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_volumes",
+ "description": "compute_extension:extended_volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:fixed_ips",
+ "description": "compute_extension:fixed_ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_access",
+ "description": "compute_extension:flavor_access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess",
+ "description": "compute_extension:flavor_access:addTenantAccess action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess",
+ "description": "compute_extension:flavor_access:removeTenantAccess action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_disabled",
+ "description": "compute_extension:flavor_disabled action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_rxtx",
+ "description": "compute_extension:flavor_rxtx action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_swap",
+ "description": "compute_extension:flavor_swap action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextradata",
+ "description": "compute_extension:flavorextradata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:index",
+ "description": "compute_extension:flavorextraspecs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:show",
+ "description": "compute_extension:flavorextraspecs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:create",
+ "description": "compute_extension:flavorextraspecs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:update",
+ "description": "compute_extension:flavorextraspecs:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:delete",
+ "description": "compute_extension:flavorextraspecs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavormanage",
+ "description": "compute_extension:flavormanage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ip_dns",
+ "description": "compute_extension:floating_ip_dns action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ip_pools",
+ "description": "compute_extension:floating_ip_pools action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ips",
+ "description": "compute_extension:floating_ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ips_bulk",
+ "description": "compute_extension:floating_ips_bulk action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:fping",
+ "description": "compute_extension:fping action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:fping:all_tenants",
+ "description": "compute_extension:fping:all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:hide_server_addresses",
+ "description": "compute_extension:hide_server_addresses action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:hosts",
+ "description": "compute_extension:hosts action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:hypervisors",
+ "description": "compute_extension:hypervisors action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:image_size",
+ "description": "compute_extension:image_size action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:instance_actions",
+ "description": "compute_extension:instance_actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:instance_actions:events",
+ "description": "compute_extension:instance_actions:events action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:instance_usage_audit_log",
+ "description": "compute_extension:instance_usage_audit_log action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs",
+ "description": "compute_extension:keypairs action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:index",
+ "description": "compute_extension:keypairs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:show",
+ "description": "compute_extension:keypairs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:create",
+ "description": "compute_extension:keypairs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:delete",
+ "description": "compute_extension:keypairs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:multinic",
+ "description": "compute_extension:multinic action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:networks",
+ "description": "compute_extension:networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:networks:view",
+ "description": "compute_extension:networks:view action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:networks_associate",
+ "description": "compute_extension:networks_associate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-tenant-networks",
+ "description": "compute_extension:os-tenant-networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quotas:show",
+ "description": "compute_extension:quotas:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quotas:update",
+ "description": "compute_extension:quotas:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quotas:delete",
+ "description": "compute_extension:quotas:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quota_classes",
+ "description": "compute_extension:quota_classes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:rescue",
+ "description": "compute_extension:rescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:security_group_default_rules",
+ "description": "compute_extension:security_group_default_rules action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:security_groups",
+ "description": "compute_extension:security_groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_diagnostics",
+ "description": "compute_extension:server_diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_groups",
+ "description": "compute_extension:server_groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_password",
+ "description": "compute_extension:server_password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_usage",
+ "description": "compute_extension:server_usage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:services",
+ "description": "compute_extension:services action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:shelve",
+ "description": "compute_extension:shelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:shelveOffload",
+ "description": "compute_extension:shelveOffload action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:show",
+ "description": "compute_extension:simple_tenant_usage:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:list",
+ "description": "compute_extension:simple_tenant_usage:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:unshelve",
+ "description": "compute_extension:unshelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:users",
+ "description": "compute_extension:users action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:virtual_interfaces",
+ "description": "compute_extension:virtual_interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:virtual_storage_arrays",
+ "description": "compute_extension:virtual_storage_arrays action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volumes",
+ "description": "compute_extension:volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:index",
+ "description": "compute_extension:volume_attachments:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:show",
+ "description": "compute_extension:volume_attachments:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:create",
+ "description": "compute_extension:volume_attachments:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:update",
+ "description": "compute_extension:volume_attachments:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:delete",
+ "description": "compute_extension:volume_attachments:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volumetypes",
+ "description": "compute_extension:volumetypes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:availability_zone:list",
+ "description": "compute_extension:availability_zone:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:availability_zone:detail",
+ "description": "compute_extension:availability_zone:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:used_limits_for_admin",
+ "description": "compute_extension:used_limits_for_admin action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:migrations:index",
+ "description": "compute_extension:migrations:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create",
+ "description": "compute_extension:os-assisted-volume-snapshots:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete",
+ "description": "compute_extension:os-assisted-volume-snapshots:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:console_auth_tokens",
+ "description": "compute_extension:console_auth_tokens action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-server-external-events:create",
+ "description": "compute_extension:os-server-external-events:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_all",
+ "description": "network:get_all action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get",
+ "description": "network:get action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:create",
+ "description": "network:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:delete",
+ "description": "network:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:associate",
+ "description": "network:associate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:disassociate",
+ "description": "network:disassociate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_vifs_by_instance",
+ "description": "network:get_vifs_by_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:allocate_for_instance",
+ "description": "network:allocate_for_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:deallocate_for_instance",
+ "description": "network:deallocate_for_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:validate_networks",
+ "description": "network:validate_networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_instance_uuids_by_ip_filter",
+ "description": "network:get_instance_uuids_by_ip_filter action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_instance_id_by_floating_address",
+ "description": "network:get_instance_id_by_floating_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:setup_networks_on_host",
+ "description": "network:setup_networks_on_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_backdoor_port",
+ "description": "network:get_backdoor_port action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ip",
+ "description": "network:get_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ip_pools",
+ "description": "network:get_floating_ip_pools action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ip_by_address",
+ "description": "network:get_floating_ip_by_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ips_by_project",
+ "description": "network:get_floating_ips_by_project action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ips_by_fixed_address",
+ "description": "network:get_floating_ips_by_fixed_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:allocate_floating_ip",
+ "description": "network:allocate_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:associate_floating_ip",
+ "description": "network:associate_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:disassociate_floating_ip",
+ "description": "network:disassociate_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:release_floating_ip",
+ "description": "network:release_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:migrate_instance_start",
+ "description": "network:migrate_instance_start action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:migrate_instance_finish",
+ "description": "network:migrate_instance_finish action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_fixed_ip",
+ "description": "network:get_fixed_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_fixed_ip_by_address",
+ "description": "network:get_fixed_ip_by_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:add_fixed_ip_to_instance",
+ "description": "network:add_fixed_ip_to_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:remove_fixed_ip_from_instance",
+ "description": "network:remove_fixed_ip_from_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:add_network_to_project",
+ "description": "network:add_network_to_project action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_instance_nw_info",
+ "description": "network:get_instance_nw_info action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_dns_domains",
+ "description": "network:get_dns_domains action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:add_dns_entry",
+ "description": "network:add_dns_entry action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:modify_dns_entry",
+ "description": "network:modify_dns_entry action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:delete_dns_entry",
+ "description": "network:delete_dns_entry action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_dns_entries_by_address",
+ "description": "network:get_dns_entries_by_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_dns_entries_by_name",
+ "description": "network:get_dns_entries_by_name action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:create_private_dns_domain",
+ "description": "network:create_private_dns_domain action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:create_public_dns_domain",
+ "description": "network:create_public_dns_domain action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:delete_dns_domain",
+ "description": "network:delete_dns_domain action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:attach_external_network",
+ "description": "network:attach_external_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_vif_by_mac_address",
+ "description": "network:get_vif_by_mac_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants",
+ "description": "os_compute_api:servers:detail:get_all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants",
+ "description": "os_compute_api:servers:index:get_all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:confirm_resize",
+ "description": "os_compute_api:servers:confirm_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create",
+ "description": "os_compute_api:servers:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_network",
+ "description": "os_compute_api:servers:create:attach_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_volume",
+ "description": "os_compute_api:servers:create:attach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create:forced_host",
+ "description": "os_compute_api:servers:create:forced_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:delete",
+ "description": "os_compute_api:servers:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:update",
+ "description": "os_compute_api:servers:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:detail",
+ "description": "os_compute_api:servers:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:index",
+ "description": "os_compute_api:servers:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:reboot",
+ "description": "os_compute_api:servers:reboot action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:rebuild",
+ "description": "os_compute_api:servers:rebuild action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:resize",
+ "description": "os_compute_api:servers:resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:revert_resize",
+ "description": "os_compute_api:servers:revert_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:show",
+ "description": "os_compute_api:servers:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create_image",
+ "description": "os_compute_api:servers:create_image action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed",
+ "description": "os_compute_api:servers:create_image:allow_volume_backed action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:start",
+ "description": "os_compute_api:servers:start action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:stop",
+ "description": "os_compute_api:servers:stop action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-access-ips:discoverable",
+ "description": "os_compute_api:os-access-ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-access-ips",
+ "description": "os_compute_api:os-access-ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions",
+ "description": "os_compute_api:os-admin-actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable",
+ "description": "os_compute_api:os-admin-actions:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network",
+ "description": "os_compute_api:os-admin-actions:reset_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info",
+ "description": "os_compute_api:os-admin-actions:inject_network_info action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state",
+ "description": "os_compute_api:os-admin-actions:reset_state action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-password",
+ "description": "os_compute_api:os-admin-password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-password:discoverable",
+ "description": "os_compute_api:os-admin-password:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:discoverable",
+ "description": "os_compute_api:os-aggregates:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:index",
+ "description": "os_compute_api:os-aggregates:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:create",
+ "description": "os_compute_api:os-aggregates:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:show",
+ "description": "os_compute_api:os-aggregates:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:update",
+ "description": "os_compute_api:os-aggregates:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:delete",
+ "description": "os_compute_api:os-aggregates:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:add_host",
+ "description": "os_compute_api:os-aggregates:add_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:remove_host",
+ "description": "os_compute_api:os-aggregates:remove_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata",
+ "description": "os_compute_api:os-aggregates:set_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-agents",
+ "description": "os_compute_api:os-agents action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-agents:discoverable",
+ "description": "os_compute_api:os-agents:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces",
+ "description": "os_compute_api:os-attach-interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable",
+ "description": "os_compute_api:os-attach-interfaces:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes",
+ "description": "os_compute_api:os-baremetal-nodes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable",
+ "description": "os_compute_api:os-baremetal-nodes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable",
+ "description": "os_compute_api:os-block-device-mapping-v1:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells",
+ "description": "os_compute_api:os-cells action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:create",
+ "description": "os_compute_api:os-cells:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:delete",
+ "description": "os_compute_api:os-cells:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:update",
+ "description": "os_compute_api:os-cells:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:sync_instances",
+ "description": "os_compute_api:os-cells:sync_instances action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:discoverable",
+ "description": "os_compute_api:os-cells:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-certificates:create",
+ "description": "os_compute_api:os-certificates:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-certificates:show",
+ "description": "os_compute_api:os-certificates:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-certificates:discoverable",
+ "description": "os_compute_api:os-certificates:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe",
+ "description": "os_compute_api:os-cloudpipe action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable",
+ "description": "os_compute_api:os-cloudpipe:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-config-drive",
+ "description": "os_compute_api:os-config-drive action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:discoverable",
+ "description": "os_compute_api:os-consoles:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:create",
+ "description": "os_compute_api:os-consoles:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:delete",
+ "description": "os_compute_api:os-consoles:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:index",
+ "description": "os_compute_api:os-consoles:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:show",
+ "description": "os_compute_api:os-consoles:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-console-output:discoverable",
+ "description": "os_compute_api:os-console-output:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-console-output",
+ "description": "os_compute_api:os-console-output action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles",
+ "description": "os_compute_api:os-remote-consoles action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable",
+ "description": "os_compute_api:os-remote-consoles:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-create-backup:discoverable",
+ "description": "os_compute_api:os-create-backup:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-create-backup",
+ "description": "os_compute_api:os-create-backup action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete",
+ "description": "os_compute_api:os-deferred-delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable",
+ "description": "os_compute_api:os-deferred-delete:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-disk-config",
+ "description": "os_compute_api:os-disk-config action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-disk-config:discoverable",
+ "description": "os_compute_api:os-disk-config:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-evacuate",
+ "description": "os_compute_api:os-evacuate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-evacuate:discoverable",
+ "description": "os_compute_api:os-evacuate:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes",
+ "description": "os_compute_api:os-extended-server-attributes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable",
+ "description": "os_compute_api:os-extended-server-attributes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-status",
+ "description": "os_compute_api:os-extended-status action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-status:discoverable",
+ "description": "os_compute_api:os-extended-status:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone",
+ "description": "os_compute_api:os-extended-availability-zone action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable",
+ "description": "os_compute_api:os-extended-availability-zone:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:extensions",
+ "description": "os_compute_api:extensions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:extension_info:discoverable",
+ "description": "os_compute_api:extension_info:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes",
+ "description": "os_compute_api:os-extended-volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable",
+ "description": "os_compute_api:os-extended-volumes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips",
+ "description": "os_compute_api:os-fixed-ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable",
+ "description": "os_compute_api:os-fixed-ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access",
+ "description": "os_compute_api:os-flavor-access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable",
+ "description": "os_compute_api:os-flavor-access:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access",
+ "description": "os_compute_api:os-flavor-access:remove_tenant_access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access",
+ "description": "os_compute_api:os-flavor-access:add_tenant_access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx",
+ "description": "os_compute_api:os-flavor-rxtx action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable",
+ "description": "os_compute_api:os-flavor-rxtx:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:flavors:discoverable",
+ "description": "os_compute_api:flavors:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable",
+ "description": "os_compute_api:os-flavor-extra-specs:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index",
+ "description": "os_compute_api:os-flavor-extra-specs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show",
+ "description": "os_compute_api:os-flavor-extra-specs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create",
+ "description": "os_compute_api:os-flavor-extra-specs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update",
+ "description": "os_compute_api:os-flavor-extra-specs:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete",
+ "description": "os_compute_api:os-flavor-extra-specs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable",
+ "description": "os_compute_api:os-flavor-manage:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage",
+ "description": "os_compute_api:os-flavor-manage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns",
+ "description": "os_compute_api:os-floating-ip-dns action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable",
+ "description": "os_compute_api:os-floating-ip-dns:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update",
+ "description": "os_compute_api:os-floating-ip-dns:domain:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete",
+ "description": "os_compute_api:os-floating-ip-dns:domain:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools",
+ "description": "os_compute_api:os-floating-ip-pools action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable",
+ "description": "os_compute_api:os-floating-ip-pools:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips",
+ "description": "os_compute_api:os-floating-ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable",
+ "description": "os_compute_api:os-floating-ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk",
+ "description": "os_compute_api:os-floating-ips-bulk action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable",
+ "description": "os_compute_api:os-floating-ips-bulk:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fping",
+ "description": "os_compute_api:os-fping action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fping:discoverable",
+ "description": "os_compute_api:os-fping:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fping:all_tenants",
+ "description": "os_compute_api:os-fping:all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses",
+ "description": "os_compute_api:os-hide-server-addresses action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable",
+ "description": "os_compute_api:os-hide-server-addresses:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hosts",
+ "description": "os_compute_api:os-hosts action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hosts:discoverable",
+ "description": "os_compute_api:os-hosts:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hypervisors",
+ "description": "os_compute_api:os-hypervisors action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable",
+ "description": "os_compute_api:os-hypervisors:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:images:discoverable",
+ "description": "os_compute_api:images:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:image-size",
+ "description": "os_compute_api:image-size action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:image-size:discoverable",
+ "description": "os_compute_api:image-size:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-actions",
+ "description": "os_compute_api:os-instance-actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable",
+ "description": "os_compute_api:os-instance-actions:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:events",
+ "description": "os_compute_api:os-instance-actions:events action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log",
+ "description": "os_compute_api:os-instance-usage-audit-log action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable",
+ "description": "os_compute_api:os-instance-usage-audit-log:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:ips:discoverable",
+ "description": "os_compute_api:ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:ips:index",
+ "description": "os_compute_api:ips:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:ips:show",
+ "description": "os_compute_api:ips:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:discoverable",
+ "description": "os_compute_api:os-keypairs:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs",
+ "description": "os_compute_api:os-keypairs action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:index",
+ "description": "os_compute_api:os-keypairs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:show",
+ "description": "os_compute_api:os-keypairs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:create",
+ "description": "os_compute_api:os-keypairs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:delete",
+ "description": "os_compute_api:os-keypairs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:limits:discoverable",
+ "description": "os_compute_api:limits:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:limits",
+ "description": "os_compute_api:limits action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:discoverable",
+ "description": "os_compute_api:os-lock-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:lock",
+ "description": "os_compute_api:os-lock-server:lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock",
+ "description": "os_compute_api:os-lock-server:unlock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override",
+ "description": "os_compute_api:os-lock-server:unlock:unlock_override action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable",
+ "description": "os_compute_api:os-migrate-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate",
+ "description": "os_compute_api:os-migrate-server:migrate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live",
+ "description": "os_compute_api:os-migrate-server:migrate_live action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-multinic",
+ "description": "os_compute_api:os-multinic action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-multinic:discoverable",
+ "description": "os_compute_api:os-multinic:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks",
+ "description": "os_compute_api:os-networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks:view",
+ "description": "os_compute_api:os-networks:view action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks:discoverable",
+ "description": "os_compute_api:os-networks:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks-associate",
+ "description": "os_compute_api:os-networks-associate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable",
+ "description": "os_compute_api:os-networks-associate:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pause-server:discoverable",
+ "description": "os_compute_api:os-pause-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pause-server:pause",
+ "description": "os_compute_api:os-pause-server:pause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pause-server:unpause",
+ "description": "os_compute_api:os-pause-server:unpause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:pci_servers",
+ "description": "os_compute_api:os-pci:pci_servers action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:discoverable",
+ "description": "os_compute_api:os-pci:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:index",
+ "description": "os_compute_api:os-pci:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:detail",
+ "description": "os_compute_api:os-pci:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:show",
+ "description": "os_compute_api:os-pci:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-personality:discoverable",
+ "description": "os_compute_api:os-personality:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable",
+ "description": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable",
+ "description": "os_compute_api:os-quota-sets:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:show",
+ "description": "os_compute_api:os-quota-sets:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:defaults",
+ "description": "os_compute_api:os-quota-sets:defaults action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:update",
+ "description": "os_compute_api:os-quota-sets:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:delete",
+ "description": "os_compute_api:os-quota-sets:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:detail",
+ "description": "os_compute_api:os-quota-sets:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:update",
+ "description": "os_compute_api:os-quota-class-sets:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:show",
+ "description": "os_compute_api:os-quota-class-sets:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable",
+ "description": "os_compute_api:os-quota-class-sets:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-rescue",
+ "description": "os_compute_api:os-rescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-rescue:discoverable",
+ "description": "os_compute_api:os-rescue:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable",
+ "description": "os_compute_api:os-scheduler-hints:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable",
+ "description": "os_compute_api:os-security-group-default-rules:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules",
+ "description": "os_compute_api:os-security-group-default-rules action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-groups",
+ "description": "os_compute_api:os-security-groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-groups:discoverable",
+ "description": "os_compute_api:os-security-groups:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics",
+ "description": "os_compute_api:os-server-diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable",
+ "description": "os_compute_api:os-server-diagnostics:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-password",
+ "description": "os_compute_api:os-server-password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-password:discoverable",
+ "description": "os_compute_api:os-server-password:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-usage",
+ "description": "os_compute_api:os-server-usage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-usage:discoverable",
+ "description": "os_compute_api:os-server-usage:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-groups",
+ "description": "os_compute_api:os-server-groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-groups:discoverable",
+ "description": "os_compute_api:os-server-groups:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-services",
+ "description": "os_compute_api:os-services action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-services:discoverable",
+ "description": "os_compute_api:os-services:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:discoverable",
+ "description": "os_compute_api:server-metadata:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:index",
+ "description": "os_compute_api:server-metadata:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:show",
+ "description": "os_compute_api:server-metadata:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:delete",
+ "description": "os_compute_api:server-metadata:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:create",
+ "description": "os_compute_api:server-metadata:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:update",
+ "description": "os_compute_api:server-metadata:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:update_all",
+ "description": "os_compute_api:server-metadata:update_all action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:discoverable",
+ "description": "os_compute_api:servers:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve",
+ "description": "os_compute_api:os-shelve:shelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable",
+ "description": "os_compute_api:os-shelve:shelve:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload",
+ "description": "os_compute_api:os-shelve:shelve_offload action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable",
+ "description": "os_compute_api:os-simple-tenant-usage:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show",
+ "description": "os_compute_api:os-simple-tenant-usage:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list",
+ "description": "os_compute_api:os-simple-tenant-usage:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable",
+ "description": "os_compute_api:os-suspend-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:suspend",
+ "description": "os_compute_api:os-suspend-server:suspend action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:resume",
+ "description": "os_compute_api:os-suspend-server:resume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks",
+ "description": "os_compute_api:os-tenant-networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable",
+ "description": "os_compute_api:os-tenant-networks:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:unshelve",
+ "description": "os_compute_api:os-shelve:unshelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-user-data:discoverable",
+ "description": "os_compute_api:os-user-data:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces",
+ "description": "os_compute_api:os-virtual-interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable",
+ "description": "os_compute_api:os-virtual-interfaces:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes",
+ "description": "os_compute_api:os-volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes:discoverable",
+ "description": "os_compute_api:os-volumes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:index",
+ "description": "os_compute_api:os-volumes-attachments:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:show",
+ "description": "os_compute_api:os-volumes-attachments:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:create",
+ "description": "os_compute_api:os-volumes-attachments:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:update",
+ "description": "os_compute_api:os-volumes-attachments:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete",
+ "description": "os_compute_api:os-volumes-attachments:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable",
+ "description": "os_compute_api:os-volumes-attachments:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:list",
+ "description": "os_compute_api:os-availability-zone:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable",
+ "description": "os_compute_api:os-availability-zone:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:detail",
+ "description": "os_compute_api:os-availability-zone:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-used-limits",
+ "description": "os_compute_api:os-used-limits action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-used-limits:discoverable",
+ "description": "os_compute_api:os-used-limits:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrations:index",
+ "description": "os_compute_api:os-migrations:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrations:discoverable",
+ "description": "os_compute_api:os-migrations:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create",
+ "description": "os_compute_api:os-assisted-volume-snapshots:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete",
+ "description": "os_compute_api:os-assisted-volume-snapshots:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable",
+ "description": "os_compute_api:os-assisted-volume-snapshots:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-console-auth-tokens",
+ "description": "os_compute_api:os-console-auth-tokens action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-external-events:create",
+ "description": "os_compute_api:os-server-external-events:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create",
+ "description": "volume:create action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete",
+ "description": "volume:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get",
+ "description": "volume:get action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_all",
+ "description": "volume:get_all action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_volume_metadata",
+ "description": "volume:get_volume_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete_volume_metadata",
+ "description": "volume:delete_volume_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_volume_metadata",
+ "description": "volume:update_volume_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_volume_admin_metadata",
+ "description": "volume:get_volume_admin_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_volume_admin_metadata",
+ "description": "volume:update_volume_admin_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_snapshot",
+ "description": "volume:get_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_all_snapshots",
+ "description": "volume:get_all_snapshots action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:create_snapshot",
+ "description": "volume:create_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete_snapshot",
+ "description": "volume:delete_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_snapshot",
+ "description": "volume:update_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:extend",
+ "description": "volume:extend action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_readonly_flag",
+ "description": "volume:update_readonly_flag action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:retype",
+ "description": "volume:retype action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update",
+ "description": "volume:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:types_manage",
+ "description": "volume_extension:types_manage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:types_extra_specs",
+ "description": "volume_extension:types_extra_specs action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:access_types_qos_specs_id",
+ "description": "volume_extension:access_types_qos_specs_id action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:access_types_extra_specs",
+ "description": "volume_extension:access_types_extra_specs action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_access",
+ "description": "volume_extension:volume_type_access action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess",
+ "description": "volume_extension:volume_type_access:addProjectAccess action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess",
+ "description": "volume_extension:volume_type_access:removeProjectAccess action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_encryption",
+ "description": "volume_extension:volume_type_encryption action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_encryption_metadata",
+ "description": "volume_extension:volume_encryption_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:extended_snapshot_attributes",
+ "description": "volume_extension:extended_snapshot_attributes action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_image_metadata",
+ "description": "volume_extension:volume_image_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quotas:show",
+ "description": "volume_extension:quotas:show action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quotas:update",
+ "description": "volume_extension:quotas:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quotas:delete",
+ "description": "volume_extension:quotas:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quota_classes",
+ "description": "volume_extension:quota_classes action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use",
+ "description": "volume_extension:quota_classes:validate_setup_for_nested_quota_use action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status",
+ "description": "volume_extension:volume_admin_actions:reset_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status",
+ "description": "volume_extension:snapshot_admin_actions:reset_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status",
+ "description": "volume_extension:backup_admin_actions:reset_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete",
+ "description": "volume_extension:volume_admin_actions:force_delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach",
+ "description": "volume_extension:volume_admin_actions:force_detach action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete",
+ "description": "volume_extension:snapshot_admin_actions:force_delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete",
+ "description": "volume_extension:backup_admin_actions:force_delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume",
+ "description": "volume_extension:volume_admin_actions:migrate_volume action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion",
+ "description": "volume_extension:volume_admin_actions:migrate_volume_completion action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_host_attribute",
+ "description": "volume_extension:volume_host_attribute action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_tenant_attribute",
+ "description": "volume_extension:volume_tenant_attribute action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_mig_status_attribute",
+ "description": "volume_extension:volume_mig_status_attribute action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:hosts",
+ "description": "volume_extension:hosts action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:services:index",
+ "description": "volume_extension:services:index action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:services:update",
+ "description": "volume_extension:services:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_manage",
+ "description": "volume_extension:volume_manage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_unmanage",
+ "description": "volume_extension:volume_unmanage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:capabilities",
+ "description": "volume_extension:capabilities action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:create_transfer",
+ "description": "volume:create_transfer action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:accept_transfer",
+ "description": "volume:accept_transfer action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete_transfer",
+ "description": "volume:delete_transfer action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_all_transfers",
+ "description": "volume:get_all_transfers action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:replication:promote",
+ "description": "volume_extension:replication:promote action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:replication:reenable",
+ "description": "volume_extension:replication:reenable action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:enable_replication",
+ "description": "volume:enable_replication action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:disable_replication",
+ "description": "volume:disable_replication action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:failover_replication",
+ "description": "volume:failover_replication action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:list_replication_targets",
+ "description": "volume:list_replication_targets action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:create",
+ "description": "backup:create action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:delete",
+ "description": "backup:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:get",
+ "description": "backup:get action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:get_all",
+ "description": "backup:get_all action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:restore",
+ "description": "backup:restore action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:backup-import",
+ "description": "backup:backup-import action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:backup-export",
+ "description": "backup:backup-export action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status",
+ "description": "snapshot_extension:snapshot_actions:update_snapshot_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "snapshot_extension:snapshot_manage",
+ "description": "snapshot_extension:snapshot_manage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "snapshot_extension:snapshot_unmanage",
+ "description": "snapshot_extension:snapshot_unmanage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:create",
+ "description": "consistencygroup:create action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:delete",
+ "description": "consistencygroup:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:update",
+ "description": "consistencygroup:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get",
+ "description": "consistencygroup:get action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get_all",
+ "description": "consistencygroup:get_all action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:create_cgsnapshot",
+ "description": "consistencygroup:create_cgsnapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:delete_cgsnapshot",
+ "description": "consistencygroup:delete_cgsnapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get_cgsnapshot",
+ "description": "consistencygroup:get_cgsnapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get_all_cgsnapshots",
+ "description": "consistencygroup:get_all_cgsnapshots action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools",
+ "description": "scheduler_extension:scheduler_stats:get_pools action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_image",
+ "description": "add_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_image",
+ "description": "delete_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_image",
+ "description": "get_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_image",
+ "description": "modify_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "publicize_image",
+ "description": "publicize_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "communitize_image",
+ "description": "communitize_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "copy_from",
+ "description": "copy_from action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "download_image",
+ "description": "download_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "upload_image",
+ "description": "upload_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_image_location",
+ "description": "delete_image_location action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_image_location",
+ "description": "get_image_location action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "set_image_location",
+ "description": "set_image_location action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_member",
+ "description": "add_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_member",
+ "description": "delete_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_member",
+ "description": "get_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_members",
+ "description": "get_members action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_member",
+ "description": "modify_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "manage_image_cache",
+ "description": "manage_image_cache action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_task",
+ "description": "get_task action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_tasks",
+ "description": "get_tasks action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_task",
+ "description": "add_task action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_task",
+ "description": "modify_task action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "tasks_api_access",
+ "description": "tasks_api_access action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "deactivate",
+ "description": "deactivate action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "reactivate",
+ "description": "reactivate action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_namespace",
+ "description": "get_metadef_namespace action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_namespaces",
+ "description": "get_metadef_namespaces action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_namespace",
+ "description": "modify_metadef_namespace action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_namespace",
+ "description": "add_metadef_namespace action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_object",
+ "description": "get_metadef_object action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_objects",
+ "description": "get_metadef_objects action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_object",
+ "description": "modify_metadef_object action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_object",
+ "description": "add_metadef_object action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "list_metadef_resource_types",
+ "description": "list_metadef_resource_types action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_resource_type",
+ "description": "get_metadef_resource_type action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_resource_type_association",
+ "description": "add_metadef_resource_type_association action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_property",
+ "description": "get_metadef_property action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_properties",
+ "description": "get_metadef_properties action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_property",
+ "description": "modify_metadef_property action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_property",
+ "description": "add_metadef_property action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_tag",
+ "description": "get_metadef_tag action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_tags",
+ "description": "get_metadef_tags action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_tag",
+ "description": "modify_metadef_tag action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_tag",
+ "description": "add_metadef_tag action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_tags",
+ "description": "add_metadef_tags action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_region",
+ "description": "identity:get_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_regions",
+ "description": "identity:list_regions action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_region",
+ "description": "identity:create_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_region",
+ "description": "identity:update_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_region",
+ "description": "identity:delete_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_service",
+ "description": "identity:get_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_services",
+ "description": "identity:list_services action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_service",
+ "description": "identity:create_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_service",
+ "description": "identity:update_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_service",
+ "description": "identity:delete_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_endpoint",
+ "description": "identity:get_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints",
+ "description": "identity:list_endpoints action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_endpoint",
+ "description": "identity:create_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_endpoint",
+ "description": "identity:update_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_endpoint",
+ "description": "identity:delete_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_registered_limit",
+ "description": "identity:get_registered_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_registered_limits",
+ "description": "identity:list_registered_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_registered_limits",
+ "description": "identity:create_registered_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_registered_limits",
+ "description": "identity:update_registered_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_registered_limit",
+ "description": "identity:delete_registered_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_limit",
+ "description": "identity:get_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_limits",
+ "description": "identity:list_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_limits",
+ "description": "identity:create_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_limits",
+ "description": "identity:update_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_limit",
+ "description": "identity:delete_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain",
+ "description": "identity:get_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_domains",
+ "description": "identity:list_domains action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_domain",
+ "description": "identity:create_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_domain",
+ "description": "identity:update_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_domain",
+ "description": "identity:delete_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_target_project_domain_id",
+ "description": "admin_and_matching_target_project_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_project_domain_id",
+ "description": "admin_and_matching_project_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_project",
+ "description": "identity:get_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects",
+ "description": "identity:list_projects action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_user_projects",
+ "description": "identity:list_user_projects action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_project",
+ "description": "identity:create_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_project",
+ "description": "identity:update_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_project",
+ "description": "identity:delete_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_project_tag",
+ "description": "identity:create_project_tag action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_project_tag",
+ "description": "identity:delete_project_tag action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_project_tag",
+ "description": "identity:get_project_tag action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_project_tags",
+ "description": "identity:list_project_tags action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_project_tags",
+ "description": "identity:delete_project_tags action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_project_tags",
+ "description": "identity:update_project_tags action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_target_user_domain_id",
+ "description": "admin_and_matching_target_user_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_user_domain_id",
+ "description": "admin_and_matching_user_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_user",
+ "description": "identity:get_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_users",
+ "description": "identity:list_users action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_user",
+ "description": "identity:create_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_user",
+ "description": "identity:update_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_user",
+ "description": "identity:delete_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_target_group_domain_id",
+ "description": "admin_and_matching_target_group_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_group_domain_id",
+ "description": "admin_and_matching_group_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_group",
+ "description": "identity:get_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_groups",
+ "description": "identity:list_groups action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_groups_for_user",
+ "description": "identity:list_groups_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_group",
+ "description": "identity:create_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_group",
+ "description": "identity:update_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_group",
+ "description": "identity:delete_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_users_in_group",
+ "description": "identity:list_users_in_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:remove_user_from_group",
+ "description": "identity:remove_user_from_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_user_in_group",
+ "description": "identity:check_user_in_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:add_user_to_group",
+ "description": "identity:add_user_to_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_credential",
+ "description": "identity:get_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_credentials",
+ "description": "identity:list_credentials action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_credential",
+ "description": "identity:create_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_credential",
+ "description": "identity:update_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_credential",
+ "description": "identity:delete_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_get_credential",
+ "description": "identity:ec2_get_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_list_credentials",
+ "description": "identity:ec2_list_credentials action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_create_credential",
+ "description": "identity:ec2_create_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_delete_credential",
+ "description": "identity:ec2_delete_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_role",
+ "description": "identity:get_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_roles",
+ "description": "identity:list_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_role",
+ "description": "identity:create_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_role",
+ "description": "identity:update_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_role",
+ "description": "identity:delete_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain_role",
+ "description": "identity:get_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_domain_roles",
+ "description": "identity:list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_domain_role",
+ "description": "identity:create_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_domain_role",
+ "description": "identity:update_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_domain_role",
+ "description": "identity:delete_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_matches_domain_role",
+ "description": "domain_admin_matches_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_domain_roles",
+ "description": "get_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_matches_target_domain_role",
+ "description": "domain_admin_matches_target_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_matches_target_domain_role",
+ "description": "project_admin_matches_target_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "list_domain_roles",
+ "description": "list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles",
+ "description": "domain_admin_matches_filter_on_list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles",
+ "description": "project_admin_matches_filter_on_list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_prior_role_domain_id",
+ "description": "admin_and_matching_prior_role_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global",
+ "description": "implied_role_matches_prior_role_domain_or_global action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_implied_role",
+ "description": "identity:get_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_implied_roles",
+ "description": "identity:list_implied_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_implied_role",
+ "description": "identity:create_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_implied_role",
+ "description": "identity:delete_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_role_inference_rules",
+ "description": "identity:list_role_inference_rules action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_implied_role",
+ "description": "identity:check_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_system_grants_for_user",
+ "description": "identity:list_system_grants_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_system_grant_for_user",
+ "description": "identity:check_system_grant_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_system_grant_for_user",
+ "description": "identity:create_system_grant_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_system_grant_for_user",
+ "description": "identity:revoke_system_grant_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_system_grants_for_group",
+ "description": "identity:list_system_grants_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_system_grant_for_group",
+ "description": "identity:check_system_grant_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_system_grant_for_group",
+ "description": "identity:create_system_grant_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_system_grant_for_group",
+ "description": "identity:revoke_system_grant_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_grant",
+ "description": "identity:check_grant action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_grants",
+ "description": "identity:list_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_grant",
+ "description": "identity:create_grant action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_grant",
+ "description": "identity:revoke_grant action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_grants",
+ "description": "domain_admin_for_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_global_role_grants",
+ "description": "domain_admin_for_global_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_domain_role_grants",
+ "description": "domain_admin_for_domain_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_grant_match",
+ "description": "domain_admin_grant_match action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_grants",
+ "description": "project_admin_for_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_global_role_grants",
+ "description": "project_admin_for_global_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_domain_role_grants",
+ "description": "project_admin_for_domain_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_list_grants",
+ "description": "domain_admin_for_list_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_list_grants",
+ "description": "project_admin_for_list_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_on_domain_filter",
+ "description": "admin_on_domain_filter action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_on_project_filter",
+ "description": "admin_on_project_filter action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_on_domain_of_project_filter",
+ "description": "admin_on_domain_of_project_filter action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_role_assignments",
+ "description": "identity:list_role_assignments action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_role_assignments_for_tree",
+ "description": "identity:list_role_assignments_for_tree action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_policy",
+ "description": "identity:get_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_policies",
+ "description": "identity:list_policies action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy",
+ "description": "identity:create_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_policy",
+ "description": "identity:update_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy",
+ "description": "identity:delete_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_token",
+ "description": "identity:check_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:validate_token",
+ "description": "identity:validate_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:validate_token_head",
+ "description": "identity:validate_token_head action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revocation_list",
+ "description": "identity:revocation_list action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_token",
+ "description": "identity:revoke_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_trust",
+ "description": "identity:create_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_trusts",
+ "description": "identity:list_trusts action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_roles_for_trust",
+ "description": "identity:list_roles_for_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_role_for_trust",
+ "description": "identity:get_role_for_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_trust",
+ "description": "identity:delete_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_trust",
+ "description": "identity:get_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_consumer",
+ "description": "identity:create_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_consumer",
+ "description": "identity:get_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_consumers",
+ "description": "identity:list_consumers action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_consumer",
+ "description": "identity:delete_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_consumer",
+ "description": "identity:update_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:authorize_request_token",
+ "description": "identity:authorize_request_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_access_token_roles",
+ "description": "identity:list_access_token_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_access_token_role",
+ "description": "identity:get_access_token_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_access_tokens",
+ "description": "identity:list_access_tokens action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_access_token",
+ "description": "identity:get_access_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_access_token",
+ "description": "identity:delete_access_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects_for_endpoint",
+ "description": "identity:list_projects_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:add_endpoint_to_project",
+ "description": "identity:add_endpoint_to_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_endpoint_in_project",
+ "description": "identity:check_endpoint_in_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints_for_project",
+ "description": "identity:list_endpoints_for_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:remove_endpoint_from_project",
+ "description": "identity:remove_endpoint_from_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_endpoint_group",
+ "description": "identity:create_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoint_groups",
+ "description": "identity:list_endpoint_groups action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_endpoint_group",
+ "description": "identity:get_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_endpoint_group",
+ "description": "identity:update_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_endpoint_group",
+ "description": "identity:delete_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group",
+ "description": "identity:list_projects_associated_with_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group",
+ "description": "identity:list_endpoints_associated_with_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_endpoint_group_in_project",
+ "description": "identity:get_endpoint_group_in_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoint_groups_for_project",
+ "description": "identity:list_endpoint_groups_for_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:add_endpoint_group_to_project",
+ "description": "identity:add_endpoint_group_to_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:remove_endpoint_group_from_project",
+ "description": "identity:remove_endpoint_group_from_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_identity_provider",
+ "description": "identity:create_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_identity_providers",
+ "description": "identity:list_identity_providers action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_identity_provider",
+ "description": "identity:get_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_identity_provider",
+ "description": "identity:update_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_identity_provider",
+ "description": "identity:delete_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_protocol",
+ "description": "identity:create_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_protocol",
+ "description": "identity:update_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_protocol",
+ "description": "identity:get_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_protocols",
+ "description": "identity:list_protocols action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_protocol",
+ "description": "identity:delete_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_mapping",
+ "description": "identity:create_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_mapping",
+ "description": "identity:get_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_mappings",
+ "description": "identity:list_mappings action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_mapping",
+ "description": "identity:delete_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_mapping",
+ "description": "identity:update_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_service_provider",
+ "description": "identity:create_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_service_providers",
+ "description": "identity:list_service_providers action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_service_provider",
+ "description": "identity:get_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_service_provider",
+ "description": "identity:update_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_service_provider",
+ "description": "identity:delete_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_catalog",
+ "description": "identity:get_auth_catalog action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_projects",
+ "description": "identity:get_auth_projects action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_domains",
+ "description": "identity:get_auth_domains action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_system",
+ "description": "identity:get_auth_system action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects_for_user",
+ "description": "identity:list_projects_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_domains_for_user",
+ "description": "identity:list_domains_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_revoke_events",
+ "description": "identity:list_revoke_events action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy_association_for_endpoint",
+ "description": "identity:create_policy_association_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_policy_association_for_endpoint",
+ "description": "identity:check_policy_association_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy_association_for_endpoint",
+ "description": "identity:delete_policy_association_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy_association_for_service",
+ "description": "identity:create_policy_association_for_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_policy_association_for_service",
+ "description": "identity:check_policy_association_for_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy_association_for_service",
+ "description": "identity:delete_policy_association_for_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy_association_for_region_and_service",
+ "description": "identity:create_policy_association_for_region_and_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_policy_association_for_region_and_service",
+ "description": "identity:check_policy_association_for_region_and_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy_association_for_region_and_service",
+ "description": "identity:delete_policy_association_for_region_and_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_policy_for_endpoint",
+ "description": "identity:get_policy_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints_for_policy",
+ "description": "identity:list_endpoints_for_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_domain_config",
+ "description": "identity:create_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain_config",
+ "description": "identity:get_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_security_compliance_domain_config",
+ "description": "identity:get_security_compliance_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_domain_config",
+ "description": "identity:update_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_domain_config",
+ "description": "identity:delete_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain_config_default",
+ "description": "identity:get_domain_config_default action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_application_credential",
+ "description": "identity:get_application_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_application_credentials",
+ "description": "identity:list_application_credentials action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_application_credential",
+ "description": "identity:create_application_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_application_credential",
+ "description": "identity:delete_application_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_subnet",
+ "description": "create_subnet action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_subnet:segment_id",
+ "description": "create_subnet:segment_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_subnet:service_types",
+ "description": "create_subnet:service_types action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_subnet",
+ "description": "get_subnet action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_subnet:segment_id",
+ "description": "get_subnet:segment_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_subnet",
+ "description": "update_subnet action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_subnet:service_types",
+ "description": "update_subnet:service_types action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_subnet",
+ "description": "delete_subnet action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_subnetpool",
+ "description": "create_subnetpool action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_subnetpool:shared",
+ "description": "create_subnetpool:shared action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_subnetpool:is_default",
+ "description": "create_subnetpool:is_default action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_subnetpool",
+ "description": "get_subnetpool action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_subnetpool",
+ "description": "update_subnetpool action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_subnetpool:is_default",
+ "description": "update_subnetpool:is_default action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_subnetpool",
+ "description": "delete_subnetpool action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_address_scope",
+ "description": "create_address_scope action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_address_scope:shared",
+ "description": "create_address_scope:shared action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_address_scope",
+ "description": "get_address_scope action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_address_scope",
+ "description": "update_address_scope action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_address_scope:shared",
+ "description": "update_address_scope:shared action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_address_scope",
+ "description": "delete_address_scope action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network",
+ "description": "create_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network",
+ "description": "get_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network:router:external",
+ "description": "get_network:router:external action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network:segments",
+ "description": "get_network:segments action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network:provider:network_type",
+ "description": "get_network:provider:network_type action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network:provider:physical_network",
+ "description": "get_network:provider:physical_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network:provider:segmentation_id",
+ "description": "get_network:provider:segmentation_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network:queue_id",
+ "description": "get_network:queue_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network_ip_availabilities",
+ "description": "get_network_ip_availabilities action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network_ip_availability",
+ "description": "get_network_ip_availability action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:shared",
+ "description": "create_network:shared action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:router:external",
+ "description": "create_network:router:external action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:is_default",
+ "description": "create_network:is_default action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:segments",
+ "description": "create_network:segments action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:provider:network_type",
+ "description": "create_network:provider:network_type action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:provider:physical_network",
+ "description": "create_network:provider:physical_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network:provider:segmentation_id",
+ "description": "create_network:provider:segmentation_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network",
+ "description": "update_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network:segments",
+ "description": "update_network:segments action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network:shared",
+ "description": "update_network:shared action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network:provider:network_type",
+ "description": "update_network:provider:network_type action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network:provider:physical_network",
+ "description": "update_network:provider:physical_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network:provider:segmentation_id",
+ "description": "update_network:provider:segmentation_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network:router:external",
+ "description": "update_network:router:external action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_network",
+ "description": "delete_network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_segment",
+ "description": "create_segment action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_segment",
+ "description": "get_segment action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_segment",
+ "description": "update_segment action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_segment",
+ "description": "delete_segment action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network_device",
+ "description": "network_device action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port",
+ "description": "create_port action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:device_owner",
+ "description": "create_port:device_owner action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:mac_address",
+ "description": "create_port:mac_address action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:fixed_ips:ip_address",
+ "description": "create_port:fixed_ips:ip_address action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:fixed_ips:subnet_id",
+ "description": "create_port:fixed_ips:subnet_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:port_security_enabled",
+ "description": "create_port:port_security_enabled action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:binding:host_id",
+ "description": "create_port:binding:host_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:binding:profile",
+ "description": "create_port:binding:profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:mac_learning_enabled",
+ "description": "create_port:mac_learning_enabled action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_port:allowed_address_pairs",
+ "description": "create_port:allowed_address_pairs action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_port",
+ "description": "get_port action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_port:queue_id",
+ "description": "get_port:queue_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_port:binding:vif_type",
+ "description": "get_port:binding:vif_type action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_port:binding:vif_details",
+ "description": "get_port:binding:vif_details action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_port:binding:host_id",
+ "description": "get_port:binding:host_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_port:binding:profile",
+ "description": "get_port:binding:profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port",
+ "description": "update_port action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:device_owner",
+ "description": "update_port:device_owner action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:mac_address",
+ "description": "update_port:mac_address action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:fixed_ips:ip_address",
+ "description": "update_port:fixed_ips:ip_address action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:fixed_ips:subnet_id",
+ "description": "update_port:fixed_ips:subnet_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:port_security_enabled",
+ "description": "update_port:port_security_enabled action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:binding:host_id",
+ "description": "update_port:binding:host_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:binding:profile",
+ "description": "update_port:binding:profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:mac_learning_enabled",
+ "description": "update_port:mac_learning_enabled action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:allowed_address_pairs",
+ "description": "update_port:allowed_address_pairs action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_port:data_plane_status",
+ "description": "update_port:data_plane_status action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_port",
+ "description": "delete_port action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_router:ha",
+ "description": "get_router:ha action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_router",
+ "description": "create_router action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_router:external_gateway_info:enable_snat",
+ "description": "create_router:external_gateway_info:enable_snat action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_router:distributed",
+ "description": "create_router:distributed action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_router:ha",
+ "description": "create_router:ha action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_router",
+ "description": "get_router action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_router:distributed",
+ "description": "get_router:distributed action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router",
+ "description": "update_router action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router:external_gateway_info",
+ "description": "update_router:external_gateway_info action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router:external_gateway_info:network_id",
+ "description": "update_router:external_gateway_info:network_id action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router:external_gateway_info:enable_snat",
+ "description": "update_router:external_gateway_info:enable_snat action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router:distributed",
+ "description": "update_router:distributed action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router:ha",
+ "description": "update_router:ha action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_router",
+ "description": "delete_router action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_router_interface",
+ "description": "add_router_interface action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "remove_router_interface",
+ "description": "remove_router_interface action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_router:external_gateway_info:external_fixed_ips",
+ "description": "create_router:external_gateway_info:external_fixed_ips action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_router:external_gateway_info:external_fixed_ips",
+ "description": "update_router:external_gateway_info:external_fixed_ips action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_qos_queue",
+ "description": "create_qos_queue action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_qos_queue",
+ "description": "get_qos_queue action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_agent",
+ "description": "update_agent action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_agent",
+ "description": "delete_agent action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_agent",
+ "description": "get_agent action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_dhcp-network",
+ "description": "create_dhcp-network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_dhcp-network",
+ "description": "delete_dhcp-network action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_dhcp-networks",
+ "description": "get_dhcp-networks action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_l3-router",
+ "description": "create_l3-router action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_l3-router",
+ "description": "delete_l3-router action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_l3-routers",
+ "description": "get_l3-routers action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_dhcp-agents",
+ "description": "get_dhcp-agents action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_l3-agents",
+ "description": "get_l3-agents action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_loadbalancer-agent",
+ "description": "get_loadbalancer-agent action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_loadbalancer-pools",
+ "description": "get_loadbalancer-pools action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_agent-loadbalancers",
+ "description": "get_agent-loadbalancers action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_loadbalancer-hosting-agent",
+ "description": "get_loadbalancer-hosting-agent action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_floatingip",
+ "description": "create_floatingip action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_floatingip:floating_ip_address",
+ "description": "create_floatingip:floating_ip_address action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_floatingip",
+ "description": "update_floatingip action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_floatingip",
+ "description": "delete_floatingip action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_floatingip",
+ "description": "get_floatingip action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_network_profile",
+ "description": "create_network_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_network_profile",
+ "description": "update_network_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_network_profile",
+ "description": "delete_network_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network_profiles",
+ "description": "get_network_profiles action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_network_profile",
+ "description": "get_network_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_policy_profiles",
+ "description": "update_policy_profiles action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_policy_profiles",
+ "description": "get_policy_profiles action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_policy_profile",
+ "description": "get_policy_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_metering_label",
+ "description": "create_metering_label action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_metering_label",
+ "description": "delete_metering_label action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metering_label",
+ "description": "get_metering_label action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_metering_label_rule",
+ "description": "create_metering_label_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_metering_label_rule",
+ "description": "delete_metering_label_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metering_label_rule",
+ "description": "get_metering_label_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_service_provider",
+ "description": "get_service_provider action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_lsn",
+ "description": "get_lsn action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_lsn",
+ "description": "create_lsn action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_flavor",
+ "description": "create_flavor action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_flavor",
+ "description": "update_flavor action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_flavor",
+ "description": "delete_flavor action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_flavors",
+ "description": "get_flavors action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_flavor",
+ "description": "get_flavor action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_service_profile",
+ "description": "create_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_service_profile",
+ "description": "update_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_service_profile",
+ "description": "delete_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_service_profiles",
+ "description": "get_service_profiles action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_service_profile",
+ "description": "get_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_policy",
+ "description": "get_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_policy",
+ "description": "create_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_policy",
+ "description": "update_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_policy",
+ "description": "delete_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_policy_bandwidth_limit_rule",
+ "description": "get_policy_bandwidth_limit_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_policy_bandwidth_limit_rule",
+ "description": "create_policy_bandwidth_limit_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_policy_bandwidth_limit_rule",
+ "description": "delete_policy_bandwidth_limit_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_policy_bandwidth_limit_rule",
+ "description": "update_policy_bandwidth_limit_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_policy_dscp_marking_rule",
+ "description": "get_policy_dscp_marking_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_policy_dscp_marking_rule",
+ "description": "create_policy_dscp_marking_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_policy_dscp_marking_rule",
+ "description": "delete_policy_dscp_marking_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_policy_dscp_marking_rule",
+ "description": "update_policy_dscp_marking_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_rule_type",
+ "description": "get_rule_type action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_policy_minimum_bandwidth_rule",
+ "description": "get_policy_minimum_bandwidth_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_policy_minimum_bandwidth_rule",
+ "description": "create_policy_minimum_bandwidth_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_policy_minimum_bandwidth_rule",
+ "description": "delete_policy_minimum_bandwidth_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_policy_minimum_bandwidth_rule",
+ "description": "update_policy_minimum_bandwidth_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "restrict_wildcard",
+ "description": "restrict_wildcard action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_rbac_policy",
+ "description": "create_rbac_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_rbac_policy:target_tenant",
+ "description": "create_rbac_policy:target_tenant action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_rbac_policy",
+ "description": "update_rbac_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_rbac_policy:target_tenant",
+ "description": "update_rbac_policy:target_tenant action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_rbac_policy",
+ "description": "get_rbac_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_rbac_policy",
+ "description": "delete_rbac_policy action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_flavor_service_profile",
+ "description": "create_flavor_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_flavor_service_profile",
+ "description": "delete_flavor_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_flavor_service_profile",
+ "description": "get_flavor_service_profile action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_auto_allocated_topology",
+ "description": "get_auto_allocated_topology action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_trunk",
+ "description": "create_trunk action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_trunk",
+ "description": "get_trunk action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_trunk",
+ "description": "delete_trunk action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_subports",
+ "description": "get_subports action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_subports",
+ "description": "add_subports action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "remove_subports",
+ "description": "remove_subports action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_security_groups",
+ "description": "get_security_groups action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_security_group",
+ "description": "get_security_group action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_security_group",
+ "description": "create_security_group action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_security_group",
+ "description": "update_security_group action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_security_group",
+ "description": "delete_security_group action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_security_group_rules",
+ "description": "get_security_group_rules action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_security_group_rule",
+ "description": "get_security_group_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_security_group_rule",
+ "description": "create_security_group_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_security_group_rule",
+ "description": "delete_security_group_rule action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_loggable_resources",
+ "description": "get_loggable_resources action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "create_log",
+ "description": "create_log action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "update_log",
+ "description": "update_log action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_log",
+ "description": "delete_log action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_logs",
+ "description": "get_logs action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_log",
+ "description": "get_log action for neutron",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter",
+ "description": "cells_scheduler_filter:TargetCellFilter action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create",
+ "description": "compute:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create:attach_network",
+ "description": "compute:create:attach_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create:attach_volume",
+ "description": "compute:create:attach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create:forced_host",
+ "description": "compute:create:forced_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get",
+ "description": "compute:get action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all",
+ "description": "compute:get_all action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all_tenants",
+ "description": "compute:get_all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:update",
+ "description": "compute:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_instance_metadata",
+ "description": "compute:get_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all_instance_metadata",
+ "description": "compute:get_all_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all_instance_system_metadata",
+ "description": "compute:get_all_instance_system_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:update_instance_metadata",
+ "description": "compute:update_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:delete_instance_metadata",
+ "description": "compute:delete_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_instance_faults",
+ "description": "compute:get_instance_faults action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_diagnostics",
+ "description": "compute:get_diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_instance_diagnostics",
+ "description": "compute:get_instance_diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:start",
+ "description": "compute:start action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:stop",
+ "description": "compute:stop action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_lock",
+ "description": "compute:get_lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:lock",
+ "description": "compute:lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unlock",
+ "description": "compute:unlock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unlock_override",
+ "description": "compute:unlock_override action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_vnc_console",
+ "description": "compute:get_vnc_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_spice_console",
+ "description": "compute:get_spice_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_rdp_console",
+ "description": "compute:get_rdp_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_serial_console",
+ "description": "compute:get_serial_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_mks_console",
+ "description": "compute:get_mks_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_console_output",
+ "description": "compute:get_console_output action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:reset_network",
+ "description": "compute:reset_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:inject_network_info",
+ "description": "compute:inject_network_info action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:add_fixed_ip",
+ "description": "compute:add_fixed_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:remove_fixed_ip",
+ "description": "compute:remove_fixed_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:attach_volume",
+ "description": "compute:attach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:detach_volume",
+ "description": "compute:detach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:swap_volume",
+ "description": "compute:swap_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:attach_interface",
+ "description": "compute:attach_interface action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:detach_interface",
+ "description": "compute:detach_interface action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:set_admin_password",
+ "description": "compute:set_admin_password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:rescue",
+ "description": "compute:rescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unrescue",
+ "description": "compute:unrescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:suspend",
+ "description": "compute:suspend action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:resume",
+ "description": "compute:resume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:pause",
+ "description": "compute:pause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unpause",
+ "description": "compute:unpause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:shelve",
+ "description": "compute:shelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:shelve_offload",
+ "description": "compute:shelve_offload action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unshelve",
+ "description": "compute:unshelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:snapshot",
+ "description": "compute:snapshot action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:snapshot_volume_backed",
+ "description": "compute:snapshot_volume_backed action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:backup",
+ "description": "compute:backup action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:resize",
+ "description": "compute:resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:confirm_resize",
+ "description": "compute:confirm_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:revert_resize",
+ "description": "compute:revert_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:rebuild",
+ "description": "compute:rebuild action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:reboot",
+ "description": "compute:reboot action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:delete",
+ "description": "compute:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:soft_delete",
+ "description": "compute:soft_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:force_delete",
+ "description": "compute:force_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:security_groups:add_to_instance",
+ "description": "compute:security_groups:add_to_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:security_groups:remove_from_instance",
+ "description": "compute:security_groups:remove_from_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:restore",
+ "description": "compute:restore action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:volume_snapshot_create",
+ "description": "compute:volume_snapshot_create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:volume_snapshot_delete",
+ "description": "compute:volume_snapshot_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:accounts",
+ "description": "compute_extension:accounts action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions",
+ "description": "compute_extension:admin_actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:pause",
+ "description": "compute_extension:admin_actions:pause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:unpause",
+ "description": "compute_extension:admin_actions:unpause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:suspend",
+ "description": "compute_extension:admin_actions:suspend action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:resume",
+ "description": "compute_extension:admin_actions:resume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:lock",
+ "description": "compute_extension:admin_actions:lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:unlock",
+ "description": "compute_extension:admin_actions:unlock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:resetNetwork",
+ "description": "compute_extension:admin_actions:resetNetwork action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo",
+ "description": "compute_extension:admin_actions:injectNetworkInfo action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:createBackup",
+ "description": "compute_extension:admin_actions:createBackup action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:migrateLive",
+ "description": "compute_extension:admin_actions:migrateLive action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:resetState",
+ "description": "compute_extension:admin_actions:resetState action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:migrate",
+ "description": "compute_extension:admin_actions:migrate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:aggregates",
+ "description": "compute_extension:aggregates action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:agents",
+ "description": "compute_extension:agents action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:attach_interfaces",
+ "description": "compute_extension:attach_interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:baremetal_nodes",
+ "description": "compute_extension:baremetal_nodes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells",
+ "description": "compute_extension:cells action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:create",
+ "description": "compute_extension:cells:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:delete",
+ "description": "compute_extension:cells:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:update",
+ "description": "compute_extension:cells:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:sync_instances",
+ "description": "compute_extension:cells:sync_instances action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:certificates",
+ "description": "compute_extension:certificates action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cloudpipe",
+ "description": "compute_extension:cloudpipe action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cloudpipe_update",
+ "description": "compute_extension:cloudpipe_update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:config_drive",
+ "description": "compute_extension:config_drive action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:console_output",
+ "description": "compute_extension:console_output action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:consoles",
+ "description": "compute_extension:consoles action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:createserverext",
+ "description": "compute_extension:createserverext action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:deferred_delete",
+ "description": "compute_extension:deferred_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:disk_config",
+ "description": "compute_extension:disk_config action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:evacuate",
+ "description": "compute_extension:evacuate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_server_attributes",
+ "description": "compute_extension:extended_server_attributes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_status",
+ "description": "compute_extension:extended_status action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_availability_zone",
+ "description": "compute_extension:extended_availability_zone action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_ips",
+ "description": "compute_extension:extended_ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_ips_mac",
+ "description": "compute_extension:extended_ips_mac action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_vif_net",
+ "description": "compute_extension:extended_vif_net action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_volumes",
+ "description": "compute_extension:extended_volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:fixed_ips",
+ "description": "compute_extension:fixed_ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_access",
+ "description": "compute_extension:flavor_access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess",
+ "description": "compute_extension:flavor_access:addTenantAccess action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess",
+ "description": "compute_extension:flavor_access:removeTenantAccess action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_disabled",
+ "description": "compute_extension:flavor_disabled action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_rxtx",
+ "description": "compute_extension:flavor_rxtx action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_swap",
+ "description": "compute_extension:flavor_swap action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextradata",
+ "description": "compute_extension:flavorextradata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:index",
+ "description": "compute_extension:flavorextraspecs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:show",
+ "description": "compute_extension:flavorextraspecs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:create",
+ "description": "compute_extension:flavorextraspecs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:update",
+ "description": "compute_extension:flavorextraspecs:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:delete",
+ "description": "compute_extension:flavorextraspecs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavormanage",
+ "description": "compute_extension:flavormanage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ip_dns",
+ "description": "compute_extension:floating_ip_dns action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ip_pools",
+ "description": "compute_extension:floating_ip_pools action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ips",
+ "description": "compute_extension:floating_ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ips_bulk",
+ "description": "compute_extension:floating_ips_bulk action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:fping",
+ "description": "compute_extension:fping action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:fping:all_tenants",
+ "description": "compute_extension:fping:all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:hide_server_addresses",
+ "description": "compute_extension:hide_server_addresses action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:hosts",
+ "description": "compute_extension:hosts action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:hypervisors",
+ "description": "compute_extension:hypervisors action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:image_size",
+ "description": "compute_extension:image_size action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:instance_actions",
+ "description": "compute_extension:instance_actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:instance_actions:events",
+ "description": "compute_extension:instance_actions:events action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:instance_usage_audit_log",
+ "description": "compute_extension:instance_usage_audit_log action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs",
+ "description": "compute_extension:keypairs action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:index",
+ "description": "compute_extension:keypairs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:show",
+ "description": "compute_extension:keypairs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:create",
+ "description": "compute_extension:keypairs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:delete",
+ "description": "compute_extension:keypairs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:multinic",
+ "description": "compute_extension:multinic action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:networks",
+ "description": "compute_extension:networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:networks:view",
+ "description": "compute_extension:networks:view action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:networks_associate",
+ "description": "compute_extension:networks_associate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-tenant-networks",
+ "description": "compute_extension:os-tenant-networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quotas:show",
+ "description": "compute_extension:quotas:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quotas:update",
+ "description": "compute_extension:quotas:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quotas:delete",
+ "description": "compute_extension:quotas:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quota_classes",
+ "description": "compute_extension:quota_classes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:rescue",
+ "description": "compute_extension:rescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:security_group_default_rules",
+ "description": "compute_extension:security_group_default_rules action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:security_groups",
+ "description": "compute_extension:security_groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_diagnostics",
+ "description": "compute_extension:server_diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_groups",
+ "description": "compute_extension:server_groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_password",
+ "description": "compute_extension:server_password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_usage",
+ "description": "compute_extension:server_usage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:services",
+ "description": "compute_extension:services action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:shelve",
+ "description": "compute_extension:shelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:shelveOffload",
+ "description": "compute_extension:shelveOffload action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:show",
+ "description": "compute_extension:simple_tenant_usage:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:list",
+ "description": "compute_extension:simple_tenant_usage:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:unshelve",
+ "description": "compute_extension:unshelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:users",
+ "description": "compute_extension:users action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:virtual_interfaces",
+ "description": "compute_extension:virtual_interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:virtual_storage_arrays",
+ "description": "compute_extension:virtual_storage_arrays action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volumes",
+ "description": "compute_extension:volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:index",
+ "description": "compute_extension:volume_attachments:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:show",
+ "description": "compute_extension:volume_attachments:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:create",
+ "description": "compute_extension:volume_attachments:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:update",
+ "description": "compute_extension:volume_attachments:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:delete",
+ "description": "compute_extension:volume_attachments:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volumetypes",
+ "description": "compute_extension:volumetypes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:availability_zone:list",
+ "description": "compute_extension:availability_zone:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:availability_zone:detail",
+ "description": "compute_extension:availability_zone:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:used_limits_for_admin",
+ "description": "compute_extension:used_limits_for_admin action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:migrations:index",
+ "description": "compute_extension:migrations:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create",
+ "description": "compute_extension:os-assisted-volume-snapshots:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete",
+ "description": "compute_extension:os-assisted-volume-snapshots:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:console_auth_tokens",
+ "description": "compute_extension:console_auth_tokens action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-server-external-events:create",
+ "description": "compute_extension:os-server-external-events:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_all",
+ "description": "network:get_all action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get",
+ "description": "network:get action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:create",
+ "description": "network:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:delete",
+ "description": "network:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:associate",
+ "description": "network:associate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:disassociate",
+ "description": "network:disassociate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_vifs_by_instance",
+ "description": "network:get_vifs_by_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:allocate_for_instance",
+ "description": "network:allocate_for_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:deallocate_for_instance",
+ "description": "network:deallocate_for_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:validate_networks",
+ "description": "network:validate_networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_instance_uuids_by_ip_filter",
+ "description": "network:get_instance_uuids_by_ip_filter action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_instance_id_by_floating_address",
+ "description": "network:get_instance_id_by_floating_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:setup_networks_on_host",
+ "description": "network:setup_networks_on_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_backdoor_port",
+ "description": "network:get_backdoor_port action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ip",
+ "description": "network:get_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ip_pools",
+ "description": "network:get_floating_ip_pools action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ip_by_address",
+ "description": "network:get_floating_ip_by_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ips_by_project",
+ "description": "network:get_floating_ips_by_project action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ips_by_fixed_address",
+ "description": "network:get_floating_ips_by_fixed_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:allocate_floating_ip",
+ "description": "network:allocate_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:associate_floating_ip",
+ "description": "network:associate_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:disassociate_floating_ip",
+ "description": "network:disassociate_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:release_floating_ip",
+ "description": "network:release_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:migrate_instance_start",
+ "description": "network:migrate_instance_start action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:migrate_instance_finish",
+ "description": "network:migrate_instance_finish action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_fixed_ip",
+ "description": "network:get_fixed_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_fixed_ip_by_address",
+ "description": "network:get_fixed_ip_by_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:add_fixed_ip_to_instance",
+ "description": "network:add_fixed_ip_to_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:remove_fixed_ip_from_instance",
+ "description": "network:remove_fixed_ip_from_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:add_network_to_project",
+ "description": "network:add_network_to_project action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_instance_nw_info",
+ "description": "network:get_instance_nw_info action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_dns_domains",
+ "description": "network:get_dns_domains action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:add_dns_entry",
+ "description": "network:add_dns_entry action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:modify_dns_entry",
+ "description": "network:modify_dns_entry action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:delete_dns_entry",
+ "description": "network:delete_dns_entry action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_dns_entries_by_address",
+ "description": "network:get_dns_entries_by_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_dns_entries_by_name",
+ "description": "network:get_dns_entries_by_name action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:create_private_dns_domain",
+ "description": "network:create_private_dns_domain action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:create_public_dns_domain",
+ "description": "network:create_public_dns_domain action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:delete_dns_domain",
+ "description": "network:delete_dns_domain action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:attach_external_network",
+ "description": "network:attach_external_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_vif_by_mac_address",
+ "description": "network:get_vif_by_mac_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants",
+ "description": "os_compute_api:servers:detail:get_all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants",
+ "description": "os_compute_api:servers:index:get_all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:confirm_resize",
+ "description": "os_compute_api:servers:confirm_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create",
+ "description": "os_compute_api:servers:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_network",
+ "description": "os_compute_api:servers:create:attach_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_volume",
+ "description": "os_compute_api:servers:create:attach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create:forced_host",
+ "description": "os_compute_api:servers:create:forced_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:delete",
+ "description": "os_compute_api:servers:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:update",
+ "description": "os_compute_api:servers:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:detail",
+ "description": "os_compute_api:servers:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:index",
+ "description": "os_compute_api:servers:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:reboot",
+ "description": "os_compute_api:servers:reboot action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:rebuild",
+ "description": "os_compute_api:servers:rebuild action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:resize",
+ "description": "os_compute_api:servers:resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:revert_resize",
+ "description": "os_compute_api:servers:revert_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:show",
+ "description": "os_compute_api:servers:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create_image",
+ "description": "os_compute_api:servers:create_image action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed",
+ "description": "os_compute_api:servers:create_image:allow_volume_backed action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:start",
+ "description": "os_compute_api:servers:start action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:stop",
+ "description": "os_compute_api:servers:stop action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-access-ips:discoverable",
+ "description": "os_compute_api:os-access-ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-access-ips",
+ "description": "os_compute_api:os-access-ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions",
+ "description": "os_compute_api:os-admin-actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable",
+ "description": "os_compute_api:os-admin-actions:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network",
+ "description": "os_compute_api:os-admin-actions:reset_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info",
+ "description": "os_compute_api:os-admin-actions:inject_network_info action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state",
+ "description": "os_compute_api:os-admin-actions:reset_state action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-password",
+ "description": "os_compute_api:os-admin-password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-password:discoverable",
+ "description": "os_compute_api:os-admin-password:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:discoverable",
+ "description": "os_compute_api:os-aggregates:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:index",
+ "description": "os_compute_api:os-aggregates:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:create",
+ "description": "os_compute_api:os-aggregates:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:show",
+ "description": "os_compute_api:os-aggregates:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:update",
+ "description": "os_compute_api:os-aggregates:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:delete",
+ "description": "os_compute_api:os-aggregates:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:add_host",
+ "description": "os_compute_api:os-aggregates:add_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:remove_host",
+ "description": "os_compute_api:os-aggregates:remove_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata",
+ "description": "os_compute_api:os-aggregates:set_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-agents",
+ "description": "os_compute_api:os-agents action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-agents:discoverable",
+ "description": "os_compute_api:os-agents:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces",
+ "description": "os_compute_api:os-attach-interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable",
+ "description": "os_compute_api:os-attach-interfaces:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes",
+ "description": "os_compute_api:os-baremetal-nodes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable",
+ "description": "os_compute_api:os-baremetal-nodes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable",
+ "description": "os_compute_api:os-block-device-mapping-v1:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells",
+ "description": "os_compute_api:os-cells action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:create",
+ "description": "os_compute_api:os-cells:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:delete",
+ "description": "os_compute_api:os-cells:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:update",
+ "description": "os_compute_api:os-cells:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:sync_instances",
+ "description": "os_compute_api:os-cells:sync_instances action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:discoverable",
+ "description": "os_compute_api:os-cells:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-certificates:create",
+ "description": "os_compute_api:os-certificates:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-certificates:show",
+ "description": "os_compute_api:os-certificates:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-certificates:discoverable",
+ "description": "os_compute_api:os-certificates:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe",
+ "description": "os_compute_api:os-cloudpipe action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable",
+ "description": "os_compute_api:os-cloudpipe:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-config-drive",
+ "description": "os_compute_api:os-config-drive action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:discoverable",
+ "description": "os_compute_api:os-consoles:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:create",
+ "description": "os_compute_api:os-consoles:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:delete",
+ "description": "os_compute_api:os-consoles:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:index",
+ "description": "os_compute_api:os-consoles:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:show",
+ "description": "os_compute_api:os-consoles:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-console-output:discoverable",
+ "description": "os_compute_api:os-console-output:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-console-output",
+ "description": "os_compute_api:os-console-output action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles",
+ "description": "os_compute_api:os-remote-consoles action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable",
+ "description": "os_compute_api:os-remote-consoles:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-create-backup:discoverable",
+ "description": "os_compute_api:os-create-backup:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-create-backup",
+ "description": "os_compute_api:os-create-backup action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete",
+ "description": "os_compute_api:os-deferred-delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable",
+ "description": "os_compute_api:os-deferred-delete:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-disk-config",
+ "description": "os_compute_api:os-disk-config action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-disk-config:discoverable",
+ "description": "os_compute_api:os-disk-config:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-evacuate",
+ "description": "os_compute_api:os-evacuate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-evacuate:discoverable",
+ "description": "os_compute_api:os-evacuate:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes",
+ "description": "os_compute_api:os-extended-server-attributes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable",
+ "description": "os_compute_api:os-extended-server-attributes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-status",
+ "description": "os_compute_api:os-extended-status action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-status:discoverable",
+ "description": "os_compute_api:os-extended-status:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone",
+ "description": "os_compute_api:os-extended-availability-zone action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable",
+ "description": "os_compute_api:os-extended-availability-zone:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:extensions",
+ "description": "os_compute_api:extensions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:extension_info:discoverable",
+ "description": "os_compute_api:extension_info:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes",
+ "description": "os_compute_api:os-extended-volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable",
+ "description": "os_compute_api:os-extended-volumes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips",
+ "description": "os_compute_api:os-fixed-ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable",
+ "description": "os_compute_api:os-fixed-ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access",
+ "description": "os_compute_api:os-flavor-access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable",
+ "description": "os_compute_api:os-flavor-access:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access",
+ "description": "os_compute_api:os-flavor-access:remove_tenant_access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access",
+ "description": "os_compute_api:os-flavor-access:add_tenant_access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx",
+ "description": "os_compute_api:os-flavor-rxtx action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable",
+ "description": "os_compute_api:os-flavor-rxtx:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:flavors:discoverable",
+ "description": "os_compute_api:flavors:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable",
+ "description": "os_compute_api:os-flavor-extra-specs:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index",
+ "description": "os_compute_api:os-flavor-extra-specs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show",
+ "description": "os_compute_api:os-flavor-extra-specs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create",
+ "description": "os_compute_api:os-flavor-extra-specs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update",
+ "description": "os_compute_api:os-flavor-extra-specs:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete",
+ "description": "os_compute_api:os-flavor-extra-specs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable",
+ "description": "os_compute_api:os-flavor-manage:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage",
+ "description": "os_compute_api:os-flavor-manage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns",
+ "description": "os_compute_api:os-floating-ip-dns action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable",
+ "description": "os_compute_api:os-floating-ip-dns:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update",
+ "description": "os_compute_api:os-floating-ip-dns:domain:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete",
+ "description": "os_compute_api:os-floating-ip-dns:domain:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools",
+ "description": "os_compute_api:os-floating-ip-pools action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable",
+ "description": "os_compute_api:os-floating-ip-pools:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips",
+ "description": "os_compute_api:os-floating-ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable",
+ "description": "os_compute_api:os-floating-ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk",
+ "description": "os_compute_api:os-floating-ips-bulk action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable",
+ "description": "os_compute_api:os-floating-ips-bulk:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fping",
+ "description": "os_compute_api:os-fping action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fping:discoverable",
+ "description": "os_compute_api:os-fping:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fping:all_tenants",
+ "description": "os_compute_api:os-fping:all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses",
+ "description": "os_compute_api:os-hide-server-addresses action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable",
+ "description": "os_compute_api:os-hide-server-addresses:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hosts",
+ "description": "os_compute_api:os-hosts action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hosts:discoverable",
+ "description": "os_compute_api:os-hosts:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hypervisors",
+ "description": "os_compute_api:os-hypervisors action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable",
+ "description": "os_compute_api:os-hypervisors:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:images:discoverable",
+ "description": "os_compute_api:images:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:image-size",
+ "description": "os_compute_api:image-size action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:image-size:discoverable",
+ "description": "os_compute_api:image-size:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-actions",
+ "description": "os_compute_api:os-instance-actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable",
+ "description": "os_compute_api:os-instance-actions:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:events",
+ "description": "os_compute_api:os-instance-actions:events action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log",
+ "description": "os_compute_api:os-instance-usage-audit-log action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable",
+ "description": "os_compute_api:os-instance-usage-audit-log:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:ips:discoverable",
+ "description": "os_compute_api:ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:ips:index",
+ "description": "os_compute_api:ips:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:ips:show",
+ "description": "os_compute_api:ips:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:discoverable",
+ "description": "os_compute_api:os-keypairs:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs",
+ "description": "os_compute_api:os-keypairs action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:index",
+ "description": "os_compute_api:os-keypairs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:show",
+ "description": "os_compute_api:os-keypairs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:create",
+ "description": "os_compute_api:os-keypairs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:delete",
+ "description": "os_compute_api:os-keypairs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:limits:discoverable",
+ "description": "os_compute_api:limits:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:limits",
+ "description": "os_compute_api:limits action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:discoverable",
+ "description": "os_compute_api:os-lock-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:lock",
+ "description": "os_compute_api:os-lock-server:lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock",
+ "description": "os_compute_api:os-lock-server:unlock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override",
+ "description": "os_compute_api:os-lock-server:unlock:unlock_override action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable",
+ "description": "os_compute_api:os-migrate-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate",
+ "description": "os_compute_api:os-migrate-server:migrate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live",
+ "description": "os_compute_api:os-migrate-server:migrate_live action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-multinic",
+ "description": "os_compute_api:os-multinic action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-multinic:discoverable",
+ "description": "os_compute_api:os-multinic:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks",
+ "description": "os_compute_api:os-networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks:view",
+ "description": "os_compute_api:os-networks:view action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks:discoverable",
+ "description": "os_compute_api:os-networks:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks-associate",
+ "description": "os_compute_api:os-networks-associate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable",
+ "description": "os_compute_api:os-networks-associate:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pause-server:discoverable",
+ "description": "os_compute_api:os-pause-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pause-server:pause",
+ "description": "os_compute_api:os-pause-server:pause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pause-server:unpause",
+ "description": "os_compute_api:os-pause-server:unpause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:pci_servers",
+ "description": "os_compute_api:os-pci:pci_servers action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:discoverable",
+ "description": "os_compute_api:os-pci:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:index",
+ "description": "os_compute_api:os-pci:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:detail",
+ "description": "os_compute_api:os-pci:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:show",
+ "description": "os_compute_api:os-pci:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-personality:discoverable",
+ "description": "os_compute_api:os-personality:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable",
+ "description": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable",
+ "description": "os_compute_api:os-quota-sets:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:show",
+ "description": "os_compute_api:os-quota-sets:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:defaults",
+ "description": "os_compute_api:os-quota-sets:defaults action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:update",
+ "description": "os_compute_api:os-quota-sets:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:delete",
+ "description": "os_compute_api:os-quota-sets:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:detail",
+ "description": "os_compute_api:os-quota-sets:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:update",
+ "description": "os_compute_api:os-quota-class-sets:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:show",
+ "description": "os_compute_api:os-quota-class-sets:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable",
+ "description": "os_compute_api:os-quota-class-sets:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-rescue",
+ "description": "os_compute_api:os-rescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-rescue:discoverable",
+ "description": "os_compute_api:os-rescue:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable",
+ "description": "os_compute_api:os-scheduler-hints:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable",
+ "description": "os_compute_api:os-security-group-default-rules:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules",
+ "description": "os_compute_api:os-security-group-default-rules action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-groups",
+ "description": "os_compute_api:os-security-groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-groups:discoverable",
+ "description": "os_compute_api:os-security-groups:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics",
+ "description": "os_compute_api:os-server-diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable",
+ "description": "os_compute_api:os-server-diagnostics:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-password",
+ "description": "os_compute_api:os-server-password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-password:discoverable",
+ "description": "os_compute_api:os-server-password:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-usage",
+ "description": "os_compute_api:os-server-usage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-usage:discoverable",
+ "description": "os_compute_api:os-server-usage:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-groups",
+ "description": "os_compute_api:os-server-groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-groups:discoverable",
+ "description": "os_compute_api:os-server-groups:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-services",
+ "description": "os_compute_api:os-services action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-services:discoverable",
+ "description": "os_compute_api:os-services:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:discoverable",
+ "description": "os_compute_api:server-metadata:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:index",
+ "description": "os_compute_api:server-metadata:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:show",
+ "description": "os_compute_api:server-metadata:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:delete",
+ "description": "os_compute_api:server-metadata:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:create",
+ "description": "os_compute_api:server-metadata:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:update",
+ "description": "os_compute_api:server-metadata:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:update_all",
+ "description": "os_compute_api:server-metadata:update_all action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:discoverable",
+ "description": "os_compute_api:servers:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve",
+ "description": "os_compute_api:os-shelve:shelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable",
+ "description": "os_compute_api:os-shelve:shelve:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload",
+ "description": "os_compute_api:os-shelve:shelve_offload action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable",
+ "description": "os_compute_api:os-simple-tenant-usage:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show",
+ "description": "os_compute_api:os-simple-tenant-usage:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list",
+ "description": "os_compute_api:os-simple-tenant-usage:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable",
+ "description": "os_compute_api:os-suspend-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:suspend",
+ "description": "os_compute_api:os-suspend-server:suspend action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:resume",
+ "description": "os_compute_api:os-suspend-server:resume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks",
+ "description": "os_compute_api:os-tenant-networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable",
+ "description": "os_compute_api:os-tenant-networks:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:unshelve",
+ "description": "os_compute_api:os-shelve:unshelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-user-data:discoverable",
+ "description": "os_compute_api:os-user-data:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces",
+ "description": "os_compute_api:os-virtual-interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable",
+ "description": "os_compute_api:os-virtual-interfaces:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes",
+ "description": "os_compute_api:os-volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes:discoverable",
+ "description": "os_compute_api:os-volumes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:index",
+ "description": "os_compute_api:os-volumes-attachments:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:show",
+ "description": "os_compute_api:os-volumes-attachments:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:create",
+ "description": "os_compute_api:os-volumes-attachments:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:update",
+ "description": "os_compute_api:os-volumes-attachments:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete",
+ "description": "os_compute_api:os-volumes-attachments:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable",
+ "description": "os_compute_api:os-volumes-attachments:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:list",
+ "description": "os_compute_api:os-availability-zone:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable",
+ "description": "os_compute_api:os-availability-zone:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:detail",
+ "description": "os_compute_api:os-availability-zone:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-used-limits",
+ "description": "os_compute_api:os-used-limits action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-used-limits:discoverable",
+ "description": "os_compute_api:os-used-limits:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrations:index",
+ "description": "os_compute_api:os-migrations:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrations:discoverable",
+ "description": "os_compute_api:os-migrations:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create",
+ "description": "os_compute_api:os-assisted-volume-snapshots:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete",
+ "description": "os_compute_api:os-assisted-volume-snapshots:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable",
+ "description": "os_compute_api:os-assisted-volume-snapshots:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-console-auth-tokens",
+ "description": "os_compute_api:os-console-auth-tokens action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-external-events:create",
+ "description": "os_compute_api:os-server-external-events:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {
+ "name": "volume:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_volume_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_volume_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete_volume_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete_volume_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_volume_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_volume_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_volume_admin_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_volume_admin_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_volume_admin_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_volume_admin_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_all_snapshots"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_all_snapshots"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:create_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:create_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:extend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:extend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_readonly_flag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_readonly_flag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:retype"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:retype"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:types_manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:types_manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:types_extra_specs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:types_extra_specs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:access_types_qos_specs_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:access_types_qos_specs_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:access_types_extra_specs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:access_types_extra_specs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_access:addProjectAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_access:removeProjectAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_encryption"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_encryption"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_encryption_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_encryption_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:extended_snapshot_attributes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:extended_snapshot_attributes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_image_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_image_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quotas:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quotas:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quotas:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quotas:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quotas:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quotas:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quota_classes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quota_classes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:reset_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:snapshot_admin_actions:reset_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:backup_admin_actions:reset_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:force_detach"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:snapshot_admin_actions:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:backup_admin_actions:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:migrate_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_host_attribute"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_host_attribute"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_tenant_attribute"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_tenant_attribute"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_mig_status_attribute"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_mig_status_attribute"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:hosts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:hosts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:services:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:services:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:services:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:services:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_unmanage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_unmanage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:capabilities"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:capabilities"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:create_transfer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:create_transfer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:accept_transfer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:accept_transfer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete_transfer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete_transfer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_all_transfers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_all_transfers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:replication:promote"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:replication:promote"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:replication:reenable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:replication:reenable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:enable_replication"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:enable_replication"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:disable_replication"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:disable_replication"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:failover_replication"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:failover_replication"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:list_replication_targets"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:list_replication_targets"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:restore"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:restore"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:backup-import"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:backup-import"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:backup-export"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:backup-export"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "snapshot_extension:snapshot_manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "snapshot_extension:snapshot_manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "snapshot_extension:snapshot_unmanage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "snapshot_extension:snapshot_unmanage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:create_cgsnapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:create_cgsnapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:delete_cgsnapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:delete_cgsnapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get_cgsnapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get_cgsnapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get_all_cgsnapshots"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get_all_cgsnapshots"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "scheduler_extension:scheduler_stats:get_pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_images"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_images"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "publicize_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "publicize_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "communitize_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "communitize_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "copy_from"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "copy_from"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "download_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "download_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "upload_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "upload_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_image_location"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_image_location"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_image_location"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_image_location"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "set_image_location"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "set_image_location"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_members"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_members"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "manage_image_cache"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "manage_image_cache"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_task"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_task"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_tasks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_tasks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_task"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_task"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_task"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_task"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "tasks_api_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "tasks_api_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "deactivate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "deactivate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "reactivate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "reactivate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_namespace"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_namespace"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_namespaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_namespaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_namespace"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_namespace"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_namespace"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_namespace"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_object"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_object"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_objects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_objects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_object"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_object"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_object"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_object"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "list_metadef_resource_types"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "list_metadef_resource_types"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_resource_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_resource_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_resource_type_association"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_resource_type_association"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_property"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_property"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_properties"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_properties"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_property"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_property"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_property"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_property"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_regions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_regions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_services"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_services"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_registered_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_registered_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_registered_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_registered_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_registered_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_registered_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_registered_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_registered_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_registered_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_registered_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_domains"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_domains"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_target_project_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_target_project_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_project_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_project_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_user_projects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_user_projects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_project_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_project_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_project_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_project_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_project_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_project_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_project_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_project_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_project_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_project_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_project_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_project_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_target_user_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_target_user_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_user_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_user_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_users"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_users"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_target_group_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_target_group_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_group_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_group_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_groups_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_groups_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_users_in_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_users_in_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:remove_user_from_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:remove_user_from_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_user_in_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_user_in_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:add_user_to_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:add_user_to_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_credentials"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_credentials"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_get_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_get_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_list_credentials"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_list_credentials"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_create_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_create_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_delete_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_delete_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_matches_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_matches_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_matches_target_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_matches_target_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_matches_filter_on_list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_matches_filter_on_list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_prior_role_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_prior_role_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "implied_role_matches_prior_role_domain_or_global"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_implied_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_implied_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_role_inference_rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_role_inference_rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_system_grants_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_system_grants_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_system_grant_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_system_grant_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_system_grant_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_system_grant_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_system_grant_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_system_grant_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_system_grants_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_system_grants_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_system_grant_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_system_grant_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_system_grant_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_system_grant_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_system_grant_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_system_grant_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_grant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_grant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_grant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_grant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_grant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_grant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_global_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_global_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_domain_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_grant_match"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_grant_match"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_global_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_global_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_domain_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_list_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_list_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_list_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_list_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_on_domain_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_on_domain_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_on_project_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_on_project_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_on_domain_of_project_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_on_domain_of_project_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_role_assignments"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_role_assignments"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_role_assignments_for_tree"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_role_assignments_for_tree"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_policies"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_policies"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:validate_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:validate_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:validate_token_head"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:validate_token_head"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revocation_list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revocation_list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_trusts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_trusts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_roles_for_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_roles_for_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_role_for_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_role_for_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_consumers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_consumers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:authorize_request_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:authorize_request_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_access_token_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_access_token_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_access_token_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_access_token_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_access_tokens"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_access_tokens"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_access_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_access_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_access_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_access_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:add_endpoint_to_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:add_endpoint_to_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_endpoint_in_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_endpoint_in_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints_for_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints_for_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:remove_endpoint_from_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:remove_endpoint_from_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoint_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoint_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects_associated_with_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints_associated_with_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_endpoint_group_in_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_endpoint_group_in_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoint_groups_for_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoint_groups_for_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:add_endpoint_group_to_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:add_endpoint_group_to_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:remove_endpoint_group_from_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:remove_endpoint_group_from_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_identity_providers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_identity_providers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_protocols"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_protocols"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_mappings"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_mappings"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_service_providers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_service_providers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_catalog"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_catalog"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_projects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_projects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_domains"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_domains"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_system"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_system"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_domains_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_domains_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_revoke_events"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_revoke_events"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy_association_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy_association_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_policy_association_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_policy_association_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy_association_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy_association_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy_association_for_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy_association_for_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_policy_association_for_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_policy_association_for_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy_association_for_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy_association_for_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy_association_for_region_and_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_policy_association_for_region_and_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy_association_for_region_and_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_policy_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_policy_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints_for_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints_for_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_security_compliance_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_security_compliance_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain_config_default"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain_config_default"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_application_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_application_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_application_credentials"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_application_credentials"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_application_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_application_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_application_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_application_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_subnet"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_subnet"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_subnet:segment_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_subnet:segment_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_subnet:service_types"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_subnet:service_types"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_subnet"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_subnet"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_subnet:segment_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_subnet:segment_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_subnet"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_subnet"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_subnet:service_types"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_subnet:service_types"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_subnet"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_subnet"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_subnetpool"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_subnetpool"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_subnetpool:shared"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_subnetpool:shared"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_subnetpool:is_default"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_subnetpool:is_default"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_subnetpool"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_subnetpool"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_subnetpool"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_subnetpool"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_subnetpool:is_default"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_subnetpool:is_default"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_subnetpool"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_subnetpool"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_address_scope"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_address_scope"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_address_scope:shared"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_address_scope:shared"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_address_scope"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_address_scope"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_address_scope"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_address_scope"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_address_scope:shared"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_address_scope:shared"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_address_scope"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_address_scope"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network:router:external"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network:router:external"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network:segments"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network:segments"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network:provider:network_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network:provider:network_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network:provider:physical_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network:provider:physical_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network:provider:segmentation_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network:provider:segmentation_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network:queue_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network:queue_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network_ip_availabilities"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network_ip_availabilities"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network_ip_availability"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network_ip_availability"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:shared"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:shared"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:router:external"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:router:external"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:is_default"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:is_default"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:segments"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:segments"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:provider:network_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:provider:network_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:provider:physical_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:provider:physical_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network:provider:segmentation_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network:provider:segmentation_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network:segments"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network:segments"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network:shared"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network:shared"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network:provider:network_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network:provider:network_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network:provider:physical_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network:provider:physical_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network:provider:segmentation_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network:provider:segmentation_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network:router:external"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network:router:external"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_segment"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_segment"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_segment"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_segment"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_segment"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_segment"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_segment"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_segment"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network_device"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network_device"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:device_owner"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:device_owner"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:mac_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:mac_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:fixed_ips:ip_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:fixed_ips:ip_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:fixed_ips:subnet_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:fixed_ips:subnet_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:port_security_enabled"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:port_security_enabled"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:binding:host_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:binding:host_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:binding:profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:binding:profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:mac_learning_enabled"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:mac_learning_enabled"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_port:allowed_address_pairs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_port:allowed_address_pairs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_port"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_port"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_port:queue_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_port:queue_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_port:binding:vif_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_port:binding:vif_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_port:binding:vif_details"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_port:binding:vif_details"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_port:binding:host_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_port:binding:host_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_port:binding:profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_port:binding:profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:device_owner"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:device_owner"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:mac_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:mac_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:fixed_ips:ip_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:fixed_ips:ip_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:fixed_ips:subnet_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:fixed_ips:subnet_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:port_security_enabled"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:port_security_enabled"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:binding:host_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:binding:host_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:binding:profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:binding:profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:mac_learning_enabled"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:mac_learning_enabled"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:allowed_address_pairs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:allowed_address_pairs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_port:data_plane_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_port:data_plane_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_port"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_port"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_router:ha"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_router:ha"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_router"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_router"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_router:external_gateway_info:enable_snat"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_router:external_gateway_info:enable_snat"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_router:distributed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_router:distributed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_router:ha"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_router:ha"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_router"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_router"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_router:distributed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_router:distributed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router:external_gateway_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router:external_gateway_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router:external_gateway_info:network_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router:external_gateway_info:network_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router:external_gateway_info:enable_snat"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router:external_gateway_info:enable_snat"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router:distributed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router:distributed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router:ha"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router:ha"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_router"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_router"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_router_interface"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_router_interface"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "remove_router_interface"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "remove_router_interface"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_router:external_gateway_info:external_fixed_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_router:external_gateway_info:external_fixed_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_router:external_gateway_info:external_fixed_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_router:external_gateway_info:external_fixed_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_qos_queue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_qos_queue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_qos_queue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_qos_queue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_agent"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_agent"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_agent"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_agent"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_agent"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_agent"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_dhcp-network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_dhcp-network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_dhcp-network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_dhcp-network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_dhcp-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_dhcp-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_l3-router"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_l3-router"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_l3-router"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_l3-router"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_l3-routers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_l3-routers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_dhcp-agents"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_dhcp-agents"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_l3-agents"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_l3-agents"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_loadbalancer-agent"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_loadbalancer-agent"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_loadbalancer-pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_loadbalancer-pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_agent-loadbalancers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_agent-loadbalancers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_loadbalancer-hosting-agent"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_loadbalancer-hosting-agent"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_floatingip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_floatingip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_floatingip:floating_ip_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_floatingip:floating_ip_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_floatingip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_floatingip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_floatingip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_floatingip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_floatingip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_floatingip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_network_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_network_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_network_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_network_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_network_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_network_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network_profiles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network_profiles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_network_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_network_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_policy_profiles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_policy_profiles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_policy_profiles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_policy_profiles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_policy_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_policy_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_metering_label"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_metering_label"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_metering_label"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_metering_label"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metering_label"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metering_label"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_metering_label_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_metering_label_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_metering_label_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_metering_label_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metering_label_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metering_label_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_lsn"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_lsn"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_lsn"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_lsn"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_flavor"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_flavor"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_flavor"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_flavor"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_flavor"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_flavor"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_flavors"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_flavors"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_flavor"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_flavor"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_service_profiles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_service_profiles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_policy_bandwidth_limit_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_policy_bandwidth_limit_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_policy_bandwidth_limit_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_policy_bandwidth_limit_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_policy_dscp_marking_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_policy_dscp_marking_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_policy_dscp_marking_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_policy_dscp_marking_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_rule_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_rule_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_policy_minimum_bandwidth_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_policy_minimum_bandwidth_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_policy_minimum_bandwidth_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_policy_minimum_bandwidth_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "restrict_wildcard"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "restrict_wildcard"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_rbac_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_rbac_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_rbac_policy:target_tenant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_rbac_policy:target_tenant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_rbac_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_rbac_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_rbac_policy:target_tenant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_rbac_policy:target_tenant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_rbac_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_rbac_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_rbac_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_rbac_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_flavor_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_flavor_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_flavor_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_flavor_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_flavor_service_profile"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_flavor_service_profile"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_auto_allocated_topology"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_auto_allocated_topology"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_trunk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_trunk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_trunk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_trunk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_trunk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_trunk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_subports"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_subports"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_subports"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_subports"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "remove_subports"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "remove_subports"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_security_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_security_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_security_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_security_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_security_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_security_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_security_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_security_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_security_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_security_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_security_group_rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_security_group_rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_security_group_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_security_group_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_security_group_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_security_group_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_security_group_rule"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_security_group_rule"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_loggable_resources"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_loggable_resources"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "create_log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "create_log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "update_log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "update_log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_logs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_logs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "cells_scheduler_filter:TargetCellFilter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create:attach_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create:attach_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create:attach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create:attach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create:forced_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create:forced_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all_instance_system_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all_instance_system_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:update_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:update_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:delete_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:delete_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_instance_faults"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_instance_faults"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_instance_diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_instance_diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:start"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:start"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:stop"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:stop"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unlock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unlock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unlock_override"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unlock_override"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_vnc_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_vnc_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_spice_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_spice_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_rdp_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_rdp_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_serial_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_serial_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_mks_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_mks_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_console_output"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_console_output"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:reset_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:reset_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:inject_network_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:inject_network_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:add_fixed_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:add_fixed_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:remove_fixed_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:remove_fixed_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:attach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:attach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:detach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:detach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:swap_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:swap_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:attach_interface"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:attach_interface"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:detach_interface"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:detach_interface"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:set_admin_password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:set_admin_password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:rescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:rescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unrescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unrescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:suspend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:suspend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:resume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:resume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:pause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:pause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unpause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unpause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:shelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:shelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:shelve_offload"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:shelve_offload"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unshelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unshelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:snapshot_volume_backed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:snapshot_volume_backed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:backup"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:backup"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:confirm_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:confirm_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:revert_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:revert_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:rebuild"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:rebuild"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:reboot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:reboot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:soft_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:soft_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:security_groups:add_to_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:security_groups:add_to_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:security_groups:remove_from_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:security_groups:remove_from_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:restore"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:restore"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:volume_snapshot_create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:volume_snapshot_create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:volume_snapshot_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:volume_snapshot_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:accounts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:accounts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:pause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:pause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:unpause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:unpause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:suspend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:suspend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:resume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:resume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:unlock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:unlock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:resetNetwork"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:resetNetwork"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:injectNetworkInfo"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:createBackup"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:createBackup"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:migrateLive"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:migrateLive"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:resetState"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:resetState"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:migrate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:migrate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:aggregates"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:aggregates"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:agents"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:agents"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:attach_interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:attach_interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:baremetal_nodes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:baremetal_nodes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:sync_instances"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:sync_instances"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:certificates"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:certificates"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cloudpipe"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cloudpipe"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cloudpipe_update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cloudpipe_update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:config_drive"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:config_drive"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:console_output"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:console_output"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:consoles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:consoles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:createserverext"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:createserverext"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:deferred_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:deferred_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:disk_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:disk_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:evacuate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:evacuate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_server_attributes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_server_attributes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_availability_zone"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_availability_zone"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_ips_mac"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_ips_mac"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_vif_net"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_vif_net"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:fixed_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:fixed_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_access:addTenantAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_access:removeTenantAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_disabled"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_disabled"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_rxtx"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_rxtx"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_swap"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_swap"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextradata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextradata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavormanage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavormanage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ip_dns"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ip_dns"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ip_pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ip_pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ips_bulk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ips_bulk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:fping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:fping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:fping:all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:fping:all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:hide_server_addresses"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:hide_server_addresses"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:hosts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:hosts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:hypervisors"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:hypervisors"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:image_size"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:image_size"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:instance_actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:instance_actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:instance_actions:events"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:instance_actions:events"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:instance_usage_audit_log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:instance_usage_audit_log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:multinic"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:multinic"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:networks:view"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:networks:view"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:networks_associate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:networks_associate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-tenant-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-tenant-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quotas:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quotas:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quotas:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quotas:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quotas:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quotas:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quota_classes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quota_classes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:rescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:rescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:security_group_default_rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:security_group_default_rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:security_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:security_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_usage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_usage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:services"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:services"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:shelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:shelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:shelveOffload"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:shelveOffload"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:simple_tenant_usage:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:simple_tenant_usage:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:simple_tenant_usage:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:simple_tenant_usage:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:unshelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:unshelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:users"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:users"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:virtual_interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:virtual_interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:virtual_storage_arrays"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:virtual_storage_arrays"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volumetypes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volumetypes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:availability_zone:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:availability_zone:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:availability_zone:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:availability_zone:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:used_limits_for_admin"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:used_limits_for_admin"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:migrations:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:migrations:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-assisted-volume-snapshots:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:console_auth_tokens"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:console_auth_tokens"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-server-external-events:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-server-external-events:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:associate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:associate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:disassociate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:disassociate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_vifs_by_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_vifs_by_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:allocate_for_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:allocate_for_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:deallocate_for_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:deallocate_for_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:validate_networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:validate_networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_instance_uuids_by_ip_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_instance_uuids_by_ip_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_instance_id_by_floating_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_instance_id_by_floating_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:setup_networks_on_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:setup_networks_on_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_backdoor_port"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_backdoor_port"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ip_pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ip_pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ip_by_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ip_by_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ips_by_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ips_by_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ips_by_fixed_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ips_by_fixed_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:allocate_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:allocate_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:associate_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:associate_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:disassociate_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:disassociate_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:release_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:release_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:migrate_instance_start"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:migrate_instance_start"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:migrate_instance_finish"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:migrate_instance_finish"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_fixed_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_fixed_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_fixed_ip_by_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_fixed_ip_by_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:add_fixed_ip_to_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:add_fixed_ip_to_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:remove_fixed_ip_from_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:remove_fixed_ip_from_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:add_network_to_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:add_network_to_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_instance_nw_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_instance_nw_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_dns_domains"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_dns_domains"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:add_dns_entry"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:add_dns_entry"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:modify_dns_entry"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:modify_dns_entry"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:delete_dns_entry"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:delete_dns_entry"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_dns_entries_by_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_dns_entries_by_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_dns_entries_by_name"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_dns_entries_by_name"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:create_private_dns_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:create_private_dns_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:create_public_dns_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:create_public_dns_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:delete_dns_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:delete_dns_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:attach_external_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:attach_external_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_vif_by_mac_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_vif_by_mac_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:detail:get_all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:index:get_all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:confirm_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:confirm_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create:attach_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create:attach_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create:attach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create:attach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create:forced_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create:forced_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:reboot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:reboot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:rebuild"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:rebuild"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:revert_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:revert_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:start"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:start"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:stop"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:stop"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-access-ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-access-ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-access-ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-access-ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:reset_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:inject_network_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:reset_state"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-password:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-password:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:add_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:add_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:remove_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:remove_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:set_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-agents"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-agents"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-agents:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-agents:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-attach-interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-attach-interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-attach-interfaces:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-baremetal-nodes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:sync_instances"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:sync_instances"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-certificates:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-certificates:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-certificates:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-certificates:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-certificates:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-certificates:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cloudpipe"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cloudpipe"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cloudpipe:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-config-drive"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-config-drive"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-console-output:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-console-output:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-console-output"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-console-output"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-remote-consoles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-remote-consoles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-remote-consoles:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-create-backup:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-create-backup:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-create-backup"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-create-backup"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-deferred-delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-deferred-delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-deferred-delete:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-disk-config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-disk-config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-disk-config:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-disk-config:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-evacuate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-evacuate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-evacuate:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-evacuate:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-server-attributes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-status:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-status:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-availability-zone"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:extensions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:extensions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:extension_info:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:extension_info:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-volumes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fixed-ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fixed-ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fixed-ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-rxtx"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:flavors:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:flavors:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-manage:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips-bulk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fping:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fping:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fping:all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fping:all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hide-server-addresses"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hosts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hosts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hosts:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hosts:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hypervisors"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hypervisors"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hypervisors:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:images:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:images:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:image-size"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:image-size"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:image-size:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:image-size:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-actions:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-actions:events"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-actions:events"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-usage-audit-log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:ips:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:ips:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:ips:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:ips:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:limits:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:limits:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:unlock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrate-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrate-server:migrate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrate-server:migrate_live"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-multinic"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-multinic"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-multinic:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-multinic:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks:view"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks:view"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks-associate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks-associate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks-associate:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pause-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pause-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pause-server:pause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pause-server:pause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pause-server:unpause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pause-server:unpause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:pci_servers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:pci_servers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-personality:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-personality:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:defaults"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:defaults"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-class-sets:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-class-sets:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-class-sets:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-rescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-rescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-rescue:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-rescue:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-scheduler-hints:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-group-default-rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-groups:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-groups:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-diagnostics:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-password:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-password:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-usage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-usage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-usage:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-usage:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-groups:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-groups:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-services"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-services"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-services:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-services:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:update_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:update_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:shelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:shelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:shelve:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:shelve_offload"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-simple-tenant-usage:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-simple-tenant-usage:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-suspend-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-suspend-server:suspend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-suspend-server:suspend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-suspend-server:resume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-suspend-server:resume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-tenant-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-tenant-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-tenant-networks:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:unshelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:unshelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-user-data:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-user-data:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-virtual-interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-availability-zone:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-availability-zone:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-availability-zone:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-availability-zone:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-availability-zone:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-used-limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-used-limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-used-limits:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-used-limits:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrations:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrations:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrations:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrations:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-console-auth-tokens"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-console-auth-tokens"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-external-events:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-external-events:create"
+ }
+ ]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [
+ {
+ "name": "role"
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id"
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id"
+ }
+ ]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_volume_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete_volume_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_volume_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_volume_admin_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_volume_admin_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_all_snapshots"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:extend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_readonly_flag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:retype"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:types_manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:types_extra_specs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:access_types_qos_specs_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:access_types_extra_specs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_encryption"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_encryption_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:extended_snapshot_attributes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_image_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quotas:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quotas:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quotas:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quota_classes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_host_attribute"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_tenant_attribute"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_mig_status_attribute"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:hosts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:services:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:services:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_unmanage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:capabilities"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create_transfer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:accept_transfer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete_transfer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_all_transfers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:replication:promote"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:replication:reenable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:enable_replication"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:disable_replication"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:failover_replication"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:list_replication_targets"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:restore"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:backup-import"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:backup-export"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "snapshot_extension:snapshot_manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "snapshot_extension:snapshot_unmanage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:create_cgsnapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:delete_cgsnapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get_cgsnapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get_all_cgsnapshots"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_images"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "publicize_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "communitize_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "copy_from"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "download_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "upload_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_image_location"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_image_location"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "set_image_location"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_members"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "manage_image_cache"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_task"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_tasks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_task"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_task"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "tasks_api_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "deactivate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "reactivate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_namespace"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_namespaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_namespace"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_namespace"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_object"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_objects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_object"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_object"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "list_metadef_resource_types"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_resource_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_resource_type_association"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_property"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_properties"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_property"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_property"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_regions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_services"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_registered_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_registered_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_registered_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_registered_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_registered_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_domains"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_target_project_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_project_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_user_projects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_project_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_project_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_project_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_project_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_project_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_project_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_target_user_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_user_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_users"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_target_group_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_group_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_groups_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_users_in_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:remove_user_from_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_user_in_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:add_user_to_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_credentials"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_get_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_list_credentials"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_create_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_delete_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_matches_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_prior_role_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_implied_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_role_inference_rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_system_grants_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_system_grant_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_system_grant_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_system_grant_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_system_grants_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_system_grant_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_system_grant_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_system_grant_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_grant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_grant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_grant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_global_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_grant_match"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_global_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_list_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_list_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_on_domain_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_on_project_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_on_domain_of_project_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_role_assignments"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_role_assignments_for_tree"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_policies"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:validate_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:validate_token_head"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revocation_list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_trusts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_roles_for_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_role_for_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_consumers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:authorize_request_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_access_token_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_access_token_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_access_tokens"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_access_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_access_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:add_endpoint_to_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_endpoint_in_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints_for_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:remove_endpoint_from_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoint_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_endpoint_group_in_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoint_groups_for_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:add_endpoint_group_to_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:remove_endpoint_group_from_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_identity_providers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_protocols"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_mappings"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_service_providers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_catalog"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_projects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_domains"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_system"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_domains_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_revoke_events"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy_association_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_policy_association_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy_association_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy_association_for_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_policy_association_for_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy_association_for_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_policy_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints_for_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_security_compliance_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain_config_default"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_application_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_application_credentials"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_application_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_application_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_subnet"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_subnet:segment_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_subnet:service_types"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_subnet"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_subnet:segment_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_subnet"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_subnet:service_types"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_subnet"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_subnetpool"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_subnetpool:shared"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_subnetpool:is_default"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_subnetpool"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_subnetpool"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_subnetpool:is_default"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_subnetpool"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_address_scope"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_address_scope:shared"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_address_scope"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_address_scope"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_address_scope:shared"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_address_scope"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network:router:external"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network:segments"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network:provider:network_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network:provider:physical_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network:provider:segmentation_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network:queue_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network_ip_availabilities"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network_ip_availability"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:shared"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:router:external"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:is_default"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:segments"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:provider:network_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:provider:physical_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network:provider:segmentation_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network:segments"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network:shared"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network:provider:network_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network:provider:physical_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network:provider:segmentation_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network:router:external"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_segment"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_segment"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_segment"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_segment"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network_device"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:device_owner"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:mac_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:fixed_ips:ip_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:fixed_ips:subnet_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:port_security_enabled"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:binding:host_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:binding:profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:mac_learning_enabled"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_port:allowed_address_pairs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_port"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_port:queue_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_port:binding:vif_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_port:binding:vif_details"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_port:binding:host_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_port:binding:profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:device_owner"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:mac_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:fixed_ips:ip_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:fixed_ips:subnet_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:port_security_enabled"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:binding:host_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:binding:profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:mac_learning_enabled"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:allowed_address_pairs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_port:data_plane_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_port"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_router:ha"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_router"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_router:external_gateway_info:enable_snat"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_router:distributed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_router:ha"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_router"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_router:distributed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router:external_gateway_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router:external_gateway_info:network_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router:external_gateway_info:enable_snat"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router:distributed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router:ha"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_router"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_router_interface"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "remove_router_interface"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_router:external_gateway_info:external_fixed_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_router:external_gateway_info:external_fixed_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_qos_queue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_qos_queue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_agent"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_agent"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_agent"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_dhcp-network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_dhcp-network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_dhcp-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_l3-router"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_l3-router"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_l3-routers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_dhcp-agents"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_l3-agents"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_loadbalancer-agent"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_loadbalancer-pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_agent-loadbalancers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_loadbalancer-hosting-agent"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_floatingip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_floatingip:floating_ip_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_floatingip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_floatingip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_floatingip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_network_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_network_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_network_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network_profiles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_network_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_policy_profiles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_policy_profiles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_policy_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_metering_label"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_metering_label"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metering_label"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_metering_label_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_metering_label_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metering_label_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_lsn"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_lsn"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_flavor"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_flavor"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_flavor"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_flavors"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_flavor"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_service_profiles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_policy_bandwidth_limit_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_policy_dscp_marking_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_rule_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_policy_minimum_bandwidth_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "restrict_wildcard"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_rbac_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_rbac_policy:target_tenant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_rbac_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_rbac_policy:target_tenant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_rbac_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_rbac_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_flavor_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_flavor_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_flavor_service_profile"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_auto_allocated_topology"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_trunk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_trunk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_trunk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_subports"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_subports"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "remove_subports"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_security_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_security_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_security_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_security_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_security_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_security_group_rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_security_group_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_security_group_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_security_group_rule"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_loggable_resources"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "create_log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "update_log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_logs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create:attach_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create:attach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create:forced_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all_instance_system_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:update_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:delete_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_instance_faults"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_instance_diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:start"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:stop"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unlock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unlock_override"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_vnc_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_spice_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_rdp_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_serial_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_mks_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_console_output"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:reset_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:inject_network_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:add_fixed_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:remove_fixed_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:attach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:detach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:swap_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:attach_interface"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:detach_interface"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:set_admin_password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:rescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unrescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:suspend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:resume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:pause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unpause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:shelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:shelve_offload"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unshelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:snapshot_volume_backed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:backup"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:confirm_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:revert_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:rebuild"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:reboot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:soft_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:security_groups:add_to_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:security_groups:remove_from_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:restore"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:volume_snapshot_create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:volume_snapshot_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:accounts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:pause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:unpause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:suspend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:resume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:unlock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:resetNetwork"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:createBackup"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:migrateLive"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:resetState"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:migrate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:aggregates"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:agents"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:attach_interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:baremetal_nodes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:sync_instances"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:certificates"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cloudpipe"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cloudpipe_update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:config_drive"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:console_output"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:consoles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:createserverext"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:deferred_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:disk_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:evacuate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_server_attributes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_availability_zone"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_ips_mac"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_vif_net"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:fixed_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_disabled"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_rxtx"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_swap"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextradata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavormanage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ip_dns"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ip_pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ips_bulk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:fping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:fping:all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:hide_server_addresses"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:hosts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:hypervisors"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:image_size"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:instance_actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:instance_actions:events"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:instance_usage_audit_log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:multinic"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:networks:view"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:networks_associate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-tenant-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quotas:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quotas:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quotas:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quota_classes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:rescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:security_group_default_rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:security_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_usage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:services"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:shelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:shelveOffload"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:simple_tenant_usage:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:simple_tenant_usage:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:unshelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:users"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:virtual_interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:virtual_storage_arrays"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volumetypes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:availability_zone:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:availability_zone:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:used_limits_for_admin"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:migrations:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:console_auth_tokens"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-server-external-events:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:associate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:disassociate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_vifs_by_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:allocate_for_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:deallocate_for_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:validate_networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_instance_uuids_by_ip_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_instance_id_by_floating_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:setup_networks_on_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_backdoor_port"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ip_pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ip_by_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ips_by_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ips_by_fixed_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:allocate_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:associate_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:disassociate_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:release_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:migrate_instance_start"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:migrate_instance_finish"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_fixed_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_fixed_ip_by_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:add_fixed_ip_to_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:remove_fixed_ip_from_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:add_network_to_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_instance_nw_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_dns_domains"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:add_dns_entry"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:modify_dns_entry"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:delete_dns_entry"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_dns_entries_by_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_dns_entries_by_name"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:create_private_dns_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:create_public_dns_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:delete_dns_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:attach_external_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_vif_by_mac_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:confirm_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create:attach_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create:attach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create:forced_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:reboot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:rebuild"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:revert_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:start"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:stop"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-access-ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-access-ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-password:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:add_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:remove_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-agents"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-agents:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-attach-interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:sync_instances"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-certificates:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-certificates:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-certificates:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cloudpipe"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-config-drive"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-console-output:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-console-output"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-remote-consoles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-create-backup:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-create-backup"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-deferred-delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-disk-config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-disk-config:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-evacuate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-evacuate:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-status:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:extensions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:extension_info:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fixed-ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:flavors:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fping:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fping:all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hosts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hosts:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hypervisors"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:images:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:image-size"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:image-size:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-actions:events"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:ips:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:ips:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:limits:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-multinic"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-multinic:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks:view"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks-associate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pause-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pause-server:pause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pause-server:unpause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:pci_servers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-personality:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:defaults"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-rescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-rescue:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-groups:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-password:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-usage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-usage:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-groups:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-services"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-services:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:update_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:shelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-suspend-server:suspend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-suspend-server:resume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-tenant-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:unshelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-user-data:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-availability-zone:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-availability-zone:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-used-limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-used-limits:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrations:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrations:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-console-auth-tokens"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-external-events:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/opst_rbac_cinder.json b/moon_engine/tests/func_policies/opst_rbac_cinder.json
new file mode 100644
index 00000000..f0cba96b
--- /dev/null
+++ b/moon_engine/tests/func_policies/opst_rbac_cinder.json
@@ -0,0 +1,5078 @@
+{
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy",
+ "genre": "authz",
+ "description": "A RBAC policy similar of what you can find through policy.json files",
+ "model": {
+ "name": "OPST_RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "OPST_RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "a role in OpenStack"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "the admin role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "member",
+ "description": "the member role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {
+ "name": "admin"
+ },
+ "category": {
+ "name": "role"
+ },
+ "assignments": [
+ {
+ "name": "admin"
+ },
+ {
+ "name": "member"
+ }
+ ]
+ }
+ ],
+ "objects": [
+ {
+ "name": "all_vm",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "the UID of each virtual machine"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm",
+ "description": "represents all virtual machines in this project",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {
+ "name": "all_vm"
+ },
+ "category": {
+ "name": "id"
+ },
+ "assignments": [
+ {
+ "name": "all_vm"
+ }
+ ]
+ }
+ ],
+ "actions": [
+ {
+ "name": "volume:create",
+ "description": "volume:create action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete",
+ "description": "volume:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get",
+ "description": "volume:get action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_all",
+ "description": "volume:get_all action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_volume_metadata",
+ "description": "volume:get_volume_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete_volume_metadata",
+ "description": "volume:delete_volume_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_volume_metadata",
+ "description": "volume:update_volume_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_volume_admin_metadata",
+ "description": "volume:get_volume_admin_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_volume_admin_metadata",
+ "description": "volume:update_volume_admin_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_snapshot",
+ "description": "volume:get_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_all_snapshots",
+ "description": "volume:get_all_snapshots action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:create_snapshot",
+ "description": "volume:create_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete_snapshot",
+ "description": "volume:delete_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_snapshot",
+ "description": "volume:update_snapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:extend",
+ "description": "volume:extend action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update_readonly_flag",
+ "description": "volume:update_readonly_flag action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:retype",
+ "description": "volume:retype action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:update",
+ "description": "volume:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:types_manage",
+ "description": "volume_extension:types_manage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:types_extra_specs",
+ "description": "volume_extension:types_extra_specs action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:access_types_qos_specs_id",
+ "description": "volume_extension:access_types_qos_specs_id action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:access_types_extra_specs",
+ "description": "volume_extension:access_types_extra_specs action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_access",
+ "description": "volume_extension:volume_type_access action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess",
+ "description": "volume_extension:volume_type_access:addProjectAccess action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess",
+ "description": "volume_extension:volume_type_access:removeProjectAccess action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_type_encryption",
+ "description": "volume_extension:volume_type_encryption action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_encryption_metadata",
+ "description": "volume_extension:volume_encryption_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:extended_snapshot_attributes",
+ "description": "volume_extension:extended_snapshot_attributes action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_image_metadata",
+ "description": "volume_extension:volume_image_metadata action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quotas:show",
+ "description": "volume_extension:quotas:show action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quotas:update",
+ "description": "volume_extension:quotas:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quotas:delete",
+ "description": "volume_extension:quotas:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quota_classes",
+ "description": "volume_extension:quota_classes action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use",
+ "description": "volume_extension:quota_classes:validate_setup_for_nested_quota_use action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status",
+ "description": "volume_extension:volume_admin_actions:reset_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status",
+ "description": "volume_extension:snapshot_admin_actions:reset_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status",
+ "description": "volume_extension:backup_admin_actions:reset_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete",
+ "description": "volume_extension:volume_admin_actions:force_delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach",
+ "description": "volume_extension:volume_admin_actions:force_detach action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete",
+ "description": "volume_extension:snapshot_admin_actions:force_delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete",
+ "description": "volume_extension:backup_admin_actions:force_delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume",
+ "description": "volume_extension:volume_admin_actions:migrate_volume action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion",
+ "description": "volume_extension:volume_admin_actions:migrate_volume_completion action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_host_attribute",
+ "description": "volume_extension:volume_host_attribute action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_tenant_attribute",
+ "description": "volume_extension:volume_tenant_attribute action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_mig_status_attribute",
+ "description": "volume_extension:volume_mig_status_attribute action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:hosts",
+ "description": "volume_extension:hosts action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:services:index",
+ "description": "volume_extension:services:index action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:services:update",
+ "description": "volume_extension:services:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_manage",
+ "description": "volume_extension:volume_manage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:volume_unmanage",
+ "description": "volume_extension:volume_unmanage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:capabilities",
+ "description": "volume_extension:capabilities action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:create_transfer",
+ "description": "volume:create_transfer action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:accept_transfer",
+ "description": "volume:accept_transfer action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:delete_transfer",
+ "description": "volume:delete_transfer action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:get_all_transfers",
+ "description": "volume:get_all_transfers action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:replication:promote",
+ "description": "volume_extension:replication:promote action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume_extension:replication:reenable",
+ "description": "volume_extension:replication:reenable action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:enable_replication",
+ "description": "volume:enable_replication action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:disable_replication",
+ "description": "volume:disable_replication action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:failover_replication",
+ "description": "volume:failover_replication action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "volume:list_replication_targets",
+ "description": "volume:list_replication_targets action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:create",
+ "description": "backup:create action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:delete",
+ "description": "backup:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:get",
+ "description": "backup:get action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:get_all",
+ "description": "backup:get_all action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:restore",
+ "description": "backup:restore action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:backup-import",
+ "description": "backup:backup-import action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "backup:backup-export",
+ "description": "backup:backup-export action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status",
+ "description": "snapshot_extension:snapshot_actions:update_snapshot_status action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "snapshot_extension:snapshot_manage",
+ "description": "snapshot_extension:snapshot_manage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "snapshot_extension:snapshot_unmanage",
+ "description": "snapshot_extension:snapshot_unmanage action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:create",
+ "description": "consistencygroup:create action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:delete",
+ "description": "consistencygroup:delete action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:update",
+ "description": "consistencygroup:update action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get",
+ "description": "consistencygroup:get action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get_all",
+ "description": "consistencygroup:get_all action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:create_cgsnapshot",
+ "description": "consistencygroup:create_cgsnapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:delete_cgsnapshot",
+ "description": "consistencygroup:delete_cgsnapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get_cgsnapshot",
+ "description": "consistencygroup:get_cgsnapshot action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "consistencygroup:get_all_cgsnapshots",
+ "description": "consistencygroup:get_all_cgsnapshots action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ },
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools",
+ "description": "scheduler_extension:scheduler_stats:get_pools action for cinder",
+ "extra": {
+ "component": "cinder"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create",
+ "description": "volume:create action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete",
+ "description": "volume:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get",
+ "description": "volume:get action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_all",
+ "description": "volume:get_all action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_volume_metadata",
+ "description": "volume:get_volume_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete_volume_metadata",
+ "description": "volume:delete_volume_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_volume_metadata",
+ "description": "volume:update_volume_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_volume_admin_metadata",
+ "description": "volume:get_volume_admin_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_volume_admin_metadata",
+ "description": "volume:update_volume_admin_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_snapshot",
+ "description": "volume:get_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_all_snapshots",
+ "description": "volume:get_all_snapshots action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:create_snapshot",
+ "description": "volume:create_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete_snapshot",
+ "description": "volume:delete_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_snapshot",
+ "description": "volume:update_snapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:extend",
+ "description": "volume:extend action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update_readonly_flag",
+ "description": "volume:update_readonly_flag action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:retype",
+ "description": "volume:retype action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:update",
+ "description": "volume:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:types_manage",
+ "description": "volume_extension:types_manage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:types_extra_specs",
+ "description": "volume_extension:types_extra_specs action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:access_types_qos_specs_id",
+ "description": "volume_extension:access_types_qos_specs_id action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:access_types_extra_specs",
+ "description": "volume_extension:access_types_extra_specs action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_access",
+ "description": "volume_extension:volume_type_access action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess",
+ "description": "volume_extension:volume_type_access:addProjectAccess action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess",
+ "description": "volume_extension:volume_type_access:removeProjectAccess action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_type_encryption",
+ "description": "volume_extension:volume_type_encryption action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_encryption_metadata",
+ "description": "volume_extension:volume_encryption_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:extended_snapshot_attributes",
+ "description": "volume_extension:extended_snapshot_attributes action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_image_metadata",
+ "description": "volume_extension:volume_image_metadata action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quotas:show",
+ "description": "volume_extension:quotas:show action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quotas:update",
+ "description": "volume_extension:quotas:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quotas:delete",
+ "description": "volume_extension:quotas:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quota_classes",
+ "description": "volume_extension:quota_classes action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use",
+ "description": "volume_extension:quota_classes:validate_setup_for_nested_quota_use action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status",
+ "description": "volume_extension:volume_admin_actions:reset_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status",
+ "description": "volume_extension:snapshot_admin_actions:reset_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status",
+ "description": "volume_extension:backup_admin_actions:reset_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete",
+ "description": "volume_extension:volume_admin_actions:force_delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach",
+ "description": "volume_extension:volume_admin_actions:force_detach action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete",
+ "description": "volume_extension:snapshot_admin_actions:force_delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete",
+ "description": "volume_extension:backup_admin_actions:force_delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume",
+ "description": "volume_extension:volume_admin_actions:migrate_volume action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion",
+ "description": "volume_extension:volume_admin_actions:migrate_volume_completion action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_host_attribute",
+ "description": "volume_extension:volume_host_attribute action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_tenant_attribute",
+ "description": "volume_extension:volume_tenant_attribute action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_mig_status_attribute",
+ "description": "volume_extension:volume_mig_status_attribute action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:hosts",
+ "description": "volume_extension:hosts action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:services:index",
+ "description": "volume_extension:services:index action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:services:update",
+ "description": "volume_extension:services:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_manage",
+ "description": "volume_extension:volume_manage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:volume_unmanage",
+ "description": "volume_extension:volume_unmanage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:capabilities",
+ "description": "volume_extension:capabilities action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:create_transfer",
+ "description": "volume:create_transfer action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:accept_transfer",
+ "description": "volume:accept_transfer action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:delete_transfer",
+ "description": "volume:delete_transfer action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:get_all_transfers",
+ "description": "volume:get_all_transfers action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:replication:promote",
+ "description": "volume_extension:replication:promote action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume_extension:replication:reenable",
+ "description": "volume_extension:replication:reenable action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:enable_replication",
+ "description": "volume:enable_replication action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:disable_replication",
+ "description": "volume:disable_replication action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:failover_replication",
+ "description": "volume:failover_replication action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "volume:list_replication_targets",
+ "description": "volume:list_replication_targets action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:create",
+ "description": "backup:create action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:delete",
+ "description": "backup:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:get",
+ "description": "backup:get action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:get_all",
+ "description": "backup:get_all action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:restore",
+ "description": "backup:restore action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:backup-import",
+ "description": "backup:backup-import action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "backup:backup-export",
+ "description": "backup:backup-export action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status",
+ "description": "snapshot_extension:snapshot_actions:update_snapshot_status action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "snapshot_extension:snapshot_manage",
+ "description": "snapshot_extension:snapshot_manage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "snapshot_extension:snapshot_unmanage",
+ "description": "snapshot_extension:snapshot_unmanage action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:create",
+ "description": "consistencygroup:create action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:delete",
+ "description": "consistencygroup:delete action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:update",
+ "description": "consistencygroup:update action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get",
+ "description": "consistencygroup:get action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get_all",
+ "description": "consistencygroup:get_all action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:create_cgsnapshot",
+ "description": "consistencygroup:create_cgsnapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:delete_cgsnapshot",
+ "description": "consistencygroup:delete_cgsnapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get_cgsnapshot",
+ "description": "consistencygroup:get_cgsnapshot action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "consistencygroup:get_all_cgsnapshots",
+ "description": "consistencygroup:get_all_cgsnapshots action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools",
+ "description": "scheduler_extension:scheduler_stats:get_pools action for cinder",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {
+ "name": "volume:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_volume_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_volume_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete_volume_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete_volume_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_volume_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_volume_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_volume_admin_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_volume_admin_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_volume_admin_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_volume_admin_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_all_snapshots"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_all_snapshots"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:create_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:create_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:extend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:extend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update_readonly_flag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update_readonly_flag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:retype"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:retype"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:types_manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:types_manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:types_extra_specs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:types_extra_specs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:access_types_qos_specs_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:access_types_qos_specs_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:access_types_extra_specs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:access_types_extra_specs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_access:addProjectAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_access:removeProjectAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_type_encryption"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_type_encryption"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_encryption_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_encryption_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:extended_snapshot_attributes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:extended_snapshot_attributes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_image_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_image_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quotas:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quotas:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quotas:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quotas:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quotas:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quotas:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quota_classes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quota_classes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:reset_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:snapshot_admin_actions:reset_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:backup_admin_actions:reset_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:force_detach"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:snapshot_admin_actions:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:backup_admin_actions:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:migrate_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_host_attribute"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_host_attribute"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_tenant_attribute"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_tenant_attribute"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_mig_status_attribute"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_mig_status_attribute"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:hosts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:hosts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:services:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:services:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:services:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:services:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:volume_unmanage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:volume_unmanage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:capabilities"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:capabilities"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:create_transfer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:create_transfer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:accept_transfer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:accept_transfer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:delete_transfer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:delete_transfer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:get_all_transfers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:get_all_transfers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:replication:promote"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:replication:promote"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume_extension:replication:reenable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume_extension:replication:reenable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:enable_replication"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:enable_replication"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:disable_replication"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:disable_replication"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:failover_replication"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:failover_replication"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "volume:list_replication_targets"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "volume:list_replication_targets"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:restore"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:restore"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:backup-import"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:backup-import"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "backup:backup-export"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "backup:backup-export"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "snapshot_extension:snapshot_manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "snapshot_extension:snapshot_manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "snapshot_extension:snapshot_unmanage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "snapshot_extension:snapshot_unmanage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:create_cgsnapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:create_cgsnapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:delete_cgsnapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:delete_cgsnapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get_cgsnapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get_cgsnapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "consistencygroup:get_all_cgsnapshots"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "consistencygroup:get_all_cgsnapshots"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "scheduler_extension:scheduler_stats:get_pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools"
+ }
+ ]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [
+ {
+ "name": "role"
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id"
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id"
+ }
+ ]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_volume_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete_volume_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_volume_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_volume_admin_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_volume_admin_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_all_snapshots"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:extend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update_readonly_flag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:retype"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:types_manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:types_extra_specs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:access_types_qos_specs_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:access_types_extra_specs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_access:addProjectAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_access:removeProjectAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_type_encryption"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_encryption_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:extended_snapshot_attributes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_image_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quotas:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quotas:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quotas:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quota_classes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:quota_classes:validate_setup_for_nested_quota_use"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:reset_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:reset_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:backup_admin_actions:reset_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:force_detach"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:snapshot_admin_actions:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:backup_admin_actions:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_admin_actions:migrate_volume_completion"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_host_attribute"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_tenant_attribute"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_mig_status_attribute"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:hosts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:services:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:services:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:volume_unmanage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:capabilities"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:create_transfer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:accept_transfer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:delete_transfer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:get_all_transfers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:replication:promote"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume_extension:replication:reenable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:enable_replication"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:disable_replication"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:failover_replication"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "volume:list_replication_targets"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:restore"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:backup-import"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "backup:backup-export"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "snapshot_extension:snapshot_actions:update_snapshot_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "snapshot_extension:snapshot_manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "snapshot_extension:snapshot_unmanage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:create_cgsnapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:delete_cgsnapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get_cgsnapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "consistencygroup:get_all_cgsnapshots"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "scheduler_extension:scheduler_stats:get_pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/opst_rbac_glance.json b/moon_engine/tests/func_policies/opst_rbac_glance.json
new file mode 100644
index 00000000..276d1e3b
--- /dev/null
+++ b/moon_engine/tests/func_policies/opst_rbac_glance.json
@@ -0,0 +1,2918 @@
+{
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy",
+ "genre": "authz",
+ "description": "A RBAC policy similar of what you can find through policy.json files",
+ "model": {
+ "name": "OPST_RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "OPST_RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "a role in OpenStack"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "the admin role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "member",
+ "description": "the member role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {
+ "name": "admin"
+ },
+ "category": {
+ "name": "role"
+ },
+ "assignments": [
+ {
+ "name": "admin"
+ },
+ {
+ "name": "member"
+ }
+ ]
+ }
+ ],
+ "objects": [
+ {
+ "name": "all",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "the UID of each virtual machine"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all",
+ "description": "represents all virtual machines in this project",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {
+ "name": "all"
+ },
+ "category": {
+ "name": "id"
+ },
+ "assignments": [
+ {
+ "name": "all"
+ }
+ ]
+ }
+ ],
+ "actions": [
+ {
+ "name": "add_image",
+ "description": "add_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_image",
+ "description": "delete_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_image",
+ "description": "get_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_image",
+ "description": "modify_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "publicize_image",
+ "description": "publicize_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "communitize_image",
+ "description": "communitize_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "copy_from",
+ "description": "copy_from action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "download_image",
+ "description": "download_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "upload_image",
+ "description": "upload_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_image_location",
+ "description": "delete_image_location action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_image_location",
+ "description": "get_image_location action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image_location",
+ "description": "set_image_location action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_member",
+ "description": "add_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "delete_member",
+ "description": "delete_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_member",
+ "description": "get_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_members",
+ "description": "get_members action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_member",
+ "description": "modify_member action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "manage_image_cache",
+ "description": "manage_image_cache action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_task",
+ "description": "get_task action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_tasks",
+ "description": "get_tasks action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_task",
+ "description": "add_task action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_task",
+ "description": "modify_task action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "tasks_api_access",
+ "description": "tasks_api_access action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "deactivate",
+ "description": "deactivate action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "reactivate",
+ "description": "reactivate action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_namespace",
+ "description": "get_metadef_namespace action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_namespaces",
+ "description": "get_metadef_namespaces action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_namespace",
+ "description": "modify_metadef_namespace action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_namespace",
+ "description": "add_metadef_namespace action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_object",
+ "description": "get_metadef_object action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_objects",
+ "description": "get_metadef_objects action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_object",
+ "description": "modify_metadef_object action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_object",
+ "description": "add_metadef_object action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "list_metadef_resource_types",
+ "description": "list_metadef_resource_types action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_resource_type",
+ "description": "get_metadef_resource_type action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_resource_type_association",
+ "description": "add_metadef_resource_type_association action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_property",
+ "description": "get_metadef_property action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_properties",
+ "description": "get_metadef_properties action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_property",
+ "description": "modify_metadef_property action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_property",
+ "description": "add_metadef_property action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_tag",
+ "description": "get_metadef_tag action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_metadef_tags",
+ "description": "get_metadef_tags action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "modify_metadef_tag",
+ "description": "modify_metadef_tag action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_tag",
+ "description": "add_metadef_tag action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "add_metadef_tags",
+ "description": "add_metadef_tags action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_image",
+ "description": "add_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_image",
+ "description": "delete_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_image",
+ "description": "get_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_image",
+ "description": "modify_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "publicize_image",
+ "description": "publicize_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "communitize_image",
+ "description": "communitize_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "copy_from",
+ "description": "copy_from action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "download_image",
+ "description": "download_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "upload_image",
+ "description": "upload_image action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_image_location",
+ "description": "delete_image_location action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_image_location",
+ "description": "get_image_location action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "set_image_location",
+ "description": "set_image_location action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_member",
+ "description": "add_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "delete_member",
+ "description": "delete_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_member",
+ "description": "get_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_members",
+ "description": "get_members action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_member",
+ "description": "modify_member action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "manage_image_cache",
+ "description": "manage_image_cache action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_task",
+ "description": "get_task action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_tasks",
+ "description": "get_tasks action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_task",
+ "description": "add_task action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_task",
+ "description": "modify_task action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "tasks_api_access",
+ "description": "tasks_api_access action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "deactivate",
+ "description": "deactivate action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "reactivate",
+ "description": "reactivate action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_namespace",
+ "description": "get_metadef_namespace action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_namespaces",
+ "description": "get_metadef_namespaces action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_namespace",
+ "description": "modify_metadef_namespace action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_namespace",
+ "description": "add_metadef_namespace action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_object",
+ "description": "get_metadef_object action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_objects",
+ "description": "get_metadef_objects action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_object",
+ "description": "modify_metadef_object action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_object",
+ "description": "add_metadef_object action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "list_metadef_resource_types",
+ "description": "list_metadef_resource_types action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_resource_type",
+ "description": "get_metadef_resource_type action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_resource_type_association",
+ "description": "add_metadef_resource_type_association action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_property",
+ "description": "get_metadef_property action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_properties",
+ "description": "get_metadef_properties action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_property",
+ "description": "modify_metadef_property action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_property",
+ "description": "add_metadef_property action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_tag",
+ "description": "get_metadef_tag action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_metadef_tags",
+ "description": "get_metadef_tags action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "modify_metadef_tag",
+ "description": "modify_metadef_tag action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_tag",
+ "description": "add_metadef_tag action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "add_metadef_tags",
+ "description": "add_metadef_tags action for glance",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {
+ "name": "add_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_images"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_images"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "publicize_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "publicize_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "communitize_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "communitize_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "copy_from"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "copy_from"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "download_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "download_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "upload_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "upload_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_image_location"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_image_location"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_image_location"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_image_location"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "set_image_location"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "set_image_location"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "delete_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "delete_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_members"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_members"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_member"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_member"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "manage_image_cache"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "manage_image_cache"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_task"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_task"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_tasks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_tasks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_task"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_task"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_task"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_task"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "tasks_api_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "tasks_api_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "deactivate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "deactivate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "reactivate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "reactivate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_namespace"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_namespace"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_namespaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_namespaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_namespace"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_namespace"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_namespace"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_namespace"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_object"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_object"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_objects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_objects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_object"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_object"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_object"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_object"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "list_metadef_resource_types"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "list_metadef_resource_types"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_resource_type"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_resource_type"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_resource_type_association"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_resource_type_association"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_property"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_property"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_properties"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_properties"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_property"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_property"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_property"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_property"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_metadef_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_metadef_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "modify_metadef_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "modify_metadef_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "add_metadef_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "add_metadef_tags"
+ }
+ ]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [
+ {
+ "name": "role"
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id"
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id"
+ }
+ ]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_images"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "publicize_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "communitize_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "copy_from"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "download_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "upload_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_image_location"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_image_location"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "set_image_location"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "delete_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_members"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_member"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "manage_image_cache"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_task"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_tasks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_task"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_task"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "tasks_api_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "deactivate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "reactivate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_namespace"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_namespaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_namespace"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_namespace"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_object"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_objects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_object"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_object"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "list_metadef_resource_types"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_resource_type"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_resource_type_association"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_property"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_properties"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_property"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_property"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_metadef_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "modify_metadef_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "add_metadef_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/opst_rbac_keystone.json b/moon_engine/tests/func_policies/opst_rbac_keystone.json
new file mode 100644
index 00000000..6ccf975f
--- /dev/null
+++ b/moon_engine/tests/func_policies/opst_rbac_keystone.json
@@ -0,0 +1,12998 @@
+{
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy",
+ "genre": "authz",
+ "description": "A RBAC policy similar of what you can find through policy.json files",
+ "model": {
+ "name": "OPST_RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "OPST_RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "a role in OpenStack"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "the admin role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "member",
+ "description": "the member role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {
+ "name": "admin"
+ },
+ "category": {
+ "name": "role"
+ },
+ "assignments": [
+ {
+ "name": "admin"
+ },
+ {
+ "name": "member"
+ }
+ ]
+ }
+ ],
+ "objects": [
+ {
+ "name": "all_vm",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "the UID of each virtual machine"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm",
+ "description": "represents all virtual machines in this project",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {
+ "name": "all_vm"
+ },
+ "category": {
+ "name": "id"
+ },
+ "assignments": [
+ {
+ "name": "all_vm"
+ }
+ ]
+ }
+ ],
+ "actions": [
+ {
+ "name": "identity:get_region",
+ "description": "identity:get_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_regions",
+ "description": "identity:list_regions action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_region",
+ "description": "identity:create_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_region",
+ "description": "identity:update_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_region",
+ "description": "identity:delete_region action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_service",
+ "description": "identity:get_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_services",
+ "description": "identity:list_services action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_service",
+ "description": "identity:create_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_service",
+ "description": "identity:update_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_service",
+ "description": "identity:delete_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_endpoint",
+ "description": "identity:get_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints",
+ "description": "identity:list_endpoints action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_endpoint",
+ "description": "identity:create_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_endpoint",
+ "description": "identity:update_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_endpoint",
+ "description": "identity:delete_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_registered_limit",
+ "description": "identity:get_registered_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_registered_limits",
+ "description": "identity:list_registered_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_registered_limits",
+ "description": "identity:create_registered_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_registered_limits",
+ "description": "identity:update_registered_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_registered_limit",
+ "description": "identity:delete_registered_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_limit",
+ "description": "identity:get_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_limits",
+ "description": "identity:list_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_limits",
+ "description": "identity:create_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_limits",
+ "description": "identity:update_limits action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_limit",
+ "description": "identity:delete_limit action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain",
+ "description": "identity:get_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_domains",
+ "description": "identity:list_domains action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_domain",
+ "description": "identity:create_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_domain",
+ "description": "identity:update_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_domain",
+ "description": "identity:delete_domain action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_target_project_domain_id",
+ "description": "admin_and_matching_target_project_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_project_domain_id",
+ "description": "admin_and_matching_project_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_project",
+ "description": "identity:get_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects",
+ "description": "identity:list_projects action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_user_projects",
+ "description": "identity:list_user_projects action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_project",
+ "description": "identity:create_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_project",
+ "description": "identity:update_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_project",
+ "description": "identity:delete_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_project_tag",
+ "description": "identity:create_project_tag action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_project_tag",
+ "description": "identity:delete_project_tag action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_project_tag",
+ "description": "identity:get_project_tag action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_project_tags",
+ "description": "identity:list_project_tags action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_project_tags",
+ "description": "identity:delete_project_tags action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_project_tags",
+ "description": "identity:update_project_tags action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_target_user_domain_id",
+ "description": "admin_and_matching_target_user_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_user_domain_id",
+ "description": "admin_and_matching_user_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_user",
+ "description": "identity:get_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_users",
+ "description": "identity:list_users action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_user",
+ "description": "identity:create_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_user",
+ "description": "identity:update_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_user",
+ "description": "identity:delete_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_target_group_domain_id",
+ "description": "admin_and_matching_target_group_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_group_domain_id",
+ "description": "admin_and_matching_group_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_group",
+ "description": "identity:get_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_groups",
+ "description": "identity:list_groups action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_groups_for_user",
+ "description": "identity:list_groups_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_group",
+ "description": "identity:create_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_group",
+ "description": "identity:update_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_group",
+ "description": "identity:delete_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_users_in_group",
+ "description": "identity:list_users_in_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:remove_user_from_group",
+ "description": "identity:remove_user_from_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_user_in_group",
+ "description": "identity:check_user_in_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:add_user_to_group",
+ "description": "identity:add_user_to_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_credential",
+ "description": "identity:get_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_credentials",
+ "description": "identity:list_credentials action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_credential",
+ "description": "identity:create_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_credential",
+ "description": "identity:update_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_credential",
+ "description": "identity:delete_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_get_credential",
+ "description": "identity:ec2_get_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_list_credentials",
+ "description": "identity:ec2_list_credentials action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_create_credential",
+ "description": "identity:ec2_create_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:ec2_delete_credential",
+ "description": "identity:ec2_delete_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_role",
+ "description": "identity:get_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_roles",
+ "description": "identity:list_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_role",
+ "description": "identity:create_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_role",
+ "description": "identity:update_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_role",
+ "description": "identity:delete_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain_role",
+ "description": "identity:get_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_domain_roles",
+ "description": "identity:list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_domain_role",
+ "description": "identity:create_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_domain_role",
+ "description": "identity:update_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_domain_role",
+ "description": "identity:delete_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_matches_domain_role",
+ "description": "domain_admin_matches_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_domain_roles",
+ "description": "get_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_matches_target_domain_role",
+ "description": "domain_admin_matches_target_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_matches_target_domain_role",
+ "description": "project_admin_matches_target_domain_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "list_domain_roles",
+ "description": "list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles",
+ "description": "domain_admin_matches_filter_on_list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles",
+ "description": "project_admin_matches_filter_on_list_domain_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_and_matching_prior_role_domain_id",
+ "description": "admin_and_matching_prior_role_domain_id action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global",
+ "description": "implied_role_matches_prior_role_domain_or_global action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_implied_role",
+ "description": "identity:get_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_implied_roles",
+ "description": "identity:list_implied_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_implied_role",
+ "description": "identity:create_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_implied_role",
+ "description": "identity:delete_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_role_inference_rules",
+ "description": "identity:list_role_inference_rules action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_implied_role",
+ "description": "identity:check_implied_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_system_grants_for_user",
+ "description": "identity:list_system_grants_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_system_grant_for_user",
+ "description": "identity:check_system_grant_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_system_grant_for_user",
+ "description": "identity:create_system_grant_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_system_grant_for_user",
+ "description": "identity:revoke_system_grant_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_system_grants_for_group",
+ "description": "identity:list_system_grants_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_system_grant_for_group",
+ "description": "identity:check_system_grant_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_system_grant_for_group",
+ "description": "identity:create_system_grant_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_system_grant_for_group",
+ "description": "identity:revoke_system_grant_for_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_grant",
+ "description": "identity:check_grant action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_grants",
+ "description": "identity:list_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_grant",
+ "description": "identity:create_grant action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_grant",
+ "description": "identity:revoke_grant action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_grants",
+ "description": "domain_admin_for_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_global_role_grants",
+ "description": "domain_admin_for_global_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_domain_role_grants",
+ "description": "domain_admin_for_domain_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_grant_match",
+ "description": "domain_admin_grant_match action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_grants",
+ "description": "project_admin_for_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_global_role_grants",
+ "description": "project_admin_for_global_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_domain_role_grants",
+ "description": "project_admin_for_domain_role_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "domain_admin_for_list_grants",
+ "description": "domain_admin_for_list_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "project_admin_for_list_grants",
+ "description": "project_admin_for_list_grants action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_on_domain_filter",
+ "description": "admin_on_domain_filter action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_on_project_filter",
+ "description": "admin_on_project_filter action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "admin_on_domain_of_project_filter",
+ "description": "admin_on_domain_of_project_filter action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_role_assignments",
+ "description": "identity:list_role_assignments action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_role_assignments_for_tree",
+ "description": "identity:list_role_assignments_for_tree action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_policy",
+ "description": "identity:get_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_policies",
+ "description": "identity:list_policies action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy",
+ "description": "identity:create_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_policy",
+ "description": "identity:update_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy",
+ "description": "identity:delete_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_token",
+ "description": "identity:check_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:validate_token",
+ "description": "identity:validate_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:validate_token_head",
+ "description": "identity:validate_token_head action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revocation_list",
+ "description": "identity:revocation_list action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:revoke_token",
+ "description": "identity:revoke_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_trust",
+ "description": "identity:create_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_trusts",
+ "description": "identity:list_trusts action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_roles_for_trust",
+ "description": "identity:list_roles_for_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_role_for_trust",
+ "description": "identity:get_role_for_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_trust",
+ "description": "identity:delete_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_trust",
+ "description": "identity:get_trust action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_consumer",
+ "description": "identity:create_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_consumer",
+ "description": "identity:get_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_consumers",
+ "description": "identity:list_consumers action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_consumer",
+ "description": "identity:delete_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_consumer",
+ "description": "identity:update_consumer action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:authorize_request_token",
+ "description": "identity:authorize_request_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_access_token_roles",
+ "description": "identity:list_access_token_roles action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_access_token_role",
+ "description": "identity:get_access_token_role action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_access_tokens",
+ "description": "identity:list_access_tokens action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_access_token",
+ "description": "identity:get_access_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_access_token",
+ "description": "identity:delete_access_token action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects_for_endpoint",
+ "description": "identity:list_projects_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:add_endpoint_to_project",
+ "description": "identity:add_endpoint_to_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_endpoint_in_project",
+ "description": "identity:check_endpoint_in_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints_for_project",
+ "description": "identity:list_endpoints_for_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:remove_endpoint_from_project",
+ "description": "identity:remove_endpoint_from_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_endpoint_group",
+ "description": "identity:create_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoint_groups",
+ "description": "identity:list_endpoint_groups action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_endpoint_group",
+ "description": "identity:get_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_endpoint_group",
+ "description": "identity:update_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_endpoint_group",
+ "description": "identity:delete_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group",
+ "description": "identity:list_projects_associated_with_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group",
+ "description": "identity:list_endpoints_associated_with_endpoint_group action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_endpoint_group_in_project",
+ "description": "identity:get_endpoint_group_in_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoint_groups_for_project",
+ "description": "identity:list_endpoint_groups_for_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:add_endpoint_group_to_project",
+ "description": "identity:add_endpoint_group_to_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:remove_endpoint_group_from_project",
+ "description": "identity:remove_endpoint_group_from_project action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_identity_provider",
+ "description": "identity:create_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_identity_providers",
+ "description": "identity:list_identity_providers action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_identity_provider",
+ "description": "identity:get_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_identity_provider",
+ "description": "identity:update_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_identity_provider",
+ "description": "identity:delete_identity_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_protocol",
+ "description": "identity:create_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_protocol",
+ "description": "identity:update_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_protocol",
+ "description": "identity:get_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_protocols",
+ "description": "identity:list_protocols action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_protocol",
+ "description": "identity:delete_protocol action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_mapping",
+ "description": "identity:create_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_mapping",
+ "description": "identity:get_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_mappings",
+ "description": "identity:list_mappings action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_mapping",
+ "description": "identity:delete_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_mapping",
+ "description": "identity:update_mapping action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_service_provider",
+ "description": "identity:create_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_service_providers",
+ "description": "identity:list_service_providers action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_service_provider",
+ "description": "identity:get_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_service_provider",
+ "description": "identity:update_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_service_provider",
+ "description": "identity:delete_service_provider action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_catalog",
+ "description": "identity:get_auth_catalog action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_projects",
+ "description": "identity:get_auth_projects action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_domains",
+ "description": "identity:get_auth_domains action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_auth_system",
+ "description": "identity:get_auth_system action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_projects_for_user",
+ "description": "identity:list_projects_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_domains_for_user",
+ "description": "identity:list_domains_for_user action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_revoke_events",
+ "description": "identity:list_revoke_events action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy_association_for_endpoint",
+ "description": "identity:create_policy_association_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_policy_association_for_endpoint",
+ "description": "identity:check_policy_association_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy_association_for_endpoint",
+ "description": "identity:delete_policy_association_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy_association_for_service",
+ "description": "identity:create_policy_association_for_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_policy_association_for_service",
+ "description": "identity:check_policy_association_for_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy_association_for_service",
+ "description": "identity:delete_policy_association_for_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_policy_association_for_region_and_service",
+ "description": "identity:create_policy_association_for_region_and_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:check_policy_association_for_region_and_service",
+ "description": "identity:check_policy_association_for_region_and_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_policy_association_for_region_and_service",
+ "description": "identity:delete_policy_association_for_region_and_service action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_policy_for_endpoint",
+ "description": "identity:get_policy_for_endpoint action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_endpoints_for_policy",
+ "description": "identity:list_endpoints_for_policy action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_domain_config",
+ "description": "identity:create_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain_config",
+ "description": "identity:get_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_security_compliance_domain_config",
+ "description": "identity:get_security_compliance_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:update_domain_config",
+ "description": "identity:update_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_domain_config",
+ "description": "identity:delete_domain_config action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_domain_config_default",
+ "description": "identity:get_domain_config_default action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:get_application_credential",
+ "description": "identity:get_application_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:list_application_credentials",
+ "description": "identity:list_application_credentials action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:create_application_credential",
+ "description": "identity:create_application_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ },
+ {
+ "name": "identity:delete_application_credential",
+ "description": "identity:delete_application_credential action for keystone",
+ "extra": {
+ "component": "keystone"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_region",
+ "description": "identity:get_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_regions",
+ "description": "identity:list_regions action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_region",
+ "description": "identity:create_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_region",
+ "description": "identity:update_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_region",
+ "description": "identity:delete_region action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_service",
+ "description": "identity:get_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_services",
+ "description": "identity:list_services action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_service",
+ "description": "identity:create_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_service",
+ "description": "identity:update_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_service",
+ "description": "identity:delete_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_endpoint",
+ "description": "identity:get_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints",
+ "description": "identity:list_endpoints action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_endpoint",
+ "description": "identity:create_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_endpoint",
+ "description": "identity:update_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_endpoint",
+ "description": "identity:delete_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_registered_limit",
+ "description": "identity:get_registered_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_registered_limits",
+ "description": "identity:list_registered_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_registered_limits",
+ "description": "identity:create_registered_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_registered_limits",
+ "description": "identity:update_registered_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_registered_limit",
+ "description": "identity:delete_registered_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_limit",
+ "description": "identity:get_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_limits",
+ "description": "identity:list_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_limits",
+ "description": "identity:create_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_limits",
+ "description": "identity:update_limits action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_limit",
+ "description": "identity:delete_limit action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain",
+ "description": "identity:get_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_domains",
+ "description": "identity:list_domains action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_domain",
+ "description": "identity:create_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_domain",
+ "description": "identity:update_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_domain",
+ "description": "identity:delete_domain action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_target_project_domain_id",
+ "description": "admin_and_matching_target_project_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_project_domain_id",
+ "description": "admin_and_matching_project_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_project",
+ "description": "identity:get_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects",
+ "description": "identity:list_projects action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_user_projects",
+ "description": "identity:list_user_projects action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_project",
+ "description": "identity:create_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_project",
+ "description": "identity:update_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_project",
+ "description": "identity:delete_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_project_tag",
+ "description": "identity:create_project_tag action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_project_tag",
+ "description": "identity:delete_project_tag action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_project_tag",
+ "description": "identity:get_project_tag action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_project_tags",
+ "description": "identity:list_project_tags action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_project_tags",
+ "description": "identity:delete_project_tags action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_project_tags",
+ "description": "identity:update_project_tags action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_target_user_domain_id",
+ "description": "admin_and_matching_target_user_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_user_domain_id",
+ "description": "admin_and_matching_user_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_user",
+ "description": "identity:get_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_users",
+ "description": "identity:list_users action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_user",
+ "description": "identity:create_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_user",
+ "description": "identity:update_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_user",
+ "description": "identity:delete_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_target_group_domain_id",
+ "description": "admin_and_matching_target_group_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_group_domain_id",
+ "description": "admin_and_matching_group_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_group",
+ "description": "identity:get_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_groups",
+ "description": "identity:list_groups action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_groups_for_user",
+ "description": "identity:list_groups_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_group",
+ "description": "identity:create_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_group",
+ "description": "identity:update_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_group",
+ "description": "identity:delete_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_users_in_group",
+ "description": "identity:list_users_in_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:remove_user_from_group",
+ "description": "identity:remove_user_from_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_user_in_group",
+ "description": "identity:check_user_in_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:add_user_to_group",
+ "description": "identity:add_user_to_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_credential",
+ "description": "identity:get_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_credentials",
+ "description": "identity:list_credentials action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_credential",
+ "description": "identity:create_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_credential",
+ "description": "identity:update_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_credential",
+ "description": "identity:delete_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_get_credential",
+ "description": "identity:ec2_get_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_list_credentials",
+ "description": "identity:ec2_list_credentials action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_create_credential",
+ "description": "identity:ec2_create_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:ec2_delete_credential",
+ "description": "identity:ec2_delete_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_role",
+ "description": "identity:get_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_roles",
+ "description": "identity:list_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_role",
+ "description": "identity:create_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_role",
+ "description": "identity:update_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_role",
+ "description": "identity:delete_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain_role",
+ "description": "identity:get_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_domain_roles",
+ "description": "identity:list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_domain_role",
+ "description": "identity:create_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_domain_role",
+ "description": "identity:update_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_domain_role",
+ "description": "identity:delete_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_matches_domain_role",
+ "description": "domain_admin_matches_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "get_domain_roles",
+ "description": "get_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_matches_target_domain_role",
+ "description": "domain_admin_matches_target_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_matches_target_domain_role",
+ "description": "project_admin_matches_target_domain_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "list_domain_roles",
+ "description": "list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles",
+ "description": "domain_admin_matches_filter_on_list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles",
+ "description": "project_admin_matches_filter_on_list_domain_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_and_matching_prior_role_domain_id",
+ "description": "admin_and_matching_prior_role_domain_id action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global",
+ "description": "implied_role_matches_prior_role_domain_or_global action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_implied_role",
+ "description": "identity:get_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_implied_roles",
+ "description": "identity:list_implied_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_implied_role",
+ "description": "identity:create_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_implied_role",
+ "description": "identity:delete_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_role_inference_rules",
+ "description": "identity:list_role_inference_rules action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_implied_role",
+ "description": "identity:check_implied_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_system_grants_for_user",
+ "description": "identity:list_system_grants_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_system_grant_for_user",
+ "description": "identity:check_system_grant_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_system_grant_for_user",
+ "description": "identity:create_system_grant_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_system_grant_for_user",
+ "description": "identity:revoke_system_grant_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_system_grants_for_group",
+ "description": "identity:list_system_grants_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_system_grant_for_group",
+ "description": "identity:check_system_grant_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_system_grant_for_group",
+ "description": "identity:create_system_grant_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_system_grant_for_group",
+ "description": "identity:revoke_system_grant_for_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_grant",
+ "description": "identity:check_grant action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_grants",
+ "description": "identity:list_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_grant",
+ "description": "identity:create_grant action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_grant",
+ "description": "identity:revoke_grant action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_grants",
+ "description": "domain_admin_for_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_global_role_grants",
+ "description": "domain_admin_for_global_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_domain_role_grants",
+ "description": "domain_admin_for_domain_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_grant_match",
+ "description": "domain_admin_grant_match action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_grants",
+ "description": "project_admin_for_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_global_role_grants",
+ "description": "project_admin_for_global_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_domain_role_grants",
+ "description": "project_admin_for_domain_role_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "domain_admin_for_list_grants",
+ "description": "domain_admin_for_list_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "project_admin_for_list_grants",
+ "description": "project_admin_for_list_grants action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_on_domain_filter",
+ "description": "admin_on_domain_filter action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_on_project_filter",
+ "description": "admin_on_project_filter action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "admin_on_domain_of_project_filter",
+ "description": "admin_on_domain_of_project_filter action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_role_assignments",
+ "description": "identity:list_role_assignments action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_role_assignments_for_tree",
+ "description": "identity:list_role_assignments_for_tree action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_policy",
+ "description": "identity:get_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_policies",
+ "description": "identity:list_policies action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy",
+ "description": "identity:create_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_policy",
+ "description": "identity:update_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy",
+ "description": "identity:delete_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_token",
+ "description": "identity:check_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:validate_token",
+ "description": "identity:validate_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:validate_token_head",
+ "description": "identity:validate_token_head action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revocation_list",
+ "description": "identity:revocation_list action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:revoke_token",
+ "description": "identity:revoke_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_trust",
+ "description": "identity:create_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_trusts",
+ "description": "identity:list_trusts action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_roles_for_trust",
+ "description": "identity:list_roles_for_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_role_for_trust",
+ "description": "identity:get_role_for_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_trust",
+ "description": "identity:delete_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_trust",
+ "description": "identity:get_trust action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_consumer",
+ "description": "identity:create_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_consumer",
+ "description": "identity:get_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_consumers",
+ "description": "identity:list_consumers action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_consumer",
+ "description": "identity:delete_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_consumer",
+ "description": "identity:update_consumer action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:authorize_request_token",
+ "description": "identity:authorize_request_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_access_token_roles",
+ "description": "identity:list_access_token_roles action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_access_token_role",
+ "description": "identity:get_access_token_role action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_access_tokens",
+ "description": "identity:list_access_tokens action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_access_token",
+ "description": "identity:get_access_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_access_token",
+ "description": "identity:delete_access_token action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects_for_endpoint",
+ "description": "identity:list_projects_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:add_endpoint_to_project",
+ "description": "identity:add_endpoint_to_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_endpoint_in_project",
+ "description": "identity:check_endpoint_in_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints_for_project",
+ "description": "identity:list_endpoints_for_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:remove_endpoint_from_project",
+ "description": "identity:remove_endpoint_from_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_endpoint_group",
+ "description": "identity:create_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoint_groups",
+ "description": "identity:list_endpoint_groups action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_endpoint_group",
+ "description": "identity:get_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_endpoint_group",
+ "description": "identity:update_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_endpoint_group",
+ "description": "identity:delete_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group",
+ "description": "identity:list_projects_associated_with_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group",
+ "description": "identity:list_endpoints_associated_with_endpoint_group action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_endpoint_group_in_project",
+ "description": "identity:get_endpoint_group_in_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoint_groups_for_project",
+ "description": "identity:list_endpoint_groups_for_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:add_endpoint_group_to_project",
+ "description": "identity:add_endpoint_group_to_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:remove_endpoint_group_from_project",
+ "description": "identity:remove_endpoint_group_from_project action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_identity_provider",
+ "description": "identity:create_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_identity_providers",
+ "description": "identity:list_identity_providers action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_identity_provider",
+ "description": "identity:get_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_identity_provider",
+ "description": "identity:update_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_identity_provider",
+ "description": "identity:delete_identity_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_protocol",
+ "description": "identity:create_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_protocol",
+ "description": "identity:update_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_protocol",
+ "description": "identity:get_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_protocols",
+ "description": "identity:list_protocols action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_protocol",
+ "description": "identity:delete_protocol action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_mapping",
+ "description": "identity:create_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_mapping",
+ "description": "identity:get_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_mappings",
+ "description": "identity:list_mappings action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_mapping",
+ "description": "identity:delete_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_mapping",
+ "description": "identity:update_mapping action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_service_provider",
+ "description": "identity:create_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_service_providers",
+ "description": "identity:list_service_providers action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_service_provider",
+ "description": "identity:get_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_service_provider",
+ "description": "identity:update_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_service_provider",
+ "description": "identity:delete_service_provider action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_catalog",
+ "description": "identity:get_auth_catalog action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_projects",
+ "description": "identity:get_auth_projects action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_domains",
+ "description": "identity:get_auth_domains action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_auth_system",
+ "description": "identity:get_auth_system action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_projects_for_user",
+ "description": "identity:list_projects_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_domains_for_user",
+ "description": "identity:list_domains_for_user action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_revoke_events",
+ "description": "identity:list_revoke_events action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy_association_for_endpoint",
+ "description": "identity:create_policy_association_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_policy_association_for_endpoint",
+ "description": "identity:check_policy_association_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy_association_for_endpoint",
+ "description": "identity:delete_policy_association_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy_association_for_service",
+ "description": "identity:create_policy_association_for_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_policy_association_for_service",
+ "description": "identity:check_policy_association_for_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy_association_for_service",
+ "description": "identity:delete_policy_association_for_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_policy_association_for_region_and_service",
+ "description": "identity:create_policy_association_for_region_and_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:check_policy_association_for_region_and_service",
+ "description": "identity:check_policy_association_for_region_and_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_policy_association_for_region_and_service",
+ "description": "identity:delete_policy_association_for_region_and_service action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_policy_for_endpoint",
+ "description": "identity:get_policy_for_endpoint action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_endpoints_for_policy",
+ "description": "identity:list_endpoints_for_policy action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_domain_config",
+ "description": "identity:create_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain_config",
+ "description": "identity:get_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_security_compliance_domain_config",
+ "description": "identity:get_security_compliance_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:update_domain_config",
+ "description": "identity:update_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_domain_config",
+ "description": "identity:delete_domain_config action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_domain_config_default",
+ "description": "identity:get_domain_config_default action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:get_application_credential",
+ "description": "identity:get_application_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:list_application_credentials",
+ "description": "identity:list_application_credentials action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:create_application_credential",
+ "description": "identity:create_application_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "identity:delete_application_credential",
+ "description": "identity:delete_application_credential action for keystone",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {
+ "name": "identity:get_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_regions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_regions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_region"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_region"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_services"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_services"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_registered_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_registered_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_registered_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_registered_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_registered_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_registered_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_registered_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_registered_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_registered_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_registered_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_limit"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_limit"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_domains"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_domains"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_target_project_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_target_project_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_project_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_project_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_user_projects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_user_projects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_project_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_project_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_project_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_project_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_project_tag"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_project_tag"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_project_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_project_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_project_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_project_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_project_tags"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_project_tags"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_target_user_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_target_user_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_user_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_user_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_users"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_users"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_target_group_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_target_group_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_group_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_group_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_groups_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_groups_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_users_in_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_users_in_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:remove_user_from_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:remove_user_from_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_user_in_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_user_in_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:add_user_to_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:add_user_to_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_credentials"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_credentials"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_get_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_get_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_list_credentials"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_list_credentials"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_create_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_create_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:ec2_delete_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:ec2_delete_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_matches_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_matches_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "get_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "get_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_matches_target_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_matches_target_domain_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_matches_filter_on_list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_matches_filter_on_list_domain_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_and_matching_prior_role_domain_id"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_and_matching_prior_role_domain_id"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "implied_role_matches_prior_role_domain_or_global"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_implied_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_implied_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_role_inference_rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_role_inference_rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_implied_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_implied_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_system_grants_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_system_grants_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_system_grant_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_system_grant_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_system_grant_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_system_grant_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_system_grant_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_system_grant_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_system_grants_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_system_grants_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_system_grant_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_system_grant_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_system_grant_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_system_grant_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_system_grant_for_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_system_grant_for_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_grant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_grant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_grant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_grant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_grant"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_grant"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_global_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_global_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_domain_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_grant_match"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_grant_match"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_global_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_global_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_domain_role_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "domain_admin_for_list_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "domain_admin_for_list_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "project_admin_for_list_grants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "project_admin_for_list_grants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_on_domain_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_on_domain_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_on_project_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_on_project_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "admin_on_domain_of_project_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "admin_on_domain_of_project_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_role_assignments"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_role_assignments"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_role_assignments_for_tree"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_role_assignments_for_tree"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_policies"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_policies"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:validate_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:validate_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:validate_token_head"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:validate_token_head"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revocation_list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revocation_list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:revoke_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:revoke_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_trusts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_trusts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_roles_for_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_roles_for_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_role_for_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_role_for_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_trust"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_trust"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_consumers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_consumers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_consumer"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_consumer"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:authorize_request_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:authorize_request_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_access_token_roles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_access_token_roles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_access_token_role"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_access_token_role"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_access_tokens"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_access_tokens"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_access_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_access_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_access_token"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_access_token"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:add_endpoint_to_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:add_endpoint_to_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_endpoint_in_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_endpoint_in_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints_for_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints_for_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:remove_endpoint_from_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:remove_endpoint_from_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoint_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoint_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects_associated_with_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints_associated_with_endpoint_group"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_endpoint_group_in_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_endpoint_group_in_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoint_groups_for_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoint_groups_for_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:add_endpoint_group_to_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:add_endpoint_group_to_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:remove_endpoint_group_from_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:remove_endpoint_group_from_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_identity_providers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_identity_providers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_identity_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_identity_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_protocols"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_protocols"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_protocol"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_protocol"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_mappings"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_mappings"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_mapping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_mapping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_service_providers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_service_providers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_service_provider"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_service_provider"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_catalog"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_catalog"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_projects"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_projects"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_domains"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_domains"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_auth_system"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_auth_system"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_projects_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_projects_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_domains_for_user"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_domains_for_user"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_revoke_events"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_revoke_events"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy_association_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy_association_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_policy_association_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_policy_association_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy_association_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy_association_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy_association_for_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy_association_for_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_policy_association_for_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_policy_association_for_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy_association_for_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy_association_for_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_policy_association_for_region_and_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:check_policy_association_for_region_and_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:check_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_policy_association_for_region_and_service"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_policy_for_endpoint"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_policy_for_endpoint"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_endpoints_for_policy"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_endpoints_for_policy"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_security_compliance_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_security_compliance_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:update_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:update_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_domain_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_domain_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_domain_config_default"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_domain_config_default"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:get_application_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:get_application_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:list_application_credentials"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:list_application_credentials"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:create_application_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:create_application_credential"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "identity:delete_application_credential"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "identity:delete_application_credential"
+ }
+ ]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [
+ {
+ "name": "role"
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id"
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id"
+ }
+ ]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_regions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_region"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_services"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_registered_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_registered_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_registered_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_registered_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_registered_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_limit"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_domains"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_target_project_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_project_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_user_projects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_project_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_project_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_project_tag"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_project_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_project_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_project_tags"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_target_user_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_user_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_users"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_target_group_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_group_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_groups_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_users_in_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:remove_user_from_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_user_in_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:add_user_to_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_credentials"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_get_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_list_credentials"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_create_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:ec2_delete_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_matches_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "get_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_matches_target_domain_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_matches_filter_on_list_domain_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_and_matching_prior_role_domain_id"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "implied_role_matches_prior_role_domain_or_global"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_implied_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_role_inference_rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_implied_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_system_grants_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_system_grant_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_system_grant_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_system_grant_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_system_grants_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_system_grant_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_system_grant_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_system_grant_for_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_grant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_grant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_grant"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_global_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_grant_match"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_global_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_domain_role_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "domain_admin_for_list_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "project_admin_for_list_grants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_on_domain_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_on_project_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "admin_on_domain_of_project_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_role_assignments"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_role_assignments_for_tree"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_policies"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:validate_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:validate_token_head"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revocation_list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:revoke_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_trusts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_roles_for_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_role_for_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_trust"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_consumers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_consumer"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:authorize_request_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_access_token_roles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_access_token_role"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_access_tokens"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_access_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_access_token"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:add_endpoint_to_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_endpoint_in_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints_for_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:remove_endpoint_from_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoint_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects_associated_with_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints_associated_with_endpoint_group"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_endpoint_group_in_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoint_groups_for_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:add_endpoint_group_to_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:remove_endpoint_group_from_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_identity_providers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_identity_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_protocols"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_protocol"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_mappings"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_mapping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_service_providers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_service_provider"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_catalog"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_projects"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_domains"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_auth_system"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_projects_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_domains_for_user"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_revoke_events"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy_association_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_policy_association_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy_association_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy_association_for_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_policy_association_for_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy_association_for_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:check_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_policy_association_for_region_and_service"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_policy_for_endpoint"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_endpoints_for_policy"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_security_compliance_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:update_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_domain_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_domain_config_default"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:get_application_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:list_application_credentials"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:create_application_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "identity:delete_application_credential"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/opst_rbac_kg.json b/moon_engine/tests/func_policies/opst_rbac_kg.json
new file mode 100644
index 00000000..5fc27b8c
--- /dev/null
+++ b/moon_engine/tests/func_policies/opst_rbac_kg.json
@@ -0,0 +1 @@
+{"policies": [{"name": "OpenStack RBAC Policy", "genre": "authz", "description": "A RBAC policy similar of what you can find through policy.json files", "model": {"name": "OPST_RBAC"}, "mandatory": true, "override": true}], "models": [{"name": "OPST_RBAC", "description": "", "meta_rules": [{"name": "rbac"}], "override": true}], "subjects": [{"name": "admin", "description": "", "extra": {}, "policies": [{"name": "OpenStack RBAC Policy"}]}], "subject_categories": [{"name": "role", "description": "a role in OpenStack"}], "subject_data": [{"name": "admin", "description": "the admin role", "policies": [], "category": {"name": "role"}}, {"name": "member", "description": "the member role", "policies": [], "category": {"name": "role"}}], "subject_assignments": [{"subject": {"name": "admin"}, "category": {"name": "role"}, "assignments": [{"name": "admin"}, {"name": "member"}]}], "objects": [{"name": "all_vm", "description": "", "extra": {}, "policies": [{"name": "OpenStack RBAC Policy"}]}], "object_categories": [{"name": "id", "description": "the UID of each virtual machine"}], "object_data": [{"name": "all_vm", "description": "represents all virtual machines in this project", "policies": [], "category": {"name": "id"}}], "object_assignments": [{"object": {"name": "all_vm"}, "category": {"name": "id"}, "assignments": [{"name": "all_vm"}]}], "actions": [{"name": "add_image", "description": "add_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "delete_image", "description": "delete_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_image", "description": "get_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_images", "description": "get_images action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_image", "description": "modify_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "publicize_image", "description": "publicize_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "communitize_image", "description": "communitize_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "copy_from", "description": "copy_from action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "download_image", "description": "download_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "upload_image", "description": "upload_image action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "delete_image_location", "description": "delete_image_location action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_image_location", "description": "get_image_location action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "set_image_location", "description": "set_image_location action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_member", "description": "add_member action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "delete_member", "description": "delete_member action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_member", "description": "get_member action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_members", "description": "get_members action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_member", "description": "modify_member action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "manage_image_cache", "description": "manage_image_cache action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_task", "description": "get_task action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_tasks", "description": "get_tasks action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_task", "description": "add_task action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_task", "description": "modify_task action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "tasks_api_access", "description": "tasks_api_access action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "deactivate", "description": "deactivate action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "reactivate", "description": "reactivate action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_namespace", "description": "get_metadef_namespace action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_namespaces", "description": "get_metadef_namespaces action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_metadef_namespace", "description": "modify_metadef_namespace action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_metadef_namespace", "description": "add_metadef_namespace action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_object", "description": "get_metadef_object action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_objects", "description": "get_metadef_objects action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_metadef_object", "description": "modify_metadef_object action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_metadef_object", "description": "add_metadef_object action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "list_metadef_resource_types", "description": "list_metadef_resource_types action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_resource_type", "description": "get_metadef_resource_type action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_metadef_resource_type_association", "description": "add_metadef_resource_type_association action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_property", "description": "get_metadef_property action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_properties", "description": "get_metadef_properties action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_metadef_property", "description": "modify_metadef_property action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_metadef_property", "description": "add_metadef_property action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_tag", "description": "get_metadef_tag action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "get_metadef_tags", "description": "get_metadef_tags action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "modify_metadef_tag", "description": "modify_metadef_tag action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_metadef_tag", "description": "add_metadef_tag action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "add_metadef_tags", "description": "add_metadef_tags action for glance", "extra": {"component": "glance"}, "policies": []}, {"name": "identity:get_region", "description": "identity:get_region action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_regions", "description": "identity:list_regions action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_region", "description": "identity:create_region action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_region", "description": "identity:update_region action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_region", "description": "identity:delete_region action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_service", "description": "identity:get_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_services", "description": "identity:list_services action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_service", "description": "identity:create_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_service", "description": "identity:update_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_service", "description": "identity:delete_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_endpoint", "description": "identity:get_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_endpoints", "description": "identity:list_endpoints action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_endpoint", "description": "identity:create_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_endpoint", "description": "identity:update_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_endpoint", "description": "identity:delete_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_registered_limit", "description": "identity:get_registered_limit action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_registered_limits", "description": "identity:list_registered_limits action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_registered_limits", "description": "identity:create_registered_limits action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_registered_limits", "description": "identity:update_registered_limits action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_registered_limit", "description": "identity:delete_registered_limit action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_limit", "description": "identity:get_limit action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_limits", "description": "identity:list_limits action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_limits", "description": "identity:create_limits action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_limits", "description": "identity:update_limits action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_limit", "description": "identity:delete_limit action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_domain", "description": "identity:get_domain action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_domains", "description": "identity:list_domains action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_domain", "description": "identity:create_domain action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_domain", "description": "identity:update_domain action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_domain", "description": "identity:delete_domain action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_target_project_domain_id", "description": "admin_and_matching_target_project_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_project_domain_id", "description": "admin_and_matching_project_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_project", "description": "identity:get_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_projects", "description": "identity:list_projects action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_user_projects", "description": "identity:list_user_projects action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_project", "description": "identity:create_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_project", "description": "identity:update_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_project", "description": "identity:delete_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_project_tag", "description": "identity:create_project_tag action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_project_tag", "description": "identity:delete_project_tag action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_project_tag", "description": "identity:get_project_tag action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_project_tags", "description": "identity:list_project_tags action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_project_tags", "description": "identity:delete_project_tags action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_project_tags", "description": "identity:update_project_tags action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_target_user_domain_id", "description": "admin_and_matching_target_user_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_user_domain_id", "description": "admin_and_matching_user_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_user", "description": "identity:get_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_users", "description": "identity:list_users action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_user", "description": "identity:create_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_user", "description": "identity:update_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_user", "description": "identity:delete_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_target_group_domain_id", "description": "admin_and_matching_target_group_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_group_domain_id", "description": "admin_and_matching_group_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_group", "description": "identity:get_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_groups", "description": "identity:list_groups action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_groups_for_user", "description": "identity:list_groups_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_group", "description": "identity:create_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_group", "description": "identity:update_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_group", "description": "identity:delete_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_users_in_group", "description": "identity:list_users_in_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:remove_user_from_group", "description": "identity:remove_user_from_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_user_in_group", "description": "identity:check_user_in_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:add_user_to_group", "description": "identity:add_user_to_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_credential", "description": "identity:get_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_credentials", "description": "identity:list_credentials action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_credential", "description": "identity:create_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_credential", "description": "identity:update_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_credential", "description": "identity:delete_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:ec2_get_credential", "description": "identity:ec2_get_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:ec2_list_credentials", "description": "identity:ec2_list_credentials action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:ec2_create_credential", "description": "identity:ec2_create_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:ec2_delete_credential", "description": "identity:ec2_delete_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_role", "description": "identity:get_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_roles", "description": "identity:list_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_role", "description": "identity:create_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_role", "description": "identity:update_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_role", "description": "identity:delete_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_domain_role", "description": "identity:get_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_domain_roles", "description": "identity:list_domain_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_domain_role", "description": "identity:create_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_domain_role", "description": "identity:update_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_domain_role", "description": "identity:delete_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_matches_domain_role", "description": "domain_admin_matches_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "get_domain_roles", "description": "get_domain_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_matches_target_domain_role", "description": "domain_admin_matches_target_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "project_admin_matches_target_domain_role", "description": "project_admin_matches_target_domain_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "list_domain_roles", "description": "list_domain_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_matches_filter_on_list_domain_roles", "description": "domain_admin_matches_filter_on_list_domain_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "project_admin_matches_filter_on_list_domain_roles", "description": "project_admin_matches_filter_on_list_domain_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_and_matching_prior_role_domain_id", "description": "admin_and_matching_prior_role_domain_id action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "implied_role_matches_prior_role_domain_or_global", "description": "implied_role_matches_prior_role_domain_or_global action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_implied_role", "description": "identity:get_implied_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_implied_roles", "description": "identity:list_implied_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_implied_role", "description": "identity:create_implied_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_implied_role", "description": "identity:delete_implied_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_role_inference_rules", "description": "identity:list_role_inference_rules action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_implied_role", "description": "identity:check_implied_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_system_grants_for_user", "description": "identity:list_system_grants_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_system_grant_for_user", "description": "identity:check_system_grant_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_system_grant_for_user", "description": "identity:create_system_grant_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:revoke_system_grant_for_user", "description": "identity:revoke_system_grant_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_system_grants_for_group", "description": "identity:list_system_grants_for_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_system_grant_for_group", "description": "identity:check_system_grant_for_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_system_grant_for_group", "description": "identity:create_system_grant_for_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:revoke_system_grant_for_group", "description": "identity:revoke_system_grant_for_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_grant", "description": "identity:check_grant action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_grants", "description": "identity:list_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_grant", "description": "identity:create_grant action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:revoke_grant", "description": "identity:revoke_grant action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_for_grants", "description": "domain_admin_for_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_for_global_role_grants", "description": "domain_admin_for_global_role_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_for_domain_role_grants", "description": "domain_admin_for_domain_role_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_grant_match", "description": "domain_admin_grant_match action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "project_admin_for_grants", "description": "project_admin_for_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "project_admin_for_global_role_grants", "description": "project_admin_for_global_role_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "project_admin_for_domain_role_grants", "description": "project_admin_for_domain_role_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "domain_admin_for_list_grants", "description": "domain_admin_for_list_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "project_admin_for_list_grants", "description": "project_admin_for_list_grants action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_on_domain_filter", "description": "admin_on_domain_filter action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_on_project_filter", "description": "admin_on_project_filter action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "admin_on_domain_of_project_filter", "description": "admin_on_domain_of_project_filter action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_role_assignments", "description": "identity:list_role_assignments action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_role_assignments_for_tree", "description": "identity:list_role_assignments_for_tree action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_policy", "description": "identity:get_policy action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_policies", "description": "identity:list_policies action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_policy", "description": "identity:create_policy action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_policy", "description": "identity:update_policy action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_policy", "description": "identity:delete_policy action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_token", "description": "identity:check_token action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:validate_token", "description": "identity:validate_token action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:validate_token_head", "description": "identity:validate_token_head action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:revocation_list", "description": "identity:revocation_list action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:revoke_token", "description": "identity:revoke_token action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_trust", "description": "identity:create_trust action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_trusts", "description": "identity:list_trusts action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_roles_for_trust", "description": "identity:list_roles_for_trust action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_role_for_trust", "description": "identity:get_role_for_trust action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_trust", "description": "identity:delete_trust action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_trust", "description": "identity:get_trust action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_consumer", "description": "identity:create_consumer action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_consumer", "description": "identity:get_consumer action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_consumers", "description": "identity:list_consumers action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_consumer", "description": "identity:delete_consumer action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_consumer", "description": "identity:update_consumer action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:authorize_request_token", "description": "identity:authorize_request_token action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_access_token_roles", "description": "identity:list_access_token_roles action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_access_token_role", "description": "identity:get_access_token_role action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_access_tokens", "description": "identity:list_access_tokens action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_access_token", "description": "identity:get_access_token action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_access_token", "description": "identity:delete_access_token action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_projects_for_endpoint", "description": "identity:list_projects_for_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:add_endpoint_to_project", "description": "identity:add_endpoint_to_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_endpoint_in_project", "description": "identity:check_endpoint_in_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_endpoints_for_project", "description": "identity:list_endpoints_for_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:remove_endpoint_from_project", "description": "identity:remove_endpoint_from_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_endpoint_group", "description": "identity:create_endpoint_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_endpoint_groups", "description": "identity:list_endpoint_groups action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_endpoint_group", "description": "identity:get_endpoint_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_endpoint_group", "description": "identity:update_endpoint_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_endpoint_group", "description": "identity:delete_endpoint_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_projects_associated_with_endpoint_group", "description": "identity:list_projects_associated_with_endpoint_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_endpoints_associated_with_endpoint_group", "description": "identity:list_endpoints_associated_with_endpoint_group action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_endpoint_group_in_project", "description": "identity:get_endpoint_group_in_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_endpoint_groups_for_project", "description": "identity:list_endpoint_groups_for_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:add_endpoint_group_to_project", "description": "identity:add_endpoint_group_to_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:remove_endpoint_group_from_project", "description": "identity:remove_endpoint_group_from_project action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_identity_provider", "description": "identity:create_identity_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_identity_providers", "description": "identity:list_identity_providers action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_identity_provider", "description": "identity:get_identity_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_identity_provider", "description": "identity:update_identity_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_identity_provider", "description": "identity:delete_identity_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_protocol", "description": "identity:create_protocol action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_protocol", "description": "identity:update_protocol action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_protocol", "description": "identity:get_protocol action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_protocols", "description": "identity:list_protocols action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_protocol", "description": "identity:delete_protocol action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_mapping", "description": "identity:create_mapping action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_mapping", "description": "identity:get_mapping action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_mappings", "description": "identity:list_mappings action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_mapping", "description": "identity:delete_mapping action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_mapping", "description": "identity:update_mapping action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_service_provider", "description": "identity:create_service_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_service_providers", "description": "identity:list_service_providers action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_service_provider", "description": "identity:get_service_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_service_provider", "description": "identity:update_service_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_service_provider", "description": "identity:delete_service_provider action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_auth_catalog", "description": "identity:get_auth_catalog action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_auth_projects", "description": "identity:get_auth_projects action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_auth_domains", "description": "identity:get_auth_domains action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_auth_system", "description": "identity:get_auth_system action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_projects_for_user", "description": "identity:list_projects_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_domains_for_user", "description": "identity:list_domains_for_user action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_revoke_events", "description": "identity:list_revoke_events action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_policy_association_for_endpoint", "description": "identity:create_policy_association_for_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_policy_association_for_endpoint", "description": "identity:check_policy_association_for_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_policy_association_for_endpoint", "description": "identity:delete_policy_association_for_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_policy_association_for_service", "description": "identity:create_policy_association_for_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_policy_association_for_service", "description": "identity:check_policy_association_for_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_policy_association_for_service", "description": "identity:delete_policy_association_for_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_policy_association_for_region_and_service", "description": "identity:create_policy_association_for_region_and_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:check_policy_association_for_region_and_service", "description": "identity:check_policy_association_for_region_and_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_policy_association_for_region_and_service", "description": "identity:delete_policy_association_for_region_and_service action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_policy_for_endpoint", "description": "identity:get_policy_for_endpoint action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_endpoints_for_policy", "description": "identity:list_endpoints_for_policy action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_domain_config", "description": "identity:create_domain_config action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_domain_config", "description": "identity:get_domain_config action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_security_compliance_domain_config", "description": "identity:get_security_compliance_domain_config action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:update_domain_config", "description": "identity:update_domain_config action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_domain_config", "description": "identity:delete_domain_config action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_domain_config_default", "description": "identity:get_domain_config_default action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:get_application_credential", "description": "identity:get_application_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:list_application_credentials", "description": "identity:list_application_credentials action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:create_application_credential", "description": "identity:create_application_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}, {"name": "identity:delete_application_credential", "description": "identity:delete_application_credential action for keystone", "extra": {"component": "keystone"}, "policies": []}], "action_categories": [{"name": "action_id", "description": ""}], "action_data": [{"name": "add_image", "description": "add_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "delete_image", "description": "delete_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_image", "description": "get_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_images", "description": "get_images action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_image", "description": "modify_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "publicize_image", "description": "publicize_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "communitize_image", "description": "communitize_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "copy_from", "description": "copy_from action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "download_image", "description": "download_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "upload_image", "description": "upload_image action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "delete_image_location", "description": "delete_image_location action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_image_location", "description": "get_image_location action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "set_image_location", "description": "set_image_location action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_member", "description": "add_member action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "delete_member", "description": "delete_member action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_member", "description": "get_member action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_members", "description": "get_members action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_member", "description": "modify_member action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "manage_image_cache", "description": "manage_image_cache action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_task", "description": "get_task action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_tasks", "description": "get_tasks action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_task", "description": "add_task action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_task", "description": "modify_task action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "tasks_api_access", "description": "tasks_api_access action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "deactivate", "description": "deactivate action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "reactivate", "description": "reactivate action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_namespace", "description": "get_metadef_namespace action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_namespaces", "description": "get_metadef_namespaces action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_metadef_namespace", "description": "modify_metadef_namespace action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_metadef_namespace", "description": "add_metadef_namespace action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_object", "description": "get_metadef_object action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_objects", "description": "get_metadef_objects action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_metadef_object", "description": "modify_metadef_object action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_metadef_object", "description": "add_metadef_object action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "list_metadef_resource_types", "description": "list_metadef_resource_types action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_resource_type", "description": "get_metadef_resource_type action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_metadef_resource_type_association", "description": "add_metadef_resource_type_association action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_property", "description": "get_metadef_property action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_properties", "description": "get_metadef_properties action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_metadef_property", "description": "modify_metadef_property action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_metadef_property", "description": "add_metadef_property action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_tag", "description": "get_metadef_tag action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "get_metadef_tags", "description": "get_metadef_tags action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "modify_metadef_tag", "description": "modify_metadef_tag action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_metadef_tag", "description": "add_metadef_tag action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "add_metadef_tags", "description": "add_metadef_tags action for glance", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_region", "description": "identity:get_region action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_regions", "description": "identity:list_regions action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_region", "description": "identity:create_region action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_region", "description": "identity:update_region action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_region", "description": "identity:delete_region action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_service", "description": "identity:get_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_services", "description": "identity:list_services action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_service", "description": "identity:create_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_service", "description": "identity:update_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_service", "description": "identity:delete_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_endpoint", "description": "identity:get_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_endpoints", "description": "identity:list_endpoints action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_endpoint", "description": "identity:create_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_endpoint", "description": "identity:update_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_endpoint", "description": "identity:delete_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_registered_limit", "description": "identity:get_registered_limit action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_registered_limits", "description": "identity:list_registered_limits action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_registered_limits", "description": "identity:create_registered_limits action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_registered_limits", "description": "identity:update_registered_limits action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_registered_limit", "description": "identity:delete_registered_limit action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_limit", "description": "identity:get_limit action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_limits", "description": "identity:list_limits action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_limits", "description": "identity:create_limits action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_limits", "description": "identity:update_limits action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_limit", "description": "identity:delete_limit action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_domain", "description": "identity:get_domain action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_domains", "description": "identity:list_domains action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_domain", "description": "identity:create_domain action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_domain", "description": "identity:update_domain action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_domain", "description": "identity:delete_domain action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_target_project_domain_id", "description": "admin_and_matching_target_project_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_project_domain_id", "description": "admin_and_matching_project_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_project", "description": "identity:get_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_projects", "description": "identity:list_projects action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_user_projects", "description": "identity:list_user_projects action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_project", "description": "identity:create_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_project", "description": "identity:update_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_project", "description": "identity:delete_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_project_tag", "description": "identity:create_project_tag action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_project_tag", "description": "identity:delete_project_tag action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_project_tag", "description": "identity:get_project_tag action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_project_tags", "description": "identity:list_project_tags action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_project_tags", "description": "identity:delete_project_tags action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_project_tags", "description": "identity:update_project_tags action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_target_user_domain_id", "description": "admin_and_matching_target_user_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_user_domain_id", "description": "admin_and_matching_user_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_user", "description": "identity:get_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_users", "description": "identity:list_users action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_user", "description": "identity:create_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_user", "description": "identity:update_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_user", "description": "identity:delete_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_target_group_domain_id", "description": "admin_and_matching_target_group_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_group_domain_id", "description": "admin_and_matching_group_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_group", "description": "identity:get_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_groups", "description": "identity:list_groups action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_groups_for_user", "description": "identity:list_groups_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_group", "description": "identity:create_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_group", "description": "identity:update_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_group", "description": "identity:delete_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_users_in_group", "description": "identity:list_users_in_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:remove_user_from_group", "description": "identity:remove_user_from_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_user_in_group", "description": "identity:check_user_in_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:add_user_to_group", "description": "identity:add_user_to_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_credential", "description": "identity:get_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_credentials", "description": "identity:list_credentials action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_credential", "description": "identity:create_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_credential", "description": "identity:update_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_credential", "description": "identity:delete_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:ec2_get_credential", "description": "identity:ec2_get_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:ec2_list_credentials", "description": "identity:ec2_list_credentials action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:ec2_create_credential", "description": "identity:ec2_create_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:ec2_delete_credential", "description": "identity:ec2_delete_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_role", "description": "identity:get_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_roles", "description": "identity:list_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_role", "description": "identity:create_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_role", "description": "identity:update_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_role", "description": "identity:delete_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_domain_role", "description": "identity:get_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_domain_roles", "description": "identity:list_domain_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_domain_role", "description": "identity:create_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_domain_role", "description": "identity:update_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_domain_role", "description": "identity:delete_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_matches_domain_role", "description": "domain_admin_matches_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "get_domain_roles", "description": "get_domain_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_matches_target_domain_role", "description": "domain_admin_matches_target_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "project_admin_matches_target_domain_role", "description": "project_admin_matches_target_domain_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "list_domain_roles", "description": "list_domain_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_matches_filter_on_list_domain_roles", "description": "domain_admin_matches_filter_on_list_domain_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "project_admin_matches_filter_on_list_domain_roles", "description": "project_admin_matches_filter_on_list_domain_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_and_matching_prior_role_domain_id", "description": "admin_and_matching_prior_role_domain_id action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "implied_role_matches_prior_role_domain_or_global", "description": "implied_role_matches_prior_role_domain_or_global action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_implied_role", "description": "identity:get_implied_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_implied_roles", "description": "identity:list_implied_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_implied_role", "description": "identity:create_implied_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_implied_role", "description": "identity:delete_implied_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_role_inference_rules", "description": "identity:list_role_inference_rules action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_implied_role", "description": "identity:check_implied_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_system_grants_for_user", "description": "identity:list_system_grants_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_system_grant_for_user", "description": "identity:check_system_grant_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_system_grant_for_user", "description": "identity:create_system_grant_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:revoke_system_grant_for_user", "description": "identity:revoke_system_grant_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_system_grants_for_group", "description": "identity:list_system_grants_for_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_system_grant_for_group", "description": "identity:check_system_grant_for_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_system_grant_for_group", "description": "identity:create_system_grant_for_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:revoke_system_grant_for_group", "description": "identity:revoke_system_grant_for_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_grant", "description": "identity:check_grant action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_grants", "description": "identity:list_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_grant", "description": "identity:create_grant action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:revoke_grant", "description": "identity:revoke_grant action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_for_grants", "description": "domain_admin_for_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_for_global_role_grants", "description": "domain_admin_for_global_role_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_for_domain_role_grants", "description": "domain_admin_for_domain_role_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_grant_match", "description": "domain_admin_grant_match action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "project_admin_for_grants", "description": "project_admin_for_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "project_admin_for_global_role_grants", "description": "project_admin_for_global_role_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "project_admin_for_domain_role_grants", "description": "project_admin_for_domain_role_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "domain_admin_for_list_grants", "description": "domain_admin_for_list_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "project_admin_for_list_grants", "description": "project_admin_for_list_grants action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_on_domain_filter", "description": "admin_on_domain_filter action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_on_project_filter", "description": "admin_on_project_filter action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "admin_on_domain_of_project_filter", "description": "admin_on_domain_of_project_filter action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_role_assignments", "description": "identity:list_role_assignments action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_role_assignments_for_tree", "description": "identity:list_role_assignments_for_tree action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_policy", "description": "identity:get_policy action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_policies", "description": "identity:list_policies action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_policy", "description": "identity:create_policy action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_policy", "description": "identity:update_policy action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_policy", "description": "identity:delete_policy action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_token", "description": "identity:check_token action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:validate_token", "description": "identity:validate_token action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:validate_token_head", "description": "identity:validate_token_head action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:revocation_list", "description": "identity:revocation_list action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:revoke_token", "description": "identity:revoke_token action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_trust", "description": "identity:create_trust action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_trusts", "description": "identity:list_trusts action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_roles_for_trust", "description": "identity:list_roles_for_trust action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_role_for_trust", "description": "identity:get_role_for_trust action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_trust", "description": "identity:delete_trust action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_trust", "description": "identity:get_trust action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_consumer", "description": "identity:create_consumer action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_consumer", "description": "identity:get_consumer action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_consumers", "description": "identity:list_consumers action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_consumer", "description": "identity:delete_consumer action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_consumer", "description": "identity:update_consumer action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:authorize_request_token", "description": "identity:authorize_request_token action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_access_token_roles", "description": "identity:list_access_token_roles action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_access_token_role", "description": "identity:get_access_token_role action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_access_tokens", "description": "identity:list_access_tokens action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_access_token", "description": "identity:get_access_token action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_access_token", "description": "identity:delete_access_token action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_projects_for_endpoint", "description": "identity:list_projects_for_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:add_endpoint_to_project", "description": "identity:add_endpoint_to_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_endpoint_in_project", "description": "identity:check_endpoint_in_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_endpoints_for_project", "description": "identity:list_endpoints_for_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:remove_endpoint_from_project", "description": "identity:remove_endpoint_from_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_endpoint_group", "description": "identity:create_endpoint_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_endpoint_groups", "description": "identity:list_endpoint_groups action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_endpoint_group", "description": "identity:get_endpoint_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_endpoint_group", "description": "identity:update_endpoint_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_endpoint_group", "description": "identity:delete_endpoint_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_projects_associated_with_endpoint_group", "description": "identity:list_projects_associated_with_endpoint_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_endpoints_associated_with_endpoint_group", "description": "identity:list_endpoints_associated_with_endpoint_group action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_endpoint_group_in_project", "description": "identity:get_endpoint_group_in_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_endpoint_groups_for_project", "description": "identity:list_endpoint_groups_for_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:add_endpoint_group_to_project", "description": "identity:add_endpoint_group_to_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:remove_endpoint_group_from_project", "description": "identity:remove_endpoint_group_from_project action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_identity_provider", "description": "identity:create_identity_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_identity_providers", "description": "identity:list_identity_providers action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_identity_provider", "description": "identity:get_identity_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_identity_provider", "description": "identity:update_identity_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_identity_provider", "description": "identity:delete_identity_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_protocol", "description": "identity:create_protocol action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_protocol", "description": "identity:update_protocol action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_protocol", "description": "identity:get_protocol action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_protocols", "description": "identity:list_protocols action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_protocol", "description": "identity:delete_protocol action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_mapping", "description": "identity:create_mapping action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_mapping", "description": "identity:get_mapping action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_mappings", "description": "identity:list_mappings action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_mapping", "description": "identity:delete_mapping action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_mapping", "description": "identity:update_mapping action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_service_provider", "description": "identity:create_service_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_service_providers", "description": "identity:list_service_providers action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_service_provider", "description": "identity:get_service_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_service_provider", "description": "identity:update_service_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_service_provider", "description": "identity:delete_service_provider action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_auth_catalog", "description": "identity:get_auth_catalog action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_auth_projects", "description": "identity:get_auth_projects action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_auth_domains", "description": "identity:get_auth_domains action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_auth_system", "description": "identity:get_auth_system action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_projects_for_user", "description": "identity:list_projects_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_domains_for_user", "description": "identity:list_domains_for_user action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_revoke_events", "description": "identity:list_revoke_events action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_policy_association_for_endpoint", "description": "identity:create_policy_association_for_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_policy_association_for_endpoint", "description": "identity:check_policy_association_for_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_policy_association_for_endpoint", "description": "identity:delete_policy_association_for_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_policy_association_for_service", "description": "identity:create_policy_association_for_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_policy_association_for_service", "description": "identity:check_policy_association_for_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_policy_association_for_service", "description": "identity:delete_policy_association_for_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_policy_association_for_region_and_service", "description": "identity:create_policy_association_for_region_and_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:check_policy_association_for_region_and_service", "description": "identity:check_policy_association_for_region_and_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_policy_association_for_region_and_service", "description": "identity:delete_policy_association_for_region_and_service action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_policy_for_endpoint", "description": "identity:get_policy_for_endpoint action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_endpoints_for_policy", "description": "identity:list_endpoints_for_policy action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_domain_config", "description": "identity:create_domain_config action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_domain_config", "description": "identity:get_domain_config action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_security_compliance_domain_config", "description": "identity:get_security_compliance_domain_config action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:update_domain_config", "description": "identity:update_domain_config action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_domain_config", "description": "identity:delete_domain_config action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_domain_config_default", "description": "identity:get_domain_config_default action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:get_application_credential", "description": "identity:get_application_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:list_application_credentials", "description": "identity:list_application_credentials action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:create_application_credential", "description": "identity:create_application_credential action for keystone", "policies": [], "category": {"name": "action_id"}}, {"name": "identity:delete_application_credential", "description": "identity:delete_application_credential action for keystone", "policies": [], "category": {"name": "action_id"}}], "action_assignments": [{"action": {"name": "add_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_image"}]}, {"action": {"name": "delete_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "delete_image"}]}, {"action": {"name": "get_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_image"}]}, {"action": {"name": "get_images"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_images"}]}, {"action": {"name": "modify_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_image"}]}, {"action": {"name": "publicize_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "publicize_image"}]}, {"action": {"name": "communitize_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "communitize_image"}]}, {"action": {"name": "copy_from"}, "category": {"name": "action_id"}, "assignments": [{"name": "copy_from"}]}, {"action": {"name": "download_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "download_image"}]}, {"action": {"name": "upload_image"}, "category": {"name": "action_id"}, "assignments": [{"name": "upload_image"}]}, {"action": {"name": "delete_image_location"}, "category": {"name": "action_id"}, "assignments": [{"name": "delete_image_location"}]}, {"action": {"name": "get_image_location"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_image_location"}]}, {"action": {"name": "set_image_location"}, "category": {"name": "action_id"}, "assignments": [{"name": "set_image_location"}]}, {"action": {"name": "add_member"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_member"}]}, {"action": {"name": "delete_member"}, "category": {"name": "action_id"}, "assignments": [{"name": "delete_member"}]}, {"action": {"name": "get_member"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_member"}]}, {"action": {"name": "get_members"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_members"}]}, {"action": {"name": "modify_member"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_member"}]}, {"action": {"name": "manage_image_cache"}, "category": {"name": "action_id"}, "assignments": [{"name": "manage_image_cache"}]}, {"action": {"name": "get_task"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_task"}]}, {"action": {"name": "get_tasks"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_tasks"}]}, {"action": {"name": "add_task"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_task"}]}, {"action": {"name": "modify_task"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_task"}]}, {"action": {"name": "tasks_api_access"}, "category": {"name": "action_id"}, "assignments": [{"name": "tasks_api_access"}]}, {"action": {"name": "deactivate"}, "category": {"name": "action_id"}, "assignments": [{"name": "deactivate"}]}, {"action": {"name": "reactivate"}, "category": {"name": "action_id"}, "assignments": [{"name": "reactivate"}]}, {"action": {"name": "get_metadef_namespace"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_namespace"}]}, {"action": {"name": "get_metadef_namespaces"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_namespaces"}]}, {"action": {"name": "modify_metadef_namespace"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_metadef_namespace"}]}, {"action": {"name": "add_metadef_namespace"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_metadef_namespace"}]}, {"action": {"name": "get_metadef_object"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_object"}]}, {"action": {"name": "get_metadef_objects"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_objects"}]}, {"action": {"name": "modify_metadef_object"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_metadef_object"}]}, {"action": {"name": "add_metadef_object"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_metadef_object"}]}, {"action": {"name": "list_metadef_resource_types"}, "category": {"name": "action_id"}, "assignments": [{"name": "list_metadef_resource_types"}]}, {"action": {"name": "get_metadef_resource_type"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_resource_type"}]}, {"action": {"name": "add_metadef_resource_type_association"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_metadef_resource_type_association"}]}, {"action": {"name": "get_metadef_property"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_property"}]}, {"action": {"name": "get_metadef_properties"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_properties"}]}, {"action": {"name": "modify_metadef_property"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_metadef_property"}]}, {"action": {"name": "add_metadef_property"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_metadef_property"}]}, {"action": {"name": "get_metadef_tag"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_tag"}]}, {"action": {"name": "get_metadef_tags"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_metadef_tags"}]}, {"action": {"name": "modify_metadef_tag"}, "category": {"name": "action_id"}, "assignments": [{"name": "modify_metadef_tag"}]}, {"action": {"name": "add_metadef_tag"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_metadef_tag"}]}, {"action": {"name": "add_metadef_tags"}, "category": {"name": "action_id"}, "assignments": [{"name": "add_metadef_tags"}]}, {"action": {"name": "identity:get_region"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_region"}]}, {"action": {"name": "identity:list_regions"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_regions"}]}, {"action": {"name": "identity:create_region"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_region"}]}, {"action": {"name": "identity:update_region"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_region"}]}, {"action": {"name": "identity:delete_region"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_region"}]}, {"action": {"name": "identity:get_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_service"}]}, {"action": {"name": "identity:list_services"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_services"}]}, {"action": {"name": "identity:create_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_service"}]}, {"action": {"name": "identity:update_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_service"}]}, {"action": {"name": "identity:delete_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_service"}]}, {"action": {"name": "identity:get_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_endpoint"}]}, {"action": {"name": "identity:list_endpoints"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_endpoints"}]}, {"action": {"name": "identity:create_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_endpoint"}]}, {"action": {"name": "identity:update_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_endpoint"}]}, {"action": {"name": "identity:delete_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_endpoint"}]}, {"action": {"name": "identity:get_registered_limit"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_registered_limit"}]}, {"action": {"name": "identity:list_registered_limits"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_registered_limits"}]}, {"action": {"name": "identity:create_registered_limits"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_registered_limits"}]}, {"action": {"name": "identity:update_registered_limits"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_registered_limits"}]}, {"action": {"name": "identity:delete_registered_limit"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_registered_limit"}]}, {"action": {"name": "identity:get_limit"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_limit"}]}, {"action": {"name": "identity:list_limits"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_limits"}]}, {"action": {"name": "identity:create_limits"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_limits"}]}, {"action": {"name": "identity:update_limits"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_limits"}]}, {"action": {"name": "identity:delete_limit"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_limit"}]}, {"action": {"name": "identity:get_domain"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_domain"}]}, {"action": {"name": "identity:list_domains"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_domains"}]}, {"action": {"name": "identity:create_domain"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_domain"}]}, {"action": {"name": "identity:update_domain"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_domain"}]}, {"action": {"name": "identity:delete_domain"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_domain"}]}, {"action": {"name": "admin_and_matching_target_project_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_target_project_domain_id"}]}, {"action": {"name": "admin_and_matching_project_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_project_domain_id"}]}, {"action": {"name": "identity:get_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_project"}]}, {"action": {"name": "identity:list_projects"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_projects"}]}, {"action": {"name": "identity:list_user_projects"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_user_projects"}]}, {"action": {"name": "identity:create_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_project"}]}, {"action": {"name": "identity:update_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_project"}]}, {"action": {"name": "identity:delete_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_project"}]}, {"action": {"name": "identity:create_project_tag"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_project_tag"}]}, {"action": {"name": "identity:delete_project_tag"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_project_tag"}]}, {"action": {"name": "identity:get_project_tag"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_project_tag"}]}, {"action": {"name": "identity:list_project_tags"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_project_tags"}]}, {"action": {"name": "identity:delete_project_tags"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_project_tags"}]}, {"action": {"name": "identity:update_project_tags"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_project_tags"}]}, {"action": {"name": "admin_and_matching_target_user_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_target_user_domain_id"}]}, {"action": {"name": "admin_and_matching_user_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_user_domain_id"}]}, {"action": {"name": "identity:get_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_user"}]}, {"action": {"name": "identity:list_users"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_users"}]}, {"action": {"name": "identity:create_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_user"}]}, {"action": {"name": "identity:update_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_user"}]}, {"action": {"name": "identity:delete_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_user"}]}, {"action": {"name": "admin_and_matching_target_group_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_target_group_domain_id"}]}, {"action": {"name": "admin_and_matching_group_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_group_domain_id"}]}, {"action": {"name": "identity:get_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_group"}]}, {"action": {"name": "identity:list_groups"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_groups"}]}, {"action": {"name": "identity:list_groups_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_groups_for_user"}]}, {"action": {"name": "identity:create_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_group"}]}, {"action": {"name": "identity:update_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_group"}]}, {"action": {"name": "identity:delete_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_group"}]}, {"action": {"name": "identity:list_users_in_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_users_in_group"}]}, {"action": {"name": "identity:remove_user_from_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:remove_user_from_group"}]}, {"action": {"name": "identity:check_user_in_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_user_in_group"}]}, {"action": {"name": "identity:add_user_to_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:add_user_to_group"}]}, {"action": {"name": "identity:get_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_credential"}]}, {"action": {"name": "identity:list_credentials"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_credentials"}]}, {"action": {"name": "identity:create_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_credential"}]}, {"action": {"name": "identity:update_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_credential"}]}, {"action": {"name": "identity:delete_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_credential"}]}, {"action": {"name": "identity:ec2_get_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:ec2_get_credential"}]}, {"action": {"name": "identity:ec2_list_credentials"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:ec2_list_credentials"}]}, {"action": {"name": "identity:ec2_create_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:ec2_create_credential"}]}, {"action": {"name": "identity:ec2_delete_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:ec2_delete_credential"}]}, {"action": {"name": "identity:get_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_role"}]}, {"action": {"name": "identity:list_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_roles"}]}, {"action": {"name": "identity:create_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_role"}]}, {"action": {"name": "identity:update_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_role"}]}, {"action": {"name": "identity:delete_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_role"}]}, {"action": {"name": "identity:get_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_domain_role"}]}, {"action": {"name": "identity:list_domain_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_domain_roles"}]}, {"action": {"name": "identity:create_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_domain_role"}]}, {"action": {"name": "identity:update_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_domain_role"}]}, {"action": {"name": "identity:delete_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_domain_role"}]}, {"action": {"name": "domain_admin_matches_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_matches_domain_role"}]}, {"action": {"name": "get_domain_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "get_domain_roles"}]}, {"action": {"name": "domain_admin_matches_target_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_matches_target_domain_role"}]}, {"action": {"name": "project_admin_matches_target_domain_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "project_admin_matches_target_domain_role"}]}, {"action": {"name": "list_domain_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "list_domain_roles"}]}, {"action": {"name": "domain_admin_matches_filter_on_list_domain_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_matches_filter_on_list_domain_roles"}]}, {"action": {"name": "project_admin_matches_filter_on_list_domain_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "project_admin_matches_filter_on_list_domain_roles"}]}, {"action": {"name": "admin_and_matching_prior_role_domain_id"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_and_matching_prior_role_domain_id"}]}, {"action": {"name": "implied_role_matches_prior_role_domain_or_global"}, "category": {"name": "action_id"}, "assignments": [{"name": "implied_role_matches_prior_role_domain_or_global"}]}, {"action": {"name": "identity:get_implied_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_implied_role"}]}, {"action": {"name": "identity:list_implied_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_implied_roles"}]}, {"action": {"name": "identity:create_implied_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_implied_role"}]}, {"action": {"name": "identity:delete_implied_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_implied_role"}]}, {"action": {"name": "identity:list_role_inference_rules"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_role_inference_rules"}]}, {"action": {"name": "identity:check_implied_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_implied_role"}]}, {"action": {"name": "identity:list_system_grants_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_system_grants_for_user"}]}, {"action": {"name": "identity:check_system_grant_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_system_grant_for_user"}]}, {"action": {"name": "identity:create_system_grant_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_system_grant_for_user"}]}, {"action": {"name": "identity:revoke_system_grant_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:revoke_system_grant_for_user"}]}, {"action": {"name": "identity:list_system_grants_for_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_system_grants_for_group"}]}, {"action": {"name": "identity:check_system_grant_for_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_system_grant_for_group"}]}, {"action": {"name": "identity:create_system_grant_for_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_system_grant_for_group"}]}, {"action": {"name": "identity:revoke_system_grant_for_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:revoke_system_grant_for_group"}]}, {"action": {"name": "identity:check_grant"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_grant"}]}, {"action": {"name": "identity:list_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_grants"}]}, {"action": {"name": "identity:create_grant"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_grant"}]}, {"action": {"name": "identity:revoke_grant"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:revoke_grant"}]}, {"action": {"name": "domain_admin_for_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_for_grants"}]}, {"action": {"name": "domain_admin_for_global_role_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_for_global_role_grants"}]}, {"action": {"name": "domain_admin_for_domain_role_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_for_domain_role_grants"}]}, {"action": {"name": "domain_admin_grant_match"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_grant_match"}]}, {"action": {"name": "project_admin_for_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "project_admin_for_grants"}]}, {"action": {"name": "project_admin_for_global_role_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "project_admin_for_global_role_grants"}]}, {"action": {"name": "project_admin_for_domain_role_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "project_admin_for_domain_role_grants"}]}, {"action": {"name": "domain_admin_for_list_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "domain_admin_for_list_grants"}]}, {"action": {"name": "project_admin_for_list_grants"}, "category": {"name": "action_id"}, "assignments": [{"name": "project_admin_for_list_grants"}]}, {"action": {"name": "admin_on_domain_filter"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_on_domain_filter"}]}, {"action": {"name": "admin_on_project_filter"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_on_project_filter"}]}, {"action": {"name": "admin_on_domain_of_project_filter"}, "category": {"name": "action_id"}, "assignments": [{"name": "admin_on_domain_of_project_filter"}]}, {"action": {"name": "identity:list_role_assignments"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_role_assignments"}]}, {"action": {"name": "identity:list_role_assignments_for_tree"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_role_assignments_for_tree"}]}, {"action": {"name": "identity:get_policy"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_policy"}]}, {"action": {"name": "identity:list_policies"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_policies"}]}, {"action": {"name": "identity:create_policy"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_policy"}]}, {"action": {"name": "identity:update_policy"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_policy"}]}, {"action": {"name": "identity:delete_policy"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_policy"}]}, {"action": {"name": "identity:check_token"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_token"}]}, {"action": {"name": "identity:validate_token"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:validate_token"}]}, {"action": {"name": "identity:validate_token_head"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:validate_token_head"}]}, {"action": {"name": "identity:revocation_list"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:revocation_list"}]}, {"action": {"name": "identity:revoke_token"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:revoke_token"}]}, {"action": {"name": "identity:create_trust"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_trust"}]}, {"action": {"name": "identity:list_trusts"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_trusts"}]}, {"action": {"name": "identity:list_roles_for_trust"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_roles_for_trust"}]}, {"action": {"name": "identity:get_role_for_trust"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_role_for_trust"}]}, {"action": {"name": "identity:delete_trust"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_trust"}]}, {"action": {"name": "identity:get_trust"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_trust"}]}, {"action": {"name": "identity:create_consumer"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_consumer"}]}, {"action": {"name": "identity:get_consumer"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_consumer"}]}, {"action": {"name": "identity:list_consumers"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_consumers"}]}, {"action": {"name": "identity:delete_consumer"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_consumer"}]}, {"action": {"name": "identity:update_consumer"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_consumer"}]}, {"action": {"name": "identity:authorize_request_token"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:authorize_request_token"}]}, {"action": {"name": "identity:list_access_token_roles"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_access_token_roles"}]}, {"action": {"name": "identity:get_access_token_role"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_access_token_role"}]}, {"action": {"name": "identity:list_access_tokens"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_access_tokens"}]}, {"action": {"name": "identity:get_access_token"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_access_token"}]}, {"action": {"name": "identity:delete_access_token"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_access_token"}]}, {"action": {"name": "identity:list_projects_for_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_projects_for_endpoint"}]}, {"action": {"name": "identity:add_endpoint_to_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:add_endpoint_to_project"}]}, {"action": {"name": "identity:check_endpoint_in_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_endpoint_in_project"}]}, {"action": {"name": "identity:list_endpoints_for_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_endpoints_for_project"}]}, {"action": {"name": "identity:remove_endpoint_from_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:remove_endpoint_from_project"}]}, {"action": {"name": "identity:create_endpoint_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_endpoint_group"}]}, {"action": {"name": "identity:list_endpoint_groups"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_endpoint_groups"}]}, {"action": {"name": "identity:get_endpoint_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_endpoint_group"}]}, {"action": {"name": "identity:update_endpoint_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_endpoint_group"}]}, {"action": {"name": "identity:delete_endpoint_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_endpoint_group"}]}, {"action": {"name": "identity:list_projects_associated_with_endpoint_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_projects_associated_with_endpoint_group"}]}, {"action": {"name": "identity:list_endpoints_associated_with_endpoint_group"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_endpoints_associated_with_endpoint_group"}]}, {"action": {"name": "identity:get_endpoint_group_in_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_endpoint_group_in_project"}]}, {"action": {"name": "identity:list_endpoint_groups_for_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_endpoint_groups_for_project"}]}, {"action": {"name": "identity:add_endpoint_group_to_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:add_endpoint_group_to_project"}]}, {"action": {"name": "identity:remove_endpoint_group_from_project"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:remove_endpoint_group_from_project"}]}, {"action": {"name": "identity:create_identity_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_identity_provider"}]}, {"action": {"name": "identity:list_identity_providers"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_identity_providers"}]}, {"action": {"name": "identity:get_identity_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_identity_provider"}]}, {"action": {"name": "identity:update_identity_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_identity_provider"}]}, {"action": {"name": "identity:delete_identity_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_identity_provider"}]}, {"action": {"name": "identity:create_protocol"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_protocol"}]}, {"action": {"name": "identity:update_protocol"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_protocol"}]}, {"action": {"name": "identity:get_protocol"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_protocol"}]}, {"action": {"name": "identity:list_protocols"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_protocols"}]}, {"action": {"name": "identity:delete_protocol"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_protocol"}]}, {"action": {"name": "identity:create_mapping"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_mapping"}]}, {"action": {"name": "identity:get_mapping"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_mapping"}]}, {"action": {"name": "identity:list_mappings"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_mappings"}]}, {"action": {"name": "identity:delete_mapping"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_mapping"}]}, {"action": {"name": "identity:update_mapping"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_mapping"}]}, {"action": {"name": "identity:create_service_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_service_provider"}]}, {"action": {"name": "identity:list_service_providers"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_service_providers"}]}, {"action": {"name": "identity:get_service_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_service_provider"}]}, {"action": {"name": "identity:update_service_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_service_provider"}]}, {"action": {"name": "identity:delete_service_provider"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_service_provider"}]}, {"action": {"name": "identity:get_auth_catalog"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_auth_catalog"}]}, {"action": {"name": "identity:get_auth_projects"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_auth_projects"}]}, {"action": {"name": "identity:get_auth_domains"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_auth_domains"}]}, {"action": {"name": "identity:get_auth_system"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_auth_system"}]}, {"action": {"name": "identity:list_projects_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_projects_for_user"}]}, {"action": {"name": "identity:list_domains_for_user"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_domains_for_user"}]}, {"action": {"name": "identity:list_revoke_events"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_revoke_events"}]}, {"action": {"name": "identity:create_policy_association_for_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_policy_association_for_endpoint"}]}, {"action": {"name": "identity:check_policy_association_for_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_policy_association_for_endpoint"}]}, {"action": {"name": "identity:delete_policy_association_for_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_policy_association_for_endpoint"}]}, {"action": {"name": "identity:create_policy_association_for_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_policy_association_for_service"}]}, {"action": {"name": "identity:check_policy_association_for_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_policy_association_for_service"}]}, {"action": {"name": "identity:delete_policy_association_for_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_policy_association_for_service"}]}, {"action": {"name": "identity:create_policy_association_for_region_and_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_policy_association_for_region_and_service"}]}, {"action": {"name": "identity:check_policy_association_for_region_and_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:check_policy_association_for_region_and_service"}]}, {"action": {"name": "identity:delete_policy_association_for_region_and_service"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_policy_association_for_region_and_service"}]}, {"action": {"name": "identity:get_policy_for_endpoint"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_policy_for_endpoint"}]}, {"action": {"name": "identity:list_endpoints_for_policy"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_endpoints_for_policy"}]}, {"action": {"name": "identity:create_domain_config"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_domain_config"}]}, {"action": {"name": "identity:get_domain_config"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_domain_config"}]}, {"action": {"name": "identity:get_security_compliance_domain_config"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_security_compliance_domain_config"}]}, {"action": {"name": "identity:update_domain_config"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:update_domain_config"}]}, {"action": {"name": "identity:delete_domain_config"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_domain_config"}]}, {"action": {"name": "identity:get_domain_config_default"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_domain_config_default"}]}, {"action": {"name": "identity:get_application_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:get_application_credential"}]}, {"action": {"name": "identity:list_application_credentials"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:list_application_credentials"}]}, {"action": {"name": "identity:create_application_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:create_application_credential"}]}, {"action": {"name": "identity:delete_application_credential"}, "category": {"name": "action_id"}, "assignments": [{"name": "identity:delete_application_credential"}]}], "meta_rules": [{"name": "rbac", "description": "", "subject_categories": [{"name": "role"}], "object_categories": [{"name": "id"}], "action_categories": [{"name": "action_id"}]}], "rules": [{"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "delete_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_images"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "publicize_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "communitize_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "copy_from"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "download_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "upload_image"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "delete_image_location"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_image_location"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "set_image_location"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_member"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "delete_member"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_member"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_members"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_member"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "manage_image_cache"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_task"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_tasks"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_task"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_task"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "tasks_api_access"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "deactivate"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "reactivate"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_namespace"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_namespaces"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_metadef_namespace"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_metadef_namespace"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_object"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_objects"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_metadef_object"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_metadef_object"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "list_metadef_resource_types"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_resource_type"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_metadef_resource_type_association"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_property"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_properties"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_metadef_property"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_metadef_property"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_tag"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_metadef_tags"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "modify_metadef_tag"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_metadef_tag"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "add_metadef_tags"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_region"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_regions"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_region"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_region"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_region"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_services"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_endpoints"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_registered_limit"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_registered_limits"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_registered_limits"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_registered_limits"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_registered_limit"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_limit"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_limits"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_limits"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_limits"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_limit"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_domain"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_domains"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_domain"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_domain"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_domain"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_target_project_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_project_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_projects"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_user_projects"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_project_tag"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_project_tag"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_project_tag"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_project_tags"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_project_tags"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_project_tags"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_target_user_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_user_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_users"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_target_group_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_group_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_groups"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_groups_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_users_in_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:remove_user_from_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_user_in_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:add_user_to_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_credentials"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:ec2_get_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:ec2_list_credentials"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:ec2_create_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:ec2_delete_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_domain_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_matches_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "get_domain_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_matches_target_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "project_admin_matches_target_domain_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "list_domain_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_matches_filter_on_list_domain_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "project_admin_matches_filter_on_list_domain_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_and_matching_prior_role_domain_id"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "implied_role_matches_prior_role_domain_or_global"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_implied_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_implied_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_implied_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_implied_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_role_inference_rules"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_implied_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_system_grants_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_system_grant_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_system_grant_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:revoke_system_grant_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_system_grants_for_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_system_grant_for_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_system_grant_for_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:revoke_system_grant_for_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_grant"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_grant"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:revoke_grant"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_for_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_for_global_role_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_for_domain_role_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_grant_match"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "project_admin_for_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "project_admin_for_global_role_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "project_admin_for_domain_role_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "domain_admin_for_list_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "project_admin_for_list_grants"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_on_domain_filter"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_on_project_filter"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "admin_on_domain_of_project_filter"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_role_assignments"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_role_assignments_for_tree"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_policy"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_policies"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_policy"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_policy"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_policy"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_token"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:validate_token"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:validate_token_head"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:revocation_list"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:revoke_token"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_trust"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_trusts"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_roles_for_trust"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_role_for_trust"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_trust"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_trust"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_consumer"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_consumer"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_consumers"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_consumer"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_consumer"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:authorize_request_token"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_access_token_roles"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_access_token_role"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_access_tokens"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_access_token"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_access_token"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_projects_for_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:add_endpoint_to_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_endpoint_in_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_endpoints_for_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:remove_endpoint_from_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_endpoint_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_endpoint_groups"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_endpoint_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_endpoint_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_endpoint_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_projects_associated_with_endpoint_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_endpoints_associated_with_endpoint_group"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_endpoint_group_in_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_endpoint_groups_for_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:add_endpoint_group_to_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:remove_endpoint_group_from_project"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_identity_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_identity_providers"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_identity_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_identity_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_identity_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_protocol"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_protocol"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_protocol"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_protocols"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_protocol"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_mapping"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_mapping"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_mappings"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_mapping"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_mapping"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_service_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_service_providers"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_service_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_service_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_service_provider"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_auth_catalog"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_auth_projects"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_auth_domains"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_auth_system"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_projects_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_domains_for_user"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_revoke_events"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_policy_association_for_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_policy_association_for_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_policy_association_for_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_policy_association_for_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_policy_association_for_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_policy_association_for_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_policy_association_for_region_and_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:check_policy_association_for_region_and_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_policy_association_for_region_and_service"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_policy_for_endpoint"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_endpoints_for_policy"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_domain_config"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_domain_config"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_security_compliance_domain_config"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:update_domain_config"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_domain_config"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_domain_config_default"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:get_application_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:list_application_credentials"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:create_application_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}, {"meta_rule": {"name": "rbac"}, "rule": {"subject_data": [{"name": "admin"}], "object_data": [{"name": "all_vm"}], "action_data": [{"name": "identity:delete_application_credential"}]}, "policy": {"name": "OpenStack RBAC Policy"}, "instructions": [{"decision": "grant"}], "enabled": true}]} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/opst_rbac_nova.json b/moon_engine/tests/func_policies/opst_rbac_nova.json
new file mode 100644
index 00000000..2d5b9016
--- /dev/null
+++ b/moon_engine/tests/func_policies/opst_rbac_nova.json
@@ -0,0 +1,27158 @@
+{
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy",
+ "genre": "authz",
+ "description": "A RBAC policy similar of what you can find through policy.json files",
+ "model": {
+ "name": "OPST_RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "OPST_RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "a role in OpenStack"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "the admin role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "member",
+ "description": "the member role",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {
+ "name": "admin"
+ },
+ "category": {
+ "name": "role"
+ },
+ "assignments": [
+ {
+ "name": "admin"
+ },
+ {
+ "name": "member"
+ }
+ ]
+ }
+ ],
+ "objects": [
+ {
+ "name": "all_vm",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "the UID of each virtual machine"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm",
+ "description": "represents all virtual machines in this project",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {
+ "name": "all_vm"
+ },
+ "category": {
+ "name": "id"
+ },
+ "assignments": [
+ {
+ "name": "all_vm"
+ }
+ ]
+ }
+ ],
+ "actions": [
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter",
+ "description": "cells_scheduler_filter:TargetCellFilter action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create",
+ "description": "compute:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create:attach_network",
+ "description": "compute:create:attach_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create:attach_volume",
+ "description": "compute:create:attach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:create:forced_host",
+ "description": "compute:create:forced_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get",
+ "description": "compute:get action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all",
+ "description": "compute:get_all action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all_tenants",
+ "description": "compute:get_all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:update",
+ "description": "compute:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_instance_metadata",
+ "description": "compute:get_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all_instance_metadata",
+ "description": "compute:get_all_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_all_instance_system_metadata",
+ "description": "compute:get_all_instance_system_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:update_instance_metadata",
+ "description": "compute:update_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:delete_instance_metadata",
+ "description": "compute:delete_instance_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_instance_faults",
+ "description": "compute:get_instance_faults action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_diagnostics",
+ "description": "compute:get_diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_instance_diagnostics",
+ "description": "compute:get_instance_diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:start",
+ "description": "compute:start action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:stop",
+ "description": "compute:stop action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_lock",
+ "description": "compute:get_lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:lock",
+ "description": "compute:lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unlock",
+ "description": "compute:unlock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unlock_override",
+ "description": "compute:unlock_override action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_vnc_console",
+ "description": "compute:get_vnc_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_spice_console",
+ "description": "compute:get_spice_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_rdp_console",
+ "description": "compute:get_rdp_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_serial_console",
+ "description": "compute:get_serial_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_mks_console",
+ "description": "compute:get_mks_console action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:get_console_output",
+ "description": "compute:get_console_output action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:reset_network",
+ "description": "compute:reset_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:inject_network_info",
+ "description": "compute:inject_network_info action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:add_fixed_ip",
+ "description": "compute:add_fixed_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:remove_fixed_ip",
+ "description": "compute:remove_fixed_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:attach_volume",
+ "description": "compute:attach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:detach_volume",
+ "description": "compute:detach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:swap_volume",
+ "description": "compute:swap_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:attach_interface",
+ "description": "compute:attach_interface action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:detach_interface",
+ "description": "compute:detach_interface action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:set_admin_password",
+ "description": "compute:set_admin_password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:rescue",
+ "description": "compute:rescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unrescue",
+ "description": "compute:unrescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:suspend",
+ "description": "compute:suspend action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:resume",
+ "description": "compute:resume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:pause",
+ "description": "compute:pause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unpause",
+ "description": "compute:unpause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:shelve",
+ "description": "compute:shelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:shelve_offload",
+ "description": "compute:shelve_offload action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:unshelve",
+ "description": "compute:unshelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:snapshot",
+ "description": "compute:snapshot action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:snapshot_volume_backed",
+ "description": "compute:snapshot_volume_backed action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:backup",
+ "description": "compute:backup action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:resize",
+ "description": "compute:resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:confirm_resize",
+ "description": "compute:confirm_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:revert_resize",
+ "description": "compute:revert_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:rebuild",
+ "description": "compute:rebuild action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:reboot",
+ "description": "compute:reboot action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:delete",
+ "description": "compute:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:soft_delete",
+ "description": "compute:soft_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:force_delete",
+ "description": "compute:force_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:security_groups:add_to_instance",
+ "description": "compute:security_groups:add_to_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:security_groups:remove_from_instance",
+ "description": "compute:security_groups:remove_from_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:restore",
+ "description": "compute:restore action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:volume_snapshot_create",
+ "description": "compute:volume_snapshot_create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute:volume_snapshot_delete",
+ "description": "compute:volume_snapshot_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:accounts",
+ "description": "compute_extension:accounts action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions",
+ "description": "compute_extension:admin_actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:pause",
+ "description": "compute_extension:admin_actions:pause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:unpause",
+ "description": "compute_extension:admin_actions:unpause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:suspend",
+ "description": "compute_extension:admin_actions:suspend action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:resume",
+ "description": "compute_extension:admin_actions:resume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:lock",
+ "description": "compute_extension:admin_actions:lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:unlock",
+ "description": "compute_extension:admin_actions:unlock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:resetNetwork",
+ "description": "compute_extension:admin_actions:resetNetwork action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo",
+ "description": "compute_extension:admin_actions:injectNetworkInfo action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:createBackup",
+ "description": "compute_extension:admin_actions:createBackup action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:migrateLive",
+ "description": "compute_extension:admin_actions:migrateLive action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:resetState",
+ "description": "compute_extension:admin_actions:resetState action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:admin_actions:migrate",
+ "description": "compute_extension:admin_actions:migrate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:aggregates",
+ "description": "compute_extension:aggregates action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:agents",
+ "description": "compute_extension:agents action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:attach_interfaces",
+ "description": "compute_extension:attach_interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:baremetal_nodes",
+ "description": "compute_extension:baremetal_nodes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells",
+ "description": "compute_extension:cells action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:create",
+ "description": "compute_extension:cells:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:delete",
+ "description": "compute_extension:cells:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:update",
+ "description": "compute_extension:cells:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cells:sync_instances",
+ "description": "compute_extension:cells:sync_instances action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:certificates",
+ "description": "compute_extension:certificates action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cloudpipe",
+ "description": "compute_extension:cloudpipe action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:cloudpipe_update",
+ "description": "compute_extension:cloudpipe_update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:config_drive",
+ "description": "compute_extension:config_drive action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:console_output",
+ "description": "compute_extension:console_output action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:consoles",
+ "description": "compute_extension:consoles action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:createserverext",
+ "description": "compute_extension:createserverext action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:deferred_delete",
+ "description": "compute_extension:deferred_delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:disk_config",
+ "description": "compute_extension:disk_config action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:evacuate",
+ "description": "compute_extension:evacuate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_server_attributes",
+ "description": "compute_extension:extended_server_attributes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_status",
+ "description": "compute_extension:extended_status action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_availability_zone",
+ "description": "compute_extension:extended_availability_zone action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_ips",
+ "description": "compute_extension:extended_ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_ips_mac",
+ "description": "compute_extension:extended_ips_mac action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_vif_net",
+ "description": "compute_extension:extended_vif_net action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:extended_volumes",
+ "description": "compute_extension:extended_volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:fixed_ips",
+ "description": "compute_extension:fixed_ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_access",
+ "description": "compute_extension:flavor_access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess",
+ "description": "compute_extension:flavor_access:addTenantAccess action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess",
+ "description": "compute_extension:flavor_access:removeTenantAccess action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_disabled",
+ "description": "compute_extension:flavor_disabled action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_rxtx",
+ "description": "compute_extension:flavor_rxtx action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavor_swap",
+ "description": "compute_extension:flavor_swap action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextradata",
+ "description": "compute_extension:flavorextradata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:index",
+ "description": "compute_extension:flavorextraspecs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:show",
+ "description": "compute_extension:flavorextraspecs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:create",
+ "description": "compute_extension:flavorextraspecs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:update",
+ "description": "compute_extension:flavorextraspecs:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:delete",
+ "description": "compute_extension:flavorextraspecs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:flavormanage",
+ "description": "compute_extension:flavormanage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ip_dns",
+ "description": "compute_extension:floating_ip_dns action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ip_pools",
+ "description": "compute_extension:floating_ip_pools action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ips",
+ "description": "compute_extension:floating_ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:floating_ips_bulk",
+ "description": "compute_extension:floating_ips_bulk action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:fping",
+ "description": "compute_extension:fping action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:fping:all_tenants",
+ "description": "compute_extension:fping:all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:hide_server_addresses",
+ "description": "compute_extension:hide_server_addresses action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:hosts",
+ "description": "compute_extension:hosts action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:hypervisors",
+ "description": "compute_extension:hypervisors action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:image_size",
+ "description": "compute_extension:image_size action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:instance_actions",
+ "description": "compute_extension:instance_actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:instance_actions:events",
+ "description": "compute_extension:instance_actions:events action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:instance_usage_audit_log",
+ "description": "compute_extension:instance_usage_audit_log action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs",
+ "description": "compute_extension:keypairs action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:index",
+ "description": "compute_extension:keypairs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:show",
+ "description": "compute_extension:keypairs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:create",
+ "description": "compute_extension:keypairs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:keypairs:delete",
+ "description": "compute_extension:keypairs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:multinic",
+ "description": "compute_extension:multinic action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:networks",
+ "description": "compute_extension:networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:networks:view",
+ "description": "compute_extension:networks:view action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:networks_associate",
+ "description": "compute_extension:networks_associate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-tenant-networks",
+ "description": "compute_extension:os-tenant-networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quotas:show",
+ "description": "compute_extension:quotas:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quotas:update",
+ "description": "compute_extension:quotas:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quotas:delete",
+ "description": "compute_extension:quotas:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:quota_classes",
+ "description": "compute_extension:quota_classes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:rescue",
+ "description": "compute_extension:rescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:security_group_default_rules",
+ "description": "compute_extension:security_group_default_rules action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:security_groups",
+ "description": "compute_extension:security_groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_diagnostics",
+ "description": "compute_extension:server_diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_groups",
+ "description": "compute_extension:server_groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_password",
+ "description": "compute_extension:server_password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:server_usage",
+ "description": "compute_extension:server_usage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:services",
+ "description": "compute_extension:services action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:shelve",
+ "description": "compute_extension:shelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:shelveOffload",
+ "description": "compute_extension:shelveOffload action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:show",
+ "description": "compute_extension:simple_tenant_usage:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:list",
+ "description": "compute_extension:simple_tenant_usage:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:unshelve",
+ "description": "compute_extension:unshelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:users",
+ "description": "compute_extension:users action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:virtual_interfaces",
+ "description": "compute_extension:virtual_interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:virtual_storage_arrays",
+ "description": "compute_extension:virtual_storage_arrays action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volumes",
+ "description": "compute_extension:volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:index",
+ "description": "compute_extension:volume_attachments:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:show",
+ "description": "compute_extension:volume_attachments:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:create",
+ "description": "compute_extension:volume_attachments:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:update",
+ "description": "compute_extension:volume_attachments:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volume_attachments:delete",
+ "description": "compute_extension:volume_attachments:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:volumetypes",
+ "description": "compute_extension:volumetypes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:availability_zone:list",
+ "description": "compute_extension:availability_zone:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:availability_zone:detail",
+ "description": "compute_extension:availability_zone:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:used_limits_for_admin",
+ "description": "compute_extension:used_limits_for_admin action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:migrations:index",
+ "description": "compute_extension:migrations:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create",
+ "description": "compute_extension:os-assisted-volume-snapshots:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete",
+ "description": "compute_extension:os-assisted-volume-snapshots:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:console_auth_tokens",
+ "description": "compute_extension:console_auth_tokens action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "compute_extension:os-server-external-events:create",
+ "description": "compute_extension:os-server-external-events:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_all",
+ "description": "network:get_all action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get",
+ "description": "network:get action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:create",
+ "description": "network:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:delete",
+ "description": "network:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:associate",
+ "description": "network:associate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:disassociate",
+ "description": "network:disassociate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_vifs_by_instance",
+ "description": "network:get_vifs_by_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:allocate_for_instance",
+ "description": "network:allocate_for_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:deallocate_for_instance",
+ "description": "network:deallocate_for_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:validate_networks",
+ "description": "network:validate_networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_instance_uuids_by_ip_filter",
+ "description": "network:get_instance_uuids_by_ip_filter action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_instance_id_by_floating_address",
+ "description": "network:get_instance_id_by_floating_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:setup_networks_on_host",
+ "description": "network:setup_networks_on_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_backdoor_port",
+ "description": "network:get_backdoor_port action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ip",
+ "description": "network:get_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ip_pools",
+ "description": "network:get_floating_ip_pools action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ip_by_address",
+ "description": "network:get_floating_ip_by_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ips_by_project",
+ "description": "network:get_floating_ips_by_project action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_floating_ips_by_fixed_address",
+ "description": "network:get_floating_ips_by_fixed_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:allocate_floating_ip",
+ "description": "network:allocate_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:associate_floating_ip",
+ "description": "network:associate_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:disassociate_floating_ip",
+ "description": "network:disassociate_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:release_floating_ip",
+ "description": "network:release_floating_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:migrate_instance_start",
+ "description": "network:migrate_instance_start action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:migrate_instance_finish",
+ "description": "network:migrate_instance_finish action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_fixed_ip",
+ "description": "network:get_fixed_ip action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_fixed_ip_by_address",
+ "description": "network:get_fixed_ip_by_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:add_fixed_ip_to_instance",
+ "description": "network:add_fixed_ip_to_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:remove_fixed_ip_from_instance",
+ "description": "network:remove_fixed_ip_from_instance action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:add_network_to_project",
+ "description": "network:add_network_to_project action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_instance_nw_info",
+ "description": "network:get_instance_nw_info action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_dns_domains",
+ "description": "network:get_dns_domains action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:add_dns_entry",
+ "description": "network:add_dns_entry action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:modify_dns_entry",
+ "description": "network:modify_dns_entry action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:delete_dns_entry",
+ "description": "network:delete_dns_entry action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_dns_entries_by_address",
+ "description": "network:get_dns_entries_by_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_dns_entries_by_name",
+ "description": "network:get_dns_entries_by_name action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:create_private_dns_domain",
+ "description": "network:create_private_dns_domain action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:create_public_dns_domain",
+ "description": "network:create_public_dns_domain action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:delete_dns_domain",
+ "description": "network:delete_dns_domain action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:attach_external_network",
+ "description": "network:attach_external_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "network:get_vif_by_mac_address",
+ "description": "network:get_vif_by_mac_address action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants",
+ "description": "os_compute_api:servers:detail:get_all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants",
+ "description": "os_compute_api:servers:index:get_all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:confirm_resize",
+ "description": "os_compute_api:servers:confirm_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create",
+ "description": "os_compute_api:servers:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_network",
+ "description": "os_compute_api:servers:create:attach_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_volume",
+ "description": "os_compute_api:servers:create:attach_volume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create:forced_host",
+ "description": "os_compute_api:servers:create:forced_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:delete",
+ "description": "os_compute_api:servers:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:update",
+ "description": "os_compute_api:servers:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:detail",
+ "description": "os_compute_api:servers:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:index",
+ "description": "os_compute_api:servers:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:reboot",
+ "description": "os_compute_api:servers:reboot action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:rebuild",
+ "description": "os_compute_api:servers:rebuild action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:resize",
+ "description": "os_compute_api:servers:resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:revert_resize",
+ "description": "os_compute_api:servers:revert_resize action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:show",
+ "description": "os_compute_api:servers:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create_image",
+ "description": "os_compute_api:servers:create_image action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed",
+ "description": "os_compute_api:servers:create_image:allow_volume_backed action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:start",
+ "description": "os_compute_api:servers:start action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:stop",
+ "description": "os_compute_api:servers:stop action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-access-ips:discoverable",
+ "description": "os_compute_api:os-access-ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-access-ips",
+ "description": "os_compute_api:os-access-ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions",
+ "description": "os_compute_api:os-admin-actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable",
+ "description": "os_compute_api:os-admin-actions:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network",
+ "description": "os_compute_api:os-admin-actions:reset_network action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info",
+ "description": "os_compute_api:os-admin-actions:inject_network_info action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state",
+ "description": "os_compute_api:os-admin-actions:reset_state action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-password",
+ "description": "os_compute_api:os-admin-password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-admin-password:discoverable",
+ "description": "os_compute_api:os-admin-password:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:discoverable",
+ "description": "os_compute_api:os-aggregates:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:index",
+ "description": "os_compute_api:os-aggregates:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:create",
+ "description": "os_compute_api:os-aggregates:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:show",
+ "description": "os_compute_api:os-aggregates:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:update",
+ "description": "os_compute_api:os-aggregates:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:delete",
+ "description": "os_compute_api:os-aggregates:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:add_host",
+ "description": "os_compute_api:os-aggregates:add_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:remove_host",
+ "description": "os_compute_api:os-aggregates:remove_host action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata",
+ "description": "os_compute_api:os-aggregates:set_metadata action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-agents",
+ "description": "os_compute_api:os-agents action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-agents:discoverable",
+ "description": "os_compute_api:os-agents:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces",
+ "description": "os_compute_api:os-attach-interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable",
+ "description": "os_compute_api:os-attach-interfaces:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes",
+ "description": "os_compute_api:os-baremetal-nodes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable",
+ "description": "os_compute_api:os-baremetal-nodes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable",
+ "description": "os_compute_api:os-block-device-mapping-v1:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells",
+ "description": "os_compute_api:os-cells action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:create",
+ "description": "os_compute_api:os-cells:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:delete",
+ "description": "os_compute_api:os-cells:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:update",
+ "description": "os_compute_api:os-cells:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:sync_instances",
+ "description": "os_compute_api:os-cells:sync_instances action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cells:discoverable",
+ "description": "os_compute_api:os-cells:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-certificates:create",
+ "description": "os_compute_api:os-certificates:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-certificates:show",
+ "description": "os_compute_api:os-certificates:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-certificates:discoverable",
+ "description": "os_compute_api:os-certificates:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe",
+ "description": "os_compute_api:os-cloudpipe action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable",
+ "description": "os_compute_api:os-cloudpipe:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-config-drive",
+ "description": "os_compute_api:os-config-drive action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:discoverable",
+ "description": "os_compute_api:os-consoles:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:create",
+ "description": "os_compute_api:os-consoles:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:delete",
+ "description": "os_compute_api:os-consoles:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:index",
+ "description": "os_compute_api:os-consoles:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-consoles:show",
+ "description": "os_compute_api:os-consoles:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-console-output:discoverable",
+ "description": "os_compute_api:os-console-output:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-console-output",
+ "description": "os_compute_api:os-console-output action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles",
+ "description": "os_compute_api:os-remote-consoles action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable",
+ "description": "os_compute_api:os-remote-consoles:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-create-backup:discoverable",
+ "description": "os_compute_api:os-create-backup:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-create-backup",
+ "description": "os_compute_api:os-create-backup action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete",
+ "description": "os_compute_api:os-deferred-delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable",
+ "description": "os_compute_api:os-deferred-delete:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-disk-config",
+ "description": "os_compute_api:os-disk-config action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-disk-config:discoverable",
+ "description": "os_compute_api:os-disk-config:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-evacuate",
+ "description": "os_compute_api:os-evacuate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-evacuate:discoverable",
+ "description": "os_compute_api:os-evacuate:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes",
+ "description": "os_compute_api:os-extended-server-attributes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable",
+ "description": "os_compute_api:os-extended-server-attributes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-status",
+ "description": "os_compute_api:os-extended-status action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-status:discoverable",
+ "description": "os_compute_api:os-extended-status:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone",
+ "description": "os_compute_api:os-extended-availability-zone action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable",
+ "description": "os_compute_api:os-extended-availability-zone:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:extensions",
+ "description": "os_compute_api:extensions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:extension_info:discoverable",
+ "description": "os_compute_api:extension_info:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes",
+ "description": "os_compute_api:os-extended-volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable",
+ "description": "os_compute_api:os-extended-volumes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips",
+ "description": "os_compute_api:os-fixed-ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable",
+ "description": "os_compute_api:os-fixed-ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access",
+ "description": "os_compute_api:os-flavor-access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable",
+ "description": "os_compute_api:os-flavor-access:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access",
+ "description": "os_compute_api:os-flavor-access:remove_tenant_access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access",
+ "description": "os_compute_api:os-flavor-access:add_tenant_access action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx",
+ "description": "os_compute_api:os-flavor-rxtx action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable",
+ "description": "os_compute_api:os-flavor-rxtx:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:flavors:discoverable",
+ "description": "os_compute_api:flavors:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable",
+ "description": "os_compute_api:os-flavor-extra-specs:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index",
+ "description": "os_compute_api:os-flavor-extra-specs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show",
+ "description": "os_compute_api:os-flavor-extra-specs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create",
+ "description": "os_compute_api:os-flavor-extra-specs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update",
+ "description": "os_compute_api:os-flavor-extra-specs:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete",
+ "description": "os_compute_api:os-flavor-extra-specs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable",
+ "description": "os_compute_api:os-flavor-manage:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage",
+ "description": "os_compute_api:os-flavor-manage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns",
+ "description": "os_compute_api:os-floating-ip-dns action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable",
+ "description": "os_compute_api:os-floating-ip-dns:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update",
+ "description": "os_compute_api:os-floating-ip-dns:domain:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete",
+ "description": "os_compute_api:os-floating-ip-dns:domain:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools",
+ "description": "os_compute_api:os-floating-ip-pools action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable",
+ "description": "os_compute_api:os-floating-ip-pools:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips",
+ "description": "os_compute_api:os-floating-ips action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable",
+ "description": "os_compute_api:os-floating-ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk",
+ "description": "os_compute_api:os-floating-ips-bulk action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable",
+ "description": "os_compute_api:os-floating-ips-bulk:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fping",
+ "description": "os_compute_api:os-fping action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fping:discoverable",
+ "description": "os_compute_api:os-fping:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-fping:all_tenants",
+ "description": "os_compute_api:os-fping:all_tenants action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses",
+ "description": "os_compute_api:os-hide-server-addresses action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable",
+ "description": "os_compute_api:os-hide-server-addresses:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hosts",
+ "description": "os_compute_api:os-hosts action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hosts:discoverable",
+ "description": "os_compute_api:os-hosts:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hypervisors",
+ "description": "os_compute_api:os-hypervisors action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable",
+ "description": "os_compute_api:os-hypervisors:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:images:discoverable",
+ "description": "os_compute_api:images:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:image-size",
+ "description": "os_compute_api:image-size action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:image-size:discoverable",
+ "description": "os_compute_api:image-size:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-actions",
+ "description": "os_compute_api:os-instance-actions action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable",
+ "description": "os_compute_api:os-instance-actions:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:events",
+ "description": "os_compute_api:os-instance-actions:events action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log",
+ "description": "os_compute_api:os-instance-usage-audit-log action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable",
+ "description": "os_compute_api:os-instance-usage-audit-log:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:ips:discoverable",
+ "description": "os_compute_api:ips:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:ips:index",
+ "description": "os_compute_api:ips:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:ips:show",
+ "description": "os_compute_api:ips:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:discoverable",
+ "description": "os_compute_api:os-keypairs:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs",
+ "description": "os_compute_api:os-keypairs action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:index",
+ "description": "os_compute_api:os-keypairs:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:show",
+ "description": "os_compute_api:os-keypairs:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:create",
+ "description": "os_compute_api:os-keypairs:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-keypairs:delete",
+ "description": "os_compute_api:os-keypairs:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:limits:discoverable",
+ "description": "os_compute_api:limits:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:limits",
+ "description": "os_compute_api:limits action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:discoverable",
+ "description": "os_compute_api:os-lock-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:lock",
+ "description": "os_compute_api:os-lock-server:lock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock",
+ "description": "os_compute_api:os-lock-server:unlock action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override",
+ "description": "os_compute_api:os-lock-server:unlock:unlock_override action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable",
+ "description": "os_compute_api:os-migrate-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate",
+ "description": "os_compute_api:os-migrate-server:migrate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live",
+ "description": "os_compute_api:os-migrate-server:migrate_live action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-multinic",
+ "description": "os_compute_api:os-multinic action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-multinic:discoverable",
+ "description": "os_compute_api:os-multinic:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks",
+ "description": "os_compute_api:os-networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks:view",
+ "description": "os_compute_api:os-networks:view action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks:discoverable",
+ "description": "os_compute_api:os-networks:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks-associate",
+ "description": "os_compute_api:os-networks-associate action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable",
+ "description": "os_compute_api:os-networks-associate:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pause-server:discoverable",
+ "description": "os_compute_api:os-pause-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pause-server:pause",
+ "description": "os_compute_api:os-pause-server:pause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pause-server:unpause",
+ "description": "os_compute_api:os-pause-server:unpause action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:pci_servers",
+ "description": "os_compute_api:os-pci:pci_servers action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:discoverable",
+ "description": "os_compute_api:os-pci:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:index",
+ "description": "os_compute_api:os-pci:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:detail",
+ "description": "os_compute_api:os-pci:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-pci:show",
+ "description": "os_compute_api:os-pci:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-personality:discoverable",
+ "description": "os_compute_api:os-personality:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable",
+ "description": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable",
+ "description": "os_compute_api:os-quota-sets:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:show",
+ "description": "os_compute_api:os-quota-sets:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:defaults",
+ "description": "os_compute_api:os-quota-sets:defaults action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:update",
+ "description": "os_compute_api:os-quota-sets:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:delete",
+ "description": "os_compute_api:os-quota-sets:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:detail",
+ "description": "os_compute_api:os-quota-sets:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:update",
+ "description": "os_compute_api:os-quota-class-sets:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:show",
+ "description": "os_compute_api:os-quota-class-sets:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable",
+ "description": "os_compute_api:os-quota-class-sets:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-rescue",
+ "description": "os_compute_api:os-rescue action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-rescue:discoverable",
+ "description": "os_compute_api:os-rescue:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable",
+ "description": "os_compute_api:os-scheduler-hints:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable",
+ "description": "os_compute_api:os-security-group-default-rules:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules",
+ "description": "os_compute_api:os-security-group-default-rules action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-groups",
+ "description": "os_compute_api:os-security-groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-security-groups:discoverable",
+ "description": "os_compute_api:os-security-groups:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics",
+ "description": "os_compute_api:os-server-diagnostics action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable",
+ "description": "os_compute_api:os-server-diagnostics:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-password",
+ "description": "os_compute_api:os-server-password action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-password:discoverable",
+ "description": "os_compute_api:os-server-password:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-usage",
+ "description": "os_compute_api:os-server-usage action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-usage:discoverable",
+ "description": "os_compute_api:os-server-usage:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-groups",
+ "description": "os_compute_api:os-server-groups action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-groups:discoverable",
+ "description": "os_compute_api:os-server-groups:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-services",
+ "description": "os_compute_api:os-services action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-services:discoverable",
+ "description": "os_compute_api:os-services:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:discoverable",
+ "description": "os_compute_api:server-metadata:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:index",
+ "description": "os_compute_api:server-metadata:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:show",
+ "description": "os_compute_api:server-metadata:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:delete",
+ "description": "os_compute_api:server-metadata:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:create",
+ "description": "os_compute_api:server-metadata:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:update",
+ "description": "os_compute_api:server-metadata:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:server-metadata:update_all",
+ "description": "os_compute_api:server-metadata:update_all action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:servers:discoverable",
+ "description": "os_compute_api:servers:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve",
+ "description": "os_compute_api:os-shelve:shelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable",
+ "description": "os_compute_api:os-shelve:shelve:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload",
+ "description": "os_compute_api:os-shelve:shelve_offload action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable",
+ "description": "os_compute_api:os-simple-tenant-usage:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show",
+ "description": "os_compute_api:os-simple-tenant-usage:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list",
+ "description": "os_compute_api:os-simple-tenant-usage:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable",
+ "description": "os_compute_api:os-suspend-server:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:suspend",
+ "description": "os_compute_api:os-suspend-server:suspend action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:resume",
+ "description": "os_compute_api:os-suspend-server:resume action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks",
+ "description": "os_compute_api:os-tenant-networks action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable",
+ "description": "os_compute_api:os-tenant-networks:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-shelve:unshelve",
+ "description": "os_compute_api:os-shelve:unshelve action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-user-data:discoverable",
+ "description": "os_compute_api:os-user-data:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces",
+ "description": "os_compute_api:os-virtual-interfaces action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable",
+ "description": "os_compute_api:os-virtual-interfaces:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes",
+ "description": "os_compute_api:os-volumes action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes:discoverable",
+ "description": "os_compute_api:os-volumes:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:index",
+ "description": "os_compute_api:os-volumes-attachments:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:show",
+ "description": "os_compute_api:os-volumes-attachments:show action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:create",
+ "description": "os_compute_api:os-volumes-attachments:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:update",
+ "description": "os_compute_api:os-volumes-attachments:update action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete",
+ "description": "os_compute_api:os-volumes-attachments:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable",
+ "description": "os_compute_api:os-volumes-attachments:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:list",
+ "description": "os_compute_api:os-availability-zone:list action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable",
+ "description": "os_compute_api:os-availability-zone:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:detail",
+ "description": "os_compute_api:os-availability-zone:detail action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-used-limits",
+ "description": "os_compute_api:os-used-limits action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-used-limits:discoverable",
+ "description": "os_compute_api:os-used-limits:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrations:index",
+ "description": "os_compute_api:os-migrations:index action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-migrations:discoverable",
+ "description": "os_compute_api:os-migrations:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create",
+ "description": "os_compute_api:os-assisted-volume-snapshots:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete",
+ "description": "os_compute_api:os-assisted-volume-snapshots:delete action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable",
+ "description": "os_compute_api:os-assisted-volume-snapshots:discoverable action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-console-auth-tokens",
+ "description": "os_compute_api:os-console-auth-tokens action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ },
+ {
+ "name": "os_compute_api:os-server-external-events:create",
+ "description": "os_compute_api:os-server-external-events:create action for nova",
+ "extra": {
+ "component": "nova"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter",
+ "description": "cells_scheduler_filter:TargetCellFilter action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create",
+ "description": "compute:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create:attach_network",
+ "description": "compute:create:attach_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create:attach_volume",
+ "description": "compute:create:attach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:create:forced_host",
+ "description": "compute:create:forced_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get",
+ "description": "compute:get action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all",
+ "description": "compute:get_all action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all_tenants",
+ "description": "compute:get_all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:update",
+ "description": "compute:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_instance_metadata",
+ "description": "compute:get_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all_instance_metadata",
+ "description": "compute:get_all_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_all_instance_system_metadata",
+ "description": "compute:get_all_instance_system_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:update_instance_metadata",
+ "description": "compute:update_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:delete_instance_metadata",
+ "description": "compute:delete_instance_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_instance_faults",
+ "description": "compute:get_instance_faults action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_diagnostics",
+ "description": "compute:get_diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_instance_diagnostics",
+ "description": "compute:get_instance_diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:start",
+ "description": "compute:start action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:stop",
+ "description": "compute:stop action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_lock",
+ "description": "compute:get_lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:lock",
+ "description": "compute:lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unlock",
+ "description": "compute:unlock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unlock_override",
+ "description": "compute:unlock_override action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_vnc_console",
+ "description": "compute:get_vnc_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_spice_console",
+ "description": "compute:get_spice_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_rdp_console",
+ "description": "compute:get_rdp_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_serial_console",
+ "description": "compute:get_serial_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_mks_console",
+ "description": "compute:get_mks_console action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:get_console_output",
+ "description": "compute:get_console_output action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:reset_network",
+ "description": "compute:reset_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:inject_network_info",
+ "description": "compute:inject_network_info action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:add_fixed_ip",
+ "description": "compute:add_fixed_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:remove_fixed_ip",
+ "description": "compute:remove_fixed_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:attach_volume",
+ "description": "compute:attach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:detach_volume",
+ "description": "compute:detach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:swap_volume",
+ "description": "compute:swap_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:attach_interface",
+ "description": "compute:attach_interface action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:detach_interface",
+ "description": "compute:detach_interface action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:set_admin_password",
+ "description": "compute:set_admin_password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:rescue",
+ "description": "compute:rescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unrescue",
+ "description": "compute:unrescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:suspend",
+ "description": "compute:suspend action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:resume",
+ "description": "compute:resume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:pause",
+ "description": "compute:pause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unpause",
+ "description": "compute:unpause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:shelve",
+ "description": "compute:shelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:shelve_offload",
+ "description": "compute:shelve_offload action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:unshelve",
+ "description": "compute:unshelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:snapshot",
+ "description": "compute:snapshot action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:snapshot_volume_backed",
+ "description": "compute:snapshot_volume_backed action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:backup",
+ "description": "compute:backup action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:resize",
+ "description": "compute:resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:confirm_resize",
+ "description": "compute:confirm_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:revert_resize",
+ "description": "compute:revert_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:rebuild",
+ "description": "compute:rebuild action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:reboot",
+ "description": "compute:reboot action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:delete",
+ "description": "compute:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:soft_delete",
+ "description": "compute:soft_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:force_delete",
+ "description": "compute:force_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:security_groups:add_to_instance",
+ "description": "compute:security_groups:add_to_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:security_groups:remove_from_instance",
+ "description": "compute:security_groups:remove_from_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:restore",
+ "description": "compute:restore action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:volume_snapshot_create",
+ "description": "compute:volume_snapshot_create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute:volume_snapshot_delete",
+ "description": "compute:volume_snapshot_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:accounts",
+ "description": "compute_extension:accounts action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions",
+ "description": "compute_extension:admin_actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:pause",
+ "description": "compute_extension:admin_actions:pause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:unpause",
+ "description": "compute_extension:admin_actions:unpause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:suspend",
+ "description": "compute_extension:admin_actions:suspend action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:resume",
+ "description": "compute_extension:admin_actions:resume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:lock",
+ "description": "compute_extension:admin_actions:lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:unlock",
+ "description": "compute_extension:admin_actions:unlock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:resetNetwork",
+ "description": "compute_extension:admin_actions:resetNetwork action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo",
+ "description": "compute_extension:admin_actions:injectNetworkInfo action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:createBackup",
+ "description": "compute_extension:admin_actions:createBackup action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:migrateLive",
+ "description": "compute_extension:admin_actions:migrateLive action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:resetState",
+ "description": "compute_extension:admin_actions:resetState action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:admin_actions:migrate",
+ "description": "compute_extension:admin_actions:migrate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:aggregates",
+ "description": "compute_extension:aggregates action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:agents",
+ "description": "compute_extension:agents action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:attach_interfaces",
+ "description": "compute_extension:attach_interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:baremetal_nodes",
+ "description": "compute_extension:baremetal_nodes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells",
+ "description": "compute_extension:cells action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:create",
+ "description": "compute_extension:cells:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:delete",
+ "description": "compute_extension:cells:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:update",
+ "description": "compute_extension:cells:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cells:sync_instances",
+ "description": "compute_extension:cells:sync_instances action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:certificates",
+ "description": "compute_extension:certificates action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cloudpipe",
+ "description": "compute_extension:cloudpipe action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:cloudpipe_update",
+ "description": "compute_extension:cloudpipe_update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:config_drive",
+ "description": "compute_extension:config_drive action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:console_output",
+ "description": "compute_extension:console_output action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:consoles",
+ "description": "compute_extension:consoles action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:createserverext",
+ "description": "compute_extension:createserverext action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:deferred_delete",
+ "description": "compute_extension:deferred_delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:disk_config",
+ "description": "compute_extension:disk_config action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:evacuate",
+ "description": "compute_extension:evacuate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_server_attributes",
+ "description": "compute_extension:extended_server_attributes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_status",
+ "description": "compute_extension:extended_status action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_availability_zone",
+ "description": "compute_extension:extended_availability_zone action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_ips",
+ "description": "compute_extension:extended_ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_ips_mac",
+ "description": "compute_extension:extended_ips_mac action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_vif_net",
+ "description": "compute_extension:extended_vif_net action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:extended_volumes",
+ "description": "compute_extension:extended_volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:fixed_ips",
+ "description": "compute_extension:fixed_ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_access",
+ "description": "compute_extension:flavor_access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess",
+ "description": "compute_extension:flavor_access:addTenantAccess action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess",
+ "description": "compute_extension:flavor_access:removeTenantAccess action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_disabled",
+ "description": "compute_extension:flavor_disabled action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_rxtx",
+ "description": "compute_extension:flavor_rxtx action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavor_swap",
+ "description": "compute_extension:flavor_swap action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextradata",
+ "description": "compute_extension:flavorextradata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:index",
+ "description": "compute_extension:flavorextraspecs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:show",
+ "description": "compute_extension:flavorextraspecs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:create",
+ "description": "compute_extension:flavorextraspecs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:update",
+ "description": "compute_extension:flavorextraspecs:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavorextraspecs:delete",
+ "description": "compute_extension:flavorextraspecs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:flavormanage",
+ "description": "compute_extension:flavormanage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ip_dns",
+ "description": "compute_extension:floating_ip_dns action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ip_pools",
+ "description": "compute_extension:floating_ip_pools action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ips",
+ "description": "compute_extension:floating_ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:floating_ips_bulk",
+ "description": "compute_extension:floating_ips_bulk action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:fping",
+ "description": "compute_extension:fping action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:fping:all_tenants",
+ "description": "compute_extension:fping:all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:hide_server_addresses",
+ "description": "compute_extension:hide_server_addresses action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:hosts",
+ "description": "compute_extension:hosts action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:hypervisors",
+ "description": "compute_extension:hypervisors action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:image_size",
+ "description": "compute_extension:image_size action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:instance_actions",
+ "description": "compute_extension:instance_actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:instance_actions:events",
+ "description": "compute_extension:instance_actions:events action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:instance_usage_audit_log",
+ "description": "compute_extension:instance_usage_audit_log action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs",
+ "description": "compute_extension:keypairs action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:index",
+ "description": "compute_extension:keypairs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:show",
+ "description": "compute_extension:keypairs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:create",
+ "description": "compute_extension:keypairs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:keypairs:delete",
+ "description": "compute_extension:keypairs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:multinic",
+ "description": "compute_extension:multinic action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:networks",
+ "description": "compute_extension:networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:networks:view",
+ "description": "compute_extension:networks:view action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:networks_associate",
+ "description": "compute_extension:networks_associate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-tenant-networks",
+ "description": "compute_extension:os-tenant-networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quotas:show",
+ "description": "compute_extension:quotas:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quotas:update",
+ "description": "compute_extension:quotas:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quotas:delete",
+ "description": "compute_extension:quotas:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:quota_classes",
+ "description": "compute_extension:quota_classes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:rescue",
+ "description": "compute_extension:rescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:security_group_default_rules",
+ "description": "compute_extension:security_group_default_rules action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:security_groups",
+ "description": "compute_extension:security_groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_diagnostics",
+ "description": "compute_extension:server_diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_groups",
+ "description": "compute_extension:server_groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_password",
+ "description": "compute_extension:server_password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:server_usage",
+ "description": "compute_extension:server_usage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:services",
+ "description": "compute_extension:services action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:shelve",
+ "description": "compute_extension:shelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:shelveOffload",
+ "description": "compute_extension:shelveOffload action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:show",
+ "description": "compute_extension:simple_tenant_usage:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:simple_tenant_usage:list",
+ "description": "compute_extension:simple_tenant_usage:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:unshelve",
+ "description": "compute_extension:unshelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:users",
+ "description": "compute_extension:users action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:virtual_interfaces",
+ "description": "compute_extension:virtual_interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:virtual_storage_arrays",
+ "description": "compute_extension:virtual_storage_arrays action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volumes",
+ "description": "compute_extension:volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:index",
+ "description": "compute_extension:volume_attachments:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:show",
+ "description": "compute_extension:volume_attachments:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:create",
+ "description": "compute_extension:volume_attachments:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:update",
+ "description": "compute_extension:volume_attachments:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volume_attachments:delete",
+ "description": "compute_extension:volume_attachments:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:volumetypes",
+ "description": "compute_extension:volumetypes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:availability_zone:list",
+ "description": "compute_extension:availability_zone:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:availability_zone:detail",
+ "description": "compute_extension:availability_zone:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:used_limits_for_admin",
+ "description": "compute_extension:used_limits_for_admin action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:migrations:index",
+ "description": "compute_extension:migrations:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create",
+ "description": "compute_extension:os-assisted-volume-snapshots:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete",
+ "description": "compute_extension:os-assisted-volume-snapshots:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:console_auth_tokens",
+ "description": "compute_extension:console_auth_tokens action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "compute_extension:os-server-external-events:create",
+ "description": "compute_extension:os-server-external-events:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_all",
+ "description": "network:get_all action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get",
+ "description": "network:get action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:create",
+ "description": "network:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:delete",
+ "description": "network:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:associate",
+ "description": "network:associate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:disassociate",
+ "description": "network:disassociate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_vifs_by_instance",
+ "description": "network:get_vifs_by_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:allocate_for_instance",
+ "description": "network:allocate_for_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:deallocate_for_instance",
+ "description": "network:deallocate_for_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:validate_networks",
+ "description": "network:validate_networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_instance_uuids_by_ip_filter",
+ "description": "network:get_instance_uuids_by_ip_filter action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_instance_id_by_floating_address",
+ "description": "network:get_instance_id_by_floating_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:setup_networks_on_host",
+ "description": "network:setup_networks_on_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_backdoor_port",
+ "description": "network:get_backdoor_port action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ip",
+ "description": "network:get_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ip_pools",
+ "description": "network:get_floating_ip_pools action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ip_by_address",
+ "description": "network:get_floating_ip_by_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ips_by_project",
+ "description": "network:get_floating_ips_by_project action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_floating_ips_by_fixed_address",
+ "description": "network:get_floating_ips_by_fixed_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:allocate_floating_ip",
+ "description": "network:allocate_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:associate_floating_ip",
+ "description": "network:associate_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:disassociate_floating_ip",
+ "description": "network:disassociate_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:release_floating_ip",
+ "description": "network:release_floating_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:migrate_instance_start",
+ "description": "network:migrate_instance_start action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:migrate_instance_finish",
+ "description": "network:migrate_instance_finish action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_fixed_ip",
+ "description": "network:get_fixed_ip action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_fixed_ip_by_address",
+ "description": "network:get_fixed_ip_by_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:add_fixed_ip_to_instance",
+ "description": "network:add_fixed_ip_to_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:remove_fixed_ip_from_instance",
+ "description": "network:remove_fixed_ip_from_instance action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:add_network_to_project",
+ "description": "network:add_network_to_project action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_instance_nw_info",
+ "description": "network:get_instance_nw_info action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_dns_domains",
+ "description": "network:get_dns_domains action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:add_dns_entry",
+ "description": "network:add_dns_entry action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:modify_dns_entry",
+ "description": "network:modify_dns_entry action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:delete_dns_entry",
+ "description": "network:delete_dns_entry action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_dns_entries_by_address",
+ "description": "network:get_dns_entries_by_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_dns_entries_by_name",
+ "description": "network:get_dns_entries_by_name action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:create_private_dns_domain",
+ "description": "network:create_private_dns_domain action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:create_public_dns_domain",
+ "description": "network:create_public_dns_domain action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:delete_dns_domain",
+ "description": "network:delete_dns_domain action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:attach_external_network",
+ "description": "network:attach_external_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "network:get_vif_by_mac_address",
+ "description": "network:get_vif_by_mac_address action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants",
+ "description": "os_compute_api:servers:detail:get_all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants",
+ "description": "os_compute_api:servers:index:get_all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:confirm_resize",
+ "description": "os_compute_api:servers:confirm_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create",
+ "description": "os_compute_api:servers:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_network",
+ "description": "os_compute_api:servers:create:attach_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create:attach_volume",
+ "description": "os_compute_api:servers:create:attach_volume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create:forced_host",
+ "description": "os_compute_api:servers:create:forced_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:delete",
+ "description": "os_compute_api:servers:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:update",
+ "description": "os_compute_api:servers:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:detail",
+ "description": "os_compute_api:servers:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:index",
+ "description": "os_compute_api:servers:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:reboot",
+ "description": "os_compute_api:servers:reboot action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:rebuild",
+ "description": "os_compute_api:servers:rebuild action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:resize",
+ "description": "os_compute_api:servers:resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:revert_resize",
+ "description": "os_compute_api:servers:revert_resize action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:show",
+ "description": "os_compute_api:servers:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create_image",
+ "description": "os_compute_api:servers:create_image action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed",
+ "description": "os_compute_api:servers:create_image:allow_volume_backed action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:start",
+ "description": "os_compute_api:servers:start action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:stop",
+ "description": "os_compute_api:servers:stop action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-access-ips:discoverable",
+ "description": "os_compute_api:os-access-ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-access-ips",
+ "description": "os_compute_api:os-access-ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions",
+ "description": "os_compute_api:os-admin-actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable",
+ "description": "os_compute_api:os-admin-actions:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network",
+ "description": "os_compute_api:os-admin-actions:reset_network action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info",
+ "description": "os_compute_api:os-admin-actions:inject_network_info action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state",
+ "description": "os_compute_api:os-admin-actions:reset_state action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-password",
+ "description": "os_compute_api:os-admin-password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-admin-password:discoverable",
+ "description": "os_compute_api:os-admin-password:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:discoverable",
+ "description": "os_compute_api:os-aggregates:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:index",
+ "description": "os_compute_api:os-aggregates:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:create",
+ "description": "os_compute_api:os-aggregates:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:show",
+ "description": "os_compute_api:os-aggregates:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:update",
+ "description": "os_compute_api:os-aggregates:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:delete",
+ "description": "os_compute_api:os-aggregates:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:add_host",
+ "description": "os_compute_api:os-aggregates:add_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:remove_host",
+ "description": "os_compute_api:os-aggregates:remove_host action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata",
+ "description": "os_compute_api:os-aggregates:set_metadata action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-agents",
+ "description": "os_compute_api:os-agents action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-agents:discoverable",
+ "description": "os_compute_api:os-agents:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces",
+ "description": "os_compute_api:os-attach-interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable",
+ "description": "os_compute_api:os-attach-interfaces:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes",
+ "description": "os_compute_api:os-baremetal-nodes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable",
+ "description": "os_compute_api:os-baremetal-nodes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable",
+ "description": "os_compute_api:os-block-device-mapping-v1:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells",
+ "description": "os_compute_api:os-cells action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:create",
+ "description": "os_compute_api:os-cells:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:delete",
+ "description": "os_compute_api:os-cells:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:update",
+ "description": "os_compute_api:os-cells:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:sync_instances",
+ "description": "os_compute_api:os-cells:sync_instances action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cells:discoverable",
+ "description": "os_compute_api:os-cells:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-certificates:create",
+ "description": "os_compute_api:os-certificates:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-certificates:show",
+ "description": "os_compute_api:os-certificates:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-certificates:discoverable",
+ "description": "os_compute_api:os-certificates:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe",
+ "description": "os_compute_api:os-cloudpipe action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable",
+ "description": "os_compute_api:os-cloudpipe:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-config-drive",
+ "description": "os_compute_api:os-config-drive action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:discoverable",
+ "description": "os_compute_api:os-consoles:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:create",
+ "description": "os_compute_api:os-consoles:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:delete",
+ "description": "os_compute_api:os-consoles:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:index",
+ "description": "os_compute_api:os-consoles:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-consoles:show",
+ "description": "os_compute_api:os-consoles:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-console-output:discoverable",
+ "description": "os_compute_api:os-console-output:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-console-output",
+ "description": "os_compute_api:os-console-output action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles",
+ "description": "os_compute_api:os-remote-consoles action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable",
+ "description": "os_compute_api:os-remote-consoles:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-create-backup:discoverable",
+ "description": "os_compute_api:os-create-backup:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-create-backup",
+ "description": "os_compute_api:os-create-backup action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete",
+ "description": "os_compute_api:os-deferred-delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable",
+ "description": "os_compute_api:os-deferred-delete:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-disk-config",
+ "description": "os_compute_api:os-disk-config action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-disk-config:discoverable",
+ "description": "os_compute_api:os-disk-config:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-evacuate",
+ "description": "os_compute_api:os-evacuate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-evacuate:discoverable",
+ "description": "os_compute_api:os-evacuate:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes",
+ "description": "os_compute_api:os-extended-server-attributes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable",
+ "description": "os_compute_api:os-extended-server-attributes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-status",
+ "description": "os_compute_api:os-extended-status action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-status:discoverable",
+ "description": "os_compute_api:os-extended-status:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone",
+ "description": "os_compute_api:os-extended-availability-zone action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable",
+ "description": "os_compute_api:os-extended-availability-zone:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:extensions",
+ "description": "os_compute_api:extensions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:extension_info:discoverable",
+ "description": "os_compute_api:extension_info:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes",
+ "description": "os_compute_api:os-extended-volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable",
+ "description": "os_compute_api:os-extended-volumes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips",
+ "description": "os_compute_api:os-fixed-ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable",
+ "description": "os_compute_api:os-fixed-ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access",
+ "description": "os_compute_api:os-flavor-access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable",
+ "description": "os_compute_api:os-flavor-access:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access",
+ "description": "os_compute_api:os-flavor-access:remove_tenant_access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access",
+ "description": "os_compute_api:os-flavor-access:add_tenant_access action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx",
+ "description": "os_compute_api:os-flavor-rxtx action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable",
+ "description": "os_compute_api:os-flavor-rxtx:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:flavors:discoverable",
+ "description": "os_compute_api:flavors:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable",
+ "description": "os_compute_api:os-flavor-extra-specs:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index",
+ "description": "os_compute_api:os-flavor-extra-specs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show",
+ "description": "os_compute_api:os-flavor-extra-specs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create",
+ "description": "os_compute_api:os-flavor-extra-specs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update",
+ "description": "os_compute_api:os-flavor-extra-specs:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete",
+ "description": "os_compute_api:os-flavor-extra-specs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable",
+ "description": "os_compute_api:os-flavor-manage:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-flavor-manage",
+ "description": "os_compute_api:os-flavor-manage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns",
+ "description": "os_compute_api:os-floating-ip-dns action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable",
+ "description": "os_compute_api:os-floating-ip-dns:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update",
+ "description": "os_compute_api:os-floating-ip-dns:domain:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete",
+ "description": "os_compute_api:os-floating-ip-dns:domain:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools",
+ "description": "os_compute_api:os-floating-ip-pools action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable",
+ "description": "os_compute_api:os-floating-ip-pools:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips",
+ "description": "os_compute_api:os-floating-ips action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable",
+ "description": "os_compute_api:os-floating-ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk",
+ "description": "os_compute_api:os-floating-ips-bulk action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable",
+ "description": "os_compute_api:os-floating-ips-bulk:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fping",
+ "description": "os_compute_api:os-fping action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fping:discoverable",
+ "description": "os_compute_api:os-fping:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-fping:all_tenants",
+ "description": "os_compute_api:os-fping:all_tenants action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses",
+ "description": "os_compute_api:os-hide-server-addresses action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable",
+ "description": "os_compute_api:os-hide-server-addresses:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hosts",
+ "description": "os_compute_api:os-hosts action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hosts:discoverable",
+ "description": "os_compute_api:os-hosts:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hypervisors",
+ "description": "os_compute_api:os-hypervisors action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable",
+ "description": "os_compute_api:os-hypervisors:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:images:discoverable",
+ "description": "os_compute_api:images:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:image-size",
+ "description": "os_compute_api:image-size action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:image-size:discoverable",
+ "description": "os_compute_api:image-size:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-actions",
+ "description": "os_compute_api:os-instance-actions action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable",
+ "description": "os_compute_api:os-instance-actions:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-actions:events",
+ "description": "os_compute_api:os-instance-actions:events action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log",
+ "description": "os_compute_api:os-instance-usage-audit-log action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable",
+ "description": "os_compute_api:os-instance-usage-audit-log:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:ips:discoverable",
+ "description": "os_compute_api:ips:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:ips:index",
+ "description": "os_compute_api:ips:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:ips:show",
+ "description": "os_compute_api:ips:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:discoverable",
+ "description": "os_compute_api:os-keypairs:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs",
+ "description": "os_compute_api:os-keypairs action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:index",
+ "description": "os_compute_api:os-keypairs:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:show",
+ "description": "os_compute_api:os-keypairs:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:create",
+ "description": "os_compute_api:os-keypairs:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-keypairs:delete",
+ "description": "os_compute_api:os-keypairs:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:limits:discoverable",
+ "description": "os_compute_api:limits:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:limits",
+ "description": "os_compute_api:limits action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:discoverable",
+ "description": "os_compute_api:os-lock-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:lock",
+ "description": "os_compute_api:os-lock-server:lock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock",
+ "description": "os_compute_api:os-lock-server:unlock action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override",
+ "description": "os_compute_api:os-lock-server:unlock:unlock_override action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable",
+ "description": "os_compute_api:os-migrate-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate",
+ "description": "os_compute_api:os-migrate-server:migrate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live",
+ "description": "os_compute_api:os-migrate-server:migrate_live action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-multinic",
+ "description": "os_compute_api:os-multinic action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-multinic:discoverable",
+ "description": "os_compute_api:os-multinic:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks",
+ "description": "os_compute_api:os-networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks:view",
+ "description": "os_compute_api:os-networks:view action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks:discoverable",
+ "description": "os_compute_api:os-networks:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks-associate",
+ "description": "os_compute_api:os-networks-associate action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable",
+ "description": "os_compute_api:os-networks-associate:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pause-server:discoverable",
+ "description": "os_compute_api:os-pause-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pause-server:pause",
+ "description": "os_compute_api:os-pause-server:pause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pause-server:unpause",
+ "description": "os_compute_api:os-pause-server:unpause action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:pci_servers",
+ "description": "os_compute_api:os-pci:pci_servers action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:discoverable",
+ "description": "os_compute_api:os-pci:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:index",
+ "description": "os_compute_api:os-pci:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:detail",
+ "description": "os_compute_api:os-pci:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-pci:show",
+ "description": "os_compute_api:os-pci:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-personality:discoverable",
+ "description": "os_compute_api:os-personality:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable",
+ "description": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable",
+ "description": "os_compute_api:os-quota-sets:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:show",
+ "description": "os_compute_api:os-quota-sets:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:defaults",
+ "description": "os_compute_api:os-quota-sets:defaults action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:update",
+ "description": "os_compute_api:os-quota-sets:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:delete",
+ "description": "os_compute_api:os-quota-sets:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-sets:detail",
+ "description": "os_compute_api:os-quota-sets:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:update",
+ "description": "os_compute_api:os-quota-class-sets:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:show",
+ "description": "os_compute_api:os-quota-class-sets:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable",
+ "description": "os_compute_api:os-quota-class-sets:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-rescue",
+ "description": "os_compute_api:os-rescue action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-rescue:discoverable",
+ "description": "os_compute_api:os-rescue:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable",
+ "description": "os_compute_api:os-scheduler-hints:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable",
+ "description": "os_compute_api:os-security-group-default-rules:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-group-default-rules",
+ "description": "os_compute_api:os-security-group-default-rules action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-groups",
+ "description": "os_compute_api:os-security-groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-security-groups:discoverable",
+ "description": "os_compute_api:os-security-groups:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics",
+ "description": "os_compute_api:os-server-diagnostics action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable",
+ "description": "os_compute_api:os-server-diagnostics:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-password",
+ "description": "os_compute_api:os-server-password action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-password:discoverable",
+ "description": "os_compute_api:os-server-password:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-usage",
+ "description": "os_compute_api:os-server-usage action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-usage:discoverable",
+ "description": "os_compute_api:os-server-usage:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-groups",
+ "description": "os_compute_api:os-server-groups action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-groups:discoverable",
+ "description": "os_compute_api:os-server-groups:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-services",
+ "description": "os_compute_api:os-services action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-services:discoverable",
+ "description": "os_compute_api:os-services:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:discoverable",
+ "description": "os_compute_api:server-metadata:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:index",
+ "description": "os_compute_api:server-metadata:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:show",
+ "description": "os_compute_api:server-metadata:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:delete",
+ "description": "os_compute_api:server-metadata:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:create",
+ "description": "os_compute_api:server-metadata:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:update",
+ "description": "os_compute_api:server-metadata:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:server-metadata:update_all",
+ "description": "os_compute_api:server-metadata:update_all action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:servers:discoverable",
+ "description": "os_compute_api:servers:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve",
+ "description": "os_compute_api:os-shelve:shelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable",
+ "description": "os_compute_api:os-shelve:shelve:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload",
+ "description": "os_compute_api:os-shelve:shelve_offload action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable",
+ "description": "os_compute_api:os-simple-tenant-usage:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show",
+ "description": "os_compute_api:os-simple-tenant-usage:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list",
+ "description": "os_compute_api:os-simple-tenant-usage:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable",
+ "description": "os_compute_api:os-suspend-server:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:suspend",
+ "description": "os_compute_api:os-suspend-server:suspend action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-suspend-server:resume",
+ "description": "os_compute_api:os-suspend-server:resume action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks",
+ "description": "os_compute_api:os-tenant-networks action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable",
+ "description": "os_compute_api:os-tenant-networks:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-shelve:unshelve",
+ "description": "os_compute_api:os-shelve:unshelve action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-user-data:discoverable",
+ "description": "os_compute_api:os-user-data:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces",
+ "description": "os_compute_api:os-virtual-interfaces action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable",
+ "description": "os_compute_api:os-virtual-interfaces:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes",
+ "description": "os_compute_api:os-volumes action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes:discoverable",
+ "description": "os_compute_api:os-volumes:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:index",
+ "description": "os_compute_api:os-volumes-attachments:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:show",
+ "description": "os_compute_api:os-volumes-attachments:show action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:create",
+ "description": "os_compute_api:os-volumes-attachments:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:update",
+ "description": "os_compute_api:os-volumes-attachments:update action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete",
+ "description": "os_compute_api:os-volumes-attachments:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable",
+ "description": "os_compute_api:os-volumes-attachments:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:list",
+ "description": "os_compute_api:os-availability-zone:list action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable",
+ "description": "os_compute_api:os-availability-zone:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-availability-zone:detail",
+ "description": "os_compute_api:os-availability-zone:detail action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-used-limits",
+ "description": "os_compute_api:os-used-limits action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-used-limits:discoverable",
+ "description": "os_compute_api:os-used-limits:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrations:index",
+ "description": "os_compute_api:os-migrations:index action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-migrations:discoverable",
+ "description": "os_compute_api:os-migrations:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create",
+ "description": "os_compute_api:os-assisted-volume-snapshots:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete",
+ "description": "os_compute_api:os-assisted-volume-snapshots:delete action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable",
+ "description": "os_compute_api:os-assisted-volume-snapshots:discoverable action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-console-auth-tokens",
+ "description": "os_compute_api:os-console-auth-tokens action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ },
+ {
+ "name": "os_compute_api:os-server-external-events:create",
+ "description": "os_compute_api:os-server-external-events:create action for nova",
+ "policies": [],
+ "category": {
+ "name": "action_id"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {
+ "name": "cells_scheduler_filter:TargetCellFilter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create:attach_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create:attach_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create:attach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create:attach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:create:forced_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:create:forced_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_all_instance_system_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_all_instance_system_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:update_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:update_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:delete_instance_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:delete_instance_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_instance_faults"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_instance_faults"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_instance_diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_instance_diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:start"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:start"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:stop"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:stop"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unlock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unlock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unlock_override"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unlock_override"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_vnc_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_vnc_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_spice_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_spice_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_rdp_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_rdp_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_serial_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_serial_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_mks_console"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_mks_console"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:get_console_output"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:get_console_output"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:reset_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:reset_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:inject_network_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:inject_network_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:add_fixed_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:add_fixed_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:remove_fixed_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:remove_fixed_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:attach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:attach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:detach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:detach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:swap_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:swap_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:attach_interface"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:attach_interface"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:detach_interface"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:detach_interface"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:set_admin_password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:set_admin_password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:rescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:rescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unrescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unrescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:suspend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:suspend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:resume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:resume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:pause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:pause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unpause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unpause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:shelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:shelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:shelve_offload"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:shelve_offload"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:unshelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:unshelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:snapshot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:snapshot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:snapshot_volume_backed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:snapshot_volume_backed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:backup"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:backup"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:confirm_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:confirm_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:revert_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:revert_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:rebuild"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:rebuild"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:reboot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:reboot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:soft_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:soft_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:force_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:force_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:security_groups:add_to_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:security_groups:add_to_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:security_groups:remove_from_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:security_groups:remove_from_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:restore"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:restore"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:volume_snapshot_create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:volume_snapshot_create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute:volume_snapshot_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute:volume_snapshot_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:accounts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:accounts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:pause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:pause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:unpause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:unpause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:suspend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:suspend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:resume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:resume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:unlock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:unlock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:resetNetwork"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:resetNetwork"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:injectNetworkInfo"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:createBackup"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:createBackup"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:migrateLive"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:migrateLive"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:resetState"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:resetState"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:admin_actions:migrate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:admin_actions:migrate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:aggregates"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:aggregates"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:agents"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:agents"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:attach_interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:attach_interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:baremetal_nodes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:baremetal_nodes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cells:sync_instances"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cells:sync_instances"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:certificates"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:certificates"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cloudpipe"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cloudpipe"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:cloudpipe_update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:cloudpipe_update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:config_drive"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:config_drive"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:console_output"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:console_output"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:consoles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:consoles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:createserverext"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:createserverext"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:deferred_delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:deferred_delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:disk_config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:disk_config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:evacuate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:evacuate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_server_attributes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_server_attributes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_availability_zone"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_availability_zone"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_ips_mac"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_ips_mac"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_vif_net"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_vif_net"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:extended_volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:extended_volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:fixed_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:fixed_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_access:addTenantAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_access:removeTenantAccess"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_disabled"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_disabled"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_rxtx"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_rxtx"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavor_swap"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavor_swap"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextradata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextradata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavorextraspecs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavorextraspecs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:flavormanage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:flavormanage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ip_dns"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ip_dns"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ip_pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ip_pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:floating_ips_bulk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:floating_ips_bulk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:fping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:fping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:fping:all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:fping:all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:hide_server_addresses"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:hide_server_addresses"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:hosts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:hosts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:hypervisors"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:hypervisors"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:image_size"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:image_size"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:instance_actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:instance_actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:instance_actions:events"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:instance_actions:events"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:instance_usage_audit_log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:instance_usage_audit_log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:keypairs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:keypairs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:multinic"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:multinic"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:networks:view"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:networks:view"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:networks_associate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:networks_associate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-tenant-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-tenant-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quotas:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quotas:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quotas:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quotas:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quotas:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quotas:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:quota_classes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:quota_classes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:rescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:rescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:security_group_default_rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:security_group_default_rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:security_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:security_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:server_usage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:server_usage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:services"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:services"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:shelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:shelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:shelveOffload"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:shelveOffload"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:simple_tenant_usage:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:simple_tenant_usage:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:simple_tenant_usage:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:simple_tenant_usage:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:unshelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:unshelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:users"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:users"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:virtual_interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:virtual_interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:virtual_storage_arrays"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:virtual_storage_arrays"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volume_attachments:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volume_attachments:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:volumetypes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:volumetypes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:availability_zone:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:availability_zone:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:availability_zone:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:availability_zone:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:used_limits_for_admin"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:used_limits_for_admin"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:migrations:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:migrations:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-assisted-volume-snapshots:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:console_auth_tokens"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:console_auth_tokens"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "compute_extension:os-server-external-events:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "compute_extension:os-server-external-events:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:associate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:associate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:disassociate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:disassociate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_vifs_by_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_vifs_by_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:allocate_for_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:allocate_for_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:deallocate_for_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:deallocate_for_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:validate_networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:validate_networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_instance_uuids_by_ip_filter"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_instance_uuids_by_ip_filter"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_instance_id_by_floating_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_instance_id_by_floating_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:setup_networks_on_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:setup_networks_on_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_backdoor_port"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_backdoor_port"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ip_pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ip_pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ip_by_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ip_by_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ips_by_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ips_by_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_floating_ips_by_fixed_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_floating_ips_by_fixed_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:allocate_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:allocate_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:associate_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:associate_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:disassociate_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:disassociate_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:release_floating_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:release_floating_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:migrate_instance_start"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:migrate_instance_start"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:migrate_instance_finish"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:migrate_instance_finish"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_fixed_ip"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_fixed_ip"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_fixed_ip_by_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_fixed_ip_by_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:add_fixed_ip_to_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:add_fixed_ip_to_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:remove_fixed_ip_from_instance"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:remove_fixed_ip_from_instance"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:add_network_to_project"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:add_network_to_project"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_instance_nw_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_instance_nw_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_dns_domains"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_dns_domains"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:add_dns_entry"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:add_dns_entry"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:modify_dns_entry"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:modify_dns_entry"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:delete_dns_entry"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:delete_dns_entry"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_dns_entries_by_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_dns_entries_by_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_dns_entries_by_name"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_dns_entries_by_name"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:create_private_dns_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:create_private_dns_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:create_public_dns_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:create_public_dns_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:delete_dns_domain"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:delete_dns_domain"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:attach_external_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:attach_external_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "network:get_vif_by_mac_address"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "network:get_vif_by_mac_address"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:detail:get_all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:index:get_all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:confirm_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:confirm_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create:attach_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create:attach_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create:attach_volume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create:attach_volume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create:forced_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create:forced_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:reboot"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:reboot"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:rebuild"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:rebuild"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:revert_resize"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:revert_resize"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create_image"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create_image"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:start"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:start"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:stop"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:stop"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-access-ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-access-ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-access-ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-access-ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:reset_network"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:inject_network_info"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-actions:reset_state"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-admin-password:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-admin-password:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:add_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:add_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:remove_host"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:remove_host"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-aggregates:set_metadata"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-agents"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-agents"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-agents:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-agents:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-attach-interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-attach-interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-attach-interfaces:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-baremetal-nodes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:sync_instances"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:sync_instances"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cells:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cells:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-certificates:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-certificates:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-certificates:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-certificates:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-certificates:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-certificates:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cloudpipe"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cloudpipe"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-cloudpipe:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-config-drive"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-config-drive"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-consoles:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-consoles:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-console-output:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-console-output:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-console-output"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-console-output"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-remote-consoles"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-remote-consoles"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-remote-consoles:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-create-backup:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-create-backup:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-create-backup"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-create-backup"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-deferred-delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-deferred-delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-deferred-delete:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-disk-config"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-disk-config"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-disk-config:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-disk-config:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-evacuate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-evacuate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-evacuate:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-evacuate:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-server-attributes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-status"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-status"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-status:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-status:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-availability-zone"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:extensions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:extensions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:extension_info:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:extension_info:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-extended-volumes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fixed-ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fixed-ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fixed-ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-rxtx"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:flavors:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:flavors:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-extra-specs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-manage:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-flavor-manage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-flavor-manage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-pools"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips-bulk"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fping"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fping"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fping:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fping:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-fping:all_tenants"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-fping:all_tenants"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hide-server-addresses"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hosts"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hosts"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hosts:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hosts:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hypervisors"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hypervisors"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-hypervisors:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:images:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:images:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:image-size"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:image-size"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:image-size:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:image-size:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-actions"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-actions"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-actions:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-actions:events"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-actions:events"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-usage-audit-log"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:ips:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:ips:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:ips:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:ips:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:ips:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:ips:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-keypairs:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-keypairs:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:limits:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:limits:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:lock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:lock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:unlock"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrate-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrate-server:migrate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrate-server:migrate_live"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-multinic"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-multinic"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-multinic:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-multinic:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks:view"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks:view"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks-associate"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks-associate"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-networks-associate:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pause-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pause-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pause-server:pause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pause-server:pause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pause-server:unpause"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pause-server:unpause"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:pci_servers"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:pci_servers"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-pci:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-pci:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-personality:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-personality:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:defaults"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:defaults"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-sets:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-sets:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-class-sets:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-class-sets:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-quota-class-sets:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-rescue"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-rescue"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-rescue:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-rescue:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-scheduler-hints:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-group-default-rules"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-security-groups:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-security-groups:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-diagnostics"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-diagnostics"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-diagnostics:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-password"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-password"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-password:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-password:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-usage"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-usage"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-usage:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-usage:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-groups"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-groups"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-groups:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-groups:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-services"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-services"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-services:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-services:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:server-metadata:update_all"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:server-metadata:update_all"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:servers:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:servers:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:shelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:shelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:shelve:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:shelve_offload"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-simple-tenant-usage:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-simple-tenant-usage:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-suspend-server:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-suspend-server:suspend"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-suspend-server:suspend"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-suspend-server:resume"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-suspend-server:resume"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-tenant-networks"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-tenant-networks"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-tenant-networks:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-shelve:unshelve"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-shelve:unshelve"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-user-data:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-user-data:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-virtual-interfaces"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:show"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:show"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:update"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:update"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-volumes-attachments:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-availability-zone:list"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-availability-zone:list"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-availability-zone:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-availability-zone:detail"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-availability-zone:detail"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-used-limits"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-used-limits"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-used-limits:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-used-limits:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrations:index"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrations:index"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-migrations:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-migrations:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-console-auth-tokens"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-console-auth-tokens"
+ }
+ ]
+ },
+ {
+ "action": {
+ "name": "os_compute_api:os-server-external-events:create"
+ },
+ "category": {
+ "name": "action_id"
+ },
+ "assignments": [
+ {
+ "name": "os_compute_api:os-server-external-events:create"
+ }
+ ]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [
+ {
+ "name": "role"
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id"
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "action_id"
+ }
+ ]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "cells_scheduler_filter:TargetCellFilter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create:attach_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create:attach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:create:forced_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_all_instance_system_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:update_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:delete_instance_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_instance_faults"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_instance_diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:start"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:stop"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unlock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unlock_override"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_vnc_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_spice_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_rdp_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_serial_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_mks_console"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:get_console_output"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:reset_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:inject_network_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:add_fixed_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:remove_fixed_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:attach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:detach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:swap_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:attach_interface"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:detach_interface"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:set_admin_password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:rescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unrescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:suspend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:resume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:pause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unpause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:shelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:shelve_offload"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:unshelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:snapshot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:snapshot_volume_backed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:backup"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:confirm_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:revert_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:rebuild"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:reboot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:soft_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:force_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:security_groups:add_to_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:security_groups:remove_from_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:restore"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:volume_snapshot_create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute:volume_snapshot_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:accounts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:pause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:unpause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:suspend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:resume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:unlock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:resetNetwork"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:injectNetworkInfo"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:createBackup"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:migrateLive"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:resetState"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:admin_actions:migrate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:aggregates"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:agents"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:attach_interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:baremetal_nodes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cells:sync_instances"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:certificates"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cloudpipe"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:cloudpipe_update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:config_drive"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:console_output"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:consoles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:createserverext"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:deferred_delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:disk_config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:evacuate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_server_attributes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_availability_zone"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_ips_mac"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_vif_net"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:extended_volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:fixed_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_access:addTenantAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_access:removeTenantAccess"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_disabled"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_rxtx"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavor_swap"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextradata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavorextraspecs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:flavormanage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ip_dns"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ip_pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:floating_ips_bulk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:fping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:fping:all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:hide_server_addresses"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:hosts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:hypervisors"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:image_size"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:instance_actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:instance_actions:events"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:instance_usage_audit_log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:keypairs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:multinic"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:networks:view"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:networks_associate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-tenant-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quotas:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quotas:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quotas:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:quota_classes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:rescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:security_group_default_rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:security_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:server_usage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:services"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:shelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:shelveOffload"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:simple_tenant_usage:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:simple_tenant_usage:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:unshelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:users"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:virtual_interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:virtual_storage_arrays"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volume_attachments:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:volumetypes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:availability_zone:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:availability_zone:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:used_limits_for_admin"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:migrations:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:console_auth_tokens"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "compute_extension:os-server-external-events:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:associate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:disassociate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_vifs_by_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:allocate_for_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:deallocate_for_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:validate_networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_instance_uuids_by_ip_filter"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_instance_id_by_floating_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:setup_networks_on_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_backdoor_port"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ip_pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ip_by_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ips_by_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_floating_ips_by_fixed_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:allocate_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:associate_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:disassociate_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:release_floating_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:migrate_instance_start"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:migrate_instance_finish"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_fixed_ip"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_fixed_ip_by_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:add_fixed_ip_to_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:remove_fixed_ip_from_instance"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:add_network_to_project"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_instance_nw_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_dns_domains"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:add_dns_entry"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:modify_dns_entry"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:delete_dns_entry"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_dns_entries_by_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_dns_entries_by_name"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:create_private_dns_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:create_public_dns_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:delete_dns_domain"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:attach_external_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "network:get_vif_by_mac_address"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:detail:get_all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:index:get_all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:confirm_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create:attach_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create:attach_volume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create:forced_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:reboot"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:rebuild"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:revert_resize"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create_image"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:create_image:allow_volume_backed"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:start"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:stop"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-access-ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-access-ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_network"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:inject_network_info"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-actions:reset_state"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-admin-password:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:add_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:remove_host"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-aggregates:set_metadata"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-agents"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-agents:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-attach-interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-attach-interfaces:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-baremetal-nodes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-block-device-mapping-v1:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:sync_instances"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cells:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-certificates:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-certificates:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-certificates:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cloudpipe"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-cloudpipe:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-config-drive"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-consoles:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-console-output:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-console-output"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-remote-consoles"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-remote-consoles:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-create-backup:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-create-backup"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-deferred-delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-deferred-delete:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-disk-config"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-disk-config:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-evacuate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-evacuate:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-server-attributes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-status"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-status:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-availability-zone:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:extensions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:extension_info:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-extended-volumes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fixed-ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fixed-ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access:remove_tenant_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-access:add_tenant_access"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-rxtx:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:flavors:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-extra-specs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-manage:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-flavor-manage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-dns:domain:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ip-pools:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-floating-ips-bulk:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fping"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fping:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-fping:all_tenants"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hide-server-addresses:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hosts"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hosts:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hypervisors"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-hypervisors:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:images:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:image-size"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:image-size:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-actions"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-actions:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-actions:events"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-instance-usage-audit-log:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:ips:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:ips:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:ips:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-keypairs:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:limits:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:lock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-lock-server:unlock:unlock_override"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrate-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrate-server:migrate_live"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-multinic"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-multinic:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks:view"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks-associate"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-networks-associate:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pause-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pause-server:pause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pause-server:unpause"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:pci_servers"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-pci:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-personality:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-preserve-ephemeral-rebuild:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:defaults"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-sets:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-quota-class-sets:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-rescue"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-rescue:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-scheduler-hints:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-group-default-rules"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-security-groups:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-diagnostics"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-diagnostics:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-password"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-password:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-usage"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-usage:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-groups"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-groups:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-services"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-services:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:server-metadata:update_all"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:servers:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:shelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:shelve:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:shelve_offload"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-simple-tenant-usage:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-suspend-server:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-suspend-server:suspend"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-suspend-server:resume"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-tenant-networks"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-tenant-networks:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-shelve:unshelve"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-user-data:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-virtual-interfaces:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:show"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:update"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-volumes-attachments:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-availability-zone:list"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-availability-zone:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-availability-zone:detail"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-used-limits"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-used-limits:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrations:index"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-migrations:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:delete"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-assisted-volume-snapshots:discoverable"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-console-auth-tokens"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ },
+ {
+ "meta_rule": {
+ "name": "rbac"
+ },
+ "rule": {
+ "subject_data": [
+ {
+ "name": "admin"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "all_vm"
+ }
+ ],
+ "action_data": [
+ {
+ "name": "os_compute_api:os-server-external-events:create"
+ }
+ ]
+ },
+ "policy": {
+ "name": "OpenStack RBAC Policy"
+ },
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "enabled": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/policy_attributes.json b/moon_engine/tests/func_policies/policy_attributes.json
new file mode 100644
index 00000000..1b6aec83
--- /dev/null
+++ b/moon_engine/tests/func_policies/policy_attributes.json
@@ -0,0 +1,452 @@
+{
+ "policies": [
+ {
+ "name": "Attrs Policy",
+ "genre": "authz",
+ "description": "Attrs Policy with custom attributes",
+ "model": {
+ "name": "ATTRS"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "ATTRS",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "attrs"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Attrs Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Attrs Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "role of a user"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "user",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "admin"}]
+ },
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Attrs Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Attrs Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Attrs Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "identification of the object"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "vm1",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm1"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm2"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm3"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ },
+ {
+ "name": "mode",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "attrs",
+ "description": "",
+ "subject_categories": [{"name": "role"}],
+ "object_categories": [{"name": "id"}],
+ "action_categories": [{"name": "type"}, {"attr": "mode"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}, {"attr": "run"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "execute"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}, {"attr": "run"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "write"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm3"}],
+ "action_data": [{"name": "read"}, {"attr": "run"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm3"}],
+ "action_data": [{"name": "read"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}, {"attr": "run"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}, {"attr": "run"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "attrs"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}, {"attr": "build"}]
+ },
+ "policy": {"name": "Attrs Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["demo", "vm1", "get_images"],
+ ["demo", "vm1", "set_image"],
+ ["demo", "vm2", "get_images"],
+ ["demo", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["demo", "vm1", "update_image"],
+ ["demo", "vm2", "set_image"],
+ ["demo", "vm2", "update_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/policy_mls.json b/moon_engine/tests/func_policies/policy_mls.json
new file mode 100644
index 00000000..6a8f22e9
--- /dev/null
+++ b/moon_engine/tests/func_policies/policy_mls.json
@@ -0,0 +1,495 @@
+{
+ "policies": [
+ {
+ "name": "MLS Policy",
+ "genre": "authz",
+ "description": "MLS policy",
+ "model": {
+ "name": "MLS"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "MLS",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "mls"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "level",
+ "description": "subject level"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "level",
+ "description": "object level"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "medium"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "mls",
+ "description": "",
+ "subject_categories": [{"name": "level"}],
+ "object_categories": [{"name": "level"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3Unknown data with id", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["demo", "vm1", "update_image"],
+ ["demo", "vm2", "set_image"],
+ ["demo", "vm2", "update_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/policy_rbac.json b/moon_engine/tests/func_policies/policy_rbac.json
new file mode 100644
index 00000000..a4bc959c
--- /dev/null
+++ b/moon_engine/tests/func_policies/policy_rbac.json
@@ -0,0 +1,393 @@
+{
+ "policies": [
+ {
+ "name": "RBAC Policy",
+ "genre": "authz",
+ "description": "RBAC policy",
+ "model": {
+ "name": "RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "role of a user"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "user",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "admin"}]
+ },
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "RBAC Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "identification of the object"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "vm1",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm1"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm2"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm3"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [{"name": "role"}],
+ "object_categories": [{"name": "id"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm3"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "RBAC Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["demo", "vm1", "get_images"],
+ ["demo", "vm1", "set_image"],
+ ["demo", "vm2", "get_images"],
+ ["demo", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["demo", "vm1", "update_image"],
+ ["demo", "vm2", "set_image"],
+ ["demo", "vm2", "update_image"],
+ ["demo", "vm3", "get_images"],
+ ["demo", "vm3", "set_image"],
+ ["demo", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_policies/test_base_configuration.py b/moon_engine/tests/func_policies/test_base_configuration.py
new file mode 100644
index 00000000..77f97df2
--- /dev/null
+++ b/moon_engine/tests/func_policies/test_base_configuration.py
@@ -0,0 +1,30 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+import logging
+import requests
+import yaml
+from moon_engine.api import configuration
+
+LOGGER = logging.getLogger("moon.engine.server")
+
+
+def test_rbac():
+ filename = "moon.yaml"
+ configuration.set_configuration(yaml.safe_load(open(filename)))
+ data = json.loads(open(configuration.get_configuration("data")).read())
+ for granted in data.get("checks", {}).get("granted", {}):
+ req = requests.get("http://127.0.0.1:10000/authz/{}/{}/{}".format(
+ granted[0], granted[1], granted[2]
+ ))
+ assert req.status_code == 204
diff --git a/tools/policies/policy.json.d/glance.policy.json b/moon_engine/tests/func_policies/tmp/glance.policy.json
index 5b1f6be7..5b1f6be7 100644
--- a/tools/policies/policy.json.d/glance.policy.json
+++ b/moon_engine/tests/func_policies/tmp/glance.policy.json
diff --git a/tools/policies/policy.json.d/keystone.policy.json b/moon_engine/tests/func_policies/tmp/keystone.policy.json
index 263912bf..263912bf 100644
--- a/tools/policies/policy.json.d/keystone.policy.json
+++ b/moon_engine/tests/func_policies/tmp/keystone.policy.json
diff --git a/moon_engine/tests/func_postman/Test Authz through Wrapper.postman_collection.json b/moon_engine/tests/func_postman/Test Authz through Wrapper.postman_collection.json
new file mode 100644
index 00000000..bd710eb2
--- /dev/null
+++ b/moon_engine/tests/func_postman/Test Authz through Wrapper.postman_collection.json
@@ -0,0 +1,24 @@
+{
+ "info": {
+ "_postman_id": "91449fd3-9f70-4e95-b3b7-84365cbc057d",
+ "name": "Test Authz through Wrapper",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "Get status",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": ""
+ }
+ },
+ "response": []
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/func_postman/db.json b/moon_engine/tests/func_postman/db.json
new file mode 100644
index 00000000..a06285d9
--- /dev/null
+++ b/moon_engine/tests/func_postman/db.json
@@ -0,0 +1 @@
+{"_default": {"1": {"username": "admin", "password": "2ee64edbdc7e6b7f298b6a06b04b066ee8a9e0531e93d16239ff1fa13be19c041d86e7fef8771e09dcc3295421c2ef1bd9dc80209f0f18413572363b4c510d47", "salt": "9d52dcaedac33f02454bcc2abc06c65c28070cbbe50cbbdfd89e483259cd1616ad240c2c69545c2a53644e49b2692e33a9f9947b5a2608eb185ec87ac5ed1c7f", "api_key": "f9615b75d70d2425bc8d107927d88dddf901444e540d8d7bd309b78c3246eb7106bf91fc5f7e9a404407ea348a6ecb75e865d6d60d0aa0294dd7cd032dfb0401"}}} \ No newline at end of file
diff --git a/moon_engine/tests/func_postman/gunicorn.cfg b/moon_engine/tests/func_postman/gunicorn.cfg
new file mode 100644
index 00000000..a1ec8f9c
--- /dev/null
+++ b/moon_engine/tests/func_postman/gunicorn.cfg
@@ -0,0 +1,3 @@
+bind = "127.0.0.1:10000"
+workers = 2
+moon = "moon.yaml"
diff --git a/moon_engine/tests/func_postman/moon.yaml b/moon_engine/tests/func_postman/moon.yaml
new file mode 100644
index 00000000..523bb75a
--- /dev/null
+++ b/moon_engine/tests/func_postman/moon.yaml
@@ -0,0 +1,49 @@
+api_token: false
+data: ''
+database:
+ pwd_file: db.json
+incremental_updates: false
+logging:
+ formatters:
+ brief:
+ format: '%(levelname)s %(name)s %(message)-30s'
+ custom:
+ format: '%(asctime)-15s %(levelname)s %(name)s %(message)s'
+ handlers:
+ console:
+ class: logging.StreamHandler
+ formatter: custom
+ level: 10
+ stream: ext://sys.stdout
+ file:
+ backupCount: 3
+ class: logging.handlers.RotatingFileHandler
+ filename: moon.log
+ formatter: custom
+ level: DEBUG
+ maxBytes: 1048576
+ loggers:
+ moon:
+ handlers:
+ - console
+ - file
+ level: DEBUG
+ propagate: false
+ root:
+ handlers:
+ - console
+ level: ERROR
+ version: 1
+management:
+ password: admin
+ url: http://127.0.0.1:8000
+ user: admin
+orchestration:
+ config_dir: /tmp
+ connection: local
+ driver: moon_engine.plugins.pyorchestrator
+ port: 20000...20100
+plugins:
+ directory: /var/moon/plugins
+type: wrapper
+uuid: 2dd13f3dd36048d88346962d62920ac6
diff --git a/moon_engine/tests/func_postman/run.sh b/moon_engine/tests/func_postman/run.sh
new file mode 100755
index 00000000..f4153d28
--- /dev/null
+++ b/moon_engine/tests/func_postman/run.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+hug -m moon_engine.server -p 10000 gunicorn.cfg
diff --git a/moon_engine/tests/performance_tests/authz_pipeline.py b/moon_engine/tests/performance_tests/authz_pipeline.py
new file mode 100644
index 00000000..7d2b48ce
--- /dev/null
+++ b/moon_engine/tests/performance_tests/authz_pipeline.py
@@ -0,0 +1,115 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import TaskSet, task
+import logging
+import json
+
+LOGGER = logging.getLogger("locust")
+
+
+class AuthzPipelineRequests(TaskSet):
+ token = ""
+ moon_errors = 0
+ moon_requests = 0
+ stats_filename = "/tmp/perf_stats.log"
+
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ self.moon_errors = []
+
+ def __del__(self):
+ """ on_stop is called when the TaskSet is stopping """
+ stats = {}
+ try:
+ stats = json.loads(open(self.stats_filename).read())
+ except Exception:
+ pass
+ _num = stats.get("errors", 0)
+ _num += len(self.moon_errors)
+ _total = stats.get("total", 0)
+ _total += self.moon_requests
+ _list = stats.get("list", [])
+ _list.extend(self.moon_errors)
+ _percent = _num * 100 / _total
+ json.dump({"errors": _num, "total": _total,
+ "percentage": "{0:.2f}".format(_percent),
+ "list": _list},
+ open(self.stats_filename, "w"), indent=4)
+
+ def get(self, url, status_code=200):
+ with self.client.get(url, catch_response=True) as response:
+ self.moon_requests += 1
+ if response.status_code != status_code:
+ self.moon_errors.append((url, f"{response.status_code}/{status_code}"))
+ response.success()
+
+ @task(10)
+ def authz_ok1(self):
+ url = "/authz/{}/{}/{}".format(
+ "admin", "vm1", "use_image"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok2(self):
+ url = "/authz/{}/{}/{}".format(
+ "admin", "vm1", "get_images"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok3(self):
+ url = "/authz/{}/{}/{}".format(
+ "admin", "vm1", "set_image"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok4(self):
+ url = "/authz/{}/{}/{}".format(
+ "demo", "vm1", "set_image"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok5(self):
+ url = "/authz/{}/{}/{}".format(
+ "demo", "vm1", "get_images"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_rule_ko(self):
+ url = "/authz/{}/{}/{}".format("demo", "vm1", "use_image")
+ self.get(url, 403)
+
+ @task(10)
+ def authz_subject_ko(self):
+ url = "/authz/{}/{}/{}".format("admins", "vm1", "use_image")
+ self.get(url, 403)
+
+ @task(10)
+ def authz_object_ko(self):
+ url = "/authz/{}/{}/{}".format("admin", "vm4", "use_image")
+ self.get(url, 403)
+
+ @task(10)
+ def authz_action_ko(self):
+ url = "/authz/{}/{}/{}".format("admin", "vm1", "use_images")
+ self.get(url, 403)
+
+ @task(1)
+ def status(self):
+ self.client.get("/status/")
+
+
diff --git a/moon_engine/tests/performance_tests/locustfile.py b/moon_engine/tests/performance_tests/locustfile.py
new file mode 100644
index 00000000..cf077720
--- /dev/null
+++ b/moon_engine/tests/performance_tests/locustfile.py
@@ -0,0 +1,26 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import HttpLocust, TaskSet
+import authz_pipeline
+
+
+class MoonRequests(TaskSet):
+ tasks = {
+ authz_pipeline.AuthzPipelineRequests: 10,
+ }
+
+
+class MoonUser(HttpLocust):
+ task_set = MoonRequests
+ min_wait = 10
+ max_wait = 100
diff --git a/moon_engine/tests/performance_tests/policy_rbac.json b/moon_engine/tests/performance_tests/policy_rbac.json
new file mode 100644
index 00000000..2f7c704e
--- /dev/null
+++ b/moon_engine/tests/performance_tests/policy_rbac.json
@@ -0,0 +1,411 @@
+{
+ "policies": [
+ {
+ "name": "Policy for Locust",
+ "genre": "authz",
+ "description": "Policy for Locust",
+ "model": {
+ "name": "RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "role of a user"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "user",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "admin"}]
+ },
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "identification of the object"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "vm1",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm1"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm2"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm3"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [{"name": "role"}],
+ "object_categories": [{"name": "id"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm3"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["user", "vm1", "get_images"],
+ ["user", "vm1", "set_image"],
+ ["user", "vm2", "get_images"],
+ ["user", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["user", "vm1", "update_image"],
+ ["user", "vm2", "set_image"],
+ ["user", "vm2", "update_image"],
+ ["user", "vm1", "use_image"],
+ ["user", "vm2", "use_image"],
+ ["user", "vm3", "get_images"],
+ ["user", "vm3", "set_image"],
+ ["user", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_engine/tests/performance_tests/utils.py b/moon_engine/tests/performance_tests/utils.py
new file mode 100644
index 00000000..21ac78bb
--- /dev/null
+++ b/moon_engine/tests/performance_tests/utils.py
@@ -0,0 +1,60 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+
+
+def login(taskset):
+ req = taskset.client.get("/auth", auth=("admin", "admin"))
+ taskset.token = req.content.decode("utf-8").strip('"')
+
+
+def logout(taskset):
+ pass
+
+
+def log(msg):
+ open("/tmp/tests.log", 'a').write(str(msg) + "\n")
+
+
+def import_policy(client, token):
+ import_data = open("policy_rbac.json").read()
+ req = client.post("/import", headers={"X-Api-Key": token}, data=json.loads(import_data))
+ print(req)
+ content = json.loads(req.content.decode("utf-8"))
+ for policy_key, policy_value in content.get("policies", {}).items():
+ if policy_value.get("name") == "Policy for Locust":
+ return policy_key
+
+
+def create_pdp(client, token, policy_id, vim_project_id=111111111111):
+ req = client.post("/pdp", headers={"X-Api-Key": token}, data={
+ "name": "PDP for Locust",
+ "vim_project_id": vim_project_id,
+ "security_pipeline": [policy_id]
+ })
+ content = json.loads(req.content.decode("utf-8"))
+ for pdp_key, pdp_value in content.get("pdp", {}).items():
+ if pdp_value.get("name") == "PDP for Locust":
+ return pdp_key
+
+
+def delete_policy(client, token, policy_id):
+ print("deleting Policy {}".format(policy_id))
+ client.delete("/policies/{}".format(policy_id), headers={"X-Api-Key": token})
+
+
+def delete_pdp(client, token, pdp_id):
+ print("deleting PDP {}".format(pdp_id))
+ client.delete("/pdp/{}".format(pdp_id), headers={"X-Api-Key": token})
+
+
diff --git a/moon_engine/tests/unit_python/api/__init__.py b/moon_engine/tests/unit_python/api/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_engine/tests/unit_python/api/moon.yaml b/moon_engine/tests/unit_python/api/moon.yaml
new file mode 100644
index 00000000..9272ccce
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/moon.yaml
@@ -0,0 +1,54 @@
+type: "pipeline"
+uuid: "a64beb1c-c224-474f-b4ba-dd43173e7101"
+manager_url: "http://127.0.0.1:20000"
+incremental_updates: false
+api_token:
+data: conf/policy_example.json
+debug: true
+management:
+ token_file: moon_engine_users.json
+
+orchestration:
+ driver: moon_engine.plugins.pyorchestrator
+ connection: local
+ port: 20000...20100
+ config_dir: /tmp
+
+authorization:
+ driver: moon_engine.plugins.authz
+
+plugins:
+ directory: /tmp
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon_engine.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console] \ No newline at end of file
diff --git a/moon_engine/tests/unit_python/api/pipeline/__init__.py b/moon_engine/tests/unit_python/api/pipeline/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/pipeline/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_engine/tests/unit_python/api/pipeline/test_authz.py b/moon_engine/tests/unit_python/api/pipeline/test_authz.py
new file mode 100644
index 00000000..c405ddfd
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/pipeline/test_authz.py
@@ -0,0 +1,37 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+
+
+def test_get_authz_authorized():
+ from moon_engine.api.pipeline import authz
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ # FIXME: https://gitlab.forge.orange-labs.fr/moon/moon_cache/issues/1
+ # req = benchmark(hug.test.get, authz,
+ # "/authz/89ba91c1-8dd5-4abf-bfde-7a66936c51a6/67b8008a-3f8d-4f8e-847e-b628f0f7ca0e/cdb3df22-0dc0"
+ # "-5a6e-a333-4b994827b068", headers=auth_headers)
+ # # req = hug.test.get(authz, "/authz/test/test/test", headers=auth_headers)
+ # assert req.status == hug.HTTP_204
+
+
+def test_get_authz_unauthorized():
+ from moon_engine.api.pipeline import authz
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ # FIXME: https://gitlab.forge.orange-labs.fr/moon/moon_cache/issues/1
+ # req = benchmark(hug.test.get, authz,
+ # "/authz/31fd15ad-1478-4a96-96fc-c887dddbfaf9/67b8008a-3f8d-4f8e-847e-b628f0f7ca0e/cdb3df22-0dc0"
+ # "-5a6e-a333-4b994827b068", headers=auth_headers)
+ # # req = hug.test.get(authz, "/authz/test/test/test", headers=auth_headers)
+ # assert req.status == hug.HTTP_403
diff --git a/moon_engine/tests/unit_python/api/pipeline/test_update.py b/moon_engine/tests/unit_python/api/pipeline/test_update.py
new file mode 100644
index 00000000..94d5a4e4
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/pipeline/test_update.py
@@ -0,0 +1,525 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import requests
+from uuid import uuid4
+
+
+def test_pipeline_update_policy_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ key = next(iter(policies['policies']))
+ policies['policies'][key]['name'] = "new " + policies['policies'][key]['name']
+ req = hug.test.put(update, "/update/policy/{}".format(key),
+ policies['policies'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_update_policy_not_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ key = next(iter(policies['policies']))
+ policies['policies'][key]['name'] = "new " + policies['policies'][key]['name']
+ req = hug.test.put(update, "/update/policy/{}".format(uuid4().hex),
+ policies['policies'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_delete_policy():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = response.json()
+ key = next(iter(policies['policies']))
+ req = hug.test.delete(update, "/update/policy/{}".format(key),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_update_pdp_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ pdps = response.json()
+ key = next(iter(pdps['pdps']))
+ pdps['pdps'][key]['name'] = "new " + pdps['pdps'][key]['name']
+ req = hug.test.put(update, "/update/pdp/{}".format(key),
+ pdps['pdps'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_update_pdp_not_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ pdps = response.json()
+ key = next(iter(pdps['pdps']))
+ pdps['pdps'][key]['name'] = "new " + pdps['pdps'][key]['name']
+ req = hug.test.put(update, "/update/pdp/{}".format(uuid4().hex),
+ pdps['pdps'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_delete_pdp_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ pdps = response.json()
+ key = next(iter(pdps['pdps']))
+ req = hug.test.delete(update, "/update/pdp/{}".format(key), headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_update_perimeter_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ policy_key = next(iter(policies['policies']))
+
+ subject_response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ subjects = subject_response.json()
+ subj_key = next(iter(subjects['subjects']))
+ subjects['subjects'][subj_key]['name'] = "updated_" + subjects['subjects'][subj_key]['name']
+
+ subject_req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(subj_key, policy_key,
+ "subject"),
+ subjects['subjects'][subj_key], headers=auth_headers)
+ assert subject_req.status == hug.HTTP_208
+
+ """ object category """
+ object_response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ objects = object_response.json()
+ obj_key = next(iter(objects['objects']))
+ objects['objects'][obj_key]['name'] = "updated_" + objects['objects'][obj_key]['name']
+
+ object_req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(obj_key, policy_key, "object")
+ , objects['objects'][obj_key], headers=auth_headers)
+ assert object_req.status == hug.HTTP_208
+
+ """ action category """
+ action_response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ actions = action_response.json()
+ action_key = next(iter(actions['actions']))
+ actions['actions'][action_key]['name'] = "updated_" + actions['actions'][action_key]['name']
+
+ action_req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(action_key, policy_key,
+ "action"),
+ actions['actions'][action_key], headers=auth_headers)
+ assert action_req.status == hug.HTTP_208
+
+
+def test_pipeline_update_perimeter_not_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ policy_key = next(iter(policies['policies']))
+
+ subject_response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ subjects = subject_response.json()
+ subj_key = next(iter(subjects['subjects']))
+ subjects['subjects'][subj_key]['name'] = "updated_" + subjects['subjects'][subj_key]['name']
+
+ subject_req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(uuid4().hex, policy_key,
+ "subject"),
+ subjects['subjects'][subj_key], headers=auth_headers)
+ assert subject_req.status == hug.HTTP_208
+
+ """ object category """
+ object_response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ objects = object_response.json()
+ obj_key = next(iter(objects['objects']))
+ objects['objects'][obj_key]['name'] = "updated_" + objects['objects'][obj_key]['name']
+
+ object_req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(uuid4().hex, policy_key, "object")
+ , objects['objects'][obj_key], headers=auth_headers)
+ assert object_req.status == hug.HTTP_208
+
+ """ action category """
+ action_response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ actions = action_response.json()
+ action_key = next(iter(actions['actions']))
+ actions['actions'][action_key]['name'] = "updated_" + actions['actions'][action_key]['name']
+
+ action_req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(uuid4().hex, policy_key,
+ "action"),
+ actions['actions'][action_key], headers=auth_headers)
+ assert action_req.status == hug.HTTP_208
+
+
+def test_pipeline_delete_perimeter_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ policies_response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = policies_response.json()
+ policy_key = next(iter(policies['policies']))
+
+ subject_response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ subjects = subject_response.json()
+ subj_key = next(iter(subjects['subjects']))
+ subjects['subjects'][subj_key]['name'] = "updated_" + subjects['subjects'][subj_key]['name']
+
+ delete_subject_response = hug.test.delete(update, "/update/perimeter/{}/{}/{}".format(subj_key, policy_key,
+ "subject"),
+ headers=auth_headers)
+ assert delete_subject_response.status == hug.HTTP_202
+
+ object_response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ objects = object_response.json()
+ assert 'objects' in objects and len(objects['objects'])
+
+ for key in objects['objects']:
+ delete_object_response = hug.test.delete(update, "/update/perimeter/{}/{}/{}".format(key, policy_key, 'object'),
+ headers=auth_headers)
+ assert delete_object_response.status == hug.HTTP_202
+
+ action_response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_key), headers=auth_headers)
+ actions = action_response.json()
+ assert 'actions' in actions and len(actions['actions'])
+
+ for key in actions['actions']:
+ delete_action_response = hug.test.delete(update, "/update/perimeter/{}/{}/{}".format(key, policy_key, 'action'),
+ headers=auth_headers)
+ assert delete_action_response.status == hug.HTTP_202
+
+
+def test_pipeline_delete_assignments():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = response.json()
+ policy_id = next(iter(policies['policies']))
+
+ sub_assig_response = requests.get("{}/policies/{}/subject_assignments".format(get_configuration("management").get("url"),
+ policy_id), headers=auth_headers)
+
+ subject_assignments = sub_assig_response.json()
+ assert 'subject_assignments' in subject_assignments and len(
+ subject_assignments['subject_assignments'])
+ req = hug.test.delete(update,
+ "/update/assignment/{}/{}/".format(policy_id, "subject"),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+ obj_assig_response = requests.get("{}/policies/{}/object_assignments".format(get_configuration(
+ "management").get("url"), policy_id),
+ headers=auth_headers)
+ object_assignments = obj_assig_response.json()
+ assert 'object_assignments' in object_assignments and len(
+ object_assignments['object_assignments'])
+ req = hug.test.delete(update,
+ "/update/assignment/{}/{}/".format(policy_id, "object"),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+ action_assig_response = requests.get("{}/policies/{}/action_assignments".format(get_configuration(
+ "management").get("url"), policy_id),
+ headers=auth_headers)
+ action_assignments = action_assig_response.json()
+ assert 'action_assignments' in action_assignments and len(
+ action_assignments['action_assignments'])
+ req = hug.test.delete(update,
+ "/update/assignment/{}/{}/".format(policy_id, "action"),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_delete_rule():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ policy_response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = policy_response.json()
+ policy_id = next(iter(policies['policies']))
+
+ rules_response = requests.get(
+ "{}/policies/{}/rules".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ rules = rules_response.json()
+
+ assert len(rules['rules']['rules'])
+ for i in range(0, len(rules['rules']['rules'])):
+ req = hug.test.delete(update, "/update/rule/{}/{}".format(policy_id, rules['rules'][
+ 'rules'][i]['id']), headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_update_model_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ model_response = requests.get("{}/models".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ models = model_response.json()
+ key = next(iter(models['models']))
+ models['models'][key]['name'] = "new " + models['models'][key]['name']
+ req = hug.test.put(update, "/update/model/{}".format(key),
+ models['models'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_update_model_not_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ model_response = requests.get("{}/models".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ models = model_response.json()
+ key = next(iter(models['models']))
+ models['models'][key]['name'] = "new " + models['models'][key]['name']
+ req = hug.test.put(update, "/update/model/{}".format(uuid4().hex),
+ models['models'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_delete_model_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ model_response = requests.get("{}/models".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ models = model_response.json()
+ key = next(iter(models['models']))
+ req = hug.test.delete(update, "/update/model/{}".format(key), headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_delete_category():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_cat_response = requests.get("{}/subject_categories".format(get_configuration(
+ "management").get("url")), headers=auth_headers)
+ subject_categories = subject_cat_response.json()
+ category_id = next(iter(subject_categories['subject_categories']))
+ req = hug.test.delete(update, "/update/meta_data/{}/{}".format(category_id, 'subject'),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+ action_cat_response = requests.get("{}/action_categories".format(get_configuration(
+ "management").get("url")),
+ headers=auth_headers)
+ action_categories = action_cat_response.json()
+ category_id = next(iter(action_categories['action_categories']))
+ req = hug.test.delete(update, "/update/meta_data/{}/{}".format(category_id, 'action'),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+ obj_cat_response = requests.get("{}/object_categories".format(get_configuration(
+ "management").get("url")),
+ headers=auth_headers)
+ object_categories = obj_cat_response.json()
+ category_id = next(iter(object_categories['object_categories']))
+ req = hug.test.delete(update, "/update/meta_data/{}/{}".format(category_id, 'object'),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_update_meta_rule_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ meta_rules_response = requests.get("{}/meta_rules".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ meta_rules = meta_rules_response.json()
+ key = next(iter(meta_rules['meta_rules']))
+ meta_rules['meta_rules'][key]['name'] = "new " + meta_rules['meta_rules'][key]['name']
+ req = hug.test.put(update, "/update/meta_rule/{}".format(key),
+ meta_rules['meta_rules'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_update_meta_rule_not_existed():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ meta_rules_response = requests.get("{}/meta_rules".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ meta_rules = meta_rules_response.json()
+ key = next(iter(meta_rules['meta_rules']))
+ meta_rules['meta_rules'][key]['name'] = "new " + meta_rules['meta_rules'][key]['name']
+ req = hug.test.put(update, "/update/meta_rule/{}".format(uuid4().hex),
+ meta_rules['meta_rules'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_pipeline_delete_meta_rule():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ meta_rules_response = requests.get("{}/meta_rules".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ meta_rules = meta_rules_response.json()
+ key = next(iter(meta_rules['meta_rules']))
+ req = hug.test.delete(update, "/update/meta_rule/{}".format(key), headers=auth_headers)
+ assert req.status == hug.HTTP_202
+
+
+def test_pipeline_delete_data():
+ from moon_engine.api.pipeline import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_engine.api.configuration import get_configuration
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ policies_response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = policies_response.json()
+ policy_id = next(iter(policies['policies']))
+
+ subject_data_response = requests.get(
+ "{}/policies/{}/subject_data".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ subject_data_id = next(iter(subject_data_response.json()['subject_data'][0]['data']))
+ delete_subject_data_response = hug.test.delete(update, "/update/data/{}/{}".format(subject_data_id, 'subject'),
+ headers=auth_headers)
+ assert delete_subject_data_response.status == hug.HTTP_202
+
+ object_data_response = requests.get(
+ "{}/policies/{}/object_data".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ object_data_id = next(iter(object_data_response.json()['object_data'][0]['data']))
+ delete_object_data_response = hug.test.delete(update, "/update/data/{}/{}".format(object_data_id, 'object'),
+ headers=auth_headers)
+ assert delete_object_data_response.status == hug.HTTP_202
+
+ action_data_response = requests.get(
+ "{}/policies/{}/action_data".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ action_data_id = next(iter(action_data_response.json()['action_data'][0]['data']))
+ delete_action_data_response = hug.test.delete(update, "/update/data/{}/{}".format(action_data_id, 'action'),
+ headers=auth_headers)
+ assert delete_action_data_response.status == hug.HTTP_202
+
+
+# def test_pipeline_delete_attributes():
+# from moon_engine.api.pipeline import update
+# from moon_utilities.auth_functions import get_api_key_for_user
+# from moon_engine.api.configuration import get_configuration
+#
+# auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+#
+# attributes_response = requests.get(
+# "{}/attributes".format(get_configuration("management").get("url")),
+# headers=auth_headers)
+#
+# attributes = attributes_response.json()
+# key = next(iter(attributes['attributes']))
+# req = hug.test.delete(update, "/update/attributes/{}".format(key), headers=auth_headers)
+# assert req.status == hug.HTTP_202
+
+
diff --git a/moon_engine/tests/unit_python/api/test_status.py b/moon_engine/tests/unit_python/api/test_status.py
new file mode 100644
index 00000000..e38f35e6
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/test_status.py
@@ -0,0 +1,21 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+
+
+def test_status(benchmark):
+ from moon_engine.api import status
+
+ # Fixme: Add tests on enforce function to have a benchmark on enforce rapidity
+ req = benchmark(hug.test.get, status, "/status")
+ assert isinstance(req.data, dict)
diff --git a/moon_engine/tests/unit_python/api/wrapper/__init__.py b/moon_engine/tests/unit_python/api/wrapper/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/wrapper/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_engine/tests/unit_python/api/wrapper/test_oslo_wrapper.py b/moon_engine/tests/unit_python/api/wrapper/test_oslo_wrapper.py
new file mode 100644
index 00000000..770e9bb6
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/wrapper/test_oslo_wrapper.py
@@ -0,0 +1,209 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import json
+import requests
+
+
+def get_subject_object_action():
+ from moon_engine.api.configuration import get_configuration
+ from moon_cache.cache import Cache
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"),
+ api_key=get_api_key_for_user("admin"))
+
+ # Note: patching the cache for the test
+ CACHE.add_pipeline("b3d3e18a-bf33-40e8-b635-fd49e6634ccd", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ CACHE.add_pipeline("f8f49a77-9ceb-47b3-ac81-0f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ pdp = response.json()
+ pdp_id = next(iter(pdp['pdps']))
+ policy_id = pdp['pdps'][pdp_id].get("security_pipeline")[0]
+ project_id = pdp['pdps'][pdp_id].get("vim_project_id")
+
+ # response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ # headers=auth_headers)
+ # policies = response.json()
+ # policy_id = next(iter(policies['policies']))
+
+ response = requests.get("{}/policies/{}/subjects".format(
+ get_configuration("management").get("url"), policy_id), headers=auth_headers)
+ subjects = response.json()
+
+ response = requests.get("{}/policies/{}/objects".format(
+ get_configuration("management").get("url"), policy_id), headers=auth_headers)
+ objects = response.json()
+
+ response = requests.get("{}/policies/{}/actions".format(
+ get_configuration("management").get("url"), policy_id), headers=auth_headers)
+ actions = response.json()
+ return subjects, objects, actions, project_id
+
+
+def test_post_authz():
+ from moon_engine.plugins import oslowrapper
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ pdp = response.json()
+ pdp_id = next(iter(pdp['pdps']))
+ policy_id = pdp['pdps'][pdp_id].get("security_pipeline")[0]
+ project_id = pdp['pdps'][pdp_id].get("vim_project_id")
+
+ response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ subjects = response.json()
+
+ response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ objects = response.json()
+
+ response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ actions = response.json()
+
+ subjects_name = subjects['subjects'][next(iter(subjects['subjects']))]['name']
+ objects_name = objects['objects'][next(iter(objects['objects']))]['name']
+ actions_name = actions['actions'][next(iter(actions['actions']))]['name']
+
+ # Note: patching the cache for the test
+ from moon_cache.cache import Cache
+ CACHE = Cache.getInstance()
+ CACHE.add_pipeline("b3d3e18abf3340e8b635fd49e6634ccd", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ CACHE.add_pipeline("f8f49a779ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+
+ _target = {
+ 'target': {
+ "name": objects_name,
+ },
+ "project_id": project_id,
+ "user_id": subjects_name
+ }
+ _credentials = {
+ "project_id": project_id,
+ "user_id": subjects_name
+ }
+
+ authz_data = {
+ 'rule': actions_name,
+ 'target': json.dumps(_target),
+ 'credentials': json.dumps(_credentials)}
+ req = hug.test.post(oslowrapper, "/authz/oslo", authz_data)
+ assert req.status == hug.HTTP_200
+
+
+def test_authz_true():
+ from moon_engine.plugins import oslowrapper
+
+ subjects, objects, actions, project_id = get_subject_object_action()
+
+ _target = {
+ 'target': {
+ "name": objects['objects'][next(iter(objects['objects']))]['name'],
+ },
+ "project_id": project_id,
+ "user_id": subjects['subjects'][next(iter(subjects['subjects']))]['name']
+ }
+ _credentials = {
+ "project_id": project_id,
+ "user_id": subjects['subjects'][next(iter(subjects['subjects']))]['name']
+ }
+ authz_data = {
+ 'rule': actions['actions'][next(iter(actions['actions']))]['name'],
+ 'target': json.dumps(_target),
+ 'credentials': json.dumps(_credentials)}
+
+ req = hug.test.post(oslowrapper, "/authz/oslo", body=authz_data)
+
+ assert req.status == hug.HTTP_200 and req.data is not None and req.data
+
+
+def test_authz_error_response_code():
+ from moon_engine.plugins import oslowrapper
+
+ subjects, objects, actions, project_id = get_subject_object_action()
+
+ _target = {
+ 'target': {
+ "name": objects['objects'][next(iter(objects['objects']))]['name'],
+ },
+ "project_id": "a64beb1cc224474fb4badd431f3e7106", # invalid project id
+ "user_id": subjects['subjects'][next(iter(subjects['subjects']))]['name']
+ }
+ authz_data = {
+ 'rule': actions['actions'][next(iter(actions['actions']))]['name'],
+ 'target': json.dumps(_target),
+ 'credentials': 'null'}
+
+ print(authz_data)
+ req = hug.test.post(oslowrapper, "/authz/oslo", body=authz_data)
+
+ assert req.status != hug.HTTP_200
+
+# def test_authz_error_no_interface_key(context):
+# import moon_wrapper.server
+# server = moon_wrapper.server.main()
+# client = server.app.test_client()
+# _target = {
+# 'target': {
+# "name": context.get('object_name'),
+# },
+# "project_id": context.get('project_with_no_interface_key'),
+# "user_id": context.get('subject_name')
+# }
+# authz_data = {
+# 'rule': context.get('action_name'),
+# 'target': json.dumps(_target),
+# 'credentials': 'null'}
+# req = client.post("/authz/oslo", data=json.dumps(authz_data))
+#
+# assert req.data == b"False"
diff --git a/moon_engine/tests/unit_python/api/wrapper/test_pipeline.py b/moon_engine/tests/unit_python/api/wrapper/test_pipeline.py
new file mode 100644
index 00000000..ed16883d
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/wrapper/test_pipeline.py
@@ -0,0 +1,32 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+
+
+def test_get_pipelines():
+ from moon_engine.api.wrapper.api import pipeline
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = hug.test.get(pipeline, "/pipelines", headers=auth_headers )
+ assert req.status == hug.HTTP_200
+ assert isinstance(req.data, dict)
+ assert "pipelines" in req.data
diff --git a/moon_engine/tests/unit_python/api/wrapper/test_update.py b/moon_engine/tests/unit_python/api/wrapper/test_update.py
new file mode 100644
index 00000000..75e7ef2d
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/wrapper/test_update.py
@@ -0,0 +1,602 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import requests
+
+
+def test_wrapper_update_policy_existed():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"),
+ api_key=get_api_key_for_user("admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ key = next(iter(policies['policies']))
+ policies['policies'][key]['name'] = "new " + policies['policies'][key]['name']
+ req = hug.test.put(update, "/update/policy/{}".format(key),
+ policies['policies'][key], headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_policy():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"),
+ api_key=get_api_key_for_user("admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = response.json()
+ key = next(iter(policies['policies']))
+ req = hug.test.delete(update, "/update/policy/{}".format(key),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_update_policy_not_existed():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"),
+ api_key=get_api_key_for_user("admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = response.json()
+ key = next(iter(policies['policies']))
+ policies['policies'][key]['name'] = "new " + policies['policies'][key]['name']
+ req = hug.test.put(update, "/update/policy/{}".format("eac0ecd09ceb47b3ac810f01ef71b4e0"),
+ policies['policies'][key], headers=auth_headers)
+ assert req.status == hug.HTTP_208
+
+
+def test_wrapper_update_pdp_existed():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ pdps = response.json()
+ key = next(iter(pdps['pdps']))
+ pdps['pdps'][key]['name'] = "new " + pdps['pdps'][key]['name']
+ req = hug.test.put(update, "/update/pdp/{}".format(key),
+ pdps['pdps'][key], headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_pdp():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ pdps = response.json()
+ key = next(iter(pdps['pdps']))
+ req = hug.test.delete(update, "/update/pdp/{}".format(key), headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_assignments():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = response.json()
+ policy_id = next(iter(policies['policies']))
+
+ response = requests.get("{}/policies/{}/subject_assignments".format(get_configuration(
+ "management").get("url"), policy_id),
+ headers=auth_headers)
+ subject_assignments = response.json()
+ assert 'subject_assignments' in subject_assignments and len(
+ subject_assignments['subject_assignments'])
+ req = hug.test.delete(update,
+ "/update/assignment/{}/{}/".format(policy_id, "subject"),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/policies/{}/object_assignments".format(get_configuration(
+ "management").get("url"), policy_id),
+ headers=auth_headers)
+ object_assignments = response.json()
+ assert 'object_assignments' in object_assignments and len(
+ object_assignments['object_assignments'])
+ req = hug.test.delete(update,
+ "/update/assignment/{}/{}/".format(policy_id, "object"),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/policies/{}/action_assignments".format(get_configuration(
+ "management").get("url"), policy_id),
+ headers=auth_headers)
+ action_assignments = response.json()
+ assert 'action_assignments' in action_assignments and len(
+ action_assignments['action_assignments'])
+ req = hug.test.delete(update,
+ "/update/assignment/{}/{}/".format(policy_id, "action"),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_update_perimeter_existed():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ policy_id = next(iter(policies['policies']))
+
+ response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ subjects = response.json()
+ assert 'subjects' in subjects and len(subjects['subjects'])
+
+ for key in subjects['subjects']:
+ subjects['subjects'][key]['name'] = "new " + subjects['subjects'][key]['name']
+ req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(key, policy_id, 'subject'),
+ subjects['subjects'][key], headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ objects = response.json()
+ assert 'objects' in objects and len(objects['objects'])
+
+ for key in objects['objects']:
+ objects['objects'][key]['name'] = "new " + objects['objects'][key]['name']
+ req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(key, policy_id, 'object'),
+ objects['objects'][key], headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ actions = response.json()
+ assert 'actions' in actions and len(actions['actions'])
+
+ for key in actions['actions']:
+ actions['actions'][key]['name'] = "new " + actions['actions'][key]['name']
+ req = hug.test.put(update, "/update/perimeter/{}/{}/{}".format(key, policy_id, 'action'),
+ actions['actions'][key], headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_perimeter():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"),
+ api_key=get_api_key_for_user("admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ policy_id = next(iter(policies['policies']))
+
+ response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ subjects = response.json()
+ assert 'subjects' in subjects and len(subjects['subjects'])
+
+ for key in subjects['subjects']:
+ req = hug.test.delete(update,
+ "/update/perimeter/{}/{}/{}".format(key, policy_id, 'subject'),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ objects = response.json()
+ assert 'objects' in objects and len(objects['objects'])
+
+ for key in objects['objects']:
+ req = hug.test.delete(update, "/update/perimeter/{}/{}/{}".format(key, policy_id, 'object'),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ actions = response.json()
+ assert 'actions' in actions and len(actions['actions'])
+
+ for key in actions['actions']:
+ req = hug.test.delete(update, "/update/perimeter/{}/{}/{}".format(key, policy_id, 'action'),
+ headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_rule():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ policies = response.json()
+ policy_id = next(iter(policies['policies']))
+
+ response = requests.get(
+ "{}/policies/{}/rules".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ rules = response.json()
+ assert 'rules' in rules and 'policy_id' in rules['rules']
+ assert rules['rules']['policy_id'] == policy_id
+ assert len(rules['rules']['rules'])
+ for i in range(0, len(rules['rules']['rules'])):
+ req = hug.test.delete(update, "/update/rule/{}/{}".format(policy_id,
+ rules['rules']['rules'][i]['id']), headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_update_model_existed():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/models".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ models = response.json()
+ key = next(iter(models['models']))
+ models['models'][key]['name'] = "new " + models['models'][key]['name']
+ req = hug.test.put(update, "/update/model/{}".format(key),
+ models['models'][key], headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_model():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/models".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ models = response.json()
+ key = next(iter(models['models']))
+ req = hug.test.delete(update, "/update/model/{}".format(key), headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_category():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/subject_categories".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ subject_categories = response.json()
+ category_id = next(iter(subject_categories['subject_categories']))
+ req = hug.test.delete(update, "/update/meta_data/{}/{}".format(category_id, 'subject'),
+ headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/action_categories".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ action_categories = response.json()
+ category_id = next(iter(action_categories['action_categories']))
+ req = hug.test.delete(update, "/update/meta_data/{}/{}".format(category_id, 'action'),
+ headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get("{}/object_categories".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+ object_categories = response.json()
+ category_id = next(iter(object_categories['object_categories']))
+ req = hug.test.delete(update, "/update/meta_data/{}/{}".format(category_id, 'object'),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_update_meta_rule_existed():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/meta_rules".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ meta_rules = response.json()
+ key = next(iter(meta_rules['meta_rules']))
+ meta_rules['meta_rules'][key]['name'] = "new " + meta_rules['meta_rules'][key]['name']
+ req = hug.test.put(update, "/update/meta_rule/{}".format(key),
+ meta_rules['meta_rules'][key], headers=auth_headers)
+
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_meta_rule():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/meta_rules".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ meta_rules = response.json()
+ key = next(iter(meta_rules['meta_rules']))
+ req = hug.test.delete(update, "/update/meta_rule/{}".format(key), headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+
+def test_wrapper_delete_data():
+ from moon_engine.api.wrapper.api import update
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"), api_key=get_api_key_for_user(
+ "admin"))
+
+ CACHE.add_pipeline("eac0ecd09ceb47b3ac810f01ef71b4e0", {
+ "name": "test",
+ "description": "test",
+ "host": "127.0.0.1",
+ "port": 20000,
+ })
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/policies".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ policies = response.json()
+ policy_id = next(iter(policies['policies']))
+
+ response = requests.get(
+ "{}/policies/{}/subject_data".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ subject_data_id = next(iter(response.json()['subject_data'][0]['data']))
+ req = hug.test.delete(update, "/update/data/{}/{}".format(subject_data_id,'subject'),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get(
+ "{}/policies/{}/object_data".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ object_data_id = next(iter(response.json()['object_data'][0]['data']))
+ req = hug.test.delete(update, "/update/data/{}/{}".format(object_data_id, 'object'),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
+
+ response = requests.get(
+ "{}/policies/{}/action_data".format(get_configuration("management").get("url"), policy_id),
+ headers=auth_headers)
+ action_data_id = next(iter(response.json()['action_data'][0]['data']))
+ req = hug.test.delete(update, "/update/data/{}/{}".format(action_data_id, 'action'),
+ headers=auth_headers)
+ assert (req.status == hug.HTTP_202 or req.status == hug.HTTP_200)
diff --git a/moon_engine/tests/unit_python/api/wrapper/test_wrapper_authz.py b/moon_engine/tests/unit_python/api/wrapper/test_wrapper_authz.py
new file mode 100644
index 00000000..c4df249f
--- /dev/null
+++ b/moon_engine/tests/unit_python/api/wrapper/test_wrapper_authz.py
@@ -0,0 +1,57 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import requests
+
+
+def test_wrapper_get_authz():
+ from moon_engine.api.wrapper.api import authz
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_cache.cache import Cache
+ from moon_engine.api.configuration import get_configuration
+ CACHE = Cache.getInstance(manager_url=get_configuration("management").get("url"),
+ incremental=get_configuration("incremental_updates"),
+ manager_api_key=get_configuration("api_token"))
+
+ CACHE.set_current_server(url=get_configuration("management").get("url"),
+ api_key=get_api_key_for_user("admin"))
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ response = requests.get("{}/pdp".format(get_configuration("management").get("url")),
+ headers=auth_headers)
+
+ pdp = response.json()
+ pdp_id = next(iter(pdp['pdps']))
+ policy_id = pdp['pdps'][pdp_id].get("security_pipeline")[0]
+ project_id = pdp['pdps'][pdp_id].get("vim_project_id")
+
+ response = requests.get("{}/policies/{}/subjects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ subjects = response.json()
+
+ response = requests.get("{}/policies/{}/objects".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ objects = response.json()
+
+ response = requests.get("{}/policies/{}/actions".format(get_configuration(
+ "management").get("url"), policy_id), headers=auth_headers)
+ actions = response.json()
+
+ subjects_name = subjects['subjects'][next(iter(subjects['subjects']))]['name']
+ objects_name = objects['objects'][next(iter(objects['objects']))]['name']
+ actions_name = actions['actions'][next(iter(actions['actions']))]['name']
+
+ req = hug.test.get(authz, "/authz/{}/{}/{}/{}".format(
+ project_id, subjects_name, objects_name, actions_name))
+ assert req.status == hug.HTTP_200
diff --git a/moon_engine/tests/unit_python/conftest.py b/moon_engine/tests/unit_python/conftest.py
new file mode 100644
index 00000000..6b7ab339
--- /dev/null
+++ b/moon_engine/tests/unit_python/conftest.py
@@ -0,0 +1,60 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import os
+import pytest
+import requests_mock
+import mock_require_data
+
+
+@pytest.fixture(autouse=True)
+def no_requests(monkeypatch):
+ """ Modify the response from Requests module
+ """
+ global manager_api_key
+ with requests_mock.Mocker(real_http=True) as m:
+ try:
+ os.remove("/tmp/database_test.db")
+ except FileNotFoundError:
+ pass
+ try:
+ os.remove("/tmp/moon.pwd")
+ except FileNotFoundError:
+ pass
+ print("Configure...")
+ mock_require_data.register_require_data(m)
+ #from moon_engine.api.configuration import set_configuration
+ #set_configuration(yaml.safe_load(__CONF))
+ print("Create a new user")
+ from moon_utilities.auth_functions import add_user, init_db, get_api_key_for_user
+ init_db("/tmp/moon.pwd")
+ try:
+ user = add_user("admin", "admin")
+ manager_api_key = user["api_key"]
+ except KeyError:
+ print("User already exists")
+ manager_api_key = get_api_key_for_user("admin")
+ print("Initialize the database")
+ # init_database()
+ # from moon_manager import db_driver
+ # db_driver.init()
+
+ # mock_engine.register_engine(m)
+ # mock_slaves.register_slaves(m)
+
+ # from moon_manager.pip_driver import InformationManager
+ # InformationManager.set_auth()
+
+ from moon_cache.cache import Cache
+ Cache.deleteInstance()
+ yield m
+ # InformationManager.unset_auth()
diff --git a/moon_engine/tests/unit_python/mock_require_data.py b/moon_engine/tests/unit_python/mock_require_data.py
new file mode 100644
index 00000000..63557285
--- /dev/null
+++ b/moon_engine/tests/unit_python/mock_require_data.py
@@ -0,0 +1,762 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def register_require_data(m):
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:20000/authz/testuser/vm1/boot',
+ json={},
+ status_code=204
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:10000/authz/a64beb1cc224474fb4badd43173e7101/testuser/vm1/boot',
+ json={},
+ status_code=204
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/pdp',
+ json={
+ "pdps": {
+ "b3d3e18abf3340e8b635fd49e6634ccd": {
+ "description": "test",
+ "security_pipeline": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0"
+ ],
+ "name": "pdp_rbac",
+ "vim_project_id": "a64beb1cc224474fb4badd43173e7101"
+ },
+ "eac0ecd09ceb47b3ac810f01ef71b4e0": {
+ "description": "test",
+ "security_pipeline": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0"
+ ],
+ "name": "pdp_rbac2",
+ "vim_project_id": "z64beb1cc224474fb4badd43173e7108"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/pdp/b3d3e18abf3340e8b635fd49e6634ccd',
+ json={
+ "pdps": {
+ "b3d3e18abf3340e8b635fd49e6634ccd": {
+ "description": "test",
+ "security_pipeline": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0"
+ ],
+ "name": "pdp_rbac",
+ "vim_project_id": "a64beb1cc224474fb4badd43173e7101"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/pdp/eac0ecd09ceb47b3ac810f01ef71b4e0',
+ json={
+ "pdps": {
+ "eac0ecd09ceb47b3ac810f01ef71b4e0": {
+ "description": "test",
+ "security_pipeline": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0"
+ ],
+ "name": "pdp_rbac",
+ "vim_project_id": "z64beb1cc224474fb4badd43173e7108"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies',
+ json={
+ "policies": {
+ "f8f49a779ceb47b3ac810f01ef71b4e0": {
+ "name": "RBAC policy example",
+ "model_id": "cd923d8633ff4978ab0e99938f5153d6",
+ "description": "test",
+ "genre": "authz"
+ }
+ }
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0',
+ json={
+ "f8f49a779ceb47b3ac810f01ef71b4e0": {
+ "name": "RBAC policy example",
+ "model_id": "cd923d8633ff4978ab0e99938f5153d6",
+ "description": "test",
+ "genre": "authz"
+ }
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/models',
+ json={
+ "models": {
+ "cd923d8633ff4978ab0e99938f5153d6": {
+ "name": "RBAC",
+ "meta_rules": [
+ "4700cc0e38ef4cffa34025602d267c9e"
+ ],
+ "description": "test"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/meta_rules',
+ json={
+ "meta_rules": {
+ "4700cc0e38ef4cffa34025602d267c9e": {
+ "subject_categories": [
+ "14e6ae0ba34d458b876c791b73aa17bd"
+ ],
+ "action_categories": [
+ "241a2a791554421a91c9f1bc564aa94d"
+ ],
+ "description": "",
+ "name": "rbac",
+ "object_categories": [
+ "6d48500f639d4c2cab2b1f33ef93a1e8"
+ ]
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/subject_categories',
+ json={
+ 'subject_categories':
+ {
+ '14e6ae0ba34d458b876c791b73aa17bd':
+ {
+ 'id': '14e6ae0ba34d458b876c791b73aa17bd',
+ 'name': 'testuser14e6ae0ba34d458b876c791b73aa17bd',
+ 'description': 'description of testuser14e6ae0ba34d458b876c791b73aa17bd'
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/action_categories',
+ json={
+ 'action_categories':
+ {
+ '241a2a791554421a91c9f1bc564aa94d':
+ {
+ 'id': '241a2a791554421a91c9f1bc564aa94d',
+ 'name': 'testuser241a2a791554421a91c9f1bc564aa94d',
+ 'description': 'description of testuser241a2a791554421a91c9f1bc564aa94d'
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/object_categories',
+ json={
+ 'object_categories':
+ {
+ '6d48500f639d4c2cab2b1f33ef93a1e8':
+ {
+ 'id': '6d48500f639d4c2cab2b1f33ef93a1e8',
+ 'name': '6d48500f639d4c2cab2b1f33ef93a1e8',
+ 'description': 'description of testuser6d48500f639d4c2cab2b1f33ef93a1e8'
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/subjects',
+ json={
+ "subjects": {
+ "89ba91c18dd54abfbfde7a66936c51a6": {
+ "description": "test",
+ "policy_list": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "636cd473324f4c0bbd9102cb5b62a16d"
+ ],
+ "name": "testuser",
+ "email": "mail",
+ "id": "89ba91c18dd54abfbfde7a66936c51a6",
+ "extra": {}
+ },
+ "31fd15ad14784a9696fcc887dddbfaf9": {
+ "description": "test",
+ "policy_list": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "636cd473324f4c0bbd9102cb5b62a16d"
+ ],
+ "name": "adminuser",
+ "email": "mail",
+ "id": "31fd15ad14784a9696fcc887dddbfaf9",
+ "extra": {}
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/objects',
+ json={
+ "objects": {
+ "67b8008a3f8d4f8e847eb628f0f7ca0e": {
+ "name": "vm1",
+ "description": "test",
+ "id": "67b8008a3f8d4f8e847eb628f0f7ca0e",
+ "extra": {},
+ "policy_list": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "636cd473324f4c0bbd9102cb5b62a16d"
+ ]
+ },
+ "9089b3d2ce5b4e929ffc7e35b55eba1a": {
+ "name": "vm0",
+ "description": "test",
+ "id": "9089b3d2ce5b4e929ffc7e35b55eba1a",
+ "extra": {},
+ "policy_list": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "636cd473324f4c0bbd9102cb5b62a16d"
+ ]
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/actions',
+ json={
+ "actions": {
+ "cdb3df220dc05a6ea3334b994827b068": {
+ "name": "boot",
+ "description": "test",
+ "id": "cdb3df220dc05a6ea3334b994827b068",
+ "extra": {},
+ "policy_list": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "636cd473324f4c0bbd9102cb5b62a16d"
+ ]
+ },
+ "9f5112afe9b34a6c894eb87246ccb7aa": {
+ "name": "start",
+ "description": "test",
+ "id": "9f5112afe9b34a6c894eb87246ccb7aa",
+ "extra": {},
+ "policy_list": [
+ "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "636cd473324f4c0bbd9102cb5b62a16d"
+ ]
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/subject_assignments',
+ json={
+ "subject_assignments": {
+ "826c1156d0284fc9b4b2ddb279f63c52": {
+ "category_id": "14e6ae0ba34d458b876c791b73aa17bd",
+ "assignments": [
+ "24ea95256c5f4c888c1bb30a187788df",
+ "6b227b77184c48b6a5e2f3ed1de0c02a",
+ "31928b17ec90438ba5a2e50ae7650e63",
+ "4e60f554dd3147af87595fb6b37dcb13",
+ "7a5541b63a024fa88170a6b59f99ccd7",
+ "dd2af27812f742029d289df9687d6126",
+ "4d4b3c3ba45e48589b382a6e369bafbe",
+ ],
+ "id": "826c1156d0284fc9b4b2ddb279f63c52",
+ "subject_id": "89ba91c18dd54abfbfde7a66936c51a6",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0"
+ },
+ "7407ffc1232944279b0cbcb0847c86f7": {
+ "category_id": "315072d40d774c43a89ff33937ed24eb",
+ "assignments": [
+ "6b227b77184c48b6a5e2f3ed1de0c02a",
+ "31928b17ec90438ba5a2e50ae7650e63",
+ "7a5541b63a024fa88170a6b59f99ccd7",
+ "dd2af27812f742029d289df9687d6126",
+ ],
+ "id": "7407ffc1232944279b0cbcb0847c86f7",
+ "subject_id": "89ba91c18dd54abfbfde7a66936c51a6",
+ "policy_id": "3e65256389b448cb9897917ea235f0bb"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/object_assignments',
+ json={
+ "object_assignments": {
+ "201ad05fd3f940948b769ab9214fe295": {
+ "object_id": "9089b3d2ce5b4e929ffc7e35b55eba1a",
+ "assignments": [
+ "030fbb34002e4236a7b74eeb5fd71e35",
+ "4b7793dbae434c31a77da9d92de9fa8c",
+ '11209d83b167438cb8ab3e5d5351329e',
+ ],
+ "id": "201ad05fd3f940948b769ab9214fe295",
+ "category_id": "33aece52d45b4474a20dc48a76800daf",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0"
+ },
+ "90c5e86f8be34c0298fbd1973e4fb043": {
+ "object_id": "67b8008a3f8d4f8e847eb628f0f7ca0e",
+ "assignments": [
+ "7dc76c6142af47c88b60cc2b0df650ba",
+ "4b7793dbae434c31a77da9d92de9fa8c",
+ '11209d83b167438cb8ab3e5d5351329e'
+ ],
+ "id": "90c5e86f8be34c0298fbd1973e4fb043",
+ "category_id": "6d48500f639d4c2cab2b1f33ef93a1e8",
+ "policy_id": "3e65256389b448cb9897917ea235f0bb"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/action_assignments',
+ json={
+ "action_assignments": {
+ "2128e3ffbd1c4ef5be515d625745c2d4": {
+ "category_id": "241a2a791554421a91c9f1bc564aa94d",
+ "action_id": "cdb3df220dc05a6ea3334b994827b068",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "id": "2128e3ffbd1c4ef5be515d625745c2d4",
+ "assignments": [
+ "570c036781e540dc9395b83098c40ba7",
+ "7fe17d7a2e3542719f8349c3f2273182",
+ "015ca6f40338422ba3f692260377d638",
+ "23d44c17bf88480f83e8d57d2aa1ea79",
+ '5ced7ea5e1714f0888d6b4f94c32c29c',
+ ]
+ },
+ "cffb98852f3a4110af7a0ddfc4e19201": {
+ "category_id": "4a2c5abaeaf644fcaf3ca8df64000d53",
+ "action_id": "cdb3df220dc04a6ea3334b994827b068",
+ "policy_id": "3e65256389b448cb9897917ea235f0bb",
+ "id": "cffb98852f3a4110af7a0ddfc4e19201",
+ "assignments": [
+ "570c036781e540dc9395b83098c40ba7",
+ "7fe17d7a2e3542719f8349c3f2273182",
+ "015ca6f40338422ba3f692260377d638",
+ "23d44c17bf88480f83e8d57d2aa1ea79"
+ ]
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/subject_assignments/'
+ '89ba91c18dd54abfbfde7a66936c51a6',
+ json={
+ "subject_assignments": {
+ "826c1156d0284fc9b4b2ddb279f63c52": {
+ "category_id": "14e6ae0ba34d458b876c791b73aa17bd",
+ "assignments": [
+ "24ea95256c5f4c888c1bb30a187788df",
+ "6b227b77184c48b6a5e2f3ed1de0c02a",
+ "31928b17ec90438ba5a2e50ae7650e63",
+ "4e60f554dd3147af87595fb6b37dcb13",
+ "7a5541b63a024fa88170a6b59f99ccd7",
+ "4d4b3c3ba45e48589b382a6e369bafbe"
+ ],
+ "id": "826c1156d0284fc9b4b2ddb279f63c52",
+ "subject_id": "89ba91c18dd54abfbfde7a66936c51a6",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/object_assignments/'
+ '67b8008a3f8d4f8e847eb628f0f7ca0e',
+ json={
+ "object_assignments": {
+ "201ad05fd3f940948b769ab9214fe295": {
+ "object_id": "67b8008a3f8d4f8e847eb628f0f7ca0e",
+ "assignments": [
+ "030fbb34002e4236a7b74eeb5fd71e35",
+ "11209d83b167438cb8ab3e5d5351329e"
+ ],
+ "id": "201ad05fd3f940948b769ab9214fe295",
+ "category_id": "6d48500f639d4c2cab2b1f33ef93a1e8",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0"
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/action_assignments/'
+ 'cdb3df220dc05a6ea3334b994827b068',
+ json={
+ "action_assignments": {
+ "2128e3ffbd1c4ef5be515d625745c2d4": {
+ "category_id": "241a2a791554421a91c9f1bc564aa94d",
+ "action_id": "cdb3df220dc05a6ea3334b994827b068",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "id": "2128e3ffbd1c4ef5be515d625745c2d4",
+ "assignments": [
+ "570c036781e540dc9395b83098c40ba7",
+ "7fe17d7a2e3542719f8349c3f2273182",
+ "015ca6f40338422ba3f692260377d638",
+ "f8f49a779ceb47b3ac810f01ef71b4e0"
+ ]
+ }
+ }
+ }
+ )
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/rules',
+ json={
+ "rules": {
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "rules": [
+ {
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "rule": [
+ "24ea95256c5f4c888c1bb30a187788df",
+ "030fbb34002e4236a7b74eeb5fd71e35",
+ "570c036781e540dc9395b83098c40ba7"
+ ],
+ "enabled": True,
+ "id": "0201a2bcf56943c1904dbac016289b71",
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "meta_rule_id": "4700cc0e38ef4cffa34025602d267c9e"
+ },
+ {
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "rule": [
+ "4d4b3c3ba45e48589b382a6e369bafbe",
+ '11209d83b167438cb8ab3e5d5351329e',
+ '5ced7ea5e1714f0888d6b4f94c32c29c'
+ ],
+ "enabled": True,
+ "id": "0bd7da3b20bb4b57af10c0e362aac847",
+ "instructions": [
+ {
+ "decision": "grant"
+ }
+ ],
+ "meta_rule_id": "4700cc0e38ef4cffa34025602d267c9e"
+ }
+ ]
+ }
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/pipelines',
+ json={
+ "pipelines": {
+ 'b3d3e18abf3340e8b635fd49e6634ccd': {
+ 'starttime': '1548688120.3931532',
+ "port": '20000',
+ "server_ip": '127.0.0.1',
+ "status": 'up',
+ "log": '/tmp/moon_policy_id_2.log'
+ }
+
+ }
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/subject_data',
+ json={
+ 'subject_data': [
+ {
+ 'policy_id': 'f8f49a779ceb47b3ac810f01ef71b4e0',
+ 'category_id': '14e6ae0ba34d458b876c791b73aa17bd',
+ 'data': {
+ '4d4b3c3ba45e48589b382a6e369bafbe': {
+ 'id': '4d4b3c3ba45e48589b382a6e369bafbe',
+ 'name': 'testuser',
+ 'description': 'description of testuser',
+ 'category_id': '14e6ae0ba34d458b876c791b73aa17bd',
+ 'policy_id': 'f8f49a779ceb47b3ac810f01ef71b4e0'
+ }
+ }
+ },
+ ]
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/object_data',
+ json={
+ 'object_data': [
+ {
+ 'policy_id': 'f8f49a779ceb47b3ac810f01ef71b4e0',
+ 'category_id': '6d48500f639d4c2cab2b1f33ef93a1e8',
+ 'data': {
+ '11209d83b167438cb8ab3e5d5351329e': {
+ 'id': '11209d83b167438cb8ab3e5d5351329e',
+ 'name': 'testuser',
+ 'description': 'description of testuser',
+ 'category_id': '6d48500f639d4c2cab2b1f33ef93a1e8',
+ 'policy_id': 'f8f49a779ceb47b3ac810f01ef71b4e0'
+ }
+ }
+ },
+ ]
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/policies/f8f49a779ceb47b3ac810f01ef71b4e0/action_data',
+ json={
+ 'action_data': [
+ {
+ 'policy_id': 'f8f49a779ceb47b3ac810f01ef71b4e0',
+ 'category_id': '241a2a791554421a91c9f1bc564aa94d',
+ 'data': {
+ '5ced7ea5e1714f0888d6b4f94c32c29c': {
+ 'id': '5ced7ea5e1714f0888d6b4f94c32c29c',
+ 'name': 'testuser',
+ 'description': 'description of testuser',
+ 'category_id': '241a2a791554421a91c9f1bc564aa94d',
+ 'policy_id': 'f8f49a779ceb47b3ac810f01ef71b4e0'
+ }
+ }
+ }
+ ]
+ }
+ )
+
+ m.register_uri(
+ 'GET', 'http://127.0.0.1:8000/slaves',
+ json={
+ "slaves": {
+ "24aa2a391554421a98c9f1bc564ae94d": {
+ "name": "slave name",
+ "address": "http://slave"
+ }
+ }
+ }
+ )
+
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:20000/update/policy/f8f49a779ceb47b3ac810f01ef71b4e0',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:20000/update/policy/f8f49a779ceb47b3ac810f01ef71b4e0',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:20000/update/policy/eac0ecd09ceb47b3ac810f01ef71b4e0',
+ json={},
+ status_code=208
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:20000/update/policy/eac0ecd09ceb47b3ac810f01ef71b4e0',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:20000/update/pdp/b3d3e18abf3340e8b635fd49e6634ccd',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:20000/update/pdp/b3d3e18abf3340e8b635fd49e6634ccd',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:20000/update/assignment/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/subject',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:20000/update/assignment/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/object',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:20000/update/assignment/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/action',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/perimeter/89ba91c18dd54abfbfde7a66936c51a6/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/subject',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/perimeter/31fd15ad14784a9696fcc887dddbfaf9/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/subject',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/perimeter/67b8008a3f8d4f8e847eb628f0f7ca0e/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/object',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/perimeter/9089b3d2ce5b4e929ffc7e35b55eba1a/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/object',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/perimeter/cdb3df220dc05a6ea3334b994827b068/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/action',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/perimeter/9f5112afe9b34a6c894eb87246ccb7aa/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/action',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/perimeter/89ba91c18dd54abfbfde7a66936c51a6/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/subject',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/perimeter/31fd15ad14784a9696fcc887dddbfaf9/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/subject',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/perimeter/67b8008a3f8d4f8e847eb628f0f7ca0e/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/object',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/perimeter/9089b3d2ce5b4e929ffc7e35b55eba1a/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/object',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/perimeter/cdb3df220dc05a6ea3334b994827b068/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/action',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/perimeter/9f5112afe9b34a6c894eb87246ccb7aa/'
+ 'f8f49a779ceb47b3ac810f01ef71b4e0/action',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/rule/f8f49a779ceb47b3ac810f01ef71b4e0/'
+ '0201a2bcf56943c1904dbac016289b71',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/rule/f8f49a779ceb47b3ac810f01ef71b4e0/'
+ '0bd7da3b20bb4b57af10c0e362aac847',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/model/cd923d8633ff4978ab0e99938f5153d6',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/model/cd923d8633ff4978ab0e99938f5153d6',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/meta_data/14e6ae0ba34d458b876c791b73aa17bd/subject',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/meta_data/241a2a791554421a91c9f1bc564aa94d/action',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/meta_data/6d48500f639d4c2cab2b1f33ef93a1e8/object',
+ json={}
+ )
+
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/meta_rule/4700cc0e38ef4cffa34025602d267c9e',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/meta_rule/4700cc0e38ef4cffa34025602d267c9e',
+ json={}
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:20000/authz/testuser/vm1/boot',
+ json={},
+ status_code=204
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/data/4d4b3c3ba45e48589b382a6e369bafbe/subject',
+ json={}
+ )
+
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/data/11209d83b167438cb8ab3e5d5351329e/object',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE',
+ 'http://127.0.0.1:20000/update/data/5ced7ea5e1714f0888d6b4f94c32c29c/action',
+ json={}
+ )
+ m.register_uri(
+ 'PUT',
+ 'http://127.0.0.1:20000/update/slave/24aa2a391554421a98c9f1bc564ae94d',
+ json={}
+ )
+ m.register_uri(
+ 'GET',
+ '/authz/a64beb1cc224474fb4badd43173e7101/testuser/vm1/boot',
+ json={"result": True}
+ )
+ m.register_uri(
+ 'GET',
+ 'http://127.0.0.1:20000/authz/a64beb1cc224474fb4badd43173e7101/testuser/vm1/boot',
+ json={"result": True}
+ )
+
+
diff --git a/moon_engine/tests/unit_python/moon.yaml b/moon_engine/tests/unit_python/moon.yaml
new file mode 100644
index 00000000..a1257a20
--- /dev/null
+++ b/moon_engine/tests/unit_python/moon.yaml
@@ -0,0 +1,54 @@
+type: "pipeline"
+uuid: "a64beb1c-c224-474f-b4ba-dd43173e7101"
+management:
+ url: "http://127.0.0.1:8000"
+ token_file: moon_engine_users.json
+incremental_updates: false
+api_token:
+data: conf/policy_example.json
+debug: true
+
+orchestration:
+ driver: moon_engine.plugins.pyorchestrator
+ connection: local
+ port: 20000...20100
+ config_dir: /tmp
+
+authorization:
+ driver: moon_engine.plugins.authz
+
+plugins:
+ directory: /tmp
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon_engine.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console] \ No newline at end of file
diff --git a/moon_engine/tests/unit_python/moon_engine_users.json b/moon_engine/tests/unit_python/moon_engine_users.json
new file mode 100644
index 00000000..97602c98
--- /dev/null
+++ b/moon_engine/tests/unit_python/moon_engine_users.json
@@ -0,0 +1 @@
+{"_default": {"1": {"username": "admin", "password": "0ded616e9bc4dcf292e3d282adb66b76eb28335bec14608fc860f96bd0f85210486085f59eb582fc1da9e965de0735dadbeda05ddaefe3db7c9cc8b1755eb0dc", "salt": "6704f5bdd5e0193be205e04661c6b998238debd74f8c7da5503a0493b8c710358ebe6303bac9c2758521a5d228cf3954a99334604e7ea3ecd0fe240a39210a12", "api_key": "30d200fee36bfeceb0cbd1479f8dcda92720392e92c5ddb63ea06979a75b9a055516b6c840def90de49eb02abac1f78ddfe38618cc1c36000e59875acb4664d3"}}} \ No newline at end of file
diff --git a/moon_engine/tests/unit_python/policy_example.json b/moon_engine/tests/unit_python/policy_example.json
new file mode 100644
index 00000000..6adddd06
--- /dev/null
+++ b/moon_engine/tests/unit_python/policy_example.json
@@ -0,0 +1,470 @@
+{
+ "policies": [
+ {
+ "name": "MLS Policy",
+ "genre": "authz",
+ "description": "MLS policy",
+ "model": {
+ "name": "MLS"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "MLS",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "mls"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "level",
+ "description": "subject level"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "level",
+ "description": "object level"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "medium"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "low"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "mls",
+ "description": "",
+ "subject_categories": [{"name": "level"}],
+ "object_categories": [{"name": "level"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_engine/tests/unit_python/requirements.txt b/moon_engine/tests/unit_python/requirements.txt
new file mode 100644
index 00000000..611c265c
--- /dev/null
+++ b/moon_engine/tests/unit_python/requirements.txt
@@ -0,0 +1,5 @@
+hug!=2.5.0
+moon_utilities
+moon_cache
+requests_mock
+pytest-benchmark \ No newline at end of file
diff --git a/moon_interface/Dockerfile b/moon_interface/Dockerfile
deleted file mode 100644
index f4de15eb..00000000
--- a/moon_interface/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM python:3
-
-ADD . /root
-WORKDIR /root/
-RUN pip3 install -r requirements.txt
-RUN pip3 install .
-
-CMD ["python3", "-m", "moon_interface"] \ No newline at end of file
diff --git a/moon_manager/.gitignore b/moon_manager/.gitignore
new file mode 100644
index 00000000..bcf3f6c1
--- /dev/null
+++ b/moon_manager/.gitignore
@@ -0,0 +1,109 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+# moon
+*.pwd
+/.idea
+/tests/func_tests/reports
diff --git a/moon_manager/Changelog b/moon_manager/Changelog
index 2bd01595..5080934c 100644
--- a/moon_manager/Changelog
+++ b/moon_manager/Changelog
@@ -1,4 +1,4 @@
-# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# Copyright 2018 Orange and its contributors
# This software is distributed under the terms and conditions of the 'Apache-2.0'
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
@@ -7,24 +7,105 @@
CHANGES
=======
-1.0.0
------
+0.1
+---
- First version of the manager
-2.0.0
------
-- Version built inside the Keystone component
+0.2
+---
+- Add the PIP plugin architecture and the OpenStack plugin
-3.0.0
------
-- Version built outside the Keystone component
+0.3
+---
+- Add the PDP API
+- Add the Policy API
+- Add the Perimeter API
+- Add the Slave API
+- Add the Meta Rule API
+- moon_manager/moon_manager/plugins/sql.py: allow the vim_project_id to be empty
+- Update Moon configuration file
+- Fix some bugs in moon_manager.api
+- Integrating with keystone plugin
+- Fix requirements.txt yaml to pyyaml
+- Add exception handler
+- Add Assignment API
+- Add authentication system
+- Add Meta-Data API
+- Add Data API
+- Add Rules API
+- Add Model API
+- Add json_import API
+- Add json_export API
+- Integrate All APIs with auth
+- removing base_exception, json_utils to moon_utilities
-4.0.0
------
-- First micro-architecture version
+0.4
+---
+- Move the pipeline creation to the wrapper component
+- Move the authentication functions to moon_utilities
+- Add API key exchange functionality
+- Update Wrapper process creation
+- Update response from slave API
+- Adding invalid_function for all api
+- Fix the rule API bug
+- Fix the different responses between Get and Post slave APIs
+- Add the possibility to not use the pip plugin
+- Add a logout API
+- Add the re-authentication functionality
+- Updating deleting perimeter_assignment functionality to delete successfully
-4.5.2
------
-- use the threading capability of Flask app
-- set the number of manager to 1
-- update to the latest version of the python-moondb library
+0.5
+---
+- Add command lines for managing the Manager
+
+0.6
+---
+- Force the use of Gunicorn as the production server
+
+0.7
+---
+- Fix the configuration directory issue in the Wrapper and Pipeline servers
+- Fix the import errors (multiple import of the same policy)
+- Add performance tests
+- Force Gunicorn to run as a daemon
+- Add an endpoint for the dashboard: /static/index.html
+- Move the import functionality to moon_utilities
+- Fix the no deletion of the slave server when deleting the slave, the pid file is created in config_dir
+- Add of CLI for pdp update
+- Add a command to run tests given in policy file
+- Fixing not to delete Perimeter when policy empty (except direct delete)
+- Fixing rule ['instruction'] to be array instead of object
+- Increase the speed of the rules command
+- Add of CLI for status + human / quiet options
+- Fix the perimeter gets while filtering on non string argument
+- Add the global attribute functionality
+- Can now create several models with empty meta rules
+- Adaptation following the removal of the field database > pwd_file in moon.yaml
+- Add of update CLI for the policies
+
+0.8
+---
+- Manager now retrieves api key and other data about slaves after restarting
+- Add cli to update the slaves
+- Add the grant_if_unknown_project parameter
+- Disallow to update model/meta-rule assigned to policy
+- Fix the system accepts invalid decision value “not grant”
+- Add plugin for nova
+- Add daemon to retrieve periodically subjects and objects from openstack
+- Add start/stop server and/or daemon in CLI
+- Fix subject/object_assignment deletion CLI
+- Fix Running moon_manager from another host
+- Fix and check CLI help string
+- Fix in models CLI : can now give the meta_rule at creation
+
+0.9
+---
+- Can now update the meta rules while their model is not linked to a policy
+- Moon users can now change their password
+- Add of the update decision of rule cli/api
+- Now logs the user who adds / patches / deletes a rule
+- Add the start/stop command for the web GUI
+- Status of the web GUI now visible with the status command
+- Fix the creation of slaves with -g option
+- Can now update a slave
+- CLIs now use env variables to authenticate the user
diff --git a/moon_manager/Dockerfile b/moon_manager/Dockerfile
deleted file mode 100644
index b5eb4e02..00000000
--- a/moon_manager/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM python:3
-
-ADD . /root
-WORKDIR /root/
-RUN pip3 install -r requirements.txt
-RUN pip3 install .
-
-CMD ["python3", "-m", "moon_manager"] \ No newline at end of file
diff --git a/moon_manager/MANIFEST.in b/moon_manager/MANIFEST.in
index 1f674d50..cf4d2e4e 100644
--- a/moon_manager/MANIFEST.in
+++ b/moon_manager/MANIFEST.in
@@ -3,7 +3,7 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-include README.rst
+include README.md
include LICENSE
include setup.py
include requirements.txt
diff --git a/moon_manager/README.md b/moon_manager/README.md
index c74ccc28..1881827f 100644
--- a/moon_manager/README.md
+++ b/moon_manager/README.md
@@ -1,8 +1,124 @@
# moon_manager
-This package contains the core module for the Moon project
-It is designed to provide authorization features to all OpenStack components.
+## Installation
-For any other information, refer to the parent project:
+```bash
+python -m pip install moon_manager
+sudo moon_manager_setup
+```
+If you want a development version:
- https://git.opnfv.org/moon
+```bash
+ARTIFACTORY=https://artifactory-iva.si.francetelecom.fr/artifactory/api/pypi/python-virt-orange-product-devops/simple
+sudo python -m pip install --pre moon_manager -i $ARTIFACTORY
+```
+Use it at your own risk, this is an unstable version.
+
+If you want to be in development mode, and get the code, you can do the following steps:
+
+```bash
+git clone git@gitlab.forge.orange-labs.fr:moon/moon_utilities.git
+cd moon_utilities
+sudo pip install -r requirements.txt
+sudo pip install -e .
+cd ..
+git clone git@gitlab.forge.orange-labs.fr:moon/moon_manager.git
+cd moon_manager
+sudo pip install -e .
+```
+
+## Configuration
+
+A configuration file should be located in `/etc/moon/moon.yaml`, review it and update it to fit your needs.
+You may need to change the following attributes:
+
+* `debug`: true to false
+* `database: url`: either sqlite or mysql
+* `pwd_file`: put this file in a secured directory, this file contains the users and passwords of all the system
+* `openstack: url`: the URL of the Keystone server (if used)
+
+## Initialization
+
+To initialize the database, use:
+
+```bash
+moon_manager db
+```
+
+You need to add a new user (for example admin):
+
+```bash
+moon_manager users add admin [-p admin_password]
+```
+If the password is not given, you will be prompt for one.
+
+## Web server execution
+
+For a development server, use:
+
+```bash
+hug -m moon_manager.server
+```
+
+For a production server:
+
+If you use Information plugins, you must start the daemon (experimental):
+
+```bash
+moon_manager start_daemon
+```
+
+Then, start the server and connect to the CLI with the `/etc/moon/moonrc` file:
+
+```bash
+moon_manager start_manager
+. /etc/moon/moonrc admin admin
+# Check if the service is up and running
+moon_manager status --human
+```
+
+## Connect to API
+
+* With a web browser
+ 1. go to http://127.0.0.1:8000/auth
+ 2. insert login and password (admin/admin for example)
+ 3. with "RestClient", "Postman" or an other Web API client add the "x-api-key" in headers with the key given by the previous step.
+* With a console
+ 1. execute a basic auth to http://127.0.0.1:8000/auth
+ 2. use the received token to connect to API
+
+Example with httpie:
+
+```bash
+sudo python -m pip install httpie
+http -a admin:admin 127.0.0.1:8000/auth
+# copy the Token in TOKEN
+http 127.0.0.1:8000/subjects "x-api-key:$TOKEN"
+```
+
+## Connect to HTML UI
+You need to have `serve` installed on your server. To install it:
+
+```
+sudo apt install npm
+sudo npm install -g serve
+```
+
+Then, configure the dashboard part of the `/etc/moon/moon.yaml` file like this:
+
+```
+dashboard:
+root: <path to dist dir of moon gui>
+pid_filename: <file to store the pid in, eg. /tmp/moon_web_ui.pid>
+port: 8080
+```
+
+and:
+
+```bash
+moon_manager start_gui
+```
+
+Open your web browser and go to: http://127.0.0.1:8080/
+
+The port can be changed in the conf file.
diff --git a/moon_manager/conf/moon.yaml b/moon_manager/conf/moon.yaml
new file mode 100644
index 00000000..6bf0ec14
--- /dev/null
+++ b/moon_manager/conf/moon.yaml
@@ -0,0 +1,108 @@
+debug: true
+
+database:
+ # url: mysql+pymysql://moon:p4sswOrd1@db/moon
+ url: sqlite:////tmp/database.db
+ driver: moon_manager.plugins.sql
+ migration_dir: moon_manager.api.db.migrations
+ # migration_dir: /home/tom/projets/moon/moon_manager/moon_manager/api/db/migrations/
+
+dashboard:
+ root: ../dashboard/moon_ui/dist/
+ pid_filename: /tmp/moon_web_ui.pid
+ port: 8080
+
+management:
+ url: http://127.0.0.1:8000
+ user: admin
+ password: admin
+ token_file: moon.pwd
+ pid_file: /tmp/moon.pid
+
+orchestration:
+ driver: moon_manager.plugins.pyorchestrator
+ connection: local
+ # driver: moon_manager.plugins.docker_compose
+ # connection: ssh://admin:admin@1.1.1.1
+ # driver: moon_manager.plugins.kubernetes
+ # connection: ~/.kube/config
+ port: 10000...10100
+ config_dir: /tmp
+
+information:
+ user: admin
+ password: p4ssw0rd
+ domain: default
+ project: admin
+ check_token: false
+ certificate: false
+ url: http://keystone:5000/v3
+ subjects:
+ drivers:
+ moon_manager.plugins.moon_keystone_plugin:
+ url: http://keystone:5000/v3
+ objects:
+ drivers:
+ moon_manager.plugins.moon_nova_plugin:
+ url: http://keystone:5000/compute/v2.1
+
+ daemon:
+ pid_file: /tmp/daemon.pid
+ log_file: /tmp/daemon.log
+
+ global_attrs:
+ driver: moon_manager.plugins.global_attrs
+ attributes:
+ mode:
+ values:
+ - build
+ - run
+ default: build
+ url: file:/etc/moon/mode
+ #url: https://127.0.0.1:8080/mode
+ #url: mysql+pymysql://moon:p4sswOrd1@db/moon_mode
+ #url: sqlite:////tmp/database.db
+ #url: driver://moon_manager.plugins.my_plugin
+
+plugins:
+ directory: /var/moon/plugins
+
+components:
+ manager:
+ port: 8080
+ bind: 0.0.0.0
+ hostname: manager
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
+
diff --git a/moon_authz/moon_authz/api/__init__.py b/moon_manager/docs/test.rst
index e69de29b..e69de29b 100644
--- a/moon_authz/moon_authz/api/__init__.py
+++ b/moon_manager/docs/test.rst
diff --git a/moon_manager/moon_manager/__init__.py b/moon_manager/moon_manager/__init__.py
index 20a70977..0b23fdc3 100644
--- a/moon_manager/moon_manager/__init__.py
+++ b/moon_manager/moon_manager/__init__.py
@@ -1,6 +1,16 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
-__version__ = "4.5.2"
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Moon Manager is a component that manage the database of the platform.
+"""
+
+__version__ = "0.9.1"
diff --git a/moon_manager/moon_manager/__main__.py b/moon_manager/moon_manager/__main__.py
index 4fed8d10..ee8ea46f 100644
--- a/moon_manager/moon_manager/__main__.py
+++ b/moon_manager/moon_manager/__main__.py
@@ -1,4 +1,232 @@
-from moon_manager.server import create_server
+# Software Name: MOON
-server = create_server()
-server.run()
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+import sys
+import os
+import subprocess # nosec
+from moon_utilities import auth_functions
+from moon_manager.api import configuration
+from moon_utilities.auth_functions import init_db
+from moon_manager import daemon
+import hug.interface
+
+LOGGER = logging.getLogger("moon.manager")
+configuration.init_logging()
+
+_conf = configuration.get_configuration()
+_conf["logging"]["loggers"]["moon"]["level"] = "WARNING"
+configuration.set_configuration(_conf)
+
+
+@hug.cli("start_manager")
+def start_manager():
+ """ start the manager """
+ pid_filename = _conf["management"]["pid_file"]
+ _command = ["gunicorn", "moon_manager.server:__hug_wsgi__", "--threads", "5",
+ "--bind", "0.0.0.0:8000", "-D", "-p", pid_filename]
+ subprocess.Popen(_command, stdout=subprocess.PIPE, close_fds=True) # nosec
+
+
+@hug.cli("stop_manager")
+def stop_manager():
+ """ stop the manager """
+ pid_filename = _conf["management"]["pid_file"]
+ with open(pid_filename, 'r') as pid_file:
+ try:
+ pid = int(pid_file.read())
+ except ValueError:
+ LOGGER.error("The pid found in {} is not valid".format(pid_filename))
+ return
+
+ os.kill(pid, 15)
+
+
+@hug.cli("start_web")
+def start_web():
+ """ start the web gui """
+ dist = _conf["dashboard"]["root"]
+ port = _conf["dashboard"]["port"]
+ pid_filename = _conf["dashboard"]["pid_filename"]
+ os.chdir(dist)
+ _command = ["serve", "-l", str(port)]
+ web_gui_proc = subprocess.Popen(_command, stdout=subprocess.PIPE, close_fds=True) # nosec
+ with open(pid_filename, 'w') as f:
+ f.write(str(web_gui_proc.pid))
+
+
+@hug.cli("stop_web")
+def stop_web():
+ """ stop the web gui """
+ pid_filename = _conf["dashboard"]["pid_filename"]
+ with open(pid_filename, 'r') as pid_file:
+ try:
+ pid = int(pid_file.read())
+ except ValueError:
+ LOGGER.error("The pid found in {} is not valid".format(pid_filename))
+ return
+
+ os.kill(pid, 15)
+
+
+@hug.cli("start_all")
+def start_all():
+ """ start the manager and the auto-update service """
+ start_manager()
+ daemon.run()
+
+
+@hug.cli("stop_all")
+def stop_all():
+ """ stop the manager and the auto-update service """
+ stop_manager()
+ daemon.stop()
+
+
+def run(command=None):
+ if len(sys.argv) > 1:
+ if not command:
+ command = sys.argv[1]
+ # Note: delete the command argument because Hug CLI system read it
+ sys.argv.pop(1)
+ init_db(configuration.get_configuration("management").get("token_file"))
+
+ if command == "conf":
+ configuration.get_configuration.interface.cli()
+ elif command == "db":
+ configuration.init_database.interface.cli()
+ elif command == "start_manager":
+ start_manager.interface.cli()
+ elif command == "stop_manager":
+ stop_manager.interface.cli()
+ elif command == "start_gui":
+ start_web.interface.cli()
+ elif command == "stop_gui":
+ stop_web.interface.cli()
+ elif command == "start_daemon":
+ daemon.run.interface.cli()
+ elif command == "stop_daemon":
+ daemon.stop.interface.cli()
+ elif command == "start_all":
+ start_all.interface.cli()
+ elif command == "stop_all":
+ stop_all.interface.cli()
+ elif command == "users":
+ from moon_manager.api import users
+ users.UsersAPI.cli()
+ elif command == "import":
+ configuration.import_json.interface.cli()
+ elif command == "slaves":
+ from moon_manager.api import slave
+ slave.SlavesAPI.cli()
+ elif command == "status":
+ from moon_manager.api import status
+ status.status.interface.cli()
+ elif command == "models":
+ from moon_manager.api import models
+ models.ModelsAPI.cli()
+ elif command == "pdp":
+ from moon_manager.api import pdp
+ pdp.PDPAPI.cli()
+ elif command == "policies":
+ from moon_manager.api import policy
+ policy.PoliciesAPI.cli()
+ elif command == "subjects":
+ from moon_manager.api import perimeter
+ perimeter.SubjectsAPI.cli()
+ elif command == "objects":
+ from moon_manager.api import perimeter
+ perimeter.ObjectsAPI.cli()
+ elif command == "actions":
+ from moon_manager.api import perimeter
+ perimeter.ActionsAPI.cli()
+ elif command == "subject_categories":
+ from moon_manager.api import meta_data
+ meta_data.SubjectCategoriesAPI.cli()
+ elif command == "object_categories":
+ from moon_manager.api import meta_data
+ meta_data.ObjectCategoriesAPI.cli()
+ elif command == "action_categories":
+ from moon_manager.api import meta_data
+ meta_data.ActionCategoriesAPI.cli()
+ elif command == "subject_data":
+ from moon_manager.api import data
+ data.SubjectDataAPI.cli()
+ elif command == "object_data":
+ from moon_manager.api import data
+ data.ObjectDataAPI.cli()
+ elif command == "action_data":
+ from moon_manager.api import data
+ data.ActionDataAPI.cli()
+ elif command == "subject_assignments":
+ from moon_manager.api import assignments
+ assignments.SubjectAssignmentsAPI.cli()
+ elif command == "object_assignments":
+ from moon_manager.api import assignments
+ assignments.ObjectAssignmentsAPI.cli()
+ elif command == "action_assignments":
+ from moon_manager.api import assignments
+ assignments.ActionAssignmentsAPI.cli()
+ elif command == "meta_rules":
+ from moon_manager.api import meta_rules
+ meta_rules.MetaRulesAPI.cli()
+ elif command == "rules":
+ from moon_manager.api import rules
+ rules.RulesAPI.cli()
+ elif command == "tests":
+ from moon_manager.api import checks
+ checks.ChecksAPI.cli()
+ elif command == "attrs":
+ from moon_manager.api import attributes
+ attributes.AttrsAPI.cli()
+ else:
+ LOGGER.critical("Unknown command {}".format(command))
+ else:
+ # TODO: update the command management by using argparse
+ print("""Possible commands are:
+ - conf
+ - db
+ - start_manager
+ - stop_manager
+ - start_gui
+ - stop_gui
+ - start_daemon
+ - stop_daemon
+ - start_all
+ - stop_all
+ - users
+ - import
+ - slaves
+ - models
+ - pdp
+ - policies
+ - subject_data
+ - object_data
+ - action_data
+ - subjects
+ - objects
+ - actions
+ - subject_categories
+ - object_categories
+ - action_categories
+ - subject_assignments
+ - object_assignments
+ - action_assignments
+ - meta_rules
+ - rules
+ - tests
+ - attrs
+ """)
+
+
+if __name__ == "__main__":
+ run()
diff --git a/moon_manager/moon_manager/api/__init__.py b/moon_manager/moon_manager/api/__init__.py
index e69de29b..bf70b330 100644
--- a/moon_manager/moon_manager/api/__init__.py
+++ b/moon_manager/moon_manager/api/__init__.py
@@ -0,0 +1,28 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from falcon import HTTP_400, HTTP_401, HTTP_402, HTTP_403, HTTP_404, HTTP_405, \
+ HTTP_406, HTTP_407, HTTP_408, HTTP_409, HTTP_500
+
+ERROR_CODE = {
+ 400: HTTP_400,
+ 401: HTTP_401,
+ 402: HTTP_402,
+ 403: HTTP_403,
+ 404: HTTP_404,
+ 405: HTTP_405,
+ 406: HTTP_406,
+ 407: HTTP_407,
+ 408: HTTP_408,
+ 409: HTTP_409,
+ 500: HTTP_500
+}
diff --git a/moon_manager/moon_manager/api/assignments.py b/moon_manager/moon_manager/api/assignments.py
index 0b2cd20b..742a043b 100644
--- a/moon_manager/moon_manager/api/assignments.py
+++ b/moon_manager/moon_manager/api/assignments.py
@@ -1,46 +1,57 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
"""
Assignments allow to connect data with elements of perimeter
"""
-
-from flask import request
-from flask_restful import Resource
+import hug
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PolicyManager
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities.security_functions import validate_input
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
+from moon_manager.api import policy
+from moon_manager.api import perimeter
+from moon_manager.api import meta_data
+from moon_manager.api import data
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_utilities.invalided_functions import invalidate_assignment_in_slaves
-__version__ = "4.3.2"
+# from moon_manager.server import handle_exception, handle_custom_exceptions
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-class SubjectAssignments(Resource):
+class SubjectAssignments(object):
"""
Endpoint for subject assignment requests
"""
- __urls__ = (
- "/policies/<string:uuid>/subject_assignments",
- "/policies/<string:uuid>/subject_assignments/",
- "/policies/<string:uuid>/subject_assignments/<string:perimeter_id>",
- "/policies/<string:uuid>/subject_assignments/<string:perimeter_id>/<string:category_id>",
- "/policies/<string:uuid>/subject_assignments/<string:perimeter_id>/<string:category_id>/<string:data_id>",
- )
-
- @check_auth
- def get(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/subject_assignments", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/subject_assignments/{perimeter_id}",
+ requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/subject_assignments/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ def get(uuid: hug.types.text, perimeter_id: hug.types.text = None,
+ category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all subject assignments or a specific one for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the subject
:param category_id: uuid of the subject category
- :param data_id: uuid of the subject scope
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"subject_data_id": {
"policy_id": "ID of the policy",
@@ -51,106 +62,104 @@ class SubjectAssignments(Resource):
}
:internal_api: get_subject_assignments
"""
- try:
- data = PolicyManager.get_subject_assignments(
- user_id=user_id, policy_id=uuid,
- subject_id=perimeter_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.get_subject_assignments(
+ moon_user_id=authed_user, policy_id=uuid,
+ subject_id=perimeter_id, category_id=category_id)
+
return {"subject_assignments": data}
- @check_auth
- def post(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/subject_assignments", requires=api_key_authentication)
+ def post(body: validate_input("id", "category_id", "data_id"), uuid: hug.types.text,
+ authed_user: hug.directives.user = None):
"""Create a subject assignment.
+ :param body: body of the request
:param uuid: uuid of the policy
- :param perimeter_id: uuid of the subject (not used here)
- :param category_id: uuid of the subject category (not used here)
- :param data_id: uuid of the subject scope (not used here)
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "id": "UUID of the subject",
- "category_id": "UUID of the category"
- "data_id": "UUID of the scope"
+ "id": "UUID of the subject (mandatory)",
+ "category_id": "UUID of the category (mandatory)"
+ "data_id": "UUID of the scope (mandatory)"
}
:return: {
"subject_data_id": {
"policy_id": "ID of the policy",
- "subject_id": "ID of the subject",
- "category_id": "ID of the category",
+ "subject_id": "ID of the subject (mandatory)",
+ "category_id": "ID of the category (mandatory)",
"assignments": "Assignments list (list of data_id)",
}
}
:internal_api: update_subject_assignment
"""
- try:
- data_id = request.json.get("data_id")
- category_id = request.json.get("category_id")
- perimeter_id = request.json.get("id")
- data = PolicyManager.add_subject_assignment(
- user_id=user_id, policy_id=uuid,
- subject_id=perimeter_id, category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data_id = body.get("data_id")
+ category_id = body.get("category_id")
+ perimeter_id = body.get("id")
+
+ data = driver.PolicyManager.add_subject_assignment(
+ moon_user_id=authed_user, policy_id=uuid,
+ subject_id=perimeter_id, category_id=category_id, data_id=data_id)
+
return {"subject_assignments": data}
- @check_auth
- def delete(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/subject_assignments", requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/subject_assignments/{perimeter_id}",
+ requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/subject_assignments/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/subject_assignments/{perimeter_id}/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete(uuid: hug.types.text, perimeter_id: hug.types.text = None,
+ category_id: hug.types.text = None, data_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Delete a subject assignment for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the subject
:param category_id: uuid of the subject category
:param data_id: uuid of the subject scope
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message"
}
:internal_api: delete_subject_assignment
"""
- try:
- data = PolicyManager.delete_subject_assignment(
- user_id=user_id, policy_id=uuid,
- subject_id=perimeter_id, category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ driver.PolicyManager.delete_subject_assignment(
+ moon_user_id=authed_user, policy_id=uuid,
+ subject_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_assignment_in_slaves(slaves=slaves, policy_id=uuid, perimeter_id=perimeter_id,
+ category_id=category_id, data_id=data_id, type="subject")
return {"result": True}
-class ObjectAssignments(Resource):
+class ObjectAssignments(object):
"""
Endpoint for object assignment requests
"""
- __urls__ = (
- "/policies/<string:uuid>/object_assignments",
- "/policies/<string:uuid>/object_assignments/",
- "/policies/<string:uuid>/object_assignments/<string:perimeter_id>",
- "/policies/<string:uuid>/object_assignments/<string:perimeter_id>/<string:category_id>",
- "/policies/<string:uuid>/object_assignments/<string:perimeter_id>/<string:category_id>/<string:data_id>",
- )
-
- @check_auth
- def get(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/object_assignments", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/object_assignments/{perimeter_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/object_assignments/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ def get(uuid: hug.types.text, perimeter_id: hug.types.text = None,
+ category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all object assignment or a specific one for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the object
:param category_id: uuid of the object category
- :param data_id: uuid of the object scope
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"object_data_id": {
"policy_id": "ID of the policy",
@@ -161,30 +170,27 @@ class ObjectAssignments(Resource):
}
:internal_api: get_object_assignments
"""
- try:
- data = PolicyManager.get_object_assignments(
- user_id=user_id, policy_id=uuid,
- object_id=perimeter_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.get_object_assignments(
+ moon_user_id=authed_user, policy_id=uuid,
+ object_id=perimeter_id, category_id=category_id)
+
return {"object_assignments": data}
- @check_auth
- def post(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/object_assignments", requires=api_key_authentication)
+ def post(body: validate_input("id", "category_id", "data_id"), uuid,
+ authed_user: hug.directives.user = None):
"""Create an object assignment.
+ :param body: body of the request
:param uuid: uuid of the policy
- :param perimeter_id: uuid of the object (not used here)
- :param category_id: uuid of the object category (not used here)
- :param data_id: uuid of the object scope (not used here)
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "id": "UUID of the action",
- "category_id": "UUID of the category"
- "data_id": "UUID of the scope"
+ "id": "UUID of the action (mandatory)",
+ "category_id": "UUID of the category (mandatory)",
+ "data_id": "UUID of the scope (mandatory)"
}
:return: {
"object_data_id": {
@@ -196,71 +202,71 @@ class ObjectAssignments(Resource):
}
:internal_api: update_object_assignment
"""
- try:
- data_id = request.json.get("data_id")
- category_id = request.json.get("category_id")
- perimeter_id = request.json.get("id")
- data = PolicyManager.add_object_assignment(
- user_id=user_id, policy_id=uuid,
- object_id=perimeter_id, category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data_id = body.get("data_id")
+ category_id = body.get("category_id")
+ perimeter_id = body.get("id")
+ data = driver.PolicyManager.add_object_assignment(moon_user_id=authed_user, policy_id=uuid,
+ object_id=perimeter_id,
+ category_id=category_id, data_id=data_id)
+
return {"object_assignments": data}
- @check_auth
- def delete(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/object_assignments", requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/object_assignments/{perimeter_id}",
+ requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/object_assignments/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/object_assignments/{perimeter_id}/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete(uuid: hug.types.text, perimeter_id: hug.types.text = None,
+ category_id: hug.types.text = None, data_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Delete a object assignment for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the object
:param category_id: uuid of the object category
:param data_id: uuid of the object scope
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message"
}
:internal_api: delete_object_assignment
"""
- try:
- data = PolicyManager.delete_object_assignment(
- user_id=user_id, policy_id=uuid,
- object_id=perimeter_id, category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ driver.PolicyManager.delete_object_assignment(
+ moon_user_id=authed_user, policy_id=uuid, object_id=perimeter_id,
+ category_id=category_id, data_id=data_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_assignment_in_slaves(slaves=slaves, policy_id=uuid, perimeter_id=perimeter_id,
+ category_id=category_id, data_id=data_id, type="object")
+
return {"result": True}
-class ActionAssignments(Resource):
+class ActionAssignments(object):
"""
Endpoint for action assignment requests
"""
- __urls__ = (
- "/policies/<string:uuid>/action_assignments",
- "/policies/<string:uuid>/action_assignments/",
- "/policies/<string:uuid>/action_assignments/<string:perimeter_id>",
- "/policies/<string:uuid>/action_assignments/<string:perimeter_id>/<string:category_id>",
- "/policies/<string:uuid>/action_assignments/<string:perimeter_id>/<string:category_id>/<string:data_id>",
- )
-
- @check_auth
- def get(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/action_assignments", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/action_assignments/{perimeter_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/action_assignments/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ def get(uuid: hug.types.text, perimeter_id: hug.types.text = None,
+ category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all action assignment or a specific one for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the action
:param category_id: uuid of the action category
- :param data_id: uuid of the action scope
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"action_data_id": {
"policy_id": "ID of the policy",
@@ -271,30 +277,26 @@ class ActionAssignments(Resource):
}
:internal_api: get_action_assignments
"""
- try:
- data = PolicyManager.get_action_assignments(
- user_id=user_id, policy_id=uuid,
- action_id=perimeter_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.get_action_assignments(
+ moon_user_id=authed_user, policy_id=uuid,
+ action_id=perimeter_id, category_id=category_id)
+
return {"action_assignments": data}
- @check_auth
- def post(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/action_assignments", requires=api_key_authentication)
+ def post(body: validate_input("id", "category_id", "data_id"), uuid,
+ authed_user: hug.directives.user = None):
"""Create an action assignment.
+ :param body: body of the request
:param uuid: uuid of the policy
- :param perimeter_id: uuid of the action (not used here)
- :param category_id: uuid of the action category (not used here)
- :param data_id: uuid of the action scope (not used here)
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "id": "UUID of the action",
- "category_id": "UUID of the category",
- "data_id": "UUID of the scope"
+ "id": "UUID of the action (mandatory)",
+ "category_id": "UUID of the category (mandatory)",
+ "data_id": "UUID of the scope (mandatory)"
}
:return: {
"action_data_id": {
@@ -306,43 +308,437 @@ class ActionAssignments(Resource):
}
:internal_api: update_action_assignment
"""
- try:
- data_id = request.json.get("data_id")
- category_id = request.json.get("category_id")
- perimeter_id = request.json.get("id")
- data = PolicyManager.add_action_assignment(
- user_id=user_id, policy_id=uuid,
- action_id=perimeter_id, category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data_id = body.get("data_id")
+ category_id = body.get("category_id")
+ perimeter_id = body.get("id")
+ data = driver.PolicyManager.add_action_assignment(
+ moon_user_id=authed_user, policy_id=uuid,
+ action_id=perimeter_id, category_id=category_id, data_id=data_id)
+
return {"action_assignments": data}
- @check_auth
- def delete(self, uuid=None, perimeter_id=None, category_id=None,
- data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/action_assignments", requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/action_assignments/{perimeter_id}",
+ requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/action_assignments/{perimeter_id}/{category_id}",
+ requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/action_assignments/{perimeter_id}/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete(uuid: hug.types.text, perimeter_id: hug.types.text = None,
+ category_id: hug.types.text = None, data_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Delete a action assignment for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the action
:param category_id: uuid of the action category
:param data_id: uuid of the action scope
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message"
}
:internal_api: delete_action_assignment
"""
- try:
- data = PolicyManager.delete_action_assignment(
- user_id=user_id, policy_id=uuid,
- action_id=perimeter_id, category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ driver.PolicyManager.delete_action_assignment(
+ moon_user_id=authed_user, policy_id=uuid,
+ action_id=perimeter_id, category_id=category_id, data_id=data_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_assignment_in_slaves(slaves=slaves, policy_id=uuid, perimeter_id=perimeter_id,
+ category_id=category_id, data_id=data_id, type="action")
+
return {"result": True}
+
+
+SubjectAssignmentsAPI = hug.API(name='subject_assignments', doc=SubjectAssignments.__doc__)
+ObjectAssignmentsAPI = hug.API(name='object_assignments', doc=ObjectAssignments.__doc__)
+ActionAssignmentsAPI = hug.API(name='action_assignments', doc=ActionAssignments.__doc__)
+
+
+@hug.object(name='subjects', version='1.0.0', api=SubjectAssignmentsAPI)
+class SubjectAssignmentsCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _assignments_req = requests.get("{}/policies/{}/subject_assignments".format(
+ db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ _assignment_key = None
+ if _assignments_req.status_code == 200:
+ _subject_assignments = _assignments_req.json().get("subject_assignments")
+ if name_or_id:
+ _assignments = None
+ if name_or_id in _subject_assignments:
+ _assignments = _subject_assignments.get(name_or_id)
+ _assignment_key = name_or_id
+ else:
+ for _key in _subject_assignments:
+ try:
+ _subject = perimeter.SubjectsCLI.list(name_or_id).get("subjects")[0]
+ _subject_key = list(_subject.keys())[0]
+ except Exception as e:
+ # FIXME: should upgrade this exception
+ LOGGER.exception(e)
+ continue
+ else:
+ if _subject_assignments.get(_key).get("subject_id") == _subject_key:
+ _assignments = _subject_assignments.get(_key)
+ _assignment_key = _key
+ break
+ if not _assignments:
+ raise Exception("Cannot find Subject Assignments with ID {}".format(name_or_id))
+ result = {"subject_assignments": [{_assignment_key: _assignments}]}
+ else:
+ result = _assignments_req.json()
+
+ if human:
+ return SubjectAssignmentsCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Subject Assignments {}'.format(_assignments_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id, human: bool = False):
+ """
+ Add subject assignment in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ perimeter_id = list(perimeter.SubjectsCLI.list(perimeter_name_or_id).get("subjects")[0].keys())[0]
+ category_id = list(meta_data.SubjectCategoriesCLI.list(category_name_or_id).get("subject_categories").keys())[0]
+ data_id = data.SubjectDataCLI.list(policy_id, data_name_or_id).get("subject_data").get("id")
+ _url = "{}/policies/{}/subject_assignments".format(db_conf.get("url"), policy_id)
+
+ _assignments = requests.post(
+ _url,
+ json={
+ "id": perimeter_id,
+ "category_id": category_id,
+ "data_id": data_id,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _assignments.status_code == 200:
+ LOGGER.warning('Create {}'.format(_assignments.content))
+ if human:
+ return SubjectAssignmentsCLI.human_display(_assignments.json())
+ else:
+ return _assignments.json()
+ LOGGER.error('Cannot create assignment for {}/{}/{} ({})'.format(
+ perimeter_name_or_id, category_name_or_id, data_name_or_id, _assignments.content[:40]))
+ LOGGER.error("{}/{}/{}".format(perimeter_id, category_id, data_id))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ perimeter_id = list(perimeter.SubjectsCLI.list(perimeter_name_or_id).get("subjects")[0].keys())[0]
+ category_id = list(meta_data.SubjectCategoriesCLI.list(category_name_or_id).get("subject_categories").keys())[0]
+ data_id = data.SubjectDataCLI.list(policy_id, data_name_or_id).get("subject_data").get("id")
+ _url = "{}/policies/{}/subject_assignments/{}/{}/{}".format(
+ db_conf.get("url"),
+ policy_id,
+ perimeter_id,
+ category_id,
+ data_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}-{}-{}-{}'.format(
+ policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id))
+ return True
+ LOGGER.error("Cannot delete Assignment with {}-{}-{}-{}".format(
+ policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id
+ ))
+ return False
+
+ @staticmethod
+ def human_display(subject_assigment_json):
+ human_result = "Subject Assignments"
+ for subject_assignment in subject_assigment_json.get("subject_assignments"):
+ human_result += "\n" + subject_assigment_json.get("subject_assignments").get(subject_assignment).get("id") + "\n"
+ human_result += "\tid : " + subject_assigment_json.get("subject_assignments").get(subject_assignment).get("id") + "\n"
+ human_result += "\tpolicy_id : " + subject_assigment_json.get("subject_assignments").get(subject_assignment).get("policy_id") + "\n"
+ human_result += "\tsubject_id : " + subject_assigment_json.get("subject_assignments").get(subject_assignment).get("subject_id") + "\n"
+ human_result += "\tcategory_id : " + subject_assigment_json.get("subject_assignments").get(subject_assignment).get("category_id") + "\n"
+ human_result += "\tassignments : \n"
+ for assignment in subject_assigment_json.get("subject_assignments").get(subject_assignment).get("assignments"):
+ human_result += "\t\t" + assignment + "\n"
+ return human_result
+
+
+@hug.object(name='objects', version='1.0.0', api=ObjectAssignmentsAPI)
+class ObjectAssignmentsCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _assignments_req = requests.get("{}/policies/{}/object_assignments".format(
+ db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ _assignment_key = None
+ if _assignments_req.status_code == 200:
+ _object_assignments = _assignments_req.json().get("object_assignments")
+ if name_or_id:
+ _assignments = None
+ if name_or_id in _object_assignments:
+ _assignments = _object_assignments.get(name_or_id)
+ _assignment_key = name_or_id
+ else:
+ for _key in _object_assignments:
+ try:
+ _object = perimeter.ObjectsCLI.list(name_or_id).get("objects")[0]
+ _object_key = list(_object.keys())[0]
+ except Exception as e:
+ # FIXME: should upgrade this exception
+ LOGGER.exception(e)
+ continue
+ else:
+ if _object_assignments.get(_key).get("object_id") == _object_key:
+ _assignments = _object_assignments.get(_key)
+ _assignment_key = _key
+ break
+ if not _assignments:
+ raise Exception("Cannot find Object Assignments with ID {}".format(name_or_id))
+ result = {"object_assignments": [{_assignment_key: _assignments}]}
+ else:
+ result = _assignments_req.json()
+
+ if human:
+ return ObjectAssignmentsCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Object Assignments {}'.format(_assignments_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id, human: bool = False):
+ """
+ Add object assignment in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ perimeter_id = list(perimeter.ObjectsCLI.list(perimeter_name_or_id).get("objects")[0].keys())[0]
+ category_id = list(meta_data.ObjectCategoriesCLI.list(category_name_or_id).get("object_categories").keys())[0]
+ data_id = data.ObjectDataCLI.list(policy_id, data_name_or_id).get("object_data").get("id")
+ _url = "{}/policies/{}/object_assignments".format(db_conf.get("url"), policy_id)
+
+ _assignments = requests.post(
+ _url,
+ json={
+ "id": perimeter_id,
+ "category_id": category_id,
+ "data_id": data_id,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _assignments.status_code == 200:
+ LOGGER.warning('Create {}'.format(_assignments.content))
+ if human:
+ return ObjectAssignmentsCLI.human_display(_assignments.json())
+ else:
+ return _assignments.json()
+ LOGGER.error('Cannot create assignment for {}/{}/{} ({})'.format(
+ perimeter_name_or_id, category_name_or_id, data_name_or_id, _assignments.content[:40]))
+ LOGGER.error("{}/{}/{}".format(perimeter_id, category_id, data_id))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ perimeter_id = list(perimeter.ObjectsCLI.list(perimeter_name_or_id).get("objects")[0].keys())[0]
+ category_id = list(meta_data.ObjectCategoriesCLI.list(category_name_or_id).get("object_categories").keys())[0]
+ data_id = data.ObjectDataCLI.list(policy_id, data_name_or_id).get("object_data").get("id")
+ _url = "{}/policies/{}/object_assignments/{}/{}/{}".format(
+ db_conf.get("url"),
+ policy_id,
+ perimeter_id,
+ category_id,
+ data_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}-{}-{}-{}'.format(
+ policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id))
+ return True
+ LOGGER.error("Cannot delete Assignment with {}-{}-{}-{}".format(
+ policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id
+ ))
+ return False
+
+ @staticmethod
+ def human_display(object_assigment_json):
+ human_result = "Object Assignments"
+ for object_assignment in object_assigment_json.get("object_assignments"):
+ human_result += "\n" + object_assigment_json.get("object_assignments").get(object_assignment).get("id") + "\n"
+ human_result += "\tid : " + object_assigment_json.get("object_assignments").get(object_assignment).get("id") + "\n"
+ human_result += "\tpolicy_id : " + object_assigment_json.get("object_assignments").get(object_assignment).get("policy_id") + "\n"
+ human_result += "\tobject_id : " + object_assigment_json.get("object_assignments").get(object_assignment).get("object_id") + "\n"
+ human_result += "\tcategory_id : " + object_assigment_json.get("object_assignments").get(object_assignment).get("category_id") + "\n"
+ human_result += "\tassignments : \n"
+ for assignment in object_assigment_json.get("object_assignments").get(object_assignment).get("assignments"):
+ human_result += "\t\t" + assignment + "\n"
+ return human_result
+
+
+@hug.object(name='actions', version='1.0.0', api=ActionAssignmentsAPI)
+class ActionAssignmentsCLI(object):
+ """An example of command like calls via an Action"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _assignments_req = requests.get("{}/policies/{}/action_assignments".format(
+ db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ _assignment_key = None
+ if _assignments_req.status_code == 200:
+ _action_assignments = _assignments_req.json().get("action_assignments")
+ if name_or_id:
+ _assignments = None
+ if name_or_id in _action_assignments:
+ _assignments = _action_assignments.get(name_or_id)
+ _assignment_key = name_or_id
+ else:
+ for _key in _action_assignments:
+ try:
+ _action = perimeter.ActionsCLI.list(name_or_id).get("actions")[0]
+ _action_key = list(_action.keys())[0]
+ except Exception as e:
+ # FIXME: should upgrade this exception
+ LOGGER.exception(e)
+ continue
+ else:
+ if _action_assignments.get(_key).get("action_id") == _action_key:
+ _assignments = _action_assignments.get(_key)
+ _assignment_key = _key
+ break
+ if not _assignments:
+ raise Exception("Cannot find Action Assignments with ID {}".format(name_or_id))
+ result = {"action_assignments": [{_assignment_key: _assignments}]}
+ else:
+ result = _assignments_req.json()
+
+ if human:
+ return ActionAssignmentsCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Action Assignments {}'.format(_assignments_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id, human: bool = False):
+ """
+ Add action assignment in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ perimeter_id = list(perimeter.ActionsCLI.list(perimeter_name_or_id).get("actions")[0].keys())[0]
+ category_id = list(meta_data.ActionCategoriesCLI.list(category_name_or_id).get("action_categories").keys())[0]
+ data_id = data.ActionDataCLI.list(policy_id, data_name_or_id).get("action_data").get("id")
+ _url = "{}/policies/{}/action_assignments".format(db_conf.get("url"), policy_id)
+
+ _assignments = requests.post(
+ _url,
+ json={
+ "id": perimeter_id,
+ "category_id": category_id,
+ "data_id": data_id,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _assignments.status_code == 200:
+ LOGGER.warning('Create {}'.format(_assignments.content))
+ if human:
+ return ActionAssignmentsCLI.human_display(_assignments.json())
+ else:
+ return _assignments.json()
+ LOGGER.error('Cannot create assignment for {}/{}/{} ({})'.format(
+ perimeter_name_or_id, category_name_or_id, data_name_or_id, _assignments.content[:40]))
+ LOGGER.error("{}/{}/{}".format(perimeter_id, category_id, data_id))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ perimeter_id = list(perimeter.ActionsCLI.list(perimeter_name_or_id).get("actions")[0].keys())[0]
+ category_id = list(meta_data.ActionCategoriesCLI.list(category_name_or_id).get("action_categories").keys())[0]
+ data_id = data.ActionDataCLI.list(policy_id, data_name_or_id).get("action_data").get("id")
+ _url = "{}/policies/{}/action_assignments/{}/{}/{}".format(
+ db_conf.get("url"),
+ policy_id,
+ perimeter_id,
+ category_id,
+ data_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}-{}-{}-{}'.format(
+ policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id))
+ return True
+ LOGGER.error("Cannot delete Assignment with {}-{}-{}-{}".format(
+ policy_name_or_id, perimeter_name_or_id, category_name_or_id, data_name_or_id
+ ))
+ return False
+
+ @staticmethod
+ def human_display(action_assigment_json):
+ human_result = "Action Assignments"
+ for action_assignment in action_assigment_json.get("action_assignments"):
+ human_result += "\n" + action_assigment_json.get("action_assignments").get(action_assignment).get("id") + "\n"
+ human_result += "\tid : " + action_assigment_json.get("action_assignments").get(action_assignment).get("id") + "\n"
+ human_result += "\tpolicy_id : " + action_assigment_json.get("action_assignments").get(action_assignment).get("policy_id") + "\n"
+ human_result += "\taction_id : " + action_assigment_json.get("action_assignments").get(action_assignment).get("action_id") + "\n"
+ human_result += "\tcategory_id : " + action_assigment_json.get("action_assignments").get(action_assignment).get("category_id") + "\n"
+ human_result += "\tassignments : \n"
+ for assignment in action_assigment_json.get("action_assignments").get(action_assignment).get("assignments"):
+ human_result += "\t\t" + assignment + "\n"
+ return human_result
diff --git a/moon_manager/moon_manager/api/attributes.py b/moon_manager/moon_manager/api/attributes.py
new file mode 100644
index 00000000..4e5cb282
--- /dev/null
+++ b/moon_manager/moon_manager/api/attributes.py
@@ -0,0 +1,207 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Global attributes allow to save a specific piece of information inside Moon
+
+"""
+
+import logging
+import hug
+import requests
+from moon_manager.api import ERROR_CODE
+# from moon_manager import db_driver
+# from moon_manager import orchestration_driver
+from moon_manager import pip_driver
+from moon_manager.api import configuration
+from moon_utilities import exceptions
+from moon_utilities.auth_functions import init_db, api_key_authentication, connect_from_env
+from moon_manager.api import slave as slave_class
+from moon_utilities.invalided_functions import invalidate_attributes_in_slaves
+
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
+
+
+class Attributes(object):
+ """
+ Endpoint for attributes requests
+ """
+
+ @staticmethod
+ @hug.local()
+ @hug.get("/attributes/", requires=api_key_authentication)
+ @hug.get("/attributes/{name}", requires=api_key_authentication)
+ def get(name: str = None, authed_user: hug.directives.user = None):
+ """Retrieve all attributes
+
+ :param name: name of the attribute
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "attributes": {
+ "id": "name",
+ "value": "value1",
+ "values": ["value1", "value2"],
+ "default": "value2"
+ },
+ {
+ "id": "name2",
+ "value": "value4",
+ "values": ["value4", "value"3"],
+ "default": "value3"
+ }
+ }
+ }
+ """
+ if not name:
+ data = pip_driver.AttrsManager.get_objects(moon_user_id=authed_user, object_type=name)
+ else:
+ data = pip_driver.AttrsManager.get_object(moon_user_id=authed_user, object_type=name)
+ return {"attributes": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.put("/attributes/{name}/{value}", requires=api_key_authentication)
+ def put(name: str, value: str, authed_user: hug.directives.user = None):
+ """Initialize an attribute.
+
+ :param name: name of the attribute
+ :param value: value of the attribute
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "attributes": {
+ "name": "value1"
+ "values": ["value1", "value2"],
+ "default": "value2"
+ },
+ {
+ "name": "value3"
+ "values": ["value4", "value"3"],
+ "default": "value3"
+ }
+ }
+ }
+ """
+ data = pip_driver.AttrsManager.update_object(moon_user_id=authed_user,
+ object_id=value,
+ object_type=name)
+ slaves = slave_class.Slaves.get().get("slaves")
+ ret = invalidate_attributes_in_slaves(
+ slaves,
+ name)
+ return {"attributes": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/attributes/{name}", requires=api_key_authentication)
+ def delete(name: str, authed_user: hug.directives.user = None):
+ """Re-initialize an attribute
+
+ :param name: the name of the attribute
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ """
+ data = pip_driver.AttrsManager.add_object(moon_user_id=authed_user, object_type=name)
+ return {"attributes": data}
+
+
+AttrsAPI = hug.API(name='attributes', doc=Attributes.__doc__)
+db_conf = configuration.get_configuration(key='management')
+init_db(db_conf.get("token_file"))
+
+
+@hug.object(name='attributes', version='1.0.0', api=AttrsAPI)
+class AttributesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def get(name):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _attrs = requests.get("{}/attributes/{}".format(db_conf.get("url"), name),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _attrs.status_code == 200:
+ return _attrs.json()
+ else:
+ LOGGER.error("An error occurs ({}): {}...".format(_attrs.status_code, _attrs.text[:80]))
+
+ @staticmethod
+ @hug.object.cli
+ def list(human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _attrs = requests.get("{}/attributes".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _attrs.status_code == 200:
+ if human:
+ return AttributesCLI.human_display(_attrs.json())
+ else:
+ return _attrs.json()
+ else:
+ LOGGER.error("An error occurs ({}): {}...".format(_attrs.status_code, _attrs.text[:80]))
+
+ @staticmethod
+ def human_display(attributes_json):
+ human_result = "Attributes"
+ for attribute in attributes_json.get("attributes"):
+ human_result += "\n" + attribute + "\n"
+ human_result += "\tid : " + attributes_json.get("attributes").get(attribute).get("id") + "\n"
+ human_result += "\tvalue :" + attributes_json.get("attributes").get(attribute).get("value") + "\n"
+ human_result += "\tvalues : \n"
+ for value in attributes_json.get("attributes").get(attribute).get("values"):
+ human_result += "\t\t" + value + "\n"
+ human_result += "\tdefault :" + attributes_json.get("attributes").get(attribute).get("default") + "\n"
+ return human_result
+
+ @staticmethod
+ @hug.object.cli
+ def init(name):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _attrs = requests.delete("{}/attributes/{}".format(db_conf.get("url"), name),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _attrs.status_code == 200:
+ return _attrs.json()
+ else:
+ LOGGER.error("An error occurs ({}): {}...".format(_attrs.status_code, _attrs.text[:80]))
+
+ @staticmethod
+ @hug.object.cli
+ def set(name, value):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _attrs = requests.put("{}/attributes/{}/{}".format(db_conf.get("url"), name, value),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _attrs.status_code == 200:
+ return _attrs.json()
+ else:
+ LOGGER.error("An error occurs ({}): {}...".format(_attrs.status_code, _attrs.text[:80]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _attrs = requests.delete("{}/attributes/{}".format(db_conf.get("url"), name),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _attrs.status_code == 200:
+ return _attrs.json()
+ else:
+ LOGGER.error("An error occurs ({}): {}...".format(_attrs.status_code, _attrs.text[:80]))
+
diff --git a/moon_manager/moon_manager/api/auth.py b/moon_manager/moon_manager/api/auth.py
new file mode 100644
index 00000000..a60fd727
--- /dev/null
+++ b/moon_manager/moon_manager/api/auth.py
@@ -0,0 +1,42 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Auth API"""
+from falcon import HTTP_204, HTTP_400
+import hug
+import logging
+from moon_utilities.auth_functions import basic_authentication, api_key_authentication
+from moon_utilities.auth_functions import get_api_key_for_user, del_api_key_for_user
+
+logger = logging.getLogger("moon.manager.api.status")
+
+
+@hug.get("/auth/", requires=basic_authentication)
+def get_api_key(authed_user: hug.directives.user = None):
+ """
+ Get API key
+ :return: API key
+ """
+ return get_api_key_for_user(authed_user)
+
+
+@hug.delete("/auth/", requires=api_key_authentication)
+def del_api_key(response, authed_user: hug.directives.user = None):
+ """
+ Delete API key
+ :return: None
+ """
+ if del_api_key_for_user(authed_user):
+ response.status = HTTP_204
+ else:
+ response.status = HTTP_400
+ return
diff --git a/moon_manager/moon_manager/api/checks.py b/moon_manager/moon_manager/api/checks.py
new file mode 100644
index 00000000..bc44b905
--- /dev/null
+++ b/moon_manager/moon_manager/api/checks.py
@@ -0,0 +1,211 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Run tests from a Moon policy file.
+"""
+
+import json
+import logging
+import time
+import requests
+import hug
+import sys
+from moon_manager.api import configuration
+from moon_manager.api import pdp
+
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
+ChecksAPI = hug.API(name='checks', doc=__doc__)
+if sys.version_info[0] == 2:
+ raise Exception("Using Python2 is not secure enough!")
+
+
+@hug.object(name='rules', version='1.0.0', api=ChecksAPI)
+class ChecksCLI(object):
+ """An example of command like calls via an Object"""
+
+ verbose = False
+ output_file = None
+ pipeline_data = {}
+
+ @staticmethod
+ def launch_standalone_pipeline(endpoint, policy_file):
+ LOGGER.info("Launching Engine for a self test...")
+ from moon_engine.plugins import pyorchestrator
+ from uuid import uuid4
+ import subprocess # nosec (command attribute is safe)
+ host = endpoint.replace("http://", "").split(":")[0]
+ port = endpoint.split(":")[2].split("/")[0]
+ _uuid = uuid4().hex
+ gunicorn_config = pyorchestrator.create_gunicorn_config(
+ host, port, server_type="pipeline", uuid=_uuid)
+ pyorchestrator.create_moon_config(_uuid, False, policy_file)
+ pid_file = _uuid + ".pid"
+ command = ["gunicorn", "moon_engine.server:__hug_wsgi__", "--threads", "10",
+ "-p", pid_file, "-D", "-c", gunicorn_config]
+ LOGGER.info("Executing {}".format(" ".join(command)))
+ subprocess.Popen(command, stdout=subprocess.PIPE, close_fds=True) # nosec
+ # (command attribute is safe)
+ ChecksCLI.pipeline_data["pid_file"] = pid_file
+ ChecksCLI.pipeline_data["gunicorn_config"] = gunicorn_config
+ time.sleep(2)
+
+ @staticmethod
+ def kill_standalone_pipeline():
+ import os
+ pid = int(open(ChecksCLI.pipeline_data["pid_file"]).read())
+ os.kill(pid, 15)
+
+ @staticmethod
+ def log(message, color="", force_console=False):
+ """
+ Send application logs to conole and output file
+ :param message: the message to send
+ :param color: optionally the color in the console
+ :param force_console: if the message should be always send in the console
+ :return: None
+ """
+ if ChecksCLI.verbose or force_console:
+ if color:
+ print("\033[" + color + "m" + message + "\033[m")
+ else:
+ print(message)
+ if ChecksCLI.output_file:
+ open(ChecksCLI.output_file, "a").write(message + "\n")
+
+ @staticmethod
+ def run_tests(endpoint, vim_project_id, test_list, status_code, test_number):
+ """
+ Run the tests given
+ :param endpoint: the endpoint to send the requests
+ :param vim_project_id: the tested project ID
+ :param test_list: the list of tests to run
+ :param status_code: the expected status code
+ :param test_number: the number of tests to run
+ :return:
+ """
+ cpt = 0
+ bad_response = 0
+ good_response = 0
+ start_time = time.time()
+ for test in test_list:
+ if test_number and cpt > test_number:
+ break
+ if vim_project_id:
+ url = "{endpoint}/{project_id}/{subject_name}/{object_name}/{action_name}".format(
+ endpoint=endpoint,
+ project_id=vim_project_id,
+ subject_name=test[0],
+ object_name=test[1],
+ action_name=test[2],
+ )
+ else:
+ url = "{endpoint}/{subject_name}/{object_name}/{action_name}".format(
+ endpoint=endpoint,
+ subject_name=test[0],
+ object_name=test[1],
+ action_name=test[2],
+ )
+ req = requests.get(url)
+ cpt += 1
+ ChecksCLI.log("Contacting {}".format(url))
+ if isinstance(status_code, str):
+ status_code = (int(status_code), )
+ if isinstance(status_code, int):
+ status_code = (status_code, )
+ if req.status_code in status_code:
+ ChecksCLI.log("{} OK".format(", ".join(test)))
+ good_response += 1
+ else:
+ ChecksCLI.log("{} KO ({}: {})".format(", ".join(test), req.status_code, req.text[:80]),
+ force_console=True)
+ bad_response += 1
+ end_time = time.time()
+ return "Run {} tests ({} OK and {} KO) in {:.2f} seconds ({:.2f} req/s)".format(
+ cpt, good_response, bad_response,
+ end_time - start_time, cpt / (end_time - start_time))
+
+ @staticmethod
+ @hug.object.cli
+ def run(policy_file,
+ endpoint: str = "",
+ test_number: int = None,
+ verbose: bool = False,
+ output_file: str = None,
+ dont_kill_server: bool = False):
+ """
+ Run tests given in a policy file
+ :param policy_file: the policy file which contains the tests
+ :param endpoint: the endpoint to test
+ :param test_number: the number of tests to run
+ :param verbose: set the verbosity
+ :param output_file: the name of the output file to send logs
+ :param dont_kill_server: do we have to kill the engine before quitting
+ :return: None
+ """
+ ChecksCLI.output_file = output_file
+ ChecksCLI.verbose = verbose
+ ChecksCLI.log("Tests run on " + time.strftime("%Y/%m/%d %H:%M:%S"),
+ force_console=True, color="1")
+ if not endpoint:
+ _conf = configuration.get_configuration(key='management')
+ endpoint = "http://{}:10000/authz".format(
+ _conf['url'].replace("http://", "").split(":")[0])
+ need_standalone_pipeline = False
+ try:
+ requests.get(endpoint)
+ except requests.exceptions.ConnectionError:
+ need_standalone_pipeline = True
+ ChecksCLI.launch_standalone_pipeline(endpoint, policy_file)
+ try:
+ _pdps = pdp.PDPCLI.list().get("pdps")
+ vim_project_ids = []
+ for _project in _pdps.values():
+ if _project.get("vim_project_id", "").strip():
+ vim_project_ids.append(_project.get("vim_project_id", "").strip())
+ except (requests.exceptions.ConnectionError, AttributeError):
+ vim_project_id = ""
+ else:
+ if len(vim_project_ids) > 1:
+ ChecksCLI.log("VIM Project ID:", force_console=True)
+ for project in vim_project_ids:
+ ChecksCLI.log(" - {}".format(project), force_console=True)
+ response = input("Choose a project ID in list: ") # nosec
+ # (forbidden use of Python2)
+ vim_project_id = response
+ else:
+ vim_project_id = vim_project_ids[0]
+ vim_project_id = vim_project_id.replace("/", "")
+ ChecksCLI.log("Using '{}' as project ID".format(vim_project_id), force_console=True)
+ ChecksCLI.log("Endpoint: {}".format(endpoint), force_console=True)
+ policy = json.loads(open(policy_file).read())
+ if "checks" not in policy:
+ raise Exception("Cannot find checks attribute in {}".format(policy_file))
+ endpoint = endpoint.strip('/')
+ ChecksCLI.log("Run grant tests", color="32", force_console=True)
+ output = ""
+ output += ChecksCLI.run_tests(endpoint,
+ vim_project_id,
+ policy['checks'].get("granted", []),
+ (200, 204),
+ test_number)
+ output += "\n"
+ ChecksCLI.log("Run deny tests", color="32", force_console=True)
+ output += ChecksCLI.run_tests(endpoint,
+ vim_project_id,
+ policy['checks'].get("denied", []),
+ 403,
+ test_number)
+ ChecksCLI.log(output, force_console=True, color="1")
+
+ if need_standalone_pipeline and not dont_kill_server:
+ ChecksCLI.kill_standalone_pipeline()
+
diff --git a/moon_manager/moon_manager/api/configuration.py b/moon_manager/moon_manager/api/configuration.py
new file mode 100644
index 00000000..601b3d53
--- /dev/null
+++ b/moon_manager/moon_manager/api/configuration.py
@@ -0,0 +1,237 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Configuration API"""
+import glob
+import hug.interface
+import json
+import logging
+import logging.config
+import os
+import requests
+import sys
+import yaml
+import importlib
+from importlib.machinery import SourceFileLoader
+from moon_utilities.auth_functions import init_db, get_api_key_for_user
+
+LOGGER = logging.getLogger("moon.manager.api.configuration")
+__CONF = {}
+
+
+def init_logging():
+ """Initialize the logging system
+
+ :return: nothing
+ """
+ logging_conf = get_configuration(key='logging')
+ if get_configuration(key='debug', default=False):
+ logging_conf.get("handlers", {}).get("console", {})['level'] = logging.DEBUG
+ LOGGER.info("Setting debug to True!")
+ logging.config.dictConfig(logging_conf)
+
+
+def load_plugin(plugname):
+ """Load a python module
+
+ :param plugname: the name of the module to load
+ :return: a reference to the module
+ """
+ plugins_dir = __CONF["plugins"]["directory"]
+ try:
+ return __import__(plugname, fromlist=["plugins", ])
+ except ImportError as e:
+ LOGGER.warning("Cannot import module ({})".format(e))
+ try:
+ m = SourceFileLoader("myplugs", os.path.join(plugins_dir, plugname+".py"))
+ return m.load_module()
+ except ImportError as e:
+ LOGGER.error("Error in importing plugin {} from {}".format(plugname, plugins_dir))
+ LOGGER.exception(e)
+
+
+def get_db_driver():
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ plug = load_plugin(__CONF["database"]["driver"])
+ if plug.PLUGIN_TYPE != "db":
+ raise Exception("Trying to load a bad DB plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad DB plugin (cannot find Connector)")
+ return plug
+
+
+def get_orchestration_driver():
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ plug = load_plugin(__CONF["orchestration"]["driver"])
+ if plug.PLUGIN_TYPE != "orchestration":
+ raise Exception("Trying to load a bad Orchestration plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad Orchestration plugin (cannot find Connector)")
+ return plug
+
+
+def get_information_driver(driver_name):
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ plug = load_plugin(driver_name)
+ if plug.PLUGIN_TYPE != "information":
+ raise Exception("Trying to load a bad Information plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad Information plugin (cannot find Connector)")
+ return plug
+
+
+def get_global_attrs_driver():
+ """Load and check the plugin module
+
+ :return: a reference to the module
+ """
+ driver_name = __CONF["information"].get("global_attrs", {}).get("driver")
+ if not driver_name:
+ return
+ plug = load_plugin(driver_name)
+ if plug.PLUGIN_TYPE != "information":
+ raise Exception("Trying to load a bad Information plugin (got {} plugin instead)".format(
+ plug.PLUGIN_TYPE))
+ if "Connector" not in dir(plug):
+ raise Exception("Trying to load a bad Information plugin (cannot find Connector)")
+ return plug
+
+
+def search_config_file(filename):
+ """Look for the configuration file
+
+ :param filename: a filename to search for
+ :return: the content of the configuration file
+ """
+ data_config = None
+ for _dir in (
+ "{}",
+ "/conf/{}",
+ "../{}",
+ "../conf/{}",
+ "/etc/moon/{}",
+ "conf/{}",
+ ):
+ for _filename in (filename, "moon.conf", "moon.yaml"):
+ _file = _dir.format(_filename)
+ try:
+ data_config = yaml.safe_load(open(_file))
+ except FileNotFoundError:
+ data_config = None
+ continue
+ else:
+ break
+ if data_config:
+ LOGGER.warning("Using {} as configuration file".format(_file))
+ break
+ if not data_config:
+ raise Exception("Configuration file not found...")
+ return data_config
+
+
+def set_configuration(conf):
+ """ Force the configuration dictionary
+
+ :param conf: the configuration dictionary
+ :return: nothing
+ """
+ global __CONF
+ __CONF = conf
+
+
+@hug.cli("get_conf")
+@hug.local()
+@hug.get("/conf")
+@hug.get("/conf/{key}")
+def get_configuration(key=None, default=None):
+ """
+ List configuration attributes
+ :return: JSON configuration output
+ """
+ global __CONF
+ if not __CONF:
+ __CONF = search_config_file("moon.yaml")
+ init_logging()
+ if not key:
+ # TODO: delete passwords!
+ return __CONF
+ else:
+ return __CONF.get(key, default)
+
+
+@hug.cli("import_json")
+def import_json(filename):
+ """
+ Import data in json file
+ """
+ LOGGER.info("Importing policy from {}".format(filename))
+ db_conf = get_configuration(key='management')
+ init_db(db_conf.get("token_file"))
+ manager_api_key = get_api_key_for_user("admin")
+ try:
+ dict_to_import = json.loads(open(filename).read())
+ except json.JSONDecodeError as e:
+ LOGGER.error("Error in decoding the input file")
+ LOGGER.exception(e)
+ else:
+ req = requests.post("{}/import".format(db_conf.get("url")),
+ data=json.dumps(dict_to_import),
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ })
+ if req.status_code == 200:
+ LOGGER.warning("Import OK!")
+ parsed = json.loads(req.content)
+ LOGGER.info("Response: {}".format(json.dumps(parsed, indent=4, sort_keys=True)))
+ else:
+ LOGGER.error("Error when importing data: {} {}".format(req.status_code, req.content))
+
+
+@hug.cli("init_db")
+@hug.local()
+def init_database():
+ """Initialize the database
+
+ :return: nothing
+ """
+ LOGGER.info("Initialize the database")
+ cwd = os.getcwd()
+ db_conf = get_configuration(key='database')
+ migration_dir = db_conf.get("migration_dir", ".")
+ migration_files = glob.glob(os.path.join(migration_dir, "*[0-9][0-9][0-9].py"))
+ migration_files.sort()
+ if not migration_files:
+ # the migration_dir is a python module so we must find the files inside this dir
+ mod = __import__(migration_dir, fromlist=[migration_dir.split(".")[-1], ])
+ migration_files = glob.glob(os.path.join(mod.__path__[0], "*[0-9][0-9][0-9].py"))
+ for filename in migration_files:
+ # we execute the upgrade/downgrade functions inside each file
+ os.chdir(os.path.dirname(filename))
+ # we add the current directory in order to import the file
+ sys.path.append("")
+ mod = importlib.import_module(os.path.basename(filename.replace(".py", "")))
+ # TODO: manage the downgrade function
+ mod.upgrade(db_conf.get("url"))
+ os.chdir(cwd)
diff --git a/moon_manager/moon_manager/api/data.py b/moon_manager/moon_manager/api/data.py
index 88c9d59a..570bb9cd 100644
--- a/moon_manager/moon_manager/api/data.py
+++ b/moon_manager/moon_manager/api/data.py
@@ -1,45 +1,60 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
"""
Data are elements used to create rules
+* Subjects are the source of an action on an object
+ (examples : users, virtual machines)
+* Objects are the destination of an action
+ (examples virtual machines, virtual Routers)
+* Actions are what subject wants to do on an object
"""
-from flask import request
-from flask_restful import Resource
+import hug
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PolicyManager
-
-__version__ = "4.3.2"
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities.security_functions import validate_input
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_utilities.invalided_functions import invalidate_data_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
+from moon_manager.api import policy
+from moon_manager.api import meta_data
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-class SubjectData(Resource):
+class SubjectData(object):
"""
Endpoint for subject data requests
"""
- __urls__ = (
- "/policies/<string:uuid>/subject_data",
- "/policies/<string:uuid>/subject_data/",
- "/policies/<string:uuid>/subject_data/<string:category_id>",
- "/policies/<string:uuid>/subject_data/<string:category_id>/"
- "<string:data_id>",
- )
-
- @check_auth
- def get(self, uuid=None, category_id=None, data_id=None, user_id=None):
- """Retrieve all subject categories or a specific one if sid is given
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/subject_data", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/subject_data/{category_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/subject_data/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def get(uuid: hug.types.text, category_id: hug.types.text = None,
+ data_id: hug.types.text = None, authed_user: hug.directives.user = None):
+ """Retrieve all subject categories or a specific one if data_id is given
for a given policy
:param uuid: uuid of the policy
:param category_id: uuid of the subject category
:param data_id: uuid of the subject data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: [{
"policy_id": "policy_id1",
"category_id": "category_id1",
@@ -52,27 +67,24 @@ class SubjectData(Resource):
}]
:internal_api: get_subject_data
"""
- try:
- data = PolicyManager.get_subject_data(user_id=user_id,
- policy_id=uuid,
- category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.get_subject_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, data_id=data_id)
+
return {"subject_data": data}
- @check_auth
- def post(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/subject_data/{category_id}", requires=api_key_authentication)
+ def post(body: validate_input("name"), uuid: hug.types.text, category_id: hug.types.text,
+ authed_user: hug.directives.user = None):
"""Create or update a subject.
+ :param body: body of the request
:param uuid: uuid of the policy
:param category_id: uuid of the subject category
- :param data_id: uuid of the subject data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the data",
+ "name": "name of the data (mandatory)",
"description": "description of the data (optional)"
}
:return: {
@@ -80,71 +92,71 @@ class SubjectData(Resource):
"category_id": "category_id1",
"data": {
"subject_data_id": {
- "name": "name of the data",
+ "name": "name of the data (mandatory)",
"description": "description of the data (optional)"
}
}
}
:internal_api: add_subject_data
"""
- try:
- data = PolicyManager.set_subject_data(user_id=user_id,
- policy_id=uuid,
- category_id=category_id,
- value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.set_subject_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_data_in_slaves(slaves=slaves, policy_id=uuid, category_id=category_id,
+ data_id=None, type="subject")
+
return {"subject_data": data}
- @check_auth
- def delete(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/subject_data/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete(uuid: hug.types.text, data_id: hug.types.text,
+ category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete a subject for a given policy
:param uuid: uuid of the policy
:param category_id: uuid of the subject category
:param data_id: uuid of the subject data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: [{
"result": "True or False",
"message": "optional message (optional)"
}]
:internal_api: delete_subject_data
"""
- try:
- data = PolicyManager.delete_subject_data(user_id=user_id,
- policy_id=uuid,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ LOGGER.info("api.delete {} {}".format(uuid, data_id))
+ driver.PolicyManager.delete_subject_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, data_id=data_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+
+ invalidate_data_in_slaves(slaves=slaves, policy_id=None, category_id=None,
+ data_id=data_id, type="subject")
return {"result": True}
-class ObjectData(Resource):
+class ObjectData(object):
"""
Endpoint for object data requests
"""
- __urls__ = (
- "/policies/<string:uuid>/object_data",
- "/policies/<string:uuid>/object_data/",
- "/policies/<string:uuid>/object_data/<string:category_id>",
- "/policies/<string:uuid>/object_data/<string:category_id>/"
- "<string:data_id>",
- )
-
- @check_auth
- def get(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/object_data", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/object_data/{category_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/object_data/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def get(uuid: hug.types.text, category_id: hug.types.text = None,
+ data_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all object categories or a specific one if sid is given
for a given policy
:param uuid: uuid of the policy
:param category_id: uuid of the object category
:param data_id: uuid of the object data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: [{
"policy_id": "policy_id1",
"category_id": "category_id1",
@@ -157,27 +169,23 @@ class ObjectData(Resource):
}]
:internal_api: get_object_data
"""
- try:
- data = PolicyManager.get_object_data(user_id=user_id,
- policy_id=uuid,
- category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.get_object_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, data_id=data_id)
return {"object_data": data}
- @check_auth
- def post(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/object_data/{category_id}", requires=api_key_authentication)
+ def post(body: validate_input("name"), uuid: hug.types.text, category_id: hug.types.text,
+ authed_user: hug.directives.user = None):
"""Create or update a object.
+ :param body: body of the request
:param uuid: uuid of the policy
:param category_id: uuid of the object category
- :param data_id: uuid of the object data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the data",
+ "name": "name of the data (mandatory)",
"description": "description of the data (optional)"
}
:return: {
@@ -192,64 +200,65 @@ class ObjectData(Resource):
}
:internal_api: add_object_data
"""
- try:
- data = PolicyManager.add_object_data(user_id=user_id,
- policy_id=uuid,
- category_id=category_id,
- value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.add_object_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_data_in_slaves(slaves=slaves, policy_id=uuid, category_id=category_id,
+ data_id=None, type="object")
+
+
return {"object_data": data}
- @check_auth
- def delete(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/object_data/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete(uuid: hug.types.text, data_id: hug.types.text,
+ category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete a object for a given policy
:param uuid: uuid of the policy
:param category_id: uuid of the object category
:param data_id: uuid of the object data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_object_data
"""
- try:
- data = PolicyManager.delete_object_data(user_id=user_id,
- policy_id=uuid,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ driver.PolicyManager.delete_object_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, data_id=data_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+
+ invalidate_data_in_slaves(slaves=slaves, policy_id=None, category_id=None,
+ data_id=data_id, type="object")
+
return {"result": True}
-class ActionData(Resource):
+class ActionData(object):
"""
Endpoint for action data requests
"""
- __urls__ = (
- "/policies/<string:uuid>/action_data",
- "/policies/<string:uuid>/action_data/",
- "/policies/<string:uuid>/action_data/<string:category_id>",
- "/policies/<string:uuid>/action_data/<string:category_id>/"
- "<string:data_id>",
- )
-
- @check_auth
- def get(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/action_data", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/action_data/{category_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/action_data/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def get(uuid: hug.types.text, category_id: hug.types.text = None,
+ data_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all action categories or a specific one if sid is given
for a given policy
:param uuid: uuid of the policy
:param category_id: uuid of the action category
:param data_id: uuid of the action data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: [{
"policy_id": "policy_id1",
"category_id": "category_id1",
@@ -262,28 +271,25 @@ class ActionData(Resource):
}]
:internal_api: get_action_data
"""
- try:
- data = PolicyManager.get_action_data(user_id=user_id,
- policy_id=uuid,
- category_id=category_id,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.get_action_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, data_id=data_id)
+
return {"action_data": data}
- @check_auth
- def post(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/action_data/{category_id}", requires=api_key_authentication)
+ def post(body: validate_input("name"), uuid: hug.types.text, category_id: hug.types.text,
+ authed_user: hug.directives.user = None):
"""Create or update a action.
+ :param body: body of the request
:param uuid: uuid of the policy
:param category_id: uuid of the action category
- :param data_id: uuid of the action data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the data",
- "description": "description of the data"
+ "name": "name of the data (mandatory)",
+ "description": "description of the data (optional)"
}
:return: {
"policy_id": "policy_id1",
@@ -297,39 +303,424 @@ class ActionData(Resource):
}
:internal_api: add_action_data
"""
- try:
- data = PolicyManager.add_action_data(user_id=user_id,
- policy_id=uuid,
- category_id=category_id,
- value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.add_action_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_data_in_slaves(slaves=slaves, policy_id=uuid, category_id=category_id,
+ data_id=None, type="action")
+
return {"action_data": data}
- @check_auth
- def delete(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/action_data/{category_id}/{data_id}",
+ requires=api_key_authentication)
+ def delete(uuid: hug.types.text, data_id: hug.types.text,
+ category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete a action for a given policy
:param uuid: uuid of the policy
:param category_id: uuid of the action category
:param data_id: uuid of the action data
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_action_data
"""
- try:
- data = PolicyManager.delete_action_data(user_id=user_id,
- policy_id=uuid,
- data_id=data_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ driver.PolicyManager.delete_action_data(moon_user_id=authed_user, policy_id=uuid,
+ category_id=category_id, data_id=data_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+
+ invalidate_data_in_slaves(slaves=slaves, policy_id=None, category_id=None,
+ data_id=data_id, type="action")
return {"result": True}
+def human_display_entity_data(entity_data_json):
+ """
+ Common static method for entity (subject, object)
+ :param entity_data_json: subject_data_json or object_data_json
+ :return:
+ """
+ human_result = "Data\n"
+ human_result += "\tpolicy_id : " + entity_data_json.get("policy_id") + "\n"
+ human_result += "\tcategory_id : " + entity_data_json.get("category_id") + "\n"
+ human_result += "\tdata : \n"
+ for data in entity_data_json.get("data"):
+ human_result += "\t\t" + data + "\n"
+ human_result += human_display_data(entity_data_json.get("data").get(data))
+ return human_result
+
+def human_display_data(data_json, tabulations: int = 3):
+ """
+ :param data_json:
+ :param tabulations: nombre de caractères de tabulations
+ :return:
+ """
+ tab = ""
+ for i in range(tabulations):
+ tab += "\t"
+ human_result = tab + "id:" + data_json.get("id") + "\n"
+ human_result += tab + "name:" + data_json.get("name") + "\n"
+ human_result += tab + "description:" + data_json.get("description") + "\n"
+ human_result += tab + "category_id:" + data_json.get("category_id") + "\n"
+ human_result += tab + "policy_id:" + data_json.get("policy_id") + "\n"
+
+ return human_result
+
+
+SubjectDataAPI = hug.API(name='subject_data', doc=SubjectData.__doc__)
+
+
+@hug.object(name='subject_data', version='1.0.0', api=SubjectDataAPI)
+class SubjectDataCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, name_or_id="", human: bool = False):
+ """Retrieve all subject categories or a specific one if data_id is give for a given policy"""
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _data_req = requests.get(
+ "{}/policies/{}/subject_data".format(db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ _data_to_return = None
+ _data_list = _data_req.json().get("subject_data")
+ if _data_req.status_code == 200:
+ if name_or_id:
+ _data = None
+ for _data_item in _data_list:
+ if policy_id != _data_item["policy_id"]:
+ continue
+ for _data_key, _data_value in _data_item.get("data").items():
+ if _data_value.get("name") == name_or_id:
+ _data_to_return = _data_value
+ break
+ elif _data_key == name_or_id:
+ _data_to_return = _data_value
+ break
+ if not _data_to_return:
+ raise Exception("Cannot find Subject Data with name or ID {}".format(
+ name_or_id))
+ if human:
+ result = _data_to_return
+ else:
+ result = {"subject_data": _data_to_return}
+ else:
+ result = _data_req.json()
+
+ if human:
+ if name_or_id:
+ return human_display_data(result, 1)
+ else:
+ return SubjectDataCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Subject Data {}'.format(_data_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, category_name_or_id, policy_name_or_id, description="", human: bool=False):
+ """
+ Add an subject data in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ category_id = list(meta_data.SubjectCategoriesCLI.list(category_name_or_id)
+ .get("subject_categories").keys())[0]
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/subject_data/{}".format(
+ db_conf.get("url"), policy_id, category_id)
+ _data_req = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _data_req.status_code == 200:
+ LOGGER.warning('Create {}'.format(_data_req.content))
+ if human:
+ return human_display_entity_data(_data_req.json().get("subject_data"))
+ else:
+ return _data_req.json()
+ LOGGER.error('Cannot create {}'.format(name, _data_req.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id, category_name_or_id, policy_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _subject_data = SubjectDataCLI.list(policy_name_or_id)
+ category_id = list(meta_data.SubjectCategoriesCLI.list(category_name_or_id)
+ .get("subject_categories").keys())[0]
+ for element in _subject_data.get("subject_data"):
+ for _data_id, _data_value in element.get("data").items():
+ if _data_value.get("name") == name_or_id:
+ policy_id = list(
+ policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/subject_data/{}/{}".format(
+ db_conf.get("url"), policy_id, category_id, _data_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ continue
+ LOGGER.error("Cannot delete Subject Data with name {}".format(name_or_id))
+
+ @staticmethod
+ def human_display(subject_data_json):
+ human_result = "Subjects Data\n"
+ for subject_data in subject_data_json.get('subject_data'):
+ human_result += human_display_entity_data(subject_data)
+ return human_result
+
+ObjectDataAPI = hug.API(name='object_data', doc=ObjectData.__doc__)
+
+
+@hug.object(name='object_data', version='1.0.0', api=ObjectDataAPI)
+class ObjectDataCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _data_req = requests.get(
+ "{}/policies/{}/object_data".format(db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ _data_to_return = None
+ _data_list = _data_req.json().get("object_data")
+ if _data_req.status_code == 200:
+ if name_or_id:
+ _data = None
+ for _data_item in _data_list:
+ if policy_id != _data_item["policy_id"]:
+ continue
+ for _data_key, _data_value in _data_item.get("data").items():
+ if _data_value.get("name") == name_or_id:
+ _data_to_return = _data_value
+ break
+ elif _data_key == name_or_id:
+ _data_to_return = _data_value
+ break
+ if not _data_to_return:
+ raise Exception("Cannot find Object Data with name or ID {}".format(
+ name_or_id))
+ if human:
+ result = _data_to_return
+ else:
+ result = {"object_data": _data_to_return}
+ else:
+ result = _data_req.json()
+
+ if human:
+ if name_or_id:
+ return human_display_data(result, 1)
+ else:
+ return ObjectDataCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Object Data {}'.format(_data_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, category_name_or_id, policy_name_or_id, description="", human: bool = False):
+ """
+ Add
+ :param name:
+ :param category_name_or_id:
+ :param policy_name_or_id:
+ :param description:
+ :param human:
+ :return:
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ category_id = list(meta_data.ObjectCategoriesCLI.list(category_name_or_id)
+ .get("object_categories").keys())[0]
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/object_data/{}".format(
+ db_conf.get("url"), policy_id, category_id)
+ _data_req = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _data_req.status_code == 200:
+ LOGGER.warning('Create {}'.format(_data_req.content))
+ if human:
+ return human_display_entity_data(_data_req.json().get("object_data"))
+ else:
+ return _data_req.json()
+ LOGGER.error('Cannot create {}'.format(name, _data_req.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id, category_name_or_id, policy_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _object_data = ObjectDataCLI.list(policy_name_or_id)
+ category_id = list(meta_data.ObjectCategoriesCLI.list(category_name_or_id)
+ .get("object_categories").keys())[0]
+ for element in _object_data.get("object_data"):
+ for _data_id, _data_value in element.get("data").items():
+ if _data_value.get("name") == name_or_id:
+ policy_id = list(
+ policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/object_data/{}/{}".format(
+ db_conf.get("url"), policy_id, category_id, _data_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ continue
+ LOGGER.error("Cannot delete Object Data with name {}".format(name_or_id))
+
+ @staticmethod
+ def human_display(object_data_json):
+ human_result = "Objects Data\n"
+ for object_data in object_data_json.get('object_data'):
+ human_result += human_display_entity_data(object_data)
+ return human_result
+
+ActionDataAPI = hug.API(name='action_data', doc=ActionData.__doc__)
+
+
+@hug.object(name='action_data', version='1.0.0', api=ActionDataAPI)
+class ActionDataCLI(object):
+ """An example of command like calls via an Action"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _data_req = requests.get(
+ "{}/policies/{}/action_data".format(db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ _data_to_return = None
+ _data_list = _data_req.json().get("action_data")
+ if _data_req.status_code == 200:
+ if name_or_id:
+ _data = None
+ for _data_item in _data_list:
+ if policy_id != _data_item["policy_id"]:
+ continue
+ for _data_key, _data_value in _data_item.get("data").items():
+ if _data_value.get("name") == name_or_id:
+ _data_to_return = _data_value
+ break
+ elif _data_key == name_or_id:
+ _data_to_return = _data_value
+ break
+ if not _data_to_return:
+ raise Exception("Cannot find Action Data with name or ID {}".format(
+ name_or_id))
+ if human:
+ result = _data_to_return
+ else:
+ result = {"action_data": _data_to_return}
+ else:
+ result = _data_req.json()
+
+ if human:
+ if name_or_id:
+ return human_display_data(result, 1)
+ else:
+ return ActionDataCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Action Data {}'.format(_data_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, category_name_or_id, policy_name_or_id, description="", human:bool = False):
+ """
+ Add an action data in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ category_id = list(meta_data.ActionCategoriesCLI.list(category_name_or_id)
+ .get("action_categories").keys())[0]
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/action_data/{}".format(
+ db_conf.get("url"), policy_id, category_id)
+ _data_req = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _data_req.status_code == 200:
+ LOGGER.warning('Create {}'.format(_data_req.content))
+ if human:
+ return human_display_entity_data(_data_req.json().get("action_data"))
+ else:
+ return _data_req.json()
+ LOGGER.error('Cannot create {}'.format(name, _data_req.content[:40]))
+
+
+ @staticmethod
+ def human_display(action_data_json):
+ human_result = "Actions Data\n"
+ for action_data in action_data_json.get('action_data'):
+ human_result += human_display_entity_data(action_data)
+ return human_result
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id, category_name_or_id, policy_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _action_data = ActionDataCLI.list(policy_name_or_id)
+ category_id = list(meta_data.ActionCategoriesCLI.list(category_name_or_id)
+ .get("action_categories").keys())[0]
+ for element in _action_data.get("action_data"):
+ for _data_id, _data_value in element.get("data").items():
+ if _data_value.get("name") == name_or_id:
+ policy_id = list(
+ policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/action_data/{}/{}".format(
+ db_conf.get("url"), policy_id, category_id, _data_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ continue
+ LOGGER.error("Cannot delete Action Data with name {}".format(name_or_id))
diff --git a/moon_manager/moon_manager/api/db/__init__.py b/moon_manager/moon_manager/api/db/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_manager/moon_manager/api/db/managers.py b/moon_manager/moon_manager/api/db/managers.py
new file mode 100644
index 00000000..23be03fc
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/managers.py
@@ -0,0 +1,24 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.db.api.managers")
+
+
+class Managers(object):
+ """Object that links managers together"""
+ ModelManager = None
+ KeystoneManager = None
+ PDPManager = None
+ PolicyManager = None
+ SlaveManager = None
diff --git a/moon_manager/moon_manager/api/db/migrations/__init__.py b/moon_manager/moon_manager/api/db/migrations/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/migrations/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_manager/moon_manager/api/db/migrations/moon_001.py b/moon_manager/moon_manager/api/db/migrations/moon_001.py
new file mode 100644
index 00000000..8e604d2b
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/migrations/moon_001.py
@@ -0,0 +1,336 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+import sqlalchemy as sql
+from sqlalchemy import types as sql_types
+from sqlalchemy import create_engine
+import sys
+
+
+class JsonBlob(sql_types.TypeDecorator):
+ impl = sql.Text
+
+ def process_bind_param(self, value, dialect):
+ return json.dumps(value)
+
+ def process_result_value(self, value, dialect):
+ return json.loads(value)
+
+
+def upgrade(migrate_engine):
+ if isinstance(migrate_engine, str):
+ migrate_engine = create_engine(migrate_engine)
+ meta = sql.MetaData()
+ meta.bind = migrate_engine
+ sys.stdout.write("Creating ")
+ sys.stdout.flush()
+
+ table = sql.Table(
+ 'pdp',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('vim_project_id', sql.String(64), nullable=True, default=""),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_models'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(table) + " ")
+ sys.stdout.flush()
+
+ table = sql.Table(
+ 'slaves',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('address', sql.String(256), nullable=True, default=""),
+ sql.Column('grant_if_unknown_project', sql.Boolean, nullable=True, default=""),
+ sql.Column('process', sql.String(256), nullable=False, default=""),
+ sql.Column('log', sql.String(256), nullable=False, default=""),
+ sql.Column('api_key', sql.String(256), nullable=False, default=""),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_models'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(table) + " ")
+ sys.stdout.flush()
+
+ table = sql.Table(
+ 'policies',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('model_id', sql.String(64), nullable=True, default=""),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', 'model_id', name='unique_constraint_models'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(table) + " ")
+ sys.stdout.flush()
+
+ table = sql.Table(
+ 'models',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_models'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(table) + " ")
+ sys.stdout.flush()
+
+ subject_categories_table = sql.Table(
+ 'subject_categories',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('description', sql.String(256), nullable=True),
+
+ sql.UniqueConstraint('name', name='unique_constraint_subject_categories'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ subject_categories_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(subject_categories_table) + " ")
+ sys.stdout.flush()
+
+ object_categories_table = sql.Table(
+ 'object_categories',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('description', sql.String(256), nullable=True),
+
+ sql.UniqueConstraint('name', name='unique_constraint_object_categories'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ object_categories_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(object_categories_table) + " ")
+ sys.stdout.flush()
+
+ action_categories_table = sql.Table(
+ 'action_categories',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('description', sql.String(256), nullable=True),
+
+ sql.UniqueConstraint('name', name='unique_constraint_action_categories'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ action_categories_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(action_categories_table) + " ")
+ sys.stdout.flush()
+
+ subjects_table = sql.Table(
+ 'subjects',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_subjects'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ subjects_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(subjects_table) + " ")
+ sys.stdout.flush()
+
+ objects_table = sql.Table(
+ 'objects',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_objects'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ objects_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(objects_table) + " ")
+ sys.stdout.flush()
+
+ actions_table = sql.Table(
+ 'actions',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_actions'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ actions_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(actions_table) + " ")
+ sys.stdout.flush()
+
+ subject_data_table = sql.Table(
+ 'subject_data',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.Column('category_id', sql.ForeignKey("subject_categories.id"), nullable=False),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.UniqueConstraint('name', 'category_id', 'policy_id',
+ name='unique_constraint_subject_data'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ subject_data_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(subject_data_table) + " ")
+ sys.stdout.flush()
+
+ object_data_table = sql.Table(
+ 'object_data',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.Column('category_id', sql.ForeignKey("object_categories.id"), nullable=False),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.UniqueConstraint('name', 'category_id', 'policy_id',
+ name='unique_constraint_object_data'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ object_data_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(object_data_table) + " ")
+ sys.stdout.flush()
+
+ action_data_table = sql.Table(
+ 'action_data',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.Column('category_id', sql.ForeignKey("action_categories.id"), nullable=False),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.UniqueConstraint('name', 'category_id', 'policy_id',
+ name='unique_constraint_action_data'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ action_data_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(action_data_table) + " ")
+ sys.stdout.flush()
+
+ subject_assignments_table = sql.Table(
+ 'subject_assignments',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('assignments', sql.String(256), nullable=True),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.Column('subject_id', sql.ForeignKey("subjects.id"), nullable=False),
+ sql.Column('category_id', sql.ForeignKey("subject_categories.id"), nullable=False),
+ sql.UniqueConstraint('policy_id', 'subject_id', 'category_id',
+ name='unique_constraint_subject_assignment'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ subject_assignments_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(subject_assignments_table) + " ")
+ sys.stdout.flush()
+
+ object_assignments_table = sql.Table(
+ 'object_assignments',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('assignments', sql.String(256), nullable=True),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.Column('object_id', sql.ForeignKey("objects.id"), nullable=False),
+ sql.Column('category_id', sql.ForeignKey("object_categories.id"), nullable=False),
+ sql.UniqueConstraint('policy_id', 'object_id', 'category_id',
+ name='unique_constraint_object_assignment'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ object_assignments_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(object_assignments_table) + " ")
+ sys.stdout.flush()
+
+ action_assignments_table = sql.Table(
+ 'action_assignments',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('assignments', sql.String(256), nullable=True),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.Column('action_id', sql.ForeignKey("actions.id"), nullable=False),
+ sql.Column('category_id', sql.ForeignKey("action_categories.id"), nullable=False),
+ sql.UniqueConstraint('policy_id', 'action_id', 'category_id',
+ name='unique_constraint_action_assignment'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ action_assignments_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(action_assignments_table) + " ")
+ sys.stdout.flush()
+
+ meta_rules_table = sql.Table(
+ 'meta_rules',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('name', sql.String(256), nullable=False),
+ sql.Column('subject_categories', JsonBlob(), nullable=False),
+ sql.Column('object_categories', JsonBlob(), nullable=False),
+ sql.Column('action_categories', JsonBlob(), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
+ sql.UniqueConstraint('name', name='unique_constraint_meta_rule_name'),
+ # sql.UniqueConstraint('subject_categories', 'object_categories', 'action_categories', name='unique_constraint_meta_rule_def'),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ meta_rules_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(meta_rules_table) + " ")
+ sys.stdout.flush()
+
+ rules_table = sql.Table(
+ 'rules',
+ meta,
+ sql.Column('id', sql.String(64), primary_key=True),
+ sql.Column('rule', JsonBlob(), nullable=True),
+ sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
+ sql.Column('meta_rule_id', sql.ForeignKey("meta_rules.id"), nullable=False),
+ mysql_engine='InnoDB',
+ mysql_charset='utf8')
+ rules_table.create(migrate_engine, checkfirst=True)
+ sys.stdout.write(str(rules_table) + " ")
+ sys.stdout.flush()
+ print("")
+
+
+def downgrade(migrate_engine):
+ if isinstance(migrate_engine, str):
+ migrate_engine = create_engine(migrate_engine)
+ meta = sql.MetaData()
+ meta.bind = migrate_engine
+
+ for _table in (
+ 'rules',
+ 'meta_rules',
+ 'action_assignments',
+ 'object_assignments',
+ 'subject_assignments',
+ 'action_data',
+ 'object_data',
+ 'subject_data',
+ 'actions',
+ 'objects',
+ 'subjects',
+ 'action_categories',
+ 'object_categories',
+ 'subject_categories',
+ 'models',
+ 'policies',
+ 'pdp',
+ 'slaves'
+ ):
+ try:
+ table = sql.Table(_table, meta, autoload=True)
+ table.drop(migrate_engine, checkfirst=True)
+ except Exception as e:
+ print(e)
diff --git a/moon_manager/moon_manager/api/db/model.py b/moon_manager/moon_manager/api/db/model.py
new file mode 100644
index 00000000..9dc6273a
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/model.py
@@ -0,0 +1,429 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities import exceptions
+from moon_utilities.security_functions import enforce
+from moon_manager.api.db.managers import Managers
+import copy
+from moon_manager import pip_driver
+
+logger = logging.getLogger("moon.db.api.model")
+
+
+class ModelManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.ModelManager = self
+
+ @enforce(("read", "write"), "models")
+ def update_model(self, moon_user_id, model_id, value):
+ if model_id not in self.driver.get_models(model_id=model_id):
+ raise exceptions.ModelUnknown
+
+ if not value['name'].strip():
+ raise exceptions.ModelContentError('Model name invalid')
+
+ if 'meta_rules' not in value:
+ raise exceptions.MetaRuleUnknown
+
+ model = self.get_models(moon_user_id=moon_user_id, model_id=model_id)
+ model = model[next(iter(model))]
+ if ((model['meta_rules'] and value['meta_rules'] and model['meta_rules'] != value[
+ 'meta_rules']) \
+ or (model['meta_rules'] and not value['meta_rules'])):
+ policies = Managers.PolicyManager.get_policies(moon_user_id=moon_user_id)
+ for policy_id in policies:
+ if policies[policy_id]["model_id"] == model_id:
+ raise exceptions.DeleteModelWithPolicy
+
+ if value and 'meta_rules' in value:
+ for meta_rule_id in value['meta_rules']:
+ if meta_rule_id:
+ meta_rule_tmp = self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
+ if (not meta_rule_id) or (not meta_rule_tmp) :
+ raise exceptions.MetaRuleUnknown
+
+ return self.driver.update_model(model_id=model_id, value=value)
+
+ @enforce(("read", "write"), "models")
+ def delete_model(self, moon_user_id, model_id):
+ if model_id not in self.driver.get_models(model_id=model_id):
+ raise exceptions.ModelUnknown
+ # TODO (asteroide): check that no policy is connected to this model
+ policies = Managers.PolicyManager.get_policies(moon_user_id=moon_user_id)
+ for policy in policies:
+ if policies[policy]['model_id'] == model_id:
+ raise exceptions.DeleteModelWithPolicy
+ return self.driver.delete_model(model_id=model_id)
+
+ @enforce(("read", "write"), "models")
+ def add_model(self, moon_user_id, model_id=None, value=None):
+
+ if not value['name'].strip():
+ raise exceptions.ModelContentError('Model name invalid')
+
+ models = self.driver.get_models()
+ if model_id in models:
+ raise exceptions.ModelExisting
+
+ if value.get('meta_rules', []):
+ for model in models:
+ if models[model]['name'] == value['name']:
+ raise exceptions.ModelExisting("Model Name Existed")
+ if sorted(models[model].get('meta_rules', [])) == sorted(value.get('meta_rules', [])):
+ raise exceptions.ModelExisting("Meta Rules List Existed in another Model")
+
+ if not model_id:
+ model_id = uuid4().hex
+ if value and 'meta_rules' in value:
+ for meta_rule_id in value['meta_rules']:
+ if not meta_rule_id:
+ raise exceptions.MetaRuleUnknown
+ meta_rule = self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
+ if not meta_rule:
+ raise exceptions.MetaRuleUnknown
+
+ return self.driver.add_model(model_id=model_id, value=value)
+
+ @enforce("read", "models")
+ def get_models(self, moon_user_id, model_id=None):
+ return self.driver.get_models(model_id=model_id)
+
+ @enforce("read", "policies")
+ def get_policies(self, moon_user_id, policy_id=None):
+ return self.driver.get_policies(policy_id=policy_id)
+
+ @enforce(("read", "write"), "meta_rules")
+ def update_meta_rule(self, moon_user_id, meta_rule_id, value):
+ meta_rules = self.driver.get_meta_rules()
+ if not meta_rule_id or meta_rule_id not in meta_rules:
+ raise exceptions.MetaRuleUnknown
+ self.__check_meta_rule_dependencies(moon_user_id=moon_user_id, meta_rule_id=meta_rule_id)
+ if value:
+ if not value['name'].strip():
+ raise exceptions.MetaRuleContentError('Meta_rule name invalid')
+
+ if 'subject_categories' in value:
+ if (len(value['subject_categories']) == 1 and (value['subject_categories'][0] is None or value[
+ 'subject_categories'][0].strip() == "")):
+ value['subject_categories'] = [];
+ else:
+ for subject_category_id in value['subject_categories']:
+ if (not subject_category_id) or (not self.driver.get_subject_categories(
+ category_id=subject_category_id)):
+ raise exceptions.SubjectCategoryUnknown
+ if 'object_categories' in value:
+ if (len(value['object_categories']) == 1 and (value['object_categories'][0] is None or value[
+ 'object_categories'][0].strip() == "")):
+ value['object_categories'] = [];
+ else:
+ for object_category_id in value['object_categories']:
+ if (not object_category_id) or (not self.driver.get_object_categories(
+ category_id=object_category_id)):
+ raise exceptions.ObjectCategoryUnknown
+ if 'action_categories' in value:
+ if (len(value['action_categories']) == 1 and (value['action_categories'][0] is None or value[
+ 'action_categories'][0].strip() == "")):
+ value['action_categories'] = [];
+ else:
+ for action_category_id in value['action_categories']:
+ if (not action_category_id) or (not self.driver.get_action_categories(
+ category_id=action_category_id)):
+ raise exceptions.ActionCategoryUnknown
+
+ for meta_rule_obj_id in meta_rules:
+ counter_matched_list = 0
+ counter_matched_list += self.check_combination(
+ meta_rules[meta_rule_obj_id]['subject_categories'],
+ value['subject_categories'])
+ counter_matched_list += self.check_combination(
+ meta_rules[meta_rule_obj_id]['object_categories'],
+ value['object_categories'])
+ counter_matched_list += self.check_combination(
+ meta_rules[meta_rule_obj_id]['action_categories'],
+ value['action_categories'])
+ if counter_matched_list == 3 and meta_rule_obj_id != meta_rule_id:
+ raise exceptions.MetaRuleExisting("Same categories combination existed")
+
+ return self.driver.set_meta_rule(meta_rule_id=meta_rule_id, value=value)
+
+ def __check_meta_rule_dependencies(self, moon_user_id, meta_rule_id):
+ policies = self.get_policies(moon_user_id=moon_user_id)
+ for policy in policies:
+ model_id = policies[policy]["model_id"]
+ model = self.get_models(moon_user_id=moon_user_id, model_id=model_id)[model_id]
+ if meta_rule_id in model["meta_rules"]:
+ raise exceptions.MetaRuleUpdateError("This meta_rule is already in use in a policy")
+
+ policies = Managers.PolicyManager.get_policies(moon_user_id=moon_user_id)
+ for policy_id in policies:
+ rules = Managers.PolicyManager.get_rules(moon_user_id=moon_user_id, policy_id=policy_id,
+ meta_rule_id=meta_rule_id)
+ if rules['rules']:
+ raise exceptions.MetaRuleUpdateError
+
+ @enforce("read", "meta_rules")
+ def get_meta_rules(self, moon_user_id, meta_rule_id=None):
+ return self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
+
+ @enforce(("read", "write"), "meta_rules")
+ def add_meta_rule(self, moon_user_id, meta_rule_id=None, value=None):
+
+ if not value['name'].strip():
+ raise exceptions.MetaRuleContentError('Meta_rule name invalid')
+
+ meta_rules = self.driver.get_meta_rules()
+
+ if meta_rule_id in meta_rules:
+ raise exceptions.MetaRuleExisting
+
+ if value:
+ if 'subject_categories' in value:
+ if (len(value['subject_categories']) == 1 and (value['subject_categories'][0] is None or value[
+ 'subject_categories'][0].strip() == "")):
+ value['subject_categories'] = [];
+ else:
+ for subject_category_id in value['subject_categories']:
+ if ((not subject_category_id) or (not self.driver.get_subject_categories(
+ category_id=subject_category_id))):
+ if subject_category_id.startswith("attributes:"):
+ _attributes = pip_driver.AttrsManager.get_objects(
+ moon_user_id="admin",
+ object_type=subject_category_id.replace("attributes:", "")
+ )
+ action_category_id = subject_category_id.replace("attributes:", "")
+ if action_category_id != _attributes['id']:
+ raise exceptions.SubjectCategoryUnknown
+ else:
+ raise exceptions.SubjectCategoryUnknown
+ if 'object_categories' in value:
+ if(len(value['object_categories']) == 1 and (value['object_categories'][0] is None or value[
+ 'object_categories'][0].strip() == "")):
+ value['object_categories'] = [];
+ else:
+ for object_category_id in value['object_categories']:
+ if ((not object_category_id) or (not self.driver.get_object_categories(
+ category_id=object_category_id))):
+ if object_category_id.startswith("attributes:"):
+ _attributes = pip_driver.AttrsManager.get_objects(
+ moon_user_id="admin",
+ object_type=object_category_id.replace("attributes:", "")
+ )
+ action_category_id = object_category_id.replace("attributes:", "")
+ if action_category_id != _attributes['id']:
+ raise exceptions.ObjectCategoryUnknown
+ else:
+ raise exceptions.ObjectCategoryUnknown
+ if 'action_categories' in value:
+ if (len(value['action_categories']) == 1 and (value['action_categories'][0] is None or value[
+ 'action_categories'][0].strip() == "")):
+ value['action_categories'] = [];
+ else:
+ for action_category_id in value['action_categories']:
+ if ((not action_category_id) or (not self.driver.get_action_categories(
+ category_id=action_category_id))):
+ if action_category_id.startswith("attributes:"):
+ _attributes = pip_driver.AttrsManager.get_objects(
+ moon_user_id="admin",
+ object_type=action_category_id.replace("attributes:", "")
+ )
+ action_category_id = action_category_id.replace("attributes:", "")
+ if action_category_id not in _attributes.keys():
+ raise exceptions.ActionCategoryUnknown
+ else:
+ raise exceptions.ActionCategoryUnknown
+
+ for meta_rule_obj_id in meta_rules:
+ counter_matched_list = 0
+
+ counter_matched_list += self.check_combination(
+ meta_rules[meta_rule_obj_id]['subject_categories'], value['subject_categories'])
+
+ counter_matched_list += self.check_combination(
+ meta_rules[meta_rule_obj_id]['object_categories'], value['object_categories'])
+
+ counter_matched_list += self.check_combination(
+ meta_rules[meta_rule_obj_id]['action_categories'], value['action_categories'])
+
+ if counter_matched_list == 3:
+ raise exceptions.MetaRuleExisting("Same categories combination existed")
+
+ return self.driver.set_meta_rule(meta_rule_id=meta_rule_id, value=value)
+
+ # @enforce(("read", "write"), "meta_rules")
+ def check_combination(self, list_one, list_two):
+ counter_removed_items = 0
+ temp_list_two = copy.deepcopy(list_two)
+ for item in list_one:
+ if item in temp_list_two:
+ temp_list_two.remove(item)
+ counter_removed_items += 1
+
+ if list_two and counter_removed_items == len(list_two) and len(list_two) == len(list_one):
+ return 1
+ return 0
+
+ @enforce(("read", "write"), "meta_rules")
+ def delete_meta_rule(self, moon_user_id, meta_rule_id=None):
+ if meta_rule_id not in self.driver.get_meta_rules(meta_rule_id=meta_rule_id):
+ raise exceptions.MetaRuleUnknown
+ # TODO (asteroide): check and/or delete data and assignments and rules linked to that meta_rule
+ models = self.get_models(moon_user_id=moon_user_id)
+ for model_id in models:
+ for id in models[model_id]['meta_rules']:
+ if id == meta_rule_id:
+ raise exceptions.DeleteMetaRuleWithModel
+ return self.driver.delete_meta_rule(meta_rule_id=meta_rule_id)
+
+ @enforce("read", "meta_data")
+ def get_subject_categories(self, moon_user_id, category_id=None):
+ return self.driver.get_subject_categories(category_id=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def add_subject_category(self, moon_user_id, category_id=None, value=None):
+
+ if not value['name'].strip():
+ raise exceptions.CategoryNameInvalid
+
+ subject_categories = []
+ if category_id is not None:
+ subject_categories = self.driver.get_subject_categories(category_id=category_id)
+
+ subject_categories_names = self.driver.get_subject_categories(category_name=value['name'].strip())
+
+ if subject_categories_names or subject_categories:
+ raise exceptions.SubjectCategoryExisting
+
+
+ if not ('description' in value):
+ value['description'] = ""
+ return self.driver.add_subject_category(name=value["name"],
+ description=value["description"], uuid=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def delete_subject_category(self, moon_user_id, category_id):
+ # TODO (asteroide): delete all data linked to that category
+ # TODO (asteroide): delete all meta_rules linked to that category
+ if category_id not in self.driver.get_subject_categories(category_id=category_id):
+ raise exceptions.SubjectCategoryUnknown
+ meta_rules = self.get_meta_rules(moon_user_id=moon_user_id)
+ for meta_rule_id in meta_rules:
+ for subject_category_id in meta_rules[meta_rule_id]['subject_categories']:
+ logger.info(
+ "delete_subject_category {} {}".format(subject_category_id, meta_rule_id))
+ logger.info("delete_subject_category {}".format(meta_rules[meta_rule_id]))
+ if subject_category_id == category_id:
+ # has_rules = self.driver.is_meta_rule_has_rules(meta_rule_id)
+ # if has_rules:
+ raise exceptions.DeleteSubjectCategoryWithMetaRule
+
+ if self.driver.is_subject_category_has_assignment(category_id):
+ raise exceptions.DeleteCategoryWithAssignment
+
+ if self.driver.is_subject_data_exist(category_id=category_id):
+ raise exceptions.DeleteCategoryWithData
+
+ return self.driver.delete_subject_category(category_id=category_id)
+
+ @enforce("read", "meta_data")
+ def get_object_categories(self, moon_user_id, category_id=None):
+ return self.driver.get_object_categories(category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def add_object_category(self, moon_user_id, category_id=None, value=None):
+ if not value['name'].strip():
+ raise exceptions.CategoryNameInvalid
+
+ object_categories = []
+ if category_id is not None:
+ object_categories = self.driver.get_object_categories(category_id=category_id)
+
+ object_categories_names = self.driver.get_object_categories(category_name=value['name'].strip())
+ if object_categories_names or object_categories:
+ raise exceptions.ObjectCategoryExisting
+
+ if not ('description' in value):
+ value['description'] = ""
+
+ return self.driver.add_object_category(name=value["name"], description=value["description"],
+ uuid=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def delete_object_category(self, moon_user_id, category_id):
+ # TODO (asteroide): delete all data linked to that category
+ # TODO (asteroide): delete all meta_rules linked to that category
+ if category_id not in self.driver.get_object_categories(category_id=category_id):
+ raise exceptions.ObjectCategoryUnknown
+ meta_rules = self.get_meta_rules(moon_user_id=moon_user_id)
+ for meta_rule_id in meta_rules:
+ for object_category_id in meta_rules[meta_rule_id]['object_categories']:
+ if object_category_id == category_id:
+ # has_rules = self.driver.is_meta_rule_has_rules(meta_rule_id)
+ # if has_rules:
+ raise exceptions.DeleteObjectCategoryWithMetaRule
+
+ if self.driver.is_object_category_has_assignment(category_id):
+ raise exceptions.DeleteCategoryWithAssignment
+
+ if self.driver.is_object_data_exist(category_id=category_id):
+ raise exceptions.DeleteCategoryWithData
+
+ return self.driver.delete_object_category(category_id=category_id)
+
+ @enforce("read", "meta_data")
+ def get_action_categories(self, moon_user_id, category_id=None):
+ return self.driver.get_action_categories(category_id=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def add_action_category(self, moon_user_id, category_id=None, value=None):
+
+ if not value['name'].strip():
+ raise exceptions.CategoryNameInvalid
+
+ action_categories = []
+ if category_id is not None:
+ action_categories = self.driver.get_action_categories(category_id=category_id)
+
+ action_categories_names = self.driver.get_action_categories(category_name=value['name'].strip())
+ if action_categories_names or action_categories:
+ raise exceptions.ActionCategoryExisting
+
+ if not ('description' in value):
+ value['description'] = ""
+
+ return self.driver.add_action_category(name=value["name"], description=value["description"],
+ uuid=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def delete_action_category(self, moon_user_id, category_id):
+ # TODO (asteroide): delete all data linked to that category
+ # TODO (asteroide): delete all meta_rules linked to that category
+ if category_id not in self.driver.get_action_categories(category_id=category_id):
+ raise exceptions.ActionCategoryUnknown
+ meta_rules = self.get_meta_rules(moon_user_id=moon_user_id)
+ for meta_rule_id in meta_rules:
+ for action_category_id in meta_rules[meta_rule_id]['action_categories']:
+ if action_category_id == category_id:
+ # has_rules = self.driver.is_meta_rule_has_rules(meta_rule_id)
+ # if has_rules:
+ raise exceptions.DeleteActionCategoryWithMetaRule
+
+ if self.driver.is_action_category_has_assignment(category_id):
+ raise exceptions.DeleteCategoryWithAssignment
+
+ if self.driver.is_action_data_exist(category_id=category_id):
+ raise exceptions.DeleteCategoryWithData
+
+ return self.driver.delete_action_category(category_id=category_id)
diff --git a/moon_manager/moon_manager/api/db/pdp.py b/moon_manager/moon_manager/api/db/pdp.py
new file mode 100644
index 00000000..a4ca08f6
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/pdp.py
@@ -0,0 +1,115 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities.security_functions import enforce
+from moon_manager.api.db.managers import Managers
+from moon_utilities import exceptions
+
+logger = logging.getLogger("moon.db.api.pdp")
+
+
+class PDPManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.PDPManager = self
+
+ @enforce(("read", "write"), "pdp")
+ def update_pdp(self, moon_user_id, pdp_id, value):
+ if not value or 'name' not in value or not value['name'].strip():
+ raise exceptions.PdpContentError
+
+ exists_security_pipeline = value and 'security_pipeline' in value and \
+ len(value['security_pipeline']) > 0
+ exists_vim_project_id = value and 'vim_project_id' in value and \
+ value['vim_project_id'] != None and \
+ value['vim_project_id'].strip()
+ if not exists_security_pipeline and exists_vim_project_id:
+ raise exceptions.PdpContentError
+ if exists_security_pipeline and not exists_vim_project_id:
+ raise exceptions.PdpContentError
+
+ self.__pdp_validated_pipeline_name_id(pdp_id, value, "update")
+
+ if value and 'security_pipeline' in value:
+ for policy_id in value['security_pipeline']:
+ if not policy_id or not policy_id.strip() or not \
+ Managers.PolicyManager.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ return self.driver.update_pdp(pdp_id=pdp_id, value=value)
+
+ @enforce(("read", "write"), "pdp")
+ def delete_pdp(self, moon_user_id, pdp_id):
+ if pdp_id not in self.driver.get_pdp(pdp_id=pdp_id):
+ raise exceptions.PdpUnknown
+ return self.driver.delete_pdp(pdp_id=pdp_id)
+
+ @enforce(("read", "write"), "pdp")
+ def add_pdp(self, moon_user_id, pdp_id=None, value=None):
+ if not value or 'name' not in value or not value['name'].strip():
+ raise exceptions.PdpContentError
+
+ exists_security_pipeline = value and 'security_pipeline' in value and \
+ len(value['security_pipeline']) > 0
+ exists_vim_project_id = value and 'vim_project_id' in value and \
+ value['vim_project_id'] is not None and \
+ value['vim_project_id'].strip()
+ if not exists_security_pipeline and exists_vim_project_id:
+ raise exceptions.PdpContentError
+ if exists_security_pipeline and not exists_vim_project_id:
+ raise exceptions.PdpContentError
+
+ self.__pdp_validated_pipeline_name_id(pdp_id, value, "add")
+
+ if value and 'security_pipeline' in value:
+ for policy_id in value['security_pipeline']:
+ if not policy_id or not policy_id.strip() or not \
+ Managers.PolicyManager.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ return self.driver.add_pdp(pdp_id=pdp_id, value=value)
+
+ @enforce("read", "pdp")
+ def get_pdp(self, moon_user_id, pdp_id=None):
+ return self.driver.get_pdp(pdp_id=pdp_id)
+
+ @enforce("read", "pdp")
+ def delete_policy_from_pdp(self, moon_user_id, pdp_id, policy_id):
+
+ if pdp_id not in self.driver.get_pdp(pdp_id=pdp_id):
+ raise exceptions.PdpUnknown
+ if policy_id not in self.driver.get_policies(policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+ x = self.driver.delete_policy_from_pdp(pdp_id=pdp_id, policy_id=policy_id)
+ return x
+
+ def __pdp_validated_pipeline_name_id(self, pdp_id, value, method_type=None):
+ all_pdps = self.driver.get_pdp()
+ if method_type == 'update':
+ if pdp_id not in all_pdps:
+ raise exceptions.PdpUnknown
+ else:
+ if pdp_id in all_pdps:
+ raise exceptions.PdpExisting
+ if not pdp_id:
+ pdp_id = uuid4().hex
+
+ for key in all_pdps:
+ if pdp_id != key:
+ if all_pdps[key]['name'] == value['name']:
+ raise exceptions.PdpExisting
+ for policy_id in value['security_pipeline']:
+ if policy_id in all_pdps[key]['security_pipeline']:
+ raise exceptions.PdpInUse
diff --git a/moon_manager/moon_manager/api/db/policy.py b/moon_manager/moon_manager/api/db/policy.py
new file mode 100644
index 00000000..e736aca7
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/policy.py
@@ -0,0 +1,971 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+from uuid import uuid4
+from moon_manager.api.db.managers import Managers
+from moon_manager.pip_driver import InformationManager
+from moon_utilities.security_functions import enforce
+from moon_utilities import exceptions
+from moon_manager import pip_driver
+
+
+logger = logging.getLogger("moon.db.api.policy")
+
+
+class PolicyManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.PolicyManager = self
+
+ def get_policy_from_meta_rules(self, moon_user_id, meta_rule_id):
+ policies = self.PolicyManager.get_policies("admin")
+ models = self.ModelManager.get_models("admin")
+ for pdp_key, pdp_value in self.PDPManager.get_pdp(moon_user_id=moon_user_id).items():
+ if 'security_pipeline' not in pdp_value:
+ raise exceptions.PdpContentError
+ for policy_id in pdp_value["security_pipeline"]:
+ if not policies or policy_id not in policies:
+ raise exceptions.PolicyUnknown
+ model_id = policies[policy_id]["model_id"]
+ if not models:
+ raise exceptions.ModelUnknown
+ if model_id not in models:
+ raise exceptions.ModelUnknown
+ if meta_rule_id in models[model_id]["meta_rules"]:
+ return policy_id
+
+ @enforce(("read", "write"), "policies")
+ def update_policy(self, moon_user_id, policy_id, value):
+
+ if not value or not value['name'].strip():
+ raise exceptions.PolicyContentError
+
+ policy_list = self.driver.get_policies(policy_id=policy_id)
+ if not policy_id or policy_id not in policy_list:
+ raise exceptions.PolicyUnknown
+
+ policies = self.driver.get_policies(policy_name=value['name'])
+ if policies and not (policy_id in policies):
+ raise exceptions.PolicyExisting("Policy name Existed")
+
+ if 'model_id' in value and value['model_id']:
+ if not value['model_id'].strip() or not Managers.ModelManager.get_models(
+ moon_user_id=moon_user_id, model_id=value['model_id']):
+ raise exceptions.ModelUnknown
+
+ policy_obj = policy_list[policy_id]
+ if policy_obj["model_id"] and policy_obj["model_id"] != value['model_id']:
+ raise exceptions.PolicyUpdateError("Model is not empty")
+
+ return self.driver.update_policy(policy_id=policy_id, value=value)
+
+ @enforce(("read", "write"), "policies")
+ def delete_policy(self, moon_user_id, policy_id):
+ # TODO (asteroide): unmap PDP linked to that policy
+ if policy_id not in self.driver.get_policies(policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+ pdps = self.PDPManager.get_pdp(moon_user_id=moon_user_id)
+ for pdp in pdps:
+ if policy_id in pdps[pdp]['security_pipeline']:
+ self.PDPManager.delete_policy_from_pdp(moon_user_id=moon_user_id,
+ pdp_id=pdp,
+ policy_id=policy_id)
+
+ subject_data = self.get_subject_data(moon_user_id=moon_user_id, policy_id=policy_id)
+ if subject_data:
+ for subject_data_obj in subject_data:
+ if subject_data_obj and subject_data_obj["data"]:
+ for subject_data_id in subject_data_obj['data']:
+ self.delete_subject_data(moon_user_id=moon_user_id, policy_id=policy_id,
+ data_id=subject_data_id)
+
+ object_data = self.get_object_data(moon_user_id=moon_user_id, policy_id=policy_id)
+ if object_data:
+ for object_data_obj in object_data:
+ if object_data_obj and object_data_obj["data"]:
+ for object_data_id in object_data_obj['data']:
+ self.delete_object_data(moon_user_id=moon_user_id, policy_id=policy_id,
+ data_id=object_data_id)
+ action_data = self.get_action_data(moon_user_id=moon_user_id, policy_id=policy_id)
+ if action_data:
+ for action_data_obj in action_data:
+ if action_data_obj and action_data_obj["data"]:
+ for action_data_id in action_data_obj['data']:
+ self.delete_action_data(moon_user_id=moon_user_id, policy_id=policy_id,
+ data_id=action_data_id)
+
+ subjects = self.driver.get_subjects(policy_id=policy_id)
+ if subjects:
+ for subject_id in subjects:
+ self.delete_subject(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=subject_id)
+ objects = self.driver.get_objects(policy_id=policy_id)
+ if objects:
+ for object_id in objects:
+ self.delete_object(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=object_id)
+ actions = self.driver.get_actions(policy_id=policy_id)
+ if actions:
+ for action_id in actions:
+ self.delete_action(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=action_id)
+
+ # rules = self.driver.get_rules(policy_id=policy_id)["rules"]
+ # if rules:
+ # for rule_id in rules:
+ # self.delete_rule(moon_user_id=moon_user_id, policy_id=policy_id, rules=rule_id)
+
+ return self.driver.delete_policy(policy_id=policy_id)
+
+ @enforce(("read", "write"), "policies")
+ def add_policy(self, moon_user_id, policy_id=None, value=None):
+
+ if not value or not value['name'].strip():
+ raise exceptions.PolicyContentError
+ if policy_id in self.driver.get_policies(policy_id=policy_id):
+ raise exceptions.PolicyExisting
+
+ if self.driver.get_policies(policy_name=value['name']):
+ raise exceptions.PolicyExisting("Policy name Existed")
+
+ if not policy_id:
+ policy_id = uuid4().hex
+ if 'model_id' in value and value['model_id'] != "":
+ model_id = value['model_id']
+ if model_id is None:
+ raise exceptions.ModelUnknown
+ else:
+ model_list = Managers.ModelManager.get_models(moon_user_id=moon_user_id,
+ model_id=model_id)
+ if not model_list:
+ raise exceptions.ModelUnknown
+
+ self.__check_blank_model(model_list[model_id])
+
+ return self.driver.add_policy(policy_id=policy_id, value=value)
+
+ @enforce("read", "policies")
+ def get_policies(self, moon_user_id, policy_id=None):
+ return self.driver.get_policies(policy_id=policy_id)
+
+ @enforce("read", "perimeter")
+ def get_subjects(self, moon_user_id, policy_id, perimeter_id=None):
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+ if policy_id and (not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+ return self.driver.get_subjects(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce(("read", "write"), "perimeter")
+ def add_subject(self, moon_user_id, policy_id=None, perimeter_id=None, value=None):
+
+ logger.debug("add_subject {}".format(policy_id))
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+
+ if 'policy_list' in value:
+ raise exceptions.PerimeterContentError("body should not contain policy_list")
+
+ if policy_id and (not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+
+ if perimeter_id:
+ subjects = self.driver.get_subjects(policy_id=None, perimeter_id=perimeter_id)
+ if subjects and subjects[perimeter_id]['name'] != value['name']:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ subject_per = self.driver.get_subject_by_name(value['name'])
+ if subject_per:
+ perimeter_id = next(iter(subject_per))
+
+ # should get k_user = {'users':[{"id":"11111"}]} from Keystone
+ # FIXME: need to check other input
+ # k_user = InformationManager.get_users(username=value.get('name'))
+ #
+ # if not k_user.get('users', {}):
+ # k_user = InformationManager.add_user(**value)
+ # if k_user:
+ # if not perimeter_id:
+ # try:
+ # logger.info("k_user={}".format(k_user))
+ # perimeter_id = k_user['users'][0].get('id', uuid4().hex)
+ # except IndexError:
+ # k_user = InformationManager.get_users(value.get('name'))
+ # perimeter_id = uuid4().hex
+ # except KeyError:
+ # k_user = InformationManager.get_users(value.get('name'))
+ # perimeter_id = uuid4().hex
+ #
+ # try:
+ # value.update(k_user['users'][0])
+ # except IndexError:
+ # logger.error("Cannot update user from external server data, got {}".format(k_user))
+
+ return self.driver.set_subject(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def update_subject(self, moon_user_id, perimeter_id, value):
+ logger.debug("update_subject perimeter_id = {}".format(perimeter_id))
+
+ if not perimeter_id:
+ raise exceptions.SubjectUnknown
+
+ subjects = self.driver.get_subjects(policy_id=None, perimeter_id=perimeter_id)
+ if not subjects or not (perimeter_id in subjects):
+ raise exceptions.PerimeterContentError
+
+ if 'policy_list' in value or ('name' in value and not value['name']):
+ raise exceptions.PerimeterContentError
+
+ return self.driver.update_subject(perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def delete_subject(self, moon_user_id, policy_id, perimeter_id):
+
+ if not perimeter_id:
+ raise exceptions.SubjectUnknown
+
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+
+ if not self.get_subjects(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=perimeter_id):
+ raise exceptions.SubjectUnknown
+
+ if policy_id:
+ if not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ subj_assig = self.driver.get_subject_assignments(policy_id=policy_id,
+ subject_id=perimeter_id)
+ if subj_assig:
+ assign_id = next(iter(subj_assig))
+ for data_id in subj_assig[assign_id]['assignments']:
+ self.delete_subject_assignment(moon_user_id=moon_user_id,
+ policy_id=policy_id,
+ subject_id=perimeter_id,
+ category_id=subj_assig[assign_id]['category_id'],
+ data_id=data_id)
+
+ return self.driver.delete_subject(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce("read", "perimeter")
+ def get_objects(self, moon_user_id, policy_id, perimeter_id=None):
+ # if not policy_id:
+ # pass
+ if policy_id and (not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+ return self.driver.get_objects(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce(("read", "write"), "perimeter")
+ def add_object(self, moon_user_id, policy_id, perimeter_id=None, value=None):
+ logger.debug("add_object {}".format(policy_id))
+
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+
+ if 'policy_list' in value:
+ raise exceptions.PerimeterContentError("body should not contain policy_list")
+
+ if policy_id and (not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+
+ # object_perimeter = {}
+ # if perimeter_id:
+ # object_perimeter = self.driver.get_objects(policy_id=None, perimeter_id=perimeter_id)
+ # if not object_perimeter:
+ # raise exceptions.PerimeterContentError
+ # empeche l'ajout d'un objet avec un id prédéterminé
+
+ if not perimeter_id:
+ object_perimeter = self.driver.get_object_by_name(value['name'])
+ if object_perimeter:
+ perimeter_id = next(iter(object_perimeter))
+
+ if perimeter_id:
+ objects = self.driver.get_objects(policy_id=None, perimeter_id=perimeter_id)
+ if objects and objects[perimeter_id]['name'] != value['name']:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ perimeter_id = uuid4().hex
+ return self.driver.set_object(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def update_object(self, moon_user_id, perimeter_id, value):
+ logger.debug("update_object perimeter_id = {}".format(perimeter_id))
+
+ if not perimeter_id:
+ raise exceptions.ObjectUnknown
+
+ objects = self.driver.get_objects(policy_id=None, perimeter_id=perimeter_id)
+ if not objects or not (perimeter_id in objects):
+ raise exceptions.PerimeterContentError
+
+ if 'policy_list' in value or ('name' in value and not value['name']):
+ raise exceptions.PerimeterContentError
+
+ return self.driver.update_object(perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def delete_object(self, moon_user_id, policy_id, perimeter_id):
+
+ if not perimeter_id:
+ raise exceptions.ObjectUnknown
+
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+
+ if not self.get_objects(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=perimeter_id):
+ raise exceptions.ObjectUnknown
+
+ if policy_id:
+
+ if not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ obj_assig = self.driver.get_object_assignments(policy_id=policy_id, object_id=perimeter_id)
+
+ if obj_assig:
+ assign_id = next(iter(obj_assig))
+ for data_id in obj_assig[assign_id]['assignments']:
+ self.delete_object_assignment(moon_user_id,
+ policy_id=policy_id,
+ object_id=perimeter_id,
+ category_id=obj_assig[assign_id]['category_id'],
+ data_id=data_id)
+
+ return self.driver.delete_object(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce("read", "perimeter")
+ def get_actions(self, moon_user_id, policy_id, perimeter_id=None):
+
+ if policy_id and (not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+ return self.driver.get_actions(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce(("read", "write"), "perimeter")
+ def add_action(self, moon_user_id, policy_id, perimeter_id=None, value=None):
+ logger.debug("add_action {}".format(policy_id))
+
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+
+ if 'policy_list' in value:
+ raise exceptions.PerimeterContentError("body should not contain policy_list")
+
+ if policy_id and (not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+
+ action_perimeter = {}
+ if perimeter_id:
+ action_perimeter = self.driver.get_actions(policy_id=None, perimeter_id=perimeter_id)
+ if not action_perimeter:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ action_perimeter = self.driver.get_action_by_name(value['name'])
+ if action_perimeter:
+ perimeter_id = next(iter(action_perimeter))
+
+ if perimeter_id and action_perimeter[perimeter_id]['name'] != value['name']:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ perimeter_id = uuid4().hex
+
+ return self.driver.set_action(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def update_action(self, moon_user_id, perimeter_id, value):
+ logger.debug("update_action perimeter_id = {}".format(perimeter_id))
+
+ if not perimeter_id:
+ raise exceptions.ActionUnknown
+
+ actions = self.driver.get_actions(policy_id=None, perimeter_id=perimeter_id)
+ if not actions or not (perimeter_id in actions):
+ raise exceptions.PerimeterContentError
+
+ if 'policy_list' in value or ('name' in value and not value['name'].strip()):
+ raise exceptions.PerimeterContentError
+
+ return self.driver.update_action(perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def delete_action(self, moon_user_id, policy_id, perimeter_id):
+
+ if not perimeter_id:
+ raise exceptions.ActionUnknown
+
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+
+ if not self.get_actions(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=perimeter_id):
+ raise exceptions.ActionUnknown
+
+ logger.debug("delete_action {} {} {}".format(policy_id, perimeter_id,
+ self.get_policies(moon_user_id=moon_user_id,
+ policy_id=policy_id)))
+ if policy_id:
+ if not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ act_assig = self.driver.get_action_assignments(policy_id=policy_id, action_id=perimeter_id)
+
+ if act_assig:
+ assign_id = next(iter(act_assig))
+ for data_id in act_assig[assign_id]['assignments']:
+ self.delete_action_assignment(moon_user_id=moon_user_id,
+ policy_id=policy_id,
+ action_id=perimeter_id,
+ category_id=act_assig[assign_id]['category_id'],
+ data_id=data_id)
+
+ return self.driver.delete_action(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce("read", "data")
+ def get_subject_data(self, moon_user_id, policy_id, data_id=None, category_id=None):
+ available_metadata = self.get_available_metadata(moon_user_id=moon_user_id,
+ policy_id=policy_id)
+ results = []
+ if not category_id:
+ for cat in available_metadata["subject"]:
+ _value = self.driver.get_subject_data(policy_id=policy_id, data_id=data_id,
+ category_id=cat)
+ results.append(_value)
+ if category_id and category_id in available_metadata["subject"]:
+ results.append(self.driver.get_subject_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id))
+ return results
+
+ @enforce(("read", "write"), "data")
+ def set_subject_data(self, moon_user_id, policy_id, data_id=None, category_id=None, value=None):
+
+ logger.debug("set_subject_data policyID {}".format(policy_id))
+
+ if not value or 'name' not in value or not value['name'].strip():
+ raise exceptions.DataContentError
+
+ if not policy_id or not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ if not category_id or (
+ not Managers.ModelManager.get_subject_categories(moon_user_id=moon_user_id,
+ category_id=category_id)):
+ raise exceptions.SubjectCategoryUnknown
+
+ self.__category_dependency_validation(moon_user_id, policy_id, category_id,
+ 'subject_categories')
+
+ if not data_id:
+ data_id = uuid4().hex
+ return self.driver.set_subject_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+
+ @enforce(("read", "write"), "data")
+ def delete_subject_data(self, moon_user_id, policy_id, data_id, category_id=None):
+ # TODO (asteroide): check and/or delete assignments linked to that data
+ subject_assignments = self.get_subject_assignments(moon_user_id=moon_user_id,
+ policy_id=policy_id,
+ category_id=category_id)
+ if subject_assignments:
+ for assign_id in subject_assignments:
+ self.driver.delete_subject_assignment(
+ policy_id=subject_assignments[assign_id]['policy_id'],
+ subject_id=subject_assignments[assign_id]['subject_id'],
+ category_id=subject_assignments[assign_id]['category_id'],
+ data_id=subject_assignments[assign_id]['id'])
+
+ rules = self.driver.get_rules(policy_id=policy_id)
+ if rules['rules']:
+ for rule in rules['rules']:
+ if data_id in rule['rule']:
+ self.driver.delete_rule(policy_id, rule['id'])
+
+ return self.driver.delete_subject_data(policy_id=policy_id, category_id=category_id,
+ data_id=data_id)
+
+ @enforce("read", "data")
+ def get_object_data(self, moon_user_id, policy_id, data_id=None, category_id=None):
+ available_metadata = self.get_available_metadata(moon_user_id=moon_user_id,
+ policy_id=policy_id)
+ results = []
+ if not category_id:
+ for cat in available_metadata["object"]:
+ results.append(self.driver.get_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=cat))
+ if category_id and category_id in available_metadata["object"]:
+ results.append(self.driver.get_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id))
+ return results
+
+ @enforce(("read", "write"), "data")
+ def add_object_data(self, moon_user_id, policy_id, data_id=None, category_id=None, value=None):
+ logger.debug("add_object_data policyID {}".format(policy_id))
+
+ if not value or 'name' not in value or not value['name'].strip():
+ raise exceptions.DataContentError
+
+ if not policy_id or not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ if not category_id or (
+ not Managers.ModelManager.get_object_categories(moon_user_id=moon_user_id,
+ category_id=category_id)):
+ raise exceptions.ObjectCategoryUnknown
+
+ self.__category_dependency_validation(moon_user_id, policy_id, category_id,
+ 'object_categories')
+
+ if not data_id:
+ data_id = uuid4().hex
+ return self.driver.set_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+
+ @enforce(("read", "write"), "data")
+ def delete_object_data(self, moon_user_id, policy_id, data_id, category_id=None):
+ # TODO (asteroide): check and/or delete assignments linked to that data
+ object_assignments = self.get_object_assignments(moon_user_id=moon_user_id,
+ policy_id=policy_id,
+ category_id=category_id)
+
+ if object_assignments:
+ for assign_id in object_assignments:
+ self.driver.delete_object_assignment(
+ policy_id=object_assignments[assign_id]['policy_id'],
+ object_id=object_assignments[assign_id]['object_id'],
+ category_id=object_assignments[assign_id]['category_id'],
+ data_id=object_assignments[assign_id]['id'])
+
+ rules = self.driver.get_rules(policy_id=policy_id)
+ if rules['rules']:
+ for rule in rules['rules']:
+ if data_id in rule['rule']:
+ self.driver.delete_rule(policy_id, rule['id'])
+
+ return self.driver.delete_object_data(policy_id=policy_id, category_id=category_id,
+ data_id=data_id)
+
+ @enforce("read", "data")
+ def get_action_data(self, moon_user_id, policy_id, data_id=None, category_id=None):
+ available_metadata = self.get_available_metadata(moon_user_id=moon_user_id,
+ policy_id=policy_id)
+ results = []
+ if not category_id:
+ for cat in available_metadata["action"]:
+ results.append(self.driver.get_action_data(policy_id=policy_id, data_id=data_id,
+ category_id=cat))
+ if category_id and category_id in available_metadata["action"]:
+ if category_id.startswith("attributes:"):
+ data = {}
+ attrs = pip_driver.AttrsManager.get_objects(
+ moon_user_id="admin",
+ object_type=category_id.replace("attributes:", ""))
+ for item in attrs.keys():
+ data[item] = {"id": item, "name": item, "description": item}
+ results.append(
+ {
+ "policy_id": policy_id,
+ "category_id": category_id,
+ "data": data,
+ }
+ )
+ else:
+ results.append(self.driver.get_action_data(policy_id=policy_id,
+ data_id=data_id,
+ category_id=category_id))
+ return results
+
+ @enforce(("read", "write"), "data")
+ def add_action_data(self, moon_user_id, policy_id, data_id=None, category_id=None, value=None):
+
+ logger.debug("add_action_data policyID {}".format(policy_id))
+
+ if not value or 'name' not in value or not value['name'].strip():
+ raise exceptions.DataContentError
+
+ if not policy_id or not self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ if not category_id or (
+ not Managers.ModelManager.get_action_categories(moon_user_id=moon_user_id,
+ category_id=category_id)):
+ raise exceptions.ActionCategoryUnknown
+
+ self.__category_dependency_validation(moon_user_id, policy_id, category_id,
+ 'action_categories')
+
+ if not data_id:
+ data_id = uuid4().hex
+ return self.driver.set_action_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+
+ @enforce(("read", "write"), "data")
+ def delete_action_data(self, moon_user_id, policy_id, data_id, category_id=None):
+ # TODO (asteroide): check and/or delete assignments linked to that data
+ action_assignments = self.get_action_assignments(moon_user_id=moon_user_id,
+ policy_id=policy_id,
+ category_id=category_id)
+ if action_assignments:
+ for assign_id in action_assignments:
+ self.driver.delete_action_assignment(
+ policy_id=action_assignments[assign_id]['policy_id'],
+ action_id=action_assignments[assign_id]['action_id'],
+ category_id=action_assignments[assign_id]['category_id'],
+ data_id=action_assignments[assign_id]['id'])
+
+ rules = self.driver.get_rules(policy_id=policy_id)
+ if rules['rules']:
+ for rule in rules['rules']:
+ if data_id in rule['rule']:
+ self.driver.delete_rule(policy_id, rule['id'])
+
+ return self.driver.delete_action_data(policy_id=policy_id, category_id=category_id,
+ data_id=data_id)
+
+ @enforce("read", "assignments")
+ def get_subject_assignments(self, moon_user_id, policy_id, subject_id=None, category_id=None):
+ return self.driver.get_subject_assignments(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
+
+ @enforce(("read", "write"), "assignments")
+ def add_subject_assignment(self, moon_user_id, policy_id, subject_id, category_id, data_id):
+
+ logger.debug("add_subject_assignment policyID {}".format(policy_id))
+ if not category_id or (
+ not Managers.ModelManager.get_subject_categories(moon_user_id=moon_user_id,
+ category_id=category_id)):
+ raise exceptions.SubjectCategoryUnknown
+
+ self.__category_dependency_validation(moon_user_id, policy_id, category_id,
+ 'subject_categories')
+
+ if not subject_id or (
+ not self.get_subjects(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=subject_id)):
+ raise exceptions.SubjectUnknown
+ subjects_data = self.get_subject_data(moon_user_id=moon_user_id, policy_id=policy_id,
+ data_id=data_id, category_id=category_id)
+ if not data_id or not subjects_data or data_id not in subjects_data[0]['data']:
+ raise exceptions.DataUnknown
+
+ return self.driver.add_subject_assignment(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce(("read", "write"), "assignments")
+ def delete_subject_assignment(self, moon_user_id, policy_id, subject_id, category_id, data_id):
+ if policy_id:
+ return self.driver.delete_subject_assignment(
+ policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id, data_id=data_id)
+ raise exceptions.PolicyUnknown
+
+ @enforce("read", "assignments")
+ def get_object_assignments(self, moon_user_id, policy_id, object_id=None, category_id=None):
+ return self.driver.get_object_assignments(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
+
+ @enforce(("read", "write"), "assignments")
+ def add_object_assignment(self, moon_user_id, policy_id, object_id, category_id, data_id):
+
+ logger.debug("add_object_assignment policyID {}".format(policy_id))
+ if not category_id or (
+ not Managers.ModelManager.get_object_categories(moon_user_id=moon_user_id,
+ category_id=category_id)):
+ raise exceptions.ObjectCategoryUnknown
+
+ self.__category_dependency_validation(moon_user_id, policy_id, category_id,
+ 'object_categories')
+
+ if not object_id or (
+ not self.get_objects(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=object_id)):
+ raise exceptions.ObjectUnknown
+ objects_data = self.get_object_data(moon_user_id=moon_user_id, policy_id=policy_id,
+ data_id=data_id, category_id=category_id)
+ if not data_id or not objects_data or data_id not in objects_data[0]['data']:
+ raise exceptions.DataUnknown
+
+ return self.driver.add_object_assignment(policy_id=policy_id, object_id=object_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce(("read", "write"), "assignments")
+ def delete_object_assignment(self, moon_user_id, policy_id, object_id, category_id, data_id):
+ if policy_id:
+ return self.driver.delete_object_assignment(policy_id=policy_id, object_id=object_id,
+ category_id=category_id, data_id=data_id)
+ raise exceptions.PolicyUnknown
+
+ @enforce("read", "assignments")
+ def get_action_assignments(self, moon_user_id, policy_id, action_id=None, category_id=None):
+ return self.driver.get_action_assignments(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
+
+ @enforce(("read", "write"), "assignments")
+ def add_action_assignment(self, moon_user_id, policy_id, action_id, category_id, data_id):
+
+ logger.debug("add_action_assignment policyID {}".format(policy_id))
+
+ if not category_id or (
+ not Managers.ModelManager.get_action_categories(moon_user_id=moon_user_id,
+ category_id=category_id)):
+ raise exceptions.ActionCategoryUnknown
+
+ self.__category_dependency_validation(moon_user_id, policy_id, category_id,
+ 'action_categories')
+
+ if not action_id or (
+ not self.get_actions(moon_user_id=moon_user_id, policy_id=policy_id,
+ perimeter_id=action_id)):
+ raise exceptions.ActionUnknown
+ actions_data = self.get_action_data(moon_user_id=moon_user_id, policy_id=policy_id,
+ data_id=data_id, category_id=category_id)
+ if not data_id or not actions_data or data_id not in actions_data[0]['data']:
+ raise exceptions.DataUnknown
+
+ return self.driver.add_action_assignment(policy_id=policy_id, action_id=action_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce(("read", "write"), "assignments")
+ def delete_action_assignment(self, moon_user_id, policy_id, action_id, category_id, data_id):
+ if policy_id:
+ return self.driver.delete_action_assignment(policy_id=policy_id, action_id=action_id,
+ category_id=category_id, data_id=data_id)
+ raise exceptions.PolicyUnknown
+
+ @enforce("read", "rules")
+ def get_rules(self, moon_user_id, policy_id, meta_rule_id=None, rule_id=None):
+ return self.driver.get_rules(policy_id=policy_id, meta_rule_id=meta_rule_id,
+ rule_id=rule_id)
+
+ @enforce(("read", "write"), "policies")
+ def update_rule(self, moon_user_id, rule_id, value):
+ if not value or 'instructions' not in value:
+ raise exceptions.RuleContentError
+
+ rule_list = self.driver.get_rules(policy_id=None, rule_id=rule_id)
+ if not rule_id or rule_id not in rule_list:
+ raise exceptions.RuleUnknown
+
+ return self.driver.update_rule(rule_id=rule_id, value=value)
+
+ @enforce(("read", "write"), "rules")
+ def add_rule(self, moon_user_id, policy_id, meta_rule_id, value):
+
+ if not meta_rule_id or (
+ not self.ModelManager.get_meta_rules(moon_user_id=moon_user_id,
+ meta_rule_id=meta_rule_id)):
+ raise exceptions.MetaRuleUnknown
+
+ if not value or 'instructions' not in value: # TODO or not value['instructions']:
+ raise exceptions.MetaRuleContentError
+
+ decision_exist = False
+ default_instruction = {"decision": "grant"}
+
+ for instruction in value['instructions']:
+ if 'decision' in instruction:
+ decision_exist = True
+ if not instruction['decision']:
+ instruction['decision'] = default_instruction['decision']
+ elif instruction['decision'].lower() not in ['grant', 'deny', 'continue']:
+ raise exceptions.RuleContentError("Invalid Decision")
+
+ if not decision_exist:
+ value['instructions'].append(default_instruction)
+
+ self.__dependencies_validation(moon_user_id, policy_id, meta_rule_id)
+
+ self.__check_existing_rule(policy_id=policy_id, meta_rule_id=meta_rule_id,
+ moon_user_id=moon_user_id, rule_value=value)
+
+ return self.driver.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+
+ def __check_existing_rule(self, moon_user_id, policy_id, meta_rule_id, rule_value):
+
+ if not meta_rule_id:
+ raise exceptions.MetaRuleUnknown
+
+ meta_rule = self.ModelManager.get_meta_rules(moon_user_id=moon_user_id,
+ meta_rule_id=meta_rule_id)
+ if not meta_rule:
+ raise exceptions.MetaRuleUnknown
+
+ if len(meta_rule[meta_rule_id]['subject_categories']) + len(
+ meta_rule[meta_rule_id]['object_categories']) \
+ + len(meta_rule[meta_rule_id]['action_categories']) > len(rule_value['rule']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ if len(meta_rule[meta_rule_id]['subject_categories']) + len(
+ meta_rule[meta_rule_id]['object_categories']) \
+ + len(meta_rule[meta_rule_id]['action_categories']) < len(rule_value['rule']):
+ raise exceptions.MetaRuleContentError(message="Missing Data")
+
+ temp_rule_data = list(
+ rule_value['rule'][0:len(meta_rule[meta_rule_id]['subject_categories'])])
+ found_data_counter = 0
+ start_sub = len(meta_rule[meta_rule_id]['subject_categories'])
+
+ for sub_cat_id in meta_rule[meta_rule_id]['subject_categories']:
+ subjects_data = self.get_subject_data(moon_user_id=moon_user_id,
+ category_id=sub_cat_id, policy_id=policy_id)
+ if subjects_data:
+ found_data_counter = self.__validate_data_id(sub_cat_id, subjects_data[0]['data'],
+ temp_rule_data,
+ "Missing Subject_category "
+ , found_data_counter)
+
+ if found_data_counter != len(meta_rule[meta_rule_id]['subject_categories']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ _index = start_sub + len(meta_rule[meta_rule_id]['object_categories'])
+ temp_rule_data = list(rule_value['rule'][start_sub:_index])
+ found_data_counter = 0
+ start_sub = start_sub + len(meta_rule[meta_rule_id]['object_categories'])
+
+ for ob_cat_id in meta_rule[meta_rule_id]['object_categories']:
+ object_data = self.get_object_data(moon_user_id=moon_user_id,
+ category_id=ob_cat_id, policy_id=policy_id)
+ if object_data:
+ found_data_counter = self.__validate_data_id(ob_cat_id, object_data[0]['data'],
+ temp_rule_data,
+ "Missing Object_category ",
+ found_data_counter)
+
+ if found_data_counter != len(meta_rule[meta_rule_id]['object_categories']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ _index = start_sub + len(meta_rule[meta_rule_id]['action_categories'])
+ temp_rule_data = list(rule_value['rule'][start_sub:_index])
+ found_data_counter = 0
+
+ for act_cat_id in meta_rule[meta_rule_id]['action_categories']:
+ action_data = self.get_action_data(moon_user_id=moon_user_id, category_id=act_cat_id,
+ policy_id=policy_id)
+ if action_data:
+ found_data_counter = self.__validate_data_id(act_cat_id, action_data[0]['data'],
+ temp_rule_data,
+ "Missing Action_category ",
+ found_data_counter)
+
+ # Note: adding count of data linked to a global attribute
+ found_data_counter += len(list(filter(lambda x: "attributes:" in x, temp_rule_data)))
+ if found_data_counter != len(meta_rule[meta_rule_id]['action_categories']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ @staticmethod
+ def __validate_data_id(cat_id, data_ids, temp_rule_data, error_msg, found_data_counter):
+ for ID in data_ids:
+ if ID in temp_rule_data:
+ temp_rule_data.remove(ID)
+ found_data_counter += 1
+ # if no data id found in the rule, so rule not valid
+ if found_data_counter < 1:
+ raise exceptions.RuleContentError(message=error_msg + cat_id)
+ return found_data_counter
+
+ @enforce(("read", "write"), "rules")
+ def delete_rule(self, moon_user_id, policy_id, rule_id):
+ return self.driver.delete_rule(policy_id=policy_id, rule_id=rule_id)
+
+ @enforce("read", "meta_data")
+ def get_available_metadata(self, moon_user_id, policy_id):
+ categories = {
+ "subject": [],
+ "object": [],
+ "action": []
+ }
+ policy = self.driver.get_policies(policy_id=policy_id)
+ if not policy:
+ raise exceptions.PolicyUnknown
+ model_id = policy[policy_id]["model_id"]
+ model = Managers.ModelManager.get_models(moon_user_id=moon_user_id, model_id=model_id)
+ try:
+ meta_rule_list = model[model_id]["meta_rules"]
+ for meta_rule_id in meta_rule_list:
+ meta_rule = Managers.ModelManager.get_meta_rules(moon_user_id=moon_user_id,
+ meta_rule_id=meta_rule_id)
+ categories["subject"].extend(meta_rule[meta_rule_id]["subject_categories"])
+ categories["object"].extend(meta_rule[meta_rule_id]["object_categories"])
+ categories["action"].extend(meta_rule[meta_rule_id]["action_categories"])
+ finally:
+ return categories
+
+ def __dependencies_validation(self, moon_user_id, policy_id, meta_rule_id=None):
+
+ policies = self.get_policies(moon_user_id=moon_user_id, policy_id=policy_id)
+ if not policy_id or (not policies):
+ raise exceptions.PolicyUnknown
+
+ policy_content = policies[next(iter(policies))]
+ model_id = policy_content['model_id']
+ models = Managers.ModelManager.get_models(moon_user_id=moon_user_id, model_id=model_id)
+ if not model_id or not models:
+ raise exceptions.ModelUnknown
+
+ model_content = models[next(iter(models))]
+ if meta_rule_id:
+ meta_rule_exists = False
+
+ for model_meta_rule_id in model_content['meta_rules']:
+ if model_meta_rule_id == meta_rule_id:
+ meta_rule_exists = True
+ break
+
+ if not meta_rule_exists:
+ raise exceptions.MetaRuleNotLinkedWithPolicyModel
+
+ meta_rule = self.ModelManager.get_meta_rules(moon_user_id=moon_user_id,
+ meta_rule_id=meta_rule_id)
+ meta_rule_content = meta_rule[next(iter(meta_rule))]
+ if (not meta_rule_content['subject_categories']) or \
+ (not meta_rule_content['object_categories']) or \
+ (not meta_rule_content['action_categories']):
+ raise exceptions.MetaRuleContentError
+ return model_content
+
+ def __category_dependency_validation(self, moon_user_id, policy_id, category_id, category_key):
+ model = self.__dependencies_validation(moon_user_id=moon_user_id, policy_id=policy_id)
+ category_found = False
+ for model_meta_rule_id in model['meta_rules']:
+ meta_rule = self.ModelManager.get_meta_rules(moon_user_id=moon_user_id,
+ meta_rule_id=model_meta_rule_id)
+ meta_rule_content = meta_rule[next(iter(meta_rule))]
+ if meta_rule_content[category_key] and category_id in meta_rule_content[category_key]:
+ category_found = True
+ break
+
+ if not category_found:
+ raise exceptions.CategoryNotAssignedMetaRule
+
+ def __check_blank_model(self, model):
+ if 'meta_rules' not in model or not model['meta_rules']:
+ raise exceptions.MetaRuleUnknown
+ for meta_rule_id in model['meta_rules']:
+ self.__check_blank_meta_rule(meta_rule_id)
+
+ def __check_blank_meta_rule(self, meta_rule_id):
+ meta_rule = self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
+ if not meta_rule:
+ return exceptions.MetaRuleUnknown
+ meta_rule_content = meta_rule[next(iter(meta_rule))]
+ if (not meta_rule_content['subject_categories']) or (
+ not meta_rule_content['object_categories']) or (
+ not meta_rule_content['action_categories']):
+ raise exceptions.MetaRuleContentError
+
diff --git a/moon_manager/moon_manager/api/db/slave.py b/moon_manager/moon_manager/api/db/slave.py
new file mode 100644
index 00000000..f5ac9189
--- /dev/null
+++ b/moon_manager/moon_manager/api/db/slave.py
@@ -0,0 +1,55 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities.security_functions import enforce
+from moon_manager.api.db.managers import Managers
+from moon_utilities import exceptions
+
+logger = logging.getLogger("moon.db.api.slave")
+
+
+class SlaveManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.SlaveManager = self
+
+ @enforce(("read", "write"), "slave")
+ def update_slave(self, moon_user_id, slave_id, value):
+ if slave_id not in self.driver.get_slaves(slave_id=slave_id):
+ raise exceptions.SlaveNameUnknown
+
+ return self.driver.update_slave(slave_id=slave_id, value=value)
+
+ @enforce(("read", "write"), "slave")
+ def delete_slave(self, moon_user_id, slave_id):
+ if slave_id not in self.driver.get_slaves(slave_id=slave_id):
+ raise exceptions.SlaveNameUnknown
+ return self.driver.delete_slave(slave_id=slave_id)
+
+ @enforce(("read", "write"), "slave")
+ def add_slave(self, moon_user_id, slave_id=None, value=None):
+ if not value or 'name' not in value or not value['name'].strip():
+ raise exceptions.SlaveNameUnknown
+
+ if slave_id in self.driver.get_slaves(slave_id=slave_id):
+ raise exceptions.SlaveExisting
+ if not slave_id:
+ slave_id = uuid4().hex
+
+ return self.driver.add_slave(slave_id=slave_id, value=value)
+
+ @enforce("read", "slave")
+ def get_slaves(self, moon_user_id, slave_id=None):
+ return self.driver.get_slaves(slave_id=slave_id)
diff --git a/moon_manager/moon_manager/api/information/__init__.py b/moon_manager/moon_manager/api/information/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_manager/moon_manager/api/information/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_manager/moon_manager/api/information/global_attrs.py b/moon_manager/moon_manager/api/information/global_attrs.py
new file mode 100644
index 00000000..21b21445
--- /dev/null
+++ b/moon_manager/moon_manager/api/information/global_attrs.py
@@ -0,0 +1,145 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+API to gather information from external component like OpenStack
+"""
+
+from uuid import uuid4
+import logging
+from moon_utilities.security_functions import enforce
+from moon_manager.api.information.managers import Managers
+
+LOGGER = logging.getLogger("moon.manager.information.global_attrs")
+
+
+class GlobalAttrsManager(Managers):
+ """
+ Manager use to get information from external components
+ """
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.GlobalAttrsManager = self
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ return self.driver.set_auth(**kwargs)
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ return self.driver.unset_auth(**kwargs)
+
+ @enforce("read", "pip")
+ def get_users(self, user_id=None, **kwargs):
+ """List users in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to list users
+ :return: a list of users
+ """
+ return self.driver.get_users(user_id=user_id, **kwargs)
+
+ @enforce("write", "pip")
+ def add_user(self, user_id=None, **kwargs):
+ """Add a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to add a user
+ :return: the user added
+ """
+ if not user_id:
+ user_id = uuid4().hex
+ return self.driver.add_user(user_id=user_id, **kwargs)
+
+ @enforce(("read", "write"), "pip")
+ def update_user(self, user_id, **kwargs):
+ """Update a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to update the user
+ :return: the user updated
+ """
+ return self.driver.update_user(user_id=user_id, **kwargs)
+
+ @enforce("write", "pip")
+ def delete_user(self, user_id, **kwargs):
+ """Delete a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to delete the user
+ :return: True if the user has been deleted
+ """
+ return self.driver.delete_user(user_id=user_id, **kwargs)
+
+ @enforce("read", "pip")
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ return self.driver.get_objects(object_id=object_id, object_type=object_type, **kwargs)
+
+ @enforce("read", "pip")
+ def get_object(self, object_type, **kwargs):
+ """List objects in the server
+
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ return self.driver.get_object(object_type=object_type, **kwargs)
+
+ @enforce("write", "pip")
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ if not object_id:
+ object_id = uuid4().hex
+ return self.driver.add_object(object_id=object_id, object_type=object_type, **kwargs)
+
+ @enforce(("read", "write"), "pip")
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ return self.driver.update_object(object_id=object_id, object_type=object_type, **kwargs)
+
+ @enforce("write", "pip")
+ def delete_object(self, object_id=None, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ return self.driver.delete_object(object_id=object_id, object_type=object_type, **kwargs)
diff --git a/moon_manager/moon_manager/api/information/information.py b/moon_manager/moon_manager/api/information/information.py
new file mode 100644
index 00000000..132b8bce
--- /dev/null
+++ b/moon_manager/moon_manager/api/information/information.py
@@ -0,0 +1,106 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+API to gather information from external component like OpenStack
+"""
+
+from uuid import uuid4
+import logging
+from moon_utilities.security_functions import enforce
+from moon_manager.api.information.managers import Managers
+
+LOGGER = logging.getLogger("moon.manager.information.api.information")
+
+
+class InformationManager(Managers):
+ """
+ Manager use to get information from external components
+ """
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.InformationManager = self
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ return self.driver.set_auth(**kwargs)
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ return self.driver.unset_auth(**kwargs)
+
+ @enforce("read", "pip")
+ def get_items(self, item_id=None, **kwargs):
+ """List items in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to list items
+ :return: a list of items
+ """
+ return self.driver.get_items(item_id=item_id, **kwargs)
+
+ @enforce("write", "pip")
+ def add_item(self, item_id=None, **kwargs):
+ """Add a item in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to add a item
+ :return: the item added
+ """
+ if not item_id:
+ item_id = uuid4().hex
+ return self.driver.add_item(item_id=item_id, **kwargs)
+
+ @enforce(("read", "write"), "pip")
+ def update_item(self, item_id, **kwargs):
+ """Update a item in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to update the item
+ :return: the item updated
+ """
+ return self.driver.update_item(item_id=item_id, **kwargs)
+
+ @enforce("write", "pip")
+ def delete_item(self, item_id, **kwargs):
+ """Delete a item in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to delete the item
+ :return: True if the item has been deleted
+ """
+ return self.driver.delete_item(item_id=item_id, **kwargs)
+
+ @enforce("read", "pip")
+ def get_projects(self):
+ """List projects in the server
+
+ :return: the list of projects
+ """
+ return self.driver.get_projects()
+
+ @enforce("write", "pip")
+ def create_project(self, **tenant_dict):
+ """Create a project in the server
+
+ :param tenant_dict: all arguments necessary to create a project
+ :return: True if the item has been deleted
+ """
+ return self.driver.create_project(**tenant_dict)
diff --git a/moon_manager/moon_manager/api/information/managers.py b/moon_manager/moon_manager/api/information/managers.py
new file mode 100644
index 00000000..23aff8f5
--- /dev/null
+++ b/moon_manager/moon_manager/api/information/managers.py
@@ -0,0 +1,19 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Group all managers for this API
+"""
+
+
+class Managers(object):
+ """Object that links managers together"""
+ InformationManager = None
diff --git a/moon_manager/moon_manager/api/json_export.py b/moon_manager/moon_manager/api/json_export.py
index 1d3643e7..06a7ba71 100644
--- a/moon_manager/moon_manager/api/json_export.py
+++ b/moon_manager/moon_manager/api/json_export.py
@@ -1,238 +1,37 @@
-# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
-import logging
-from flask_restful import Resource
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PDPManager
-from python_moondb.core import PolicyManager
-from python_moondb.core import ModelManager
-from moon_manager.api.json_utils import JsonUtils, BaseException
-
-__version__ = "4.5.0"
-
-logger = logging.getLogger("moon.manager.api." + __name__)
-
-
-class JsonExport(Resource):
-
- __urls__ = (
- "/export",
- "/export/",
- )
-
- def _export_rules(self, json_content):
- policies = PolicyManager.get_policies(self._user_id)
- rules_array = []
-
- for policy_key in policies:
- rules = PolicyManager.get_rules(self._user_id, policy_key)
- rules = rules["rules"]
- # logger.info(rules)
- for rule in rules:
- rule_dict = dict()
- JsonUtils.copy_field_if_exists(rule, rule_dict, "instructions", dict)
- JsonUtils.copy_field_if_exists(rule, rule_dict, "enabled", True)
- JsonUtils.convert_id_to_name(rule["meta_rule_id"], rule_dict, "meta_rule", "meta_rule", ModelManager, self._user_id)
- JsonUtils.convert_id_to_name(policy_key, rule_dict, "policy", "policy", PolicyManager, self._user_id)
- ids = rule["rule"]
- rule_description = dict()
- meta_rule = ModelManager.get_meta_rules(self._user_id, rule["meta_rule_id"])
- meta_rule = [v for v in meta_rule.values()]
- meta_rule = meta_rule[0]
- index_subject_data = len(meta_rule["subject_categories"])-1
- index_object_data = len(meta_rule["subject_categories"]) + len(meta_rule["object_categories"])-1
- index_action_data = len(meta_rule["subject_categories"]) + len(meta_rule["object_categories"]) + len(meta_rule["action_categories"])-1
- ids_subject_data = [ids[0]] if len(meta_rule["subject_categories"]) == 1 else ids[0:index_subject_data]
- ids_object_data = [ids[index_object_data]] if len(meta_rule["object_categories"]) == 1 else ids[index_subject_data+1:index_object_data]
- ids_action_date = [ids[index_action_data]] if len(meta_rule["action_categories"]) == 1 else ids[index_object_data+1:index_action_data]
- JsonUtils.convert_ids_to_names(ids_subject_data, rule_description, "subject_data", "subject_data", PolicyManager, self._user_id, policy_key)
- JsonUtils.convert_ids_to_names(ids_object_data, rule_description, "object_data", "object_data", PolicyManager, self._user_id, policy_key)
- JsonUtils.convert_ids_to_names(ids_action_date, rule_description, "action_data", "action_data", PolicyManager, self._user_id, policy_key)
- rule_dict["rule"] = rule_description
- rules_array.append(rule_dict)
-
- if len(rules_array) > 0:
- json_content['rules'] = rules_array
+# Version: 5.4
- def _export_meta_rules(self, json_content):
- meta_rules = ModelManager.get_meta_rules(self._user_id)
- meta_rules_array = []
- # logger.info(meta_rules)
- for meta_rule_key in meta_rules:
- #logger.info(meta_rules[meta_rule_key])
- meta_rule_dict = dict()
- JsonUtils.copy_field_if_exists(meta_rules[meta_rule_key], meta_rule_dict, "name", str)
- JsonUtils.copy_field_if_exists(meta_rules[meta_rule_key], meta_rule_dict, "description", str)
- JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["subject_categories"], meta_rule_dict, "subject_categories", "subject_category", ModelManager, self._user_id)
- JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["object_categories"], meta_rule_dict, "object_categories", "object_category", ModelManager, self._user_id)
- JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["action_categories"], meta_rule_dict, "action_categories", "action_category", ModelManager, self._user_id)
- logger.info("Exporting meta rule {}".format(meta_rule_dict))
- meta_rules_array.append(meta_rule_dict)
- if len(meta_rules_array) > 0:
- json_content['meta_rules'] = meta_rules_array
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
- def _export_subject_object_action_assignments(self, type_element, json_content):
- export_method_data = getattr(PolicyManager, 'get_' + type_element + '_assignments')
- policies = PolicyManager.get_policies(self._user_id)
- element_assignments_array = []
- for policy_key in policies:
- assignments = export_method_data(self._user_id, policy_key)
- #logger.info(assignments)
- for assignment_key in assignments:
- assignment_dict = dict()
- JsonUtils.convert_id_to_name(assignments[assignment_key][type_element + "_id"], assignment_dict, type_element, type_element , PolicyManager, self._user_id, policy_key)
- JsonUtils.convert_id_to_name(assignments[assignment_key]["category_id"], assignment_dict, "category", type_element + "_category", ModelManager, self._user_id, policy_key)
- JsonUtils.convert_ids_to_names(assignments[assignment_key]["assignments"], assignment_dict, "assignments", type_element + "_data", PolicyManager, self._user_id, policy_key)
- element_assignments_array.append(assignment_dict)
- logger.info("Exporting {} assignment {}".format(type_element, assignment_dict))
- if len(element_assignments_array) > 0:
- json_content[type_element + '_assignments'] = element_assignments_array
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
- def _export_subject_object_action_datas(self, type_element, json_content):
- export_method_data = getattr(PolicyManager, 'get_' + type_element + '_data')
- policies = PolicyManager.get_policies(self._user_id)
- element_datas_array = []
- for policy_key in policies:
- datas = export_method_data(self._user_id, policy_key)
- #logger.info("data found : {}".format(datas))
- for data_group in datas:
- policy_id = data_group["policy_id"]
- category_id = data_group["category_id"]
- # logger.info(data_group["data"])
- for data_key in data_group["data"]:
- data_dict = dict()
- if type_element == 'subject':
- JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict, "name", str)
- JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict, "description", str)
- else:
- JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict, "name", str)
- JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict, "description", str)
- JsonUtils.convert_id_to_name(policy_id, data_dict, "policy", "policy", PolicyManager, self._user_id)
- JsonUtils.convert_id_to_name(category_id, data_dict, "category", type_element + "_category", ModelManager, self._user_id, policy_key)
- logger.info("Exporting {} data {}".format(type_element, data_dict))
- element_datas_array.append(data_dict)
-
- if len(element_datas_array) > 0:
- json_content[type_element + '_data'] = element_datas_array
-
- def _export_subject_object_action_categories(self, type_element, json_content):
- export_method = getattr(ModelManager, 'get_' + type_element + '_categories')
- element_categories = export_method(self._user_id)
- element_categories_array = []
- for element_category_key in element_categories:
- element_category = dict()
- JsonUtils.copy_field_if_exists(element_categories[element_category_key], element_category, "name", str)
- JsonUtils.copy_field_if_exists(element_categories[element_category_key], element_category, "description", str)
- element_categories_array.append(element_category)
- logger.info("Exporting {} category {}".format(type_element, element_category))
- if len(element_categories_array) > 0:
- json_content[type_element + '_categories'] = element_categories_array
-
- def _export_subject_object_action(self, type_element, json_content):
- export_method = getattr(PolicyManager, 'get_' + type_element + 's')
- policies = PolicyManager.get_policies(self._user_id)
- element_dict = dict()
- elements_array = []
- for policy_key in policies:
- elements = export_method(self._user_id, policy_key)
- for element_key in elements:
- #logger.info("Exporting {}".format(elements[element_key]))
- element = dict()
- JsonUtils.copy_field_if_exists(elements[element_key], element, "name", str)
- JsonUtils.copy_field_if_exists(elements[element_key], element, "description", str)
- JsonUtils.copy_field_if_exists(elements[element_key], element, "extra", dict)
- if element["name"] not in element_dict:
- element["policies"] = []
- element_dict[element["name"]] = element
- current_element = element_dict[element["name"]]
- current_element["policies"].append({"name": JsonUtils.convert_id_to_name_string(policy_key, "policy", PolicyManager, self._user_id)})
-
- for key in element_dict:
- logger.info("Exporting {} {}".format(type_element, element_dict[key]))
- elements_array.append(element_dict[key])
-
- if len(elements_array) > 0:
- json_content[type_element + 's'] = elements_array
-
- def _export_policies(self, json_content):
- policies = PolicyManager.get_policies(self._user_id)
- policies_array = []
- for policy_key in policies:
- policy = dict()
- JsonUtils.copy_field_if_exists(policies[policy_key], policy, "name", str)
- JsonUtils.copy_field_if_exists(policies[policy_key], policy, "genre", str)
- JsonUtils.copy_field_if_exists(policies[policy_key], policy, "description", str)
- JsonUtils.convert_id_to_name(policies[policy_key]["model_id"], policy, "model", "model", ModelManager, self._user_id)
- logger.info("Exporting policy {}".format(policy))
- policies_array.append(policy)
- if len(policies_array) > 0:
- json_content["policies"] = policies_array
-
- def _export_models(self, json_content):
- models = ModelManager.get_models(self._user_id)
- models_array = []
- for model_key in models:
- model = dict()
- JsonUtils.copy_field_if_exists(models[model_key], model, "name", str)
- JsonUtils.copy_field_if_exists(models[model_key], model, "description", str)
- # logger.info(models[model_key]["meta_rules"])
- JsonUtils.convert_ids_to_names(models[model_key]["meta_rules"], model, "meta_rules", "meta_rule", ModelManager, self._user_id)
- logger.info("Exporting model {}".format(model))
- models_array.append(model)
- if len(models_array) > 0:
- json_content["models"] = models_array
-
- def _export_pdps(self, json_content):
- pdps = PDPManager.get_pdp(self._user_id)
- pdps_array = []
- for pdp_key in pdps:
- logger.info("Exporting pdp {}".format(pdps[pdp_key]))
- pdps_array.append(pdps[pdp_key])
- if len(pdps_array) > 0:
- json_content["pdps"] = pdps_array
+import hug
+import logging
+from moon_manager import db_driver as driver
+from moon_utilities.auth_functions import api_key_authentication
+from moon_utilities.json_utils import JsonExport
- def _export_json(self, user_id):
- self._user_id = user_id
- json_content = dict()
+logger = logging.getLogger("moon.manager.api." + __name__)
- logger.info("Exporting pdps...")
- self._export_pdps(json_content)
- logger.info("Exporting policies...")
- self._export_policies(json_content)
- logger.info("Exporting models...")
- self._export_models(json_content)
- # export subjects, subject_data, subject_categories, subject_assignements idem for object and action
- list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
- for elt in list_element:
- logger.info("Exporting {}s...".format(elt["key"]))
- self._export_subject_object_action(elt["key"], json_content)
- logger.info("Exporting {} categories...".format(elt["key"]))
- self._export_subject_object_action_categories(elt["key"], json_content)
- logger.info("Exporting {} data...".format(elt["key"]))
- self._export_subject_object_action_datas(elt["key"], json_content)
- logger.info("Exporting {} assignments...".format(elt["key"]))
- self._export_subject_object_action_assignments(elt["key"], json_content)
- logger.info("Exporting meta rules...")
- self._export_meta_rules(json_content)
- logger.info("Exporting rules...")
- self._export_rules(json_content)
- return json_content
+class Export(object):
- @check_auth
- def get(self, user_id=None):
+ @staticmethod
+ @hug.get("/export", requires=api_key_authentication)
+ def get(authed_user: hug.directives.user = None):
"""Import file.
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
}
:internal_api:
"""
- json_file = self._export_json(user_id)
- logger.info(json_file)
+ json_file = JsonExport(driver_name="db", driver=driver).export_json(
+ moon_user_id=authed_user)
return {"content": json_file}
diff --git a/moon_manager/moon_manager/api/json_import.py b/moon_manager/moon_manager/api/json_import.py
index ae9a21d0..922c5c2c 100644
--- a/moon_manager/moon_manager/api/json_import.py
+++ b/moon_manager/moon_manager/api/json_import.py
@@ -1,28 +1,23 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
-from flask import request
-from flask_restful import Resource
-import flask_restful
-from flask import abort
+# Version: 5.4
-from python_moonutilities.security_functions import check_auth
-from python_moonutilities import exceptions
-import logging
-import json
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
-from moon_manager.api.base_exception import BaseException
-from moon_manager.api.json_utils import JsonUtils, UnknownName
-from python_moondb.core import PDPManager
-from python_moondb.core import PolicyManager
-from python_moondb.core import ModelManager
+import hug
+import logging
+from moon_manager import db_driver as driver
+from moon_utilities.json_utils import JsonImport
+from moon_utilities.auth_functions import api_key_authentication
-__version__ = "4.5.0"
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
INST_CALLBACK = 0
DATA_CALLBACK = 1
@@ -30,509 +25,20 @@ ASSIGNMENT_CALLBACK = 2
CATEGORIES_CALLBACK = 3
-class ForbiddenOverride(BaseException):
- def __init__(self, message):
-
- # Call the base class constructor with the parameters it needs
- super(ForbiddenOverride, self).__init__(message)
-
-
-class UnknownPolicy(BaseException):
- def __init__(self, message):
-
- # Call the base class constructor with the parameters it needs
- super(UnknownPolicy, self).__init__(message)
-
-
-class UnknownModel(BaseException):
- def __init__(self, message):
-
- # Call the base class constructor with the parameters it needs
- super(UnknownModel, self).__init__(message)
-
-
-class UnknownData(BaseException):
- def __init__(self, message):
-
- # Call the base class constructor with the parameters it needs
- super(UnknownData, self).__init__(message)
-
-
-class MissingPolicy(BaseException):
- def __init__(self, message):
-
- # Call the base class constructor with the parameters it needs
- super(MissingPolicy, self).__init__(message)
-
-
-class InvalidJson(BaseException):
- def __init__(self, message):
-
- # Call the base class constructor with the parameters it needs
- super(InvalidJson, self).__init__(message)
-
-
-class JsonImport(Resource):
-
- __urls__ = (
- "/import",
- "/import/",
- )
-
- def _reorder_rules_ids(self, rule, ordered_perimeter_categories_ids, json_data_ids, policy_id, get_function):
- ordered_json_ids = [None]*len(ordered_perimeter_categories_ids)
- logger.info("ordered_json_ids {}".format(ordered_json_ids))
- logger.info("json_data_ids {}".format(json_data_ids))
- for json_id in json_data_ids:
- logger.info("json_id {}".format(json_id))
- data = get_function(self._user_id, policy_id, data_id=json_id)
- data = data[0]
- logger.info("data {}".format(data))
- if data["category_id"] not in ordered_perimeter_categories_ids:
- raise InvalidJson("The category id {} of the rule {} does not match the meta rule".format(data["category_id"], rule))
- if ordered_json_ids[ordered_perimeter_categories_ids.index(data["category_id"])] is not None:
- raise InvalidJson("The category id {} of the rule {} shall not be used twice in the same rule".format(data["category_id"], rule))
- ordered_json_ids[ordered_perimeter_categories_ids.index(data["category_id"])] = json_id
- logger.info(ordered_json_ids)
- return ordered_json_ids
-
- def _import_rules(self, json_rules):
- if not isinstance(json_rules, list):
- raise InvalidJson("rules shall be a list!")
-
- for json_rule in json_rules:
- json_to_use = dict()
- JsonUtils.copy_field_if_exists(json_rule, json_to_use, "instructions", str)
- JsonUtils.copy_field_if_exists(json_rule, json_to_use, "enabled", bool, default_value=True)
-
- json_ids = dict()
- JsonUtils.convert_name_to_id(json_rule, json_ids, "policy", "policy_id", "policy", PolicyManager, self._user_id)
- JsonUtils.convert_name_to_id(json_rule, json_to_use, "meta_rule", "meta_rule_id", "meta_rule", ModelManager, self._user_id)
- json_subject_ids = dict()
- json_object_ids = dict()
- json_action_ids = dict()
- JsonUtils.convert_names_to_ids(json_rule["rule"], json_subject_ids, "subject_data", "subject", "subject_data", PolicyManager, self._user_id, json_ids["policy_id"])
- JsonUtils.convert_names_to_ids(json_rule["rule"], json_object_ids, "object_data", "object", "object_data", PolicyManager, self._user_id, json_ids["policy_id"])
- JsonUtils.convert_names_to_ids(json_rule["rule"], json_action_ids, "action_data", "action", "action_data", PolicyManager, self._user_id, json_ids["policy_id"])
-
- meta_rule = ModelManager.get_meta_rules(self._user_id, json_to_use["meta_rule_id"])
- meta_rule = [v for v in meta_rule.values()]
- meta_rule = meta_rule[0]
-
- json_to_use_rule = self._reorder_rules_ids(json_rule, meta_rule["subject_categories"], json_subject_ids["subject"], json_ids["policy_id"], PolicyManager.get_subject_data)
- json_to_use_rule = json_to_use_rule + self._reorder_rules_ids(json_rule, meta_rule["object_categories"], json_object_ids["object"], json_ids["policy_id"], PolicyManager.get_object_data)
- json_to_use_rule = json_to_use_rule + self._reorder_rules_ids(json_rule, meta_rule["action_categories"], json_action_ids["action"], json_ids["policy_id"], PolicyManager.get_action_data)
- json_to_use["rule"] = json_to_use_rule
- try:
- logger.info("Adding / updating a rule from json {}".format(json_to_use))
- PolicyManager.add_rule(self._user_id, json_ids["policy_id"], json_to_use["meta_rule_id"], json_to_use)
- except exceptions.RuleExisting:
- pass
- except exceptions.PolicyUnknown:
- raise UnknownPolicy("Unknown policy with id {}".format(json_ids["policy_id"]))
-
- def _import_meta_rules(self, json_meta_rules):
- logger.info("Input meta rules : {}".format(json_meta_rules))
- for json_meta_rule in json_meta_rules:
- json_to_use = dict()
- logger.info("Input meta rule : {}".format(json_meta_rule))
- JsonUtils.copy_field_if_exists(json_meta_rule, json_to_use, "name", str)
- JsonUtils.copy_field_if_exists(json_meta_rule, json_to_use, "description", str)
- JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "subject_categories", "subject_categories", "subject_category", ModelManager, self._user_id)
- JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "object_categories", "object_categories", "object_category", ModelManager, self._user_id)
- JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "action_categories", "action_categories", "action_category", ModelManager, self._user_id)
- logger.info("Adding / updating a metarule from json {}".format(json_meta_rule))
- meta_rule = ModelManager.add_meta_rule(self._user_id, meta_rule_id=None, value=json_to_use)
- logger.info("Added / updated meta rule : {}".format(meta_rule))
-
- def _import_subject_object_action_assignments(self, json_item_assignments, type_element):
- import_method = getattr(PolicyManager, 'add_' + type_element + '_assignment')
- get_method = getattr(PolicyManager, 'get_' + type_element + '_data')
-
- if not isinstance(json_item_assignments, list):
- raise InvalidJson(type_element + " assignments shall be a list!")
-
- # get the policy id related to the user
- policies = PolicyManager.get_policies(self._user_id)
-
- for json_item_assignment in json_item_assignments:
- item_override = JsonUtils.get_override(json_item_assignment)
- if item_override is True:
- raise ForbiddenOverride("{} assignments do not support override flag !".format(type_element))
-
- json_assignment = dict()
- JsonUtils.convert_name_to_id(json_item_assignment, json_assignment, "category", "category_id", type_element + "_category", ModelManager, self._user_id)
-
- has_found_data = False
- # loop over policies
- for policy_id in policies:
- json_data = dict()
- try:
- JsonUtils.convert_name_to_id(json_item_assignment, json_assignment, type_element, "id", type_element, PolicyManager, self._user_id, policy_id)
- JsonUtils.convert_names_to_ids(json_item_assignment, json_data, "assignments", "data_id", type_element + "_data", PolicyManager, self._user_id, policy_id, json_assignment["category_id"])
- has_found_data = True
- except UnknownName:
- # the category or data has not been found in this policy : we look into the next one
- continue
- for data_id in json_data["data_id"]:
- # find the policy related to the current data
- data = get_method(self._user_id, policy_id, data_id, json_assignment["category_id"])
- if data is not None and len(data) == 1:
- logger.info("Adding / updating a {} assignment from json {}".format(type_element, json_assignment))
- import_method(self._user_id, policy_id, json_assignment["id"], json_assignment["category_id"], data_id)
- else:
- raise UnknownData("Unknown data with id {}".format(data_id))
-
- # case the data has not been found in any policies
- if has_found_data is False:
- raise InvalidJson("The json contains unknown {} data or category : {}".format(type_element,json_item_assignment))
-
- def _import_subject_object_action_datas(self, json_items_data, mandatory_policy_ids, type_element):
- if type_element == "subject":
- import_method = getattr(PolicyManager, 'set_' + type_element + '_data')
- else:
- import_method = getattr(PolicyManager, 'add_' + type_element + '_data')
- # get_method = getattr(PolicyManager, 'get_' + type_element + '_data')
-
- if not isinstance(json_items_data, list):
- raise InvalidJson(type_element + " data shall be a list!")
-
- for json_item_data in json_items_data:
- item_override = JsonUtils.get_override(json_items_data)
- if item_override is True:
- raise ForbiddenOverride("{} datas do not support override flag !".format(type_element))
- logger.info("json_item_data {}".format(json_item_data))
- json_to_use = dict()
- JsonUtils.copy_field_if_exists(json_item_data, json_to_use, "name", str)
- JsonUtils.copy_field_if_exists(json_item_data, json_to_use, "description", str)
- json_policy = dict()
- # field_mandatory : not mandatory if there is some mandatory policies
- JsonUtils.convert_names_to_ids(json_item_data, json_policy, "policies", "policy_id", "policy",
- PolicyManager, self._user_id, field_mandatory=len(mandatory_policy_ids) == 0)
- logger.info("json_policy {}".format(json_policy))
- json_category = dict()
- JsonUtils.convert_name_to_id(json_item_data, json_category, "category", "category_id", type_element+"_category",
- ModelManager, self._user_id)
- logger.info("json_category {}".format(json_category))
- policy_ids = []
- if "policy_id" in json_policy:
- policy_ids = json_policy["policy_id"]
-
- for policy_id in policy_ids:
- if policy_id is not None and policy_id not in mandatory_policy_ids:
- mandatory_policy_ids.append(policy_id)
-
- if len(mandatory_policy_ids) == 0:
- raise InvalidJson("Invalid data, the policy shall be set when importing {}".format(json_item_data))
- category_id = None
- if "category_id" in json_category:
- category_id = json_category["category_id"]
- if category_id is None:
- raise InvalidJson("Invalid data, the category shall be set when importing {}".format(json_item_data))
-
- for policy_id in mandatory_policy_ids:
- try:
- # existing_datas = get_method(self._user_id, policy_id,category_id=category_id)
- # logger.info(existing_datas)
- logger.info("Adding / updating a {} data with policy id {} and category id {} from json {}".format(type_element, policy_id, category_id, json_to_use))
- data = import_method(self._user_id, policy_id, category_id=category_id, value=json_to_use)
- logger.info("Added / updated {} data : {}".format(type_element, data))
- except exceptions.PolicyUnknown:
- raise UnknownPolicy("Unknown policy with id {}".format(policy_id))
- except Exception as e:
- raise BaseException(str(e))
-
- def _import_subject_object_action_categories(self, json_item_categories, type_element):
- import_method = getattr(ModelManager, 'add_' + type_element + '_category')
- get_method = getattr(ModelManager, 'get_' + type_element + '_categories')
-
- categories = get_method(self._user_id)
+class JsonImportAPI(object):
- if not isinstance(json_item_categories, list):
- raise InvalidJson(type_element + " categories shall be a list!")
-
- for json_item_category in json_item_categories:
- json_to_use = dict()
- JsonUtils.copy_field_if_exists(json_item_category, json_to_use, "name", str)
-
- # check if category with the same name exists : do this in moondb ?
- existing_id = None
- for category_key in categories:
- if categories[category_key]["name"] == json_to_use["name"]:
- existing_id = category_key
-
- JsonUtils.copy_field_if_exists(json_item_category, json_to_use, "description", str)
- item_override = JsonUtils.get_override(json_item_category)
- if item_override is True:
- raise ForbiddenOverride("{} categories do not support override flag !".format(type_element))
-
- try:
- logger.info("Adding a {} category from json {}".format(type_element, json_to_use))
- category = import_method(self._user_id, existing_id, json_to_use)
- logger.info("Added category {}".format(category))
- except (exceptions.SubjectCategoryExisting, exceptions.ObjectCategoryExisting, exceptions.ActionCategoryExisting):
- # it already exists: do nothing
- logger.info("Ignored {} category with name {} is already in the database".format(type_element, json_to_use["name"]))
- except Exception as e:
- logger.info("Error while importing the category : {}".format(str(e)))
- raise e
-
- def _import_subject_object_action(self, json_items, mandatory_policy_ids, type_element):
- import_method = getattr(PolicyManager, 'add_' + type_element)
- get_method = getattr(PolicyManager, 'get_' + type_element + 's')
-
- if not isinstance(json_items, list):
- raise InvalidJson(type_element + " items shall be a list!")
-
- for json_item in json_items:
- json_without_policy_name = dict()
- JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "name", str)
- JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "description", str)
- JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "extra", dict)
- JsonUtils.convert_names_to_ids(json_item, json_without_policy_name, "policies", "policy_list", "policy", PolicyManager, self._user_id, field_mandatory=False)
- policy_ids = json_without_policy_name["policy_list"]
- for mandatory_policy_id in mandatory_policy_ids:
- if mandatory_policy_id not in policy_ids:
- policy_ids.append(mandatory_policy_id)
- # policy_ids and json_without_policy_name are references to the same array...
- # json_without_policy_name["policy_list"].append(mandatory_policy_id)
-
- item_override = JsonUtils.get_override(json_item)
- if item_override is True:
- raise ForbiddenOverride("{} does not support override flag !".format(type_element))
-
- if len(policy_ids) == 0:
- raise MissingPolicy("a {} needs at least one policy to be created or updated : {}".format(type_element, json.dumps(json_item)))
-
- for policy_id in policy_ids:
- try:
- items_in_db = get_method(self._user_id, policy_id)
- key = None
- for key_in_db in items_in_db:
- if items_in_db[key_in_db]["name"] == json_without_policy_name["name"]:
- key = key_in_db
- break
- if key is None:
- logger.info("Adding a {} from json {} to the policy with id {}".format(type_element, json_without_policy_name, policy_id))
- else:
- logger.info("Updating a {} from json {} to the policy with id {}".format(type_element, json_without_policy_name, policy_id))
- element = import_method(self._user_id, policy_id, perimeter_id=key, value=json_without_policy_name)
- logger.info("Added / updated {} : {}".format(type_element, element))
-
- except exceptions.PolicyUnknown:
- raise UnknownPolicy("Unknown policy when adding a {}!".format(type_element))
- except Exception as e:
- raise BaseException(str(e))
-
- def _import_policies(self, json_policies):
- policy_mandatory_ids = []
-
- if not isinstance(json_policies, list):
- raise InvalidJson("policies shall be a list!")
-
- for json_policy in json_policies:
- # TODO put this in moondb
- # policy_in_db = PolicyManager.get_policies_by_name(json_without_model_name["name"])
- policies = PolicyManager.get_policies(self._user_id)
- policy_in_db = None
- logger.info(policies)
- for policy_key in policies:
- if policies[policy_key]["name"] == json_policy["name"]:
- policy_in_db = policies[policy_key]
- policy_id = policy_key
- # end TODO
- if policy_in_db is None:
- policy_does_exist = False
- else:
- policy_does_exist = True
-
- policy_override = JsonUtils.get_override(json_policy)
- policy_mandatory = JsonUtils.get_mandatory(json_policy)
-
- if policy_override is False and policy_does_exist:
- policy_mandatory_ids.append(policy_id)
- logger.warning("Existing policy not updated because of the override option is not set !")
- continue
-
- json_without_model_name = dict()
- JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "name", str)
- JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "description", str)
- JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "genre", str)
- JsonUtils.convert_name_to_id(json_policy, json_without_model_name, "model", "model_id", "model", ModelManager, self._user_id, field_mandatory=False)
-
- if not policy_does_exist:
- logger.info("Creating policy {} ".format(json_without_model_name))
- added_policy = PolicyManager.add_policy(self._user_id, None, json_without_model_name)
- logger.info("Added policy {}".format(added_policy))
- if policy_mandatory is True:
- keys = list(added_policy.keys())
- policy_mandatory_ids.append(keys[0])
- elif policy_override is True:
- logger.info("Updating policy {} ".format(json_without_model_name))
- updated_policy = PolicyManager.update_policy(self._user_id, policy_id, json_without_model_name)
- logger.info("Updated policy {}".format(updated_policy))
- if policy_mandatory is True:
- policy_mandatory_ids.append(policy_id)
- return policy_mandatory_ids
-
- def _import_models_with_new_meta_rules(self, json_models):
- if not isinstance(json_models, list):
- raise InvalidJson("models shall be a list!")
-
- for json_model in json_models:
- logger.info("json_model {}".format(json_model))
- models = ModelManager.get_models(self._user_id)
- model_in_db = None
- model_id = None
- for model_key in models:
- if ("id" in json_model and model_key == json_model["id"]) or ("name" in json_model and models[model_key]["name"] == json_model["name"]):
- model_in_db = models[model_key]
- model_id = model_key
-
- logger.info("model in db".format(model_in_db))
- # this should not occur as the model has been put in db previously in _import_models_without_new_meta_rules
- if model_in_db is None:
- raise UnknownModel("Unknwon model ")
-
- json_key = dict()
- JsonUtils.convert_names_to_ids(json_model, json_key, "meta_rules", "meta_rule_id", "meta_rule", ModelManager, self._user_id)
- logger.info("json_key {}".format(json_key))
- for meta_rule_id in json_key["meta_rule_id"]:
- if meta_rule_id not in model_in_db["meta_rules"]:
- model_in_db["meta_rules"].append(meta_rule_id)
-
- logger.info("Updating model with id {} : {} ".format(model_id, model_in_db))
- ModelManager.update_model(self._user_id, model_id, model_in_db)
-
- def _import_models_without_new_meta_rules(self, json_models):
- if not isinstance(json_models, list):
- raise InvalidJson("models shall be a list!")
-
- for json_model in json_models:
- json_without_new_metarules = dict()
- JsonUtils.copy_field_if_exists(json_model, json_without_new_metarules, "name", str)
-
- # TODO put this in moondb
- # model_in_db = ModelManager.get_models_by_name(json_without_new_metarules["name"])
- models = ModelManager.get_models(self._user_id)
- model_in_db = None
- for model_key in models:
- if models[model_key]["name"] == json_without_new_metarules["name"]:
- model_in_db = models[model_key]
- model_id = model_key
- # end TODO
-
- JsonUtils.copy_field_if_exists(json_model, json_without_new_metarules, "description", str)
- if model_in_db is None:
- model_does_exist = False
- else:
- logger.info("model_in_db {}".format(model_in_db))
- # JsonUtils.convert_names_to_ids(model_in_db, json_without_new_metarules, "meta_rules", "meta_rule_id", "meta_rule", ModelManager, self._user_id)
- json_without_new_metarules["meta_rule_id"] = model_in_db["meta_rules"]
- model_does_exist = True
- model_override = JsonUtils.get_override(json_model)
- if not model_does_exist:
- logger.info("Creating model {} ".format(json_without_new_metarules))
- ModelManager.add_model(self._user_id, None, json_without_new_metarules)
- elif model_override is True:
- logger.info("Updating model with id {} : {} ".format(model_id, json_without_new_metarules))
- ModelManager.update_model(self._user_id, model_id, json_without_new_metarules)
-
- def _import_pdps(self, json_pdps):
- if not isinstance(json_pdps, list):
- raise InvalidJson("pdps shall be a list!")
-
- for json_pdp in json_pdps:
- json_to_use = dict()
- JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "name", str)
- JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "keystone_project_id", str)
- JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "security_pipeline", list)
- JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "description", str)
-
- pdps = PDPManager.get_pdp(self._user_id)
- exists = False
- for pdp_key in pdps:
- if pdps[pdp_key]["name"] == json_to_use["name"]:
- PDPManager.update_pdp(self._user_id, pdp_id=pdp_key, value=json_to_use)
- exists = True
- if exists is False:
- PDPManager.add_pdp(self._user_id, value=json_to_use)
-
- def _import_json(self, user_id):
- self._user_id = user_id
- if 'file' in request.files:
- file = request.files['file']
- logger.info("Importing {} file...".format(file))
- json_content = json.load(file)
- else:
- json_content = request.json
- logger.info("Importing content: {} ...".format(json_content))
-
- # first import the models without the meta rules as they are not yet defined
- if "models" in json_content:
- logger.info("Importing models...")
- self._import_models_without_new_meta_rules(json_content["models"])
-
- # import the policies that depends on the models
- mandatory_policy_ids = []
- if "policies" in json_content:
- logger.info("Importing policies...")
- mandatory_policy_ids = self._import_policies(json_content["policies"])
-
- # import subjects, subject_data, subject_categories, idem for object and action
- list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
- for elt in list_element:
- in_key = elt["key"]
- key = in_key + "s"
- if key in json_content:
- logger.info("Importing {}...".format(key))
- self._import_subject_object_action(json_content[key], mandatory_policy_ids, in_key)
- key = in_key + "_categories"
- if key in json_content:
- logger.info("Importing {}...".format(key))
- self._import_subject_object_action_categories(json_content[key], in_key)
- key = in_key + "_data"
- if key in json_content:
- logger.info("Importing {}...".format(key))
- self._import_subject_object_action_datas(json_content[key], mandatory_policy_ids, in_key)
-
- # import meta rules
- if "meta_rules" in json_content:
- logger.info("Importing meta rules...")
- self._import_meta_rules(json_content["meta_rules"])
-
- # add the metarule to model
- if "models" in json_content:
- logger.info("Updating models with meta rules...")
- self._import_models_with_new_meta_rules(json_content["models"])
-
- # import subjects assignments, idem for object and action
- for elt in list_element:
- in_key = elt["key"]
- key = in_key + "_assignments"
- if key in json_content:
- logger.info("Importing {}...".format(key))
- self._import_subject_object_action_assignments(json_content[key], in_key)
-
- # import rules
- if "rules" in json_content:
- logger.info("Importing rules...")
- self._import_rules(json_content["rules"])
-
- # import pdps
- if "pdps" in json_content:
- logger.info("Importing pdps...")
- self._import_pdps(json_content["pdps"])
-
- @check_auth
- def post(self, user_id=None):
- """Import file.
-
- :param user_id: user ID who do the request
- :return: {
-
- }
- :internal_api:
+ @staticmethod
+ @hug.post("/import", requires=api_key_authentication)
+ def post(request, body, authed_user: hug.directives.user = None):
+ """
+ Import data inside the database
+ :param request: the request send by the user
+ :param body: the content of the request
+ :param authed_user: the name of the authenticated user
+ :return: "Import ok !" (if import is OK)
+ :raises multiple exceptions depending on the context
"""
- self._import_json(user_id)
- return "Import ok !"
+ json_import_ob = JsonImport(driver_name="db", driver=driver)
+ imported_data = json_import_ob.import_json(moon_user_id=authed_user, request=request, body=body)
+ LOGGER.info('Imported data: {}'.format(imported_data))
+ return imported_data
diff --git a/moon_manager/moon_manager/api/logs.py b/moon_manager/moon_manager/api/logs.py
new file mode 100644
index 00000000..49b39b11
--- /dev/null
+++ b/moon_manager/moon_manager/api/logs.py
@@ -0,0 +1,25 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Test hug API (local, command-line, and HTTP access)"""
+import hug
+
+
+@hug.local()
+@hug.get("/logs/")
+def list():
+ """
+ List logs
+ :return: JSON status output
+ """
+
+ return {"logs": []}
diff --git a/moon_manager/moon_manager/api/meta_data.py b/moon_manager/moon_manager/api/meta_data.py
index 104f26be..828124df 100644
--- a/moon_manager/moon_manager/api/meta_data.py
+++ b/moon_manager/moon_manager/api/meta_data.py
@@ -1,40 +1,53 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-"""
-Meta Data are elements used to create Meta data (skeleton of security policies)
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Meta Data are elements used to create Meta data (skeleton of security policies)subject_categories
+* Subjects are the source of an action on an object
+ (examples : users, virtual machines)
+* Objects are the destination of an action
+ (examples virtual machines, virtual Routers)
+* Actions are what subject wants to do on an object
"""
-from flask import request
-from flask_restful import Resource
+import hug
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import ModelManager
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities.security_functions import validate_input
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_utilities.invalided_functions import invalidate_meta_data_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
-__version__ = "4.3.2"
+# from moon_manager.server import handle_exception, handle_custom_exceptions
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-class SubjectCategories(Resource):
+class SubjectCategories(object):
"""
Endpoint for subject categories requests
"""
- __urls__ = (
- "/subject_categories",
- "/subject_categories/",
- "/subject_categories/<string:category_id>",
- )
-
- @check_auth
- def get(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/subject_categories", requires=api_key_authentication)
+ @hug.get("/subject_categories/{category_id}", requires=api_key_authentication)
+ def get(category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all subject categories or a specific one
:param category_id: uuid of the subject category
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"subject_category_id": {
"name": "name of the category",
@@ -43,23 +56,21 @@ class SubjectCategories(Resource):
}
:internal_api: get_subject_categories
"""
- try:
- data = ModelManager.get_subject_categories(
- user_id=user_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.get_subject_categories(moon_user_id=authed_user,
+ category_id=category_id)
+
return {"subject_categories": data}
- @check_auth
- def post(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/subject_categories", requires=api_key_authentication)
+ def post(body: validate_input("name"), authed_user: hug.directives.user = None):
"""Create or update a subject category.
- :param category_id: must not be used here
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the category",
+ "name": "name of the category (mandatory)",
"description": "description of the category (optional)"
}
:return: {
@@ -70,54 +81,49 @@ class SubjectCategories(Resource):
}
:internal_api: add_subject_category
"""
- try:
- data = ModelManager.add_subject_category(
- user_id=user_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.add_subject_category(moon_user_id=authed_user, value=body)
+
+
return {"subject_categories": data}
- @check_auth
- def delete(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/subject_categories/{category_id}", requires=api_key_authentication)
+ def delete(category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete a subject category
:param category_id: uuid of the subject category to delete
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_subject_category
"""
- try:
- data = ModelManager.delete_subject_category(
- user_id=user_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ driver.ModelManager.delete_subject_category(moon_user_id=authed_user,
+ category_id=category_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_meta_data_in_slaves(slaves=slaves, category_id=category_id, type='subject')
+
return {"result": True}
-class ObjectCategories(Resource):
+class ObjectCategories(object):
"""
Endpoint for object categories requests
"""
- __urls__ = (
- "/object_categories",
- "/object_categories/",
- "/object_categories/<string:category_id>",
- )
-
- @check_auth
- def get(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/object_categories", requires=api_key_authentication)
+ @hug.get("/object_categories/{category_id}", requires=api_key_authentication)
+ def get(category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all object categories or a specific one
:param category_id: uuid of the object category
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"object_category_id": {
"name": "name of the category",
@@ -126,23 +132,21 @@ class ObjectCategories(Resource):
}
:internal_api: get_object_categories
"""
- try:
- data = ModelManager.get_object_categories(
- user_id=user_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.get_object_categories(moon_user_id=authed_user,
+ category_id=category_id)
+
return {"object_categories": data}
- @check_auth
- def post(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/object_categories", requires=api_key_authentication)
+ def post(body: validate_input("name"), authed_user: hug.directives.user = None):
"""Create or update a object category.
- :param category_id: must not be used here
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the category",
+ "name": "name of the category (mandatory)",
"description": "description of the category (optional)"
}
:return: {
@@ -153,54 +157,48 @@ class ObjectCategories(Resource):
}
:internal_api: add_object_category
"""
- try:
- data = ModelManager.add_object_category(
- user_id=user_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.add_object_category(moon_user_id=authed_user, value=body)
+
return {"object_categories": data}
- @check_auth
- def delete(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/object_categories/{category_id}", requires=api_key_authentication)
+ def delete(category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete an object category
:param category_id: uuid of the object category to delete
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_object_category
"""
- try:
- data = ModelManager.delete_object_category(
- user_id=user_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ driver.ModelManager.delete_object_category(moon_user_id=authed_user,
+ category_id=category_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_meta_data_in_slaves(slaves=slaves, category_id=category_id, type='object')
+
return {"result": True}
-class ActionCategories(Resource):
+class ActionCategories(object):
"""
Endpoint for action categories requests
"""
- __urls__ = (
- "/action_categories",
- "/action_categories/",
- "/action_categories/<string:category_id>",
- )
-
- @check_auth
- def get(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/action_categories", requires=api_key_authentication)
+ @hug.get("/action_categories/{category_id}", requires=api_key_authentication)
+ def get(category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all action categories or a specific one
:param category_id: uuid of the action category
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"action_category_id": {
"name": "name of the category",
@@ -209,23 +207,20 @@ class ActionCategories(Resource):
}
:internal_api: get_action_categories
"""
- try:
- data = ModelManager.get_action_categories(
- user_id=user_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.get_action_categories(moon_user_id=authed_user,
+ category_id=category_id)
return {"action_categories": data}
- @check_auth
- def post(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/action_categories", requires=api_key_authentication)
+ def post(body: validate_input("name"), authed_user: hug.directives.user = None):
"""Create or update an action category.
- :param category_id: must not be used here
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the category",
+ "name": "name of the category (mandatory)",
"description": "description of the category (optional)"
}
:return: {
@@ -236,32 +231,354 @@ class ActionCategories(Resource):
}
:internal_api: add_action_category
"""
- try:
- data = ModelManager.add_action_category(
- user_id=user_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.ModelManager.add_action_category(moon_user_id=authed_user, value=body)
+
return {"action_categories": data}
- @check_auth
- def delete(self, category_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/action_categories/{category_id}", requires=api_key_authentication)
+ def delete(category_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete an action
:param category_id: uuid of the action category to delete
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_action_category
"""
- try:
- data = ModelManager.delete_action_category(
- user_id=user_id, category_id=category_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ driver.ModelManager.delete_action_category(moon_user_id=authed_user,
+ category_id=category_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_meta_data_in_slaves(slaves=slaves, category_id=category_id, type='action')
+
return {"result": True}
+
+
+SubjectCategoriesAPI = hug.API(name='subject_categories', doc=SubjectCategories.__doc__)
+
+
+@hug.object(name='subject_categories', version='1.0.0', api=SubjectCategoriesAPI)
+class SubjectCategoriesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _subject_categories_req = requests.get("{}/subject_categories".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _subject_categories_req.status_code == 200:
+ if name_or_id:
+ _subject_categories = None
+ if name_or_id in _subject_categories_req.json().get("subject_categories"):
+ _subject_categories = _subject_categories_req.json().get("subject_categories")\
+ .get(name_or_id)
+ else:
+ for _subject_categories_key in _subject_categories_req.json()\
+ .get("subject_categories"):
+ _name = _subject_categories_req.json().get("subject_categories")\
+ .get(_subject_categories_key).get("name")
+ if _name == name_or_id:
+ _subject_categories = _subject_categories_req.json()\
+ .get("subject_categories").get(_subject_categories_key)
+ name_or_id = _subject_categories_key
+ break
+ if not _subject_categories:
+ raise Exception("Cannot find SubjectCategories with name or ID {}".format(
+ name_or_id))
+ result = {"subject_categories": {name_or_id: _subject_categories}}
+ else:
+ result = _subject_categories_req.json()
+
+ if human:
+ return SubjectCategoriesCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list SubjectCategories {}'.format(_subject_categories_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="", human: bool = False):
+ """
+ Add subject category in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _url = "{}/subject_categories".format(db_conf.get("url"))
+ _subject_categories = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _subject_categories.status_code == 200:
+ LOGGER.warning('Create {}'.format(_subject_categories.content))
+ if human:
+ return SubjectCategoriesCLI.human_display(_subject_categories.json())
+ else:
+ return _subject_categories.json()
+ LOGGER.error('Cannot create {}'.format(name, _subject_categories.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _subject_categories = SubjectCategoriesCLI.list()
+ for _perimeter_id, _perimeter_value in _subject_categories.get("subject_categories")\
+ .items():
+ if _perimeter_value.get("name") == name_or_id:
+ _url = "{}/subject_categories/{}".format(db_conf.get("url"), _perimeter_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find SubjectCategories with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete SubjectCategories with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(subject_categories_json):
+ human_result = "Subject Categories"
+ for subject_category in subject_categories_json.get("subject_categories"):
+ human_result += "\n" + subject_categories_json.get("subject_categories").get(subject_category).get("name") + "\n"
+ human_result += "\tid : " + subject_categories_json.get("subject_categories").get(subject_category).get("id") + "\n"
+ human_result += "\tname : " + subject_categories_json.get("subject_categories").get(subject_category).get("name") + "\n"
+ human_result += "\tdescription : " + subject_categories_json.get("subject_categories").get(subject_category).get("description") + "\n"
+ return human_result
+
+
+ObjectCategoriesAPI = hug.API(name='object_categories', doc=ObjectCategories.__doc__)
+
+
+@hug.object(name='object_categories', version='1.0.0', api=ObjectCategoriesAPI)
+class ObjectCategoriesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _object_categories_req = requests.get("{}/object_categories".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _object_categories_req.status_code == 200:
+ if name_or_id:
+ _object_categories = None
+ if name_or_id in _object_categories_req.json().get("object_categories"):
+ _object_categories = _object_categories_req.json().get("object_categories")\
+ .get(name_or_id)
+ else:
+ for _object_categories_key in _object_categories_req.json()\
+ .get("object_categories"):
+ _name = _object_categories_req.json().get("object_categories")\
+ .get(_object_categories_key).get("name")
+ if _name == name_or_id:
+ _object_categories = _object_categories_req.json()\
+ .get("object_categories").get(_object_categories_key)
+ name_or_id = _object_categories_key
+ break
+ if not _object_categories:
+ raise Exception("Cannot find ObjectCategories with name or ID {}".format(
+ name_or_id))
+ result = {"object_categories": {name_or_id: _object_categories}}
+ else:
+ result = _object_categories_req.json()
+
+ if human:
+ return ObjectCategoriesCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list ObjectCategories {}'.format(_object_categories_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="", human: bool = False):
+ """
+ Add object category in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _url = "{}/object_categories".format(db_conf.get("url"))
+ _object_categories = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _object_categories.status_code == 200:
+ LOGGER.warning('Create {}'.format(_object_categories.content))
+ if human:
+ return ObjectCategoriesCLI.human_display(_object_categories.json())
+ else:
+ return _object_categories.json()
+ LOGGER.error('Cannot create {}'.format(name, _object_categories.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _object_categories = ObjectCategoriesCLI.list()
+ for _perimeter_id, _perimeter_value in _object_categories.get("object_categories").items():
+ if _perimeter_value.get("name") == name_or_id:
+ _url = "{}/object_categories/{}".format(db_conf.get("url"), _perimeter_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find ObjectCategories with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete ObjectCategories with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(object_categories_json):
+ human_result = "Object Categories"
+ for object_category in object_categories_json.get("object_categories"):
+ human_result += "\n" + object_categories_json.get("object_categories").get(object_category).get("name") + "\n"
+ human_result += "\tid : " + object_categories_json.get("object_categories").get(object_category).get("id") + "\n"
+ human_result += "\tname : " + object_categories_json.get("object_categories").get(object_category).get("name") + "\n"
+ human_result += "\tdescription : " + object_categories_json.get("object_categories").get(object_category).get("description") + "\n"
+ return human_result
+
+ActionCategoriesAPI = hug.API(name='action_categories', doc=ActionCategories.__doc__)
+
+
+@hug.object(name='action_categories', version='1.0.0', api=ActionCategoriesAPI)
+class ActionCategoriesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _action_categories_req = requests.get("{}/action_categories".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _action_categories_req.status_code == 200:
+ if name_or_id:
+ _action_categories = None
+ if name_or_id in _action_categories_req.json().get("action_categories"):
+ _action_categories = _action_categories_req.json().get("action_categories")\
+ .get(name_or_id)
+ else:
+ for _action_categories_key in _action_categories_req.json()\
+ .get("action_categories"):
+ _name = _action_categories_req.json().get("action_categories")\
+ .get(_action_categories_key).get("name")
+ if _name == name_or_id:
+ _action_categories = _action_categories_req.json()\
+ .get("action_categories").get(_action_categories_key)
+ name_or_id = _action_categories_key
+ break
+ if not _action_categories:
+ raise Exception("Cannot find ActionCategories with name or ID {}".format(
+ name_or_id))
+ result = {"action_categories": {name_or_id: _action_categories}}
+ else:
+ result = _action_categories_req.json()
+
+ if human:
+ return ActionCategoriesCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list ActionCategories {}'.format(_action_categories_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="",human: bool = False):
+ """
+ Add action category in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _url = "{}/action_categories".format(db_conf.get("url"))
+ _action_categories = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _action_categories.status_code == 200:
+ LOGGER.warning('Create {}'.format(_action_categories.content))
+ if human:
+ return ActionCategoriesCLI.human_display(_action_categories.json())
+ else:
+ return _action_categories.json()
+ LOGGER.error('Cannot create {}'.format(name, _action_categories.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _action_categories = ActionCategoriesCLI.list()
+ for _perimeter_id, _perimeter_value in _action_categories.get("action_categories").items():
+ if _perimeter_value.get("name") == name_or_id:
+ _url = "{}/action_categories/{}".format(db_conf.get("url"), _perimeter_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find ActionCategories with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete ActionCategories with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(action_categories_json):
+ human_result = "Action Categories"
+ for action_category in action_categories_json.get("action_categories"):
+ human_result += "\n" + action_categories_json.get("action_categories").get(action_category).get(
+ "name") + "\n"
+ human_result += "\tid : " + action_categories_json.get("action_categories").get(action_category).get(
+ "id") + "\n"
+ human_result += "\tname : " + action_categories_json.get("action_categories").get(action_category).get(
+ "name") + "\n"
+ human_result += "\tdescription : " + action_categories_json.get("action_categories").get(
+ action_category).get("description") + "\n"
+ return human_result
diff --git a/moon_manager/moon_manager/api/meta_rules.py b/moon_manager/moon_manager/api/meta_rules.py
index d2cbf5d1..fbdfc2e5 100644
--- a/moon_manager/moon_manager/api/meta_rules.py
+++ b/moon_manager/moon_manager/api/meta_rules.py
@@ -1,37 +1,45 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
"""
Meta rules are skeleton for security policies
"""
-
-from flask import request
-from flask_restful import Resource
+import hug
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import ModelManager
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities.security_functions import validate_input
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_utilities.invalided_functions import invalidate_meta_rule_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
+from moon_manager.api import meta_data
-__version__ = "4.3.2"
+# from moon_manager.server import handle_exception, handle_custom_exceptions
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-class MetaRules(Resource):
+class MetaRules(object):
"""
Endpoint for meta rules requests
"""
- __urls__ = (
- "/meta_rules",
- "/meta_rules/",
- "/meta_rules/<string:meta_rule_id>",
- "/meta_rules/<string:meta_rule_id>/"
- )
-
- @check_auth
- def get(self, meta_rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/meta_rules/", requires=api_key_authentication)
+ @hug.get("/meta_rules/{meta_rule_id}", requires=api_key_authentication)
+ def get(meta_rule_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Retrieve all sub meta rules
:param meta_rule_id: Meta rule algorithm ID
@@ -49,27 +57,30 @@ class MetaRules(Resource):
}
:internal_api: get_meta_rules
"""
- try:
- data = ModelManager.get_meta_rules(
- user_id=user_id, meta_rule_id=meta_rule_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.ModelManager.get_meta_rules(
+ moon_user_id=authed_user, meta_rule_id=meta_rule_id)
+
return {"meta_rules": data}
- @check_auth
- def post(self, meta_rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/meta_rules/", requires=api_key_authentication)
+ # @validate_input("post", body_state={"name": True, "subject_categories": False,
+ # "object_categories": False, "action_categories": False})
+ def post(
+ body: validate_input("name", "subject_categories", "object_categories",
+ "action_categories"), authed_user: hug.directives.user = None):
"""Add a meta rule
- :param meta_rule_id: Meta rule ID
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param authed_user: user ID who do the request
:request body: post = {
- "name": "name of the meta rule",
- "subject_categories": ["subject_category_id1",
+ "name": "name of the meta rule (mandatory)",
+ "subject_categories": ["subject_category_id1 (mandatory)",
"subject_category_id2"],
- "object_categories": ["object_category_id1"],
- "action_categories": ["action_category_id1"]
+ "object_categories": ["object_category_id1 (mandatory)"],
+ "action_categories": ["action_category_id1 (mandatory)"]
}
:return: {
"meta_rules": {
@@ -84,21 +95,24 @@ class MetaRules(Resource):
}
:internal_api: add_meta_rules
"""
- try:
- data = ModelManager.add_meta_rule(
- user_id=user_id, meta_rule_id=None, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.ModelManager.add_meta_rule(
+ moon_user_id=authed_user, meta_rule_id=None, value=body)
+
return {"meta_rules": data}
- @check_auth
- def patch(self, meta_rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/meta_rules/", requires=api_key_authentication)
+ @hug.patch("/meta_rules/{meta_rule_id}", requires=api_key_authentication)
+ def patch(body: validate_input("name", "subject_categories", "object_categories",
+ "action_categories"), meta_rule_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Update a meta rule
- :param meta_rule_id: Meta rule ID
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param meta_rule_id: ID of the Meta Rule
+ :param authed_user: user ID who do the request
:request body: patch = {
"name": "name of the meta rule",
"subject_categories": ["subject_category_id1",
@@ -119,28 +133,24 @@ class MetaRules(Resource):
}
:internal_api: set_meta_rules
"""
- try:
- data = ModelManager.set_meta_rule(
- user_id=user_id, meta_rule_id=meta_rule_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.update_meta_rule(
+ moon_user_id=authed_user, meta_rule_id=meta_rule_id, value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_meta_rule_in_slaves(slaves=slaves, meta_rule_id=meta_rule_id,is_delete=False,
+ data=data)
+
return {"meta_rules": data}
- @check_auth
- def delete(self, meta_rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/meta_rules/", requires=api_key_authentication)
+ @hug.delete("/meta_rules/{meta_rule_id}", requires=api_key_authentication)
+ def delete(meta_rule_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Delete a meta rule
:param meta_rule_id: Meta rule ID
- :param user_id: user ID who do the request
- :request body: delete = {
- "name": "name of the meta rule",
- "subject_categories": ["subject_category_id1",
- "subject_category_id2"],
- "object_categories": ["object_category_id1"],
- "action_categories": ["action_category_id1"]
- }
+ :param authed_user: user ID who do the request
:return: {
"meta_rules": {
"meta_rule_id1": {
@@ -154,12 +164,146 @@ class MetaRules(Resource):
}
:internal_api: delete_meta_rules
"""
- try:
- data = ModelManager.delete_meta_rule(
- user_id=user_id, meta_rule_id=meta_rule_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ driver.ModelManager.delete_meta_rule(
+ moon_user_id=authed_user, meta_rule_id=meta_rule_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_meta_rule_in_slaves(slaves=slaves, meta_rule_id=meta_rule_id)
+
return {"result": True}
+
+MetaRulesAPI = hug.API(name='meta_rules', doc=MetaRules.__doc__)
+
+
+@hug.object(name='meta_rules', version='1.0.0', api=MetaRulesAPI)
+class MetaRulesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _meta_rules_req = requests.get("{}/meta_rules".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _meta_rules_req.status_code == 200:
+ if name_or_id:
+ _meta_rules = None
+ if name_or_id in _meta_rules_req.json().get("meta_rules"):
+ _meta_rules = _meta_rules_req.json().get("meta_rules").get(name_or_id)
+ else:
+ for _key in _meta_rules_req.json().get("meta_rules"):
+ _name = _meta_rules_req.json().get("meta_rules").get(_key).get("name")
+ if _name == name_or_id:
+ _meta_rules = _meta_rules_req.json().get("meta_rules").get(_key)
+ name_or_id = _key
+ break
+ if not _meta_rules:
+ raise Exception("Cannot find meta_rules with name or ID {}".format(
+ name_or_id))
+ result = {"meta_rules": {name_or_id: _meta_rules}}
+ else:
+ result = _meta_rules_req.json()
+
+ if human:
+ return MetaRulesCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list meta_rules {}'.format(_meta_rules_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, subject_categories, object_categories, action_categories, human: bool = False):
+ """
+ Add a meta rule in database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ subject_categories_ids = []
+ for cat in subject_categories.split(","):
+ _cat_dict = meta_data.SubjectCategoriesCLI.list(cat).get("subject_categories")
+ if cat in _cat_dict:
+ subject_categories_ids.append(cat)
+ else:
+ subject_categories_ids.append(list(_cat_dict.keys())[0])
+ object_categories_ids = []
+ for cat in object_categories.split(","):
+ _cat_dict = meta_data.ObjectCategoriesCLI.list(cat).get("object_categories")
+ if cat in _cat_dict:
+ object_categories_ids.append(cat)
+ else:
+ object_categories_ids.append(list(_cat_dict.keys())[0])
+ action_categories_ids = []
+ for cat in action_categories.split(","):
+ _cat_dict = meta_data.ActionCategoriesCLI.list(cat).get("action_categories")
+ if cat in _cat_dict:
+ action_categories_ids.append(cat)
+ else:
+ action_categories_ids.append(list(_cat_dict.keys())[0])
+ _url = "{}/meta_rules".format(db_conf.get("url"))
+ req = requests.post(
+ _url,
+ json={
+ "name": name,
+ "subject_categories": subject_categories_ids,
+ "object_categories": object_categories_ids,
+ "action_categories": action_categories_ids,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Create {}'.format(req.content))
+ if human:
+ return MetaRulesCLI.human_display(req.json())
+ else:
+ return req.json()
+ LOGGER.error('Cannot create {}'.format(name, req.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _meta_rules = MetaRulesCLI.list()
+ for _id, _value in _meta_rules.get("meta_rules").items():
+ if _id == name_or_id or _value.get("name") == name_or_id:
+ _url = "{}/meta_rules/{}".format(db_conf.get("url"), _id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find meta_rules with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete meta_rules with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(meta_rules_json):
+ human_result = "Meta Rules"
+ for metarule in meta_rules_json.get("meta_rules"):
+ human_result += "\n" + meta_rules_json.get("meta_rules").get(metarule).get("name") + "\n"
+ human_result += "\tid : " + metarule + "\n"
+ human_result += "\tname : " + meta_rules_json.get("meta_rules").get(metarule).get("name") + "\n"
+ human_result += "\tdescription : " + meta_rules_json.get("meta_rules").get(metarule).get("description") + "\n"
+ human_result += "\tsubject_categories :\n"
+ for subject_category in meta_rules_json.get("meta_rules").get(metarule).get("subject_categories"):
+ human_result += "\t\t" + subject_category + "\n"
+ human_result += "\tobject_categories :\n"
+ for object_category in meta_rules_json.get("meta_rules").get(metarule).get("object_categories"):
+ human_result += "\t\t" + object_category + "\n"
+ human_result += "\taction_categories :\n"
+ for action_category in meta_rules_json.get("meta_rules").get(metarule).get("action_categories"):
+ human_result += "\t\t" + action_category + "\n"
+ return human_result
diff --git a/moon_manager/moon_manager/api/models.py b/moon_manager/moon_manager/api/models.py
index 8a5f229c..e6f3dc2d 100644
--- a/moon_manager/moon_manager/api/models.py
+++ b/moon_manager/moon_manager/api/models.py
@@ -1,40 +1,47 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
"""
Models aggregate multiple meta rules
"""
-from flask import request
-from flask_restful import Resource
+import hug
+import json
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import ModelManager
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities.security_functions import validate_input
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_utilities.invalided_functions import invalidate_model_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
-__version__ = "4.3.2"
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-class Models(Resource):
+class Models(object):
"""
Endpoint for model requests
"""
- __urls__ = (
- "/models",
- "/models/",
- "/models/<string:uuid>",
- "/models/<string:uuid>/",
- )
-
- @check_auth
- def get(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/models", requires=api_key_authentication)
+ @hug.get("/models/{model_id}", requires=api_key_authentication)
+ def get(model_id: hug.types.text = None, moon_user_id=None):
"""Retrieve all models
- :param uuid: uuid of the model
- :param user_id: user ID who do the request
+ :param model_id: uuid of the model
+ :param moon_user_id: user ID who do the request
:return: {
"model_id1": {
"name": "...",
@@ -44,84 +51,206 @@ class Models(Resource):
}
:internal_api: get_models
"""
- try:
- data = ModelManager.get_models(user_id=user_id, model_id=uuid)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.get_models(moon_user_id=moon_user_id, model_id=model_id)
return {"models": data}
- @check_auth
- def post(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/models", requires=api_key_authentication)
+ def post(body: validate_input("name"), moon_user_id=None):
"""Create model.
- :param uuid: uuid of the model (not used here)
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param moon_user_id: user ID who do the request
:request body: {
- "name": "...",
- "description": "... (optional)",
+ "name": "name of the model (mandatory)",
+ "description": "description of the model (optional)",
"meta_rules": ["meta_rule_id1", ]
}
:return: {
"model_id1": {
- "name": "...",
- "description": "... (optional)",
+ "name": "name of the model",
+ "description": "description of the model (optional)",
"meta_rules": ["meta_rule_id1", ]
}
}
:internal_api: add_model
"""
- try:
- data = ModelManager.add_model(
- user_id=user_id, model_id=uuid, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.add_model(
+ moon_user_id=moon_user_id, value=body)
+
return {"models": data}
- @check_auth
- def delete(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/models/{model_id}", requires=api_key_authentication)
+ def delete(model_id: hug.types.text, moon_user_id=None):
"""Delete a model
- :param uuid: uuid of the model to delete
- :param user_id: user ID who do the request
+ :param model_id: uuid of the model to delete
+ :param moon_user_id: user ID who do the request
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_model
"""
- try:
- data = ModelManager.delete_model(user_id=user_id, model_id=uuid)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ driver.ModelManager.delete_model(moon_user_id=moon_user_id, model_id=model_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_model_in_slaves(slaves=slaves, model_id=model_id)
+
return {"result": True}
- @check_auth
- def patch(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/models/{model_id}", requires=api_key_authentication)
+ def patch(body: validate_input("name"), model_id: hug.types.text, moon_user_id=None):
"""Update a model
- :param uuid: uuid of the model to update
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param model_id: uuid of the model to update
+ :param moon_user_id: user ID who do the request
:return: {
"model_id1": {
- "name": "...",
+ "name": "name of the model",
"description": "... (optional)",
"meta_rules": ["meta_rule_id1", ]
}
}
:internal_api: update_model
"""
- try:
- data = ModelManager.update_model(
- user_id=user_id, model_id=uuid, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.ModelManager.update_model(
+ moon_user_id=moon_user_id, model_id=model_id, value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_model_in_slaves(slaves=slaves, model_id=model_id, is_delete=False,
+ data=data[model_id])
+
return {"models": data}
+
+ModelsAPI = hug.API(name='models', doc=Models.__doc__)
+
+
+@hug.object(name='models', version='1.0.0', api=ModelsAPI)
+class ModelsCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ """
+ List models from the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _models_req = requests.get("{}/models".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _models_req.status_code == 200:
+ if name_or_id:
+ _models = None
+ if name_or_id in _models_req.json().get("models"):
+ _models = _models_req.json().get("models").get(name_or_id)
+ else:
+ for _models_key in _models_req.json().get("models"):
+ _name = _models_req.json().get("models").get(_models_key).get("name")
+ if _name == name_or_id:
+ _models = _models_req.json().get("models").get(_models_key)
+ name_or_id = _models_key
+ break
+ if not _models:
+ raise Exception("Cannot find model with name or ID {}".format(name_or_id))
+ else:
+ if human:
+ result = {"models": {name_or_id: _models}}
+ else:
+ result = {"models": [{name_or_id: _models}]}
+ else:
+ result = _models_req.json()
+
+ if human:
+ return ModelsCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Models {}'.format(_models_req.status_code))
+
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, meta_rule, description="", human: bool = False):
+ """
+ Add model in the database
+ :return: JSON status output
+ """
+ from moon_manager.api import meta_rules
+
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+
+ _meta_rules = meta_rules.MetaRules.get()["meta_rules"]
+ _meta_rules_by_name = {_meta_rules[i]["name"]: i for i in _meta_rules}
+
+ if meta_rule in _meta_rules_by_name:
+ meta_rule_id = _meta_rules_by_name[meta_rule]
+ elif meta_rule in _meta_rules:
+ meta_rule_id = meta_rule
+ else:
+ raise Exception("Cannot find meta_rule with name or ID {}".format(meta_rule))
+
+ _models = requests.post(
+ "{}/models".format(db_conf.get("url")),
+ json={
+ "name": name,
+ "description": description,
+ "meta_rules": [meta_rule_id]
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _models.status_code == 200:
+ LOGGER.warning('Create {}'.format(_models.content))
+ if human:
+ return ModelsCLI.human_display(_models.json())
+ else:
+ return _models.json()
+ LOGGER.error('Cannot create {}'.format(name, _models.content))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name='default'):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _models = ModelsCLI.list()
+ for _slave_id, _slave_value in _models.get("models").items():
+ if _slave_value.get("name") == name:
+ req = requests.delete(
+ "{}/models/{}".format(db_conf.get("url"), _slave_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find model with name {}".format(name))
+ return
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name))
+ return True
+ LOGGER.error("Cannot delete model with name {}".format(name))
+
+ @staticmethod
+ def human_display(models_json):
+ human_result = "Models"
+ for model in models_json.get("models"):
+ human_result += "\n" + models_json.get("models").get(model).get("name") + " : \n"
+ human_result += "\tname : " + models_json.get("models").get(model).get("name") + "\n"
+ human_result += "\tid : " + model + "\n"
+ human_result += "\tdescription : " + models_json.get("models").get(model).get("description") + "\n"
+ human_result += "\tmeta_rules : \n"
+ for meta_rule in models_json.get("models").get(model).get("meta_rules"):
+ human_result += "\t\tid : " + meta_rule + "\n"
+ return human_result
diff --git a/moon_manager/moon_manager/api/orchestration/__init__.py b/moon_manager/moon_manager/api/orchestration/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_manager/moon_manager/api/orchestration/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_manager/moon_manager/api/orchestration/managers.py b/moon_manager/moon_manager/api/orchestration/managers.py
new file mode 100644
index 00000000..b4776ec2
--- /dev/null
+++ b/moon_manager/moon_manager/api/orchestration/managers.py
@@ -0,0 +1,21 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.api.orchestration.managers")
+
+
+class Managers(object):
+ """Object that links managers together"""
+ SlaveManager = None
+ PipelineManager = None
diff --git a/moon_manager/moon_manager/api/orchestration/pipeline.py b/moon_manager/moon_manager/api/orchestration/pipeline.py
new file mode 100644
index 00000000..32d8a1f9
--- /dev/null
+++ b/moon_manager/moon_manager/api/orchestration/pipeline.py
@@ -0,0 +1,44 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities import exceptions
+from moon_utilities.security_functions import enforce
+from moon_manager.api.orchestration.managers import Managers
+
+logger = logging.getLogger("moon.manager.api.orchestration.pod")
+
+
+class PipelineManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.PipelineManager = self
+
+ @enforce(("read", "write"), "pipelines")
+ def update_pipeline(self, moon_user_id, pipeline_id, data):
+ return self.driver.update_pipeline(pipeline_id=pipeline_id, data=data)
+
+ @enforce("write", "pipelines")
+ def delete_pipeline(self, moon_user_id, pipeline_id):
+ return self.driver.delete_pipeline(pipeline_id=pipeline_id)
+
+ @enforce("write", "pipelines")
+ def add_pipeline(self, moon_user_id, pipeline_id=None, data=None):
+ if not pipeline_id:
+ pipeline_id = uuid4().hex
+ return self.driver.add_pipeline(pipeline_id=pipeline_id, data=data)
+
+ @enforce("read", "pipelines")
+ def get_pipelines(self, moon_user_id, pipeline_id=None):
+ return self.driver.get_pipelines(pipeline_id=pipeline_id)
diff --git a/moon_manager/moon_manager/api/orchestration/slave.py b/moon_manager/moon_manager/api/orchestration/slave.py
new file mode 100644
index 00000000..200dd3d6
--- /dev/null
+++ b/moon_manager/moon_manager/api/orchestration/slave.py
@@ -0,0 +1,44 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+import logging
+from moon_utilities import exceptions
+from moon_utilities.security_functions import enforce
+from moon_manager.api.orchestration.managers import Managers
+
+logger = logging.getLogger("moon.manager.api.orchestration.pod")
+
+
+class SlaveManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.SlaveManager = self
+
+ @enforce(("read", "write"), "slaves")
+ def update_slave(self, moon_user_id, slave_id, value):
+ return self.driver.update_slave(slave_id=slave_id, value=value)
+
+ @enforce("write", "slaves")
+ def delete_slave(self, moon_user_id, slave_id):
+ self.driver.delete_slave(slave_id=slave_id)
+
+ @enforce("write", "slaves")
+ def add_slave(self, moon_user_id, slave_id=None, data=None):
+ if not slave_id:
+ slave_id = uuid4().hex
+ return self.driver.add_slave(slave_id=slave_id, data=data)
+
+ @enforce("read", "slaves")
+ def get_slaves(self, moon_user_id, slave_id=None):
+ return self.driver.get_slaves(slave_id=slave_id)
diff --git a/moon_manager/moon_manager/api/pdp.py b/moon_manager/moon_manager/api/pdp.py
index 4bc34a24..6f0b5214 100644
--- a/moon_manager/moon_manager/api/pdp.py
+++ b/moon_manager/moon_manager/api/pdp.py
@@ -1,218 +1,398 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
"""
-PDP are Policy Decision Point.
+PDP are Policy Decision Points.
"""
-from flask import request
-from flask_restful import Resource
+import hug
+import json
import logging
import requests
-import time
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PDPManager
-from python_moondb.core import PolicyManager
-from python_moondb.core import ModelManager
-from python_moonutilities import configuration, exceptions
-
-__version__ = "4.3.2"
-
-logger = logging.getLogger("moon.manager.api." + __name__)
-
-
-def delete_pod(uuid):
- conf = configuration.get_configuration("components/orchestrator")
- hostname = conf["components/orchestrator"].get("hostname", "orchestrator")
- port = conf["components/orchestrator"].get("port", 80)
- proto = conf["components/orchestrator"].get("protocol", "http")
- # while True:
- # try:
- url = "{}://{}:{}/pods".format(proto, hostname, port)
- req = requests.get(url)
- # except requests.exceptions.ConnectionError:
- # logger.warning("Orchestrator is not ready, standby... {}".format(url))
- # time.sleep(1)
- # else:
- # break
- for pod_key, pod_list in req.json().get("pods", {}).items():
- for pod_value in pod_list:
- if "pdp_id" in pod_value:
- if pod_value["pdp_id"] == uuid:
- req = requests.delete("{}://{}:{}/pods/{}".format(proto, hostname, port, pod_key))
- if req.status_code != 200:
- logger.warning("Cannot delete pod {} - {}".format(pod_key, pod_value['name']))
- logger.debug(req.content)
- # Note (Asteroide): no need to go further if one match
- break
-
-
-def add_pod(uuid, data):
- if not data.get("keystone_project_id"):
- return
- logger.info("Add a new pod {}".format(data))
- if "pdp_id" not in data:
- data["pdp_id"] = uuid
- data['policies'] = PolicyManager.get_policies(user_id="admin")
- data['models'] = ModelManager.get_models(user_id="admin")
- conf = configuration.get_configuration("components/orchestrator")
- hostname = conf["components/orchestrator"].get("hostname", "orchestrator")
- port = conf["components/orchestrator"].get("port", 80)
- proto = conf["components/orchestrator"].get("protocol", "http")
- while True:
- try:
- req = requests.post(
- "{}://{}:{}/pods".format(proto, hostname, port),
- json=data,
- headers={"content-type": "application/json"})
- except requests.exceptions.ConnectionError as e:
- logger.warning("add_pod: Orchestrator is not ready, standby...")
- logger.exception(e)
- time.sleep(1)
- else:
- break
- logger.info("Pod add request answer : {}".format(req.text))
+from moon_manager.api import ERROR_CODE
+from moon_manager import db_driver
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_manager import orchestration_driver
+from moon_utilities import exceptions
+from moon_utilities.security_functions import validate_input
+from moon_utilities.invalided_functions import invalidate_pdp_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-def check_keystone_pid(k_pid):
- data = PDPManager.get_pdp(user_id="admin")
- for pdp_key, pdp_value in data.items():
- logger.info("pdp={}".format(pdp_value))
- if pdp_value["keystone_project_id"] == k_pid:
- return True
-
-class PDP(Resource):
+class PDP(object):
"""
Endpoint for pdp requests
"""
- __urls__ = (
- "/pdp",
- "/pdp/",
- "/pdp/<string:uuid>",
- "/pdp/<string:uuid>/",
- )
-
- @check_auth
- def get(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/pdp/", requires=api_key_authentication)
+ @hug.get("/pdp/{uuid}", requires=api_key_authentication)
+ def get(uuid: hug.types.uuid = None, authed_user: hug.directives.user = None):
"""Retrieve all pdp
:param uuid: uuid of the pdp
- :param user_id: user ID who do the request
+ :param authed_user: the name of the authenticated user
:return: {
"pdp_id1": {
"name": "...",
"security_pipeline": [...],
- "keystone_project_id": "keystone_project_id1",
+ "vim_project_id": "vim_project_id1",
"description": "... (optional)",
}
}
:internal_api: get_pdp
"""
- try:
- data = PDPManager.get_pdp(user_id=user_id, pdp_id=uuid)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ if uuid:
+ uuid = str(uuid).replace("-", "")
+ data = db_driver.PDPManager.get_pdp(moon_user_id=authed_user, pdp_id=uuid)
+
return {"pdps": data}
- @check_auth
- def post(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/pdp/", requires=api_key_authentication)
+ def post(body: validate_input("name"), response, authed_user: hug.directives.user = None):
"""Create pdp.
- :param uuid: uuid of the pdp (not used here)
- :param user_id: user ID who do the request
+ :param body: preformed body from Hug
+ :param response: preformed response from Hug
+ :param authed_user: the name of the authenticated user
:request body: {
- "name": "...",
- "security_pipeline": [...],
- "keystone_project_id": "keystone_project_id1",
- "description": "... (optional)",
+ "name": "name of the PDP (mandatory)",
+ "security_pipeline": ["may be empty"],
+ "vim_project_id": "vim_project_id1 (may be empty)",
+ "description": "description of the PDP (optional)",
}
:return: {
"pdp_id1": {
"name": "...",
"security_pipeline": [...],
- "keystone_project_id": "keystone_project_id1",
+ "vim_project_id": "vim_project_id1",
"description": "... (optional)",
}
}
:internal_api: add_pdp
"""
- try:
- data = dict(request.json)
- if not data.get("keystone_project_id"):
- data["keystone_project_id"] = None
- else:
- if check_keystone_pid(data.get("keystone_project_id")):
- raise exceptions.PdpKeystoneMappingConflict
- data = PDPManager.add_pdp(
- user_id=user_id, pdp_id=None, value=request.json)
- uuid = list(data.keys())[0]
- logger.debug("data={}".format(data))
- logger.debug("uuid={}".format(uuid))
- add_pod(uuid=uuid, data=data[uuid])
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
- return {"pdps": data}
+ if not body.get("security_pipeline"):
+ body["security_pipeline"] = []
+ if not body.get("vim_project_id"):
+ body["vim_project_id"] = None
+ data = db_driver.PDPManager.add_pdp(
+ moon_user_id="admin", pdp_id=None, value=body)
+ uuid = list(data.keys())[0]
+ if body["vim_project_id"] and body["security_pipeline"]:
+ orchestration_driver.PipelineManager.add_pipeline(
+ moon_user_id=authed_user, pipeline_id=uuid, data=data[uuid])
+ return {"pdps": db_driver.PDPManager.get_pdp(moon_user_id=authed_user, pdp_id=uuid)}
- @check_auth
- def delete(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/pdp/{uuid}", requires=api_key_authentication)
+ def delete(uuid: hug.types.uuid, response=None, authed_user: hug.directives.user = None):
"""Delete a pdp
:param uuid: uuid of the pdp to delete
- :param user_id: user ID who do the request
+ :param response: preformed response from Hug
+ :param authed_user: the name of the authenticated user
:return: {
"result": "True or False",
"message": "optional message (optional)"
}
:internal_api: delete_pdp
"""
- try:
- data = PDPManager.delete_pdp(user_id=user_id, pdp_id=uuid)
- delete_pod(uuid)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ uuid = str(uuid).replace("-", "")
+ data = db_driver.PDPManager.delete_pdp(moon_user_id=authed_user, pdp_id=uuid)
+
+ LOGGER.info(data)
+
+ orchestration_driver.PipelineManager.delete_pipeline(moon_user_id=authed_user, pipeline_id=uuid)
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_pdp_in_slaves(slaves=slaves, pdp_id=uuid)
return {"result": True}
- @check_auth
- def patch(self, uuid=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/pdp/{uuid}", requires=api_key_authentication)
+ def patch(uuid: hug.types.uuid, body: validate_input("name"), response,
+ authed_user: hug.directives.user = None):
"""Update a pdp
- :param uuid: uuid of the pdp to update
- :param user_id: user ID who do the request
+ :param uuid: uuid of the pdp to delete
+ :param body: preformed body from Hug
+ :param response: preformed response from Hug
+ :param authed_user: the name of the authenticated user
:return: {
"pdp_id1": {
- "name": "...",
- "security_pipeline": [...],
- "keystone_project_id": "keystone_project_id1",
- "description": "... (optional)",
+ "name": "name of the PDP",
+ "security_pipeline": ["may be empty"],
+ "vim_project_id": "vim_project_id1 (may be empty)",
+ "description": "description of the PDP (optional)",
}
}
:internal_api: update_pdp
"""
- try:
- _data = dict(request.json)
- if not _data.get("keystone_project_id"):
- _data["keystone_project_id"] = None
+
+ uuid = str(uuid).replace("-", "")
+ prev_data = db_driver.PDPManager.get_pdp(moon_user_id=authed_user, pdp_id=uuid)
+ if not prev_data:
+ response.status = ERROR_CODE[400]
+ return {"message": "The PDP is unknown."}
+
+ data = db_driver.PDPManager.update_pdp(moon_user_id=authed_user, pdp_id=uuid, value=body).get(uuid)
+
+ orchestration_driver.PipelineManager.update_pipeline(moon_user_id=authed_user, pipeline_id=uuid, data=data)
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_pdp_in_slaves(slaves=slaves, pdp_id=uuid, is_delete=False, data=data)
+
+ return {"pdps": db_driver.PDPManager.get_pdp(moon_user_id=authed_user, pdp_id=uuid)}
+
+
+PDPAPI = hug.API(name='pdps', doc=PDP.__doc__)
+
+
+@hug.object(name='pdps', version='1.0.0', api=PDPAPI)
+class PDPCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _pdps = requests.get("{}/pdp".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _pdps.status_code == 200:
+ if name_or_id:
+ _pdp = None
+ if name_or_id in _pdps.json().get("pdps"):
+ _pdp = _pdps.json().get("pdps").get(name_or_id)
+ else:
+ for _pdp_key in _pdps.json().get("pdps"):
+ if _pdps.json().get("pdps").get(_pdp_key).get("name") == name_or_id:
+ _pdp = _pdps.json().get("pdps").get(_pdp_key)
+ name_or_id = _pdp_key
+ break
+ if not _pdp:
+ raise Exception("Cannot find PDP with name or ID {}".format(name_or_id))
+ else:
+ if human:
+ result = {"pdps": {name_or_id: _pdp}}
+ else:
+ result = {"pdps": [{name_or_id: _pdp}]}
+ else:
+ result = _pdps.json()
+
+ if human:
+ return PDPCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list PDP {}'.format(_pdps.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="", security_pipeline="", vim_project_id="", human: bool = False):
+ """
+ Add pdp in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ security_pipeline = security_pipeline.split(",")
+ _pdps = requests.post(
+ "{}/pdp".format(db_conf.get("url")),
+ json={
+ "name": name,
+ "security_pipeline": security_pipeline,
+ "vim_project_id": vim_project_id,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _pdps.status_code == 200:
+ LOGGER.warning('Create {}'.format(_pdps.content))
+ if human:
+ return PDPCLI.human_display(_pdps.json())
else:
- if check_keystone_pid(_data.get("keystone_project_id")):
- raise exceptions.PdpKeystoneMappingConflict
- data = PDPManager.update_pdp(
- user_id=user_id, pdp_id=uuid, value=_data)
- logger.debug("data={}".format(data))
- logger.debug("uuid={}".format(uuid))
- add_pod(uuid=uuid, data=data[uuid])
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
- return {"pdps": data}
+ return _pdps.json()
+ LOGGER.error('Cannot create {}'.format(name, _pdps.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name='default'):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _pdps = PDPCLI.list()
+ for _slave_id, _slave_value in _pdps.get("pdps").items():
+ if _slave_value.get("name") == name:
+ req = requests.delete(
+ "{}/pdp/{}".format(db_conf.get("url"), _slave_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find PDP with name {}".format(name))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name))
+ return True
+ LOGGER.error("Cannot delete PDP with name {}".format(name))
+ return False
+
+ @staticmethod
+ @hug.object.cli
+ def update(name, description=None, security_pipeline=None, vim_project_id=None):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _pdps = PDPCLI.list()
+
+ for _slave_id, _slave_value in _pdps.get("pdps").items():
+ if _slave_value.get("name") == name:
+ description_updated = _slave_value.get("description")
+ security_pipeline_updated = _slave_value.get("security_pipeline")
+ vim_project_id_updated = _slave_value.get("vim_project_id")
+
+ if description is not None:
+ description_updated = description
+ if security_pipeline is not None:
+ if security_pipeline == "":
+ LOGGER.error(f"Policy given to update the PDP {name} is unknown")
+ return
+ else:
+ security_pipeline_updated = security_pipeline.split(",")
+ if vim_project_id is not None:
+ vim_project_id_updated = vim_project_id
+
+ req = requests.patch(
+ "{}/pdp/{}".format(db_conf.get("url"), _slave_id),
+ json={
+ "name": name,
+ "security_pipeline": security_pipeline_updated,
+ "vim_project_id": vim_project_id_updated,
+ "description": description_updated,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+
+ if req.status_code == 200:
+ LOGGER.warning('Updated {}'.format(name))
+ return True
+ LOGGER.error('Cannot update PDP {}'.format(req.status_code))
+ return False
+
+ @staticmethod
+ def human_display(pdps_json):
+ human_result = "PDPs"
+ for pdp in pdps_json.get("pdps"):
+ human_result += "\n" + pdps_json.get("pdps").get(pdp).get("name") + " : \n"
+ human_result += "\tname : " + pdps_json.get("pdps").get(pdp).get("name") + "\n"
+ human_result += "\tid : " + pdp + "\n"
+ human_result += "\tdescription : " + pdps_json.get("pdps").get(pdp).get("description") + "\n"
+ human_result += "\tvim_project_id : " + pdps_json.get("pdps").get(pdp).get("vim_project_id") + "\n"
+ human_result += "\tsecurity_pipeline : \n"
+ for security_pipeline in pdps_json.get("pdps").get(pdp).get("security_pipeline"):
+ human_result += "\t\t" + security_pipeline + "\n"
+ return human_result
+ # FIXME: not tested
+ # @staticmethod
+ # @hug.object.cli
+ # def set_project(pdp_name, project_id):
+ # db_conf = configuration.get_configuration(key='management')
+ # manager_api_key = configuration.get_api_key_for_user("admin")
+ # _pdp = PDPCLI.get(pdp_name)
+ # _pdp_id = list(_pdp.get("pdps")[0].keys())[0]
+ # _pdp_name = _pdp.get("pdps")[0].get(_pdp_id).get("name")
+ # _pdps = requests.patch(
+ # "{}/pdp/{}".format(db_conf.get("url"), _pdp_id),
+ # json={
+ # "name": _pdp_name,
+ # "vim_project_id": project_id,
+ # },
+ # headers={
+ # "x-api-key": manager_api_key,
+ # "Content-Type": "application/json"
+ # }
+ # )
+ # if _pdps.status_code == 200:
+ # LOGGER.warning('Set project {}'.format(_pdps.content))
+ # return _pdps.json()
+ # LOGGER.error('Cannot set project {} (error: {})'.format(project_id, _pdps.status_code))
+ # return 'Cannot set project {} (error: {})'.format(project_id, _pdps.status_code)
+ #
+ # @staticmethod
+ # @hug.object.cli
+ # def add_pipeline(pdp_name, pipeline_id):
+ # db_conf = configuration.get_configuration(key='management')
+ # manager_api_key = configuration.get_api_key_for_user("admin")
+ # _pdp = PDPCLI.get(pdp_name)
+ # _pdp_id = list(_pdp.get("pdps")[0].keys())[0]
+ # _pdp_name = _pdp.get("pdps")[0].get(_pdp_id).get("name")
+ # _pdp_pipelines = _pdp.get("pdps")[0].get(_pdp_id).get("security_pipeline", [])
+ # # TODO check if pipeline exists
+ # _pdp_pipelines.append(pipeline_id)
+ # _pdps = requests.patch(
+ # "{}/pdp/{}".format(db_conf.get("url"), _pdp_id),
+ # json={
+ # "name": _pdp_name,
+ # "security_pipeline": _pdp_pipelines,
+ # },
+ # headers={
+ # "x-api-key": manager_api_key,
+ # "Content-Type": "application/json"
+ # }
+ # )
+ # if _pdps.status_code == 200:
+ # LOGGER.warning('Set project {}'.format(_pdps.content))
+ # return _pdps.json()
+ # LOGGER.error('Cannot add security pipeline {} (error: {})'.format(pipeline_id,
+ # _pdps.status_code))
+ # return 'Cannot add security pipeline {} (error: {})'.format(pipeline_id, _pdps.content)
+ #
+ # @staticmethod
+ # @hug.object.cli
+ # def delete_pipeline(pdp_name, pipeline_id):
+ # db_conf = configuration.get_configuration(key='management')
+ # manager_api_key = configuration.get_api_key_for_user("admin")
+ # _pdp = PDPCLI.get(pdp_name)
+ # _pdp_id = list(_pdp.get("pdps")[0].keys())[0]
+ # _pdp_name = _pdp.get("pdps")[0].get(_pdp_id).get("name")
+ # _pdp_pipelines = _pdp.get("pdps")[0].get(_pdp_id).get("security_pipeline")
+ # # TODO check if pipeline exists
+ # _pdp_pipelines.remove(pipeline_id)
+ # _pdps = requests.patch(
+ # "{}/pdp/{}".format(db_conf.get("url"), _pdp_id),
+ # json={
+ # "name": _pdp_name,
+ # "security_pipeline": _pdp_pipelines,
+ # },
+ # headers={
+ # "x-api-key": manager_api_key,
+ # "Content-Type": "application/json"
+ # }
+ # )
+ # if _pdps.status_code == 200:
+ # LOGGER.warning('Set project {}'.format(_pdps.content))
+ # return _pdps.json()
+ # LOGGER.error('Cannot add security pipeline {} (error: {})'.format(pipeline_id,
+ # _pdps.status_code))
+ # return 'Cannot add security pipeline {} (error: {})'.format(pipeline_id, _pdps.status_code)
diff --git a/moon_manager/moon_manager/api/perimeter.py b/moon_manager/moon_manager/api/perimeter.py
index e1d999da..98bb2769 100644
--- a/moon_manager/moon_manager/api/perimeter.py
+++ b/moon_manager/moon_manager/api/perimeter.py
@@ -1,7 +1,15 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
"""
* Subjects are the source of an action on an object
(examples : users, virtual machines)
@@ -9,40 +17,40 @@
(examples virtual machines, virtual Routers)
* Actions are what subject wants to do on an object
"""
-
-from flask import request
-from flask_restful import Resource
+import hug
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PolicyManager
-
-__version__ = "4.3.2"
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities import exceptions
+from moon_utilities.security_functions import validate_input
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_utilities.invalided_functions import invalidate_perimeter_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
+from moon_manager.api import policy
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-class Subjects(Resource):
+class Subjects(object):
"""
Endpoint for subjects requests
"""
- __urls__ = (
- "/subjects",
- "/subjects/",
- "/subjects/<string:perimeter_id>",
- "/policies/<string:uuid>/subjects",
- "/policies/<string:uuid>/subjects/",
- "/policies/<string:uuid>/subjects/<string:perimeter_id>",
- )
-
- @check_auth
- def get(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/subjects/", requires=api_key_authentication)
+ @hug.get("/subjects/{perimeter_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/subjects/", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/subjects/{perimeter_id}", requires=api_key_authentication)
+ def get(uuid: hug.types.text = None, perimeter_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Retrieve all subjects or a specific one if perimeter_id is
given for a given policy
:param uuid: uuid of the policy
:param perimeter_id: uuid of the subject
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:return: {
"subject_id": {
"name": "name of the subject",
@@ -52,27 +60,32 @@ class Subjects(Resource):
}
:internal_api: get_subjects
"""
- try:
- data = PolicyManager.get_subjects(
- user_id=user_id,
- policy_id=uuid,
- perimeter_id=perimeter_id
- )
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ # data = {"policy_id": str(uuid), "perimeter_id": str(perimeter_id)}
+ data = driver.PolicyManager.get_subjects(
+ moon_user_id=authed_user,
+ policy_id=uuid,
+ perimeter_id=perimeter_id
+ )
+ # logger.info(db_driver.PolicyManager.get_subjects(policy_id=str(uuid)))
return {"subjects": data}
- @check_auth
- def post(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/newsubject", requires=api_key_authentication)
+ @hug.post("/subjects/{perimeter_id}", requires=api_key_authentication)
+ @hug.post("/policies/{uuid}/subjects/", requires=api_key_authentication)
+ @hug.post("/policies/{uuid}/subjects/{perimeter_id}", requires=api_key_authentication)
+ def post(body: validate_input("name"), uuid: hug.types.text = None, perimeter_id:
+ hug.types.text = None, authed_user: hug.directives.user = None):
"""Create or update a subject.
+ :param body: body of the request
:param uuid: uuid of the policy
:param perimeter_id: must not be used here
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
- "name": "name of the subject",
+ "name": "name of the subject (mandatory)",
"description": "description of the subject (optional)",
"password": "password for the subject (optional)",
"email": "email address of the subject (optional)"
@@ -88,31 +101,26 @@ class Subjects(Resource):
}
:internal_api: set_subject
"""
- try:
- if not perimeter_id:
- data = PolicyManager.get_subjects(user_id=user_id,
- policy_id=None)
- if 'name' in request.json:
- for data_id, data_value in data.items():
- if data_value['name'] == request.json['name']:
- perimeter_id = data_id
- break
- data = PolicyManager.add_subject(
- user_id=user_id, policy_id=uuid,
- perimeter_id=perimeter_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ if 'policy_list' in body:
+ raise exceptions.PerimeterContentError("body should not contain policy_list")
+ # data = {"policy_id": uuid, "perimeter_id": perimeter_id}
+ data = driver.PolicyManager.add_subject(moon_user_id=authed_user,
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ value=body)
+
return {"subjects": data}
- @check_auth
- def patch(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/subjects/{perimeter_id}", requires=api_key_authentication)
+ def patch(body, perimeter_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Create or update a subject.
- :param uuid: uuid of the policy
+ :param body: body of the request
:param perimeter_id: must not be used here
- :param user_id: user ID who do the request
+ :param authed_user: user ID who do the request
:request body: {
"name": "name of the subject",
"description": "description of the subject (optional)",
@@ -130,30 +138,28 @@ class Subjects(Resource):
}
:internal_api: set_subject
"""
- try:
- if not perimeter_id:
- data = PolicyManager.get_subjects(user_id=user_id,
- policy_id=None)
- if 'name' in request.json:
- for data_id, data_value in data.items():
- if data_value['name'] == request.json['name']:
- perimeter_id = data_id
- break
- data = PolicyManager.add_subject(
- user_id=user_id, policy_id=uuid,
- perimeter_id=perimeter_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ # data = {"policy_id": uuid, "perimeter_id": perimeter_id}
+ data = driver.PolicyManager.update_subject(moon_user_id=authed_user,
+ perimeter_id=perimeter_id,
+ value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_perimeter_in_slaves(slaves=slaves, policy_id=None, perimeter_id=perimeter_id,
+ type="subject", data=data[perimeter_id], is_delete=False)
+
return {"subjects": data}
- @check_auth
- def delete(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/subjects/", requires=api_key_authentication)
+ @hug.delete("/subjects/{perimeter_id}", requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/subjects/{perimeter_id}", requires=api_key_authentication)
+ def delete(uuid: hug.types.text = None, perimeter_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Delete a subject for a given policy
- :param uuid: uuid of the policy
- :param perimeter_id: uuid of the subject
+ :param uuid: uuid of the policy (mandatory if perimeter_id is not set)
+ :param perimeter_id: uuid of the subject (mandatory if uuid is not set)
:param user_id: user ID who do the request
:return: {
"subject_id": {
@@ -166,32 +172,31 @@ class Subjects(Resource):
}
:internal_api: delete_subject
"""
- try:
- data = PolicyManager.delete_subject(
- user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ # data = {"policy_id": uuid, "perimeter_id": perimeter_id}
+ data = driver.PolicyManager.delete_subject(
+ moon_user_id=authed_user, policy_id=uuid, perimeter_id=perimeter_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_perimeter_in_slaves(slaves=slaves, policy_id=uuid, perimeter_id=perimeter_id,
+ type="subject" )
+
return {"result": True}
-class Objects(Resource):
+class Objects(object):
"""
Endpoint for objects requests
"""
- __urls__ = (
- "/objects",
- "/objects/",
- "/objects/<string:perimeter_id>",
- "/policies/<string:uuid>/objects",
- "/policies/<string:uuid>/objects/",
- "/policies/<string:uuid>/objects/<string:perimeter_id>",
- )
-
- @check_auth
- def get(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/objects/", requires=api_key_authentication)
+ @hug.get("/objects/{perimeter_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/objects/", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/objects/{perimeter_id}", requires=api_key_authentication)
+ def get(uuid: hug.types.text = None, perimeter_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Retrieve all objects or a specific one if perimeter_id is
given for a given policy
@@ -206,27 +211,30 @@ class Objects(Resource):
}
:internal_api: get_objects
"""
- try:
- data = PolicyManager.get_objects(
- user_id=user_id,
- policy_id=uuid,
- perimeter_id=perimeter_id
- )
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.get_objects(moon_user_id=authed_user,
+ policy_id=uuid,
+ perimeter_id=perimeter_id
+ )
+
return {"objects": data}
- @check_auth
- def post(self, uuid=None, perimeter_id=None, user_id=None):
+ #
+ @staticmethod
+ @hug.local()
+ @hug.post("/newobject", requires=api_key_authentication)
+ @hug.post("/objects/{perimeter_id}", requires=api_key_authentication)
+ @hug.post("/policies/{uuid}/objects/", requires=api_key_authentication)
+ @hug.post("/policies/{uuid}/objects/{perimeter_id}", requires=api_key_authentication)
+ def post(body: validate_input("name"), uuid: hug.types.text = None, perimeter_id:
+ hug.types.text = None, authed_user: hug.directives.user = None):
"""Create or update a object.
:param uuid: uuid of the policy
:param perimeter_id: must not be used here
:param user_id: user ID who do the request
:request body: {
- "object_name": "name of the object",
+ "object_name": "name of the object (mandatory)",
"object_description": "description of the object (optional)"
}
:return: {
@@ -237,24 +245,16 @@ class Objects(Resource):
}
:internal_api: set_object
"""
- try:
- data = PolicyManager.get_objects(user_id=user_id, policy_id=None)
- if 'name' in request.json:
- for data_id, data_value in data.items():
- if data_value['name'] == request.json['name']:
- perimeter_id = data_id
- break
- data = PolicyManager.add_object(
- user_id=user_id, policy_id=uuid,
- perimeter_id=perimeter_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.add_object(moon_user_id=authed_user,
+ policy_id=uuid,
+ perimeter_id=perimeter_id, value=body)
+
return {"objects": data}
- @check_auth
- def patch(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/objects/{perimeter_id}", requires=api_key_authentication)
+ def patch(body, perimeter_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Create or update a object.
:param uuid: uuid of the policy
@@ -272,28 +272,27 @@ class Objects(Resource):
}
:internal_api: set_object
"""
- try:
- data = PolicyManager.get_objects(user_id=user_id, policy_id=None)
- if 'name' in request.json:
- for data_id, data_value in data.items():
- if data_value['name'] == request.json['name']:
- perimeter_id = data_id
- break
- data = PolicyManager.add_object(
- user_id=user_id, policy_id=uuid,
- perimeter_id=perimeter_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.update_object(moon_user_id=authed_user,
+ perimeter_id=perimeter_id,
+ value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_perimeter_in_slaves(slaves=slaves, policy_id=None, perimeter_id=perimeter_id,
+ type="object", data=data[perimeter_id], is_delete=False)
+
return {"objects": data}
- @check_auth
- def delete(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/objects/", requires=api_key_authentication)
+ @hug.delete("/objects/{perimeter_id}", requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/objects/{perimeter_id}", requires=api_key_authentication)
+ def delete(uuid: hug.types.text = None, perimeter_id: hug.types.text = None, authed_user:
+ hug.directives.user = None):
"""Delete a object for a given policy
- :param uuid: uuid of the policy
- :param perimeter_id: uuid of the object
+ :param uuid: uuid of the policy (mandatory if perimeter_id is not set)
+ :param perimeter_id: uuid of the object (mandatory if uuid is not set)
:param user_id: user ID who do the request
:return: {
"object_id": {
@@ -303,32 +302,30 @@ class Objects(Resource):
}
:internal_api: delete_object
"""
- try:
- data = PolicyManager.delete_object(
- user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.delete_object(
+ moon_user_id=authed_user, policy_id=uuid, perimeter_id=perimeter_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_perimeter_in_slaves(slaves=slaves, policy_id=uuid, perimeter_id=perimeter_id,
+ type="object")
+
return {"result": True}
-class Actions(Resource):
+class Actions(object):
"""
Endpoint for actions requests
"""
- __urls__ = (
- "/actions",
- "/actions/",
- "/actions/<string:perimeter_id>",
- "/policies/<string:uuid>/actions",
- "/policies/<string:uuid>/actions/",
- "/policies/<string:uuid>/actions/<string:perimeter_id>",
- )
-
- @check_auth
- def get(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/actions/", requires=api_key_authentication)
+ @hug.get("/actions/{perimeter_id}", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/actions/", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/actions/{perimeter_id}", requires=api_key_authentication)
+ def get(uuid: hug.types.text = None, perimeter_id: hug.types.text = None,
+ authed_user: hug.directives.user = None):
"""Retrieve all actions or a specific one if perimeter_id
is given for a given policy
@@ -343,24 +340,27 @@ class Actions(Resource):
}
:internal_api: get_actions
"""
- try:
- data = PolicyManager.get_actions(
- user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.get_actions(
+ moon_user_id=authed_user, policy_id=uuid, perimeter_id=perimeter_id)
+
return {"actions": data}
- @check_auth
- def post(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/newaction", requires=api_key_authentication)
+ @hug.post("/actions/{perimeter_id}", requires=api_key_authentication)
+ @hug.post("/policies/{uuid}/actions/", requires=api_key_authentication)
+ @hug.post("/policies/{uuid}/actions/{perimeter_id}", requires=api_key_authentication)
+ def post(body: validate_input("name"), uuid: hug.types.text = None, perimeter_id:
+ hug.types.text = None, authed_user: hug.directives.user = None):
"""Create or update a action.
:param uuid: uuid of the policy
:param perimeter_id: must not be used here
:param user_id: user ID who do the request
:request body: {
- "name": "name of the action",
+ "name": "name of the action (mandatory)",
"description": "description of the action (optional)"
}
:return: {
@@ -371,24 +371,15 @@ class Actions(Resource):
}
:internal_api: set_action
"""
- try:
- data = PolicyManager.get_actions(user_id=user_id, policy_id=None)
- if 'name' in request.json:
- for data_id, data_value in data.items():
- if data_value['name'] == request.json['name']:
- perimeter_id = data_id
- break
- data = PolicyManager.add_action(
- user_id=user_id, policy_id=uuid,
- perimeter_id=perimeter_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.add_action(
+ moon_user_id=authed_user, policy_id=uuid, perimeter_id=perimeter_id, value=body)
+
return {"actions": data}
- @check_auth
- def patch(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/actions/{perimeter_id}", requires=api_key_authentication)
+ def patch(body, perimeter_id: hug.types.text = None, authed_user: hug.directives.user = None):
"""Create or update a action.
:param uuid: uuid of the policy
@@ -406,28 +397,26 @@ class Actions(Resource):
}
:internal_api: set_action
"""
- try:
- data = PolicyManager.get_actions(user_id=user_id, policy_id=None)
- if 'name' in request.json:
- for data_id, data_value in data.items():
- if data_value['name'] == request.json['name']:
- perimeter_id = data_id
- break
- data = PolicyManager.add_action(
- user_id=user_id, policy_id=uuid,
- perimeter_id=perimeter_id, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ data = driver.PolicyManager.update_action(
+ moon_user_id=authed_user, perimeter_id=perimeter_id, value=body)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_perimeter_in_slaves(slaves=slaves, policy_id=None, perimeter_id=perimeter_id,
+ type="action", data=data[perimeter_id], is_delete=False)
+
return {"actions": data}
- @check_auth
- def delete(self, uuid=None, perimeter_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.delete("/actions/", requires=api_key_authentication)
+ @hug.delete("/actions/{perimeter_id}", requires=api_key_authentication)
+ @hug.delete("/policies/{uuid}/actions/{perimeter_id}", requires=api_key_authentication)
+ def delete(uuid: hug.types.text = None, perimeter_id: hug.types.text = None, authed_user:
+ hug.directives.user = None):
"""Delete a action for a given policy
- :param uuid: uuid of the policy
- :param perimeter_id: uuid of the action
+ :param uuid: uuid of the policy (mandatory if perimeter_id is not set)
+ :param perimeter_id: uuid of the action (mandatory if uuid is not set)
:param user_id: user ID who do the request
:return: {
"action_id": {
@@ -437,11 +426,560 @@ class Actions(Resource):
}
:internal_api: delete_action
"""
- try:
- data = PolicyManager.delete_action(
- user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.delete_action(
+ moon_user_id=authed_user, policy_id=uuid, perimeter_id=perimeter_id)
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_perimeter_in_slaves(slaves=slaves, policy_id=uuid, perimeter_id=perimeter_id,
+ type="action")
+
return {"result": True}
+
+
+SubjectsAPI = hug.API(name='subjects', doc=Subjects.__doc__)
+
+
+def filter_dict(data, filter_args):
+ for item in data:
+ output = []
+ for arg in filter_args:
+ if arg.strip() in data.get(item):
+ output.append(str(data.get(item).get(arg.strip())))
+ yield output
+
+
+@hug.object(name='subjects', version='1.0.0', api=SubjectsAPI)
+class SubjectsCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", filter=None, human: bool = False):
+ """
+ List subjects from the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _subjects_req = requests.get("{}/subjects".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _subjects_req.status_code == 200:
+ if name_or_id:
+ _subjects = None
+ if name_or_id in _subjects_req.json().get("subjects"):
+ _subjects = _subjects_req.json().get("subjects").get(name_or_id)
+ else:
+ for _subjects_key in _subjects_req.json().get("subjects"):
+ _name = _subjects_req.json().get("subjects").get(_subjects_key).get("name")
+ if _name == name_or_id:
+ _subjects = _subjects_req.json().get("subjects").get(_subjects_key)
+ name_or_id = _subjects_key
+ break
+ if not _subjects:
+ raise Exception("Cannot find Subjects with name or ID {}".format(name_or_id))
+ else:
+ if human:
+ result = {"subjects": {name_or_id: _subjects}}
+ else:
+ result = {"subjects": [{name_or_id: _subjects}]}
+ elif filter:
+ return "\n".join(
+ ["\t".join(_t) for _t in filter_dict(_subjects_req.json().get("subjects"),
+ filter.split(","))]
+ )
+ else:
+ result = _subjects_req.json()
+
+ if human:
+ return SubjectsCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Subjects {}'.format(_subjects_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="", policy_name_or_id="", human: bool = False):
+ """
+ Add subject in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _url = "{}/newsubject".format(db_conf.get("url"))
+ if policy_name_or_id:
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/subjects".format(db_conf.get("url"), policy_id)
+ _subjects = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _subjects.status_code == 200:
+ LOGGER.warning('Create {}'.format(_subjects.content))
+ if human:
+ return SubjectsCLI.human_display(_subjects.json())
+ else:
+ return _subjects.json()
+ LOGGER.error('Cannot create {}'.format(name, _subjects.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id, policy_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _subjects = SubjectsCLI.list()
+ for _perimeter_id, _perimeter_value in _subjects.get("subjects").items():
+ if _perimeter_value.get("name") == name_or_id:
+ _url = "{}/subjects/{}".format(db_conf.get("url"), _perimeter_id)
+ if policy_name_or_id:
+ policy_id = list(
+ policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/subjects/{}".format(db_conf.get("url"), policy_id,
+ _perimeter_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find Subjects with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete Subjects with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ @hug.object.cli
+ def update(name_or_id, description=None, extra=None, email=None, new_name=None):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _subjects = SubjectsCLI.list()
+ for _perimeter_id, _perimeter_value in _subjects.get("subjects").items():
+ if _perimeter_id == name_or_id or _perimeter_value.get("name") == name_or_id:
+ updated_name = _perimeter_value.get("name")
+ updated_id = _perimeter_value.get("id")
+ updated_description = _perimeter_value.get("description")
+ updated_extra = _perimeter_value.get("extra")
+ updated_email = _perimeter_value.get("email")
+ _url = "{}/subjects/{}".format(db_conf.get("url"), _perimeter_id)
+
+ if new_name is not None:
+ updated_name = new_name
+ if description is not None:
+ updated_description = description
+ if extra is not None:
+ if extra == "":
+ updated_extra = {}
+ else:
+ updated_extra.update(dict((k, v) for k, v in (item.split(':') for item in extra.split(','))))
+ if email is not None:
+ updated_email = email
+
+ req = requests.patch(
+ _url,
+ json={
+ "name": updated_name,
+ "id": updated_id,
+ "description": updated_description,
+ "extra": updated_extra,
+ "email": updated_email
+ },
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find Subjects with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Updated {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot update Subjects with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(subjects_json):
+ human_result = "Subjects"
+ for subject in subjects_json.get("subjects"):
+ human_result += "\n" + subjects_json.get("subjects").get(subject).get("name") + " : \n"
+ human_result += "\tname : " + subjects_json.get("subjects").get(subject).get("name") + "\n"
+ human_result += "\tid : " + subjects_json.get("subjects").get(subject).get("id") + "\n"
+ human_result += "\tdescription : " + subjects_json.get("subjects").get(subject).get("description") + "\n"
+ human_result += "\temail : " + subjects_json.get("subjects").get(subject).get("email") + "\n"
+ human_result += "\textra : \n"
+ for extra in subjects_json.get("subjects").get(subject).get("extra"):
+ human_result += "\t\t : " + extra + "\n"
+ human_result += "\tpolicies : \n"
+ for policy in subjects_json.get("subjects").get(subject).get("policy_list"):
+ human_result += "\t\tid : " + policy + "\n"
+ return human_result
+
+
+ObjectsAPI = hug.API(name='objects', doc=Objects.__doc__)
+
+
+@hug.object(name='objects', version='1.0.0', api=ObjectsAPI)
+class ObjectsCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", filter=None, human: bool = False):
+ """
+ List objects from the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _objects_req = requests.get("{}/objects".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _objects_req.status_code == 200:
+ if name_or_id:
+ _objects = None
+ if name_or_id in _objects_req.json().get("objects"):
+ _objects = _objects_req.json().get("objects").get(name_or_id)
+ else:
+ for _objects_key in _objects_req.json().get("objects"):
+ _name = _objects_req.json().get("objects").get(_objects_key).get("name")
+ if _name == name_or_id:
+ _objects = _objects_req.json().get("objects").get(_objects_key)
+ name_or_id = _objects_key
+ break
+ if not _objects:
+ raise Exception("Cannot find Objects with name or ID {}".format(name_or_id))
+ else:
+ if human:
+ result = {"objects": {name_or_id: _objects}}
+ else:
+ result = {"objects": [{name_or_id: _objects}]}
+ elif filter:
+ return "\n".join(
+ ["\t".join(_t) for _t in filter_dict(_objects_req.json().get("objects"),
+ filter.split(","))]
+ )
+ else:
+ result =_objects_req.json()
+
+ if human:
+ return ObjectsCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Objects {}'.format(_objects_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="", policy_name_or_id="", human: bool = False):
+ """
+ Add object in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _url = "{}/newobject".format(db_conf.get("url"))
+ if policy_name_or_id:
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/objects".format(db_conf.get("url"), policy_id)
+ _objects = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _objects.status_code == 200:
+ LOGGER.warning('Create {}'.format(_objects.content))
+ if human:
+ return ObjectsCLI.human_display(_objects.json())
+ else:
+ return _objects.json()
+ LOGGER.error('Cannot create {}'.format(name, _objects.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def update(name_or_id, description=None, extra=None, email=None, new_name=None):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _objects = ObjectsCLI.list()
+ for _perimeter_id, _perimeter_value in _objects.get("objects").items():
+ if _perimeter_id == name_or_id or _perimeter_value.get("name") == name_or_id:
+ updated_name = _perimeter_value.get("name")
+ updated_id = _perimeter_value.get("id")
+ updated_description = _perimeter_value.get("description")
+ updated_extra = _perimeter_value.get("extra")
+ updated_email = _perimeter_value.get("email")
+ _url = "{}/objects/{}".format(db_conf.get("url"), _perimeter_id)
+
+ if new_name is not None:
+ updated_name = new_name
+ if description is not None:
+ updated_description = description
+ if extra is not None:
+ if extra == "":
+ updated_extra = {}
+ else:
+ updated_extra.update(dict((k, v) for k, v in (item.split(':') for item in extra.split(','))))
+ if email is not None:
+ updated_email = email
+
+ req = requests.patch(
+ _url,
+ json={
+ "name": updated_name,
+ "id": updated_id,
+ "description": updated_description,
+ "extra": updated_extra,
+ "email": updated_email
+ },
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find object with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Updated {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot update object with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id, policy_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _objects = ObjectsCLI.list()
+ for _perimeter_id, _perimeter_value in _objects.get("objects").items():
+ if _perimeter_value.get("name") == name_or_id:
+ _url = "{}/objects/{}".format(db_conf.get("url"), _perimeter_id)
+ if policy_name_or_id:
+ policy_id = list(
+ policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/objects/{}".format(db_conf.get("url"), policy_id,
+ _perimeter_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find Objects with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete Objects with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(objects_json):
+ human_result = "Objects"
+ for object in objects_json.get("objects"):
+ human_result += "\n" + objects_json.get("objects").get(object).get("name") + " : \n"
+ human_result += "\tname : " + objects_json.get("objects").get(object).get("name") + "\n"
+ human_result += "\tid : " + object + "\n"
+ human_result += "\tdescription : " + objects_json.get("objects").get(object).get("description") + "\n"
+ human_result += "\temail : " + objects_json.get("objects").get(object).get("email") + "\n"
+ human_result += "\textra : \n"
+ if objects_json.get("objects").get(object).get("extra").get("component") != None:
+ human_result += "\t\tcomponent : " + objects_json.get("objects").get(object).get("extra").get(
+ "component") + "\n"
+ else:
+ human_result + "\t\t\n"
+ human_result += "\tpolicies : \n"
+ for policy in objects_json.get("objects").get(object).get("policy_list"):
+ human_result += "\t\tid : " + policy + "\n"
+ return human_result
+
+ActionsAPI = hug.API(name='actions', doc=Actions.__doc__)
+
+
+@hug.object(name='actions', version='1.0.0', api=ActionsAPI)
+class ActionsCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", filter="", human: bool = False):
+ """
+ List actions from the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _actions_req = requests.get("{}/actions".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _actions_req.status_code == 200:
+ if name_or_id:
+ _actions = None
+ if name_or_id in _actions_req.json().get("actions"):
+ _actions = _actions_req.json().get("actions").get(name_or_id)
+ else:
+ for _actions_key in _actions_req.json().get("actions"):
+ _name = _actions_req.json().get("actions").get(_actions_key).get("name")
+ if _name == name_or_id:
+ _actions = _actions_req.json().get("actions").get(_actions_key)
+ name_or_id = _actions_key
+ break
+ if not _actions:
+ raise Exception("Cannot find Actions with name or ID {}".format(name_or_id))
+ else:
+ if human:
+ result = {"actions": {name_or_id: _actions}}
+ else:
+ result = {"actions": [{name_or_id: _actions}]}
+ elif filter:
+ return "\n".join(
+ ["\t".join(_t) for _t in filter_dict(_actions_req.json().get("actions"),
+ filter.split(","))]
+ )
+ else:
+ result = _actions_req.json()
+
+ if human:
+ return ActionsCLI.human_display(result)
+ else:
+ return result
+
+ LOGGER.error('Cannot list Actions {}'.format(_actions_req.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, description="", policy_name_or_id="", human: bool = False):
+ """
+ Add action in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _url = "{}/newaction".format(db_conf.get("url"))
+ if policy_name_or_id:
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/actions".format(db_conf.get("url"), policy_id)
+ _actions = requests.post(
+ _url,
+ json={
+ "name": name,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _actions.status_code == 200:
+ LOGGER.warning('Create {}'.format(_actions.content))
+ if human:
+ return ActionsCLI.human_display(_actions.json())
+ else:
+ return _actions.json()
+ LOGGER.error('Cannot create {}'.format(name, _actions.content[:40]))
+
+ @staticmethod
+ @hug.object.cli
+ def update(name_or_id, description=None, extra=None, email=None, new_name=None):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _actions = ActionsCLI.list()
+ for _perimeter_id, _perimeter_value in _actions.get("actions").items():
+ if _perimeter_id == name_or_id or _perimeter_value.get("name") == name_or_id:
+ updated_name = _perimeter_value.get("name")
+ updated_id = _perimeter_value.get("id")
+ updated_description = _perimeter_value.get("description")
+ updated_extra = _perimeter_value.get("extra")
+ updated_email = _perimeter_value.get("email")
+ _url = "{}/actions/{}".format(db_conf.get("url"), _perimeter_id)
+
+ if new_name is not None:
+ updated_name = new_name
+ if description is not None:
+ updated_description = description
+ if extra is not None:
+ if extra == "":
+ updated_extra = {}
+ else:
+ updated_extra.update(dict((k, v) for k, v in (item.split(':') for item in extra.split(','))))
+ if email is not None:
+ updated_email = email
+
+ req = requests.patch(
+ _url,
+ json={
+ "name": updated_name,
+ "id": updated_id,
+ "description": updated_description,
+ "extra": updated_extra,
+ "email": updated_email
+ },
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find action with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Updated {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot update action with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id, policy_name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _actions = ActionsCLI.list()
+ for _perimeter_id, _perimeter_value in _actions.get("actions").items():
+ if _perimeter_value.get("name") == name_or_id:
+ _url = "{}/actions/{}".format(db_conf.get("url"), _perimeter_id)
+ if policy_name_or_id:
+ policy_id = list(
+ policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _url = "{}/policies/{}/actions/{}".format(db_conf.get("url"), policy_id,
+ _perimeter_id)
+ req = requests.delete(
+ _url,
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find Actions with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete Actions with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(actions_json):
+ human_result = "Actions"
+ for action in actions_json.get("actions"):
+ human_result += "\n" + actions_json.get("actions").get(action).get("name") + " : \n"
+ human_result += "\tname : " + actions_json.get("actions").get(action).get("name") + "\n"
+ human_result += "\tid : " + actions_json.get("actions").get(action).get("id") + "\n"
+ human_result += "\tdescription : " + actions_json.get("actions").get(action).get("description") + "\n"
+ human_result += "\temail : " + actions_json.get("actions").get(action).get("email") + "\n"
+ human_result += "\textra : \n"
+ if actions_json.get("actions").get(action).get("extra").get("component") != None:
+ human_result += "\t\tcomponent : " + actions_json.get("actions").get(action).get("extra").get("component") + "\n"
+ else:
+ human_result + "\t\t\n"
+ human_result += "\tpolicies : \n"
+ for policy in actions_json.get("actions").get(action).get("policy_list"):
+ human_result += "\t\tid : " + policy + "\n"
+ return human_result
diff --git a/moon_manager/moon_manager/api/policy.py b/moon_manager/moon_manager/api/policy.py
new file mode 100644
index 00000000..727fceb6
--- /dev/null
+++ b/moon_manager/moon_manager/api/policy.py
@@ -0,0 +1,293 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Policies are instances of security models and implement security policies
+
+"""
+
+import hug
+import logging
+import requests
+from moon_manager.api import ERROR_CODE
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_manager import db_driver
+from moon_utilities import exceptions
+from moon_utilities.security_functions import validate_input
+from moon_utilities.invalided_functions import invalidate_policy_in_slaves
+from moon_manager.api import slave as slave_class
+from moon_manager.api import configuration
+
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
+
+
+class Policies(object):
+ """
+ Endpoint for policy requests
+ """
+
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}", requires=api_key_authentication)
+ def get(uuid: hug.types.uuid = None, authed_user: hug.directives.user = None):
+ """Retrieve all policies
+
+ :param uuid: uuid of the policy
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "policy_id1": {
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
+ }
+ }
+ """
+ if uuid:
+ uuid = str(uuid).replace("-", "")
+ data = db_driver.PolicyManager.get_policies(moon_user_id=authed_user, policy_id=uuid)
+
+ return {"policies": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/", requires=api_key_authentication)
+ def post(body: validate_input("name"), response, authed_user: hug.directives.user = None):
+ """Create policy.
+
+ :param body: preformed body from Hug
+ :param response: preformed response from Hug
+ :param authed_user: the name of the authenticated user
+ :request body: {
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
+ }
+ :return: {
+ "policy_id1": {
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
+ }
+ }
+ """
+ data = db_driver.PolicyManager.add_policy(
+ moon_user_id=authed_user, policy_id=None, value=body)
+
+ return {"policies": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}", requires=api_key_authentication)
+ def delete(uuid: hug.types.text, response=None, authed_user: hug.directives.user = None):
+ """Delete a policy
+
+ :param uuid: uuid of the policy to delete
+ :param response: preformed response from Hug
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ """
+ uuid = str(uuid).replace("-", "")
+ db_driver.PolicyManager.delete_policy(
+ moon_user_id=authed_user, policy_id=uuid)
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_policy_in_slaves(slaves=slaves, policy_id=uuid)
+
+ return {"result": True}
+
+ @staticmethod
+ @hug.local()
+ @hug.patch("/policies/{uuid}", requires=api_key_authentication)
+ def patch(uuid: hug.types.uuid, body: validate_input("name"), response,
+ authed_user: hug.directives.user = None):
+ """Update a policy
+
+ :param uuid: uuid of the policy to update
+ :param body: preformed body from Hug
+ :param response: preformed response from Hug
+ :param authed_user: the name of the authenticated user
+ :return: {
+ "policy_id1": {
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
+ }
+ }
+ """
+
+ uuid = str(uuid).replace("-", "")
+ prev_data = db_driver.PolicyManager.get_policies(moon_user_id=authed_user, policy_id=uuid)
+ if not prev_data:
+ response.status = ERROR_CODE[400]
+ return {"message": "The policy is unknown."}
+ data = db_driver.PolicyManager.update_policy(
+ moon_user_id=authed_user, policy_id=uuid, value=body).get(uuid)
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_policy_in_slaves(slaves=slaves, policy_id=uuid, data=data, is_delete=False)
+
+ return {"policies": db_driver.PolicyManager.get_policies(moon_user_id=authed_user,
+ policy_id=uuid)}
+
+
+PoliciesAPI = hug.API(name='policies', doc=Policies.__doc__)
+
+
+@hug.object(name='policies', version='1.0.0', api=PoliciesAPI)
+class PoliciesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(name_or_id="", human: bool = False):
+ """
+ List policies from the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _policies_req = requests.get("{}/policies".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _policies_req.status_code == 200:
+ if name_or_id:
+ _policies = None
+ if name_or_id in _policies_req.json().get("policies"):
+ _policies = _policies_req.json().get("policies").get(name_or_id)
+ else:
+ for _policies_key in _policies_req.json().get("policies"):
+ _name = _policies_req.json().get("policies").get(_policies_key).get("name")
+ if _name == name_or_id :
+ _policies = _policies_req.json().get("policies").get(_policies_key)
+ name_or_id = _policies_key
+ break
+ if not _policies:
+ raise Exception("Cannot find policy with name {}".format(name_or_id))
+ else:
+ result = {"policies": {name_or_id: _policies}}
+ else:
+ result = _policies_req.json()
+
+ if human:
+ return PoliciesCLI.human_display(result);
+ else:
+ return result
+
+ @staticmethod
+ @hug.object.cli
+ def add(name, model, description="", genre="authz", human: bool = False):
+ """
+ Add a new policy from the database
+ :return: JSON policies output
+ """
+ from moon_manager.api import models
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _model = models.ModelsCLI.list(model).get("models")[0]
+ _policies = requests.post(
+ "{}/policies".format(db_conf.get("url")),
+ json={
+ "name": name,
+ "model_id": list(_model.keys())[0],
+ "genre": genre,
+ "description": description,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _policies.status_code == 200:
+ LOGGER.warning('Create {}'.format(_policies.content))
+ if human:
+ return PoliciesCLI.list('', True)
+ else:
+ return _policies.json()
+ LOGGER.error('Cannot create {} ({})'.format(name, _policies.content))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name_or_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _policies = PoliciesCLI.list()
+ for _id, _value in _policies.get("policies").items():
+ if _id == name_or_id or _value.get("name") == name_or_id:
+ req = requests.delete(
+ "{}/policies/{}".format(db_conf.get("url"), _id),
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find policy with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot delete policy with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ @hug.object.cli
+ def update(name_or_id, model_id=None, description=None, genre=None):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _policies = PoliciesCLI.list()
+ for _id, _value in _policies.get("policies").items():
+ if _id == name_or_id or _value.get("name") == name_or_id:
+ updated_model_id = _value.get("model_id")
+ updated_genre = _value.get("genre")
+ updated_description = _value.get("description")
+
+ if model_id is not None:
+ updated_model_id = model_id
+ if description is not None:
+ updated_description = description
+ if genre is not None:
+ updated_genre = genre
+
+ req = requests.patch(
+ "{}/policies/{}".format(db_conf.get("url"), _id),
+ json={
+ "name": _value.get("name"),
+ "model_id": updated_model_id,
+ "genre": updated_genre,
+ "description": updated_description,
+ },
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find policy with name {}".format(name_or_id))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Updated {}'.format(name_or_id))
+ return True
+ LOGGER.error("Cannot update policy with name {}".format(name_or_id))
+ return False
+
+ @staticmethod
+ def human_display(policies_json):
+ human_result = "Policies"
+ for policy in policies_json.get("policies"):
+ human_result += "\n" + policies_json.get("policies").get(policy).get("name") + " : \n"
+ human_result += "\tname : " + policies_json.get("policies").get(policy).get("name") + "\n"
+ human_result += "\tdescription : " + policies_json.get("policies").get(policy).get("description") + "\n"
+ human_result += "\tgenre : " + policies_json.get("policies").get(policy).get("genre") + "\n"
+ human_result += "\tmodel_id : " + policies_json.get("policies").get(policy).get("model_id") + "\n"
+ return human_result
+
diff --git a/moon_manager/moon_manager/api/rules.py b/moon_manager/moon_manager/api/rules.py
index 57dcd45c..e984ee93 100644
--- a/moon_manager/moon_manager/api/rules.py
+++ b/moon_manager/moon_manager/api/rules.py
@@ -1,40 +1,63 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
"""
-Rules (TODO)
+Rules
"""
-from flask import request
-from flask_restful import Resource
+import hug
+import json
import logging
-from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PolicyManager
+import requests
+from moon_manager import db_driver as driver
+from moon_utilities.security_functions import validate_input
+from moon_utilities.invalided_functions import invalidate_rules_in_slaves
+from moon_manager.api import configuration
+from moon_utilities.auth_functions import init_db, api_key_authentication, connect_from_env
+from moon_manager.api import slave as slave_class
+from moon_manager.api import policy, meta_rules, data
-__version__ = "4.3.2"
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
-logger = logging.getLogger("moon.manager.api." + __name__)
-
-class Rules(Resource):
+class Rules(object):
"""
Endpoint for rules requests
"""
- __urls__ = ("/policies/<string:uuid>/rules",
- "/policies/<string:uuid>/rules/",
- "/policies/<string:uuid>/rules/<string:rule_id>",
- "/policies/<string:uuid>/rules/<string:rule_id>/",
- )
+ @staticmethod
+ def _get_data_name(user, rule_data, policy_id):
+ global_data = driver.PolicyManager.get_subject_data(moon_user_id=user, policy_id=policy_id) +\
+ driver.PolicyManager.get_object_data(moon_user_id=user, policy_id=policy_id) +\
+ driver.PolicyManager.get_action_data(moon_user_id=user, policy_id=policy_id)
+ _rule_names = list()
+ for rule_id in rule_data:
+ for _data in global_data:
+ if rule_id in _data.get("data"):
+ _rule_names.append(_data.get("data")[rule_id].get("name"))
+ break
+ else:
+ _rule_names.append(rule_id)
+ return _rule_names
- @check_auth
- def get(self, uuid=None, rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.get("/policies/{uuid}/rules", requires=api_key_authentication)
+ @hug.get("/policies/{uuid}/rules/{rule_id}", requires=api_key_authentication)
+ def get(uuid: hug.types.text, rule_id: hug.types.text = None, moon_user_id: hug.directives.user = None):
"""Retrieve all rules or a specific one
:param uuid: policy ID
:param rule_id: rule ID
- :param user_id: user ID who do the request
+ :param moon_user_id: user ID who do the request
:return: {
"rules": [
"policy_id": "policy_id1",
@@ -47,29 +70,29 @@ class Rules(Resource):
}
:internal_api: get_rules
"""
- try:
- data = PolicyManager.get_rules(user_id=user_id,
- policy_id=uuid,
- rule_id=rule_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.get_rules(moon_user_id=moon_user_id, policy_id=uuid,
+ rule_id=rule_id)
+
return {"rules": data}
- @check_auth
- def post(self, uuid=None, rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.post("/policies/{uuid}/rules", requires=api_key_authentication)
+ def post(body: validate_input("meta_rule_id", "rule", "instructions"),
+ uuid: hug.types.text,
+ moon_user_id: hug.directives.user = None):
"""Add a rule to a meta rule
:param uuid: policy ID
- :param rule_id: rule ID
- :param user_id: user ID who do the request
+ :param body: body of the request
+ :param moon_user_id: user ID who do the request
:request body: post = {
- "meta_rule_id": "meta_rule_id1",
- "rule": ["subject_data_id2", "object_data_id2", "action_data_id2"],
- "instructions": (
+ "meta_rule_id": "meta_rule_id1", # mandatory
+ "rule": ["subject_data_id2", "object_data_id2", "action_data_id2"], # mandatory
+ "instructions": [ # mandatory
{"decision": "grant"},
- )
+ ]
"enabled": True
}
:return: {
@@ -79,18 +102,18 @@ class Rules(Resource):
"rule": ["subject_data_id1",
"object_data_id1",
"action_data_id1"],
- "instructions": (
+ "instructions": [
{"decision": "grant"},
# "grant" to immediately exit,
# "continue" to wait for the result of next policy
# "deny" to deny the request
- )
+ ]
}
"rule_id2": {
"rule": ["subject_data_id2",
"object_data_id2",
"action_data_id2"],
- "instructions": (
+ "instructions": [
{
"update": {
"operation": "add",
@@ -101,40 +124,233 @@ class Rules(Resource):
},
{"chain": {"name": "rbac"}}
# chain with the policy named rbac
- )
+ ]
}
]
}
:internal_api: add_rule
"""
- args = request.json
- try:
- data = PolicyManager.add_rule(user_id=user_id,
- policy_id=uuid,
- meta_rule_id=args['meta_rule_id'],
- value=args)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = driver.PolicyManager.add_rule(moon_user_id=moon_user_id, policy_id=uuid,
+ meta_rule_id=body['meta_rule_id'], value=body)
+
+ subject, object_, *action = Rules._get_data_name(moon_user_id, body['rule'], uuid)
+ instruction = body['instructions'][0]['decision']
+ LOGGER.info(f"The user <{moon_user_id}> added the rule <{subject}, {object_}, {action}: {instruction}>")
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_rules_in_slaves(slaves=slaves, policy_id=uuid, rule_id=None)
+
return {"rules": data}
- @check_auth
- def delete(self, uuid=None, rule_id=None, user_id=None):
+ @staticmethod
+ @hug.local()
+ @hug.patch("/policies/{uuid}/rules/{rule_id}", requires=api_key_authentication)
+ def patch(uuid: hug.types.text, rule_id: hug.types.text, body: validate_input("instructions"),
+ moon_user_id: hug.directives.user = None):
+ """Updates a rule (only its instructions)
+
+ :param uuid: policy ID
+ :param body: body of the request
+ :param rule_id: the id of the rule to patch
+ :param moon_user_id: user ID who do the request
+ :request body: patch = {
+ "instructions": [ # mandatory
+ {"decision": "grant"},
+ ]
+ }
+ :return: {
+ "rules": [
+ "meta_rule_id": "meta_rule_id1",
+ "rule_id1": {
+ "rule": ["subject_data_id1",
+ "object_data_id1",
+ "action_data_id1"],
+ "instructions": [
+ {"decision": "grant"},
+ # "grant" to immediately exit,
+ # "continue" to wait for the result of next policy (not yet supported)
+ # "deny" to deny the request
+ ]
+ }
+ ]
+ }
+ :internal_api: update_rule
+ """
+ prev_data = driver.PolicyManager.get_rules(moon_user_id=moon_user_id, policy_id=uuid, rule_id=rule_id)[rule_id]
+ subject, object_, *action = Rules._get_data_name(moon_user_id, prev_data['rule'], prev_data['policy_id'])
+ prev_inst = prev_data['instructions'][0]['decision']
+
+ data = driver.PolicyManager.update_rule(moon_user_id=moon_user_id, rule_id=rule_id, value=body)
+
+ new_inst = data[rule_id]['instructions'][0]['decision']
+ LOGGER.info(f"The user <{moon_user_id}> updated the rule <{subject}, {object_}, {action}> from {prev_inst} to {new_inst}")
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_rules_in_slaves(slaves=slaves, policy_id=uuid, rule_id=rule_id)
+
+ return {"rules": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/policies/{uuid}/rules/{rule_id}", requires=api_key_authentication)
+ def delete(uuid: hug.types.text, rule_id: hug.types.text, moon_user_id: hug.directives.user = None):
"""Delete one rule linked to a specific sub meta rule
:param uuid: policy ID
:param rule_id: rule ID
- :param user_id: user ID who do the request
+ :param moon_user_id: user ID who do the request
:return: { "result": true }
:internal_api: delete_rule
"""
- try:
- data = PolicyManager.delete_rule(
- user_id=user_id, policy_id=uuid, rule_id=rule_id)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+ prev_data = driver.PolicyManager.get_rules(moon_user_id=moon_user_id, policy_id=uuid, rule_id=rule_id)[rule_id]
+ subject, object_, *action = Rules._get_data_name(moon_user_id, prev_data['rule'], prev_data['policy_id'])
+ prev_inst = prev_data['instructions'][0]['decision']
+
+ driver.PolicyManager.delete_rule(moon_user_id=moon_user_id, policy_id=uuid, rule_id=rule_id)
+
+ LOGGER.info(f"The user <{moon_user_id}> deleted the rule <{subject}, {object_}, {action}: {prev_inst}>")
+
+ slaves = slave_class.Slaves.get().get("slaves")
+ invalidate_rules_in_slaves(slaves=slaves, policy_id=uuid, rule_id=rule_id)
+
return {"result": True}
+
+RulesAPI = hug.API(name='rules', doc=Rules.__doc__)
+db_conf = configuration.get_configuration(key='management')
+init_db(db_conf.get("token_file"))
+
+
+@hug.object(name='rules', version='1.0.0', api=RulesAPI)
+class RulesCLI(object):
+ """An example of command like calls via an Object"""
+
+ __global_data = None
+
+ @staticmethod
+ def get_data_name(rule_data, policy_id):
+ if not RulesCLI.__global_data:
+ RulesCLI.__global_data = data.SubjectDataCLI.list(policy_id).get("subject_data") + \
+ data.ObjectDataCLI.list(policy_id).get("object_data") + \
+ data.ActionDataCLI.list(policy_id).get("action_data")
+ _rule_names = list()
+ for rule_id in rule_data:
+ for _data in RulesCLI.__global_data:
+ if rule_id in _data.get("data"):
+ _rule_names.append(_data.get("data")[rule_id].get("name"))
+ break
+ else:
+ _rule_names.append(rule_id)
+ return _rule_names
+
+ @staticmethod
+ def get_data_id(rule_data, policy_id):
+ _global_data = data.SubjectDataCLI.list(policy_id).get("subject_data") + \
+ data.ObjectDataCLI.list(policy_id).get("object_data") + \
+ data.ActionDataCLI.list(policy_id).get("action_data")
+ _rule_ids = list()
+ for rule_id_or_name in rule_data:
+ _id = None
+ for _data in _global_data:
+ if rule_id_or_name in _data.get("data"):
+ _id = _data.get("data")[rule_id_or_name].get("name")
+ break
+ else:
+ for _data_key in _data.get("data"):
+ if _data.get("data")[_data_key]['name'] == rule_id_or_name:
+ _id = _data_key
+ break
+ if _id:
+ _rule_ids.append(_id)
+ break
+ else:
+ raise Exception("Cannot find data for {}".format(rule_id_or_name))
+ return _rule_ids
+
+ @staticmethod
+ @hug.object.cli
+ def list(policy_name_or_id, human: bool = False, instructions: bool = False):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ _rules = requests.get("{}/policies/{}/rules".format(db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _rules.status_code == 200:
+ if human:
+ for value in _rules.json().get("rules", {}).get("rules"):
+ if value.get("enabled"):
+ _rule_names = RulesCLI.get_data_name(value.get("rule"), policy_id)
+ output = value.get("id") + " | "
+ output += "{:30}".format(" ".join(_rule_names))
+ if instructions:
+ output += " " + json.dumps(value.get("instructions"))
+ print(output)
+ else:
+ return _rules.json()
+ else:
+ raise Exception("Got a {} response ({})".format(_rules.status_code, _rules.text))
+
+ @staticmethod
+ @hug.object.cli
+ def add(policy_name_or_id, meta_rule_id_or_name, rule_items,
+ instructions: hug.types.one_of(("grant", "deny")) = None, enabled: bool = True):
+ if not instructions:
+ instructions = [{'decision': 'grant'}]
+ else:
+ instructions = [{'decision': instructions}]
+ rules_list = []
+ for item in rule_items.split(","):
+ rules_list.append(item.strip())
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+ meta_rule_id = list(meta_rules.MetaRulesCLI.list(meta_rule_id_or_name).
+ get("meta_rules").keys())[0]
+
+ _rules = requests.post("{}/policies/{}/rules".format(db_conf.get("url"), policy_id),
+ headers={"x-api-key": manager_api_key},
+ json={
+ "meta_rule_id": meta_rule_id,
+ "rule": RulesCLI.get_data_id(rules_list, policy_id),
+ "instructions": instructions,
+ "enabled": enabled
+ })
+ if _rules.status_code == 200:
+ return _rules.json()
+ else:
+ raise Exception("Got a {} response ({})".format(_rules.status_code, _rules.text))
+
+ @staticmethod
+ @hug.object.cli
+ def update(policy_name_or_id, rule_id, instructions: hug.types.one_of(('grant', 'deny'))):
+ instructions = [{'decision': instructions}]
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+
+ _rules = requests.patch("{}/policies/{}/rules/{}".format(db_conf.get("url"), policy_id, rule_id),
+ headers={"x-api-key": manager_api_key},
+ json={
+ "instructions": instructions
+ })
+ if _rules.status_code == 200:
+ return _rules.json()
+ else:
+ raise Exception("Got a {} response ({})".format(_rules.status_code, _rules.text))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(policy_name_or_id, rule_id):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ policy_id = list(policy.PoliciesCLI.list(policy_name_or_id).get("policies").keys())[0]
+
+ _rules = requests.delete("{}/policies/{}/rules/{}".format(
+ db_conf.get("url"), policy_id, rule_id),
+ headers={"x-api-key": manager_api_key})
+ if _rules.status_code == 200:
+ return _rules.json()
+ else:
+ raise Exception("Got a {} response ({})".format(_rules.status_code, _rules.text))
diff --git a/moon_manager/moon_manager/api/slave.py b/moon_manager/moon_manager/api/slave.py
new file mode 100644
index 00000000..a0201bdb
--- /dev/null
+++ b/moon_manager/moon_manager/api/slave.py
@@ -0,0 +1,341 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Slaves are endpoint for external connectors like OpenStack
+
+"""
+
+import logging
+import hug
+import os
+import requests
+from moon_manager.api import ERROR_CODE
+from moon_manager import db_driver
+from moon_manager import orchestration_driver
+from moon_manager.api import configuration
+from moon_utilities import exceptions
+from moon_utilities.auth_functions import init_db, api_key_authentication, connect_from_env
+
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
+
+
+class Slaves(object):
+ """
+ Endpoint for slave requests
+ """
+
+ @staticmethod
+ @hug.local()
+ @hug.get("/slaves/", requires=api_key_authentication)
+ @hug.get("/slaves/{uuid}", requires=api_key_authentication)
+ def get(uuid: hug.types.uuid = None, authed_user: hug.directives.user = None):
+ """Retrieve all slaves
+
+ :param uuid: uuid of the pdp
+ :return: {
+ "slaves": {
+ "XXX": {
+ "name": "...",
+ "address": "..."
+ },
+ "YYY": {
+ "name": "...",
+ "address": "..."
+ }
+ }
+ }
+ """
+ if uuid:
+ uuid = str(uuid).replace("-", "")
+ data = db_driver.SlaveManager.get_slaves(moon_user_id=authed_user)
+
+ return {"slaves": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.post("/slave/", requires=api_key_authentication)
+ def post(body, response, authed_user: hug.directives.user = None):
+ """Create a slave.
+
+ :request body: {
+ "name": "name of the slave (mandatory)",
+ "address": "local_or_ssh://a.b.c.d",
+ "description": "description of the slave (optional)",
+ }
+ :return: {
+ "slaves": {
+ "XXX": {
+ "name": "...",
+ "address": "..."
+ },
+ "YYY": {
+ "name": "...",
+ "address": "..."
+ }
+ }
+ }
+ """
+ try:
+ # Create the DB item
+ data = db_driver.SlaveManager.add_slave(
+ moon_user_id=authed_user, slave_id=None, value=body)
+
+ uuid = list(data.keys())[0]
+ # Build and run the process
+ new_data = orchestration_driver.SlaveManager.add_slave(moon_user_id=authed_user,
+ slave_id=uuid, data=data[uuid])
+
+ # Update the DB item with the information from the process (port, ...)
+ data = db_driver.SlaveManager.update_slave(
+ moon_user_id=authed_user, slave_id=uuid, value=new_data)
+
+ except AttributeError as e:
+ response.status = ERROR_CODE[400]
+ LOGGER.exception(e)
+ except exceptions.MoonError as e:
+ response.status = ERROR_CODE[e.code]
+ return {"slaves": data}
+
+ @staticmethod
+ @hug.local()
+ @hug.delete("/slave/{uuid}", requires=api_key_authentication)
+ def delete(uuid: hug.types.uuid, response=None, authed_user: hug.directives.user = None):
+ """Delete a slave
+
+ :param uuid: uuid of the slave to delete
+ :param authed_user: authenticated user name
+ :param response: response initialized by Hug
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ """
+ uuid = str(uuid).replace("-", "")
+ try:
+ db_driver.SlaveManager.delete_slave(
+ moon_user_id=authed_user, slave_id=uuid)
+
+ orchestration_driver.SlaveManager.delete_slave(
+ moon_user_id=authed_user, slave_id=uuid)
+
+ except exceptions.MoonError as e:
+ response.status = ERROR_CODE[e.code]
+ return {"result": False, "description": str(e)}
+ except Exception as e:
+ LOGGER.exception(e)
+ return {"result": False, "description": str(e)}
+ return {"result": True}
+
+ @staticmethod
+ @hug.local()
+ @hug.patch("/slave/{uuid}", requires=api_key_authentication)
+ def patch(uuid: hug.types.uuid, body, response, authed_user: hug.directives.user = None):
+ """Update a slave
+
+ :param uuid: uuid of the slave to delete
+ :param body: body content of the Hug request
+ :param authed_user: authenticated user name
+ :param response: response initialized by Hug
+ :return: {
+ "pdp_id1": {
+ "name": "name of the PDP",
+ "address": "local_or_ssh://a.b.c.d",
+ "description": "description of the slave (optional)",
+ }
+ }
+ """
+
+ uuid = str(uuid).replace("-", "")
+ prev_data = db_driver.SlaveManager.get_slaves(moon_user_id=authed_user, slave_id=uuid)
+ if not prev_data:
+ response.status = ERROR_CODE[400]
+ return {"message": "The slave is unknown."}
+ try:
+ data = db_driver.SlaveManager.update_slave(
+ moon_user_id=authed_user, slave_id=uuid, value=body)
+
+
+ #TODO kill the server using orchestration_driver
+
+ except AttributeError as e:
+ response.status = ERROR_CODE[400]
+ LOGGER.exception(e)
+ return {"message": str(e)}
+ except exceptions.MoonError as e:
+ response.status = ERROR_CODE[e.code]
+ return {"message": str(e)}
+
+ orchestration_driver.SlaveManager.update_slave(moon_user_id=authed_user, slave_id=uuid, value=body)
+
+ return {
+ "slaves": db_driver.SlaveManager.get_slaves(moon_user_id=authed_user, slave_id=uuid)
+ }
+
+
+SlavesAPI = hug.API(name='slaves', doc=Slaves.__doc__)
+db_conf = configuration.get_configuration(key='management')
+init_db(db_conf.get("token_file"))
+
+
+@hug.object(name='slaves', version='1.0.0', api=SlavesAPI)
+class SlavesCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod
+ @hug.object.cli
+ def list(human: bool = False):
+ """
+ List slaves from the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+
+ manager_api_key = connect_from_env()
+ _slaves = requests.get("{}/slaves".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+ if _slaves.status_code == 200:
+ result = _slaves.json()
+
+ if human:
+ return SlavesCLI.human_display(result)
+ else:
+ return result
+ LOGGER.error('Cannot list Slave Data {}'.format(_slaves.status_code))
+
+ @staticmethod
+ @hug.object.cli
+ def add(name='default', address="local", description="", grant_if_unknown_project: bool = False, human: bool = False):
+ """
+ Add slave in the database
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _slaves = requests.post(
+ "{}/slave".format(db_conf.get("url")),
+ json={
+ "name": name,
+ "address": address,
+ "description": description,
+ "grant_if_unknown_project": grant_if_unknown_project
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if _slaves.status_code == 200:
+ LOGGER.warning('Create {}'.format(_slaves.content))
+ if human:
+ return SlavesCLI.human_display(_slaves.json())
+ else:
+ return _slaves.json()
+ LOGGER.error('Cannot create {}'.format(name, _slaves.content))
+
+ @staticmethod
+ @hug.object.cli
+ def delete(name='default'):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _slaves = SlavesCLI.list()
+ for _slave_id, _slave_value in _slaves.get("slaves").items():
+ if _slave_value.get("name") == name:
+ req = requests.delete(
+ "{}/slave/{}".format(db_conf.get("url"), _slave_id),
+ headers={"x-api-key": manager_api_key}
+ )
+ break
+ else:
+ LOGGER.error("Cannot find slave with name {}".format(name))
+ return False
+ if req.status_code == 200:
+ LOGGER.warning('Deleted {}'.format(name))
+ return True
+ LOGGER.error("Cannot delete slave with name {}".format(name))
+ return False
+
+ @staticmethod
+ @hug.object.cli
+ def update(name='default', address=None, description=None,
+ grant_if_unknown_project: hug.types.one_of(("y", "n")) = None):
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _slaves = SlavesCLI.list()
+
+ for _slave_id, _slave_value in _slaves.get("slaves").items():
+ if _slave_value.get("name") == name:
+ address_updated = _slave_value.get("address")
+ description_updated = _slave_value.get("description")
+ grant_if_unknown_project_updated = _slave_value.get("grant_if_unknown_project")
+
+ if address is not None:
+ address_updated = address
+ if description is not None:
+ description_updated = description
+ if grant_if_unknown_project is not None:
+ grant_if_unknown_project_updated = True if grant_if_unknown_project in ("y", "true", "1") else False
+
+ req = requests.patch(
+ "{}/slave/{}".format(db_conf.get("url"), _slave_id),
+ json={
+ "name": name,
+ "address": address_updated,
+ "description": description_updated,
+ "grant_if_unknown_project": grant_if_unknown_project_updated,
+ },
+ headers={
+ "x-api-key": manager_api_key,
+ "Content-Type": "application/json"
+ }
+ )
+ if req.status_code == 200:
+ LOGGER.warning('Updated {}'.format(name))
+ return True
+ else:
+ LOGGER.error('Cannot update {}'.format(name))
+ return False
+
+ LOGGER.error('Cannot find {}'.format(name))
+ return False
+
+ @staticmethod
+ def human_display(slaves_json):
+ human_result = "Slaves"
+ for slave in slaves_json.get("slaves"):
+ human_result += "\n" + slaves_json.get("slaves").get(slave).get("name") + " : \n"
+ human_result += "\tname : " + slaves_json.get("slaves").get(slave).get("name") + "\n"
+ human_result += "\tid : " + slave + "\n"
+ human_result += "\tdescription : " + slaves_json.get("slaves").get(slave).get("description") + "\n"
+ human_result += "\taddress : " + slaves_json.get("slaves").get(slave).get("address") + "\n"
+ human_result += "\tgrant_if_unknown_project : " + str(slaves_json.get("slaves").get(slave).get("grant_if_unknown_project")) + "\n"
+ human_result += "\tprocess : " + slaves_json.get("slaves").get(slave).get("process") + "\n"
+ human_result += "\tlog : " + slaves_json.get("slaves").get(slave).get("log") + "\n"
+ human_result += "\tapi_key : " + slaves_json.get("slaves").get(slave).get("api_key") + "\n"
+ human_result += SlavesCLI.human_display_extra(slaves_json.get("slaves").get(slave).get("extra"))
+ return human_result
+
+ @staticmethod
+ def human_display_extra(extra_json):
+ human_result = "\textra"
+ human_result += "\n"
+ human_result += "\t\tdescription : " + extra_json.get("description") + "\n"
+ human_result += "\t\tstarttime : " + str(extra_json.get("starttime")) + "\n"
+ human_result += "\t\tport : " + str(extra_json.get("port")) + "\n"
+ human_result += "\t\tserver_ip : " + str(extra_json.get("server_ip")) + "\n"
+ human_result += "\t\tstatus : " + extra_json.get("status") + "\n"
+ human_result += "\t\tprocess : " + extra_json.get("process") + "\n"
+ human_result += "\t\tlog : " + extra_json.get("log") + "\n"
+ human_result += "\t\tapi_key : " + extra_json.get("api_key") + "\n"
+ return human_result
+
+
diff --git a/moon_manager/moon_manager/api/status.py b/moon_manager/moon_manager/api/status.py
new file mode 100644
index 00000000..b299db49
--- /dev/null
+++ b/moon_manager/moon_manager/api/status.py
@@ -0,0 +1,127 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+"""Status API"""
+import hug
+import logging
+import requests
+from moon_utilities.auth_functions import api_key_authentication, connect_from_env
+from moon_manager import orchestration_driver
+from moon_manager.api import configuration
+from datetime import datetime
+
+logger = logging.getLogger("moon.manager.api.status")
+
+
+class Status(object):
+ """
+ Endpoint for status requests
+ """
+ @staticmethod
+ @hug.local()
+ @hug.get("/status/", requires=api_key_authentication)
+ def list_status(authed_user: hug.directives.user=None):
+ """
+ List statuses
+ :return: JSON status output
+ """
+ pipelines = orchestration_driver.PipelineManager.get_pipelines(moon_user_id=authed_user)
+ slaves = orchestration_driver.SlaveManager.get_slaves(moon_user_id=authed_user)
+
+ config = configuration.search_config_file("moon.yaml")
+ log_file = config["logging"]["handlers"]["file"]["filename"]
+
+ result = {"status": {
+ "manager": {"name": "manager", "status": "up", "log": log_file},
+ }}
+
+ for slave in slaves:
+ result["status"][slave] = slaves[slave]
+ for slave in pipelines:
+ result["status"][slave].update(pipelines[slave])
+
+ web_port = config["dashboard"]["port"]
+ url = ":".join(config["management"]["url"].split(":")[:-1])
+
+ result["status"]["web_GUI"] = {"name": "web GUI", "status": "down"}
+ try:
+ req = requests.get(f"{url}:{web_port}")
+ except requests.exceptions.ConnectionError:
+ req = None
+
+ if req and req.status_code == 200:
+ result["status"]["web_GUI"].update({"status": "up", "port": web_port})
+
+ return result
+
+
+StatusAPI = hug.API(name='status', doc=Status.__doc__)
+
+
+@hug.cli("status")
+def status(quiet: bool = False, human: bool = False):
+ """
+ CLI Parameter to get status
+ :param quiet:
+ :param human:
+ :return: JSON status output
+ """
+ db_conf = configuration.get_configuration(key='management')
+ manager_api_key = connect_from_env()
+ _status = requests.get("{}/status".format(db_conf.get("url")),
+ headers={"x-api-key": manager_api_key}
+ )
+
+ if _status.status_code == 200:
+ if human:
+ result = "Status"
+ statuses = _status.json()["status"].items()
+ for uuid, values in statuses:
+ # for humans, it's best to call the servers by their name
+ # instead of their uuid
+ result += f"\n{values['name']} :"
+ if quiet:
+ result += " OK" if values["status"] == "up" else " KO"
+ pipelines = values.get("pipelines")
+ if pipelines is not None:
+ for pipeline_uuid in pipelines:
+ result += f"\n\t{pipeline_uuid} :"
+ result += " OK" if pipelines[pipeline_uuid]["status"] == "up" else " KO"
+ else:
+ result += "\n" # not quiet mode : newline needed
+ result += f"\tuuid : {uuid}\n"
+ for k2, v2 in values.items():
+ if k2 == "pipelines":
+ result += StatusCLI.format_pipelines_for_status(values["pipelines"])
+ elif k2 == "starttime":
+ result += f"\t{k2} : {datetime.fromtimestamp(v2).strftime('%d/%m/%Y %H:%M:%S')}\n"
+ elif k2 != "name":
+ result += f"\t{k2} : {v2}\n"
+ return result
+ else:
+ return _status.json()
+
+
+@hug.object(name='status', version='1.0.0', api=StatusAPI)
+class StatusCLI(object):
+ """An example of command like calls via an Object"""
+ @staticmethod
+ def format_pipelines_for_status(pipelines):
+ result = ""
+ for pipeline in pipelines:
+ result += f"\n\t{pipeline} :\n"
+ for k,v in pipelines[pipeline].items():
+ if k == "starttime":
+ result += f"\t\t{k} : {datetime.fromtimestamp(v).strftime('%d/%m/%Y %H:%M:%S')}\n"
+ else:
+ result += f"\t\t{k} : {v}\n"
+ return result
diff --git a/moon_manager/moon_manager/api/users.py b/moon_manager/moon_manager/api/users.py
new file mode 100644
index 00000000..9de78ff3
--- /dev/null
+++ b/moon_manager/moon_manager/api/users.py
@@ -0,0 +1,95 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Users
+"""
+import hug
+import logging
+import getpass
+from tinydb import Query
+from moon_utilities.auth_functions import db, init_db, add_user, get_api_key, change_password
+
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
+
+UsersAPI = hug.API('users')
+
+
+@hug.object(name='users', version='1.0.0', api=UsersAPI)
+class UsersCLI(object):
+ """An example of command like calls via an Object"""
+
+ @staticmethod # nosec
+ @hug.object.cli
+ def add(username, password: hug.types.text = ""):
+ """
+ Add a user to the database
+ """
+ return add_user(username, password)
+
+ @staticmethod # nosec
+ @hug.object.cli
+ def change_password(username, password: hug.types.text = "", new_password: hug.types.text = ""):
+ """
+ Authenticate a username and password against our database
+ """
+ result = change_password(username, password, new_password)
+ if not result:
+ return "Wrong password"
+ return result
+
+ @staticmethod # nosec
+ @hug.object.cli
+ def key(username, password: hug.types.text = ""):
+ """
+ Authenticate a username and password against our database
+ """
+ if password == "":
+ password = getpass.getpass()
+ return get_api_key(username, password)
+
+ @staticmethod
+ @hug.object.cli
+ def list(human: bool = False):
+ """
+ List users from the database
+ """
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ users = db.search(user_model.username.matches('.*'))
+ if human:
+ result = "Users"
+ if users:
+ for user in users:
+ result += f"\n{user['username']} : \n"
+ result += f"\tusername : {user['username']}\n"
+ result += f"\tapi_key : {user['api_key']}"
+ else:
+ result += f"\nNo user"
+ return result
+ else:
+ result = []
+ if users:
+ for user in users:
+ result.append({
+ 'username': user['username'],
+ 'api_key': user['api_key']
+ })
+ return {'users': result}
+
+
+
+
+
+
+
diff --git a/moon_manager/moon_manager/daemon.py b/moon_manager/moon_manager/daemon.py
new file mode 100644
index 00000000..3b9f9c1e
--- /dev/null
+++ b/moon_manager/moon_manager/daemon.py
@@ -0,0 +1,183 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Plugin to request OpenStack infrastructure:
+- Keystone
+- Nova
+"""
+
+import logging
+import os
+import atexit
+import signal
+import sys
+import time
+from moon_manager import pip_driver
+from moon_manager import db_driver
+from moon_manager.api import configuration
+import hug.interface
+
+LOGGER = logging.getLogger("moon.manager.plugins.daemon")
+
+PLUGIN_TYPE = "daemon"
+
+db_driver.init()
+
+
+class OpenstackDaemon(object):
+
+ @staticmethod
+ def _update_subjects():
+ k_users = []
+ for manager in pip_driver.InformationManager["subjects"]:
+ k_users += list(manager.get_items().values())[0]
+
+ user_ids = {user["id"].replace("-", ""): user for user in k_users}
+
+ moon_subjects = db_driver.PolicyManager.get_subjects(moon_user_id=None, policy_id=None)
+ moon_subject_ids = moon_subjects.keys()
+
+ for user_id in user_ids:
+ if user_id not in moon_subject_ids:
+ value = {"name": user_ids[user_id]["name"], "description": ""}
+ db_driver.PolicyManager.add_subject(
+ moon_user_id=None, policy_id=None, value=value, perimeter_id=user_id)
+
+ @staticmethod
+ def _update_objects():
+ k_objects = []
+ for manager in pip_driver.InformationManager["objects"]:
+ k_objects += list(manager.get_items().values())[0]
+
+ object_ids = {object_["id"].replace("-", ""): object_ for object_ in k_objects}
+
+ moon_objects = db_driver.PolicyManager.get_objects(moon_user_id=None, policy_id=None)
+ moon_object_ids = moon_objects.keys()
+
+ for object_id in object_ids:
+ if object_id not in moon_object_ids:
+ value = {"name": object_ids[object_id]["name"], "description": ""}
+ db_driver.PolicyManager.add_object(
+ moon_user_id=None, policy_id=None, value=value, perimeter_id=object_id)
+
+ @staticmethod
+ def update():
+ OpenstackDaemon._update_subjects()
+ OpenstackDaemon._update_objects()
+
+
+def daemonize(pidfile, logfile):
+ try:
+ with open(pidfile, 'r') as pf:
+ pid = int(pf.read().strip())
+ except IOError:
+ pid = None
+
+ if pid:
+ message = "pidfile {0} already exist. " + \
+ "Daemon already running?\n"
+ sys.stderr.write(message.format(pidfile))
+ sys.exit(1)
+
+ try:
+ pid = os.fork()
+ if pid > 0:
+ # exit first parent
+ sys.exit(0)
+ except OSError as err:
+ sys.stderr.write('fork #1 failed: {0}\n'.format(err))
+ sys.exit(1)
+
+ # decouple from parent environment
+ os.chdir('/')
+ os.setsid()
+ os.umask(0)
+
+ # do second fork
+ try:
+ pid = os.fork()
+ if pid > 0:
+ # exit from second parent
+ sys.exit(0)
+ except OSError as err:
+ sys.stderr.write('fork #2 failed: {0}\n'.format(err))
+ sys.exit(1)
+
+ # redirect standard file descriptors
+ sys.stdout.flush()
+ sys.stderr.flush()
+ si = open(os.devnull, 'r')
+ so = open(logfile, 'a+')
+ se = open(logfile, 'a+')
+
+ os.dup2(si.fileno(), sys.stdin.fileno())
+ os.dup2(so.fileno(), sys.stdout.fileno())
+ os.dup2(se.fileno(), sys.stderr.fileno())
+
+ # write pidfile
+ atexit.register(os.remove, pidfile)
+
+ pid = str(os.getpid())
+ with open(pidfile, 'w+') as f:
+ f.write(pid + '\n')
+
+
+def kill_daemon(pidfile):
+ """Stop the daemon."""
+
+ # Get the pid from the pidfile
+ try:
+ with open(pidfile, 'r') as pf:
+ pid = int(pf.read().strip())
+ except IOError:
+ pid = None
+
+ if not pid:
+ message = "pidfile {0} does not exist. " + \
+ "Daemon not running?\n"
+ sys.stderr.write(message.format(pidfile))
+ return # not an error in a restart
+
+ # Try killing the daemon process
+ try:
+ while 1:
+ os.kill(pid, signal.SIGTERM)
+ time.sleep(0.1)
+ except OSError as err:
+ e = str(err.args)
+ if e.find("No such process") > 0:
+ if os.path.exists(pidfile):
+ os.remove(pidfile)
+ else:
+ print(str(err.args))
+ sys.exit(1)
+
+@hug.cli("start_daemon")
+def run():
+ """ start the auto-update service """
+ daemon_conf = configuration.get_configuration("information").get("daemon")
+ daemonize(daemon_conf["pid_file"], daemon_conf["log_file"])
+
+ for category in pip_driver.InformationManager:
+ for manager in pip_driver.InformationManager[category]:
+ manager.set_auth()
+
+ while True:
+ OpenstackDaemon.update()
+ time.sleep(1)
+
+@hug.cli("stop_daemon")
+def stop():
+ """ stop the auto-update service """
+ pid_file = configuration.get_configuration("information").get("daemon").get("pid_file")
+ kill_daemon(pid_file)
+
diff --git a/moon_manager/moon_manager/db_driver.py b/moon_manager/moon_manager/db_driver.py
new file mode 100644
index 00000000..89b20857
--- /dev/null
+++ b/moon_manager/moon_manager/db_driver.py
@@ -0,0 +1,256 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+from moon_manager.api import configuration
+from moon_manager.api.db import model, policy, pdp, slave
+
+logger = logging.getLogger("moon.manager.db_driver")
+
+
+ModelManager = None
+PolicyManager = None
+PDPManager = None
+SlaveManager = None
+
+
+class Driver:
+
+ def __init__(self, driver_name, engine_name):
+ self.driver = configuration.get_db_driver()
+ self.driver = self.driver.Connector(engine_name)
+
+
+class ModelDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(ModelDriver, self).__init__(driver_name, engine_name)
+
+ def update_model(self, model_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_model(self, model_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_model(self, model_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_models(self, model_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_meta_rule(self, meta_rule_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_meta_rules(self, meta_rule_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_meta_rule(self, meta_rule_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_subject_categories(self, category_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_subject_category(self, name, description):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_subject_category(self, category_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_object_categories(self, category_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_object_category(self, category_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_object_category(self, category_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_action_categories(self, category_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_action_category(self, category_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_action_category(self, category_id):
+ raise NotImplementedError() # pragma: no cover
+
+
+class PolicyDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(PolicyDriver, self).__init__(driver_name, engine_name)
+
+ def update_policy(self, policy_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_policy(self, policy_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_policy(self, policy_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_policies(self, policy_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_subjects(self, policy_id, perimeter_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_subject(self, policy_id, perimeter_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_subject(self, policy_id, perimeter_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_objects(self, policy_id, perimeter_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_object(self, policy_id, perimeter_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_object(self, policy_id, perimeter_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_actions(self, policy_id, perimeter_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_action(self, policy_id, perimeter_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_action(self, policy_id, perimeter_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_subject_data(self, policy_id, data_id=None, category_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_subject_data(self, policy_id, data_id=None, category_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_subject_data(self, policy_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_object_data(self, policy_id, data_id=None, category_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_object_data(self, policy_id, data_id=None, category_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_object_data(self, policy_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_action_data(self, policy_id, data_id=None, category_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def set_action_data(self, policy_id, data_id=None, category_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_action_data(self, policy_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_subject_assignments(self, policy_id, subject_id=None, category_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_subject_assignment(self, policy_id, subject_id, category_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_subject_assignment(self, policy_id, subject_id, category_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_object_assignments(self, policy_id, assignment_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_object_assignment(self, policy_id, subject_id, category_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_object_assignment(self, policy_id, object_id, category_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_action_assignments(self, policy_id, assignment_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_action_assignment(self, policy_id, action_id, category_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_action_assignment(self, policy_id, action_id, category_id, data_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_rules(self, policy_id, rule_id=None, meta_rule_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_rule(self, policy_id, meta_rule_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def update_rule(self, rule_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_rule(self, policy_id, rule_id):
+ raise NotImplementedError() # pragma: no cover
+
+
+class PDPDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(PDPDriver, self).__init__(driver_name, engine_name)
+
+ def update_pdp(self, pdp_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_policy_from_pdp(self, pdp_id, policy_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_pdp(self, pdp_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_pdp(self, pdp_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_pdp(self, pdp_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+
+class SlaveDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(SlaveDriver, self).__init__(driver_name, engine_name)
+
+ def update_slave(self, slave_id, value):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_slave(self, slave_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_slave(self, slave_id=None, value=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_slaves(self, slave_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+
+def init():
+ global ModelManager, PolicyManager, PDPManager, SlaveManager
+
+ conf = configuration.get_configuration("database")
+
+ ModelManager = model.ModelManager(
+ ModelDriver(conf['driver'], conf['url'])
+ )
+
+ PolicyManager = policy.PolicyManager(
+ PolicyDriver(conf['driver'], conf['url'])
+ )
+
+ PDPManager = pdp.PDPManager(
+ PDPDriver(conf['driver'], conf['url'])
+ )
+
+ SlaveManager = slave.SlaveManager(
+ SlaveDriver(conf['driver'], conf['url'])
+ )
diff --git a/moon_manager/moon_manager/manager_setup.py b/moon_manager/moon_manager/manager_setup.py
new file mode 100644
index 00000000..b3e5a1eb
--- /dev/null
+++ b/moon_manager/moon_manager/manager_setup.py
@@ -0,0 +1,31 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+This file is used only once to install the manager
+"""
+
+import os
+import shutil
+import sys
+
+
+def setup():
+ """Setup the manager
+
+ :return: nothing
+ """
+ if os.name == "posix":
+ if not os.path.exists(os.path.join("/etc", "moon")):
+ print("Installing configuration file in /etc")
+ shutil.copytree(os.path.abspath(sys.argv[0]+"/../../moon"), os.path.join("/etc/moon"))
+ else:
+ print('The directory "/etc/moon/" already exists.', file=sys.stderr)
diff --git a/moon_manager/moon_manager/orchestration_driver.py b/moon_manager/moon_manager/orchestration_driver.py
new file mode 100644
index 00000000..5e03c250
--- /dev/null
+++ b/moon_manager/moon_manager/orchestration_driver.py
@@ -0,0 +1,81 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+from moon_manager.api import configuration
+from moon_manager.api.orchestration import slave, pipeline
+
+logger = logging.getLogger("moon.manager.orchestration_driver")
+
+
+SlaveManager = None
+PipelineManager = None
+
+
+class Driver:
+
+ def __init__(self, driver_name, engine_name):
+ self.name = driver_name
+ self.plug = configuration.get_orchestration_driver()
+ self.driver = self.plug.Connector(driver_name, engine_name)
+
+
+class SlaveDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(SlaveDriver, self).__init__(driver_name, engine_name)
+ self.engine = engine_name
+
+ def update_slave(self, slave_id, data):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_slave(self, slave_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_slave(self, slave_id=None, data=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_slaves(self, slave_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+
+class PipelineDriver(Driver):
+
+ def __init__(self, driver_name, engine_name):
+ super(PipelineDriver, self).__init__(driver_name, engine_name)
+ self.engine = engine_name
+
+ def update_pipeline(self, pipeline_id, data):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_pipeline(self, pipeline_id):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_pipeline(self, pipeline_id=None, data=None):
+ raise NotImplementedError() # pragma: no cover
+
+ def get_pipelines(self, slave_id=None, pipeline_id=None):
+ raise NotImplementedError() # pragma: no cover
+
+
+def init():
+ global SlaveManager, PipelineManager
+
+ logger.info("Initializing driver")
+ conf = configuration.get_configuration("orchestration")
+
+ SlaveManager = slave.SlaveManager(
+ SlaveDriver(conf['driver'], conf.get('url'))
+ )
+ PipelineManager = pipeline.PipelineManager(
+ PipelineDriver(conf['driver'], conf.get('url'))
+ )
diff --git a/moon_manager/moon_manager/pip_driver.py b/moon_manager/moon_manager/pip_driver.py
new file mode 100644
index 00000000..1a451577
--- /dev/null
+++ b/moon_manager/moon_manager/pip_driver.py
@@ -0,0 +1,350 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Drivers fot the Policy Information Point
+"""
+
+import logging
+from moon_manager.api import configuration
+from moon_manager.api.information import information, global_attrs
+
+LOGGER = logging.getLogger("moon.manager.pip_driver")
+
+
+InformationManager = None
+AttrsManager = None
+
+
+class Driver:
+ """
+ Generic driver
+ """
+
+ def __init__(self, driver_name, engine_name, conf={}):
+ self.name = driver_name
+ self.plug = configuration.get_information_driver(driver_name)
+ if self.plug:
+ self.driver = self.plug.Connector(driver_name, engine_name, conf)
+ else:
+ self.driver = VoidConnector(driver_name, engine_name)
+
+
+class InformationDriver(Driver):
+ """
+ Driver for information retrieval for external components like OpenStack
+ """
+
+ def __init__(self, driver_name, engine_name, conf):
+ super(InformationDriver, self).__init__(driver_name, engine_name, conf)
+ self.engine = engine_name
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def get_items(self, item_id=None, **kwargs):
+ """List items in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to list items
+ :return: a list of items
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def add_item(self, item_id=None, **kwargs):
+ """Add a item in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to add a item
+ :return: the item added
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def update_item(self, item_id, **kwargs):
+ """Update a item in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to update the item
+ :return: the item updated
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_item(self, item_id, **kwargs):
+ """Delete a item in the server
+
+ :param item_id: the item name or item ID
+ :param kwargs: all arguments necessary to delete the item
+ :return: True if the item has been deleted
+ """
+ raise NotImplementedError() # pragma: no coverl
+
+
+class GlobalAttrsDriver:
+ """
+ Driver for global attributes in Moon
+ """
+
+ def __init__(self, driver_name, engine_name):
+ self.name = driver_name
+ self.plug = configuration.get_global_attrs_driver()
+ if self.plug:
+ self.driver = self.plug.Connector(driver_name, engine_name)
+ else:
+ self.driver = VoidConnector(driver_name, engine_name)
+ self.engine = engine_name
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def get_users(self, user_id=None, **kwargs):
+ """List users in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to list users
+ :return: a list of users
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def add_user(self, user_id=None, **kwargs):
+ """Add a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to add a user
+ :return: the user added
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def update_user(self, user_id, **kwargs):
+ """Update a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to update the user
+ :return: the user updated
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_user(self, user_id, **kwargs):
+ """Delete a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to delete the user
+ :return: True if the user has been deleted
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def get_object(self, object_type=None, **kwargs):
+ """List a specific object in the server
+
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_object(self, object_id, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ raise NotImplementedError() # pragma: no cover
+
+
+class VoidConnector(InformationDriver):
+ """
+ Driver for information retrieval for external components like OpenStack
+ """
+
+ def __init__(self, driver_name, engine_name):
+ self.engine = engine_name
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ return
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ return
+
+ def get_users(self, user_id=None, **kwargs):
+ """List users in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to list users
+ :return: a list of users
+ """
+ return {}
+
+ def add_user(self, user_id=None, **kwargs):
+ """Add a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to add a user
+ :return: the user added
+ """
+ return {}
+
+ def update_user(self, user_id, **kwargs):
+ """Update a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to update the user
+ :return: the user updated
+ """
+ return {}
+
+ def delete_user(self, user_id, **kwargs):
+ """Delete a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to delete the user
+ :return: True if the user has been deleted
+ """
+ return {}
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ return {}
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ return {}
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ return {}
+
+ def delete_object(self, object_id, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ return {}
+
+
+def init():
+ """Initialize the managers
+
+ :return: nothing
+ """
+ global InformationManager, AttrsManager
+
+ InformationManager = {"subjects": [], "objects": [], "actions": []}
+
+ LOGGER.info("Initializing driver")
+ conf = configuration.get_configuration("information")
+
+ for category in InformationManager:
+ if category not in conf:
+ continue
+ drivers = conf.get(category).get("drivers")
+ for driver in drivers:
+ InformationManager[category].append(
+ information.InformationManager(
+ InformationDriver(driver, drivers[driver].get("url"), conf[category]["drivers"].get(driver, {}))
+ )
+ )
+
+ conf = configuration.get_configuration("information").get("global_attrs")
+
+ AttrsManager = global_attrs.GlobalAttrsManager(
+ GlobalAttrsDriver(conf['driver'], "")
+ )
+
+
+init()
diff --git a/moon_manager/moon_manager/plugins/__init__.py b/moon_manager/moon_manager/plugins/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_manager/moon_manager/plugins/global_attrs.py b/moon_manager/moon_manager/plugins/global_attrs.py
new file mode 100644
index 00000000..fdf51fd4
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/global_attrs.py
@@ -0,0 +1,582 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Plugin to request OpenStack infrastructure:
+- Keystone
+- Nova
+"""
+
+import json
+import logging
+import time
+import requests
+from moon_manager.pip_driver import InformationDriver
+from moon_manager.api.configuration import get_configuration
+from moon_utilities import exceptions
+
+LOGGER = logging.getLogger("moon.manager.plugins.global_attrs")
+
+PLUGIN_TYPE = "information"
+
+
+class AttrsConnector(InformationDriver):
+
+ def __init__(self, driver_name, engine_name):
+ self.driver_name = driver_name
+ self.engine_name = engine_name
+ self.conf = get_configuration("information").get("global_attrs", {})
+ self.drivers = {}
+
+ def driver(self, driver_name="file"):
+ if driver_name.startswith("file"):
+ if not self.drivers.get("file"):
+ self.drivers["file"] = AttrsConnectorFile()
+ return self.drivers["file"]
+ if driver_name == "http":
+ if not self.drivers.get("file"):
+ self.drivers["http"] = AttrsConnectorHTTP()
+ return self.drivers["http"]
+ if driver_name == "mysql":
+ if not self.drivers.get("file"):
+ self.drivers["mysql"] = AttrsConnectorSQL()
+ return self.drivers["sql"]
+ if driver_name == "sqlite":
+ if not self.drivers.get("file"):
+ self.drivers["sqlite"] = AttrsConnectorSQL()
+ return self.drivers["sql"]
+ if driver_name == "driver":
+ if not self.drivers.get("file"):
+ self.drivers["driver"] = AttrsConnectorDriver()
+ return self.drivers["driver"]
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ if not object_type:
+ object_type = list(self.conf.get("attributes").keys())
+ elif isinstance(object_type, str):
+ object_type = [object_type, ]
+
+ results = {}
+ for _type in object_type:
+ if _type in self.conf.get("attributes"):
+ driver_name = self.conf.get("attributes").get(_type).get("url").split(":")[0]
+ value = self.driver(driver_name).get_object(_type, **kwargs)
+ results[_type] = {
+ "id": _type,
+ "value": value,
+ "values": self.conf.get("attributes").get(_type).get("values"),
+ "default": self.conf.get("attributes").get(_type).get("default")
+ }
+ else:
+ raise exceptions.AttributeUnknownError(
+ "Cannot find global attribute {}".format(object_type))
+ return results
+
+ def get_object(self, object_type=None, **kwargs):
+ """List specific object in the server
+
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ if object_type in self.conf.get("attributes"):
+ driver_name = self.conf.get("attributes").get(object_type).get("url").split(":")[0]
+ value = self.driver(driver_name).get_object(object_type, **kwargs)
+ return {
+ "id": object_type,
+ "value": value,
+ "values": self.conf.get("attributes").get(object_type).get("values"),
+ "default": self.conf.get("attributes").get(object_type).get("default")
+ }
+ else:
+ raise exceptions.AttributeUnknownError(
+ "Cannot find global attribute {}".format(object_type))
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ if object_type in self.conf.get("attributes"):
+ driver_name = self.conf.get("attributes").get(object_type).get("url").split(":")[0]
+ value = self.driver(driver_name).add_object(object_id, object_type, **kwargs)
+ return {
+ "id": object_type,
+ "value": value,
+ "values": self.conf.get("attributes").get(object_type).get("values"),
+ "default": self.conf.get("attributes").get(object_type).get("default")
+ }
+ raise exceptions.AttributeUnknownError(
+ "Cannot find global attribute {}".format(object_type))
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ if object_type in self.conf.get("attributes"):
+ driver_name = self.conf.get("attributes").get(object_type).get("url").split(":")[0]
+ value = self.driver(driver_name).update_object(object_id, object_type, **kwargs)
+ return {
+ "id": object_type,
+ "value": value,
+ "values": self.conf.get("attributes").get(object_type).get("values"),
+ "default": self.conf.get("attributes").get(object_type).get("default")
+ }
+ raise exceptions.AttributeUnknownError(
+ "Cannot find global attribute {}".format(object_type))
+
+ def delete_object(self, object_id=None, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ if object_type in self.conf.get("attributes"):
+ driver_name = self.conf.get("attributes").get(object_type).get("url").split(":")[0]
+ value = self.driver(driver_name).delete_object(object_id, object_type, **kwargs)
+ return {
+ "id": object_type,
+ "value": value,
+ "values": self.conf.get("attributes").get(object_type).get("values"),
+ "default": self.conf.get("attributes").get(object_type).get("default")
+ }
+ raise exceptions.AttributeUnknownError(
+ "Cannot find global attribute {}".format(object_type))
+
+
+class AttrsConnectorFile:
+
+ def __init__(self):
+ self.conf = get_configuration("information").get("global_attrs", {})
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ if not object_type:
+ object_type = list(self.conf.get("attributes").keys())
+ elif isinstance(object_type, str):
+ object_type = [object_type, ]
+
+ for _type in object_type:
+ filename = self.conf.get("attributes").get(_type).get("url").split(":")[1].strip()
+ try:
+ yield {_type: open(filename).read().strip()}
+ except FileNotFoundError:
+ LOGGER.error("Cannot find file name {}".format(filename))
+ yield {_type: self.conf.get("attributes").get(_type).get("default")}
+
+ def get_object(self, object_type, **kwargs):
+ """Get specific object in the server
+
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ filename = self.conf.get("attributes").get(object_type).get("url").split(":")[1].strip()
+ try:
+ return open(filename).read().strip()
+ except FileNotFoundError:
+ LOGGER.error("Cannot find file name {}".format(filename))
+ return self.conf.get("attributes").get(object_type).get("default")
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ filename = self.conf.get("attributes").get(object_type).get("url").split(":")[1].strip()
+ default_value = self.conf.get("attributes").get(object_type).get("default")
+ open(filename, "w").write(default_value)
+ return default_value
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ filename = self.conf.get("attributes").get(object_type).get("url").split(":")[1].strip()
+ values = self.conf.get("attributes").get(object_type).get("values")
+ if object_id in values:
+ open(filename, "w").write(object_id)
+ return object_id
+ raise exceptions.AttributeValueUnknownError(
+ "The given value ({}) is not part of the authorized values ({})".format(
+ object_id, ", ".join(values)))
+
+ def delete_object(self, object_id=None, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ filename = self.conf.get("attributes").get(object_type).get("url").split(":")[1].strip()
+ default_value = self.conf.get("attributes").get(object_type).get("default")
+ open(filename, "w").write(default_value)
+ return default_value
+
+
+class AttrsConnectorHTTP:
+
+ def __init__(self):
+ self.conf = get_configuration("information").get("global_attrs", {})
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def get_users(self, user_id=None, **kwargs):
+ """List users in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to list users
+ :return: a list of users
+ """
+ raise NotImplementedError
+
+ def add_user(self, user_id=None, **kwargs):
+ """Add a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to add a user
+ :return: the user added
+ """
+ raise NotImplementedError
+
+ def update_user(self, user_id, **kwargs):
+ """Update a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to update the user
+ :return: the user updated
+ """
+ raise NotImplementedError
+
+ def delete_user(self, user_id, **kwargs):
+ """Delete a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to delete the user
+ :return: True if the user has been deleted
+ """
+ raise NotImplementedError
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ raise NotImplementedError
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ raise NotImplementedError
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ raise NotImplementedError
+
+ def delete_object(self, object_id=None, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ raise NotImplementedError
+
+
+class AttrsConnectorSQL:
+
+ def __init__(self):
+ self.conf = get_configuration("information").get("global_attrs", {})
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def get_users(self, user_id=None, **kwargs):
+ """List users in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to list users
+ :return: a list of users
+ """
+ raise NotImplementedError
+
+ def add_user(self, user_id=None, **kwargs):
+ """Add a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to add a user
+ :return: the user added
+ """
+ raise NotImplementedError
+
+ def update_user(self, user_id, **kwargs):
+ """Update a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to update the user
+ :return: the user updated
+ """
+ raise NotImplementedError
+
+ def delete_user(self, user_id, **kwargs):
+ """Delete a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to delete the user
+ :return: True if the user has been deleted
+ """
+ raise NotImplementedError
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ raise NotImplementedError
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ raise NotImplementedError
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ raise NotImplementedError
+
+ def delete_object(self, object_id=None, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ raise NotImplementedError
+
+
+class AttrsConnectorDriver:
+
+ def __init__(self):
+ self.conf = get_configuration("information").get("global_attrs", {})
+
+ def set_auth(self, **kwargs):
+ """Set authorizations if necessary
+
+ :param kwargs: arguments which are necessary to login to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def unset_auth(self, **kwargs):
+ """Unset the authorization is necessary
+
+ :param kwargs: arguments which are necessary to logout to the server
+ :return: headers to use
+ """
+ raise NotImplementedError
+
+ def get_users(self, user_id=None, **kwargs):
+ """List users in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to list users
+ :return: a list of users
+ """
+ raise NotImplementedError
+
+ def add_user(self, user_id=None, **kwargs):
+ """Add a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to add a user
+ :return: the user added
+ """
+ raise NotImplementedError
+
+ def update_user(self, user_id, **kwargs):
+ """Update a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to update the user
+ :return: the user updated
+ """
+ raise NotImplementedError
+
+ def delete_user(self, user_id, **kwargs):
+ """Delete a user in the server
+
+ :param user_id: the user name or user ID
+ :param kwargs: all arguments necessary to delete the user
+ :return: True if the user has been deleted
+ """
+ raise NotImplementedError
+
+ def get_objects(self, object_id=None, object_type=None, **kwargs):
+ """List objects in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to list the object
+ :return: a list of objects
+ """
+ raise NotImplementedError
+
+ def add_object(self, object_id=None, object_type=None, **kwargs):
+ """Add an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to add the object
+ :return: the object added
+ """
+ raise NotImplementedError
+
+ def update_object(self, object_id, object_type=None, **kwargs):
+ """Update an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to update the object
+ :return: the object updated
+ """
+ raise NotImplementedError
+
+ def delete_object(self, object_id=None, object_type=None, **kwargs):
+ """Delete an object in the server
+
+ :param object_id: the object name or user ID
+ :param object_type: the object type (project, vms, ...)
+ :param kwargs: all arguments necessary to delete the object
+ :return: True if the object has been deleted
+ """
+ raise NotImplementedError
+
+
+class Connector(AttrsConnector):
+ pass
diff --git a/moon_manager/moon_manager/plugins/moon_keystone_plugin.py b/moon_manager/moon_manager/plugins/moon_keystone_plugin.py
new file mode 100644
index 00000000..0fb9b363
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/moon_keystone_plugin.py
@@ -0,0 +1,77 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Plugin to request OpenStack infrastructure:
+- Keystone
+"""
+
+from moon_manager.plugins.moon_openstack_plugin import *
+
+LOGGER = logging.getLogger("moon.manager.plugins.moon_keystone_plugin")
+
+PLUGIN_TYPE = "information"
+_ = str
+
+
+class KeystoneConnector(OpenStackConnector):
+
+ def get_items(self, item_id=None, **kwargs):
+ username = ""
+ domain_id = ""
+ if "username" in kwargs:
+ username = kwargs['username']
+ if "domain_id" in kwargs:
+ domain_id = kwargs['domain_id']
+ if username and domain_id:
+ return self._get(endpoint="/users?name={}&domain_id={}".format(username, domain_id),
+ _exception=KeystoneUserError)
+ elif username:
+ return self._get(endpoint="/users?name={}".format(username),
+ _exception=KeystoneUserError)
+ elif domain_id:
+ return self._get(endpoint="/users?domain_id={}".format(domain_id),
+ _exception=KeystoneUserError)
+ else:
+ return self._get(endpoint="/users",
+ _exception=KeystoneUserError)
+
+ def add_item(self, item_id=None, **kwargs):
+ if 'name' not in kwargs:
+ raise KeystoneError("Cannot find name in request")
+ _user = {
+ "user": {
+ "enabled": True,
+ "name": kwargs['name'],
+ }
+ }
+ if 'project' in kwargs:
+ _user['user']['default_project_id'] = kwargs['project']
+ if 'domain' in kwargs:
+ _user['user']['domain_id'] = kwargs['domain']
+ if 'password' in kwargs:
+ _user['user']['password'] = kwargs['password']
+ try:
+ return self._post(endpoint="/users/",
+ data=_user,
+ _exception=KeystoneUserError)
+ except KeystoneUserConflict:
+ return True
+
+ def update_item(self, item_id, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_item(self, item_id, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+
+class Connector(KeystoneConnector):
+ pass
diff --git a/moon_manager/moon_manager/plugins/moon_nova_plugin.py b/moon_manager/moon_manager/plugins/moon_nova_plugin.py
new file mode 100644
index 00000000..0848152e
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/moon_nova_plugin.py
@@ -0,0 +1,71 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Plugin to request OpenStack infrastructure:
+- Nova
+"""
+
+from moon_manager.plugins.moon_openstack_plugin import *
+
+LOGGER = logging.getLogger("moon.manager.plugins.moon_nova_plugin")
+
+PLUGIN_TYPE = "information"
+_ = str
+
+# Nova exceptions
+
+
+class NovaError(MoonError):
+ description = _("There is an error connecting to Nova.")
+ code = 400
+ title = 'Nova error'
+ logger = "ERROR"
+
+
+class NovaProjectError(NovaError):
+ description = _("There is an error retrieving projects from the Nova service.")
+ code = 400
+ title = 'Nova project error'
+ logger = "ERROR"
+
+
+class NovaUserError(NovaError):
+ description = _("There is an error retrieving users from the Nova service.")
+ code = 400
+ title = 'Nova user error'
+ logger = "ERROR"
+
+
+class NovaUserConflict(NovaUserError):
+ description = _("A user with that name already exist.")
+ code = 400
+ title = 'Nova user error'
+ logger = "ERROR"
+
+
+class NovaConnector(OpenStackConnector):
+
+ def get_items(self, item_id=None, **kwargs):
+ return self._get(endpoint="/servers", _exception=NovaProjectError)
+
+ def add_item(self, object_id=None, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+ def update_item(self, item_id, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_item(self, item_id, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+
+class Connector(NovaConnector):
+ pass
diff --git a/moon_manager/moon_manager/plugins/moon_openstack_plugin.py b/moon_manager/moon_manager/plugins/moon_openstack_plugin.py
new file mode 100644
index 00000000..a4b8a237
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/moon_openstack_plugin.py
@@ -0,0 +1,203 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Abstract plugin to request OpenStack infrastructure
+"""
+
+import json
+import logging
+import time
+import requests
+from moon_manager.pip_driver import InformationDriver
+from moon_manager.api.configuration import get_configuration
+from moon_utilities.exceptions import MoonError
+
+LOGGER = logging.getLogger("moon.manager.plugins.moon_openstack_plugin")
+
+PLUGIN_TYPE = "information"
+_ = str
+
+
+# Keystone exceptions
+
+
+class KeystoneError(MoonError):
+ description = _("There is an error connecting to Keystone.")
+ code = 400
+ title = 'Keystone error'
+ logger = "ERROR"
+
+
+class KeystoneProjectError(KeystoneError):
+ description = _("There is an error retrieving projects from the Keystone service.")
+ code = 400
+ title = 'Keystone project error'
+ logger = "ERROR"
+
+
+class KeystoneUserError(KeystoneError):
+ description = _("There is an error retrieving users from the Keystone service.")
+ code = 400
+ title = 'Keystone user error'
+ logger = "ERROR"
+
+
+class KeystoneUserConflict(KeystoneUserError):
+ description = _("A user with that name already exist.")
+ code = 400
+ title = 'Keystone user error'
+ logger = "ERROR"
+
+
+class OpenStackConnector(InformationDriver):
+
+ def __init__(self, driver_name, engine_name, conf):
+ self.driver_name = driver_name
+ self.engine_name = engine_name
+ self.opst_conf = get_configuration("information")
+
+ if not self.opst_conf:
+ raise Exception("Cannot find OpenStack configuration in configuration file")
+
+ self.__headers = {}
+ self.__user = conf.get("user", self.opst_conf['user'])
+ self.__password = conf.get("password", self.opst_conf['password'])
+ self.__domain = conf.get("domain", self.opst_conf['domain'])
+ self.__project = conf.get("project", self.opst_conf['project'])
+ self.__url = conf.get("url", self.opst_conf['url'])
+
+ def set_auth(self, **kwargs):
+ start_time = time.time()
+ user = kwargs.get("user", self.opst_conf['user'])
+ password = kwargs.get("password", self.opst_conf['password'])
+ domain = kwargs.get("domain", self.opst_conf['domain'])
+ project = kwargs.get("project", self.opst_conf['project'])
+ url = kwargs.get("url", self.opst_conf['url'])
+ headers = {
+ "Content-Type": "application/json"
+ }
+ data_auth = {
+ "auth": {
+ "identity": {
+ "methods": [
+ "password"
+ ],
+ "password": {
+ "user": {
+ "domain": {
+ "id": domain
+ },
+ "name": user,
+ "password": password
+ }
+ }
+ },
+ "scope": {
+ "project": {
+ "domain": {
+ "id": domain
+ },
+ "name": project
+ }
+ }
+ }
+ }
+
+ while True:
+ req = requests.post("{}/auth/tokens".format(url),
+ json=data_auth, headers=headers,
+ verify=kwargs.get("certificate", self.opst_conf['certificate']))
+
+ if req.status_code in (200, 201, 204):
+ self.__headers['X-Auth-Token'] = req.headers['X-Subject-Token']
+ return self.__headers
+ LOGGER.warning("Waiting for Keystone...")
+ if time.time() - start_time == 100:
+ LOGGER.error(req.text)
+ raise KeystoneError
+ time.sleep(5)
+
+ def unset_auth(self, **kwargs):
+ url = kwargs.get("url", self.opst_conf['url'])
+ self.__headers['X-Subject-Token'] = self.__headers['X-Auth-Token']
+ req = requests.delete("{}/auth/tokens".format(url), headers=self.__headers,
+ verify=kwargs.get("certificate", self.opst_conf['certificate']))
+ if req.status_code in (200, 201, 204):
+ return
+ LOGGER.error(req.text)
+ raise KeystoneError
+
+ def _get(self, endpoint, url=None, _exception=KeystoneError):
+ if not url:
+ if not self.__url:
+ LOGGER.warning("Cannot retrieve the URL for the OpenStack endpoint")
+ return {'users': []}
+ url = self.__url
+
+ req = requests.get("{}{}".format(url, endpoint),
+ headers=self.__headers)
+ if req.status_code not in (200, 201):
+ LOGGER.error(req.text)
+ raise _exception
+ data = req.json()
+ return data
+
+ def _post(self, endpoint, url=None, data=None, _exception=KeystoneError):
+ if not url:
+ if not self.__url:
+ LOGGER.warning("Cannot retrieve the URL for the OpenStack endpoint")
+ return {'users': []}
+ url = self.__url
+
+ req = requests.post("{}{}".format(url, endpoint),
+ data=json.dumps(data),
+ headers=self.__headers)
+ if req.status_code == 409:
+ LOGGER.warning(req.text)
+ raise KeystoneUserConflict
+ if req.status_code not in (200, 201):
+ LOGGER.error(req.text)
+ raise _exception
+ data = req.json()
+ return data
+
+ def create_project(self, **tenant_dict):
+ if "name" not in tenant_dict:
+ raise KeystoneProjectError("Cannot get the project name.")
+ _project = {
+ "project": {
+ "description": tenant_dict['description'],
+ "domain_id": tenant_dict['domain'],
+ "enabled": tenant_dict['enabled'],
+ "is_domain": tenant_dict['is_domain'],
+ "name": tenant_dict['name']
+ }
+ }
+ return self._post(endpoint="/projects/",
+ url=self.opst_conf["url"],
+ data=_project,
+ _exception=KeystoneProjectError)
+
+ def get_projects(self):
+ return self._get(endpoint="/projects/", url=self.opst_conf["url"], _exception=KeystoneProjectError)
+
+ def get_items(self, item_id=None, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+ def add_item(self, item_id=None, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+ def update_item(self, item_id, **kwargs):
+ raise NotImplementedError() # pragma: no cover
+
+ def delete_item(self, item_id, **kwargs):
+ raise NotImplementedError() # pragma: no cover
diff --git a/moon_manager/moon_manager/plugins/pyorchestrator.py b/moon_manager/moon_manager/plugins/pyorchestrator.py
new file mode 100644
index 00000000..736e9144
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/pyorchestrator.py
@@ -0,0 +1,493 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+PyOrchestrator plugin
+"""
+import logging
+import os
+import time
+import subprocess # nosec
+from uuid import uuid4
+import requests
+import yaml
+from moon_manager.orchestration_driver import SlaveDriver
+from moon_manager.orchestration_driver import PipelineDriver
+from moon_manager import db_driver
+from moon_manager.api.configuration import get_configuration
+from moon_utilities.auth_functions import get_api_key_for_user, xor_decode
+from moon_utilities import exceptions
+from datetime import datetime
+
+LOGGER = logging.getLogger("moon.manager.orchestrator.driver.pyorchestrator")
+
+PLUGIN_TYPE = "orchestration"
+WRAPPERS = {}
+PORTS = []
+
+
+def init():
+ """
+ Initialize the plugin by initializing wrappers
+ :return: nothing
+ """
+
+ slaves = db_driver.SlaveManager.get_slaves(moon_user_id="admin")
+ # TODO: check if server with UUID is not already up and running
+ for _slave in slaves:
+ LOGGER.info("testing PDP {}".format(_slave))
+ if _slave not in WRAPPERS:
+ start_new_server(_slave, slaves[_slave])
+
+
+def create_gunicorn_config(host, port, uuid):
+ """
+ Create a Gunicorn config file in a temporary directory
+ :return: filename
+ """
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ # (/tmp is a fallback solution)
+ filename = os.path.join(config_dir, "gunicorn_{}.cfg".format(uuid))
+ file_descriptor = open(filename, "w")
+ file_descriptor.write("""bind = "{host}:{port}"
+workers = {workers}
+moon = "{moon_filename}"
+ """.format(
+ host=host,
+ port=port,
+ workers=1,
+ moon_filename=os.path.join(config_dir, "moon_{}.yaml".format(uuid)),
+ ))
+ file_descriptor.close()
+ return filename
+
+
+def create_moon_config(uuid, data):
+ """
+ Create a Gunicorn config file in a temporary directory
+ :return: filename
+ """
+ _log_config = get_configuration("logging")
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ # (/tmp is a fallback solution)
+ _log_config["handlers"]["file"]["filename"] = os.path.join(config_dir,
+ "moon_{}.log".format(uuid))
+ __manager_url = get_configuration("management")["url"]
+ api_token = get_api_key_for_user(get_configuration("management")["user"])
+ filename = os.path.join(config_dir, "moon_{}.yaml".format(uuid))
+ pwd_file = os.path.join(get_configuration("orchestration")["config_dir"],
+ "db_{}.json".format(uuid))
+ config_dict = {
+ "type": "wrapper",
+ "uuid": str(uuid),
+ "management": {
+ "url": __manager_url,
+ "user": get_configuration("management")["user"],
+ "password": get_configuration("management")["password"],
+ "token_file": pwd_file
+ },
+ "incremental_updates": False,
+ "api_token": api_token,
+ "data": "",
+ "logging": _log_config,
+ "orchestration": {
+ "driver": "moon_engine.plugins.pyorchestrator",
+ "connection": "local",
+ "port": "20000...20100",
+ "config_dir": config_dir
+ },
+ "authorization": {"driver": "moon_engine.plugins.authz"},
+ "plugins": {"directory": get_configuration("plugins")["directory"]},
+ "debug": get_configuration(key='debug', default=False),
+ "grant_if_unknown_project": data.get("grant_if_unknown_project")
+ }
+ LOGGER.info("Writing config file to {}".format(filename))
+ yaml.dump(config_dict, open(filename, "w"), default_flow_style=False)
+ return filename
+
+
+def kill_server(uuid):
+ """
+ Kill the server given its UUID
+ :param uuid: UUID of the server
+ :return: nothing
+ """
+ if uuid in WRAPPERS:
+ LOGGER.info("Killing server {} after {} of uptime".format(
+ uuid, str(datetime.now() - datetime.fromtimestamp(WRAPPERS[uuid]["starttime"]))
+ ))
+ with open(WRAPPERS[uuid]["process"], 'r') as pid_file:
+ try:
+ pid = int(pid_file.read())
+ except ValueError:
+ LOGGER.error("The pid found in {} is not valid".format(WRAPPERS[uuid]["process"]))
+ return
+
+ os.kill(pid, 15)
+ del_server_port(WRAPPERS[uuid]["port"])
+ WRAPPERS.pop(uuid)
+ else:
+ LOGGER.warning("Cannot find UUID {} in wrappers or interfaces".format(uuid))
+
+
+def get_ports_range():
+ """
+ Get the range inside we can create new server
+ :return: (port_min, port_max)
+ """
+ ports_range = get_configuration("orchestration")["port"]
+ return int(ports_range.split(".")[0]), int(ports_range.split(".")[-1])
+
+
+def get_next_port(server_host="127.0.0.1"):
+ """
+ Check the next free TCP port for this host
+ :param server_host: the server host
+ :return: a TCP port (int)
+ """
+ port_min, port_max = get_ports_range()
+ _port = port_min
+ _ports = []
+ for _wrapper in WRAPPERS:
+ _ports.append(WRAPPERS[_wrapper]["port"])
+ _ports.sort()
+ if not _ports:
+ _port = port_min
+ elif _ports[-1] + 1 > port_max:
+ raise Exception(
+ "Cannot add a new slave because "
+ "the port range is bounded to {}".format(port_max))
+ while True:
+ if _port in _ports:
+ _port += 1
+ continue
+ try:
+ requests.get("http://{}:{}/status".format(server_host, _port), timeout=1)
+ except requests.exceptions.ConnectionError:
+ break
+ if _port > port_max:
+ raise Exception(
+ "Cannot add a new slave because "
+ "the port range is bounded to {}".format(port_max))
+ _port += 1
+ return _port
+
+
+def add_server_port(port):
+ """
+ Append the server port in cache
+ :param port: TCP port
+ :return: None
+ """
+ PORTS.append(port)
+
+
+def del_server_port(port):
+ """
+ Delete the server port in cache
+ :param port: TCP port
+ :return: None
+ """
+ try:
+ PORTS.remove(port)
+ except ValueError:
+ LOGGER.warning("port {} is not in the known port".format(port))
+
+
+def get_server_url(uuid=None):
+ """
+ Retrieve the server URL for this Slave ID
+ If no server can be found, return None
+ :param uuid: slave ID
+ :return: a URL or None
+ """
+ if not uuid:
+ return
+ url = ""
+ try:
+ if uuid in WRAPPERS:
+ url = "http://{}:{}".format(WRAPPERS[uuid]["server_ip"],
+ WRAPPERS[uuid]["port"])
+ LOGGER.debug(f"url in get_server_url '{url}'")
+ if url:
+ response = requests.get(url + "/status")
+ if response.status_code == 200:
+ return url
+ except TimeoutError as _exception:
+ LOGGER.warning("A timeout occurred when connecting to {}".format(url))
+ # if port has not be found in local data, try to get information from remote servers
+ port_min, port_max = get_ports_range()
+ # FIXME: all servers may be not on localhost
+ host = "127.0.0.1"
+ LOGGER.debug(f"Go search through slaves")
+ for _port in range(port_min, port_max):
+ try:
+ req = requests.get("http://{}:{}/status".format(host, _port), timeout=1)
+ data = req.json()
+ if "status" in data and data["status"]["uuid"] == uuid:
+ return "http://{}:{}".format(host, _port)
+ except Exception as _exception:
+ LOGGER.warning("Error getting information from {}:{} ({})".format(host, _port, str(_exception)))
+ return
+
+
+def start_new_server(uuid, data):
+ """Start a new server in a new process
+
+ :param uuid: UUID of the server
+ :param data: data of the server
+ :return: nothing
+ """
+ _url = get_server_url(uuid)
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ # (/tmp is a fallback solution)
+ config_filename = os.path.join(config_dir, "moon_{}.yaml".format(uuid))
+ # FIXME: maybe the server is not on the 127.0.0.1
+ server_ip = "127.0.0.1"
+ LOGGER.info("Starting server {} {}".format(_url, uuid))
+ # debug = get_configuration("debug", False)
+ if _url:
+ _port = int(_url.split(":")[-1])
+ add_server_port(_port)
+ WRAPPERS[uuid] = {
+ "starttime": data["extra"].get("starttime"),
+ "port": _port,
+ "server_ip": server_ip,
+ "name": data.get("name"),
+ "status": "up",
+ "process": data.get("process"),
+ "api_key": data.get("api_key"),
+ "log": data.get("log")
+ }
+ else:
+ _port = get_next_port()
+ pid_file = os.path.join(config_dir, uuid + ".pid")
+ # NOTE: we have actually no solution to get the actual IP address
+ # so we need to put 0.0.0.0 in the host address
+ gunicorn_config = create_gunicorn_config(host="0.0.0.0", # nosec
+ port=_port,
+ uuid=uuid)
+ create_moon_config(uuid=uuid, data=data)
+ _command = ["gunicorn", "moon_engine.server:__hug_wsgi__", "--threads", "10",
+ "--log-level", "debug", "--log-file", gunicorn_config.replace("cfg", "log"),
+ "-p", pid_file, "-c", gunicorn_config]
+ LOGGER.info("command: {}".format(" ".join(_command)))
+ WRAPPERS[uuid] = {
+ "starttime": time.time(),
+ "port": _port,
+ "server_ip": server_ip,
+ "name": data.get("name"),
+ "status": "down",
+ "process": pid_file,
+ }
+ subprocess.Popen(_command, stdout=subprocess.PIPE, close_fds=True) # nosec
+ # Note: wait the process creation
+ time.sleep(1)
+ config = yaml.safe_load(open(config_filename))
+ log_file = config["logging"]["handlers"]["file"]["filename"]
+ WRAPPERS[uuid]["log"] = log_file
+ for cpt in range(10):
+ try:
+ f_sock = open(log_file)
+ except FileNotFoundError:
+ time.sleep(1)
+ else:
+ break
+ else:
+ LOGGER.error("Cannot find log file ({})".format(log_file))
+ return
+ p_sock = 0
+ LOGGER.info("Process running")
+ WRAPPERS[uuid]["status"] = "up"
+ while True:
+ f_sock.seek(p_sock)
+ latest_data = f_sock.read()
+ p_sock = f_sock.tell()
+ if latest_data and "APIKEY" in latest_data:
+ _index_start = latest_data.index("APIKEY=") + len("APIKEY=")
+ _index_stop = latest_data.index("\n", _index_start)
+ key = latest_data[_index_start:_index_stop].strip()
+ api_key = get_api_key_for_user("admin")
+ try:
+ engine_api_key = xor_decode(key, api_key)
+ LOGGER.info(f"key={key}")
+ LOGGER.info(f"engine_api_key={engine_api_key}")
+ except exceptions.DecryptError:
+ engine_api_key = False
+ WRAPPERS[uuid]["api_key"] = engine_api_key
+ break
+ time.sleep(1)
+
+
+class SlaveConnector(SlaveDriver):
+ """
+ Connector to Slave API
+ """
+
+ def __init__(self, driver_name, engine_name):
+ self.driver_name = driver_name
+ self.engine_name = engine_name
+
+ def update_slave(self, slave_id, value):
+ LOGGER.info("Updating the slave {} with {}".format(slave_id, value))
+ slave_url = WRAPPERS[slave_id]['server_ip']
+ slave_port = WRAPPERS[slave_id]['port']
+
+ config_dir = get_configuration("orchestration").get("config_dir", "/tmp") # nosec
+ config_filename = os.path.join(config_dir, "moon_{}.yaml".format(slave_id))
+
+ conf = yaml.safe_load(open(config_filename, 'r'))
+ for key in value:
+ if key in conf:
+ conf[key] = value[key]
+
+ os.remove(config_filename)
+ yaml.dump(conf, open(config_filename, "w"), default_flow_style=False)
+
+ req = requests.put("http://{}:{}/update".format(slave_url, slave_port),
+ headers={"x-api-key": WRAPPERS[slave_id]["api_key"]})
+ return req
+
+ def delete_slave(self, slave_id):
+ LOGGER.info("Deleting slave {}".format(slave_id))
+ kill_server(slave_id)
+
+ def add_slave(self, slave_id=None, data=None):
+ LOGGER.info("Adding slave {} {}".format(slave_id, data))
+ if not slave_id:
+ slave_id = uuid4().hex
+ start_new_server(slave_id, data)
+ return WRAPPERS[slave_id]
+
+ def get_slaves(self, slave_id=None):
+ LOGGER.info("Get slaves {}".format(WRAPPERS))
+ results = {}
+ for wrapper in WRAPPERS:
+ results[wrapper] = {
+ "starttime": WRAPPERS[wrapper]["starttime"],
+ "port": WRAPPERS[wrapper]["port"],
+ "server_ip": WRAPPERS[wrapper]["server_ip"],
+ "name": WRAPPERS[wrapper]["name"],
+ "status": "down",
+ "log": WRAPPERS[wrapper]["log"]
+ }
+ try:
+ req = requests.get("http://{}:{}/status".format(
+ WRAPPERS[wrapper]["server_ip"],
+ WRAPPERS[wrapper]["port"]
+ ))
+ if req.status_code == 200:
+ results[wrapper]["status"] = "up"
+ else:
+ results[wrapper]["status"] = "down"
+ LOGGER.info("get_slaves: {} {} {}".format(
+ slave_id, req.status_code, results[wrapper]["status"]))
+ except TimeoutError:
+ LOGGER.warning("Timeout connecting {} on port {}".format(
+ WRAPPERS[wrapper]["server_ip"],
+ WRAPPERS[wrapper]["port"]
+ ))
+ except requests.exceptions.ConnectionError:
+ results[wrapper]["status"] = "down"
+ return results
+
+
+class PipelineConnector(PipelineDriver):
+ """
+ Connector to Pipeline API
+ """
+
+ def __init__(self, driver_name, engine_name):
+ self.driver_name = driver_name
+ self.engine_name = engine_name
+
+ def update_pipeline(self, pipeline_id, data):
+ for _wrapper in WRAPPERS:
+ _url = get_server_url(_wrapper)
+ req = requests.put("{}/update/pdp/{}".format(_url, pipeline_id),
+ headers={"x-api-key": WRAPPERS[_wrapper]["api_key"]},
+ json=data)
+ if req.status_code == 206:
+ LOGGER.warning("No pipeline available...")
+ elif req.status_code != 202:
+ LOGGER.warning("Error sending upgrade command to pipeline ({})".format(req.text))
+
+ def delete_pipeline(self, pipeline_id):
+ LOGGER.info("Deleting pipeline {}".format(pipeline_id))
+ for _wrapper in WRAPPERS:
+ if WRAPPERS[_wrapper]['status'] == "down":
+ continue
+ # FIXME: we should manage https here
+ _url = "http://{}:{}".format(WRAPPERS[_wrapper]['server_ip'],
+ WRAPPERS[_wrapper]['port'])
+ req = requests.delete("{}/pipeline/{}".format(_url, pipeline_id),
+ headers={"x-api-key": WRAPPERS[_wrapper]["api_key"]})
+ LOGGER.info("{}/pipeline/{}".format(_url, pipeline_id))
+ if req.status_code != 200:
+ LOGGER.error("Cannot delete the pipeline in slave {} ({}, {})".format(
+ _wrapper, req.status_code, req.content))
+ # FIXME: make a request to the correct wrapper
+
+ def add_pipeline(self, pipeline_id=None, data=None):
+ LOGGER.info("Adding POD in manager {} {}".format(pipeline_id, data))
+ if not pipeline_id:
+ pipeline_id = uuid4().hex
+ slaves = data.get("slaves", [])
+ pipelines = []
+ for _wrapper in WRAPPERS:
+ if slaves and (WRAPPERS[_wrapper]['name'] not in slaves):
+ continue
+ # FIXME: we should manage https here
+ _url = "http://{}:{}".format(WRAPPERS[_wrapper]['server_ip'],
+ WRAPPERS[_wrapper]['port'])
+ req = requests.put("{}/pipeline/{}".format(_url, pipeline_id), json=data,
+ headers={"x-api-key": WRAPPERS[_wrapper]['api_key']})
+ if req.status_code != 200:
+ LOGGER.error("Cannot create a new pipeline ({}, {})".format(req.status_code,
+ req.content))
+ elif "pipelines" not in req.json():
+ LOGGER.error("Cannot create a new pipeline ({}, {})".format(req.status_code,
+ req.content))
+ else:
+ pipelines.append(req.json())
+ LOGGER.info("Pipeline created {}".format(pipelines))
+ return pipelines
+ # FIXME: make a request to the correct wrapper
+
+ def get_pipelines(self, slave_id=None, pipeline_id=None):
+ results = {}
+ for _wrapper in WRAPPERS:
+ if slave_id and _wrapper != slave_id:
+ continue
+ if WRAPPERS[_wrapper]['status'] == "down":
+ continue
+ results[_wrapper] = {}
+ # FIXME: we should manage https here
+ _url = "http://{}:{}".format(WRAPPERS[_wrapper]['server_ip'],
+ WRAPPERS[_wrapper]['port'])
+ req = requests.get("{}/pipelines".format(_url),
+ headers={"x-api-key": WRAPPERS[_wrapper]['api_key']})
+ if req.status_code != 200:
+ LOGGER.error("Cannot get information for slave {} ({}, {})".format(
+ _wrapper, req.status_code, req.content))
+ else:
+ # FIXME: filter on pipeline_id
+ results[_wrapper] = req.json()
+ return results
+
+
+class Connector(SlaveConnector, PipelineConnector):
+ """
+ General connector to get all APIs in one endpoint
+ """
+
+ def __init__(self, *args, **kwargs):
+ init()
diff --git a/moon_manager/moon_manager/plugins/sql.py b/moon_manager/moon_manager/plugins/sql.py
new file mode 100644
index 00000000..de850a5c
--- /dev/null
+++ b/moon_manager/moon_manager/plugins/sql.py
@@ -0,0 +1,2085 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import copy
+import json
+import logging
+from contextlib import contextmanager
+from uuid import uuid4
+
+import sqlalchemy
+import sqlalchemy as sql
+from moon_manager.api import configuration
+from moon_manager.db_driver import PDPDriver, PolicyDriver, ModelDriver, SlaveDriver
+from moon_utilities import exceptions
+from sqlalchemy import create_engine
+from sqlalchemy import types as sql_types
+from sqlalchemy.ext.declarative import declarative_base, declared_attr
+from sqlalchemy.orm import sessionmaker
+
+logger = logging.getLogger("moon.manager.db.driver.sql")
+
+PLUGIN_TYPE = "db"
+
+Base = declarative_base()
+DEBUG = True if configuration.get_configuration(
+ "logging")['loggers']['moon']['level'] == "DEBUG" else False
+
+
+class DictBase:
+ attributes = []
+
+ @classmethod
+ def from_dict(cls, d):
+ new_d = d.copy()
+ return cls(**new_d)
+ # new_d = d.copy()
+ #
+ # new_d['extra'] = {k: new_d.pop(k) for k in six.iterkeys(d)
+ # if k not in cls.attributes and k != 'extra'}
+ #
+ # return cls(**new_d)
+
+ def to_dict(self):
+ d = dict()
+ for attr in self.__class__.attributes:
+ d[attr] = getattr(self, attr)
+ return d
+
+ def __getitem__(self, key):
+ # if "extra" in dir(self) and key in self.extra:
+ # return self.extra[key]
+ return getattr(self, key)
+
+
+class JsonBlob(sql_types.TypeDecorator):
+ impl = sql.Text
+
+ def process_bind_param(self, value, dialect):
+ return json.dumps(value)
+
+ def process_result_value(self, value, dialect):
+ return json.loads(value)
+
+
+class Model(Base, DictBase):
+ __tablename__ = 'models'
+ attributes = ['id', 'name', 'value']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ value = sql.Column(JsonBlob(), nullable=True)
+
+ def to_dict(self):
+ return {
+ "name": self.name,
+ "description": self.value.get("description", ""),
+ "meta_rules": self.value.get("meta_rules", list()),
+ }
+
+
+class Policy(Base, DictBase):
+ __tablename__ = 'policies'
+ attributes = ['id', 'name', 'model_id', 'value']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ model_id = sql.Column(sql.String(64), nullable=True, default="")
+ value = sql.Column(JsonBlob(), nullable=True)
+
+ def to_dict(self):
+ return {
+ "description": self.value.get("description", ""),
+ "genre": self.value.get("genre", ""),
+ "model_id": self.model_id,
+ "name": self.name
+ }
+
+
+class PDP(Base, DictBase):
+ __tablename__ = 'pdp'
+ attributes = ['id', 'name', 'vim_project_id', 'value']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ vim_project_id = sql.Column(sql.String(64), nullable=True, default="")
+ value = sql.Column(JsonBlob(), nullable=True)
+
+ def to_dict(self):
+ return {
+ "name": self.name,
+ "description": self.value.get("description", ""),
+ "vim_project_id": self.vim_project_id,
+ "security_pipeline": self.value.get("security_pipeline", []),
+ }
+
+
+class Slave(Base, DictBase):
+ __tablename__ = 'slaves'
+ attributes = ['id', 'name', 'address', 'process', 'log', 'api_key', 'value']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ address = sql.Column(sql.String(256), nullable=True, default="")
+ process = sql.Column(sql.String(256), nullable=False, default="")
+ log = sql.Column(sql.String(256), nullable=False, default="")
+ api_key = sql.Column(sql.String(256), nullable=False, default="")
+ value = sql.Column(JsonBlob(), nullable=True)
+ grant_if_unknown_project = sql.Column(sql.Boolean(), nullable=False, default=True)
+
+ def to_dict(self):
+ return {
+ "name": self.name,
+ "address": self.address,
+ "description": self.value.get("description", ""),
+ "grant_if_unknown_project": self.grant_if_unknown_project,
+ "process": self.process,
+ "log": self.log,
+ "api_key": self.api_key,
+ "extra": self.value
+ }
+
+
+class PerimeterCategoryBase(DictBase):
+ attributes = ['id', 'name', 'description']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ description = sql.Column(sql.String(256), nullable=True)
+
+
+class SubjectCategory(Base, PerimeterCategoryBase):
+ __tablename__ = 'subject_categories'
+
+
+class ObjectCategory(Base, PerimeterCategoryBase):
+ __tablename__ = 'object_categories'
+
+
+class ActionCategory(Base, PerimeterCategoryBase):
+ __tablename__ = 'action_categories'
+
+
+class PerimeterBase(DictBase):
+ attributes = ['id', 'name', 'value']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ value = sql.Column(JsonBlob(), nullable=True)
+ __mapper_args__ = {'concrete': True}
+
+ def __repr__(self):
+ return "{} with name {} : {}".format(self.id, self.name, json.dumps(self.value))
+
+ def to_return(self):
+ return {
+ 'id': self.id,
+ 'name': self.name,
+ 'description': self.value.get("description", ""),
+ 'email': self.value.get("email", ""),
+ 'extra': self.value.get("extra", dict()),
+ 'policy_list': self.value.get("policy_list", [])
+ }
+
+ def to_dict(self):
+ dict_value = copy.deepcopy(self.value)
+ dict_value["name"] = self.name
+ return {
+ 'id': self.id,
+ 'value': dict_value
+ }
+
+
+class Subject(Base, PerimeterBase):
+ __tablename__ = 'subjects'
+
+
+class Object(Base, PerimeterBase):
+ __tablename__ = 'objects'
+
+
+class Action(Base, PerimeterBase):
+ __tablename__ = 'actions'
+
+
+class PerimeterDataBase(DictBase):
+ attributes = ['id', 'name', 'value', 'category_id', 'policy_id']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ value = sql.Column(JsonBlob(), nullable=True)
+
+ @declared_attr
+ def policy_id(cls):
+ return sql.Column(sql.ForeignKey("policies.id"), nullable=False)
+
+ def to_dict(self):
+ return {
+ 'id': self.id,
+ 'name': self.name,
+ 'description': self.value.get("description", ""),
+ 'category_id': self.category_id,
+ 'policy_id': self.policy_id
+ }
+
+
+class SubjectData(Base, PerimeterDataBase):
+ __tablename__ = 'subject_data'
+ category_id = sql.Column(sql.ForeignKey("subject_categories.id"), nullable=False)
+
+
+class ObjectData(Base, PerimeterDataBase):
+ __tablename__ = 'object_data'
+ category_id = sql.Column(sql.ForeignKey("object_categories.id"), nullable=False)
+
+
+class ActionData(Base, PerimeterDataBase):
+ __tablename__ = 'action_data'
+ category_id = sql.Column(sql.ForeignKey("action_categories.id"), nullable=False)
+
+
+class PerimeterAssignmentBase(DictBase):
+ attributes = ['id', 'assignments', 'policy_id', 'subject_id', 'category_id']
+ id = sql.Column(sql.String(64), primary_key=True)
+ assignments = sql.Column(JsonBlob(), nullable=True)
+ category_id = None
+
+ @declared_attr
+ def policy_id(cls):
+ return sql.Column(sql.ForeignKey("policies.id"), nullable=False)
+
+ def _to_dict(self, element_key, element_value):
+ return {
+ "id": self.id,
+ "policy_id": self.policy_id,
+ element_key: element_value,
+ "category_id": self.category_id,
+ "assignments": self.assignments,
+ }
+
+
+class SubjectAssignment(Base, PerimeterAssignmentBase):
+ __tablename__ = 'subject_assignments'
+ subject_id = sql.Column(sql.ForeignKey("subjects.id"), nullable=False)
+ category_id = sql.Column(sql.ForeignKey("subject_categories.id"), nullable=False)
+
+ def to_dict(self):
+ return self._to_dict("subject_id", self.subject_id)
+
+
+class ObjectAssignment(Base, PerimeterAssignmentBase):
+ __tablename__ = 'object_assignments'
+ attributes = ['id', 'assignments', 'policy_id', 'object_id', 'category_id']
+ object_id = sql.Column(sql.ForeignKey("objects.id"), nullable=False)
+ category_id = sql.Column(sql.ForeignKey("object_categories.id"), nullable=False)
+
+ def to_dict(self):
+ return self._to_dict("object_id", self.object_id)
+
+
+class ActionAssignment(Base, PerimeterAssignmentBase):
+ __tablename__ = 'action_assignments'
+ attributes = ['id', 'assignments', 'policy_id', 'action_id', 'category_id']
+ action_id = sql.Column(sql.ForeignKey("actions.id"), nullable=False)
+ category_id = sql.Column(sql.ForeignKey("action_categories.id"), nullable=False)
+
+ def to_dict(self):
+ return self._to_dict("action_id", self.action_id)
+
+
+class MetaRule(Base, DictBase):
+ __tablename__ = 'meta_rules'
+ attributes = ['id', 'name', 'subject_categories', 'object_categories', 'action_categories',
+ 'value']
+ id = sql.Column(sql.String(64), primary_key=True)
+ name = sql.Column(sql.String(256), nullable=False)
+ subject_categories = sql.Column(JsonBlob(), nullable=True)
+ object_categories = sql.Column(JsonBlob(), nullable=True)
+ action_categories = sql.Column(JsonBlob(), nullable=True)
+ value = sql.Column(JsonBlob(), nullable=True)
+
+ def to_dict(self):
+ return {
+ "name": self.name,
+ "description": self.value.get("description", ""),
+ "subject_categories": self.subject_categories,
+ "object_categories": self.object_categories,
+ "action_categories": self.action_categories,
+ }
+
+
+class Rule(Base, DictBase):
+ __tablename__ = 'rules'
+ attributes = ['id', 'rule', 'policy_id', 'meta_rule_id']
+ id = sql.Column(sql.String(64), primary_key=True)
+ rule = sql.Column(JsonBlob(), nullable=True)
+ policy_id = sql.Column(sql.ForeignKey("policies.id"), nullable=False)
+ meta_rule_id = sql.Column(sql.ForeignKey("meta_rules.id"), nullable=False)
+
+ def to_dict(self):
+ return {
+ 'id': self.id,
+ 'rule': self.rule["rule"],
+ 'instructions': self.rule["instructions"],
+ 'enabled': self.rule["enabled"],
+ 'policy_id': self.policy_id,
+ 'meta_rule_id': self.meta_rule_id
+ }
+
+ def __repr__(self):
+ return "{}".format(self.rule)
+
+
+@contextmanager
+def session_scope(engine):
+ """Provide a transactional scope around a series of operations."""
+ if type(engine) is str:
+ echo = DEBUG
+ engine = create_engine(engine, echo=echo)
+ session = sessionmaker(bind=engine)()
+ try:
+ yield session
+ session.commit()
+ except:
+ session.rollback()
+ raise
+ finally:
+ session.close()
+
+
+class BaseConnector(object):
+ """Provide a base connector to connect them all"""
+ engine = ""
+
+ def __init__(self, engine_name):
+ echo = DEBUG
+ self.engine = create_engine(engine_name, echo=echo)
+
+ def init_db(self):
+ Base.metadata.create_all(self.engine)
+
+ def set_engine(self, engine_name):
+ self.engine = engine_name
+
+ def get_session(self):
+ return session_scope(self.engine)
+
+ def get_session_for_read(self):
+ return self.get_session()
+
+ def get_session_for_write(self):
+ return self.get_session()
+
+
+class PDPConnector(BaseConnector, PDPDriver):
+
+ def update_pdp(self, pdp_id, value):
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(PDP)
+ query = query.filter_by(id=pdp_id)
+ ref = query.first()
+ if ref:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ value_wo_name.pop("vim_project_id", None)
+ ref.name = value["name"]
+ ref.vim_project_id = value.get("vim_project_id", "")
+ d = dict(ref.value)
+ d.update(value_wo_name)
+ setattr(ref, "value", d)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PdpExisting
+ raise error
+
+ def delete_policy_from_pdp(self, pdp_id, policy_id):
+ with self.get_session_for_write() as session:
+ ref = session.query(PDP).get(pdp_id)
+ if ref:
+ if policy_id in ref.value['security_pipeline']:
+ __value = copy.deepcopy(ref.value)
+ __value['security_pipeline'].remove(policy_id)
+ setattr(ref, "value", __value)
+ return {ref.id: ref.to_dict()}
+ return {}
+
+ def delete_pdp(self, pdp_id):
+ with self.get_session_for_write() as session:
+ ref = session.query(PDP).get(pdp_id)
+ session.delete(ref)
+
+ def add_pdp(self, pdp_id=None, value=None):
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ value_wo_name.pop("vim_project_id", None)
+ new = PDP.from_dict({
+ "id": pdp_id if pdp_id else uuid4().hex,
+ "name": value["name"],
+ "vim_project_id": value["vim_project_id"],
+ "value": value_wo_name
+ })
+ session.add(new)
+ return {new.id: new.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PdpExisting
+ raise error
+
+ def get_pdp(self, pdp_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(PDP)
+ if pdp_id:
+ query = query.filter_by(id=pdp_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+
+class SlaveConnector(BaseConnector, SlaveDriver):
+
+ def update_slave(self, slave_id, value):
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(Slave)
+ query = query.filter_by(id=slave_id)
+ ref = query.first()
+ if ref:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ value_wo_name.pop("address", None)
+ value_wo_name.pop("grant_if_unknown_project", None)
+ # ref.name = value["name"]
+ if 'address' in value:
+ ref.address = value.get("address")
+ if 'grant_if_unknown_project' in value:
+ ref.grant_if_unknown_project = value.get("grant_if_unknown_project")
+ d = dict(ref.value)
+ d.update(value_wo_name)
+ setattr(ref, "value", d)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PdpExisting
+ raise error
+
+ def delete_slave(self, slave_id):
+ with self.get_session_for_write() as session:
+ ref = session.query(Slave).get(slave_id)
+ session.delete(ref)
+
+ def add_slave(self, slave_id=None, value=None):
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ value_wo_name.pop("address", None)
+ value_wo_name.pop("grant_if_unknown_project", None)
+ new = Slave.from_dict({
+ "id": slave_id if slave_id else uuid4().hex,
+ "name": value["name"],
+ "address": value.get("address", ""),
+ "grant_if_unknown_project": value.get("grant_if_unknown_project"),
+ "log": "",
+ "process": "",
+ "api_key": "",
+ "value": value_wo_name
+ })
+ session.add(new)
+ return {new.id: new.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PdpExisting
+ raise error
+
+ def get_slaves(self, slave_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(Slave)
+ if slave_id:
+ query = query.filter_by(id=slave_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+
+class PolicyConnector(BaseConnector, PolicyDriver):
+
+ def update_policy(self, policy_id, value):
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(Policy)
+ query = query.filter_by(id=policy_id)
+ ref = query.first()
+
+ if ref:
+ value_wo_other_info = copy.deepcopy(value)
+ value_wo_other_info.pop("name", None)
+ value_wo_other_info.pop("model_id", None)
+ ref.name = value["name"]
+ ref.model_id = value["model_id"]
+ d = dict(ref.value)
+ d.update(value_wo_other_info)
+ setattr(ref, "value", d)
+ return {ref.id: ref.to_dict()}
+
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PolicyExisting
+ raise error
+
+ def delete_policy(self, policy_id):
+ with self.get_session_for_write() as session:
+ ref = session.query(Policy).get(policy_id)
+ session.delete(ref)
+
+ def add_policy(self, policy_id=None, value=None):
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_other_info = copy.deepcopy(value)
+ value_wo_other_info.pop("name", None)
+ value_wo_other_info.pop("model_id", None)
+ new = Policy.from_dict({
+ "id": policy_id if policy_id else uuid4().hex,
+ "name": value["name"],
+ "model_id": value.get("model_id", ""),
+ "value": value_wo_other_info
+ })
+ session.add(new)
+ return {new.id: new.to_dict()}
+
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PolicyExisting
+ raise error
+
+ def get_policies(self, policy_id=None, policy_name=None):
+ with self.get_session_for_read() as session:
+ query = session.query(Policy)
+ if policy_id:
+ query = query.filter_by(id=policy_id)
+ elif policy_name:
+ query = query.filter_by(name=policy_name)
+
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def __get_perimeters(self, ClassType, policy_id, perimeter_id=None):
+
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+
+ if perimeter_id:
+ query = query.filter_by(id=perimeter_id)
+
+ ref_list = copy.deepcopy(query.all())
+
+ if policy_id:
+ results = []
+ for _ref in ref_list:
+ _ref_value = _ref.to_return()
+ if policy_id in _ref_value["policy_list"]:
+ results.append(_ref)
+ return {_ref.id: _ref.to_return() for _ref in results}
+ return {_ref.id: _ref.to_return() for _ref in ref_list}
+
+ def __get_perimeter_by_name(self, ClassType, perimeter_name):
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ if not perimeter_name or not perimeter_name.strip():
+ raise exceptions.PerimeterContentError('invalid name')
+ query = query.filter_by(name=perimeter_name)
+ ref_list = copy.deepcopy(query.all())
+ return {_ref.id: _ref.to_return() for _ref in ref_list}
+
+ def __update_perimeter(self, class_type, class_type_exception, perimeter_id, value):
+ if not perimeter_id:
+ return exceptions.PerimeterContentError
+ with self.get_session_for_write() as session:
+ query = session.query(class_type)
+ query = query.filter_by(id=perimeter_id)
+ _perimeter = query.first()
+ if not _perimeter:
+ raise class_type_exception
+ temp_perimeter = copy.deepcopy(_perimeter.to_dict())
+ if 'name' in value:
+ temp_perimeter['value']['name'] = value['name']
+ if 'description' in value:
+ temp_perimeter['value']['description'] = value['description']
+ if 'extra' in value:
+ temp_perimeter['value']['extra'] = value['extra']
+ if 'email' in value:
+ temp_perimeter['value']['email'] = value['email']
+ name = temp_perimeter['value']['name']
+ temp_perimeter['value'].pop("name", None)
+ new_perimeter = class_type.from_dict({
+ "id": temp_perimeter["id"],
+ "name": name,
+ "value": temp_perimeter["value"]
+ })
+ _perimeter.value = new_perimeter.value
+ _perimeter.name = new_perimeter.name
+ return {_perimeter.id: _perimeter.to_return()}
+
+ def __set_perimeter(self, ClassType, ClassTypeException, policy_id, perimeter_id=None,
+ value=None):
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+ with self.get_session_for_write() as session:
+ _perimeter = None
+ if perimeter_id:
+ query = session.query(ClassType)
+ query = query.filter_by(id=perimeter_id)
+ _perimeter = query.first()
+ if not perimeter_id and not _perimeter:
+ query = session.query(ClassType)
+ query = query.filter_by(name=value['name'])
+ _perimeter = query.first()
+ if _perimeter:
+ raise ClassTypeException
+ if not _perimeter:
+ value_wo_name = copy.deepcopy(value)
+ if "policy_list" not in value_wo_name or type(
+ value_wo_name["policy_list"]) is not list:
+ value_wo_name["policy_list"] = []
+ if policy_id and policy_id not in value_wo_name["policy_list"]:
+ value_wo_name["policy_list"] = [policy_id, ]
+
+ value_wo_name.pop("name", None)
+ new = ClassType.from_dict({
+ "id": perimeter_id if perimeter_id else uuid4().hex,
+ "name": value["name"],
+ "value": value_wo_name
+ })
+ session.add(new)
+ return {new.id: new.to_return()}
+ else:
+ _value = copy.deepcopy(_perimeter.to_dict())
+ if "policy_list" not in _value["value"] or type(
+ _value["value"]["policy_list"]) is not list:
+ _value["value"]["policy_list"] = []
+ if policy_id and policy_id not in _value["value"]["policy_list"]:
+ _value["value"]["policy_list"].append(policy_id)
+ else:
+ if policy_id:
+ raise exceptions.PolicyExisting
+ raise exceptions.PerimeterContentError
+
+ _value["value"].update(value)
+
+ name = _value["value"]["name"]
+ _value["value"].pop("name")
+ new_perimeter = ClassType.from_dict({
+ "id": _value["id"],
+ "name": name,
+ "value": _value["value"]
+ })
+ _perimeter.value = new_perimeter.value
+ _perimeter.name = new_perimeter.name
+ return {_perimeter.id: _perimeter.to_return()}
+
+ def __delete_perimeter(self, ClassType, ClassUnknownException, policy_id, perimeter_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ClassType)
+ query = query.filter_by(id=perimeter_id)
+ _perimeter = query.first()
+ if not _perimeter:
+ raise ClassUnknownException
+ if not _perimeter.value["policy_list"]:
+ session.delete(_perimeter)
+ else:
+ if not policy_id:
+ raise exceptions.PolicyUnknown
+
+ old_perimeter = copy.deepcopy(_perimeter.to_dict())
+ try:
+ old_perimeter["value"]["policy_list"].remove(policy_id)
+ new_perimeter = ClassType.from_dict(old_perimeter)
+
+
+ # else:
+ # if new_perimeter.value["policy_list"]:
+ setattr(_perimeter, "value", getattr(new_perimeter, "value"))
+ except ValueError:
+ if not _perimeter.value["policy_list"]:
+ session.delete(_perimeter)
+
+ def get_subjects(self, policy_id, perimeter_id=None):
+ return self.__get_perimeters(Subject, policy_id, perimeter_id)
+
+ def get_subject_by_name(self, perimeter_name):
+ return self.__get_perimeter_by_name(Subject, perimeter_name)
+
+ def set_subject(self, policy_id, perimeter_id=None, value=None):
+ try:
+ return self.__set_perimeter(Subject, exceptions.SubjectExisting, policy_id,
+ perimeter_id=perimeter_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.SubjectExisting
+ raise error
+
+ def update_subject(self, perimeter_id, value):
+ try:
+ return self.__update_perimeter(Subject, exceptions.SubjectExisting, perimeter_id, value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.SubjectExisting
+ raise error
+
+ def delete_subject(self, policy_id, perimeter_id):
+ self.__delete_perimeter(Subject, exceptions.SubjectUnknown, policy_id, perimeter_id)
+
+ def get_objects(self, policy_id, perimeter_id=None):
+ return self.__get_perimeters(Object, policy_id, perimeter_id)
+
+ def get_object_by_name(self, perimeter_name):
+ return self.__get_perimeter_by_name(Object, perimeter_name)
+
+ def set_object(self, policy_id, perimeter_id=None, value=None):
+ try:
+ return self.__set_perimeter(Object, exceptions.ObjectExisting, policy_id,
+ perimeter_id=perimeter_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ logger.exception("IntegrityError {}".format(error))
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ObjectExisting
+ raise error
+
+ def update_object(self, perimeter_id, value):
+ try:
+ return self.__update_perimeter(Object, exceptions.ObjectExisting, perimeter_id, value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ObjectExisting
+ raise error
+
+ def delete_object(self, policy_id, perimeter_id):
+ self.__delete_perimeter(Object, exceptions.ObjectUnknown, policy_id, perimeter_id)
+
+ def get_actions(self, policy_id, perimeter_id=None):
+ return self.__get_perimeters(Action, policy_id, perimeter_id)
+
+ def get_action_by_name(self, perimeter_name):
+ return self.__get_perimeter_by_name(Action, perimeter_name)
+
+ def set_action(self, policy_id, perimeter_id=None, value=None):
+ try:
+ return self.__set_perimeter(Action, exceptions.ActionExisting, policy_id,
+ perimeter_id=perimeter_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ActionExisting
+ raise error
+
+ def update_action(self, perimeter_id, value):
+ try:
+ return self.__update_perimeter(Action, exceptions.ActionExisting, perimeter_id, value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ActionExisting
+ raise error
+
+ def delete_action(self, policy_id, perimeter_id):
+ self.__delete_perimeter(Action, exceptions.ActionUnknown, policy_id, perimeter_id)
+
+ def __is_data_exist(self, ClassType, category_id=None):
+
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ query = query.filter_by(category_id=category_id)
+ ref_list = query.all()
+ if ref_list:
+ return True
+ return False
+
+ def __get_data(self, ClassType, policy_id, data_id=None, category_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ if policy_id and data_id and category_id:
+ query = query.filter_by(policy_id=policy_id, id=data_id, category_id=category_id)
+ elif policy_id and category_id:
+ query = query.filter_by(policy_id=policy_id, category_id=category_id)
+ elif category_id:
+ query = query.filter_by(category_id=category_id)
+ elif policy_id:
+ query = query.filter_by(policy_id=policy_id)
+ else:
+ raise exceptions.PolicyUnknown
+
+ ref_list = query.all()
+ return {
+ "policy_id": policy_id,
+ "category_id": category_id,
+ "data": {_ref.id: _ref.to_dict() for _ref in ref_list}
+ }
+
+ def __set_data(self, ClassType, ClassTypeData, policy_id, data_id=None, category_id=None,
+ value=None):
+ with self.get_session_for_write() as session:
+ query = session.query(ClassTypeData)
+ query = query.filter_by(policy_id=policy_id, id=data_id, category_id=category_id)
+ ref = query.first()
+ if not ref:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ new_ref = ClassTypeData.from_dict(
+ {
+ "id": data_id if data_id else uuid4().hex,
+ 'name': value["name"],
+ 'value': value_wo_name,
+ 'category_id': category_id,
+ 'policy_id': policy_id,
+ }
+ )
+ session.add(new_ref)
+ ref = new_ref
+ else:
+ for attr in ClassType.attributes:
+ if attr != 'id':
+ setattr(ref, attr, getattr(ref, attr))
+ # session.flush()
+ return {
+ "policy_id": policy_id,
+ "category_id": category_id,
+ "data": {ref.id: ref.to_dict()}
+ }
+
+ def __delete_data(self, ClassType, policy_id, category_id, data_id):
+
+ if not data_id:
+ raise exceptions.DataUnknown
+ with self.get_session_for_write() as session:
+ query = session.query(ClassType)
+ if category_id:
+ query = query.filter_by(policy_id=policy_id, category_id=category_id, id=data_id)
+ else:
+ query = query.filter_by(policy_id=policy_id, id=data_id)
+ ref = query.first()
+ if ref:
+ session.delete(ref)
+
+ def is_subject_data_exist(self, category_id=None):
+ return self.__is_data_exist(SubjectData, category_id=category_id)
+
+ def get_subject_data(self, policy_id, data_id=None, category_id=None):
+ return self.__get_data(SubjectData, policy_id, data_id=data_id, category_id=category_id)
+
+ def set_subject_data(self, policy_id, data_id=None, category_id=None, value=None):
+ try:
+ return self.__set_data(Subject, SubjectData, policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.SubjectScopeExisting
+ raise error
+
+ def delete_subject_data(self, policy_id, category_id, data_id):
+ return self.__delete_data(SubjectData, policy_id, category_id, data_id)
+
+ def is_object_data_exist(self, category_id=None):
+ return self.__is_data_exist(ObjectData, category_id=category_id)
+
+ def get_object_data(self, policy_id, data_id=None, category_id=None):
+ return self.__get_data(ObjectData, policy_id, data_id=data_id, category_id=category_id)
+
+ def set_object_data(self, policy_id, data_id=None, category_id=None, value=None):
+ try:
+ return self.__set_data(Object, ObjectData, policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ObjectScopeExisting
+ raise error
+
+ def delete_object_data(self, policy_id, category_id, data_id):
+ return self.__delete_data(ObjectData, policy_id, category_id, data_id)
+
+ def is_action_data_exist(self, category_id=None):
+ return self.__is_data_exist(ActionData, category_id=category_id)
+
+ def get_action_data(self, policy_id, data_id=None, category_id=None):
+ return self.__get_data(ActionData, policy_id, data_id=data_id, category_id=category_id)
+
+ def set_action_data(self, policy_id, data_id=None, category_id=None, value=None):
+ try:
+ return self.__set_data(Action, ActionData, policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ActionScopeExisting
+ raise error
+
+ def delete_action_data(self, policy_id, category_id, data_id):
+ return self.__delete_data(ActionData, policy_id, category_id, data_id)
+
+ def get_subject_assignments(self, policy_id, subject_id=None, category_id=None):
+ with self.get_session_for_write() as session:
+ query = session.query(SubjectAssignment)
+ if subject_id and category_id:
+ # TODO change the subject_id to perimeter_id to allow code refactoring
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
+ elif subject_id:
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id)
+ else:
+ query = query.filter_by(policy_id=policy_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def add_subject_assignment(self, policy_id, subject_id, category_id, data_id):
+ with self.get_session_for_write() as session:
+ query = session.query(SubjectAssignment)
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
+ ref = query.first()
+ if ref:
+ old_ref = copy.deepcopy(ref.to_dict())
+ assignments = old_ref["assignments"]
+ if data_id not in assignments:
+ assignments.append(data_id)
+ setattr(ref, "assignments", assignments)
+ else:
+ raise exceptions.SubjectAssignmentExisting
+ else:
+ ref = SubjectAssignment.from_dict(
+ {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "subject_id": subject_id,
+ "category_id": category_id,
+ "assignments": [data_id, ],
+ }
+ )
+ session.add(ref)
+ return {ref.id: ref.to_dict()}
+
+ def is_subject_category_has_assignment(self, category_id):
+ return self.__is_category_has_assignment(SubjectAssignment, category_id)
+
+ def is_object_category_has_assignment(self, category_id):
+ return self.__is_category_has_assignment(ObjectAssignment, category_id)
+
+ def is_action_category_has_assignment(self, category_id):
+ return self.__is_category_has_assignment(ActionAssignment, category_id)
+
+ def __is_category_has_assignment(self, ClassType, category_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ClassType)
+ query = query.filter_by(category_id=category_id)
+ count = query.count()
+ return count > 0
+
+ def delete_subject_assignment(self, policy_id, subject_id, category_id, data_id):
+ with self.get_session_for_write() as session:
+ query = session.query(SubjectAssignment)
+
+ if policy_id and subject_id and category_id:
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
+
+ elif policy_id and subject_id:
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id)
+
+ elif policy_id:
+ query = query.filter_by(policy_id=policy_id)
+
+ ref_list = query.all()
+ if ref_list:
+ for _ref in ref_list:
+ old_ref = copy.deepcopy(_ref.to_dict())
+ assignments = old_ref["assignments"]
+ if data_id:
+ if data_id in assignments:
+ assignments.remove(data_id)
+ if not assignments:
+ session.delete(_ref)
+ else:
+ # FIXME (asteroide): the setattr doesn't work here ; the assignments is not updated in the database
+ setattr(_ref, "assignments", assignments)
+ else:
+ session.delete(_ref)
+
+ def get_object_assignments(self, policy_id, object_id=None, category_id=None):
+ with self.get_session_for_write() as session:
+ query = session.query(ObjectAssignment)
+ if object_id and category_id:
+ # TODO change the object_id to perimeter_id to allow code refactoring
+ query = query.filter_by(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
+ elif object_id:
+ query = query.filter_by(policy_id=policy_id, object_id=object_id)
+ else:
+ query = query.filter_by(policy_id=policy_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def add_object_assignment(self, policy_id, object_id, category_id, data_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ObjectAssignment)
+ query = query.filter_by(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
+ ref = query.first()
+ if ref:
+ old_ref = copy.deepcopy(ref.to_dict())
+ assignments = old_ref["assignments"]
+ if data_id not in assignments:
+ assignments.append(data_id)
+ setattr(ref, "assignments", assignments)
+ else:
+ raise exceptions.ObjectAssignmentExisting
+ else:
+ ref = ObjectAssignment.from_dict(
+ {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "object_id": object_id,
+ "category_id": category_id,
+ "assignments": [data_id, ],
+ }
+ )
+ session.add(ref)
+ return {ref.id: ref.to_dict()}
+
+ def delete_object_assignment(self, policy_id, object_id, category_id, data_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ObjectAssignment)
+
+ if policy_id and object_id and category_id:
+ query = query.filter_by(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
+ elif policy_id and object_id:
+ query = query.filter_by(policy_id=policy_id, object_id=object_id)
+
+ elif policy_id:
+ query = query.filter_by(policy_id=policy_id)
+
+
+
+ ref_list = query.all()
+ if ref_list:
+ for _ref in ref_list:
+ old_ref = copy.deepcopy(_ref.to_dict())
+ assignments = old_ref["assignments"]
+ if data_id:
+ if data_id in assignments:
+ assignments.remove(data_id)
+ if not assignments:
+ session.delete(_ref)
+ else:
+ # FIXME (asteroide): the setattr doesn't work here ; the assignments is not updated in the database
+ setattr(_ref, "assignments", assignments)
+ else:
+ session.delete(_ref)
+
+ def get_action_assignments(self, policy_id, action_id=None, category_id=None):
+ with self.get_session_for_write() as session:
+ if not policy_id:
+ return exceptions.PolicyUnknown
+ query = session.query(ActionAssignment)
+ if action_id and category_id:
+ # TODO change the action_id to perimeter_id to allow code refactoring
+ query = query.filter_by(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
+ elif action_id:
+ query = query.filter_by(policy_id=policy_id, action_id=action_id)
+ elif category_id:
+ query = query.filter_by(policy_id=policy_id, category_id=category_id)
+ else:
+ query = query.filter_by(policy_id=policy_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def add_action_assignment(self, policy_id, action_id, category_id, data_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ActionAssignment)
+ query = query.filter_by(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
+ ref = query.first()
+ if ref:
+ old_ref = copy.deepcopy(ref.to_dict())
+ assignments = old_ref["assignments"]
+ if data_id not in assignments:
+ assignments.append(data_id)
+ setattr(ref, "assignments", assignments)
+ else:
+ raise exceptions.ActionAssignmentExisting
+ else:
+ ref = ActionAssignment.from_dict(
+ {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "action_id": action_id,
+ "category_id": category_id,
+ "assignments": [data_id, ],
+ }
+ )
+ session.add(ref)
+ return {ref.id: ref.to_dict()}
+
+ def delete_action_assignment(self, policy_id, action_id, category_id, data_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ActionAssignment)
+
+ if policy_id and action_id and category_id:
+ query = query.filter_by(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
+
+ elif policy_id and action_id:
+ query = query.filter_by(policy_id=policy_id, action_id=action_id)
+
+ elif policy_id:
+ query = query.filter_by(policy_id=policy_id)
+
+
+
+ ref_list = query.all()
+ if ref_list:
+ for _ref in ref_list:
+ old_ref = copy.deepcopy(_ref.to_dict())
+ assignments = old_ref["assignments"]
+ if data_id:
+ if data_id in assignments:
+ assignments.remove(data_id)
+ if not assignments:
+ session.delete(_ref)
+ else:
+ # FIXME (asteroide): the setattr doesn't work here ; the assignments is not updated in the database
+ setattr(_ref, "assignments", assignments)
+ else:
+ session.delete(_ref)
+
+ def get_rules(self, policy_id, rule_id=None, meta_rule_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(Rule)
+ if rule_id:
+ query = query.filter_by(id=rule_id)
+ ref = query.first()
+ if ref:
+ return {ref.id: ref.to_dict()}
+ return {}
+ elif meta_rule_id and policy_id:
+ query = query.filter_by(policy_id=policy_id, meta_rule_id=meta_rule_id)
+ ref_list = query.all()
+ return {
+ "meta_rule_id": meta_rule_id,
+ "policy_id": policy_id,
+ "rules": list(map(lambda x: x.to_dict(), ref_list))
+ }
+ else:
+ query = query.filter_by(policy_id=policy_id)
+ ref_list = query.all()
+ return {
+ "policy_id": policy_id,
+ "rules": list(map(lambda x: x.to_dict(), ref_list))
+ }
+
+ def is_meta_rule_has_rules(self, meta_rule_id):
+ with self.get_session_for_read() as session:
+ query = session.query(Rule)
+
+ query = query.filter_by(meta_rule_id=meta_rule_id)
+ count = query.count()
+ return count > 0
+
+ def add_rule(self, policy_id, meta_rule_id, value):
+ try:
+ rules = self.get_rules(policy_id, meta_rule_id=meta_rule_id)
+ for _rule in map(lambda x: x["rule"], rules["rules"]):
+ if list(value.get('rule')) == list(_rule):
+ raise exceptions.RuleExisting
+ with self.get_session_for_write() as session:
+ ref = Rule.from_dict(
+ {
+ "id": uuid4().hex,
+ "policy_id": policy_id,
+ "meta_rule_id": meta_rule_id,
+ "rule": value
+ }
+ )
+ session.add(ref)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.RuleExisting
+ raise error
+
+ def update_rule(self, rule_id, value):
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(Rule)
+ query = query.filter_by(id=rule_id)
+ ref = query.first()
+
+ if ref:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop('name', None)
+ value_wo_name.pop('policy_id', None)
+ value_wo_name.pop('meta_rule_id', None)
+ d = dict(ref.rule)
+ d.update(value_wo_name)
+ ref.rule = d
+ return {ref.id: ref.to_dict()}
+
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.PolicyExisting
+ raise error
+
+ def delete_rule(self, policy_id, rule_id):
+ with self.get_session_for_write() as session:
+ query = session.query(Rule)
+ query = query.filter_by(policy_id=policy_id, id=rule_id)
+ ref = query.first()
+ if ref:
+ session.delete(ref)
+
+
+class ModelConnector(BaseConnector, ModelDriver):
+
+ def update_model(self, model_id, value):
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(Model)
+ if model_id:
+ query = query.filter_by(id=model_id)
+ ref = query.first()
+ if ref:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ setattr(ref, "name", value["name"])
+ d = dict(ref.value)
+ d.update(value_wo_name)
+ setattr(ref, "value", d)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ModelExisting
+ raise error
+
+ def delete_model(self, model_id):
+ with self.get_session_for_write() as session:
+ ref = session.query(Model).get(model_id)
+ session.delete(ref)
+
+ def add_model(self, model_id=None, value=None):
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ new = Model.from_dict({
+ "id": model_id if model_id else uuid4().hex,
+ "name": value["name"],
+ "value": value_wo_name
+ })
+ session.add(new)
+ return {new.id: new.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ModelExisting
+ raise error
+
+ def get_models(self, model_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(Model)
+ if model_id:
+ ref_list = query.filter(Model.id == model_id)
+ else:
+ ref_list = query.all()
+
+ r = {_ref.id: _ref.to_dict() for _ref in ref_list}
+ return r
+
+ def set_meta_rule(self, meta_rule_id, value):
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_other_data = copy.deepcopy(value)
+ value_wo_other_data.pop("name", None)
+ value_wo_other_data.pop("subject_categories", None)
+ value_wo_other_data.pop("object_categories", None)
+ value_wo_other_data.pop("action_categories", None)
+ if meta_rule_id is None:
+ try:
+ ref = MetaRule.from_dict(
+ {
+ "id": uuid4().hex,
+ "name": value["name"],
+ "subject_categories": value["subject_categories"],
+ "object_categories": value["object_categories"],
+ "action_categories": value["action_categories"],
+ "value": value_wo_other_data
+ }
+ )
+ session.add(ref)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.MetaRuleExisting
+ raise error
+ else:
+ query = session.query(MetaRule)
+ query = query.filter_by(id=meta_rule_id)
+ ref = query.first()
+ setattr(ref, "name", value["name"])
+ setattr(ref, "subject_categories", value["subject_categories"])
+ setattr(ref, "object_categories", value["object_categories"])
+ setattr(ref, "action_categories", value["action_categories"])
+ setattr(ref, "value", value_wo_other_data)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.MetaRuleExisting
+ raise error
+
+ def get_meta_rules(self, meta_rule_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(MetaRule)
+ if meta_rule_id:
+ query = query.filter_by(id=meta_rule_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def delete_meta_rule(self, meta_rule_id=None):
+ with self.get_session_for_write() as session:
+ query = session.query(MetaRule)
+ query = query.filter_by(id=meta_rule_id)
+ ref = query.first()
+ if ref:
+ session.delete(ref)
+
+ def __get_perimeter_categories(self, ClassType, category_id=None):
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ if category_id != None:
+ query = query.filter_by(id=category_id)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def __get_perimeter_categories_by_category_name(self, ClassType, category_name=None):
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ if category_name != None:
+ query = query.filter_by(name=category_name)
+ ref_list = query.all()
+ return {_ref.id: _ref.to_dict() for _ref in ref_list}
+
+ def __add_perimeter_category(self, ClassType, name, description, uuid=None):
+ if not name or not name.strip():
+ raise exceptions.CategoryNameInvalid
+ with self.get_session_for_write() as session:
+ ref = ClassType.from_dict(
+ {
+ "id": uuid if uuid else uuid4().hex,
+ "name": name,
+ "description": description
+ }
+ )
+ session.add(ref)
+ return {ref.id: ref.to_dict()}
+
+ def __delete_perimeter_category(self, ClassType, category_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ClassType)
+ query = query.filter_by(id=category_id)
+ ref = query.first()
+ if ref:
+ session.delete(ref)
+ #TODO: MAY BE!duplicate to get_subject_categories_by_
+ def get_subject_categories(self, category_id=None, category_name=None):
+ if category_name != None:
+ return self.__get_perimeter_categories_by_category_name(SubjectCategory, category_name=category_name)
+ return self.__get_perimeter_categories(SubjectCategory, category_id=category_id)
+
+
+ def add_subject_category(self, name, description, uuid=None):
+ try:
+ return self.__add_perimeter_category(SubjectCategory, name, description, uuid=uuid)
+ except sql.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.SubjectCategoryExisting
+ raise error
+
+ def delete_subject_category(self, category_id):
+ self.__delete_perimeter_category(SubjectCategory, category_id)
+
+ def get_object_categories(self, category_id=None, category_name=None):
+ if category_name != None:
+ return self.__get_perimeter_categories_by_category_name(ObjectCategory, category_name=category_name)
+ return self.__get_perimeter_categories(ObjectCategory, category_id=category_id)
+
+ def add_object_category(self, name, description, uuid=None):
+ try:
+ return self.__add_perimeter_category(ObjectCategory, name, description, uuid=uuid)
+ except sql.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ObjectCategoryExisting
+ raise error
+
+ def delete_object_category(self, category_id):
+ self.__delete_perimeter_category(ObjectCategory, category_id)
+
+ def get_action_categories(self, category_id=None, category_name=None):
+ if category_name != None:
+ return self.__get_perimeter_categories_by_category_name(ActionCategory, category_name=category_name)
+ return self.__get_perimeter_categories(ActionCategory, category_id=category_id)
+
+ def add_action_category(self, name, description, uuid=None):
+ try:
+ return self.__add_perimeter_category(ActionCategory, name, description, uuid=uuid)
+ except sql.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error) or 'Duplicate entry' in str(error):
+ raise exceptions.ActionCategoryExisting
+ raise error
+
+ def delete_action_category(self, category_id):
+ self.__delete_perimeter_category(ActionCategory, category_id)
+
+ # Getter and Setter for subject_category
+
+ # def get_subject_categories_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(SubjectCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.subject_category for _ref in ref_list}
+ #
+ # def set_subject_category_dict(self, intra_extension_id, subject_category_id, subject_category_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubjectCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=subject_category_id)
+ # ref = query.first()
+ # new_ref = SubjectCategory.from_dict(
+ # {
+ # "id": subject_category_id,
+ # 'subject_category': subject_category_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in SubjectCategory.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # # session.flush()
+ # return {subject_category_id: SubjectCategory.to_dict(ref)['subject_category']}
+ #
+ # def del_subject_category(self, intra_extension_id, subject_category_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubjectCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=subject_category_id)
+ # ref = query.first()
+ # self.del_subject_assignment(intra_extension_id, None, None, None)
+ # session.delete(ref)
+ #
+ # # Getter and Setter for object_category
+ #
+ # def get_object_categories_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(ObjectCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.object_category for _ref in ref_list}
+ #
+ # def set_object_category_dict(self, intra_extension_id, object_category_id, object_category_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ObjectCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=object_category_id)
+ # ref = query.first()
+ # new_ref = ObjectCategory.from_dict(
+ # {
+ # "id": object_category_id,
+ # 'object_category': object_category_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in ObjectCategory.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {object_category_id: ObjectCategory.to_dict(ref)['object_category']}
+ #
+ # def del_object_category(self, intra_extension_id, object_category_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ObjectCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=object_category_id)
+ # ref = query.first()
+ # self.del_object_assignment(intra_extension_id, None, None, None)
+ # session.delete(ref)
+ #
+ # # Getter and Setter for action_category
+ #
+ # def get_action_categories_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(ActionCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.action_category for _ref in ref_list}
+ #
+ # def set_action_category_dict(self, intra_extension_id, action_category_id, action_category_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ActionCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=action_category_id)
+ # ref = query.first()
+ # new_ref = ActionCategory.from_dict(
+ # {
+ # "id": action_category_id,
+ # 'action_category': action_category_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in ActionCategory.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {action_category_id: ActionCategory.to_dict(ref)['action_category']}
+ #
+ # def del_action_category(self, intra_extension_id, action_category_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ActionCategory)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=action_category_id)
+ # ref = query.first()
+ # self.del_action_assignment(intra_extension_id, None, None, None)
+ # session.delete(ref)
+
+ # Perimeter
+
+ # def get_subjects_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(Subject)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.subject for _ref in ref_list}
+ #
+ # def set_subject_dict(self, intra_extension_id, subject_id, subject_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Subject)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=subject_id)
+ # ref = query.first()
+ # # if 'id' in subject_dict:
+ # # subject_dict['id'] = subject_id
+ # new_ref = Subject.from_dict(
+ # {
+ # "id": subject_id,
+ # 'subject': subject_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Subject.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {subject_id: Subject.to_dict(ref)['subject']}
+ #
+ # def del_subject(self, intra_extension_id, subject_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Subject)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=subject_id)
+ # ref = query.first()
+ # session.delete(ref)
+ #
+ # def get_objects_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(Object)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.object for _ref in ref_list}
+ #
+ # def set_object_dict(self, intra_extension_id, object_id, object_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Object)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=object_id)
+ # ref = query.first()
+ # new_ref = Object.from_dict(
+ # {
+ # "id": object_id,
+ # 'object': object_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Object.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {object_id: Object.to_dict(ref)['object']}
+ #
+ # def del_object(self, intra_extension_id, object_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Object)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=object_id)
+ # ref = query.first()
+ # session.delete(ref)
+ #
+ # def get_actions_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(Action)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.action for _ref in ref_list}
+ #
+ # def set_action_dict(self, intra_extension_id, action_id, action_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Action)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=action_id)
+ # ref = query.first()
+ # new_ref = Action.from_dict(
+ # {
+ # "id": action_id,
+ # 'action': action_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Action.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {action_id: Action.to_dict(ref)['action']}
+ #
+ # def del_action(self, intra_extension_id, action_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Action)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=action_id)
+ # ref = query.first()
+ # session.delete(ref)
+
+ # Getter and Setter for subject_scope
+
+ # def get_subject_scopes_dict(self, intra_extension_id, subject_category_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(SubjectScope)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, subject_category_id=subject_category_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.subject_scope for _ref in ref_list}
+ #
+ # def set_subject_scope_dict(self, intra_extension_id, subject_category_id, subject_scope_id, subject_scope_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubjectScope)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, subject_category_id=subject_category_id, id=subject_scope_id)
+ # ref = query.first()
+ # new_ref = SubjectScope.from_dict(
+ # {
+ # "id": subject_scope_id,
+ # 'subject_scope': subject_scope_dict,
+ # 'intra_extension_id': intra_extension_id,
+ # 'subject_category_id': subject_category_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Subject.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {subject_scope_id: SubjectScope.to_dict(ref)['subject_scope']}
+ #
+ # def del_subject_scope(self, intra_extension_id, subject_category_id, subject_scope_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubjectScope)
+ # if not subject_category_id or not subject_scope_id:
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # for ref in query.all():
+ # session.delete(ref)
+ # else:
+ # query = query.filter_by(intra_extension_id=intra_extension_id, subject_category_id=subject_category_id, id=subject_scope_id)
+ # ref = query.first()
+ # session.delete(ref)
+ #
+ # # Getter and Setter for object_category_scope
+ #
+ # def get_object_scopes_dict(self, intra_extension_id, object_category_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(ObjectScope)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, object_category_id=object_category_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.object_scope for _ref in ref_list}
+ #
+ # def set_object_scope_dict(self, intra_extension_id, object_category_id, object_scope_id, object_scope_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ObjectScope)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, object_category_id=object_category_id, id=object_scope_id)
+ # ref = query.first()
+ # new_ref = ObjectScope.from_dict(
+ # {
+ # "id": object_scope_id,
+ # 'object_scope': object_scope_dict,
+ # 'intra_extension_id': intra_extension_id,
+ # 'object_category_id': object_category_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Object.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {object_scope_id: ObjectScope.to_dict(ref)['object_scope']}
+ #
+ # def del_object_scope(self, intra_extension_id, object_category_id, object_scope_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ObjectScope)
+ # if not object_category_id or not object_scope_id:
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # for ref in query.all():
+ # session.delete(ref)
+ # else:
+ # query = query.filter_by(intra_extension_id=intra_extension_id, object_category_id=object_category_id, id=object_scope_id)
+ # ref = query.first()
+ # session.delete(ref)
+ #
+ # # Getter and Setter for action_scope
+ #
+ # def get_action_scopes_dict(self, intra_extension_id, action_category_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(ActionScope)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, action_category_id=action_category_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.action_scope for _ref in ref_list}
+ #
+ # def set_action_scope_dict(self, intra_extension_id, action_category_id, action_scope_id, action_scope_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ActionScope)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, action_category_id=action_category_id, id=action_scope_id)
+ # ref = query.first()
+ # new_ref = ActionScope.from_dict(
+ # {
+ # "id": action_scope_id,
+ # 'action_scope': action_scope_dict,
+ # 'intra_extension_id': intra_extension_id,
+ # 'action_category_id': action_category_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Action.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {action_scope_id: ActionScope.to_dict(ref)['action_scope']}
+ #
+ # def del_action_scope(self, intra_extension_id, action_category_id, action_scope_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ActionScope)
+ # if not action_category_id or not action_scope_id:
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # for ref in query.all():
+ # session.delete(ref)
+ # else:
+ # query = query.filter_by(intra_extension_id=intra_extension_id, action_category_id=action_category_id, id=action_scope_id)
+ # ref = query.first()
+ # session.delete(ref)
+ #
+ # # Getter and Setter for subject_category_assignment
+ #
+ # def get_subject_assignment_list(self, intra_extension_id, subject_id, subject_category_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(SubjectAssignment)
+ # if not subject_id or not subject_category_id or not subject_category_id:
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref = query.all()
+ # return ref
+ # else:
+ # query = query.filter_by(intra_extension_id=intra_extension_id, subject_id=subject_id, subject_category_id=subject_category_id)
+ # ref = query.first()
+ # if not ref:
+ # return list()
+ # LOG.info("get_subject_assignment_list {}".format(ref.subject_assignment))
+ # return list(ref.subject_assignment)
+ #
+ # def set_subject_assignment_list(self, intra_extension_id, subject_id, subject_category_id, subject_assignment_list=[]):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubjectAssignment)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, subject_id=subject_id, subject_category_id=subject_category_id)
+ # ref = query.first()
+ # new_ref = SubjectAssignment.from_dict(
+ # {
+ # "id": uuid4().hex,
+ # 'subject_assignment': subject_assignment_list,
+ # 'intra_extension_id': intra_extension_id,
+ # 'subject_id': subject_id,
+ # 'subject_category_id': subject_category_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in SubjectAssignment.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return subject_assignment_list
+ #
+ # def add_subject_assignment_list(self, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
+ # new_subject_assignment_list = self.get_subject_assignment_list(intra_extension_id, subject_id, subject_category_id)
+ # if subject_scope_id not in new_subject_assignment_list:
+ # new_subject_assignment_list.append(subject_scope_id)
+ # return self.set_subject_assignment_list(intra_extension_id, subject_id, subject_category_id, new_subject_assignment_list)
+ #
+ # def del_subject_assignment(self, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
+ # if not subject_id or not subject_category_id or not subject_category_id:
+ # with self.get_session_for_write() as session:
+ # for ref in self.get_subject_assignment_list(intra_extension_id, None, None):
+ # session.delete(ref)
+ # session.flush()
+ # return
+ # new_subject_assignment_list = self.get_subject_assignment_list(intra_extension_id, subject_id, subject_category_id)
+ # new_subject_assignment_list.remove(subject_scope_id)
+ # return self.set_subject_assignment_list(intra_extension_id, subject_id, subject_category_id, new_subject_assignment_list)
+ #
+ # # Getter and Setter for object_category_assignment
+ #
+ # def get_object_assignment_list(self, intra_extension_id, object_id, object_category_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(ObjectAssignment)
+ # if not object_id or not object_category_id or not object_category_id:
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref = query.all()
+ # return ref
+ # else:
+ # query = query.filter_by(intra_extension_id=intra_extension_id, object_id=object_id, object_category_id=object_category_id)
+ # ref = query.first()
+ # if not ref:
+ # return list()
+ # return list(ref.object_assignment)
+ #
+ # def set_object_assignment_list(self, intra_extension_id, object_id, object_category_id, object_assignment_list=[]):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ObjectAssignment)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, object_id=object_id, object_category_id=object_category_id)
+ # ref = query.first()
+ # new_ref = ObjectAssignment.from_dict(
+ # {
+ # "id": uuid4().hex,
+ # 'object_assignment': object_assignment_list,
+ # 'intra_extension_id': intra_extension_id,
+ # 'object_id': object_id,
+ # 'object_category_id': object_category_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # else:
+ # for attr in ObjectAssignment.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return self.get_object_assignment_list(intra_extension_id, object_id, object_category_id)
+ #
+ # def add_object_assignment_list(self, intra_extension_id, object_id, object_category_id, object_scope_id):
+ # new_object_assignment_list = self.get_object_assignment_list(intra_extension_id, object_id, object_category_id)
+ # if object_scope_id not in new_object_assignment_list:
+ # new_object_assignment_list.append(object_scope_id)
+ # return self.set_object_assignment_list(intra_extension_id, object_id, object_category_id, new_object_assignment_list)
+ #
+ # def del_object_assignment(self, intra_extension_id, object_id, object_category_id, object_scope_id):
+ # if not object_id or not object_category_id or not object_category_id:
+ # with self.get_session_for_write() as session:
+ # for ref in self.get_object_assignment_list(intra_extension_id, None, None):
+ # session.delete(ref)
+ # session.flush()
+ # return
+ # new_object_assignment_list = self.get_object_assignment_list(intra_extension_id, object_id, object_category_id)
+ # new_object_assignment_list.remove(object_scope_id)
+ # return self.set_object_assignment_list(intra_extension_id, object_id, object_category_id, new_object_assignment_list)
+ #
+ # # Getter and Setter for action_category_assignment
+ #
+ # def get_action_assignment_list(self, intra_extension_id, action_id, action_category_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(ActionAssignment)
+ # if not action_id or not action_category_id or not action_category_id:
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref = query.all()
+ # return ref
+ # else:
+ # query = query.filter_by(intra_extension_id=intra_extension_id, action_id=action_id, action_category_id=action_category_id)
+ # ref = query.first()
+ # if not ref:
+ # return list()
+ # return list(ref.action_assignment)
+ #
+ # def set_action_assignment_list(self, intra_extension_id, action_id, action_category_id, action_assignment_list=[]):
+ # with self.get_session_for_write() as session:
+ # query = session.query(ActionAssignment)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, action_id=action_id, action_category_id=action_category_id)
+ # ref = query.first()
+ # new_ref = ActionAssignment.from_dict(
+ # {
+ # "id": uuid4().hex,
+ # 'action_assignment': action_assignment_list,
+ # 'intra_extension_id': intra_extension_id,
+ # 'action_id': action_id,
+ # 'action_category_id': action_category_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # else:
+ # for attr in ActionAssignment.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return self.get_action_assignment_list(intra_extension_id, action_id, action_category_id)
+ #
+ # def add_action_assignment_list(self, intra_extension_id, action_id, action_category_id, action_scope_id):
+ # new_action_assignment_list = self.get_action_assignment_list(intra_extension_id, action_id, action_category_id)
+ # if action_scope_id not in new_action_assignment_list:
+ # new_action_assignment_list.append(action_scope_id)
+ # return self.set_action_assignment_list(intra_extension_id, action_id, action_category_id, new_action_assignment_list)
+ #
+ # def del_action_assignment(self, intra_extension_id, action_id, action_category_id, action_scope_id):
+ # if not action_id or not action_category_id or not action_category_id:
+ # with self.get_session_for_write() as session:
+ # for ref in self.get_action_assignment_list(intra_extension_id, None, None):
+ # session.delete(ref)
+ # session.flush()
+ # return
+ # new_action_assignment_list = self.get_action_assignment_list(intra_extension_id, action_id, action_category_id)
+ # new_action_assignment_list.remove(action_scope_id)
+ # return self.set_action_assignment_list(intra_extension_id, action_id, action_category_id, new_action_assignment_list)
+ #
+ # # Getter and Setter for sub_meta_rule
+ #
+ # def get_aggregation_algorithm_id(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(IntraExtension)
+ # query = query.filter_by(id=intra_extension_id)
+ # ref = query.first()
+ # try:
+ # return {"aggregation_algorithm": ref.intra_extension["aggregation_algorithm"]}
+ # except KeyError:
+ # return ""
+ #
+ # def set_aggregation_algorithm_id(self, intra_extension_id, aggregation_algorithm_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(IntraExtension)
+ # query = query.filter_by(id=intra_extension_id)
+ # ref = query.first()
+ # intra_extension_dict = dict(ref.intra_extension)
+ # intra_extension_dict["aggregation_algorithm"] = aggregation_algorithm_id
+ # setattr(ref, "intra_extension", intra_extension_dict)
+ # # session.flush()
+ # return {"aggregation_algorithm": ref.intra_extension["aggregation_algorithm"]}
+ #
+ # def del_aggregation_algorithm(self, intra_extension_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(IntraExtension)
+ # query = query.filter_by(id=intra_extension_id)
+ # ref = query.first()
+ # intra_extension_dict = dict(ref.intra_extension)
+ # intra_extension_dict["aggregation_algorithm"] = ""
+ # setattr(ref, "intra_extension", intra_extension_dict)
+ # return self.get_aggregation_algorithm_id(intra_extension_id)
+ #
+ # # Getter and Setter for sub_meta_rule
+ #
+ # def get_sub_meta_rules_dict(self, intra_extension_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(SubMetaRule)
+ # query = query.filter_by(intra_extension_id=intra_extension_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.sub_meta_rule for _ref in ref_list}
+ #
+ # def set_sub_meta_rule_dict(self, intra_extension_id, sub_meta_rule_id, sub_meta_rule_dict):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubMetaRule)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=sub_meta_rule_id)
+ # ref = query.first()
+ # new_ref = SubMetaRule.from_dict(
+ # {
+ # "id": sub_meta_rule_id,
+ # 'sub_meta_rule': sub_meta_rule_dict,
+ # 'intra_extension_id': intra_extension_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # else:
+ # _sub_meta_rule_dict = dict(ref.sub_meta_rule)
+ # _sub_meta_rule_dict.update(sub_meta_rule_dict)
+ # setattr(new_ref, "sub_meta_rule", _sub_meta_rule_dict)
+ # for attr in SubMetaRule.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return self.get_sub_meta_rules_dict(intra_extension_id)
+ #
+ # def del_sub_meta_rule(self, intra_extension_id, sub_meta_rule_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(SubMetaRule)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, id=sub_meta_rule_id)
+ # ref = query.first()
+ # session.delete(ref)
+ #
+ # # Getter and Setter for rules
+ #
+ # def get_rules_dict(self, intra_extension_id, sub_meta_rule_id):
+ # with self.get_session_for_read() as session:
+ # query = session.query(Rule)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, sub_meta_rule_id=sub_meta_rule_id)
+ # ref_list = query.all()
+ # return {_ref.id: _ref.rule for _ref in ref_list}
+ #
+ # def set_rule_dict(self, intra_extension_id, sub_meta_rule_id, rule_id, rule_list):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Rule)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, sub_meta_rule_id=sub_meta_rule_id, id=rule_id)
+ # ref = query.first()
+ # new_ref = Rule.from_dict(
+ # {
+ # "id": rule_id,
+ # 'rule': rule_list,
+ # 'intra_extension_id': intra_extension_id,
+ # 'sub_meta_rule_id': sub_meta_rule_id
+ # }
+ # )
+ # if not ref:
+ # session.add(new_ref)
+ # ref = new_ref
+ # else:
+ # for attr in Rule.attributes:
+ # if attr != 'id':
+ # setattr(ref, attr, getattr(new_ref, attr))
+ # # session.flush()
+ # return {rule_id: ref.rule}
+ #
+ # def del_rule(self, intra_extension_id, sub_meta_rule_id, rule_id):
+ # with self.get_session_for_write() as session:
+ # query = session.query(Rule)
+ # query = query.filter_by(intra_extension_id=intra_extension_id, sub_meta_rule_id=sub_meta_rule_id, id=rule_id)
+ # ref = query.first()
+ # session.delete(ref)
+
+
+class Connector(PDPConnector, PolicyConnector, ModelConnector, SlaveConnector):
+ pass
diff --git a/moon_manager/moon_manager/server.py b/moon_manager/moon_manager/server.py
index a8db8fd5..ff6fd278 100644
--- a/moon_manager/moon_manager/server.py
+++ b/moon_manager/moon_manager/server.py
@@ -1,40 +1,95 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+import hug
import logging
-from python_moonutilities import configuration, exceptions
-from moon_manager.http_server import HTTPServer
+from moon_manager.api import status, logs, configuration, pdp, policy, slave, auth, \
+ perimeter, assignments, meta_data, meta_rules, models, \
+ json_import, json_export, rules, data, attributes
+from moon_manager import db_driver,orchestration_driver
+from moon_utilities.auth_functions import init_db
+from falcon.http_error import HTTPError
+from moon_manager.api import ERROR_CODE
+from moon_utilities import exceptions
+LOGGER = logging.getLogger("moon.manager.server")
+configuration.init_logging()
+
+
+@hug.response_middleware()
+def CORS(request, response, resource):
+ response.set_header('Access-Control-Allow-Origin', '*')
+ response.set_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE, PATCH')
+ response.set_header(
+ 'Access-Control-Allow-Headers',
+ 'Authorization,Keep-Alive,User-Agent,x-api-key'
+ 'If-Modified-Since,Cache-Control,Content-Type,x-api-key'
+ )
+ response.set_header(
+ 'Access-Control-Expose-Headers',
+ 'Authorization,Keep-Alive,User-Agent,'
+ 'If-Modified-Since,Cache-Control,Content-Type'
+ )
+ if request.method == 'OPTIONS':
+ response.set_header('Access-Control-Max-Age', 1728000)
+ response.set_header('Content-Type', 'text/plain charset=UTF-8')
+ response.set_header('Content-Length', 0)
+ response.status_code = hug.HTTP_204
+
+
+@hug.startup()
+def add_data(api):
+ """Adds initial data to the api on startup"""
+ LOGGER.warning("Starting the server and initializing data")
+ init_db(configuration.get_configuration("management").get("token_file"))
+ db_driver.init()
+ orchestration_driver.init()
+
+
+def __get_status_code(exception):
+ if isinstance(exception, HTTPError):
+ return exception.status
+ status_code = getattr(exception, "code", 500)
+ if status_code in ERROR_CODE:
+ status_code = ERROR_CODE[status_code]
+ else:
+ status_code = hug.HTTP_500
+ return status_code
-logger = logging.getLogger("moon.manager.server")
+@hug.exception(exceptions.MoonError)
+def handle_custom_exceptions(exception, response):
+ response.status = __get_status_code(exception)
+ error_message = {"result": False,
+ 'message': str(exception),
+ "code": getattr(exception, "code", 500)}
+ LOGGER.exception(exception)
+ return error_message
-def create_server():
- configuration.init_logging()
- try:
- conf = configuration.get_configuration("components/manager")
- hostname = conf["components/manager"].get("hostname", "manager")
- port = conf["components/manager"].get("port", 80)
- bind = conf["components/manager"].get("bind", "127.0.0.1")
- except exceptions.ConsulComponentNotFound:
- hostname = "manager"
- bind = "127.0.0.1"
- port = 80
- configuration.add_component(uuid="manager",
- name=hostname,
- port=port,
- bind=bind)
- logger.info("Starting server with IP {} on port {} bind to {}".format(
- hostname, port, bind))
- return HTTPServer(host=bind, port=port)
+@hug.exception(Exception)
+def handle_exception(exception, response):
+ response.status = __get_status_code(exception)
+ LOGGER.exception(exception)
+ return {"result": False, 'message': str(exception), "code": getattr(exception, "code", 500)}
-def run():
- server = create_server()
- server.run()
+@hug.extend_api()
+def with_other_apis():
+ return [status, logs, configuration, pdp, policy, slave, auth,
+ perimeter, assignments, meta_data, meta_rules, models, json_import, json_export,
+ rules, data, attributes]
-if __name__ == '__main__':
- run()
+@hug.static('/static')
+def static_front():
+ return (configuration.get_configuration("dashboard").get("root"), )
diff --git a/moon_manager/moonrc b/moon_manager/moonrc
new file mode 100644
index 00000000..a3feb2ce
--- /dev/null
+++ b/moon_manager/moonrc
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+if [[ "$#" -ne 2 ]]; then
+ echo "Usage : source moonrc <username> <password>"
+else
+
+ if [[ -n "$1" ]]; then
+ MOON_USERNAME="$1"
+ fi
+
+ if [[ -n "$2" ]]; then
+ MOON_PASSWORD="$2"
+ fi
+
+ export MOON_USERNAME=$MOON_USERNAME
+ export MOON_PASSWORD=$MOON_PASSWORD
+
+fi \ No newline at end of file
diff --git a/moon_manager/requirements.txt b/moon_manager/requirements.txt
index e2dd5c96..24d9c944 100644
--- a/moon_manager/requirements.txt
+++ b/moon_manager/requirements.txt
@@ -1,5 +1,9 @@
-flask
-flask_restful
-flask_cors
-python_moonutilities
-python_moondb
+hug!=2.5.0
+pyyaml
+moon_utilities
+moon_engine
+tinydb
+gunicorn
+requests
+sqlalchemy
+pymysql
diff --git a/moon_manager/setup.py b/moon_manager/setup.py
index 35c944c3..6fad66c9 100644
--- a/moon_manager/setup.py
+++ b/moon_manager/setup.py
@@ -1,12 +1,59 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import os
+import shutil
from setuptools import setup, find_packages
+from setuptools.command.install import install
+from setuptools.command.develop import develop
import moon_manager
+def initConfiguration():
+ if os.name == "posix":
+ try:
+ os.mkdir("/etc/moon")
+ except FileExistsError:
+ pass
+ if not os.path.exists(os.path.join("/etc", "moon", "moon.yaml")):
+ print("Installing configuration file in /etc")
+ shutil.copy(os.path.join("conf", "moon.yaml"),
+ os.path.join("/etc", "moon"))
+ # else:
+ # raise NotImplementedError('You should install configuration file somewhere '
+ # 'on your system')
+
+
+class CustomInstallCommand(install):
+ """Customized setuptools install command - install configuration file in etc."""
+
+ def run(self):
+ install.run(self)
+ initConfiguration()
+
+
+class CustomDevelopCommand(develop):
+ """Customized setuptools develop command - install configuration file in etc."""
+
+ def run(self):
+ develop.run(self)
+ initConfiguration()
+ with open('requirements.txt') as f:
+ requirements = filter(
+ lambda s: (len(s)>0 and s.strip()[0]!='#'),
+ f.read().split('\n'))
+ print('requirements', requirements)
+
+
setup(
name='moon_manager',
@@ -23,11 +70,24 @@ setup(
long_description=open('README.md').read(),
- # install_requires= ,
+ install_requires=list(filter(
+ lambda s: (len(s) > 0 and s.strip()[0] != '#'),
+ open('requirements.txt').read().split('\n'))),
+
+ data_files=[
+ ("moon", ["conf/moon.yaml"]),
+ ("moon", ["moonrc"])
+ ],
+
include_package_data=True,
- url='https://git.opnfv.org/cgit/moon',
+ cmdclass={
+ 'develop': CustomDevelopCommand,
+ 'install': CustomInstallCommand,
+ },
+
+ url='',
classifiers=[
"Programming Language :: Python",
@@ -40,8 +100,10 @@ setup(
entry_points={
'console_scripts': [
- 'moon_manager = moon_manager.server:create_server',
+ 'moon_manager = moon_manager.__main__:run',
+ 'moon_manager_setup = moon_manager.manager_setup:setup'
],
+
}
)
diff --git a/moon_manager/tests/command_lines/test_complete.py b/moon_manager/tests/command_lines/test_complete.py
new file mode 100644
index 00000000..f2d2cdf2
--- /dev/null
+++ b/moon_manager/tests/command_lines/test_complete.py
@@ -0,0 +1,764 @@
+# Software Name: MOON:
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+import pytest
+import os
+import yaml
+
+pytest_plugins = ["pytester"]
+CONF = """
+debug: true
+
+database:
+ # url: mysql+pymysql://moon:p4sswOrd1@db/moon
+ url: sqlite:////tmp/database.db
+ driver: moon_manager.plugins.sql
+ migration_dir: moon_manager.api.db.migrations
+ # migration_dir: /home/tom/projets/moon/moon_manager/moon_manager/api/db/migrations/
+
+management:
+ url: http://127.0.0.1:8000
+ user: admin
+ password: admin
+ token_file: moon.pwd
+
+orchestration:
+ driver: moon_manager.plugins.pyorchestrator
+ connection: local
+ # driver: moon_manager.plugins.docker_compose
+ # connection: ssh://admin:admin@1.1.1.1
+ # driver: moon_manager.plugins.kubernetes
+ # connection: ~/.kube/config
+ port: 10000...10100
+ config_dir: /tmp
+
+information:
+# driver: moon_manager.plugins.moon_openstack_plugin
+# subjects:
+# driver:
+# - moon_manager.plugins.openstack
+# objects:
+# driver:
+# - moon_manager.plugins.openstack
+# actions:
+# driver:
+# - moon_manager.plugins.openstack
+ openstack:
+ driver: moon_manager.plugins.moon_openstack_plugin
+ url: http://keystone:5000/v3
+ user: admin
+ password: p4ssw0rd
+ domain: default
+ project: admin
+ check_token: false
+ certificate: false
+ global_attrs:
+ driver: moon_manager.plugins.global_attrs
+ attributes:
+
+plugins:
+ directory: /var/moon/plugins
+
+components:
+ manager:
+ port: 8080
+ bind: 0.0.0.0
+ hostname: manager
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
+
+"""
+POLICY = """
+{
+ "policies": [
+ {
+ "name": "MLS Policy",
+ "genre": "authz",
+ "description": "MLS policy",
+ "model": {
+ "name": "MLS"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "MLS",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "mls"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "level",
+ "description": "subject level"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "MLS Policy"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "level",
+ "description": "object level"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "high",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "medium",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ },
+ {
+ "name": "low",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "level"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "high"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "level"},
+ "assignments": [{"name": "medium"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": []
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "mls",
+ "description": "",
+ "subject_categories": [{"name": "level"}],
+ "object_categories": [{"name": "level"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "high"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "high"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "medium"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "medium"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "mls"},
+ "rule": {
+ "subject_data": [{"name": "low"}],
+ "object_data": [{"name": "low"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "MLS Policy"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ]
+}
+"""
+PWD = '{"_default": {"1": {"username": "admin", "password": ' \
+ '"d2eeefe5df3be1d96c102bc91bd2b3c3a93d58f6c9949b91e4a478135f' \
+ '383efcd66af2ede09aff03d579f44e4b6a0bd4e9d9de3dc28222fda7a70f34045fe777", ' \
+ '"salt": "37df3e00b84ea5d1d5b17868b588e8c7a32fa2a18d031828ac2b6fd3c37687a2c0105' \
+ '2a9c395a32b441bac2034dca1966e88039a1e83aac80795bac9c3fa92bf", "api_key": "4ec3' \
+ 'babcdfc765e81e099a29b9d69bb7dbe38b8f226663c09bf79061d3d97d87e30fc5e83a90557313' \
+ 'd4fc471d8ea4eecb4faabc9773594dc63018f503e36a22"}}}'
+
+try:
+ PWD = open("moon.pwd").read()
+except FileNotFoundError:
+ PWD = open("/etc/moon/moon.pwd").read()
+
+os.environ["MOON_USERNAME"] = "admin"
+os.environ["MOON_PASSWORD"] = "admin"
+
+
+def get_policy_id(policies, name="MLS Policy"):
+ for policy_id, policy_value in policies.get("policies").items():
+ if policy_value.get("name") == name:
+ return policy_id
+
+
+@pytest.fixture
+def run(testdir):
+ open(os.path.join(str(testdir), "moon.yaml"), "w").write(CONF)
+ open(os.path.join(str(testdir), "policy_example.json"), "w").write(POLICY)
+ open(os.path.join(str(testdir), "moon.pwd"), "w").write(PWD)
+
+ def do_run(*args):
+ args = ["moon_manager"] + list(args)
+ ret = testdir.run(*args)
+ print(testdir)
+ try:
+ return yaml.safe_load(ret.stdout.lines[-1])
+ except Exception as e:
+ print(e)
+ return ret.stdout
+ return do_run
+
+
+@pytest.fixture
+def import_policy(run):
+ if not get_policy_id(run("policies", "list")):
+ run("import", "policy_example.json")
+ assert get_policy_id(run("policies", "list"))
+ return get_policy_id(run("policies", "list"))
+
+
+# def test_import(run):
+# ret = run("import", "policy_example.json")
+# assert ret
+# # TODO: check if policy, meta-rule, ... have been created.
+
+
+def test_slaves(run):
+ ret = run("slaves", "list")
+ assert "slaves" in ret
+
+
+def test_pdp(run):
+ ret = run("pdp", "list")
+ assert "pdps" in ret
+
+
+def test_policies(run):
+ ret = run("policies", "list")
+ assert "policies" in ret
+
+
+def test_subjects(run):
+ ret = run("subjects", "list")
+ assert "subjects" in ret
+
+
+def test_objects(run):
+ ret = run("objects", "list")
+ assert "objects" in ret
+
+
+def test_actions(run):
+ ret = run("actions", "list")
+ assert "actions" in ret
+
+
+def test_subject_categories(run):
+ ret = run("subject_categories", "list")
+ assert "subject_categories" in ret
+
+
+def test_object_categories(run):
+ ret = run("object_categories", "list")
+ assert "object_categories" in ret
+
+
+def test_action_categories(run):
+ ret = run("action_categories", "list")
+ assert "action_categories" in ret
+
+
+# def test_subject_data(run):
+# ret = run("subject_data", "get")
+# assert "subject_data" in ret
+#
+#
+# def test_object_data(run):
+# ret = run("object_data", "get")
+# assert "object_data" in ret
+#
+#
+# def test_action_data(run):
+# ret = run("action_data", "get")
+# assert "action_data" in ret
+
+
+def test_rules(run, import_policy):
+ ret = run("rules", "list", import_policy)
+ assert "rules" in ret
+
+
+def test_meta_rules(run):
+ ret = run("meta_rules", "list")
+ assert "meta_rules" in ret
+
+
+def test_models(run):
+ ret = run("models", "list")
+ print(ret)
+ assert "models" in ret
+
+
+def test_subject_assignments(run, import_policy):
+ ret = run("subject_assignments", "list", "MLS Policy")
+ assert "subject_assignments" in ret
+ ret = run("subject_assignments", "add", "MLS Policy", "demo", "level", "low")
+ assert "subject_assignments" in ret
+ ret = run("subject_assignments", "delete", "MLS Policy", "demo", "level", "low")
+ assert ret
+
+
+def test_object_assignments(run, import_policy):
+ ret = run("object_assignments", "list", "MLS Policy")
+ assert "object_assignments" in ret
+ ret = run("object_assignments", "add", "MLS Policy", "vm3", "level", "low")
+ assert "object_assignments" in ret
+ ret = run("object_assignments", "delete", "MLS Policy", "vm3", "level", "low")
+ assert ret
+
+
+def test_action_assignments(run, import_policy):
+ ret = run("action_assignments", "list", "MLS Policy")
+ assert "action_assignments" in ret
+ ret = run("action_assignments", "add", "MLS Policy", "get_images", "type", "read")
+ assert "action_assignments" in ret
+ ret = run("action_assignments", "delete", "MLS Policy", "get_images", "type", "read")
+ assert ret
+
+
+# def test_complete(run, import_policy):
+# slaves = run("slaves", "get").get("slaves")
+# if not slaves:
+# ret = run("slaves", "create")
+# assert "slaves" in ret
+# if not get_policy_id(run("policies", "get")):
+# ret = run("import", "policy_example.json")
+# assert ret
+#
+# ret = run("subject_assignments", "create", "MLS Policy", "admin", "level", "high")
+# assert "subject_assignments" in ret
+#
+# subjects = run("subjects", "get", "-n", "admin").get("subjects")
+# subject_id = subjects
+#
+# ret = run("slaves", "delete", "-n", "default")
+# assert ret
+
+def test_users(run):
+ ret = run("users", "add", "bob", "-p password_bob")
+ if ret != {'error': 'User bob already exists'}:
+ assert ret['user_created']['username'] == 'bob'
+
+ ret = run("users", "key", "bob", "-p password_bob")
+ assert ret
+
+ ret = run("users", "list")
+ assert "users" in ret
+
+ ret = run("users", "change_password", "bob", "-p passwordbob", "-n new_password")
+ assert ret == "Wrong password"
+
+ ret = run("users", "change_password", "bob", "-p password_bob", "-n new_password")
+ assert ret['result'] == "success"
+
+ ret = run("users", "key", "bob", "-p password_bob")
+ assert not ret
+
+ ret = run("users", "key", "bob", "-p new_password")
+ assert ret
diff --git a/moon_manager/tests/func_postman/Import tests.postman_collection.json b/moon_manager/tests/func_postman/Import tests.postman_collection.json
new file mode 100644
index 00000000..93d44e62
--- /dev/null
+++ b/moon_manager/tests/func_postman/Import tests.postman_collection.json
@@ -0,0 +1,1476 @@
+{
+ "info": {
+ "_postman_id": "86591644-ffdd-4b59-87c1-64221dfa6deb",
+ "name": "Import tests",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "Import",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "b2ac03b5-4862-46f0-8c04-a2b491d5534a",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "pm.test(\"Body matches string\", function () {",
+ " pm.expect(pm.response.text()).to.include(\"Import ok !\");",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ },
+ {
+ "key": "Content-Type",
+ "name": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n \"policies\": [\n {\n \"name\": \"MLS Policy\",\n \"genre\": \"authz\",\n \"description\": \"MLS policy\",\n \"model\": {\n \"name\": \"MLS\"\n },\n \"mandatory\": true,\n \"override\": true\n }\n ],\n \"models\": [\n {\n \"name\": \"MLS\",\n \"description\": \"\",\n \"meta_rules\": [\n {\n \"name\": \"mls\"\n }\n ],\n \"override\": true\n }\n ],\n \"subjects\": [\n {\n \"name\": \"admin\",\n \"description\": \"\",\n \"extra\": {},\n \"policies\": [\n {\n \"name\": \"MLS Policy\"\n }\n ]\n },\n {\n \"name\": \"demo\",\n \"description\": \"\",\n \"extra\": {},\n \"policies\": [\n {\n \"name\": \"MLS Policy\"\n }\n ]\n }\n ],\n \"subject_categories\": [\n {\n \"name\": \"level\",\n \"description\": \"subject level\"\n }\n ],\n \"subject_data\": [\n {\n \"name\": \"high\",\n \"description\": \"\",\n \"policies\": [],\n \"category\": {\n \"name\": \"level\"\n }\n },\n {\n \"name\": \"medium\",\n \"description\": \"\",\n \"policies\": [],\n \"category\": {\n \"name\": \"level\"\n }\n },\n {\n \"name\": \"low\",\n \"description\": \"\",\n \"policies\": [],\n \"category\": {\n \"name\": \"level\"\n }\n }\n ],\n \"subject_assignments\": [\n {\n \"subject\": {\"name\": \"admin\"},\n \"category\": {\"name\": \"level\"},\n \"assignments\": [{\"name\": \"high\"}]\n },\n {\n \"subject\": {\"name\": \"demo\"},\n \"category\": {\"name\": \"level\"},\n \"assignments\": [{\"name\": \"low\"}]\n }\n ],\n \"objects\": [\n {\n \"name\": \"vm1\",\n \"description\": \"\",\n \"extra\": {},\n \"policies\": [\n {\n \"name\": \"MLS Policy\"\n }\n ]\n },\n {\n \"name\": \"vm2\",\n \"description\": \"\",\n \"extra\": {},\n \"policies\": [\n {\n \"name\": \"MLS Policy\"\n }\n ]\n },\n {\n \"name\": \"vm3\",\n \"description\": \"\",\n \"extra\": {},\n \"policies\": [\n {\n \"name\": \"MLS Policy\"\n }\n ]\n }\n ],\n \"object_categories\": [\n {\n \"name\": \"level\",\n \"description\": \"object level\"\n }\n ],\n \"object_data\": [\n {\n \"name\": \"high\",\n \"description\": \"\",\n \"policies\": [],\n \"category\": {\n \"name\": \"level\"\n }\n },\n {\n \"name\": \"medium\",\n \"description\": \"\",\n \"policies\": [],\n \"category\": {\n \"name\": \"level\"\n }\n },\n {\n \"name\": \"low\",\n \"description\": \"\",\n \"policies\": [],\n \"category\": {\n \"name\": \"level\"\n }\n }\n ],\n \"object_assignments\": [\n {\n \"object\": {\"name\": \"vm1\"},\n \"category\": {\"name\": \"level\"},\n \"assignments\": [{\"name\": \"high\"}]\n },\n {\n \"object\": {\"name\": \"vm2\"},\n \"category\": {\"name\": \"level\"},\n \"assignments\": [{\"name\": \"medium\"}]\n },\n {\n \"object\": {\"name\": \"vm3\"},\n \"category\": {\"name\": \"level\"},\n \"assignments\": [{\"name\": \"low\"}]\n }\n ],\n \"actions\": [\n {\n \"name\": \"use_image\",\n \"description\": \"use_image action for glance\",\n \"extra\": {\n \"component\": \"glance\"\n },\n \"policies\": []\n },\n {\n \"name\": \"get_images\",\n \"description\": \"get_images action for glance\",\n \"extra\": {\n \"component\": \"glance\"\n },\n \"policies\": []\n },\n {\n \"name\": \"update_image\",\n \"description\": \"update_image action for glance\",\n \"extra\": {\n \"component\": \"glance\"\n },\n \"policies\": []\n },\n {\n \"name\": \"set_image\",\n \"description\": \"set_image action for glance\",\n \"extra\": {\n \"component\": \"glance\"\n },\n \"policies\": []\n }\n ],\n \"action_categories\": [\n {\n \"name\": \"type\",\n \"description\": \"\"\n }\n ],\n \"action_data\": [\n {\n \"name\": \"read\",\n \"description\": \"read action\",\n \"policies\": [],\n \"category\": {\n \"name\": \"type\"\n }\n },\n {\n \"name\": \"write\",\n \"description\": \"write action\",\n \"policies\": [],\n \"category\": {\n \"name\": \"type\"\n }\n },\n {\n \"name\": \"execute\",\n \"description\": \"execute action\",\n \"policies\": [],\n \"category\": {\n \"name\": \"type\"\n }\n }\n ],\n \"action_assignments\": [\n {\n \"action\": {\"name\": \"use_image\"},\n \"category\": {\"name\": \"type\"},\n \"assignments\": [{\"name\": \"read\"}, {\"name\": \"execute\"}]\n },\n {\n \"action\": {\"name\": \"update_image\"},\n \"category\": {\"name\": \"type\"},\n \"assignments\": [{\"name\": \"read\"}, {\"name\": \"write\"}]\n },\n {\n \"action\": {\"name\": \"set_image\"},\n \"category\": {\"name\": \"type\"},\n \"assignments\": [{\"name\": \"write\"}]\n },\n {\n \"action\": {\"name\": \"get_images\"},\n \"category\": {\"name\": \"type\"},\n \"assignments\": [{\"name\": \"read\"}]\n }\n ],\n \"meta_rules\": [\n {\n \"name\": \"mls\",\n \"description\": \"\",\n \"subject_categories\": [{\"name\": \"level\"}],\n \"object_categories\": [{\"name\": \"level\"}],\n \"action_categories\": [{\"name\": \"type\"}]\n }\n ],\n \"rules\": [\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"high\"}],\n \"action_data\": [{\"name\": \"read\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"medium\"}],\n \"action_data\": [{\"name\": \"read\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"read\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"medium\"}],\n \"object_data\": [{\"name\": \"medium\"}],\n \"action_data\": [{\"name\": \"read\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"medium\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"read\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"low\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"read\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"high\"}],\n \"action_data\": [{\"name\": \"write\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"medium\"}],\n \"action_data\": [{\"name\": \"write\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"write\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"medium\"}],\n \"object_data\": [{\"name\": \"medium\"}],\n \"action_data\": [{\"name\": \"write\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"medium\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"write\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"low\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"write\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"high\"}],\n \"action_data\": [{\"name\": \"execute\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"medium\"}],\n \"action_data\": [{\"name\": \"execute\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"high\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"execute\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"medium\"}],\n \"object_data\": [{\"name\": \"medium\"}],\n \"action_data\": [{\"name\": \"execute\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"medium\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"execute\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n },\n {\n \"meta_rule\": {\"name\": \"mls\"},\n \"rule\": {\n \"subject_data\": [{\"name\": \"low\"}],\n \"object_data\": [{\"name\": \"low\"}],\n \"action_data\": [{\"name\": \"execute\"}]\n },\n \"policy\": {\"name\": \"MLS Policy\"},\n \"instructions\": [{\"decision\": \"grant\"}],\n \"enabled\": true\n }\n ]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/import",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "import"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Policies",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "7a625729-6d09-4932-97ea-e7e5d8a2f2a7",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "var policy_id = Object.keys(jsonData.policies)[0]",
+ "pm.globals.set(\"policy_id\", policy_id);",
+ "",
+ "pm.test(\"Get policy name\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.policies[policy_id].name).to.eql(\"MLS Policy\");",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Models",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "var model_id = Object.keys(jsonData.models)[0]",
+ "pm.globals.set(\"model_id\", model_id);",
+ "",
+ "pm.test(\"Get model name\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.models[model_id].name).to.eql(\"MLS\");",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/models",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "models"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get PDP",
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get subjects",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "var subject_id0 = Object.keys(jsonData.subjects)[0]",
+ "var subject_id1 = Object.keys(jsonData.subjects)[1]",
+ "",
+ "pm.test(\"Check subject name 1\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.subjects[subject_id0].name).to.be.oneOf([\"admin\", \"demo\"]);",
+ "});",
+ "",
+ "pm.test(\"Check subject name 2\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.subjects[subject_id1].name).to.be.oneOf([\"admin\", \"demo\"]);",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/subjects",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "subjects"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get objects",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "var object_id0 = Object.keys(jsonData.objects)[0]",
+ "var object_id1 = Object.keys(jsonData.objects)[1]",
+ "var object_id2 = Object.keys(jsonData.objects)[2]",
+ "",
+ "pm.test(\"Check object name 1\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.objects[object_id0].name).to.be.oneOf([\"vm1\", \"vm2\", \"vm3\"]);",
+ "});",
+ "",
+ "pm.test(\"Check object name 2\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.objects[object_id1].name).to.be.oneOf([\"vm1\", \"vm2\", \"vm3\"]);",
+ "});",
+ "",
+ "pm.test(\"Check object name 3\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.objects[object_id2].name).to.be.oneOf([\"vm1\", \"vm2\", \"vm3\"]);",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/objects",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "objects"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get actions",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "var action_id0 = Object.keys(jsonData.actions)[0]",
+ "var action_id1 = Object.keys(jsonData.actions)[1]",
+ "var action_id2 = Object.keys(jsonData.actions)[2]",
+ "var action_id3 = Object.keys(jsonData.actions)[3]",
+ "",
+ "pm.test(\"Check action name 1\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.actions[action_id0].name).to.be.oneOf([\"use_image\", \"update_image\", \"get_images\", \"set_image\"]);",
+ "});",
+ "",
+ "pm.test(\"Check action name 2\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.actions[action_id1].name).to.be.oneOf([\"use_image\", \"update_image\", \"get_images\", \"set_image\"]);",
+ "});",
+ "",
+ "pm.test(\"Check action name 3\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.actions[action_id2].name).to.be.oneOf([\"use_image\", \"update_image\", \"get_images\", \"set_image\"]);",
+ "});",
+ "",
+ "pm.test(\"Check action name 4\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.actions[action_id3].name).to.be.oneOf([\"use_image\", \"update_image\", \"get_images\", \"set_image\"]);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/actions",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "actions"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get subjects Assignments",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies/{{policy_id}}/subject_assignments",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies",
+ "{{policy_id}}",
+ "subject_assignments"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get objects Assignments",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies/{{policy_id}}/object_assignments",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies",
+ "{{policy_id}}",
+ "object_assignments"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get actions Assignments",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0d55b7e8-434a-4715-9966-866282b0d120",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies/{{policy_id}}/action_assignments",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies",
+ "{{policy_id}}",
+ "action_assignments"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Create Slave",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "93584814-9658-421c-abd8-7f9169eba774",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"slave_port\", jsonData.slaves[Object.keys(jsonData.slaves)[0]].extra.port);",
+ "pm.globals.set(\"engine_api_key\", jsonData.slaves[Object.keys(jsonData.slaves)[0]].extra.api_key);"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"slave_test\",\n\t\"description\": \"...\",\n\t\"address\": \"local\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/slave",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "slave"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Slaves",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "93584814-9658-421c-abd8-7f9169eba774",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"slave_port\", jsonData.slaves[Object.keys(jsonData.slaves)[0]].extra.port);",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/slaves",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "slaves"
+ ]
+ }
+ },
+ "response": [
+ {
+ "name": "Get Slaves",
+ "originalRequest": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/slaves",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "slaves"
+ ]
+ }
+ },
+ "status": "OK",
+ "code": 200,
+ "_postman_previewlanguage": "json",
+ "header": [
+ {
+ "key": "Date",
+ "value": "Tue, 27 Nov 2018 10:52:13 GMT"
+ },
+ {
+ "key": "Server",
+ "value": "WSGIServer/0.2 CPython/3.6.6"
+ },
+ {
+ "key": "content-type",
+ "value": "application/json; charset=utf-8"
+ },
+ {
+ "key": "content-length",
+ "value": "14"
+ }
+ ],
+ "cookie": [],
+ "body": "{\n \"slaves\": {}\n}"
+ }
+ ]
+ },
+ {
+ "name": "Create PDP",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"pdp_id\", Object.keys(jsonData.pdps)[0]);",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get PDP",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "pm.test(\"Check PDP name\", function () {",
+ " var jsonData = pm.response.json();",
+ " pm.expect(jsonData.pdps[Object.keys(jsonData.pdps)[0]].name).is.eq(\"pdp_1\");",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Add pipeline on slave1",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "id": "ce404af6-6555-43a1-aed4-3d21f9562d24",
+ "exec": [
+ "setTimeout(function(){}, 1000);"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "id": "1cd0f94e-8ced-4f0a-97fa-23e74e59a63f",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PUT",
+ "header": [
+ {
+ "key": "X-Api-key",
+ "type": "text",
+ "value": "{{engine_api_key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/pipeline/{{pdp_id}}",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "pipeline",
+ "{{pdp_id}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz admin 1",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/admin/vm1/get_images",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "admin",
+ "vm1",
+ "get_images"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz admin 2",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/admin/vm1/use_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "admin",
+ "vm1",
+ "use_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz admin 3",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/admin/vm1/update_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "admin",
+ "vm1",
+ "update_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz admin 4",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/admin/vm1/set_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "admin",
+ "vm1",
+ "set_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 1",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm3/get_images",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm3",
+ "get_images"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 2",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm3/set_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm3",
+ "set_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 3",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 204\", function () {",
+ " pm.response.to.have.status(204);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm3/use_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm3",
+ "use_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 4",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 403\", function () {",
+ " pm.response.to.have.status(403);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm2/get_images",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm2",
+ "get_images"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 5",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 403\", function () {",
+ " pm.response.to.have.status(403);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm2/set_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm2",
+ "set_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 6",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 403\", function () {",
+ " pm.response.to.have.status(403);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm2/set_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm2",
+ "set_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 7",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 403\", function () {",
+ " pm.response.to.have.status(403);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm1/get_images",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm1",
+ "get_images"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 8",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 403\", function () {",
+ " pm.response.to.have.status(403);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm1/set_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm1",
+ "set_image"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Test authz demo 9",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "a44804be-c5ae-440c-a4fb-b32cb522673b",
+ "exec": [
+ "pm.test(\"Status code is 403\", function () {",
+ " pm.response.to.have.status(403);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/authz/123456789/demo/vm1/set_image",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "authz",
+ "123456789",
+ "demo",
+ "vm1",
+ "set_image"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_manager/tests/func_postman/Test Manager.postman_collection.json b/moon_manager/tests/func_postman/Test Manager.postman_collection.json
new file mode 100644
index 00000000..8d74ce83
--- /dev/null
+++ b/moon_manager/tests/func_postman/Test Manager.postman_collection.json
@@ -0,0 +1,916 @@
+{
+ "info": {
+ "_postman_id": "b08759d2-c727-4dec-bff2-3858a28c6c5b",
+ "name": "Test Manager",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "Auth error",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "ec805426-ec88-4416-baed-992f3d2ffdfe",
+ "exec": [
+ "pm.test(\"Status code is 401\", function () {",
+ " pm.response.to.have.status(401);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {},
+ "url": {
+ "raw": "http://127.0.0.1:8000/status",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "status"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Create Slave",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "93584814-9658-421c-abd8-7f9169eba774",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"slave_port\", jsonData.slaves[Object.keys(jsonData.slaves)[0]].extra.port);",
+ "pm.globals.set(\"engine_api_key\", jsonData.slaves[Object.keys(jsonData.slaves)[0]].extra.api_key);"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"slave_test\",\n\t\"description\": \"...\",\n\t\"address\": \"local\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/slave",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "slave"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Slaves",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "93584814-9658-421c-abd8-7f9169eba774",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"slave_port\", jsonData.slaves[Object.keys(jsonData.slaves)[0]].port);",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"test\",\n\t\"description\": \"...\",\n\t\"address\": \"local\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/slaves",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "slaves"
+ ]
+ }
+ },
+ "response": [
+ {
+ "name": "Get Slaves",
+ "originalRequest": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"test\",\n\t\"description\": \"...\",\n\t\"address\": \"local\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/slaves",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "slaves"
+ ]
+ }
+ },
+ "status": "OK",
+ "code": 200,
+ "_postman_previewlanguage": "json",
+ "header": [
+ {
+ "key": "Date",
+ "value": "Tue, 27 Nov 2018 10:52:13 GMT"
+ },
+ {
+ "key": "Server",
+ "value": "WSGIServer/0.2 CPython/3.6.6"
+ },
+ {
+ "key": "content-type",
+ "value": "application/json; charset=utf-8"
+ },
+ {
+ "key": "content-length",
+ "value": "14"
+ }
+ ],
+ "cookie": [],
+ "body": "{\n \"slaves\": {}\n}"
+ }
+ ]
+ },
+ {
+ "name": "Status on slave",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "id": "ce404af6-6555-43a1-aed4-3d21f9562d24",
+ "exec": [
+ "setTimeout(function(){}, 2000);"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "id": "1cd0f94e-8ced-4f0a-97fa-23e74e59a63f",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/status",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "status"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Status",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "5cf62b3c-e6f3-4499-b87e-d34e37052e88",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {},
+ "url": {
+ "raw": "http://127.0.0.1:8000/status",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "status"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Create Policy",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"policy_id\", Object.keys(jsonData.policies)[0]);",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"policy_1\",\n\t\"description\": \"...\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Policy",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"policy_1\",\n\t\"description\": \"...\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies/{{policy_id}}",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies",
+ "{{policy_id}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Policies",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"policy_1\",\n\t\"description\": \"...\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/policies",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "policies"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get PDP",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"policy_1\",\n\t\"description\": \"...\"\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Create PDP",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ "",
+ "var jsonData = JSON.parse(responseBody);",
+ "pm.globals.set(\"pdp_id\", Object.keys(jsonData.pdps)[0]);",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get PDP",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get rules",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/rules",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "rules"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Subject Categories",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "bf2e2194-92e9-4e6f-8930-db19e42fb213",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-Key",
+ "type": "text",
+ "value": "{{X-Api-Key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {},
+ "url": {
+ "raw": "http://127.0.0.1:8000/subject_categories",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "subject_categories"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Add pipeline on slave1",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "id": "ce404af6-6555-43a1-aed4-3d21f9562d24",
+ "exec": [
+ "setTimeout(function(){}, 1000);"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "id": "1cd0f94e-8ced-4f0a-97fa-23e74e59a63f",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PUT",
+ "header": [
+ {
+ "key": "X-Api-key",
+ "value": "{{engine_api_key}}",
+ "type": "text"
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:{{slave_port}}/pipeline/ad7c3600d32c477f8b24dae62333bb5b",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "{{slave_port}}",
+ "path": [
+ "pipeline",
+ "ad7c3600d32c477f8b24dae62333bb5b"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get pipeline status",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "id": "ce404af6-6555-43a1-aed4-3d21f9562d24",
+ "exec": [
+ "setTimeout(function(){}, 1000);"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "id": "1cd0f94e-8ced-4f0a-97fa-23e74e59a63f",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "X-Api-key",
+ "type": "text",
+ "value": "{{engine_api_key}}"
+ },
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"name\": \"pdp_1\",\n\t\"description\": \"...\",\n\t\"vim_project_id\": \"123456789\",\n\t\"security_pipeline\": [\"{{policy_id}}\"]\n}"
+ },
+ "url": {
+ "raw": "http://127.0.0.1:20000/status",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "20000",
+ "path": [
+ "status"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Delete PDP",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "d069a3e9-2497-40ab-99db-f2775eaf8c6d",
+ "exec": [
+ "pm.test(\"Status code is 200\", function () {",
+ " pm.response.to.have.status(200);",
+ "});",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "DELETE",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/json"
+ },
+ {
+ "key": "x-api-key",
+ "value": "{{X-Api-Key}}",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "http://127.0.0.1:8000/pdp/{{pdp_id}}",
+ "protocol": "http",
+ "host": [
+ "127",
+ "0",
+ "0",
+ "1"
+ ],
+ "port": "8000",
+ "path": [
+ "pdp",
+ "{{pdp_id}}"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+} \ No newline at end of file
diff --git a/moon_interface/moon_interface/api/__init__.py b/moon_manager/tests/func_tests/Logs/test.txt
index e69de29b..e69de29b 100644
--- a/moon_interface/moon_interface/api/__init__.py
+++ b/moon_manager/tests/func_tests/Logs/test.txt
diff --git a/moon_manager/tests/func_tests/__init__.py b/moon_manager/tests/func_tests/__init__.py
new file mode 100644
index 00000000..1fc53954
--- /dev/null
+++ b/moon_manager/tests/func_tests/__init__.py
@@ -0,0 +1,11 @@
+# Copyright 2019 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import logging
+logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s', filename='C:/Users/nzpb1414/PycharmProjects/meta_data_log.log')
+logger = logging.getLogger(__name__)
+
+logger.info('heelloo: Starts')
+logger.debug('Meta-Data Test: Starts') \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/README.md b/moon_manager/tests/func_tests/features/README.md
new file mode 100644
index 00000000..ae7fc240
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/README.md
@@ -0,0 +1,11 @@
+# Installation
+
+```bash
+pip install behave
+
+pip install paramiko
+
+pip install numpy
+
+pip install astropy
+``` \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/__init__.py b/moon_manager/tests/func_tests/features/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_manager/tests/func_tests/features/assignments.feature b/moon_manager/tests/func_tests/features/assignments.feature
new file mode 100644
index 00000000..543eaba2
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/assignments.feature
@@ -0,0 +1,290 @@
+Feature: Assignments
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1,metarule9 |
+ | universitymodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ | universitymodel3 | Thisisabasicmodel | metarule9 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | universitymodel | Education |
+ | Cambridge Policy | This is a basic policy | universitymodel3 | Education |
+ And the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Cambridge Policy |
+ | WilliamsGeorge | Thisdatahasthevalueofsubjectperimeter | gwilliams@orange.com | abc1234 | |
+ And the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Cambridge Policy |
+ | Vacations | Thisistherequesttoaccessfile | |
+ And the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Cambridge Policy |
+ | Edit | Thisistheactionrequired | |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | Stanford | This data has the value of subject category |
+ | Stanford Policy | Authorization-Level: | Professor | This data has the value of subject category |
+ | Cambridge Policy | Affiliation: | University-of-Cambridge | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Professor | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Lecturer | This data has the value of subject category |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Public | This data has the value of object category |
+ | Stanford Policy | Type: | Adminstrative | This data has the value of object category |
+ | Stanford Policy | Type: | Staff | This data has the value of object category |
+ | Cambridge Policy | Type: | Adminstrative | This data has the value of object category |
+ | Cambridge Policy | Type: | Teaching-Staff | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Confidential | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Access-with-permission | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Public | This data has the value of object category |
+
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Low | This data has the value of action category |
+ | Stanford Policy | Action-Priority: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | High | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Medium | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Severe | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Intermediate | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Low | This data has the value of action category |
+
+
+ Scenario: Add subject assignment
+ When the user sets to add the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | University-of-Cambridge | Cambridge Policy |
+ | WilliamsJoeseph | Authorization-Level: | Lecturer | Cambridge Policy |
+ Then the following subject assignment should be existed in the system
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | University-of-Cambridge | Cambridge Policy |
+ | WilliamsJoeseph | Authorization-Level: | Lecturer | Cambridge Policy |
+
+
+ Scenario Outline: Add subject assignment validations
+ When the user sets to add the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | <subjectperimetername> | <subjectcategory> | <subjectdata> | <policyname> |
+
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | subjectperimetername | subjectcategory | subjectdata | policyname | flag |
+ | | Affiliation: | University-of-Stanford | Stanford Policy | False |
+ | 000000000000000000000000000000000000000000000000000 | Affiliation: | University-of-Stanford | Stanford Policy | False |
+ | GeorgeWilliams | Affiliation: | University-of-Cambridge | Cambridge Policy | False |
+ | WilliamsGeorge | Authorization-Level: | Professor | Cambridge Policy | False |
+ | JohnLewis | | University-of-Stanford | Stanford Policy | False |
+ | JohnLewis | 000000000000000000000000000000000000000000000000000 | University-of-Stanford | Stanford Policy | False |
+ | WilliamsJoeseph | Authorization-Level: | | Cambridge Policy | False |
+ | WilliamsJoeseph | Authorization-Level: | 000000000000000000000000000000000000000000000000000 | Cambridge Policy | False |
+ | WilliamsJoeseph | Authorization-Level: | Admin | | False |
+ | WilliamsJoeseph | Authorization-Level: | Admin | 000000000000000000000000000000000000000000000000000 | False |
+
+ Scenario Outline: Add an existing subject assignment
+ Given the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | WilliamsJoeseph | Authorization-Level: | Lecturer | Cambridge Policy |
+ When the user sets to add the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | <subjectperimetername> | <subjectcategory> | <subjectdata> | <policyname> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | subjectperimetername | subjectcategory | subjectdata | policyname | flag |
+ | WilliamsJoeseph | Authorization-Level: | Lecturer | Cambridge Policy | False |
+ | WilliamsJoeseph | Authorization-Level: | Professor | Cambridge Policy | True |
+
+ Scenario: Delete subject assignments
+ Given the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | JohnLewis | Affiliation: | Stanford | Stanford Policy |
+ When the user sets to delete the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ Then the following subject assignment should be existed in the system
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | Stanford | Stanford Policy |
+
+
+ Scenario: Add object assignments
+ When the user sets to add the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ | ProfessorsPromotionDocument | Clearance: | Public | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Top-Secret | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Public | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential | Cambridge Policy |
+ | StudentsGradesSheet | Clearance: | Public | Cambridge Policy |
+ Then the following object assignment should be existed in the system
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential,Public | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Top-Secret,Confidential,Public | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential,Public | Cambridge Policy |
+
+
+ Scenario Outline: Add object assignment validations
+ When the user sets to add the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | <objectperimetername> | <objectcategory> | <objectdata> | <policyname> |
+
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | objectperimetername | objectcategory | objectdata | policyname | flag |
+ | | Clearance: | Confidential | Cambridge Policy | False |
+ | Vacations | Clearance: | Confidential | Stanford Policy | False |
+ | 000000000000000000000000000000000000000000000000000 | Clearance: | Confidential | Stanford Policy | False |
+ | StudentsGradesSheet | | Confidential | Cambridge Policy | False |
+ | StudentsGradesSheet | 000000000000000000000000000000000000000000000000000 | Confidential | Cambridge Policy | False |
+ | StudentsGradesSheet | Clearance: | | Cambridge Policy | False |
+ | StudentsGradesSheet | Clearance: | 000000000000000000000000000000000000000000000000000 | Stanford Policy | False |
+ | StudentsGradesSheet | Clearance: | Confidential | | False |
+ | StudentsGradesSheet | Clearance: | Confidential | 000000000000000000000000000000000000000000000000000 | False |
+
+ Scenario Outline: Add an existing object assignment
+ Given the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy |
+ When the user sets to add the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | <objectperimetername> | <objectcategory> | <objectdata> | <policyname> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | objectperimetername | objectcategory | objectdata | policyname | flag |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy | False |
+
+ Scenario: Delete object assignment
+ Given the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Public | Stanford Policy |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ When the user sets to delete the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ Then the following object assignment should be existed in the system
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Public | Stanford Policy |
+
+ Scenario: Add action assignment
+ When the user sets to add the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Delete | Action-Priority: | Medium | Cambridge Policy |
+ | Read | Action-Class: | Low | Stanford Policy |
+ Then the following action assignment should be existed in the system
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Delete | Action-Priority: | Medium | Cambridge Policy |
+ | Read | Action-Class: | Low | Stanford Policy |
+
+ Scenario Outline: Add action assignment validations
+ When the user sets to add the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | <actionperimetername> | <actioncategory> | <actiondata> | <policyname> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | actionperimetername | actioncategory | actiondata | policyname | flag |
+ | | Action-Class: | Severe | Stanford Policy | False |
+ | Edit | Action-Class: | Severe | Stanford Policy | False |
+ | 000000000000000000000000000000000000000000000000000 | Action-Class: | Severe | Stanford Policy | False |
+ | Read | | Severe | Stanford Policy | False |
+ | Read | Action-Priority: | Severe | Stanford Policy | False |
+ | Read | 000000000000000000000000000000000000000000000000000 | Severe | Stanford Policy | False |
+ | Read | Action-Class: | | Stanford Policy | False |
+ | Read | Action-Class: | 000000000000000000000000000000000000000000000000000 | Stanford Policy | False |
+ | Read | Action-Class: | high | | False |
+ | Delete | Action-Class: | high | 000000000000000000000000000000000000000000000000000 | False |
+ | Delete | Action-Class: | high | Stanford Policy | False |
+
+ Scenario Outline: Add an existing action assignment
+ Given the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ When the user sets to add the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | <actionperimetername> | <actioncategory> | <actiondata> | <policyname> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | actionperimetername | actioncategory | actiondata | policyname | flag |
+ | Read | Action-Class: | Severe | Stanford Policy | False |
+
+ Scenario: Delete action assignments
+ Given the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ | Read | Action-Class: | Low | Stanford Policy |
+ When the user sets to delete the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ Then the following action assignment should be existed in the system
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Low | Stanford Policy | \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/authorization_pipeline.feature b/moon_manager/tests/func_tests/features/authorization_pipeline.feature
new file mode 100644
index 00000000..8a175915
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/authorization_pipeline.feature
@@ -0,0 +1,388 @@
+Feature: Authorization Pipeline
+
+ Background:
+
+ #Given the manager is configured
+ Given no slave is created
+ And the slave is created
+ And the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1 |
+ | universitymodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ | universitymodel3 | Thisisabasicmodel | metarule9 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | universitymodel | Education |
+ | Cambridge Policy | This is a basic policy | universitymodel3 | Education |
+ And the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Stanford Policy |
+ And the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Cambridge Policy |
+ #| WilliamsGeorge | Thisdatahasthevalueofsubjectperimeter | gwilliams@orange.com | abc1234 | |
+ And the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Cambridge Policy |
+ #| Vacations | Thisistherequesttoaccessfile | |
+ And the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Cambridge Policy |
+ #| Edit | Thisistheactionrequired | |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | Stanford | This data has the value of subject category |
+ | Cambridge Policy | Affiliation: | University-of-Cambridge | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Professor | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Lecturer | This data has the value of subject category |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Public | This data has the value of object category |
+ | Cambridge Policy | Type: | Adminstrative | This data has the value of object category |
+ | Cambridge Policy | Type: | Teaching-Staff | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Confidential | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Access-with-permission | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Public | This data has the value of object category |
+
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | High | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Medium | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Severe | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Intermediate | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Low | This data has the value of action category |
+
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | Stanford | Stanford Policy |
+
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | StudentsGradesSheet | Clearance: | Access-with-permission | Cambridge Policy |
+ | StudentsGradesSheet | Clearance: | Public | Cambridge Policy |
+ #| StudentsGradesSheet | Clearance: | Top-Secret | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy |
+ #| StudentsGradesSheet | Clearance: | Public | Stanford Policy |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ #| Read | Action-Class: | Low | Stanford Policy |
+ | Delete | Action-Priority: | High | Cambridge Policy |
+ | Delete | Action-Priority: | Medium | Cambridge Policy |
+ | Delete | Action-Priority: | Low | Cambridge Policy |
+ And the following rule exists
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ #| University-of-Stanford,Professor,Public,Adminstrative,Low,Low | metarule9 | grant | Stanford Policy |
+ And the pipeline is running
+ And the following authorization request is granted through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | StudentsGradesSheet | Read |
+
+ Scenario: Check authorization response after rule deletion
+ When the user sets to delete the following rules
+ | rule | metarulename | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after rule deletion then addition
+ When the user sets to delete the following rules
+ | rule | metarulename | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | Stanford Policy |
+ And the user sets to add the following rules
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+Scenario: Check authorization response after subject assignment deletion
+ When the user sets to delete the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after subject assignment deletion then addition
+ When the user sets to delete the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the user sets to add the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after object assignment deletion
+ When the user sets to delete the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after object assignment deletion then addition
+ When the user sets to delete the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ And the user sets to add the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after action assignment deletion
+ When When the user sets to delete the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after action assignment deletion then addition
+ When the user sets to delete the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ And the user sets to add the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Low | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+
+ Scenario: Check authorization response after subject data deletion
+ When the user sets to delete the following subject data
+ | policyname | subjectcategory | subjectdataname |
+ | Stanford Policy | Affiliation: | University-of-Stanford |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after subject data deletion then addition
+ When the user sets to delete the following subject data
+ | policyname | subjectcategory | subjectdataname |
+ | Stanford Policy | Affiliation: | University-of-Stanford |
+ And the user sets to add the following subject data
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after object data deletion
+ When the user sets to delete the following object data
+ | policyname | objectcategory | objectdataname |
+ | Stanford Policy | Clearance: | Top-Secret |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after object data deletion then addition
+ When the user sets to delete the following object data
+ | policyname | objectcategory | objectdataname |
+ | Stanford Policy | Clearance: | Top-Secret |
+ And the user sets to add the following object data
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after action data deletion
+ When the user sets to delete the following action data
+ | policyname | actioncategory | actiondataname |
+ | Stanford Policy | Action-Class: | Severe |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after action data deletion then addition
+ When the user sets to delete the following action data
+ | policyname | actioncategory | actiondataname |
+ | Stanford Policy | Action-Class: | Severe |
+ And the user sets to add the following action data
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+
+ Scenario: Check authorization response after subject perimeter deletion
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after subject perimeter deletion then addition
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ And the user sets to add the following subject perimeter
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after object perimeter deletion
+ When the user sets to delete the following object perimeter
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after object perimeter deletion then addition
+ When the user sets to delete the following object perimeter
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ And the user sets to add the following object perimeter
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after action perimeter deletion
+ When the user sets to delete the following action perimeter
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after action perimeter deletion then addition
+ When the user sets to delete the following action perimeter
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ And the user sets to add the following action perimeter
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ And the following authorization request is sent through pipeline
+ | subjectperimetername | objectperimetername | actionperimetername |
+ | JohnLewis | ProfessorsPromotionDocument | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
diff --git a/moon_manager/tests/func_tests/features/authorization_wrapper.feature b/moon_manager/tests/func_tests/features/authorization_wrapper.feature
new file mode 100644
index 00000000..43fdb519
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/authorization_wrapper.feature
@@ -0,0 +1,386 @@
+Feature: Authorization Wrapper
+
+ Background:
+
+ Given no slave is created
+ And the slave is created
+ And the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1 |
+ | universitymodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ | universitymodel3 | Thisisabasicmodel | metarule9 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | universitymodel | Education |
+ | Cambridge Policy | This is a basic policy | universitymodel3 | Education |
+ And the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Stanford Policy |
+ And the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Cambridge Policy |
+ #| WilliamsGeorge | Thisdatahasthevalueofsubjectperimeter | gwilliams@orange.com | abc1234 | |
+ And the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Cambridge Policy |
+ #| Vacations | Thisistherequesttoaccessfile | |
+ And the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Cambridge Policy |
+ #| Edit | Thisistheactionrequired | |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | Stanford | This data has the value of subject category |
+ | Cambridge Policy | Affiliation: | University-of-Cambridge | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Professor | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Lecturer | This data has the value of subject category |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Public | This data has the value of object category |
+ | Cambridge Policy | Type: | Adminstrative | This data has the value of object category |
+ | Cambridge Policy | Type: | Teaching-Staff | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Confidential | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Access-with-permission | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Public | This data has the value of object category |
+
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | High | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Medium | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Severe | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Intermediate | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Low | This data has the value of action category |
+
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | Stanford | Stanford Policy |
+
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | StudentsGradesSheet | Clearance: | Access-with-permission | Cambridge Policy |
+ | StudentsGradesSheet | Clearance: | Public | Cambridge Policy |
+ #| StudentsGradesSheet | Clearance: | Top-Secret | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy |
+ #| StudentsGradesSheet | Clearance: | Public | Stanford Policy |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ #| Read | Action-Class: | Low | Stanford Policy |
+ | Delete | Action-Priority: | High | Cambridge Policy |
+ | Delete | Action-Priority: | Medium | Cambridge Policy |
+ | Delete | Action-Priority: | Low | Cambridge Policy |
+ And the following rule exists
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ #| University-of-Stanford,Professor,Public,Adminstrative,Low,Low | metarule9 | grant | Stanford Policy |
+ And the following authorization request is granted through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+
+ Scenario: Check authorization response after rule deletion
+ When the user sets to delete the following rules
+ | rule | metarulename | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after rule deletion then addition
+ When the user sets to delete the following rules
+ | rule | metarulename | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | Stanford Policy |
+ And the user sets to add the following rules
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after subject assignment deletion
+ When the user sets to delete the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after subject assignment deletion then addition
+ When the user sets to delete the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the user sets to add the following subject assignment
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after object assignment deletion
+ When the user sets to delete the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after object assignment deletion then addition
+ When the user sets to delete the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ And the user sets to add the following object assignment
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after action assignment deletion
+ When When the user sets to delete the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after action assignment deletion then addition
+ When the user sets to delete the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ And the user sets to add the following action assignment
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Low | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+
+ Scenario: Check authorization response after subject data deletion
+ When the user sets to delete the following subject data
+ | policyname | subjectcategory | subjectdataname |
+ | Stanford Policy | Affiliation: | University-of-Stanford |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after subject data deletion then addition
+ When the user sets to delete the following subject data
+ | policyname | subjectcategory | subjectdataname |
+ | Stanford Policy | Affiliation: | University-of-Stanford |
+ And the user sets to add the following subject data
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after object data deletion
+ When the user sets to delete the following object data
+ | policyname | objectcategory | objectdataname |
+ | Stanford Policy | Clearance: | Top-Secret |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after object data deletion then addition
+ When the user sets to delete the following object data
+ | policyname | objectcategory | objectdataname |
+ | Stanford Policy | Clearance: | Top-Secret |
+ And the user sets to add the following object data
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after action data deletion
+ When the user sets to delete the following action data
+ | policyname | actioncategory | actiondataname |
+ | Stanford Policy | Action-Class: | Severe |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after action data deletion then addition
+ When the user sets to delete the following action data
+ | policyname | actioncategory | actiondataname |
+ | Stanford Policy | Action-Class: | Severe |
+ And the user sets to add the following action data
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+
+ Scenario: Check authorization response after subject perimeter deletion
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after subject perimeter deletion then addition
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ And the user sets to add the following subject perimeter
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after object perimeter deletion
+ When the user sets to delete the following object perimeter
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after object perimeter deletion then addition
+ When the user sets to delete the following object perimeter
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ And the user sets to add the following object perimeter
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
+
+ Scenario: Check authorization response after action perimeter deletion
+ When the user sets to delete the following action perimeter
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | denied |
+
+ Scenario: Check authorization response after action perimeter deletion then addition
+ When the user sets to delete the following action perimeter
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ And the user sets to add the following action perimeter
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ And the following authorization request is sent through wrapper
+ | keystone_project_id | subjectperimetername | objectperimetername | actionperimetername |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | JohnLewis | StudentsGradesSheet | Read |
+ Then the authorization response should be the following
+ | auth_response |
+ | grant |
diff --git a/moon_manager/tests/func_tests/features/data.feature b/moon_manager/tests/func_tests/features/data.feature
new file mode 100644
index 00000000..1edb4098
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/data.feature
@@ -0,0 +1,330 @@
+Feature: Data
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1 |
+ | universitymodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ | universitymodel3 | Thisisabasicmodel | metarule8 |
+ | universitymodel4 | Thisisabasicmodel | metarule9 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | universitymodel | Education |
+ | Cambridge Policy | This is a basic policy | universitymodel3 | Education |
+ | MIT Policy | This is a basic policy | universitymodel2 | Education |
+ | Oxford Policy | This is a basic policy | universitymodel4 | Education |
+
+
+ Scenario: Add subject data
+ When the user sets to add the following subject data
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Cambridge Policy | Authorization-Level: | Teaching-staff | This data has the value of subject category |
+ | MIT Policy | Authorization-Level: | Teaching-staff | This data has the value of subject category |
+ | MIT Policy | Affiliation: | University-of-MIT | This data has the value of subject category |
+ | Oxford Policy | Affiliation: | University-of-Oxford | This data has the value of subject category |
+ | Oxford Policy | Authorization-Level: | Teaching-staff | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ Then the following subject data should be existed in the system
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Cambridge Policy | Authorization-Level: | Teaching-staff | This data has the value of subject category |
+ | MIT Policy | Authorization-Level: | Teaching-staff | This data has the value of subject category |
+ | MIT Policy | Affiliation: | University-of-MIT | This data has the value of subject category |
+ | Oxford Policy | Affiliation: | University-of-Oxford | This data has the value of subject category |
+ | Oxford Policy | Authorization-Level: | Teaching-staff | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+
+ Scenario Outline: Add subject data validations
+ When the user sets to add the following subject data
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | <policyname> | <subjectcategory> | <subjectdataname> | <subjectdatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription | flag |
+ | | Affiliation: | University-of-Stanford | This data has the value of subject category | False |
+ | 000000000000000000000000000000000000000000000000000000000 | Affiliation: | University-of-Stanford | This data has the value of subject category | False |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | Affiliation: | University-of-Stanford | This data has the value of subject category | False |
+ | 0000000000000000000000000000000000000000000000000000000000000000000 | Affiliation: | University-of-Stanford | This data has the value of subject category | False |
+ | Cambridge Policy | Affiliation: | University-of-Cambridge | This data has the value of subject category | False |
+ | Stanford Policy | | University-of-Stanford | This data has the value of subject category | False |
+ | Stanford Policy | 000000000000000000000000000000000000000000000000000000000 | University-of-Stanford | This data has the value of subject category | False |
+ | Stanford Policy | 0000000000000000000000000000000000000000000000000000000000000000 | University-of-Stanford | This data has the value of subject category | False |
+ | Stanford Policy | 0000000000000000000000000000000000000000000000000000000000000000000 | University-of-Stanford | This data has the value of subject category | False |
+ | Stanford Policy | Affiliation: | | This data has the value of subject category | False |
+ | Stanford Policy | Affiliation: | _%University-of-Stanford%_ | This data has the value of subject category | True |
+ | Stanford Policy | Affiliation: | 1 | This data has the value of subject category | True |
+ | Stanford Policy | Affiliation: | University-of-Stanford | | True |
+ | Stanford Policy | Affiliation: | University-of-Stanford | _%This data has the value of subject category%_ | True |
+
+ Scenario Outline: Add an existing subject data
+ Given the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ When the user sets to add the following subject data
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | <policyname> | <subjectcategory> | <subjectdataname> | <subjectdatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription | flag |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category | False |
+ | Stanford Policy | Affiliation: | University-of-Stanford,Faculty-of-Computer-Science | This data has the value of subject category | True |
+
+ Scenario: Delete subject data
+ Given the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ When the user sets to delete the following subject data
+ | policyname | subjectcategory | subjectdataname |
+ | Stanford Policy | Affiliation: | University-of-Stanford |
+ Then the following subject data should be existed in the system
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | | | | |
+
+ Scenario: Delete subject data that has a recorded assignment dependency
+ Given the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ And the following subject perimeter exists
+ | policies | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword |
+ | Stanford Policy | JohnLewis | This data has the value of subject perimeter | jlewis@orange.com | abc1234 |
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | John Lewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ When the user sets to delete the following subject data
+ | policyname | subjectcategory | subjectdataname |
+ | Stanford Policy | Affiliation: | University-of-Stanford |
+ Then the system should reply the following
+ | flag |
+ | True |
+ And the following subject data should be existed in the system
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | | | | |
+
+
+ Scenario: Add object data
+ When the user sets to add the following object data
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Cambridge Policy | Type: | Adminstrative | This data has the value of object category |
+ | MIT Policy | Type: | Adminstrative | This data has the value of object category |
+ | MIT Policy | Clearance: | Confidential | This data has the value of object category |
+ | Oxford Policy | Type: | Adminstrative | This data has the value of object category |
+ | Oxford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+
+ Then the following object data should be existed in the system
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Cambridge Policy | Type: | Adminstrative | This data has the value of object category |
+ | MIT Policy | Type: | Adminstrative | This data has the value of object category |
+ | MIT Policy | Clearance: | Confidential | This data has the value of object category |
+ | Oxford Policy | Type: | Adminstrative | This data has the value of object category |
+ | Oxford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+
+ Scenario Outline: Add object data validations
+ When the user sets to add the following object data
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | <policyname> | <objectcategory> | <objectdataname> | <objectdatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | objectcategory | objectdataname | objectdatadescription | flag |
+ | | Clearance: | Confidential | This data has the value of object category | False |
+ | 000000000000000000000000000000000000000000000000000000000 | Clearance: | Confidential | This data has the value of object category | False |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | Clearance: | Confidential | This data has the value of object category | False |
+ | 0000000000000000000000000000000000000000000000000000000000000000000 | Clearance: | Confidential | This data has the value of object category | False |
+ #| Cambridge Policy | Clearance: | Confidential | This data has the value of object category | False |
+ | Stanford Policy | | Confidential | This data has the value of object category | False |
+ #| Stanford Policy | Type: | Confidential | This data has the value of object category | False |
+ | Stanford Policy | 000000000000000000000000000000000000000000000000000000000 | Confidential | This data has the value of object category | False |
+ | Stanford Policy | 0000000000000000000000000000000000000000000000000000000000000000 | Confidential | This data has the value of object category | False |
+ | Stanford Policy | 0000000000000000000000000000000000000000000000000000000000000000000 | Confidential | This data has the value of object category | False |
+ | Stanford Policy | Clearance: | | This data has the value of object category | False |
+ | Stanford Policy | Clearance: | _%Confidential%_ | This data has the value of object category | True |
+ | Stanford Policy | Clearance: | 1 | This data has the value of object category | True |
+ | Stanford Policy | Clearance: | Confidential | | True |
+ | Stanford Policy | Clearance: | Confidential | _%This data has the value of object category%_ | True |
+
+ Scenario Outline: Add an existing object data
+ Given the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ When the user sets to add the following object data
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | <policyname> | <objectcategory> | <objectdataname> | <objectdatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | objectcategory | objectdataname | objectdatadescription | flag |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category | False |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category | True |
+
+ Scenario: Delete object data
+ Given the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ When the user sets to delete the following object data
+ | policyname | objectcategory | objectdataname |
+ | Stanford Policy | Clearance: | Top-Secret |
+ Then the following object data should be existed in the system
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | | | | |
+
+ Scenario: Delete object data that has a recorded assignment dependency
+ Given the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Cambridge Policy | Type: | Top-Secret | This data has the value of object category |
+ And the following object perimeter exists
+ | policies | objectperimetername | objectperimeterdescription |
+ | Stanford Policy | ProfessorsPromotionDocument | This data has the value of object perimeter |
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Top-Secret | Stanford Policy |
+ When the user sets to delete the following object data
+ | policyname | objectcategory | objectdataname |
+ | Stanford Policy | Clearance: | Top-Secret |
+ Then the system should reply the following
+ | flag |
+ | True |
+ And the following object data should be existed in the system
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Cambridge Policy | Type: | Top-Secret | This data has the value of object category |
+
+
+ Scenario: Add action data
+ When the user sets to add the following action data
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Cambridge Policy | Action-Priority: | high | This data has the value of action category |
+ | MIT Policy | Action-Priority: | high | This data has the value of action category |
+ | MIT Policy | Action-Class: | Severe | This data has the value of action category |
+ | Oxford Policy | Action-Priority: | high | This data has the value of action category |
+ | Oxford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+
+ Then the following action data should be existed in the system
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Cambridge Policy | Action-Priority: | high | This data has the value of action category |
+ | MIT Policy | Action-Priority: | high | This data has the value of action category |
+ | MIT Policy | Action-Class: | Severe | This data has the value of action category |
+ | Oxford Policy | Action-Priority: | high | This data has the value of action category |
+ | Oxford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+
+ Scenario Outline: Add action data validations
+ When the user sets to add the following action data
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | <policyname> | <actioncategory> | <actiondataname> | <actiondatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | actioncategory | actiondataname | actiondatadescription | flag |
+ | | Action-Class: | Severe | This data has the value of action category | False |
+ | 000000000000000000000000000000000000000000000000000000000 | Action-Class: | Severe | This data has the value of action category | False |
+ | 0000000000000000000000000000000000000000000000000000000000000000 | Action-Class: | Severe | This data has the value of action category | False |
+ | 0000000000000000000000000000000000000000000000000000000000000000000 | Action-Class: | Severe | This data has the value of action category | False |
+ #| Cambridge Policy | Action-Class: | Severe | This data has the value of action category | False |
+ | Stanford Policy | | Severe | This data has the value of action category | False |
+ | Stanford Policy | 000000000000000000000000000000000000000000000000000000000 | Severe | This data has the value of action category | False |
+ | Stanford Policy | 0000000000000000000000000000000000000000000000000000000000000000 | Severe | This data has the value of action category | False |
+ | Stanford Policy | 0000000000000000000000000000000000000000000000000000000000000000000 | Severe | This data has the value of action category | False |
+ | Stanford Policy | Action-Class: | | This data has the value of action category | False |
+ | Stanford Policy | Action-Class: | _%Severe%_ | This data has the value of action category | True |
+ | Stanford Policy | Action-Class: | 1 | This data has the value of action category | True |
+ | Stanford Policy | Action-Class: | Severe | | True |
+ | Stanford Policy | Action-Class: | Severe | _%This data has the value of action category%_ | True |
+
+ Scenario Outline: Add an existing action data
+ Given the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ When the user sets to add the following action data
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | <policyname> | <actioncategory> | <actiondataname> | <actiondatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | actioncategory | actiondataname | actiondatadescription | flag |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category | False |
+ | Stanford Policy | Action-Class: | high | This data has the value of action category | True |
+
+ Scenario: Delete action data
+ Given the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ When the user sets to delete the following action data
+ | policyname | actioncategory | actiondataname |
+ | Stanford Policy | Action-Class: | Severe |
+ Then the following action data should be existed in the system
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | | | | |
+
+ Scenario: Delete action data that has a recorded assignment dependency
+ Given the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Medium | This data has the value of action category |
+ And the following action perimeter exists
+ | policies | actionperimetername | actionperimeterdescription |
+ | Stanford Policy | Read | This data has the value of action perimeter |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ When the user sets to delete the following action data
+ | policyname | actioncategory | actiondataname |
+ | Stanford Policy | Action-Class: | Severe |
+ Then the system should reply the following
+ | flag |
+ | True |
+ And the following action data should be existed in the system
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Cambridge Policy | Action-Priority: | Medium | This data has the value of action category |
diff --git a/moon_manager/tests/func_tests/features/environment.py b/moon_manager/tests/func_tests/features/environment.py
new file mode 100644
index 00000000..b65c292d
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/environment.py
@@ -0,0 +1,27 @@
+# Software Name: MOON:
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+from __future__ import print_function
+import logging
+
+logger = logging.getLogger(__name__)
+
+def before_feature(context, feature):
+ handler = logging.FileHandler(filename='Logs/'+"Automation Testing Log- "+ feature.name + ".log")
+ formatter = logging.Formatter('%(asctime)s : %(levelname)s : %(message)s')
+ handler.setFormatter(formatter)
+ handler.setLevel(logging.INFO)
+ logger.addHandler(handler)
+
+
+def before_all(context):
+ logging.getLogger("requests").setLevel(logging.WARN)
+
diff --git a/moon_manager/tests/func_tests/features/meta_data.feature b/moon_manager/tests/func_tests/features/meta_data.feature
new file mode 100644
index 00000000..18817e2e
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/meta_data.feature
@@ -0,0 +1,295 @@
+Feature: Meta Data ( Category )
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+
+
+
+ Scenario: Add subject category
+ When the user sets to add the following meta data subject category
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ Then the following meta data subject category should be existed in the system
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+
+ Scenario Outline: Add meta data subject validations
+ When the user sets to add the following meta data subject category
+ | subjectmetadataname | subjectmetadatadescription |
+ | <subjectmetadataname> | <subjectmetadatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | subjectmetadataname | subjectmetadatadescription | flag |
+ | | This meta data has the categorical information about a subject | False |
+ | Affiliation: | | True |
+ | 1 | This meta data has the categorical information about a subject% | True |
+ | _%Affiliation:%_ | This meta data has the categorical information about a subject | True |
+
+ Scenario: Add an existing meta data subject
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about an subject1 |
+ When the user sets to add the following meta data subject category
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about an subject1 |
+ Then the system should reply the following
+ | flag |
+ | False |
+
+ Scenario: Delete subject category
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ When the user sets to delete the following meta data subject category
+ | subjectmetadataname |
+ | Affiliation: |
+ Then the following meta data subject category should be existed in the system
+ | subjectmetadataname | subjectmetadatadescription |
+ | | |
+
+ Scenario: Delete subject category that has a recorded meta-rule dependency
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic meta rule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta data subject category
+ | subjectmetadataname |
+ | Affiliation: |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following meta data subject category should be existed in the system
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+
+ Scenario: Delete subject category after deleting the recorded meta-rule dependency
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic meta rule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta-rule
+ | metarulename |
+ | metarule1 |
+ And the user sets to delete the following meta data subject category
+ | subjectmetadataname |
+ | Affiliation: |
+ Then the following meta data subject category should be existed in the system
+ | subjectmetadataname | subjectmetadatadescription |
+ | | |
+
+
+ Scenario: Add object category
+ When the user sets to add the following meta data object category
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ Then the following meta data object category should be existed in the system
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+
+ Scenario Outline: Add meta data object validations
+ When the user sets to add the following meta data object category
+ | objectmetadataname | objectmetadatadescription |
+ | <objectmetadataname> | <objectmetadatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | objectmetadataname | objectmetadatadescription | flag |
+ | | This meta data has the categorical information about an object | False |
+ | Clearance: | | True |
+ | 1 | This meta data has the categorical information about an object % | True |
+ | _%Clearance:%_ | This meta data has the categorical information about an object | True |
+
+ Scenario: Add an existing meta data object
+ Given the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ When the user sets to add the following meta data object category
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ Then the system should reply the following
+ | flag |
+ | False |
+
+ Scenario: Delete object category
+ Given the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object1 |
+ When the user sets to delete the following meta data object category
+ | objectmetadataname |
+ | Clearance: |
+ Then the following meta data object category should be existed in the system
+ | objectmetadataname | objectmetadatadescription |
+ | | |
+
+ Scenario: Delete object category that has a recorded meta-rule dependency
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic meta rule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta data object category
+ | objectmetadataname |
+ | Clearance: |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following meta data object category should be existed in the system
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+
+ Scenario: Delete object category after deleting the recorded meta-rule dependency
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic meta rule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta-rule
+ | metarulename |
+ | metarule1 |
+ And the user sets to delete the following meta data object category
+ | objectmetadataname |
+ | Clearance: |
+ Then the following meta data object category should be existed in the system
+ | objectmetadataname | objectmetadatadescription |
+ | | |
+
+
+ Scenario: Add action category
+ When the user sets to add the following meta data action category
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ Then the following meta data action category should be existed in the system
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+
+ Scenario Outline: Add meta data action validations
+ When the user sets to add the following meta data action category
+ | actionmetadataname | actionmetadatadescription |
+ | <actionmetadataname> | <actionmetadatadescription> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | actionmetadataname | actionmetadatadescription | flag |
+ | | This meta data has the categorical information about the action | False |
+ | Action-Class: | | True |
+ | 1 | This meta data has the categorical information about the action% | True |
+ | _%Action-Class:%_ | This meta data has the categorical information about the action | True |
+
+ Scenario: Add an existing meta data action
+ Given the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ When the user sets to add the following meta data action category
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ Then the system should reply the following
+ | flag |
+ | False |
+
+ Scenario: Delete action category
+ Given the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ When the user sets to delete the following meta data action category
+ | actionmetadataname |
+ | Action-Class: |
+ Then the following meta data action category should be existed in the system
+ | actionmetadataname | actionmetadatadescription |
+ | | |
+
+ Scenario: Delete action category that has a recorded meta-rule
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic meta rule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta data action category
+ | actionmetadataname |
+ | Action-Class: |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following meta data action category should be existed in the system
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+
+ Scenario: Delete action Category after deleting the recorded meta-rule dependency
+ Given the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic meta rule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta-rule
+ | metarulename |
+ | metarule1 |
+ And the user sets to delete the following meta data action category
+ | actionmetadataname |
+ | Action-Class: |
+ Then the following meta data action category should be existed in the system
+ | actionmetadataname | actionmetadatadescription |
+ | | |
+
diff --git a/moon_manager/tests/func_tests/features/meta_rules.feature b/moon_manager/tests/func_tests/features/meta_rules.feature
new file mode 100644
index 00000000..2941d1f3
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/meta_rules.feature
@@ -0,0 +1,234 @@
+Feature: Meta Rule
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+
+
+ Scenario: Add meta rules
+ When the user sets to add the following meta-rule
+ | metarulename | subjectmetadata | actionmetadata | objectmetadata | metaruledescription |
+ | A-rule | Affiliation: | Action-Class: | Clearance: | AThisisabasicmetarule |
+ | Z-rule | Authorization-Level:,Affiliation: | Action-Priority:,Action-Class: | Type:,Clearance: | ZThisisabasicmetarule |
+ Then the following meta-rules should be existed in the system
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | A-rule | AThisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | Z-rule | ZThisisabasicmetarule | Authorization-Level:,Affiliation: | Action-Priority:,Action-Class: | Type:,Clearance: |
+
+ Scenario Outline: Add meta-rule validations
+ When the user sets to add the following meta-rule
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | <metarulename> | <metaruledescription> | <subjectmetadata> | <actionmetadata> | <objectmetadata> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata | flag |
+ | | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | False |
+ | metarule1 | | Affiliation: | Action-Class: | Clearance: | True |
+ | 1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | True |
+ | _%metarule%_ | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | True |
+ | metarule1 | Thisisabasicmetarule | | Action-Class: | Clearance: | True |
+ | metarule1 | Thisisabasicmetarule | 00000000000000000000000000000000000000000 | Action-Class: | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | 0000000000000000000000000000000000000000000000000000000000000000 | Action-Class: | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | 0000000000000000000000000000000000000000000000000000000000000000000000000 | Action-Class: | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation:,,Authorization-Level: | Action-Class: | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | | Clearance: | True |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | 00000000000000000000000000000000000000000 | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | 0000000000000000000000000000000000000000000000000000000000000000 | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | 0000000000000000000000000000000000000000000000000000000000000000000000000 | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class:,,Action-Priority: | Clearance: | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | | True |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | 00000000000000000000000000000000000000000 | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | 0000000000000000000000000000000000000000000000000000000000000000 | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | 0000000000000000000000000000000000000000000000000000000000000000000000000 | False |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance:,,Type: | False |
+
+ Scenario Outline: Add an existing meta-rule
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to add the following meta-rule
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | <metarulename> | <metaruledescription> | <subjectmetadata> | <actionmetadata> | <objectmetadata> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata | flag |
+ | metarule1 | Thisisabasicmetarule | Service | Action-Priority: | Service | False |
+ | metarule2 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | False |
+
+ Scenario: Update meta rules
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ When the user sets to update the following meta-rule
+ | metarulename | updatedmetarulename | updatedmetaruledescription | updatedsubjectmetadata | updatedactionmetadata | updatedobjectmetadata |
+ | metarule1 | 1-MR-% | Thisisabasicmetarule% | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ Then the following meta-rules should be existed in the system
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | 1-MR-% | Thisisabasicmetarule% | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+
+ Scenario Outline: Update meta rules validations
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ When the user sets to update the following meta-rule
+ | metarulename | updatedmetarulename | updatedmetaruledescription | updatedsubjectmetadata | updatedactionmetadata | updatedobjectmetadata |
+ | <metarulename> | <updatedmetarulename> | <updatedmetaruledescription> | <updatedsubjectmetadata> | <updatedactionmetadata> | <updatedobjectmetadata> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | metarulename | updatedmetarulename | updatedmetaruledescription | updatedsubjectmetadata | updatedactionmetadata | updatedobjectmetadata | flag |
+ | metarule1 | | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | False |
+ | metarule1 | metaruleX | | Affiliation: | Action-Class: | Clearance: | True |
+ | metarule1 | 1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | True |
+ | metarule1 | _%metarule%_ | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | True |
+# | metarule1 | metarule1 | Thisisabasicmetarule | 0000000000000000000000 | Action-Class: | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | 0000000000000000000000000000000000000000000000000000000000000000 | Action-Class: | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | 0000000000000000000000000000000000000000000000000000000000000000000000000 | Action-Class: | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation:,,Authorization-Level: | Action-Class: | Clearance: | False |
+# | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | 0000000000000000000000 | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | 0000000000000000000000000000000000000000000000000000000000000000 | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | 0000000000000000000000000000000000000000000000000000000000000000000000000 | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class:,,Action-Priority: | Clearance: | False |
+# | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | 0000000000000000000000 | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | 0000000000000000000000000000000000000000000000000000000000000000 | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | 0000000000000000000000000000000000000000000000000000000000000000000000000 | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance:,,Type: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | | Action-Class: | Clearance: | True |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | | Clearance: | True |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | | True |
+ | metarule1 | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: | False |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: | False |
+
+ Scenario: Update a meta rule that has a recorded rule dependency
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford-Policy | Thisisabasicpolicy | universitymodel | Education |
+ And the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford-Policy |
+ And the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford-Policy |
+ And the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford-Policy |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford-Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford-Policy | Clearance: | Top-Secret | This data has the value of object category |
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford-Policy | Action-Class: | Severe | This data has the value of action category |
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford-Policy |
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Top-Secret | Stanford-Policy |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford-Policy |
+ And the following rule exists
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Top-Secret,Severe | metarule1 | grant | Stanford-Policy |
+ When the user sets to update the following meta-rule
+ | metarulename | updatedmetarulename | updatedmetaruledescription | updatedsubjectmetadata | updatedactionmetadata | updatedobjectmetadata |
+ | metarule1 | metarule1 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following meta-rules should be existed in the system
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+
+
+ Scenario: Delete meta rules
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ When the user sets to delete the following meta-rule
+ | metarulename |
+ | metarule1 |
+ Then the following meta-rules should be existed in the system
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | | | | | |
+
+ Scenario: Delete meta rules that has a recorded model dependency
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | Thisisabasicmodel | metarule1 |
+ When the user sets to delete the following meta-rule
+ | metarulename |
+ | metarule1 |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following meta-rules should be existed in the system
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+
+ Scenario: Delete meta rules after deleting the recorded model dependency
+ Given the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | Thisisabasicmodel | metarule1 |
+ When the user sets to delete the following model
+ | modelname |
+ | generalmodel |
+ And the user sets to delete the following meta-rule
+ | metarulename |
+ | metarule1 |
+ Then the following meta-rules should be existed in the system
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | | | | | | \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/model.feature b/moon_manager/tests/func_tests/features/model.feature
new file mode 100644
index 00000000..1f6399ab
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/model.feature
@@ -0,0 +1,176 @@
+Feature: Model
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic metarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | This is a basic metarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | This is a basic metarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | This is a basic metarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | This is a basic metarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | This is a basic metarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | This is a basic metarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | This is a basic metarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ | metarule9 | This is a basic metarule | | Action-Class:,Action-Priority: | Clearance:,Type: |
+ | metarule10 | This is a basic metarule | Affiliation:,Authorization-Level: | | Clearance:,Type: |
+ | metarule11 | This is a basic metarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | |
+
+
+ Scenario: Add model
+ When the user sets to add the following model
+ | modelname | modeldescription | metarule |
+ | A-model | Thisisabasicmodel | metarule1,metarule2,metarule6 |
+ | B-model | Thisisabasicmodel | metarule3,metarule4,metarule5 |
+ Then the following model should be existed in the system
+ | modelname | modeldescription | metarule |
+ | A-model | Thisisabasicmodel | metarule1,metarule2,metarule6 |
+ | B-model | Thisisabasicmodel | metarule3,metarule4,metarule5 |
+
+ Scenario Outline: Add model validations
+ When the user sets to add the following model
+ | modelname | modeldescription | metarule |
+ | <modelname> | <modeldescription> | <metarule> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | modelname | modeldescription | metarule | flag |
+ | | This model is for creating policy prototype | metarule8,metarule3 | False |
+ | generalmodel | | metarule8 | True |
+ | 1 | This model is for creating policy prototype% | metarule8 | True |
+ | _%model%_ | This model is for creating policy prototype1 | metarule8 | True |
+ | generalmodel | This model is for creating policy prototype | | True |
+ | generalmodel | This model is for creating policy prototype | metarule9 | True |
+ | generalmodel | This model is for creating policy prototype | metarule10 | True |
+ | generalmodel | This model is for creating policy prototype | metarule11 | True |
+ | generalmodel | This model is for creating policy prototype | metarule20 | False |
+ | generalmodel | This model is for creating policy prototype | metarule3,,metarule20 | False |
+ | generalmodel | This model is for creating policy prototype | 000000000000000000000 | False |
+ | generalmodel | This model is for creating policy prototype | 0000000000000000000000000000000000000000000000000000000000000000000 | False |
+ | generalmodel | This model is for creating policy prototype | 00000000000000000000000000000000000000000000000000000000000000000000000 | False |
+ | generalmodel | This model is for creating policy prototype | metarule8,metarule10 | True |
+
+Scenario Outline: Add an existing model
+ Given the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | This is a basic model | metarule1,metarule2,metarule6 |
+ When the user sets to add the following model
+ | modelname | modeldescription | metarule |
+ | <modelname> | <modeldescription> | <metarule> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | modelname | modeldescription | metarule | flag |
+ | generalmodel | Thisisabasicmodel | metarule1,metarule3,metarule5 | False |
+ | generalmodel1 | Thisisabasicmodel | metarule1,metarule2,metarule6 | False |
+
+ Scenario: Update model
+ Given the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | Thisisabasicmodel | metarule1,metarule2,metarule6 |
+ When the user sets to update the following model
+ | modelname | updatedmodelname | updatedmodeldescription | updatedmetarule |
+ | generalmodel | 1-M-% | This model is for creating policy prototype | metarule3,metarule5,metarule7 |
+ Then the following model should be existed in the system
+ | modelname | modeldescription | metarule |
+ | 1-M-% | This model is for creating policy prototype | metarule3,metarule5,metarule7 |
+
+ Scenario Outline: Update model validations
+ Given the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | This model is for creating policy prototype | metarule1,metarule2,metarule6 |
+ When the user sets to update the following model
+ | modelname | updatedmodelname | updatedmodeldescription | updatedmetarule |
+ | <modelname> | <updatedmodelname> | <updatedmodeldescription> | <updatedmetarule> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | modelname | updatedmodelname | updatedmodeldescription | updatedmetarule | flag |
+ | generalmodel | | This model is for creating policy prototype | metarule8,metarule3 | False |
+ | generalmodel | generalmodel | | metarule8 | True |
+ | generalmodel | 1 | This model is for creating policy prototype% | metarule8 | True |
+ | generalmodel | _%model%_ | This model is for creating policy prototype1 | metarule8 | True |
+ | generalmodel | generalmodel | This model is for creating policy prototype | | True |
+ | generalmodel | generalmodel | This model is for creating policy prototype | metarule9 | True |
+ | generalmodel | generalmodel | This model is for creating policy prototype | metarule10 | True |
+ | generalmodel | generalmodel | This model is for creating policy prototype | metarule11 | True |
+ | generalmodel | generalmodel | This model is for creating policy prototype | metarule3, | False |
+ | generalmodel | generalmodel | This model is for creating policy prototype | 0000000000000000000000000000000000000000000000000000000000000000000 | False |
+ | generalmodel | generalmodel | This model is for creating policy prototype | 00000000000000000000000000000000000000000000000000000000000000000000000 | False |
+ | generalmodel | generalmodel | This model is for creating policy prototype | metarule8,metarule10 | True |
+
+ Scenario: Delete a model
+ Given the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | This model is for creating policy prototype | metarule1 |
+ When the user sets to delete the following model
+ | modelname |
+ | generalmodel |
+ Then the following model should be existed in the system
+ | modelname | modeldescription | metarule |
+ | | | |
+
+ Scenario: Delete a model that has a recorded policy dependency
+ Given the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | This model is for creating policy prototype | metarule1 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | generalpolicy | This is a basic policy | generalmodel | financial |
+ When the user sets to delete the following model
+ | modelname |
+ | generalmodel |
+ Then the following model should be existed in the system
+ | modelname | modeldescription | metarule |
+ | generalmodel | This model is for creating policy prototype | metarule1 |
+
+ Scenario: Delete a model after deleting the recorded policy dependency
+ Given the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | This model is for creating policy prototype | metarule1 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | generalpolicy | This is a basic policy | generalmodel | financial |
+ When the user sets to delete the following policy
+ | policyname |
+ | generalpolicy |
+ And the user sets to delete the following model
+ | modelname |
+ | generalmodel |
+ Then the following model should be existed in the system
+ | modelname | modeldescription | metarule |
+ | | | |
diff --git a/moon_manager/tests/func_tests/features/partner.feature b/moon_manager/tests/func_tests/features/partner.feature
new file mode 100644
index 00000000..ebce3393
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/partner.feature
@@ -0,0 +1,7 @@
+Feature: Partner
+
+ Scenario: Add Partner
+
+ Scenario: Update Partner
+
+ Scenario: Delete Partner \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/pdp.feature b/moon_manager/tests/func_tests/features/pdp.feature
new file mode 100644
index 00000000..0ba73bac
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/pdp.feature
@@ -0,0 +1,141 @@
+Feature: PDP
+
+ Background:
+
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | Thisisabasicmodel | metarule1,metarule2,metarule6 |
+ | generalmodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Policy A | Thisisabasicpolicy | generalmodel | financial |
+ | Policy B | Thisisabasicpolicy | generalmodel2 | financial |
+ | Policy C | Thisisabasicpolicy | generalmodel2 | financial |
+
+
+ Scenario: Add PDP
+ When the user sets to add the following pdp
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A |
+ | B-pdp | Thisisabasicpolicy | 1111111111111111111111111111111111111111111111111111111111111111 | Policy C |
+
+ Then the following pdp should be existed in the system
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A |
+ | B-pdp | Thisisabasicpolicy | 1111111111111111111111111111111111111111111111111111111111111111 | Policy C |
+
+ Scenario Outline: Add PDP validations
+ When the user sets to add the following pdp
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | <pdpname> | <pdpdescription> | <keystone_project_id> | <security_pipeline> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline | flag |
+ | | This pdp is for creating a collection of policies | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A | False |
+ | generalpdp | | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A | True |
+ | 1 P | This pdp is for creating a collection of policies | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A | True |
+ | _%Pdp%_ | This pdp is for creating a collection of policies% | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A | True |
+ | generalpdp | This pdp is for creating a collection of policies% | | Policy A | False |
+ | generalpdp | This pdp is for creating a collection of policies | 0000000000000000000000000000000000000000000000000000000000000000 | | False |
+ | generalpdp | This pdp is for creating a collection of policies | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A, | False |
+
+ Scenario Outline: Add an existing PDP
+ Given the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy C |
+ When the user sets to add the following pdp
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | <pdpname> | <pdpdescription> | <keystone_project_id> | <security_pipeline> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline | flag |
+ | B-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy C | False |
+ | A-pdp | Thisisabasicpolicy | 3333333333333333333333333333333333333333333333333333333333333333 | Policy A | False |
+
+ Scenario: Update PDP
+ Given the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A |
+ When the user sets to update the following pdp
+ | pdpname | updatedpdpname | updatedpdpdescription | updatedkeystone_project_id | updatedsecurity_pipeline |
+ | A-pdp | B-pdp | Thisisabasicpolicy | 111111111111111111111111111111111111111111111111111111111 | Policy B |
+ Then the following pdp should be existed in the system
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | B-pdp | Thisisabasicpolicy | 111111111111111111111111111111111111111111111111111111111 | Policy B |
+
+ Scenario Outline: Update PDP validations
+ Given the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy B |
+ | B-pdp | Thisisabasicpolicy | 2222222222222222222222222222222222222222222222222222222222222222 | Policy C |
+ When the user sets to update the following pdp
+ | pdpname | updatedpdpname | updatedpdpdescription | updatedkeystone_project_id | updatedsecurity_pipeline |
+ | <pdpname> | <updatedpdpname> | <updatedpdpdescription> | <updatedkeystone_project_id> | <updatedsecurity_pipeline> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | pdpname | updatedpdpname | updatedpdpdescription | updatedkeystone_project_id | updatedsecurity_pipeline | flag |
+ | A-pdp | | Thispdpisforcreatingacollectionofpolicies | 111111111111111111111111111111111111111111111111111111111 | Policy A | False |
+ | A-pdp | generalpdp | | 111111111111111111111111111111111111111111111111111111111 | Policy A | True |
+ | A-pdp | 1 P | Thispdpisforcreatingacollectionofpolicies | 111111111111111111111111111111111111111111111111111111111 | Policy A | True |
+ | A-pdp | _%Pdp%_ | Thispdpisforcreatingacollectionofpolicies% | 111111111111111111111111111111111111111111111111111111111 | Policy A | True |
+ | A-pdp | generalpdp | Thispdpisforcreatingacollectionofpolicies% | | Policy A | False |
+ | A-pdp | generalpdp | Thispdpisforcreatingacollectionofpolicies | 111111111111111111111111111111111111111111111111111111111 | | False |
+ | A-pdp | generalpdp | Thispdpisforcreatingacollectionofpolicies | 111111111111111111111111111111111111111111111111111111111 | Policy A, | False |
+ | A-pdp | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy B | True |
+ | A-pdp | B-pdp | Thisisabasicpolicy | 111111111111111111111111111111111111111111111111111111111 | Policy C | False |
+
+ Scenario: Delete PDP
+ Given the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | A-pdp | Thisisabasicpolicy | 0000000000000000000000000000000000000000000000000000000000000000 | Policy A |
+ When the user sets to delete the following pdp
+ | pdpname |
+ | A-pdp |
+ Then the following pdp should be existed in the system
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | | | | |
diff --git a/moon_manager/tests/func_tests/features/perimeter.feature b/moon_manager/tests/func_tests/features/perimeter.feature
new file mode 100644
index 00000000..39820e15
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/perimeter.feature
@@ -0,0 +1,465 @@
+Feature: Perimeter
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1,metarule9 |
+ | universitymodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ | universitymodel3 | Thisisabasicmodel | metarule9 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | universitymodel | Education |
+ | Cambridge Policy | This is a basic policy | universitymodel2 | Education |
+
+
+ Scenario: Add subject perimeter
+ When the user sets to add the following subject perimeter
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Cambridge Policy |
+ Then the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Cambridge Policy,Stanford Policy |
+
+ Scenario Outline: Add subject perimeter validations
+ When the user sets to add the following subject perimeter
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | <subjectperimetername> | <subjectperimeterdescription> | <subjectperimeteremail> | <subjectperimeterpassword> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies | flag |
+ | | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy | False |
+ | _%JohnLewis%_ | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy | True |
+ | JohnLewis | | jlewis@orange.com | abc1234 | Stanford Policy | True |
+ | JohnLewis | Thisistheexpecteduser% | jlewis@orange.com | abc1234 | Stanford Policy | True |
+ | JohnLewis | Thisistheexpecteduser% | jlewis@orange.com | abc1234 | | True |
+
+ Scenario Outline: Add an existing subject perimeter
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ When the user sets to add the following subject perimeter
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | <subjectperimetername> | <subjectperimeterdescription> | <subjectperimeteremail> | <subjectperimeterpassword> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies | flag |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy | False |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Cambridge Policy | True |
+
+ Scenario: Update subject perimeter
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Cambridge Policy |
+ When the user sets to update the following subject perimeter
+ | subjectperimetername | updatedsubjectperimetername | updatedsubjectperimeterdescription | updatedsubjectperimeteremail | updatedsubjectperimeterpassword | policies |
+ | JohnLewis | JoesephWilliams | Thisdatahasthevalueofsubjectperimeter | jwilliams@orange.com | abc1234 | Stanford Policy |
+ Then the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JoesephWilliams | Thisdatahasthevalueofsubjectperimeter | jwilliams@orange.com | abc1234 | Cambridge Policy,Stanford Policy |
+
+ Scenario Outline: Update subject perimeter validations
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ When the user sets to update the following subject perimeter
+ | subjectperimetername | updatedsubjectperimetername | updatedsubjectperimeterdescription | updatedsubjectperimeteremail | updatedsubjectperimeterpassword | policies |
+ | <subjectperimetername> | <updatedsubjectperimetername> | <updatedsubjectperimeterdescription> | <updatedsubjectperimeteremail> | <updatedsubjectperimeterpassword> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | subjectperimetername | updatedsubjectperimetername | updatedsubjectperimeterdescription | updatedsubjectperimeteremail | updatedsubjectperimeterpassword | policies | flag |
+ #| JohnLewis | | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy | False |
+ | JohnLewis | _%JohnLewis%_ | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy | True |
+ #| JohnLewis | JohnLewis | | jlewis@orange.com | abc1234 | Stanford Policy | True |
+ #| JohnLewis | JohnLewis | Thisistheexpecteduser% | jlewis@orange.com | abc1234 | Stanford Policy | True |
+
+Scenario: Delete subject perimeter with a policy and no assignments
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ When the user sets to delete the following subject perimeter
+ | subjectperimetername |
+ | JohnLewis |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+
+ Scenario: Check subject perimeter after removing the policy
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ Then the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | |
+
+Scenario: Delete subject perimeter with no policy
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ And the user sets to delete the following subject perimeter
+ | subjectperimetername |
+ | JohnLewis |
+ Then the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | | | | | |
+
+ Scenario: Delete subject perimeter with a policy and with assignments
+ Given the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | Stanford | This data has the value of subject category |
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | JohnLewis | Affiliation: | Stanford | Stanford Policy |
+ When the user sets to delete the following subject perimeter for a given policy
+ | subjectperimetername | policies |
+ | JohnLewis | Stanford Policy |
+ Then the system should reply the following
+ | flag |
+ | True |
+ And the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | |
+ And the following subject assignment should be existed in the system
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | | | | Stanford Policy |
+
+ Scenario: Add object perimeter
+ When the user sets to add the following object perimeter
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Cambridge Policy |
+
+ Then the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Cambridge Policy,Stanford Policy |
+
+ Scenario Outline: Add object perimeter validations
+ When the user sets to add the following object perimeter
+ | objectperimetername | objectperimeterdescription | policies |
+ | <objectperimetername> | <objectperimeterdescription> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | objectperimetername | objectperimeterdescription | policies | flag |
+ | | Thisistherequesttoaccessfile | Stanford Policy | False |
+ | _%ProfessorsPromotionDocument%_ | Thisistherequesttoaccessfile | Stanford Policy | True |
+ | ProfessorsPromotionDocument | | Stanford Policy | True |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile% | Stanford Policy | True |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile% | | True |
+
+
+ Scenario Outline: Add an existing object perimeter
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ When the user sets to add the following object perimeter
+ | objectperimetername | objectperimeterdescription | policies |
+ | <objectperimetername> | <objectperimeterdescription> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | objectperimetername | objectperimeterdescription | policies | flag |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy | False |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Cambridge Policy | True |
+
+ Scenario: Update object perimeter
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Cambridge Policy |
+ When the user sets to update the following object perimeter
+ | objectperimetername | updatedobjectperimetername | updatedobjectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | StudentsGradsSheet | Thisistherequesttoaccessfile | Stanford Policy |
+ Then the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | StudentsGradsSheet | Thisistherequesttoaccessfile | Cambridge Policy,Stanford Policy |
+
+ Scenario Outline: Update object perimeter validations
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ When the user sets to update the following object perimeter
+ | objectperimetername | updatedobjectperimetername | updatedobjectperimeterdescription | policies |
+ | <objectperimetername> | <updatedobjectperimetername> | <updatedobjectperimeterdescription> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | objectperimetername | updatedobjectperimetername | updatedobjectperimeterdescription | policies | flag |
+ | ProfessorsPromotionDocument | | Thisistherequesttoaccessfile | Stanford Policy | False |
+ | ProfessorsPromotionDocument | _%ProfessorsPromotionDocument%_ | Thisistherequesttoaccessfile | Stanford Policy | True |
+ | ProfessorsPromotionDocument | ProfessorsPromotionDocument | | Stanford Policy | True |
+ | ProfessorsPromotionDocument | ProfessorsPromotionDocument | Thisistherequesttoaccessfile% | Stanford Policy | True |
+
+ Scenario: Delete object perimeter with a policy
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ When the user sets to delete the following object perimeter
+ | objectperimetername |
+ | ProfessorsPromotionDocument |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+
+ Scenario: Check object perimeter after removing the policy
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ When the user sets to delete the following object perimeter for a given policy
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ Then the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | |
+
+ Scenario: Delete object perimeter after removing the policy
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ When the user sets to delete the following object perimeter for a given policy
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ And the user sets to delete the following object perimeter
+ | objectperimetername |
+ | ProfessorsPromotionDocument |
+ Then the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | | | |
+
+ Scenario: Delete object perimeter with a policy and with assignments
+ Given the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Public | This data has the value of object category |
+ | Stanford Policy | Type: | Adminstrative | This data has the value of object category |
+ | Stanford Policy | Type: | Staff | This data has the value of object category |
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | ProfessorsPromotionDocument | Clearance: | Public | Stanford Policy |
+ | ProfessorsPromotionDocument | Clearance: | Confidential | Stanford Policy |
+ When the user sets to delete the following object perimeter for a given policy
+ | objectperimetername | policies |
+ | ProfessorsPromotionDocument | Stanford Policy |
+ Then the system should reply the following
+ | flag |
+ | True |
+ And the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | |
+ And the following object assignment should be existed in the system
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | | | | Stanford Policy |
+
+
+ Scenario: Add action perimeter
+ When the user sets to add the following action perimeter
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Read | Thisistheactionrequired | Cambridge Policy |
+ | Delete | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Cambridge Policy |
+ Then the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | Delete | Thisistheactionrequired | Cambridge Policy,Stanford Policy |
+ | Read | Thisistheactionrequired | Cambridge Policy,Stanford Policy |
+
+ Scenario Outline: Add action perimeter validations
+ When the user sets to add the following action perimeter
+ | actionperimetername | actionperimeterdescription | policies |
+ | <actionperimetername> | <actionperimeterdescription> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | actionperimetername | actionperimeterdescription | policies | flag |
+ | | Thisistheactionrequired | Stanford Policy | False |
+ | _%Read%_ | Thisistheactionrequired | Stanford Policy | True |
+ | Read | | Stanford Policy | True |
+ | Read | Thisistheactionrequired% | Stanford Policy | True |
+ | Read | Thisistheactionrequired% | | True |
+
+
+ Scenario Outline: Add an existing action perimeter
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ When the user sets to add the following action perimeter
+ | actionperimetername | actionperimeterdescription | policies |
+ | <actionperimetername> | <actionperimeterdescription> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | actionperimetername | actionperimeterdescription | policies | flag |
+ | Read | Thisistheactionrequired | Stanford Policy | False |
+ | Read | Thisistheactionrequired | Cambridge Policy | True |
+
+ Scenario: Update action perimeter
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Read | Thisistheactionrequired | Cambridge Policy |
+ When the user sets to update the following action perimeter
+ | actionperimetername | updatedactionperimetername | updatedactionperimeterdescription | policies |
+ | Read | Delete | Thisistheactionrequired | Stanford Policy |
+ Then the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | Delete | Thisistheactionrequired | Cambridge Policy,Stanford Policy |
+
+ Scenario Outline: Update action perimeter validations
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ When the user sets to update the following action perimeter
+ | actionperimetername | updatedactionperimetername | updatedactionperimeterdescription | policies |
+ | <actionperimetername> | <updatedactionperimetername> | <updatedactionperimeterdescription> | <policies> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | actionperimetername | updatedactionperimetername | updatedactionperimeterdescription | policies | flag |
+ | Read | | Thisistheactionrequired | Stanford Policy | False |
+ | Read | _%Read%_ | Thisistheactionrequired | Stanford Policy | True |
+ | Read | Read | | Stanford Policy | True |
+ | Read | Read | Thisistheactionrequired% | Stanford Policy | True |
+
+ Scenario: Delete action perimeter with a policy
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | This is the action required | Stanford Policy |
+ When the user sets to delete the following action perimeter
+ | actionperimetername |
+ | Read |
+ Then the system should reply the following
+ | flag |
+ | False |
+ And the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | This is the action required | Stanford Policy |
+
+ Scenario: Check action perimeter after removing the policy
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ When the user sets to delete the following action perimeter for a given policy
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ Then the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | |
+
+ Scenario: Delete action perimeter after removing the policy
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ When the user sets to delete the following action perimeter for a given policy
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ And the user sets to delete the following action perimeter
+ | actionperimetername |
+ | Read |
+ Then the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | | | |
+
+ Scenario: Delete action perimeter with a policy and with assignments
+ Given the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Low | This data has the value of action category |
+ | Stanford Policy | Action-Priority: | Low | This data has the value of action category |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ | Read | Action-Class: | Low | Stanford Policy |
+ When the user sets to delete the following action perimeter for a given policy
+ | actionperimetername | policies |
+ | Read | Stanford Policy |
+ Then the system should reply the following
+ | flag |
+ | True |
+ And the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | |
+ And the following action assignment should be existed in the system
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | | | | Stanford Policy |
+
+
diff --git a/moon_manager/tests/func_tests/features/policy.feature b/moon_manager/tests/func_tests/features/policy.feature
new file mode 100644
index 00000000..e8d4077d
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/policy.feature
@@ -0,0 +1,245 @@
+Feature: Policy
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | This is a basic metarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | This is a basic metarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | This is a basic metarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | This is a basic metarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | This is a basic metarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | This is a basic metarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | This is a basic metarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | This is a basic metarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | This is a basic metarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | generalmodel | This is a basic model | metarule9 |
+ | generalmodel2 | This is a basic model | metarule3,metarule5,metarule8 |
+ | generalmodel3 | This is a basic model | metarule9 |
+
+ Scenario: Add policy
+ When the user sets to add the following policy
+ | policyname | policydescription | modelname | genre |
+ | A policy | This is a basic policy | generalmodel | financial |
+ | B policy | This is a basic policy | generalmodel | administrative |
+ Then the following policy should be existed in the system
+ | policyname | policydescription | modelname | genre |
+ | A policy | This is a basic policy | generalmodel | financial |
+ | B policy | This is a basic policy | generalmodel | administrative |
+
+ Scenario Outline: Add policy validations
+ When the user sets to add the following policy
+ | policyname | policydescription | modelname | genre |
+ | <policyname> | <policydescription> | <modelname> | <genre> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | policydescription | modelname | genre | flag |
+ | | This is a basic policy | generalmodel | financial | False |
+ | generalpolicy | | generalmodel | financial | True |
+ | generalpolicy | This is a basic policy | | financial | False |
+ | generalpolicy | This is a basic policy | 0000000000000000000000 | financial | False |
+ | generalpolicy | This is a basic policy | 0000000000000000000000000000000000000000000000000000000000000000 | financial | False |
+ | generalpolicy | This is a basic policy | 00000000000000000000000000000000000000000000000000000000000000000000 | financial | False |
+ | generalpolicy | This is a basic policy | generalmodel | | True |
+ | 1 | This is a basic policy | generalmodel | financial | True |
+ | _%policy%_ | This is a basic policy | generalmodel | financial | True |
+ | policy | This is a basic policy % | generalmodel | 1 | True |
+ | policy | This is a basic policy % | generalmodel2 | 1 | True |
+ | policy | This is a basic policy % | generalmodel | _%genere%_ | True |
+
+ Scenario Outline: Add an existing policy
+ Given the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | generalpolicy | This is a basic policy | generalmodel | financial |
+ When the user sets to add the following policy
+ | policyname | policydescription | modelname | genre |
+ | <policyname> | <policydescription> | <modelname> | <genre> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | policydescription | modelname | genre | flag |
+ | generalpolicy | This is a basic policy | generalmodel2 | financial | False |
+ | generalpolicy2 | This is a basic policy | generalmodel | financial | True |
+
+ Scenario: Update policy
+ Given the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | generalpolicy | This is a basic policy | generalmodel | financial |
+ When the user sets to update the following policy
+ | policyname | updatedpolicyname | updatedpolicydescription | updatedmodelname | updatedgenre |
+ | generalpolicy | 1 P % | This is a basic policy | generalmodel | financial |
+ Then the following policy should be existed in the system
+ | policyname | policydescription | modelname | genre |
+ | 1 P % | This is a basic policy | generalmodel | financial |
+
+ Scenario Outline: Update policy validations
+ Given the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | mainpolicy | This is a basic policy | generalmodel | adminstrative |
+ | mainpolicy2 | This is a basic policy | generalmodel | adminstrative |
+ When the user sets to update the following policy
+ | policyname | updatedpolicyname | updatedpolicydescription | updatedmodelname | updatedgenre |
+ | <policyname> | <updatedpolicyname> | <updatedpolicydescription> | <updatedmodelname> | <updatedgenre> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | policyname | updatedpolicyname | updatedpolicydescription | updatedmodelname | updatedgenre | flag |
+ | mainpolicy | | This is a basic policy | generalmodel | financial | False |
+ | mainpolicy | generalpolicy | | generalmodel | financial | True |
+ | mainpolicy | generalpolicy | This is a basic policy | | financial | False |
+ | mainpolicy | generalpolicy | This is a basic policy | 0000000000000000000000 | financial | False |
+ | mainpolicy | generalpolicy | This is a basic policy | 0000000000000000000000000000000000000000000000000000000000000000 | financial | False |
+ | mainpolicy | generalpolicy | This is a basic policy | 00000000000000000000000000000000000000000000000000000000000000000000 | financial | False |
+ | mainpolicy | generalpolicy | This is a basic policy | generalmodel | | True |
+ | mainpolicy | 1 | This is a basic policy | generalmodel | financial | True |
+ | mainpolicy | _%policy%_ | This is a basic policy | generalmodel | financial | True |
+ | mainpolicy | policy | This is a basic policy % | generalmodel | financial | True |
+ | mainpolicy | policy | This is a basic policy % | generalmodel | 1 | True |
+ | mainpolicy | policy | This is a basic policy % | generalmodel2 | 1 | False |
+ | mainpolicy | policy | This is a basic policy % | generalmodel | _%genere%_ | True |
+ | mainpolicy | mainpolicy | This is a basic policy % | generalmodel | adminstrative | True |
+ | mainpolicy | mainpolicy2 | This is a basic policy % | generalmodel | adminstrative | False |
+
+ Scenario: Delete policy
+ Given the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | generalpolicy | This is a basic policy | generalmodel | financial |
+ When the user sets to delete the following policy
+ | policyname |
+ | generalpolicy |
+ Then the following policy should be existed in the system
+ | policyname | policydescription | modelname | genre |
+ | | | | |
+
+
+ Scenario: Delete a policy that has a system attributes dependency
+ Given the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | generalmodel | financial |
+ | Cambridge Policy | This is a basic policy | generalmodel2 | Education |
+ And the following pdp exists
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | generalpdp | This is a basic pdp | 0000000000000000000000000000000000000000000000000000000000000000 | Stanford Policy |
+ And the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Cambridge Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Stanford Policy |
+ And the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Cambridge Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Stanford Policy |
+ And the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Delete | Thisistheactionrequired | Stanford Policy |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Read | Thisistheactionrequired | Cambridge Policy |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | Stanford | This data has the value of subject category |
+ | Stanford Policy | Authorization-Level: | Professor | This data has the value of subject category |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Public | This data has the value of object category |
+ | Stanford Policy | Type: | Adminstrative | This data has the value of object category |
+ | Stanford Policy | Type: | Staff | This data has the value of object category |
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Low | This data has the value of action category |
+ | Stanford Policy | Action-Priority: | Low | This data has the value of action category |
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | Stanford | Stanford Policy |
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | StudentsGradesSheet | Clearance: | Public | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Top-Secret | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ | Read | Action-Class: | Low | Stanford Policy |
+ | Read | Action-Priority: | Low | Stanford Policy |
+ When the user sets to delete the following policy
+ | policyname |
+ | Stanford Policy |
+ Then the following policy should be existed in the system
+ | policyname | policydescription | modelname | genre |
+ | Cambridge Policy | This is a basic policy | generalmodel2 | Education |
+ And the following pdp should be existed in the system
+ | pdpname | pdpdescription | keystone_project_id | security_pipeline |
+ | generalpdp | This is a basic pdp | 0000000000000000000000000000000000000000000000000000000000000000 | |
+ And the following subject perimeter should be existed in the system
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Cambridge Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | |
+ And the following object perimeter should be existed in the system
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Cambridge Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | |
+ And the following action perimeter should be existed in the system
+ | actionperimetername | actionperimeterdescription | policies |
+ | Delete | Thisistheactionrequired | |
+ | Read | Thisistheactionrequired | Cambridge Policy |
+ And the following subject data should be existed in the system
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | | | | |
+ And the following object data should be existed in the system
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | | | | |
+ And the following action data should be existed in the system
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | | | | |
+ And the following subject assignment should be existed in the system
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | | | | |
+ And the following object assignment should be existed in the system
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | | | | |
+ And the following action assignment should be existed in the system
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | | | | |
+
diff --git a/moon_manager/tests/func_tests/features/rules.feature b/moon_manager/tests/func_tests/features/rules.feature
new file mode 100644
index 00000000..e98e2b30
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/rules.feature
@@ -0,0 +1,188 @@
+Feature: Rules
+
+ Background:
+ Given the system has no rules
+ And the system has no subject assignments
+ And the system has no action assignments
+ And the system has no object assignments
+ And the system has no subject data
+ And the system has no action data
+ And the system has no object data
+ And the system has no subject perimeter
+ And the system has no object perimeter
+ And the system has no action perimeter
+ And the system has no pdps
+ And the system has no policies
+ And the system has no models
+ And the system has no meta-rules
+ And the system has no subject categories
+ And the system has no action categories
+ And the system has no object categories
+ And the following meta data subject category exists
+ | subjectmetadataname | subjectmetadatadescription |
+ | Affiliation: | This meta data has the categorical information about a subject |
+ | Authorization-Level: | This meta data has the categorical information about an object |
+ | Degree: | This meta data has the categorical information about an object |
+ And the following meta data object category exists
+ | objectmetadataname | objectmetadatadescription |
+ | Clearance: | This meta data has the categorical information about an object |
+ | Type: | This meta data has the categorical information about an object |
+ | Class: | This meta data has the categorical information about an object |
+ And the following meta data action category exists
+ | actionmetadataname | actionmetadatadescription |
+ | Action-Class: | This meta data has the categorical information about an action |
+ | Action-Priority: | This meta data has the categorical information about an action |
+ | Recommendation: | This meta data has the categorical information about an action |
+ And the following meta rule exists
+ | metarulename | metaruledescription | subjectmetadata | actionmetadata | objectmetadata |
+ | metarule1 | Thisisabasicmetarule | Affiliation: | Action-Class: | Clearance: |
+ | metarule2 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Clearance: |
+ | metarule3 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Clearance: |
+ | metarule4 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Clearance: |
+ | metarule5 | Thisisabasicmetarule | Affiliation: | Action-Class: | Type: |
+ | metarule6 | Thisisabasicmetarule | Authorization-Level: | Action-Class: | Type: |
+ | metarule7 | Thisisabasicmetarule | Affiliation: | Action-Priority: | Type: |
+ | metarule8 | Thisisabasicmetarule | Authorization-Level: | Action-Priority: | Type: |
+ | metarule9 | Thisisabasicmetarule | Affiliation:,Authorization-Level: | Action-Class:,Action-Priority: | Clearance:,Type: |
+ And the following model exists
+ | modelname | modeldescription | metarule |
+ | universitymodel | Thisisabasicmodel | metarule1,metarule9 |
+ | universitymodel2 | Thisisabasicmodel | metarule3,metarule5,metarule8 |
+ | universitymodel3 | Thisisabasicmodel | metarule9 |
+ And the following policy exists
+ | policyname | policydescription | modelname | genre |
+ | Stanford Policy | This is a basic policy | universitymodel | Education |
+ | Cambridge Policy | This is a basic policy | universitymodel3 | Education |
+ And the following subject perimeter exists
+ | subjectperimetername | subjectperimeterdescription | subjectperimeteremail | subjectperimeterpassword | policies |
+ | JohnLewis | Thisistheexpecteduser | jlewis@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Stanford Policy |
+ | WilliamsJoeseph | Thisistheexpecteduser | wjoeseph@orange.com | abc1234 | Cambridge Policy |
+ | WilliamsGeorge | Thisdatahasthevalueofsubjectperimeter | gwilliams@orange.com | abc1234 | |
+ And the following object perimeter exists
+ | objectperimetername | objectperimeterdescription | policies |
+ | ProfessorsPromotionDocument | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Stanford Policy |
+ | StudentsGradesSheet | Thisistherequesttoaccessfile | Cambridge Policy |
+ | Vacations | Thisistherequesttoaccessfile | |
+ And the following action perimeter exists
+ | actionperimetername | actionperimeterdescription | policies |
+ | Read | Thisistheactionrequired | Stanford Policy |
+ | Delete | Thisistheactionrequired | Stanford Policy |
+ | Edit | Thisistheactionrequired | |
+ And the following subject data exists
+ | policyname | subjectcategory | subjectdataname | subjectdatadescription |
+ | Stanford Policy | Affiliation: | University-of-Stanford | This data has the value of subject category |
+ | Stanford Policy | Affiliation: | Stanford | This data has the value of subject category |
+ | Cambridge Policy | Affiliation: | University-of-Cambridge | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Professor | This data has the value of subject category |
+ | Cambridge Policy | Authorization-Level: | Lecturer | This data has the value of subject category |
+ And the following object data exists
+ | policyname | objectcategory | objectdataname | objectdatadescription |
+ | Stanford Policy | Clearance: | Top-Secret | This data has the value of object category |
+ | Stanford Policy | Clearance: | Confidential | This data has the value of object category |
+ | Stanford Policy | Clearance: | Public | This data has the value of object category |
+ | Cambridge Policy | Type: | Adminstrative | This data has the value of object category |
+ | Cambridge Policy | Type: | Teaching-Staff | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Confidential | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Access-with-permission | This data has the value of object category |
+ | Cambridge Policy | Clearance: | Public | This data has the value of object category |
+
+ And the following action data exists
+ | policyname | actioncategory | actiondataname | actiondatadescription |
+ | Stanford Policy | Action-Class: | Severe | This data has the value of action category |
+ | Stanford Policy | Action-Class: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | High | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Medium | This data has the value of action category |
+ | Cambridge Policy | Action-Priority: | Low | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Severe | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Intermediate | This data has the value of action category |
+ | Cambridge Policy | Action-Class: | Low | This data has the value of action category |
+
+ And the following subject assignment exists
+ | subjectperimetername | subjectcategory | subjectdata | policyname |
+ | JohnLewis | Affiliation: | University-of-Stanford | Stanford Policy |
+ | WilliamsJoeseph | Affiliation: | Stanford | Stanford Policy |
+
+ And the following object assignment exists
+ | objectperimetername | objectcategory | objectdata | policyname |
+ | StudentsGradesSheet | Clearance: | Access-with-permission | Cambridge Policy |
+ | StudentsGradesSheet | Clearance: | Public | Cambridge Policy |
+ #| StudentsGradesSheet | Clearance: | Top-Secret | Stanford Policy |
+ | StudentsGradesSheet | Clearance: | Confidential | Stanford Policy |
+ #| StudentsGradesSheet | Clearance: | Public | Stanford Policy |
+ And the following action assignment exists
+ | actionperimetername | actioncategory | actiondata | policyname |
+ | Read | Action-Class: | Severe | Stanford Policy |
+ #| Read | Action-Class: | Low | Stanford Policy |
+ | Delete | Action-Priority: | High | Cambridge Policy |
+ | Delete | Action-Priority: | Medium | Cambridge Policy |
+ | Delete | Action-Priority: | Low | Cambridge Policy |
+
+ Scenario: Add rule
+ When the user sets to add the following rules
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ | University-of-Cambridge,Professor,Public,Adminstrative,Low,Low | metarule9 | grant | Cambridge Policy |
+ Then the following rules should be existed in the system
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ | University-of-Cambridge,Professor,Public,Adminstrative,Low,Low | metarule9 | grant | Cambridge Policy |
+
+Scenario Outline: Add rules validations
+ When the user sets to add the following rules
+ | rule | metarulename | instructions | policyname |
+ | <rule> | <metarulename> | <instructions> | <policyname> |
+ Then the system should reply the following
+ | flag |
+ | <flag> |
+ Examples:
+ | rule | metarulename | instructions | policyname | flag |
+ | | metarule1 | grant | Stanford Policy | False |
+ | Confidential,Severe | metarule1 | grant | Stanford Policy | False |
+ | ,Confidential,Severe | metarule1 | grant | Stanford Policy | False |
+ | 0000000000000000000000000000000000000000,Confidential,Severe | metarule1 | grant | Stanford Policy | False |
+ | University of USA,Confidential,Severe | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,,Confidential,Severe | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,,Confidential | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,Superficial,Severe | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,0000000000000000000000000000000000000000,Severe | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,,Severe | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential, | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,Non-Accessable | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,0000000000000000000000000000000000000000 | metarule1 | grant | Stanford Policy | False |
+ #| University-of-Stanford,Confidential,Severe, | metarule1 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,Severe | | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,Severe | metarule9 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,Severe | 000000000000000000000000000000000000000000000000000 | grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,Severe | metarule1 | not grant | Stanford Policy | False |
+ | University-of-Stanford,Confidential,Severe | metarule1 | | Stanford Policy | True |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | | False |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | 000000000000000000000000000000000000000000000000000 | False |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Cambridge Policy | False |
+
+
+ Scenario: Add existing rule
+ Given the following rule exists
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ When the user sets to add the following rules
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ Then the system should reply the following
+ | flag |
+ | False |
+
+
+ Scenario: Delete rule
+ Given the following rule exists
+ | rule | metarulename | instructions | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | grant | Stanford Policy |
+ When the user sets to delete the following rules
+ | rule | metarulename | policyname |
+ | University-of-Stanford,Confidential,Severe | metarule1 | Stanford Policy |
+ Then the system should reply the following
+ | flag |
+ | True |
+
+
diff --git a/moon_manager/tests/func_tests/features/steps/Static_Variables.py b/moon_manager/tests/func_tests/features/steps/Static_Variables.py
new file mode 100644
index 00000000..471f92fa
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/Static_Variables.py
@@ -0,0 +1,89 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+class GeneralVariables:
+ serverURL="http://127.0.0.1:8000/"
+
+ serverIP="10.237.71.141"
+
+ serverport = "22"
+
+ serverusername="ubuntu"
+
+ serverpassword="ubuntu-007"
+
+ token = "{{TOKEN}}"
+
+ auth_headers = {"X-Api-Key": token}
+
+ actual_authresponse = {'value': False}
+
+ api_responseflag = {'value': False}
+
+ pipelinePort = {'value': ""}
+
+ wrapperPort = {'value': ""}
+
+ projectAPI = ""
+
+ slaveAPI="slave"
+
+ getslavesAPI = "slaves"
+
+ pdpAPI = "pdp"
+
+ modelAPI = "models"
+
+ policyAPI = "policies"
+
+ assignpolicyid={'value': ""}
+
+ assignsubjectperimeterid = {'value': ""}
+
+ assignsubjectcategoryid = {'value': ""}
+
+ assignobjectperimeterid = {'value': ""}
+
+ assignobjectcategoryid = {'value': ""}
+
+ assignactionperimeterid = {'value': ""}
+
+ assignactioncategoryid = {'value': ""}
+
+ metarulesAPI = "meta_rules"
+
+ metadatasubjectcategoryAPI = "subject_categories"
+
+ metadataobjectcategoryAPI = "object_categories"
+
+ metadataactioncategoryAPI = "action_categories"
+
+ perimetersubjectAPI = "subjects"
+
+ perimeterobjectAPI = "objects"
+
+ perimeteractionAPI = "actions"
+
+ datasubjectAPI = "subject_data"
+
+ dataobjectAPI = "object_data"
+
+ dataactionAPI = "action_data"
+
+ assignementssubjectAPI = "subject_assignments"
+
+ assignementsobjectAPI = "object_assignments"
+
+ assignementsactionAPI = "action_assignments"
+
+ rulesAPI = "rules"
+
diff --git a/moon_manager/tests/func_tests/features/steps/__init__.py b/moon_manager/tests/func_tests/features/steps/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_manager/tests/func_tests/features/steps/assignments.py b/moon_manager/tests/func_tests/features/steps/assignments.py
new file mode 100644
index 00000000..e3f7b5a7
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/assignments.py
@@ -0,0 +1,858 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing subject meta data in the system by getting the policies then their models then the model attached meta rules and then the categories
+# 2) Get subject assignment id using both the policy id, data id & the category id
+# 3) Loop by assignment id and delete it
+@Given('the system has no subject assignments')
+def step_impl(context):
+ logger.info("Given the system has no subject assignments")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ # subjectcategoryidslist = []
+ # subjectdataidslist = []
+ # modelid = response_policies.json()[apis_urls.policyAPI][policies_ids]['model_id']
+ # if (modelid != None and modelid != ""):
+ # metaruleslist = \
+ # requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers).json()[apis_urls.modelAPI][modelid]['meta_rules']
+ # for metarule_ids in metaruleslist:
+ # categorieslist = \
+ # requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,
+ # headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ # metarule_ids]['subject_categories']
+ # for categoryid in categorieslist:
+ # if (categoryid not in subjectcategoryidslist):
+ # subjectcategoryidslist.append(categoryid)
+ #
+ # response_perimeters = requests.get(apis_urls.serverURL + apis_urls.perimetersubjectAPI,
+ # headers=apis_urls.auth_headers).json()[
+ # apis_urls.perimetersubjectAPI]
+ # for perimeterid in dict(response_perimeters).keys():
+ # for categoryid in subjectcategoryidslist:
+ # response_assignment = requests.get(
+ # apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.assignementssubjectAPI + "/" +
+ # perimeterid + "/" + categoryid, headers=apis_urls.auth_headers)
+ # if len(response_assignment.json()[apis_urls.assignementssubjectAPI]) != 0:
+ # for ids in dict(response_assignment.json()[apis_urls.assignementssubjectAPI]).keys():
+ # assignmentsid = response_assignment.json()[apis_urls.assignementssubjectAPI][str(ids)][
+ # 'assignments']
+ # for dataid in assignmentsid:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.assignementssubjectAPI , headers=headers)
+
+# Step Definition Implementation:
+# 1) Get all the existing object meta data in the system by getting the policies then their models then the model attached meta rules and then the categories
+# 2) Get object assignment id using both the policy id, data id & the category id
+# 3) Loop by assignment id and delete it
+@Given('the system has no object assignments')
+def step_impl(context):
+ logger.info("Given the system has no object assignments")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ # objectcategoryidslist = []
+ # objectdataidslist = []
+ # modelid = response_policies.json()[apis_urls.policyAPI][policies_ids]['model_id']
+ # if (modelid != None and modelid != ""):
+ # metaruleslist = \
+ # requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers).json()[
+ # apis_urls.modelAPI][modelid][
+ # 'meta_rules']
+ # for metarule_ids in metaruleslist:
+ # categorieslist = \
+ # requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,
+ # headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ # metarule_ids]['object_categories']
+ # for categoryid in categorieslist:
+ # if (categoryid not in objectcategoryidslist):
+ # objectcategoryidslist.append(categoryid)
+ #
+ # response_perimeters = \
+ # requests.get(apis_urls.serverURL + apis_urls.perimeterobjectAPI,
+ # headers=apis_urls.auth_headers).json()[
+ # apis_urls.perimeterobjectAPI]
+ # for perimeterid in dict(response_perimeters).keys():
+ # for categoryid in objectcategoryidslist:
+ # response_assignment = requests.get(
+ # apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.assignementsobjectAPI + "/" +
+ # perimeterid + "/" + categoryid, headers=apis_urls.auth_headers)
+ # if len(response_assignment.json()[apis_urls.assignementsobjectAPI]) != 0:
+ # for ids in dict(response_assignment.json()[apis_urls.assignementsobjectAPI]).keys():
+ # assignmentsid = response_assignment.json()[apis_urls.assignementsobjectAPI][str(ids)][
+ # 'assignments']
+ # for dataid in assignmentsid:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.assignementsobjectAPI , headers=headers)
+
+# Step Definition Implementation:
+# 1) Get all the existing action meta data in the system by getting the policies then their models then the model attached meta rules and then the categories
+# 2) Get action assignment id using both the policy id, data id & the category id
+# 3) Loop by assignment id and delete it
+@Given('the system has no action assignments')
+def step_impl(context):
+ logger.info("Given the system has no action assignments")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ # actioncategoryidslist = []
+ # actiondataidslist = []
+ # modelid = response_policies.json()[apis_urls.policyAPI][policies_ids]['model_id']
+ # if (modelid != None and modelid != ""):
+ # metaruleslist = \
+ # requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers).json()[
+ # apis_urls.modelAPI][modelid][
+ # 'meta_rules']
+ # for metarule_ids in metaruleslist:
+ # categorieslist = \
+ # requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,
+ # headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ # metarule_ids]['action_categories']
+ # for categoryid in categorieslist:
+ # if (categoryid not in actioncategoryidslist):
+ # actioncategoryidslist.append(categoryid)
+ #
+ # response_perimeters = \
+ # requests.get(apis_urls.serverURL + apis_urls.perimeteractionAPI,
+ # headers=apis_urls.auth_headers).json()[
+ # apis_urls.perimeteractionAPI]
+ # for perimeterid in dict(response_perimeters).keys():
+ # for categoryid in actioncategoryidslist:
+ # response_assignment = requests.get(
+ # apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.assignementsactionAPI + "/" +
+ # perimeterid + "/" + categoryid, headers=apis_urls.auth_headers)
+ # if len(response_assignment.json()[apis_urls.assignementsactionAPI]) != 0:
+ # for ids in dict(response_assignment.json()[apis_urls.assignementsactionAPI]).keys():
+ # assignmentsid = response_assignment.json()[apis_urls.assignementsactionAPI][str(ids)][
+ # 'assignments']
+ # for dataid in assignmentsid:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.assignementsactionAPI , headers=headers)
+
+# Step Definition Implementation:
+# 1) Post subject assignment using the policy id, subject perimeter id, subject category, list of subject data ids
+@Given('the following subject assignment exists')
+def step_impl(context):
+ logger.info("Given the following subject assignment exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row["subjectperimetername"] + "' subject data: '" + row[
+ "subjectdata"] + "' and subject category: '" + row[
+ "subjectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ categoriesname = ""
+ dataname = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+ perimeter_id = commonfunctions.get_subjectperimeterid(row['subjectperimetername'])
+ categories_id = commonfunctions.get_subjectcategoryid(row['subjectcategory'])
+ dataids = commonfunctions.get_subjectdataid(row['subjectdata'], categories_id, policies_id)
+ data = {
+ 'id': perimeter_id,
+ 'category_id': categories_id,
+ 'data_id': dataids,
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.assignementssubjectAPI,
+ headers=headers, data=json.dumps(data))
+
+ GeneralVariables.assignpolicyid['value'] = policies_id
+ GeneralVariables.assignsubjectperimeterid['value'] = perimeter_id
+ GeneralVariables.assignsubjectcategoryid['value'] = categories_id
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Post object assignment using the policy id, object perimeter id, object category, list of object data ids
+@Given('the following object assignment exists')
+def step_impl(context):
+ logger.info("Given the following object assignment exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object perimeter name: '" + row["objectperimetername"] + "' object data: '" + row[
+ "objectdata"] + "' and object category: '" + row[
+ "objectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ categoriesname = ""
+ dataname = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+ perimeter_id = commonfunctions.get_objectperimeterid(row['objectperimetername'])
+ categories_id = commonfunctions.get_objectcategoryid(row['objectcategory'])
+ dataids = commonfunctions.get_objectdataid(row['objectdata'], categories_id, policies_id)
+
+ data = {
+ 'id': perimeter_id,
+ 'category_id': categories_id,
+ 'policy_id': policies_id,
+ 'data_id': dataids,
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.assignementsobjectAPI,
+ headers=headers, data=json.dumps(data))
+
+ GeneralVariables.assignpolicyid['value'] = policies_id
+ GeneralVariables.assignobjectperimeterid['value'] = perimeter_id
+ GeneralVariables.assignobjectcategoryid['value'] = categories_id
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Post action assignment using the policy id, action perimeter id, action category, list of action data ids
+@Given('the following action assignment exists')
+def step_impl(context):
+ logger.info("Given the following action assignment exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "action perimeter name: '" + row["actionperimetername"] + "' action data: '" + row[
+ "actiondata"] + "' and action category: '" + row[
+ "actioncategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ categoriesname = ""
+ dataname = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+ perimeter_id = commonfunctions.get_actionperimeterid(row['actionperimetername'])
+ categories_id = commonfunctions.get_actioncategoryid(row['actioncategory'])
+ dataids = commonfunctions.get_actiondataid(row['actiondata'], categories_id, policies_id)
+
+ data = {
+ 'id': perimeter_id,
+ 'category_id': categories_id,
+ 'policy_id': policies_id,
+ 'data_id': dataids,
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.assignementsactionAPI,
+ headers=headers, data=json.dumps(data))
+
+ GeneralVariables.assignpolicyid['value'] = policies_id
+ GeneralVariables.assignactionperimeterid['value'] = perimeter_id
+ GeneralVariables.assignactioncategoryid['value'] = categories_id
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Post action assignment using the policy id, action perimeter id, action category, list of action data ids
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following subject assignment')
+def step_impl(context):
+ logger.info("When the user sets to add the following subject assignment")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row["subjectperimetername"] + "' subject data: '" + row[
+ "subjectdata"] + "' and subject category: '" + row[
+ "subjectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ categoriesname = ""
+ dataids = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policyname'] == "" or row['policyname'] == "000000000000000000000000000000000000000000000000000"):
+ policyname = "Stanford Policy"
+ else:
+ policyname = row['policyname']
+ policies_id = commonfunctions.get_policyid(policyname)
+
+ if (row["subjectperimetername"] == "" or row[
+ "subjectperimetername"] == "000000000000000000000000000000000000000000000000000"):
+ perimetername = "WilliamsJoeseph"
+ else:
+ perimetername = row["subjectperimetername"]
+ perimeter_id = commonfunctions.get_subjectperimeterid(perimetername)
+
+ if (row["subjectcategory"] == "" or row[
+ "subjectcategory"] == "000000000000000000000000000000000000000000000000000"):
+ categoriesname = "Affiliation:"
+ else:
+ categoriesname = row['subjectcategory']
+ categories_id = commonfunctions.get_subjectcategoryid(categoriesname)
+
+ if (row["subjectdata"] == "" or row["subjectdata"] == "000000000000000000000000000000000000000000000000000"):
+ dataids = "Professor"
+ else:
+ dataids = row['subjectdata']
+ dataids = commonfunctions.get_subjectdataid(dataids, categories_id, policies_id)
+
+ if (dataids == None):
+ dataids = ""
+
+ if (row["policyname"] == "" or row["policyname"] == "000000000000000000000000000000000000000000000000000"):
+ policies_id = row["policyname"]
+ if (row["subjectperimetername"] == "" or row[
+ "subjectperimetername"] == "000000000000000000000000000000000000000000000000000"):
+ perimeter_id = row["subjectperimetername"]
+ if (row["subjectcategory"] == "" or row[
+ "subjectcategory"] == "000000000000000000000000000000000000000000000000000"):
+ categories_id = row["subjectcategory"]
+ if (row["subjectdata"] == "" or row["subjectdata"] == "000000000000000000000000000000000000000000000000000"):
+ dataids = row['subjectdata']
+ data = {
+ 'id': perimeter_id,
+ 'category_id': categories_id,
+ 'data_id': dataids,
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.assignementssubjectAPI,
+ headers=headers, data=json.dumps(data))
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Post action assignment using the policy id, action perimeter id, action category, list of action data ids
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following object assignment')
+def step_impl(context):
+ logger.info("When the user sets to add the following object assignment")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object perimeter name: '" + row["objectperimetername"] + "' object data: '" + row[
+ "objectdata"] + "' and object category: '" + row[
+ "objectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ categoriesname = ""
+ dataids = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policyname'] == "" or row['policyname'] == "000000000000000000000000000000000000000000000000000"):
+ policyname = "Stanford Policy"
+ else:
+ policyname = row['policyname']
+ policies_id = commonfunctions.get_policyid(policyname)
+
+ if (row["objectperimetername"] == "" or row[
+ "objectperimetername"] == "000000000000000000000000000000000000000000000000000"):
+ perimetername = "StudentsGradesSheet"
+ else:
+ perimetername = row["objectperimetername"]
+ perimeter_id = commonfunctions.get_objectperimeterid(perimetername)
+
+ if (row["objectcategory"] == "" or row[
+ "objectcategory"] == "000000000000000000000000000000000000000000000000000"):
+ categoriesname = "Clearance:"
+ else:
+ categoriesname = row['objectcategory']
+ categories_id = commonfunctions.get_objectcategoryid(categoriesname)
+
+ if (row["objectdata"] == "" or row["objectdata"] == "000000000000000000000000000000000000000000000000000"):
+ dataids = "Confidential"
+ else:
+ dataids = row['objectdata']
+ dataids = commonfunctions.get_objectdataid(dataids, categories_id, policies_id)
+
+ if (dataids == None):
+ dataids = ""
+
+ if (row["policyname"] == "" or row["policyname"] == "000000000000000000000000000000000000000000000000000"):
+ policies_id = row["policyname"]
+ if (row["objectperimetername"] == "" or row[
+ "objectperimetername"] == "000000000000000000000000000000000000000000000000000"):
+ perimeter_id = row["objectperimetername"]
+ if (row["objectcategory"] == "" or row[
+ "objectcategory"] == "000000000000000000000000000000000000000000000000000"):
+ categories_id = row["objectcategory"]
+ if (row["objectdata"] == "" or row["objectdata"] == "000000000000000000000000000000000000000000000000000"):
+ dataids = row['objectdata']
+ data = {
+ 'id': perimeter_id,
+ 'category_id': categories_id,
+ 'data_id': dataids,
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.assignementsobjectAPI,
+ headers=headers, data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Post action assignment using the policy id, action perimeter id, action category, list of action data ids
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following action assignment')
+def step_impl(context):
+ logger.info("When the user sets to add the following action assignment")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "action perimeter name: '" + row["actionperimetername"] + "' action data: '" + row[
+ "actiondata"] + "' and action category: '" + row[
+ "actioncategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ categoriesname = ""
+ dataids = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policyname'] == "" or row['policyname'] == "000000000000000000000000000000000000000000000000000"):
+ policyname = "Stanford Policy"
+ else:
+ policyname = row['policyname']
+ policies_id = commonfunctions.get_policyid(policyname)
+
+ if (row["actionperimetername"] == "" or row[
+ "actionperimetername"] == "000000000000000000000000000000000000000000000000000"):
+ perimetername = "Read"
+ else:
+ perimetername = row["actionperimetername"]
+ perimeter_id = commonfunctions.get_actionperimeterid(perimetername)
+
+ if (row["actioncategory"] == "" or row[
+ "actioncategory"] == "000000000000000000000000000000000000000000000000000"):
+ categoriesname = "Action-Class:"
+ else:
+ categoriesname = row['actioncategory']
+ categories_id = commonfunctions.get_actioncategoryid(categoriesname)
+
+ if (row["actiondata"] == "" or row["actiondata"] == "000000000000000000000000000000000000000000000000000"):
+ dataids = "Severe"
+ else:
+ dataids = row['actiondata']
+ dataids = commonfunctions.get_actiondataid(dataids, categories_id, policies_id)
+
+ if (dataids == None):
+ dataids = ""
+
+ if (row["policyname"] == "" or row["policyname"] == "000000000000000000000000000000000000000000000000000"):
+ policies_id = row["policyname"]
+ if (row["actionperimetername"] == "" or row[
+ "actionperimetername"] == "000000000000000000000000000000000000000000000000000"):
+ perimeter_id = row["actionperimetername"]
+ if (row["actioncategory"] == "" or row[
+ "actioncategory"] == "000000000000000000000000000000000000000000000000000"):
+ categories_id = row["actioncategory"]
+ if (row["actiondata"] == "" or row["actiondata"] == "000000000000000000000000000000000000000000000000000"):
+ dataids = row['actiondata']
+ data = {
+ 'id': perimeter_id,
+ 'category_id': categories_id,
+ 'policy_id': policies_id,
+ 'data_id': dataids,
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.assignementsactionAPI,
+ headers=headers, data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Delete subject assignment by policy id,subject perimeter id, subject data id, subject category id
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following subject assignment')
+def step_impl(context):
+ logging.info("When the user sets to delete the following subject assignment")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row["subjectperimetername"] + "' subject data list: '" + row[
+ "subjectdata"] + "' and subject category: '" + row[
+ "subjectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ dataid = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+ perimeter_id = commonfunctions.get_subjectperimeterid(row['subjectperimetername'])
+ categories_id = commonfunctions.get_subjectcategoryid(row['subjectcategory'])
+ dataid = commonfunctions.get_subjectdataid(row["subjectdata"], categories_id, policies_id)
+
+ response_assignment = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.assignementssubjectAPI + "/" +
+ perimeter_id + "/" + categories_id, headers=apis_urls.auth_headers)
+ logging.info(response_assignment.json()[apis_urls.assignementssubjectAPI])
+ if len(response_assignment.json()[apis_urls.assignementssubjectAPI]) != 0:
+ for ids in dict(response_assignment.json()[apis_urls.assignementssubjectAPI]).keys():
+ assignmentsidlist = response_assignment.json()[apis_urls.assignementssubjectAPI][str(ids)][
+ 'assignments']
+ if dataid in assignmentsidlist:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.assignementssubjectAPI + "/" +
+ perimeter_id + "/" + categories_id + "/" + dataid, headers=apis_urls.auth_headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+
+# Step Definition Implementation:
+# 1) Delete object assignment by policy id, object perimeter id, object data id, object category id
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following object assignment')
+def step_impl(context):
+ logging.info("When the user sets to delete the following object assignment")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object perimeter name: '" + row["objectperimetername"] + "' object data list: '" + row[
+ "objectdata"] + "' and object category: '" + row[
+ "objectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ datalistids = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+ perimeter_id = commonfunctions.get_objectperimeterid(row['objectperimetername'])
+ categories_id = commonfunctions.get_objectcategoryid(row['objectcategory'])
+ dataid = commonfunctions.get_objectdataid(row["objectdata"], categories_id, policies_id)
+
+ response_assignment = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.assignementsobjectAPI + "/" +
+ perimeter_id + "/" + categories_id, headers=apis_urls.auth_headers)
+ if len(response_assignment.json()[apis_urls.assignementsobjectAPI]) != 0:
+ for ids in dict(response_assignment.json()[apis_urls.assignementsobjectAPI]).keys():
+ assignmentsidlist = response_assignment.json()[apis_urls.assignementsobjectAPI][str(ids)][
+ 'assignments']
+ if dataid in assignmentsidlist:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.assignementsobjectAPI + "/" +
+ perimeter_id + "/" + categories_id + "/" + dataid, headers=headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+
+# Step Definition Implementation:
+# 1) Delete action assignment by policy id, action perimeter id, action data id, action category id
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following action assignment')
+def step_impl(context):
+ logging.info("When the user sets to delete the following action assignment")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "action perimeter name: '" + row["actionperimetername"] + "' action data list: '" + row[
+ "actiondata"] + "' and action category: '" + row[
+ "actioncategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ perimeter_id = ""
+ datalistids = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+ perimeter_id = commonfunctions.get_actionperimeterid(row['actionperimetername'])
+ categories_id = commonfunctions.get_actioncategoryid(row['actioncategory'])
+ dataid = commonfunctions.get_actiondataid(row["actiondata"], categories_id, policies_id)
+
+ response_assignment = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.assignementsactionAPI + "/" +
+ perimeter_id + "/" + categories_id, headers=apis_urls.auth_headers)
+ if len(response_assignment.json()[apis_urls.assignementsactionAPI]) != 0:
+ for ids in dict(response_assignment.json()[apis_urls.assignementsactionAPI]).keys():
+ assignmentsidlist = response_assignment.json()[apis_urls.assignementsactionAPI][str(ids)][
+ 'assignments']
+ if dataid in assignmentsidlist:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.assignementsactionAPI + "/" +
+ perimeter_id + "/" + categories_id + "/" + dataid, headers=apis_urls.auth_headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing subject assignment per a given policy, subject perimeter and subject category by get request and put them into a table
+# 2) Sort the table by subject perimeter name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following subject assignment should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following subject assignment should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('subjectperimetername', 'subjectcategory', 'subjectdata', 'policyname'),
+ dtype=('S100', 'S100', 'S100', 'S100'))
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row["subjectperimetername"] + "' subject data list: '" + row[
+ "subjectdata"] + "' and subject category: '" + row[
+ "subjectcategory"] + "' and policies: '" + row['policyname'] + "'")
+ if (row['policyname'] == "" or row['subjectperimetername'] == ""):
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + GeneralVariables.assignpolicyid[
+ 'value'] + "/" + apis_urls.assignementssubjectAPI + "/" +
+ GeneralVariables.assignsubjectperimeterid['value'] + "/" +
+ GeneralVariables.assignsubjectcategoryid['value'], headers=apis_urls.auth_headers)
+ else:
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.assignementssubjectAPI + "/" +
+ commonfunctions.get_subjectperimeterid(row['subjectperimetername']) + "/" +
+ commonfunctions.get_subjectcategoryid(row['subjectcategory']), headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.assignementssubjectAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.assignementssubjectAPI]).keys():
+ apipolicies = ""
+ apisubjectname = commonfunctions.get_subjectperimetername(
+ response.json()[apis_urls.assignementssubjectAPI][str(ids)]['subject_id'])
+ apisubjectcategory = commonfunctions.get_subjectcategoryname(
+ response.json()[apis_urls.assignementssubjectAPI][str(ids)]['category_id'])
+ apiassignments = commonfunctions.get_subjectdataname(
+ response.json()[apis_urls.assignementssubjectAPI][str(ids)]['assignments'],
+ response.json()[apis_urls.assignementssubjectAPI][str(ids)]['category_id'],
+ response.json()[apis_urls.assignementssubjectAPI][str(ids)]['policy_id'])
+ apipolicies = commonfunctions.get_policyname(
+ response.json()[apis_urls.assignementssubjectAPI][str(ids)]['policy_id'])
+ if ((row['policyname'] == "" or row['subjectperimetername'] == "") and "".join(apiassignments)==""):
+ apiresult.add_row(vals=("", "", "", ""))
+ else:
+ apiresult.add_row(vals=(
+ apisubjectname, apisubjectcategory, apiassignments, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ apiresult.sort('subjectperimetername')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected subject perimeter name: '" + str(
+ row1["subjectperimetername"]) + "' is the same as the actual existing '" + str(
+ row2["subjectperimetername"]) + "'")
+ assert str(row1["subjectperimetername"]) == str(
+ row2["subjectperimetername"]), "subject perimeter name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected subject data description: '" + str(
+ row1["subjectcategory"]) + "' is the same as the actual existing '" + str(
+ row2["subjectcategory"]) + "'")
+ assert str(row1["subjectcategory"]) == str(
+ row2["subjectcategory"]), "subject category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected subject data password: '" + str(
+ row1["subjectdata"]) + "' is the same as the actual existing '" + str(
+ row2["subjectdata"]) + "'")
+ assert str(row1["subjectdata"]) == str(
+ row2["subjectdata"]), "subject data list is not correct!"
+ logger.info("assertion passed!")
+
+ #logger.info("asserting the expected policies: '" + str(
+ # row1["policyname"]) + "' is the same as the actual existing '" + str(
+ # row2["policyname"]) + "'")
+ #assert str(row1["policyname"]) == str(row2["policyname"]), " policies is not correct!"
+ #logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing object assignment per a given policy, object perimeter and object category by get request and put them into a table
+# 2) Sort the table by object perimeter name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following object assignment should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following object assignment should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('objectperimetername', 'objectcategory', 'objectdata', 'policyname'),
+ dtype=('S100', 'S100', 'S400', 'S100'))
+ for row in context.table:
+ if (row['policyname'] == "" or row['objectperimetername'] == ""):
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + GeneralVariables.assignpolicyid[
+ 'value'] + "/" + apis_urls.assignementsobjectAPI + "/" +
+ GeneralVariables.assignobjectperimeterid['value'] + "/" +
+ GeneralVariables.assignobjectcategoryid['value'], headers=apis_urls.auth_headers)
+ else:
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.assignementsobjectAPI + "/" +
+ commonfunctions.get_objectperimeterid(row['objectperimetername']) + "/" +
+ commonfunctions.get_objectcategoryid(row['objectcategory']), headers=apis_urls.auth_headers)
+
+ if len(response.json()[apis_urls.assignementsobjectAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.assignementsobjectAPI]).keys():
+ apipolicies = ""
+ apiobjectname = commonfunctions.get_objectperimetername(
+ response.json()[apis_urls.assignementsobjectAPI][str(ids)]['object_id'])
+ apiobjectcategory = commonfunctions.get_objectcategoryname(
+ response.json()[apis_urls.assignementsobjectAPI][str(ids)]['category_id'])
+ apiassignments = commonfunctions.get_objectdataname(
+ response.json()[apis_urls.assignementsobjectAPI][str(ids)]['assignments'],
+ response.json()[apis_urls.assignementsobjectAPI][str(ids)]['category_id'],
+ response.json()[apis_urls.assignementsobjectAPI][str(ids)]['policy_id'])
+ apipolicies = commonfunctions.get_policyname(
+ response.json()[apis_urls.assignementsobjectAPI][str(ids)]['policy_id'])
+ if ((row['policyname'] == "" or row['objectperimetername'] == "") and "".join(apiassignments) == ""):
+ apiresult.add_row(vals=("", "", "", ""))
+ else:
+ apiresult.add_row(vals=(
+ apiobjectname, apiobjectcategory, ",".join(apiassignments), apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ apiresult.sort('objectperimetername')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected object perimeter name: '" + str(
+ row1["objectperimetername"]) + "' is the same as the actual existing '" + str(
+ row2["objectperimetername"]) + "'")
+ assert str(row1["objectperimetername"]) == str(
+ row2["objectperimetername"]), "object perimeter name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected object data description: '" + str(
+ row1["objectcategory"]) + "' is the same as the actual existing '" + str(
+ row2["objectcategory"]) + "'")
+ assert str(row1["objectcategory"]) == str(
+ row2["objectcategory"]), "object category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected object data password: '" + str(
+ row1["objectdata"]) + "' is the same as the actual existing '" + str(
+ row2["objectdata"]) + "'")
+ assert str(row1["objectdata"]) == str(
+ row2["objectdata"]), "object data list is not correct!"
+ logger.info("assertion passed!")
+
+ #logger.info("asserting the expected policies: '" + str(
+ # row1["policyname"]) + "' is the same as the actual existing '" + str(
+ # row2["policyname"]) + "'")
+ #assert str(row1["policyname"]) == str(row2["policyname"]), " policies is not correct!"
+ #logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing action assignment per a given policy, action perimeter and action category by get request and put them into a table
+# 2) Sort the table by action perimeter name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following action assignment should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following action assignment should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('actionperimetername', 'actioncategory', 'actiondata', 'policyname'),
+ dtype=('S100', 'S100', 'S100', 'S100'))
+ for row in context.table:
+ if (row['policyname'] == "" or row['actionperimetername'] == ""):
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + GeneralVariables.assignpolicyid[
+ 'value'] + "/" + apis_urls.assignementsactionAPI + "/" +
+ GeneralVariables.assignactionperimeterid['value'] + "/" +
+ GeneralVariables.assignactioncategoryid['value'], headers=apis_urls.auth_headers)
+ else:
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.assignementsactionAPI + "/" +
+ commonfunctions.get_actionperimeterid(row['actionperimetername']) + "/" +
+ commonfunctions.get_actioncategoryid(row['actioncategory']), headers=apis_urls.auth_headers)
+
+ if len(response.json()[apis_urls.assignementsactionAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.assignementsactionAPI]).keys():
+ apipolicies = ""
+ apiactionname = commonfunctions.get_actionperimetername(
+ response.json()[apis_urls.assignementsactionAPI][str(ids)]['action_id'])
+ apiactioncategory = commonfunctions.get_actioncategoryname(
+ response.json()[apis_urls.assignementsactionAPI][str(ids)]['category_id'])
+ apiassignments = commonfunctions.get_actiondataname(
+ response.json()[apis_urls.assignementsactionAPI][str(ids)]['assignments'],
+ response.json()[apis_urls.assignementsactionAPI][str(ids)]['category_id'],
+ response.json()[apis_urls.assignementsactionAPI][str(ids)]['policy_id'])
+ apipolicies = commonfunctions.get_policyname(
+ response.json()[apis_urls.assignementsactionAPI][str(ids)]['policy_id'])
+ logger.info(apiassignments)
+ if ((row['policyname'] == "" or row['actionperimetername'] == "") and "".join(apiassignments) == ""):
+ apiresult.add_row(vals=("", "", "", ""))
+ else:
+ apiresult.add_row(vals=(
+ apiactionname, apiactioncategory, apiassignments, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ apiresult.sort('actionperimetername')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected action perimeter name: '" + str(
+ row1["actionperimetername"]) + "' is the same as the actual existing '" + str(
+ row2["actionperimetername"]) + "'")
+ assert str(row1["actionperimetername"]) == str(
+ row2["actionperimetername"]), "action perimeter name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action data description: '" + str(
+ row1["actioncategory"]) + "' is the same as the actual existing '" + str(
+ row2["actioncategory"]) + "'")
+ assert str(row1["actioncategory"]) == str(
+ row2["actioncategory"]), "action category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action data password: '" + str(
+ row1["actiondata"]) + "' is the same as the actual existing '" + str(
+ row2["actiondata"]) + "'")
+ assert str(row1["actiondata"]) == str(
+ row2["actiondata"]), "action data list is not correct!"
+ logger.info("assertion passed!")
+
+ #logger.info("asserting the expected policies: '" + str(
+ # row1["policyname"]) + "' is the same as the actual existing '" + str(
+ # row2["policyname"]) + "'")
+ #assert str(row1["policyname"]) == str(row2["policyname"]), " policies is not correct!"
+ #logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/authorization.py b/moon_manager/tests/func_tests/features/steps/authorization.py
new file mode 100644
index 00000000..5fa0ebe7
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/authorization.py
@@ -0,0 +1,217 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from common_functions import *
+import requests
+import json
+import logging
+import paramiko
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation: Incomplete Step
+# 1) Connect to the server
+# 2) Launch Moon Manager
+# 3) Set the token in the global variables
+@Given('the manager is configured')
+def step_impl(context):
+ logger.info("\n")
+ logger.info("******************** Scenario: " + context.scenario.name + " ********************")
+ logger.info("Given the manager is configured")
+ api_responseflag = {'value': False}
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ # client.set_missing_host_key_policy(paramiko.WarningPolicy)
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ client.connect(hostname=apis_urls.serverIP, port=apis_urls.serverport, username=apis_urls.serverusername,
+ password=apis_urls.serverpassword)
+ logger.info("before ")
+ stdin, stdout, stderr = client.exec_command(
+
+ "sudo nohup hug -m moon_manager.server &"
+ " /usr/bin/python3 "
+ )
+ #stdin, stdout, stderr = client.exec_command(" sudo /usr/local/bin/moon_manager add_user alaa00 admin")
+ #stdin, stdout, stderr = client.exec_command(" sudo /usr/local/bin/moon_manager get_key alaa00 admin ")
+ #logger.info(stdout.readlines())
+ #GeneralVariables.auth_headers['X-Api-Key'] = str(stdout.readlines())
+ #logger.info("token: " + str(GeneralVariables.auth_headers['X-Api-Key']))
+ #logger.info("after ")
+ # client.close()
+
+# Step Definition Implementation: Incomplete Step
+# 1) Get all the moon slaves
+# 2) Loop on the slave by id and delete them
+@Given('no slave is created')
+def step_impl(context):
+ logger.info("\n")
+ logger.info("******************** Scenario: " + context.scenario.name + " ********************")
+ logger.info("Given no slave is created")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ response = requests.get(apis_urls.serverURL + apis_urls.getslavesAPI, headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.getslavesAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.getslavesAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.slaveAPI + "/" + ids,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Create a slave by post request
+# 2) Get the wrapper port id from the slave posting request & set it to the wrapperPort global variable
+@Given('the slave is created')
+def step_impl(context):
+ logger.info("Given the slave is created")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ data = {
+ 'name': "default",
+ 'description': "description",
+ 'address': "111",
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.slaveAPI, headers=headers,
+ data=json.dumps(data))
+ slaveid = list(response.json()[apis_urls.getslavesAPI])[0]
+ GeneralVariables.wrapperPort['value'] = str(response.json()[apis_urls.getslavesAPI][slaveid]['extra']['port'])
+
+# Step Definition Implementation: Incomplete Step
+# 1) Check the Pipeline is up and running
+@Given('the pipeline is running')
+def step_impl(context):
+ logger.info("Given the pipeline is running")
+
+# Step Definition Implementation: Incomplete Step
+# 1) Connect to the server
+# 2) execute the authorization curl command using the wrapperPort
+@Given('the following authorization request is granted through pipeline')
+def step_impl(context):
+ logger.info("Given the following authorization request is granted through pipeline")
+ api_responseflag = {'value': False}
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ client.set_missing_host_key_policy(paramiko.WarningPolicy)
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ client.connect(hostname=apis_urls.serverIP, port=apis_urls.serverport, username=apis_urls.serverusername,
+ password=apis_urls.serverpassword)
+ for row in context.table:
+ logger.info("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.pipelinePort['value'] + "/authz/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ stdin, stdout, stderr = client.exec_command("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.pipelinePort['value'] + "/authz/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ logger.info(stdout.readlines())
+ GeneralVariables.actual_authresponse['value'] = str(stdout.readlines())
+
+# Step Definition Implementation: Incomplete Step
+# 1) Connect to the server
+# 2) execute the authorization curl command using the wrapperPort
+@Given('the following authorization request is granted through wrapper')
+def step_impl(context):
+ logger.info("Given the following authorization request is granted through wrapper")
+ api_responseflag = {'value': False}
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ client.set_missing_host_key_policy(paramiko.WarningPolicy)
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ client.connect(hostname=apis_urls.serverIP, port=apis_urls.serverport, username=apis_urls.serverusername,
+ password=apis_urls.serverpassword)
+ for row in context.table:
+ logger.info("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.wrapperPort['value'] + "/authz/" + str(row[
+ "keystone_project_id"]) + "/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ stdin, stdout, stderr = client.exec_command("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.wrapperPort['value'] + "/authz/" + str(row[
+ "keystone_project_id"]) + "/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ logger.info(stdout.readlines())
+ GeneralVariables.actual_authresponse['value'] = str(stdout.readlines())
+
+# Step Definition Implementation: Incomplete Step
+# 1) Connect to the server
+# 2) execute the authorization curl command using the pipelinePort
+# 3) set the actual_authresponse global variable with the curl response
+@When('the following authorization request is sent through pipeline')
+def step_impl(context):
+ logger.info("Given the following authorization request is sent through pipeline")
+ api_responseflag = {'value': False}
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ client.set_missing_host_key_policy(paramiko.WarningPolicy)
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ client.connect(hostname=apis_urls.serverIP, port=apis_urls.serverport, username=apis_urls.serverusername,
+ password=apis_urls.serverpassword)
+
+ for row in context.table:
+ logger.info("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.pipelinePort['value'] + "/authz/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ stdin, stdout, stderr = client.exec_command("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.pipelinePort['value'] + "/authz/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ logger.info(stdout.readlines())
+ GeneralVariables.actual_authresponse['value'] = str(stdout.readlines())
+
+# Step Definition Implementation: Incomplete Step
+# 1) Connect to the server
+# 2) execute the authorization curl command using the pipelinePort
+# 3) set the actual_authresponse global variable with the curl response
+@When('the following authorization request is sent through wrapper')
+def step_impl(context):
+ logger.info("Given the following authorization request is sent through wrapper")
+ api_responseflag = {'value': False}
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ client.set_missing_host_key_policy(paramiko.WarningPolicy)
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ client.connect(hostname=apis_urls.serverIP, port=apis_urls.serverport, username=apis_urls.serverusername,
+ password=apis_urls.serverpassword)
+
+ for row in context.table:
+ logger.info("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.wrapperPort['value'] + "/authz/" + str(row[
+ "keystone_project_id"]) + "/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ stdin, stdout, stderr = client.exec_command("curl http://" + str(
+ apis_urls.serverIP) + ":" + GeneralVariables.wrapperPort['value'] + "/authz/" + str(row[
+ "keystone_project_id"]) + "/" + str(
+ row["subjectperimetername"]) + "/" + str(row["objectperimetername"]) + "/" +
+ str(row["actionperimetername"]))
+ logger.info(stdout.readlines())
+ GeneralVariables.actual_authresponse['value'] = str(stdout.readlines())
+
+# Step Definition Implementation: Untested Step
+# 1) Assert that the actual authresponse is the same as the expected.
+@Then('the authorization response should be the following')
+def step_impl(context):
+ logger.info("Then the authorization response should be the following")
+ for row in context.table:
+ logger.info("asserting the expected api response: '" + row["auth_response"] + "' and the actual response: '" +
+ GeneralVariables.actual_authresponse['value'] + "'")
+ assert row["auth_response"] == GeneralVariables.actual_authresponse[
+ 'value'], "Validation is not correct, Expected: " + \
+ row[
+ "auth_response"] + " but the API response was: " + \
+ GeneralVariables.actual_authresponse['value']
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/common_functions.py b/moon_manager/tests/func_tests/features/steps/common_functions.py
new file mode 100644
index 00000000..b9b9f0bc
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/common_functions.py
@@ -0,0 +1,279 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from steps.Static_Variables import GeneralVariables
+import requests
+import json
+import logging
+
+
+logger = logging.getLogger(__name__)
+
+class commonfunctions:
+ apis_urls = GeneralVariables()
+
+ def get_subjectcategoryid(self, subjectcategoryname):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metadatasubjectcategoryAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metadatasubjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metadatasubjectcategoryAPI]).keys():
+ if (response.json()[self.apis_urls.metadatasubjectcategoryAPI][ids]['name'] == subjectcategoryname):
+ return response.json()[self.apis_urls.metadatasubjectcategoryAPI][ids]['id']
+
+ def get_objectcategoryid(self, objectcategoryname):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metadataobjectcategoryAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metadataobjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metadataobjectcategoryAPI]).keys():
+ if (response.json()[self.apis_urls.metadataobjectcategoryAPI][ids]['name'] == objectcategoryname):
+ return response.json()[self.apis_urls.metadataobjectcategoryAPI][ids]['id']
+
+ def get_actioncategoryid(self, actioncategoryname):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metadataactioncategoryAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metadataactioncategoryAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metadataactioncategoryAPI]).keys():
+ if (response.json()[self.apis_urls.metadataactioncategoryAPI][ids]['name'] == actioncategoryname):
+ return response.json()[self.apis_urls.metadataactioncategoryAPI][ids]['id']
+
+ def get_metaruleid(self, metarulename):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metarulesAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metarulesAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metarulesAPI]).keys():
+ if (response.json()[self.apis_urls.metarulesAPI][ids]['name'] == metarulename):
+ return ids
+
+ def get_modelid(self, modelname):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.modelAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.modelAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.modelAPI]).keys():
+ if (response.json()[self.apis_urls.modelAPI][ids]['name'] == modelname):
+ return ids
+
+ def get_policyid(self, policyname):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.policyAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.policyAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.policyAPI]).keys():
+ if (response.json()[self.apis_urls.policyAPI][ids]['name'] == policyname):
+ return ids
+
+ def get_subjectperimeterid(self,subjectperimeter ):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.perimetersubjectAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.perimetersubjectAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.perimetersubjectAPI]).keys():
+ if (response.json()[self.apis_urls.perimetersubjectAPI][ids]['name'] == subjectperimeter):
+ return ids
+
+ def get_objectperimeterid(self,objectperimeter ):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.perimeterobjectAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.perimeterobjectAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.perimeterobjectAPI]).keys():
+ if (response.json()[self.apis_urls.perimeterobjectAPI][ids]['name'] == objectperimeter):
+ return ids
+
+ def get_actionperimeterid(self, actionperimeter):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.perimeteractionAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.perimeteractionAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.perimeteractionAPI]).keys():
+ if (response.json()[self.apis_urls.perimeteractionAPI][ids]['name'] == actionperimeter):
+ return ids
+
+ def get_subjectdataid(self,subjectdataname,subjectcategoryid,policyid ):
+ response_data = requests.get(
+ self.apis_urls.serverURL + "policies/" + policyid + "/" + self.apis_urls.datasubjectAPI + "/" + subjectcategoryid,headers=self.apis_urls.auth_headers)
+ if(len(response_data.json()[self.apis_urls.datasubjectAPI]))!=0:
+ subjectdataidslist = []
+ matcheddataidslist = []
+ dataids=response_data.json()[self.apis_urls.datasubjectAPI][0]['data']
+ for ids in dataids:
+ apisubjectdataid = response_data.json()[self.apis_urls.datasubjectAPI][0]['data'][str(ids)]['id']
+ subjectdataidslist.append(apisubjectdataid)
+
+ if ((str(subjectdataname)).find(",") != -1):
+ datanameslist = subjectdataname.split(",")
+ for dataname in datanameslist:
+ for data_id in subjectdataidslist:
+ if ((response_data.json()[self.apis_urls.datasubjectAPI][0]['data'][str(data_id)][
+ 'name']) == dataname):
+ matcheddataidslist.append(data_id)
+ return ",".join(matcheddataidslist)
+ else:
+ for data_id in subjectdataidslist:
+ if ((
+ response_data.json()[self.apis_urls.datasubjectAPI][0]['data'][str(data_id)]['name']) == subjectdataname):
+ return data_id
+
+ def get_objectdataid(self,objectdataname,objectcategoryid,policyid ):
+ response_data = requests.get(
+ self.apis_urls.serverURL + self.apis_urls.policyAPI + "/" + policyid + "/" + self.apis_urls.dataobjectAPI + "/" + objectcategoryid,headers=self.apis_urls.auth_headers)
+ if (len(response_data.json()[self.apis_urls.dataobjectAPI])) != 0:
+ objectdataidslist = []
+ matcheddataidslist=[]
+ for ids in response_data.json()[ self.apis_urls.dataobjectAPI][0]['data']:
+ apiobjectdataid = response_data.json()[ self.apis_urls.dataobjectAPI][0]['data'][str(ids)]['id']
+ objectdataidslist.append(apiobjectdataid)
+ if ((str(objectdataname)).find(",") != -1):
+ datanameslist = objectdataname.split(",")
+ for dataname in datanameslist:
+ for data_id in objectdataidslist:
+ if ((response_data.json()[self.apis_urls.dataobjectAPI][0]['data'][str(data_id)]['name']) == dataname):
+ matcheddataidslist.append(data_id)
+ return ",".join(matcheddataidslist)
+
+ else:
+ for data_id in objectdataidslist:
+ if ((response_data.json()[self.apis_urls.dataobjectAPI][0]['data'][str(data_id)]['name']) == objectdataname):
+ return data_id
+
+ def get_actiondataid(self,actiondataname,actioncategoryid,policyid ):
+ response_data = requests.get(
+ self.apis_urls.serverURL + self.apis_urls.policyAPI + "/" + policyid + "/" + self.apis_urls.dataactionAPI + "/" + actioncategoryid,headers=self.apis_urls.auth_headers)
+ if (len(response_data.json()[self.apis_urls.dataactionAPI])) != 0:
+ actiondataidslist = []
+ matcheddataidslist = []
+ for ids in response_data.json()[self.apis_urls.dataactionAPI][0]['data']:
+ apiactiondataid = response_data.json()[self.apis_urls.dataactionAPI][0]['data'][str(ids)]['id']
+ actiondataidslist.append(apiactiondataid)
+ if ((str(actiondataname)).find(",") != -1):
+ datanameslist = actiondataname.split(",")
+ for dataname in datanameslist:
+ for data_id in actiondataidslist:
+ if ((response_data.json()[self.apis_urls.dataactionAPI][0]['data'][str(data_id)][
+ 'name']) == dataname):
+ matcheddataidslist.append(data_id)
+ return ",".join(matcheddataidslist)
+ else:
+ for data_id in actiondataidslist:
+ if ((response_data.json()[self.apis_urls.dataactionAPI][0]['data'][str(data_id)]['name']) == actiondataname):
+ return data_id
+
+ def get_subjectcategoryname(self, subjectcategoryid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metadatasubjectcategoryAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metadatasubjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metadatasubjectcategoryAPI]).keys():
+ if (response.json()[self.apis_urls.metadatasubjectcategoryAPI][ids]['id'] == subjectcategoryid):
+ return response.json()[self.apis_urls.metadatasubjectcategoryAPI][ids]['name']
+
+ def get_objectcategoryname(self, objectcategoryid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metadataobjectcategoryAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metadataobjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metadataobjectcategoryAPI]).keys():
+ if (response.json()[self.apis_urls.metadataobjectcategoryAPI][ids]['id'] == objectcategoryid):
+ return response.json()[self.apis_urls.metadataobjectcategoryAPI][ids]['name']
+
+ def get_actioncategoryname(self, actioncategoryid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metadataactioncategoryAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metadataactioncategoryAPI]) != 0:
+ for ids in dict(response.json()[self.apis_urls.metadataactioncategoryAPI]).keys():
+ if (response.json()[self.apis_urls.metadataactioncategoryAPI][ids]['id'] == actioncategoryid):
+ return response.json()[self.apis_urls.metadataactioncategoryAPI][ids]['name']
+
+ def get_metarulename(self, metaruleid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.metarulesAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.metarulesAPI]) != 0:
+ for id in dict(response.json()[self.apis_urls.metarulesAPI]).keys():
+ if (id == metaruleid):
+ return response.json()[self.apis_urls.metarulesAPI][id]['name']
+
+ def get_modelname(self, modelid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.modelAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.modelAPI]) != 0:
+ for id in dict(response.json()[self.apis_urls.modelAPI]).keys():
+ if (id == modelid):
+ return response.json()[self.apis_urls.modelAPI][id]['name']
+
+ def get_policyname(self, policyid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.policyAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.policyAPI]) != 0:
+ for id in dict(response.json()[self.apis_urls.policyAPI]).keys():
+ if (id == policyid):
+ return response.json()[self.apis_urls.policyAPI][id]['name']
+
+ def get_subjectperimetername(self, subjectperimeterid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.perimetersubjectAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.perimetersubjectAPI]) != 0:
+ for id in dict(response.json()[self.apis_urls.perimetersubjectAPI]).keys():
+ if (id == subjectperimeterid):
+ return response.json()[self.apis_urls.perimetersubjectAPI][id]['name']
+
+ def get_objectperimetername(self, objectperimeterid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.perimeterobjectAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.perimeterobjectAPI]) != 0:
+ for id in dict(response.json()[self.apis_urls.perimeterobjectAPI]).keys():
+ if (id == objectperimeterid):
+ return response.json()[self.apis_urls.perimeterobjectAPI][id]['name']
+
+ def get_actionperimetername(self, actionperimeterid):
+ response = requests.get(self.apis_urls.serverURL + self.apis_urls.perimeteractionAPI,headers=self.apis_urls.auth_headers)
+ if len(response.json()[self.apis_urls.perimeteractionAPI]) != 0:
+ for id in dict(response.json()[self.apis_urls.perimeteractionAPI]).keys():
+ if (id == actionperimeterid):
+ return response.json()[self.apis_urls.perimeteractionAPI][id]['name']
+
+ def get_subjectdataname(self, subjectdataids, subjectcategoryid, policyid):
+ subjectdatanames=[]
+ for subjectdataid in subjectdataids:
+ response_data = requests.get(
+ self.apis_urls.serverURL + "policies/" + policyid + "/" + self.apis_urls.datasubjectAPI + "/" + subjectcategoryid+"/"+subjectdataid,headers=self.apis_urls.auth_headers)
+
+ subjectdataidslist = []
+ if(response_data.status_code==200):
+ for ids in response_data.json()[self.apis_urls.datasubjectAPI][0]['data']:
+ apisubjectdataid = response_data.json()[self.apis_urls.datasubjectAPI][0]['data'][str(ids)]['id']
+ subjectdataidslist.append(apisubjectdataid)
+
+ for data_id in subjectdataidslist:
+ if (str((response_data.json()[self.apis_urls.datasubjectAPI][0]['data'][str(data_id)][
+ 'id'])) == subjectdataid):
+ subjectdatanames.append(str(response_data.json()[self.apis_urls.datasubjectAPI][0]['data'][str(data_id)]['name']))
+ else:
+ subjectdataidslist = ""
+ return subjectdatanames
+
+ def get_objectdataname(self, objectdataids, objectcategoryid, policyid):
+ objectdatanames = []
+ for objectdataid in objectdataids:
+ response_data = requests.get(
+ self.apis_urls.serverURL + "policies/" + policyid + "/" + self.apis_urls.dataobjectAPI + "/" + objectcategoryid + "/" + objectdataid,headers=self.apis_urls.auth_headers)
+ objectdataidslist = []
+ if (response_data.status_code == 200):
+ for ids in response_data.json()[self.apis_urls.dataobjectAPI][0]['data']:
+ apiobjectdataid = response_data.json()[self.apis_urls.dataobjectAPI][0]['data'][str(ids)]['id']
+ objectdataidslist.append(apiobjectdataid)
+ for data_id in objectdataidslist:
+ if (str((response_data.json()[self.apis_urls.dataobjectAPI][0]['data'][str(data_id)][
+ 'id'])) == objectdataid):
+ objectdatanames.append(
+ str(response_data.json()[self.apis_urls.dataobjectAPI][0]['data'][str(data_id)]['name']))
+ else:
+ objectdataidslist = ""
+ return objectdatanames
+
+ def get_actiondataname(self, actiondataids, actioncategoryid, policyid):
+ actiondatanames = []
+ for actiondataid in actiondataids:
+ response_data = requests.get(
+ self.apis_urls.serverURL + "policies/" + policyid + "/" + self.apis_urls.dataactionAPI + "/" + actioncategoryid + "/" + actiondataid,headers=self.apis_urls.auth_headers)
+ #logger.info(response_data.json()[self.apis_urls.dataactionAPI][0])
+
+ actiondataidslist = []
+ if (response_data.status_code == 200):
+ for ids in response_data.json()[self.apis_urls.dataactionAPI][0]['data']:
+ apiactiondataid = response_data.json()[self.apis_urls.dataactionAPI][0]['data'][str(ids)]['id']
+ actiondataidslist.append(apiactiondataid)
+ logging.info(actiondataidslist)
+ for data_id in actiondataidslist:
+ if (str((response_data.json()[self.apis_urls.dataactionAPI][0]['data'][str(data_id)][
+ 'id'])) == actiondataid):
+ actiondatanames.append(
+ str(response_data.json()[self.apis_urls.dataactionAPI][0]['data'][str(data_id)]['name']))
+ else:
+ actiondataidslist = ""
+ return actiondatanames \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/steps/data.py b/moon_manager/tests/func_tests/features/steps/data.py
new file mode 100644
index 00000000..67d743c2
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/data.py
@@ -0,0 +1,629 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing subject meta data in the system by getting the policies then their models then the model attached meta rules and then the categories
+# 2) Get subject data using both the policy id & the category id
+# 3) Loop by data id and delete it
+@Given('the system has no subject data')
+def step_impl(context):
+ logger.info("Given the system has no subject data")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI,headers=apis_urls.auth_headers)
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ subjectcategoryidslist = []
+ modelid = response_policies.json()[apis_urls.policyAPI][policies_ids]['model_id']
+ if (modelid != None and modelid != ""):
+ metaruleslist = \
+ requests.get(apis_urls.serverURL + apis_urls.modelAPI,headers=apis_urls.auth_headers).json()[apis_urls.modelAPI][modelid][
+ 'meta_rules']
+ for metarule_ids in metaruleslist:
+ categorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metarule_ids]['subject_categories']
+ for categoryid in categorieslist:
+ if (categoryid not in subjectcategoryidslist):
+ subjectcategoryidslist.append(categoryid)
+
+ for categoryid in subjectcategoryidslist:
+ response_data = requests.get(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + policies_ids + "/" + apis_urls.datasubjectAPI + "/" + categoryid,headers=apis_urls.auth_headers)
+ for ids in response_data.json()[apis_urls.datasubjectAPI][0]['data']:
+ data_id = response_data.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)]['id']
+ requests.delete(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + policies_ids + "/" + apis_urls.datasubjectAPI + "/" + categoryid + "/" + data_id,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Post subject data using the policy id & the category id
+@Given('the following subject data exists')
+def step_impl(context):
+ logger.info("Given the following subject data exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject data name: '" + row["subjectdataname"] + "' subject data description: '" + row[
+ "subjectdatadescription"] + "' and subject category: '" + row[
+ "subjectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ if (len(row['subjectcategory']) > 25):
+ categories_id = row['subjectcategory']
+ else:
+ categories_id = commonfunctions.get_subjectcategoryid(row['subjectcategory'])
+
+ data = {
+ 'name': row["subjectdataname"],
+ 'description': row["subjectdatadescription"],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.datasubjectAPI + "/" + str(
+ categories_id), headers=headers, data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Get all the existing object meta data in the system by getting the policies then their models then the model attached meta rules and then the categories
+# 2) Get object data using both the policy id & the category id
+# 3) Loop by data id and delete it
+@Given('the system has no object data')
+def step_impl(context):
+ logger.info("Given the system has no object data")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI,headers=apis_urls.auth_headers)
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ objectcategoryidslist = []
+ modelid = response_policies.json()[apis_urls.policyAPI][policies_ids]['model_id']
+ if (modelid != None and modelid != ""):
+ metaruleslist = \
+ requests.get(apis_urls.serverURL + apis_urls.modelAPI,headers=apis_urls.auth_headers).json()[apis_urls.modelAPI][modelid][
+ 'meta_rules']
+ for metarule_ids in metaruleslist:
+ for categoryid in \
+ (requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers)).json()[apis_urls.metarulesAPI][
+ metarule_ids][
+ 'object_categories']:
+ if (categoryid not in objectcategoryidslist):
+ objectcategoryidslist.append(categoryid)
+
+ for categoryid in objectcategoryidslist:
+ response_data = requests.get(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + policies_ids + "/" + apis_urls.dataobjectAPI + "/" + categoryid,headers=apis_urls.auth_headers)
+ for ids in response_data.json()[apis_urls.dataobjectAPI][0]['data']:
+ data_id = response_data.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)]['id']
+ requests.delete(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + policies_ids + "/" + apis_urls.dataobjectAPI + "/" + categoryid + "/" + data_id,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Post object data using the policy id & the category id
+@Given('the following object data exists')
+def step_impl(context):
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject data name: '" + row["objectdataname"] + "' object data description: '" + row[
+ "objectdatadescription"] + "' and object category: '" + row[
+ "objectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ if (len(row['objectcategory']) > 25):
+ categories_id = row['objectcategory']
+ else:
+ categories_id = commonfunctions.get_objectcategoryid(row['objectcategory'])
+
+ data = {
+ 'name': row["objectdataname"],
+ 'description': row["objectdatadescription"],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.dataobjectAPI + "/" + str(
+ categories_id), headers=headers, data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Get all the existing action meta data in the system by getting the policies then their models then the model attached meta rules and then the categories
+# 2) Get action data using both the policy id & the category id
+# 3) Loop by data id and delete it
+@Given('the system has no action data')
+def step_impl(context):
+ logger.info("Given the system has no action data")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ actioncategoryidslist = []
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI,headers=apis_urls.auth_headers)
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ actioncategoryidslist = []
+ modelid = response_policies.json()[apis_urls.policyAPI][policies_ids]['model_id']
+ if (modelid != None and modelid != ""):
+ metaruleslist = \
+ requests.get(apis_urls.serverURL + apis_urls.modelAPI,headers=apis_urls.auth_headers).json()[apis_urls.modelAPI][modelid][
+ 'meta_rules']
+ for metarule_ids in metaruleslist:
+ for categoryid in \
+ (requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers)).json()[apis_urls.metarulesAPI][
+ metarule_ids][
+ 'action_categories']:
+ if (categoryid not in actioncategoryidslist):
+ actioncategoryidslist.append(categoryid)
+
+ for categoryid in actioncategoryidslist:
+ response_data = requests.get(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + policies_ids + "/" + apis_urls.dataactionAPI + "/" + categoryid,headers=apis_urls.auth_headers)
+ for ids in response_data.json()[apis_urls.dataactionAPI][0]['data']:
+ data_id = response_data.json()[apis_urls.dataactionAPI][0]['data'][str(ids)]['id']
+ requests.delete(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + policies_ids + "/" + apis_urls.dataactionAPI + "/" + categoryid + "/" + data_id,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Post action data using the policy id & the category id
+@Given('the following action data exists')
+def step_impl(context):
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject data name: '" + row["actiondataname"] + "' action data description: '" + row[
+ "actiondatadescription"] + "' and action category: '" + row[
+ "actioncategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ if (len(row['actioncategory']) > 25):
+ categories_id = row['actioncategory']
+ else:
+ categories_id = commonfunctions.get_actioncategoryid(row['actioncategory'])
+
+ data = {
+ 'name': row["actiondataname"],
+ 'description': row["actiondatadescription"],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.dataactionAPI + "/" + str(
+ categories_id), headers=headers, data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Add subject data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following subject data')
+def step_impl(context):
+ logger.info("When the user sets to add the following subject data")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject data name: '" + row["subjectdataname"] + "' subject data description: '" + row[
+ "subjectdatadescription"] + "' and subject category: '" + row[
+ "subjectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ if (len(row['subjectcategory']) > 25):
+ categories_id = row['subjectcategory']
+ else:
+ categories_id = commonfunctions.get_subjectcategoryid(row['subjectcategory'])
+
+ data = {
+ 'name': row["subjectdataname"],
+ 'description': row["subjectdatadescription"],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.datasubjectAPI + "/" + str(
+ categories_id), headers=headers, data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Delete subject data by policy id, subject data id, subject category id
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following subject data')
+def step_impl(context):
+ logging.info("When the user sets to delete the following subject data")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+
+ logger.info("subject data name:'" + row["subjectdataname"] + "' and subject category name:'" + row[
+ "subjectcategory"] + "' and policy name:'" + row["policyname"] + "'")
+
+ policies_id = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_data = requests.delete(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + commonfunctions.get_policyid(row[
+ "policyname"]) + "/" + apis_urls.datasubjectAPI + "/" + commonfunctions.get_subjectcategoryid(
+ row["subjectcategory"]) + "/" + commonfunctions.get_subjectdataid(row["subjectdataname"],
+ commonfunctions.get_subjectcategoryid(
+ row["subjectcategory"]),
+ commonfunctions.get_policyid(
+ row["policyname"])),
+ headers=headers)
+
+ if response_data.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Add object data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following object data')
+def step_impl(context):
+ logger.info("When the user sets to add the following object data")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object data name: '" + row["objectdataname"] + "' object data description: '" + row[
+ "objectdatadescription"] + "' and object category: '" + row[
+ "objectcategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_list = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ if (len(row['objectcategory']) > 25):
+ categories_id = row['objectcategory']
+ else:
+ categories_id = commonfunctions.get_objectcategoryid(row['objectcategory'])
+
+ data = {
+ 'name': row["objectdataname"],
+ 'description': row["objectdatadescription"],
+ }
+
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.dataobjectAPI + "/" + str(
+ categories_id), headers=headers, data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Delete object data by policy id, object data id, object category id
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following object data')
+def step_impl(context):
+ logging.info("When the user sets to delete the following object data")
+ model = getattr(context, "model", None)
+ for row in context.table:
+
+ logger.info("object data name:'" + row["objectdataname"] + "' and object category name:'" + row[
+ "objectcategory"] + "' and policy name:'" + row["policyname"] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_data = requests.delete(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + commonfunctions.get_policyid(row[
+ "policyname"]) + "/" + apis_urls.dataobjectAPI + "/" + commonfunctions.get_objectcategoryid(
+ row["objectcategory"]) + "/" + commonfunctions.get_objectdataid(row["objectdataname"],
+ commonfunctions.get_objectcategoryid(
+ row["objectcategory"]),
+ commonfunctions.get_policyid(
+ row["policyname"])),
+ headers=headers)
+
+ if response_data.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Add action data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following action data')
+def step_impl(context):
+ logger.info("When the user sets to add the following action data")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "action data name: '" + row["actiondataname"] + "' action data description: '" + row[
+ "actiondatadescription"] + "' and action category: '" + row[
+ "actioncategory"] + "' and policies: '" + row['policyname'] + "'")
+
+ policies_id = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ if (len(row['actioncategory']) > 25):
+ categories_id = row['actioncategory']
+ else:
+ categories_id = commonfunctions.get_actioncategoryid(row['actioncategory'])
+
+ data = {
+ 'name': row["actiondataname"],
+ 'description': row["actiondatadescription"],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.dataactionAPI + "/" + str(
+ categories_id), headers=headers, data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Delete action data by policy id, action data id, action category id
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following action data')
+def step_impl(context):
+ logging.info("When the user sets to delete the following action data")
+ model = getattr(context, "model", None)
+ for row in context.table:
+
+ logger.info("action data name:'" + row["actiondataname"] + "' and action category name:'" + row[
+ "actioncategory"] + "' and policy name:'" + row["policyname"] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response_data = requests.delete(
+ apis_urls.serverURL + apis_urls.policyAPI + "/" + commonfunctions.get_policyid(row[
+ "policyname"]) + "/" + apis_urls.dataactionAPI + "/" + commonfunctions.get_actioncategoryid(
+ row["actioncategory"]) + "/" + commonfunctions.get_actiondataid(row["actiondataname"],
+ commonfunctions.get_actioncategoryid(
+ row["actioncategory"]),
+ commonfunctions.get_policyid(
+ row["policyname"])),
+ headers=headers)
+
+ if response_data.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing subject data by get request and put them into a table
+# 2) Sort the table by policy name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following subject data should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following subject data should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('subjectdataname', 'subjectdatadescription', 'subjectcategory', 'policyname'),
+ dtype=('S100', 'S100', 'S100', 'S100'))
+ for row in context.table:
+ if (row['policyname'] != ""):
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.datasubjectAPI + "/" +
+ commonfunctions.get_subjectcategoryid(row['subjectcategory']),headers=apis_urls.auth_headers)
+
+ if len(response.json()[apis_urls.datasubjectAPI]) != 0:
+ for ids in response.json()[apis_urls.datasubjectAPI][0]['data']:
+ apipolicies = ""
+ apisubjectdataname = response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)]['name']
+ apisubjectdatadescription = response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)][
+ 'description']
+ apisubjectcategory = commonfunctions.get_subjectcategoryname(
+ response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)]['category_id'])
+ apipolicies = commonfunctions.get_policyname(
+ response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)]['policy_id'])
+ apiresult.add_row(vals=(
+ apisubjectdataname, apisubjectdatadescription, apisubjectcategory, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ apiresult.sort('policyname')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected subject data name: '" + str(
+ row1["subjectdataname"]) + "' is the same as the actual existing '" + str(
+ row2["subjectdataname"]) + "'")
+ assert str(row1["subjectdataname"]) == str(row2["subjectdataname"]), "subject data name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected subject data description: '" + str(
+ row1["subjectdatadescription"]) + "' is the same as the actual existing '" + str(
+ row2["subjectdatadescription"]) + "'")
+ assert str(row1["subjectdatadescription"]) == str(
+ row2["subjectdatadescription"]), "subject data description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected subject data password: '" + str(
+ row1["subjectcategory"]) + "' is the same as the actual existing '" + str(
+ row2["subjectcategory"]) + "'")
+ assert str(row1["subjectcategory"]) == str(
+ row2["subjectcategory"]), "subject category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected policies: '" + str(
+ row1["policyname"]) + "' is the same as the actual existing '" + str(
+ row2["policyname"]) + "'")
+ assert str(row1["policyname"]) == str(row2["policyname"]), " policies is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing object data by get request and put them into a table
+# 2) Sort the table by policy name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following object data should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following object data should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('objectdataname', 'objectdatadescription', 'objectcategory', 'policyname'),
+ dtype=('S100', 'S100', 'S100', 'S100'))
+
+ for row in context.table:
+ if (row['policyname'] != ""):
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.dataobjectAPI + "/" +
+ commonfunctions.get_objectcategoryid(row['objectcategory']),headers=apis_urls.auth_headers)
+
+ if len(response.json()[apis_urls.dataobjectAPI]) != 0:
+ for ids in response.json()[apis_urls.dataobjectAPI][0]['data']:
+ apipolicies = ""
+ apiobjectdataname = response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)]['name']
+ apiobjectdatadescription = response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)][
+ 'description']
+ apiobjectcategory = commonfunctions.get_objectcategoryname(
+ response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)]['category_id'])
+ apipolicies = commonfunctions.get_policyname(
+ response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)]['policy_id'])
+
+ apiresult.add_row(vals=(
+ apiobjectdataname, apiobjectdatadescription, apiobjectcategory, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ apiresult.sort('policyname')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected object data name: '" + str(
+ row1["objectdataname"]) + "' is the same as the actual existing '" + str(
+ row2["objectdataname"]) + "'")
+ assert str(row1["objectdataname"]) == str(row2["objectdataname"]), "subject data name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected object data description: '" + str(
+ row1["objectdatadescription"]) + "' is the same as the actual existing '" + str(
+ row2["objectdatadescription"]) + "'")
+ assert str(row1["objectdatadescription"]) == str(
+ row2["objectdatadescription"]), "object data description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected object data category: '" + str(
+ row1["objectcategory"]) + "' is the same as the actual existing '" + str(
+ row2["objectcategory"]) + "'")
+ assert str(row1["objectcategory"]) == str(
+ row2["objectcategory"]), "object category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected policies: '" + str(
+ row1["policyname"]) + "' is the same as the actual existing '" + str(
+ row2["policyname"]) + "'")
+ assert str(row1["policyname"]) == str(row2["policyname"]), " policies is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing action data by get request and put them into a table
+# 2) Sort the table by policy name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following action data should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following action data should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('actiondataname', 'actiondatadescription', 'actioncategory', 'policyname'),
+ dtype=('S100', 'S100', 'S100', 'S100'))
+ for row in context.table:
+ if (row['policyname'] != ""):
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.dataactionAPI + "/" +
+ commonfunctions.get_actioncategoryid(row['actioncategory']),headers=apis_urls.auth_headers)
+
+ if len(response.json()[apis_urls.dataactionAPI]) != 0:
+ for ids in response.json()[apis_urls.dataactionAPI][0]['data']:
+ apipolicies = ""
+ apiactiondataname = response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)]['name']
+ apiactiondatadescription = response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)][
+ 'description']
+ apiactioncategory = commonfunctions.get_actioncategoryname(
+ response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)]['category_id'])
+ apipolicies = commonfunctions.get_policyname(
+ response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)]['policy_id'])
+
+ apiresult.add_row(vals=(
+ apiactiondataname, apiactiondatadescription, apiactioncategory, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+ apiresult.sort('policyname')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected action data name: '" + str(
+ row1["actiondataname"]) + "' is the same as the actual existing '" + str(
+ row2["actiondataname"]) + "'")
+ assert str(row1["actiondataname"]) == str(row2["actiondataname"]), "action data name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action data description: '" + str(
+ row1["actiondatadescription"]) + "' is the same as the actual existing '" + str(
+ row2["actiondatadescription"]) + "'")
+ assert str(row1["actiondatadescription"]) == str(
+ row2["actiondatadescription"]), "action data description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action data category: '" + str(
+ row1["actioncategory"]) + "' is the same as the actual existing '" + str(
+ row2["actioncategory"]) + "'")
+ assert str(row1["actioncategory"]) == str(
+ row2["actioncategory"]), "action category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected policies: '" + str(
+ row1["policyname"]) + "' is the same as the actual existing '" + str(
+ row2["policyname"]) + "'")
+ assert str(row1["policyname"]) == str(row2["policyname"]), " policies is not correct!"
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/meta_data.py b/moon_manager/tests/func_tests/features/steps/meta_data.py
new file mode 100644
index 00000000..b2a6d02c
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/meta_data.py
@@ -0,0 +1,394 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+api_subjectcategory = {'name': "", 'description': ""}
+api_objectcategory = {'name': "", 'description': ""}
+api_actioncategory = {'name': "", 'description': ""}
+
+logger = logging.getLogger(__name__)
+
+
+# Step Definition Implementation:
+# 1) Get all the existing subject meta data in the system
+# 2) Loop by id and delete them
+@Given('the system has no subject categories')
+def step_impl(context):
+ logger.info("Given the system has no subject categories")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI, headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.metadatasubjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metadatasubjectcategoryAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI + "/" + ids,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Get all the existing action meta data in the system
+# 2) Loop by id and delete them
+@Given('the system has no action categories')
+def step_impl(context):
+ logger.info("Given the system has no action categories")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI, headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.metadataactioncategoryAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metadataactioncategoryAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI + "/" + ids,
+ headers=headers)
+
+
+# Step Definition Implementation:
+# 1) Get all the existing object meta data in the system
+# 2) Loop by id and delete them
+@Given('the system has no object categories')
+def step_impl(context):
+ logger.info("Given the system has no object categories")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI, headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.metadataobjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metadataobjectcategoryAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI + "/" + ids,
+ headers=headers)
+
+
+
+# Step Definition Implementation:
+# 1) Insert subject meta data using the post request
+@Given('the following meta data subject category exists')
+def step_impl(context):
+ logger.info("Given the following meta data subject category exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ data = {
+ 'name': row["subjectmetadataname"],
+ 'description': row["subjectmetadatadescription"],
+ }
+ logger.info(
+ "subject category name: '" + row["subjectmetadataname"] + "' and subject category description: '" + row[
+ "subjectmetadatadescription"] + "'")
+ response = requests.post(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI, headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Insert object meta data using the post request
+@Given('the following meta data object category exists')
+def step_impl(context):
+ logger.info("Given the following meta data object category exists")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ data = {
+ 'name': row["objectmetadataname"],
+ 'description': row["objectmetadatadescription"],
+ }
+ logger.info(
+ "object category name: '" + row["objectmetadataname"] + "' and object category description: '" + row[
+ "objectmetadatadescription"] + "'")
+ response = requests.post(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI, headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Insert action meta data using the post request
+@Given('the following meta data action category exists')
+def step_impl(context):
+ logger.info("Given the following meta data action category exists")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ data = {
+ 'name': row["actionmetadataname"],
+ 'description': row["actionmetadatadescription"],
+ }
+ logger.info(
+ "action category name: '" + row["actionmetadataname"] + "' and action category description: '" + row[
+ "actionmetadatadescription"] + "'")
+ response = requests.post(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI, headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Add subject meta data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following meta data subject category')
+def step_impl(context):
+ logger.info("When the user sets to add the following meta data subject category")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ data = {
+ 'name': row["subjectmetadataname"],
+ 'description': row["subjectmetadatadescription"],
+ }
+ logger.info(
+ "subject category name: '" + row["subjectmetadataname"] + "' and subject category description: '" + row[
+ "subjectmetadatadescription"] + "'")
+
+ response = requests.post(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+
+# Step Definition Implementation:
+# 1) Get all the subject meta data by get request
+# 2) Loop by ids and search for the matching subject meta data by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following meta data subject category')
+def step_impl(context):
+ logger.info("When the user sets to delete the following meta data subject category")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ logger.info("subject category name: '" + row["subjectmetadataname"] + "'")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI,
+ headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.metadatasubjectcategoryAPI]).keys():
+ if (response.json()[apis_urls.metadatasubjectcategoryAPI][ids]['name'] == row["subjectmetadataname"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI + "/" + ids,
+ headers=headers)
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Add object meta data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following meta data object category')
+def step_impl(context):
+ logger.info("When the user sets to add the following meta data object category")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ data = {
+ 'name': row["objectmetadataname"],
+ 'description': row["objectmetadatadescription"],
+ }
+ logger.info(
+ "object category Name: '" + row["objectmetadataname"] + "' and object category description: '" + row[
+ "objectmetadatadescription"] + "''")
+ response = requests.post(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI, headers=headers,
+ data=json.dumps(data))
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the object meta data by get request
+# 2) Loop by ids and search for the matching object meta data by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following meta data object category')
+def step_impl(context):
+ logger.info("When the user sets to delete the following meta data object category")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ logger.info("object category name: '" + row["objectmetadataname"] + "'")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI,
+ headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.metadataobjectcategoryAPI]).keys():
+ if (response.json()[apis_urls.metadataobjectcategoryAPI][ids]['name'] == row["objectmetadataname"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI + "/" + ids,
+ headers=headers)
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Add subject meta data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following meta data action category')
+def step_impl(context):
+ logger.info("When the user sets to add the following meta data action category")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ data = {
+ 'name': row["actionmetadataname"],
+ 'description': row["actionmetadatadescription"],
+ }
+ logger.info(
+ "action category name: '" + row["actionmetadataname"] + "' and action category description: '" + row[
+ "actionmetadatadescription"] + "'")
+
+ response = requests.post(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI, headers=headers,
+ data=json.dumps(data))
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the action meta data by get request
+# 2) Loop by ids and search for the matching action meta data by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following meta data action category')
+def step_impl(context):
+ logger.info("When the user sets to delete the following meta data action category")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("action category name: '" + row["actionmetadataname"] + "'")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI,
+ headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.metadataactioncategoryAPI]).keys():
+ # logger.info(ids)
+ if (response.json()[apis_urls.metadataactioncategoryAPI][ids]['name'] == row["actionmetadataname"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI + "/" + ids,
+ headers=headers)
+ # logger.info(response.status_code)
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing subject meta data by get request and put them into a table
+# 2) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following meta data subject category should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following meta data subject category should be existed in the system")
+
+ model = getattr(context, "model", None)
+ response = requests.get(apis_urls.serverURL + apis_urls.metadatasubjectcategoryAPI, headers=apis_urls.auth_headers)
+ apiresult = Table(names=('subjectcategoryname', 'subjectcategorydescription'), dtype=('S100', 'S100'))
+ if len(response.json()[apis_urls.metadatasubjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metadatasubjectcategoryAPI]).keys():
+ apisubjectcategoryname = response.json()[apis_urls.metadatasubjectcategoryAPI][ids]['name']
+ apisubjectcategorydescription = response.json()[apis_urls.metadatasubjectcategoryAPI][ids]['description']
+ apiresult.add_row(vals=(apisubjectcategoryname, apisubjectcategorydescription))
+ else:
+ apiresult.add_row(vals=("", ""))
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected subject category name: '" + str(
+ row1["subjectmetadataname"]) + "' is the same as the actual existing '" + str(
+ row2["subjectcategoryname"]) + "'")
+ assert str(row1["subjectmetadataname"]) == str(
+ row2["subjectcategoryname"]), "subject category name is not correct!"
+ logger.info("assertion passed!")
+ logger.info("asserting the expected subject category description: '" + str(
+ row1["subjectmetadatadescription"]) + "' is the same as the actual existing '" + str(
+ row2["subjectcategorydescription"]) + "'")
+ assert str(row1["subjectmetadatadescription"]) == str(
+ row2["subjectcategorydescription"]), "Subject meta-data category description is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing object meta data by get request and put them into a table
+# 2) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following meta data object category should be existed in the system')
+def step_impl(context):
+ model = getattr(context, "model", None)
+ logger.info("Then the following meta data object category should be existed in the system")
+ response = requests.get(apis_urls.serverURL + apis_urls.metadataobjectcategoryAPI, headers=apis_urls.auth_headers)
+ apiresult = Table(names=('objectcategoryname', 'objectcategorydescription'), dtype=('S100', 'S100'))
+
+ if len(response.json()[apis_urls.metadataobjectcategoryAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metadataobjectcategoryAPI]).keys():
+ apiobjectcategoryname = response.json()[apis_urls.metadataobjectcategoryAPI][ids]['name']
+ apiobjectcategorydescription = response.json()[apis_urls.metadataobjectcategoryAPI][ids]['description']
+ apiresult.add_row(vals=(apiobjectcategoryname, apiobjectcategorydescription))
+ else:
+ apiresult.add_row(vals=("", ""))
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected object category description: '" + str(
+ row1["objectmetadataname"]) + "' is the same as the actual existing '" + str(
+ row2["objectcategoryname"]) + "'")
+ assert str(row1["objectmetadataname"]) == str(
+ row2["objectcategoryname"]), "object category name is not correct!"
+ logger.info("assertion passed!")
+ logger.info("asserting the expected object category description: '" + str(
+ row1["objectmetadatadescription"]) + "' is the same as the actual existing '" + str(
+ row2["objectcategorydescription"]) + "'")
+ assert str(row1["objectmetadatadescription"]) == str(
+ row2["objectcategorydescription"]), "object meta-data category description is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing action meta data by get request and put them into a table
+# 2) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following meta data action category should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following meta data action category should be existed in the system")
+
+ model = getattr(context, "model", None)
+ response = requests.get(apis_urls.serverURL + apis_urls.metadataactioncategoryAPI, headers=apis_urls.auth_headers)
+ apiresult = Table(names=('actioncategoryname', 'actioncategorydescription'), dtype=('S100', 'S100'))
+ if len(response.json()[apis_urls.metadataactioncategoryAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metadataactioncategoryAPI]).keys():
+ apiactioncategoryname = response.json()[apis_urls.metadataactioncategoryAPI][ids]['name']
+ apiactioncategorydescription = response.json()[apis_urls.metadataactioncategoryAPI][ids]['description']
+ apiresult.add_row(vals=(apiactioncategoryname, apiactioncategorydescription))
+ else:
+ apiresult.add_row(vals=("", ""))
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected action category description: '" + str(
+ row1["actionmetadataname"]) + "' is the same as the actual existing '" + str(
+ row2["actioncategoryname"]) + "'")
+
+ assert str(row1["actionmetadataname"]) == str(
+ row2["actioncategoryname"]), "action category name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action category description: '" + str(
+ row1["actionmetadatadescription"]) + "' is the same as the actual existing '" + str(
+ row2["actioncategorydescription"]) + "'")
+
+ assert str(row1["actionmetadatadescription"]) == str(
+ row2["actioncategorydescription"]), "action meta-data category description is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# Assert the saved api response flag with the expected flag
+@Then('the system should reply the following')
+def step_impl(context):
+ logger.info("Then the system should reply the following:")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info("asserting the expected api response: '" + row["flag"] + "' and the actual response: '" +
+ GeneralVariables.api_responseflag['value'] + "'")
+ assert row["flag"] == GeneralVariables.api_responseflag['value'], "Validation is not correct, Expected: " + row[
+ "flag"] + " but the API response was: " + GeneralVariables.api_responseflag['value']
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/meta_rules.py b/moon_manager/tests/func_tests/features/steps/meta_rules.py
new file mode 100644
index 00000000..f56d4d4c
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/meta_rules.py
@@ -0,0 +1,335 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import numpy as np
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing meta rule in the system
+# 2) Loop by id and delete them
+@Given('the system has no meta-rules')
+def step_impl(context):
+ logger.info("Given the system has no meta-rules")
+
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.metarulesAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metarulesAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.metarulesAPI + "/" + ids,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Get subject, object, action categories ids list by calling the common funtion: get_subjectcategoryid, get_objectcategoryid and get_actioncategoryid
+# 2) create the meta rule data jason then post it
+@Given('the following meta rule exists')
+def step_impl(context):
+ logger.info("Given the following meta rule exists")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "meta-rule name: '" + row["metarulename"] + "' and meta-rule description: '" + row[
+ "metaruledescription"] + "' and subject categories:'" + row[
+ "subjectmetadata"] + "' and object categories:'" + row["objectmetadata"] + "' and action categories:'" +
+ row["actionmetadata"] + "'")
+ subjectcategoryids = []
+ objectcategoryids = []
+ actioncategoryids = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row["subjectmetadata"]) < 40 and str(row["subjectmetadata"])!=""):
+ if(str(row["subjectmetadata"]).find(",")!=-1):
+ for category in row["subjectmetadata"].split(","):
+ subjectcategoryids.append(commonfunctions.get_subjectcategoryid(category))
+ else:
+ subjectcategoryids.append(commonfunctions.get_subjectcategoryid(row["subjectmetadata"]))
+ else:
+ if(str(row["subjectmetadata"])==""):
+ subjectcategoryids=[]
+ else:
+ subjectcategoryids.append(row["subjectmetadata"])
+
+ if (len(row["objectmetadata"]) < 40 and str(row["objectmetadata"])!=""):
+ if(str(row["objectmetadata"]).find(",")!=-1):
+ for category in row["objectmetadata"].split(","):
+ objectcategoryids.append(commonfunctions.get_objectcategoryid(category))
+ else:
+ objectcategoryids.append(commonfunctions.get_objectcategoryid(row["objectmetadata"]))
+ else:
+ if (str(row["objectmetadata"]) == ""):
+ objectcategoryids = []
+ else:
+ objectcategoryids.append(row["objectmetadata"])
+
+ if (len(row["actionmetadata"]) < 40 and str(row["actionmetadata"])!=""):
+ if(str(row["actionmetadata"]).find(",")!=-1):
+ for category in row["actionmetadata"].split(","):
+ actioncategoryids.append(commonfunctions.get_actioncategoryid(category))
+ else:
+ actioncategoryids.append(commonfunctions.get_actioncategoryid(row["actionmetadata"]))
+ else:
+ if(str(row["actionmetadata"]) == ""):
+ actioncategoryids = []
+ else:
+ actioncategoryids.append(row["actionmetadata"])
+
+ data = {
+ 'name': row["metarulename"],
+ 'description': row["metaruledescription"],
+ 'subject_categories': subjectcategoryids,
+ 'object_categories': objectcategoryids,
+ 'action_categories': actioncategoryids
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.metarulesAPI, headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Get subject, object, action categories ids list by calling the common funtion: get_subjectcategoryid, get_objectcategoryid and get_actioncategoryid
+# 2) create the meta rule data jason then post it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following meta-rule')
+def step_impl(context):
+ logger.info("When the user sets to add the following meta-rule")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "meta-rule name: '" + row["metarulename"] + "' and meta-rule description: '" + row[
+ "metaruledescription"] + "' and subject categories:'" + row[
+ "subjectmetadata"] + "' and object categories:'" + row["objectmetadata"] + "' and action categories:'" +
+ row["actionmetadata"] + "'")
+
+ subjectcategoryids = []
+ objectcategoryids = []
+ actioncategoryids = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row["subjectmetadata"]) < 40 and str(row["subjectmetadata"])!=""):
+ if (str(row["subjectmetadata"]).find(",") != -1):
+ for category in row["subjectmetadata"].split(","):
+ subjectcategoryids.append(commonfunctions.get_subjectcategoryid(category))
+ else:
+ subjectcategoryids.append(commonfunctions.get_subjectcategoryid(row["subjectmetadata"]))
+ else:
+ subjectcategoryids.append(row["subjectmetadata"])
+
+ if (len(row["objectmetadata"]) < 40 and str(row["objectmetadata"])!=""):
+ if (str(row["objectmetadata"]).find(",") != -1):
+ for category in row["objectmetadata"].split(","):
+ objectcategoryids.append(commonfunctions.get_objectcategoryid(category))
+ else:
+ objectcategoryids.append(commonfunctions.get_objectcategoryid(row["objectmetadata"]))
+ else:
+ objectcategoryids.append(row["objectmetadata"])
+
+ if (len(row["actionmetadata"]) < 40 and str(row["actionmetadata"])!=""):
+ if (str(row["actionmetadata"]).find(",") != -1):
+ for category in row["actionmetadata"].split(","):
+ actioncategoryids.append(commonfunctions.get_actioncategoryid(category))
+ else:
+ actioncategoryids.append(commonfunctions.get_actioncategoryid(row["actionmetadata"]))
+ else:
+ actioncategoryids.append(row["actionmetadata"])
+
+
+ data = {
+ 'name': row["metarulename"],
+ 'description': row["metaruledescription"],
+ 'subject_categories': subjectcategoryids,
+ 'object_categories': objectcategoryids,
+ 'action_categories': actioncategoryids
+ }
+
+ response = requests.post(apis_urls.serverURL + apis_urls.metarulesAPI, headers=headers,
+ data=json.dumps(data))
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get subject, object, action categories ids list by calling the common funtion: get_subjectcategoryid, get_objectcategoryid and get_actioncategoryid
+# 2) create the meta rule data jason then patch the meta rule after searching for it's id.
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following meta-rule')
+def step_impl(context):
+ logger.info("When the user sets to update the following meta-rule")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "meta-rule name: '" + row["metarulename"] + "' which will be updated to metarule name:" + row[
+ "updatedmetarulename"] + "' and meta-rule description: '" + row[
+ "updatedmetaruledescription"] + "' and subject categories:'" + row[
+ "updatedsubjectmetadata"] + "' and object categories:'" + row[
+ "updatedobjectmetadata"] + "' and action categories:'" +
+ row["updatedactionmetadata"] + "'")
+
+ subjectcategoryids = []
+ objectcategoryids = []
+ actioncategoryids = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row["updatedsubjectmetadata"]) > 40):
+ subjectcategoryids.append(row["updatedsubjectmetadata"])
+ else:
+ for category in row["updatedsubjectmetadata"].split(","):
+ subjectcategoryids.append(commonfunctions.get_subjectcategoryid(category))
+
+ if (len(row["updatedobjectmetadata"]) > 40):
+ objectcategoryids.append(row["updatedobjectmetadata"])
+ else:
+ for category in row["updatedobjectmetadata"].split(","):
+ objectcategoryids.append(commonfunctions.get_objectcategoryid(category))
+
+ if (len(row["updatedactionmetadata"]) > 40):
+ actioncategoryids.append(row["updatedactionmetadata"])
+ else:
+ for category in row["updatedactionmetadata"].split(","):
+ actioncategoryids.append(commonfunctions.get_actioncategoryid(category))
+
+ data = {
+ 'name': row["updatedmetarulename"],
+ 'description': row["updatedmetaruledescription"],
+ 'subject_categories': subjectcategoryids,
+ 'object_categories': objectcategoryids,
+ 'action_categories': actioncategoryids
+ }
+
+ response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.metarulesAPI]).keys():
+ if (response.json()[apis_urls.metarulesAPI][ids]['name'] == row["metarulename"]):
+ response = requests.patch(apis_urls.serverURL + apis_urls.metarulesAPI + '/' + ids, headers=headers,
+ data=json.dumps(data))
+ break
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the meta rule by get request
+# 2) Loop by ids and search for the matching meta rule by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following meta-rule')
+def step_impl(context):
+ logger.info("When the user sets to delete the following meta-rule")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info(
+ "meta-rule name: '" + row["metarulename"] + "'")
+ response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.metarulesAPI]).keys():
+ if (response.json()[apis_urls.metarulesAPI][ids]['name'] == row["metarulename"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.metarulesAPI + "/" + ids,
+ headers=headers)
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing action meta data by get request and put them into a table
+# 2) Sort the table by meta rule name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following meta-rules should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following meta-rules should be existed in the system")
+ response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI,headers=apis_urls.auth_headers)
+ apimetarulesubjectcategoryname = ""
+ apimetaruleobjectcategoryname = ""
+ apimetaruleactioncategoryname = ""
+ apiresult = Table(
+ names=('metarulename', 'metaruledescription', 'subjectmetadata', 'actionmetadata', 'objectmetadata'),
+ dtype=('S10', 'S100', 'S100', 'S100', 'S100'))
+ if len(response.json()[apis_urls.metarulesAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.metarulesAPI]).keys():
+ apimetarulesubjectcategoryname = ""
+ apimetaruleobjectcategoryname = ""
+ apimetaruleactioncategoryname = ""
+ apimetarulename = response.json()[apis_urls.metarulesAPI][ids]['name']
+ apimetaruledescription = response.json()[apis_urls.metarulesAPI][ids]['description']
+ for categoryid in response.json()[apis_urls.metarulesAPI][ids]['subject_categories']:
+ if (len(apimetarulesubjectcategoryname) > 2):
+ apimetarulesubjectcategoryname = apimetarulesubjectcategoryname + ',' + commonfunctions.get_subjectcategoryname(
+ categoryid)
+ else:
+ apimetarulesubjectcategoryname = commonfunctions.get_subjectcategoryname(categoryid)
+ for categoryid in response.json()[apis_urls.metarulesAPI][ids]['object_categories']:
+ if (len(apimetaruleobjectcategoryname) > 2):
+ apimetaruleobjectcategoryname = apimetaruleobjectcategoryname + ',' + commonfunctions.get_objectcategoryname(
+ categoryid)
+ else:
+ apimetaruleobjectcategoryname = commonfunctions.get_objectcategoryname(categoryid)
+ for categoryid in response.json()[apis_urls.metarulesAPI][ids]['action_categories']:
+ if (len(apimetaruleactioncategoryname) > 2):
+ apimetaruleactioncategoryname = apimetaruleactioncategoryname + ',' + commonfunctions.get_actioncategoryname(
+ categoryid)
+ else:
+ apimetaruleactioncategoryname = commonfunctions.get_actioncategoryname(categoryid)
+
+ apiresult.add_row(vals=(
+ apimetarulename, apimetaruledescription, apimetarulesubjectcategoryname, apimetaruleactioncategoryname,
+ apimetaruleobjectcategoryname))
+
+ else:
+ apiresult.add_row(vals=("", "", "", "", ""))
+
+ apiresult.sort('metarulename')
+
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected meta rule name: '" + str(
+ row1["metarulename"]) + "' is the same as the actual existing '" + str(
+ row2["metarulename"]) + "'")
+ assert str(row1["metarulename"]) == str(row2["metarulename"]), "meta-rule name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected meta rule description: '" + str(
+ row1["metaruledescription"]) + "' is the same as the actual existing '" + str(
+ row2["metaruledescription"]) + "'")
+ assert str(row1["metaruledescription"]) == str(
+ row2["metaruledescription"]), "meta-rule description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected subject categories: '" + str(
+ row1["subjectmetadata"]) + "' is the same as the actual existing '" + str(
+ row2["subjectmetadata"]) + "'")
+ assert str(row1["subjectmetadata"]) == str(row2["subjectmetadata"]), "subject category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected object categories: '" + str(
+ row1["objectmetadata"]) + "' is the same as the actual existing '" + str(
+ row2["objectmetadata"]) + "'")
+ assert str(row1["objectmetadata"]) == str(row2["objectmetadata"]), "object category is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action categories: '" + str(
+ row1["actionmetadata"]) + "' is the same as the actual existing '" + str(
+ row2["actionmetadata"]) + "'")
+ assert str(row1["actionmetadata"]) == str(row2["actionmetadata"]), "action category is not correct!"
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/model.py b/moon_manager/tests/func_tests/features/steps/model.py
new file mode 100644
index 00000000..36b16746
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/model.py
@@ -0,0 +1,230 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing models in the system
+# 2) Loop by id and delete them
+@Given('the system has no models')
+def step_impl(context):
+ logger.info("Given the system has no models")
+
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.modelAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.modelAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.modelAPI + "/" + ids,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Get meta rule ids list by calling the common funtion: get_metaruleid
+# 2) create the model data jason then post it
+@Given('the following model exists')
+def step_impl(context):
+ logger.info("Given the following model exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "model name: '" + row["modelname"] + "' model description: '" + row[
+ "modeldescription"] + "' and meta-rules:'" + row[
+ "metarule"]+"'")
+
+ metarulesids = []
+
+ if (len(row["metarule"]) > 35):
+ metarulesids.append(row["metarule"])
+ else:
+ for metarule in row["metarule"].split(","):
+ metarulesids.append(commonfunctions.get_metaruleid(metarule))
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ data = {
+ 'name': row["modelname"],
+ 'description': row["modeldescription"],
+ 'meta_rules': metarulesids
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.modelAPI, headers=headers,
+ data=json.dumps(data))
+
+
+# Step Definition Implementation:
+# 1) Get meta rule ids list by calling the common funtion: get_metaruleid
+# 2) create the model data jason then post it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following model')
+def step_impl(context):
+ logger.info("When the user sets to add the following model")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "model name: '" + row["modelname"] + "' model description: '" + row[
+ "modeldescription"] + "' and meta-rules:'" + row[
+ "metarule"] + "'")
+
+ metarules = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if(row["metarule"]!=""):
+ if (len(row["metarule"]) > 35):
+ metarules.append(row["metarule"])
+ else:
+ for metarule in row["metarule"].split(","):
+ metarules.append(commonfunctions.get_metaruleid(metarule))
+
+ data = {
+ 'name': row["modelname"],
+ 'description': row["modeldescription"],
+ 'meta_rules': metarules,
+ }
+ else:
+ data = {
+ 'name': row["modelname"],
+ 'description': row["modeldescription"],
+ 'meta_rules': "",
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.modelAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+
+# Step Definition Implementation:
+# 1) Get meta rule ids list by calling the common funtion: get_modelid
+# 2) create the model jason then patch the model after searching for it's id.
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following model')
+def step_impl(context):
+ logging.info("When the user sets to update the following model")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "model name: '" + row["modelname"] + "' which will be updated to model name:" + row[
+ "updatedmodelname"] + "' and model description: '" + row[
+ "updatedmodeldescription"] + "' meta-rules: '"+row["updatedmetarule"] + "'")
+
+ metarules = []
+ data={}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ if(row["updatedmetarule"]!=""):
+ if (len(row["updatedmetarule"]) > 35):
+ metarules.append(row["updatedmetarule"])
+ else:
+ for metarule in row["updatedmetarule"].split(","):
+ metarules.append(commonfunctions.get_metaruleid(metarule))
+ data = {
+ 'name': row["updatedmodelname"],
+ 'description': row["updatedmodeldescription"],
+ 'meta_rules': metarules,
+ }
+ else:
+ data = {
+ 'name': row["updatedmodelname"],
+ 'description': row["updatedmodeldescription"],
+ 'meta_rules': "",
+ }
+ response = requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.modelAPI]).keys():
+ if (response.json()[apis_urls.modelAPI][ids]['name'] == row["modelname"]):
+ response = requests.patch(apis_urls.serverURL + apis_urls.modelAPI+'/'+ids, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the model by get request
+# 2) Loop by ids and search for the matching model by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following model')
+def step_impl(context):
+ logging.info("When the user sets to delete the following model")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info("model name: '" + row["modelname"] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("policy name:'" + row["modelname"] + "'")
+ response = requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.modelAPI]).keys():
+ if (response.json()[apis_urls.modelAPI][ids]['name'] == row["modelname"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.modelAPI + "/" + ids,
+ headers=headers)
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing models by get request and put them into a table
+# 2) Sort the table by model name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following model should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following model should be existed in the system")
+ response = requests.get(apis_urls.serverURL + apis_urls.modelAPI, headers=apis_urls.auth_headers)
+ apimetarulesname=""
+ apiresult = Table(
+ names=('modelname', 'modeldescription', 'metarule'),
+ dtype=('S100', 'S100', 'S100'))
+ if len(response.json()[apis_urls.modelAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.modelAPI]).keys():
+ apimetarulesname = []
+ apimodelname = response.json()[apis_urls.modelAPI][ids]['name']
+ apimodeldescription = response.json()[apis_urls.modelAPI][ids]['description']
+ for metaruleid in response.json()[apis_urls.modelAPI][ids]['meta_rules']:
+ apimetarulesname.append(commonfunctions.get_metarulename(metaruleid))
+ apiresult.add_row(vals=(
+ apimodelname, apimodeldescription, ",".join(apimetarulesname)))
+ else:
+ apiresult.add_row(vals=("", "", ""))
+
+ apiresult.sort('modelname')
+
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected model name: '" + str(
+ row1["modelname"]) + "' is the same as the actual existing '" + str(
+ row2["modelname"]) + "'")
+ assert str(row1["modelname"]) == str(row2["modelname"]), "model name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected model description: '" + str(
+ row1["modeldescription"]) + "' is the same as the actual existing '" + str(
+ row2["modeldescription"]) + "'")
+ assert str(row1["modeldescription"]) == str(row2["modeldescription"]), "model description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected meta rules: '" + str(
+ row1["metarule"]) + "' is the same as the actual existing '" + str(
+ row2["metarule"]) + "'")
+ assert str(row1["metarule"]) == str(row2["metarule"]), "metarule is not correct!"
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/pdp.py b/moon_manager/tests/func_tests/features/steps/pdp.py
new file mode 100644
index 00000000..bf839658
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/pdp.py
@@ -0,0 +1,248 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing pdps in the system
+# 2) Loop by id and delete them
+@Given('the system has no pdps')
+def step_impl(context):
+ logger.info("Given the system has no pdps")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.pdpAPI, headers=apis_urls.auth_headers)
+ pdpjason=apis_urls.pdpAPI+"s"
+ if len(response.json()[pdpjason]) != 0:
+ for ids in dict(response.json()[pdpjason]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.pdpAPI + "/" + ids,
+ headers=headers)
+
+# Step Definition Implementation:
+# 1) Get model id by calling the common funtion: get_policyid
+# 2) create the pdp data jason then post it
+@Given('the following pdp exists')
+def step_impl(context):
+ logger.info("Given the following pdp exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "pdp name: '" + row["pdpname"] + "' pdp description: '" + row[
+ "pdpdescription"] + "' and keystone project:'" + row[
+ "keystone_project_id"] + "' and security pipeline '" + row['security_pipeline'] + "'")
+ policies_list = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['security_pipeline']) > 25):
+ policies_list = row['security_pipeline']
+ else:
+ for policy in row["security_pipeline"].split(","):
+ policies_list.append(commonfunctions.get_policyid(policy))
+
+ data = {
+ 'name': row["pdpname"],
+ 'description': row["pdpdescription"],
+ 'vim_project_id': row['keystone_project_id'],
+ 'security_pipeline': policies_list
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.pdpAPI, headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Get policy id by calling the common funtion: get_policyid
+# 2) create the pdp jason then patch the policy after searching for it's id.
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following pdp')
+def step_impl(context):
+ logger.info("When the user sets to add the following pdp")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "pdp name: '" + row["pdpname"] + "' pdp description: '" + row[
+ "pdpdescription"] + "' and keystone project:'" + row[
+ "keystone_project_id"] + "' and security pipeline '" + row['security_pipeline'] + "'")
+
+ policies_list = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ if (row["security_pipeline"] != ""):
+ if (len(row['security_pipeline']) > 25):
+ policies_list = row['security_pipeline']
+ else:
+ for policy in row["security_pipeline"].split(","):
+ policies_list.append(commonfunctions.get_policyid(policy))
+ data = {
+ 'name': row["pdpname"],
+ 'description': row["pdpdescription"],
+ 'vim_project_id': row['keystone_project_id'],
+ 'security_pipeline': policies_list
+ }
+ else:
+ data = {
+ 'name': row["pdpname"],
+ 'description': row["pdpdescription"],
+ 'vim_project_id': row['keystone_project_id'],
+ 'security_pipeline': ""
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.pdpAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get model id by calling the common funtion: get_policyid
+# 2) create the pdp data jason then patch it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following pdp')
+def step_impl(context):
+ logger.info("When the user sets to update the following pdp")
+
+ model = getattr(context, "model", None)
+ policies_list=[]
+ for row in context.table:
+ logger.info(
+ "pdp name: '" + row["pdpname"] + "' which will be updated to pdp name:" + row[
+ "updatedpdpname"] + "' and pdp description: '" + row[
+ "updatedpdpdescription"] + "' keystone_project: '" + row["updatedkeystone_project_id"] + "' security pipeline: '"+row["updatedsecurity_pipeline"]+"'")
+
+ policies_list = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['updatedsecurity_pipeline']) > 25):
+ policies_list = row['updatedsecurity_pipeline']
+ else:
+ for policy in row["updatedsecurity_pipeline"].split(","):
+ policies_list.append(commonfunctions.get_policyid(policy))
+
+ data = {
+ 'name': row["updatedpdpname"],
+ 'description': row["updatedpdpdescription"],
+ 'vim_project_id': row['updatedkeystone_project_id'],
+ 'security_pipeline': policies_list
+ }
+
+ response = requests.get(apis_urls.serverURL + apis_urls.pdpAPI,headers=apis_urls.auth_headers)
+ logger.info(response.json())
+ pdpjason = apis_urls.pdpAPI + "s"
+ for ids in dict(response.json()[pdpjason]).keys():
+ logger.info(str(response.json()[pdpjason][ids]['name']))
+ if (response.json()[pdpjason][ids]['name'] == row["pdpname"]):
+ logger.info(apis_urls.serverURL + apis_urls.pdpAPI+ '/' + ids)
+ response = requests.patch(apis_urls.serverURL + apis_urls.pdpAPI+ '/' + ids, headers=headers,
+ data=json.dumps(data))
+ logger.info(response.json())
+
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+ break
+
+# Step Definition Implementation:
+# 1) Get all the pdps by get request
+# 2) Loop by ids and search for the matching pdp by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following pdp')
+def step_impl(context):
+ logging.info("When the user sets to delete the following pdp")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("pdp name:'" + row["pdpname"] + "'")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.pdpAPI,headers=apis_urls.auth_headers)
+ pdpjason=apis_urls.pdpAPI+"s"
+ for ids in dict(response.json()[pdpjason]).keys():
+ if (response.json()[pdpjason][ids]['name'] == row["pdpname"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.pdpAPI + "/" + ids,
+ headers=headers)
+
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing pdps by get request and put them into a table
+# 2) Sort the table by pdp name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following pdp should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following pdp should be existed in the system")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.pdpAPI,headers=apis_urls.auth_headers)
+ apiresult = Table(
+ names=('pdpname', 'pdpdescription', 'keystone_project_id','security_pipeline'),
+ dtype=('S10', 'S100', 'S100','S100'))
+ pdp_jason=apis_urls.pdpAPI+"s"
+ if len(response.json()[pdp_jason]) != 0:
+ for ids in dict(response.json()[pdp_jason]).keys():
+ apipdppolicies = ""
+ apipdpname = response.json()[pdp_jason][ids]['name']
+ apipdpdescription = response.json()[pdp_jason][ids]['description']
+ apipdpprojectid = response.json()[pdp_jason][ids]['vim_project_id']
+ for policies in response.json()[pdp_jason][ids]['security_pipeline']:
+ if(len(apipdppolicies)>2):
+ apipdppolicies = apipdppolicies +','+ commonfunctions.get_policyname(policies)
+ else:
+ apipdppolicies=commonfunctions.get_policyname(policies)
+
+ apiresult.add_row(vals=(
+ apipdpname, apipdpdescription, apipdpprojectid,apipdppolicies))
+
+ else:
+ apiresult.add_row(vals=("", "", "",""))
+
+ apiresult.sort('pdpname')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected pdp name: '" + str(
+ row1["pdpname"]) + "' is the same as the actual existing '" + str(
+ row2["pdpname"]) + "'")
+ assert str(row1["pdpname"]) == str(row2["pdpname"]), "pdp name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected pdp description: '" + str(
+ row1["pdpdescription"]) + "' is the same as the actual existing '" + str(
+ row2["pdpdescription"]) + "'")
+
+ assert str(row1["pdpdescription"]) == str(row2["pdpdescription"]), "pdp description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected keystone project id description: '" + str(
+ row1["keystone_project_id"]) + "' is the same as the actual existing '" + str(
+ row2["keystone_project_id"]) + "'")
+ assert str(row1["keystone_project_id"]) == str(row2["keystone_project_id"]), "project id is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected security pipeline description: '" + str(
+ row1["security_pipeline"]) + "' is the same as the actual existing '" + str(
+ row2["security_pipeline"]) + "'")
+ assert str(row1["security_pipeline"]) == str(row2["security_pipeline"]), "security_pipeline policies is not correct!"
+ logger.info("assertion passed!")
+
diff --git a/moon_manager/tests/func_tests/features/steps/perimeter.py b/moon_manager/tests/func_tests/features/steps/perimeter.py
new file mode 100644
index 00000000..a4a53120
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/perimeter.py
@@ -0,0 +1,727 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing subject preimeters in the system
+# 2) Loop by id to unlink the policies attached
+# 3) Then delete the perimeter itself
+@Given('the system has no subject perimeter')
+def step_impl(context):
+ logger.info("Given the system has no subject perimeter")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ response = requests.get(apis_urls.serverURL + apis_urls.perimetersubjectAPI,headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.perimetersubjectAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.perimetersubjectAPI]).keys():
+ policies_list = response.json()[apis_urls.perimetersubjectAPI][ids]['policy_list']
+ for policy in policies_list:
+ response_delete_policies = requests.delete(
+ apis_urls.serverURL + "policies/" + policy + "/" + apis_urls.perimetersubjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+ response_delete = requests.delete(apis_urls.serverURL + apis_urls.perimetersubjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+ # exit(0)
+
+# Step Definition Implementation:
+# 1) Post subject perimeter using the policy id
+@Given('the following subject perimeter exists')
+def step_impl(context):
+ logger.info("Given the following subject perimeter exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row["subjectperimetername"] + "' subject perimeter description: '" + row[
+ "subjectperimeterdescription"] # "' and subject perimeter email:'" + row[
+ # "subjectperimeteremail"] + "' and subject perimeter password '" + row['subjectperimeterpassword']
+ + "' and policies '" + row['policies'] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ policyid=""
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ data = {
+ 'name': row["subjectperimetername"],
+ 'description': row["subjectperimeterdescription"],
+ # 'email': row['subjectperimeteremail'],
+ # 'password': row['subjectperimeterpassword'],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimetersubjectAPI, headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Get all the existing object preimeters in the system
+# 2) Loop by id to unlink the policies attached
+# 3) Then delete the perimeter itself
+@Given('the system has no object perimeter')
+def step_impl(context):
+ logger.info("Given the system has no object perimeter")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeterobjectAPI,headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.perimeterobjectAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.perimeterobjectAPI]).keys():
+ policies_list = response.json()[apis_urls.perimeterobjectAPI][ids]['policy_list']
+ for policy in policies_list:
+ response_delete_policies = requests.delete(
+ apis_urls.serverURL + "policies/" + policy + "/" + apis_urls.perimeterobjectAPI + "/" + ids,
+ headers=headers)
+ response_delete = requests.delete(apis_urls.serverURL + apis_urls.perimeterobjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+# Step Definition Implementation:
+# 1) Post object perimeter using the policy id
+@Given('the following object perimeter exists')
+def step_impl(context):
+ logger.info("Given the following object perimeter exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object perimeter name: '" + row["objectperimetername"] + "' object perimeter description: '" + row[
+ "objectperimeterdescription"] + "' and policies '" + row['policies'] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+
+ data = {
+ 'name': row["objectperimetername"],
+ 'description': row["objectperimeterdescription"],
+
+ }
+ response = requests.post(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimeterobjectAPI,
+ headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Get all the existing action preimeters in the system
+# 2) Loop by id to unlink the policies attached
+# 3) Then delete the perimeter itself
+@Given('the system has no action perimeter')
+def step_impl(context):
+ logger.info("Given the system has no action perimeter")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeteractionAPI,headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.perimeteractionAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.perimeteractionAPI]).keys():
+ policies_list = response.json()[apis_urls.perimeteractionAPI][ids]['policy_list']
+ for policy in policies_list:
+ response_delete_policies = requests.delete(
+ apis_urls.serverURL + "policies/" + policy + "/" + apis_urls.perimeteractionAPI + "/" + ids,
+ headers=headers)
+ response_delete = requests.delete(apis_urls.serverURL + apis_urls.perimeteractionAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+
+# Step Definition Implementation:
+# 1) Post action perimeter using the policy id
+@Given('the following action perimeter exists')
+def step_impl(context):
+ logger.info("Given the following action perimeter exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "action perimeter name: '" + row["actionperimetername"] + "' action perimeter description: '" + row[
+ "actionperimeterdescription"] + "' and policies '" + row['policies'] + "'")
+
+ policyid=""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ data = {
+ 'name': row["actionperimetername"],
+ 'description': row["actionperimeterdescription"],
+
+ }
+ response = requests.post(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimeteractionAPI,
+ headers=headers,
+ data=json.dumps(data))
+
+# Step Definition Implementation:
+# 1) Insert subject perimeter using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following subject perimeter')
+def step_impl(context):
+ logger.info("When the user sets to add the following subject perimeter")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row["subjectperimetername"] + "' subject perimeter description: '" + row[
+ "subjectperimeterdescription"] +
+ # "' and subject perimeter email:'" + row["subjectperimeteremail"] + "' and subject perimeter password '" + row['subjectperimeterpassword'] +
+ "' and policies '" + row['policies'] + "'")
+
+ policyid = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ data = {
+ 'name': row["subjectperimetername"],
+ 'description': row["subjectperimeterdescription"],
+ # 'email': row['subjectperimeteremail'],
+ # 'password': row['subjectperimeterpassword'],
+ }
+ response = requests.post(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimetersubjectAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing subject perimeter & get its id
+# 2) create the new perimeter jason and patch it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following subject perimeter')
+def step_impl(context):
+ logger.info("When the user sets to update the following subject perimeter")
+ model = getattr(context, "model", None)
+ policies_list = []
+ for row in context.table:
+ logger.info(
+ "subject perimeter name: '" + row[
+ 'subjectperimetername'] + "' which will be updated to subject perimeter name:'" + row[
+ "updatedsubjectperimetername"] + "' subject perimeter description: '" + row[
+ "updatedsubjectperimeterdescription"] +
+ # "' and subject perimeter email:'" + row["updatedsubjectperimeteremail"] + "' and subject perimeter password '" + row['updatedsubjectperimeterpassword']
+ "' and policies '" + row['policies'] + "'")
+
+ policyid = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid=commonfunctions.get_policyid(row['policies'])
+ else:
+ policyid=""
+ data = {
+ 'name': row["updatedsubjectperimetername"],
+ 'description': row["updatedsubjectperimeterdescription"],
+ # 'email': row['subjectperimeteremail'],
+ # 'password': row['subjectperimeterpassword'],
+ }
+ response = requests.get(apis_urls.serverURL + apis_urls.perimetersubjectAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimetersubjectAPI]).keys():
+ if (response.json()[apis_urls.perimetersubjectAPI][ids]['name'] == row["subjectperimetername"]):
+ #print(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimetersubjectAPI + '/' + ids)
+ response = requests.patch(apis_urls.serverURL + apis_urls.perimetersubjectAPI + '/' + ids,
+ headers=headers,data=json.dumps(data))
+ print(response)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing subject perimeter & get its id
+# 2) Delete it without having the policy id in the request
+@When('the user sets to delete the following subject perimeter')
+def step_impl(context):
+ logging.info("When the user sets to delete the following subject perimeter")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {
+ 'Content-Type': 'application/json',
+ }
+ logger.info("subject perimeter name:'" + row["subjectperimetername"] + "'")
+ response = requests.get(apis_urls.serverURL + apis_urls.perimetersubjectAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimetersubjectAPI]).keys():
+ if (response.json()[apis_urls.perimetersubjectAPI][ids]['name'] == row["subjectperimetername"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.perimetersubjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing subject perimeter & get its id
+# 2) Delete it while having the policy id in the request
+@When('the user sets to delete the following subject perimeter for a given policy')
+def step_impl(context):
+ logging.info("the user sets to delete the following subject perimeter for a given policy")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {
+ 'Content-Type': 'application/json',
+ }
+ logger.info("subject perimeter name:'" + row["subjectperimetername"] + "' and policy:"+ row["policies"]+"'")
+ policyid = commonfunctions.get_policyid(row['policies'])
+ response = requests.get(apis_urls.serverURL + apis_urls.perimetersubjectAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimetersubjectAPI]).keys():
+ if (response.json()[apis_urls.perimetersubjectAPI][ids]['name'] == row["subjectperimetername"]):
+ response = requests.delete(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimetersubjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+ logger.info(response.json())
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Insert object perimeter using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following object perimeter')
+def step_impl(context):
+ logger.info("When the user sets to add the following object perimeter")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object perimeter name: '" + row["objectperimetername"] + "' object perimeter description: '" + row[
+ "objectperimeterdescription"] + "' and policies '" + row['policies'] + "'")
+
+ policies_list = []
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ else:
+ policyid=""
+ data = {
+ 'name': row["objectperimetername"],
+ 'description': row["objectperimeterdescription"],
+ }
+ response = requests.post(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimeterobjectAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing object perimeter & get its id
+# 2) create the new perimeter jason and patch it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following object perimeter')
+def step_impl(context):
+ logger.info("When the user sets to update the following object perimeter")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "object perimeter name: '" + row[
+ 'objectperimetername'] + "' which will be updated to object perimeter name:" + row[
+ "updatedobjectperimetername"] + "' object perimeter description: '" + row[
+ "updatedobjectperimeterdescription"] + "' and policies '" + row['policies'] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ else:
+ policyid=""
+ data = {
+ 'name': row["updatedobjectperimetername"],
+ 'description': row["updatedobjectperimeterdescription"],
+ }
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeterobjectAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimeterobjectAPI]).keys():
+ if (response.json()[apis_urls.perimeterobjectAPI][ids]['name'] == row["objectperimetername"]):
+ response = requests.patch(apis_urls.serverURL + apis_urls.perimeterobjectAPI + '/' + ids,
+ headers=headers,data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing object perimeter & get its id
+# 2) Delete it without having the policy id in the request
+@When('the user sets to delete the following object perimeter')
+def step_impl(context):
+ logging.info("When the user sets to delete the following object perimeter")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("object perimeter name:'" + row["objectperimetername"] + "'")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeterobjectAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimeterobjectAPI]).keys():
+ if (response.json()[apis_urls.perimeterobjectAPI][ids]['name'] == row["objectperimetername"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.perimeterobjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing object perimeter & get its id
+# 2) Delete it while having the policy id in the request
+@When('the user sets to delete the following object perimeter for a given policy')
+def step_impl(context):
+ logging.info("the user sets to delete the following object perimeter for a given policy")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("object perimeter name:'" + row["objectperimetername"] + "' and policy:"+ row["policies"]+"'")
+ policyid = commonfunctions.get_policyid(row['policies'])
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeterobjectAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimeterobjectAPI]).keys():
+ if (response.json()[apis_urls.perimeterobjectAPI][ids]['name'] == row["objectperimetername"]):
+ response = requests.delete(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimeterobjectAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Insert action perimeter using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following action perimeter')
+def step_impl(context):
+ logger.info("When the user sets to add the following action perimeter")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "action perimeter name: '" + row["actionperimetername"] + "' action perimeter description: '" + row[
+ "actionperimeterdescription"] + "' and policies '" + row['policies'] + "'")
+
+ policyid=""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ else:
+ policyid=""
+ data = {
+ 'name': row["actionperimetername"],
+ 'description': row["actionperimeterdescription"],
+
+ }
+ response = requests.post(
+ apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimeteractionAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing action perimeter & get its id
+# 2) create the new perimeter jason and patch it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following action perimeter')
+def step_impl(context):
+ logger.info("When the user sets to update the following action perimeter")
+
+ model = getattr(context, "model", None)
+
+ for row in context.table:
+
+ logger.info(
+ "action perimeter name: '" + row[
+ 'actionperimetername'] + "' which will be updated to action perimeter name:" + row[
+ "updatedactionperimetername"] + "' action perimeter description: '" + row[
+ "updatedactionperimeterdescription"] + "' and policies '" + row['policies'] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (row['policies'] != ""):
+ policyid = commonfunctions.get_policyid(row['policies'])
+ else:
+ policyid=""
+ data = {
+ 'name': row["updatedactionperimetername"],
+ 'description': row["updatedactionperimeterdescription"],
+ }
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeteractionAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimeteractionAPI]).keys():
+ if (response.json()[apis_urls.perimeteractionAPI][ids]['name'] == row["actionperimetername"]):
+ response = requests.patch(
+ apis_urls.serverURL + apis_urls.perimeteractionAPI + '/' + ids,
+ headers=headers,data=json.dumps(data))
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing action perimeter & get its id
+# 2) Delete it without having the policy id in the request
+@When('the user sets to delete the following action perimeter')
+def step_impl(context):
+ logging.info("When the user sets to delete the following action perimeter")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("action perimeter name:'" + row["actionperimetername"] + "'")
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeteractionAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimeteractionAPI]).keys():
+ if (response.json()[apis_urls.perimeteractionAPI][ids]['name'] == row["actionperimetername"]):
+ response = requests.delete(apis_urls.serverURL + apis_urls.perimeteractionAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Search for the existing action perimeter & get its id
+# 2) Delete it while having the policy id in the request
+@When('the user sets to delete the following action perimeter for a given policy')
+def step_impl(context):
+ logging.info("the user sets to delete the following action perimeter for a given policy")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("action perimeter name:'" + row["actionperimetername"] + "' and policy:"+ row["policies"]+"'")
+ policyid = commonfunctions.get_policyid(row['policies'])
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeteractionAPI,headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.perimeteractionAPI]).keys():
+ if (response.json()[apis_urls.perimeteractionAPI][ids]['name'] == row["actionperimetername"]):
+ response = requests.delete(apis_urls.serverURL + "policies/" + policyid + "/" + apis_urls.perimeteractionAPI + "/" + ids,
+ headers=apis_urls.auth_headers)
+
+ if response.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing subject perimeter by get request and put them into a table
+# 2) Sort the table by subject perimeter
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following subject perimeter should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following subject perimeter should be existed in the system")
+
+ response = requests.get(apis_urls.serverURL + apis_urls.perimetersubjectAPI,headers=apis_urls.auth_headers)
+ apiresult = Table(
+ names=('subjectperimetername', 'subjectperimeterdescription',
+ # 'subjectperimeteremail',
+ # 'subjectperimeterpassword',
+ 'policies'),
+ dtype=('S100', 'S100', 'S100'))
+
+ if len(response.json()[apis_urls.perimetersubjectAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.perimetersubjectAPI]).keys():
+ apipoliciesid = []
+ apipolicies = ""
+ GeneralVariables.assignsubjectperimeterid['value']=ids
+ apisubjectperimetername = response.json()[apis_urls.perimetersubjectAPI][ids]['name']
+ apisubjectperimeterdescription = response.json()[apis_urls.perimetersubjectAPI][ids]['description']
+ # apisubjectperimeteremail = response.json()[apis_urls.perimetersubjectAPI][ids]['email']
+ # apisubjectperimeterpassword = response.json()[apis_urls.perimetersubjectAPI][ids]['password']
+ if (len(response.json()[apis_urls.perimetersubjectAPI][ids]['policy_list']) != 0):
+ for policies in response.json()[apis_urls.perimetersubjectAPI][ids]['policy_list']:
+ apipoliciesid.append(commonfunctions.get_policyname(str(policies)))
+ apipolicies = ",".join(apipoliciesid)
+ else:
+ apipolicies = ""
+ apiresult.add_row(vals=(
+ apisubjectperimetername, apisubjectperimeterdescription,
+ # apisubjectperimeteremail,# apisubjectperimeterpassword,
+ apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", ""))
+
+ apiresult.sort('subjectperimetername')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected subject perimeter name: '" + str(
+ row1["subjectperimetername"]) + "' is the same as the actual existing '" + str(
+ row2["subjectperimetername"]) + "'")
+ assert str(row1["subjectperimetername"]) == str(
+ row2["subjectperimetername"]), "subject perimeter name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected subject perimeter description: '" + str(
+ row1["subjectperimeterdescription"]) + "' is the same as the actual existing '" + str(
+ row2["subjectperimeterdescription"]) + "'")
+ assert str(row1["subjectperimeterdescription"]) == str(
+ row2["subjectperimeterdescription"]), "subject perimeter description is not correct!"
+ logger.info("assertion passed!")
+
+ # logger.info("asserting the expected subject perimeter email: '" + str(
+ # row1["subjectperimeteremail"]) + "' is the same as the actual existing '" + str(
+ # row2["subjectperimeteremail"]) + "'")
+ # assert str(row1["subjectperimeteremail"]) == str(
+ # row2["subjectperimeteremail"]), "subject perimeter email is not correct!"
+ # logger.info("assertion passed!")
+ #
+ # logger.info("asserting the expected subject perimeter password: '" + str(
+ # row1["subjectperimeterpassword"]) + "' is the same as the actual existing '" + str(
+ # row2["subjectperimeterpassword"]) + "'")
+ # assert str(row1["subjectperimeterpassword"]) == str(
+ # row2["subjectperimeterpassword"]), "subject perimeter password is not correct!"
+ # logger.info("assertion passed!")
+
+ if (str(row1["policies"]).find(',') == -1):
+ logger.info("asserting the expected policies: '" + str(
+ row1["policies"]) + "' is the same as the actual existing '" + str(
+ row2["policies"]) + "'")
+ logger.info("policies is not correct!")
+ assert str(row1["policies"]) == str(row2["policies"]), " policies is not correct!"
+ else:
+
+ logger.info("asserting the expected policies: '" + ','.join(
+ sorted(str(row1["policies"]).split(','), key=str.lower)) + "' is the same as the actual existing '" +
+ ','.join(sorted(str(row2["policies"]).split(','), key=str.lower)) + "'")
+ logger.info("policies is not correct!")
+ assert ','.join(sorted(str(row1["policies"]).split(','), key=str.lower)) == ','.join(
+ sorted(str(row2["policies"]).split(','), key=str.lower)), " policies is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing object perimeter by get request and put them into a table
+# 2) Sort the table by subject perimeter
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following object perimeter should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following object perimeter should be existed in the system")
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeterobjectAPI,headers=apis_urls.auth_headers)
+ apiresult = Table(
+ names=('objectperimetername', 'objectperimeterdescription', 'policies'),
+ dtype=('S100', 'S100', 'S100'))
+ if len(response.json()[apis_urls.perimeterobjectAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.perimeterobjectAPI]).keys():
+ apipolicies = ""
+ apipoliciesid = []
+ apiobjectperimetername = response.json()[apis_urls.perimeterobjectAPI][ids]['name']
+ apiobjectperimeterdescription = response.json()[apis_urls.perimeterobjectAPI][ids]['description']
+ if (len(response.json()[apis_urls.perimeterobjectAPI][ids]['policy_list']) != 0):
+ for policies in response.json()[apis_urls.perimeterobjectAPI][ids]['policy_list']:
+ apipoliciesid.append(commonfunctions.get_policyname(str(policies)))
+ apipolicies = ",".join(apipoliciesid)
+ else:
+ apipolicies = ""
+ apiresult.add_row(vals=(
+ apiobjectperimetername, apiobjectperimeterdescription, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", ""))
+
+ apiresult.sort('objectperimetername')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected object perimeter name: '" + str(
+ row1["objectperimetername"]) + "' is the same as the actual existing '" + str(
+ row2["objectperimetername"]) + "'")
+ assert str(row1["objectperimetername"]) == str(
+ row2["objectperimetername"]), "object perimeter name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected object perimeter description: '" + str(
+ row1["objectperimeterdescription"]) + "' is the same as the actual existing '" + str(
+ row2["objectperimeterdescription"]) + "'")
+ assert str(row1["objectperimeterdescription"]) == str(
+ row2["objectperimeterdescription"]), "object perimeter description is not correct!"
+ logger.info("assertion passed!")
+
+ if (str(row1["policies"]).find(',') == -1):
+ logger.info("asserting the expected policies: '" + str(
+ row1["policies"]) + "' is the same as the actual existing '" + str(
+ row2["policies"]) + "'")
+ logger.info("policies is not correct!")
+ assert str(row1["policies"]) == str(row2["policies"]), " policies is not correct!"
+ else:
+ logger.info("asserting the expected policies: '" + ','.join(
+ sorted(str(row1["policies"]).split(','), key=str.lower)) + "' is the same as the actual existing '" +
+ ','.join(sorted(str(row2["policies"]).split(','), key=str.lower)) + "'")
+ logger.info("policies is not correct!")
+ assert ','.join(sorted(str(row1["policies"]).split(','), key=str.lower)) == ','.join(
+ sorted(str(row2["policies"]).split(','), key=str.lower)), " policies is not correct!"
+ logger.info("assertion passed!")
+
+# Step Definition Implementation:
+# 1) Get all the existing subject perimeter by get request and put them into a table
+# 2) Sort the table by subject perimeter
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following action perimeter should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following action perimeter should be existed in the system")
+ response = requests.get(apis_urls.serverURL + apis_urls.perimeteractionAPI,headers=apis_urls.auth_headers)
+ apiresult = Table(
+ names=('actionperimetername', 'actionperimeterdescription', 'policies'),
+ dtype=('S100', 'S100', 'S100'))
+ if len(response.json()[apis_urls.perimeteractionAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.perimeteractionAPI]).keys():
+ apipolicies = ""
+ apipoliciesid = []
+ apiactionperimetername = response.json()[apis_urls.perimeteractionAPI][ids]['name']
+ apiactionperimeterdescription = response.json()[apis_urls.perimeteractionAPI][ids]['description']
+ if (len(response.json()[apis_urls.perimeteractionAPI][ids]['policy_list']) != 0):
+ for policies in response.json()[apis_urls.perimeteractionAPI][ids]['policy_list']:
+ apipoliciesid.append(commonfunctions.get_policyname(str(policies)))
+ apipolicies = ",".join(apipoliciesid)
+ else:
+ apipolicies = ""
+ apiresult.add_row(vals=(
+ apiactionperimetername, apiactionperimeterdescription, apipolicies))
+ else:
+ apiresult.add_row(vals=("", "", ""))
+
+ apiresult.sort('actionperimetername')
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected action perimeter name: '" + str(
+ row1["actionperimetername"]) + "' is the same as the actual existing '" + str(
+ row2["actionperimetername"]) + "'")
+ assert str(row1["actionperimetername"]) == str(
+ row2["actionperimetername"]), "action perimeter name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected action perimeter description: '" + str(
+ row1["actionperimeterdescription"]) + "' is the same as the actual existing '" + str(
+ row2["actionperimeterdescription"]) + "'")
+ assert str(row1["actionperimeterdescription"]) == str(
+ row2["actionperimeterdescription"]), "action perimeter description is not correct!"
+ logger.info("assertion passed!")
+
+ if(str(row1["policies"]).find(',')==-1):
+ logger.info("asserting the expected policies: '" + str(
+ row1["policies"]) + "' is the same as the actual existing '" + str(
+ row2["policies"]) + "'")
+ logger.info("policies is not correct!")
+ assert str(row1["policies"]) == str(row2["policies"]), " policies is not correct!"
+ else:
+
+ logger.info("asserting the expected policies: '" + ','.join(sorted(str(row1["policies"]).split(','),key=str.lower)) + "' is the same as the actual existing '" +
+ ','.join(sorted(str(row2["policies"]).split(','), key=str.lower)) + "'")
+ logger.info("policies is not correct!")
+ assert ','.join(sorted(str(row1["policies"]).split(','),key=str.lower)) == ','.join(sorted(str(row2["policies"]).split(','),key=str.lower)), " policies is not correct!"
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/features/steps/policy.py b/moon_manager/tests/func_tests/features/steps/policy.py
new file mode 100644
index 00000000..faa7156a
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/policy.py
@@ -0,0 +1,219 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing policies in the system
+# 2) Loop by id and delete them
+@Given('the system has no policies')
+def step_impl(context):
+ logger.info("Given the system has no policies")
+ api_responseflag = {'value': False}
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ response = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.policyAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.policyAPI]).keys():
+ response = requests.delete(apis_urls.serverURL + apis_urls.policyAPI + "/" + ids,
+ headers=headers)
+
+
+# Step Definition Implementation:
+# 1) Get model id by calling the common funtion: get_modelid
+# 2) create the policy data jason then post it
+@Given('the following policy exists')
+def step_impl(context):
+ logger.info("Given the following policy exists")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "policy name: '" + row["policyname"] + "' policy description: '" + row[
+ "policydescription"] + "' and model name:'" + row[
+ "modelname"] + "' and genre '"+row['genre']+"'")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ data = {
+ 'name': row["policyname"],
+ 'description': row["policydescription"],
+ 'model_id': commonfunctions.get_modelid(row['modelname']),
+ 'genre': row['genre']
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.policyAPI, headers=headers,
+ data=json.dumps(data))
+
+
+# Step Definition Implementation:
+# 1) Get model id by calling the common funtion: get_modelid
+# 2) create the policy data jason then post it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following policy')
+def step_impl(context):
+ logger.info("When the user sets to add the following policy")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "policy name: '" + row["policyname"] + "' policy description: '" + row[
+ "policydescription"] + "' and model name:'" + row[
+ "modelname"] + "' and genre '" + row['genre'] + "'")
+ policymodel = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['modelname']) > 20):
+ policymodel=row['modelname']
+ else:
+ policymodel=commonfunctions.get_modelid(row['modelname'])
+
+ data = {
+ 'name': row["policyname"],
+ 'description': row["policydescription"],
+ 'model_id': policymodel,
+ 'genre': row['genre']
+ }
+ response = requests.post(apis_urls.serverURL + apis_urls.policyAPI, headers=headers,
+ data=json.dumps(data))
+
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+
+# Step Definition Implementation:
+# 1) Get model id by calling the common funtion: get_modelid
+# 2) create the policy jason then patch the policy after searching for it's id.
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to update the following policy')
+def step_impl(context):
+ logger.info("When the user sets to update the following policy")
+ model = getattr(context, "model", None)
+ for row in context.table:
+ logger.info(
+ "policy name: '" + row["policyname"] + "' which will be updated to policy name:" + row[
+ "updatedpolicyname"] + "' and policy description: '" + row[
+ "updatedpolicydescription"] + "' model name: '" + row["updatedmodelname"] + "' and genre: '"+row["updatedgenre"]+"'")
+ policymodel = ""
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['updatedmodelname']) > 20):
+ policymodel = row['updatedmodelname']
+ else:
+ policymodel = commonfunctions.get_modelid(row['updatedmodelname'])
+
+ data = {
+ 'name': row["updatedpolicyname"],
+ 'description': row["updatedpolicydescription"],
+ 'model_id': policymodel,
+ 'genre': row['updatedgenre']
+ }
+ response = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.policyAPI]).keys():
+ if (response.json()[apis_urls.policyAPI][ids]['name'] == row["policyname"]):
+ print(apis_urls.serverURL + apis_urls.policyAPI + '/' + ids)
+ response = requests.patch(apis_urls.serverURL + apis_urls.policyAPI + '/' + ids, headers=headers,
+ data=json.dumps(data))
+ logger.info(response.json())
+ logger.info(response.status_code)
+ break
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the policy by get request
+# 2) Loop by ids and search for the matching policy by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following policy')
+def step_impl(context):
+ logger.info("When the user sets to delete the following policy")
+
+ model = getattr(context, "model", None)
+ for row in context.table:
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ logger.info("policy name:'" +row["policyname"]+"'")
+ response = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ for ids in dict(response.json()[apis_urls.policyAPI]).keys():
+ if (response.json()[apis_urls.policyAPI][ids]['name'] == row["policyname"]):
+ GeneralVariables.assignpolicyid['value']=ids
+ response = requests.delete(apis_urls.serverURL + apis_urls.policyAPI + "/" + ids,
+ headers=headers)
+ break
+
+ if response.status_code==200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing policies by get request and put them into a table
+# 2) Sort the table by policy name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following policy should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following policy should be existed in the system")
+ response = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ #print(response)
+ apiresult = Table(
+ names=('policyname', 'policydescription', 'modelname','genre'),
+ dtype=('S100', 'S100', 'S100','S100'))
+ if len(response.json()[apis_urls.policyAPI]) != 0:
+ for ids in dict(response.json()[apis_urls.policyAPI]).keys():
+ apipolicyname = response.json()[apis_urls.policyAPI][ids]['name']
+ apipolicydescription = response.json()[apis_urls.policyAPI][ids]['description']
+ apipolicymodel = commonfunctions.get_modelname(response.json()[apis_urls.policyAPI][ids]['model_id'])
+ apipolicygenre=response.json()[apis_urls.policyAPI][ids]['genre']
+
+ apiresult.add_row(vals=(
+ apipolicyname, apipolicydescription, apipolicymodel,apipolicygenre))
+
+ else:
+ apiresult.add_row(vals=("", "", "",""))
+
+ apiresult.sort('policyname')
+
+ for row1, row2 in zip(context.table, apiresult):
+ logger.info("asserting the expected policy name: '" + str(
+ row1["policyname"]) + "' is the same as the actual existing '" + str(
+ row2["policyname"]) + "'")
+ assert str(row1["policyname"]) == str(row2["policyname"]), "policy name is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected policy description: '" + str(
+ row1["policydescription"]) + "' is the same as the actual existing '" + str(
+ row2["policydescription"]) + "'")
+ assert str(row1["policydescription"]) == str(row2["policydescription"]), "policy description is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected genre: '" + str(
+ row1["genre"]) + "' is the same as the actual existing '" + str(
+ row2["genre"]) + "'")
+ assert str(row1["genre"]) == str(row2["genre"]), "genre is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected model name: '" + str(
+ row1["modelname"]) + "' is the same as the actual existing '" + str(
+ row2["modelname"]) + "'")
+ assert str(row1["modelname"]) == str(row2["modelname"]), "model name is not correct!"
+ logger.info("assertion passed!") \ No newline at end of file
diff --git a/moon_manager/tests/func_tests/features/steps/rules.py b/moon_manager/tests/func_tests/features/steps/rules.py
new file mode 100644
index 00000000..4dd85e2c
--- /dev/null
+++ b/moon_manager/tests/func_tests/features/steps/rules.py
@@ -0,0 +1,495 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from behave import *
+from Static_Variables import GeneralVariables
+from astropy.table import Table, Column
+from common_functions import *
+import numpy as np
+import requests
+import json
+import logging
+
+apis_urls = GeneralVariables()
+commonfunctions = commonfunctions()
+
+logger = logging.getLogger(__name__)
+
+# Step Definition Implementation:
+# 1) Get all the existing rules by the policy id
+# 2) Loop by assignment id and delete it
+@Given('the system has no rules')
+def step_impl(context):
+ logger.info("Given the system has no rules")
+
+ response_policies = requests.get(apis_urls.serverURL + apis_urls.policyAPI, headers=apis_urls.auth_headers)
+ #logger.info(response_policies.json())
+ if len(response_policies.json()[apis_urls.policyAPI]) != 0:
+ apiruleid = []
+ for policies_ids in dict(response_policies.json()[apis_urls.policyAPI]).keys():
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.rulesAPI + "/", headers=apis_urls.auth_headers)
+ if len(response.json()[apis_urls.rulesAPI]['rules']) != 0:
+ for ids in range(len(response.json()[apis_urls.rulesAPI]['rules'])):
+ apiruleid.append(dict(response.json()[apis_urls.rulesAPI]['rules'][ids])['id'])
+ for ruleid in apiruleid:
+ response = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_ids + "/" + apis_urls.rulesAPI + "/" + ruleid, headers=apis_urls.auth_headers)
+
+# Step Definition Implementation:
+# 1) Add rule using the post request
+@Given('the following rule exists')
+def step_impl(context):
+ logger.info("Given the following rule exists")
+ api_responseflag = {'value': False}
+ model = getattr(context, "model", None)
+ for row in context.table:
+ subjectcategoryidslist = []
+ subjectdataidslist = []
+ objectcategoryidslist = []
+ objectdataidslist = []
+ actioncategoryidslist = []
+ actiondataidslist = []
+ ruleidslist = []
+ metaruleids = ""
+ subjectindex = 0
+ objectindex = 0
+ actionindex = 0
+ logger.info(
+ "rule '" + row["rule"] + "' and metarule name:'" + row[
+ "metarulename"] + "' and instructions: '" + row[
+ "instructions"] + "' and policyname:'" + row[
+ "policyname"] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ ruleparameter = row["rule"].split(",")
+ metarules_response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers)
+ for metaruleids in dict(metarules_response.json()[apis_urls.metarulesAPI]).keys():
+ if (metarules_response.json()[apis_urls.metarulesAPI][metaruleids]['name'] == row["metarulename"]):
+ meta_rule_id = metaruleids
+ subjectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['subject_categories']
+ objectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['object_categories']
+ actioncategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['action_categories']
+ break
+
+ index = 0
+ for categoryid in subjectcategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.datasubjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.datasubjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.datasubjectAPI][0]['data']:
+ if (data_response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+
+ for categoryid in objectcategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataobjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataobjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataobjectAPI][0]['data']:
+ if (data_response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+ for categoryid in actioncategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataactionAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataactionAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataactionAPI][0]['data']:
+ if (data_response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+
+ data = {
+ 'meta_rule_id': meta_rule_id,
+ 'rule': ruleidslist,
+ 'instructions': [{"decision": row['instructions']}],
+ 'enabled': 'True'
+ }
+ rulesresponse = requests.post(apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.rulesAPI,
+ headers=headers,
+ data=json.dumps(data))
+
+
+# Step Definition Implementation:
+# 1) Add subject meta data using the post request
+# 2) If the request code was 200 set the api response flag to true else false
+@When('the user sets to add the following rules')
+def step_impl(context):
+ logger.info("When the user sets to add the following rules")
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+ api_responseflag = {'value': False}
+ model = getattr(context, "model", None)
+ for row in context.table:
+ subjectcategoryidslist = []
+ subjectdataidslist = []
+ objectcategoryidslist = []
+ objectdataidslist = []
+ actioncategoryidslist = []
+ actiondataidslist = []
+ ruleidslist = []
+ metaruleids = ""
+ subjectindex = 0
+ objectindex = 0
+ actionindex = 0
+ logger.info(
+ "rule '" + row["rule"] + "' and metarule name:'" + row[
+ "metarulename"] + "' and instructions: '" + row[
+ "instructions"] + "' and policyname:'" + row[
+ "policyname"] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if(row['policyname']=="" or row['policyname']=="000000000000000000000000000000000000000000000000000"):
+ policyname="Stanford Policy"
+ else:
+ policyname=row['policyname']
+ policies_id = commonfunctions.get_policyid(policyname)
+
+ if(row["metarulename"]=="" or row["metarulename"]=="000000000000000000000000000000000000000000000000000"):
+ mata_rule_name="metarule1"
+ else:
+ mata_rule_name = row['metarulename']
+
+
+ if (row["rule"] != ""):
+ ruleparameter = row["rule"].split(",")
+ metarules_response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers)
+ for metaruleids in dict(metarules_response.json()[apis_urls.metarulesAPI]).keys():
+ if (metarules_response.json()[apis_urls.metarulesAPI][metaruleids]['name'] == mata_rule_name):
+ meta_rule_id = metaruleids
+ subjectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['subject_categories']
+ objectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['object_categories']
+ actioncategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['action_categories']
+ break
+
+ index = 0
+ for categoryid in subjectcategorieslist:
+ if (index < len(ruleparameter)):
+ if (len(ruleparameter[index]) < 30):
+ if (ruleparameter[index] != ""):
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.datasubjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.datasubjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.datasubjectAPI][0]['data']:
+ if (index < len(ruleparameter)):
+ if (data_response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)][
+ 'name'] ==
+ ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+ else:
+ break
+ else:
+ ruleidslist.append("")
+ index = index + 1
+ else:
+ ruleidslist.append(ruleparameter[index])
+ index = index + 1
+ for categoryid in objectcategorieslist:
+ if (index < len(ruleparameter)):
+ if (len(ruleparameter[index]) < 30):
+ if (ruleparameter[index] != ""):
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataobjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataobjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataobjectAPI][0]['data']:
+ if (index < len(ruleparameter)):
+ if (data_response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)][
+ 'name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+ else:
+ break
+ else:
+ ruleidslist.append("")
+ index = index + 1
+ else:
+ ruleidslist.append(ruleparameter[index])
+ index = index + 1
+
+ for categoryid in actioncategorieslist:
+ if (index < len(ruleparameter)):
+ if (len(ruleparameter[index]) < 30):
+ if (ruleparameter[index] != ""):
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataactionAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataactionAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataactionAPI][0]['data']:
+ if (index < len(ruleparameter)):
+ if (data_response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)][
+ 'name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+ else:
+ break
+ else:
+ ruleidslist.append("")
+ index = index + 1
+ else:
+ ruleidslist.append(ruleparameter[index])
+ index = index + 1
+ if(row["metarulename"]=="" or row["metarulename"] == "000000000000000000000000000000000000000000000000000"):
+ meta_rule_id=row["metarulename"]
+ if (row["policyname"] == "" or row["policyname"] == "000000000000000000000000000000000000000000000000000"):
+ policies_id = row["policyname"]
+ data = {
+ 'meta_rule_id': meta_rule_id,
+ 'rule': ruleidslist,
+ 'instructions': [{"decision": row['instructions']}],
+ 'enabled': 'True'
+ }
+ else:
+
+ data = {
+ 'meta_rule_id': commonfunctions.get_metaruleid(mata_rule_name),
+ 'rule': [],
+ 'instructions': [{"decision": row['instructions']}],
+ 'enabled': 'True'
+ }
+ rulesresponse = requests.post(apis_urls.serverURL + "policies/" + str(policies_id) + "/" + apis_urls.rulesAPI,
+ headers=headers,
+ data=json.dumps(data))
+ logger.info(rulesresponse.json())
+ if rulesresponse.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the meta rule by get request
+# 2) Loop by ids and search for the matching meta rule by name and delete it
+# 3) If the request code was 200 set the api response flag to true else false
+@When('the user sets to delete the following rules')
+def step_impl(context):
+ logger.info("When the user sets to delete the following rules")
+ for row in context.table:
+ subjectcategoryidslist = []
+ subjectdataidslist = []
+ objectcategoryidslist = []
+ objectdataidslist = []
+ actioncategoryidslist = []
+ actiondataidslist = []
+ ruleidslist = []
+ metaruleids = ""
+ subjectindex = 0
+ objectindex = 0
+ actionindex = 0
+ logger.info(
+ "rule '" + row["rule"] + "' and metarule name:'" + row[
+ "metarulename"] + "' and policyname:'" + row[
+ "policyname"] + "'")
+
+ headers = {"Content-Type": "application/json", "X-Api-Key": apis_urls.token}
+
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ ruleparameter = row["rule"].split(",")
+ metarules_response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers)
+ for metaruleids in dict(metarules_response.json()[apis_urls.metarulesAPI]).keys():
+ if (metarules_response.json()[apis_urls.metarulesAPI][metaruleids]['name'] == row["metarulename"]):
+ meta_rule_id = metaruleids
+ subjectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['subject_categories']
+ objectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['object_categories']
+ actioncategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['action_categories']
+ break
+
+ index = 0
+ for categoryid in subjectcategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.datasubjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.datasubjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.datasubjectAPI][0]['data']:
+ if (data_response.json()[apis_urls.datasubjectAPI][0]['data'][str(ids)]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+
+ for categoryid in objectcategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataobjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataobjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataobjectAPI][0]['data']:
+ if (data_response.json()[apis_urls.dataobjectAPI][0]['data'][str(ids)]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+ for categoryid in actioncategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataactionAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataactionAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataactionAPI][0]['data']:
+ if (data_response.json()[apis_urls.dataactionAPI][0]['data'][str(ids)]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+
+ rulesresponse = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.rulesAPI + "/", headers=apis_urls.auth_headers)
+
+ if len(rulesresponse.json()[apis_urls.rulesAPI]) != 0:
+ for ids in range(len(rulesresponse.json()[apis_urls.rulesAPI]['rules'])):
+ if (dict(rulesresponse.json()[apis_urls.rulesAPI]['rules'][ids])[
+ 'rule'] == ruleidslist):
+ ruleid = dict(rulesresponse.json()[apis_urls.rulesAPI]['rules'][ids])['id']
+ rulesresponse = requests.delete(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.rulesAPI + "/" + ruleid,headers=apis_urls.auth_headers)
+
+ if rulesresponse.status_code == 200:
+ GeneralVariables.api_responseflag['value'] = 'True'
+ else:
+ GeneralVariables.api_responseflag['value'] = 'False'
+
+# Step Definition Implementation:
+# 1) Get all the existing rules per a given policy, metarule using get request and put them into a table
+# 2) Sort the table by policy name
+# 3) Loop using both the expected and actual tables and assert the data row by row
+@Then('the following rules should be existed in the system')
+def step_impl(context):
+ logger.info("Then the following rule should be existed in the system")
+ model = getattr(context, "model", None)
+ apiresult = Table(names=('rule', 'metarule', 'instructions', 'policyname'),
+ dtype=('S1000', 'S100', 'S100', 'S100'))
+
+ expectedresult = Table(names=('rule', 'metarule', 'instructions', 'policyname'),
+ dtype=('S1000', 'S100', 'S100', 'S100'))
+
+ for row in context.table:
+ ruleidslist = []
+ apirule = []
+ if (len(row['policyname']) > 25):
+ policies_id = row['policyname']
+ else:
+ policies_id = commonfunctions.get_policyid(row['policyname'])
+
+ ruleparameter = row["rule"].split(",")
+ metarules_response = requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers)
+ for metaruleids in dict(metarules_response.json()[apis_urls.metarulesAPI]).keys():
+ if (metarules_response.json()[apis_urls.metarulesAPI][metaruleids]['name'] == row["metarulename"]):
+ meta_rule_id = metaruleids
+ subjectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['subject_categories']
+ objectcategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['object_categories']
+ actioncategorieslist = \
+ requests.get(apis_urls.serverURL + apis_urls.metarulesAPI, headers=apis_urls.auth_headers).json()[apis_urls.metarulesAPI][
+ metaruleids]['action_categories']
+
+ index = 0
+ for categoryid in subjectcategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.datasubjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.datasubjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.datasubjectAPI][0]['data']:
+ if (data_response.json()[apis_urls.datasubjectAPI][0]['data'][ids]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+
+ for categoryid in objectcategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataobjectAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataobjectAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataobjectAPI][0]['data']:
+ if (data_response.json()[apis_urls.dataobjectAPI][0]['data'][ids]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+
+ for categoryid in actioncategorieslist:
+ data_response = requests.get(
+ apis_urls.serverURL + "policies/" + policies_id + "/" + apis_urls.dataactionAPI + "/" + categoryid, headers=apis_urls.auth_headers)
+ if len(data_response.json()[apis_urls.dataactionAPI]) != 0:
+ for ids in data_response.json()[apis_urls.dataactionAPI][0]['data']:
+ if (data_response.json()[apis_urls.dataactionAPI][0]['data'][ids]['name'] == ruleparameter[
+ index]):
+ ruleidslist.append(ids)
+ index = index + 1
+ expectedresult.add_row(vals=(','.join(ruleidslist), meta_rule_id, row['instructions'], policies_id))
+
+ if (row['policyname'] != ""):
+ apipolicyid = commonfunctions.get_policyid(
+ row['policyname'])
+ response = requests.get(
+ apis_urls.serverURL + "policies/" + commonfunctions.get_policyid(
+ row['policyname']) + "/" + apis_urls.rulesAPI + "/", headers=apis_urls.auth_headers)
+
+ if len(response.json()[apis_urls.rulesAPI]) != 0:
+ for ids in range(len(response.json()[apis_urls.rulesAPI]['rules'])):
+ if (dict(response.json()[apis_urls.rulesAPI]['rules'][ids])[
+ 'meta_rule_id'] == commonfunctions.get_metaruleid(row['metarulename'])):
+ apirule = dict(response.json()[apis_urls.rulesAPI]['rules'][ids])['rule']
+ #logger.info(dict(dict(response.json()[apis_urls.rulesAPI]['rules'][ids])['instructions'][0])['decision'])
+ apiinstructions = dict(dict(response.json()[apis_urls.rulesAPI]['rules'][ids])['instructions'][0])['decision']
+ apimetaruleid = dict(response.json()[apis_urls.rulesAPI]['rules'][ids])['meta_rule_id']
+ apiresult.add_row(vals=(','.join(apirule), apimetaruleid, apiinstructions, apipolicyid))
+
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ else:
+ apiresult.add_row(vals=("", "", "", ""))
+
+ apiresult.sort('policyname')
+ expectedresult.sort('policyname')
+ for row1, row2 in zip(expectedresult, apiresult):
+ logger.info("asserting the expected rule: '" + str(
+ row1["rule"]) + "' is the same as the actual existing '" + str(
+ row2["rule"]) + "'")
+ assert str(row1["rule"]) == str(row2["rule"]), "rule is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected instructions: '" + str(
+ row1["instructions"]) + "' is the same as the actual existing '" + str(
+ row2["instructions"]) + "'")
+ assert str(row1["instructions"]) == str(row2["instructions"]), "instructions is not correct!"
+ logger.info("assertion passed!")
+
+ logger.info("asserting the expected metarule: '" + str(
+ row1["metarule"]) + "' is the same as the actual existing '" + str(
+ row2["metarule"]) + "'")
+ assert str(row1["metarule"]) == str(row2["metarule"]), "metarule is not correct!"
+ logger.info("assertion passed!")
diff --git a/moon_manager/tests/func_tests/run.sh b/moon_manager/tests/func_tests/run.sh
new file mode 100755
index 00000000..f67ba8c6
--- /dev/null
+++ b/moon_manager/tests/func_tests/run.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+# pip install behave astropy
+
+mkdir -p logs
+
+echo -e "\033[31massignments.feature\033[m"
+behave --junit features/assignments.feature | grep -vE "^ "
+echo -e "\033[31mdata.feature\033[m"
+behave --junit features/data.feature | grep -vE "^ "
+echo -e "\033[31mmeta_data.feature\033[m"
+behave --junit features/meta_data.feature | grep -vE "^ "
+echo -e "\033[31mmeta_rules.feature\033[m"
+behave --junit features/meta_rules.feature | grep -vE "^ "
+echo -e "\033[31mmodel.feature\033[m"
+behave --junit features/model.feature | grep -vE "^ "
+echo -e "\033[31mpartner.feature\033[m"
+behave --junit features/partner.feature | grep -vE "^ "
+echo -e "\033[31mpdp.feature\033[m"
+behave --junit features/pdp.feature | grep -vE "^ "
+echo -e "\033[31mperimeter.feature\033[m"
+behave --junit features/perimeter.feature | grep -vE "^ "
+echo -e "\033[31mpolicy.feature\033[m"
+behave --junit features/policy.feature | grep -vE "^ "
+echo -e "\033[31mrules.feature\033[m"
+behave --junit features/rules.feature | grep -vE "^ "
diff --git a/moon_manager/tests/performance_tests/authz_pipeline.py b/moon_manager/tests/performance_tests/authz_pipeline.py
new file mode 100644
index 00000000..7d2b48ce
--- /dev/null
+++ b/moon_manager/tests/performance_tests/authz_pipeline.py
@@ -0,0 +1,115 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import TaskSet, task
+import logging
+import json
+
+LOGGER = logging.getLogger("locust")
+
+
+class AuthzPipelineRequests(TaskSet):
+ token = ""
+ moon_errors = 0
+ moon_requests = 0
+ stats_filename = "/tmp/perf_stats.log"
+
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ self.moon_errors = []
+
+ def __del__(self):
+ """ on_stop is called when the TaskSet is stopping """
+ stats = {}
+ try:
+ stats = json.loads(open(self.stats_filename).read())
+ except Exception:
+ pass
+ _num = stats.get("errors", 0)
+ _num += len(self.moon_errors)
+ _total = stats.get("total", 0)
+ _total += self.moon_requests
+ _list = stats.get("list", [])
+ _list.extend(self.moon_errors)
+ _percent = _num * 100 / _total
+ json.dump({"errors": _num, "total": _total,
+ "percentage": "{0:.2f}".format(_percent),
+ "list": _list},
+ open(self.stats_filename, "w"), indent=4)
+
+ def get(self, url, status_code=200):
+ with self.client.get(url, catch_response=True) as response:
+ self.moon_requests += 1
+ if response.status_code != status_code:
+ self.moon_errors.append((url, f"{response.status_code}/{status_code}"))
+ response.success()
+
+ @task(10)
+ def authz_ok1(self):
+ url = "/authz/{}/{}/{}".format(
+ "admin", "vm1", "use_image"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok2(self):
+ url = "/authz/{}/{}/{}".format(
+ "admin", "vm1", "get_images"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok3(self):
+ url = "/authz/{}/{}/{}".format(
+ "admin", "vm1", "set_image"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok4(self):
+ url = "/authz/{}/{}/{}".format(
+ "demo", "vm1", "set_image"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_ok5(self):
+ url = "/authz/{}/{}/{}".format(
+ "demo", "vm1", "get_images"
+ )
+ self.get(url)
+
+ @task(10)
+ def authz_rule_ko(self):
+ url = "/authz/{}/{}/{}".format("demo", "vm1", "use_image")
+ self.get(url, 403)
+
+ @task(10)
+ def authz_subject_ko(self):
+ url = "/authz/{}/{}/{}".format("admins", "vm1", "use_image")
+ self.get(url, 403)
+
+ @task(10)
+ def authz_object_ko(self):
+ url = "/authz/{}/{}/{}".format("admin", "vm4", "use_image")
+ self.get(url, 403)
+
+ @task(10)
+ def authz_action_ko(self):
+ url = "/authz/{}/{}/{}".format("admin", "vm1", "use_images")
+ self.get(url, 403)
+
+ @task(1)
+ def status(self):
+ self.client.get("/status/")
+
+
diff --git a/moon_manager/tests/performance_tests/locustfile.py b/moon_manager/tests/performance_tests/locustfile.py
new file mode 100644
index 00000000..cf077720
--- /dev/null
+++ b/moon_manager/tests/performance_tests/locustfile.py
@@ -0,0 +1,26 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import HttpLocust, TaskSet
+import authz_pipeline
+
+
+class MoonRequests(TaskSet):
+ tasks = {
+ authz_pipeline.AuthzPipelineRequests: 10,
+ }
+
+
+class MoonUser(HttpLocust):
+ task_set = MoonRequests
+ min_wait = 10
+ max_wait = 100
diff --git a/moon_manager/tests/performance_tests/policy_rbac.json b/moon_manager/tests/performance_tests/policy_rbac.json
new file mode 100644
index 00000000..2f7c704e
--- /dev/null
+++ b/moon_manager/tests/performance_tests/policy_rbac.json
@@ -0,0 +1,411 @@
+{
+ "policies": [
+ {
+ "name": "Policy for Locust",
+ "genre": "authz",
+ "description": "Policy for Locust",
+ "model": {
+ "name": "RBAC"
+ },
+ "mandatory": true,
+ "override": true
+ }
+ ],
+ "models": [
+ {
+ "name": "RBAC",
+ "description": "",
+ "meta_rules": [
+ {
+ "name": "rbac"
+ }
+ ],
+ "override": true
+ }
+ ],
+ "subjects": [
+ {
+ "name": "admin",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "demo",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ }
+ ],
+ "subject_categories": [
+ {
+ "name": "role",
+ "description": "role of a user"
+ }
+ ],
+ "subject_data": [
+ {
+ "name": "admin",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ },
+ {
+ "name": "user",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "role"
+ }
+ }
+ ],
+ "subject_assignments": [
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "admin"}]
+ },
+ {
+ "subject": {"name": "admin"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ },
+ {
+ "subject": {"name": "demo"},
+ "category": {"name": "role"},
+ "assignments": [{"name": "user"}]
+ }
+ ],
+ "objects": [
+ {
+ "name": "vm1",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "extra": {},
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ }
+ ],
+ "object_categories": [
+ {
+ "name": "id",
+ "description": "identification of the object"
+ }
+ ],
+ "object_data": [
+ {
+ "name": "vm1",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm2",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ },
+ {
+ "name": "vm3",
+ "description": "",
+ "policies": [],
+ "category": {
+ "name": "id"
+ }
+ }
+ ],
+ "object_assignments": [
+ {
+ "object": {"name": "vm1"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm1"}]
+ },
+ {
+ "object": {"name": "vm2"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm2"}]
+ },
+ {
+ "object": {"name": "vm3"},
+ "category": {"name": "id"},
+ "assignments": [{"name": "vm3"}]
+ }
+ ],
+ "actions": [
+ {
+ "name": "use_image",
+ "description": "use_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "get_images",
+ "description": "get_images action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "update_image",
+ "description": "update_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ },
+ {
+ "name": "set_image",
+ "description": "set_image action for glance",
+ "extra": {
+ "component": "glance"
+ },
+ "policies": [
+ {
+ "name": "Policy for Locust"
+ }
+ ]
+ }
+ ],
+ "action_categories": [
+ {
+ "name": "type",
+ "description": ""
+ }
+ ],
+ "action_data": [
+ {
+ "name": "read",
+ "description": "read action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "write",
+ "description": "write action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ },
+ {
+ "name": "execute",
+ "description": "execute action",
+ "policies": [],
+ "category": {
+ "name": "type"
+ }
+ }
+ ],
+ "action_assignments": [
+ {
+ "action": {"name": "use_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "execute"}]
+ },
+ {
+ "action": {"name": "update_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}, {"name": "write"}]
+ },
+ {
+ "action": {"name": "set_image"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "write"}]
+ },
+ {
+ "action": {"name": "get_images"},
+ "category": {"name": "type"},
+ "assignments": [{"name": "read"}]
+ }
+ ],
+ "meta_rules": [
+ {
+ "name": "rbac",
+ "description": "",
+ "subject_categories": [{"name": "role"}],
+ "object_categories": [{"name": "id"}],
+ "action_categories": [{"name": "type"}]
+ }
+ ],
+ "rules": [
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "execute"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "admin"}],
+ "object_data": [{"name": "vm3"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm1"}],
+ "action_data": [{"name": "write"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ },
+ {
+ "meta_rule": {"name": "rbac"},
+ "rule": {
+ "subject_data": [{"name": "user"}],
+ "object_data": [{"name": "vm2"}],
+ "action_data": [{"name": "read"}]
+ },
+ "policy": {"name": "Policy for Locust"},
+ "instructions": [{"decision": "grant"}],
+ "enabled": true
+ }
+ ],
+ "checks": {
+ "granted": [
+ ["admin", "vm1", "get_images"],
+ ["admin", "vm1", "set_image"],
+ ["admin", "vm1", "use_image"],
+ ["admin", "vm2", "get_images"],
+ ["admin", "vm2", "set_image"],
+ ["admin", "vm3", "get_images"],
+ ["user", "vm1", "get_images"],
+ ["user", "vm1", "set_image"],
+ ["user", "vm2", "get_images"],
+ ["user", "vm1", "get_images"]
+ ],
+ "denied": [
+ ["admin", "vm2", "update_image"],
+ ["admin", "vm3", "set_image"],
+ ["admin", "vm3", "update_image"],
+ ["user", "vm1", "update_image"],
+ ["user", "vm2", "set_image"],
+ ["user", "vm2", "update_image"],
+ ["user", "vm1", "use_image"],
+ ["user", "vm2", "use_image"],
+ ["user", "vm3", "get_images"],
+ ["user", "vm3", "set_image"],
+ ["user", "vm3", "update_image"]
+ ]
+ }
+} \ No newline at end of file
diff --git a/moon_manager/tests/performance_tests_policies/actions.py b/moon_manager/tests/performance_tests_policies/actions.py
new file mode 100644
index 00000000..0f31d645
--- /dev/null
+++ b/moon_manager/tests/performance_tests_policies/actions.py
@@ -0,0 +1,54 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+from locust import TaskSet, task
+from uuid import uuid4
+import utils
+
+
+class ActionRequests(TaskSet):
+ token = ""
+
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ utils.login(self)
+
+ def on_stop(self):
+ """ on_stop is called when the TaskSet is stopping """
+ utils.logout(self)
+
+ @task(10)
+ def actions(self):
+ policy_id = utils.create_policy(self.client, self.token)
+ self.client.get("/actions", headers={"X-Api-Key": self.token})
+ perimeter_name = "test_action_" + str(uuid4())
+ req = self.client.post("/policies/{}/actions".format(policy_id),
+ headers={"X-Api-Key": self.token},
+ data={
+ "name": perimeter_name,
+ "description": "locust test",
+ })
+ content = json.loads(req.content.decode("utf-8"))
+ subject_id = None
+ for subject_id, subject_value in content.get("actions", {}).items():
+ if subject_value.get("name") == perimeter_name:
+ break
+ self.client.delete("/policies/{}/actions/{}".format(policy_id, subject_id),
+ headers={"X-Api-Key": self.token})
+ utils.delete_policy(self.client, self.token, policy_id)
+
+ @task(1)
+ def status(self):
+ self.client.get("/status", headers={"X-Api-Key": self.token})
+
+
diff --git a/moon_manager/tests/performance_tests_policies/locustfile.py b/moon_manager/tests/performance_tests_policies/locustfile.py
new file mode 100644
index 00000000..368801b0
--- /dev/null
+++ b/moon_manager/tests/performance_tests_policies/locustfile.py
@@ -0,0 +1,32 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import HttpLocust, TaskSet
+import subjects
+import objects
+import actions
+import meta_rules
+
+
+class MoonRequests(TaskSet):
+ tasks = {
+ subjects.SubjectRequests: 10,
+ objects.ObjectRequests: 10,
+ actions.ActionRequests: 10,
+ meta_rules.MetaRulesRequests: 5
+ }
+
+
+class MoonUser(HttpLocust):
+ task_set = MoonRequests
+ min_wait = 100
+ max_wait = 1000
diff --git a/moon_manager/tests/performance_tests_policies/meta_rules.py b/moon_manager/tests/performance_tests_policies/meta_rules.py
new file mode 100644
index 00000000..e9d85944
--- /dev/null
+++ b/moon_manager/tests/performance_tests_policies/meta_rules.py
@@ -0,0 +1,80 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import TaskSet, task
+import json
+from uuid import uuid4
+import utils
+
+
+class MetaRulesRequests(TaskSet):
+ token = ""
+
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ utils.login(self)
+
+ def on_stop(self):
+ """ on_stop is called when the TaskSet is stopping """
+ utils.logout(self)
+
+ def create_category(self, otype="subject"):
+ self.client.get("/{}_categories".format(otype), headers={"X-Api-Key": self.token})
+ category_name = "test_category_" + str(uuid4())
+ req = self.client.post("/{}_categories".format(otype),
+ headers={"X-Api-Key": self.token},
+ data={
+ "name": category_name,
+ "description": "locust {} category tests".format(otype),
+ })
+ content = json.loads(req.content.decode("utf-8"))
+ for category_id, category_value in content.get("{}_categories".format(otype), {}).items():
+ if category_value.get("name") == category_name:
+ return category_id
+
+ def delete_category(self, category_id, otype="subject"):
+ self.client.delete("/{}_categories/{}".format(otype, category_id),
+ headers={"X-Api-Key": self.token})
+
+ @task(10)
+ def meta_rules(self):
+ self.client.get("/meta_rules", headers={"X-Api-Key": self.token})
+ subject_category_id = self.create_category("subject")
+ object_category_id = self.create_category("object")
+ action_category_id = self.create_category("action")
+ meta_rule_name = "meta_rule_" + str(uuid4())
+ data = {
+ "name": meta_rule_name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ req = self.client.post("/meta_rules",
+ headers={"X-Api-Key": self.token,
+ "Content-Type": "application/json"},
+ data=json.dumps(data)
+ )
+ content = json.loads(req.content.decode("utf-8"))
+ for meta_rule_id, meta_rule_value in content.get("meta_rules", {}).items():
+ if meta_rule_value.get("name") == meta_rule_name:
+ self.client.delete("/meta_rules/{}".format(meta_rule_id),
+ headers={"X-Api-Key": self.token})
+ break
+ self.delete_category(subject_category_id, "subject")
+ self.delete_category(object_category_id, "object")
+ self.delete_category(action_category_id, "action")
+
+ @task(1)
+ def status(self):
+ self.client.get("/status", headers={"X-Api-Key": self.token})
+
+
diff --git a/moon_manager/tests/performance_tests_policies/objects.py b/moon_manager/tests/performance_tests_policies/objects.py
new file mode 100644
index 00000000..24932d70
--- /dev/null
+++ b/moon_manager/tests/performance_tests_policies/objects.py
@@ -0,0 +1,54 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+from locust import TaskSet, task
+from uuid import uuid4
+import utils
+
+
+class ObjectRequests(TaskSet):
+ token = ""
+
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ utils.login(self)
+
+ def on_stop(self):
+ """ on_stop is called when the TaskSet is stopping """
+ utils.logout(self)
+
+ @task(10)
+ def objects(self):
+ policy_id = utils.create_policy(self.client, self.token)
+ self.client.get("/objects", headers={"X-Api-Key": self.token})
+ perimeter_name = "test_object_" + str(uuid4())
+ req = self.client.post("/policies/{}/objects".format(policy_id),
+ headers={"X-Api-Key": self.token},
+ data={
+ "name": perimeter_name,
+ "description": "locust test",
+ })
+ content = json.loads(req.content.decode("utf-8"))
+ subject_id = None
+ for subject_id, subject_value in content.get("objects", {}).items():
+ if subject_value.get("name") == perimeter_name:
+ break
+ self.client.delete("/policies/{}/objects/{}".format(policy_id, subject_id),
+ headers={"X-Api-Key": self.token})
+ utils.delete_policy(self.client, self.token, policy_id)
+
+ @task(1)
+ def status(self):
+ self.client.get("/status", headers={"X-Api-Key": self.token})
+
+
diff --git a/moon_manager/tests/performance_tests_policies/subjects.py b/moon_manager/tests/performance_tests_policies/subjects.py
new file mode 100644
index 00000000..cacf04c8
--- /dev/null
+++ b/moon_manager/tests/performance_tests_policies/subjects.py
@@ -0,0 +1,57 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from locust import TaskSet, task
+import json
+import logging
+from uuid import uuid4
+import utils
+
+LOGGER = logging.getLogger(__name__)
+
+
+class SubjectRequests(TaskSet):
+ token = ""
+
+ def on_start(self):
+ """ on_start is called when a Locust start before any task is scheduled """
+ utils.login(self)
+
+ def on_stop(self):
+ """ on_stop is called when the TaskSet is stopping """
+ utils.logout(self)
+
+ @task(10)
+ def subjects(self):
+ policy_id = utils.create_policy(self.client, self.token)
+ self.client.get("/subjects", headers={"X-Api-Key": self.token})
+ perimeter_name = "test_subject_" + str(uuid4())
+ req = self.client.post("/policies/{}/subjects".format(policy_id),
+ headers={"X-Api-Key": self.token},
+ data={
+ "name": perimeter_name,
+ "description": "locust test",
+ })
+ content = json.loads(req.content.decode("utf-8"))
+ subject_id = None
+ for subject_id, subject_value in content.get("subjects", {}).items():
+ if subject_value.get("name") == perimeter_name:
+ break
+ self.client.delete("/policies/{}/subjects/{}".format(policy_id, subject_id),
+ headers={"X-Api-Key": self.token})
+ utils.delete_policy(self.client, self.token, policy_id)
+
+ @task(1)
+ def status(self):
+ self.client.get("/status", headers={"X-Api-Key": self.token})
+
+
diff --git a/moon_manager/tests/performance_tests_policies/utils.py b/moon_manager/tests/performance_tests_policies/utils.py
new file mode 100644
index 00000000..4a721b4c
--- /dev/null
+++ b/moon_manager/tests/performance_tests_policies/utils.py
@@ -0,0 +1,45 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+from uuid import uuid4
+
+
+def login(taskset):
+ req = taskset.client.get("/auth", auth=("admin", "admin"))
+ taskset.token = req.content.decode("utf-8").strip('"')
+
+
+def logout(taskset):
+ pass
+
+
+def log(msg):
+ open("/tmp/tests.log", 'a').write(str(msg) + "\n")
+
+
+def create_policy(client, token):
+ policy_name = "test_policy_" + str(uuid4())
+ req = client.post("/policies", headers={"X-Api-Key": token}, data={
+ "name": policy_name,
+ "description": "locust test policy",
+ })
+ content = json.loads(req.content.decode("utf-8"))
+ for policy_key, policy_value in content.get("policies", {}).items():
+ if policy_value.get("name") == policy_name:
+ return policy_key
+
+
+def delete_policy(client, token, policy_id):
+ client.delete("/policies/{}".format(policy_id), headers={"X-Api-Key": token})
+
+
diff --git a/moon_manager/tests/unit_python/api/__init__.py b/moon_manager/tests/unit_python/api/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_manager/tests/unit_python/api/meta_rules_test.py b/moon_manager/tests/unit_python/api/meta_rules_test.py
deleted file mode 100644
index b5b1ecf8..00000000
--- a/moon_manager/tests/unit_python/api/meta_rules_test.py
+++ /dev/null
@@ -1,69 +0,0 @@
-import json
-import api.utilities as utilities
-
-
-def get_meta_rules(client):
- req = client.get("/meta_rules")
- meta_rules = utilities.get_json(req.data)
- return req, meta_rules
-
-
-def add_meta_rules(client, name):
- data = {
- "name": name,
- "subject_categories": ["subject_category_id1",
- "subject_category_id2"],
- "object_categories": ["object_category_id1"],
- "action_categories": ["action_category_id1"]
- }
- req = client.post("/meta_rules", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- meta_rules = utilities.get_json(req.data)
- return req, meta_rules
-
-
-def delete_meta_rules(client, name):
- request, meta_rules = get_meta_rules(client)
- for key, value in meta_rules['meta_rules'].items():
- if value['name'] == name:
- req = client.delete("/meta_rules/{}".format(key))
- break
- return req
-
-
-def delete_meta_rules_without_id(client):
- req = client.delete("/meta_rules/{}".format(""))
- return req
-
-
-def test_get_meta_rules():
- client = utilities.register_client()
- req, meta_rules = get_meta_rules(client)
- assert req.status_code == 200
- assert isinstance(meta_rules, dict)
- assert "meta_rules" in meta_rules
-
-
-def test_add_meta_rules():
- client = utilities.register_client()
- req, meta_rules = add_meta_rules(client, "testuser")
- assert req.status_code == 200
- assert isinstance(meta_rules, dict)
- value = list(meta_rules["meta_rules"].values())[0]
- assert "meta_rules" in meta_rules
- assert value['name'] == "testuser"
- assert value["subject_categories"][0] == "subject_category_id1"
- assert value["object_categories"][0] == "object_category_id1"
- assert value["action_categories"][0] == "action_category_id1"
-
-
-def test_delete_meta_rules():
- client = utilities.register_client()
- req = delete_meta_rules(client, "testuser")
- assert req.status_code == 200
-
-
-def test_delete_meta_rules_without_id():
- client = utilities.register_client()
- req = delete_meta_rules_without_id(client)
- assert req.status_code == 500
diff --git a/moon_manager/tests/unit_python/api/test_assignement.py b/moon_manager/tests/unit_python/api/test_assignement.py
new file mode 100644
index 00000000..3a127477
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_assignement.py
@@ -0,0 +1,469 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+from uuid import uuid4
+import pytest
+import api.utilities as utilities
+from helpers import data_builder as builder
+from moon_utilities import exceptions
+
+
+def delete_assignment_based_on_parameters(type, policy_id, pre_id=None, cat_id=None, data_id=None):
+ if type in ["subject_assignments", "object_assignments", "action_assignments"] and policy_id:
+ url = "/policies/" + policy_id + "/" + type
+ if pre_id:
+ url += "/" + pre_id
+ if cat_id:
+ url += "/" + cat_id
+ if data_id:
+ url += "/" + data_id
+ else:
+ return ""
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(assignments, url, headers=auth_headers)
+ return req
+
+
+# subject_categories_test
+
+
+def get_subject_assignment(policy_id):
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(assignments, "/policies/{}/subject_assignments".format(policy_id), headers=auth_headers)
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def add_subject_assignment():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ subject_id = builder.create_subject(policy_id)
+ data_id = builder.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ data = {
+ "id": subject_id,
+ "category_id": subject_category_id,
+ "data_id": data_id
+ }
+ req = hug.test.post(assignments, "/policies/{}/subject_assignments/".format(policy_id),
+ body=data, headers=auth_headers)
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def add_subject_assignment_without_cat_id():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ data = {
+ "id": "subject_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = hug.test.post(assignments, "/policies/{}/subject_assignments".format("1111"), body=data,
+ headers=auth_headers)
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def delete_subject_assignment(policy_id, sub_id, cat_id, data_id):
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(assignments, "/policies/{}/subject_assignments/{}/{}/{}".format(
+ policy_id, sub_id, cat_id, data_id), headers=auth_headers)
+ return req
+
+
+def test_add_subject_assignment():
+ req, subject_assignment = add_subject_assignment()
+ assert req.status == hug.HTTP_200
+ assert isinstance(subject_assignment, dict)
+ assert "subject_assignments" in subject_assignment
+
+
+# def test_add_subject_assignment_without_cat_id():
+# client = utilities.register_client()
+# req, subject_assignment = add_subject_assignment_without_cat_id(client)
+# assert req.status == hug.HTTP_400
+# assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_get_subject_assignment():
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(policy_id)
+ assert req.status == hug.HTTP_200
+ assert isinstance(subject_assignment, dict)
+ assert "subject_assignments" in subject_assignment
+
+
+def test_delete_subject_assignment():
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(policy_id)
+ value = subject_assignment["subject_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_subject_assignment(
+ policy_id,
+ value[_id]['subject_id'],
+ value[_id]['category_id'],
+ value[_id]['assignments'][0])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_subject_assignment_using_policy():
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(policy_id)
+ value = subject_assignment["subject_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "subject_assignments",
+ policy_id)
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_subject_assignment_using_policy_perimeter_id():
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(policy_id)
+ value = subject_assignment["subject_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "subject_assignments",
+ policy_id,
+ value[_id]['subject_id'])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_subject_assignment_using_policy_perimeter_id_category_id():
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(policy_id)
+ value = subject_assignment["subject_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "subject_assignments",
+ policy_id,
+ value[_id]['subject_id'],
+ value[_id]['category_id'])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_subject_assignment_without_policy_id():
+
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ success_req = delete_subject_assignment("", "id1", "111", "data_id1")
+
+ assert '400: Policy Unknown' == str(exception_info.value)
+
+ # assert success_req.status == hug.HTTP_400
+ # assert success_req.data["message"] == "400: Policy Unknown"
+
+
+# ---------------------------------------------------------------------------
+# object_categories_test
+
+
+def get_object_assignment(policy_id):
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(assignments, "/policies/{}/object_assignments".format(policy_id), headers=auth_headers)
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def add_object_assignment():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ object_id = builder.create_object(policy_id)
+ data_id = builder.create_object_data(policy_id=policy_id, category_id=object_category_id)
+
+ data = {
+ "id": object_id,
+ "category_id": object_category_id,
+ "data_id": data_id
+ }
+
+ req = hug.test.post(assignments, "/policies/{}/object_assignments".format(policy_id),
+ body=data, headers=auth_headers)
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def add_object_assignment_without_cat_id():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ data = {
+ "id": "object_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = hug.test.post(assignments, "/policies/{}/object_assignments".format("1111"),
+ body=data, headers=auth_headers)
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def delete_object_assignment(policy_id, obj_id, cat_id, data_id):
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(assignments, "/policies/{}/object_assignments/{}/{}/{}".format(
+ policy_id, obj_id, cat_id, data_id), headers=auth_headers)
+ return req
+
+
+def test_get_object_assignment():
+ policy_id = builder.get_policy_id_with_object_assignment()
+
+ req, object_assignment = get_object_assignment(policy_id)
+ assert req.status == hug.HTTP_200
+ assert isinstance(object_assignment, dict)
+ assert "object_assignments" in object_assignment
+
+
+def test_add_object_assignment():
+ req, object_assignment = add_object_assignment()
+ assert req.status == hug.HTTP_200
+ assert "object_assignments" in object_assignment
+
+
+# def test_add_object_assignment_without_cat_id():
+# client = utilities.register_client()
+# req, object_assignment = add_object_assignment_without_cat_id(client)
+# assert req.status == hug.HTTP_400
+# assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_delete_object_assignment():
+ policy_id = builder.get_policy_id_with_object_assignment()
+ req, object_assignment = get_object_assignment(policy_id)
+ value = object_assignment["object_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_object_assignment(policy_id,
+ value[_id]['object_id'],
+ value[_id]['category_id'],
+ value[_id]['assignments'][0])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_object_assignment_using_policy():
+ policy_id = builder.get_policy_id_with_object_assignment()
+ req, object_assignment = get_object_assignment(policy_id)
+ value = object_assignment["object_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "object_assignments",
+ policy_id)
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_object_assignment_using_policy_perimeter_id():
+ policy_id = builder.get_policy_id_with_object_assignment()
+ req, object_assignment = get_object_assignment(policy_id)
+ value = object_assignment["object_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "object_assignments",
+ policy_id,
+ value[_id]['object_id'])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_object_assignment_using_policy_perimeter_id_category_id():
+ policy_id = builder.get_policy_id_with_object_assignment()
+ req, object_assignment = get_object_assignment(policy_id)
+ value = object_assignment["object_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "object_assignments",
+ policy_id,
+ value[_id]['object_id'],
+ value[_id]['category_id'])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_object_assignment_without_policy_id():
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ success_req = delete_object_assignment("", "id1", "111", "data_id1")
+ # assert success_req.status == hug.HTTP_400
+ # assert success_req.data["message"] == "400: Policy Unknown"
+ assert '400: Policy Unknown' == str(exception_info.value)
+
+
+# ---------------------------------------------------------------------------
+# action_categories_test
+
+
+def get_action_assignment(policy_id):
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(assignments, "/policies/{}/action_assignments".format(policy_id), headers=auth_headers)
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def add_action_assignment():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ action_id = builder.create_action(policy_id)
+ data_id = builder.create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ data = {
+ "id": action_id,
+ "category_id": action_category_id,
+ "data_id": data_id
+ }
+ req = hug.test.post(assignments, "/policies/{}/action_assignments".format(policy_id),
+ body=data,
+ headers=auth_headers)
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def add_action_assignment_without_cat_id():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ data = {
+ "id": "action_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = hug.test.post(assignments, "/policies/{}/action_assignments".format("1111"),
+ body=data, headers=auth_headers)
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def delete_action_assignment(policy_id, action_id, cat_id, data_id):
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(assignments, "/policies/{}/action_assignments/{}/{}/{}".format(
+ policy_id, action_id, cat_id, data_id), headers=auth_headers)
+ return req
+
+
+def test_get_action_assignment():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(policy_id)
+ assert req.status == hug.HTTP_200
+ assert isinstance(action_assignment, dict)
+ assert "action_assignments" in action_assignment
+
+
+def test_add_action_assignment():
+ req, action_assignment = add_action_assignment()
+ assert req.status == hug.HTTP_200
+ assert "action_assignments" in action_assignment
+
+
+# def test_add_action_assignment_without_cat_id():
+# client = utilities.register_client()
+# req, action_assignment = add_action_assignment_without_cat_id(client)
+# assert req.status == hug.HTTP_400
+# assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_delete_action_assignment():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(policy_id)
+ value = action_assignment["action_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_action_assignment(policy_id,
+ value[id]['action_id'],
+ value[id]['category_id'],
+ value[id]['assignments'][0])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_action_assignment_policy():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(policy_id)
+ value = action_assignment["action_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "action_assignments",
+ policy_id)
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_action_assignment_policy_perimeter_id():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(policy_id)
+ value = action_assignment["action_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "action_assignments",
+ policy_id,
+ value[id]['action_id'])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_action_assignment_policy_perimeter_id_category_id():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(policy_id)
+ value = action_assignment["action_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_assignment_based_on_parameters(
+ "action_assignments",
+ policy_id,
+ value[id]['action_id'],
+ value[id]['category_id'])
+ assert success_req.status == hug.HTTP_200
+
+
+def test_delete_action_assignment_without_policy_id():
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ success_req = delete_action_assignment("", "id1", "111", "data_id1")
+ # assert success_req.status == hug.HTTP_400
+ # assert success_req.data["message"] == "400: Policy Unknown"
+ assert '400: Policy Unknown' == str(exception_info.value)
+
+# ---------------------------------------------------------------------------
diff --git a/moon_manager/tests/unit_python/api/test_assignemnt.py b/moon_manager/tests/unit_python/api/test_assignemnt.py
deleted file mode 100644
index 9fd83857..00000000
--- a/moon_manager/tests/unit_python/api/test_assignemnt.py
+++ /dev/null
@@ -1,174 +0,0 @@
-import api.utilities as utilities
-import json
-
-
-# subject_categories_test
-
-
-def get_subject_assignment(client, policy_id):
- req = client.get("/policies/{}/subject_assignments".format(policy_id))
- subject_assignment = utilities.get_json(req.data)
- return req, subject_assignment
-
-
-def add_subject_assignment(client, policy_id, category_id):
- data = {
- "id": "id1",
- "category_id": category_id,
- "data_id": "data_id1"
- }
- req = client.post("/policies/{}/subject_assignments/{}".format(policy_id, category_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- subject_assignment = utilities.get_json(req.data)
- return req, subject_assignment
-
-
-def delete_subject_assignment(client, policy_id):
- req = client.delete("/policies/{}/subject_assignments".format(policy_id))
- return req
-
-
-def test_add_subject_assignment():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, subject_assignment = add_subject_assignment(client, policy_id, "111")
- assert req.status_code == 200
- assert isinstance(subject_assignment, dict)
- value = subject_assignment["subject_assignments"]
- assert "subject_assignments" in subject_assignment
- id = list(value.keys())[0]
- assert value[id]['policy_id'] == policy_id
- assert value[id]['category_id'] == "111"
- assert value[id]['subject_id'] == "id1"
-
-
-def test_get_subject_assignment():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, subject_assignment = get_subject_assignment(client, policy_id)
- assert req.status_code == 200
- assert isinstance(subject_assignment, dict)
- assert "subject_assignments" in subject_assignment
-
-
-def test_delete_subject_assignment():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- success_req = delete_subject_assignment(client, policy_id)
- assert success_req.status_code == 200
-
-# ---------------------------------------------------------------------------
-
-# object_categories_test
-
-
-def get_object_assignment(client, policy_id):
- req = client.get("/policies/{}/object_assignments".format(policy_id))
- object_assignment = utilities.get_json(req.data)
- return req, object_assignment
-
-
-def add_object_assignment(client, policy_id, category_id):
- data = {
- "id": "id1",
- "category_id": category_id,
- "data_id": "data_id1"
- }
- req = client.post("/policies/{}/object_assignments/{}".format(policy_id, category_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- object_assignment = utilities.get_json(req.data)
- return req, object_assignment
-
-
-def delete_object_assignment(client, policy_id):
- req = client.delete("/policies/{}/object_assignments".format(policy_id))
- return req
-
-
-def test_get_object_assignment():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, object_assignment = get_object_assignment(client, policy_id)
- assert req.status_code == 200
- assert isinstance(object_assignment, dict)
- assert "object_assignments" in object_assignment
-
-
-def test_add_object_assignment():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, object_assignment = add_object_assignment(client, policy_id, "111")
- assert req.status_code == 200
- assert isinstance(object_assignment, dict)
- value = object_assignment["object_assignments"]
- assert "object_assignments" in object_assignment
- id = list(value.keys())[0]
- assert value[id]['policy_id'] == policy_id
- assert value[id]['category_id'] == "111"
- assert value[id]['object_id'] == "id1"
-
-
-def test_delete_object_assignment():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- success_req = delete_object_assignment(client, policy_id)
- assert success_req.status_code == 200
-
-# ---------------------------------------------------------------------------
-
-# action_categories_test
-
-
-def get_action_assignment(client, policy_id):
- req = client.get("/policies/{}/action_assignments".format(policy_id))
- action_assignment = utilities.get_json(req.data)
- return req, action_assignment
-
-
-def add_action_assignment(client, policy_id, category_id):
- data = {
- "id": "id1",
- "category_id": category_id,
- "data_id": "data_id1"
- }
- req = client.post("/policies/{}/action_assignments/{}".format(policy_id, category_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- action_assignment = utilities.get_json(req.data)
- return req, action_assignment
-
-
-def delete_action_assignment(client, policy_id):
- req = client.delete("/policies/{}/action_assignments".format(policy_id))
- return req
-
-
-def test_get_action_assignment():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, action_assignment = get_action_assignment(client, policy_id)
- assert req.status_code == 200
- assert isinstance(action_assignment, dict)
- assert "action_assignments" in action_assignment
-
-
-def test_add_action_assignment():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, action_assignment = add_action_assignment(client, policy_id, "111")
- assert req.status_code == 200
- assert isinstance(action_assignment, dict)
- value = action_assignment["action_assignments"]
- assert "action_assignments" in action_assignment
- id = list(value.keys())[0]
- assert value[id]['policy_id'] == policy_id
- assert value[id]['category_id'] == "111"
- assert value[id]['action_id'] == "id1"
-
-
-def test_delete_action_assignment():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- success_req = delete_action_assignment(client, policy_id)
- assert success_req.status_code == 200
-
-# --------------------------------------------------------------------------- \ No newline at end of file
diff --git a/moon_manager/tests/unit_python/api/test_auth.py b/moon_manager/tests/unit_python/api/test_auth.py
new file mode 100644
index 00000000..ee59bf5e
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_auth.py
@@ -0,0 +1,71 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from falcon import HTTP_200, HTTP_204, HTTP_401
+import hug
+import base64
+from uuid import uuid4
+from helpers import data_builder as builder
+
+
+def test_get_auth():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_manager.api import auth
+ from moon_manager.api import policy
+ headers = {"Authorization": "Basic {}".format(base64.b64encode(b"admin:admin").decode("utf-8"))}
+ req = hug.test.get(auth, 'auth/', headers=headers)
+ assert req.status == HTTP_200
+ key = req.data
+ assert get_api_key_for_user("admin") == req.data
+ headers = {"x-api-key": key}
+ req = hug.test.get(policy, 'policies/', headers=headers)
+ assert req.status == HTTP_200
+
+
+def test_del_auth():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_manager.api import auth
+ from moon_manager.api import policy
+ headers = {"Authorization": "Basic {}".format(base64.b64encode(b"admin:admin").decode("utf-8"))}
+ req = hug.test.get(auth, 'auth/', headers=headers)
+ assert req.status == HTTP_200
+ key = req.data
+ headers = {"x-api-key": key}
+ req = hug.test.delete(auth, 'auth/', headers=headers)
+ assert req.status == HTTP_204
+ req = hug.test.get(policy, 'policies/', headers=headers)
+ assert req.status == HTTP_401
+ assert not get_api_key_for_user("admin")
+
+
+def test_readd_auth():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_manager.api import auth
+ from moon_manager.api import policy
+ headers = {"Authorization": "Basic {}".format(base64.b64encode(b"admin:admin").decode("utf-8"))}
+ req = hug.test.get(auth, 'auth/', headers=headers)
+ assert req.status == HTTP_200
+ key = req.data
+ headers = {"x-api-key": key}
+ req = hug.test.delete(auth, 'auth/', headers=headers)
+ assert req.status == HTTP_204
+ headers = {"Authorization": "Basic {}".format(base64.b64encode(b"admin:admin").decode("utf-8"))}
+ req = hug.test.get(auth, 'auth/', headers=headers)
+ assert req.status == HTTP_200
+ new_key = req.data
+ headers = {"x-api-key": new_key}
+ req = hug.test.get(policy, 'policies/', headers=headers)
+ assert req.status == HTTP_200
+ assert get_api_key_for_user("admin")
+ assert get_api_key_for_user("admin") == new_key
+ assert get_api_key_for_user("admin") != key
+
diff --git a/moon_manager/tests/unit_python/api/test_data.py b/moon_manager/tests/unit_python/api/test_data.py
index 724f919f..019a8b45 100644
--- a/moon_manager/tests/unit_python/api/test_data.py
+++ b/moon_manager/tests/unit_python/api/test_data.py
@@ -1,54 +1,83 @@
-# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
-import api.utilities as utilities
import json
+from uuid import uuid4
+
+import hug
+import pytest
+from helpers import data_builder as builder
+from helpers import policy_helper
+from moon_utilities import exceptions
# subject_categories_test
-def get_subject_data(client, policy_id, category_id=None):
+def get_subject_data(policy_id, category_id=None):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
if category_id is None:
- req = client.get("/policies/{}/subject_data".format(policy_id))
+ req = hug.test.get(data, "/policies/{}/subject_data".format(policy_id), headers=auth_headers)
else:
- req = client.get("/policies/{}/subject_data/{}".format(policy_id, category_id))
- subject_data = utilities.get_json(req.data)
+ req = hug.test.get(data, "/policies/{}/subject_data/{}".format(policy_id, category_id), headers=auth_headers)
+ subject_data = req.data
return req, subject_data
-def add_subject_data(client, name, policy_id, category_id):
- data = {
+def add_subject_data(name):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ body = {
"name": name,
"description": "description of {}".format(name)
}
- req = client.post("/policies/{}/subject_data/{}".format(policy_id, category_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- subject_data = utilities.get_json(req.data)
+ req = hug.test.post(data, "/policies/{}/subject_data/{}".format(policy_id, subject_category_id),
+ body=json.dumps(body),
+ headers={'Content-Type': 'application/json', "X-Api-Key": get_api_key_for_user("admin")})
+ subject_data = req.data
return req, subject_data
-def delete_subject_data(client, policy_id):
- req = client.delete("/policies/{}/subject_data".format(policy_id))
+def delete_subject_data(policy_id, category_id, data_id):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(data, "/policies/{}/subject_data/{}/{}".format(policy_id, category_id,
+ data_id), headers=auth_headers)
return req
def test_get_subject_data():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, subject_data = get_subject_data(client, policy_id)
- assert req.status_code == 200
+ policy = policy_helper.add_policies()
+ policy_id = next(iter(policy))
+ req, subject_data = get_subject_data(policy_id)
+ assert req.status == hug.HTTP_200
assert isinstance(subject_data, dict)
assert "subject_data" in subject_data
def test_add_subject_data():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, subject_data = add_subject_data(client, "testuser", policy_id, "111")
- assert req.status_code == 200
+ req, subject_data = add_subject_data("testuser")
+ assert req.status == hug.HTTP_200
assert isinstance(subject_data, dict)
value = subject_data["subject_data"]['data']
assert "subject_data" in subject_data
@@ -57,118 +86,199 @@ def test_add_subject_data():
assert value[id]['description'] == "description of {}".format("testuser")
+def test_add_subject_data_invalid_name():
+ with pytest.raises(exceptions.DataContentError) as exception_info:
+ req, subject_data = add_subject_data(" ")
+ # assert req.status == hug.HTTP_400
+ assert '400: Data Content Error' == str(exception_info.value)
+ with pytest.raises(exceptions.DataContentError) as exception_info:
+ req, subject_data = add_subject_data("")
+ # assert req.status == hug.HTTP_400
+ assert '400: Data Content Error' == str(exception_info.value)
+
+
def test_delete_subject_data():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- success_req = delete_subject_data(client, policy_id)
- assert success_req.status_code == 200
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ data_id = builder.create_subject_data(policy_id, subject_category_id)
+ success_req = delete_subject_data(policy_id, subject_category_id, data_id)
+ assert success_req.status == hug.HTTP_200
+
+
+def test_add_subject_data_with_forbidden_char_in_user():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, subject_data = add_subject_data("<a>")
+ # assert '400: Invalid Content' == str(exception_info.value)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_subject_data_without_policy_id():
+ success_req = delete_subject_data("", "", "")
+ assert success_req.status == hug.HTTP_405
-# ---------------------------------------------------------------------------
+# ---------------------------------------------------------------------------
# object_categories_test
-def get_object_data(client, policy_id, category_id=None):
+def get_object_data(policy_id, category_id=None):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
if category_id is None:
- req = client.get("/policies/{}/object_data".format(policy_id))
+ req = hug.test.get(data, "/policies/{}/object_data".format(policy_id), headers=auth_headers)
else:
- req = client.get("/policies/{}/object_data/{}".format(policy_id, category_id))
- object_data = utilities.get_json(req.data)
+ req = hug.test.get(data, "/policies/{}/object_data/{}".format(policy_id, category_id), headers=auth_headers)
+ object_data = req.data
return req, object_data
-def add_object_data(client, name, policy_id, category_id):
- data = {
+def add_object_data(name):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ body = {
"name": name,
"description": "description of {}".format(name)
}
- req = client.post("/policies/{}/object_data/{}".format(policy_id, category_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- object_data = utilities.get_json(req.data)
+ req = hug.test.post(data, "/policies/{}/object_data/{}".format(policy_id, object_category_id),
+ body=json.dumps(body), headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ object_data = req.data
return req, object_data
-def delete_object_data(client, policy_id):
- req = client.delete("/policies/{}/object_data".format(policy_id))
+def delete_object_data(policy_id, category_id, data_id):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(data, "/policies/{}/object_data/{}/{}".format(policy_id, category_id,
+ data_id), headers=auth_headers)
return req
def test_get_object_data():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, object_data = get_object_data(client, policy_id)
- assert req.status_code == 200
+ policy = policy_helper.add_policies()
+ policy_id = next(iter(policy))
+ req, object_data = get_object_data(policy_id)
+ assert req.status == hug.HTTP_200
assert isinstance(object_data, dict)
assert "object_data" in object_data
def test_add_object_data():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, object_data = add_object_data(client, "testuser", policy_id, "111")
- assert req.status_code == 200
+ req, object_data = add_object_data("testuser")
+ assert req.status == hug.HTTP_200
assert isinstance(object_data, dict)
value = object_data["object_data"]['data']
assert "object_data" in object_data
- id = list(value.keys())[0]
- print("-----------------------")
- print(id)
- print(value[id])
- print("-----------------------")
- assert value[id]['name'] == "testuser"
- assert value[id]['description'] == "description of {}".format("testuser")
+ _id = list(value.keys())[0]
+ assert value[_id]['name'] == "testuser"
+ assert value[_id]['description'] == "description of {}".format("testuser")
+
+
+def test_add_object_data_invalid_name():
+ with pytest.raises(exceptions.DataContentError) as exception_info:
+ req, object_data = add_object_data(" ")
+ # assert req.status == hug.HTTP_400
+ assert '400: Data Content Error' == str(exception_info.value)
+ with pytest.raises(exceptions.DataContentError):
+ req, object_data = add_object_data("")
+ # assert req.status == hug.HTTP_400
+ assert '400: Data Content Error' == str(exception_info.value)
def test_delete_object_data():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- success_req = delete_object_data(client, policy_id)
- assert success_req.status_code == 200
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ data_id = builder.create_object_data(policy_id, object_category_id)
+ success_req = delete_object_data(policy_id, data_id, object_category_id)
+ assert success_req.status == hug.HTTP_200
-# ---------------------------------------------------------------------------
+def test_add_object_data_with_forbidden_char_in_user():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, subject_data = add_object_data("<a>")
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+ # assert '400: Invalid Content' == str(exception_info.value)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+
+
+def test_delete_object_data_without_policy_id():
+ success_req = delete_object_data("", "", "")
+ assert success_req.status == hug.HTTP_405
+
+
+# ---------------------------------------------------------------------------
# action_categories_test
-def get_action_data(client, policy_id, category_id=None):
+def get_action_data(policy_id, category_id=None):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
if category_id is None:
- req = client.get("/policies/{}/action_data".format(policy_id))
+ req = hug.test.get(data, "/policies/{}/action_data".format(policy_id),
+ headers=auth_headers)
else:
- req = client.get("/policies/{}/action_data/{}".format(policy_id, category_id))
- action_data = utilities.get_json(req.data)
+ req = hug.test.get(data, "/policies/{}/action_data/{}".format(policy_id, category_id),
+ headers=auth_headers)
+ action_data = req.data
return req, action_data
-def add_action_data(client, name, policy_id, category_id):
- data = {
+def add_action_data(name):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ body = {
"name": name,
"description": "description of {}".format(name)
}
- req = client.post("/policies/{}/action_data/{}".format(policy_id, category_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- action_data = utilities.get_json(req.data)
+ req = hug.test.post(data, "/policies/{}/action_data/{}".format(policy_id, action_category_id),
+ body=json.dumps(body),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ action_data = req.data
return req, action_data
-def delete_action_data(client, policy_id):
- req = client.delete("/policies/{}/action_data".format(policy_id))
+def delete_action_data(policy_id, categorgy_id, data_id):
+ from moon_manager.api import data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(data, "/policies/{}/action_data/{}/{}".format(policy_id, categorgy_id,
+ data_id), headers=auth_headers)
return req
def test_get_action_data():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, action_data = get_action_data(client, policy_id)
- assert req.status_code == 200
+ policy = policy_helper.add_policies()
+ policy_id = next(iter(policy))
+ req, action_data = get_action_data(policy_id)
+ assert req.status == hug.HTTP_200
assert isinstance(action_data, dict)
assert "action_data" in action_data
def test_add_action_data():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, action_data = add_action_data(client, "testuser", policy_id, "111")
- assert req.status_code == 200
+ req, action_data = add_action_data("testuser")
+ assert req.status == hug.HTTP_200
assert isinstance(action_data, dict)
value = action_data["action_data"]['data']
assert "action_data" in action_data
@@ -177,10 +287,35 @@ def test_add_action_data():
assert value[id]['description'] == "description of {}".format("testuser")
+def test_add_action_data_invalid_name():
+
+ with pytest.raises(exceptions.DataContentError)as exception_info:
+ req, action_data = add_action_data(" ")
+ # assert req.status == hug.HTTP_400
+ assert '400: Data Content Error' == str(exception_info.value)
+ with pytest.raises(exceptions.DataContentError) as exception_info:
+ req, action_data = add_action_data("")
+ # assert req.status == hug.HTTP_400
+ assert '400: Data Content Error' == str(exception_info.value)
+
+
def test_delete_action_data():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- success_req = delete_action_data(client, policy_id)
- assert success_req.status_code == 200
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ data_id = builder.create_action_data(policy_id, action_category_id)
+ success_req = delete_action_data(policy_id, data_id, action_category_id)
+ assert success_req.status == hug.HTTP_200
+
+
+def test_add_action_data_with_forbidden_char_in_user():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, action_data = add_action_data("<a>")
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+ # assert '400: Invalid Content' == str(exception_info.value)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+
+def test_delete_action_data_without_policy_id():
+ success_req = delete_action_data("", "", "")
+ assert success_req.status == hug.HTTP_405
# ---------------------------------------------------------------------------
diff --git a/moon_manager/tests/unit_python/api/test_json_export.py b/moon_manager/tests/unit_python/api/test_json_export.py
new file mode 100644
index 00000000..8de394c9
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_json_export.py
@@ -0,0 +1,321 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import json
+import api.utilities as utilities
+import helpers.import_export_helper as import_export_helper
+import hug
+
+MODEL_WITHOUT_META_RULES = {"models": [{"name": "test model", "description": "model description", "meta_rules": []}]}
+
+DATA = {"subject_data": [{"name": "test subject data", "description": "subject data description", "policies": [{"name": "test policy"}], "category": {"name": "test subject categories"}}],
+ "object_data": [{"name": "test object data", "description": "object data description", "policies": [{"name": "test policy"}], "category": {"name": "test object categories"}}],
+ "action_data": [{"name": "test action data", "description": "action data description", "policies": [{"name": "test policy"}], "category": {"name": "test action categories"}}]
+ }
+
+META_RULES = {"subject_categories": [{"name": "test subject categories", "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories", "description": "object category description"}],
+ "action_categories": [{"name": "test action categories", "description": "action action description"}],
+ "meta_rules": [{"name": "meta rule", "description": "valid meta rule", "subject_categories": [{"name": "test subject categories"}], "object_categories": [{"name": "test object categories"}], "action_categories": [{"name": "test action categories"}]}]}
+
+
+SUBJECTS_OBJECTS_ACTIONS = {"models": [{"name": "test model", "description": "", "meta_rules": [{"name":"meta rule"}]}],
+ "policies": [{"name": "test policy", "genre": "authz", "description": "policy description", "model": {"name" : "test model"}}],
+ "subjects": [{"name": "testuser", "description": "description of the subject", "extra": {"field_extra_subject": "value extra subject"}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
+ **META_RULES
+ }
+
+SUBJECT_OBJECT_ACTION_CATEGORIES = {"subject_categories": [{"name": "test subject categories", "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories", "description": "object category description"}],
+ "action_categories": [{"name": "test action categories", "description": "action category description"}]}
+
+SUBJECT_OBJECT_ACTION_DATA = {**SUBJECTS_OBJECTS_ACTIONS,
+ **DATA
+ }
+POLICIES = {"models": [{"name": "test model", "description": "", "meta_rules": [{"name": "meta rule"}]}],
+ "policies": [{"name": "test policy", "genre": "authz", "description": "policy description", "model": {"name" : "test model"}}],
+ **META_RULES,
+ }
+
+ASSIGNMENTS = {**POLICIES,
+ **DATA,
+ "subjects": [{"name": "testuser", "description": "description of the subject", "extra": {"field_extra_subject": "value extra subject"}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object e0", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action e0", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
+ "subject_assignments": [{"subject": {"name": "testuser"}, "category": {"name": "test subject categories"}, "assignments": [{"name": "test subject data"}]}],
+ "object_assignments": [{"object": {"name": "test object e0"}, "category": {"name": "test object categories"}, "assignments": [{"name": "test object data"}]}],
+ "action_assignments": [{"action": {"name": "test action e0"}, "category": {"name": "test action categories"}, "assignments": [{"name": "test action data"}]}]}
+
+RULES = {**POLICIES,
+ **DATA,
+ "subjects": [{"name": "testuser", "description": "description of the subject", "extra": {"field_extra_subject": "value extra subject"}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object e1", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action e1", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
+ "subject_assignments": [{"subject": {"name": "testuser"}, "category": {"name": "test subject categories"}, "assignments": [{"name": "test subject data"}]}],
+ "object_assignments": [{"object": {"name": "test object e1"}, "category": {"name": "test object categories"}, "assignments": [{"name": "test object data"}]}],
+ "action_assignments": [{"action": {"name": "test action e1"}, "category": {"name": "test action categories"}, "assignments": [{"name": "test action data"}]}],
+ "rules": [{"meta_rule": {"name": "meta rule"}, "rule": {"subject_data": [{"name": "test "
+ "subject data"}],
+ "object_data": [{"name": "test object data"}],
+ "action_data": [{"name": "test action data"}]}, "policy": {"name":"test policy"}, "instructions": [{"decision": "grant"}], "enabled": True}]
+ }
+
+
+def test_export_models():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ # import_export_helper.clean_all()
+
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ MODEL_WITHOUT_META_RULES), headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")} )
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in MODEL_WITHOUT_META_RULES.keys())
+
+ req = hug.test.get(json_export, "/export", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+
+ assert "content" in data
+ assert "models" in data["content"]
+ assert isinstance(data["content"]["models"], list)
+ assert len(data["content"]["models"]) == 1
+ model = data["content"]["models"][0]
+ assert model["name"] == "test model"
+ assert model["description"] == "model description"
+ assert isinstance(model["meta_rules"], list)
+ assert len(model["meta_rules"]) == 0
+
+
+def test_export_policies():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ import_export_helper.clean_all()
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ POLICIES), headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in POLICIES.keys())
+
+ req = hug.test.get(json_export, "/export", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+
+ assert "content" in data
+ assert "policies" in data["content"]
+ assert isinstance(data["content"]["policies"], list)
+ assert len(data["content"]["policies"]) == 1
+ policy = data["content"]["policies"][0]
+ assert policy["name"] == "test policy"
+ assert policy["genre"] == "authz"
+ assert policy["description"] == "policy description"
+ assert "model" in policy
+ assert "name" in policy["model"]
+ model = policy["model"]
+ assert model["name"] == "test model"
+
+
+def test_export_subject_object_action():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ import_export_helper.clean_all()
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ SUBJECTS_OBJECTS_ACTIONS) ,headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in SUBJECTS_OBJECTS_ACTIONS.keys())
+
+ req = hug.test.get(json_export, "/export", headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+
+ assert "content" in data
+ type_elements = ["subject", "object", "action"]
+ for type_element in type_elements:
+ key = type_element + "s"
+ assert key in data["content"]
+ assert isinstance(data["content"][key], list)
+ assert len(data["content"][key]) == 1
+ element = data["content"][key][0]
+ if type_element == "subject":
+ assert element["name"] == "testuser"
+ else:
+ assert element["name"] == "test "+ type_element
+ assert element["description"] == "description of the " + type_element
+ assert "policies" in element
+ assert isinstance(element["policies"], list)
+ assert len(element["policies"]) == 1
+ assert isinstance(element["policies"][0], dict)
+ assert element["policies"][0]["name"] == "test policy"
+ assert isinstance(element["extra"], dict)
+ key_dict = "field_extra_" + type_element
+ value_dict = "value extra " + type_element
+ assert key_dict in element["extra"]
+ assert element["extra"][key_dict] == value_dict
+
+
+def test_export_subject_object_action_categories():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ import_export_helper.clean_all()
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ SUBJECT_OBJECT_ACTION_CATEGORIES), headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in SUBJECT_OBJECT_ACTION_CATEGORIES.keys())
+
+ req = hug.test.get(json_export, "/export", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+ assert "content" in data
+ type_elements = ["subject", "object", "action"]
+ for type_element in type_elements:
+ key = type_element + "_categories"
+ assert key in data["content"]
+ assert isinstance(data["content"][key], list)
+ assert len(data["content"][key]) == 1
+ category = data["content"][key][0]
+ assert category["name"] == "test " + type_element + " categories"
+ assert category["description"] == type_element + " category description"
+
+
+def test_export_subject_object_action_data():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ import_export_helper.clean_all()
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ SUBJECT_OBJECT_ACTION_DATA), headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in SUBJECT_OBJECT_ACTION_DATA.keys())
+
+ req = hug.test.get(json_export, "/export", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+ assert "content" in data
+ type_elements = ["subject", "object", "action"]
+ for type_element in type_elements:
+ key = type_element + "_data"
+ assert key in data["content"]
+ assert isinstance(data["content"][key], list)
+ assert len(data["content"][key]) == 1
+ data_elt = data["content"][key][0]
+ assert data_elt["name"] == "test " + type_element + " data"
+ assert data_elt["description"] == type_element + " data description"
+ assert isinstance(data_elt["policy"], dict)
+ assert data_elt["policy"]["name"] == "test policy"
+ assert isinstance(data_elt["category"], dict)
+ assert data_elt["category"]["name"] == "test " + type_element + " categories"
+
+
+def test_export_assignments():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ import_export_helper.clean_all()
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ ASSIGNMENTS), headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in ASSIGNMENTS.keys())
+
+ req = hug.test.get(json_export, "/export", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+ assert "content" in data
+ type_elements = ["subject", "object", "action"]
+ for type_element in type_elements:
+ key = type_element + "_assignments"
+ assert key in data["content"]
+ assert isinstance(data["content"][key], list)
+ assert len(data["content"][key]) == 1
+ assignment_elt = data["content"][key][0]
+ assert type_element in assignment_elt
+ assert isinstance(assignment_elt[type_element], dict)
+ if type_element == "subject":
+ assert assignment_elt[type_element]["name"] == "testuser"
+ else:
+ assert assignment_elt[type_element]["name"] == "test " + type_element + " e0"
+ assert "category" in assignment_elt
+ assert isinstance(assignment_elt["category"], dict)
+ assert assignment_elt["category"]["name"] == "test " + type_element + " categories"
+ assert "assignments" in assignment_elt
+ assert isinstance(assignment_elt["assignments"], list)
+ assert len(assignment_elt["assignments"]) == 1
+ assert assignment_elt["assignments"][0]["name"] == "test " + type_element + " data"
+
+ import_export_helper.clean_all()
+
+
+def test_export_rules():
+ from moon_manager.api import json_import
+ from moon_manager.api import json_export
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ import_export_helper.clean_all()
+ req = hug.test.post(json_import, "/import", body=json.dumps(
+ RULES), headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = utilities.get_json(req.data)
+ assert all(e in data for e in RULES.keys())
+
+ req = hug.test.get(json_export, "/export", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ data = utilities.get_json(req.data)
+ assert "content" in data
+ assert "rules" in data["content"]
+ assert isinstance(data["content"]["rules"], list)
+ assert len(data["content"]["rules"]) == 1
+ rule = data["content"]["rules"][0]
+ assert "instructions" in rule
+ assert "decision" in rule["instructions"][0]
+ assert rule["instructions"][0]["decision"] == "grant"
+ assert "enabled" in rule
+ assert rule["enabled"]
+ assert "meta_rule" in rule
+ assert rule["meta_rule"]["name"] == "meta rule"
+ assert "policy" in rule
+ assert rule["policy"]["name"] == "test policy"
+ assert "rule" in rule
+ rule = rule["rule"]
+ assert "subject_data" in rule
+ assert isinstance(rule["subject_data"], list)
+ assert len(rule["subject_data"]) == 1
+ assert rule["subject_data"][0]["name"] == "test subject data"
+ assert "object_data" in rule
+ assert isinstance(rule["object_data"], list)
+ assert len(rule["object_data"]) == 1
+ assert rule["object_data"][0]["name"] == "test object data"
+ assert "action_data" in rule
+ assert isinstance(rule["action_data"], list)
+ assert len(rule["action_data"]) == 1
+ assert rule["action_data"][0]["name"] == "test action data"
diff --git a/moon_manager/tests/unit_python/api/test_json_import.py b/moon_manager/tests/unit_python/api/test_json_import.py
new file mode 100644
index 00000000..3195eca3
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_json_import.py
@@ -0,0 +1,832 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import api.test_models as test_models
+import api.test_policies as test_policies
+import api.test_meta_data as test_categories
+import api.test_data as test_data
+import api.test_meta_rules as test_meta_rules
+import api.test_assignement as test_assignments
+import api.test_rules as test_rules
+import helpers.import_export_helper as import_export_helper
+import helpers.policy_helper as policy_helper
+import hug
+import json
+import pytest
+from moon_utilities import exceptions
+
+
+MODEL_WITHOUT_META_RULES = [
+ {"models": [{"name": "test model", "description": "", "meta_rules": []}]},
+ {"models": [{"name": "test model", "description": "new description", "meta_rules": [],
+ "override": True}]},
+ {"models": [{"name": "test model", "description": "description not taken into account",
+ "meta_rules": [], "override": False}]}
+]
+
+POLICIES = [
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}]},
+ {"policies": [{"name": "test policy", "genre": "authz",
+ "description": "new description not taken into account",
+ "model": {"name": "test model"}, "mandatory": True}]},
+ {"policies": [
+ {"name": "test policy", "genre": "not authz ?", "description": "generates an exception",
+ "model": {"name": "test model"}, "override": True}]},
+ {"models": [{"name": "test model", "description": "", "meta_rules": []}], "policies": [
+ {"name": "test policy", "genre": "not authz ?", "description": "changes taken into account",
+ "model": {"name": "test model"}, "override": True}]},
+]
+
+SUBJECTS = [{"subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {}, "mandatory": True}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"subjects": [{"name": "testuser", "description": "new description of the subject",
+ "extra": {"email": "new-email@test.com"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": [{"name": "test policy"}]}]}]
+
+OBJECTS = [
+ {"objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": True}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"objects": [{"name": "test object", "description": "new description of the object",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": [{"name": "test policy"}]}]},
+]
+
+ACTIONS = [{"actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {}, "mandatory": True}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"actions": [{"name": "test action", "description": "new description of the action",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": [{"name": "test policy"}]}]}]
+
+SUBJECT_CATEGORIES = [{"subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"}]},
+ {"subject_categories": [{"name": "test subject categories",
+ "description": "new subject category description"}]}]
+
+OBJECT_CATEGORIES = [{"object_categories": [
+ {"name": "test object categories", "description": "object category description"}]},
+ {"object_categories": [{"name": "test object categories",
+ "description": "new object category description"}]}]
+
+ACTION_CATEGORIES = [{"action_categories": [
+ {"name": "test action categories", "description": "action category description"}]},
+ {"action_categories": [{"name": "test action categories",
+ "description": "new action category description"}]}]
+
+# meta_rules import is needed otherwise the search for data do not work !!!
+PRE_DATA = {"models": [{"name": "test model", "description": "",
+ "meta_rules": [{"name": "good meta rule"},
+ {"name": "other good meta rule"}]}],
+ "policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}],
+ "subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"},
+ {"name": "other test subject categories",
+ "description": "subject category description"}],
+ "object_categories": [
+ {"name": "test object categories", "description": "object category description"},
+ {"name": "other test object categories",
+ "description": "object category description"}],
+ "action_categories": [
+ {"name": "test action categories", "description": "action category description"},
+ {"name": "other test action categories",
+ "description": "action category description"}],
+ "meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]},
+ {"name": "other good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "other test subject categories"}],
+ "object_categories": [{"name": "other test object categories"}],
+ "action_categories": [{"name": "other test action categories"}]}]}
+
+SUBJECT_DATA = [{"subject_data": [
+ {"name": "not valid subject data", "description": "", "policies": [{}], "category": {}}]},
+ {"subject_data": [
+ {"name": "not valid subject data", "description": "", "policies": [{}],
+ "category": {"name": "test subject categories"}}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "subject_data": [
+ {"name": "one valid subject data", "description": "description",
+ "policies": [{}], "category": {"name": "test subject categories"}}]},
+ {"subject_data": [{"name": "valid subject data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test subject categories"}}]},
+ {"subject_data": [{"name": "valid subject data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test subject categories"}}]}]
+
+OBJECT_DATA = [{"object_data": [
+ {"name": "not valid object data", "description": "", "policies": [{}], "category": {}}]},
+ {"object_data": [
+ {"name": "not valid object data", "description": "", "policies": [{}],
+ "category": {"name": "test object categories"}}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "object_data": [
+ {"name": "one valid object data", "description": "description", "policies": [{}],
+ "category": {"name": "test object categories"}}]},
+ {"object_data": [{"name": "valid object data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test object categories"}}]},
+ {"object_data": [{"name": "valid object data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test object categories"}}]}]
+
+ACTION_DATA = [{"action_data": [
+ {"name": "not valid action data", "description": "", "policies": [{}], "category": {}}]},
+ {"action_data": [
+ {"name": "not valid action data", "description": "", "policies": [{}],
+ "category": {"name": "test action categories"}}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "action_data": [
+ {"name": "one valid action data", "description": "description", "policies": [{}],
+ "category": {"name": "test action categories"}}]},
+ {"action_data": [{"name": "valid action data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test action categories"}}]},
+ {"action_data": [{"name": "valid action data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test action categories"}}]}]
+
+PRE_META_RULES = {"subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories",
+ "description": "object category description"}],
+ "action_categories": [{"name": "test action categories",
+ "description": "object action description"}]}
+
+META_RULES = [{"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "not valid category"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}]},
+ {"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "not valid category"}],
+ "action_categories": [{"name": "test action categories"}]}]},
+ {"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "not valid category"}]}]},
+ {"meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}]}]
+
+PRE_ASSIGNMENTS = {"models": [
+ {"name": "test model", "description": "", "meta_rules": [{"name": "good meta rule"}]}],
+ "policies": [
+ {"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}],
+ "subject_categories": [{"name": "test subject categories",
+ "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories",
+ "description": "object category description"}],
+ "action_categories": [{"name": "test action categories",
+ "description": "object action description"}],
+ "subjects": [{"name": "testuser", "description": "description of the subject",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object", "description": "description of the object",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action", "description": "description of the action",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}],
+ "subject_data": [{"name": "subject data", "description": "test subject data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test subject categories"}}],
+ "object_data": [{"name": "object data", "description": "test object data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test object categories"}}],
+ "action_data": [{"name": "action data", "description": "test action data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test action categories"}}]}
+
+SUBJECT_ASSIGNMENTS = [
+ {"subject_assignments": [
+ {"subject": {"name": "unknown"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": None
+ }]
+
+OBJECT_ASSIGNMENTS = [
+ {"object_assignments": [
+ {"object": {"name": "unknown"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": None
+ }]
+
+ACTION_ASSIGNMENTS = [
+ {"action_assignments": [
+ {"action": {"name": "unknown"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": None
+ }]
+
+RULES = [{"rules": [{"meta_rule": {"name": "unknown meta rule"}, "policy": {"name": "test "
+ "policy"},
+ "instructions": [{"decision": "grant"}], "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}], "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "unknown "
+ "policy"},
+ "instructions": [{"decision": "grant"}], "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": [{"decision": "grant"}], "enabled": True, "rule": {
+ "subject_data": [{"name": "unknown subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": [{"decision": "grant"}], "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "unknown object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": [{"decision": "grant"}], "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "unknown action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": [{"decision": "grant"}], "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]}]
+
+
+def test_import_models_without_new_meta_rules():
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ import_export_helper.clean_all()
+ counter = 0
+ for models_description in MODEL_WITHOUT_META_RULES:
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(models_description)
+ , headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ data = req.data
+ assert all(e in data for e in models_description.keys())
+ req, models = test_models.get_models()
+ models = models["models"]
+ assert len(list(models.keys())) == 1
+ values = list(models.values())
+ assert values[0]["name"] == "test model"
+ if counter == 0:
+ assert len(values[0]["description"]) == 0
+ if counter == 1 or counter == 2:
+ assert values[0]["description"] == "new description"
+ counter = counter + 1
+ import_export_helper.clean_all()
+
+
+def test_import_policies():
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ import_export_helper.clean_all()
+ counter = -1
+ for policy_description in POLICIES:
+ counter = counter + 1
+ from moon_manager.api import json_import
+ if counter == 2:
+ with pytest.raises(exceptions.UnknownName):
+ req = hug.test.post(json_import, "/import", body=json.dumps(policy_description),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ continue
+ else:
+ req = hug.test.post(json_import, "/import", body=json.dumps(policy_description),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ data = req.data
+ assert all(e in data for e in policy_description.keys())
+
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers)
+ policies = req.data
+ policies = policies["policies"]
+ assert len(list(policies.keys())) == 1
+ values = list(policies.values())
+ assert values[0]["name"] == "test policy"
+ if counter < 3:
+ assert values[0]["genre"] == "authz"
+ assert values[0]["description"] == "description"
+ else:
+ assert values[0]["genre"] == "not authz ?"
+ assert values[0]["description"] == "changes taken into account"
+ assert len(values[0]["model_id"]) > 0
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ type_elements = ["object", "action"]
+ perimeter_id = None
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECTS
+ clean_method = import_export_helper.clean_subjects
+ name = "testuser"
+ key_extra = "email"
+ value_extra = "new-email@test.com"
+ elif type_element == "object":
+ elements = OBJECTS
+ clean_method = import_export_helper.clean_objects
+ name = "test object"
+ key_extra = "test"
+ value_extra = "test extra"
+ else:
+ elements = ACTIONS
+ clean_method = import_export_helper.clean_actions
+ name = "test action"
+ key_extra = "test"
+ value_extra = "test extra"
+
+ for element in elements:
+ counter = counter + 1
+ if counter == 2 or counter == 4:
+ clean_method()
+
+ from moon_manager.api import perimeter
+ if counter == 3:
+ req = hug.test.patch(perimeter, "/{}s/{}".format(type_element, perimeter_id),
+ body=json.dumps(element["{}s".format(type_element)][0]),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ elif counter < 2:
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req = hug.test.patch(perimeter, "/{}s/{}".format(type_element, perimeter_id),
+ body=json.dumps(element["{}s".format(type_element)][0]),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ # assert req.status == hug.HTTP_400
+ assert '400: Perimeter content is invalid.' == str(exception_info.value)
+ continue
+ else:
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(element),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+
+ try:
+ data = req.data
+ except Exception as e:
+ assert False
+ # assert counter < 2 #  this is an expected failure
+ # continue
+
+ if counter != 3:
+ assert any(e in data for e in element["{}s".format(type_element)][0].keys()) #NOTE: logs are skipped for some elements
+
+ from moon_manager.api import perimeter
+ get_elements = hug.test.get(perimeter, "/" + type_element + "s", headers=auth_headers ).data
+ get_elements = get_elements[type_element + "s"]
+
+ perimeter_id = list(get_elements.keys())[0]
+
+ assert len(list(get_elements.keys())) == 1
+ values = list(get_elements.values())
+ assert values[0]["name"] == name
+ if counter == 2 or counter == 4:
+ assert values[0]["description"] == "description of the " + type_element
+ # assert not values[0]["extra"]
+ if counter == 3:
+ assert values[0]["description"] == "new description of the " + type_element
+ assert values[0]["extra"][key_extra] == value_extra
+
+ #  assert len(values[0]["policy_list"]) == 1
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action_categories():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECT_CATEGORIES
+ get_method = test_categories.get_subject_categories
+ elif type_element == "object":
+ elements = OBJECT_CATEGORIES
+ get_method = test_categories.get_object_categories
+ else:
+ elements = ACTION_CATEGORIES
+ get_method = test_categories.get_action_categories
+
+ for element in elements:
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(element),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")} )
+ counter = counter + 1
+ data = req.data
+ assert all(e in data for e in element.keys())
+ req, get_elements = get_method()
+ get_elements = get_elements[type_element + "_categories"]
+ assert len(list(get_elements.keys())) == 1
+ values = list(get_elements.values())
+ assert values[0]["name"] == "test " + type_element + " categories"
+ assert values[0]["description"] == type_element + " category description"
+
+
+def test_import_meta_rules():
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ import_export_helper.clean_all()
+ # import some categories
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(PRE_META_RULES),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ data = req.data
+ assert all(e in data for e in PRE_META_RULES.keys())
+
+ counter = -1
+ for meta_rule in META_RULES:
+ counter = counter + 1
+ if counter != 3:
+ with pytest.raises(exceptions.UnknownName) as exception_info:
+ req = hug.test.post(json_import, "/import", body=json.dumps(meta_rule),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ # assert req.status == hug.HTTP_400
+ assert '400: Unknown Name.' == str(exception_info.value)
+ continue
+ else:
+ req = hug.test.post(json_import, "/import", body=json.dumps(meta_rule),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ data = req.data
+ assert all(e in data for e in meta_rule.keys())
+ assert req.status == hug.HTTP_200
+
+ req, meta_rules = test_meta_rules.get_meta_rules()
+ meta_rules = meta_rules["meta_rules"]
+ key = list(meta_rules.keys())[0]
+ assert isinstance(meta_rules, dict)
+ assert meta_rules[key]["name"] == "good meta rule"
+ assert meta_rules[key]["description"] == "valid meta rule"
+ assert len(meta_rules[key]["subject_categories"]) == 1
+ assert len(meta_rules[key]["object_categories"]) == 1
+ assert len(meta_rules[key]["action_categories"]) == 1
+
+ subject_category_key = meta_rules[key]["subject_categories"][0]
+ object_category_key = meta_rules[key]["object_categories"][0]
+ action_category_key = meta_rules[key]["action_categories"][0]
+
+ req, sub_cat = test_categories.get_subject_categories()
+ sub_cat = sub_cat["subject_categories"]
+ assert sub_cat[subject_category_key]["name"] == "test subject categories"
+
+ req, ob_cat = test_categories.get_object_categories()
+ ob_cat = ob_cat["object_categories"]
+ assert ob_cat[object_category_key]["name"] == "test object categories"
+
+ req, ac_cat = test_categories.get_action_categories()
+ ac_cat = ac_cat["action_categories"]
+ assert ac_cat[action_category_key]["name"] == "test action categories"
+
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action_assignments():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ import_export_helper.clean_all()
+
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(PRE_ASSIGNMENTS),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")} )
+ data = req.data
+ assert any(e in data for e in PRE_ASSIGNMENTS.keys()) #NOTE: note assignment logs are skipped
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ counter = -1
+ if type_element == "subject":
+ datas = SUBJECT_ASSIGNMENTS
+ get_method = test_assignments.get_subject_assignment
+ elif type_element == "object":
+ datas = OBJECT_ASSIGNMENTS
+ get_method = test_assignments.get_object_assignment
+ else:
+ datas = ACTION_ASSIGNMENTS
+ get_method = test_assignments.get_action_assignment
+
+ for assignments in datas:
+ counter = counter + 1
+ my_exception = assignments.pop("exception")
+ if my_exception:
+ with pytest.raises(my_exception) as exception_info:
+ req = hug.test.post(json_import, "/import", body=json.dumps(assignments),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ assert '400:' in str(exception_info.value)
+ else:
+ req = hug.test.post(json_import, "/import", body=json.dumps(assignments),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ assert len(assignments.keys()) > 0 #NOTE logs for assignments are skipped
+ assert req.status == hug.HTTP_200
+ req = test_policies.get_policies(auth_headers=auth_headers)
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, get_assignments = get_method(policy_key)
+ get_assignments = get_assignments[type_element + "_assignments"]
+ assert len(get_assignments) == 1
+
+
+def test_import_rules():
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ import_export_helper.clean_all()
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(PRE_ASSIGNMENTS),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ data = req.data
+ assert all(e in data for e in PRE_ASSIGNMENTS.keys())
+
+ counter = -1
+ for rule in RULES:
+ counter = counter + 1
+ from moon_manager.api import json_import
+ if counter < 5:
+ with pytest.raises(exceptions.UnknownName) as exception_info:
+ req = hug.test.post(json_import, "/import", body=json.dumps(rule),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+
+ # assert req.status == hug.HTTP_400
+ assert '400: Unknown Name.' == str(exception_info.value)
+ continue
+ req = hug.test.post(json_import, "/import", body=json.dumps(rule),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+
+ assert req.status == hug.HTTP_200
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies = test_policies.get_policies(auth_headers=auth_headers).data
+ for policy in policies['policies']:
+ if policies['policies'][policy]['name'] == rule['rules'][0]['policy']['name']:
+ policy_id = policy
+ break
+
+ req, rules = test_rules.test_get_rules(policy_id)
+ rules = rules["rules"]
+ rules = rules["rules"]
+ assert len(rules) == 1
+ rules = rules[0]
+ assert rules["enabled"]
+ assert rules["instructions"][0]["decision"] == "grant"
+
+ req, meta_rules = test_meta_rules.get_meta_rules()
+ assert meta_rules["meta_rules"][list(meta_rules["meta_rules"].keys())[0]][
+ "name"] == "good meta rule"
+
+
+def test_import_subject_object_action_data():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ from moon_manager.api import json_import
+ req = hug.test.post(json_import, "/import", body=json.dumps(PRE_DATA),
+ headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECT_DATA
+ get_method = test_data.get_subject_data
+ get_categories = test_categories.get_subject_categories
+ elif type_element == "object":
+ elements = OBJECT_DATA
+ get_method = test_data.get_object_data
+ get_categories = test_categories.get_object_categories
+ else:
+ elements = ACTION_DATA
+ get_method = test_data.get_action_data
+ get_categories = test_categories.get_action_categories
+
+ for element in elements:
+ from moon_manager.api import json_import
+ counter = counter + 1
+ if counter == 0 or counter == 1:
+ with pytest.raises(exceptions.MissingIdOrName) as exception_info:
+ req = hug.test.post(json_import, "/import", body=json.dumps(element), headers={
+ 'Content-Type': 'application/json', "X-Api-Key": get_api_key_for_user("admin")})
+ # assert req.status == hug.HTTP_400
+ assert '400: Missing ID or Name.' == str(exception_info.value)
+ continue
+ else:
+ req = hug.test.post(json_import, "/import", body=json.dumps(element), headers={
+ 'Content-Type': 'application/json', "X-Api-Key": get_api_key_for_user("admin")})
+ assert req.status == hug.HTTP_200
+ data = req.data
+ assert all(e in data for e in element.keys())
+
+ req = test_policies.get_policies(auth_headers=auth_headers)
+ policies = req.data
+ policies = policies["policies"]
+ req, categories = get_categories()
+ categories = categories[type_element + "_categories"]
+ case_tested = False
+ for policy_key in policies.keys():
+ policy = policies[policy_key]
+ for category_key in categories:
+ req, get_elements = get_method(policy_id=policy_key,
+ category_id=category_key)
+ if len(get_elements[type_element + "_data"]) == 0:
+ continue
+
+ # do this because the backend gives an element with empty data if the policy_key,
+ # category_key couple does not have any data...
+ get_elements = get_elements[type_element + "_data"]
+ if len(get_elements[0]["data"]) == 0:
+ continue
+
+ if policy["name"] == "test policy":
+ assert len(get_elements) == 1
+ el = get_elements[0]
+ assert isinstance(el["data"], dict)
+ if counter == 2:
+ assert len(el["data"].keys()) == 1
+ el = el["data"][list(el["data"].keys())[0]]
+ if "value" in el:
+ el = el["value"]
+ assert el["name"] == "one valid " + type_element + " data"
+ if counter == 3:
+ assert len(el["data"].keys()) == 2
+ el1 = el["data"][list(el["data"].keys())[0]]
+ el2 = el["data"][list(el["data"].keys())[1]]
+ if "value" in el1:
+ el1 = el1["value"]
+ el2 = el2["value"]
+ assert (el1["name"] == "one valid " + type_element + " data" and el2[
+ "name"] == "valid " + type_element + " data") or (el2[
+ "name"] == "one valid " + type_element + " data" and
+ el1[
+ "name"] == "valid " + type_element + " data")
+ assert el1["description"] == "description"
+ assert el2["description"] == "description"
+
+ case_tested = True
+
+ if policy["name"] == "test other policy":
+ if counter == 4:
+ assert len(get_elements) == 1
+ el = get_elements[0]
+ assert isinstance(el["data"], dict)
+ assert len(el["data"].keys()) == 1
+ el = el["data"][list(el["data"].keys())[0]]
+ if "value" in el:
+ el = el["value"]
+ assert el["name"] == "valid " + type_element + " data"
+ assert el["description"] == "new description"
+ case_tested = True
+
+ assert case_tested is True
+
+
+def test_clean():
+ import_export_helper.clean_all()
+ # restore the database as previously
+ policy_helper.add_policies()
diff --git a/moon_manager/tests/unit_python/api/test_keystone.py b/moon_manager/tests/unit_python/api/test_keystone.py
new file mode 100644
index 00000000..5ed08ca7
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_keystone.py
@@ -0,0 +1,63 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def create_project(tenant_dict):
+ from moon_manager.pip_driver import InformationManager
+ return InformationManager["subjects"][0].create_project(**tenant_dict)
+
+
+def list_projects():
+ from moon_manager.pip_driver import InformationManager
+ return InformationManager["subjects"][0].get_projects()
+
+
+def create_user(subject_dict):
+ from moon_manager.pip_driver import InformationManager
+ return InformationManager["subjects"][0].add_item(**subject_dict)
+
+
+def test_create_project():
+ tenant_dict = {
+ "description": "test_project",
+ "domain": ['domain_id_1'],
+ "enabled": True,
+ "is_domain": False,
+ "name": 'project_1'
+ }
+ project = create_project(tenant_dict)
+ assert project
+ assert project.get('name') == tenant_dict.get('name')
+
+# TODO TO BE UPDATED
+# def test_create_project_without_name():
+# tenant_dict = {
+# "description": "test_project",
+# "domain_id": ['domain_id_1'],
+# "enabled": True,
+# "is_domain": False,
+# }
+# with pytest.raises(Exception) as exception_info:
+# create_project(tenant_dict)
+# assert '400: Keystone project error' == str(exception_info.value)
+
+
+def test_create_user():
+ subject_dict = {
+ "password": "password",
+ "domain": ['domain_id_1'],
+ "enabled": True,
+ "project": 'test_project',
+ "name": 'user_id_1'
+ }
+ user = create_user(subject_dict)
+ assert user
diff --git a/moon_manager/tests/unit_python/api/test_meta_data.py b/moon_manager/tests/unit_python/api/test_meta_data.py
new file mode 100644
index 00000000..1d37ab70
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_meta_data.py
@@ -0,0 +1,370 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import json
+from helpers import data_builder
+from uuid import uuid4
+import pytest
+from moon_utilities import exceptions
+
+# subject_categories_test
+
+
+def get_subject_categories():
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(meta_data, "/subject_categories", headers=auth_headers )
+ subject_categories = req.data
+ return req, subject_categories
+
+
+def add_subject_categories(name):
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = hug.test.post(meta_data, "/subject_categories", body=json.dumps(data),
+ headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")})
+
+ subject_categories = req.data
+ return req, subject_categories
+
+
+def delete_subject_categories(name):
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ request, subject_categories = get_subject_categories()
+ for key, value in subject_categories['subject_categories'].items():
+ if value['name'] == name:
+ return hug.test.delete(meta_data, "/subject_categories/{}".format(key), headers=auth_headers )
+ return hug.test.delete(meta_data, "/subject_categories/{}".format(name), headers=auth_headers )
+
+
+def test_get_subject_categories():
+ req, subject_categories = get_subject_categories()
+ assert req.status == hug.HTTP_200
+ assert isinstance(subject_categories, dict)
+ assert "subject_categories" in subject_categories
+
+
+def test_add_subject_categories():
+ name = "testuser" + uuid4().hex
+ req, subject_categories = add_subject_categories(name)
+ assert req.status == hug.HTTP_200
+ assert isinstance(subject_categories, dict)
+ value = list(subject_categories["subject_categories"].values())[0]
+ assert "subject_categories" in subject_categories
+ assert value['name'] == name
+ assert value['description'] == "description of {}".format(name)
+
+
+def test_add_subject_categories_with_existed_name():
+ name = uuid4().hex
+ req, subject_categories = add_subject_categories(name)
+ assert req.status == hug.HTTP_200
+ with pytest.raises(exceptions.SubjectCategoryExisting) as exception_info:
+ req, subject_categories = add_subject_categories(name)
+ assert '409: Subject Category Existing' == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data['message'] == '409: Subject Category Existing'
+
+
+def test_add_subject_categories_name_contain_space():
+ with pytest.raises(exceptions.CategoryNameInvalid) as exception_info:
+ req, subject_categories = add_subject_categories(" ")
+ assert '400: Category Name Invalid' == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == '400: Category Name Invalid'
+
+
+def test_add_subject_categories_with_empty_name():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, subject_categories = add_subject_categories("<a>")
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "Key: 'name', [Forbidden characters in string]"
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+
+
+def test_add_subject_categories_with_name_contain_space():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, subject_categories = add_subject_categories("test<z>user")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_subject_categories():
+ name = "testuser" + uuid4().hex
+ add_subject_categories(name)
+ req = delete_subject_categories(name)
+ assert req.status == hug.HTTP_200
+
+
+def test_delete_subject_categories_without_id():
+ with pytest.raises(exceptions.SubjectCategoryUnknown) as exception_info:
+ req = delete_subject_categories(uuid4().hex)
+ assert "400: Subject Category Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "400: Subject Category Unknown"
+
+
+# ---------------------------------------------------------------------------
+# object_categories_test
+
+def get_object_categories():
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(meta_data, "/object_categories", headers=auth_headers )
+ object_categories = req.data
+ return req, object_categories
+
+
+def add_object_categories(name):
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = hug.test.post(meta_data, "/object_categories", body=json.dumps(data),
+ headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")} )
+ object_categories = req.data
+ return req, object_categories
+
+
+def delete_object_categories(name):
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ request, object_categories = get_object_categories()
+ for key, value in object_categories['object_categories'].items():
+ if value['name'] == name:
+ return hug.test.delete(meta_data, "/object_categories/{}".format(key),
+ headers=auth_headers )
+ return hug.test.delete(meta_data, "/object_categories/{}".format(name), headers=auth_headers )
+
+
+def test_get_object_categories():
+ req, object_categories = get_object_categories()
+ assert req.status == hug.HTTP_200
+ assert isinstance(object_categories, dict)
+ assert "object_categories" in object_categories
+
+
+def test_add_object_categories():
+ name="testuser"+uuid4().hex
+ req, object_categories = add_object_categories(name)
+ assert req.status == hug.HTTP_200
+ assert isinstance(object_categories, dict)
+ value = list(object_categories["object_categories"].values())[0]
+ assert "object_categories" in object_categories
+ assert value['name'] == name
+ assert value['description'] == "description of {}".format(name)
+
+
+def test_add_object_categories_with_existed_name():
+ name = uuid4().hex
+ req, object_categories = add_object_categories(name)
+ assert req.status == hug.HTTP_200
+ with pytest.raises(exceptions.ObjectCategoryExisting) as exception_info:
+ req, object_categories = add_object_categories(name)
+ assert "409: Object Category Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data['message'] == '409: Object Category Existing'
+
+
+def test_add_object_categories_name_contain_space():
+ with pytest.raises(exceptions.CategoryNameInvalid) as exception_info:
+ req, subject_categories = add_object_categories(" ")
+ assert "400: Category Name Invalid" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == '400: Category Name Invalid'
+
+
+def test_add_object_categories_with_empty_name():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, object_categories = add_object_categories("<a>")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_object_categories_with_name_contain_space():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, object_categories = add_object_categories("test<a>user")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_object_categories():
+ name = uuid4().hex
+ add_object_categories(name)
+ req = delete_object_categories(name)
+ assert req.status == hug.HTTP_200
+
+
+def test_delete_object_categories_without_id():
+ with pytest.raises(exceptions.ObjectCategoryUnknown) as exception_info:
+ req = delete_object_categories(uuid4().hex)
+ assert "400: Object Category Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "400: Object Category Unknown"
+
+
+# ---------------------------------------------------------------------------
+# action_categories_test
+
+def get_action_categories():
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(meta_data, "/action_categories", headers=auth_headers )
+ action_categories = req.data
+ return req, action_categories
+
+
+def add_action_categories(name):
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = hug.test.post(meta_data, "/action_categories", body=json.dumps(data),
+ headers={'Content-Type': 'application/json', "X-Api-Key":
+ get_api_key_for_user("admin")} )
+ action_categories = req.data
+ return req, action_categories
+
+
+def delete_action_categories(name):
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ request, action_categories = get_action_categories()
+ for key, value in action_categories['action_categories'].items():
+ if value['name'] == name:
+ return hug.test.delete(meta_data, "/action_categories/{}".format(key), headers=auth_headers )
+ return hug.test.delete(meta_data, "/action_categories/{}".format(name), headers=auth_headers )
+
+
+def test_get_action_categories():
+ req, action_categories = get_action_categories()
+ assert req.status == hug.HTTP_200
+ assert isinstance(action_categories, dict)
+ assert "action_categories" in action_categories
+
+
+def test_add_action_categories():
+ name = "testuser" + uuid4().hex
+ req, action_categories = add_action_categories(name)
+ assert req.status == hug.HTTP_200
+ assert isinstance(action_categories, dict)
+ value = list(action_categories["action_categories"].values())[0]
+ assert "action_categories" in action_categories
+ assert value['name'] == name
+ assert value['description'] == "description of {}".format(name)
+
+
+def test_add_action_categories_with_existed_name():
+ name = uuid4().hex
+ req, action_categories = add_action_categories(name)
+ assert req.status == hug.HTTP_200
+ with pytest.raises(exceptions.ActionCategoryExisting) as exception_info:
+ req, action_categories = add_action_categories(name)
+ assert "409: Action Category Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data['message'] == '409: Action Category Existing'
+
+
+def test_add_action_categories_name_contain_space():
+ with pytest.raises(exceptions.CategoryNameInvalid) as exception_info:
+ req, subject_categories = add_action_categories(" ")
+ assert "400: Category Name Invalid" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == '400: Category Name Invalid'
+
+
+def test_add_action_categories_with_empty_name():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, action_categories = add_action_categories("<a>")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_action_categories_with_name_contain_space():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, action_categories = add_action_categories("test<a>user")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_action_categories():
+ name = "testuser" + uuid4().hex
+ add_action_categories(name)
+ req = delete_action_categories(name)
+ assert req.status == hug.HTTP_200
+
+
+def test_delete_action_categories_without_id():
+ with pytest.raises(exceptions.ActionCategoryUnknown) as exception_info:
+ req = delete_action_categories(uuid4().hex)
+ assert "400: Action Category Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == "400: Action Category Unknown"
+
+
+def test_delete_data_categories_connected_to_meta_rule():
+ from moon_manager.api import meta_data
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+
+ with pytest.raises(exceptions.DeleteSubjectCategoryWithMetaRule) as exception_info:
+ req = hug.test.delete(meta_data, "/subject_categories/{}".format(subject_category_id),
+ headers=auth_headers )
+ assert "400: Subject Category With Meta Rule Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == '400: Subject Category With Meta Rule Error'
+
+ with pytest.raises(exceptions.DeleteObjectCategoryWithMetaRule) as exception_info:
+ req = hug.test.delete(meta_data, "/object_categories/{}".format(object_category_id), headers=auth_headers)
+ assert "400: Object Category With Meta Rule Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == '400: Object Category With Meta Rule Error'
+
+ with pytest.raises(exceptions.DeleteActionCategoryWithMetaRule) as exception_info:
+ req = hug.test.delete(meta_data, "/action_categories/{}".format(action_category_id), headers=auth_headers)
+ assert "400: Action Category With Meta Rule Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data['message'] == '400: Action Category With Meta Rule Error'
diff --git a/moon_manager/tests/unit_python/api/test_meta_rules.py b/moon_manager/tests/unit_python/api/test_meta_rules.py
new file mode 100644
index 00000000..6c6797f5
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_meta_rules.py
@@ -0,0 +1,687 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import api.utilities as utilities
+from helpers import category_helper
+from helpers import data_builder
+from helpers import policy_helper
+from helpers import model_helper
+from helpers import meta_rule_helper
+from uuid import uuid4
+import pytest
+from moon_utilities import exceptions
+
+
+def get_meta_rules():
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(meta_rules, "/meta_rules", headers=auth_headers)
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def add_meta_rules(name, data=None):
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ if not data:
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id = list(action_category.keys())[0]
+
+ data = {
+ "name": name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ req = hug.test.post(meta_rules, "/meta_rules", body=data,
+ headers=auth_headers)
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def add_meta_rules_without_category_ids(name):
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ data = {
+ "name": name + uuid4().hex,
+ "subject_categories": [],
+ "object_categories": [],
+ "action_categories": []
+ }
+ req = hug.test.post(meta_rules, "/meta_rules", body=data,
+ headers=auth_headers)
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def update_meta_rules(name, metaRuleId, data=None):
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ if not data:
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name update" + uuid4().hex,
+ "description": "description 1"})
+ subject_category_id = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name update" + uuid4().hex,
+ "description": "description 1"})
+ object_category_id = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name update" + uuid4().hex,
+ "description": "description 1"})
+ action_category_id = list(action_category.keys())[0]
+ data = {
+ "name": name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+
+ req = hug.test.patch(meta_rules, "/meta_rules/{}".format(metaRuleId), body=data,
+ headers=auth_headers)
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def update_meta_rules_with_categories(name, data=None, meta_rule_id=None):
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ if not meta_rule_id:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+
+ req = hug.test.patch(meta_rules, "/meta_rules/{}".format(meta_rule_id), body=data,
+ headers=auth_headers)
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def delete_meta_rules(name):
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ request, meta_rules_data = get_meta_rules()
+ for key, value in meta_rules_data['meta_rules'].items():
+ if value['name'] == name:
+ return hug.test.delete(meta_rules, "/meta_rules/{}".format(key), headers=auth_headers)
+
+
+def delete_meta_rules_without_id():
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.delete(meta_rules, "/meta_rules/{}".format(""), headers=auth_headers)
+ return req
+
+
+def test_get_meta_rules():
+ req, meta_rules = get_meta_rules()
+ assert req.status == hug.HTTP_200
+ assert isinstance(meta_rules, dict)
+ assert "meta_rules" in meta_rules
+
+
+def test_add_meta_rules():
+ meta_rule_name = uuid4().hex
+ req, meta_rules = add_meta_rules(meta_rule_name)
+ assert req.status == hug.HTTP_200
+ assert isinstance(meta_rules, dict)
+ value = list(meta_rules["meta_rules"].values())[0]
+ assert "meta_rules" in meta_rules
+ assert value['name'] == meta_rule_name
+
+
+def test_add_meta_rules_space_name():
+ with pytest.raises(exceptions.MetaRuleContentError) as exception_info:
+ req, meta_rules = add_meta_rules(" ")
+ assert "400: Meta Rule Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Meta Rule Error'
+
+
+def test_add_meta_rules_empty_name():
+ with pytest.raises(exceptions.MetaRuleContentError) as exception_info:
+ req, meta_rules = add_meta_rules("")
+ assert "400: Meta Rule Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Meta Rule Error'
+
+
+def test_add_two_meta_rules_with_same_categories_combination():
+ meta_rule_name = uuid4().hex
+ req, meta_rules = add_meta_rules(meta_rule_name)
+ data = None
+ assert req.status == hug.HTTP_200
+ for meta_rule_id in meta_rules['meta_rules']:
+ if meta_rules['meta_rules'][meta_rule_id]['name'] == meta_rule_name:
+ data = meta_rules['meta_rules'][meta_rule_id]
+
+ assert data
+ data['name'] = uuid4().hex
+ with pytest.raises(exceptions.MetaRuleExisting) as exception_info:
+ req, meta_rules = add_meta_rules(name=data['name'], data=data)
+ assert "409: Meta Rule Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Meta Rule Existing'
+
+
+def test_add_three_meta_rules_with_different_combination_but_similar_items():
+ meta_rule_name1 = uuid4().hex
+ req, meta_rules = add_meta_rules(meta_rule_name1)
+ assert req.status == hug.HTTP_200
+ for meta_rule_id in meta_rules['meta_rules']:
+ if meta_rules['meta_rules'][meta_rule_id]['name'] == meta_rule_name1:
+ data = meta_rules['meta_rules'][meta_rule_id]
+ break
+
+ meta_rule_name2 = uuid4().hex
+
+ req, meta_rules = add_meta_rules(meta_rule_name2)
+
+ for meta_rule_id in meta_rules['meta_rules']:
+ if meta_rules['meta_rules'][meta_rule_id]['name'] == meta_rule_name2:
+ data['subject_categories'] += meta_rules['meta_rules'][meta_rule_id][
+ 'subject_categories']
+ data['object_categories'] += meta_rules['meta_rules'][meta_rule_id]['object_categories']
+ data['action_categories'] += meta_rules['meta_rules'][meta_rule_id]['action_categories']
+ break
+
+ data['name'] = uuid4().hex
+
+ req, meta_rules = add_meta_rules(name=data['name'], data=data)
+ assert req.status == hug.HTTP_200
+
+
+def test_add_two_meta_rules_with_different_combination_but_similar_items():
+ meta_rule_name1 = uuid4().hex
+ meta_rule_name2 = uuid4().hex
+
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id1 = list(subject_category.keys())[0]
+
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id1 = list(object_category.keys())[0]
+
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id1 = list(action_category.keys())[0]
+
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id2 = list(subject_category.keys())[0]
+
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id2 = list(object_category.keys())[0]
+
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id2 = list(action_category.keys())[0]
+
+ data = {
+ "name": meta_rule_name1,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1, object_category_id2],
+ "action_categories": [action_category_id1, action_category_id2]
+ }
+ req, meta_rules = add_meta_rules(meta_rule_name1, data=data)
+ assert req.status == hug.HTTP_200
+ data = {
+ "name": meta_rule_name2,
+ "subject_categories": [subject_category_id2],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id2]
+ }
+
+ req, meta_rules = add_meta_rules(meta_rule_name1, data=data)
+ assert req.status == hug.HTTP_200
+
+
+# This test Succeed as it's okay to have empty id in adding meta rule, as it is not attached to model yet
+def test_add_meta_rules_with_empty_subject_in_mid():
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ value = meta_rule_helper.get_body_meta_rule_with_empty_category_in_mid('subject')
+ with pytest.raises(exceptions.SubjectCategoryUnknown) as exception_info:
+ req = hug.test.post(meta_rules, "/meta_rules", body=value,
+ headers=auth_headers)
+ # assert req.status == hug.HTTP_200
+ assert str(exception_info.value) == "400: Subject Category Unknown"
+
+
+def test_add_meta_rules_with_empty_object_in_mid():
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ value = meta_rule_helper.get_body_meta_rule_with_empty_category_in_mid('object')
+ with pytest.raises(exceptions.ObjectCategoryUnknown) as exception_info:
+ req = hug.test.post(meta_rules, "/meta_rules", body=value,
+ headers=auth_headers)
+ assert str(exception_info.value) == "400: Object Category Unknown"
+
+
+def test_add_meta_rules_with_empty_action_in_mid():
+ from moon_manager.api import meta_rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ value = meta_rule_helper.get_body_meta_rule_with_empty_category_in_mid('action')
+ with pytest.raises(exceptions.ActionCategoryUnknown) as exception_info:
+ req = hug.test.post(meta_rules, "/meta_rules", body=value,
+ headers=auth_headers)
+ assert str(exception_info.value) == "400: Action Category Unknown"
+
+
+def test_add_meta_rule_with_existing_name_error():
+ name = uuid4().hex
+ req, meta_rules = add_meta_rules(name)
+ assert req.status == hug.HTTP_200
+ with pytest.raises(exceptions.MetaRuleExisting) as exception_info:
+ req, meta_rules = add_meta_rules(name)
+ assert "409: Meta Rule Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Meta Rule Existing'
+
+
+def test_add_meta_rules_with_forbidden_char_in_name():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, meta_rules = add_meta_rules("<a>")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_meta_rules_with_blank_name():
+ with pytest.raises(exceptions.MetaRuleContentError) as exception_info:
+ req, meta_rules = add_meta_rules("")
+ assert "400: Meta Rule Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Meta Rule Error'
+
+
+def test_add_meta_rules_without_subject_categories():
+ name_meta_rule = uuid4().hex
+ req, meta_rules = add_meta_rules_without_category_ids(name_meta_rule)
+ assert req.status == hug.HTTP_200
+
+
+def test_delete_meta_rules():
+ name_meta_rule = uuid4().hex
+ req, meta_rules = add_meta_rules_without_category_ids(name_meta_rule)
+ meta_rule_id = next(iter(meta_rules['meta_rules']))
+ req = delete_meta_rules(meta_rules['meta_rules'][meta_rule_id]['name'])
+ assert req.status == hug.HTTP_200
+
+
+def test_delete_meta_rules_without_id():
+ with pytest.raises(exceptions.MetaRuleUnknown) as exception_info:
+ req = delete_meta_rules_without_id()
+ assert "400: Meta Rule Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Meta Rule Unknown"
+
+
+def test_update_meta_rules():
+ name = "testuser" + uuid4().hex
+ req = add_meta_rules(name)
+ meta_rule_id = list(req[1]['meta_rules'])[0]
+ req_update = update_meta_rules(name, meta_rule_id)
+ assert req_update[0].status == hug.HTTP_200
+ delete_meta_rules("testuser")
+ get_meta_rules()
+
+
+def test_update_meta_rules_empty_name():
+ req = add_meta_rules("testuser" + uuid4().hex)
+ meta_rule_id = list(req[1]['meta_rules'])[0]
+ with pytest.raises(exceptions.MetaRuleContentError) as exception_info:
+ req_update = update_meta_rules("", meta_rule_id)
+ assert "400: Meta Rule Error" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Meta Rule Error'
+
+
+def test_update_meta_rules_space_name():
+ req = add_meta_rules("testuser" + uuid4().hex)
+ meta_rule_id = list(req[1]['meta_rules'])[0]
+ with pytest.raises(exceptions.MetaRuleContentError) as exception_info:
+ req_update = update_meta_rules(" ", meta_rule_id)
+ assert "400: Meta Rule Error" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Meta Rule Error'
+
+
+def test_update_meta_rule_with_combination_existed():
+ meta_rule_name1 = uuid4().hex
+ req, meta_rules = add_meta_rules(meta_rule_name1)
+ meta_rule_id1 = next(iter(meta_rules['meta_rules']))
+ data1 = meta_rules['meta_rules'][meta_rule_id1]
+
+ meta_rule_name2 = uuid4().hex
+ req, meta_rules = add_meta_rules(meta_rule_name2)
+ meta_rule_id2 = next(iter(meta_rules['meta_rules']))
+ data2 = meta_rules['meta_rules'][meta_rule_id2]
+ data1['name'] = data2['name']
+ with pytest.raises(exceptions.MetaRuleExisting) as exception_info:
+ req_update = update_meta_rules(name=meta_rule_name2, metaRuleId=meta_rule_id2,
+ data=data1)
+ assert "409: Meta Rule Existing" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_409
+ # assert req_update[1]['message'] == '409: Meta Rule Existing'
+
+
+def test_update_meta_rule_with_different_combination_but_same_data():
+ meta_rule_name1 = uuid4().hex
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id1 = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id1 = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id1 = list(action_category.keys())[0]
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id2 = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id2 = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id2 = list(action_category.keys())[0]
+
+ data = {
+ "name": meta_rule_name1,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1, object_category_id2],
+ "action_categories": [action_category_id1, action_category_id2]
+ }
+ req, meta_rules = add_meta_rules(meta_rule_name1, data=data)
+ assert req.status == hug.HTTP_200
+
+ meta_rule_name2 = uuid4().hex
+ req, meta_rules = add_meta_rules(meta_rule_name2)
+ meta_rule_id2 = next(iter(meta_rules['meta_rules']))
+ data2 = {
+ "name": meta_rule_name2,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id1, action_category_id2]
+ }
+
+ req_update = update_meta_rules(name=meta_rule_name2, metaRuleId=meta_rule_id2,
+ data=data2)
+ assert req_update[0].status == hug.HTTP_200
+
+
+def test_update_meta_rules_without_id():
+ with pytest.raises(exceptions.MetaRuleUnknown) as exception_info:
+ req_update = update_meta_rules("testuser", "")
+ assert "400: Meta Rule Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[0].data["message"] == "400: Meta Rule Unknown"
+
+
+def test_update_meta_rules_without_name():
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req_update = update_meta_rules("<br/>", "1234567")
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[0].data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_update_meta_rules_without_categories():
+ req_update = update_meta_rules_with_categories("testuser" + uuid4().hex)
+ assert req_update[0].status == hug.HTTP_200
+
+
+def test_update_meta_rules_with_empty_categories():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [""],
+ "object_categories": [""],
+ "action_categories": [""]
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status == hug.HTTP_200
+ # assert "400: Subject Category Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Subject Category Unknown'
+
+
+def test_update_meta_rules_with_blank_subject_categories():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser1",
+ "subject_categories": [],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+
+ assert req_update[0].status == hug.HTTP_200
+
+
+def test_update_meta_rules_with_blank_object_categories():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser1",
+ "subject_categories": [subject_category_id],
+ "object_categories": [],
+ "action_categories": [action_category_id]
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+
+ assert req_update[0].status == hug.HTTP_200
+
+
+def test_update_meta_rules_with_blank_action_categories():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser1",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": []
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+
+ assert req_update[0].status == hug.HTTP_200
+
+
+def test_update_meta_rules_with_empty_subject_category():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [""],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status == hug.HTTP_200
+ # assert "400: Subject Category Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Subject Category Unknown'
+
+
+def test_update_meta_rules_with_empty_action_category():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [""]
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status == hug.HTTP_200
+ # assert "400: Action Category Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Action Category Unknown'
+
+
+def test_update_meta_rules_with_empty_object_category():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [subject_category_id],
+ "object_categories": [""],
+ "action_categories": [action_category_id]
+ }
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+
+ assert req_update[0].status == hug.HTTP_200
+ # assert "400: Object Category Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Object Category Unknown'
+
+
+def test_update_meta_rules_with_categories_and_one_empty():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [subject_category_id, ""],
+ "object_categories": [object_category_id, ""],
+ "action_categories": [action_category_id, ""]
+ }
+ with pytest.raises(exceptions.SubjectCategoryUnknown) as exception_info:
+ req_update = update_meta_rules_with_categories("testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert "400: Subject Category Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Subject Category Unknown'
+
+
+def test_add_one_meta_rules_with_different_combination_but_similar_items():
+ meta_rule_name1 = uuid4().hex
+
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id1 = list(subject_category.keys())[0]
+
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id1 = list(object_category.keys())[0]
+
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id1 = list(action_category.keys())[0]
+
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id2 = list(subject_category.keys())[0]
+
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id2 = list(object_category.keys())[0]
+
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id2 = list(action_category.keys())[0]
+
+ data = {
+ "name": meta_rule_name1,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1, object_category_id2],
+ "action_categories": [action_category_id1, action_category_id2]
+ }
+ req, meta_rules = add_meta_rules(meta_rule_name1, data=data)
+ assert req.status == hug.HTTP_200
+
+ value = {
+ "name": "name_model",
+ "description": "test",
+ "meta_rules": [next(iter(meta_rules['meta_rules']))]
+ }
+ mode_id = next(iter(model_helper.add_model(value=value)))
+
+ value = {
+ "name": "test_policy" + uuid4().hex,
+ "model_id": mode_id,
+ "genre": "authz",
+ "description": "test",
+ }
+
+ policy_id = next(iter(policy_helper.add_policies(value=value)))
+
+ data_id_1 = data_builder.create_subject_data(policy_id, subject_category_id1)
+ data_id_2 = data_builder.create_subject_data(policy_id, subject_category_id2)
+ data_id_3 = data_builder.create_object_data(policy_id, object_category_id2)
+ data_id_4 = data_builder.create_object_data(policy_id, object_category_id1)
+ data_id_5 = data_builder.create_action_data(policy_id, action_category_id1)
+ data_id_5 = data_builder.create_action_data(policy_id, action_category_id2)
+
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from falcon import HTTP_200, HTTP_400, HTTP_405, HTTP_409
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+
+ req = hug.test.delete(policy, "policies/{}".format(policy_id), headers=auth_headers)
+ assert req.status == HTTP_200
+
+
+def test_update_meta_rules_with_blank_action_categories_assigned_to_used_model():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_manager.api import meta_rules
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies_list = policy_helper.add_policies_with_model()
+ policy_id = list(policies_list.keys())[0]
+ model_id = policies_list[policy_id]['model_id']
+ models_list = model_helper.get_models(model_id=model_id)
+ meta_rule_id = models_list[model_id]["meta_rules"][0]
+ meta_rules_list = meta_rule_helper.get_meta_rules(meta_rule_id=meta_rule_id);
+ data = meta_rules_list[meta_rule_id]
+
+ data["action_categories"] = []
+
+ with pytest.raises(exceptions.MetaRuleUpdateError) as exception_info:
+ hug.test.patch(meta_rules, "/meta_rules/{}".format(meta_rule_id), body=data,
+ headers=auth_headers)
+ assert "400: Meta_Rule Update Error" == str(exception_info.value)
diff --git a/moon_manager/tests/unit_python/api/test_models.py b/moon_manager/tests/unit_python/api/test_models.py
index b80e19f4..569fe1b4 100644
--- a/moon_manager/tests/unit_python/api/test_models.py
+++ b/moon_manager/tests/unit_python/api/test_models.py
@@ -1,76 +1,475 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
import json
-import api.utilities as utilities
+import hug
+import pytest
+from moon_utilities import exceptions
+from helpers import data_builder as builder
+from helpers import policy_helper
+from helpers import model_helper
+from uuid import uuid4
+
+
+def get_models():
+ from moon_manager.api import models
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(models, "/models", headers=auth_headers)
+ models = req.data
+ return req, models
+
+
+def add_models(name, headers, data=None, ):
+ from moon_manager.api import models
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = \
+ builder.create_new_meta_rule()
+ if not data:
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.post(models, "/models", body=json.dumps(data),
+ headers=headers)
+ models = req.data
+ return req, models
+
+
+def update_model(name, model_id, headers):
+ from moon_manager.api import models
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = \
+ builder.create_new_meta_rule()
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data),
+ headers=headers)
+ if req.status == hug.HTTP_405:
+ return req
+ models = req.data
+ return req, models
-def get_models(client):
- req = client.get("/models")
- models = utilities.get_json(req.data)
+def add_model_without_meta_rules_ids(name, headers):
+ from moon_manager.api import models
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": []
+ }
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.post(models, "/models", body=json.dumps(data),
+ headers=headers)
+ models = req.data
return req, models
-def add_models(client, name):
+def add_model_with_empty_meta_rule_id(name, headers):
+ from moon_manager.api import models
data = {
"name": name,
"description": "description of {}".format(name),
- "meta_rules": ["meta_rule_id1", "meta_rule_id2"]
+ "meta_rules": [""]
}
- req = client.post("/models", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- models = utilities.get_json(req.data)
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.post(models, "/models", body=json.dumps(data),
+ headers=headers)
+ models = req.data
return req, models
-def delete_models(client, name):
- request, models = get_models(client)
+def update_model_without_meta_rules_ids(model_id, headers):
+ from moon_manager.api import models
+ name = "model_id" + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": []
+ }
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data),
+ headers=headers)
+ models = req.data
+ return req, models
+
+
+def delete_models(name, headers):
+ request, models = get_models()
for key, value in models['models'].items():
if value['name'] == name:
- req = client.delete("/models/{}".format(key))
+ from moon_manager.api import models
+ req = hug.test.delete(models, "/models/{}".format(key), headers=headers)
break
return req
-def delete_models_without_id(client):
- req = client.delete("/models/{}".format(""))
+def delete_models_without_id(headers):
+ from moon_manager.api import models
+ req = hug.test.delete(models, "/models/{}".format(""), headers=headers)
return req
-def clean_models():
- client = utilities.register_client()
- req, models= get_models(client)
+def clean_models(headers):
+ req, models = get_models()
for key, value in models['models'].items():
print(key)
print(value)
- client.delete("/models/{}".format(key))
+ from moon_manager.api import models
+ hug.test.delete(models, "/models/{}".format(key), headers=headers)
+
+
+def test_delete_model_assigned_to_policy():
+ policy_name = "testuser" + uuid4().hex
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ from moon_manager.api import policy
+ from moon_manager.api import models
+ from moon_utilities.auth_functions import get_api_key_for_user
+ headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'}
+ hug.test.post(policy, "/policies", body=json.dumps(data), headers=headers)
+ with pytest.raises(exceptions.DeleteModelWithPolicy) as exception_info:
+ req = hug.test.delete(models, "/models/{}".format(model_id), headers={"X-Api-Key":
+ get_api_key_for_user("admin")})
+ assert "400: Model With Policy Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Model With Policy Error'
+
def test_get_models():
- client = utilities.register_client()
- req, models= get_models(client)
- assert req.status_code == 200
+ req, models = get_models()
+ assert req.status == hug.HTTP_200
assert isinstance(models, dict)
assert "models" in models
def test_add_models():
- clean_models()
- client = utilities.register_client()
- req, models = add_models(client, "testuser")
- assert req.status_code == 200
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req, models = add_models("testuser", auth_headers)
+ assert req.status == hug.HTTP_200
assert isinstance(models, dict)
- value = list(models["models"].values())[0]
+ model_id = list(models["models"])[0]
assert "models" in models
- assert value['name'] == "testuser"
- assert value["description"] == "description of {}".format("testuser")
- assert value["meta_rules"][0] == "meta_rule_id1"
+ assert models['models'][model_id]['name'] == "testuser"
+ assert models['models'][model_id]["description"] == "description of {}".format("testuser")
+
+
+def test_add_models_with_meta_rule_has_blank_subject():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ name = "testuser1"
+ from moon_manager.api import models
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = \
+ builder.create_new_meta_rule(empty="subject")
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ auth_headers['Content-Type'] = 'application/json'
+ req = hug.test.post(models, "/models", body=json.dumps(data),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_200
+
+
+def test_add_models_with_meta_rule_has_blank_object():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ name = "testuser1"
+ from moon_manager.api import models
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = \
+ builder.create_new_meta_rule(empty="object")
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ auth_headers['Content-Type'] = 'application/json'
+ req = hug.test.post(models, "/models", body=json.dumps(data),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_200
+
+
+def test_add_models_with_meta_rule_has_blank_action():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ name = "testuser1"
+ from moon_manager.api import models
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = \
+ builder.create_new_meta_rule(empty="action")
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ auth_headers['Content-Type'] = 'application/json'
+ req = hug.test.post(models, "/models", body=json.dumps(data),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_200
def test_delete_models():
- client = utilities.register_client()
- req = delete_models(client, "testuser")
- assert req.status_code == 200
+ name = uuid4().hex + "testuser"
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ add_models(name, auth_headers)
+ req = delete_models(name, headers=auth_headers)
+ assert req.status == hug.HTTP_200
+
+
+def test_update_models_with_assigned_policy():
+ from moon_manager.api import models
+ model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(model.keys())[0]
+ value = {
+ "name": "test_policy" + uuid4().hex,
+ "model_id": model_id,
+ "description": "test",
+ }
+ policy_helper.add_policies(value=value)
+ data = {
+ "name": "model_" + uuid4().hex,
+ "description": "description of model_2",
+ "meta_rules": []
+ }
+ from moon_utilities.auth_functions import get_api_key_for_user
+ headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'}
+ with pytest.raises(exceptions.DeleteModelWithPolicy) as exception_info:
+ req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data),
+ headers=headers)
+ assert "400: Model With Policy Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Model With Policy Error"
+
+
+def test_update_models_with_no_assigned_policy():
+ from moon_manager.api import models
+ model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(model.keys())[0]
+ data = {
+ "name": "model_" + uuid4().hex,
+ "description": "description of model_2",
+ "meta_rules": []
+ }
+ from moon_utilities.auth_functions import get_api_key_for_user
+ headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'}
+ req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data),
+ headers=headers)
+ assert req.status == hug.HTTP_200
+
+
+def test_update_models_without_meta_rule_key():
+ from moon_manager.api import models
+ model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(model.keys())[0]
+
+ data = {
+ "name": "model_" + uuid4().hex,
+ "description": "description of model_2",
+ }
+ from moon_utilities.auth_functions import get_api_key_for_user
+ headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'}
+ with pytest.raises(exceptions.MetaRuleUnknown) as exception_info:
+ req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data),
+ headers=headers)
+ assert "400: Meta Rule Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Meta Rule Unknown"
def test_delete_models_without_id():
- client = utilities.register_client()
- req = delete_models_without_id(client)
- assert req.status_code == 500
+ from moon_utilities.auth_functions import get_api_key_for_user
+ headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = delete_models_without_id(headers=headers)
+ assert req.status == hug.HTTP_405
+
+
+def test_add_model_with_empty_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, models = add_models("<br/>", headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_model_with_name_contain_space():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req, models = add_models("test<br>user", headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_model_with_name_space():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ with pytest.raises(exceptions.ModelContentError) as exception_info:
+ req, models = add_models(" ", headers=auth_headers)
+ assert "400: Model Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Model Unknown'
+
+
+def test_add_model_with_empty_meta_rule_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ with pytest.raises(exceptions.MetaRuleUnknown) as exception_info:
+ req, meta_rules = add_model_with_empty_meta_rule_id("testuser", headers=auth_headers)
+ assert "400: Meta Rule Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Meta Rule Unknown'
+
+def test_add_model_with_existed_name():
+ name = uuid4().hex
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req, models = add_models(name, headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ with pytest.raises(exceptions.ModelExisting) as exception_info:
+ req, models = add_models(name, headers=auth_headers)
+ assert "409: Model Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Model Error'
+
+
+def test_add_model_with_existed_meta_rules_list():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ name = uuid4().hex
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = \
+ builder.create_new_meta_rule()
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ name = uuid4().hex
+ req, models = add_models(name=name, headers=auth_headers, data=data)
+ assert req.status == hug.HTTP_200
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ with pytest.raises(exceptions.ModelExisting) as exception_info:
+ req, models = add_models(name=name, headers=auth_headers, data=data)
+ assert "409: Model Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Model Error'
+
+
+def test_add_model_without_meta_rules():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req, meta_rules = add_model_without_meta_rules_ids("testuser", headers=auth_headers)
+ assert req.status == hug.HTTP_200
+
+
+def test_update_model():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req = add_models("testuser", headers=auth_headers)
+ model_id = list(req[1]['models'])[0]
+ req_update = update_model("testuser", model_id, headers=auth_headers)
+ assert req_update[0].status == hug.HTTP_200
+ model_id = list(req_update[1]["models"])[0]
+ assert req_update[1]["models"][model_id]["meta_rules"][0] is not None
+ delete_models("testuser", headers=auth_headers)
+
+
+def test_update_model_name_with_space():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req = add_models("testuser", headers=auth_headers)
+ model_id = list(req[1]['models'])[0]
+ with pytest.raises(exceptions.ModelContentError) as exception_info:
+ req_update = update_model(" ", model_id, headers=auth_headers)
+ assert "400: Model Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]["message"] == '400: Model Unknown'
+
+
+def test_update_model_with_empty_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req = add_models("testuser", headers=auth_headers)
+ model_id = list(req[1]['models'])[0]
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ with pytest.raises(exceptions.ModelContentError) as exception_info:
+ req_update = update_model("", model_id, headers=auth_headers)
+ assert "400: Model Unknown" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[1]['message'] == '400: Model Unknown'
+
+
+def test_update_meta_rules_without_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ clean_models(headers=auth_headers)
+ req_update = update_model("testuser", "", headers=auth_headers)
+ assert req_update.status == hug.HTTP_405
+
+
+def test_update_meta_rules_without_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req_update = update_model("<a></a>", "1234567", headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req_update[0].status == hug.HTTP_400
+ # assert req_update[0].data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_update_meta_rules_without_meta_rules():
+ value = {
+ "name": "mls_model_id" + uuid4().hex,
+ "description": "test",
+ "meta_rules": []
+ }
+ model = model_helper.add_model(value=value)
+ model_id = list(model.keys())[0]
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req_update = update_model_without_meta_rules_ids(model_id, headers=auth_headers)
+ assert req_update[0].status == hug.HTTP_200
diff --git a/moon_manager/tests/unit_python/api/test_nova.py b/moon_manager/tests/unit_python/api/test_nova.py
new file mode 100644
index 00000000..10118cc3
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_nova.py
@@ -0,0 +1,58 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def create_project(tenant_dict):
+ from moon_manager.pip_driver import InformationManager
+ return InformationManager["objects"][0].create_project(**tenant_dict)
+
+
+def list_projects():
+ from moon_manager.pip_driver import InformationManager
+ return InformationManager["objects"][0].get_projects()
+
+
+def list_objects():
+ from moon_manager.pip_driver import InformationManager
+ print(f"IM : {InformationManager['objects'][0].driver.__dict__}")
+ return InformationManager["objects"][0].get_items()
+
+
+def test_create_project():
+ tenant_dict = {
+ "description": "test_project",
+ "domain": ['domain_id_1'],
+ "enabled": True,
+ "is_domain": False,
+ "name": 'project_1'
+ }
+ project = create_project(tenant_dict)
+ assert project
+ assert project.get('name') == tenant_dict.get('name')
+
+
+def test_list_objects():
+ objects = list_objects()
+ assert objects
+ assert objects["servers"][0].get('name') == "vm1"
+
+# TODO TO BE UPDATED
+# def test_create_project_without_name():
+# tenant_dict = {
+# "description": "test_project",
+# "domain_id": ['domain_id_1'],
+# "enabled": True,
+# "is_domain": False,
+# }
+# with pytest.raises(Exception) as exception_info:
+# create_project(tenant_dict)
+# assert '400: Keystone project error' == str(exception_info.value)
diff --git a/moon_manager/tests/unit_python/api/test_pdp.py b/moon_manager/tests/unit_python/api/test_pdp.py
index a2d0cb5a..32b75726 100644
--- a/moon_manager/tests/unit_python/api/test_pdp.py
+++ b/moon_manager/tests/unit_python/api/test_pdp.py
@@ -1,62 +1,479 @@
-import json
-import api.utilities as utilities
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from falcon import HTTP_200, HTTP_400, HTTP_405
+import hug
import pytest
+from moon_utilities import exceptions
+from uuid import uuid4
+from helpers import data_builder as builder
+
+
+def test_get_pdp():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ req = hug.test.get(pdp, 'pdp/', headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ assert "pdps" in req.data
+
+def test_add_pdp_invalid_security_pipeline(mocker):
+ from moon_manager.api import pdp
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data_no_pipeline = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ data_no_project_no_pipeline = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [],
+ "vim_project_id": None,
+ "description": "description of testuser"
+ }
+ data_no_project = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [policy_id],
+ "vim_project_id": None,
+ "description": "description of testuser"
+ }
+
+ req = hug.test.post(pdp, "pdp/", data_no_project_no_pipeline, headers=auth_headers)
+ assert req.status == HTTP_200
+
+ with pytest.raises(exceptions.PdpContentError) as exception_info:
+ req = hug.test.post(pdp, "pdp/", data_no_pipeline, headers=auth_headers)
+ assert "400: Pdp Error" == str(exception_info.value)
+
+ with pytest.raises(exceptions.PdpContentError) as exception_info:
+ req = hug.test.post(pdp, "pdp/", data_no_project, headers=auth_headers)
+ assert "400: Pdp Error" == str(exception_info.value)
+
+def test_update_pdp_invalid_security_pipeline(mocker):
+ from moon_manager.api import pdp
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data_no_pipeline = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ data_no_project_no_pipeline = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [],
+ "vim_project_id": None,
+ "description": "description of testuser"
+ }
+ data_no_project = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [policy_id],
+ "vim_project_id": None,
+ "description": "description of testuser"
+ }
+
+ data_valid = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [policy_id],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ req = hug.test.post(pdp, "pdp/", data_valid, headers=auth_headers)
+ assert req.status == HTTP_200
+ pip_id = list(req.data['pdps'])[0]
+
+ req = hug.test.patch(pdp, "pdp/{}".format(pip_id), data_no_project_no_pipeline, headers=auth_headers)
+ assert req.status == HTTP_200
+ with pytest.raises(exceptions.PdpContentError) as exception_info:
+ req = hug.test.patch(pdp, "pdp/{}".format(pip_id), data_no_pipeline, headers=auth_headers)
+ assert "400: Pdp Error" == str(exception_info.value)
-def get_pdp(client):
- req = client.get("/pdp")
- pdp = utilities.get_json(req.data)
- return req, pdp
+ with pytest.raises(exceptions.PdpContentError) as exception_info:
+ req = hug.test.patch(pdp, "pdp/{}".format(pip_id), data_no_project, headers=auth_headers)
+ assert "400: Pdp Error" == str(exception_info.value)
+
+def test_add_pdp(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [policy_id],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ req = hug.test.post(pdp, "pdp/", data, headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ found = False
+ assert "pdps" in req.data
+ for value in req.data["pdps"].values():
+ if value['name'] == data['name']:
+ found = True
+ assert value["description"] == "description of {}".format("testuser")
+ assert value["vim_project_id"] == "vim_project_id"
+ break
+ assert found
-def add_pdp(client, data):
- req = client.post("/pdp", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- pdp = utilities.get_json(req.data)
- return req, pdp
+def test_add_pdp_name_existed(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id1 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ name = "testuser" + uuid4().hex
+ data = {
+ "name": name,
+ "security_pipeline": [policy_id1],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ req = hug.test.post(pdp, "pdp/", data, headers=auth_headers)
+ assert req.status == HTTP_200
-def delete_pdp(client, key):
- req = client.delete("/pdp/{}".format(key))
- return req
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id2 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data = {
+ "name": name,
+ "security_pipeline": [policy_id2],
+ "vim_project_id": "vim_project_id" + uuid4().hex,
+ "description": "description of testuser" + uuid4().hex
+ }
+ with pytest.raises(exceptions.PdpExisting) as exception_info:
+ req = hug.test.post(pdp, "pdp/", data, headers=auth_headers)
+ assert "409: Pdp Error" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data['message'] == '409: Pdp Error'
-def delete_pdp_without_id(client):
- req = client.delete("/pdp/{}".format(""))
- return req
+def test_add_pdp_policy_used(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id1 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
-def test_get_pdp():
- client = utilities.register_client()
- req, pdp = get_pdp(client)
- assert req.status_code == 200
- assert isinstance(pdp, dict)
- assert "pdps" in pdp
+ data = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [policy_id1],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ req = hug.test.post(pdp, "pdp/", data, headers=auth_headers)
+ assert req.status == HTTP_200
+
+ name_uuid = "testuser" + uuid4().hex
+ data = {
+ "name": name_uuid,
+ "security_pipeline": [policy_id1],
+ "vim_project_id": "vim_project_id " + name_uuid,
+ "description": "description of testuser " + name_uuid
+ }
+ with pytest.raises(exceptions.PdpInUse) as exception_info:
+ req = hug.test.post(pdp, "pdp/", data, headers=auth_headers)
+ assert "400: Pdp Inuse" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data['message'] == '409: Pdp Conflict'
-def test_add_pdp():
+
+def test_delete_pdp(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
data = {
+ "name": "testuser" + uuid4().hex,
+ "security_pipeline": [policy_id],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+ req = hug.test.post(pdp, "pdp/", data, headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ req = hug.test.get(pdp, 'pdp/', headers=auth_headers)
+ success_req = None
+ for key, value in req.data['pdps'].items():
+ if value['name'] == data['name']:
+ success_req = hug.test.delete(pdp, 'pdp/{}'.format(key), headers=auth_headers)
+ break
+ assert success_req
+ assert success_req.status == HTTP_200
+
+
+# Fixme: should re-enabled the input validation for those tests
+# def test_add_pdp_with_forbidden_char_in_user():
+# data = {
+# "name": "<a>",
+# "security_pipeline": ["policy_id_1", "policy_id_2"],
+# "vim_project_id": "vim_project_id",
+# "description": "description of testuser"
+# }
+# req = hug.test.post(pdp, "pdp/", data)
+# assert req.status == HTTP_400
+# print(req.data)
+# assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+#
+#
+# def test_add_pdp_with_forbidden_char_in_keystone():
+# data = {
+# "name": "testuser",
+# "security_pipeline": ["policy_id_1", "policy_id_2"],
+# "vim_project_id": "<a>",
+# "description": "description of testuser"
+# }
+# req = hug.test.post(pdp, "pdp/", data)
+# assert req.status == 400
+# assert req.data["message"] == "Key: 'vim_project_id', [Forbidden characters in string]"
+
+
+def test_update_pdp(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data_add = {
"name": "testuser",
+ "security_pipeline": [policy_id],
+ "vim_project_id": "vim_project_id",
+ "description": "description of testuser"
+ }
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id_update = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data_update = {
+ "name": "testuser_updated",
+ "security_pipeline": [policy_id_update],
+ "vim_project_id": "vim_project_id_update",
+ "description": "description of testuser_updated"
+ }
+ req = hug.test.post(pdp, "pdp/", data_add, headers=auth_headers)
+ pdp_id = list(req.data['pdps'])[0]
+ req_update = hug.test.patch(pdp, "pdp/{}".format(pdp_id), data_update, headers=auth_headers)
+ assert req_update.status == HTTP_200
+ value = list(req_update.data["pdps"].values())[0]
+ assert value["vim_project_id"] == data_update["vim_project_id"]
+ assert value["description"] == data_update["description"]
+ assert value["name"] == data_update['name']
+ assert value["security_pipeline"] == data_update['security_pipeline']
+ req = hug.test.get(pdp, 'pdp/', headers=auth_headers)
+ for key, value in req.data['pdps'].items():
+ if value['name'] == "testuser":
+ hug.test.delete(pdp, 'pdp/{}'.format(key), headers=auth_headers)
+ break
+
+
+def test_update_pdp_without_id(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ req = hug.test.patch(pdp, "pdp/", "testuser", headers=auth_headers)
+ assert req.status == HTTP_405
+ # assert req.data["message"] == 'Invalid Key :name not found'
+
+
+def test_update_pdp_without_user(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ data = {
+ "name": "",
"security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id",
+ "vim_project_id": "vim_project_id",
"description": "description of testuser"
}
- client = utilities.register_client()
- req, pdp = add_pdp(client, data)
- assert req.status_code == 200
- assert isinstance(pdp, dict)
- value = list(pdp["pdps"].values())[0]
- assert "pdps" in pdp
- assert value['name'] == "testuser"
- assert value["description"] == "description of {}".format("testuser")
- assert value["keystone_project_id"] == "keystone_project_id"
+ req = hug.test.patch(pdp, "pdp/<a>", data, headers=auth_headers)
+ assert req.status == HTTP_400
+ print(req.data)
+ assert req.data["errors"] == {'uuid': 'Invalid UUID provided'}
-def test_delete_pdp():
- client = utilities.register_client()
- request, pdp = get_pdp(client)
- for key, value in pdp['pdps'].items():
- if value['name'] == "testuser":
- success_req = delete_pdp(client, key)
+def test_update_pdp_name_existed(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id1 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ uuid1 = uuid4().hex
+ data1 = {
+ "name": "testuser1" + uuid1,
+ "security_pipeline": [policy_id1],
+ "vim_project_id": "vim_project_id" + uuid1,
+ "description": "description of testuser1" + uuid1
+ }
+ req = hug.test.post(pdp, "pdp/", data1, headers=auth_headers)
+ assert req.status == HTTP_200
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id2 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+
+ uuid2 = uuid4().hex
+ data2 = {
+ "name": "testuser2" + uuid2,
+ "security_pipeline": [policy_id2],
+ "vim_project_id": "vim_project_id" + uuid2,
+ "description": "description of testuser2" + uuid2
+ }
+ req = hug.test.post(pdp, "pdp/", data2, headers=auth_headers)
+ pdp_id = list(req.data['pdps'])[0]
+ for item in list(req.data['pdps']):
+ if req.data['pdps'][item]['name']==data2['name']:
+ pdp_id=item
+ break
+ data2['name'] = data1['name']
+ with pytest.raises(exceptions.PdpExisting) as exception_info:
+ req_update = hug.test.patch(pdp, "pdp/{}".format(pdp_id), data2, headers=auth_headers)
+ # assert req_update.data['message'] == '409: Pdp Error'
+ assert "409: Pdp Error" == str(exception_info.value)
+
+
+
+def test_update_pdp_policy_used(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import pdp
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:20000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id1 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ uuid1 = uuid4().hex
+ data1 = {
+ "name": "testuser1" + uuid1,
+ "security_pipeline": [policy_id1],
+ "vim_project_id": "vim_project_id" + uuid1,
+ "description": "description of testuser1" + uuid1
+ }
+ req = hug.test.post(pdp, "pdp/", data1, headers=auth_headers)
+ assert req.status == HTTP_200
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id2 = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+
+ uuid2 = uuid4().hex
+ data2 = {
+ "name": "testuser2" + uuid2,
+ "security_pipeline": [policy_id2],
+ "vim_project_id": "vim_project_id" + uuid2,
+ "description": "description of testuser2" + uuid2
+ }
+ req = hug.test.post(pdp, "pdp/", data2, headers=auth_headers)
+ pdp_id = list(req.data['pdps'])[0]
+ for item in list(req.data['pdps']):
+ if req.data['pdps'][item]['name']==data2['name']:
+ pdp_id=item
break
- assert success_req.status_code == 200
+ data2['security_pipeline'] = data1['security_pipeline']
+
+ with pytest.raises(exceptions.PdpInUse) as exception_info:
+ req_update = hug.test.patch(pdp, "pdp/{}".format(pdp_id), data2, headers=auth_headers)
+ assert "400: Pdp Inuse" == str(exception_info.value)
+ # assert req_update.data['message'] == '409: Pdp Conflict'
+
+
diff --git a/moon_manager/tests/unit_python/api/test_perimeter.py b/moon_manager/tests/unit_python/api/test_perimeter.py
index db09780f..c741adf7 100644
--- a/moon_manager/tests/unit_python/api/test_perimeter.py
+++ b/moon_manager/tests/unit_python/api/test_perimeter.py
@@ -1,157 +1,1304 @@
-# import moon_manager
-# import moon_manager.api
-import json
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
import api.utilities as utilities
+from helpers import data_builder as builder
+import helpers.policy_helper as policy_helper
+from uuid import uuid4
+import pytest
+from moon_utilities import exceptions
-def get_subjects(client):
- req = client.get("/subjects")
- assert req.status_code == 200
+def get_subjects(subject_id=None):
+ from moon_manager.api import perimeter
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ if not subject_id:
+ req = hug.test.get(perimeter, 'subjects/', headers=auth_headers)
+ else:
+ req = hug.test.get(perimeter, 'subjects/{}'.format(subject_id), headers=auth_headers)
subjects = utilities.get_json(req.data)
+ return req, subjects
+
+
+def add_subjects(policy_id, name, perimeter_id=None, data=None, auth_headers=None):
+ from moon_manager.api import perimeter
+ if not data:
+ name = name + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ if not perimeter_id:
+ req = hug.test.post(perimeter, "/policies/{}/subjects".format(policy_id),
+ body=data, headers=auth_headers)
+ else:
+ req = hug.test.post(perimeter, "/policies/{}/subjects/{}".format(policy_id, perimeter_id),
+ body=data, headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ return req, subjects
+
+
+def delete_subjects_without_perimeter_id(auth_headers=None):
+ from moon_manager.api import perimeter
+ req = hug.test.delete(perimeter, "/subjects/{}".format(""), headers=auth_headers)
+ return req
+
+
+def test_perimeter_get_subject():
+ req, subjects = get_subjects()
+ assert req.status == hug.HTTP_200
assert isinstance(subjects, dict)
assert "subjects" in subjects
- return subjects
-def add_subjects(client, name):
+def test_perimeter_add_subject():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ req, subjects = add_subjects(policy_id, "testuser", auth_headers=auth_headers)
+ value = list(subjects["subjects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value["name"]
+ assert value["email"]
+
+
+def test_perimeter_add_same_subject_perimeter_id_with_new_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ name = "testuser"
+ perimeter_id = uuid4().hex
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ add_subjects(policy_id1, data['name'], perimeter_id=perimeter_id, data=data,
+ auth_headers=auth_headers)
+ policies2 = policy_helper.add_policies()
+ policy_id2 = list(policies2.keys())[0]
+ req, subjects = add_subjects(policy_id2, data['name'],
+ perimeter_id=perimeter_id, data=data,
+ auth_headers=auth_headers)
+ value = list(subjects["subjects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value["name"]
+ assert value["email"]
+ assert len(value['policy_list']) == 2
+ assert policy_id1 in value['policy_list']
+ assert policy_id2 in value['policy_list']
+
+
+def test_perimeter_add_same_subject_perimeter_id_with_different_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id = uuid4().hex
+ add_subjects(policy_id1, "testuser", perimeter_id=perimeter_id, auth_headers=auth_headers)
+ policies2 = policy_helper.add_policies()
+ policy_id2 = list(policies2.keys())[0]
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req, subjects = add_subjects(policy_id2, "testuser", perimeter_id=perimeter_id,
+ auth_headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_add_same_subject_name_with_new_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id = uuid4().hex
+ name = "testuser" + uuid4().hex
data = {
"name": name,
"description": "description of {}".format(name),
"password": "password for {}".format(name),
"email": "{}@moon".format(name)
}
- req = client.post("/subjects", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 200
- subjects = utilities.get_json(req.data)
- assert isinstance(subjects, dict)
- key = list(subjects["subjects"].keys())[0]
+ req, subjects = add_subjects(policy_id1, None, perimeter_id=perimeter_id, data=data,
+ auth_headers=auth_headers)
+ policies2 = policy_helper.add_policies()
+ policy_id2 = list(policies2.keys())[0]
value = list(subjects["subjects"].values())[0]
- assert "subjects" in subjects
- assert key == "1111111111111"
- assert value['id'] == "1111111111111"
- assert value['name'] == name
- assert value["description"] == "description of {}".format(name)
- assert value["email"] == "{}@moon".format(name)
- return subjects
+ data = {
+ "name": value['name'],
+ "description": "description of {}".format(value['name']),
+ "password": "password for {}".format(value['name']),
+ "email": "{}@moon".format(value['name'])
+ }
+ req, subjects = add_subjects(policy_id2, None, data=data, auth_headers=auth_headers)
+ value = list(subjects["subjects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value["name"]
+ assert value["email"]
+ assert len(value['policy_list']) == 2
+ assert policy_id1 in value['policy_list']
+ assert policy_id2 in value['policy_list']
-def add_subjects_without_name(client, name):
+def test_perimeter_add_same_subject_name_with_same_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id = uuid4().hex
+ name = "testuser" + uuid4().hex
data = {
"name": name,
"description": "description of {}".format(name),
"password": "password for {}".format(name),
"email": "{}@moon".format(name)
}
- req = client.post("/subjects", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 500
+ req, subjects = add_subjects(policy_id1, None, perimeter_id=perimeter_id,
+ data=data, auth_headers=auth_headers)
+ value = list(subjects["subjects"].values())[0]
+ data = {
+ "name": value['name'],
+ "description": "description of {}".format(value['name']),
+ "password": "password for {}".format(value['name']),
+ "email": "{}@moon".format(value['name'])
+ }
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req, subjects = add_subjects(policy_id1, None, data=data, auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
-def delete_subject(client, name):
- subjects = get_subjects(client)
- for key, value in subjects['subjects'].items():
- if value['name'] == name:
- req = client.delete("/subjects/{}".format(key))
- assert req.status_code == 200
- break
- subjects = get_subjects(client)
- assert name not in [x['name'] for x in subjects["subjects"].values()]
+def test_perimeter_add_same_subject_perimeter_id_with_existed_policy_id_in_list():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ name = "testuser" + uuid4().hex
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ subj_id = "b34e5a29-5494-4cc5-9356-daa244b8c254"
+ req, subjects = get_subjects(subj_id)
+ if subjects['subjects']:
+ for __policy_id in subjects['subjects'][subj_id]['policy_list']:
+ req = hug.test.delete(perimeter,
+ "/policies/{}/subjects/{}".format(__policy_id, subj_id),
+ headers=auth_headers)
+ req, subjects = add_subjects(policy_id, name, data=data, auth_headers=auth_headers)
+ perimeter_id = list(subjects["subjects"].values())[0]['id']
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req, subjects = add_subjects(policy_id, name, perimeter_id=perimeter_id, data=data,
+ auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_subject_invalid_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ name = "testuser"
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req, subjects = add_subjects( policy_id + "0", "testuser", data, auth_headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_subject_blank_data():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ with pytest.raises(exceptions.ValidationKeyError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/subjects".format(policy_id), body={'test':"aa"},
+ headers=auth_headers)
+ assert "Invalid Key :name not found" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == 'Invalid Key :name not found'
+
+
+def test_perimeter_add_subject_with_forbidden_char_in_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "<a>",
+ "description": "description of {}".format(""),
+ "password": "password for {}".format(""),
+ "email": "{}@moon".format("")
+ }
+ subj_id = "a34e5a29-5494-4cc5-9356-daa244b8c888"
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/subjects".format(subj_id), body=data,
+ headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_update_subject_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ req, subjects = add_subjects(policy_id, "testuser", auth_headers=auth_headers)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/subjects/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["subjects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] == value2['description']
+
+
+def test_perimeter_update_subject_description():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ req, subjects = add_subjects(policy_id, "testuser", auth_headers=auth_headers)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update",
+ }
+ req = hug.test.patch(perimeter, "/subjects/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["subjects"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+def test_perimeter_update_subject_description_and_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
-def test_subject():
- client = utilities.register_client()
- get_subjects(client)
- add_subjects(client, "testuser")
- add_subjects_without_name(client, "")
- delete_subject(client, "testuser")
+ req, subjects = add_subjects(policy_id, "testuser", auth_headers=auth_headers)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update",
+ 'name': value1['name'] + "update"
+ }
+ from moon_manager.api import perimeter
+ req = hug.test.patch(perimeter, "/subjects/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["subjects"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_subject_wrong_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, subjects = add_subjects(policy_id=policy_id1, name='testuser', data=data,
+ auth_headers=auth_headers)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req = hug.test.patch(perimeter, "/subjects/{}".format(perimeter_id + "wrong"),
+ body=data, headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Perimeter content is invalid.'
-def get_objects(client):
- req = client.get("/objects")
- assert req.status_code == 200
+def test_perimeter_update_subject_name_with_existed_one():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name1 = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id1 = uuid4().hex
+ req, subjects = add_subjects(policy_id=policy_id1, name=name1,
+ perimeter_id=perimeter_id1, auth_headers=auth_headers)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id2 = uuid4().hex
+ name2 = 'testuser' + uuid4().hex
+ req, subjects = add_subjects(policy_id=policy_id1, name=name2,
+ perimeter_id=perimeter_id2, auth_headers=auth_headers)
+ data = {
+ 'name': value1['name'],
+ }
+ with pytest.raises(exceptions.SubjectExisting) as exception_info:
+ req = hug.test.patch(perimeter, "/subjects/{}".format(perimeter_id2), body=data,
+ headers=auth_headers)
+ assert "409: Subject Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+
+
+def test_perimeter_delete_subject():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ req, subjects = add_subjects(policy_id, "testuser", auth_headers=auth_headers)
+ subject_id = list(subjects["subjects"].values())[0]["id"]
+ req = hug.test.delete(perimeter, "/policies/{}/subjects/{}".format(policy_id, subject_id),
+ headers=auth_headers)
+ assert req.status == hug.HTTP_200
+
+
+def test_perimeter_delete_subjects_without_perimeter_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ with pytest.raises(exceptions.SubjectUnknown) as exception_info:
+ req = delete_subjects_without_perimeter_id(auth_headers)
+ assert "400: Subject Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Subject Unknown"
+
+
+def get_objects():
+ from moon_manager.api import perimeter
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(perimeter, "/objects", headers=auth_headers)
objects = utilities.get_json(req.data)
+ return req, objects
+
+
+def add_objects(name, policyId=None, data=None, perimeter_id=None, auth_headers=None):
+ from moon_manager.api import perimeter
+ if not policyId:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policyId = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ if not data:
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ }
+ if not perimeter_id:
+ req = hug.test.post(perimeter, "/policies/{}/objects/".format(policyId), body=data,
+ headers=auth_headers)
+ else:
+ req = hug.test.post(perimeter, "/policies/{}/objects/{}".format(policyId, perimeter_id),
+ body=data, headers=auth_headers)
+
+ objects = utilities.get_json(req.data)
+ return req, objects
+
+
+def delete_objects_without_perimeter_id(auth_headers=None):
+ from moon_manager.api import perimeter
+ req = hug.test.delete(perimeter, "/objects/{}".format(""), headers=auth_headers)
+ return req
+
+
+def test_perimeter_get_object():
+
+ req, objects = get_objects()
+ assert req.status == hug.HTTP_200
assert isinstance(objects, dict)
assert "objects" in objects
- return objects
-def add_objects(client, name):
+def test_perimeter_add_object():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, objects = add_objects("testuser", auth_headers=auth_headers)
+ value = list(objects["objects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value['name']
+
+
+def test_perimeter_add_object_with_wrong_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req, objects = add_objects("testuser", policyId='wrong', auth_headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_object_with_policy_id_none():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "testuser" + uuid4().hex,
+ "description": "description of {}".format("testuser"),
+ }
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/objects/".format(None), body=data,
+ headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_same_object_name_with_new_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, objects = add_objects("testuser", auth_headers=auth_headers)
+ value1 = list(objects["objects"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data, auth_headers=auth_headers)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_object_perimeter_id_with_new_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, objects = add_objects( "testuser", auth_headers=auth_headers)
+ value1 = list(objects["objects"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ perimeter_id=value1['id'],auth_headers=auth_headers)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_object_perimeter_id_with_different_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, objects = add_objects( "testuser", auth_headers=auth_headers)
+ value1 = list(objects["objects"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'] + 'different',
+ "description": "description of {}".format('testuser'),
+ }
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ perimeter_id=value1['id'], auth_headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_add_same_object_name_with_same_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
data = {
"name": name,
- "description": "description of {}".format(name),
+ "description": "description of {}".format('testuser'),
}
- req = client.post("/objects", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 200
- objects = utilities.get_json(req.data)
- assert isinstance(objects, dict)
- key = list(objects["objects"].keys())[0]
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data, auth_headers=auth_headers)
value = list(objects["objects"].values())[0]
- assert "objects" in objects
- assert value['name'] == name
- assert value["description"] == "description of {}".format(name)
- return objects
+ assert req.status == hug.HTTP_200
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data, auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
-def delete_objects(client, name):
- objects = get_objects(client)
- for key, value in objects['objects'].items():
- if value['name'] == name:
- req = client.delete("/objects/{}".format(key))
- assert req.status_code == 200
- break
- objects = get_objects(client)
- assert name not in [x['name'] for x in objects["objects"].values()]
+def test_perimeter_add_same_object_perimeter_id_with_existed_policy_id_in_list():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects( 'testuser', policyId=policy_id1, data=data,
+ auth_headers=auth_headers)
+ value = list(objects["objects"].values())[0]
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ perimeter_id=value['id'], auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
-def test_objects():
- client = utilities.register_client()
- get_objects(client)
- add_objects(client, "testuser")
- delete_objects(client, "testuser")
+def test_perimeter_update_object_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ auth_headers=auth_headers)
-def get_actions(client):
- req = client.get("/actions")
- assert req.status_code == 200
- actions = utilities.get_json(req.data)
- assert isinstance(actions, dict)
- assert "actions" in actions
- return actions
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/objects/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+
+ objects = utilities.get_json(req.data)
+ value2 = list(objects["objects"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] == value2['description']
-def add_actions(client, name):
+def test_perimeter_update_object_description():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
data = {
"name": name,
- "description": "description of {}".format(name),
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ auth_headers=auth_headers)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/objects/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+
+ objects = utilities.get_json(req.data)
+ value2 = list(objects["objects"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_object_description_and_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ auth_headers=auth_headers)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/objects/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+
+ objects = utilities.get_json(req.data)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_object_wrong_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data,
+ auth_headers=auth_headers)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req = hug.test.patch(perimeter, "/objects/{}".format(perimeter_id + "wrong"), body=data,
+ headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+
+
+def test_perimeter_update_object_name_with_existed_one():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data1 = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data1,
+ auth_headers=auth_headers)
+ value1 = list(objects["objects"].values())[0]
+
+ name = 'testuser' + uuid4().hex
+
+ data2 = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects('testuser', policyId=policy_id1, data=data2,
+ auth_headers=auth_headers)
+
+ value2 = list(objects["objects"].values())[0]
+ perimeter_id2 = value2['id']
+
+ data3 = {
+ 'name': value1['name']
}
- req = client.post("/actions", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 200
+ with pytest.raises(exceptions.ObjectExisting) as exception_info:
+ req = hug.test.patch(perimeter, "/objects/{}".format(perimeter_id2), body=data3,
+ headers=auth_headers)
+ assert "409: Object Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Object Existing'
+
+
+def test_perimeter_add_object_without_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "<br/>",
+ "description": "description of {}".format(""),
+ }
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/objects/".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body=data, headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_add_object_blank_data():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ with pytest.raises(exceptions.ValidationKeyError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/objects/".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body={}, headers=auth_headers)
+ assert "Invalid Key :name not found" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == 'Invalid Key :name not found'
+
+
+def test_perimeter_add_object_with_name_contain_spaces():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "test<a>user",
+ "description": "description of {}".format("test user"),
+ }
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/objects/".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"), body=data,
+ headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_add_object_with_name_space():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": " ",
+ "description": "description of {}".format("test user"),
+ }
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/objects/".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body =data, headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_delete_object():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ object_id = builder.create_object(policy_id)
+ req = hug.test.delete(perimeter, "/policies/{}/objects/{}".format(policy_id, object_id), headers=auth_headers)
+
+ assert req.status == hug.HTTP_200
+
+
+def test_perimeter_delete_objects_without_perimeter_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ with pytest.raises(exceptions.ObjectUnknown) as exception_info:
+ req = delete_objects_without_perimeter_id(auth_headers=auth_headers)
+ assert "400: Object Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Object Unknown"
+
+
+def get_actions():
+ from moon_manager.api import perimeter
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.get(perimeter, "/actions", headers=auth_headers)
+ actions = utilities.get_json(req.data)
+ return req, actions
+
+
+def add_actions(name, policy_id=None, data=None, perimeter_id=None, auth_headers=None):
+ from moon_manager.api import perimeter
+ if not policy_id:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+
+ if not data:
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ }
+ if not perimeter_id:
+ req = hug.test.post(perimeter, "/policies/{}/actions/".format(policy_id), body=data,
+ headers=auth_headers)
+ else:
+ req = hug.test.post(perimeter, "/policies/{}/actions/{}".format(policy_id, perimeter_id),
+ body=data, headers=auth_headers)
+
actions = utilities.get_json(req.data)
+ return req, actions
+
+
+def delete_actions_without_perimeter_id(auth_headers=None):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ req = hug.test.delete(perimeter, "/actions/{}".format(""), headers=auth_headers)
+ return req
+
+
+def test_perimeter_get_actions():
+
+ req, actions = get_actions()
+
+ assert req.status == hug.HTTP_200
assert isinstance(actions, dict)
- key = list(actions["actions"].keys())[0]
- value = list(actions["actions"].values())[0]
assert "actions" in actions
- assert value['name'] == name
- assert value["description"] == "description of {}".format(name)
- return actions
-
-
-def delete_actions(client, name):
- actions = get_actions(client)
- for key, value in actions['actions'].items():
- if value['name'] == name:
- req = client.delete("/actions/{}".format(key))
- assert req.status_code == 200
- break
- actions = get_actions(client)
- assert name not in [x['name'] for x in actions["actions"].values()]
-
-
-def test_actions():
- client = utilities.register_client()
- get_actions(client)
- add_actions(client, "testuser")
- delete_actions(client, "testuser")
+
+
+def test_perimeter_add_actions():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value = list(actions["actions"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value['name']
+
+
+def test_perimeter_add_action_with_wrong_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req, actions = add_actions("testuser", policy_id="wrong", auth_headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_action_with_policy_id_none():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "testuser" + uuid4().hex,
+ "description": "description of {}".format("testuser"),
+ }
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/actions/".format(None), body=data,
+ headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_same_action_name_with_new_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, action = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(action["actions"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions('testuser', policy_id=policy_id1, data=data,
+ auth_headers=auth_headers)
+ value2 = list(action["actions"].values())[0]
+ assert req.status == hug.HTTP_200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_action_perimeter_id_with_new_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, action = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(action["actions"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions('testuser', policy_id=policy_id1, data=data,
+ perimeter_id=value1['id'], auth_headers=auth_headers)
+ value2 = list(action["actions"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_action_perimeter_id_with_different_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, action = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(action["actions"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'] + 'different',
+ "description": "description of {}".format('testuser'),
+ }
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req, action = add_actions('testuser', policy_id=policy_id1, data=data,
+ perimeter_id=value1['id'], auth_headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_add_same_action_name_with_same_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ req, action = add_actions("testuser", policy_id=policy_id1, auth_headers=auth_headers)
+ value1 = list(action["actions"].values())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req, action = add_actions('testuser', policy_id=policy_id1, data=data,
+ auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_same_action_perimeter_id_with_existed_policy_id_in_list():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ req, action = add_actions("testuser", policy_id=policy_id1, auth_headers=auth_headers)
+ value1 = list(action["actions"].values())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req, action = add_actions('testuser', policy_id=policy_id1, data=data,
+ perimeter_id=value1['id'], auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_actions_without_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "<a>",
+ "description": "description of {}".format(""),
+ }
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/actions".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body=data, headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_add_actions_with_name_contain_spaces():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "test<a>user",
+ "description": "description of {}".format("test user"),
+ }
+ with pytest.raises(exceptions.ValidationContentError) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/actions".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body=data, headers=auth_headers)
+ assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_subjects_without_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "testuser",
+ "description": "description of {}".format("test user"),
+ }
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/subjects".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body=data, headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+def test_add_objects_without_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "testuser",
+ "description": "description of {}".format("test user"),
+ }
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/objects".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"),
+ body=data, headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+def test_add_action_without_policy_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ data = {
+ "name": "testuser",
+ "description": "description of {}".format("test user"),
+ }
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.post(perimeter, "/policies/{}/actions".format(
+ "a34e5a29-5494-4cc5-9356-daa244b8c888"), body=data,
+ headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+def test_perimeter_update_action_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/actions/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["actions"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] == value2['description']
+
+
+def test_perimeter_update_actions_description():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/actions/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["actions"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_actions_description_and_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = hug.test.patch(perimeter, "/actions/{}".format(perimeter_id), body=data,
+ headers=auth_headers)
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["actions"].values())[0]
+
+ assert req.status == hug.HTTP_200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_action_wrong_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ with pytest.raises(exceptions.PerimeterContentError) as exception_info:
+ req = hug.test.patch(perimeter, "/actions/{}".format(perimeter_id + "wrong"), body=data,
+ headers=auth_headers)
+ assert "400: Perimeter content is invalid." == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_update_action_name_with_existed_one():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value1 = list(actions["actions"].values())[0]
+ req, actions = add_actions("testuser", auth_headers=auth_headers)
+ value2 = list(actions["actions"].values())[0]
+ perimeter_id2 = value2['id']
+ data = {
+ 'name': value1['name'],
+ }
+ with pytest.raises(exceptions.ActionExisting) as exception_info:
+ req = hug.test.patch(perimeter, "/actions/{}".format(perimeter_id2), body=data,
+ headers=auth_headers)
+ assert "409: Action Existing" == str(exception_info.value)
+ # assert req.status == hug.HTTP_409
+ # assert req.data["message"] == '409: Action Existing'
+
+
+def test_perimeter_delete_actions():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ action_id = builder.create_action(policy_id)
+ req = hug.test.delete(perimeter, "/policies/{}/actions/{}".format(policy_id, action_id),
+ headers=auth_headers)
+
+
+ assert req.status == hug.HTTP_200
+
+def test_delete_subject_assigned_to_policy():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ from moon_manager.db_driver import PolicyManager
+
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ subject_id = builder.create_subject(policy_id)
+ PolicyManager.delete_policy(moon_user_id="admin", policy_id=policy_id)
+ PolicyManager.delete_subject(moon_user_id="admin", policy_id=None ,perimeter_id=subject_id)
+
+ req = hug.test.get(perimeter, "subjects/{}".format(subject_id), headers=auth_headers)
+ assert req.data['subjects'] == {}
+
+
+def test_delete_subject_without_policy():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ subject_id = builder.create_subject(policy_id)
+
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.delete(perimeter, "/subjects/{}".format(subject_id), headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+def test_delete_objects_without_policy():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ object_id = builder.create_object(policy_id)
+
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.delete(perimeter, "/objects/{}".format(object_id), headers=auth_headers)
+
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+def test_delete_actions_without_policy():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import perimeter
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ action_id = builder.create_action(policy_id)
+
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.delete(perimeter, "/actions/{}".format(action_id), headers=auth_headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+def test_perimeter_delete_actions_without_perimeter_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ with pytest.raises(exceptions.ActionUnknown) as exception_info:
+ req = delete_actions_without_perimeter_id(auth_headers=auth_headers)
+ assert "400: Action Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Action Unknown"
diff --git a/moon_manager/tests/unit_python/api/test_perimeter_examples.py b/moon_manager/tests/unit_python/api/test_perimeter_examples.py
new file mode 100644
index 00000000..0598629c
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_perimeter_examples.py
@@ -0,0 +1,55 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+import json
+
+
+# def test_local_perimeter_get_subject():
+# from moon_manager.api import perimeter
+# subjects = perimeter.Subjects.get()
+# assert isinstance(subjects, dict)
+# assert "subjects" in subjects
+
+
+
+# def test_http_perimeter_post_subject():
+# from moon_manager.api import perimeter
+# result = hug.test.post(perimeter, 'subjects/b34e5a2954944cc59356daa244b8c254',
+# body={'name': 'ha'},
+# headers={'Content-Type': 'application/json'})
+# assert result.status == hug.HTTP_200
+# assert isinstance(result.data, dict)
+# assert "subjects" in result.data
+#
+#
+# def test_http_perimeter_get_subject_2():
+# from moon_manager.api import perimeter
+# result = hug.test.get(perimeter, 'subjects/b34e5a29-5494-4cc5-9356-daa244b8c254')
+# assert result.status == hug.HTTP_200
+# assert isinstance(result.data, dict)
+# assert "subjects" in result.data
+#
+# def test_http_perimeter_get_subject_3():
+# from moon_manager.api import perimeter
+# result = hug.test.get(perimeter, 'policies/b34e5a29-5494-4cc5-9356-daa244b8c254/subjects/')
+# assert result.status == hug.HTTP_200
+# assert isinstance(result.data, dict)
+# assert "subjects" in result.data
+#
+#
+# def test_http_perimeter_get_subject_4():
+# from moon_manager.api import perimeter
+# result = hug.test.get(perimeter, 'policies/b34e5a29-5494-4cc5-9356-daa244b8c254/subjects/b34e5a29-5494-4cc5-9356-daa244b8c254')
+# assert result.status == hug.HTTP_200
+# assert isinstance(result.data, dict)
+# assert "subjects" in result.data
diff --git a/moon_manager/tests/unit_python/api/test_policies.py b/moon_manager/tests/unit_python/api/test_policies.py
index 4d4e387e..a07ba725 100644
--- a/moon_manager/tests/unit_python/api/test_policies.py
+++ b/moon_manager/tests/unit_python/api/test_policies.py
@@ -1,69 +1,424 @@
-import json
-import api.utilities as utilities
+# Software Name: MOON
+# Version: 5.4
-def get_policies(client):
- req = client.get("/policies")
- policies = utilities.get_json(req.data)
- return req, policies
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
-def add_policies(client, name):
+
+from falcon import HTTP_200, HTTP_400, HTTP_405, HTTP_409
+import hug
+from uuid import uuid4
+import pytest
+from moon_utilities import exceptions
+from helpers import model_helper
+from helpers import policy_helper
+
+
+def get_policies(auth_headers):
+ from moon_manager.api import policy
+ req = hug.test.get(policy, "policies", headers=auth_headers)
+ return req
+
+
+def add_policies(name, auth_headers):
+ from moon_manager.api import policy
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
data = {
"name": name,
"description": "description of {}".format(name),
- "model_id": "modelId",
+ "model_id": model_id,
"genre": "genre"
}
- req = client.post("/policies", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- policies = utilities.get_json(req.data)
- return req, policies
-
-
-def delete_policies(client, name):
- request, policies = get_policies(client)
- for key, value in policies['policies'].items():
- if value['name'] == name:
- req = client.delete("/policies/{}".format(key))
- break
+ req = hug.test.post(policy, "policies", data, headers=auth_headers)
return req
-def delete_policies_without_id(client):
- req = client.delete("/policies/{}".format(""))
+def delete_policies_without_id(auth_headers):
+ from moon_manager.api import policy
+ req = hug.test.delete(policy, "policies/{}".format(""), headers=auth_headers)
return req
def test_get_policies():
- client = utilities.register_client()
- req, policies = get_policies(client)
- assert req.status_code == 200
- assert isinstance(policies, dict)
- assert "policies" in policies
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = get_policies(auth_headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ assert "policies" in req.data
def test_add_policies():
- client = utilities.register_client()
- req, policies = add_policies(client, "testuser")
- assert req.status_code == 200
- assert isinstance(policies, dict)
- value = list(policies["policies"].values())[0]
- assert "policies" in policies
- assert value['name'] == "testuser"
- assert value["description"] == "description of {}".format("testuser")
- assert value["model_id"] == "modelId"
- assert value["genre"] == "genre"
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policy_name = "testuser" + uuid4().hex
+ req = add_policies(policy_name, auth_headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ value = list(req.data["policies"].values())[0]
+ assert "policies" in req.data
+ assert value['name'] == policy_name
+ assert value["description"] == "description of {}".format(policy_name)
+
+
+def test_add_policies_without_model():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ policy_name = "testuser" + uuid4().hex
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": "",
+ "genre": "genre"
+ }
+ req = hug.test.post(policy, "policies/", data, headers=auth_headers)
+
+ assert req.status == HTTP_200
+
+
+def test_add_policies_with_same_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ name = uuid4().hex
+ policy_name = name
+ req = add_policies(policy_name, auth_headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ value = list(req.data["policies"].values())[0]
+ assert "policies" in req.data
+ assert value['name'] == policy_name
+ assert value["description"] == "description of {}".format(policy_name)
+ with pytest.raises(exceptions.PolicyExisting) as exception_info:
+ req = add_policies(policy_name, auth_headers=auth_headers)
+ assert "409: Policy Already Exists" == str(exception_info.value)
+ # assert req.status == HTTP_409
+ # assert req.data["message"] == '409: Policy Already Exists'
+
+
+def test_add_policy_with_empty_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policy_name = ""
+ with pytest.raises(exceptions.PolicyContentError) as exception_info:
+ req = add_policies(policy_name, auth_headers=auth_headers)
+ assert "400: Policy Content Error" == str(exception_info.value)
+ # assert req.status == HTTP_400
+ # assert req.data["message"] == '400: Policy Content Error'
+
+
+def test_add_policy_with_model_has_no_meta_rule():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_manager.api import policy
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policy_name = "testuser" + uuid4().hex
+ req = model_helper.add_model_without_meta_rule()
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ with pytest.raises(exceptions.MetaRuleUnknown) as exception_info:
+ hug.test.post(policy, "policies/", data, headers=auth_headers)
+ assert "400: Meta Rule Unknown" == str(exception_info.value)
+
+
+def test_add_policy_with_model_has_blank_subject_meta_rule():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ from moon_manager.api import policy
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ policy_name = "testuser" + uuid4().hex
+ req = model_helper.add_model_with_blank_subject_meta_rule()
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ with pytest.raises(exceptions.MetaRuleContentError) as exception_info:
+ hug.test.post(policy, "policies/", data, headers=auth_headers)
+ assert "400: Meta Rule Error" == str(exception_info.value)
+
+
+
+# FIXME: uncomment when model API is re-inserted
+# def test_update_policies_with_model():
+# from moon_manager.api import policy
+# policy_name = "testuser" + uuid4().hex
+# data = {
+# "name": policy_name,
+# "description": "description of {}".format(policy_name),
+# "model_id": "",
+# "genre": "genre"
+# }
+# req = hug.test.post(policy, "policies/", data)
+# policy_id = next(iter(req.data['policies']))
+# req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+# model_id = list(req.data.keys())[0]
+# data = {
+# "name": policy_name + "-2",
+# "description": "description of {}".format(policy_name),
+# "model_id": model_id,
+# "genre": "genre"
+# }
+# req = hug.test.patch("policies/{}".format(policy_id), data)
+# assert req.status == HTTP_200
+# assert req.data['policies'][policy_id]['name'] == policy_name + '-2'
+
+
+def test_update_policies_name_success():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ policy_name = "testuser" + uuid4().hex
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = hug.test.post(policy, "policies/", data, headers=auth_headers)
+ policy_id = next(iter(req.data['policies']))
+
+ data = {
+ "name": policy_name + "-2",
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = hug.test.patch(policy, "policies/{}".format(policy_id), data, headers=auth_headers)
+ assert req.status == HTTP_200
+ assert req.data['policies'][policy_id]['name'] == policy_name + '-2'
+
+
+def test_update_blank_policies_with_model():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ policy_name = uuid4().hex
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": "",
+ "genre": "genre"
+ }
+ req = hug.test.post(policy, "policies/", data, headers=auth_headers)
+ policy_id = next(iter(req.data['policies']))
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = hug.test.patch(policy, "policies/{}".format(policy_id), data, headers=auth_headers)
+ assert req.status == HTTP_200
+
+
+def test_update_policies_model_unused():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ policy_name = uuid4().hex
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = hug.test.post(policy, "policies/", data, headers=auth_headers)
+ policy_id = next(iter(req.data['policies']))
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+
+ with pytest.raises(exceptions.PolicyUpdateError) as exception_info:
+ req = hug.test.patch(policy, "policies/{}".format(policy_id), data, headers=auth_headers)
+ assert "400: Policy update error" == str(exception_info.value)
+
+
+# FIXME: uncomment when model API is re-inserted
+# def test_update_policy_name_with_existed_one():
+# from moon_manager.api import policy
+# policy_name1 = "testuser" + uuid4().hex
+# req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+# model_id = list(req.keys())[0]
+# data = {
+# "name": policy_name1,
+# "description": "description of {}".format(policy_name1),
+# "model_id": model_id,
+# "genre": "genre"
+# }
+# req = hug.test.post(policy, "policies/", data)
+# policy_id1 = next(iter(req.data['policies']))
+#
+# policy_name2 = "testuser" + uuid4().hex
+# eq = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+# model_id = list(req.data.keys())[0]
+# data = {
+# "name": policy_name2,
+# "description": "description of {}".format(policy_name2),
+# "model_id": model_id,
+# "genre": "genre"
+# }
+# req = hug.test.post(policy, "policies/", data)
+# policy_id2 = next(iter(req.data['policies']))
+#
+# data = {
+# "name": policy_name1,
+# "description": "description of {}".format(policy_name1),
+# "model_id": model_id,
+# "genre": "genre"
+# }
+# req = hug.test.patch(policy, "policies/{}".format(policy_id2), data)
+# assert req.status == HTTP_409
+# assert req.data["message"] == '409: Policy Already Exists'
+
+
+def test_update_policies_with_empty_name():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ policy_name = "testuser" + uuid4().hex
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = hug.test.post(policy, "policies/", data, headers=auth_headers)
+ policy_id = next(iter(req.data['policies']))
+
+ data = {
+ "name": "",
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ with pytest.raises(exceptions.PolicyContentError) as exception_info:
+ req = hug.test.patch(policy, "policies/{}".format(policy_id), data, headers=auth_headers)
+ assert "400: Policy Content Error" == str(exception_info.value)
+ # assert req.status == HTTP_400
+ # assert req.data["message"] == '400: Policy Content Error'
+
+
+def test_update_policies_with_blank_model():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ policy_name = "testuser" + uuid4().hex
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = hug.test.post(policy, "policies/", data, headers=auth_headers)
+ policy_id = next(iter(req.data['policies']))
+
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": "",
+ "genre": "genre"
+ }
+
+ with pytest.raises(exceptions.PolicyUpdateError) as exception_info:
+ req = hug.test.patch(policy, "policies/{}".format(policy_id), data, headers=auth_headers)
+ assert "400: Policy update error" == str(exception_info.value)
+
+
+# FIXME: uncomment when model API is re-inserted
+# def test_update_policies_connected_to_rules_with_blank_model():
+# from moon_manager.api import policy
+# req, rules, policy_id = data_builder.add_rules()
+# req = hug.test.get(policy, "policies")
+# for policy_obj_id in req.data['policies']:
+# if policy_obj_id == policy_id:
+# policy = req.data['policies'][policy_obj_id]
+# policy['model_id'] = ''
+# req = hug.test.patch("/policies/{}".format(policy_id), req.data)
+# assert req.status == HTTP_400
+# assert req.data["message"] == '400: Policy update error'
def test_delete_policies():
- client = utilities.register_client()
- req = delete_policies(client, "testuser")
- assert req.status_code == 200
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import policy
+ _policy = policy_helper.add_policies()
+ policy_id = list(_policy.keys())[0]
+ req = hug.test.delete(policy, "policies/{}".format(policy_id), headers=auth_headers)
+ assert req.status == HTTP_200
-def test_delete_policies_without_id():
- client = utilities.register_client()
- req = delete_policies_without_id(client)
- assert req.status_code == 500
+# FIXME: uncomment when rule API is re-inserted
+# def test_delete_policy_with_dependencies_rule():
+# from moon_manager.api import policy
+# req, rules, policy_id = data_builder.add_rules()
+# req = hug.test.delete(policy, "policies/{}".format(policy_id))
+# assert req.status == HTTP_400
+# assert req.data["message"] == '400: Policy With Rule Error'
+
+# FIXME: uncomment when perimeter API is re-inserted
+# def test_delete_policy_with_dependencies_subject_data():
+# from moon_manager.api import policy
+# req, rules, policy_id = data_builder.add_rules()
+# req = hug.test.delete(policy, "policies/{}/rules/{}".format(policy_id, next(iter(rules['rules']))))
+# assert req.status == HTTP_200
+# req = hug.test.delete(policy, "policies/{}".format(policy_id))
+# assert req.status == HTTP_400
+# assert req.data["message"] == '400: Policy With Data Error'
+
+
+# FIXME: uncomment when perimeter API is re-inserted
+# def test_delete_policy_with_dependencies_perimeter():
+# from moon_manager.api import policy
+# _policy = policy_helper.add_policies()
+# policy_id = next(iter(_policy))
+#
+# data = {
+# "name": 'testuser'+uuid4().hex,
+# "description": "description of {}".format(uuid4().hex),
+# "password": "password for {}".format(uuid4().hex),
+# "email": "{}@moon".format(uuid4().hex)
+# }
+# req = hug.test.post(policy, "policies/{}/subjects".format(policy_id), data)
+#
+# assert req.status == HTTP_200
+# req = hug.test.delete(policy, "policies/{}".format(policy_id))
+# assert req.status == HTTP_400
+# assert req.data["message"] == '400: Policy With Perimeter Error'
+
+
+def test_delete_policies_without_id():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = delete_policies_without_id(auth_headers=auth_headers)
+ assert req.status == HTTP_405
diff --git a/moon_manager/tests/unit_python/api/test_rules.py b/moon_manager/tests/unit_python/api/test_rules.py
index 0b302494..2bb7a96f 100644
--- a/moon_manager/tests/unit_python/api/test_rules.py
+++ b/moon_manager/tests/unit_python/api/test_rules.py
@@ -1,59 +1,333 @@
-import api.utilities as utilities
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import pytest
+from moon_utilities import exceptions
import json
+from helpers import data_builder as builder
+from helpers import policy_helper
+from helpers import rules_helper
+import hug
+
+def get_rules(policy_id):
+ from moon_manager.api import rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
-def get_rules(client, policy_id):
- req = client.get("/policies/{}/rules".format(policy_id))
- rules = utilities.get_json(req.data)
+ req = hug.test.get(rules, "/policies/{}/rules".format(policy_id), headers=auth_headers)
+ rules = req.data
return req, rules
-def add_rules(client, policy_id):
+def add_rules_without_policy_id(headers):
+ from moon_manager.api import rules
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
data = {
- "meta_rule_id": "meta_rule_id1",
+ "meta_rule_id": meta_rule_id,
+ "rule": [subject_category_id, object_category_id, action_category_id],
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.post(rules, "/policies/{}/rules".format(None), body=json.dumps(data),
+ headers=headers)
+ rules = req.data
+ return req, rules
+
+
+def add_rules_without_meta_rule_id(policy_id, headers):
+ from moon_manager.api import rules
+ data = {
+ "meta_rule_id": "",
"rule": ["subject_data_id2", "object_data_id2", "action_data_id2"],
- "instructions": (
+ "instructions": [
{"decision": "grant"},
- ),
+ ],
"enabled": True
}
- req = client.post("/policies/{}/rules".format(policy_id), data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- rules = utilities.get_json(req.data)
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers=headers)
+ rules = req.data
return req, rules
-def delete_rules(client, policy_id, meta_rule_id):
- req = client.delete("/policies/{}/rules/{}".format(policy_id, meta_rule_id))
+def add_rules_without_rule(policy_id, headers):
+ from moon_manager.api import rules
+ data = {
+ "meta_rule_id": "meta_rule_id1",
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+ headers['Content-Type'] = 'application/json'
+ req = hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers=headers)
+ rules = req.data
+ return req, rules
+
+
+def delete_rules(policy_id, meta_rule_id, headers):
+ from moon_manager.api import rules
+ req = hug.test.delete(rules, "/policies/{}/rules/{}".format(policy_id, meta_rule_id),
+ headers=headers)
+ return req
+
+
+def update_rule(policy_id, rule_id, instructions, headers):
+ from moon_manager.api import rules
+ req = hug.test.patch(rules, "/policies/{}/rules/{}".format(policy_id, rule_id),
+ headers=headers,
+ body=instructions)
return req
-def test_get_rules():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, rules = get_rules(client, policy_id)
- assert req.status_code == 200
+def test_add_rules_with_invalid_decision_instructions():
+ from moon_manager.api import rules
+
+ auth_headers = rules_helper.get_headers()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [subject_category_id, object_category_id, action_category_id],
+ "instructions": [
+ {"decision": "invalid"},
+ ],
+ "enabled": True
+ }
+
+ with pytest.raises(exceptions.RuleContentError) as exception_info:
+ hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers=auth_headers)
+ assert "400: Rule Error" == str(exception_info.value)
+
+
+def test_add_rules_with_meta_rule_not_linked_with_policy_model():
+ from moon_manager.api import rules
+
+ auth_headers = rules_helper.get_headers()
+ policy_id = builder.create_new_policy()[-1]
+ meta_rule_id = builder.create_new_meta_rule()[-1]
+
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": ["subject_data_id2", "object_data_id2", "action_data_id2"],
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+
+ with pytest.raises(exceptions.MetaRuleNotLinkedWithPolicyModel) as exception_info:
+ hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers=auth_headers)
+ assert "400: MetaRule Not Linked With Model - Policy" == str(exception_info.value)
+
+
+def test_add_rules_with_invalid_rule():
+ from moon_manager.api import rules
+
+ auth_headers = rules_helper.get_headers()
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ sub_data_id = builder.create_subject_data(policy_id, subject_category_id)
+ obj_data_id = builder.create_object_data(policy_id, object_category_id)
+ act_data_id = builder.create_action_data(policy_id, action_category_id)
+
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [obj_data_id, sub_data_id, act_data_id],
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+
+ with pytest.raises(exceptions.RuleContentError) as exception_info:
+ hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers=auth_headers)
+ assert "400: Rule Error" == str(exception_info.value)
+
+
+def test_add_rules_with_no_given_decision_instructions(policy_id=None):
+ from moon_manager.api import rules
+
+ auth_headers = rules_helper.get_headers()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ sub_data_id = builder.create_subject_data(policy_id, subject_category_id)
+ obj_data_id = builder.create_object_data(policy_id, object_category_id)
+ act_data_id = builder.create_action_data(policy_id, action_category_id)
+
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [sub_data_id, obj_data_id, act_data_id],
+ "instructions": [],
+ "enabled": True
+ }
+
+ req = hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers=auth_headers)
+
+ assert req.status == hug.HTTP_200
+
+ default_instruction = {"decision": "grant"}
+ rules = req.data['rules']
+ rule_id = next(iter(req.data['rules']))
+ assert rules[rule_id]["instructions"][0] == default_instruction
+
+
+def test_get_rules(policy_id=None):
+ if policy_id == None:
+ policy = policy_helper.add_policies()
+ policy_id = next(iter(policy))
+
+ req, rules = get_rules(policy_id)
+ assert req.status == hug.HTTP_200
assert isinstance(rules, dict)
assert "rules" in rules
return req, rules
def test_add_rules():
- policy_id = utilities.get_policy_id()
- client = utilities.register_client()
- req, rules = add_rules(client, policy_id)
- assert req.status_code == 200
- assert isinstance(rules, dict)
- value = rules["rules"]
- assert "rules" in rules
- id = list(value.keys())[0]
- assert value[id]["meta_rule_id"] == "meta_rule_id1"
+ req, rules, policy = builder.add_rules()
+ assert req.status == hug.HTTP_200
+
+
+def test_add_rules_without_policy_id():
+ from moon_manager.api import rules
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [subject_category_id, object_category_id, action_category_id],
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+
+ headers = rules_helper.get_headers()
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ req = hug.test.post(rules, "/policies/{}/rules".format(None), body=json.dumps(data),
+ headers=headers)
+ assert "400: Policy Unknown" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == "400: Policy Unknown"
+
+
+#
+# def test_add_rules_without_meta_rule_id():
+# policy_id = utilities.get_policy_id()
+# client = utilities.register_client()
+# req, rules = add_rules_without_meta_rule_id(client, policy_id)
+# assert req.status == 400
+# assert json.loads(req.data)["message"] == "Key: 'meta_rule_id', [Empty String]"
+
+def test_add_rules_without_rule():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ policy = policy_helper.add_policies()
+ policy_id = next(iter(policy))
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ with pytest.raises(exceptions.ValidationKeyError) as exception_info:
+ req, rules = add_rules_without_rule(policy_id, headers=auth_headers)
+ assert "Invalid Key :rule not found" == str(exception_info.value)
+ # assert req.status == hug.HTTP_400
+ # assert req.data["message"] == 'Invalid Key :rule not found'
-def test_delete_rules():
- client = utilities.register_client()
- policy_id = utilities.get_policy_id()
- req, added_rules = get_rules(client, policy_id)
- id = added_rules["rules"]['rules'][0]['id']
- rules = delete_rules(client, policy_id, id)
- assert rules.status_code == 200
+
+def test_update_rule_without_body():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req, rules, policy_id = builder.add_rules()
+ rule_id = list(rules['rules'].keys())[0]
+
+ req = update_rule(policy_id, rule_id, instructions=None, headers=auth_headers)
+
+ assert req.status == hug.HTTP_400
+
+
+def test_update_rule_without_instructions_in_body():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ data = {"instruction": [ # faute de frappe
+ {"decision": "deny"},
+ ]}
+
+ req, rules, policy_id = builder.add_rules()
+ rule_id = list(rules['rules'].keys())[0]
+
+ req = update_rule(policy_id, rule_id, instructions=None, headers=auth_headers)
+
+ assert req.status == hug.HTTP_400
+
+
+def test_update_rule():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req, rules, policy_id = builder.add_rules()
+ rule_id = list(rules['rules'].keys())[0]
+
+ data = {"instructions": [
+ {"decision": "deny"},
+ ]}
+ req = update_rule(policy_id, rule_id, data, headers=auth_headers)
+
+ rules = get_rules(policy_id)[1]['rules']['rules']
+
+ rule = None
+ for rule_ in rules:
+ if rule_['id'] == rule_id:
+ rule = rule_
+ break
+
+ assert req.status == hug.HTTP_200 and rule['instructions'][0]['decision'] == "deny"
+
+
+def test_delete_rules_with_invalid_parameters():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = delete_rules("", "", headers=auth_headers)
+ assert req.status == hug.HTTP_405
+
+
+def test_delete_rules_without_policy_id():
+ from moon_manager.api import rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ sub_data_id = builder.create_subject_data(policy_id, subject_category_id)
+ obj_data_id = builder.create_object_data(policy_id, object_category_id)
+ act_data_id = builder.create_action_data(policy_id, action_category_id)
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [sub_data_id, obj_data_id, act_data_id],
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+ hug.test.post(rules, "/policies/{}/rules".format(policy_id), body=json.dumps(data),
+ headers={'Content-Type': 'application/json',
+ "X-Api-Key": get_api_key_for_user("admin")})
+ req, added_rules = get_rules(policy_id)
+ id = list(added_rules["rules"]["rules"])[0]["id"]
+ rules = delete_rules(None, id, headers=auth_headers)
+ assert rules.status == hug.HTTP_200
diff --git a/moon_manager/tests/unit_python/api/test_slaves.py b/moon_manager/tests/unit_python/api/test_slaves.py
new file mode 100644
index 00000000..29d5e62e
--- /dev/null
+++ b/moon_manager/tests/unit_python/api/test_slaves.py
@@ -0,0 +1,90 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from falcon import HTTP_200, HTTP_400, HTTP_405
+import hug
+from uuid import uuid4
+from helpers import data_builder as builder
+
+
+def test_get_slaves():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import slave
+ req = hug.test.get(slave, 'slaves/', headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ assert "slaves" in req.data
+ for slave in req.data.get("slaves"):
+ assert "name" in slave
+ assert "description" in slave
+ assert "status" in slave
+ assert "server_ip" in slave
+ assert "port" in slave
+
+
+def test_add_slave(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import slave
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:10000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ data = {
+ "name": "test_slave_" + uuid4().hex,
+ "description": "description of test_slave"
+ }
+ req = hug.test.post(slave, "slave/", data, headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ found = False
+ assert "slaves" in req.data
+ for value in req.data["slaves"].values():
+ assert "name" in value
+ assert "description" in value
+ assert "api_key" in value
+ assert "process" in value
+ assert "log" in value
+ assert "extra" in value
+ if value['name'] == data['name']:
+ found = True
+ assert value["description"] == "description of test_slave"
+ assert "port" in value.get("extra")
+ assert "status" in value.get("extra")
+ assert "server_ip" in value.get("extra")
+ break
+ assert found
+
+
+def test_delete_slave(mocker):
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ from moon_manager.api import slave
+ mocker.patch('moon_manager.plugins.pyorchestrator.get_server_url',
+ return_value="http://127.0.0.1:10000")
+ mocker.patch("subprocess.Popen", return_value=True)
+ data = {
+ "name": "test_slave_" + uuid4().hex,
+ "description": "description of test_slave"
+ }
+ req = hug.test.post(slave, "slave/", data, headers=auth_headers)
+ assert req.status == HTTP_200
+ assert isinstance(req.data, dict)
+ req = hug.test.get(slave, 'slaves/', headers=auth_headers)
+ success_req = None
+ for key, value in req.data['slaves'].items():
+ if value['name'] == data['name']:
+ success_req = hug.test.delete(slave, 'slave/{}'.format(key), headers=auth_headers)
+ break
+ assert success_req
+ assert success_req.status == HTTP_200
+
diff --git a/moon_manager/tests/unit_python/api/utilities.py b/moon_manager/tests/unit_python/api/utilities.py
index ce897619..baf59a51 100644
--- a/moon_manager/tests/unit_python/api/utilities.py
+++ b/moon_manager/tests/unit_python/api/utilities.py
@@ -1,28 +1,16 @@
-import json
-
+# Software Name: MOON
-def get_json(data):
- return json.loads(data.decode("utf-8"))
+# Version: 5.4
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
-def register_client():
- import moon_manager.server
- server = moon_manager.server.create_server()
- client = server.app.test_client()
- return client
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
-def get_policy_id():
- import api.test_policies as policies
- client = register_client()
- policy_id = ''
- req, policy = policies.get_policies(client)
- for id in policy['policies']:
- if id:
- policy_id = id
- break
- print("policy id {}".format(policy_id))
- if not policy_id:
- policies.add_policies(client, "testuser")
- policy_id = get_policy_id()
- return policy_id
+import json
+from uuid import uuid4
+def get_json(data):
+ return data;#json.loads(data.decode("utf-8"))
diff --git a/moon_manager/tests/unit_python/conftest.py b/moon_manager/tests/unit_python/conftest.py
index 902a41a2..702f3c19 100644
--- a/moon_manager/tests/unit_python/conftest.py
+++ b/moon_manager/tests/unit_python/conftest.py
@@ -1,230 +1,164 @@
-import base64
-import json
-import logging
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import os
import pytest
import requests_mock
+import yaml
+import mock_keystone
+import mock_nova
+import mock_engine
+import mock_slaves
+
+
+__CONF = """
+database:
+ url: sqlite:////tmp/database_test.db
+ driver: moon_manager.plugins.sql
+ migration_dir: moon_manager.api.db.migrations
+
+management:
+ url: http://127.0.0.1:8000
+ user: admin
+ password: admin
+ token_file: db.json
+
+orchestration:
+ driver: moon_manager.plugins.pyorchestrator
+ connection: local
+ slaves:
+ port: 10000...10100
+ pipelines:
+ port: 20000...20100
+
+information:
+ user: admin
+ password: p4ssw0rd
+ domain: default
+ project: admin
+ check_token: false
+ certificate: false
+ url: http://keystone:5000/v3
+ subjects:
+ drivers:
+ moon_manager.plugins.moon_keystone_plugin:
+ url: http://keystone:5000/v3
+ objects:
+ drivers:
+ moon_manager.plugins.moon_nova_plugin:
+ url: http://keystone:5000/compute/v2.1
+
+ global_attrs:
+ driver: moon_manager.plugins.global_attrs
+ attributes:
+ mode:
+ values:
+ - build
+ - run
+ default: run
+ url: file:/tmp/mode
+ #url: https://127.0.0.1:8080/mode
+ #url: mysql+pymysql://moon:p4sswOrd1@db/moon_mode
+ #url: sqlite:////tmp/database.db
+ #url: driver://moon_manager.plugins.my_plugin
-CONF = {
- "openstack": {
- "keystone": {
- "url": "http://keystone:5000/v3",
- "user": "admin",
- "check_token": False,
- "password": "p4ssw0rd",
- "domain": "default",
- "certificate": False,
- "project": "admin"
- }
- },
- "components": {
- "wrapper": {
- "bind": "0.0.0.0",
- "port": 8080,
- "container": "wukongsun/moon_wrapper:v4.3",
- "timeout": 5,
- "hostname": "wrapper"
- },
- "manager": {
- "bind": "0.0.0.0",
- "port": 8082,
- "container": "wukongsun/moon_manager:v4.3",
- "hostname": "manager"
- },
- "port_start": 31001,
- "orchestrator": {
- "bind": "0.0.0.0",
- "port": 8083,
- "container": "wukongsun/moon_orchestrator:v4.3",
- "hostname": "orchestrator"
- },
- "pipeline": {
- "interface": {
- "bind": "0.0.0.0",
- "port": 8080,
- "container": "wukongsun/moon_interface:v4.3",
- "hostname": "interface"
- },
- "authz": {
- "bind": "0.0.0.0",
- "port": 8081,
- "container": "wukongsun/moon_authz:v4.3",
- "hostname": "authz"
- },
- }
- },
- "logging": {
- "handlers": {
- "file": {
- "filename": "/tmp/moon.log",
- "class": "logging.handlers.RotatingFileHandler",
- "level": "DEBUG",
- "formatter": "custom",
- "backupCount": 3,
- "maxBytes": 1048576
- },
- "console": {
- "class": "logging.StreamHandler",
- "formatter": "brief",
- "level": "INFO",
- "stream": "ext://sys.stdout"
- }
- },
- "formatters": {
- "brief": {
- "format": "%(levelname)s %(name)s %(message)-30s"
- },
- "custom": {
- "format": "%(asctime)-15s %(levelname)s %(name)s %(message)s"
- }
- },
- "root": {
- "handlers": [
- "console"
- ],
- "level": "ERROR"
- },
- "version": 1,
- "loggers": {
- "moon": {
- "handlers": [
- "console",
- "file"
- ],
- "propagate": False,
- "level": "DEBUG"
- }
- }
- },
- "slave": {
- "name": None,
- "master": {
- "url": None,
- "login": None,
- "password": None
- }
- },
- "docker": {
- "url": "tcp://172.88.88.1:2376",
- "network": "moon"
- },
- "database": {
- "url": "sqlite:///database.db",
- # "url": "mysql+pymysql://moon:p4sswOrd1@db/moon",
- "driver": "sql"
- },
- "messenger": {
- "url": "rabbit://moon:p4sswOrd1@messenger:5672/moon"
- },
-}
-
-COMPONENTS = (
- "logging",
- "openstack/keystone",
- "database",
- "slave",
- "components/manager",
- "components/orchestrator"
-)
-
-PODS = {
- "pods": {
- "721760dd-de5f-11e7-8001-3863bbb766f3": [
- {
- "pdp_id": "b3d3e18abf3340e8b635fd49e6634ccd",
- "port": 8080,
- "genre": "interface",
- "name": "interface-paltry",
- "keystone_project_id": "a64beb1cc224474fb4badd43173e7101",
- "namespace": "moon",
- "container": "wukongsun/moon_interface:v4.3"
- },
- {
- "pdp_id": "b3d3e18abf3340e8b635fd49e6634ccd",
- "meta_rule_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
- "port": 8081,
- "genre": "authz",
- "name": "authz-economic",
- "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
- "keystone_project_id": "a64beb1cc224474fb4badd43173e7101",
- "namespace": "moon",
- "container": "wukongsun/moon_authz:v4.3"
- }
- ]
- }
-}
-
-
-def get_b64_conf(component=None):
- if component in CONF:
- return base64.b64encode(
- json.dumps(
- CONF[component]).encode('utf-8') + b"\n").decode('utf-8')
- elif "/" in component:
- key1, _, key2 = component.partition("/")
- return base64.b64encode(
- json.dumps(
- CONF[key1][key2]).encode('utf-8') + b"\n").decode('utf-8')
- else:
- return base64.b64encode(
- json.dumps(CONF).encode('utf-8') + b"\n").decode('utf-8')
+plugins:
+ directory: /var/moon/plugins
+
+components:
+ manager:
+ port: 8080
+ bind: 0.0.0.0
+ hostname: manager
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
+"""
@pytest.fixture(autouse=True)
def no_requests(monkeypatch):
""" Modify the response from Requests module
"""
+ global manager_api_key
with requests_mock.Mocker(real_http=True) as m:
- for component in COMPONENTS:
- m.register_uri(
- 'GET', 'http://consul:8500/v1/kv/{}'.format(component),
- json=[{'Key': component, 'Value': get_b64_conf(component)}]
- )
- m.register_uri(
- 'POST', 'http://keystone:5000/v3/auth/tokens',
- headers={'X-Subject-Token': "111111111"}
- )
- m.register_uri(
- 'DELETE', 'http://keystone:5000/v3/auth/tokens',
- headers={'X-Subject-Token': "111111111"}
- )
- m.register_uri(
- 'POST', 'http://keystone:5000/v3/users?name=testuser&domain_id=default',
- json={"users": {}}
- )
- m.register_uri(
- 'GET', 'http://keystone:5000/v3/users?name=testuser&domain_id=default',
- json={"users": {}}
- )
- m.register_uri(
- 'POST', 'http://keystone:5000/v3/users/',
- json={"users": [{"id": "1111111111111"}]}
- )
- m.register_uri(
- 'POST', 'http://orchestrator:8083/pods',
- json=PODS,
- headers={"content-type": "application/json"}
- )
- m.register_uri(
- 'GET', 'http://orchestrator:8083/pods',
- json=PODS
- )
- m.register_uri(
- 'DELETE', 'http://orchestrator:8083/pods/{}'.format(list([PODS['pods'].keys()])[0]),
- headers={"content-type": "application/json"}
- )
-
- print("Start populating the DB.")
- from python_moondb.db_manager import init_engine, main
- engine = init_engine()
- print("engine={}".format(engine))
- main("upgrade", logging.getLogger("db_manager"), engine)
- print("End populating the DB.")
- yield m
+ try:
+ os.remove("/tmp/database_test.db")
+ except FileNotFoundError:
+ pass
+ try:
+ os.remove("/tmp/moon.pwd")
+ except FileNotFoundError:
+ pass
+ print("Configure...")
+ from moon_manager.api.configuration import init_database, set_configuration
+ set_configuration(yaml.safe_load(__CONF))
+ print("Create a new user")
+ from moon_utilities.auth_functions import add_user, init_db, get_api_key_for_user
+ init_db()
+ try:
+ user = add_user("admin", "admin")
+ manager_api_key = user["api_key"]
+ except KeyError:
+ print("User already exists")
+ manager_api_key = get_api_key_for_user("admin")
+ print("Initialize the database")
+ init_database()
+ from moon_manager import db_driver, orchestration_driver
+
+ db_driver.init()
+ orchestration_driver.init()
+
+ mock_keystone.register_keystone(m)
+ mock_nova.register_nova(m)
+ mock_engine.register_engine(m)
+ mock_slaves.register_slaves(m)
-# @pytest.fixture(autouse=True, scope="session")
-# def manage_database():
-# from moon_db.db_manager import init_engine, run
-# engine = init_engine()
-# run("upgrade", logging.getLogger("db_manager"), engine)
-# yield
-# print("Will close the DB")
+ from moon_manager.pip_driver import InformationManager
+ for category in InformationManager:
+ for manager in InformationManager[category]:
+ manager.set_auth()
+
+ yield m
+ for category in InformationManager:
+ for manager in InformationManager[category]:
+ manager.unset_auth()
diff --git a/moon_manager/tests/unit_python/helpers/__init__.py b/moon_manager/tests/unit_python/helpers/__init__.py
new file mode 100644
index 00000000..582be686
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/__init__.py
@@ -0,0 +1,11 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
diff --git a/moon_manager/tests/unit_python/helpers/assignment_helper.py b/moon_manager/tests/unit_python/helpers/assignment_helper.py
new file mode 100644
index 00000000..05d13c46
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/assignment_helper.py
@@ -0,0 +1,57 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def get_action_assignments(policy_id, action_id=None, category_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_action_assignments("", policy_id, action_id, category_id)
+
+
+def add_action_assignment(policy_id, action_id, category_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_action_assignment("", policy_id, action_id, category_id, data_id)
+
+
+def delete_action_assignment(policy_id, action_id, category_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_action_assignment("", policy_id, action_id, category_id, data_id)
+
+
+def get_object_assignments(policy_id, object_id=None, category_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_object_assignments("", policy_id, object_id, category_id)
+
+
+def add_object_assignment(policy_id, object_id, category_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_object_assignment("", policy_id, object_id, category_id, data_id)
+
+
+def delete_object_assignment(policy_id, object_id, category_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_object_assignment("", policy_id, object_id, category_id, data_id)
+
+
+def get_subject_assignments(policy_id, subject_id=None, category_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_subject_assignments("", policy_id, subject_id, category_id)
+
+
+def add_subject_assignment(policy_id, subject_id, category_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_subject_assignment("", policy_id, subject_id, category_id, data_id)
+
+
+def delete_subject_assignment(policy_id, subject_id, category_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_subject_assignment("", policy_id, subject_id, category_id, data_id)
+
diff --git a/moon_manager/tests/unit_python/helpers/category_helper.py b/moon_manager/tests/unit_python/helpers/category_helper.py
new file mode 100644
index 00000000..bbb04e09
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/category_helper.py
@@ -0,0 +1,47 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def add_subject_category(cat_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ category = ModelManager.add_subject_category(moon_user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_subject_category(cat_id=None):
+ from moon_manager.db_driver import ModelManager
+ category = ModelManager.get_subject_categories(moon_user_id=None, category_id=cat_id)
+ return category
+
+
+def add_object_category(cat_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ category = ModelManager.add_object_category(moon_user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_object_category(cat_id=None):
+ from moon_manager.db_driver import ModelManager
+ category = ModelManager.get_object_categories(moon_user_id=None, category_id=cat_id)
+ return category
+
+
+def add_action_category(cat_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ category = ModelManager.add_action_category(moon_user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_action_category(cat_id=None):
+ from moon_manager.db_driver import ModelManager
+ category = ModelManager.get_action_categories(moon_user_id=None, category_id=cat_id)
+ return category
diff --git a/moon_manager/tests/unit_python/helpers/data_builder.py b/moon_manager/tests/unit_python/helpers/data_builder.py
new file mode 100644
index 00000000..e2799375
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/data_builder.py
@@ -0,0 +1,283 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+from .category_helper import *
+from .policy_helper import *
+from .data_helper import *
+from helpers import model_helper
+from .meta_rule_helper import *
+from uuid import uuid4
+
+
+def create_subject_category(name):
+ subject_category = add_subject_category(
+ value={"name": name + uuid4().hex, "description": "description 1"})
+ return list(subject_category.keys())[0]
+
+
+def create_object_category(name):
+ object_category = add_object_category(
+ value={"name": name + uuid4().hex, "description": "description 1"})
+ return list(object_category.keys())[0]
+
+
+def create_action_category(name):
+ action_category = add_action_category(
+ value={"name": name + uuid4().hex, "description": "description 1"})
+ return list(action_category.keys())[0]
+
+
+def create_model(meta_rule_id, model_name="test_model"):
+ value = {
+ "name": model_name + uuid4().hex,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+
+ }
+ return value
+
+
+def create_policy(model_id, policy_name="policy_1"):
+ value = {
+ "name": policy_name,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ return value
+
+
+def create_pdp(policies_ids):
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": policies_ids,
+ "vim_project_id": "vim_project_id1",
+ "description": "...",
+ }
+ return value
+
+
+def create_new_policy(subject_category_name=None, object_category_name=None,
+ action_category_name=None, model_name=None, policy_name=None,
+ meta_rule_name=None):
+ if not subject_category_name:
+ subject_category_name = "subjectCategory_" + uuid4().hex
+ if not object_category_name:
+ object_category_name = "objectCategory_" + uuid4().hex
+ if not action_category_name:
+ action_category_name = "actionCategory_" + uuid4().hex
+
+ if not meta_rule_name:
+ meta_rule_name = "meta_rule_" + uuid4().hex
+
+ if not model_name:
+ model_name = "model_name_" + uuid4().hex
+ if not policy_name:
+ policy_name = "policy_name_" + uuid4().hex
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = create_new_meta_rule(
+ subject_category_name=subject_category_name + uuid4().hex,
+ object_category_name=object_category_name + uuid4().hex,
+ action_category_name=action_category_name + uuid4().hex,
+ meta_rule_name=meta_rule_name + uuid4().hex
+ )
+
+ model = model_helper.add_model(value=create_model(meta_rule_id, model_name + uuid4().hex))
+ model_id = list(model.keys())[0]
+ value = create_policy(model_id, policy_name + uuid4().hex)
+ policy = add_policies(value=value)
+ assert policy
+ policy_id = list(policy.keys())[0]
+ return subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id
+
+
+def create_new_meta_rule(subject_category_name=None, object_category_name=None,
+ action_category_name=None, meta_rule_name=None, empty=None):
+ if not subject_category_name:
+ subject_category_name = "subjectCategory_" + uuid4().hex
+ if not object_category_name:
+ object_category_name = "objectCategory_" + uuid4().hex
+ if not action_category_name:
+ action_category_name = "actionCategory_" + uuid4().hex
+
+ if not meta_rule_name:
+ meta_rule_name = "meta_rule_" + uuid4().hex
+
+ subject_category_id = create_subject_category(subject_category_name)
+ object_category_id = create_object_category(object_category_name)
+ action_category_id = create_action_category(action_category_name)
+ value = {"name": meta_rule_name,
+ "description": "name of the meta rule algorithm",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ if empty == 'subject':
+ value["subject_categories"] = []
+ if empty == 'object':
+ value["object_categories"] = []
+ if empty == 'action':
+ value["action_categories"] = []
+ meta_rule = add_meta_rule(value=value)
+ return subject_category_id, object_category_id, action_category_id, list(meta_rule.keys())[0]
+
+
+def create_subject(policy_id):
+ value = {
+ "name": "testuser" + uuid4().hex,
+ "description": "test",
+ }
+ subject = add_subject(policy_id=policy_id, value=value)
+ return list(subject.keys())[0]
+
+
+def create_object(policy_id):
+ value = {
+ "name": "testobject" + uuid4().hex,
+ "description": "test",
+ }
+ object = add_object(policy_id=policy_id, value=value)
+ return list(object.keys())[0]
+
+
+def create_action(policy_id):
+ value = {
+ "name": "testaction" + uuid4().hex,
+ "description": "test",
+ }
+ action = add_action(policy_id=policy_id, value=value)
+ return list(action.keys())[0]
+
+
+def create_subject_data(policy_id, category_id):
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = add_subject_data(policy_id=policy_id, category_id=category_id, value=value).get(
+ 'data')
+ assert subject_data
+ return list(subject_data.keys())[0]
+
+
+def create_object_data(policy_id, category_id):
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ object_data = add_object_data(policy_id=policy_id, category_id=category_id, value=value).get(
+ 'data')
+ return list(object_data.keys())[0]
+
+
+def create_action_data(policy_id, category_id):
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ action_data = add_action_data(policy_id=policy_id, category_id=category_id, value=value).get(
+ 'data')
+ return list(action_data.keys())[0]
+
+
+def get_policy_id_with_subject_assignment():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ subject_id = create_subject(policy_id)
+ data_id = create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ data = {
+ "id": subject_id,
+ "category_id": subject_category_id,
+ "data_id": data_id
+ }
+ response = hug.test.post(assignments, "/policies/{}/subject_assignments/".format(policy_id),
+ body=data, headers=auth_headers)
+ return policy_id
+
+
+def get_policy_id_with_object_assignment():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ object_id = create_object(policy_id)
+ data_id = create_object_data(policy_id=policy_id, category_id=object_category_id)
+
+ data = {
+ "id": object_id,
+ "category_id": object_category_id,
+ "data_id": data_id
+ }
+
+ hug.test.post(assignments, "policies/{}/object_assignments".format(policy_id), body=data,
+ headers=auth_headers)
+ return policy_id
+
+
+def get_policy_id_with_action_assignment():
+ from moon_manager.api import assignments
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ action_id = create_action(policy_id)
+ data_id = create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ data = {
+ "id": action_id,
+ "category_id": action_category_id,
+ "data_id": data_id
+ }
+ hug.test.post(assignments, "policies/{}/action_assignments".format(policy_id), body =data,
+ headers=auth_headers)
+ return policy_id
+
+
+def add_rules():
+ from moon_manager.api import rules
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ sub_id, obj_id, act_id, meta_rule_id, policy_id = create_new_policy("sub_cat" + uuid4().hex,
+ "obj_cat" + uuid4().hex,
+ "act_cat" + uuid4().hex)
+ sub_data_id = create_subject_data(policy_id, sub_id)
+ obj_data_id = create_object_data(policy_id, obj_id)
+ act_data_id = create_action_data(policy_id, act_id)
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [sub_data_id, obj_data_id, act_data_id],
+ "instructions": [
+ {"decision": "grant"},
+ ],
+ "enabled": True
+ }
+ req = hug.test.post(rules, "policies/{}/rules".format(policy_id), body=data, headers=auth_headers)
+ return req, req.data, policy_id
diff --git a/moon_manager/tests/unit_python/helpers/data_helper.py b/moon_manager/tests/unit_python/helpers/data_helper.py
new file mode 100644
index 00000000..cb1ee38c
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/data_helper.py
@@ -0,0 +1,106 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def get_action_data(policy_id, data_id=None, category_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_action_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id, category_id=category_id)
+
+
+def add_action_data(policy_id, data_id=None, category_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_action_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id, category_id=category_id, value=value)
+
+
+def delete_action_data(policy_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_action_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id)
+
+
+def get_object_data(policy_id, data_id=None, category_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_object_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id, category_id=category_id)
+
+
+def add_object_data(policy_id, data_id=None, category_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_object_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id, category_id=category_id, value=value)
+
+
+def delete_object_data(policy_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_object_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id)
+
+
+def get_subject_data(policy_id, data_id=None, category_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_subject_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id, category_id=category_id)
+
+
+def add_subject_data(policy_id, data_id=None, category_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.set_subject_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id, category_id=category_id, value=value)
+
+
+def delete_subject_data(policy_id, data_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_subject_data(moon_user_id="admin", policy_id=policy_id, data_id=data_id)
+
+
+def get_actions(policy_id, perimeter_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_actions(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id)
+
+
+def add_action(policy_id, perimeter_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_action(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+
+def delete_action(policy_id, perimeter_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_action(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id)
+
+
+def get_objects(policy_id, perimeter_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_objects(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id)
+
+
+def add_object(policy_id, perimeter_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_object(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+
+def delete_object(policy_id, perimeter_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_object(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id)
+
+
+def get_subjects(policy_id, perimeter_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_subjects(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id)
+
+
+def add_subject(policy_id, perimeter_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.add_subject(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+
+def delete_subject(policy_id, perimeter_id):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_subject(moon_user_id="admin", policy_id=policy_id, perimeter_id=perimeter_id)
+
+
+def get_available_metadata(policy_id):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_available_metadata(moon_user_id="admin", policy_id=policy_id)
diff --git a/moon_manager/tests/unit_python/helpers/import_export_helper.py b/moon_manager/tests/unit_python/helpers/import_export_helper.py
new file mode 100644
index 00000000..1ba94fd0
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/import_export_helper.py
@@ -0,0 +1,287 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from api import test_models as test_models
+from api import test_policies as test_policies
+from api import test_perimeter as test_perimeter
+from api import test_meta_data as test_categories
+from api import test_data as test_data
+from api import test_meta_rules as test_meta_rules
+from api import test_assignement as test_assignments
+from api import test_rules as test_rules
+import logging
+import hug
+
+logger = logging.getLogger("moon.manager.test.api." + __name__)
+
+
+def clean_models():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req, models = test_models.get_models()
+ for key in models["models"]:
+ from moon_manager.api import models
+ hug.test.delete(models, "/models/{}".format(key), headers=auth_headers)
+
+
+def clean_policies():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for key in policies["policies"]:
+ from moon_manager.api import policy
+ req = hug.test.delete(policy, "/policies/{}".format(key), headers=auth_headers)
+ assert req.status == hug.HTTP_200
+
+
+def clean_subjects():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ subjects = test_perimeter.get_subjects()
+ logger.info("subjects {}".format(subjects))
+ for key in subjects[1]["subjects"]:
+ subject = subjects[1]["subjects"][key]
+ policy_keys = subject["policy_list"]
+ logger.info("subjects policy_keys {}".format(policy_keys))
+ for policy_key in policy_keys:
+ from moon_manager.api import perimeter
+ hug.test.delete(perimeter, "/policies/{}/subjects/{}".format(policy_key, key), headers=auth_headers )
+ hug.test.delete(perimeter, "/subjects/{}".format(key), headers=auth_headers)
+
+
+def clean_objects():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ objects = test_perimeter.get_objects()
+ logger.info("objects {}".format(objects))
+ for key in objects[1]["objects"]:
+ object_ = objects[1]["objects"][key]
+ policy_keys = object_["policy_list"]
+ logger.info("objects policy_keys {}".format(policy_keys))
+ for policy_key in policy_keys:
+ from moon_manager.api import perimeter
+ hug.test.delete(perimeter, "/policies/{}/objects/{}".format(policy_key, key), headers=auth_headers )
+ hug.test.delete(perimeter, "/objects/{}".format(key), headers=auth_headers)
+
+def clean_actions():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ actions = test_perimeter.get_actions()
+ logger.info("actions {}".format(actions))
+ for key in actions[1]["actions"]:
+ action = actions[1]["actions"][key]
+ policy_keys = action["policy_list"]
+ logger.info("action policy_keys {}".format(policy_keys))
+ from moon_manager.api import perimeter
+ for policy_key in policy_keys:
+ hug.test.delete(perimeter, "/policies/{}/actions/{}".format(policy_key, key), headers=auth_headers)
+ hug.test.delete(perimeter, "/actions/{}".format(key), headers=auth_headers)
+
+
+
+def clean_subject_categories():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req, categories = test_categories.get_subject_categories()
+ logger.info(categories)
+ for key in categories["subject_categories"]:
+ from moon_manager.api import meta_data
+ hug.test.delete(meta_data, "/subject_categories/{}".format(key), headers=auth_headers)
+
+
+def clean_object_categories():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req, categories = test_categories.get_object_categories()
+ logger.info(categories)
+ for key in categories["object_categories"]:
+ from moon_manager.api import meta_data
+ hug.test.delete(meta_data, "/object_categories/{}".format(key), headers=auth_headers)
+
+
+def clean_action_categories():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req, categories = test_categories.get_action_categories()
+ logger.info(categories)
+ for key in categories["action_categories"]:
+ from moon_manager.api import meta_data
+ hug.test.delete(meta_data, "/action_categories/{}".format(key), headers=auth_headers)
+
+
+def clean_subject_data():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ logger.info("clean_subject_data on {}".format(policies))
+ for policy_key in policies["policies"]:
+ req, data = test_data.get_subject_data(policy_id=policy_key)
+ logger.info("============= data {}".format(data))
+ for data_item in data["subject_data"]:
+ if data_item["data"]:
+ for data_id in data_item["data"]:
+ logger.info("============= Deleting {}/{}".format(policy_key, data_id))
+ from moon_manager.api import data
+ hug.test.delete(data, "/policies/{}/subject_data/{}/{}".format(policy_key,
+ data_item['category_id'], data_id), headers=auth_headers)
+
+
+def clean_object_data():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, data = test_data.get_object_data(policy_id=policy_key)
+ for data_item in data["object_data"]:
+ if data_item["data"]:
+ for data_id in data_item["data"]:
+ logger.info("============= object_data {}/{}".format(policy_key, data_id))
+ from moon_manager.api import data
+ hug.test.delete(data, "/policies/{}/object_data/{}/{}".format(policy_key,
+ data_item['category_id'], data_id), headers=auth_headers)
+
+
+def clean_action_data():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, data = test_data.get_action_data(policy_id=policy_key)
+ for data_item in data["action_data"]:
+ if data_item["data"]:
+ for data_id in data_item["data"]:
+ logger.info("============= action_data {}/{}".format(policy_key, data_id))
+ from moon_manager.api import data
+ hug.test.delete(data, "/policies/{}/action_data/{}/{}".format(policy_key,
+ data_item['category_id'], data_id), headers=auth_headers)
+
+
+def clean_meta_rule():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req, meta_rules_obj = test_meta_rules.get_meta_rules()
+ meta_rules_obj = meta_rules_obj["meta_rules"]
+ for meta_rule_key in meta_rules_obj:
+ logger.info("clean_meta_rule.meta_rule_key={}".format(meta_rule_key))
+ logger.info("clean_meta_rule.meta_rule={}".format(meta_rules_obj[meta_rule_key]))
+ from moon_manager.api import meta_rules
+ hug.test.delete(meta_rules, "/meta_rules/{}".format(meta_rule_key), headers=auth_headers)
+
+
+def clean_subject_assignments():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, assignments = test_assignments.get_subject_assignment(policy_key)
+ for key in assignments["subject_assignments"]:
+ subject_key = assignments["subject_assignments"][key]["subject_id"]
+ cat_key = assignments["subject_assignments"][key]["category_id"]
+ data_keys = assignments["subject_assignments"][key]["assignments"]
+ for data_key in data_keys:
+ from moon_manager.api import assignments
+ hug.test.delete(assignments,
+ "/policies/{}/subject_assignments/{}/{}/{}".format(policy_key,
+ subject_key, cat_key, data_key), headers=auth_headers)
+
+
+def clean_object_assignments():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, assignments = test_assignments.get_object_assignment(policy_key)
+ for key in assignments["object_assignments"]:
+ object_key = assignments["object_assignments"][key]["object_id"]
+ cat_key = assignments["object_assignments"][key]["category_id"]
+ data_keys = assignments["object_assignments"][key]["assignments"]
+ for data_key in data_keys:
+ from moon_manager.api import assignments
+ hug.test.delete(assignments,
+ "/policies/{}/object_assignments/{}/{}/{}".format(policy_key,
+ object_key, cat_key, data_key), headers=auth_headers)
+
+
+def clean_action_assignments():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, assignments = test_assignments.get_action_assignment(policy_key)
+ for key in assignments["action_assignments"]:
+ action_key = assignments["action_assignments"][key]["action_id"]
+ cat_key = assignments["action_assignments"][key]["category_id"]
+ data_keys = assignments["action_assignments"][key]["assignments"]
+ for data_key in data_keys:
+ from moon_manager.api import assignments
+ hug.test.delete(assignments,
+ "/policies/{}/action_assignments/{}/{}/{}".format(policy_key,
+ action_key, cat_key, data_key), headers=auth_headers)
+
+
+def clean_rules():
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ req = test_policies.get_policies(auth_headers=auth_headers)
+
+ policies = req.data
+ for policy_key in policies["policies"]:
+ req, rules = test_rules.get_rules(policy_key)
+ rules = rules["rules"]["rules"]
+ for rule_key in rules:
+ from moon_manager.api import rules
+ hug.test.delete(rules, "/policies/{}/rules/{}".format(policy_key, rule_key["id"]), headers=auth_headers)
+
+
+def clean_all():
+ clean_rules()
+
+ clean_subject_assignments()
+ clean_object_assignments()
+ clean_action_assignments()
+
+ clean_subject_data()
+ clean_object_data()
+ clean_action_data()
+
+ clean_actions()
+ clean_objects()
+ clean_subjects()
+
+ clean_policies()
+ clean_models()
+ clean_meta_rule()
+
+ clean_subject_categories()
+ clean_object_categories()
+ clean_action_categories()
diff --git a/moon_manager/tests/unit_python/helpers/meta_rule_helper.py b/moon_manager/tests/unit_python/helpers/meta_rule_helper.py
new file mode 100644
index 00000000..0542d394
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/meta_rule_helper.py
@@ -0,0 +1,84 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+def set_meta_rule(meta_rule_id, value=None):
+ from moon_manager.db_driver import ModelManager
+ if not value:
+ action_category_id = builder.create_action_category("action_category_id1" + uuid4().hex)
+ subject_category_id = builder.create_subject_category("subject_category_id1" + uuid4().hex)
+ object_category_id = builder.create_object_category("object_category_id1" + uuid4().hex)
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ return ModelManager.set_meta_rule(moon_user_id=None, meta_rule_id=meta_rule_id, value=value)
+
+
+def add_meta_rule(meta_rule_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ if not value:
+ action_category_id = builder.create_action_category("action_category_id1" + uuid4().hex)
+ subject_category_id = builder.create_subject_category("subject_category_id1" + uuid4().hex)
+ object_category_id = builder.create_object_category("object_category_id1" + uuid4().hex)
+ value = {
+ "name": "MLS_meta_rule" + uuid4().hex,
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ return ModelManager.add_meta_rule(moon_user_id=None, meta_rule_id=meta_rule_id, value=value)
+
+
+def get_body_meta_rule_with_empty_category_in_mid(type=None):
+ action_category_id1 = builder.create_action_category("action_category_id1" + uuid4().hex)
+ subject_category_id1 = builder.create_subject_category("subject_category_id1" + uuid4().hex)
+ object_category_id1 = builder.create_object_category("object_category_id1" + uuid4().hex)
+
+ action_category_id2 = builder.create_action_category("action_category_id1" + uuid4().hex)
+ subject_category_id2 = builder.create_subject_category("subject_category_id1" + uuid4().hex)
+ object_category_id2 = builder.create_object_category("object_category_id1" + uuid4().hex)
+ value = {
+ "name": "MLS_meta_rule" + uuid4().hex,
+ "description": "test",
+ "subject_categories": [subject_category_id1],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id1]
+ }
+ if type == 'subject':
+ value['subject_categories'].append("")
+ if type == 'object':
+ value['object_categories'].append("")
+ if type == 'action':
+ value['action_categories'].append("")
+
+ value['subject_categories'].append(subject_category_id2)
+ value['object_categories'].append(object_category_id2)
+ value['action_categories'].append(action_category_id2)
+ return value
+
+
+def get_meta_rules(meta_rule_id=None):
+ from moon_manager.db_driver import ModelManager
+ return ModelManager.get_meta_rules(moon_user_id=None, meta_rule_id=meta_rule_id)
+
+
+def delete_meta_rules(meta_rule_id=None):
+ from moon_manager.db_driver import ModelManager
+ ModelManager.delete_meta_rule(moon_user_id=None, meta_rule_id=meta_rule_id)
diff --git a/moon_manager/tests/unit_python/helpers/model_helper.py b/moon_manager/tests/unit_python/helpers/model_helper.py
new file mode 100644
index 00000000..ed705af8
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/model_helper.py
@@ -0,0 +1,81 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+def get_models(model_id=None):
+ from moon_manager.db_driver import ModelManager
+ return ModelManager.get_models(moon_user_id=None, model_id=model_id)
+
+
+def add_model(model_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ if not value:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+ name = "MLS"+uuid4().hex if model_id is None else "MLS " + model_id
+ value = {
+ "name": name,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ return ModelManager.add_model(moon_user_id=None, model_id=model_id, value=value)
+
+
+def add_model_without_meta_rule(model_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ if not value:
+ name = "MLS"+uuid4().hex if model_id is None else "MLS " + model_id
+ value = {
+ "name": name,
+ "description": "test",
+ "meta_rules": ""
+ }
+ return ModelManager.add_model(moon_user_id=None, model_id=model_id, value=value)
+
+
+def add_model_with_blank_subject_meta_rule(model_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ if not value:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule(empty='subject')
+ name = "MLS"+uuid4().hex if model_id is None else "MLS " + model_id
+ value = {
+ "name": name,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ return ModelManager.add_model(moon_user_id=None, model_id=model_id, value=value)
+
+
+
+def delete_models(uuid=None, name=None):
+ from moon_manager.db_driver import ModelManager
+ if not uuid:
+ for model_id, model_value in get_models():
+ if name == model_value['name']:
+ uuid = model_id
+ break
+ ModelManager.delete_model(moon_user_id=None, model_id=uuid)
+
+
+def delete_all_models():
+ from moon_manager.db_driver import ModelManager
+ models_values = get_models()
+ print(models_values)
+ for model_id, model_value in models_values.items():
+ ModelManager.delete_model(moon_user_id=None, model_id=model_id)
+
+
+def update_model(model_id=None, value=None):
+ from moon_manager.db_driver import ModelManager
+ return ModelManager.update_model(moon_user_id=None, model_id=model_id, value=value)
diff --git a/moon_manager/tests/unit_python/helpers/pdp_helper.py b/moon_manager/tests/unit_python/helpers/pdp_helper.py
new file mode 100644
index 00000000..e970961a
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/pdp_helper.py
@@ -0,0 +1,31 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def update_pdp(pdp_id, value):
+ from moon_manager.db_driver import PDPManager
+ return PDPManager.update_pdp("", pdp_id, value)
+
+
+def delete_pdp(pdp_id):
+ from moon_manager.db_driver import PDPManager
+ PDPManager.delete_pdp("", pdp_id)
+
+
+def add_pdp(pdp_id=None, value=None):
+ from moon_manager.db_driver import PDPManager
+ return PDPManager.add_pdp("", pdp_id, value)
+
+
+def get_pdp(pdp_id=None):
+ from moon_manager.db_driver import PDPManager
+ return PDPManager.get_pdp("", pdp_id)
diff --git a/moon_manager/tests/unit_python/helpers/policy_helper.py b/moon_manager/tests/unit_python/helpers/policy_helper.py
new file mode 100644
index 00000000..ffd0d1bb
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/policy_helper.py
@@ -0,0 +1,84 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from uuid import uuid4
+from helpers import model_helper
+
+def get_policies():
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_policies("admin")
+
+
+def add_policies(policy_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ if not value:
+ value = {
+ "name": "test_policy"+ uuid4().hex,
+ "model_id": "",
+ "genre": "authz",
+ "description": "test",
+ }
+ return PolicyManager.add_policy(moon_user_id="admin", policy_id=policy_id, value=value)
+
+
+def add_policies_with_model(policy_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": "test_policy"+ uuid4().hex,
+ "description": "test",
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ return PolicyManager.add_policy(moon_user_id="admin", policy_id=policy_id, value=data)
+
+
+def delete_policies(uuid=None, name=None):
+ from moon_manager.db_driver import PolicyManager
+ if not uuid:
+ for policy_id, policy_value in get_policies():
+ if name == policy_value['name']:
+ uuid = policy_id
+ break
+ PolicyManager.delete_policy("admin", uuid)
+
+
+def update_policy(policy_id, value):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.update_policy("admin", policy_id, value)
+
+
+def get_policy_from_meta_rules(meta_rule_id):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_policy_from_meta_rules("admin", meta_rule_id)
+
+
+def get_rules(policy_id=None, meta_rule_id=None, rule_id=None):
+ from moon_manager.db_driver import PolicyManager
+ return PolicyManager.get_rules("", policy_id, meta_rule_id, rule_id)
+
+
+def add_rule(policy_id=None, meta_rule_id=None, value=None):
+ from moon_manager.db_driver import PolicyManager
+ if not value:
+ value = {
+ "rule": ("high", "medium", "vm-action"),
+ "instructions": [{"decision": "grant"}],
+ "enabled": "",
+ }
+ return PolicyManager.add_rule("", policy_id, meta_rule_id, value)
+
+
+def delete_rule(policy_id=None, rule_id=None):
+ from moon_manager.db_driver import PolicyManager
+ PolicyManager.delete_rule("", policy_id, rule_id)
diff --git a/moon_manager/tests/unit_python/helpers/rules_helper.py b/moon_manager/tests/unit_python/helpers/rules_helper.py
new file mode 100644
index 00000000..ce7e8bd2
--- /dev/null
+++ b/moon_manager/tests/unit_python/helpers/rules_helper.py
@@ -0,0 +1,18 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+def get_headers():
+ from moon_utilities.auth_functions import get_api_key_for_user
+
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin"),
+ 'Content-Type': 'application/json'}
+ return auth_headers
diff --git a/moon_manager/tests/unit_python/mock_engine.py b/moon_manager/tests/unit_python/mock_engine.py
new file mode 100644
index 00000000..0685d376
--- /dev/null
+++ b/moon_manager/tests/unit_python/mock_engine.py
@@ -0,0 +1,19 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def register_engine(m):
+ for port in range(20000, 20010):
+ m.register_uri(
+ 'POST', 'http://127.0.0.1:{}/update'.format(port),
+ json={}
+ )
diff --git a/moon_manager/tests/unit_python/mock_keystone.py b/moon_manager/tests/unit_python/mock_keystone.py
new file mode 100644
index 00000000..73e5681d
--- /dev/null
+++ b/moon_manager/tests/unit_python/mock_keystone.py
@@ -0,0 +1,59 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+import requests_mock
+
+
+def register_keystone(m):
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "b34e5a29-5494-4cc5-9356-daa244b8c254"}
+ )
+ m.register_uri(
+ 'DELETE', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "b34e5a29-5494-4cc5-9356-daa244b8c254"}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/users?name=testuser&domain_id=default',
+ json={"users": {}}
+ )
+ m.register_uri(
+ 'GET', 'http://keystone:5000/v3/users?name=testuser&domain_id=default',
+ json={"users": {}}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/users/',
+ json={"users": [{
+ "id": "b34e5a29-5494-4cc5-9356-daa244b8c254"
+ }]}
+ )
+
+ def match_request_text(request):
+ # request.url may be None, or '' prevents a TypeError.
+ return 'http://keystone:5000/v3/users?name=' in request.url
+
+ m.register_uri(
+ requests_mock.ANY, '/v3/users',
+ additional_matcher=match_request_text,
+ json={"users": [{
+ "id": "b34e5a29-5494-4cc5-9356-daa244b8c254"
+ }]}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/projects/',
+ json={
+ "description": "test_project",
+ "domain_id": ['domain_id_1'],
+ "enabled": True,
+ "is_domain": False,
+ "name": 'project_1'
+ }
+ )
diff --git a/moon_manager/tests/unit_python/mock_nova.py b/moon_manager/tests/unit_python/mock_nova.py
new file mode 100644
index 00000000..e898ad1a
--- /dev/null
+++ b/moon_manager/tests/unit_python/mock_nova.py
@@ -0,0 +1,28 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+import requests_mock
+
+
+def register_nova(m):
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "b34e5a29-5494-4cc5-9356-daa244b8c254"}
+ )
+ m.register_uri(
+ 'DELETE', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "b34e5a29-5494-4cc5-9356-daa244b8c254"}
+ )
+ m.register_uri(
+ 'GET', 'http://keystone:5000/compute/v2.1/servers',
+ json={"servers": [{"name": "vm1"}]}
+ )
+
diff --git a/moon_manager/tests/unit_python/mock_slaves.py b/moon_manager/tests/unit_python/mock_slaves.py
new file mode 100644
index 00000000..935bb0de
--- /dev/null
+++ b/moon_manager/tests/unit_python/mock_slaves.py
@@ -0,0 +1,38 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+SLAVES = {
+ "slaves": {
+ "d464cc58a0cd46dea3191ba70f4e7df8": {
+ "name": "slave_test",
+ "address": "",
+ "description": "...",
+ "api_key": "e58a882a6b658a22660f00a0c273e7f6b4c4eb5abe54eccba2cae307905d67e3746537bd790c41887e11840c2d186b6d6eeec0e426bcfa7a872cc3417a35124a",
+ "log": "/tmp/moon_d464cc58a0cd46dea3191ba70f4e7df8.log",
+ "process": "/tmp/d464cc58a0cd46dea3191ba70f4e7df8.pid",
+ "extra": {
+ "description": "...",
+ "starttime": 1543851265.76279,
+ "port": 10001,
+ "server_ip": "127.0.0.1",
+ "status": "down"
+ }
+ }
+ }
+}
+
+
+def register_slaves(m):
+ m.register_uri(
+ 'GET', 'http://localhost/slaves',
+ json=SLAVES
+ )
diff --git a/moon_manager/tests/unit_python/plugins/__init__.py b/moon_manager/tests/unit_python/plugins/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_manager/tests/unit_python/plugins/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_manager/tests/unit_python/plugins/test_global_attrs.py b/moon_manager/tests/unit_python/plugins/test_global_attrs.py
new file mode 100644
index 00000000..603e03ae
--- /dev/null
+++ b/moon_manager/tests/unit_python/plugins/test_global_attrs.py
@@ -0,0 +1,148 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import hug
+from moon_manager.pip_driver import AttrsManager
+from moon_manager.api.configuration import get_configuration
+
+
+def test_mode_add_get():
+ default_value = get_configuration(
+ "information")["global_attrs"]["attributes"]["mode"]["default"]
+ value = AttrsManager.delete_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ value = AttrsManager.get_object(object_type="mode")
+ assert value["value"] == default_value
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == default_value
+
+
+def test_mode_add_gets():
+ default_value = \
+ get_configuration("information")["global_attrs"]["attributes"]["mode"]["default"]
+ value = AttrsManager.delete_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ values = AttrsManager.get_objects()
+ assert "mode" in values
+ assert values["mode"]["value"] == default_value
+ assert isinstance(values["mode"], dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in values["mode"]
+ assert values["mode"]["value"] == default_value
+
+
+def test_mode_update():
+ value = AttrsManager.update_object(object_id="build", object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "build"
+ value = AttrsManager.get_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "build"
+
+
+def test_mode_delete():
+ value = AttrsManager.update_object(object_id="build", object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "build"
+ value = AttrsManager.delete_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "run"
+
+
+def test_hug_mode_add_get():
+ from moon_manager.api import attributes
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ default_value = get_configuration(
+ "information")["global_attrs"]["attributes"]["mode"]["default"]
+
+ req = hug.test.delete(attributes, "/attributes/{}".format("mode"), headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ value = req.data
+ assert isinstance(value, dict)
+ assert "attributes" in value
+ value = value["attributes"]
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == default_value
+ value = AttrsManager.get_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == default_value
+
+
+def test_hug_mode_update():
+ from moon_manager.api import attributes
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+
+ req = hug.test.put(attributes, "/attributes/{}/{}".format("mode", "build"), headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ value = req.data
+ assert isinstance(value, dict)
+ assert "attributes" in value
+ value = value["attributes"]
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "build"
+ value = AttrsManager.get_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "build"
+
+
+def test_hug_mode_delete():
+ from moon_manager.api import attributes
+ from moon_utilities.auth_functions import get_api_key_for_user
+ auth_headers = {"X-Api-Key": get_api_key_for_user("admin")}
+ default_value = get_configuration(
+ "information")["global_attrs"]["attributes"]["mode"]["default"]
+
+ req = hug.test.put(attributes, "/attributes/{}/{}".format("mode", "build"), headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ value = req.data
+ assert isinstance(value, dict)
+ assert "attributes" in value
+ value = value["attributes"]
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == "build"
+ req = hug.test.delete(attributes, "/attributes/{}".format("mode"), headers=auth_headers)
+ assert req.status == hug.HTTP_200
+ value = req.data
+ assert isinstance(value, dict)
+ assert "attributes" in value
+ value = value["attributes"]
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == default_value
+ value = AttrsManager.get_object(object_type="mode")
+ assert isinstance(value, dict)
+ for key in ("id", "value", "default", "values"):
+ assert key in value
+ assert value["value"] == default_value
diff --git a/moon_manager/tests/unit_python/requirements.txt b/moon_manager/tests/unit_python/requirements.txt
index 21975ce3..e021a5fb 100644
--- a/moon_manager/tests/unit_python/requirements.txt
+++ b/moon_manager/tests/unit_python/requirements.txt
@@ -1,5 +1,11 @@
-flask
-flask_cors
-flask_restful
-python_moondb
-python_moonutilities \ No newline at end of file
+hug!=2.5.0
+moon_utilities
+sqlalchemy
+pymysql
+pytest-mock
+pytest-cov
+requests_mock
+tinydb
+pytest
+pytest-benchmark
+pyaml
diff --git a/moon_orchestrator/Dockerfile b/moon_orchestrator/Dockerfile
deleted file mode 100644
index e9f83094..00000000
--- a/moon_orchestrator/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM python:3
-
-ADD . /root
-WORKDIR /root/
-RUN pip3 install -r requirements.txt
-RUN pip3 install .
-
-CMD ["python3", "-m", "moon_orchestrator"] \ No newline at end of file
diff --git a/moon_orchestrator/tests/unit_python/test_pods.py b/moon_orchestrator/tests/unit_python/test_pods.py
deleted file mode 100644
index 678645be..00000000
--- a/moon_orchestrator/tests/unit_python/test_pods.py
+++ /dev/null
@@ -1,145 +0,0 @@
-import json
-from mock_pods import patch_k8s
-from utilities import get_json
-
-
-def test_get_pods(context, monkeypatch):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- req = _client.get("/pods")
- assert req.status_code == 200
- assert req.data
- data = get_json(req.data)
- assert isinstance(data, dict)
- assert "pods" in data
-
-
-def test_get_pods_failure(context, monkeypatch):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- req = _client.get("/pods/invalid")
- assert req.status_code == 200
- assert req.data
- data = get_json(req.data)
- assert isinstance(data, dict)
- assert not data["pods"]
-
-
-def test_add_pods_with_pipeline(context, monkeypatch):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- data = {
- "keystone_project_id": context.get('project_id'),
- "pdp_id": context.get('pdp_id'),
- "security_pipeline": context.get('security_pipeline'),
- }
- req = _client.post("/pods", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 200
- assert req.data
- data = get_json(req.data)
- assert isinstance(data, dict)
- assert "pods" in data
- assert data["pods"]
-
-
-def test_add_pods_without_pipeline_with_bad_slave_name(context, monkeypatch):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- data = {
- "slave_name": "test",
- }
- req = _client.post("/pods", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 400
- assert req.data
- data = get_json(req.data)
- assert isinstance(data, dict)
- assert 'The slave is unknown.' in data['message']
-
-
-def test_add_pods_without_pipeline_with_good_slave_name(context, monkeypatch):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- data = {
- "slave_name": "active_context",
- }
- req = _client.post("/pods", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 200
- assert req.data
- data = get_json(req.data)
- assert isinstance(data, dict)
- assert "pods" in data
- assert data["pods"]
-
-
-def test_add_pods_without_pipeline_without_slave_name(context, monkeypatch):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- data = {
- }
- req = _client.post("/pods", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 400
- assert req.data
- data = get_json(req.data)
- assert isinstance(data, dict)
- assert 'The slave is unknown.' in data['message']
-
-
-def test_add_pods_with_no_data(context, monkeypatch):
- patch_k8s(monkeypatch)
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- req = _client.post("/pods", data=json.dumps({}),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 400
- assert req.data
- data = get_json(req.data)
- assert 'The slave is unknown.' in data['message']
-
-
-def test_add_pods_with_no_policies_no_models(context, monkeypatch, no_requests):
- patch_k8s(monkeypatch)
-
- import moon_orchestrator.server
- server = moon_orchestrator.server.create_server()
- _client = server.app.test_client()
- no_requests.get("http://manager:8082/policies",
- json={'policies': {}})
-
- no_requests.get("http://manager:8082/models",
- json={'models': {}})
- data = {
- "keystone_project_id": context.get('project_id'),
- "pdp_id": context.get('pdp_id'),
- "security_pipeline": context.get('security_pipeline'),
- }
- req = _client.post("/pods", data=json.dumps(data),
- headers={'Content-Type': 'application/json'})
- assert req.status_code == 200
-
-
-def test_delete_pods(context, monkeypatch):
- # TODO
- pass
diff --git a/moon_utilities/.gitignore b/moon_utilities/.gitignore
new file mode 100644
index 00000000..7bff7318
--- /dev/null
+++ b/moon_utilities/.gitignore
@@ -0,0 +1,105 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
diff --git a/moon_utilities/Changelog b/moon_utilities/Changelog
new file mode 100644
index 00000000..61ae2fec
--- /dev/null
+++ b/moon_utilities/Changelog
@@ -0,0 +1,54 @@
+# Copyright 2018 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+CHANGES
+=======
+
+0.1
+---
+- First version of the moon_utilities library.
+
+0.2
+---
+- Delete Keystone references in exceptions
+- Update the user used to authenticate actions in moon (moon_user_id)
+
+0.3
+---
+- Adding validation function
+- Update enforce decorator
+- Refactoring by adding base exception and json utilities from manager to utilities
+
+0.4
+---
+- Move authentication function from moon_manager to moon_utilities
+- Adding invalided_functions
+- Fix a bug in security_functions.py
+- Add logout functionality
+- Add re-login functionality
+
+0.5
+---
+- Add script to automatically generate OpenStack RBAC policy from policy.json original files
+
+0.6
+---
+- Add a prompt to enter the password at user creation, -p option to set the password in clear in the CLI
+- Move the import functionality in moon_utilities
+- Fix some bugs in generate_opst_policy
+- Fix some bugs when importing directly in cache
+- Add the global attribute functionality
+- Fix of not relevant yields in invalided_functions
+
+0.7
+---
+- Add an installation script
+- Update import json to db and cache functions
+
+0.8
+---
+- Add a change password function
+- Add of a method connecting the user with environment variables \ No newline at end of file
diff --git a/moon_orchestrator/LICENSE b/moon_utilities/LICENSE
index d6456956..d6456956 100644
--- a/moon_orchestrator/LICENSE
+++ b/moon_utilities/LICENSE
diff --git a/moon_utilities/MANIFEST.in b/moon_utilities/MANIFEST.in
new file mode 100644
index 00000000..21c2cf92
--- /dev/null
+++ b/moon_utilities/MANIFEST.in
@@ -0,0 +1,10 @@
+# Copyright 2018 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+include README.md
+include LICENSE
+include Changelog
+include setup.py
+include requirements.txt
diff --git a/moon_utilities/README.md b/moon_utilities/README.md
new file mode 100644
index 00000000..78fdada6
--- /dev/null
+++ b/moon_utilities/README.md
@@ -0,0 +1,3 @@
+# moon_utilities
+
+Python library that implements miscellaneous functions for the Moon project \ No newline at end of file
diff --git a/tools/policies/policy.json.d/cinder.policy.json b/moon_utilities/conf/policy.json.d/cinder.policy.json
index 02af88bd..02af88bd 100644
--- a/tools/policies/policy.json.d/cinder.policy.json
+++ b/moon_utilities/conf/policy.json.d/cinder.policy.json
diff --git a/moon_utilities/conf/policy.json.d/glance.policy.json b/moon_utilities/conf/policy.json.d/glance.policy.json
new file mode 100644
index 00000000..5b1f6be7
--- /dev/null
+++ b/moon_utilities/conf/policy.json.d/glance.policy.json
@@ -0,0 +1,63 @@
+{
+ "context_is_admin": "role:admin",
+ "default": "role:admin",
+
+ "add_image": "",
+ "delete_image": "",
+ "get_image": "",
+ "get_images": "",
+ "modify_image": "",
+ "publicize_image": "role:admin",
+ "communitize_image": "",
+ "copy_from": "",
+
+ "download_image": "",
+ "upload_image": "",
+
+ "delete_image_location": "",
+ "get_image_location": "",
+ "set_image_location": "",
+
+ "add_member": "",
+ "delete_member": "",
+ "get_member": "",
+ "get_members": "",
+ "modify_member": "",
+
+ "manage_image_cache": "role:admin",
+
+ "get_task": "",
+ "get_tasks": "",
+ "add_task": "",
+ "modify_task": "",
+ "tasks_api_access": "role:admin",
+
+ "deactivate": "",
+ "reactivate": "",
+
+ "get_metadef_namespace": "",
+ "get_metadef_namespaces":"",
+ "modify_metadef_namespace":"",
+ "add_metadef_namespace":"",
+
+ "get_metadef_object":"",
+ "get_metadef_objects":"",
+ "modify_metadef_object":"",
+ "add_metadef_object":"",
+
+ "list_metadef_resource_types":"",
+ "get_metadef_resource_type":"",
+ "add_metadef_resource_type_association":"",
+
+ "get_metadef_property":"",
+ "get_metadef_properties":"",
+ "modify_metadef_property":"",
+ "add_metadef_property":"",
+
+ "get_metadef_tag":"",
+ "get_metadef_tags":"",
+ "modify_metadef_tag":"",
+ "add_metadef_tag":"",
+ "add_metadef_tags":""
+
+}
diff --git a/moon_utilities/conf/policy.json.d/keystone.policy.json b/moon_utilities/conf/policy.json.d/keystone.policy.json
new file mode 100644
index 00000000..263912bf
--- /dev/null
+++ b/moon_utilities/conf/policy.json.d/keystone.policy.json
@@ -0,0 +1,260 @@
+{
+ "admin_required": "role:admin",
+ "cloud_admin": "role:admin and (is_admin_project:True or domain_id:admin_domain_id)",
+ "service_role": "role:service",
+ "service_or_admin": "rule:admin_required or rule:service_role",
+ "owner": "user_id:%(user_id)s or user_id:%(target.token.user_id)s",
+ "admin_or_owner": "(rule:admin_required and domain_id:%(target.token.user.domain.id)s) or rule:owner",
+ "admin_and_matching_domain_id": "rule:admin_required and domain_id:%(domain_id)s",
+ "service_admin_or_owner": "rule:service_or_admin or rule:owner",
+
+ "default": "rule:admin_required",
+
+ "identity:get_region": "",
+ "identity:list_regions": "",
+ "identity:create_region": "rule:cloud_admin",
+ "identity:update_region": "rule:cloud_admin",
+ "identity:delete_region": "rule:cloud_admin",
+
+ "identity:get_service": "rule:admin_required",
+ "identity:list_services": "rule:admin_required",
+ "identity:create_service": "rule:cloud_admin",
+ "identity:update_service": "rule:cloud_admin",
+ "identity:delete_service": "rule:cloud_admin",
+
+ "identity:get_endpoint": "rule:admin_required",
+ "identity:list_endpoints": "rule:admin_required",
+ "identity:create_endpoint": "rule:cloud_admin",
+ "identity:update_endpoint": "rule:cloud_admin",
+ "identity:delete_endpoint": "rule:cloud_admin",
+
+ "identity:get_registered_limit": "",
+ "identity:list_registered_limits": "",
+ "identity:create_registered_limits": "rule:admin_required",
+ "identity:update_registered_limits": "rule:admin_required",
+ "identity:delete_registered_limit": "rule:admin_required",
+
+ "identity:get_limit": "",
+ "identity:list_limits": "",
+ "identity:create_limits": "rule:admin_required",
+ "identity:update_limits": "rule:admin_required",
+ "identity:delete_limit": "rule:admin_required",
+
+ "identity:get_domain": "rule:cloud_admin or rule:admin_and_matching_domain_id or token.project.domain.id:%(target.domain.id)s",
+ "identity:list_domains": "rule:cloud_admin",
+ "identity:create_domain": "rule:cloud_admin",
+ "identity:update_domain": "rule:cloud_admin",
+ "identity:delete_domain": "rule:cloud_admin",
+
+ "admin_and_matching_target_project_domain_id": "rule:admin_required and domain_id:%(target.project.domain_id)s",
+ "admin_and_matching_project_domain_id": "rule:admin_required and domain_id:%(project.domain_id)s",
+ "identity:get_project": "rule:cloud_admin or rule:admin_and_matching_target_project_domain_id or project_id:%(target.project.id)s",
+ "identity:list_projects": "rule:cloud_admin or rule:admin_and_matching_domain_id",
+ "identity:list_user_projects": "rule:owner or rule:admin_and_matching_domain_id",
+ "identity:create_project": "rule:cloud_admin or rule:admin_and_matching_project_domain_id",
+ "identity:update_project": "rule:cloud_admin or rule:admin_and_matching_target_project_domain_id",
+ "identity:delete_project": "rule:cloud_admin or rule:admin_and_matching_target_project_domain_id",
+ "identity:create_project_tag": "rule:admin_required",
+ "identity:delete_project_tag": "rule:admin_required",
+ "identity:get_project_tag": "rule:admin_required",
+ "identity:list_project_tags": "rule:admin_required",
+ "identity:delete_project_tags": "rule:admin_required",
+ "identity:update_project_tags": "rule:admin_required",
+
+ "admin_and_matching_target_user_domain_id": "rule:admin_required and domain_id:%(target.user.domain_id)s",
+ "admin_and_matching_user_domain_id": "rule:admin_required and domain_id:%(user.domain_id)s",
+ "identity:get_user": "rule:cloud_admin or rule:admin_and_matching_target_user_domain_id or rule:owner",
+ "identity:list_users": "rule:cloud_admin or rule:admin_and_matching_domain_id",
+ "identity:create_user": "rule:cloud_admin or rule:admin_and_matching_user_domain_id",
+ "identity:update_user": "rule:cloud_admin or rule:admin_and_matching_target_user_domain_id",
+ "identity:delete_user": "rule:cloud_admin or rule:admin_and_matching_target_user_domain_id",
+
+ "admin_and_matching_target_group_domain_id": "rule:admin_required and domain_id:%(target.group.domain_id)s",
+ "admin_and_matching_group_domain_id": "rule:admin_required and domain_id:%(group.domain_id)s",
+ "identity:get_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:list_groups": "rule:cloud_admin or rule:admin_and_matching_domain_id",
+ "identity:list_groups_for_user": "rule:owner or rule:admin_and_matching_target_user_domain_id",
+ "identity:create_group": "rule:cloud_admin or rule:admin_and_matching_group_domain_id",
+ "identity:update_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:delete_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:list_users_in_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:remove_user_from_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:check_user_in_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:add_user_to_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+
+ "identity:get_credential": "rule:admin_required",
+ "identity:list_credentials": "rule:admin_required or user_id:%(user_id)s",
+ "identity:create_credential": "rule:admin_required",
+ "identity:update_credential": "rule:admin_required",
+ "identity:delete_credential": "rule:admin_required",
+
+ "identity:ec2_get_credential": "rule:admin_required or (rule:owner and user_id:%(target.credential.user_id)s)",
+ "identity:ec2_list_credentials": "rule:admin_required or rule:owner",
+ "identity:ec2_create_credential": "rule:admin_required or rule:owner",
+ "identity:ec2_delete_credential": "rule:admin_required or (rule:owner and user_id:%(target.credential.user_id)s)",
+
+ "identity:get_role": "rule:admin_required",
+ "identity:list_roles": "rule:admin_required",
+ "identity:create_role": "rule:cloud_admin",
+ "identity:update_role": "rule:cloud_admin",
+ "identity:delete_role": "rule:cloud_admin",
+
+ "identity:get_domain_role": "rule:cloud_admin or rule:get_domain_roles",
+ "identity:list_domain_roles": "rule:cloud_admin or rule:list_domain_roles",
+ "identity:create_domain_role": "rule:cloud_admin or rule:domain_admin_matches_domain_role",
+ "identity:update_domain_role": "rule:cloud_admin or rule:domain_admin_matches_target_domain_role",
+ "identity:delete_domain_role": "rule:cloud_admin or rule:domain_admin_matches_target_domain_role",
+ "domain_admin_matches_domain_role": "rule:admin_required and domain_id:%(role.domain_id)s",
+ "get_domain_roles": "rule:domain_admin_matches_target_domain_role or rule:project_admin_matches_target_domain_role",
+ "domain_admin_matches_target_domain_role": "rule:admin_required and domain_id:%(target.role.domain_id)s",
+ "project_admin_matches_target_domain_role": "rule:admin_required and project_domain_id:%(target.role.domain_id)s",
+ "list_domain_roles": "rule:domain_admin_matches_filter_on_list_domain_roles or rule:project_admin_matches_filter_on_list_domain_roles",
+ "domain_admin_matches_filter_on_list_domain_roles": "rule:admin_required and domain_id:%(domain_id)s",
+ "project_admin_matches_filter_on_list_domain_roles": "rule:admin_required and project_domain_id:%(domain_id)s",
+ "admin_and_matching_prior_role_domain_id": "rule:admin_required and domain_id:%(target.prior_role.domain_id)s",
+ "implied_role_matches_prior_role_domain_or_global": "(domain_id:%(target.implied_role.domain_id)s or None:%(target.implied_role.domain_id)s)",
+
+ "identity:get_implied_role": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+ "identity:list_implied_roles": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+ "identity:create_implied_role": "rule:cloud_admin or (rule:admin_and_matching_prior_role_domain_id and rule:implied_role_matches_prior_role_domain_or_global)",
+ "identity:delete_implied_role": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+ "identity:list_role_inference_rules": "rule:cloud_admin",
+ "identity:check_implied_role": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+
+ "identity:list_system_grants_for_user": "rule:admin_required",
+ "identity:check_system_grant_for_user": "rule:admin_required",
+ "identity:create_system_grant_for_user": "rule:admin_required",
+ "identity:revoke_system_grant_for_user": "rule:admin_required",
+
+ "identity:list_system_grants_for_group": "rule:admin_required",
+ "identity:check_system_grant_for_group": "rule:admin_required",
+ "identity:create_system_grant_for_group": "rule:admin_required",
+ "identity:revoke_system_grant_for_group": "rule:admin_required",
+
+ "identity:check_grant": "rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants",
+ "identity:list_grants": "rule:cloud_admin or rule:domain_admin_for_list_grants or rule:project_admin_for_list_grants",
+ "identity:create_grant": "rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants",
+ "identity:revoke_grant": "rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants",
+ "domain_admin_for_grants": "rule:domain_admin_for_global_role_grants or rule:domain_admin_for_domain_role_grants",
+ "domain_admin_for_global_role_grants": "rule:admin_required and None:%(target.role.domain_id)s and rule:domain_admin_grant_match",
+ "domain_admin_for_domain_role_grants": "rule:admin_required and domain_id:%(target.role.domain_id)s and rule:domain_admin_grant_match",
+ "domain_admin_grant_match": "domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s",
+ "project_admin_for_grants": "rule:project_admin_for_global_role_grants or rule:project_admin_for_domain_role_grants",
+ "project_admin_for_global_role_grants": "rule:admin_required and None:%(target.role.domain_id)s and project_id:%(project_id)s",
+ "project_admin_for_domain_role_grants": "rule:admin_required and project_domain_id:%(target.role.domain_id)s and project_id:%(project_id)s",
+ "domain_admin_for_list_grants": "rule:admin_required and rule:domain_admin_grant_match",
+ "project_admin_for_list_grants": "rule:admin_required and project_id:%(project_id)s",
+
+ "admin_on_domain_filter": "rule:admin_required and domain_id:%(scope.domain.id)s",
+ "admin_on_project_filter": "rule:admin_required and project_id:%(scope.project.id)s",
+ "admin_on_domain_of_project_filter": "rule:admin_required and domain_id:%(target.project.domain_id)s",
+ "identity:list_role_assignments": "rule:cloud_admin or rule:admin_on_domain_filter or rule:admin_on_project_filter",
+ "identity:list_role_assignments_for_tree": "rule:cloud_admin or rule:admin_on_domain_of_project_filter",
+ "identity:get_policy": "rule:cloud_admin",
+ "identity:list_policies": "rule:cloud_admin",
+ "identity:create_policy": "rule:cloud_admin",
+ "identity:update_policy": "rule:cloud_admin",
+ "identity:delete_policy": "rule:cloud_admin",
+
+ "identity:check_token": "rule:admin_or_owner",
+ "identity:validate_token": "rule:service_admin_or_owner",
+ "identity:validate_token_head": "rule:service_or_admin",
+ "identity:revocation_list": "rule:service_or_admin",
+ "identity:revoke_token": "rule:admin_or_owner",
+
+ "identity:create_trust": "user_id:%(trust.trustor_user_id)s",
+ "identity:list_trusts": "",
+ "identity:list_roles_for_trust": "",
+ "identity:get_role_for_trust": "",
+ "identity:delete_trust": "",
+ "identity:get_trust": "",
+
+ "identity:create_consumer": "rule:admin_required",
+ "identity:get_consumer": "rule:admin_required",
+ "identity:list_consumers": "rule:admin_required",
+ "identity:delete_consumer": "rule:admin_required",
+ "identity:update_consumer": "rule:admin_required",
+
+ "identity:authorize_request_token": "rule:admin_required",
+ "identity:list_access_token_roles": "rule:admin_required",
+ "identity:get_access_token_role": "rule:admin_required",
+ "identity:list_access_tokens": "rule:admin_required",
+ "identity:get_access_token": "rule:admin_required",
+ "identity:delete_access_token": "rule:admin_required",
+
+ "identity:list_projects_for_endpoint": "rule:admin_required",
+ "identity:add_endpoint_to_project": "rule:admin_required",
+ "identity:check_endpoint_in_project": "rule:admin_required",
+ "identity:list_endpoints_for_project": "rule:admin_required",
+ "identity:remove_endpoint_from_project": "rule:admin_required",
+
+ "identity:create_endpoint_group": "rule:admin_required",
+ "identity:list_endpoint_groups": "rule:admin_required",
+ "identity:get_endpoint_group": "rule:admin_required",
+ "identity:update_endpoint_group": "rule:admin_required",
+ "identity:delete_endpoint_group": "rule:admin_required",
+ "identity:list_projects_associated_with_endpoint_group": "rule:admin_required",
+ "identity:list_endpoints_associated_with_endpoint_group": "rule:admin_required",
+ "identity:get_endpoint_group_in_project": "rule:admin_required",
+ "identity:list_endpoint_groups_for_project": "rule:admin_required",
+ "identity:add_endpoint_group_to_project": "rule:admin_required",
+ "identity:remove_endpoint_group_from_project": "rule:admin_required",
+
+ "identity:create_identity_provider": "rule:cloud_admin",
+ "identity:list_identity_providers": "rule:cloud_admin",
+ "identity:get_identity_provider": "rule:cloud_admin",
+ "identity:update_identity_provider": "rule:cloud_admin",
+ "identity:delete_identity_provider": "rule:cloud_admin",
+
+ "identity:create_protocol": "rule:cloud_admin",
+ "identity:update_protocol": "rule:cloud_admin",
+ "identity:get_protocol": "rule:cloud_admin",
+ "identity:list_protocols": "rule:cloud_admin",
+ "identity:delete_protocol": "rule:cloud_admin",
+
+ "identity:create_mapping": "rule:cloud_admin",
+ "identity:get_mapping": "rule:cloud_admin",
+ "identity:list_mappings": "rule:cloud_admin",
+ "identity:delete_mapping": "rule:cloud_admin",
+ "identity:update_mapping": "rule:cloud_admin",
+
+ "identity:create_service_provider": "rule:cloud_admin",
+ "identity:list_service_providers": "rule:cloud_admin",
+ "identity:get_service_provider": "rule:cloud_admin",
+ "identity:update_service_provider": "rule:cloud_admin",
+ "identity:delete_service_provider": "rule:cloud_admin",
+
+ "identity:get_auth_catalog": "",
+ "identity:get_auth_projects": "",
+ "identity:get_auth_domains": "",
+ "identity:get_auth_system": "",
+
+ "identity:list_projects_for_user": "",
+ "identity:list_domains_for_user": "",
+
+ "identity:list_revoke_events": "rule:service_or_admin",
+
+ "identity:create_policy_association_for_endpoint": "rule:cloud_admin",
+ "identity:check_policy_association_for_endpoint": "rule:cloud_admin",
+ "identity:delete_policy_association_for_endpoint": "rule:cloud_admin",
+ "identity:create_policy_association_for_service": "rule:cloud_admin",
+ "identity:check_policy_association_for_service": "rule:cloud_admin",
+ "identity:delete_policy_association_for_service": "rule:cloud_admin",
+ "identity:create_policy_association_for_region_and_service": "rule:cloud_admin",
+ "identity:check_policy_association_for_region_and_service": "rule:cloud_admin",
+ "identity:delete_policy_association_for_region_and_service": "rule:cloud_admin",
+ "identity:get_policy_for_endpoint": "rule:cloud_admin",
+ "identity:list_endpoints_for_policy": "rule:cloud_admin",
+
+ "identity:create_domain_config": "rule:cloud_admin",
+ "identity:get_domain_config": "rule:cloud_admin",
+ "identity:get_security_compliance_domain_config": "",
+ "identity:update_domain_config": "rule:cloud_admin",
+ "identity:delete_domain_config": "rule:cloud_admin",
+ "identity:get_domain_config_default": "rule:cloud_admin",
+
+ "identity:get_application_credential": "rule:admin_or_owner",
+ "identity:list_application_credentials": "rule:admin_or_owner",
+ "identity:create_application_credential": "rule:admin_or_owner",
+ "identity:delete_application_credential": "rule:admin_or_owner"
+}
diff --git a/tools/policies/policy.json.d/neutron.policy.json b/moon_utilities/conf/policy.json.d/neutron.policy.json
index 15f17203..15f17203 100644
--- a/tools/policies/policy.json.d/neutron.policy.json
+++ b/moon_utilities/conf/policy.json.d/neutron.policy.json
diff --git a/tools/policies/policy.json.d/nova.policy.json b/moon_utilities/conf/policy.json.d/nova.policy.json
index da8f5740..da8f5740 100644
--- a/tools/policies/policy.json.d/nova.policy.json
+++ b/moon_utilities/conf/policy.json.d/nova.policy.json
diff --git a/moon_utilities/moon_utilities/__init__.py b/moon_utilities/moon_utilities/__init__.py
new file mode 100644
index 00000000..d1e99258
--- /dev/null
+++ b/moon_utilities/moon_utilities/__init__.py
@@ -0,0 +1,13 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+__version__ = "0.8"
diff --git a/moon_utilities/moon_utilities/auth_functions.py b/moon_utilities/moon_utilities/auth_functions.py
new file mode 100644
index 00000000..08a0ec22
--- /dev/null
+++ b/moon_utilities/moon_utilities/auth_functions.py
@@ -0,0 +1,307 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+"""
+
+import binascii
+import hashlib
+import os
+import hug
+import logging
+import os
+import getpass
+from tinydb import TinyDB, Query
+from moon_utilities import exceptions
+
+LOGGER = logging.getLogger("moon.utilities.auth_functions")
+db = None
+
+
+def init_db(db_filename="db.json"):
+ global db
+ db = TinyDB(db_filename)
+
+
+def xor_encode(data, key):
+ """
+ Encode data with the given key
+
+ :param data: the data to encode
+ :param key: the key ie password
+ :return: a xor-ed version of the 2 strings
+ """
+ if not data:
+ return ""
+ if not key:
+ raise exceptions.EncryptError
+ return binascii.hexlify(
+ ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(data, key)).encode("utf-8")).decode("utf-8")
+
+
+def xor_decode(data, key):
+ """
+ Decode data with the given key
+
+ :param data: the data to decode
+ :param key: the key ie password
+ :return: a xor-ed version of the 2 strings
+ """
+ if not data:
+ return ""
+ if not key:
+ raise exceptions.DecryptError
+ data = binascii.a2b_hex(data.encode("utf-8")).decode("utf-8")
+ return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(data, key))
+
+
+# From https://github.com/timothycrosley/hug/blob/develop/examples/secure_auth_with_db_example.py
+
+def hash_password(password, salt):
+ """
+ Securely hash a password using a provided salt
+ :param password:
+ :param salt:
+ :return: Hex encoded SHA512 hash of provided password
+ """
+ password = str(password).encode('utf-8')
+ salt = str(salt).encode('utf-8')
+ return hashlib.sha512(password + salt).hexdigest()
+
+
+def gen_api_key(username):
+ """
+ Create a random API key for a user
+ :param username:
+ :return: Hex encoded SHA512 random string
+ """
+ salt = str(os.urandom(64)).encode('utf-8')
+ return hash_password(username, salt)
+
+
+def get_api_key_for_user(username):
+ """
+ Return the API key for a particular user
+ :param username:
+ :return: API key
+ """
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ user = db.get(user_model.username == username)
+
+ if not user:
+ LOGGER.warning("User %s not found", username)
+ return False
+
+ return user['api_key']
+
+
+def del_api_key_for_user(username):
+ """
+ Delete the API key for a particular user
+ :param username:
+ :return: API key
+ """
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ users = db.search(user_model.username == username)
+
+ if not users:
+ LOGGER.warning("User %s not found", username)
+ return False
+ try:
+ for user in users:
+ user['api_key'] = None
+ db.write_back(users)
+ return True
+ except Exception as e:
+ LOGGER.exception(e)
+ return False
+
+
+def connect_from_env():
+ try:
+ user = os.environ["MOON_USERNAME"]
+ pw = os.environ["MOON_PASSWORD"]
+ except KeyError:
+ LOGGER.error("Set your credentials with moonrc")
+ exit(-1)
+
+ return get_api_key(user, pw)
+
+
+@hug.cli("get_key")
+def get_api_key(username, password):
+ """
+ Authenticate a username and password against our database
+ :param username:
+ :param password:
+ :return: authenticated username
+ """
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ user = db.get(user_model.username == username)
+
+ if not user:
+ LOGGER.warning("User %s not found", username)
+ return False
+
+ if user['password'] == hash_password(password, user.get('salt')):
+ return user['api_key']
+
+ return False
+
+
+@hug.cli()
+def authenticate_user(username, password):
+ """
+ Authenticate a username and password against our database
+ :param username:
+ :param password:
+ :return: authenticated username
+ """
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ users = db.search(user_model.username == username)
+
+ if not users:
+ LOGGER.warning("User %s not found", username)
+ return False
+
+ for user in users:
+ # Note: will only update the first item
+ if user['password'] == hash_password(password, user.get('salt')):
+ if not user['api_key']:
+ api_key = gen_api_key(username)
+ user['api_key'] = api_key
+ db.write_back(users)
+ return user['username']
+ LOGGER.warning("Wrong password for user %s", username)
+ return False
+
+
+@hug.cli()
+def change_password(username, current_password, new_password):
+ """
+ Change the password of the user in the database
+ :param username:
+ :param current_password:
+ :param new_password:
+ :return: True or False
+ """
+
+ if current_password == "": # nosec (not a hardcoded password)
+ current_password = getpass.getpass()
+
+ is_password_ok = authenticate_user(username, current_password)
+ if not is_password_ok:
+ return False
+
+ if new_password == "": # nosec (not a hardcoded password)
+ new_password = getpass.getpass()
+
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ user = db.search(user_model.username == username)[0]
+
+ salt = user['salt']
+ password = hash_password(new_password, salt)
+ api_key = gen_api_key(username)
+
+ user_id = db.update({'password': password, 'api_key': api_key}, doc_ids=[user.doc_id])
+
+ return {
+ 'result': 'success',
+ 'eid': user_id,
+ 'user_created': user,
+ 'api_key': api_key
+ }
+
+
+@hug.cli()
+def authenticate_key(api_key):
+ """
+ Authenticate an API key against our database
+ :param api_key:
+ :return: authenticated username
+ """
+ global db
+ if db is None:
+ init_db()
+ try:
+ if not api_key:
+ return False
+ user_model = Query()
+ user = db.search(user_model.api_key == api_key)[0]
+ if user:
+ return user['username']
+ except Exception as e:
+ LOGGER.exception(e)
+ LOGGER.error("Cannot retrieve user for this authentication key {}".format(api_key))
+ return False
+
+
+"""
+ API Methods start here
+"""
+
+api_key_authentication = hug.authentication.api_key(authenticate_key)
+basic_authentication = hug.authentication.basic(authenticate_user)
+
+
+@hug.cli("add_user") # nosec (not a hardcoded password)
+def add_user(username, password=""):
+ """
+ CLI Parameter to add a user to the database
+ :param username:
+ :param password: if not given, a password prompt is displayed
+ :return: JSON status output
+ """
+ global db
+ if db is None:
+ init_db()
+ user_model = Query()
+ if db.search(user_model.username == username):
+ return {
+ 'error': 'User {0} already exists'.format(username)
+ }
+
+ if password == "": # nosec (not a hardcoded password)
+ password = getpass.getpass()
+
+ salt = hashlib.sha512(str(os.urandom(64)).encode('utf-8')).hexdigest()
+ password = hash_password(password, salt)
+ api_key = gen_api_key(username)
+
+ user = {
+ 'username': username,
+ 'password': password,
+ 'salt': salt,
+ 'api_key': api_key
+ }
+ user_id = db.insert(user)
+
+ return {
+ 'result': 'success',
+ 'eid': user_id,
+ 'user_created': user,
+ 'api_key': api_key
+ }
diff --git a/moon_utilities/moon_utilities/exceptions.py b/moon_utilities/moon_utilities/exceptions.py
new file mode 100644
index 00000000..4e016e70
--- /dev/null
+++ b/moon_utilities/moon_utilities/exceptions.py
@@ -0,0 +1,903 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.utilities.exceptions")
+_ = str
+
+
+class MoonErrorMetaClass(type):
+
+ def __init__(cls, name, bases, dct):
+ super(MoonErrorMetaClass, cls).__init__(name, bases, dct)
+ cls.hierarchy += "/" + str(name)
+
+
+class MoonError(BaseException):
+ __metaclass__ = MoonErrorMetaClass
+ hierarchy = ""
+ description = _("There is an error requesting the Moon platform.")
+ code = 400
+ title = 'Moon Error'
+ logger = "ERROR"
+
+ def __init__(self, message="", status_code=None, payload=""):
+ if message:
+ self.description = message
+ if status_code:
+ self.code = status_code
+ self.payload = payload
+ super(MoonError, self).__init__()
+
+ def __str__(self):
+ return "{}: {}".format(self.code, self.title)
+
+ def __del__(self):
+ message = "{} ({}) {}".format(self.hierarchy, self.description, self.payload)
+ if self.logger == "ERROR":
+ try:
+ logger.error(message)
+ except AttributeError:
+ logger.error(message)
+ elif self.logger == "WARNING":
+ try:
+ logger.warning(message)
+ except AttributeError:
+ logger.warning(message)
+ elif self.logger == "CRITICAL":
+ try:
+ logger.critical(message)
+ except AttributeError:
+ logger.critical(message)
+ elif self.logger == "AUTHZ":
+ try:
+ logger.error(message)
+ except AttributeError:
+ logger.error(message)
+ else:
+ try:
+ logger.info(message)
+ except AttributeError:
+ logger.info(message)
+
+ # def to_dict(self):
+ # rv = dict(self.payload or ())
+ # rv['message'] = "{} ({})".format(self.hierarchy, self.description)
+ # rv['title'] = self.title
+ # rv['code'] = self.code
+ # return rv
+
+
+# Exceptions for Tenant
+
+class TenantException(MoonError):
+ description = _("There is an error requesting this tenant.")
+ code = 400
+ title = 'Tenant Error'
+ logger = "ERROR"
+
+
+class TenantUnknown(TenantException):
+ description = _("The tenant is unknown.")
+ code = 400
+ title = 'Tenant Unknown'
+ logger = "ERROR"
+
+
+class TenantAddedNameExisting(TenantException):
+ description = _("The tenant name is existing.")
+ code = 400
+ title = 'Added Tenant Name Existing'
+ logger = "ERROR"
+
+
+class TenantNoIntraExtension(TenantException):
+ description = _("The tenant has not intra_extension.")
+ code = 400
+ title = 'Tenant No Intra_Extension'
+ logger = "ERROR"
+
+
+class TenantNoIntraAuthzExtension(TenantNoIntraExtension):
+ description = _("The tenant has not intra_admin_extension.")
+ code = 400
+ title = 'Tenant No Intra_Admin_Extension'
+ logger = "ERROR"
+
+
+# Exceptions for IntraExtension
+
+
+class IntraExtensionException(MoonError):
+ description = _("There is an error requesting this IntraExtension.")
+ code = 400
+ title = 'Extension Error'
+
+
+class IntraExtensionUnknown(IntraExtensionException):
+ description = _("The intra_extension is unknown.")
+ code = 400
+ title = 'Intra Extension Unknown'
+ logger = "Error"
+
+
+class ModelUnknown(MoonError):
+ description = _("The model is unknown.")
+ code = 400
+ title = 'Model Unknown'
+ logger = "Error"
+
+
+class ModelContentError(MoonError):
+ description = _("The model content is invalid.")
+ code = 400
+ title = 'Model Unknown'
+ logger = "Error"
+
+
+class ModelExisting(MoonError):
+ description = _("The model already exists.")
+ code = 409
+ title = 'Model Error'
+ logger = "Error"
+
+
+# Authz exceptions
+
+class AuthzException(MoonError):
+ description = _("There is an authorization error requesting this IntraExtension.")
+ code = 403
+ title = 'Authz Exception'
+ logger = "AUTHZ"
+
+
+# Auth exceptions
+
+class AuthException(MoonError):
+ description = _("There is an authentication error requesting this API. "
+ "You must provide a valid token from Keystone.")
+ code = 401
+ title = 'Auth Exception'
+ logger = "AUTHZ"
+
+
+# Admin exceptions
+
+class AdminException(MoonError):
+ description = _("There is an error requesting this Authz IntraExtension.")
+ code = 400
+ title = 'Authz Exception'
+ logger = "AUTHZ"
+
+
+class AdminMetaData(AdminException):
+ code = 400
+ title = 'Metadata Exception'
+
+
+class AdminPerimeter(AdminException):
+ code = 400
+ title = 'Perimeter Exception'
+
+
+class AdminScope(AdminException):
+ code = 400
+ title = 'Scope Exception'
+
+
+class AdminAssignment(AdminException):
+ code = 400
+ title = 'Assignment Exception'
+
+
+class AdminMetaRule(AdminException):
+ code = 400
+ title = 'Aggregation Algorithm Exception'
+
+
+class AdminRule(AdminException):
+ code = 400
+ title = 'Rule Exception'
+
+
+class CategoryNameInvalid(AdminMetaData):
+ description = _("The given category name is invalid.")
+ code = 400
+ title = 'Category Name Invalid'
+ logger = "ERROR"
+
+
+class SubjectCategoryExisting(AdminMetaData):
+ description = _("The given subject category already exists.")
+ code = 409
+ title = 'Subject Category Existing'
+ logger = "ERROR"
+
+
+class ObjectCategoryExisting(AdminMetaData):
+ description = _("The given object category already exists.")
+ code = 409
+ title = 'Object Category Existing'
+ logger = "ERROR"
+
+
+class ActionCategoryExisting(AdminMetaData):
+ description = _("The given action category already exists.")
+ code = 409
+ title = 'Action Category Existing'
+ logger = "ERROR"
+
+
+class SubjectCategoryUnknown(AdminMetaData):
+ description = _("The given subject category is unknown.")
+ code = 400
+ title = 'Subject Category Unknown'
+ logger = "ERROR"
+
+
+class DeleteSubjectCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete subject category used in meta rule ")
+ code = 400
+ title = 'Subject Category With Meta Rule Error'
+ logger = "Error"
+
+
+class DeleteObjectCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete Object category used in meta rule ")
+ code = 400
+ title = 'Object Category With Meta Rule Error'
+ logger = "Error"
+
+
+class ObjectCategoryUnknown(AdminMetaData):
+ description = _("The given object category is unknown.")
+ code = 400
+ title = 'Object Category Unknown'
+ logger = "ERROR"
+
+
+class DeleteActionCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete Action category used in meta rule ")
+ code = 400
+ title = 'Action Category With Meta Rule Error'
+ logger = "Error"
+
+
+class ActionCategoryUnknown(AdminMetaData):
+ description = _("The given action category is unknown.")
+ code = 400
+ title = 'Action Category Unknown'
+ logger = "ERROR"
+
+
+class PerimeterContentError(AdminPerimeter):
+ description = _("Perimeter content is invalid.")
+ code = 400
+ title = 'Perimeter content is invalid.'
+ logger = "ERROR"
+
+
+class DeletePerimeterWithAssignment(MoonError):
+ description = _("Cannot delete perimeter with assignment")
+ code = 400
+ title = 'Perimeter With Assignment Error'
+ logger = "Error"
+
+
+class SubjectUnknown(AdminPerimeter):
+ description = _("The given subject is unknown.")
+ code = 400
+ title = 'Subject Unknown'
+ logger = "ERROR"
+
+
+class ObjectUnknown(AdminPerimeter):
+ description = _("The given object is unknown.")
+ code = 400
+ title = 'Object Unknown'
+ logger = "ERROR"
+
+
+class ActionUnknown(AdminPerimeter):
+ description = _("The given action is unknown.")
+ code = 400
+ title = 'Action Unknown'
+ logger = "ERROR"
+
+
+class SubjectExisting(AdminPerimeter):
+ description = _("The given subject is existing.")
+ code = 409
+ title = 'Subject Existing'
+ logger = "ERROR"
+
+
+class ObjectExisting(AdminPerimeter):
+ description = _("The given object is existing.")
+ code = 409
+ title = 'Object Existing'
+ logger = "ERROR"
+
+
+class ActionExisting(AdminPerimeter):
+ description = _("The given action is existing.")
+ code = 409
+ title = 'Action Existing'
+ logger = "ERROR"
+
+
+class SubjectNameExisting(AdminPerimeter):
+ description = _("The given subject name is existing.")
+ code = 409
+ title = 'Subject Name Existing'
+ logger = "ERROR"
+
+
+class ObjectNameExisting(AdminPerimeter):
+ description = _("The given object name is existing.")
+ code = 409
+ title = 'Object Name Existing'
+ logger = "ERROR"
+
+
+class ActionNameExisting(AdminPerimeter):
+ description = _("The given action name is existing.")
+ code = 409
+ title = 'Action Name Existing'
+ logger = "ERROR"
+
+
+class ObjectsWriteNoAuthorized(AdminPerimeter):
+ description = _("The modification on Objects is not authorized.")
+ code = 400
+ title = 'Objects Write No Authorized'
+ logger = "AUTHZ"
+
+
+class ActionsWriteNoAuthorized(AdminPerimeter):
+ description = _("The modification on Actions is not authorized.")
+ code = 400
+ title = 'Actions Write No Authorized'
+ logger = "AUTHZ"
+
+
+class SubjectScopeUnknown(AdminScope):
+ description = _("The given subject scope is unknown.")
+ code = 400
+ title = 'Subject Scope Unknown'
+ logger = "ERROR"
+
+
+class ObjectScopeUnknown(AdminScope):
+ description = _("The given object scope is unknown.")
+ code = 400
+ title = 'Object Scope Unknown'
+ logger = "ERROR"
+
+
+class ActionScopeUnknown(AdminScope):
+ description = _("The given action scope is unknown.")
+ code = 400
+ title = 'Action Scope Unknown'
+ logger = "ERROR"
+
+
+class SubjectScopeExisting(AdminScope):
+ description = _("The given subject scope is existing.")
+ code = 409
+ title = 'Subject Scope Existing'
+ logger = "ERROR"
+
+
+class ObjectScopeExisting(AdminScope):
+ description = _("The given object scope is existing.")
+ code = 409
+ title = 'Object Scope Existing'
+ logger = "ERROR"
+
+
+class ActionScopeExisting(AdminScope):
+ description = _("The given action scope is existing.")
+ code = 409
+ title = 'Action Scope Existing'
+ logger = "ERROR"
+
+
+class SubjectScopeNameExisting(AdminScope):
+ description = _("The given subject scope name is existing.")
+ code = 409
+ title = 'Subject Scope Name Existing'
+ logger = "ERROR"
+
+
+class ObjectScopeNameExisting(AdminScope):
+ description = _("The given object scope name is existing.")
+ code = 409
+ title = 'Object Scope Name Existing'
+ logger = "ERROR"
+
+
+class ActionScopeNameExisting(AdminScope):
+ description = _("The given action scope name is existing.")
+ code = 409
+ title = 'Action Scope Name Existing'
+ logger = "ERROR"
+
+
+class SubjectAssignmentUnknown(AdminAssignment):
+ description = _("The given subject assignment value is unknown.")
+ code = 400
+ title = 'Subject Assignment Unknown'
+ logger = "ERROR"
+
+
+class ObjectAssignmentUnknown(AdminAssignment):
+ description = _("The given object assignment value is unknown.")
+ code = 400
+ title = 'Object Assignment Unknown'
+ logger = "ERROR"
+
+
+class ActionAssignmentUnknown(AdminAssignment):
+ description = _("The given action assignment value is unknown.")
+ code = 400
+ title = 'Action Assignment Unknown'
+ logger = "ERROR"
+
+
+class SubjectAssignmentExisting(AdminAssignment):
+ description = _("The given subject assignment value is existing.")
+ code = 409
+ title = 'Subject Assignment Existing'
+ logger = "ERROR"
+
+
+class ObjectAssignmentExisting(AdminAssignment):
+ description = _("The given object assignment value is existing.")
+ code = 409
+ title = 'Object Assignment Existing'
+ logger = "ERROR"
+
+
+class ActionAssignmentExisting(AdminAssignment):
+ description = _("The given action assignment value is existing.")
+ code = 409
+ title = 'Action Assignment Existing'
+ logger = "ERROR"
+
+
+class AggregationAlgorithmNotExisting(AdminMetaRule):
+ description = _("The given aggregation algorithm is not existing.")
+ code = 400
+ title = 'Aggregation Algorithm Not Existing'
+ logger = "ERROR"
+
+
+class AggregationAlgorithmUnknown(AdminMetaRule):
+ description = _("The given aggregation algorithm is unknown.")
+ code = 400
+ title = 'Aggregation Algorithm Unknown'
+ logger = "ERROR"
+
+
+class SubMetaRuleAlgorithmNotExisting(AdminMetaRule):
+ description = _("The given sub_meta_rule algorithm is unknown.")
+ code = 400
+ title = 'Sub_meta_rule Algorithm Unknown'
+ logger = "ERROR"
+
+
+class MetaRuleUnknown(AdminMetaRule):
+ description = _("The given meta rule is unknown.")
+ code = 400
+ title = 'Meta Rule Unknown'
+ logger = "ERROR"
+
+
+class MetaRuleNotLinkedWithPolicyModel(MoonError):
+ description = _("The meta rule is not found in the model attached to the policy.")
+ code = 400
+ title = 'MetaRule Not Linked With Model - Policy'
+ logger = "Error"
+
+
+class CategoryNotAssignedMetaRule(MoonError):
+ description = _("The category is not found in the meta rules attached to the policy.")
+ code = 400
+ title = 'Category Not Linked With Meta Rule - Policy'
+ logger = "Error"
+
+
+class SubMetaRuleNameExisting(AdminMetaRule):
+ description = _("The sub meta rule name already exists.")
+ code = 409
+ title = 'Sub Meta Rule Name Existing'
+ logger = "ERROR"
+
+
+class MetaRuleExisting(AdminMetaRule):
+ description = _("The meta rule already exists.")
+ code = 409
+ title = 'Meta Rule Existing'
+ logger = "ERROR"
+
+
+class MetaRuleContentError(AdminMetaRule):
+ description = _("Invalid content of meta rule.")
+ code = 400
+ title = 'Meta Rule Error'
+ logger = "ERROR"
+
+
+class MetaRuleUpdateError(AdminMetaRule):
+ description = _("Meta_rule is used in Rule.")
+ code = 400
+ title = 'Meta_Rule Update Error'
+ logger = "ERROR"
+
+
+class RuleExisting(AdminRule):
+ description = _("The rule already exists.")
+ code = 409
+ title = 'Rule Existing'
+ logger = "ERROR"
+
+
+class RuleContentError(AdminRule):
+ description = _("Invalid content of rule.")
+ code = 400
+ title = 'Rule Error'
+ logger = "ERROR"
+
+
+class RuleUnknown(AdminRule):
+ description = _("The rule for that request doesn't exist.")
+ code = 400
+ title = 'Rule Unknown'
+ logger = "ERROR"
+
+
+# Consul exceptions
+
+
+class ConsulError(MoonError):
+ description = _("There is an error connecting to Consul.")
+ code = 400
+ title = 'Consul error'
+ logger = "ERROR"
+
+
+class ConsulComponentNotFound(ConsulError):
+ description = _("The component do not exist in Consul database.")
+ code = 500
+ title = 'Consul error'
+ logger = "WARNING"
+
+
+class ConsulComponentContentError(ConsulError):
+ description = _("invalid content of component .")
+ code = 500
+ title = 'Consul Content error'
+ logger = "WARNING"
+
+
+# Containers exceptions
+
+
+class DockerError(MoonError):
+ description = _("There is an error with Docker.")
+ code = 400
+ title = 'Docker error'
+ logger = "ERROR"
+
+
+class ContainerMissing(DockerError):
+ description = _("Some containers are missing.")
+ code = 400
+ title = 'Container missing'
+ logger = "ERROR"
+
+
+class WrapperConflict(MoonError):
+ description = _("A Wrapper already exist for the specified slave.")
+ code = 409
+ title = 'Wrapper conflict'
+ logger = "ERROR"
+
+
+class PipelineConflict(MoonError):
+ description = _("A Pipeline already exist for the specified slave.")
+ code = 409
+ title = 'Pipeline conflict'
+ logger = "ERROR"
+
+
+class PipelineUnknown(MoonError):
+ description = _("This Pipeline is unknown from the system.")
+ code = 400
+ title = 'Pipeline Unknown'
+ logger = "ERROR"
+
+
+class WrapperUnknown(MoonError):
+ description = _("This Wrapper is unknown from the system.")
+ code = 400
+ title = 'Wrapper Unknown'
+ logger = "ERROR"
+
+
+class SlaveNameUnknown(MoonError):
+ description = _("The slave is unknown.")
+ code = 400
+ title = 'Slave Unknown'
+ logger = "Error"
+
+
+class SlaveExisting(MoonError):
+ description = _("The slave already exists.")
+ code = 409
+ title = 'Slave Error'
+ logger = "Error"
+
+
+class PdpUnknown(MoonError):
+ description = _("The pdp is unknown.")
+ code = 400
+ title = 'Pdp Unknown'
+ logger = "Error"
+
+
+class PdpExisting(MoonError):
+ description = _("The pdp already exists.")
+ code = 409
+ title = 'Pdp Error'
+ logger = "Error"
+
+
+class PdpContentError(MoonError):
+ description = _("Invalid content of pdp.")
+ code = 400
+ title = 'Pdp Error'
+ logger = "Error"
+
+
+class PdpInUse(MoonError):
+ description = _("The pdp is inuse.")
+ code = 400
+ title = 'Pdp Inuse'
+ logger = "Error"
+
+
+class PdpKeystoneMappingConflict(MoonError):
+ description = _("A pdp is already mapped to that Keystone project.")
+ code = 409
+ title = 'Pdp Mapping Error'
+ logger = "Error"
+
+
+class PolicyUnknown(MoonError):
+ description = _("The policy is unknown.")
+ code = 400
+ title = 'Policy Unknown'
+ logger = "Error"
+
+
+class PolicyContentError(MoonError):
+ description = _("The policy content is invalid.")
+ code = 400
+ title = 'Policy Content Error'
+ logger = "Error"
+
+
+class PolicyExisting(MoonError):
+ description = _("The policy already exists.")
+ code = 409
+ title = 'Policy Already Exists'
+ logger = "Error"
+
+
+class PolicyUpdateError(MoonError):
+ description = _("The policy data is used.")
+ code = 400
+ title = 'Policy update error'
+ logger = "Error"
+
+
+class DeleteData(MoonError):
+ description = _("Cannot delete data with assignment")
+ code = 400
+ title = 'Data Error'
+ logger = "Error"
+
+
+class DeleteCategoryWithData(MoonError):
+ description = _("Cannot delete category with data")
+ code = 400
+ title = 'Category With Data Error'
+ logger = "Error"
+
+
+class DeleteCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete category with meta rule")
+ code = 400
+ title = 'Category With MetaRule Error'
+ logger = "Error"
+
+
+class DeleteCategoryWithAssignment(MoonError):
+ description = _("Cannot delete category with assignment ")
+ code = 400
+ title = 'Category With Assignment Error'
+ logger = "Error"
+
+
+class DeleteModelWithPolicy(MoonError):
+ description = _("Cannot delete model with policy")
+ code = 400
+ title = 'Model With Policy Error'
+ logger = "Error"
+
+
+class DeletePolicyWithPdp(MoonError):
+ description = _("Cannot delete policy with pdp")
+ code = 400
+ title = 'Policy With PDP Error'
+ logger = "Error"
+
+
+class DeletePolicyWithPerimeter(MoonError):
+ description = _("Cannot delete policy with perimeter")
+ code = 400
+ title = 'Policy With Perimeter Error'
+ logger = "Error"
+
+
+class DeletePolicyWithData(MoonError):
+ description = _("Cannot delete policy with data")
+ code = 400
+ title = 'Policy With Data Error'
+ logger = "Error"
+
+
+class DeletePolicyWithRules(MoonError):
+ description = _("Cannot delete policy with rules")
+ code = 400
+ title = 'Policy With Rule Error'
+ logger = "Error"
+
+
+class DeleteMetaRuleWithModel(MoonError):
+ description = _("Cannot delete meta rule with model")
+ code = 400
+ title = 'Meta rule With Model Error'
+ logger = "Error"
+
+
+class DeleteMetaRuleWithRule(MoonError):
+ description = _("Cannot delete meta rule with rule")
+ code = 400
+ title = 'Meta rule With Model Error'
+ logger = "Error"
+
+
+class DataContentError(MoonError):
+ description = _("The data Content Error.")
+ code = 400
+ title = 'Data Content Error'
+ logger = "Error"
+
+
+class DataUnknown(MoonError):
+ description = _("The data unknown.")
+ code = 400
+ title = 'Data Unknown'
+ logger = "Error"
+
+
+class ValidationContentError(MoonError):
+ description = _("The Content validation incorrect.")
+ code = 400
+ title = 'Invalid Content'
+ logger = "Error"
+
+ def __init__(self, message=""):
+ self.message = message
+ super().__init__(message)
+
+ def __str__(self):
+ return self.message
+
+
+class ValidationKeyError(MoonError):
+ description = _("The Key validation incorrect.")
+ code = 400
+ title = 'Invalid Key'
+ logger = "Error"
+
+ def __init__(self, message=""):
+ self.message = message
+ super().__init__(message)
+
+ def __str__(self):
+ return self.message
+
+
+class ForbiddenOverride(MoonError):
+ description = _("Forbidden override flag.")
+ code = 500
+ title = 'Forbidden override.'
+ logger = "Error"
+
+
+class InvalidJson(MoonError):
+ description = _("Invalid Json")
+ code = 400
+ title = 'Invalid Json.'
+ logger = "Error"
+
+
+class UnknownName(MoonError):
+ description = _("Name is Unknown")
+ code = 400
+ title = 'Unknown Name.'
+ logger = "Error"
+
+
+class UnknownId(MoonError):
+ description = _("ID is Unknown")
+ code = 400
+ title = 'Unknown ID.'
+ logger = "Error"
+
+
+class MissingIdOrName(MoonError):
+ description = _("Name or ID is missing")
+ code = 400
+ title = 'Missing ID or Name.'
+ logger = "Error"
+
+
+class UnknownField(MoonError):
+ description = _("Field is Unknown")
+ code = 400
+ title = 'Unknown Field.'
+ logger = "Error"
+
+
+class DecryptError(MoonError):
+ description = _("Cannot decrypt API key")
+ code = 401
+ title = 'API Key Error.'
+ logger = "Error"
+
+
+class EncryptError(MoonError):
+ description = _("Cannot encrypt API key")
+ code = 401
+ title = 'API Key Error.'
+ logger = "Error"
+
+
+class AttributeUnknownError(MoonError):
+ description = _("Cannot find attribute")
+ code = 401
+ title = 'Attribute Error.'
+ logger = "Error"
+
+
+class AttributeValueUnknownError(MoonError):
+ description = _("Cannot find value for this attribute")
+ code = 401
+ title = 'Attribute Value Error.'
+ logger = "Error"
+
diff --git a/moon_utilities/moon_utilities/generate_opst_policy.py b/moon_utilities/moon_utilities/generate_opst_policy.py
new file mode 100644
index 00000000..4e357911
--- /dev/null
+++ b/moon_utilities/moon_utilities/generate_opst_policy.py
@@ -0,0 +1,503 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Generate a policy template from a list of OpenStack policy.json file
+"""
+import argparse
+import json
+import logging
+import os
+import re
+import glob
+import copy
+
+
+FILES = [
+ "cinder.policy.json",
+ "glance.policy.json",
+ "keystone.policy.json",
+ "neutron.policy.json",
+ "nova.policy.json",
+]
+policy_in = {
+ "pdps": [
+ {
+ "name": "external_pdp",
+ "keystone_project_id": "",
+ "description": "",
+ "policies": [{"name": "OpenStack RBAC Policy"}]
+ }
+ ],
+
+ "policies": [
+ {
+ "name": "OpenStack RBAC Policy",
+ "genre": "authz",
+ "description": "A RBAC policy similar of what you can find through policy.json files",
+ "model": {"name": "OPST_RBAC"}, "mandatory": True, "override": True
+ }
+ ],
+
+ "models": [
+ {
+ "name": "OPST_RBAC",
+ "description": "",
+ "meta_rules": [{"name": "rbac"}],
+ "override": True
+ }
+ ],
+
+ "subjects": [
+ {"name": "admin", "description": "", "extra": {},
+ "policies": [{"name": "OpenStack RBAC Policy"}]}
+ ],
+
+ "subject_categories": [{"name": "role", "description": "a role in OpenStack"}],
+
+ "subject_data": [
+ {"name": "admin", "description": "the admin role",
+ "policies": [], "category": {"name": "role"}},
+ {"name": "member", "description": "the member role",
+ "policies": [], "category": {"name": "role"}}
+ ],
+
+ "subject_assignments": [
+ {"subject": {"name": "admin"}, "category": {"name": "role"},
+ "assignments": [{"name": "admin"}, {"name": "member"}]},
+ ],
+
+ "objects": [
+ {"name": "all", "description": "describe all element of a project", "extra": {},
+ "policies": [{"name": "OpenStack RBAC Policy"}]},
+ ],
+
+ "object_categories": [{"name": "id", "description": "the UID of each virtual machine"}],
+
+ "object_data": [
+ {
+ "name": "all",
+ "description": "represents all virtual machines in this project",
+ "policies": [],
+ "category": {"name": "id"}},
+ ],
+
+ "object_assignments": [
+ {"object": {"name": "all"}, "category": {"name": "id"}, "assignments": [{"name": "all"}]}
+ ],
+
+ "actions": [],
+
+ "action_categories": [{"name": "action_id", "description": ""}],
+
+ "action_data": [],
+
+ "action_assignments": [],
+
+ "meta_rules": [
+ {
+ "name": "rbac", "description": "",
+ "subject_categories": [{"name": "role"}],
+ "object_categories": [{"name": "id"}],
+ "action_categories": [{"name": "action_id"}]
+ }
+ ],
+
+ "rules": [],
+
+}
+
+policy_out = copy.deepcopy(policy_in)
+
+AUTO_EXCLUDE_KEYS = """
+context_is_admin
+admin_or_owner
+admin_api
+default
+owner
+context_is_advsvc
+admin_or_network_owner
+admin_owner_or_network_owner
+admin_only
+regular_user
+admin_or_data_plane_int
+shared
+shared_subnetpools
+shared_address_scopes
+external
+admin_required
+cloud_admin
+service_role
+service_or_admin
+admin_and_matching_domain_id
+service_admin_or_owner
+"""
+
+logger = logging.getLogger(__name__)
+__rules = []
+
+
+def init():
+ """
+ Initialize the application
+ :return: argument given in the command line
+ """
+ global policy_in, policy_out
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--verbose", '-v', action='store_true', help='verbose mode')
+ parser.add_argument("--debug", '-d', action='store_true', help='debug mode')
+ parser.add_argument("--dir",
+ help='directory containing policy files, defaults to ./policy.json.d',
+ default="./policy.json.d")
+ parser.add_argument("--template", "-t",
+ help='use a specific template file, defaults to internal template',
+ default="")
+ parser.add_argument("--indent", '-i', help='indent the output (default:None)', type=int,
+ default=None)
+ parser.add_argument("--output", '-o', help='output name, defaults to opst_default_policy.json',
+ type=str, default="opst_default_policy.json")
+ parser.add_argument("--exclude", "-x",
+ help="Exclude some attributes in output "
+ "(example: \"actions,*_categories\")",
+ default="")
+ args = parser.parse_args()
+ logging_format = "%(levelname)s: %(message)s"
+ if args.verbose:
+ logging.basicConfig(level=logging.INFO, format=logging_format)
+ if args.debug:
+ logging.basicConfig(level=logging.DEBUG, format=logging_format)
+ else:
+ logging.basicConfig(format=logging_format)
+ if args.template:
+ try:
+ policy_in = json.loads(open(args.template).read())
+ policy_out = copy.deepcopy(policy_in)
+ logger.info("Using template {}".format(args.template))
+ policy_out.pop('rules')
+ policy_out['rules'] = []
+ for cpt, item in enumerate(policy_in['rules']):
+ if "templates" not in item:
+ policy_out['rules'].append(item)
+ policy_out.pop('action_assignments')
+ policy_out['action_assignments'] = []
+ for cpt, item in enumerate(policy_in['action_assignments']):
+ if "templates" not in item:
+ policy_out['action_assignments'].append(item)
+
+ except json.decoder.JSONDecodeError as e:
+ logger.error("Cannot decode template file {}".format(args.template))
+ if args.debug:
+ logger.exception(e)
+
+ return args
+
+
+def get_json(filename):
+ """
+ retrieve rule from a JSON file
+ :param filename: url of the file
+ :return: list of rules in this file
+ """
+ _json_file = json.loads(open(filename).read())
+ keys = list(_json_file.keys())
+ values = list(_json_file.values())
+ for value in values:
+ if value in keys:
+ keys.remove(value)
+ return keys
+
+
+def get_flat(filename):
+ """
+ retrieve rule from a flat text file
+ :param filename: url of the file
+ :return: list of rules in this file
+ """
+ results = []
+ for line in open(filename):
+ key = line.split('"')[1]
+ results.append(key)
+ return results
+
+
+def get_opst_rules(args):
+ """
+ Get all rules in each policy.json
+ :param args: arguments given in the command line
+ :return: all rules in a dict
+ """
+ results = {}
+ for filename in glob.glob(os.path.join(args.dir, "**/*.json"), recursive=True):
+ logger.info("Reading {}".format(filename))
+ component = filename.replace("policy.json", "").strip("/")
+ component = os.path.basename(component).split(".")[0]
+ try:
+ keys = get_json(filename)
+ except json.decoder.JSONDecodeError:
+ keys = get_flat(filename)
+ for _key in AUTO_EXCLUDE_KEYS.splitlines():
+ if _key in keys:
+ keys.remove(_key)
+ results[component] = keys
+ logger.info("Adding {} definitions in {}".format(len(keys), component))
+ return results
+
+
+def get_policy_name():
+ """
+ Retrieve the policy name from the policy dict
+ Useful if the policy data comes from a template
+ """
+ for _policy in policy_in.get("policies"):
+ return _policy.get("name")
+
+
+def get_meta_rule_name():
+ """
+ Retrieve the policy name from the policy dict
+ Useful if the policy data comes from a template
+ """
+ for _policy in policy_in.get("meta_rules"):
+ return _policy.get("name")
+
+
+def get_default_data(data, category):
+ """
+ Find the default value from a list of data, return the first one if no default found
+ :param data: the data to search in
+ :param category: the category of the data
+ :return: one name contained in data
+ """
+ for _data in data:
+ if _data.get("category").get("name") == category:
+ if _data.get("extra", {}).get("action") == "default":
+ return _data.get("name")
+ # default: return the first one
+ for _data in data:
+ if _data.get("category").get("name") == category:
+ return _data.get("name")
+
+
+def get_meta_rule(meta_rule_name=None):
+ for meta_rule in policy_in['meta_rules']:
+ if meta_rule_name == meta_rule.get('name'):
+ return meta_rule
+ else:
+ return policy_in['meta_rules'][0]
+
+
+def build_actions(opst_rule, component):
+ _output = {
+ "name": opst_rule,
+ "description": "{} action for {}".format(opst_rule, component),
+ "extra": {"component": component},
+ "policies": []
+ }
+ policy_out['actions'].append(_output)
+
+
+def build_action_data(opst_rule, component):
+ _output = {
+ "name": opst_rule,
+ "description": "{} action for {}".format(opst_rule, component),
+ "policies": [],
+ "category": {"name": "action_id"}
+ }
+ policy_out['action_data'].append(_output)
+
+
+def build_action_assignments_with_templates(opst_rule):
+ for assignment in policy_in['action_assignments']:
+ for template in assignment.get('templates', []):
+ name = template.get('action', {}).get('name')
+ new = None
+ if "filter:" in name:
+ if "*" == name.split(":")[-1].strip():
+ new = copy.deepcopy(template)
+ new['action']['name'] = opst_rule
+ else:
+ for _str in name.split(":")[-1].strip().split(","):
+ if _str.strip() in opst_rule:
+ new = copy.deepcopy(template)
+ new['action']['name'] = opst_rule
+ if new:
+ policy_out['action_assignments'].append(new)
+
+
+def build_action_assignments(opst_rule):
+ _output = {
+ "action": {"name": opst_rule},
+ "category": {"name": "action_id"},
+ "assignments": [{"name": opst_rule}, ]}
+ policy_out['action_assignments'].append(_output)
+ build_action_assignments_with_templates(opst_rule)
+
+
+def add_rule(rule):
+ # TODO: check rule before adding it
+ if rule in __rules:
+ # note: don't add the rule if already added
+ return
+ __rules.append(rule)
+ _raw_rule = {
+ "subject_data": [],
+ "object_data": [],
+ "action_data": []
+ }
+ cpt = 0
+ for _ in get_meta_rule().get("subject_categories"):
+ _raw_rule["subject_data"].append({"name": rule[cpt]})
+ cpt += 1
+ for _ in get_meta_rule().get("object_categories"):
+ _raw_rule["object_data"].append({"name": rule[cpt]})
+ cpt += 1
+ for _ in get_meta_rule().get("action_categories"):
+ _raw_rule["action_data"].append({"name": rule[cpt]})
+ cpt += 1
+
+ _output = {
+ "meta_rule": {"name": get_meta_rule_name()},
+ "rule": _raw_rule,
+ "policy": {"name": get_policy_name()},
+ "instructions": [{"decision": "grant"}],
+ "enabled": True
+ }
+ policy_out['rules'].append(_output)
+
+
+def check_filter_on_template(data_list, opst_rule):
+ for cpt, _data in enumerate(data_list):
+ if "filter:" in _data:
+ filter_str = _data.partition(":")[-1]
+ if filter_str == "*":
+ data_list[cpt] = opst_rule
+ add_rule(data_list)
+ else:
+ for _str in filter_str.split(","):
+ if _str.strip() in opst_rule:
+ data_list[cpt] = opst_rule
+ add_rule(data_list)
+ break
+
+
+def build_rules_with_templates(rule, opst_rule):
+ meta_rule = get_meta_rule()
+ for template in rule.get("templates", []):
+ data_list = []
+ for cat in meta_rule.get("subject_categories"):
+ for item in template.get("subject"):
+ if item.get("category") == cat.get('name'):
+ data_list.append(item.get("name"))
+ break
+ for cat in meta_rule.get("object_categories"):
+ for item in template.get("object"):
+ if item.get("category") == cat.get('name'):
+ data_list.append(item.get("name"))
+ break
+ for cat in meta_rule.get("action_categories"):
+ for item in template.get("action"):
+ if item.get("category") == cat.get('name'):
+ data_list.append(item.get("name"))
+ break
+ check_filter_on_template(data_list, opst_rule)
+
+
+def build_rules(opst_rule):
+ rules = policy_in.get("rules")
+ for rule in rules:
+ if isinstance(rule, dict):
+ build_rules_with_templates(rule, opst_rule)
+ else:
+ add_rule(rule)
+
+
+def build_dict(results):
+ """
+ Build the dictionary given the actions found in the policy.json files
+ :param results: list of rule for each component
+ :return: nothing
+ """
+ policy_out["rules"] = []
+ for component in results:
+ for opst_rule in results[component]:
+ build_actions(opst_rule, component)
+ build_action_data(opst_rule, component)
+ build_action_assignments(opst_rule)
+ build_rules(opst_rule)
+
+
+def exclude_attrs(args):
+ """
+ Exclude attributes from the output JSON file
+ :param args: arguments given in the command line
+ :return: nothing
+ """
+ attrs_to_exclude = []
+ if not args.exclude:
+ return
+ for excl_item in args.exclude.split(","):
+ excl_item = excl_item.replace("*", ".*").strip()
+ logger.debug("excl_item=%s", excl_item)
+ for attr in policy_in:
+ logger.debug("attr=%s", attr)
+ if re.match(excl_item, attr):
+ attrs_to_exclude.append(attr)
+ for attr in attrs_to_exclude:
+ logger.info("Deleting %s", attr)
+ policy_out.pop(attr)
+
+
+def write_tests(rules):
+ if "admin" not in map(lambda x: x.get("name"), policy_in.get("subjects")):
+ logger.warning("Don't write tests in output because, there is no 'admin' user")
+ return
+ if "all" not in map(lambda x: x.get("name"), policy_in.get("objects")):
+ logger.warning("Don't write tests in output because, there is no 'all' object")
+ return
+ if "checks" not in policy_in:
+ policy_out["checks"] = {"granted": [], "denied": []}
+ if "granted" not in policy_in["checks"]:
+ policy_out["checks"]["granted"] = []
+ if "denied" not in policy_in["checks"]:
+ policy_out["checks"]["denied"] = []
+ for component in rules:
+ for rule in rules.get(component):
+ policy_out["checks"]["granted"].append(("admin", "all", rule))
+ if "test_user" in map(lambda x: x.get("name"), policy_in.get("subjects")):
+ for component in rules:
+ for rule in rules.get(component):
+ policy_out["checks"]["denied"].append(("test_user", "all", rule))
+
+
+def write_dict(args):
+ """
+ Write the dictionary in the output filename given in command line
+ :param args: arguments given in the command line
+ :return: nothing
+ """
+ json.dump(policy_out, open(args.output, "w"), indent=args.indent)
+
+
+def main():
+ """
+ Main end point
+ :return: nothing
+ """
+ args = init()
+ rules = get_opst_rules(args)
+ build_dict(rules)
+ write_tests(rules)
+ exclude_attrs(args)
+ write_dict(args)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/moon_utilities/moon_utilities/install.py b/moon_utilities/moon_utilities/install.py
new file mode 100644
index 00000000..236dfe06
--- /dev/null
+++ b/moon_utilities/moon_utilities/install.py
@@ -0,0 +1,155 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+"""
+Install the Moon platform
+"""
+
+import argparse
+import logging
+import os
+import subprocess # nosec
+import sys
+import getpass
+
+try:
+ import pytest
+except ModuleNotFoundError:
+ subprocess.call([sys.executable, "-m", "pip", "install", "pytest", "--upgrade"]) # nosec
+ subprocess.call([sys.executable, "-m", "pip", "install", "pytest-cov", "--upgrade"]) # nosec
+ subprocess.call([sys.executable, "-m", "pip", "install", "cliff", "--upgrade"]) # nosec
+ subprocess.call([sys.executable, "-m", "pip", "install", "requests_mock", "--upgrade"]) # nosec
+ import pytest
+try:
+ from git import Repo
+except ModuleNotFoundError:
+ subprocess.call([sys.executable, "-m", "pip", "install", "GitPython", "--upgrade"]) # nosec
+ from git import Repo
+
+COMPONENTS = {
+ "moon_utilities": [],
+ "moon_cache": [],
+ "moon_manager": [],
+ "moon_engine": [],
+}
+
+logger = logging.getLogger(__name__)
+
+
+def init():
+ """
+ Initialize the application
+ :return: argument given in the command line
+ """
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--verbose", '-v', action='store_true', help='verbose mode')
+ parser.add_argument("--debug", '-d', action='store_true', help='debug mode')
+ parser.add_argument("--pre", '-p', action='store_true', help='install packages in dev mode')
+ parser.add_argument("--git", '-g', action='store_true', help='install packages from source tree')
+ parser.add_argument("--tests", '-t', action='store_true', help='run tests on each package')
+ parser.add_argument("--username", '-u', help='set the username for the Gitlab server')
+ parser.add_argument("--password", '-pa', help='set the password for the Gitlab server')
+ parser.add_argument("--password-file", '-pf',
+ help='set the filename of the file containing all passwords for the '
+ 'Gitlab server')
+ parser.add_argument("--do-not-clean", '-dnc', action='store_true',
+ help='do not clean the dev environment')
+ args = parser.parse_args()
+ logging_format = "%(levelname)s: %(message)s"
+ if args.verbose:
+ logging.basicConfig(level=logging.INFO, format=logging_format)
+ if args.debug:
+ logging.basicConfig(level=logging.DEBUG, format=logging_format)
+ else:
+ logging.basicConfig(format=logging_format)
+
+ if args.password_file:
+ logger.info("Using {} as password file".format(args.password_file))
+ for line in open(args.password_file):
+ try:
+ comp, user, password = line.split(":")
+ if comp in COMPONENTS:
+ COMPONENTS[comp] = [user, password.strip()]
+ else:
+ logger.error("Unknown component {} in password file".format(comp))
+ except ValueError:
+ # empty line
+ pass
+ return args
+
+
+def install_from_pkg(package, args):
+ logger.info(f"Installing from pkg {package}")
+ command = [sys.executable, "-m", "pip", "install", package, "--upgrade"]
+ if args.pre:
+ command.append("--pre")
+ subprocess.call(command) # nosec
+
+
+def install_from_src(package, args):
+ logger.info(f"Installing {package} from source...")
+ if os.path.isdir(os.path.join("src", package)):
+ repo = Repo("src/" + package)
+ repo.remote().pull()
+ else:
+ if args.password_file:
+ Repo.clone_from("https://{}:{}@gitlab.forge.orange-labs.fr/moon/{}.git".format(
+ COMPONENTS[package][0], COMPONENTS[package][1], package),
+ to_path=os.path.join(os.getcwd(), "src", package))
+ elif args.username:
+ logger.info(f"installing with {args.username}")
+ Repo.clone_from("https://{}:{}@gitlab.forge.orange-labs.fr/moon/{}.git".format(
+ args.username, args.password, package),
+ to_path=os.path.join(os.getcwd(), "src", package))
+ else:
+ Repo.clone_from("https://gitlab.forge.orange-labs.fr/moon/{}.git".format(package),
+ to_path=os.path.join(os.getcwd(), "src", package))
+
+ # logger.info(f"Installing from source {package}")
+ cur_dir = os.getcwd()
+ os.chdir(os.path.join("src", package))
+ command = [sys.executable, "-m", "pip", "install", "-r", "requirements.txt"]
+ subprocess.call(command) # nosec
+ command = [sys.executable, "-m", "pip", "install", "."]
+ subprocess.call(command) # nosec
+
+ if args.tests:
+ pytest.main(["tests/unit_python"])
+
+ os.chdir(cur_dir)
+
+
+def clean_git():
+ subprocess.call(["rm", "-rf", "src"]) # nosec
+
+
+def main():
+ args = init()
+ if not args.git:
+ for component in COMPONENTS:
+ install_from_pkg(component, args)
+ else:
+ try:
+ try:
+ os.mkdir("src")
+ except FileExistsError:
+ pass
+ if args.username and not args.password:
+ args.password = getpass.getpass(f"Give the password for {args.username} Gitlab")
+ for component in COMPONENTS:
+ install_from_src(component, args)
+ finally:
+ if not args.do_not_clean:
+ clean_git()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/moon_utilities/moon_utilities/invalided_functions.py b/moon_utilities/moon_utilities/invalided_functions.py
new file mode 100644
index 00000000..1c24d3f4
--- /dev/null
+++ b/moon_utilities/moon_utilities/invalided_functions.py
@@ -0,0 +1,440 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+import requests
+
+logger = logging.getLogger("moon.utilities." + __name__)
+
+
+def invalidate_assignment_in_slaves(slaves, policy_id, perimeter_id, category_id, data_id, type):
+ """
+ Send a request to one or more slaves to invalidate specific assignments
+ :param slaves: list of slaves
+ :param policy_id: the ID of the concerned policy
+ :param perimeter_id: the ID of the concerned perimeter
+ :param category_id: the ID of the concerned category
+ :param data_id: the ID of the concerned data
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/assignment"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ if policy_id and perimeter_id and category_id and data_id:
+ update = requests.delete("http://{}:{}/{}/{}/{}/{}/{}/{}".format(
+ hostname, port, uri, policy_id, type, perimeter_id, category_id, data_id),
+ timeout=1
+ )
+ elif policy_id and perimeter_id and category_id:
+ update = requests.delete("http://{}:{}/{}/{}/{}/{}/{}".format(
+ hostname, port, uri, policy_id, type, perimeter_id, category_id),
+ timeout=1
+ )
+ elif policy_id and perimeter_id:
+ update = requests.delete("http://{}:{}/{}/{}/{}/{}".format(
+ hostname, port, uri, policy_id, type, perimeter_id),
+ timeout=1
+ )
+ elif policy_id:
+ update = requests.delete("http://{}:{}/{}/{}/{}".format(
+ hostname, port, uri, policy_id, type),
+ timeout=1
+ )
+
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_data_in_slaves(slaves, policy_id, category_id, data_id, type):
+ """
+ Send a request to one or more slaves to invalidate specific data
+ :param slaves: list of slaves
+ :param policy_id: the ID of the concerned policy
+ :param category_id: the ID of the concerned category
+ :param data_id: the ID of the concerned data
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/data"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ update = requests.delete("http://{}:{}/{}/{}/{}".format(
+ hostname, port, uri, data_id, type),
+ timeout=1
+ )
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_perimeter_in_slaves(slaves, policy_id, perimeter_id, type, data=None,
+ is_delete=True):
+ """
+ Send a request to one or more slaves to invalidate specific perimeter
+ :param slaves: list of slaves
+ :param policy_id: the ID of the concerned policy
+ :param perimeter_id: the ID of the concerned perimeter
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/perimeter"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ if is_delete:
+ update = requests.delete("http://{}:{}/{}/{}/{}/{}".format(
+ hostname, port, uri, perimeter_id, policy_id, type),
+ timeout=1
+ )
+ else:
+ update = requests.put("http://{}:{}/{}/{}/{}/{}".format(
+ hostname, port, uri, perimeter_id, policy_id, type),
+ data=data,
+ timeout=1
+ )
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_pdp_in_slaves(slaves, pdp_id, is_delete=True, data=None):
+ """
+ Send a request to one or more slaves to invalidate specific PDPs
+ :param slaves: list of slaves
+ :param pdp_id: the ID of the concerned PDP
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/pdp"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ if is_delete:
+ update = requests.delete("http://{}:{}/{}/{}".format(
+ hostname, port, uri, pdp_id),
+ timeout=1
+ )
+ else:
+ update = requests.put("http://{}:{}/{}/{}".format(
+ hostname, port, uri, pdp_id),
+ data=data,
+ timeout=1
+ )
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_policy_in_slaves(slaves, policy_id, is_delete=True, data=None):
+ """
+ Send a request to one or more slaves to invalidate specific policies
+ :param slaves: list of slaves
+ :param policy_id: the ID of the concerned policy
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/policy"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ if is_delete:
+ update = requests.delete("http://{}:{}/{}/{}".format(
+ hostname, port, uri, policy_id),
+ timeout=1
+ )
+ else:
+ update = requests.put("http://{}:{}/{}/{}".format(
+ hostname, port, uri, policy_id),
+ data=data,
+ timeout=1
+ )
+
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_rules_in_slaves(slaves, policy_id, rule_id):
+ """
+ Send a request to one or more slaves to invalidate specific rules
+ :param slaves: list of slaves
+ :param policy_id: the ID of the concerned policy
+ :param rule_id: the ID of the concerned rule
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/rule"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ update = requests.delete("http://{}:{}/{}/{}/{}".format(
+ hostname, port, uri, policy_id, rule_id),
+ timeout=1
+ )
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_model_in_slaves(slaves, model_id, is_delete=True, data=None):
+ """
+ Send a request to one or more slaves to invalidate specific models
+ :param slaves: list of slaves
+ :param model_id: the ID of the concerned model
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/model"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ if is_delete:
+ update = requests.delete("http://{}:{}/{}/{}".format(
+ hostname, port, uri, model_id),
+ timeout=1
+ )
+ else:
+ update = requests.put("http://{}:{}/{}/{}".format(
+ hostname, port, uri, model_id),
+ data=data,
+ timeout=1
+ )
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_meta_data_in_slaves(slaves, category_id, type):
+ """
+ Send a request to one or more slaves to invalidate specific meta data
+ :param slaves: list of slaves
+ :param category_id: the ID of the concerned category
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/meta_data"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ update = requests.delete("http://{}:{}/{}/{}/{}".format(
+ hostname, port, uri, category_id, type),
+ data={
+ "category_id": category_id
+ },
+ timeout=1
+ )
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
+def invalidate_meta_rule_in_slaves(slaves, meta_rule_id, is_delete=True, data=None):
+ """
+ Send a request to one or more slaves to invalidate specific meta rules
+ :param slaves: list of slaves
+ :param meta_rule_id: the ID of the concerned policy
+ :return: None
+ """
+
+ hostname, port = "", ""
+ uri = "update/meta_rule"
+ result = []
+ for key, value in slaves.get('slaves', {}).items():
+ if value.get("extra", {}).get("status") != "up":
+ continue
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ if is_delete:
+ update = requests.delete("http://{}:{}/{}/{}".format(
+ hostname, port, uri, meta_rule_id),
+ timeout=1
+ )
+ else:
+ update = requests.put("http://{}:{}/{}/{}".format(
+ hostname, port, uri, meta_rule_id),
+ data=data,
+ timeout=1
+ )
+
+ logger.debug("result {} {}:{} = {}".format(
+ update.status_code,
+ hostname,
+ port,
+ update.text))
+ result.append(value.get("name"))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+
+
+def invalidate_attributes_in_slaves(slaves, name, value=None):
+ """
+ Send a request to one or more slaves to invalidate specific data
+ :param slaves: list of slaves
+ :param name: the name of the attribute to invalidate
+ :param value: the value that has changed
+ :return: a list of updated slaves
+ """
+
+ hostname, port = "", ""
+ uri = "update/attributes"
+ result = []
+ for key, value in slaves.items():
+ try:
+ hostname = value.get("extra", {}).get("server_ip")
+ port = value.get("extra", {}).get("port")
+ update = requests.delete("http://{}:{}/{}/{}".format(
+ hostname, port, uri, name),
+ headers={"x-api-key": value.get("extra", {}).get("api_key")},
+ timeout=1
+ )
+ if update.status_code in (200, 202, 206, 208):
+ result.append(value.get("name"))
+ else:
+ logger.warning("Error when updating {} ({})".format(key, update.status_code))
+ except requests.exceptions.ConnectionError:
+ logger.warning(
+ "Cannot reach {}:{}".format(hostname, port))
+ except requests.models.InvalidURL:
+ logger.warning(
+ "Invalid URL {}:{}".format(hostname, port))
+ return result
+
+
diff --git a/moon_utilities/moon_utilities/json_utils.py b/moon_utilities/moon_utilities/json_utils.py
new file mode 100644
index 00000000..52ab5be4
--- /dev/null
+++ b/moon_utilities/moon_utilities/json_utils.py
@@ -0,0 +1,2076 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import html
+import json
+import logging
+
+from moon_utilities import exceptions
+
+LOGGER = logging.getLogger("moon.utilities." + __name__)
+
+
+class Manager:
+ __policy_manager = None
+ __model_manager = None
+ __pdp_manager = None
+
+ def get_meta_rules(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def set_subject_data(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def set_object_data(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def set_action_data(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_subject_data(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_object_data(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_action_data(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_rule(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_meta_rule(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_subject_assignment(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_object_assignment(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_action_assignment(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_subject_assignments(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_object_assignments(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_action_assignments(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_policies(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_subject_category(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_object_category(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_action_category(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_subject_categories(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_object_categories(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_action_categories(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_subject(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_object(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_action(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_subjects(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_objects(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_actions(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_policy(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def update_policy(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_models(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def update_model(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_model(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_pdp(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def update_pdp(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def add_pdp(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+ def get_rules(self, **kwargs):
+ raise NotImplementedError # pragma: no cover
+
+
+class CacheManager(Manager):
+ __policy_manager = None
+ __model_manager = None
+ __pdp_manager = None
+
+ def __init__(self, cache):
+ self.__cache = cache
+
+ def get_meta_rules(self, **kwargs):
+ return self.__cache.meta_rules
+
+ def set_subject_data(self, **kwargs):
+ value = kwargs.get("value", {})
+ value["category_id"] = kwargs.get("category_id", "")
+ value["policy_id"] = kwargs.get("policy_id", "")
+ return self.__cache.add_subject_data(
+ policy_id=kwargs.get("policy_id", ""),
+ category_id=kwargs.get("category_id", ""),
+ data=value
+ )
+
+ def set_object_data(self, **kwargs):
+ value = kwargs.get("value", {})
+ value["category_id"] = kwargs.get("category_id", "")
+ value["policy_id"] = kwargs.get("policy_id", "")
+ return self.__cache.add_object_data(
+ policy_id=kwargs.get("policy_id", ""),
+ category_id=kwargs.get("category_id", ""),
+ data=value
+ )
+
+ def set_action_data(self, **kwargs):
+ value = kwargs.get("value", {})
+ value["category_id"] = kwargs.get("category_id", "")
+ value["policy_id"] = kwargs.get("policy_id", "")
+ return self.__cache.add_action_data(
+ policy_id=kwargs.get("policy_id", ""),
+ category_id=kwargs.get("category_id", ""),
+ data=value
+ )
+
+ def get_subject_data(self, **kwargs):
+ if "policy_id" in kwargs:
+ results = []
+ for data in self.__cache.subject_data:
+ if data.get("policy_id") == kwargs["policy_id"]:
+ if data.get("category_id") == kwargs.get("category_id"):
+ results.append(data)
+ elif not kwargs.get("category_id"):
+ results.append(data)
+ if "data_id" in kwargs:
+ for res in results:
+ if kwargs.get("data_id") in res.get("data"):
+ return [res, ]
+ else:
+ return results
+ else:
+ return self.__cache.subject_data
+
+ def get_object_data(self, **kwargs):
+ if "policy_id" in kwargs:
+ results = []
+ for data in self.__cache.object_data:
+ if data.get("policy_id") == kwargs["policy_id"]:
+ if data.get("category_id") == kwargs.get("category_id"):
+ results.append(data)
+ elif not kwargs.get("category_id"):
+ results.append(data)
+ return results
+ else:
+ return self.__cache.object_data
+
+ def get_action_data(self, **kwargs):
+ if "policy_id" in kwargs:
+ results = []
+ for data in self.__cache.action_data:
+ if data.get("policy_id") == kwargs["policy_id"]:
+ if data.get("category_id") == kwargs.get("category_id"):
+ results.append(data)
+ elif not kwargs.get("category_id"):
+ results.append(data)
+ return results
+ else:
+ return self.__cache.action_data
+
+ def add_rule(self, **kwargs):
+ value = {
+ 'policy_id': kwargs.get('policy_id'),
+ 'meta_rule_id': kwargs.get('meta_rule_id'),
+ 'value': kwargs.get('value')
+ }
+ return self.__cache.add_rule(value)
+
+ def add_meta_rule(self, **kwargs):
+ return self.__cache.add_meta_rule(kwargs.get("value"))
+
+ def add_subject_assignment(self, **kwargs):
+ return self.__cache.add_subject_assignment(
+ policy_id=kwargs.get("policy_id"),
+ perimeter_id=kwargs.get("subject_id"),
+ category_id=kwargs.get("category_id"),
+ data_id=kwargs.get("data_id"),
+ )
+
+ def add_object_assignment(self, **kwargs):
+ return self.__cache.add_object_assignment(
+ policy_id=kwargs.get("policy_id"),
+ perimeter_id=kwargs.get("object_id"),
+ category_id=kwargs.get("category_id"),
+ data_id=kwargs.get("data_id"),
+ )
+
+ def add_action_assignment(self, **kwargs):
+ return self.__cache.add_action_assignment(
+ policy_id=kwargs.get("policy_id"),
+ perimeter_id=kwargs.get("action_id"),
+ category_id=kwargs.get("category_id"),
+ data_id=kwargs.get("data_id"),
+ )
+
+ def get_subject_assignments(self, **kwargs):
+ return self.__cache.subject_assignments
+
+ def get_object_assignments(self, **kwargs):
+ return self.__cache.object_assignments
+
+ def get_action_assignments(self, **kwargs):
+ return self.__cache.action_assignments
+
+ def get_policies(self, **kwargs):
+ return self.__cache.policies
+
+ def add_subject_category(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ if kwargs.get("category_id"):
+ if kwargs.get("category_id") in self.__cache.subject_categories:
+ raise exceptions.SubjectCategoryExisting
+ self.__cache.add_subject_category(kwargs.get("value"))
+
+ def add_object_category(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ if kwargs.get("category_id"):
+ if kwargs.get("category_id") in self.__cache.object_categories:
+ raise exceptions.ObjectCategoryExisting
+ self.__cache.add_object_category(kwargs.get("value"))
+
+ def add_action_category(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ if kwargs.get("category_id"):
+ if kwargs.get("category_id") in self.__cache.action_categories:
+ raise exceptions.ActionCategoryExisting
+ self.__cache.add_action_category(kwargs.get("value"))
+
+ def get_subject_categories(self, **kwargs):
+ return self.__cache.subject_categories
+
+ def get_object_categories(self, **kwargs):
+ return self.__cache.object_categories
+
+ def get_action_categories(self, **kwargs):
+ return self.__cache.action_categories
+
+ def add_subject(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ value = kwargs.get("value")
+ if kwargs.get("policy_id"):
+ value["policy_list"] = [kwargs.get("policy_id")]
+ if kwargs.get("perimeter_id"):
+ return self.__cache.update_subject(kwargs.get("perimeter_id"), value)
+ else:
+ return self.__cache.add_subject(value)
+
+ def add_object(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ value = kwargs.get("value")
+ if kwargs.get("policy_id"):
+ value["policy_list"] = [kwargs.get("policy_id")]
+ if kwargs.get("perimeter_id"):
+ return self.__cache.update_object(kwargs.get("perimeter_id"), value)
+ else:
+ return self.__cache.add_object(value)
+
+ def add_action(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ value = kwargs.get("value")
+ if kwargs.get("policy_id"):
+ value["policy_list"] = [kwargs.get("policy_id")]
+ if kwargs.get("perimeter_id"):
+ return self.__cache.update_action(kwargs.get("perimeter_id"), value)
+ else:
+ return self.__cache.add_action(value)
+
+ def get_subjects(self, **kwargs):
+ results = {}
+ subjects = self.__cache.subjects
+ for policy_id in subjects:
+ results.update(subjects[policy_id])
+ return results
+
+ def get_objects(self, **kwargs):
+ results = {}
+ objects = self.__cache.objects
+ for policy_id in objects:
+ results.update(objects[policy_id])
+ return results
+
+ def get_actions(self, **kwargs):
+ results = {}
+ actions = self.__cache.actions
+ for policy_id in actions:
+ results.update(actions[policy_id])
+ return results
+
+ def add_policy(self, **kwargs):
+ return self.__cache.add_policy(kwargs.get("value"))
+
+ def update_policy(self, **kwargs):
+ self.__cache.update_policy(kwargs.get("policy_id"), kwargs.get("value"))
+
+ def get_models(self, **kwargs):
+ return self.__cache.models
+
+ def update_model(self, **kwargs):
+ self.__cache.update_model(kwargs.get("model_id"), kwargs.get("value"))
+
+ def add_model(self, **kwargs):
+ if kwargs.get("value", {}).get("name") != html.escape(kwargs.get("value", {}).get("name")):
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+ self.__cache.add_model(kwargs.get("value"))
+
+ def get_pdp(self, **kwargs):
+ return self.__cache.pdp
+
+ def update_pdp(self, **kwargs):
+ self.__cache.add_pdp(pdp_id=kwargs.get("pdp_id"), data=kwargs.get("value"))
+
+ def add_pdp(self, **kwargs):
+ self.__cache.add_pdp(data=kwargs.get("value"))
+
+ def get_rules(self, **kwargs):
+ return self.__cache.rules
+
+
+class DBManager(Manager):
+ __policy_manager = None
+ __model_manager = None
+ __pdp_manager = None
+
+ def __init__(self, driver): # pragma: no cover
+ self.__policy_manager = driver.PolicyManager
+ self.__model_manager = driver.ModelManager
+ self.__pdp_manager = driver.PDPManager
+
+ @property
+ def meta_rules(self):
+ return self.get_meta_rules()
+
+ def get_meta_rules(self, **kwargs):
+ return self.__model_manager.get_meta_rules(
+ moon_user_id=kwargs.get("moon_user_id"),
+ meta_rule_id=kwargs.get("meta_rule_id")
+ )
+
+ def set_subject_data(self, **kwargs):
+ value = self.__policy_manager.set_subject_data(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ category_id=kwargs.get("category_id"),
+ value=kwargs.get("value")
+ )
+ return value
+
+ def set_object_data(self, **kwargs):
+ return self.__policy_manager.add_object_data(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ category_id=kwargs.get("category_id"),
+ value=kwargs.get("value")
+ )
+
+ def set_action_data(self, **kwargs):
+ return self.__policy_manager.add_action_data(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ category_id=kwargs.get("category_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def subject_data(self):
+ _data = []
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ for category in self.__model_manager.get_subject_categories(moon_user_id="admin"):
+ _data += self.__policy_manager.get_subject_data(moon_user_id="admin",
+ policy_id=policy,
+ category_id=category)
+ return _data
+
+ def get_subject_data(self, **kwargs):
+ return self.__policy_manager.get_subject_data(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ data_id=kwargs.get("data_id"),
+ category_id=kwargs.get("category_id")
+ )
+
+ @property
+ def object_data(self):
+ _data = []
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _data += self.__policy_manager.get_object_data(moon_user_id="admin",
+ policy_id=policy)
+ return _data
+
+ def get_object_data(self, **kwargs):
+ return self.__policy_manager.get_object_data(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ data_id=kwargs.get("data_id"),
+ category_id=kwargs.get("category_id")
+ )
+
+ @property
+ def action_data(self):
+ _data = []
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _data += self.__policy_manager.get_action_data(moon_user_id="admin",
+ policy_id=policy)
+ return _data
+
+ def get_action_data(self, **kwargs):
+ return self.__policy_manager.get_action_data(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ data_id=kwargs.get("data_id"),
+ category_id=kwargs.get("category_id")
+ )
+
+ def add_rule(self, **kwargs):
+ return self.__policy_manager.add_rule(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ meta_rule_id=kwargs.get("meta_rule_id"),
+ value=kwargs.get("value")
+ )
+
+ def add_meta_rule(self, **kwargs):
+ return self.__model_manager.add_meta_rule(
+ moon_user_id=kwargs.get("moon_user_id"),
+ meta_rule_id=kwargs.get("meta_rule_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def subject_assignments(self):
+ _assignments = {}
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _assignments.update(self.__policy_manager.get_subject_assignments(
+ moon_user_id="admin",
+ policy_id=policy))
+ return _assignments
+
+ def add_subject_assignment(self, **kwargs):
+ return self.__policy_manager.add_subject_assignment(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ subject_id=kwargs.get("subject_id"),
+ category_id=kwargs.get("category_id"),
+ data_id=kwargs.get("data_id")
+ )
+
+ @property
+ def object_assignments(self):
+ _assignments = {}
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _assignments.update(self.__policy_manager.get_object_assignments(
+ moon_user_id="admin",
+ policy_id=policy))
+ return _assignments
+
+ def add_object_assignment(self, **kwargs):
+ return self.__policy_manager.add_object_assignment(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ object_id=kwargs.get("object_id"),
+ category_id=kwargs.get("category_id"),
+ data_id=kwargs.get("data_id")
+ )
+
+ @property
+ def action_assignments(self):
+ _assignments = {}
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _assignments.update(self.__policy_manager.get_action_assignments(
+ moon_user_id="admin",
+ policy_id=policy))
+ return _assignments
+
+ def add_action_assignment(self, **kwargs):
+ return self.__policy_manager.add_action_assignment(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ action_id=kwargs.get("action_id"),
+ category_id=kwargs.get("category_id"),
+ data_id=kwargs.get("data_id")
+ )
+
+ def get_subject_assignments(self, **kwargs):
+ return self.__policy_manager.get_subject_assignments(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ category_id=kwargs.get("category_id")
+ )
+
+ def get_object_assignments(self, **kwargs):
+ return self.__policy_manager.get_object_assignments(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ category_id=kwargs.get("category_id")
+ )
+
+ def get_action_assignments(self, **kwargs):
+ return self.__policy_manager.get_action_assignments(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ category_id=kwargs.get("category_id")
+ )
+
+ def get_policies(self, **kwargs):
+ return self.__policy_manager.get_policies(moon_user_id=kwargs.get("moon_user_id"))
+
+ @property
+ def subject_categories(self):
+ return self.__model_manager.get_subject_categories(moon_user_id="admin")
+
+ def add_subject_category(self, **kwargs):
+ return self.__model_manager.add_subject_category(
+ moon_user_id=kwargs.get("moon_user_id"),
+ category_id=kwargs.get("category_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def object_categories(self):
+ return self.__model_manager.get_object_categories(moon_user_id="admin")
+
+ def add_object_category(self, **kwargs):
+ return self.__model_manager.add_object_category(
+ moon_user_id=kwargs.get("moon_user_id"),
+ category_id=kwargs.get("category_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def action_categories(self):
+ return self.__model_manager.get_action_categories(moon_user_id="admin")
+
+ def add_action_category(self, **kwargs):
+ return self.__model_manager.add_action_category(
+ moon_user_id=kwargs.get("moon_user_id"),
+ category_id=kwargs.get("category_id"),
+ value=kwargs.get("value")
+ )
+
+ def get_subject_categories(self, **kwargs):
+ return self.__model_manager.get_subject_categories(
+ moon_user_id=kwargs.get("moon_user_id")
+ )
+
+ def get_object_categories(self, **kwargs):
+ return self.__model_manager.get_object_categories(
+ moon_user_id=kwargs.get("moon_user_id")
+ )
+
+ def get_action_categories(self, **kwargs):
+ return self.__model_manager.get_action_categories(
+ moon_user_id=kwargs.get("moon_user_id")
+ )
+
+ @property
+ def subjects(self):
+ _perimeter = {}
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _perimeter.update(self.__policy_manager.get_subjects(moon_user_id="admin",
+ policy_id=policy))
+ return _perimeter
+
+ def add_subject(self, **kwargs):
+ if kwargs.get("perimeter_id"):
+ return self.__policy_manager.update_subject(
+ moon_user_id=kwargs.get("moon_user_id"),
+ perimeter_id=kwargs.get("perimeter_id"),
+ value=kwargs.get("value")
+ )
+ else:
+ return self.__policy_manager.add_subject(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def objects(self):
+ _perimeter = {}
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _perimeter.update(self.__policy_manager.get_objects(moon_user_id="admin",
+ policy_id=policy))
+ return _perimeter
+
+ def add_object(self, **kwargs):
+ if kwargs.get("perimeter_id"):
+ return self.__policy_manager.update_object(
+ moon_user_id=kwargs.get("moon_user_id"),
+ perimeter_id=kwargs.get("perimeter_id"),
+ value=kwargs.get("value")
+ )
+ else:
+ return self.__policy_manager.add_object(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def actions(self):
+ _perimeter = {}
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _perimeter.update(self.__policy_manager.get_actions(moon_user_id="admin",
+ policy_id=policy))
+ return _perimeter
+
+ def add_action(self, **kwargs):
+ if kwargs.get("perimeter_id"):
+ return self.__policy_manager.update_action(
+ moon_user_id=kwargs.get("moon_user_id"),
+ perimeter_id=kwargs.get("perimeter_id"),
+ value=kwargs.get("value")
+ )
+ else:
+ return self.__policy_manager.add_action(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ value=kwargs.get("value")
+ )
+
+ def get_subjects(self, **kwargs):
+ return self.__policy_manager.get_subjects(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id")
+ )
+
+ def get_objects(self, **kwargs):
+ return self.__policy_manager.get_objects(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id")
+ )
+
+ def get_actions(self, **kwargs):
+ return self.__policy_manager.get_actions(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id")
+ )
+
+ @property
+ def policies(self):
+ return self.__policy_manager.get_policies(moon_user_id="admin")
+
+ def add_policy(self, **kwargs):
+ return self.__policy_manager.add_policy(
+ moon_user_id=kwargs.get("moon_user_id"),
+ value=kwargs.get("value")
+ )
+
+ def update_policy(self, **kwargs):
+ return self.__policy_manager.update_policy(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id"),
+ value=kwargs.get("value"))
+
+ @property
+ def models(self):
+ return self.get_models()
+
+ def get_models(self, **kwargs):
+ return self.__model_manager.get_models(moon_user_id=kwargs.get("moon_user_id"))
+
+ def update_model(self, **kwargs):
+ return self.__model_manager.update_model(
+ moon_user_id=kwargs.get("moon_user_id"),
+ model_id=kwargs.get("model_id"),
+ value=kwargs.get("value")
+ )
+
+ def add_model(self, **kwargs):
+ return self.__model_manager.add_model(
+ moon_user_id=kwargs.get("moon_user_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def pdp(self):
+ return self.get_pdp()
+
+ def get_pdp(self, **kwargs):
+ return self.__pdp_manager.get_pdp(moon_user_id=kwargs.get("moon_user_id"))
+
+ def update_pdp(self, **kwargs):
+ return self.__pdp_manager.update_pdp(
+ moon_user_id=kwargs.get("moon_user_id"),
+ pdp_id=kwargs.get("pdp_id"),
+ value=kwargs.get("value")
+ )
+
+ def add_pdp(self, **kwargs):
+ return self.__pdp_manager.add_pdp(
+ moon_user_id=kwargs.get("moon_user_id"),
+ value=kwargs.get("value")
+ )
+
+ @property
+ def rules(self):
+ _rules = []
+ for policy in self.__policy_manager.get_policies(moon_user_id="admin"):
+ _rules.append(self.__policy_manager.get_rules(moon_user_id="admin",
+ policy_id=policy))
+ return _rules
+
+ def get_rules(self, **kwargs):
+ return self.__policy_manager.get_rules(
+ moon_user_id=kwargs.get("moon_user_id"),
+ policy_id=kwargs.get("policy_id")
+ )
+
+
+class JsonUtils:
+ @staticmethod
+ def get_override(json_content):
+ if "override" in json_content:
+ return json_content["override"]
+ return False
+
+ @staticmethod
+ def get_mandatory(json_content):
+ if "mandatory" in json_content:
+ return json_content["mandatory"]
+ return False
+
+ @staticmethod
+ def copy_field_if_exists(json_in, json_out, field_name, type_field, default_value=None):
+ if field_name in json_in:
+ json_out[field_name] = json_in[field_name]
+ else:
+ if type_field is bool:
+ if default_value is None:
+ default_value = False
+ json_out[field_name] = default_value
+ if type_field is str:
+ if default_value is None:
+ default_value = ""
+ json_out[field_name] = default_value
+ if type_field is dict:
+ json_out[field_name] = dict()
+ if type_field is list:
+ json_out[field_name] = []
+
+ @staticmethod
+ def _get_element_in_db_from_id(element_type, element_id, user_id, policy_id, category_id,
+ meta_rule_id, manager):
+ # the item is supposed to be in the db, we check it exists!
+ if element_type == "model":
+ data_db = manager.get_models(moon_user_id=user_id, model_id=element_id)
+ elif element_type == "policy":
+ data_db = manager.get_policies(moon_user_id=user_id, policy_id=element_id)
+ elif element_type == "subject":
+ data_db = manager.get_subjects(moon_user_id=user_id, policy_id=policy_id, perimeter_id=element_id)
+ elif element_type == "object":
+ data_db = manager.get_objects(moon_user_id=user_id, policy_id=policy_id, perimeter_id=element_id)
+ elif element_type == "action":
+ data_db = manager.get_actions(moon_user_id=user_id, policy_id=policy_id, perimeter_id=element_id)
+ elif element_type == "subject_category":
+ data_db = manager.get_subject_categories(moon_user_id=user_id, category_id=element_id)
+ elif element_type == "object_category":
+ data_db = manager.get_object_categories(moon_user_id=user_id, category_id=element_id)
+ elif element_type == "action_category":
+ data_db = manager.get_action_categories(moon_user_id=user_id, category_id=element_id)
+ elif element_type == "meta_rule":
+ data_db = manager.get_meta_rules(moon_user_id=user_id, meta_rule_id=element_id)
+ elif element_type == "subject_data":
+ data_db = manager.get_subject_data(moon_user_id=user_id, policy_id=policy_id, data_id=element_id,
+ category_id=category_id)
+ elif element_type == "object_data":
+ data_db = manager.get_object_data(moon_user_id=user_id, policy_id=policy_id, data_id=element_id,
+ category_id=category_id)
+ elif element_type == "action_data":
+ data_db = manager.get_action_data(moon_user_id=user_id, policy_id=policy_id,
+ data_id=element_id,
+ category_id=category_id)
+ elif element_type == "meta_rule":
+ data_db = manager.get_meta_rules(moon_user_id=user_id, meta_rule_id=meta_rule_id)
+ else:
+ raise Exception("Conversion of {} not implemented yet!".format(element_type))
+
+ # do some post processing ... the result should be {key : { .... .... } }
+ if element_type == "subject_data" or element_type == "object_data" or element_type == "action_data":
+ if data_db is not None and isinstance(data_db, list):
+ # TODO remove comments after fixing the bug on moondb when adding metarule:
+ # we can have several identical entries !
+ # if len(data_db) > 1:
+ # raise Exception("Several {} with the same id : {}".format(element_type, data_db))
+ data_db = data_db[0]
+
+ if data_db is not None and data_db["data"] is not None and isinstance(data_db["data"],
+ dict):
+ # TODO remove comments after fixing the bug on moondb when adding metarule:
+ # we can have several identical entries !
+ # if len(data_db["data"].values()) != 1:
+ # raise Exception("Several {} with the same id : {}".format(element_type, data_db))
+ # data_db = data_db["data"]
+ # TODO remove these two lines after fixing the bug on moondb when adding metarule:
+ # we can have several identical entries !
+ list_values = list(data_db["data"].values())
+ data_db = list_values[0]
+ return data_db
+
+ @staticmethod
+ def _get_element_id_in_db_from_name(element_type, element_name, user_id, policy_id, category_id,
+ meta_rule_id, manager):
+ if element_type == "model":
+ data_db = manager.get_models(moon_user_id=user_id)
+ elif element_type == "policy":
+ data_db = manager.get_policies(moon_user_id=user_id)
+ elif element_type == "subject":
+ data_db = manager.get_subjects(moon_user_id=user_id, policy_id=policy_id)
+ elif element_type == "object":
+ data_db = manager.get_objects(moon_user_id=user_id, policy_id=policy_id)
+ elif element_type == "action":
+ data_db = manager.get_actions(moon_user_id=user_id,policy_id= policy_id)
+ elif element_type == "subject_category":
+ data_db = manager.get_subject_categories(moon_user_id=user_id)
+ elif element_type == "object_category":
+ data_db = manager.get_object_categories(moon_user_id=user_id)
+ elif element_type == "action_category":
+ data_db = manager.get_action_categories(moon_user_id=user_id)
+ elif element_type == "meta_rule":
+ data_db = manager.get_meta_rules(moon_user_id=user_id)
+ elif element_type == "subject_data":
+ data_db = manager.get_subject_data(moon_user_id=user_id, policy_id=policy_id,
+ category_id=category_id)
+ elif element_type == "object_data":
+ data_db = manager.get_object_data(moon_user_id=user_id, policy_id=policy_id,
+ category_id=category_id)
+ elif element_type == "action_data":
+ data_db = manager.get_action_data(moon_user_id=user_id, policy_id=policy_id,
+ category_id=category_id)
+ elif element_type == "meta_rule":
+ data_db = manager.get_meta_rules(moon_user_id=user_id)
+ elif element_type == "rule":
+ data_db = manager.get_rules(moon_user_id=user_id, policy_id=policy_id)
+ else:
+ raise exceptions.MoonError("Conversion of {} not implemented yet!".format(element_type))
+
+ if isinstance(data_db, dict):
+ for key_id in data_db:
+ if isinstance(data_db[key_id], dict) and "name" in data_db[key_id]:
+ if data_db[key_id]["name"] == element_name:
+ return key_id
+ else:
+ for elt in data_db:
+ if isinstance(elt, dict) and "data" in elt:
+ # we handle here subject_data, object_data and action_data...
+ for data_key in elt["data"]:
+ data = elt["data"][data_key]
+ if "name" in data and data["name"] == element_name:
+ return data_key
+ if "value" in data and data["value"]["name"] == element_name:
+ return data_key
+ return None
+
+ @staticmethod
+ def convert_name_to_id(json_in, json_out, field_name_in, field_name_out, element_type, manager,
+ user_id, policy_id=None, category_id=None, meta_rule_id=None,
+ field_mandatory=True):
+ if field_name_in not in json_in:
+ raise exceptions.UnknownField(
+ "The field {} is not in the input json".format(field_name_in))
+
+ if "id" in json_in[field_name_in]:
+ data_db = JsonUtils._get_element_in_db_from_id(element_type,
+ json_in[field_name_in]["id"], user_id,
+ policy_id, category_id, meta_rule_id,
+ manager)
+ if data_db is None:
+ raise exceptions.UnknownId("No {} with id {} found in database".format(element_type,
+ json_in[field_name_in]["id"]))
+ json_out[field_name_out] = json_in[field_name_in]["id"]
+
+ elif "name" in json_in[field_name_in]:
+ id_in_db = JsonUtils._get_element_id_in_db_from_name(element_type,
+ json_in[field_name_in]["name"],
+ user_id, policy_id, category_id,
+ meta_rule_id, manager)
+ if id_in_db is None:
+ raise exceptions.UnknownName(
+ "No {} with name {} found in database".format(element_type,
+ json_in[field_name_in]["name"]))
+ json_out[field_name_out] = id_in_db
+ elif field_mandatory is True:
+ raise exceptions.MissingIdOrName(
+ "No id or name found in the input json {}".format(json_in))
+
+ @staticmethod
+ def convert_id_to_name(id_, json_out, field_name_out, element_type, manager, user_id,
+ policy_id=None, category_id=None, meta_rule_id=None):
+ json_out[field_name_out] = {
+ "name": JsonUtils.convert_id_to_name_string(id_, element_type, manager, user_id,
+ policy_id, category_id, meta_rule_id)}
+
+ @staticmethod
+ def __convert_results_to_element(element):
+ if isinstance(element, dict) and "name" not in element and "value" not in element:
+ list_values = [v for v in element.values()]
+ elif isinstance(element, list):
+ list_values = element
+ else:
+ list_values = []
+ list_values.append(element)
+ return list_values[0]
+
+ @staticmethod
+ def convert_id_to_name_string(id_, element_type, manager, user_id,
+ policy_id=None, category_id=None, meta_rule_id=None):
+
+ element = JsonUtils._get_element_in_db_from_id(element_type, id_, user_id, policy_id,
+ category_id, meta_rule_id, manager)
+ if element is None:
+ raise exceptions.UnknownId("No {} with id {} found in database".format(
+ element_type, id_))
+ res = JsonUtils.__convert_results_to_element(element)
+ if "name" in res:
+ return res["name"]
+ if "value" in res and "name" in res["value"]:
+ return res["value"]["name"]
+ return None
+
+ @staticmethod
+ def convert_names_to_ids(json_in, json_out, field_name_in, field_name_out, element_type,
+ manager, user_id, policy_id=None, category_id=None, meta_rule_id=None,
+ field_mandatory=True):
+ ids = []
+ if field_name_in not in json_in:
+ raise exceptions.UnknownField("The field {} is not in the input json".format(
+ field_name_in))
+
+ for elt in json_in[field_name_in]:
+ if "id" in elt:
+ data_db = JsonUtils._get_element_in_db_from_id(element_type, elt["id"], user_id,
+ policy_id, category_id,
+ meta_rule_id, manager)
+ if data_db is None:
+ raise exceptions.UnknownId(
+ "No {} with id {} found in database".format(element_type, elt["id"]))
+ ids.append(elt["id"])
+ elif "name" in elt:
+ id_in_db = JsonUtils._get_element_id_in_db_from_name(element_type, elt["name"],
+ user_id, policy_id,
+ category_id, meta_rule_id,
+ manager)
+ if id_in_db is None:
+ LOGGER.debug("No {} with name {} found in database".format(element_type, elt["name"]))
+ raise exceptions.UnknownName(
+ "No {} with name {} found in database".format(element_type, elt["name"]))
+ ids.append(id_in_db)
+ elif "attr" in elt:
+ ids.append("attributes:" + elt['attr'])
+ elif field_mandatory is True:
+ raise exceptions.MissingIdOrName(
+ "No id or name found in the input json {}".format(elt))
+ json_out[field_name_out] = ids
+
+ @staticmethod
+ def convert_ids_to_names(ids, json_out, field_name_out, element_type, manager, user_id,
+ policy_id=None, category_id=None, meta_rule_id=None):
+ res_array = []
+ for id_ in ids:
+ element = JsonUtils._get_element_in_db_from_id(element_type, id_, user_id, policy_id,
+ category_id, meta_rule_id, manager)
+ if element is None:
+ raise exceptions.UnknownId("No {} with id {} found in database".format(
+ element_type, id_))
+ res = JsonUtils.__convert_results_to_element(element)
+ if "name" in res:
+ res_array.append({"name": res["name"]})
+ if "value" in res and "name" in res["value"]:
+ res_array.append({"name": res["value"]["name"]})
+ json_out[field_name_out] = res_array
+
+
+class JsonImport(object):
+ __user_id = None
+ __manager = None
+ __driver = None
+
+ def __init__(self, driver_name="db", driver=None):
+ self.__driver = driver_name
+ if driver_name == "db":
+ self.__manager = DBManager(driver)
+ else:
+ self.__manager = CacheManager(driver)
+
+ @property
+ def driver(self):
+ return self.__manager
+
+ def _reorder_rules_ids(self, rule, ordered_perimeter_categories_ids, json_data_ids, policy_id,
+ get_function):
+ ordered_json_ids = [None] * len(ordered_perimeter_categories_ids)
+ _exc = None
+ data = get_function(moon_user_id=self.__user_id, policy_id=policy_id)
+ for _data in data:
+ for item in json_data_ids:
+ if not _data['data']:
+ continue
+ if _data.get('data').get(item):
+ index = ordered_perimeter_categories_ids.index(_data["category_id"])
+ if _data["category_id"] not in ordered_perimeter_categories_ids:
+ _exc = exceptions.InvalidJson(
+ "The category id {} of the rule {} does not match the meta rule".format(
+ _data["category_id"], rule))
+ continue
+ if ordered_json_ids[index] is not None:
+ _exc = exceptions.InvalidJson(
+ "The category id {} of the rule {} shall not be used "
+ "twice in the same rule".format(
+ _data["category_id"], rule))
+ ordered_json_ids[index] = item
+ if None in ordered_json_ids:
+ for cpt, _id in enumerate(ordered_perimeter_categories_ids):
+ if _id.startswith("attributes:"):
+ if not ordered_json_ids[cpt]:
+ ordered_json_ids[cpt] = json_data_ids[cpt]
+
+ if _exc:
+ raise _exc
+ return ordered_json_ids
+
+ def _import_rules(self, json_rules):
+ if not isinstance(json_rules, list):
+ raise exceptions.InvalidJson("rules shall be a list!")
+
+ for json_rule in json_rules:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_rule, json_to_use, "instructions", str)
+ JsonUtils.copy_field_if_exists(json_rule, json_to_use, "enabled", bool,
+ default_value=True)
+
+ json_ids = dict()
+ JsonUtils.convert_name_to_id(json_rule, json_ids, "policy", "policy_id", "policy",
+ self.__manager, self.__user_id)
+ JsonUtils.convert_name_to_id(json_rule, json_to_use, "meta_rule", "meta_rule_id",
+ "meta_rule", self.__manager, self.__user_id)
+ json_subject_ids = dict()
+ json_object_ids = dict()
+ json_action_ids = dict()
+ JsonUtils.convert_names_to_ids(json_rule["rule"], json_subject_ids, "subject_data",
+ "subject", "subject_data", self.__manager,
+ self.__user_id,
+ json_ids["policy_id"])
+ JsonUtils.convert_names_to_ids(json_rule["rule"], json_object_ids, "object_data",
+ "object", "object_data", self.__manager,
+ self.__user_id,
+ json_ids["policy_id"])
+ JsonUtils.convert_names_to_ids(json_rule["rule"], json_action_ids, "action_data",
+ "action", "action_data", self.__manager,
+ self.__user_id,
+ json_ids["policy_id"])
+
+ meta_rule = self.__manager.get_meta_rules(
+ moon_user_id=self.__user_id,
+ meta_rule_id=json_to_use["meta_rule_id"]
+ )
+ meta_rule = [v for v in meta_rule.values()]
+ meta_rule = meta_rule[0]
+
+ json_to_use_rule = self._reorder_rules_ids(json_rule, meta_rule["subject_categories"],
+ json_subject_ids["subject"],
+ json_ids["policy_id"],
+ self.__manager.get_subject_data)
+ json_to_use_rule = json_to_use_rule + self._reorder_rules_ids(
+ json_rule, meta_rule["object_categories"],
+ json_object_ids["object"],
+ json_ids["policy_id"],
+ self.__manager.get_object_data)
+ json_to_use_rule = json_to_use_rule + self._reorder_rules_ids(
+ json_rule,
+ meta_rule["action_categories"],
+ json_action_ids["action"],
+ json_ids["policy_id"],
+ self.__manager.get_action_data)
+ json_to_use["rule"] = json_to_use_rule
+ try:
+ LOGGER.debug("Adding / updating a rule from json {}".format(json_to_use))
+ self.__manager.add_rule(
+ moon_user_id=self.__user_id,
+ policy_id=json_ids["policy_id"],
+ meta_rule_id=json_to_use["meta_rule_id"],
+ value=json_to_use
+ )
+ except exceptions.RuleExisting as e:
+ LOGGER.error("rule existing {}".format(e))
+ except exceptions.PolicyUnknown:
+ raise exceptions.PolicyUnknown("Unknown policy with id {}".format(
+ json_ids["policy_id"]))
+
+ def _import_meta_rules(self, json_meta_rules):
+ imported_mrule = []
+ for json_meta_rule in json_meta_rules:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_meta_rule, json_to_use, "name", str)
+ JsonUtils.copy_field_if_exists(json_meta_rule, json_to_use, "description", str)
+ JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "subject_categories",
+ "subject_categories", "subject_category",
+ self.__manager,
+ self.__user_id)
+ JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "object_categories",
+ "object_categories", "object_category",
+ self.__manager,
+ self.__user_id)
+ JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "action_categories",
+ "action_categories", "action_category",
+ self.__manager,
+ self.__user_id)
+ LOGGER.debug("Adding / updating a metarule from json {}".format(json_meta_rule))
+ try:
+ meta_rule = self.__manager.add_meta_rule(
+ moon_user_id=self.__user_id,
+ meta_rule_id=None,
+ value=json_to_use
+ )
+ LOGGER.debug("Added / updated meta rule : {}".format(meta_rule))
+ imported_mrule.append(meta_rule)
+ except exceptions.MetaRuleExisting:
+ pass
+ return imported_mrule
+
+ def _import_subject_object_action_assignments(self, json_item_assignments, type_element):
+ import_method = None
+ get_method = None
+ if type_element == "subject":
+ import_method = self.__manager.add_subject_assignment
+ get_method = self.__manager.get_subject_data
+ elif type_element == "object":
+ import_method = self.__manager.add_object_assignment
+ get_method = self.__manager.get_object_data
+ elif type_element == "action":
+ import_method = self.__manager.add_action_assignment
+ get_method = self.__manager.get_action_data
+
+ if not isinstance(json_item_assignments, list):
+ raise exceptions.InvalidJson(type_element + " assignments shall be a list!")
+
+ # get the policy id related to the user
+ policies = self.__manager.get_policies(moon_user_id=self.__user_id)
+
+ for json_item_assignment in json_item_assignments:
+ item_override = JsonUtils.get_override(json_item_assignment)
+ if item_override is True:
+ raise exceptions.ForbiddenOverride(
+ "{} assignments do not support override flag !".format(type_element))
+
+ json_assignment = dict()
+ JsonUtils.convert_name_to_id(json_item_assignment, json_assignment, "category",
+ "category_id", type_element + "_category",
+ self.__manager,
+ self.__user_id)
+
+ has_found_data = False
+ # loop over policies
+ for policy_id in policies:
+ json_data = dict()
+ try:
+ JsonUtils.convert_name_to_id(json_item_assignment, json_assignment,
+ type_element, "id", type_element,
+ self.__manager,
+ self.__user_id, policy_id)
+ JsonUtils.convert_names_to_ids(json_item_assignment, json_data, "assignments",
+ "data_id", type_element + "_data",
+ self.__manager,
+ self.__user_id, policy_id,
+ json_assignment["category_id"])
+ has_found_data = True
+ except exceptions.UnknownName:
+ # the category or data has not been found in this policy:
+ # we look into the next one
+ continue
+ for data_id in json_data["data_id"]:
+ # find the policy related to the current data
+ data = get_method(moon_user_id=self.__user_id, policy_id=policy_id,
+ data_id=data_id,
+ category_id=json_assignment["category_id"])
+ if data is not None and len(data) == 1:
+ LOGGER.debug(
+ "Adding / updating a {} assignment from json {}".format(
+ type_element,
+ json_assignment))
+ args = {"moon_user_id": self.__user_id, "policy_id": policy_id,
+ type_element + "_id": json_assignment["id"],
+ "category_id": json_assignment["category_id"], "data_id": data_id}
+ try:
+ import_method(**args)
+ except exceptions.SubjectAssignmentExisting:
+ pass
+ except exceptions.ObjectAssignmentExisting:
+ pass
+ except exceptions.ActionAssignmentExisting:
+ pass
+ else:
+ raise exceptions.DataUnknown("Unknown data with id {}".format(data_id))
+
+ # case the data has not been found in any policies
+ if has_found_data is False:
+ raise exceptions.InvalidJson(
+ "The json contains unknown {} data or category : {}".format(
+ type_element,
+ json_item_assignment))
+
+ def _import_subject_object_action_datas(self, json_items_data, mandatory_policy_ids,
+ type_element):
+ import_method = None
+ if type_element == "subject":
+ import_method = self.__manager.set_subject_data
+ elif type_element == "object":
+ import_method = self.__manager.set_object_data
+ elif type_element == "action":
+ import_method = self.__manager.set_action_data
+
+ if not isinstance(json_items_data, list):
+ raise exceptions.InvalidJson(type_element + " data shall be a list!")
+
+ for json_item_data in json_items_data:
+ item_override = JsonUtils.get_override(json_items_data)
+ if item_override is True:
+ raise exceptions.ForbiddenOverride(
+ "{} datas do not support override flag !".format(type_element))
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_item_data, json_to_use, "name", str)
+ JsonUtils.copy_field_if_exists(json_item_data, json_to_use, "description", str)
+ json_policy = dict()
+ # field_mandatory : not mandatory if there is some mandatory policies
+ JsonUtils.convert_names_to_ids(json_item_data, json_policy, "policies", "policy_id",
+ "policy",
+ self.__manager, self.__user_id,
+ field_mandatory=len(mandatory_policy_ids) == 0)
+ json_category = dict()
+ JsonUtils.convert_name_to_id(json_item_data, json_category, "category", "category_id",
+ type_element + "_category",
+ self.__manager, self.__user_id)
+ policy_ids = []
+ if "policy_id" in json_policy:
+ policy_ids = json_policy["policy_id"]
+
+ for policy_id in policy_ids:
+ if policy_id is not None and policy_id not in mandatory_policy_ids:
+ mandatory_policy_ids.append(policy_id)
+
+ if len(mandatory_policy_ids) == 0:
+ raise exceptions.InvalidJson("Invalid data, the policy shall be set when "
+ "importing {}".format(json_item_data))
+ category_id = None
+ if "category_id" in json_category:
+ category_id = json_category["category_id"]
+ if category_id is None:
+ raise exceptions.InvalidJson(
+ "Invalid data, the category shall be set when importing {}".format(
+ json_item_data))
+
+ for policy_id in mandatory_policy_ids:
+ try:
+ import_method(moon_user_id=self.__user_id, policy_id=policy_id,
+ category_id=category_id,
+ value=json_to_use)
+ except exceptions.PolicyUnknown:
+ raise exceptions.PolicyUnknown("Unknown policy with id {}".format(policy_id))
+ except exceptions.SubjectScopeExisting:
+ pass
+ except exceptions.ObjectScopeExisting:
+ pass
+ except exceptions.ActionScopeExisting:
+ pass
+ except Exception as e:
+ LOGGER.exception(str(e))
+ raise e
+
+ def _import_subject_object_action_categories(self, json_item_categories, type_element):
+ imported_oac = []
+ import_method = None
+ get_method = None
+ if type_element == "subject":
+ import_method = self.__manager.add_subject_category
+ get_method = self.__manager.get_subject_categories
+ elif type_element == "object":
+ import_method = self.__manager.add_object_category
+ get_method = self.__manager.get_object_categories
+ elif type_element == "action":
+ import_method = self.__manager.add_action_category
+ get_method = self.__manager.get_action_categories
+
+ categories = get_method(moon_user_id=self.__user_id)
+
+ if not isinstance(json_item_categories, list):
+ raise exceptions.InvalidJson(type_element + " categories shall be a list!")
+
+ for json_item_category in json_item_categories:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_item_category, json_to_use, "name", str)
+
+ # check if category with the same name exists : do this in moondb ?
+ existing_id = None
+ for category_key in categories:
+ if categories[category_key]["name"] == json_to_use["name"]:
+ existing_id = category_key
+
+ JsonUtils.copy_field_if_exists(json_item_category, json_to_use, "description", str)
+ item_override = JsonUtils.get_override(json_item_category)
+ if item_override is True:
+ raise exceptions.ForbiddenOverride(
+ "{} categories do not support override flag !".format(type_element))
+
+ try:
+ import_method(moon_user_id=self.__user_id, category_id=existing_id,
+ value=json_to_use)
+ except (exceptions.SubjectCategoryExisting, exceptions.ObjectCategoryExisting,
+ exceptions.ActionCategoryExisting):
+ # it already exists: do nothing
+ LOGGER.warning("Ignored {} category with name {} is already in the database".format(
+ type_element, json_to_use["name"]))
+ except Exception as e:
+ LOGGER.warning("Error while importing the category : {}".format(str(e)))
+ LOGGER.exception(str(e))
+ raise e
+ imported_oac.append({
+ 'category': type_element,
+ 'name': json_to_use["name"]})
+ return imported_oac
+
+ def _import_subject_object_action(self, json_items, mandatory_policy_ids, type_element):
+ import_method = None
+ get_method = None
+ if type_element == "subject":
+ import_method = self.__manager.add_subject
+ get_method = self.__manager.get_subjects
+ elif type_element == "object":
+ import_method = self.__manager.add_object
+ get_method = self.__manager.get_objects
+ elif type_element == "action":
+ import_method = self.__manager.add_action
+ get_method = self.__manager.get_actions
+
+ if not isinstance(json_items, list):
+ raise exceptions.InvalidJson(type_element + " items shall be a list!")
+
+ for json_item in json_items:
+ json_without_policy_name = dict()
+ JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "name", str)
+ JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "description", str)
+ JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "extra", dict)
+
+ policy_list_ids = {}
+ JsonUtils.convert_names_to_ids(json_item, policy_list_ids, "policies",
+ "policy_list", "policy", self.__manager,
+ self.__user_id,
+ field_mandatory=False)
+ policy_ids = policy_list_ids["policy_list"]
+ # json_without_policy_name["policies"] = []
+ for mandatory_policy_id in mandatory_policy_ids:
+ if mandatory_policy_id not in policy_ids:
+ policy_ids.append(mandatory_policy_id)
+ # policy_ids and json_without_policy_name are references to the same array...
+ # json_without_policy_name["policy_list"].append(mandatory_policy_id)
+
+ item_override = JsonUtils.get_override(json_item)
+ if item_override is True:
+ raise exceptions.ForbiddenOverride("{} does not support override flag !".format(
+ type_element))
+
+ if len(policy_ids) == 0:
+ raise exceptions.PolicyUnknown(
+ "a {} needs at least one policy to be created or updated : {}".format(
+ type_element, json.dumps(json_item)))
+
+ for policy_id in policy_ids:
+ try:
+ items_in_db = get_method(moon_user_id=self.__user_id, policy_id=policy_id)
+ items_in_db = items_in_db.get(policy_id, {})
+ key = None
+ for key_in_db in items_in_db:
+ if items_in_db[key_in_db]["name"] == json_without_policy_name["name"]:
+ key = key_in_db
+ break
+ try:
+ element = import_method(moon_user_id=self.__user_id, policy_id=policy_id,
+ perimeter_id=key,
+ value=json_without_policy_name)
+ LOGGER.debug("Added / updated {} : {}".format(type_element, element))
+ except exceptions.PolicyExisting:
+ pass
+
+ except exceptions.PolicyUnknown:
+ LOGGER.error("Unknown policy when adding a {}!".format(
+ type_element))
+ raise exceptions.PolicyUnknown("Unknown policy when adding a {}!".format(
+ type_element))
+ except Exception as e:
+ LOGGER.exception(str(e))
+ raise e
+
+ def _import_policies(self, json_policies):
+ policy_mandatory_ids = []
+ policy_mandatory_names = []
+
+ if not isinstance(json_policies, list):
+ raise exceptions.InvalidJson("policies shall be a list!")
+
+ for json_policy in json_policies:
+ # TODO put this in moondb
+ # policy_in_db =
+ # self.driver.PolicyManager.get_policies_by_name(json_without_model_name["name"])
+ policies = self.__manager.get_policies(moon_user_id=self.__user_id)
+ policy_in_db = None
+ policy_id = None
+ for policy_key in policies:
+ if policies[policy_key]["name"] == json_policy["name"]:
+ policy_in_db = policies[policy_key]
+ policy_id = policy_key
+ # end TODO
+ if policy_in_db is None:
+ policy_does_exist = False
+ else:
+ policy_does_exist = True
+
+ policy_override = JsonUtils.get_override(json_policy)
+ policy_mandatory = JsonUtils.get_mandatory(json_policy)
+
+ if policy_override is False and policy_does_exist:
+ if policy_id:
+ policy_mandatory_ids.append(policy_id)
+ policy_mandatory_names.append(json_policy["name"])
+ LOGGER.warning(
+ "Existing policy not updated because of the override option is not set !")
+ continue
+
+ json_without_model_name = dict()
+ JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "name", str)
+ JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "description", str)
+ JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "genre", str)
+ JsonUtils.convert_name_to_id(json_policy, json_without_model_name, "model", "model_id",
+ "model", self.__manager, self.__user_id,
+ field_mandatory=False)
+
+ if not policy_does_exist:
+ LOGGER.debug("Creating policy {} ".format(json_without_model_name))
+ added_policy = self.__manager.add_policy(
+ moon_user_id=self.__user_id,
+ value=json_without_model_name)
+ if policy_mandatory is True:
+ keys = list(added_policy.keys())
+ policy_mandatory_ids.append(keys[0])
+ policy_mandatory_names.append(json_policy["name"])
+ elif policy_override is True:
+ LOGGER.debug("Updating policy {} ".format(json_without_model_name))
+ self.__manager.update_policy(moon_user_id=self.__user_id,
+ policy_id=policy_id,
+ value=json_without_model_name)
+ if policy_mandatory is True:
+ policy_mandatory_ids.append(policy_id)
+ policy_mandatory_names.append(json_policy["name"])
+ return [policy_mandatory_ids, policy_mandatory_names]
+
+ def _import_models_with_new_meta_rules(self, json_models):
+ if not isinstance(json_models, list):
+ raise exceptions.InvalidJson("models shall be a list!")
+
+ for json_model in json_models:
+ models = self.__manager.get_models(moon_user_id=self.__user_id)
+ model_in_db = None
+ model_id = None
+ for model_key in models:
+ if ("id" in json_model and model_key == json_model["id"]) or (
+ "name" in json_model and models[model_key]["name"] == json_model["name"]):
+ model_in_db = models[model_key]
+ model_id = model_key
+
+ # this should not occur as the model has been put in db previously in
+ # import_models_without_new_meta_rules
+ if model_in_db is None:
+ raise exceptions.ModelUnknown("Unknown model")
+
+ json_key = dict()
+ JsonUtils.convert_names_to_ids(json_model, json_key, "meta_rules", "meta_rule_id",
+ "meta_rule", self.__manager, self.__user_id)
+ for meta_rule_id in json_key["meta_rule_id"]:
+ if meta_rule_id not in model_in_db["meta_rules"]:
+ model_in_db["meta_rules"].append(meta_rule_id)
+
+ self.__manager.update_model(moon_user_id=self.__user_id,
+ model_id=model_id,
+ value=model_in_db)
+
+ def _import_models_without_new_meta_rules(self, json_models):
+ if not isinstance(json_models, list):
+ raise exceptions.InvalidJson("models shall be a list!")
+ imported_model_names = []
+ for json_model in json_models:
+ json_without_new_metarules = dict()
+ JsonUtils.copy_field_if_exists(json_model, json_without_new_metarules, "name", str)
+
+ models = self.__manager.get_models(moon_user_id=self.__user_id)
+ model_in_db = None
+ model_id = None
+ for model_key in models:
+ if models[model_key]["name"] == json_without_new_metarules["name"]:
+ model_in_db = models[model_key]
+ model_id = model_key
+
+ JsonUtils.copy_field_if_exists(json_model, json_without_new_metarules, "description",
+ str)
+ if model_in_db is None:
+ model_does_exist = False
+ else:
+ json_without_new_metarules["meta_rules"] = model_in_db["meta_rules"]
+ model_does_exist = True
+ model_override = JsonUtils.get_override(json_model)
+ if not model_does_exist:
+ LOGGER.debug("Creating model {} ".format(json_without_new_metarules))
+ self.__manager.add_model(moon_user_id=self.__user_id,
+ value=json_without_new_metarules)
+ elif model_override is True:
+ LOGGER.debug(
+ "Updating model with id {} : {} ".format(model_id, json_without_new_metarules))
+ self.__manager.update_model(moon_user_id=self.__user_id,
+ model_id=model_id,
+ value=json_without_new_metarules)
+ if "name" in json_without_new_metarules:
+ imported_model_names.append(json_without_new_metarules["name"])
+ return imported_model_names
+
+ def _import_pdps(self, json_pdps):
+ if not isinstance(json_pdps, list):
+ raise exceptions.InvalidJson("pdps shall be a list!")
+ imported_pdp_names = []
+ for json_pdp in json_pdps:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "name", str)
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "vim_project_id", str)
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "security_pipeline", list)
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "description", str)
+
+ pdps = self.__manager.get_pdp(moon_user_id=self.__user_id)
+ exists = False
+ for pdp_key in pdps:
+ if pdps[pdp_key]["name"] == json_to_use["name"]:
+ self.__manager.update_pdp(moon_user_id=self.__user_id, pdp_id=pdp_key,
+ value=json_to_use)
+ exists = True
+ if exists is False:
+ self.__manager.add_pdp(moon_user_id=self.__user_id, value=json_to_use)
+ imported_pdp_names.append(json_to_use["name"])
+
+ def import_json(self, **kwargs):
+ if self.__driver == "db":
+ if "body" in kwargs:
+ return self.__import_json_to_db(kwargs.get("body")).keys()
+ else:
+ raise Exception("Bad argument given...")
+ else:
+ if "body" in kwargs:
+ return self.__import_json_to_cache(kwargs.get("body")).keys()
+ else:
+ raise Exception("Bad argument given...")
+
+ def __import_json_to_db(self, body):
+ imported_data = {}
+
+ LOGGER.debug("Importing content: {} ...".format(body))
+
+ # first import the models without the meta rules as they are not yet defined
+ if "models" in body:
+ LOGGER.info("Importing models...")
+ imported_model_names = self._import_models_without_new_meta_rules(body["models"])
+ imported_data['models'] = imported_model_names
+
+
+
+ # import subjects, object, action_categories
+ list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_categories"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_oac = self._import_subject_object_action_categories(body[key], in_key)
+ imported_data[key] = imported_oac
+
+ # import meta rules
+ if "meta_rules" in body:
+ LOGGER.info("Importing meta rules...")
+ imported_mrules = self._import_meta_rules(body["meta_rules"])
+ imported_data["meta_rules"] = imported_mrules
+
+ # add the metarule to model
+ if "models" in body:
+ LOGGER.info("Updating models with meta rules...")
+ self._import_models_with_new_meta_rules(body["models"])
+
+ # import the policies that depends on the models
+ mandatory_policy_ids = []
+ if "policies" in body:
+ LOGGER.info("Importing policies...")
+ mandatory_policy_ids, policy_mandatory_names = self._import_policies(body["policies"])
+ imported_data["policies"] = {
+ 'id': mandatory_policy_ids,
+ 'name': policy_mandatory_names}
+
+ # import subjects, object, action
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "s"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_sub = self._import_subject_object_action(body[key], mandatory_policy_ids, in_key)
+ imported_data[key] = imported_sub
+
+ # import subjects, object, action data
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_data"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_sub =self._import_subject_object_action_datas(body[key], mandatory_policy_ids,
+ in_key)
+ imported_data[key] = imported_sub
+
+ # import subjects assignments, idem for object and action
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_assignments"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_sub = self._import_subject_object_action_assignments(body[key], in_key)
+ imported_data[key] = imported_sub
+
+ # import rules
+ if "rules" in body:
+ LOGGER.info("Importing rules...")
+ imported_sub = self._import_rules(body["rules"])
+ imported_data["rules"] = imported_sub
+
+ # import pdps
+ if "pdps" in body:
+ LOGGER.info("Importing pdps...")
+ imported_sub = self._import_pdps(body["pdps"])
+ imported_data["pdps"] = imported_sub
+
+ return imported_data
+
+ def __import_json_to_cache(self, body):
+ imported_data = {}
+
+ LOGGER.debug("Importing content: {} ...".format(body))
+
+ # first import the models without the meta rules as they are not yet defined
+ if "models" in body:
+ LOGGER.info("Importing models...")
+ imported_model_names = self._import_models_without_new_meta_rules(body["models"])
+ imported_data['models'] = imported_model_names
+
+
+ # import subjects, object, action_categories
+ list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_categories"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_oac = self._import_subject_object_action_categories(body[key], in_key)
+ imported_data[key] = imported_oac
+
+ # import meta rules
+ if "meta_rules" in body:
+ LOGGER.info("Importing meta rules...")
+ imported_mrules = self._import_meta_rules(body["meta_rules"])
+ imported_data["meta_rules"] = imported_mrules
+
+ # add the metarule to model
+ if "models" in body:
+ LOGGER.info("Updating models with meta rules...")
+ self._import_models_with_new_meta_rules(body["models"])
+
+ # import the policies that depends on the models
+ mandatory_policy_ids = []
+ if "policies" in body:
+ LOGGER.info("Importing policies...")
+ mandatory_policy_ids, policy_mandatory_names = self._import_policies(body["policies"])
+ imported_data["policies"] = {
+ 'id': mandatory_policy_ids,
+ 'name': policy_mandatory_names}
+
+ # import subjects, object, action
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "s"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_sub = self._import_subject_object_action(body[key], mandatory_policy_ids, in_key)
+ imported_data[key] = imported_sub
+
+ #import subjects, object, action data
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_data"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_sub= self._import_subject_object_action_datas(body[key], mandatory_policy_ids,
+ in_key)
+ imported_data[key] = imported_sub
+
+ # import subjects assignments, idem for object and action
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_assignments"
+ if key in body:
+ LOGGER.info("Importing {}...".format(key))
+ imported_sub = self._import_subject_object_action_assignments(body[key], in_key)
+ imported_data[key] = imported_sub
+
+ # import rules
+ if "rules" in body:
+ LOGGER.info("Importing rules...")
+ imported_sub = self._import_rules(body["rules"])
+ imported_data["rules"] = imported_sub
+
+ # import pdps
+ if "pdps" in body:
+ LOGGER.info("Importing pdps...")
+ imported_sub = self._import_pdps(body["pdps"])
+ imported_data["pdps"] = imported_sub
+ return imported_data
+
+
+class JsonExport(object):
+ __user_id = None
+ __dirver = None
+ __manager = None
+
+ def __init__(self, driver_name="db", driver=None):
+ self.__driver = driver_name
+ if driver_name == "db":
+ self.__manager = DBManager(driver)
+ else:
+ self.__manager = CacheManager(driver)
+
+ def _export_rules(self, json_content):
+ policies = self.__manager.get_policies(moon_user_id=self.__user_id)
+ rules_array = []
+
+ for policy_key in policies:
+ rules = self.__manager.get_rules(moon_user_id=self.__user_id, policy_id=policy_key)
+ rules = rules["rules"]
+ for rule in rules:
+ rule_dict = dict()
+ JsonUtils.copy_field_if_exists(rule, rule_dict, "instructions", dict)
+ JsonUtils.copy_field_if_exists(rule, rule_dict, "enabled", True)
+ JsonUtils.convert_id_to_name(rule["meta_rule_id"], rule_dict, "meta_rule",
+ "meta_rule", self.__manager, self.__user_id)
+ JsonUtils.convert_id_to_name(policy_key, rule_dict, "policy", "policy",
+ self.__manager, self.__user_id)
+ ids = rule["rule"]
+ rule_description = dict()
+ meta_rule = self.__manager.get_meta_rules(moon_user_id=self.__user_id,
+ meta_rule_id=rule["meta_rule_id"])
+ meta_rule = [v for v in meta_rule.values()]
+ meta_rule = meta_rule[0]
+ index_subject_data = len(meta_rule["subject_categories"]) - 1
+ index_object_data = len(meta_rule["subject_categories"]) + len(
+ meta_rule["object_categories"]) - 1
+ index_action_data = len(meta_rule["subject_categories"]) + len(
+ meta_rule["object_categories"]) + len(meta_rule["action_categories"]) - 1
+ ids_subject_data = [ids[0]] if len(meta_rule["subject_categories"]) == 1 else ids[
+ 0:index_subject_data]
+ ids_object_data = [ids[index_object_data]] if len(
+ meta_rule["object_categories"]) == 1 else ids[
+ index_subject_data + 1:index_object_data]
+ ids_action_date = [ids[index_action_data]] if len(
+ meta_rule["action_categories"]) == 1 else ids[
+ index_object_data + 1:index_action_data]
+ JsonUtils.convert_ids_to_names(ids_subject_data, rule_description, "subject_data",
+ "subject_data", self.__manager, self.__user_id,
+ policy_key)
+ JsonUtils.convert_ids_to_names(ids_object_data, rule_description, "object_data",
+ "object_data", self.__manager, self.__user_id,
+ policy_key)
+ JsonUtils.convert_ids_to_names(ids_action_date, rule_description, "action_data",
+ "action_data", self.__manager, self.__user_id,
+ policy_key)
+ rule_dict["rule"] = rule_description
+ rules_array.append(rule_dict)
+
+ if len(rules_array) > 0:
+ json_content['rules'] = rules_array
+
+ def _export_meta_rules(self, json_content):
+ meta_rules = self.__manager.get_meta_rules(moon_user_id=self.__user_id)
+ meta_rules_array = []
+ for meta_rule_key in meta_rules:
+ meta_rule_dict = dict()
+ JsonUtils.copy_field_if_exists(meta_rules[meta_rule_key], meta_rule_dict, "name", str)
+ JsonUtils.copy_field_if_exists(meta_rules[meta_rule_key], meta_rule_dict, "description",
+ str)
+ JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["subject_categories"],
+ meta_rule_dict, "subject_categories", "subject_category",
+ self.__manager, self.__user_id)
+ JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["object_categories"],
+ meta_rule_dict, "object_categories", "object_category",
+ self.__manager, self.__user_id)
+ JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["action_categories"],
+ meta_rule_dict, "action_categories", "action_category",
+ self.__manager, self.__user_id)
+ meta_rules_array.append(meta_rule_dict)
+ if len(meta_rules_array) > 0:
+ json_content['meta_rules'] = meta_rules_array
+
+ def _export_subject_object_action_assignments(self, type_element, json_content):
+ export_method_data = None
+ if type_element == "subject":
+ export_method_data = self.__manager.get_subject_assignments
+ elif type_element == "object":
+ export_method_data = self.__manager.get_object_assignments
+ if type_element == "action":
+ export_method_data = self.__manager.get_action_assignments
+ policies = self.__manager.get_policies(moon_user_id=self.__user_id)
+ element_assignments_array = []
+ for policy_key in policies:
+ assignments = export_method_data(moon_user_id=self.__user_id, policy_id=policy_key)
+ for assignment_key in assignments:
+ assignment_dict = dict()
+ JsonUtils.convert_id_to_name(assignments[assignment_key][type_element + "_id"],
+ assignment_dict, type_element, type_element,
+ self.__manager, self.__user_id, policy_key)
+ JsonUtils.convert_id_to_name(assignments[assignment_key]["category_id"],
+ assignment_dict, "category",
+ type_element + "_category", self.__manager,
+ self.__user_id, policy_key)
+ JsonUtils.convert_ids_to_names(assignments[assignment_key]["assignments"],
+ assignment_dict, "assignments",
+ type_element + "_data", self.__manager,
+ self.__user_id,
+ policy_key)
+ element_assignments_array.append(assignment_dict)
+ LOGGER.info("Exporting {} assignment {}".format(type_element, assignment_dict))
+ if len(element_assignments_array) > 0:
+ json_content[type_element + '_assignments'] = element_assignments_array
+
+ def _export_subject_object_action_datas(self, type_element, json_content):
+ export_method_data = None
+ if type_element == "subject":
+ export_method_data = self.__manager.get_subject_data
+ elif type_element == "object":
+ export_method_data = self.__manager.get_object_data
+ if type_element == "action":
+ export_method_data = self.__manager.get_action_data
+ policies = self.__manager.get_policies(moon_user_id=self.__user_id)
+ element_datas_array = []
+ for policy_key in policies:
+ datas = export_method_data(moon_user_id=self.__user_id, policy_id=policy_key)
+ for data_group in datas:
+ policy_id = data_group["policy_id"]
+ category_id = data_group["category_id"]
+ for data_key in data_group["data"]:
+ data_dict = dict()
+ if type_element == 'subject':
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "name", str)
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "description", str)
+ else:
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "name", str)
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "description", str)
+
+ JsonUtils.convert_id_to_name(policy_id, data_dict, "policy", "policy",
+ self.__manager, self.__user_id)
+ JsonUtils.convert_id_to_name(category_id, data_dict, "category",
+ type_element + "_category", self.__manager,
+ self.__user_id, policy_key)
+ LOGGER.info("Exporting {} data {}".format(type_element, data_dict))
+ element_datas_array.append(data_dict)
+
+ if len(element_datas_array) > 0:
+ json_content[type_element + '_data'] = element_datas_array
+
+ def _export_subject_object_action_categories(self, type_element, json_content):
+ export_method = None
+ if type_element == "subject":
+ export_method = self.__manager.get_subject_categories
+ elif type_element == "object":
+ export_method = self.__manager.get_object_categories
+ if type_element == "action":
+ export_method = self.__manager.get_action_categories
+ element_categories = export_method(moon_user_id=self.__user_id)
+ element_categories_array = []
+ for element_category_key in element_categories:
+ element_category = dict()
+ JsonUtils.copy_field_if_exists(element_categories[element_category_key],
+ element_category, "name", str)
+ JsonUtils.copy_field_if_exists(element_categories[element_category_key],
+ element_category, "description", str)
+ element_categories_array.append(element_category)
+ LOGGER.info("Exporting {} category {}".format(type_element, element_category))
+ if len(element_categories_array) > 0:
+ json_content[type_element + '_categories'] = element_categories_array
+
+ def _export_subject_object_action(self, type_element, json_content):
+ export_method = None
+ if type_element == "subject":
+ export_method = self.__manager.get_subjects
+ elif type_element == "object":
+ export_method = self.__manager.get_objects
+ if type_element == "action":
+ export_method = self.__manager.get_actions
+ policies = self.__manager.get_policies(moon_user_id=self.__user_id)
+ element_dict = dict()
+ elements_array = []
+ for policy_key in policies:
+ elements = export_method(moon_user_id=self.__user_id, policy_id=policy_key)
+ for element_key in elements:
+ element = dict()
+ JsonUtils.copy_field_if_exists(elements[element_key], element, "name", str)
+ JsonUtils.copy_field_if_exists(elements[element_key], element, "description", str)
+ JsonUtils.copy_field_if_exists(elements[element_key], element, "extra", dict)
+ if element["name"] not in element_dict:
+ element["policies"] = []
+ element_dict[element["name"]] = element
+ current_element = element_dict[element["name"]]
+ current_element["policies"].append({"name": JsonUtils.convert_id_to_name_string(
+ policy_key, "policy", self.__manager, self.__user_id)})
+
+ for key in element_dict:
+ LOGGER.info("Exporting {} {}".format(type_element, element_dict[key]))
+ elements_array.append(element_dict[key])
+
+ if len(elements_array) > 0:
+ json_content[type_element + 's'] = elements_array
+
+ def _export_policies(self, json_content):
+ policies = self.__manager.get_policies(moon_user_id = self.__user_id)
+ policies_array = []
+ for policy_key in policies:
+ policy = dict()
+ JsonUtils.copy_field_if_exists(policies[policy_key], policy, "name", str)
+ JsonUtils.copy_field_if_exists(policies[policy_key], policy, "genre", str)
+ JsonUtils.copy_field_if_exists(policies[policy_key], policy, "description", str)
+ JsonUtils.convert_id_to_name(policies[policy_key]["model_id"], policy, "model", "model",
+ self.__manager, self.__user_id)
+ LOGGER.info("Exporting policy {}".format(policy))
+ policies_array.append(policy)
+ if len(policies_array) > 0:
+ json_content["policies"] = policies_array
+
+ def _export_models(self, json_content):
+ models = self.__manager.get_models(moon_user_id=self.__user_id)
+ models_array = []
+ for model_key in models:
+ model = dict()
+ JsonUtils.copy_field_if_exists(models[model_key], model, "name", str)
+ JsonUtils.copy_field_if_exists(models[model_key], model, "description", str)
+ JsonUtils.convert_ids_to_names(models[model_key]["meta_rules"], model, "meta_rules",
+ "meta_rule", self.__manager, self.__user_id)
+ LOGGER.info("Exporting model {}".format(model))
+ models_array.append(model)
+ if len(models_array) > 0:
+ json_content["models"] = models_array
+
+ def _export_pdps(self, json_content):
+ pdps = self.__manager.get_pdp(moon_user_id=self.__user_id)
+ pdps_array = []
+ for pdp_key in pdps:
+ LOGGER.info("Exporting pdp {}".format(pdps[pdp_key]))
+ pdps_array.append(pdps[pdp_key])
+ if len(pdps_array) > 0:
+ json_content["pdps"] = pdps_array
+
+ def export_json(self, **kwargs):
+ if self.__driver == "db":
+ if "moon_user_id" in kwargs:
+ return self.__export_json_from_db(kwargs.get("moon_user_id"))
+ else:
+ raise Exception("Bad argument given...")
+ else:
+ if "body" in kwargs:
+ return self.__export_json_from_db(kwargs.get("body"))
+ else:
+ raise Exception("Bad argument given...")
+
+ def __export_json_from_db(self, moon_user_id=None):
+ self.__user_id = moon_user_id
+
+ json_content = dict()
+
+ LOGGER.info("Exporting pdps...")
+ self._export_pdps(json_content)
+ LOGGER.info("Exporting policies...")
+ self._export_policies(json_content)
+ LOGGER.info("Exporting models...")
+ self._export_models(json_content)
+ # export subjects, subject_data, subject_categories, subject_assignements
+ # idem for object and action
+ list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
+ for elt in list_element:
+ LOGGER.info("Exporting {}s...".format(elt["key"]))
+ self._export_subject_object_action(elt["key"], json_content)
+ LOGGER.info("Exporting {} categories...".format(elt["key"]))
+ self._export_subject_object_action_categories(elt["key"], json_content)
+ LOGGER.info("Exporting {} data...".format(elt["key"]))
+ self._export_subject_object_action_datas(elt["key"], json_content)
+ LOGGER.info("Exporting {} assignments...".format(elt["key"]))
+ self._export_subject_object_action_assignments(elt["key"], json_content)
+ LOGGER.info("Exporting meta rules...")
+ self._export_meta_rules(json_content)
+ LOGGER.info("Exporting rules...")
+ self._export_rules(json_content)
+
+ return json_content
diff --git a/moon_utilities/moon_utilities/security_functions.py b/moon_utilities/moon_utilities/security_functions.py
new file mode 100644
index 00000000..07aaa965
--- /dev/null
+++ b/moon_utilities/moon_utilities/security_functions.py
@@ -0,0 +1,83 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+import logging
+from moon_utilities import exceptions
+import html
+import hug
+
+LOGGER = logging.getLogger("moon.utilities." + __name__)
+
+
+def enforce(action_names, object_name, **extra):
+ """Fake version of the enforce decorator"""
+ def wrapper_func(func):
+ def wrapper_args(*args, **kwargs):
+ # TODO: implement the enforce decorator
+ return func(*args, **kwargs)
+ return wrapper_args
+ return wrapper_func
+
+
+def validate_data(data):
+ def __validate_string(string):
+ temp_str = html.escape(string)
+ if string != temp_str:
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+
+ def __validate_list_or_tuple(container):
+ for i in container:
+ validate_data(i)
+
+ def __validate_dict(dictionary):
+ for key in dictionary:
+ validate_data(dictionary[key])
+
+ if isinstance(data, bool):
+ return True
+ if data is None:
+ data = ""
+ if isinstance(data, str):
+ __validate_string(data)
+ elif isinstance(data, list) or isinstance(data, tuple):
+ __validate_list_or_tuple(data)
+ elif isinstance(data, dict):
+ __validate_dict(data)
+ else:
+ raise exceptions.ValidationContentError('Value is Not String or Container or Dictionary: {}'.format(data))
+
+
+def validate_input(*validators):
+ """Validation only succeeds if all passed in validators return no errors"""
+ body_state = {"name", "id", "category_id", "data_id"}
+
+ def validate_all_input(fields, **kwargs):
+ try:
+ for validator in validators:
+ # errors = validator(fields)
+ if validator not in fields:
+ raise exceptions.ValidationKeyError('Invalid Key :{} not found'.format(validator))
+
+ for field in body_state:
+ if field in fields:
+ try:
+ validate_data(fields[field])
+ except exceptions.ValidationContentError as e:
+ raise exceptions.ValidationContentError("Key: '{}', [{}]".format(field, str(e)))
+ except Exception as e:
+ LOGGER.exception(e)
+ raise e
+ return fields
+
+ validate_all_input.__doc__ = " and ".join(validator.__doc__ for validator in validators)
+ return validate_all_input
diff --git a/moon_utilities/moon_utilities/update_opst_policies.py b/moon_utilities/moon_utilities/update_opst_policies.py
new file mode 100644
index 00000000..4a629181
--- /dev/null
+++ b/moon_utilities/moon_utilities/update_opst_policies.py
@@ -0,0 +1,85 @@
+# Copyright 2019 Orange and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Update policy files of an OpenStack platform
+"""
+
+import argparse
+import logging
+import os
+
+
+COMPONENTS = [
+ "cinder",
+ "glance",
+ "keystone",
+ "neutron",
+ "nova",
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+def init():
+ """
+ Initialize the application
+ :return: argument given in the command line
+ """
+ global policy
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--verbose", '-v', action='store_true', help='verbose mode')
+ parser.add_argument("--debug", '-d', action='store_true', help='debug mode')
+ parser.add_argument("--dir",
+ help='directory containing policy files, defaults to /etc',
+ default="/etc")
+ parser.add_argument("--exclude", "-x",
+ help="Exclude some components "
+ "(example: \"nova,neutron\")",
+ default="")
+ parser.add_argument("--include", "-i",
+ help="Only include some components "
+ "(example: \"nova,neutron\")",
+ default="")
+ args = parser.parse_args()
+ logging_format = "%(levelname)s: %(message)s"
+ if args.verbose:
+ logging.basicConfig(level=logging.INFO, format=logging_format)
+ if args.debug:
+ logging.basicConfig(level=logging.DEBUG, format=logging_format)
+ else:
+ logging.basicConfig(format=logging_format)
+
+ return args
+
+
+def update_component(component, args):
+ """
+
+ :param component:
+ :return:
+ """
+ filename = os.path.join(args.dir, component, "policy.json")
+ logger.info(f"Updating {component} ({filename})")
+ if not os.path.isfile(filename):
+ logger.error(f"Cannot find {filename}")
+ return
+
+
+def main():
+ args = init()
+ if args.include:
+ for component in args.include.split(","):
+ update_component(component, args)
+ else:
+ excl_comp = args.exclude.split(",")
+ for component in COMPONENTS:
+ if component in excl_comp:
+ continue
+ update_component(component, args)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/moon_utilities/requirements.txt b/moon_utilities/requirements.txt
new file mode 100644
index 00000000..5c2032c1
--- /dev/null
+++ b/moon_utilities/requirements.txt
@@ -0,0 +1,3 @@
+requests
+hug
+tinydb
diff --git a/moon_utilities/setup.py b/moon_utilities/setup.py
new file mode 100644
index 00000000..f5fa746f
--- /dev/null
+++ b/moon_utilities/setup.py
@@ -0,0 +1,58 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from setuptools import setup, find_packages
+import moon_utilities
+
+with open('requirements.txt') as f:
+ required = list(filter(
+ lambda s: (len(s.strip()) > 0 and s.strip()[0] != '#'),
+ f.read().split('\n')))
+
+setup(
+
+ name='moon_utilities',
+
+ version=moon_utilities.__version__,
+
+ packages=find_packages(),
+
+ author='Thomas Duval',
+
+ author_email='thomas.duval@orange.com',
+
+ description='Some utilities for all the Moon components',
+
+ long_description=open('README.md').read(),
+
+ install_requires=required,
+
+ include_package_data=True,
+
+ url='',
+
+ classifiers=[
+ 'Programming Language :: Python :: 3',
+ 'Development Status :: 1 - Planning',
+ 'License :: OSI Approved',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ ],
+
+ entry_points={
+ 'console_scripts': [
+ 'generate_opst_policy = moon_utilities.generate_opst_policy:main',
+ ],
+
+ }
+
+)
diff --git a/moon_utilities/tests/unit_python/api/__init__.py b/moon_utilities/tests/unit_python/api/__init__.py
new file mode 100644
index 00000000..1856aa2c
--- /dev/null
+++ b/moon_utilities/tests/unit_python/api/__init__.py
@@ -0,0 +1,12 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
diff --git a/moon_utilities/tests/unit_python/api/test_auth_functions.py b/moon_utilities/tests/unit_python/api/test_auth_functions.py
new file mode 100644
index 00000000..70af19c1
--- /dev/null
+++ b/moon_utilities/tests/unit_python/api/test_auth_functions.py
@@ -0,0 +1,83 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import os
+from uuid import uuid4
+import pytest
+from moon_utilities.auth_functions import xor_encode, xor_decode
+from moon_utilities import exceptions
+from moon_utilities.auth_functions import init_db, add_user, authenticate_user
+from moon_utilities.auth_functions import authenticate_key, get_api_key, del_api_key_for_user
+
+
+def test_xor():
+ uuid1 = uuid4().hex
+ my_key = uuid4().hex
+ crypted_data = xor_encode(uuid1, my_key)
+ assert uuid1 != crypted_data
+ decrypted_data = xor_decode(crypted_data, my_key)
+ assert uuid1 == decrypted_data
+
+
+def test_decrypt_exceptions():
+ with pytest.raises(exceptions.DecryptError):
+ uuid1 = uuid4().hex
+ my_key = uuid4().hex
+ crypted_data = xor_encode(uuid1, my_key)
+ assert uuid1 != crypted_data
+ my_key = False
+ xor_decode(crypted_data, my_key)
+ with pytest.raises(exceptions.DecryptError):
+ uuid1 = uuid4().hex
+ my_key = uuid4().hex
+ crypted_data = xor_encode(uuid1, my_key)
+ assert uuid1 != crypted_data
+ my_key = ""
+ xor_decode(crypted_data, my_key)
+
+
+def test_encrypt_exceptions():
+ with pytest.raises(exceptions.EncryptError):
+ uuid1 = uuid4().hex
+ my_key = False
+ xor_encode(uuid1, my_key)
+ with pytest.raises(exceptions.EncryptError):
+ uuid1 = uuid4().hex
+ my_key = ""
+ xor_encode(uuid1, my_key)
+
+
+def test_auth_api():
+ try:
+ os.remove("/tmp/test.db")
+ except FileNotFoundError:
+ pass
+ init_db("/tmp/test.db")
+ # create the user
+ result = add_user("test_user", "1234567890")
+ assert result
+ # trying to auth the user
+ assert authenticate_user("test_user", "1234567890")
+ assert not authenticate_user("bad_test_user", "1234567890")
+ assert not authenticate_key(None)
+ assert not authenticate_key("")
+ assert authenticate_key(result['api_key']) == "test_user"
+ assert get_api_key("test_user", "1234567890") == result['api_key']
+ # logout the user
+ assert del_api_key_for_user("test_user")
+ assert get_api_key("test_user", "1234567890") != result['api_key']
+ assert get_api_key("test_user", "1234567890") is None
+ # re-authent user
+ assert authenticate_user("test_user", "1234567890")
+ # check that the previous api_key is not valid again
+ assert get_api_key("test_user", "1234567890") != result['api_key']
+ assert get_api_key("test_user", "1234567890")
diff --git a/moon_utilities/tests/unit_python/api/test_import_to_cache.py b/moon_utilities/tests/unit_python/api/test_import_to_cache.py
new file mode 100644
index 00000000..01e717fb
--- /dev/null
+++ b/moon_utilities/tests/unit_python/api/test_import_to_cache.py
@@ -0,0 +1,775 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import helpers.import_export_cache_helper as import_export_helper
+import pytest
+from moon_utilities import exceptions
+
+
+MODEL_WITHOUT_META_RULES = [
+ {"models": [{"name": "test model", "description": "", "meta_rules": []}]},
+ {"models": [{"name": "test model", "description": "new description", "meta_rules": [],
+ "override": True}]},
+ {"models": [{"name": "test model", "description": "description not taken into account",
+ "meta_rules": [], "override": False}]}
+]
+
+POLICIES = [
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}]},
+ {"policies": [{"name": "test policy", "genre": "authz",
+ "description": "new description not taken into account",
+ "model": {"name": "test model"}, "mandatory": True}]},
+ {"policies": [
+ {"name": "test policy", "genre": "not authz ?", "description": "generates an exception",
+ "model": {"name": "test model"}, "override": True}]},
+ {"models": [{"name": "test model", "description": "", "meta_rules": []}], "policies": [
+ {"name": "test policy", "genre": "not authz ?", "description": "changes taken into account",
+ "model": {"name": "test model"}, "override": True}]},
+]
+
+SUBJECTS = [
+ {"subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {}, "mandatory": True}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"subjects": [{"name": "testuser", "description": "new description of the subject",
+ "extra": {"email": "new-email@test.com"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": [{"name": "test policy"}]}]}]
+
+OBJECTS = [
+ {"objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": True}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"objects": [{"name": "test object", "description": "new description of the object",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": [{"name": "test policy"}]}]},
+]
+
+ACTIONS = [
+ {"actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {}, "mandatory": True}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"actions": [{"name": "test action", "description": "new description of the action",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": [{"name": "test policy"}]}]}]
+
+SUBJECT_CATEGORIES = [{"subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"}]},
+ {"subject_categories": [{"name": "test subject categories",
+ "description": "new subject category description"}]}]
+
+OBJECT_CATEGORIES = [{"object_categories": [
+ {"name": "test object categories", "description": "object category description"}]},
+ {"object_categories": [{"name": "test object categories",
+ "description": "new object category description"}]}]
+
+ACTION_CATEGORIES = [{"action_categories": [
+ {"name": "test action categories", "description": "action category description"}]},
+ {"action_categories": [{"name": "test action categories",
+ "description": "new action category description"}]}]
+
+# meta_rules import is needed otherwise the search for data do not work !!!
+PRE_DATA = {"models": [
+ {
+ "name": "test model", "description": "",
+ "meta_rules": [{"name": "good meta rule"},
+ {"name": "other good meta rule"}]}],
+ "policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}],
+ "subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"},
+ {"name": "other test subject categories",
+ "description": "subject category description"}],
+ "object_categories": [
+ {"name": "test object categories", "description": "object category description"},
+ {"name": "other test object categories",
+ "description": "object category description"}],
+ "action_categories": [
+ {"name": "test action categories", "description": "action category description"},
+ {"name": "other test action categories",
+ "description": "action category description"}],
+ "meta_rules": [
+ {
+ "name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]
+ },
+ {
+ "name": "other good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "other test subject categories"}],
+ "object_categories": [{"name": "other test object categories"}],
+ "action_categories": [{"name": "other test action categories"}]
+ }]}
+
+SUBJECT_DATA = [{"subject_data": [
+ {"name": "not valid subject data", "description": "", "policies": [{}], "category": {}}]},
+ {"subject_data": [
+ {"name": "not valid subject data", "description": "", "policies": [{}],
+ "category": {"name": "test subject categories"}}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "subject_data": [
+ {"name": "one valid subject data", "description": "description",
+ "policies": [{}], "category": {"name": "test subject categories"}}]},
+ {"subject_data": [{"name": "valid subject data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test subject categories"}}]},
+ {"subject_data": [{"name": "valid subject data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test subject categories"}}]}]
+
+OBJECT_DATA = [{"object_data": [
+ {"name": "not valid object data", "description": "", "policies": [{}], "category": {}}]},
+ {"object_data": [
+ {"name": "not valid object data", "description": "", "policies": [{}],
+ "category": {"name": "test object categories"}}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "object_data": [
+ {"name": "one valid object data", "description": "description", "policies": [{}],
+ "category": {"name": "test object categories"}}]},
+ {"object_data": [{"name": "valid object data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test object categories"}}]},
+ {"object_data": [{"name": "valid object data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test object categories"}}]}]
+
+ACTION_DATA = [{"action_data": [
+ {"name": "not valid action data", "description": "", "policies": [{}], "category": {}}]},
+ {"action_data": [
+ {"name": "not valid action data", "description": "", "policies": [{}],
+ "category": {"name": "test action categories"}}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "action_data": [
+ {"name": "one valid action data", "description": "description", "policies": [{}],
+ "category": {"name": "test action categories"}}]},
+ {"action_data": [{"name": "valid action data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test action categories"}}]},
+ {"action_data": [{"name": "valid action data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test action categories"}}]}]
+
+PRE_META_RULES = {"subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories",
+ "description": "object category description"}],
+ "action_categories": [{"name": "test action categories",
+ "description": "object action description"}]}
+
+META_RULES = [{"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "not valid category"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}]},
+ {"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "not valid category"}],
+ "action_categories": [{"name": "test action categories"}]}]},
+ {"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "not valid category"}]}]},
+ {"meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}]}]
+
+PRE_ASSIGNMENTS = {"models": [
+ {"name": "test model", "description": "", "meta_rules": [{"name": "good meta rule"}]}],
+ "policies": [
+ {"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}],
+ "subject_categories": [{"name": "test subject categories",
+ "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories",
+ "description": "object category description"}],
+ "action_categories": [{"name": "test action categories",
+ "description": "object action description"}],
+ "subjects": [{"name": "testuser", "description": "description of the subject",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object", "description": "description of the object",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action", "description": "description of the action",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}],
+ "subject_data": [{"name": "subject data", "description": "test subject data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test subject categories"}}],
+ "object_data": [{"name": "object data", "description": "test object data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test object categories"}}],
+ "action_data": [{"name": "action data", "description": "test action data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test action categories"}}]}
+
+SUBJECT_ASSIGNMENTS = [
+ {"subject_assignments": [
+ {"subject": {"name": "unknown"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": None
+ }]
+
+OBJECT_ASSIGNMENTS = [
+ {"object_assignments": [
+ {"object": {"name": "unknown"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": None
+ }]
+
+ACTION_ASSIGNMENTS = [
+ {"action_assignments": [
+ {"action": {"name": "unknown"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": None
+ }]
+
+RULES = [{"rules": [{"meta_rule": {"name": "unknown meta rule"}, "policy": {"name": "test "
+ "policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}], "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "unknown "
+ "policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "unknown subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "unknown object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "unknown action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]}]
+
+
+def test_import_models_without_new_meta_rules():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ import_export_helper.clean_all()
+ counter = 0
+ for models_description in MODEL_WITHOUT_META_RULES:
+ data = import_to_cache.import_json(body=models_description)
+ assert "models" in data
+ models = _cache.models
+ assert len(list(models.keys())) == 1
+ values = list(models.values())
+ assert values[0]["name"] == "test model"
+ if counter == 0:
+ assert len(values[0]["description"]) == 0
+ if counter == 1 or counter == 2:
+ assert values[0]["description"] == "new description"
+ counter = counter + 1
+ import_export_helper.clean_all()
+
+
+def test_import_policies():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ counter = -1
+ for policy_description in POLICIES:
+ counter = counter + 1
+ if counter == 2:
+ with pytest.raises(exceptions.UnknownName):
+ import_to_cache.import_json(body=policy_description)
+ continue
+ else:
+ data = import_to_cache.import_json(body=policy_description)
+ assert "policies" in data
+ if counter == 2:
+ assert "models" in data
+
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ policies = _cache.policies
+ assert len(list(policies.keys())) == 1
+ values = list(policies.values())
+ assert values[0]["name"] == "test policy"
+ if counter < 3:
+ assert values[0]["genre"] == "authz"
+ assert values[0]["description"] == "description"
+ else:
+ assert values[0]["genre"] == "not authz ?"
+ assert values[0]["description"] == "changes taken into account"
+ assert len(values[0]["model_id"]) > 0
+
+
+def test_import_subject_object_action():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECTS
+ clean_method = import_export_helper.clean_subjects
+ name = "testuser"
+ key_extra = "email"
+ value_extra = "new-email@test.com"
+ elif type_element == "object":
+ elements = OBJECTS
+ clean_method = import_export_helper.clean_objects
+ name = "test object"
+ key_extra = "test"
+ value_extra = "test extra"
+ else:
+ elements = ACTIONS
+ clean_method = import_export_helper.clean_actions
+ name = "test action"
+ key_extra = "test"
+ value_extra = "test extra"
+
+ for element in elements:
+ counter = counter + 1
+ if counter == 2 or counter == 4:
+ clean_method()
+ if counter == 3:
+ clean_method()
+ data = import_to_cache.import_json(body=element)
+ elif counter < 2:
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ import_to_cache.import_json(body=element)
+ assert '400: Policy Unknown' == str(exception_info.value)
+ continue
+ else:
+ data = import_to_cache.import_json(body=element)
+ assert data
+
+ if counter != 3:
+ assert type_element+"s" in data
+ assert "policies" in data
+
+ get_elements = getattr(_cache, type_element + "s")
+
+ policy_key = list(get_elements.keys())[0]
+ assert len(list(get_elements[policy_key].keys())) == 1
+ values = list(get_elements[policy_key].values())
+ assert values[0]["name"] == name
+ if counter == 2 or counter == 4:
+ assert values[0]["description"] == "description of the " + type_element
+ if counter == 3:
+ assert values[0]["description"] == "new description of the " + type_element
+ assert values[0]["extra"][key_extra] == value_extra
+
+ assert len(values[0]["policy_list"]) == 1
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action_categories():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECT_CATEGORIES
+ elif type_element == "object":
+ elements = OBJECT_CATEGORIES
+ else:
+ elements = ACTION_CATEGORIES
+
+ for element in elements:
+ data = import_to_cache.import_json(body=element)
+ counter = counter + 1
+ assert type_element + "_categories" in data
+ get_elements = getattr(_cache, type_element + "_categories")
+ assert len(list(get_elements.keys())) == 1
+ values = list(get_elements.values())
+ assert values[0]["name"] == "test " + type_element + " categories"
+ assert values[0]["description"] == type_element + " category description"
+
+
+def test_import_meta_rules():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ import_export_helper.clean_all()
+ # import some categories
+ data = import_to_cache.import_json(body=PRE_META_RULES)
+ for cat in ['subject_categories', 'object_categories', 'action_categories']:
+ assert cat in data
+
+ counter = -1
+ for meta_rule in META_RULES:
+ counter = counter + 1
+ if counter != 3:
+ with pytest.raises(exceptions.UnknownName) as exception_info:
+ import_to_cache.import_json(body=meta_rule)
+ assert '400: Unknown Name.' == str(exception_info.value)
+ continue
+ else:
+ data = import_to_cache.import_json(body=meta_rule)
+ assert "meta_rules" in data
+ assert _cache.meta_rules
+
+ meta_rules = _cache.meta_rules
+ key = list(meta_rules.keys())[0]
+ assert isinstance(meta_rules, dict)
+ assert meta_rules[key]["name"] == "good meta rule"
+ assert meta_rules[key]["description"] == "valid meta rule"
+ assert len(meta_rules[key]["subject_categories"]) == 1
+ assert len(meta_rules[key]["object_categories"]) == 1
+ assert len(meta_rules[key]["action_categories"]) == 1
+
+ subject_category_key = meta_rules[key]["subject_categories"][0]
+ object_category_key = meta_rules[key]["object_categories"][0]
+ action_category_key = meta_rules[key]["action_categories"][0]
+
+ sub_cat = _cache.subject_categories
+ assert sub_cat[subject_category_key]["name"] == "test subject categories"
+
+ ob_cat = _cache.object_categories
+ assert ob_cat[object_category_key]["name"] == "test object categories"
+
+ ac_cat = _cache.action_categories
+ assert ac_cat[action_category_key]["name"] == "test action categories"
+
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action_assignments():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ import_export_helper.clean_all()
+
+ data = import_to_cache.import_json(body=PRE_ASSIGNMENTS)
+ for item in PRE_ASSIGNMENTS.keys():
+ assert item in data
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ counter = -1
+ if type_element == "subject":
+ datas = SUBJECT_ASSIGNMENTS
+ elif type_element == "object":
+ datas = OBJECT_ASSIGNMENTS
+ else:
+ datas = ACTION_ASSIGNMENTS
+
+ for assignments in datas:
+ counter = counter + 1
+ my_exception = assignments.pop("exception")
+ if my_exception:
+ with pytest.raises(my_exception) as exception_info:
+ import_to_cache.import_json(body=assignments)
+ assert '400:' in str(exception_info.value)
+ else:
+ data = import_to_cache.import_json(body=assignments)
+ assert type_element+"_assignments" in data
+ assert getattr(_cache, type_element+"_assignments")
+
+ assert len(getattr(_cache, type_element+"_assignments")) == 1
+
+
+def test_import_rules():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ import_export_helper.clean_all()
+
+ data = import_to_cache.import_json(body=PRE_ASSIGNMENTS)
+ for item in PRE_ASSIGNMENTS.keys():
+ assert item in data
+
+ counter = -1
+ for rule in RULES:
+ counter = counter + 1
+ if counter < 5:
+ with pytest.raises(exceptions.UnknownName) as exception_info:
+ import_to_cache.import_json(body=rule)
+
+ assert '400: Unknown Name.' == str(exception_info.value)
+ continue
+ data = import_to_cache.import_json(body=rule)
+ assert "rules" in data
+ policies = _cache.policies
+ policy_id = None
+ for policy in policies:
+ if policies[policy]['name'] == rule['rules'][0]['policy']['name']:
+ policy_id = policy
+ break
+
+ assert policy_id
+ rules = _cache.rules
+ assert len(rules) == 1
+ rule_content = list(rules.values())[0]
+ assert policy_id == rule_content["policy_id"]
+ assert rule_content["rules"]
+ assert len(rule_content["rules"]) == 1
+ assert rule_content["rules"][0]["enabled"]
+ assert rule_content["rules"][0]["instructions"][0]["decision"] == "grant"
+
+ meta_rules = _cache.meta_rules
+ assert meta_rules[list(meta_rules.keys())[0]]["name"] == "good meta rule"
+
+
+def test_import_subject_object_action_data():
+ from moon_utilities import json_utils
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_to_cache = json_utils.JsonImport(driver_name="cache", driver=_cache)
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ data = import_to_cache.import_json(body=PRE_DATA)
+ for key in PRE_DATA.keys():
+ assert key in data
+ counter = -1
+ if type_element == "subject":
+ elements = SUBJECT_DATA
+ get_method = _cache.subject_data
+ get_categories = _cache.subject_categories
+ elif type_element == "object":
+ elements = OBJECT_DATA
+ get_method = _cache.object_data
+ get_categories = _cache.object_categories
+ else:
+ elements = ACTION_DATA
+ get_method = _cache.action_data
+ get_categories = _cache.action_categories
+
+ for element in elements:
+ counter = counter + 1
+ if counter == 0 or counter == 1:
+ with pytest.raises(exceptions.MissingIdOrName) as exception_info:
+ import_to_cache.import_json(body=element)
+ assert '400: Missing ID or Name.' == str(exception_info.value)
+ continue
+ else:
+ data = import_to_cache.import_json(body=element)
+ for key in element.keys():
+ assert key in data
+
+ policies = _cache.policies
+ categories = get_categories
+ case_tested = False
+ for policy_key in policies.keys():
+ policy = policies[policy_key]
+ for category_key in categories:
+ get_elements = get_method
+ _all_data = []
+ for _data in get_elements:
+ if category_key == _data["category_id"] and policy_key == _data["policy_id"]:
+ _all_data.append(_data)
+ get_elements = _all_data
+ if not get_elements:
+ continue
+ if policy["name"] == "test policy":
+ assert len(get_elements) == 1
+ el = get_elements[0]
+ assert isinstance(el["data"], dict)
+ if counter == 2:
+ assert len(el["data"].keys()) == 1
+ el = el["data"][list(el["data"].keys())[0]]
+ if "value" in el:
+ el = el["value"]
+ assert el["name"] == "one valid " + type_element + " data"
+ if counter == 3:
+ assert len(el["data"].keys()) == 2
+ el1 = el["data"][list(el["data"].keys())[0]]
+ el2 = el["data"][list(el["data"].keys())[1]]
+ if "value" in el1:
+ el1 = el1["value"]
+ el2 = el2["value"]
+ assert (el1["name"] == "one valid " + type_element + " data" and el2[
+ "name"] == "valid " + type_element + " data") or (el2[
+ "name"] == "one valid " + type_element + " data" and
+ el1[
+ "name"] == "valid " + type_element + " data")
+ assert el1["description"] == "description"
+ assert el2["description"] == "description"
+
+ case_tested = True
+
+ if policy["name"] == "test other policy":
+ if counter == 4:
+ assert len(get_elements) == 1
+ el = get_elements[0]
+ assert isinstance(el["data"], dict)
+ assert len(el["data"].keys()) == 1
+ el = el["data"][list(el["data"].keys())[0]]
+ if "value" in el:
+ el = el["value"]
+ assert el["name"] == "valid " + type_element + " data"
+ assert el["description"] == "new description"
+ case_tested = True
+
+ assert case_tested is True
+
+
+def test_clean():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ import_export_helper.clean_all()
+ assert not _cache.subject_categories
+ assert not _cache.object_categories
+ assert not _cache.action_categories
+ assert not _cache.subjects
+ assert not _cache.objects
+ assert not _cache.actions
+ assert not _cache.subject_data
+ assert not _cache.object_data
+ assert not _cache.action_data
+ assert not _cache.subject_assignments
+ assert not _cache.object_assignments
+ assert not _cache.action_assignments
+ assert not _cache.models
+ assert not _cache.pdp
+ assert not _cache.policies
diff --git a/moon_utilities/tests/unit_python/api/test_import_to_db.py b/moon_utilities/tests/unit_python/api/test_import_to_db.py
new file mode 100644
index 00000000..34479b8c
--- /dev/null
+++ b/moon_utilities/tests/unit_python/api/test_import_to_db.py
@@ -0,0 +1,772 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import pytest
+from moon_utilities import exceptions
+import helpers.import_export_db_helper as import_export_helper
+
+
+MODEL_WITHOUT_META_RULES = [
+ {"models": [{"name": "test model", "description": "", "meta_rules": []}]},
+ {"models": [{"name": "test model", "description": "new description", "meta_rules": [],
+ "override": True}]},
+ {"models": [{"name": "test model", "description": "description not taken into account",
+ "meta_rules": [], "override": False}]}
+]
+
+POLICIES = [
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}]},
+ {"policies": [{"name": "test policy", "genre": "authz",
+ "description": "new description not taken into account",
+ "model": {"name": "test model"}, "mandatory": True}]},
+ {"policies": [
+ {"name": "test policy", "genre": "not authz ?", "description": "generates an exception",
+ "model": {"name": "test model"}, "override": True}]},
+ {"models": [{"name": "test model", "description": "", "meta_rules": []}], "policies": [
+ {"name": "test policy", "genre": "not authz ?", "description": "changes taken into account",
+ "model": {"name": "test model"}, "override": True}]},
+]
+
+SUBJECTS = [
+ {"subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {}, "mandatory": True}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": []}]},
+ {"subjects": [{"name": "testuser", "description": "new description of the subject",
+ "extra": {"email": "new-email@test.com"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "subjects": [
+ {"name": "testuser", "description": "description of the subject", "extra": {},
+ "policies": [{"name": "test policy"}]}]}]
+
+OBJECTS = [
+ {"objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": True}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": []}]},
+ {"objects": [{"name": "test object", "description": "new description of the object",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {},
+ "policies": [{"name": "test policy"}]}]},
+]
+
+ACTIONS = [{"actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {}, "mandatory": True}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": []}]},
+ {"actions": [{"name": "test action", "description": "new description of the action",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description", "model": {},
+ "mandatory": False}], "actions": [
+ {"name": "test action", "description": "description of the action", "extra": {},
+ "policies": [{"name": "test policy"}]}]}]
+
+SUBJECT_CATEGORIES = [{"subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"}]},
+ {"subject_categories": [{"name": "test subject categories",
+ "description": "new subject category description"}]}]
+
+OBJECT_CATEGORIES = [{"object_categories": [
+ {"name": "test object categories", "description": "object category description"}]},
+ {"object_categories": [{"name": "test object categories",
+ "description": "new object category description"}]}]
+
+ACTION_CATEGORIES = [{"action_categories": [
+ {"name": "test action categories", "description": "action category description"}]},
+ {"action_categories": [{"name": "test action categories",
+ "description": "new action category description"}]}]
+
+# meta_rules import is needed otherwise the search for data do not work !!!
+PRE_DATA = {"models": [{"name": "test model", "description": "",
+ "meta_rules": [{"name": "good meta rule"},
+ {"name": "other good meta rule"}]}],
+ "policies": [
+ {"name": "test other policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}],
+ "subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"},
+ {"name": "other test subject categories",
+ "description": "subject category description"}],
+ "object_categories": [
+ {"name": "test object categories", "description": "object category description"},
+ {"name": "other test object categories",
+ "description": "object category description"}],
+ "action_categories": [
+ {"name": "test action categories", "description": "action category description"},
+ {"name": "other test action categories",
+ "description": "action category description"}],
+ "meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]},
+ {"name": "other good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "other test subject categories"}],
+ "object_categories": [{"name": "other test object categories"}],
+ "action_categories": [{"name": "other test action categories"}]}]}
+
+SUBJECT_DATA = [{"subject_data": [
+ {"name": "not valid subject data", "description": "", "policies": [{}], "category": {}}]},
+ {"subject_data": [
+ {"name": "not valid subject data", "description": "", "policies": [{}],
+ "category": {"name": "test subject categories"}}]},
+ {"policies": [
+ {"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "subject_data": [
+ {"name": "one valid subject data", "description": "description",
+ "policies": [{}], "category": {"name": "test subject categories"}}]},
+ {"subject_data": [{"name": "valid subject data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test subject categories"}}]},
+ {"subject_data": [{"name": "valid subject data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test subject categories"}}]}]
+
+OBJECT_DATA = [{"object_data": [
+ {"name": "not valid object data", "description": "", "policies": [{}], "category": {}}]},
+ {"object_data": [
+ {"name": "not valid object data", "description": "", "policies": [{}],
+ "category": {"name": "test object categories"}}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "object_data": [
+ {"name": "one valid object data", "description": "description", "policies": [{}],
+ "category": {"name": "test object categories"}}]},
+ {"object_data": [{"name": "valid object data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test object categories"}}]},
+ {"object_data": [{"name": "valid object data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test object categories"}}]}]
+
+ACTION_DATA = [{"action_data": [
+ {"name": "not valid action data", "description": "", "policies": [{}], "category": {}}]},
+ {"action_data": [
+ {"name": "not valid action data", "description": "", "policies": [{}],
+ "category": {"name": "test action categories"}}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}], "action_data": [
+ {"name": "one valid action data", "description": "description", "policies": [{}],
+ "category": {"name": "test action categories"}}]},
+ {"action_data": [{"name": "valid action data", "description": "description",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test action categories"}}]},
+ {"action_data": [{"name": "valid action data", "description": "new description",
+ "policies": [{"name": "test other policy"}],
+ "category": {"name": "test action categories"}}]}]
+
+PRE_META_RULES = {"subject_categories": [
+ {"name": "test subject categories", "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories",
+ "description": "object category description"}],
+ "action_categories": [{"name": "test action categories",
+ "description": "object action description"}]}
+
+META_RULES = [{"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "not valid category"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}]},
+ {"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "not valid category"}],
+ "action_categories": [{"name": "test action categories"}]}]},
+ {"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "not valid category"}]}]},
+ {"meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}]}]
+
+PRE_ASSIGNMENTS = {"models": [
+ {"name": "test model", "description": "", "meta_rules": [{"name": "good meta rule"}]}],
+ "policies": [
+ {"name": "test policy", "genre": "authz", "description": "description",
+ "model": {"name": "test model"}, "mandatory": True}],
+ "subject_categories": [{"name": "test subject categories",
+ "description": "subject category description"}],
+ "object_categories": [{"name": "test object categories",
+ "description": "object category description"}],
+ "action_categories": [{"name": "test action categories",
+ "description": "object action description"}],
+ "subjects": [{"name": "testuser", "description": "description of the subject",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object", "description": "description of the object",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action", "description": "description of the action",
+ "extra": {}, "policies": [{"name": "test policy"}]}],
+ "meta_rules": [{"name": "good meta rule", "description": "valid meta rule",
+ "subject_categories": [{"name": "test subject categories"}],
+ "object_categories": [{"name": "test object categories"}],
+ "action_categories": [{"name": "test action categories"}]}],
+ "subject_data": [{"name": "subject data", "description": "test subject data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test subject categories"}}],
+ "object_data": [{"name": "object data", "description": "test object data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test object categories"}}],
+ "action_data": [{"name": "action data", "description": "test action data",
+ "policies": [{"name": "test policy"}],
+ "category": {"name": "test action categories"}}]}
+
+SUBJECT_ASSIGNMENTS = [
+ {"subject_assignments": [
+ {"subject": {"name": "unknown"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"subject_assignments": [
+ {"subject": {"name": "testuser"},
+ "category": {"name": "test subject categories"},
+ "assignments": [{"name": "subject data"}]}],
+ "exception": None
+ }]
+
+OBJECT_ASSIGNMENTS = [
+ {"object_assignments": [
+ {"object": {"name": "unknown"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"object_assignments": [
+ {"object": {"name": "test object"},
+ "category": {"name": "test object categories"},
+ "assignments": [{"name": "object data"}]}],
+ "exception": None
+ }]
+
+ACTION_ASSIGNMENTS = [
+ {"action_assignments": [
+ {"action": {"name": "unknown"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "unknown"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": exceptions.UnknownName
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "unknown"}]}],
+ "exception": exceptions.InvalidJson
+ },
+ {"action_assignments": [
+ {"action": {"name": "test action"},
+ "category": {"name": "test action categories"},
+ "assignments": [{"name": "action data"}]}],
+ "exception": None
+ }]
+
+RULES = [{"rules": [{"meta_rule": {"name": "unknown meta rule"}, "policy": {"name": "test "
+ "policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}], "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "unknown "
+ "policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "unknown subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "unknown object data"}],
+ "action_data": [{"name": "action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "unknown action data"}]}}]},
+ {"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"},
+ "instructions": ({"decision": "grant"},), "enabled": True, "rule": {
+ "subject_data": [{"name": "subject data"}],
+ "object_data": [{"name": "object data"}],
+ "action_data": [{"name": "action data"}]}}]}]
+
+
+def test_import_models_without_new_meta_rules():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ import_export_helper.clean_all()
+ counter = 0
+ for models_description in MODEL_WITHOUT_META_RULES:
+ data = import_to_db.import_json(body=models_description)
+ assert "models" in data
+ models = _cache.get_models()
+ assert len(list(models.keys())) == 1
+ values = list(models.values())
+ assert values[0]["name"] == "test model"
+ if counter == 0:
+ assert len(values[0]["description"]) == 0
+ if counter == 1 or counter == 2:
+ assert values[0]["description"] == "new description"
+ counter = counter + 1
+ import_export_helper.clean_all()
+
+
+def test_import_policies():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ counter = -1
+ for policy_description in POLICIES:
+ counter = counter + 1
+ if counter == 2:
+ with pytest.raises(exceptions.UnknownName):
+ import_to_db.import_json(body=policy_description)
+ continue
+ else:
+ data = import_to_db.import_json(body=policy_description)
+ assert "policies" in data
+ if counter == 2:
+ assert "models" in data
+
+ policies = db_driver.PolicyManager.get_policies(moon_user_id="admin")
+ assert len(list(policies.keys())) == 1
+ values = list(policies.values())
+ assert values[0]["name"] == "test policy"
+ if counter < 3:
+ assert values[0]["genre"] == "authz"
+ assert values[0]["description"] == "description"
+ else:
+ assert values[0]["genre"] == "not authz ?"
+ assert values[0]["description"] == "changes taken into account"
+ assert len(values[0]["model_id"]) > 0
+
+
+def test_import_subject_object_action():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECTS
+ clean_method = import_export_helper.clean_subjects
+ name = "testuser"
+ key_extra = "email"
+ value_extra = "new-email@test.com"
+ elif type_element == "object":
+ elements = OBJECTS
+ clean_method = import_export_helper.clean_objects
+ name = "test object"
+ key_extra = "test"
+ value_extra = "test extra"
+ else:
+ elements = ACTIONS
+ clean_method = import_export_helper.clean_actions
+ name = "test action"
+ key_extra = "test"
+ value_extra = "test extra"
+
+ for element in elements:
+ counter = counter + 1
+ if counter == 2 or counter == 4:
+ clean_method()
+ if counter == 3:
+ clean_method()
+ data = import_to_db.import_json(body=element)
+ elif counter < 2:
+ with pytest.raises(exceptions.PolicyUnknown) as exception_info:
+ import_to_db.import_json(body=element)
+ assert '400: Policy Unknown' == str(exception_info.value)
+ continue
+ else:
+ data = import_to_db.import_json(body=element)
+ assert data
+
+ if counter != 3:
+ assert type_element+"s" in data
+ assert "policies" in data
+
+ get_elements = getattr(_cache, type_element + "s")
+
+ assert len(list(get_elements.keys())) == 1
+ values = list(get_elements.values())
+ assert values[0]["name"] == name
+ if counter == 2 or counter == 4:
+ assert values[0]["description"] == "description of the " + type_element
+ if counter == 3:
+ assert values[0]["description"] == "new description of the " + type_element
+ assert values[0]["extra"][key_extra] == value_extra
+
+ assert len(values[0]["policy_list"]) == 1
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action_categories():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ counter = -1
+ # set the getters and the comparison values
+ if type_element == "subject":
+ elements = SUBJECT_CATEGORIES
+ elif type_element == "object":
+ elements = OBJECT_CATEGORIES
+ else:
+ elements = ACTION_CATEGORIES
+
+ for element in elements:
+ data = import_to_db.import_json(body=element)
+ counter = counter + 1
+ assert type_element + "_categories" in data
+ get_elements = getattr(_cache, type_element + "_categories")
+ assert len(list(get_elements.keys())) == 1
+ values = list(get_elements.values())
+ assert values[0]["name"] == "test " + type_element + " categories"
+ assert values[0]["description"] == type_element + " category description"
+
+
+def test_import_meta_rules():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ import_export_helper.clean_all()
+ # import some categories
+ data = import_to_db.import_json(body=PRE_META_RULES)
+ for cat in ['subject_categories', 'object_categories', 'action_categories']:
+ assert cat in data
+
+ counter = -1
+ for meta_rule in META_RULES:
+ counter = counter + 1
+ if counter != 3:
+ with pytest.raises(exceptions.UnknownName) as exception_info:
+ import_to_db.import_json(body=meta_rule)
+ assert '400: Unknown Name.' == str(exception_info.value)
+ continue
+ else:
+ data = import_to_db.import_json(body=meta_rule)
+ assert "meta_rules" in data
+ assert _cache.meta_rules
+
+ meta_rules = _cache.meta_rules
+ key = list(meta_rules.keys())[0]
+ assert isinstance(meta_rules, dict)
+ assert meta_rules[key]["name"] == "good meta rule"
+ assert meta_rules[key]["description"] == "valid meta rule"
+ assert len(meta_rules[key]["subject_categories"]) == 1
+ assert len(meta_rules[key]["object_categories"]) == 1
+ assert len(meta_rules[key]["action_categories"]) == 1
+
+ subject_category_key = meta_rules[key]["subject_categories"][0]
+ object_category_key = meta_rules[key]["object_categories"][0]
+ action_category_key = meta_rules[key]["action_categories"][0]
+
+ sub_cat = _cache.subject_categories
+ assert sub_cat[subject_category_key]["name"] == "test subject categories"
+
+ ob_cat = _cache.object_categories
+ assert ob_cat[object_category_key]["name"] == "test object categories"
+
+ ac_cat = _cache.action_categories
+ assert ac_cat[action_category_key]["name"] == "test action categories"
+
+ import_export_helper.clean_all()
+
+
+def test_import_subject_object_action_assignments():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ import_export_helper.clean_all()
+
+ data = import_to_db.import_json(body=PRE_ASSIGNMENTS)
+ for item in PRE_ASSIGNMENTS.keys():
+ assert item in data
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ counter = -1
+ if type_element == "subject":
+ datas = SUBJECT_ASSIGNMENTS
+ elif type_element == "object":
+ datas = OBJECT_ASSIGNMENTS
+ else:
+ datas = ACTION_ASSIGNMENTS
+
+ for assignments in datas:
+ counter = counter + 1
+ my_exception = assignments.pop("exception")
+ if my_exception:
+ with pytest.raises(my_exception) as exception_info:
+ import_to_db.import_json(body=assignments)
+ assert '400:' in str(exception_info.value)
+ else:
+ data = import_to_db.import_json(body=assignments)
+ assert type_element+"_assignments" in data
+ assert getattr(_cache, type_element+"_assignments")
+
+ assert len(getattr(_cache, type_element+"_assignments")) == 1
+
+
+def test_import_rules():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ import_export_helper.clean_all()
+
+ data = import_to_db.import_json(body=PRE_ASSIGNMENTS)
+ for item in PRE_ASSIGNMENTS.keys():
+ assert item in data
+
+ counter = -1
+ for rule in RULES:
+ counter = counter + 1
+ if counter < 5:
+ with pytest.raises(exceptions.UnknownName) as exception_info:
+ import_to_db.import_json(body=rule)
+
+ assert '400: Unknown Name.' == str(exception_info.value)
+ continue
+ data = import_to_db.import_json(body=rule)
+ assert "rules" in data
+ policies = _cache.policies
+ policy_id = None
+ for policy in policies:
+ if policies[policy]['name'] == rule['rules'][0]['policy']['name']:
+ policy_id = policy
+ break
+
+ assert policy_id
+ rules = []
+ for _rule in _cache.rules:
+ if policy_id == _rule['policy_id']:
+ rules.append(_rule)
+ assert len(rules) == 1
+ rule_content = rules[0]
+ assert policy_id == rule_content["policy_id"]
+ assert rule_content["rules"]
+ assert len(rule_content["rules"]) == 1
+ # FIXME: this is different from cache tests (where we have a "value" attribute)
+ assert rule_content["rules"][0]["enabled"]
+ assert rule_content["rules"][0]["instructions"][0]["decision"] == "grant"
+
+ meta_rules = _cache.meta_rules
+ assert meta_rules[list(meta_rules.keys())[0]]["name"] == "good meta rule"
+
+
+def test_import_subject_object_action_data():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+
+ type_elements = ["subject", "object", "action"]
+
+ for type_element in type_elements:
+ import_export_helper.clean_all()
+ data = import_to_db.import_json(body=PRE_DATA)
+ for key in PRE_DATA.keys():
+ assert key in data
+ counter = -1
+ if type_element == "subject":
+ elements = SUBJECT_DATA
+ get_method = _cache.get_subject_data
+ get_categories = _cache.subject_categories
+ elif type_element == "object":
+ elements = OBJECT_DATA
+ get_method = _cache.get_object_data
+ get_categories = _cache.object_categories
+ else:
+ elements = ACTION_DATA
+ get_method = _cache.get_action_data
+ get_categories = _cache.action_categories
+
+ for element in elements:
+ counter = counter + 1
+ if counter == 0 or counter == 1:
+ with pytest.raises(exceptions.MissingIdOrName) as exception_info:
+ import_to_db.import_json(body=element)
+ assert '400: Missing ID or Name.' == str(exception_info.value)
+ continue
+ else:
+ data = import_to_db.import_json(body=element)
+ for key in element.keys():
+ assert key in data
+
+ policies = _cache.policies
+ categories = get_categories
+ case_tested = False
+ for policy_key in policies.keys():
+ policy = policies[policy_key]
+ for category_key in categories:
+ get_elements = get_method(policy_id=policy_key, category_id=category_key)
+ _all_data = []
+ for _data in get_elements:
+ if category_key == _data["category_id"] and \
+ policy_key == _data["policy_id"]:
+ _all_data.append(_data)
+ get_elements = _all_data
+ if not get_elements:
+ continue
+ if policy["name"] == "test policy":
+ assert len(get_elements) == 1
+ el = get_elements[0]
+ assert isinstance(el["data"], dict)
+ if counter == 2:
+ assert len(el["data"].keys()) == 1
+ el = el["data"][list(el["data"].keys())[0]]
+ if "value" in el:
+ el = el["value"]
+ assert el["name"] == "one valid " + type_element + " data"
+ if counter == 3:
+ assert len(el["data"].keys()) == 2
+ el1 = el["data"][list(el["data"].keys())[0]]
+ el2 = el["data"][list(el["data"].keys())[1]]
+ if "value" in el1:
+ el1 = el1["value"]
+ el2 = el2["value"]
+ assert (el1["name"] == "one valid " + type_element + " data" and
+ el2["name"] == "valid " + type_element + " data") or \
+ (el2["name"] == "one valid " + type_element + " data" and
+ el1["name"] == "valid " + type_element + " data")
+ assert el1["description"] == "description"
+ assert el2["description"] == "description"
+
+ case_tested = True
+ break
+
+ if policy["name"] == "test other policy":
+ if counter == 4:
+ assert len(get_elements) == 1
+ el = get_elements[0]
+ assert isinstance(el["data"], dict)
+ assert len(el["data"].keys()) == 1
+ el = el["data"][list(el["data"].keys())[0]]
+ if "value" in el:
+ el = el["value"]
+ assert el["name"] == "valid " + type_element + " data"
+ assert el["description"] == "new description"
+ case_tested = True
+ break
+
+ assert case_tested is True
+
+
+def test_clean():
+ from moon_utilities import json_utils
+ from moon_manager import db_driver
+ import_to_db = json_utils.JsonImport(driver_name="db", driver=db_driver)
+ _cache = import_to_db.driver
+ import_export_helper.clean_all()
+ assert not _cache.subject_categories
+ assert not _cache.object_categories
+ assert not _cache.action_categories
+ assert not _cache.subjects
+ assert not _cache.objects
+ assert not _cache.actions
+ assert not _cache.subject_data
+ assert not _cache.object_data
+ assert not _cache.action_data
+ assert not _cache.subject_assignments
+ assert not _cache.object_assignments
+ assert not _cache.action_assignments
+ assert not _cache.models
+ assert not _cache.pdp
+ assert not _cache.policies
diff --git a/moon_utilities/tests/unit_python/api/test_invalidate_function.py b/moon_utilities/tests/unit_python/api/test_invalidate_function.py
new file mode 100644
index 00000000..ed0357dc
--- /dev/null
+++ b/moon_utilities/tests/unit_python/api/test_invalidate_function.py
@@ -0,0 +1,64 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import moon_utilities.invalided_functions
+
+
+def test_invalidate_assignment_in_slaves(slaves):
+ result = moon_utilities.invalided_functions.invalidate_assignment_in_slaves(
+ slaves, "098764321", "098764321", "098764321", "098764321", 'subject')
+ assert result
+ assert "slave_test" in list(result)
+
+
+def test_invalidate_data_in_slaves(slaves):
+ result = moon_utilities.invalided_functions.invalidate_data_in_slaves(
+ slaves, "__policy_id__", "__category_id__", "098764321", "subject")
+ assert result
+ assert "slave_test" in list(result)
+
+
+def test_invalidate_perimeter_in_slaves(slaves):
+ result = moon_utilities.invalided_functions.invalidate_perimeter_in_slaves(
+ slaves, "098764321", "098764321", "subject", is_delete=False)
+ assert result
+ assert "slave_test" in list(result)
+
+
+def test_invalidate_pdp_in_slaves(slaves):
+ result = moon_utilities.invalided_functions.invalidate_pdp_in_slaves(
+ slaves, "098764321", is_delete=False)
+ assert result
+ assert "slave_test" in list(result)
+
+
+def test_invalidate_policy_in_slaves(slaves):
+ result = moon_utilities.invalided_functions.invalidate_policy_in_slaves(
+ slaves, "098764321", is_delete=False)
+ assert result
+ assert "slave_test" in list(result)
+
+
+def test_invalidate_rules_in_slaves():
+ pass
+
+
+def test_invalidate_model_in_slaves():
+ pass
+
+
+def test_invalidate_meta_data_in_slaves():
+ pass
+
+
+def test_invalidate_meta_rule_in_slaves():
+ pass
diff --git a/moon_utilities/tests/unit_python/api/test_security_functions.py b/moon_utilities/tests/unit_python/api/test_security_functions.py
new file mode 100644
index 00000000..469a70a2
--- /dev/null
+++ b/moon_utilities/tests/unit_python/api/test_security_functions.py
@@ -0,0 +1,18 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+from moon_utilities.security_functions import enforce
+
+
+def test_enforce():
+ # TODO: implement the test
+ assert True
diff --git a/moon_utilities/tests/unit_python/conftest.py b/moon_utilities/tests/unit_python/conftest.py
new file mode 100644
index 00000000..da55d3ff
--- /dev/null
+++ b/moon_utilities/tests/unit_python/conftest.py
@@ -0,0 +1,172 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import mock_slaves
+import os
+import pytest
+import requests_mock
+import yaml
+
+
+__CONF = """
+debug: true
+
+database:
+ url: sqlite:////tmp/database_test.db
+ driver: moon_manager.plugins.sql
+ migration_dir: moon_manager.api.db.migrations
+
+dashboard:
+ root: ../dashboard/www/
+
+management:
+ url: http://127.0.0.1:8000
+ user: admin
+ password: admin
+ token_file: db.json
+
+orchestration:
+ driver: moon_manager.plugins.pyorchestrator
+ connection: local
+ port: 10000...10100
+ config_dir: /tmp
+
+information:
+ openstack:
+ driver: moon_manager.plugins.moon_openstack_plugin
+ url: http://keystone:5000/v3
+ user: admin
+ password: p4ssw0rd
+ domain: default
+ project: admin
+ check_token: false
+ certificate: false
+ global_attrs:
+ driver: moon_manager.plugins.global_attrs
+ attributes:
+ mode:
+ values:
+ - build
+ - run
+ default: build
+ url: file:/etc/moon/mode
+ #url: https://127.0.0.1:8080/mode
+ #url: mysql+pymysql://moon:p4sswOrd1@db/moon_mode
+ #url: sqlite:////tmp/database.db
+ #url: driver://moon_manager.plugins.my_plugin
+
+plugins:
+ directory: /var/moon/plugins
+
+components:
+ manager:
+ port: 8080
+ bind: 0.0.0.0
+ hostname: manager
+
+logging:
+ version: 1
+
+ formatters:
+ brief:
+ format: "%(levelname)s %(name)s %(message)-30s"
+ custom:
+ format: "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+
+ handlers:
+ console:
+ class : logging.StreamHandler
+ formatter: custom
+ level : INFO
+ stream : ext://sys.stdout
+ file:
+ class : logging.handlers.RotatingFileHandler
+ formatter: custom
+ level : DEBUG
+ filename: /tmp/moon.log
+ maxBytes: 1048576
+ backupCount: 3
+
+ loggers:
+ moon:
+ level: DEBUG
+ handlers: [console, file]
+ propagate: no
+
+ root:
+ level: ERROR
+ handlers: [console]
+"""
+
+
+@pytest.fixture
+def slaves():
+ return {
+ "slaves": {
+ "d464cc58a0cd46dea3191ba70f4e7df8": {
+ "name": "slave_test",
+ "address": "",
+ "description": "...",
+ "extra": {
+ "description": "...",
+ "starttime": 1543851265.76279,
+ "port": 10000,
+ "server_ip": "127.0.0.1",
+ "status": "up",
+ "api_key": "e58a882a6b658a22660f00a0c273e7f6b4c4eb5abe54eccba2cae307905d67e374"
+ "6537bd790c41887e11840c2d186b6d6eeec0e426bcfa7a872cc3417a35124a"
+ }
+ }
+ }
+ }
+
+
+@pytest.fixture(autouse=True)
+def no_requests(monkeypatch):
+ """ Modify the response from Requests module
+ """
+ with requests_mock.Mocker(real_http=True) as m:
+ try:
+ os.remove("/tmp/database_test.db")
+ except FileNotFoundError:
+ pass
+ try:
+ os.remove("/tmp/moon.pwd")
+ except FileNotFoundError:
+ pass
+ print("Configure...")
+ from moon_manager.api.configuration import init_database, set_configuration
+ set_configuration(yaml.safe_load(__CONF))
+ print("Create a new user")
+ from moon_utilities.auth_functions import add_user, init_db, get_api_key_for_user
+ init_db()
+ # try:
+ # user = add_user("admin", "admin")
+ # manager_api_key = user["api_key"]
+ # except KeyError:
+ # print("User already exists")
+ # manager_api_key = get_api_key_for_user("admin")
+ print("Initialize the database")
+ init_database()
+ from moon_manager import db_driver
+ db_driver.init()
+
+ mock_slaves.register_slaves(m)
+
+ print("End registering URI")
+
+ # from moon_manager.pip_driver import InformationManager
+ # InformationManager.set_auth()
+
+ yield m
+
+ # InformationManager.unset_auth()
diff --git a/moon_utilities/tests/unit_python/helpers/__init__.py b/moon_utilities/tests/unit_python/helpers/__init__.py
new file mode 100644
index 00000000..2a5459c2
--- /dev/null
+++ b/moon_utilities/tests/unit_python/helpers/__init__.py
@@ -0,0 +1,13 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
diff --git a/moon_utilities/tests/unit_python/helpers/import_export_cache_helper.py b/moon_utilities/tests/unit_python/helpers/import_export_cache_helper.py
new file mode 100644
index 00000000..ff22abe2
--- /dev/null
+++ b/moon_utilities/tests/unit_python/helpers/import_export_cache_helper.py
@@ -0,0 +1,234 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.manager.test.api." + __name__)
+
+
+def clean_models():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ keys = list(_cache.models.keys())
+ for key in keys:
+ _cache.delete_model(key)
+
+
+def clean_policies():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ keys = list(_cache.policies.keys())
+ for key in keys:
+ _cache.delete_policy(key)
+
+
+def clean_subjects():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ policy_keys = list(_cache.policies.keys())
+ subjects = _cache.subjects
+ for policy_key in policy_keys:
+ for key in subjects:
+ try:
+ _cache.delete_subject(policy_key, key)
+ except AttributeError:
+ pass
+ _cache.delete_subject()
+
+
+def clean_objects():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ policy_keys = list(_cache.policies.keys())
+ objects = _cache.objects
+ for policy_key in policy_keys:
+ for key in objects:
+ try:
+ _cache.delete_object(policy_key, key)
+ except AttributeError:
+ pass
+ _cache.delete_object()
+
+
+def clean_actions():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ policy_keys = list(_cache.policies.keys())
+ actions = _cache.actions
+ for policy_key in policy_keys:
+ for key in actions:
+ try:
+ _cache.delete_action(policy_key, key)
+ except AttributeError:
+ pass
+ _cache.delete_action()
+
+
+def clean_subject_categories():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ categories = list(_cache.subject_categories.keys())
+ for key in categories:
+ _cache.delete_subject_category(key)
+
+
+def clean_object_categories():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ categories = list(_cache.object_categories.keys())
+ for key in categories:
+ _cache.delete_object_category(key)
+
+
+def clean_action_categories():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ categories = list(_cache.action_categories.keys())
+ for key in categories:
+ _cache.delete_action_category(key)
+
+
+def clean_subject_data():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ _cache.delete_subject_data()
+
+
+def clean_object_data():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ _cache.delete_object_data()
+
+
+def clean_action_data():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+ _cache.delete_action_data()
+
+
+def clean_meta_rule():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ categories = list(_cache.meta_rules.keys())
+ for key in categories:
+ _cache.delete_meta_rule(key)
+
+
+def clean_subject_assignments():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ if not _cache.subject_assignments:
+ return
+ for policy_key in _cache.policies.keys():
+ if policy_key not in _cache.subject_assignments:
+ continue
+ for key in _cache.subject_assignments[policy_key]:
+ # policy_key = _cache.subject_assignments[policy_key][key]["policy_id"]
+ subject_key = _cache.subject_assignments[policy_key][key]["subject_id"]
+ cat_key = _cache.subject_assignments[policy_key][key]["category_id"]
+ data_keys = _cache.subject_assignments[policy_key][key]["assignments"]
+ for data_key in data_keys:
+ _cache.delete_subject_assignment(
+ policy_id=policy_key,
+ perimeter_id=subject_key,
+ category_id=cat_key,
+ data_id=data_key
+ )
+ _cache.delete_subject_assignment()
+
+
+def clean_object_assignments():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ if not _cache.object_assignments:
+ return
+ for policy_key in _cache.policies.keys():
+ if policy_key not in _cache.object_assignments:
+ continue
+ for key in _cache.object_assignments[policy_key]:
+ # policy_key = _cache.object_assignments[policy_key][key]["policy_id"]
+ object_key = _cache.object_assignments[policy_key][key]["object_id"]
+ cat_key = _cache.object_assignments[policy_key][key]["category_id"]
+ data_keys = _cache.object_assignments[policy_key][key]["assignments"]
+ for data_key in data_keys:
+ _cache.delete_object_assignment(
+ policy_id=policy_key,
+ perimeter_id=object_key,
+ category_id=cat_key,
+ data_id=data_key
+ )
+ _cache.delete_object_assignment()
+
+
+def clean_action_assignments():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ if not _cache.action_assignments:
+ return
+ for policy_key in _cache.policies.keys():
+ if policy_key not in _cache.action_assignments:
+ continue
+ for key in _cache.action_assignments[policy_key]:
+ action_key = _cache.action_assignments[policy_key][key]["action_id"]
+ cat_key = _cache.action_assignments[policy_key][key]["category_id"]
+ data_keys = _cache.action_assignments[policy_key][key]["assignments"]
+ for data_key in data_keys:
+ _cache.delete_action_assignment(
+ policy_id=policy_key,
+ perimeter_id=action_key,
+ category_id=cat_key,
+ data_id=data_key
+ )
+ _cache.delete_action_assignment()
+
+
+def clean_rules():
+ from moon_cache.cache import Cache
+ _cache = Cache.getInstance()
+
+ rules = list(_cache.rules.keys())
+ for key in rules:
+ _cache.delete_rule(key)
+
+
+def clean_all():
+ clean_rules()
+
+ clean_subject_assignments()
+ clean_object_assignments()
+ clean_action_assignments()
+
+ clean_subject_data()
+ clean_object_data()
+ clean_action_data()
+
+ clean_actions()
+ clean_objects()
+ clean_subjects()
+
+ clean_policies()
+ clean_models()
+ clean_meta_rule()
+
+ clean_subject_categories()
+ clean_object_categories()
+ clean_action_categories()
diff --git a/moon_utilities/tests/unit_python/helpers/import_export_db_helper.py b/moon_utilities/tests/unit_python/helpers/import_export_db_helper.py
new file mode 100644
index 00000000..ecb9fa26
--- /dev/null
+++ b/moon_utilities/tests/unit_python/helpers/import_export_db_helper.py
@@ -0,0 +1,178 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+import logging
+
+logger = logging.getLogger("moon.manager.test.api." + __name__)
+
+
+def clean_models():
+ from moon_manager import db_driver as driver
+ keys = driver.ModelManager.get_models(moon_user_id="admin")
+ for key in keys:
+ driver.ModelManager.delete_model(moon_user_id="admin", model_id=key)
+
+
+def clean_policies():
+ from moon_manager import db_driver as driver
+ keys = driver.PolicyManager.get_policies(moon_user_id="admin")
+ for key in keys:
+ driver.PolicyManager.delete_policy(moon_user_id="admin", policy_id=key)
+
+
+def clean_subjects():
+ from moon_manager import db_driver as driver
+ for policy in driver.PolicyManager.get_policies(moon_user_id="admin"):
+ subjects = driver.PolicyManager.get_subjects(moon_user_id="admin", policy_id=policy)
+ for key in subjects:
+ driver.PolicyManager.delete_subject(moon_user_id="admin", policy_id=policy,
+ perimeter_id=key)
+
+
+def clean_objects():
+ from moon_manager import db_driver as driver
+ for policy in driver.PolicyManager.get_policies(moon_user_id="admin"):
+ objects = driver.PolicyManager.get_objects(moon_user_id="admin", policy_id=policy)
+ for key in objects:
+ driver.PolicyManager.delete_object(moon_user_id="admin", policy_id=policy,
+ perimeter_id=key)
+
+
+def clean_actions():
+ from moon_manager import db_driver as driver
+ for policy in driver.PolicyManager.get_policies(moon_user_id="admin"):
+ actions = driver.PolicyManager.get_actions(moon_user_id="admin", policy_id=policy)
+ for key in actions:
+ driver.PolicyManager.delete_action(moon_user_id="admin", policy_id=policy,
+ perimeter_id=key)
+
+
+def clean_subject_categories():
+ from moon_manager import db_driver as driver
+ categories = driver.ModelManager.get_subject_categories(moon_user_id="admin")
+
+ for key in categories:
+ driver.ModelManager.delete_subject_category(moon_user_id="admin", category_id=key)
+
+
+def clean_object_categories():
+ from moon_manager import db_driver as driver
+ categories = driver.ModelManager.get_object_categories(moon_user_id="admin")
+
+ for key in categories:
+ driver.ModelManager.delete_object_category(moon_user_id="admin", category_id=key)
+
+
+def clean_action_categories():
+ from moon_manager import db_driver as driver
+ categories = driver.ModelManager.get_action_categories(moon_user_id="admin")
+
+ for key in categories:
+ driver.ModelManager.delete_action_category(moon_user_id="admin", category_id=key)
+
+
+def clean_subject_data():
+ from moon_manager import db_driver as driver
+ policies = driver.PolicyManager.get_policies(moon_user_id="admin")
+ categories = driver.ModelManager.get_subject_categories(moon_user_id="admin")
+ for policy in policies:
+ for category in categories:
+ data_object = driver.PolicyManager.get_subject_data(
+ moon_user_id="admin", policy_id=policy, category_id=category)
+ for data_item in data_object:
+ for data in data_item.get("data", {}):
+ driver.PolicyManager.delete_subject_data(moon_user_id="admin", policy_id=policy,
+ category_id=category, data_id=data)
+
+
+def clean_object_data():
+ from moon_manager import db_driver as driver
+ policies = driver.PolicyManager.get_policies(moon_user_id="admin")
+ categories = driver.ModelManager.get_object_categories(moon_user_id="admin")
+ for policy in policies:
+ for category in categories:
+ data_object = driver.PolicyManager.get_object_data(
+ moon_user_id="admin", policy_id=policy, category_id=category)
+ for data_item in data_object:
+ for data in data_item.get("data", {}):
+ driver.PolicyManager.delete_object_data(moon_user_id="admin", policy_id=policy,
+ category_id=category, data_id=data)
+
+
+def clean_action_data():
+ from moon_manager import db_driver as driver
+ policies = driver.PolicyManager.get_policies(moon_user_id="admin")
+ categories = driver.ModelManager.get_action_categories(moon_user_id="admin")
+ for policy in policies:
+ for category in categories:
+ data_object = driver.PolicyManager.get_action_data(
+ moon_user_id="admin", policy_id=policy, category_id=category)
+ for data_item in data_object:
+ for data in data_item.get("data", {}):
+ driver.PolicyManager.delete_action_data(moon_user_id="admin", policy_id=policy,
+ category_id=category, data_id=data)
+
+
+def clean_meta_rule():
+ from moon_manager import db_driver as driver
+ keys = driver.ModelManager.get_meta_rules(moon_user_id="admin")
+
+ for key in keys:
+ driver.ModelManager.delete_meta_rule(moon_user_id="admin", meta_rule_id=key)
+
+
+def clean_subject_assignments():
+ pass
+
+
+def clean_object_assignments():
+ pass
+
+
+def clean_action_assignments():
+ pass
+
+
+def clean_rules():
+ from moon_manager import db_driver as driver
+
+ policies = driver.PolicyManager.get_policies(moon_user_id="admin")
+
+ for policy in policies:
+ rules = driver.PolicyManager.get_rules(moon_user_id="admin", policy_id=policy)
+
+ for rule in rules:
+ driver.PolicyManager.delete_rule(moon_user_id="admin", policy_id=policy, rule_id=rule)
+
+
+def clean_all():
+ clean_rules()
+
+ clean_subject_assignments()
+ clean_object_assignments()
+ clean_action_assignments()
+
+ clean_subject_data()
+ clean_object_data()
+ clean_action_data()
+
+ clean_actions()
+ clean_objects()
+ clean_subjects()
+
+ clean_policies()
+ clean_models()
+ clean_meta_rule()
+
+ clean_subject_categories()
+ clean_object_categories()
+ clean_action_categories()
diff --git a/moon_utilities/tests/unit_python/helpers/slaves_helpers.py b/moon_utilities/tests/unit_python/helpers/slaves_helpers.py
new file mode 100644
index 00000000..1b2764d2
--- /dev/null
+++ b/moon_utilities/tests/unit_python/helpers/slaves_helpers.py
@@ -0,0 +1,32 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+SLAVES = {
+ "slaves": {
+ "d464cc58a0cd46dea3191ba70f4e7df8": {
+ "name": "slave_test",
+ "address": "",
+ "description": "...",
+ "extra": {
+ "description": "...",
+ "starttime": 1543851265.76279,
+ "port": 10000,
+ "server_ip": "127.0.0.1",
+ "status": "down",
+ "api_key": "e58a882a6b658a22660f00a0c273e7f6b4c4eb5abe54eccba2cae307905d67e3746537"
+ "bd790c41887e11840c2d186b6d6eeec0e426bcfa7a872cc3417a35124a"
+ }
+ }
+ }
+}
+
diff --git a/moon_utilities/tests/unit_python/mock_slaves.py b/moon_utilities/tests/unit_python/mock_slaves.py
new file mode 100644
index 00000000..f3ac04d8
--- /dev/null
+++ b/moon_utilities/tests/unit_python/mock_slaves.py
@@ -0,0 +1,50 @@
+# Software Name: MOON
+
+# Version: 5.4
+
+# SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This software is distributed under the 'Apache License 2.0',
+# the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+# or see the "LICENSE" file for more details.
+
+
+
+def register_slaves(m):
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:10000/update/assignment/098764321/subject/098764321/098764321/098764321',
+ json={}
+ )
+ m.register_uri(
+ 'DELETE', 'http://127.0.0.1:10000/update/data/098764321/subject',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/perimeter/098764321/098764321/subject',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/pdp/098764321',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/policy/098764321',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/rules/1234567890',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/model/1234567890',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/meta_data/1234567890',
+ json={}
+ )
+ m.register_uri(
+ 'PUT', 'http://127.0.0.1:10000/update/meta_rule/1234567890',
+ json={}
+ )
diff --git a/moon_utilities/tests/unit_python/requirements.txt b/moon_utilities/tests/unit_python/requirements.txt
new file mode 100644
index 00000000..91cbc2c0
--- /dev/null
+++ b/moon_utilities/tests/unit_python/requirements.txt
@@ -0,0 +1,10 @@
+pytest
+pbr
+pytest-cov
+cliff
+requests_mock
+tinydb
+moon_manager
+moon_cache
+sqlalchemy
+pymysql \ No newline at end of file
diff --git a/moon_wrapper/Dockerfile b/moon_wrapper/Dockerfile
deleted file mode 100644
index 77ffaee9..00000000
--- a/moon_wrapper/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM python:3
-
-ADD . /root
-WORKDIR /root/
-RUN pip3 install -r requirements.txt
-RUN pip3 install .
-
-CMD ["python3", "-m", "moon_wrapper"]
diff --git a/external_policy_checker/Changelog b/old/external_policy_checker/Changelog
index cd4ffb7e..cd4ffb7e 100644
--- a/external_policy_checker/Changelog
+++ b/old/external_policy_checker/Changelog
diff --git a/external_policy_checker/Dockerfile b/old/external_policy_checker/Dockerfile
index ed013935..ed013935 100644
--- a/external_policy_checker/Dockerfile
+++ b/old/external_policy_checker/Dockerfile
diff --git a/external_policy_checker/README.md b/old/external_policy_checker/README.md
index ac44af0e..ac44af0e 100644
--- a/external_policy_checker/README.md
+++ b/old/external_policy_checker/README.md
diff --git a/external_policy_checker/conf/templates/cinder.policy.json b/old/external_policy_checker/conf/templates/cinder.policy.json
index 7716e00b..7716e00b 100644
--- a/external_policy_checker/conf/templates/cinder.policy.json
+++ b/old/external_policy_checker/conf/templates/cinder.policy.json
diff --git a/external_policy_checker/conf/templates/glance.policy.json b/old/external_policy_checker/conf/templates/glance.policy.json
index ec79d381..ec79d381 100644
--- a/external_policy_checker/conf/templates/glance.policy.json
+++ b/old/external_policy_checker/conf/templates/glance.policy.json
diff --git a/external_policy_checker/conf/templates/keystone.policy.json b/old/external_policy_checker/conf/templates/keystone.policy.json
index 7fc967d5..7fc967d5 100644
--- a/external_policy_checker/conf/templates/keystone.policy.json
+++ b/old/external_policy_checker/conf/templates/keystone.policy.json
diff --git a/external_policy_checker/conf/templates/neutron.policy.json b/old/external_policy_checker/conf/templates/neutron.policy.json
index d0ab0b63..d0ab0b63 100644
--- a/external_policy_checker/conf/templates/neutron.policy.json
+++ b/old/external_policy_checker/conf/templates/neutron.policy.json
diff --git a/external_policy_checker/conf/templates/nova.policy.json b/old/external_policy_checker/conf/templates/nova.policy.json
index e5de675f..e5de675f 100644
--- a/external_policy_checker/conf/templates/nova.policy.json
+++ b/old/external_policy_checker/conf/templates/nova.policy.json
diff --git a/external_policy_checker/external_policy_checker/__init__.py b/old/external_policy_checker/external_policy_checker/__init__.py
index a4e2017f..a4e2017f 100644
--- a/external_policy_checker/external_policy_checker/__init__.py
+++ b/old/external_policy_checker/external_policy_checker/__init__.py
diff --git a/external_policy_checker/external_policy_checker/__main__.py b/old/external_policy_checker/external_policy_checker/__main__.py
index 4499a96b..4499a96b 100644
--- a/external_policy_checker/external_policy_checker/__main__.py
+++ b/old/external_policy_checker/external_policy_checker/__main__.py
diff --git a/external_policy_checker/external_policy_checker/conf_installer.py b/old/external_policy_checker/external_policy_checker/conf_installer.py
index ec45003b..ec45003b 100644
--- a/external_policy_checker/external_policy_checker/conf_installer.py
+++ b/old/external_policy_checker/external_policy_checker/conf_installer.py
diff --git a/external_policy_checker/external_policy_checker/server.py b/old/external_policy_checker/external_policy_checker/server.py
index cbb4a933..cbb4a933 100644
--- a/external_policy_checker/external_policy_checker/server.py
+++ b/old/external_policy_checker/external_policy_checker/server.py
diff --git a/external_policy_checker/requirements.txt b/old/external_policy_checker/requirements.txt
index 8ab6294c..8ab6294c 100644
--- a/external_policy_checker/requirements.txt
+++ b/old/external_policy_checker/requirements.txt
diff --git a/external_policy_checker/setup.cfg b/old/external_policy_checker/setup.cfg
index 7c2b2874..7c2b2874 100644
--- a/external_policy_checker/setup.cfg
+++ b/old/external_policy_checker/setup.cfg
diff --git a/external_policy_checker/setup.py b/old/external_policy_checker/setup.py
index acd994a6..acd994a6 100644
--- a/external_policy_checker/setup.py
+++ b/old/external_policy_checker/setup.py
diff --git a/moon_authz/Changelog b/old/moon_authz/Changelog
index 59d7f8e4..ae1ec4d1 100644
--- a/moon_authz/Changelog
+++ b/old/moon_authz/Changelog
@@ -28,3 +28,12 @@ CHANGES
- use the threading capability of Flask app
- set the number of manager to 1
- update to the latest version of the python-moondb library
+
+4.3.4
+-----
+- apply PyLint rules
+- fix a bug in instructions management
+
+4.4.0
+-----
+- add the update API
diff --git a/old/moon_authz/Dockerfile b/old/moon_authz/Dockerfile
new file mode 100644
index 00000000..7081e31c
--- /dev/null
+++ b/old/moon_authz/Dockerfile
@@ -0,0 +1,15 @@
+FROM python:3
+
+LABEL Name=Authz_plugin
+LABEL Description="Authz plugin for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+USER root
+
+ADD . /root
+WORKDIR /root/
+RUN pip3 install --no-cache-dir -r requirements.txt
+RUN pip3 install --no-cache-dir .
+
+CMD ["python3", "-m", "moon_authz"] \ No newline at end of file
diff --git a/moon_wrapper/LICENSE b/old/moon_authz/LICENSE
index d6456956..d6456956 100644
--- a/moon_wrapper/LICENSE
+++ b/old/moon_authz/LICENSE
diff --git a/moon_authz/MANIFEST.in b/old/moon_authz/MANIFEST.in
index 1f674d50..1f674d50 100644
--- a/moon_authz/MANIFEST.in
+++ b/old/moon_authz/MANIFEST.in
diff --git a/moon_authz/README.md b/old/moon_authz/README.md
index 696c29a1..696c29a1 100644
--- a/moon_authz/README.md
+++ b/old/moon_authz/README.md
diff --git a/moon_wrapper/moon_wrapper/__init__.py b/old/moon_authz/moon_authz/__init__.py
index 98a98146..85c245e0 100644
--- a/moon_wrapper/moon_wrapper/__init__.py
+++ b/old/moon_authz/moon_authz/__init__.py
@@ -3,4 +3,4 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-__version__ = "4.5.1"
+__version__ = "4.4.0"
diff --git a/moon_authz/moon_authz/__main__.py b/old/moon_authz/moon_authz/__main__.py
index 2693f687..6f1f9807 100644
--- a/moon_authz/moon_authz/__main__.py
+++ b/old/moon_authz/moon_authz/__main__.py
@@ -1,4 +1,4 @@
from moon_authz.server import create_server
-server = create_server()
-server.run()
+SERVER = create_server()
+SERVER.run()
diff --git a/moon_interface/tests/unit_python/api/__init__.py b/old/moon_authz/moon_authz/api/__init__.py
index e69de29b..e69de29b 100644
--- a/moon_interface/tests/unit_python/api/__init__.py
+++ b/old/moon_authz/moon_authz/api/__init__.py
diff --git a/moon_authz/moon_authz/api/authorization.py b/old/moon_authz/moon_authz/api/authorization.py
index 84114466..59af295d 100644
--- a/moon_authz/moon_authz/api/authorization.py
+++ b/old/moon_authz/moon_authz/api/authorization.py
@@ -11,7 +11,7 @@ from flask import request
from flask_restful import Resource
from python_moonutilities import exceptions
-logger = logging.getLogger("moon.authz.api." + __name__)
+LOGGER = logging.getLogger("moon.authz.api." + __name__)
class Authz(Resource):
@@ -67,19 +67,23 @@ class Authz(Resource):
self.context = pickle.loads(request.data)
self.context.set_cache(self.cache)
self.context.increment_index()
- self.run()
+ self.context.update_target()
+ # FIXME (asteroide): force the update but we should not do that
+ # a better way is to build the bilateral link between Master and Slaves
+ self.cache.update()
+ if not self.run():
+ raise exceptions.MoonError("Error in the request status={}".format(
+ self.context.current_state))
self.context.delete_cache()
response = flask.make_response(pickle.dumps(self.context))
response.headers['content-type'] = 'application/octet-stream'
return response
def run(self):
- logger.debug("self.context.pdp_set={}".format(self.context.pdp_set))
result, message = self.__check_rules()
if result:
return self.__exec_instructions(result)
- else:
- self.context.current_state = "deny"
+ self.context.current_state = "deny"
# self.__exec_next_state(result)
return
@@ -105,6 +109,9 @@ class Authz(Resource):
raise exceptions.PdpContentError
for category in category_list:
scope = list(current_pdp['target'][category])
+ if not scope:
+ LOGGER.warning("Scope in category {} is empty".format(category))
+ raise exceptions.AuthzException
scopes_list.append(scope)
# policy_id = self.cache.get_policy_from_meta_rules("admin", current_header_id)
if self.context.current_policy_id not in self.cache.rules:
@@ -114,58 +121,59 @@ class Authz(Resource):
for item in itertools.product(*scopes_list):
req = list(item)
for rule in self.cache.rules[self.context.current_policy_id]["rules"]:
- logger.info("rule={}".format(rule))
if req == rule['rule']:
return rule['instructions'], ""
- logger.warning("No rule match the request...")
+ LOGGER.warning("No rule match the request...")
return False, "No rule match the request..."
def __update_subject_category_in_policy(self, operation, target):
result = False
- try:
- policy_name, category_name, data_name = target.split(":")
- except ValueError:
- logger.error("Cannot understand value in instruction ({})".format(target))
- return False
- # pdp_set = self.payload["authz_context"]['pdp_set']
- for meta_rule_id in self.context.pdp_set:
- if meta_rule_id == "effect":
- continue
- if self.context.pdp_set[meta_rule_id]["meta_rules"]["name"] == policy_name:
- for category_id, category_value in self.cache.subject_categories.items():
- if category_value["name"] == "role":
- subject_category_id = category_id
- break
- else:
- logger.error("Cannot understand category in instruction ({})".format(target))
- return False
- subject_data_id = None
- for data in PolicyManager.get_subject_data("admin", policy_id, category_id=subject_category_id):
- for data_id, data_value in data['data'].items():
- if data_value["name"] == data_name:
- subject_data_id = data_id
- break
- if subject_data_id:
- break
- else:
- logger.error("Cannot understand data in instruction ({})".format(target))
- return False
- if operation == "add":
- self.payload["authz_context"]['pdp_set'][meta_rule_id]['target'][subject_category_id].append(
- subject_data_id)
- elif operation == "delete":
- try:
- self.payload["authz_context"]['pdp_set'][meta_rule_id]['target'][subject_category_id].remove(
- subject_data_id)
- except ValueError:
- logger.warning("Cannot remove role {} from target".format(data_name))
- result = True
- break
+ # try:
+ # policy_name, category_name, data_name = target.split(":")
+ # except ValueError:
+ # LOGGER.error("Cannot understand value in instruction ({})".format(target))
+ # return False
+ # # pdp_set = self.payload["authz_context"]['pdp_set']
+ # for meta_rule_id in self.context.pdp_set:
+ # if meta_rule_id == "effect":
+ # continue
+ # if self.context.pdp_set[meta_rule_id]["meta_rules"]["name"] == policy_name:
+ # for category_id, category_value in self.cache.subject_categories.items():
+ # if category_value["name"] == "role":
+ # subject_category_id = category_id
+ # break
+ # else:
+ # LOGGER.error("Cannot understand category in instruction ({})".format(target))
+ # return False
+ # subject_data_id = None
+ # for data in PolicyManager.get_subject_data("admin", policy_id,
+ # category_id=subject_category_id):
+ # for data_id, data_value in data['data'].items():
+ # if data_value["name"] == data_name:
+ # subject_data_id = data_id
+ # break
+ # if subject_data_id:
+ # break
+ # else:
+ # LOGGER.error("Cannot understand data in instruction ({})".format(target))
+ # return False
+ # if operation == "add":
+ # self.payload["authz_context"]['pdp_set'][meta_rule_id]['target'][
+ # subject_category_id].append(subject_data_id)
+ # elif operation == "delete":
+ # try:
+ # self.payload["authz_context"]['pdp_set'][meta_rule_id]['target'][
+ # subject_category_id].remove(subject_data_id)
+ # except ValueError:
+ # LOGGER.warning("Cannot remove role {} from target".format(data_name))
+ # result = True
+ # break
return result
def __update_container_chaining(self):
for index in range(len(self.payload["authz_context"]['headers'])):
- self.payload["container_chaining"][index]["meta_rule_id"] = self.payload["authz_context"]['headers'][index]
+ self.payload["container_chaining"][index]["meta_rule_id"] = \
+ self.payload["authz_context"]['headers'][index]
def __get_container_from_meta_rule(self, meta_rule_id):
for index in range(len(self.payload["authz_context"]['headers'])):
@@ -200,9 +208,10 @@ class Authz(Resource):
# if self.payload["authz_context"]['pdp_set'][next_meta_rule]['effect'] == "unset":
# return notify(
# request_id=self.payload["authz_context"]["request_id"],
- # container_id=self.__get_container_from_meta_rule(next_meta_rule)['container_id'],
- # payload=self.payload)
- # # next will be delegation if current is deny and session is passed or deny and delegation is unset
+ # container_id=self.__get_container_from_meta_rule(next_meta_rule)[
+ # 'container_id'],payload=self.payload)
+ # # next will be delegation if current is deny and session is passed or deny and
+ # delegation is unset
# else:
# LOG.error("Delegation is not developed!")
#
@@ -215,8 +224,8 @@ class Authz(Resource):
# if self.payload["authz_context"]['pdp_set'][current_meta_rule]['effect'] == "passed":
# return notify(
# request_id=self.payload["authz_context"]["request_id"],
- # container_id=self.__get_container_from_meta_rule(next_meta_rule)['container_id'],
- # payload=self.payload)
+ # container_id=self.__get_container_from_meta_rule(next_meta_rule)[
+ # 'container_id'],payload=self.payload)
# # next will be None if current is grant and the request is sent to router
# else:
# return self.__return_to_router()
@@ -235,16 +244,19 @@ class Authz(Resource):
# args=self.payload["authz_context"])
def __exec_instructions(self, instructions):
+ if type(instructions) is dict:
+ instructions = [instructions, ]
+ if type(instructions) not in (list, tuple):
+ raise exceptions.RuleContentError("Bad instructions format")
for instruction in instructions:
for key in instruction:
if key == "decision":
if instruction["decision"] == "grant":
self.context.current_state = "grant"
- logger.info("__exec_instructions True {}".format(
- self.context.current_state))
+ LOGGER.info("__exec_instructions True %s" % self.context.current_state)
return True
- else:
- self.context.current_state = instruction["decision"].lower()
+
+ self.context.current_state = instruction["decision"].lower()
elif key == "chain":
result = self.__update_headers(**instruction["chain"])
if not result:
@@ -257,7 +269,7 @@ class Authz(Resource):
self.context.current_state = "deny"
else:
self.context.current_state = "passed"
- logger.info("__exec_instructions False {}".format(self.context.current_state))
+ LOGGER.info("__exec_instructions False %s" % self.context.current_state)
# def __update_current_request(self):
# index = self.payload["authz_context"]["index"]
@@ -266,7 +278,8 @@ class Authz(Resource):
# current_policy_id = PolicyManager.get_policy_from_meta_rules("admin", current_header_id)
# previous_policy_id = PolicyManager.get_policy_from_meta_rules("admin", previous_header_id)
# # FIXME (asteroide): must change those lines to be ubiquitous against any type of policy
- # if self.payload["authz_context"]['pdp_set'][current_header_id]['meta_rules']['name'] == "session":
+ # if self.payload["authz_context"]['pdp_set'][current_header_id]['meta_rules'][
+ # 'name'] == "session":
# subject = self.payload["authz_context"]['current_request'].get("subject")
# subject_category_id = None
# role_names = []
@@ -277,17 +290,20 @@ class Authz(Resource):
# for assignment_id, assignment_value in PolicyManager.get_subject_assignments(
# "admin", previous_policy_id, subject, subject_category_id).items():
# for data_id in assignment_value["assignments"]:
- # data = PolicyManager.get_subject_data("admin", previous_policy_id, data_id, subject_category_id)
+ # data = PolicyManager.get_subject_data(
+ # "admin", previous_policy_id, data_id, subject_category_id)
# for _data in data:
# for key, value in _data["data"].items():
# role_names.append(value["name"])
# new_role_ids = []
- # for perimeter_id, perimeter_value in PolicyManager.get_objects("admin", current_policy_id).items():
+ # for perimeter_id, perimeter_value in PolicyManager.get_objects(
+ # "admin", current_policy_id).items():
# if perimeter_value["name"] in role_names:
# new_role_ids.append(perimeter_id)
# break
# perimeter_id = None
- # for perimeter_id, perimeter_value in PolicyManager.get_actions("admin", current_policy_id).items():
+ # for perimeter_id, perimeter_value in PolicyManager.get_actions(
+ # "admin", current_policy_id).items():
# if perimeter_value["name"] == "*":
# break
#
@@ -353,8 +369,9 @@ class Authz(Resource):
# else:
# self.payload["authz_context"]["index"] += 1
# self.__update_current_request()
- result, message = self.__check_rules(self.payload["authz_context"])
- current_header_id = self.payload["authz_context"]['headers'][self.payload["authz_context"]['index']]
+ result, message = self.__check_rules()
+ current_header_id = self.payload["authz_context"]['headers'][
+ self.payload["authz_context"]['index']]
if result:
self.__exec_instructions(result)
else:
@@ -366,15 +383,15 @@ class Authz(Resource):
"args": self.payload}
except Exception as e:
try:
- logger.error(self.payload["authz_context"])
+ LOGGER.error(self.payload["authz_context"])
except KeyError:
- logger.error("Cannot find \"authz_context\" in context")
- logger.error(e, exc_info=True)
+ LOGGER.error("Cannot find \"authz_context\" in context")
+ LOGGER.error(e, exc_info=True)
return {"authz": False,
"error": str(e),
"pdp_id": self.pdp_id,
"args": self.payload}
def head(self, uuid=None, subject_name=None, object_name=None, action_name=None):
- logger.info("HEAD request")
+ LOGGER.info("HEAD request")
return "", 200
diff --git a/old/moon_authz/moon_authz/api/update.py b/old/moon_authz/moon_authz/api/update.py
new file mode 100644
index 00000000..68b7f0ce
--- /dev/null
+++ b/old/moon_authz/moon_authz/api/update.py
@@ -0,0 +1,42 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Authz is the endpoint to get authorization response
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+
+__version__ = "4.4.0"
+
+LOGGER = logging.getLogger("moon.authz.api." + __name__)
+
+
+class Update(Resource):
+ """
+ Endpoint for update requests
+ """
+
+ __urls__ = (
+ "/update",
+ )
+
+ def __init__(self, **kwargs):
+ self.CACHE = kwargs.get("cache")
+ self.INTERFACE_NAME = kwargs.get("interface_name", "interface")
+ self.MANAGER_URL = kwargs.get("manager_url", "http://manager:8080")
+ self.TIMEOUT = 5
+
+ def put(self):
+ try:
+ self.CACHE.update_assignments(
+ request.form.get("policy_id", None),
+ request.form.get("perimeter_id", None),
+ )
+ except Exception as e:
+ LOGGER.exception(e)
+ return {"result": False, "reason": str(e)}
+ return {"result": True}
diff --git a/moon_authz/moon_authz/http_server.py b/old/moon_authz/moon_authz/http_server.py
index 7d3b1ec3..86d8a914 100644
--- a/moon_authz/moon_authz/http_server.py
+++ b/old/moon_authz/moon_authz/http_server.py
@@ -3,15 +3,16 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+import logging
from flask import Flask
from flask_restful import Resource, Api
-import logging
from moon_authz import __version__
from moon_authz.api.authorization import Authz
+from moon_authz.api.update import Update
from python_moonutilities.cache import Cache
from python_moonutilities import exceptions
-logger = logging.getLogger("moon.authz.http_server")
+LOGGER = logging.getLogger("moon.authz.http_server")
CACHE = Cache()
CACHE.update()
@@ -62,15 +63,15 @@ class Server:
__API__ = (
- Authz,
- )
+ Authz, Update
+)
class Root(Resource):
"""
The root of the web service
"""
- __urls__ = ("/", )
+ __urls__ = ("/",)
__methods = ("get", "post", "put", "delete", "options")
def get(self):
@@ -97,7 +98,7 @@ class HTTPServer(Server):
def __init__(self, host="localhost", port=38001, **kwargs):
super(HTTPServer, self).__init__(host=host, port=port, **kwargs)
self.component_data = kwargs.get("component_data", {})
- logger.info("HTTPServer port={} {}".format(port, kwargs))
+ LOGGER.info("HTTPServer port={} {}".format(port, kwargs))
self.app = Flask(__name__)
self._port = port
self._host = host
@@ -106,6 +107,7 @@ class HTTPServer(Server):
self.container_chaining = kwargs.get("container_chaining")
self.api = Api(self.app)
self.__set_route()
+
# self.__hook_errors()
@self.app.errorhandler(exceptions.AuthException)
@@ -116,10 +118,12 @@ class HTTPServer(Server):
# FIXME (dthom): it doesn't work
def get_404_json(e):
return {"error": "Error", "code": 404, "description": e}
+
self.app.register_error_handler(404, get_404_json)
def get_400_json(e):
return {"error": "Error", "code": 400, "description": e}
+
self.app.register_error_handler(400, lambda e: get_400_json)
self.app.register_error_handler(403, exceptions.AuthException)
diff --git a/moon_authz/moon_authz/server.py b/old/moon_authz/moon_authz/server.py
index 0cc5f6fc..d1b5a59b 100644
--- a/moon_authz/moon_authz/server.py
+++ b/old/moon_authz/moon_authz/server.py
@@ -8,7 +8,7 @@ import logging
from moon_authz.http_server import HTTPServer as Server
from python_moonutilities import configuration, exceptions
-logger = logging.getLogger("moon.authz.server")
+LOGGER = logging.getLogger("moon.authz.server")
def create_server():
@@ -20,7 +20,7 @@ def create_server():
pdp_id = os.getenv("PDP_ID")
meta_rule_id = os.getenv("META_RULE_ID")
keystone_project_id = os.getenv("KEYSTONE_PROJECT_ID")
- logger.info("component_type={}".format(component_type))
+ LOGGER.info("component_type={}".format(component_type))
conf = configuration.get_plugins()
# conf = configuration.get_configuration("plugins/{}".format(component_type))
# conf["plugins/{}".format(component_type)]['id'] = component_id
@@ -31,7 +31,7 @@ def create_server():
port = conf[component_type].get('port', tcp_port)
bind = conf[component_type].get('bind', "0.0.0.0")
- logger.info("Starting server with IP {} on port {} bind to {}".format(
+ LOGGER.info("Starting server with IP {} on port {} bind to {}".format(
hostname, port, bind))
server = Server(
host=bind,
diff --git a/moon_authz/requirements.txt b/old/moon_authz/requirements.txt
index 8cad7a7a..8cad7a7a 100644
--- a/moon_authz/requirements.txt
+++ b/old/moon_authz/requirements.txt
diff --git a/moon_authz/setup.py b/old/moon_authz/setup.py
index ad99b9f8..ad99b9f8 100644
--- a/moon_authz/setup.py
+++ b/old/moon_authz/setup.py
diff --git a/moon_authz/tests/unit_python/conftest.py b/old/moon_authz/tests/unit_python/conftest.py
index a6e62078..a6e62078 100644
--- a/moon_authz/tests/unit_python/conftest.py
+++ b/old/moon_authz/tests/unit_python/conftest.py
diff --git a/moon_authz/tests/unit_python/mock_pods.py b/old/moon_authz/tests/unit_python/mock_pods.py
index 9e05e335..39223a57 100644
--- a/moon_authz/tests/unit_python/mock_pods.py
+++ b/old/moon_authz/tests/unit_python/mock_pods.py
@@ -338,16 +338,16 @@ def register_pods(m):
register_policy_action(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
# register_policy_action(m, "policy_id_2")
register_policy_subject_assignment(m, "f8f49a779ceb47b3ac810f01ef71b4e0", "89ba91c18dd54abfbfde7a66936c51a6")
- # register_policy_subject_assignment_list(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
- # register_policy_subject_assignment(m, "policy_id_2", "subject_id")
+ register_policy_subject_assignment_list(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
+ register_policy_subject_assignment(m, "policy_id_2", "subject_id")
# register_policy_subject_assignment_list(m1, "policy_id_2")
register_policy_object_assignment(m, "f8f49a779ceb47b3ac810f01ef71b4e0", "9089b3d2ce5b4e929ffc7e35b55eba1a")
- # register_policy_object_assignment_list(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
- # register_policy_object_assignment(m, "policy_id_2", "object_id")
+ register_policy_object_assignment_list(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
+ register_policy_object_assignment(m, "policy_id_2", "object_id")
# register_policy_object_assignment_list(m1, "policy_id_2")
register_policy_action_assignment(m, "f8f49a779ceb47b3ac810f01ef71b4e0", "cdb3df220dc05a6ea3334b994827b068")
- # register_policy_action_assignment_list(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
- # register_policy_action_assignment(m, "policy_id_2", "action_id")
+ register_policy_action_assignment_list(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
+ register_policy_action_assignment(m, "policy_id_2", "action_id")
# register_policy_action_assignment_list(m1, "policy_id_2")
register_rules(m, "f8f49a779ceb47b3ac810f01ef71b4e0")
register_rules(m, "policy_id_1")
diff --git a/moon_authz/tests/unit_python/requirements.txt b/old/moon_authz/tests/unit_python/requirements.txt
index 21975ce3..21975ce3 100644
--- a/moon_authz/tests/unit_python/requirements.txt
+++ b/old/moon_authz/tests/unit_python/requirements.txt
diff --git a/moon_authz/tests/unit_python/test_authz.py b/old/moon_authz/tests/unit_python/test_authz.py
index 2352fe06..2352fe06 100644
--- a/moon_authz/tests/unit_python/test_authz.py
+++ b/old/moon_authz/tests/unit_python/test_authz.py
diff --git a/moon_authz/tests/unit_python/utilities.py b/old/moon_authz/tests/unit_python/utilities.py
index e3a111bd..e3a111bd 100644
--- a/moon_authz/tests/unit_python/utilities.py
+++ b/old/moon_authz/tests/unit_python/utilities.py
diff --git a/moon_bouchon/Dockerfile b/old/moon_bouchon/Dockerfile
index ed013935..ed013935 100644
--- a/moon_bouchon/Dockerfile
+++ b/old/moon_bouchon/Dockerfile
diff --git a/moon_bouchon/README.md b/old/moon_bouchon/README.md
index 11733cef..11733cef 100644
--- a/moon_bouchon/README.md
+++ b/old/moon_bouchon/README.md
diff --git a/moon_bouchon/moon_bouchon/__init__.py b/old/moon_bouchon/moon_bouchon/__init__.py
index 8811d91d..8811d91d 100644
--- a/moon_bouchon/moon_bouchon/__init__.py
+++ b/old/moon_bouchon/moon_bouchon/__init__.py
diff --git a/moon_bouchon/moon_bouchon/__main__.py b/old/moon_bouchon/moon_bouchon/__main__.py
index 4499a96b..4499a96b 100644
--- a/moon_bouchon/moon_bouchon/__main__.py
+++ b/old/moon_bouchon/moon_bouchon/__main__.py
diff --git a/moon_bouchon/moon_bouchon/server.py b/old/moon_bouchon/moon_bouchon/server.py
index 29e9101e..29e9101e 100644
--- a/moon_bouchon/moon_bouchon/server.py
+++ b/old/moon_bouchon/moon_bouchon/server.py
diff --git a/moon_bouchon/requirements.txt b/old/moon_bouchon/requirements.txt
index 8ab6294c..8ab6294c 100644
--- a/moon_bouchon/requirements.txt
+++ b/old/moon_bouchon/requirements.txt
diff --git a/moon_bouchon/setup.cfg b/old/moon_bouchon/setup.cfg
index 7c2b2874..7c2b2874 100644
--- a/moon_bouchon/setup.cfg
+++ b/old/moon_bouchon/setup.cfg
diff --git a/moon_bouchon/setup.py b/old/moon_bouchon/setup.py
index a875be40..a875be40 100644
--- a/moon_bouchon/setup.py
+++ b/old/moon_bouchon/setup.py
diff --git a/moon_bouchon/tests/test_interface.py b/old/moon_bouchon/tests/test_interface.py
index 425ba2e5..425ba2e5 100644
--- a/moon_bouchon/tests/test_interface.py
+++ b/old/moon_bouchon/tests/test_interface.py
diff --git a/moon_bouchon/tests/test_wrapper.py b/old/moon_bouchon/tests/test_wrapper.py
index 3d5e150c..3d5e150c 100644
--- a/moon_bouchon/tests/test_wrapper.py
+++ b/old/moon_bouchon/tests/test_wrapper.py
diff --git a/old/moon_dashboard/.gitignore b/old/moon_dashboard/.gitignore
new file mode 100644
index 00000000..61f2dc9f
--- /dev/null
+++ b/old/moon_dashboard/.gitignore
@@ -0,0 +1 @@
+**/__pycache__/
diff --git a/old/moon_dashboard/.gitlab-ci.yml b/old/moon_dashboard/.gitlab-ci.yml
new file mode 100644
index 00000000..50fd8a4e
--- /dev/null
+++ b/old/moon_dashboard/.gitlab-ci.yml
@@ -0,0 +1,64 @@
+stages:
+ - lint
+ - build
+ - test
+ - publish
+
+variables:
+ http_proxy: "http://devwatt-proxy.si.fr.intraorange:8080"
+ https_proxy: "http://devwatt-proxy.si.fr.intraorange:8080"
+ no_proxy: dind, gitlab.forge.orange-labs.fr
+ DOCKER_DRIVER: overlay
+ DOCKER_HOST: tcp://dind:2375
+ CONTAINER_RELEASE_IMAGE: moonplatform/$CI_PROJECT_NAME
+ CONTAINER_TAG: dev
+ DOCKER_VERSION: "17.12"
+
+services:
+ - name: dockerproxy-iva.si.francetelecom.fr/docker:$DOCKER_VERSION-dind
+ alias: dind
+image: dockerproxy-iva.si.francetelecom.fr/docker:$DOCKER_VERSION
+
+lint-job:
+ image: dockerfactory-iva.si.francetelecom.fr/docker/orange-dockerfile-lint:0.2.7-alpine3.6-2
+ tags:
+ - rsc
+ - docker
+ - shared
+ stage: lint
+ script:
+ - dockerfile_lint -f Dockerfile
+
+build-job:
+ stage: build
+ tags:
+ - rsc
+ - docker-privileged
+ script:
+ - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
+ - docker build -t $CONTAINER_RELEASE_IMAGE:$CONTAINER_TAG --build-arg http_proxy=$http_proxy --build-arg https_proxy=$http_proxy .
+ - docker push $CONTAINER_RELEASE_IMAGE:$CONTAINER_TAG
+
+test-job:
+ stage: test
+ tags:
+ - rsc
+ - docker-privileged
+ script:
+ - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
+ - docker run -e http_proxy=$http_proxy -e https_proxy=$http_proxy $CONTAINER_RELEASE_IMAGE:$CONTAINER_TAG curl http://localhost:8000
+
+publish-job:
+ stage: publish
+ tags:
+ - rsc
+ - docker-privileged
+ script:
+ - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
+ - FINAL_TAG=$(grep version setup.cfg | cut -d "=" -f 2)
+ - echo FINAL_TAG=$FINAL_TAG
+ - docker pull $CONTAINER_RELEASE_IMAGE:$CONTAINER_TAG
+ - docker tag $CONTAINER_RELEASE_IMAGE:$CONTAINER_TAG $CONTAINER_RELEASE_IMAGE:$FINAL_TAG
+ - docker push $CONTAINER_RELEASE_IMAGE:$FINAL_TAG
+ only:
+ - master
diff --git a/old/moon_dashboard/Dockerfile b/old/moon_dashboard/Dockerfile
new file mode 100644
index 00000000..790a2b21
--- /dev/null
+++ b/old/moon_dashboard/Dockerfile
@@ -0,0 +1,38 @@
+FROM python:3.5
+
+LABEL Name=Dashboard
+LABEL Description="User interface for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+ENV MANAGER_HOST="127.0.0.1"
+ENV MANAGER_PORT=30001
+ENV KEYSTONE_HOST="127.0.0.1"
+ENV KEYSTONE_PORT=5000
+ENV OPENSTACK_HOST="127.0.0.1"
+ENV OPENSTACK_KEYSTONE_URL="http://${KEYSTONE_HOST}:${KEYSTONE_PORT}/identity/v3"
+ENV SERVER_IP_ADDR="0.0.0.0"
+
+USER root
+
+WORKDIR /root/
+ADD . /root
+
+RUN [ -d horizon ] || git clone https://git.openstack.org/openstack/horizon
+
+WORKDIR /root/horizon
+
+# RUN pip install --no-cache-dir pip
+RUN pip install --no-cache-dir -c http://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt .
+
+RUN cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py
+RUN pip install --no-cache-dir tox
+
+WORKDIR /root/
+
+RUN cp -v moon/enabled/_32000_moon.py horizon/openstack_dashboard/local/enabled/_32000_moon.py
+RUN cp -rv moon/ horizon/openstack_dashboard/dashboards/
+
+EXPOSE 8000
+
+CMD ["/bin/sh", "/root/run.sh"] \ No newline at end of file
diff --git a/moon_orchestrator/moon_orchestrator/api/__init__.py b/old/moon_dashboard/LICENSE
index e69de29b..e69de29b 100644
--- a/moon_orchestrator/moon_orchestrator/api/__init__.py
+++ b/old/moon_dashboard/LICENSE
diff --git a/old/moon_dashboard/MANIFEST.in b/old/moon_dashboard/MANIFEST.in
new file mode 100644
index 00000000..1f077b06
--- /dev/null
+++ b/old/moon_dashboard/MANIFEST.in
@@ -0,0 +1,3 @@
+include setup.py
+
+recursive-include myplugin *.js *.html *.scss \ No newline at end of file
diff --git a/old/moon_dashboard/README.md b/old/moon_dashboard/README.md
new file mode 100644
index 00000000..fca52b2d
--- /dev/null
+++ b/old/moon_dashboard/README.md
@@ -0,0 +1,40 @@
+# Moon plugin for Horizon (OpenStack Dashboard)
+
+## Install Horizon
+
+https://docs.openstack.org/horizon/latest/install/index.html
+
+or for developper quick start:
+
+https://docs.openstack.org/horizon/latest/contributor/quickstart.html
+
+
+## Moon plugin
+
+Clone the plugin:
+
+```bash
+git clone https://gitlab.forge.orange-labs.fr/moon/dashboard.git
+```
+
+* ``$plugin`` is the location of moon plugin
+* ``$horizon`` is the location of horizon
+
+Make symbolic link to enabled file:
+
+```bash
+ln -s $plugin/moon/enabled/_32000_moon.py $horizon/openstack_dashboard/local/enabled/_32000_moon.py
+```
+
+Make symbolic link to dashboard folder:
+
+```bash
+ln -s $plugin/moon/ $horizon/openstack_dashboard/dashboards/moon
+```
+
+Finish by restarting the Horizon server.
+
+## Set Moon API endpoint
+
+Set the endpoint in $plugin/moon/moon/static/moon/js/moon.module.js file
+
diff --git a/old/moon_dashboard/README.rst b/old/moon_dashboard/README.rst
new file mode 100644
index 00000000..de9c4058
--- /dev/null
+++ b/old/moon_dashboard/README.rst
@@ -0,0 +1,39 @@
+=============================================
+Moon plugin for Horizon (OpenStack Dashboard)
+=============================================
+
+Install Horizon
+===============
+
+https://docs.openstack.org/horizon/latest/install/index.html
+
+or for developper quick start:
+
+https://docs.openstack.org/horizon/latest/contributor/quickstart.html
+
+
+Moon plugin
+===========
+
+Clone the plugin:
+
+"git clone https://gitlab.forge.orange-labs.fr/moon/dashboard.git"
+
+* ``plugin`` is the location of moon plugin
+* ``horizon`` is the location of horizon
+
+Make symbolic link to enabled file:
+
+"ln -s ``plugin`̀`/moon/enabled/_32000_moon.py ``horizon``/openstack_dashboard/local/enabled/_32000_moon.py"
+
+Make symbolic link to dashboard folder:
+
+"ln -s ``plugin`̀`/moon/ ``horizon``/openstack_dashboard/dashboards/moon"
+
+Finish by restarting the Horizon server.
+
+
+Set Moon API endpoint
+===========
+
+Set the endpoint in ``plugin``/moon/moon/static/moon/js/moon.module.js file \ No newline at end of file
diff --git a/old/moon_dashboard/babel-django.cfg b/old/moon_dashboard/babel-django.cfg
new file mode 100644
index 00000000..fa906ad8
--- /dev/null
+++ b/old/moon_dashboard/babel-django.cfg
@@ -0,0 +1,5 @@
+[extractors]
+django = django_babel.extract:extract_django
+
+[python: **.py]
+[django: **/templates/**.html] \ No newline at end of file
diff --git a/old/moon_dashboard/babel-djangojs.cfg b/old/moon_dashboard/babel-djangojs.cfg
new file mode 100644
index 00000000..1c07ba6a
--- /dev/null
+++ b/old/moon_dashboard/babel-djangojs.cfg
@@ -0,0 +1,14 @@
+[extractors]
+# We use a custom extractor to find translatable strings in AngularJS
+# templates. The extractor is included in horizon.utils for now.
+# See http://babel.pocoo.org/docs/messages/#referencing-extraction-methods for
+# details on how this works.
+angular = horizon.utils.babel_extract_angular:extract_angular
+
+[javascript: **.js]
+
+# We need to look into all static folders for HTML files.
+# The **/static ensures that we also search within
+# /openstack_dashboard/dashboards/XYZ/static which will ensure
+# that plugins are also translated.
+[angular: **/static/**.html] \ No newline at end of file
diff --git a/moon_wrapper/moon_wrapper/api/__init__.py b/old/moon_dashboard/moon/__init__.py
index e69de29b..e69de29b 100644
--- a/moon_wrapper/moon_wrapper/api/__init__.py
+++ b/old/moon_dashboard/moon/__init__.py
diff --git a/moon_wrapper/tests/unit_python/api/__init__.py b/old/moon_dashboard/moon/api/__init__.py
index e69de29b..e69de29b 100644
--- a/moon_wrapper/tests/unit_python/api/__init__.py
+++ b/old/moon_dashboard/moon/api/__init__.py
diff --git a/python_moonclient/python_moonclient/cli/__init__.py b/old/moon_dashboard/moon/api/moon_api.py
index e69de29b..e69de29b 100644
--- a/python_moonclient/python_moonclient/cli/__init__.py
+++ b/old/moon_dashboard/moon/api/moon_api.py
diff --git a/old/moon_dashboard/moon/dashboard.py b/old/moon_dashboard/moon/dashboard.py
new file mode 100644
index 00000000..0e3e491e
--- /dev/null
+++ b/old/moon_dashboard/moon/dashboard.py
@@ -0,0 +1,13 @@
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+
+
+class Moon(horizon.Dashboard):
+ name = _("Moon")
+ slug = "moon"
+ panels = ('model','policy','pdp',) # Add your panels here.
+ default_panel = 'model' # Specify the slug of the default panel.
+
+
+horizon.register(Moon)
diff --git a/old/moon_dashboard/moon/enabled/_32000_moon.py b/old/moon_dashboard/moon/enabled/_32000_moon.py
new file mode 100644
index 00000000..73198de6
--- /dev/null
+++ b/old/moon_dashboard/moon/enabled/_32000_moon.py
@@ -0,0 +1,19 @@
+# The name of the dashboard to be added to HORIZON['dashboards']. Required.
+DASHBOARD = 'moon'
+
+# If set to True, this dashboard will not be added to the settings.
+DISABLED = False
+
+# A list of AngularJS modules to be loaded when Angular bootstraps.
+ADD_ANGULAR_MODULES = ['moon']
+
+# Automatically discover static resources in installed apps
+AUTO_DISCOVER_STATIC_FILES = True
+
+# A list of applications to be added to INSTALLED_APPS.
+ADD_INSTALLED_APPS = [
+ 'openstack_dashboard.dashboards.moon',
+]
+
+# A list of scss files to be included in the compressed set of files
+ADD_SCSS_FILES = ['moon/scss/moon.scss']
diff --git a/python_moonclient/python_moonclient/core/__init__.py b/old/moon_dashboard/moon/model/__init__.py
index e69de29b..e69de29b 100644
--- a/python_moonclient/python_moonclient/core/__init__.py
+++ b/old/moon_dashboard/moon/model/__init__.py
diff --git a/old/moon_dashboard/moon/model/panel.py b/old/moon_dashboard/moon/model/panel.py
new file mode 100644
index 00000000..9cb65ef0
--- /dev/null
+++ b/old/moon_dashboard/moon/model/panel.py
@@ -0,0 +1,23 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+from openstack_dashboard.dashboards.moon import dashboard
+
+class Model(horizon.Panel):
+ name = _("Models")
+ slug = "model"
+
+
+dashboard.Moon.register(Model)
diff --git a/old/moon_dashboard/moon/model/templates/model/index.html b/old/moon_dashboard/moon/model/templates/model/index.html
new file mode 100644
index 00000000..db372a02
--- /dev/null
+++ b/old/moon_dashboard/moon/model/templates/model/index.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block title %}{% trans "Models" %}{% endblock %}
+
+{% block page_header %}
+ {% include "horizon/common/_page_header.html" with title=_("Models") %}
+{% endblock page_header %}
+
+
+
+{% block main %}
+ <ng-include
+ src="'{{ STATIC_URL }}moon/model/model.html'">
+ </ng-include>
+{% endblock %}
+
diff --git a/old/moon_dashboard/moon/model/tests.py b/old/moon_dashboard/moon/model/tests.py
new file mode 100644
index 00000000..ec988636
--- /dev/null
+++ b/old/moon_dashboard/moon/model/tests.py
@@ -0,0 +1,19 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon.test import helpers as test
+
+
+class MypanelTests(test.TestCase):
+ # Unit tests for mypanel.
+ def test_me(self):
+ self.assertTrue(1 + 1 == 2)
diff --git a/old/moon_dashboard/moon/model/urls.py b/old/moon_dashboard/moon/model/urls.py
new file mode 100644
index 00000000..ca9507fb
--- /dev/null
+++ b/old/moon_dashboard/moon/model/urls.py
@@ -0,0 +1,20 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from django.conf.urls import url
+
+from openstack_dashboard.dashboards.moon.model import views
+
+
+urlpatterns = [
+ url(r'^$', views.IndexView.as_view(), name='index'),
+]
diff --git a/old/moon_dashboard/moon/model/views.py b/old/moon_dashboard/moon/model/views.py
new file mode 100644
index 00000000..73509537
--- /dev/null
+++ b/old/moon_dashboard/moon/model/views.py
@@ -0,0 +1,22 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon import views
+
+
+class IndexView(views.APIView):
+ # A very simple class-based view...
+ template_name = 'moon/model/index.html'
+
+ def get_data(self, request, context, *args, **kwargs):
+ # Add data to the context here...
+ return context
diff --git a/python_moonclient/tests/unit_python/__init__.py b/old/moon_dashboard/moon/pdp/__init__.py
index e69de29b..e69de29b 100644
--- a/python_moonclient/tests/unit_python/__init__.py
+++ b/old/moon_dashboard/moon/pdp/__init__.py
diff --git a/old/moon_dashboard/moon/pdp/panel.py b/old/moon_dashboard/moon/pdp/panel.py
new file mode 100644
index 00000000..9c4b3fa3
--- /dev/null
+++ b/old/moon_dashboard/moon/pdp/panel.py
@@ -0,0 +1,23 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+from openstack_dashboard.dashboards.moon import dashboard
+
+class Pdp(horizon.Panel):
+ name = _("PDP")
+ slug = "pdp"
+
+
+dashboard.Moon.register(Pdp)
diff --git a/old/moon_dashboard/moon/pdp/templates/pdp/index.html b/old/moon_dashboard/moon/pdp/templates/pdp/index.html
new file mode 100644
index 00000000..30ac5f93
--- /dev/null
+++ b/old/moon_dashboard/moon/pdp/templates/pdp/index.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block title %}{% trans "PDP" %}{% endblock %}
+
+{% block page_header %}
+ {% include "horizon/common/_page_header.html" with title=_("PDP") %}
+{% endblock page_header %}
+
+
+
+{% block main %}
+ <ng-include
+ src="'{{ STATIC_URL }}moon/pdp/pdp.html'">
+ </ng-include>
+{% endblock %}
+
diff --git a/old/moon_dashboard/moon/pdp/tests.py b/old/moon_dashboard/moon/pdp/tests.py
new file mode 100644
index 00000000..ec988636
--- /dev/null
+++ b/old/moon_dashboard/moon/pdp/tests.py
@@ -0,0 +1,19 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon.test import helpers as test
+
+
+class MypanelTests(test.TestCase):
+ # Unit tests for mypanel.
+ def test_me(self):
+ self.assertTrue(1 + 1 == 2)
diff --git a/old/moon_dashboard/moon/pdp/urls.py b/old/moon_dashboard/moon/pdp/urls.py
new file mode 100644
index 00000000..a66c8e0c
--- /dev/null
+++ b/old/moon_dashboard/moon/pdp/urls.py
@@ -0,0 +1,20 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from django.conf.urls import url
+
+from openstack_dashboard.dashboards.moon.pdp import views
+
+
+urlpatterns = [
+ url(r'^$', views.IndexView.as_view(), name='index'),
+]
diff --git a/old/moon_dashboard/moon/pdp/views.py b/old/moon_dashboard/moon/pdp/views.py
new file mode 100644
index 00000000..8355a5d5
--- /dev/null
+++ b/old/moon_dashboard/moon/pdp/views.py
@@ -0,0 +1,22 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon import views
+
+
+class IndexView(views.APIView):
+ # A very simple class-based view...
+ template_name = 'moon/pdp/index.html'
+
+ def get_data(self, request, context, *args, **kwargs):
+ # Add data to the context here...
+ return context
diff --git a/python_moondb/python_moondb/api/__init__.py b/old/moon_dashboard/moon/policy/__init__.py
index e69de29b..e69de29b 100644
--- a/python_moondb/python_moondb/api/__init__.py
+++ b/old/moon_dashboard/moon/policy/__init__.py
diff --git a/old/moon_dashboard/moon/policy/panel.py b/old/moon_dashboard/moon/policy/panel.py
new file mode 100644
index 00000000..875a2d76
--- /dev/null
+++ b/old/moon_dashboard/moon/policy/panel.py
@@ -0,0 +1,23 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+from openstack_dashboard.dashboards.moon import dashboard
+
+class Policy(horizon.Panel):
+ name = _("Policies")
+ slug = "policy"
+
+
+dashboard.Moon.register(Policy)
diff --git a/old/moon_dashboard/moon/policy/templates/policy/index.html b/old/moon_dashboard/moon/policy/templates/policy/index.html
new file mode 100644
index 00000000..67cd9c3d
--- /dev/null
+++ b/old/moon_dashboard/moon/policy/templates/policy/index.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block title %}{% trans "Policies" %}{% endblock %}
+
+{% block page_header %}
+ {% include "horizon/common/_page_header.html" with title=_("Policies") %}
+{% endblock page_header %}
+
+
+
+{% block main %}
+ <ng-include
+ src="'{{ STATIC_URL }}moon/policy/policy.html'">
+ </ng-include>
+{% endblock %}
+
diff --git a/old/moon_dashboard/moon/policy/tests.py b/old/moon_dashboard/moon/policy/tests.py
new file mode 100644
index 00000000..ec988636
--- /dev/null
+++ b/old/moon_dashboard/moon/policy/tests.py
@@ -0,0 +1,19 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon.test import helpers as test
+
+
+class MypanelTests(test.TestCase):
+ # Unit tests for mypanel.
+ def test_me(self):
+ self.assertTrue(1 + 1 == 2)
diff --git a/old/moon_dashboard/moon/policy/urls.py b/old/moon_dashboard/moon/policy/urls.py
new file mode 100644
index 00000000..81bde0ca
--- /dev/null
+++ b/old/moon_dashboard/moon/policy/urls.py
@@ -0,0 +1,20 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from django.conf.urls import url
+
+from openstack_dashboard.dashboards.moon.policy import views
+
+
+urlpatterns = [
+ url(r'^$', views.IndexView.as_view(), name='index'),
+]
diff --git a/old/moon_dashboard/moon/policy/views.py b/old/moon_dashboard/moon/policy/views.py
new file mode 100644
index 00000000..826c833b
--- /dev/null
+++ b/old/moon_dashboard/moon/policy/views.py
@@ -0,0 +1,22 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from horizon import views
+
+
+class IndexView(views.APIView):
+ # A very simple class-based view...
+ template_name = 'moon/policy/index.html'
+
+ def get_data(self, request, context, *args, **kwargs):
+ # Add data to the context here...
+ return context
diff --git a/old/moon_dashboard/moon/static/moon/js/angular-resource.js b/old/moon_dashboard/moon/static/moon/js/angular-resource.js
new file mode 100644
index 00000000..e8bb3014
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/js/angular-resource.js
@@ -0,0 +1,863 @@
+/**
+ * @license AngularJS v1.5.8
+ * (c) 2010-2016 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular) {'use strict';
+
+var $resourceMinErr = angular.$$minErr('$resource');
+
+// Helper functions and regex to lookup a dotted path on an object
+// stopping at undefined/null. The path must be composed of ASCII
+// identifiers (just like $parse)
+var MEMBER_NAME_REGEX = /^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;
+
+function isValidDottedPath(path) {
+ return (path != null && path !== '' && path !== 'hasOwnProperty' &&
+ MEMBER_NAME_REGEX.test('.' + path));
+}
+
+function lookupDottedPath(obj, path) {
+ if (!isValidDottedPath(path)) {
+ throw $resourceMinErr('badmember', 'Dotted member path "@{0}" is invalid.', path);
+ }
+ var keys = path.split('.');
+ for (var i = 0, ii = keys.length; i < ii && angular.isDefined(obj); i++) {
+ var key = keys[i];
+ obj = (obj !== null) ? obj[key] : undefined;
+ }
+ return obj;
+}
+
+/**
+ * Create a shallow copy of an object and clear other fields from the destination
+ */
+function shallowClearAndCopy(src, dst) {
+ dst = dst || {};
+
+ angular.forEach(dst, function(value, key) {
+ delete dst[key];
+ });
+
+ for (var key in src) {
+ if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {
+ dst[key] = src[key];
+ }
+ }
+
+ return dst;
+}
+
+/**
+ * @ngdoc module
+ * @name ngResource
+ * @description
+ *
+ * # ngResource
+ *
+ * The `ngResource` module provides interaction support with RESTful services
+ * via the $resource service.
+ *
+ *
+ * <div doc-module-components="ngResource"></div>
+ *
+ * See {@link ngResource.$resourceProvider} and {@link ngResource.$resource} for usage.
+ */
+
+/**
+ * @ngdoc provider
+ * @name $resourceProvider
+ *
+ * @description
+ *
+ * Use `$resourceProvider` to change the default behavior of the {@link ngResource.$resource}
+ * service.
+ *
+ * ## Dependencies
+ * Requires the {@link ngResource } module to be installed.
+ *
+ */
+
+/**
+ * @ngdoc service
+ * @name $resource
+ * @requires $http
+ * @requires ng.$log
+ * @requires $q
+ * @requires ng.$timeout
+ *
+ * @description
+ * A factory which creates a resource object that lets you interact with
+ * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.
+ *
+ * The returned resource object has action methods which provide high-level behaviors without
+ * the need to interact with the low level {@link ng.$http $http} service.
+ *
+ * Requires the {@link ngResource `ngResource`} module to be installed.
+ *
+ * By default, trailing slashes will be stripped from the calculated URLs,
+ * which can pose problems with server backends that do not expect that
+ * behavior. This can be disabled by configuring the `$resourceProvider` like
+ * this:
+ *
+ * ```js
+ app.config(['$resourceProvider', function($resourceProvider) {
+ // Don't strip trailing slashes from calculated URLs
+ $resourceProvider.defaults.stripTrailingSlashes = false;
+ }]);
+ * ```
+ *
+ * @param {string} url A parameterized URL template with parameters prefixed by `:` as in
+ * `/user/:username`. If you are using a URL with a port number (e.g.
+ * `http://example.com:8080/api`), it will be respected.
+ *
+ * If you are using a url with a suffix, just add the suffix, like this:
+ * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`
+ * or even `$resource('http://example.com/resource/:resource_id.:format')`
+ * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
+ * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you
+ * can escape it with `/\.`.
+ *
+ * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
+ * `actions` methods. If a parameter value is a function, it will be called every time
+ * a param value needs to be obtained for a request (unless the param was overridden). The function
+ * will be passed the current data value as an argument.
+ *
+ * Each key value in the parameter object is first bound to url template if present and then any
+ * excess keys are appended to the url search query after the `?`.
+ *
+ * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
+ * URL `/path/greet?salutation=Hello`.
+ *
+ * If the parameter value is prefixed with `@`, then the value for that parameter will be
+ * extracted from the corresponding property on the `data` object (provided when calling a
+ * "non-GET" action method).
+ * For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of
+ * `someParam` will be `data.someProp`.
+ * Note that the parameter will be ignored, when calling a "GET" action method (i.e. an action
+ * method that does not accept a request body)
+ *
+ * @param {Object.<Object>=} actions Hash with declaration of custom actions that should extend
+ * the default set of resource actions. The declaration should be created in the format of {@link
+ * ng.$http#usage $http.config}:
+ *
+ * {action1: {method:?, params:?, isArray:?, headers:?, ...},
+ * action2: {method:?, params:?, isArray:?, headers:?, ...},
+ * ...}
+ *
+ * Where:
+ *
+ * - **`action`** – {string} – The name of action. This name becomes the name of the method on
+ * your resource object.
+ * - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,
+ * `DELETE`, `JSONP`, etc).
+ * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of
+ * the parameter value is a function, it will be called every time when a param value needs to
+ * be obtained for a request (unless the param was overridden). The function will be passed the
+ * current data value as an argument.
+ * - **`url`** – {string} – action specific `url` override. The url templating is supported just
+ * like for the resource-level urls.
+ * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,
+ * see `returns` section.
+ * - **`transformRequest`** –
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+ * transform function or an array of such functions. The transform function takes the http
+ * request body and headers and returns its transformed (typically serialized) version.
+ * By default, transformRequest will contain one function that checks if the request data is
+ * an object and serializes to using `angular.toJson`. To prevent this behavior, set
+ * `transformRequest` to an empty array: `transformRequest: []`
+ * - **`transformResponse`** –
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+ * transform function or an array of such functions. The transform function takes the http
+ * response body and headers and returns its transformed (typically deserialized) version.
+ * By default, transformResponse will contain one function that checks if the response looks
+ * like a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior,
+ * set `transformResponse` to an empty array: `transformResponse: []`
+ * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
+ * GET request, otherwise if a cache instance built with
+ * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
+ * caching.
+ * - **`timeout`** – `{number}` – timeout in milliseconds.<br />
+ * **Note:** In contrast to {@link ng.$http#usage $http.config}, {@link ng.$q promises} are
+ * **not** supported in $resource, because the same value would be used for multiple requests.
+ * If you are looking for a way to cancel requests, you should use the `cancellable` option.
+ * - **`cancellable`** – `{boolean}` – if set to true, the request made by a "non-instance" call
+ * will be cancelled (if not already completed) by calling `$cancelRequest()` on the call's
+ * return value. Calling `$cancelRequest()` for a non-cancellable or an already
+ * completed/cancelled request will have no effect.<br />
+ * - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the
+ * XHR object. See
+ * [requests with credentials](https://developer.mozilla.org/en/http_access_control#section_5)
+ * for more information.
+ * - **`responseType`** - `{string}` - see
+ * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
+ * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods -
+ * `response` and `responseError`. Both `response` and `responseError` interceptors get called
+ * with `http response` object. See {@link ng.$http $http interceptors}.
+ *
+ * @param {Object} options Hash with custom settings that should extend the
+ * default `$resourceProvider` behavior. The supported options are:
+ *
+ * - **`stripTrailingSlashes`** – {boolean} – If true then the trailing
+ * slashes from any calculated URL will be stripped. (Defaults to true.)
+ * - **`cancellable`** – {boolean} – If true, the request made by a "non-instance" call will be
+ * cancelled (if not already completed) by calling `$cancelRequest()` on the call's return value.
+ * This can be overwritten per action. (Defaults to false.)
+ *
+ * @returns {Object} A resource "class" object with methods for the default set of resource actions
+ * optionally extended with custom `actions`. The default set contains these actions:
+ * ```js
+ * { 'get': {method:'GET'},
+ * 'save': {method:'POST'},
+ * 'query': {method:'GET', isArray:true},
+ * 'remove': {method:'DELETE'},
+ * 'delete': {method:'DELETE'} };
+ * ```
+ *
+ * Calling these methods invoke an {@link ng.$http} with the specified http method,
+ * destination and parameters. When the data is returned from the server then the object is an
+ * instance of the resource class. The actions `save`, `remove` and `delete` are available on it
+ * as methods with the `$` prefix. This allows you to easily perform CRUD operations (create,
+ * read, update, delete) on server-side data like this:
+ * ```js
+ * var User = $resource('/user/:userId', {userId:'@id'});
+ * var user = User.get({userId:123}, function() {
+ * user.abc = true;
+ * user.$save();
+ * });
+ * ```
+ *
+ * It is important to realize that invoking a $resource object method immediately returns an
+ * empty reference (object or array depending on `isArray`). Once the data is returned from the
+ * server the existing reference is populated with the actual data. This is a useful trick since
+ * usually the resource is assigned to a model which is then rendered by the view. Having an empty
+ * object results in no rendering, once the data arrives from the server then the object is
+ * populated with the data and the view automatically re-renders itself showing the new data. This
+ * means that in most cases one never has to write a callback function for the action methods.
+ *
+ * The action methods on the class object or instance object can be invoked with the following
+ * parameters:
+ *
+ * - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])`
+ * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
+ * - non-GET instance actions: `instance.$action([parameters], [success], [error])`
+ *
+ *
+ * Success callback is called with (value, responseHeaders) arguments, where the value is
+ * the populated resource instance or collection object. The error callback is called
+ * with (httpResponse) argument.
+ *
+ * Class actions return empty instance (with additional properties below).
+ * Instance actions return promise of the action.
+ *
+ * The Resource instances and collections have these additional properties:
+ *
+ * - `$promise`: the {@link ng.$q promise} of the original server interaction that created this
+ * instance or collection.
+ *
+ * On success, the promise is resolved with the same resource instance or collection object,
+ * updated with data from server. This makes it easy to use in
+ * {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view
+ * rendering until the resource(s) are loaded.
+ *
+ * On failure, the promise is rejected with the {@link ng.$http http response} object, without
+ * the `resource` property.
+ *
+ * If an interceptor object was provided, the promise will instead be resolved with the value
+ * returned by the interceptor.
+ *
+ * - `$resolved`: `true` after first server interaction is completed (either with success or
+ * rejection), `false` before that. Knowing if the Resource has been resolved is useful in
+ * data-binding.
+ *
+ * The Resource instances and collections have these additional methods:
+ *
+ * - `$cancelRequest`: If there is a cancellable, pending request related to the instance or
+ * collection, calling this method will abort the request.
+ *
+ * The Resource instances have these additional methods:
+ *
+ * - `toJSON`: It returns a simple object without any of the extra properties added as part of
+ * the Resource API. This object can be serialized through {@link angular.toJson} safely
+ * without attaching Angular-specific fields. Notice that `JSON.stringify` (and
+ * `angular.toJson`) automatically use this method when serializing a Resource instance
+ * (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_behavior)).
+ *
+ * @example
+ *
+ * # Credit card resource
+ *
+ * ```js
+ // Define CreditCard class
+ var CreditCard = $resource('/user/:userId/card/:cardId',
+ {userId:123, cardId:'@id'}, {
+ charge: {method:'POST', params:{charge:true}}
+ });
+
+ // We can retrieve a collection from the server
+ var cards = CreditCard.query(function() {
+ // GET: /user/123/card
+ // server returns: [ {id:456, number:'1234', name:'Smith'} ];
+
+ var card = cards[0];
+ // each item is an instance of CreditCard
+ expect(card instanceof CreditCard).toEqual(true);
+ card.name = "J. Smith";
+ // non GET methods are mapped onto the instances
+ card.$save();
+ // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
+ // server returns: {id:456, number:'1234', name: 'J. Smith'};
+
+ // our custom method is mapped as well.
+ card.$charge({amount:9.99});
+ // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
+ });
+
+ // we can create an instance as well
+ var newCard = new CreditCard({number:'0123'});
+ newCard.name = "Mike Smith";
+ newCard.$save();
+ // POST: /user/123/card {number:'0123', name:'Mike Smith'}
+ // server returns: {id:789, number:'0123', name: 'Mike Smith'};
+ expect(newCard.id).toEqual(789);
+ * ```
+ *
+ * The object returned from this function execution is a resource "class" which has "static" method
+ * for each action in the definition.
+ *
+ * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and
+ * `headers`.
+ *
+ * @example
+ *
+ * # User resource
+ *
+ * When the data is returned from the server then the object is an instance of the resource type and
+ * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD
+ * operations (create, read, update, delete) on server-side data.
+
+ ```js
+ var User = $resource('/user/:userId', {userId:'@id'});
+ User.get({userId:123}, function(user) {
+ user.abc = true;
+ user.$save();
+ });
+ ```
+ *
+ * It's worth noting that the success callback for `get`, `query` and other methods gets passed
+ * in the response that came from the server as well as $http header getter function, so one
+ * could rewrite the above example and get access to http headers as:
+ *
+ ```js
+ var User = $resource('/user/:userId', {userId:'@id'});
+ User.get({userId:123}, function(user, getResponseHeaders){
+ user.abc = true;
+ user.$save(function(user, putResponseHeaders) {
+ //user => saved user object
+ //putResponseHeaders => $http header getter
+ });
+ });
+ ```
+ *
+ * You can also access the raw `$http` promise via the `$promise` property on the object returned
+ *
+ ```
+ var User = $resource('/user/:userId', {userId:'@id'});
+ User.get({userId:123})
+ .$promise.then(function(user) {
+ $scope.user = user;
+ });
+ ```
+ *
+ * @example
+ *
+ * # Creating a custom 'PUT' request
+ *
+ * In this example we create a custom method on our resource to make a PUT request
+ * ```js
+ * var app = angular.module('app', ['ngResource', 'ngRoute']);
+ *
+ * // Some APIs expect a PUT request in the format URL/object/ID
+ * // Here we are creating an 'update' method
+ * app.factory('Notes', ['$resource', function($resource) {
+ * return $resource('/notes/:id', null,
+ * {
+ * 'update': { method:'PUT' }
+ * });
+ * }]);
+ *
+ * // In our controller we get the ID from the URL using ngRoute and $routeParams
+ * // We pass in $routeParams and our Notes factory along with $scope
+ * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
+ function($scope, $routeParams, Notes) {
+ * // First get a note object from the factory
+ * var note = Notes.get({ id:$routeParams.id });
+ * $id = note.id;
+ *
+ * // Now call update passing in the ID first then the object you are updating
+ * Notes.update({ id:$id }, note);
+ *
+ * // This will PUT /notes/ID with the note object in the request payload
+ * }]);
+ * ```
+ *
+ * @example
+ *
+ * # Cancelling requests
+ *
+ * If an action's configuration specifies that it is cancellable, you can cancel the request related
+ * to an instance or collection (as long as it is a result of a "non-instance" call):
+ *
+ ```js
+ // ...defining the `Hotel` resource...
+ var Hotel = $resource('/api/hotel/:id', {id: '@id'}, {
+ // Let's make the `query()` method cancellable
+ query: {method: 'get', isArray: true, cancellable: true}
+ });
+
+ // ...somewhere in the PlanVacationController...
+ ...
+ this.onDestinationChanged = function onDestinationChanged(destination) {
+ // We don't care about any pending request for hotels
+ // in a different destination any more
+ this.availableHotels.$cancelRequest();
+
+ // Let's query for hotels in '<destination>'
+ // (calls: /api/hotel?location=<destination>)
+ this.availableHotels = Hotel.query({location: destination});
+ };
+ ```
+ *
+ */
+angular.module('ngResource', ['ng']).
+ provider('$resource', function() {
+ var PROTOCOL_AND_DOMAIN_REGEX = /^https?:\/\/[^\/]*/;
+ var provider = this;
+
+ /**
+ * @ngdoc property
+ * @name $resourceProvider#defaults
+ * @description
+ * Object containing default options used when creating `$resource` instances.
+ *
+ * The default values satisfy a wide range of usecases, but you may choose to overwrite any of
+ * them to further customize your instances. The available properties are:
+ *
+ * - **stripTrailingSlashes** – `{boolean}` – If true, then the trailing slashes from any
+ * calculated URL will be stripped.<br />
+ * (Defaults to true.)
+ * - **cancellable** – `{boolean}` – If true, the request made by a "non-instance" call will be
+ * cancelled (if not already completed) by calling `$cancelRequest()` on the call's return
+ * value. For more details, see {@link ngResource.$resource}. This can be overwritten per
+ * resource class or action.<br />
+ * (Defaults to false.)
+ * - **actions** - `{Object.<Object>}` - A hash with default actions declarations. Actions are
+ * high-level methods corresponding to RESTful actions/methods on resources. An action may
+ * specify what HTTP method to use, what URL to hit, if the return value will be a single
+ * object or a collection (array) of objects etc. For more details, see
+ * {@link ngResource.$resource}. The actions can also be enhanced or overwritten per resource
+ * class.<br />
+ * The default actions are:
+ * ```js
+ * {
+ * get: {method: 'GET'},
+ * save: {method: 'POST'},
+ * query: {method: 'GET', isArray: true},
+ * remove: {method: 'DELETE'},
+ * delete: {method: 'DELETE'}
+ * }
+ * ```
+ *
+ * #### Example
+ *
+ * For example, you can specify a new `update` action that uses the `PUT` HTTP verb:
+ *
+ * ```js
+ * angular.
+ * module('myApp').
+ * config(['resourceProvider', function ($resourceProvider) {
+ * $resourceProvider.defaults.actions.update = {
+ * method: 'PUT'
+ * };
+ * });
+ * ```
+ *
+ * Or you can even overwrite the whole `actions` list and specify your own:
+ *
+ * ```js
+ * angular.
+ * module('myApp').
+ * config(['resourceProvider', function ($resourceProvider) {
+ * $resourceProvider.defaults.actions = {
+ * create: {method: 'POST'}
+ * get: {method: 'GET'},
+ * getAll: {method: 'GET', isArray:true},
+ * update: {method: 'PUT'},
+ * delete: {method: 'DELETE'}
+ * };
+ * });
+ * ```
+ *
+ */
+ this.defaults = {
+ // Strip slashes by default
+ stripTrailingSlashes: true,
+
+ // Make non-instance requests cancellable (via `$cancelRequest()`)
+ cancellable: false,
+
+ // Default actions configuration
+ actions: {
+ 'get': {method: 'GET'},
+ 'save': {method: 'POST'},
+ 'query': {method: 'GET', isArray: true},
+ 'remove': {method: 'DELETE'},
+ 'delete': {method: 'DELETE'}
+ }
+ };
+
+ this.$get = ['$http', '$log', '$q', '$timeout', function($http, $log, $q, $timeout) {
+
+ var noop = angular.noop,
+ forEach = angular.forEach,
+ extend = angular.extend,
+ copy = angular.copy,
+ isFunction = angular.isFunction;
+
+ /**
+ * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
+ * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set
+ * (pchar) allowed in path segments:
+ * segment = *pchar
+ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
+ * pct-encoded = "%" HEXDIG HEXDIG
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ * / "*" / "+" / "," / ";" / "="
+ */
+ function encodeUriSegment(val) {
+ return encodeUriQuery(val, true).
+ replace(/%26/gi, '&').
+ replace(/%3D/gi, '=').
+ replace(/%2B/gi, '+');
+ }
+
+
+ /**
+ * This method is intended for encoding *key* or *value* parts of query component. We need a
+ * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't
+ * have to be encoded per http://tools.ietf.org/html/rfc3986:
+ * query = *( pchar / "/" / "?" )
+ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ * pct-encoded = "%" HEXDIG HEXDIG
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ * / "*" / "+" / "," / ";" / "="
+ */
+ function encodeUriQuery(val, pctEncodeSpaces) {
+ return encodeURIComponent(val).
+ replace(/%40/gi, '@').
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
+ }
+
+ function Route(template, defaults) {
+ this.template = template;
+ this.defaults = extend({}, provider.defaults, defaults);
+ this.urlParams = {};
+ }
+
+ Route.prototype = {
+ setUrlParams: function(config, params, actionUrl) {
+ var self = this,
+ url = actionUrl || self.template,
+ val,
+ encodedVal,
+ protocolAndDomain = '';
+
+ var urlParams = self.urlParams = {};
+ forEach(url.split(/\W/), function(param) {
+ if (param === 'hasOwnProperty') {
+ throw $resourceMinErr('badname', "hasOwnProperty is not a valid parameter name.");
+ }
+ if (!(new RegExp("^\\d+$").test(param)) && param &&
+ (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
+ urlParams[param] = {
+ isQueryParamValue: (new RegExp("\\?.*=:" + param + "(?:\\W|$)")).test(url)
+ };
+ }
+ });
+ url = url.replace(/\\:/g, ':');
+ url = url.replace(PROTOCOL_AND_DOMAIN_REGEX, function(match) {
+ protocolAndDomain = match;
+ return '';
+ });
+
+ params = params || {};
+ forEach(self.urlParams, function(paramInfo, urlParam) {
+ val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
+ if (angular.isDefined(val) && val !== null) {
+ if (paramInfo.isQueryParamValue) {
+ encodedVal = encodeUriQuery(val, true);
+ } else {
+ encodedVal = encodeUriSegment(val);
+ }
+ url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function(match, p1) {
+ return encodedVal + p1;
+ });
+ } else {
+ url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match,
+ leadingSlashes, tail) {
+ if (tail.charAt(0) == '/') {
+ return tail;
+ } else {
+ return leadingSlashes + tail;
+ }
+ });
+ }
+ });
+
+ // strip trailing slashes and set the url (unless this behavior is specifically disabled)
+ if (self.defaults.stripTrailingSlashes) {
+ url = url.replace(/\/+$/, '') || '/';
+ }
+
+ // then replace collapse `/.` if found in the last URL path segment before the query
+ // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x`
+ url = url.replace(/\/\.(?=\w+($|\?))/, '.');
+ // replace escaped `/\.` with `/.`
+ config.url = protocolAndDomain + url.replace(/\/\\\./, '/.');
+
+
+ // set params - delegate param encoding to $http
+ forEach(params, function(value, key) {
+ if (!self.urlParams[key]) {
+ config.params = config.params || {};
+ config.params[key] = value;
+ }
+ });
+ }
+ };
+
+
+ function resourceFactory(url, paramDefaults, actions, options) {
+ var route = new Route(url, options);
+
+ actions = extend({}, provider.defaults.actions, actions);
+
+ function extractParams(data, actionParams) {
+ var ids = {};
+ actionParams = extend({}, paramDefaults, actionParams);
+ forEach(actionParams, function(value, key) {
+ if (isFunction(value)) { value = value(data); }
+ ids[key] = value && value.charAt && value.charAt(0) == '@' ?
+ lookupDottedPath(data, value.substr(1)) : value;
+ });
+ return ids;
+ }
+
+ function defaultResponseInterceptor(response) {
+ return response.resource;
+ }
+
+ function Resource(value) {
+ shallowClearAndCopy(value || {}, this);
+ }
+
+ Resource.prototype.toJSON = function() {
+ var data = extend({}, this);
+ delete data.$promise;
+ delete data.$resolved;
+ return data;
+ };
+
+ forEach(actions, function(action, name) {
+ var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);
+ var numericTimeout = action.timeout;
+ var cancellable = angular.isDefined(action.cancellable) ? action.cancellable :
+ (options && angular.isDefined(options.cancellable)) ? options.cancellable :
+ provider.defaults.cancellable;
+
+ if (numericTimeout && !angular.isNumber(numericTimeout)) {
+ $log.debug('ngResource:\n' +
+ ' Only numeric values are allowed as `timeout`.\n' +
+ ' Promises are not supported in $resource, because the same value would ' +
+ 'be used for multiple requests. If you are looking for a way to cancel ' +
+ 'requests, you should use the `cancellable` option.');
+ delete action.timeout;
+ numericTimeout = null;
+ }
+
+ Resource[name] = function(a1, a2, a3, a4) {
+ var params = {}, data, success, error;
+
+ /* jshint -W086 */ /* (purposefully fall through case statements) */
+ switch (arguments.length) {
+ case 4:
+ error = a4;
+ success = a3;
+ //fallthrough
+ case 3:
+ case 2:
+ if (isFunction(a2)) {
+ if (isFunction(a1)) {
+ success = a1;
+ error = a2;
+ break;
+ }
+
+ success = a2;
+ error = a3;
+ //fallthrough
+ } else {
+ params = a1;
+ data = a2;
+ success = a3;
+ break;
+ }
+ case 1:
+ if (isFunction(a1)) success = a1;
+ else if (hasBody) data = a1;
+ else params = a1;
+ break;
+ case 0: break;
+ default:
+ throw $resourceMinErr('badargs',
+ "Expected up to 4 arguments [params, data, success, error], got {0} arguments",
+ arguments.length);
+ }
+ /* jshint +W086 */ /* (purposefully fall through case statements) */
+
+ var isInstanceCall = this instanceof Resource;
+ var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
+ var httpConfig = {};
+ var responseInterceptor = action.interceptor && action.interceptor.response ||
+ defaultResponseInterceptor;
+ var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||
+ undefined;
+ var timeoutDeferred;
+ var numericTimeoutPromise;
+
+ forEach(action, function(value, key) {
+ switch (key) {
+ default:
+ httpConfig[key] = copy(value);
+ break;
+ case 'params':
+ case 'isArray':
+ case 'interceptor':
+ case 'cancellable':
+ break;
+ }
+ });
+
+ if (!isInstanceCall && cancellable) {
+ timeoutDeferred = $q.defer();
+ httpConfig.timeout = timeoutDeferred.promise;
+
+ if (numericTimeout) {
+ numericTimeoutPromise = $timeout(timeoutDeferred.resolve, numericTimeout);
+ }
+ }
+
+ if (hasBody) httpConfig.data = data;
+ route.setUrlParams(httpConfig,
+ extend({}, extractParams(data, action.params || {}), params),
+ action.url);
+
+ var promise = $http(httpConfig).then(function(response) {
+ var data = response.data;
+
+ if (data) {
+ // Need to convert action.isArray to boolean in case it is undefined
+ // jshint -W018
+ if (angular.isArray(data) !== (!!action.isArray)) {
+ throw $resourceMinErr('badcfg',
+ 'Error in resource configuration for action `{0}`. Expected response to ' +
+ 'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object',
+ angular.isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url);
+ }
+ // jshint +W018
+ if (action.isArray) {
+ value.length = 0;
+ forEach(data, function(item) {
+ if (typeof item === "object") {
+ value.push(new Resource(item));
+ } else {
+ // Valid JSON values may be string literals, and these should not be converted
+ // into objects. These items will not have access to the Resource prototype
+ // methods, but unfortunately there
+ value.push(item);
+ }
+ });
+ } else {
+ var promise = value.$promise; // Save the promise
+ shallowClearAndCopy(data, value);
+ value.$promise = promise; // Restore the promise
+ }
+ }
+ response.resource = value;
+
+ return response;
+ }, function(response) {
+ (error || noop)(response);
+ return $q.reject(response);
+ });
+
+ promise['finally'](function() {
+ value.$resolved = true;
+ if (!isInstanceCall && cancellable) {
+ value.$cancelRequest = angular.noop;
+ $timeout.cancel(numericTimeoutPromise);
+ timeoutDeferred = numericTimeoutPromise = httpConfig.timeout = null;
+ }
+ });
+
+ promise = promise.then(
+ function(response) {
+ var value = responseInterceptor(response);
+ (success || noop)(value, response.headers);
+ return value;
+ },
+ responseErrorInterceptor);
+
+ if (!isInstanceCall) {
+ // we are creating instance / collection
+ // - set the initial promise
+ // - return the instance / collection
+ value.$promise = promise;
+ value.$resolved = false;
+ if (cancellable) value.$cancelRequest = timeoutDeferred.resolve;
+
+ return value;
+ }
+
+ // instance call
+ return promise;
+ };
+
+
+ Resource.prototype['$' + name] = function(params, success, error) {
+ if (isFunction(params)) {
+ error = success; success = params; params = {};
+ }
+ var result = Resource[name].call(this, params, this, success, error);
+ return result.$promise || result;
+ };
+ });
+
+ Resource.bind = function(additionalParamDefaults) {
+ return resourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);
+ };
+
+ return Resource;
+ }
+
+ return resourceFactory;
+ }];
+ });
+
+
+})(window, window.angular);
diff --git a/old/moon_dashboard/moon/static/moon/js/import.service.js b/old/moon_dashboard/moon/static/moon/js/import.service.js
new file mode 100755
index 00000000..d55c8a19
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/js/import.service.js
@@ -0,0 +1,27 @@
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('moon')
+ .factory('moon.import.service', importService);
+
+ importService.$inject = ['moon.util.service', '$resource', 'moon.URI'];
+
+ function importService(util, $resource, URI) {
+ var host = URI.API;
+ var importResource = $resource(host + '/import/', {}, {
+ create: { method: 'POST' },
+ });
+
+ return {
+ importData: function importData(data) {
+ return importResource.create(null, data).$promise.then(success, util.displayErrorFunction('Unable to import data'));
+
+ function success(data) {
+ util.displaySuccess('Data imported');
+ }
+ }
+ }
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/js/moon.module.js b/old/moon_dashboard/moon/static/moon/js/moon.module.js
new file mode 100755
index 00000000..c8b86439
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/js/moon.module.js
@@ -0,0 +1,29 @@
+/**
+# Copyright 2015 Orange
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+ */
+
+(function () {
+
+ 'use strict';
+
+ var moon = angular
+
+ .module('moon', [
+ 'ngResource',
+ ]).constant('moon.URI', {
+ API: 'http://{{MANAGER_HOST}}:{{MANAGER_PORT}}',
+ })
+
+})();
diff --git a/old/moon_dashboard/moon/static/moon/js/util.service.js b/old/moon_dashboard/moon/static/moon/js/util.service.js
new file mode 100755
index 00000000..29680a43
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/js/util.service.js
@@ -0,0 +1,140 @@
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('moon')
+ .factory('moon.util.service', utilService);
+
+ utilService.$inject = ['horizon.framework.widgets.toast.service'];
+
+ function utilService(toast) {
+
+
+ return {
+ mapToArray: function mapToArray(map, action) {
+ var result = []
+ for (var key in map) {
+ if (map.hasOwnProperty(key)) {
+ var item = map[key];
+ item.id = key;
+ if (action != null) {
+ action(item);
+ }
+ result.push(item);
+ }
+ }
+ return result;
+ },
+
+ mapIdToItem: function mapIdToItem(array, map) {
+ if (array) {
+ for (var index = 0; index < array.length; index++) {
+ var id = array[index];
+ array[index] = map[id];
+ }
+ }
+ },
+
+ mapItemToId: function mapItemToId(array) {
+ if (array) {
+ for (var index = 0; index < array.length; index++) {
+ var item = array[index];
+ array[index] = item.id;
+ }
+ }
+ },
+
+ addToMap: function addToMap(array, map) {
+ if (array) {
+ for (var index = 0; index < array.length; index++) {
+ var item = array[index];
+ map[item.id] = item;
+ }
+ }
+ },
+
+ updateObject: function updateObject(object, newObject) {
+ for (var key in newObject) {
+ if (newObject.hasOwnProperty(key)) {
+ object[key] = newObject[key];
+ }
+ }
+ },
+
+ cleanObject: function cleanObject(object) {
+ for (var key in object) {
+ if (object.hasOwnProperty(key)) {
+ delete object[key];
+ }
+ }
+ },
+
+ pushAll: function pushAll(array, arrayToPush) {
+ Array.prototype.push.apply(array, arrayToPush);
+ },
+
+ indexOf: function indexOf(array, property, value) {
+ for (var i = 0; i < array.length; i += 1) {
+ if (array[i][property] === value) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ createInternal: function createInternal(data, array, map, action) {
+ var added = this.mapToArray(data, action)
+ this.addToMap(added, map);
+ this.pushAll(array, added);
+ return added;
+ },
+
+ updateInternal: function updateInternal(data, map, action) {
+ var updated = this.mapToArray(data, action)
+ var result = []
+ for (var index = 0; index < updated.length; index++) {
+ var item = updated[index];
+ this.updateObject(map[item.id], item)
+ result.push(map[item.id])
+ }
+ return result;
+ },
+
+ removeInternal: function removeInternal(id, array, map) {
+ var old = map[id];
+ delete map[old.id];
+ array.splice(array.indexOf(old), 1);
+ return old;
+ },
+
+ arrayToTitleMap: function arrayToTitleMap(array) {
+ return array.map(function (item) {
+ return { value: item.id, name: item.name }
+ }).sort(function (itemA, itemB) {
+ return itemA.name.localeCompare(itemB.name);
+ })
+ },
+
+ displayErrorFunction: function displayErrorFunction(message) {
+ return function(response) {
+ var text = gettext(message);
+ if (response && response.data && response.data.message) {
+ text += ' (' + response.data.message + ')'
+ }
+ toast.add('error', text);
+ }
+ },
+
+ displaySuccess: function displaySuccess(message) {
+ toast.add('success', gettext(message));
+ },
+
+ displayError: function displayError(message) {
+ toast.add('error', gettext(message));
+ },
+
+ }
+
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/js/util.service.spec.js b/old/moon_dashboard/moon/static/moon/js/util.service.spec.js
new file mode 100755
index 00000000..d8e3ed31
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/js/util.service.spec.js
@@ -0,0 +1,86 @@
+(function () {
+ 'use strict';
+
+ describe('moon.util.service', function () {
+ var service;
+
+ beforeEach(module('horizon.app.core'));
+ beforeEach(module('horizon.framework'));
+ beforeEach(module('moon'));
+
+ beforeEach(inject(function ($injector) {
+ service = $injector.get('moon.util.service');
+ }));
+
+ it('should push all', function () {
+ var a1 = [0, 1, 2];
+ var a2 = [3, 4];
+ service.pushAll(a1, a2)
+
+ expect(a1.length).toBe(5);
+ expect(a1).toEqual([0, 1, 2, 3, 4]);
+ });
+
+ it('should index of', function () {
+ var a = [{ name: 'n0' }, { name: 'n1' }, { name: 'n2' }];
+ var result = service.indexOf(a, 'name', 'n1');
+
+ expect(result).toBe(1);
+ });
+
+ it('should map to array', function () {
+ var map = { "a": { name: "a" }, "b": { name: "b" } };
+ var result = service.mapToArray(map);
+
+ expect(result.length).toBe(2);
+ });
+
+ it('should map ID to item', function () {
+ var map = { "a": { name: "a" }, "b": { name: "b" } };
+ var array = ["a", "b"];
+ service.mapIdToItem(array, map);
+
+ expect(array.length).toBe(2);
+ expect(array[0].name).toBe("a");
+ expect(array[1].name).toBe("b");
+ });
+
+ it('should map item to ID', function () {
+ var array = [{ id: "a" }, { id: "b" }];
+ service.mapItemToId(array);
+
+ expect(array.length).toBe(2);
+ expect(array[0]).toBe("a");
+ expect(array[1]).toBe("b");
+ });
+
+ it('should add to map', function () {
+ var map = { "a": { name: "a" }, "b": { name: "b" } };
+ var array = [{ id: "c" }];
+ service.addToMap(array, map);
+
+ expect(map.c).toEqual({ id: "c" });
+ });
+
+ it('should update object', function () {
+ var object = { a: 1, b: "test" };
+ var update = { a: 2, c: "test2" };
+ service.updateObject(object, update);
+
+ expect(object.a).toBe(2);
+ expect(object.b).toBe("test");
+ expect(object.c).toBe("test2");
+ });
+
+ it('should clean object', function () {
+ var object = { a: 1, b: "test" };
+ service.cleanObject(object);
+
+ expect(object.a).not.toBeDefined();
+ expect(object.b).not.toBeDefined();
+ expect(object).toEqual({});
+ });
+ });
+
+
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/model/model.controller.js b/old/moon_dashboard/moon/static/moon/model/model.controller.js
new file mode 100644
index 00000000..99a7c7ed
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/model/model.controller.js
@@ -0,0 +1,316 @@
+(function () {
+ 'use strict';
+
+ angular
+ .module('moon')
+ .directive('onReadFile', directive)
+ .controller('moon.model.controller', controller);
+
+ controller.$inject = ['moon.util.service', 'moon.model.service', 'moon.import.service', 'horizon.framework.widgets.form.ModalFormService'];
+
+ directive.$inject = ['$parse'];
+
+ function directive($parse) {
+ return {
+ restrict: 'A',
+ scope: false,
+ link: function (scope, element, attrs) {
+ element.bind('change', function (e) {
+
+ var onFileRead = $parse(attrs.onReadFile);
+ var reader = new FileReader();
+
+ reader.onload = function () {
+ var fileContents = reader.result;
+ scope.$apply(function () {
+ onFileRead(scope, {
+ 'contents': fileContents
+ });
+ });
+ };
+ reader.readAsText(element[0].files[0]);
+ });
+ }
+ };
+ }
+
+ var categoryMap = {
+ 'subject': {
+ addTitle: 'Add Subject Category',
+ removeTitleFromMetaRule: 'Are you sure to remove from meta rule this Subject Category?',
+ removeTitle: 'Are you sure to remove this Subject Category?',
+ listName: 'subject_categories',
+ serviceListName: 'subjectCategories'
+ },
+ 'object': {
+ addTitle: 'Add Object Category',
+ removeTitleFromMetaRule: 'Are you sure to remove from meta rule this Object Category?',
+ removeTitle: 'Are you sure to remove this Object Category?',
+ listName: 'object_categories',
+ serviceListName: 'objectCategories'
+ },
+ 'action': {
+ addTitle: 'Add Action Category',
+ removeTitleFromMetaRule: 'Are you sure to remove from meta rule this Action Category?',
+ removeTitle: 'Are you sure to remove this Action Category?',
+ listName: 'action_categories',
+ serviceListName: 'actionCategories'
+ },
+ }
+
+ function controller(util, modelService, importService, ModalFormService) {
+ var self = this;
+ self.model = modelService;
+ self.showOrphan = false;
+ modelService.initialize();
+
+ self.importData = function importData(text) {
+ horizon.modals.modal_spinner(gettext("Loading"))
+ importService.importData(JSON.parse(text)).then(function () {
+ modelService.initialize();
+ horizon.modals.spinner.modal('hide');
+ })
+ }
+
+ self.createModel = function createModel() {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ },
+ required: ['name', 'description']
+ };
+ var model = { name: '', description: '' };
+ var config = {
+ title: gettext('Create Model'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: model
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ modelService.createModel(form.model);
+ }
+ }
+
+ self.updateModel = function updateModel(model) {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ },
+ required: ['name', 'description']
+ };
+ var config = {
+ title: gettext('Update Model'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: angular.copy(model)
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ modelService.updateModel(form.model);
+ }
+ }
+
+ self.removeModel = function removeModel(model) {
+ if (confirm(gettext('Are you sure to delete this Model?')))
+ modelService.removeModel(model);
+ }
+
+ self.createMetaRuleFunction = function createMetaRuleFunction(model, titleMap) {
+ return function () {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") },
+ },
+ required: ['name', 'description']
+ };
+ var metaRule = { name: '', description: '' };
+ var config = {
+ title: gettext('Create Meta Rule'),
+ schema: schema,
+ form: [
+ 'name',
+ { key: 'description', type: 'textarea' }
+ ],
+ model: metaRule
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ modelService.createMetaRule(form.model).then(function (metaRule) {
+ titleMap.push({ value: metaRule.id, name: metaRule.name })
+ model.id = metaRule.id
+ })
+ }
+ }
+ }
+
+ self.addMetaRule = function addMetaRule(model) {
+ var schema = {
+ type: "object",
+ properties: {
+ id: { type: "string", title: gettext("Select a Meta Rule:") }
+ },
+ required: ['id']
+ };
+ var titleMap = util.arrayToTitleMap(modelService.metaRules)
+ var formModel = { id: null }
+ var config = {
+ title: gettext('Add Meta Rule'),
+ schema: schema,
+ form: [
+ { key: 'id', type: 'select', titleMap: titleMap },
+ {
+ key: 'createButton',
+ type: 'button',
+ title: gettext('Create Meta Rule'),
+ icon: 'fa fa-plus',
+ onClick: self.createMetaRuleFunction(formModel, titleMap)
+ }
+ ],
+ model: formModel
+ };
+ if (modelService.metaRules.length == 1) {
+ formModel.id = modelService.metaRules[0].id
+ }
+
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var metaRule = modelService.getMetaRule(form.model.id);
+ var modelCopy = angular.copy(model);
+ modelCopy.meta_rules.push(metaRule);
+ modelService.updateModel(modelCopy);
+ }
+ }
+
+ self.updateMetaRule = function updateMetaRule(metaRule) {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ },
+ required: ['name', 'description']
+ };
+ var metaRuleCopy = angular.copy(metaRule);
+ var config = {
+ title: gettext('Update Meta Rule'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: metaRuleCopy
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ modelService.updateMetaRule(form.model);
+ }
+ }
+
+ self.removeMetaRuleFromModel = function removeMetaRuleFromModel(model, metaRule) {
+ if (confirm(gettext('Are you sure to remove this Meta Rule from model?'))) {
+ var modelCopy = angular.copy(model);
+ modelCopy.meta_rules.splice(model.meta_rules.indexOf(metaRule), 1);
+ modelService.updateModel(modelCopy);
+ }
+ }
+
+ self.removeMetaRule = function removeMetaRule(metaRule) {
+ if (confirm(gettext('Are you sure to remove this Meta Rule?'))) {
+ modelService.removeMetaRule(metaRule);
+ }
+ }
+
+ self.createCategoryFunction = function createCategoryFunction(type, formModel, titleMap) {
+ return function () {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") },
+ },
+ required: ['name', 'description']
+ };
+ var metaRule = { name: '', description: '' };
+ var config = {
+ title: gettext('Create Category'),
+ schema: schema,
+ form: [
+ 'name',
+ { key: 'description', type: 'textarea' }
+ ],
+ model: metaRule
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ modelService.createCategory(type, form.model).then(function (category) {
+ titleMap.push({ value: category.id, name: category.name })
+ formModel.id = category.id
+ })
+ }
+ }
+ }
+
+ self.addCategory = function addCategory(type, metaRule) {
+ var typeValue = categoryMap[type];
+ var schema = {
+ type: "object",
+ properties: {
+ id: { type: "string", title: gettext("Select a Category:") }
+ },
+ required: ['id']
+ };
+ var titleMap = util.arrayToTitleMap(modelService[typeValue.serviceListName])
+ var formModel = { id: null }
+ var config = {
+ title: gettext(typeValue.addTitle),
+ schema: schema,
+ form: [
+ { key: 'id', type: 'select', titleMap: titleMap },
+ {
+ key: 'createButton',
+ type: 'button',
+ title: gettext('Create Category'),
+ icon: 'fa fa-plus',
+ onClick: self.createCategoryFunction(type, formModel, titleMap)
+ }],
+ model: formModel
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var category = modelService.getCategory(type, form.model.id);
+ var metaRuleCopy = angular.copy(metaRule);
+ metaRuleCopy[typeValue.listName].push(category);
+ modelService.updateMetaRule(metaRuleCopy)
+ }
+ }
+
+ self.removeCategoryFromMetaRule = function removeCategoryFromMetaRule(type, metaRule, category) {
+ var typeValue = categoryMap[type];
+ if (confirm(gettext(typeValue.removeTitleFromMetaRule))) {
+ var metaRuleCopy = angular.copy(metaRule);
+ metaRuleCopy[typeValue.listName].splice(metaRule[typeValue.listName].indexOf(category), 1);
+ modelService.updateMetaRule(metaRuleCopy);
+ }
+ }
+
+ self.removeCategory = function removeCategory(type, category) {
+ var typeValue = categoryMap[type];
+ if (confirm(gettext(typeValue.removeTitle))) {
+ modelService.removeCategory(type, category);
+ }
+ }
+
+
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/model/model.html b/old/moon_dashboard/moon/static/moon/model/model.html
new file mode 100644
index 00000000..97f08910
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/model/model.html
@@ -0,0 +1,139 @@
+<div ng-controller="moon.model.controller as ctrl">
+ <div ng-if="ctrl.model.orphanMetaRules.length
+ || ctrl.model.orphanSubjectCategories.length
+ || ctrl.model.orphanActionCategories.length
+ || ctrl.model.orphanObjectCategories.length" class="alert alert-dismissable alert-warning">
+ <button type="button" class="close" data-dismiss="alert" ng-click="ctrl.showOrphan=false">×</button>
+ <h4 translate>Warning!</h4>
+ <p translate>
+ Some metarules or categories are orphan, please check them and delete them if necessary.
+ <a href="" ng-click="ctrl.showOrphan=true" ng-show="!ctrl.showOrphan" translate>Show orphans</a>
+ <a href="" ng-click="ctrl.showOrphan=false" ng-show="ctrl.showOrphan" translate>Hide orphans</a>
+ </p>
+ </div>
+
+ <div class="row" ng-show="ctrl.showOrphan">
+ <div class="list-group col-lg-3" ng-if="ctrl.model.orphanMetaRules.length">
+ <h3 class="list-group-item active" translate>Orphan Meta rules</h3>
+ <div ng-repeat="metaRule in ctrl.model.orphanMetaRules | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline">{$ metaRule.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeMetaRule(metaRule)" title="{$ 'Remove Meta rule' | translate $}"></button>
+ <p class="list-group-item-text">{$ metaRule.description $}</p>
+ </div>
+ </div>
+
+ <div class="list-group col-lg-3" ng-if="ctrl.model.orphanSubjectCategories.length">
+ <h3 class="list-group-item active" translate>Orphan Subject categories</h3>
+ <div ng-repeat="subject in ctrl.model.orphanSubjectCategories | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline">{$ subject.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeCategory('subject', subject)" title="{$ 'Remove Subject category' | translate $}"></button>
+ <p class="list-group-item-text">{$ subject.description $}</p>
+ </div>
+ </div>
+
+ <div class="list-group col-lg-3" ng-if="ctrl.model.orphanObjectCategories.length">
+ <h3 class="list-group-item active" translate>Orphan Object categories</h3>
+ <div ng-repeat="object in ctrl.model.orphanObjectCategories | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline">{$ object.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeCategory('object', object)" title="{$ 'Remove Object category' | translate $}"></button>
+ <p class="list-group-item-text">{$ object.description $}</p>
+ </div>
+ </div>
+
+ <div class="list-group col-lg-3" ng-if="ctrl.model.orphanActionCategories.length">
+ <h3 class="list-group-item active" translate>Orphan Action categories</h3>
+ <div ng-repeat="action in ctrl.model.orphanActionCategories | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline">{$ action.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeCategory('action', action)" title="{$ 'Remove Action category' | translate $}"></button>
+ <p class="list-group-item-text">{$ action.description $}</p>
+ </div>
+ </div>
+ </div>
+
+ <div class="clearfix list-group">
+ <div class="pull-right">
+ <input type="search" class="form-control filter" placeholder="Filter" ng-model="filterText">
+ <button type="button" class="btn btn-default" ng-click="ctrl.createModel()">
+ <span class="fa fa-plus"></span>
+ <translate>Create Model</translate>
+ </button>
+ <label for="file" class="label-file btn btn-primary">
+ <span class="fa fa-upload"></span>
+ <translate>Import</translate>
+ </label>
+ <input id="file" class="input-file" type="file" on-read-file="ctrl.importData(contents)" accept="application/json,.json"/>
+ </div>
+ </div>
+
+
+ <div class="list-group">
+ <div ng-repeat="model in ctrl.model.models | orderBy:'name' | filter:filterText " class="list-group-item">
+ <h3 class="list-group-item-heading inline">{$ model.name $}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash" ng-click="ctrl.removeModel(model)" title="{$ 'Remove Model' | translate $}"></button>
+ <button type="button" class="fa fa-edit" ng-click="ctrl.updateModel(model)" title="{$ 'Edit Model' | translate $}"></button>
+ </div>
+ <p class="list-group-item-text">{$ model.description $}</p>
+ <details class="list-group-item-text">
+ <summary>
+ <h4 class="inline">{$ model.meta_rules.length $}
+ <translate>meta rule(s)</translate>
+ </h4>
+ <button type="button" class="fa fa-plus " ng-click="ctrl.addMetaRule(model)" title="{$ 'Add Meta Rule' | translate $}"></button>
+ </summary>
+ <div class="list-group">
+ <div ng-repeat="metaRule in model.meta_rules | orderBy:'name'" class="list-group-item">
+ <h3 class="list-group-item-heading inline">{$ metaRule.name $}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash" ng-click="ctrl.removeMetaRuleFromModel(model, metaRule)" title="{$ 'Remove Meta Rule' | translate $}"></button>
+ <button type="button" class="fa fa-edit" ng-click="ctrl.updateMetaRule(metaRule)" title="{$ 'Edit Meta Rule' | translate $}"></button>
+ </div>
+ <p class="list-group-item-text">{$ metaRule.description $}</p>
+ <p class="list-group-item-text">
+ <table class="table categories">
+ <thead>
+ <tr>
+ <th>
+ <span translate>Subjects</span>
+ <button type="button" class="fa fa-plus pull-right" ng-click="ctrl.addCategory('subject', metaRule)" title="{$ 'Add Subject' | translate $}"></button>
+ </th>
+ <th>
+ <span translate>Objects</span>
+ <button type="button" class="fa fa-plus pull-right" ng-click="ctrl.addCategory('object', metaRule)" title="{$ 'Add Object' | translate $}"></button>
+ </th>
+ <th>
+ <span translate>Actions</span>
+ <button type="button" class="fa fa-plus pull-right" ng-click="ctrl.addCategory('action', metaRule)" title="{$ 'Add Action' | translate $}"></button>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p ng-repeat="category in metaRule.subject_categories">
+ <span title="{$ category.description $}">{$ category.name $}</span>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeCategoryFromMetaRule('subject', metaRule, category)" title="{$ 'Remove Subject' | translate $}"></button>
+ </p>
+ </td>
+ <td>
+ <p ng-repeat="category in metaRule.object_categories">
+ <span title="{$ category.description $}">{$ category.name $}</span>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeCategoryFromMetaRule('object', metaRule, category)" title="{$ 'Remove Object' | translate $}"></button>
+ </p>
+ </td>
+ <td>
+ <p ng-repeat="category in metaRule.action_categories">
+ <span title="{$ category.description $}">{$ category.name $}</span>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeCategoryFromMetaRule('action', metaRule, category)" title="{$ 'Remove Action' | translate $}"></button>
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </p>
+ </div>
+ </div>
+ </details>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/model/model.service.js b/old/moon_dashboard/moon/static/moon/model/model.service.js
new file mode 100755
index 00000000..986eb6b1
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/model/model.service.js
@@ -0,0 +1,291 @@
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('moon')
+ .factory('moon.model.service', modelService);
+
+ modelService.$inject = ['moon.util.service', '$resource', 'moon.URI', '$q'];
+
+ function modelService(util, $resource, URI, $q) {
+ var host = URI.API;
+ var modelResource = $resource(host + '/models/' + ':id', {}, {
+ get: { method: 'GET' },
+ query: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' },
+ update: { method: 'PATCH' }
+ });
+
+ var metaRuleResource = $resource(host + '/meta_rules/' + ':id', {}, {
+ query: { method: 'GET' },
+ get: { method: 'GET' },
+ update: { method: 'PATCH' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ });
+
+ var subjectCategoryResource = $resource(host + '/subject_categories/' + ':id', {}, {
+ query: { method: 'GET' },
+ get: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ });
+
+ var objectCategoryResource = $resource(host + '/object_categories/' + ':id', {}, {
+ query: { method: 'GET' },
+ get: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ });
+
+ var actionCategoryResource = $resource(host + '/action_categories/' + ':id', {}, {
+ query: { method: 'GET' },
+ get: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ });
+
+ var modelsMap = {};
+ var metaRulesMap = {};
+ var subjectCategoriesMap = {};
+ var objectCategoriesMap = {};
+ var actionCategoriesMap = {};
+ var models = [];
+ var metaRules = [];
+ var orphanMetaRules = [];
+ var subjectCategories = [];
+ var objectCategories = [];
+ var actionCategories = [];
+ var orphanSubjectCategories = [];
+ var orphanObjectCategories = [];
+ var orphanActionCategories = [];
+
+ var categoryMap = {
+ 'subject': {
+ resource: subjectCategoryResource,
+ map: subjectCategoriesMap,
+ list: subjectCategories,
+ listName: 'subject_categories'
+ },
+ 'object': {
+ resource: objectCategoryResource,
+ map: objectCategoriesMap,
+ list: objectCategories,
+ listName: 'object_categories'
+ },
+ 'action': {
+ resource: actionCategoryResource,
+ map: actionCategoriesMap,
+ list: actionCategories,
+ listName: 'action_categories'
+ }
+ }
+
+ function loadModels() {
+ var queries = {
+ subjectCategories: subjectCategoryResource.query().$promise,
+ objectCategories: objectCategoryResource.query().$promise,
+ actionCategories: actionCategoryResource.query().$promise,
+ metaRules: metaRuleResource.query().$promise,
+ models: modelResource.query().$promise,
+ }
+
+ var result = $q.all(queries).then(function (result) {
+ createModels(result.models, result.metaRules, result.subjectCategories, result.objectCategories, result.actionCategories)
+ console.log('moon', 'models initialized')
+ })
+
+ return result;
+ }
+
+ function createModels(modelsData, metarulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData) {
+ util.cleanObject(modelsMap);
+ util.cleanObject(metaRulesMap);
+ util.cleanObject(subjectCategoriesMap);
+ util.cleanObject(objectCategoriesMap);
+ util.cleanObject(actionCategoriesMap);
+ models.splice(0, models.length);
+ metaRules.splice(0, metaRules.length);
+ subjectCategories.splice(0, subjectCategories.length);
+ objectCategories.splice(0, objectCategories.length);
+ actionCategories.splice(0, actionCategories.length);
+ if (subjectCategoriesData.subject_categories) createCategoryInternal('subject', subjectCategoriesData.subject_categories);
+ if (objectCategoriesData.object_categories) createCategoryInternal('object', objectCategoriesData.object_categories);
+ if (actionCategoriesData.action_categories) createCategoryInternal('action', actionCategoriesData.action_categories);
+ if (metarulesData.meta_rules) createMetaRuleInternal(metarulesData.meta_rules);
+ if (modelsData.models) createModelInternal(modelsData.models);
+ updateOrphan();
+ }
+
+ function mapModel(model) {
+ util.mapIdToItem(model.meta_rules, metaRulesMap);
+ }
+
+ function createModelInternal(data) {
+ return util.createInternal(data, models, modelsMap, mapModel);
+ }
+
+ function updateModelInternal(data) {
+ return util.updateInternal(data, modelsMap, mapModel);
+ }
+
+ function removeModelInternal(id) {
+ return util.removeInternal(id, models, modelsMap);
+ }
+
+ function mapMetaRule(metaRule) {
+ util.mapIdToItem(metaRule.subject_categories, subjectCategoriesMap);
+ util.mapIdToItem(metaRule.object_categories, objectCategoriesMap);
+ util.mapIdToItem(metaRule.action_categories, actionCategoriesMap);
+ }
+
+ function createMetaRuleInternal(data) {
+ return util.createInternal(data, metaRules, metaRulesMap, mapMetaRule);
+ }
+
+ function updateMetaRuleInternal(data) {
+ return util.updateInternal(data, metaRulesMap, mapMetaRule);
+ }
+
+ function removeMetaRuleInternal(id) {
+ return util.removeInternal(id, metaRules, metaRulesMap);
+ }
+
+ function createCategoryInternal(type, data) {
+ var categoryValue = categoryMap[type];
+ return util.createInternal(data, categoryValue.list, categoryValue.map)
+ }
+
+ function removeCategoryInternal(type, id) {
+ var categoryValue = categoryMap[type];
+ return util.removeInternal(id, categoryValue.list, categoryValue.map);
+ }
+
+ function updateOrphan() {
+ updateOrphanInternal(metaRules, orphanMetaRules, models, "meta_rules");
+ updateOrphanInternal(subjectCategories, orphanSubjectCategories, metaRules, "subject_categories");
+ updateOrphanInternal(objectCategories, orphanObjectCategories, metaRules, "object_categories");
+ updateOrphanInternal(actionCategories, orphanActionCategories, metaRules, "action_categories");
+ }
+
+ function updateOrphanInternal(list, orphanList, parentList, childListName) {
+ orphanList.splice(0, orphanList.length);
+ util.pushAll(orphanList, list);
+ for (var i = 0; i < parentList.length; i++) {
+ var parent = parentList[i];
+ var children = parent[childListName];
+ if (children) {
+ for (var j = 0; j < children.length; j++) {
+ var child = children[j];
+ var notOrphanIndex = util.indexOf(orphanList, "id", child.id);
+ if (notOrphanIndex >= 0) {
+ orphanList.splice(notOrphanIndex, 1);
+ }
+ }
+ }
+ }
+ }
+
+
+ return {
+ initialize: loadModels,
+ createModels: createModels,
+ models: models,
+ metaRules: metaRules,
+ orphanMetaRules: orphanMetaRules,
+ orphanSubjectCategories: orphanSubjectCategories,
+ orphanObjectCategories: orphanObjectCategories,
+ orphanActionCategories: orphanActionCategories,
+ subjectCategories: subjectCategories,
+ objectCategories: objectCategories,
+ actionCategories: actionCategories,
+ getModel: function getModel(id) {
+ return modelsMap[id];
+ },
+ createModel: function createModel(model) {
+ model.meta_rules = [];
+ modelResource.create(null, model, success, util.displayErrorFunction('Unable to create model'));
+
+ function success(data) {
+ createModelInternal(data.models);
+ util.displaySuccess('Model created');
+ }
+ },
+ removeModel: function removeModel(model) {
+ modelResource.remove({ id: model.id }, null, success, util.displayErrorFunction('Unable to remove model'));
+
+ function success(data) {
+ removeModelInternal(model.id);
+ updateOrphan();
+ util.displaySuccess('Model removed');
+ }
+ },
+ updateModel: function updateModel(model) {
+ util.mapItemToId(model.meta_rules)
+ modelResource.update({ id: model.id }, model, success, util.displayErrorFunction('Unable to update model'));
+
+ function success(data) {
+ updateModelInternal(data.models)
+ updateOrphan();
+ util.displaySuccess('Model updated');
+ }
+ },
+ getMetaRule: function getMetaRule(id) {
+ return metaRulesMap[id];
+ },
+ createMetaRule: function createMetaRule(metaRule) {
+ metaRule.subject_categories = [];
+ metaRule.object_categories = [];
+ metaRule.action_categories = [];
+
+ return metaRuleResource.create(null, metaRule).$promise.then(function (data) {
+ util.displaySuccess('Meta Rule created');
+ return createMetaRuleInternal(data.meta_rules)[0];
+ }, util.displayErrorFunction('Unable to create meta rule'))
+ },
+ updateMetaRule: function updateMetaRule(metaRule) {
+ util.mapItemToId(metaRule.subject_categories);
+ util.mapItemToId(metaRule.object_categories);
+ util.mapItemToId(metaRule.action_categories);
+ metaRuleResource.update({ id: metaRule.id }, metaRule, success, util.displayErrorFunction('Unable to update meta rule'));
+
+ function success(data) {
+ updateMetaRuleInternal(data.meta_rules);
+ updateOrphan();
+ util.displaySuccess('Meta Rule updated');
+ }
+ },
+ removeMetaRule: function removeMetaRule(metaRule) {
+ metaRuleResource.remove({ id: metaRule.id }, null, success, util.displayErrorFunction('Unable to remove meta rule'));
+
+ function success(data) {
+ removeMetaRuleInternal(metaRule.id);
+ updateOrphan();
+ util.displaySuccess('Meta Rule removed');
+ }
+ },
+ getCategory: function getCategory(type, id) {
+ return categoryMap[type].map[id];
+ },
+ createCategory: function createCategory(type, category) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.resource.create({}, category).$promise.then(function (data) {
+ util.displaySuccess('Category created');
+ return createCategoryInternal(type, data[categoryValue.listName])[0];
+ }, util.displayErrorFunction('Unable to create category'))
+ },
+ removeCategory: function removeCategory(type, category) {
+ var categoryValue = categoryMap[type];
+ categoryValue.resource.remove({ id: category.id }, null, success, util.displayErrorFunction('Unable to remove category'));
+
+ function success(data) {
+ removeCategoryInternal(type, category.id);
+ updateOrphan();
+ util.displaySuccess('Category removed');
+ }
+ },
+ }
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/model/model.service.spec.js b/old/moon_dashboard/moon/static/moon/model/model.service.spec.js
new file mode 100755
index 00000000..04d47793
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/model/model.service.spec.js
@@ -0,0 +1,288 @@
+(function () {
+ 'use strict';
+
+ describe('moon.model.service', function () {
+ var service, $httpBackend, URI;
+ var modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData;
+
+ function initData() {
+ modelsData = {
+ models:
+ { 'modelId1': { name: 'model1', description: 'mDescription1', meta_rules: ['metaRuleId1'] } }
+ };
+
+ subjectCategoriesData = {
+ subject_categories:
+ {
+ 'subjectCategoryId1': { name: 'subjectCategory1', description: 'scDescription1' },
+ 'subjectCategoryId2': { name: 'subjectCategory2', description: 'scDescription2' }
+ },
+ };
+ objectCategoriesData = {
+ object_categories:
+ {
+ 'objectCategoryId1': { name: 'objectCategory1', description: 'ocDescription1' },
+ 'objectCategoryId2': { name: 'objectCategory2', description: 'ocDescription2' }
+ }
+ };
+ actionCategoriesData = {
+ action_categories:
+ {
+ 'actionCategoryId1': { name: 'actionCategory1', description: 'acDescription1' },
+ 'actionCategoryId2': { name: 'actionCategory2', description: 'acDescription2' }
+ }
+ };
+ metaRulesData = {
+ meta_rules:
+ {
+ 'metaRuleId1': { name: 'metaRule1', description: 'mrDescription1', subject_categories: ['subjectCategoryId1'], object_categories: ['objectCategoryId1'], action_categories: ['actionCategoryId1'] },
+ 'metaRuleId2': { name: 'metaRule2', description: 'mrDescription2', subject_categories: [], object_categories: [], action_categories: [] }
+ }
+ };
+ }
+
+ beforeEach(module('horizon.app.core'));
+ beforeEach(module('horizon.framework'));
+ beforeEach(module('moon'));
+
+ beforeEach(inject(function ($injector) {
+ service = $injector.get('moon.model.service');
+ $httpBackend = $injector.get('$httpBackend');
+ URI = $injector.get('moon.URI');
+ }));
+
+ afterEach(function () {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ it('should initialize', function () {
+ initData();
+ $httpBackend.expectGET(URI.API + '/subject_categories').respond(200, subjectCategoriesData);
+ $httpBackend.expectGET(URI.API + '/object_categories').respond(200, objectCategoriesData);
+ $httpBackend.expectGET(URI.API + '/action_categories').respond(200, actionCategoriesData);
+ $httpBackend.expectGET(URI.API + '/meta_rules').respond(200, metaRulesData);
+ $httpBackend.expectGET(URI.API + '/models').respond(200, modelsData);
+
+ service.initialize();
+ $httpBackend.flush();
+
+ expect(service.models.length).toBe(1);
+ var model = service.models[0];
+ expect(model.id).toBe('modelId1');
+ expect(model.name).toBe('model1');
+ expect(model.description).toBe('mDescription1');
+
+ expect(service.metaRules.length).toBe(2);
+ expect(model.meta_rules.length).toBe(1);
+ var metaRule = model.meta_rules[0];
+ expect(metaRule.id).toBe('metaRuleId1');
+ expect(metaRule.name).toBe('metaRule1');
+ expect(metaRule.description).toBe('mrDescription1');
+
+ expect(service.subjectCategories.length).toBe(2);
+ expect(metaRule.subject_categories.length).toBe(1);
+ var subjectCategory = metaRule.subject_categories[0];
+ expect(subjectCategory.id).toBe('subjectCategoryId1');
+ expect(subjectCategory.name).toBe('subjectCategory1');
+ expect(subjectCategory.description).toBe('scDescription1');
+
+ expect(service.objectCategories.length).toBe(2);
+ expect(metaRule.object_categories.length).toBe(1);
+ var objectCategory = metaRule.object_categories[0];
+ expect(objectCategory.id).toBe('objectCategoryId1');
+ expect(objectCategory.name).toBe('objectCategory1');
+ expect(objectCategory.description).toBe('ocDescription1');
+
+ expect(service.actionCategories.length).toBe(2);
+ expect(metaRule.action_categories.length).toBe(1);
+ var actionCategory = metaRule.action_categories[0];
+ expect(actionCategory.id).toBe('actionCategoryId1');
+ expect(actionCategory.name).toBe('actionCategory1');
+ expect(actionCategory.description).toBe('acDescription1');
+
+ expect(service.orphanMetaRules.length).toBe(1);
+ metaRule = service.orphanMetaRules[0];
+ expect(metaRule.id).toBe('metaRuleId2');
+ expect(metaRule.name).toBe('metaRule2');
+ expect(metaRule.description).toBe('mrDescription2');
+
+ expect(service.orphanSubjectCategories.length).toBe(1);
+ subjectCategory = service.orphanSubjectCategories[0];
+ expect(subjectCategory.id).toBe('subjectCategoryId2');
+ expect(subjectCategory.name).toBe('subjectCategory2');
+ expect(subjectCategory.description).toBe('scDescription2');
+
+ expect(service.orphanObjectCategories.length).toBe(1);
+ objectCategory = service.orphanObjectCategories[0];
+ expect(objectCategory.id).toBe('objectCategoryId2');
+ expect(objectCategory.name).toBe('objectCategory2');
+ expect(objectCategory.description).toBe('ocDescription2');
+
+ expect(service.orphanActionCategories.length).toBe(1);
+ actionCategory = service.orphanActionCategories[0];
+ expect(actionCategory.id).toBe('actionCategoryId2');
+ expect(actionCategory.name).toBe('actionCategory2');
+ expect(actionCategory.description).toBe('acDescription2');
+
+ });
+
+
+
+ it('should create model', function () {
+ var modelCreatedData = {
+ models:
+ { 'modelId1': { name: 'model1', description: 'mDescription1', meta_rules: [] } }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/models').respond(200, modelCreatedData);
+
+ service.createModel({ name: 'model1', description: 'mDescription1' });
+ $httpBackend.flush();
+
+ expect(service.models.length).toBe(1);
+ var model = service.models[0];
+ expect(model.id).toBe('modelId1');
+ expect(model.name).toBe('model1');
+ expect(model.description).toBe('mDescription1');
+ });
+
+ it('should remove model', function () {
+ initData();
+ service.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+
+ $httpBackend.expectDELETE(URI.API + '/models/modelId1').respond(200);
+
+ service.removeModel({ id: 'modelId1' });
+ $httpBackend.flush();
+
+ expect(service.models.length).toBe(0);
+
+ expect(service.orphanMetaRules.length).toBe(2);
+ });
+
+ it('should update model', function () {
+ initData();
+ var modelUpdatedData = {
+ models:
+ { 'modelId1': { name: 'model2', description: 'mDescription2', meta_rules: ['metaRuleId2'] } }
+ };
+ service.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+
+ $httpBackend.expectPATCH(URI.API + '/models/modelId1').respond(200, modelUpdatedData);
+
+ service.updateModel({ id: 'modelId1', name: 'model2', description: 'mDescription2', meta_rules: service.getMetaRule('metaRuleId2') });
+ $httpBackend.flush();
+
+ expect(service.models.length).toBe(1);
+ var model = service.models[0];
+ expect(model.id).toBe('modelId1');
+ expect(model.name).toBe('model2');
+ expect(model.description).toBe('mDescription2');
+
+ expect(model.meta_rules.length).toBe(1);
+ var metaRule = model.meta_rules[0];
+ expect(metaRule.id).toBe('metaRuleId2');
+
+ expect(service.orphanMetaRules.length).toBe(1);
+ metaRule = service.orphanMetaRules[0];
+ expect(metaRule.id).toBe('metaRuleId1');
+ });
+
+ it('should create meta rule', function () {
+ var metaRuleCreatedData = {
+ meta_rules:
+ { 'metaRuleId1': { name: 'metaRule1', description: 'mrDescription1' } }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/meta_rules').respond(200, metaRuleCreatedData);
+
+ service.createMetaRule({ name: 'metaRule1', description: 'mrDescription1' });
+ $httpBackend.flush();
+
+ expect(service.metaRules.length).toBe(1);
+ var metaRule = service.metaRules[0];
+ expect(metaRule.id).toBe('metaRuleId1');
+ expect(metaRule.name).toBe('metaRule1');
+ expect(metaRule.description).toBe('mrDescription1');
+ });
+
+ it('should update meta rule', function () {
+ initData();
+ var metaRuleUpdatedData = {
+ meta_rules:
+ { 'metaRuleId1': { name: 'metaRule2', description: 'mrDescription2', subject_categories: ['subjectCategoryId2'], object_categories: ['objectCategoryId2'], action_categories: ['actionCategoryId2'] } }
+ };
+ service.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+
+ $httpBackend.expectPATCH(URI.API + '/meta_rules/metaRuleId1').respond(200, metaRuleUpdatedData);
+
+ service.updateMetaRule({ id: 'metaRuleId1', name: 'metaRule2', description: 'mrDescription2', subject_categories: [service.getCategory('subject', 'subjectCategoryId2')], object_categories: [service.getCategory('object', 'objectCategoryId2')], action_categories: [service.getCategory('action','actionCategoryId2')] });
+ $httpBackend.flush();
+
+ var metaRule = service.getMetaRule('metaRuleId1');
+ expect(metaRule.id).toBe('metaRuleId1');
+ expect(metaRule.name).toBe('metaRule2');
+ expect(metaRule.description).toBe('mrDescription2');
+
+ expect(service.orphanSubjectCategories.length).toBe(1);
+ var subjectCategory = service.orphanSubjectCategories[0];
+ expect(subjectCategory.id).toBe('subjectCategoryId1');
+
+ expect(service.orphanObjectCategories.length).toBe(1);
+ var objectCategory = service.orphanObjectCategories[0];
+ expect(objectCategory.id).toBe('objectCategoryId1');
+
+ expect(service.orphanActionCategories.length).toBe(1);
+ var actionCategory = service.orphanActionCategories[0];
+ expect(actionCategory.id).toBe('actionCategoryId1');
+ });
+
+ it('should remove meta rule', function () {
+ initData();
+ service.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+
+ $httpBackend.expectDELETE(URI.API + '/meta_rules/metaRuleId2').respond(200);
+
+ service.removeMetaRule(service.getMetaRule('metaRuleId2'));
+ $httpBackend.flush();
+
+ expect(service.metaRules.length).toBe(1);
+ expect(service.orphanMetaRules.length).toBe(0);
+ });
+
+ it('should create category', function () {
+ var categoryCreatedData = {
+ subject_categories:
+ { 'subjectCategoryId1': { name: 'subjectCategory1', description: 'scDescription1' } }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/subject_categories').respond(200, categoryCreatedData);
+
+ service.createCategory('subject', { name: 'subjectCategory1', description: 'scDescription1' });
+ $httpBackend.flush();
+
+ expect(service.subjectCategories.length).toBe(1);
+ var subjectCategory = service.subjectCategories[0];
+ expect(subjectCategory.id).toBe('subjectCategoryId1');
+ expect(subjectCategory.name).toBe('subjectCategory1');
+ expect(subjectCategory.description).toBe('scDescription1');
+ });
+
+ it('should remove category', function () {
+ initData();
+ service.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+
+ $httpBackend.expectDELETE(URI.API + '/subject_categories/subjectCategoryId2').respond(200);
+
+ service.removeCategory('subject', service.getCategory('subject', 'subjectCategoryId2'));
+ $httpBackend.flush();
+
+ expect(service.subjectCategories.length).toBe(1);
+ expect(service.orphanSubjectCategories.length).toBe(0);
+ });
+
+ });
+
+
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/pdp/pdp.controller.js b/old/moon_dashboard/moon/static/moon/pdp/pdp.controller.js
new file mode 100644
index 00000000..1859b1f8
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/pdp/pdp.controller.js
@@ -0,0 +1,125 @@
+(function () {
+ 'use strict';
+
+ angular
+ .module('moon')
+ .controller('moon.pdp.controller',
+ controller);
+
+ controller.$inject = ['moon.util.service', 'moon.pdp.service', 'horizon.framework.widgets.form.ModalFormService'];
+
+ function controller(util, pdpService, ModalFormService) {
+ var self = this;
+ self.model = pdpService;
+ pdpService.initialize();
+
+ self.createPdp = function createPdp() {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ },
+ required: ['name', 'description']
+ };
+ var pdp = { name: '', description: '' };
+ var config = {
+ title: gettext('Create PDP'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: pdp
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ pdpService.createPdp(form.model);
+ }
+ }
+
+ self.updatePdp = function updatePdp(pdp) {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ },
+ required: ['name', 'description']
+ };
+ var config = {
+ title: gettext('Update PDP'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: angular.copy(pdp)
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ pdpService.updatePdp(form.model);
+ }
+ }
+
+ self.removePdp = function removePdp(pdp) {
+ if (confirm(gettext('Are you sure to delete this PDP?')))
+ pdpService.removePdp(pdp);
+ }
+
+ self.addPolicy = function addPolicy(pdp) {
+ var schema = {
+ type: "object",
+ properties: {
+ id: { type: "string", title: gettext("Select a Policy:") }
+ },
+ required: ['id']
+ };
+ var titleMap = util.arrayToTitleMap(pdpService.policies)
+ var config = {
+ title: gettext('Add Policy'),
+ schema: schema,
+ form: [{ key: 'id', type: 'select', titleMap: titleMap }],
+ model: {}
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var pdpCopy = angular.copy(pdp);
+ pdpCopy.security_pipeline.push(pdpService.getPolicy(form.model.id));
+ pdpService.updatePdp(pdpCopy);
+ }
+ }
+
+ self.removePolicyFromPdp = function removePolicyFromPdp(pdp, policy) {
+ if (confirm(gettext('Are you sure to remove this Policy from PDP?'))) {
+ var pdpCopy = angular.copy(pdp);
+ pdpCopy.security_pipeline.splice(pdp.security_pipeline.indexOf(policy), 1);
+ pdpService.updatePdp(pdpCopy);
+ }
+ }
+
+ self.changeProject = function changeProject(pdp) {
+ var schema = {
+ type: "object",
+ properties: {
+ id: { type: "string", title: gettext("Select a Project:") }
+ },
+ required: ['id']
+ };
+ var model = {id : pdp.keystone_project_id};
+
+ var titleMap = util.arrayToTitleMap(pdpService.projects)
+ var config = {
+ title: gettext('Change Project'),
+ schema: schema,
+ form: [{ key: 'id', type: 'select', titleMap: titleMap }],
+ model: model
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var pdpCopy = angular.copy(pdp);
+ pdpCopy.project = pdpService.getProject(form.model.id);
+ pdpService.updatePdp(pdpCopy);
+ }
+ }
+
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/pdp/pdp.html b/old/moon_dashboard/moon/static/moon/pdp/pdp.html
new file mode 100644
index 00000000..2456a261
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/pdp/pdp.html
@@ -0,0 +1,41 @@
+<div ng-controller="moon.pdp.controller as ctrl">
+ <div class="clearfix list-group">
+ <div class="pull-right">
+ <input type="search" class="form-control filter" placeholder="Filter" ng-model="filterText">
+ <button type="button" class="btn btn-default" ng-click="ctrl.createPdp()">
+ <span class="fa fa-plus"></span>
+ <translate>Create PDP</translate>
+ </button>
+ </div>
+ </div>
+ <div class="list-group">
+ <div ng-repeat="pdp in ctrl.model.pdps | orderBy:'name' | filter:filterText " class="list-group-item">
+ <h3 class="list-group-item-heading inline">{$ pdp.name $}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash" ng-click="ctrl.removePdp(pdp)" title="{$ 'Remove PDP' | translate $}"></button>
+ <button type="button" class="fa fa-edit" ng-click="ctrl.updatePdp(pdp)" title="{$ 'Edit PDP' | translate $}"></button>
+ </div>
+ <p class="list-group-item-text">{$ pdp.description $}</p>
+ <h4 class="list-group-item-text">
+ <translate>Project: {$ pdp.project ? pdp.project.name : 'none' $}</translate>
+ <button type="button" class="fa fa-edit" ng-click="ctrl.changeProject(pdp)" title="{$ 'Change project' | translate $}"></button>
+ </h4>
+
+ <details class="list-group-item-text">
+ <summary>
+ <h4 class="inline">{$ pdp.security_pipeline.length $}
+ <translate>policy(ies)</translate>
+ </h4>
+ <button type="button" class="fa fa-plus " ng-click="ctrl.addPolicy(pdp)" title="{$ 'Add Policy' | translate $}"></button>
+ </summary>
+ <div class="list-group">
+ <div ng-repeat="policy in pdp.security_pipeline | orderBy:'name'" class="list-group-item">
+ <h3 class="list-group-item-heading inline">{$ policy.name $}</h3>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removePolicyFromPdp(pdp, policy)" title="{$ 'Remove Policy' | translate $}"></button>
+ <p class="list-group-item-text">{$ policy.description $}</p>
+ </div>
+ </div>
+ </details>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/pdp/pdp.service.js b/old/moon_dashboard/moon/static/moon/pdp/pdp.service.js
new file mode 100755
index 00000000..e18971be
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/pdp/pdp.service.js
@@ -0,0 +1,123 @@
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('moon')
+ .factory('moon.pdp.service', pdpService);
+
+ pdpService.$inject = ['moon.util.service', '$resource', 'moon.URI', '$q', 'horizon.app.core.openstack-service-api.keystone'];
+
+ function pdpService(util, $resource, URI, $q, keystone) {
+ var host = URI.API;
+
+ var pdpResource = $resource(host + '/pdp/' + ':id', {}, {
+ get: { method: 'GET' },
+ query: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' },
+ update: { method: 'PATCH' }
+ });
+
+ var policyResource = $resource(host + '/policies/' + ':id', {}, {
+ query: { method: 'GET' },
+ });
+
+ var pdpsMap = {};
+ var pdps = [];
+ var policiesMap = {};
+ var policies = [];
+ var projectsMap = {};
+ var projects = [];
+
+ function loadPdps() {
+ var queries = {
+ pdps: pdpResource.query().$promise,
+ policies: policyResource.query().$promise,
+ projects: keystone.getProjects()
+ }
+
+ $q.all(queries).then(function (result) {
+ createPdps(result.pdps, result.policies, result.projects.data)
+ console.log('moon', 'pdps initialized', pdps)
+ })
+ }
+
+ function createPdps(pdpsData, policiesData, projectsData) {
+ pdps.splice(0, pdps.length);
+ policies.splice(0, policies.length);
+ projects.splice(0, projects.length);
+ util.cleanObject(pdpsMap);
+ util.cleanObject(policiesMap);
+ util.cleanObject(projectsMap)
+
+ util.createInternal(policiesData.policies, policies, policiesMap);
+ util.pushAll(projects, projectsData.items);
+ util.addToMap(projects, projectsMap);
+ createPdpInternal(pdpsData.pdps);
+ }
+
+ function mapPdp(pdp) {
+ util.mapIdToItem(pdp.security_pipeline, policiesMap);
+ pdp.project = null;
+ if (pdp.keystone_project_id) {
+ pdp.project = projectsMap[pdp.keystone_project_id];
+ }
+ }
+
+ function createPdpInternal(data) {
+ return util.createInternal(data, pdps, pdpsMap, mapPdp);
+ }
+
+ function updatePdpInternal(data) {
+ return util.updateInternal(data, pdpsMap, mapPdp);
+ }
+
+ function removePdpInternal(id) {
+ return util.removeInternal(id, pdps, pdpsMap);
+ }
+
+ return {
+ initialize: loadPdps,
+ createPdps: createPdps,
+ pdps: pdps,
+ policies: policies,
+ projects: projects,
+ createPdp: function createPdp(pdp) {
+ pdp.keystone_project_id = null;
+ pdp.security_pipeline = [];
+ pdpResource.create(null, pdp, success, util.displayErrorFunction('Unable to create PDP'));
+
+ function success(data) {
+ createPdpInternal(data.pdps);
+ util.displaySuccess('PDP created');
+ }
+ },
+ removePdp: function removePdp(pdp) {
+ pdpResource.remove({ id: pdp.id }, null, success, util.displayErrorFunction('Unable to remove PDP'));
+
+ function success(data) {
+ removePdpInternal(pdp.id);
+ util.displaySuccess('PDP removed');
+ }
+ },
+ updatePdp: function updatePdp(pdp) {
+ util.mapItemToId(pdp.security_pipeline);
+ pdp.keystone_project_id = pdp.project ? pdp.project.id : null;
+ pdpResource.update({ id: pdp.id }, pdp, success, util.displayErrorFunction('Unable to update PDP'));
+
+ function success(data) {
+ updatePdpInternal(data.pdps)
+ util.displaySuccess('PDP updated');
+ }
+ },
+ getPolicy: function getPolicy(id) {
+ return policiesMap[id];
+ },
+ getProject: function getProject(id) {
+ return projectsMap[id];
+ },
+ }
+
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js b/old/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js
new file mode 100755
index 00000000..4208467f
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js
@@ -0,0 +1,143 @@
+(function () {
+ 'use strict';
+
+ describe('moon.pdp.service', function () {
+ var service, $httpBackend, URI;
+ var pdpsData, policiesData, projectsData;
+
+
+ function initData() {
+ pdpsData = {
+ pdps:
+ { 'pdpId1': { name: 'pdp1', description: 'pdpDescription1', security_pipeline: ['policyId1'], keystone_project_id: 'projectId1' } }
+ };
+
+ policiesData = {
+ policies:
+ {
+ 'policyId1': { name: 'policy1', description: 'pDescription1' },
+ 'policyId2': { name: 'policy2', description: 'pDescription2' }
+ }
+ };
+
+ projectsData = {
+ items: [
+ { name: "project1", id: "projectId1" },
+ { name: "project2", id: "projectId2" }
+ ]
+ };
+
+ }
+
+ beforeEach(module('horizon.app.core'));
+ beforeEach(module('horizon.framework'));
+ beforeEach(module('moon'));
+
+ beforeEach(inject(function ($injector) {
+ service = $injector.get('moon.pdp.service');
+ $httpBackend = $injector.get('$httpBackend');
+ URI = $injector.get('moon.URI');
+ }));
+
+ afterEach(function () {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ it('should initialize', function () {
+ initData();
+ $httpBackend.expectGET(URI.API + '/pdp').respond(200, pdpsData);
+ $httpBackend.expectGET(URI.API + '/policies').respond(200, policiesData);
+ $httpBackend.expectGET('/api/keystone/projects/').respond(200, projectsData);
+
+
+ service.initialize();
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(1);
+ var pdp = service.pdps[0];
+ expect(pdp.id).toBe('pdpId1');
+ expect(pdp.name).toBe('pdp1');
+ expect(pdp.description).toBe('pdpDescription1');
+ expect(pdp.security_pipeline.length).toBe(1);
+ expect(pdp.security_pipeline[0].id).toBe('policyId1');
+ expect(pdp.keystone_project_id).toBe('projectId1');
+ expect(pdp.project.id).toBe('projectId1');
+
+ expect(service.policies.length).toBe(2);
+ var policy = service.policies[0];
+ expect(policy.id).toBe('policyId1');
+ expect(policy.name).toBe('policy1');
+ expect(policy.description).toBe('pDescription1');
+
+
+ expect(service.projects.length).toBe(2);
+ var project = service.projects[0];
+ expect(project.id).toBe('projectId1');
+ expect(project.name).toBe('project1');
+
+ });
+
+
+
+ it('should create pdp', function () {
+ var pdpCreatedData = {
+ pdps:
+ { 'pdpId1': { name: 'pdp1', description: 'pdpDescription1', security_pipeline: [], keystone_project_id: null } }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/pdp').respond(200, pdpCreatedData);
+
+ service.createPdp({ name: 'pdp1', description: 'pdpDescription1' });
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(1);
+ var pdp = service.pdps[0];
+ expect(pdp.id).toBe('pdpId1');
+ expect(pdp.name).toBe('pdp1');
+ expect(pdp.description).toBe('pdpDescription1');
+ expect(pdp.project).toBe(null);
+ expect(pdp.security_pipeline.length).toBe(0);
+ });
+
+ it('should remove pdp', function () {
+ initData();
+ service.createPdps(pdpsData, policiesData, projectsData);
+
+ $httpBackend.expectDELETE(URI.API + '/pdp/pdpId1').respond(200);
+
+ service.removePdp({ id: 'pdpId1' });
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(0);
+ });
+
+ it('should update pdp', function () {
+ initData();
+ var pdpUpdatedData = {
+ pdps:
+ { 'pdpId1': { name: 'pdp2', description: 'pdpDescription2', security_pipeline: ['policyId2'], keystone_project_id: 'projectId2' } }
+ };
+ service.createPdps(pdpsData, policiesData, projectsData);
+
+ $httpBackend.expectPATCH(URI.API + '/pdp/pdpId1').respond(200, pdpUpdatedData);
+
+ service.updatePdp({ id: 'pdpId1', name: 'pdp2', description: 'pdpDescription2', security_pipeline: [service.getPolicy('policyId2')], project: service.getProject('projectId2') });
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(1);
+ var pdp = service.pdps[0];
+ expect(pdp.id).toBe('pdpId1');
+ expect(pdp.name).toBe('pdp2');
+ expect(pdp.description).toBe('pdpDescription2');
+ expect(pdp.project.id).toBe('projectId2');
+ expect(pdp.security_pipeline.length).toBe(1);
+ expect(pdp.security_pipeline[0].id).toBe('policyId2');
+
+ });
+
+
+ });
+
+
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/policy/policy.controller.js b/old/moon_dashboard/moon/static/moon/policy/policy.controller.js
new file mode 100644
index 00000000..a3cc18f1
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/policy/policy.controller.js
@@ -0,0 +1,341 @@
+(function () {
+ 'use strict';
+
+ angular
+ .module('moon')
+ .controller('moon.policy.controller',
+ controller);
+
+ controller.$inject = ['moon.util.service', 'moon.policy.service', 'moon.model.service', 'horizon.framework.widgets.form.ModalFormService'];
+
+ function controller(util, policyService, modelService, ModalFormService) {
+ var self = this;
+ var genres = [{ value: 'admin', name: gettext('admin') }, { value: 'authz', name: gettext('authz') }];
+ self.model = policyService;
+ self.selectedRule = null;
+ self.currentData = null;
+ policyService.initialize();
+
+ var dataTitleMaps = {};
+
+ var categoryMap = {
+ subject: {
+ perimeterId: 'subject_id'
+ },
+ object: {
+ perimeterId: 'object_id'
+ },
+ action: {
+ perimeterId: 'action_id'
+ },
+ }
+
+ function createAddDataButton(type, index, category, config, policy) {
+ config.form.push({
+ key: type + index + "Button",
+ type: "button",
+ title: gettext("Create Data"),
+ icon: 'fa fa-plus',
+ onClick: createDataFunction(type, category, policy, config.model, type+index)
+ })
+ }
+
+ function createDataFunction(type, category, policy, formModel, key) {
+ return function () {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") },
+ },
+ required: ['name', 'description']
+ };
+ var data = { name: '', description: '' };
+ var config = {
+ title: gettext('Create Data of ' + category.name + ' category'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: data
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ policyService.createData(type, policy, category, form.model).then(
+ function (data) {
+ util.pushAll(dataTitleMaps[category.id], util.arrayToTitleMap(data));
+ formModel[key] = data[0].id
+ }
+ );
+ }
+ }
+ }
+
+ function getOrCreateDataTitleMap(category, data, policy) {
+ var result = dataTitleMaps[category.id];
+ if (!result) {
+ result = util.arrayToTitleMap(data);
+ dataTitleMaps[category.id] = result;
+ }
+ return result;
+ }
+
+ function createDataSelect(type, categories, data, config, policy) {
+ for (var i = 0; i < categories.length; i++) {
+ var category = categories[i];
+ var titleMap = getOrCreateDataTitleMap(category, data, policy);
+ config.schema.properties[type + i] = { type: "string", title: gettext('Select ' + type + ' data of ' + category.name + ' category') };
+ config.form.push({ key: type + i, type: 'select', titleMap: titleMap });
+ config.schema.required.push(type + i);
+ createAddDataButton(type, i, category, config, policy);
+ }
+ }
+
+ function pushData(type, model, array) {
+ var i = 0;
+ while ((type + i) in model) {
+ array.push(model[type + i]);
+ i++;
+ }
+ }
+
+ self.createPolicy = function createPolicy() {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") },
+ genre: { type: "string", title: gettext("genre") },
+ model_id: { type: "string", title: gettext("Select a Model:") }
+ },
+ required: ['name', 'description', 'genre', 'model_id']
+ };
+ var policy = { name: '', description: '', model_id: null, genre: '' };
+ var titleMap = util.arrayToTitleMap(modelService.models)
+ var config = {
+ title: gettext('Create Policy'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }, { key: 'genre', type: 'select', titleMap: genres }, { key: 'model_id', type: 'select', titleMap: titleMap }],
+ model: policy
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ policyService.createPolicy(form.model);
+ }
+ }
+
+ self.updatePolicy = function updatePolicy(policy) {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") },
+ genre: { type: "string", title: gettext("Genre") },
+ },
+ required: ['name', 'description', 'genre']
+ };
+ var config = {
+ title: gettext('Update Policy'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }, { key: 'genre', type: 'select', titleMap: genres }],
+ model: { name: policy.name, description: policy.description, model_id: policy.model_id, id: policy.id, genre: policy.genre }
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ policyService.updatePolicy(form.model);
+ }
+ }
+
+ self.addRuleWithMetaRule = function addRuleWithMetaRule(policy, metaRule) {
+ var schema = {
+ type: "object",
+ properties: {
+ instructions: { type: "string", title: gettext("Instructions") }
+ },
+ required: ['instructions']
+ };
+
+ var config = {
+ title: gettext('Add Rule'),
+ schema: schema,
+ form: [],
+ model: {
+ instructions: '[{"decision": "grant"}]'
+ }
+ };
+ dataTitleMaps = {};
+ createDataSelect('subject', metaRule.subject_categories, policy.subjectData, config, policy);
+ createDataSelect('object', metaRule.object_categories, policy.objectData, config, policy);
+ createDataSelect('action', metaRule.action_categories, policy.actionData, config, policy);
+ config.form.push({ key: 'instructions', type: 'textarea' })
+
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var rule = { enabled: true };
+ rule.instructions = JSON.parse(form.model.instructions);
+ rule.meta_rule_id = metaRule.id;
+ rule.policy_id = policy.id;
+ rule.rule = [];
+ pushData('subject', form.model, rule.rule);
+ pushData('object', form.model, rule.rule);
+ pushData('action', form.model, rule.rule);
+ policyService.addRuleToPolicy(policy, rule);
+ }
+ }
+
+ self.addRule = function addRule(policy) {
+ if (policy.model.meta_rules.length == 1) {
+ self.addRuleWithMetaRule(policy, policy.model.meta_rules[0]);
+ return;
+ }
+ var schema = {
+ type: "object",
+ properties: {
+ metaRuleId: { type: "string", title: gettext("Select a Metarule:") }
+ },
+ required: ['metaRuleId']
+ };
+ var rule = { metaRuleId: null };
+ var titleMap = util.arrayToTitleMap(policy.model.meta_rules);
+ var config = {
+ title: gettext('Add Rule'),
+ schema: schema,
+ form: [{ key: 'metaRuleId', type: 'select', titleMap: titleMap }],
+ model: rule
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ self.addRuleWithMetaRule(policy, modelService.getMetaRule(form.model.metaRuleId));
+ }
+ }
+
+ self.removePolicy = function removePolicy(policy) {
+ if (confirm(gettext('Are you sure to delete this Policy? (Associated perimeter, data an PDP will be deleted too)')))
+ policyService.removePolicy(policy);
+ }
+
+ self.populatePolicy = function populatePolicy(policy) {
+ policyService.populatePolicy(policy);
+ }
+
+ self.removeRuleFromPolicy = function removeRuleFromPolicy(policy, rule) {
+ if (confirm(gettext('Are you sure to delete this Rule?')))
+ policyService.removeRuleFromPolicy(policy, rule);
+ }
+
+ self.showRule = function showRule(rule) {
+ self.selectedRule = rule;
+ self.currentData = null;
+ }
+
+ self.hideRule = function hideRule() {
+ self.selectedRule = null;
+ self.currentData = null;
+ }
+
+ self.assignData = function assignData(type, policy, data) {
+ self.currentData = {
+ data: data,
+ type: type,
+ loading: true,
+ perimeters: [],
+ allPerimeters: [],
+ assignments: [],
+ }
+
+ policyService.loadPerimetersAndAssignments(type, policy).then(function (values) {
+ var category = categoryMap[type];
+ self.currentData.loading = false;
+ self.currentData.perimeters = values.perimeters;
+ var index;
+ for (index = 0; index < values.allPerimeters.length; index++) {
+ var perimeter = values.allPerimeters[index];
+ if (perimeter.policy_list.indexOf(policy.id) < 0) {
+ self.currentData.allPerimeters.push(perimeter);
+ }
+ }
+ for (index = 0; index < values.assignments.length; index++) {
+ var assignment = values.assignments[index];
+ if (assignment.assignments.indexOf(data.id) >= 0) {
+ var perimeter = values.perimetersMap[assignment[category.perimeterId]];
+ self.currentData.assignments.push(perimeter);
+ self.currentData.perimeters.splice(self.currentData.perimeters.indexOf(perimeter), 1);
+ }
+ }
+ })
+ }
+
+ self.createPerimeter = function createPerimeter(type, policy) {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") },
+ },
+ required: ['name', 'description']
+ };
+ if (type == 'subject') {
+ schema.properties.email = { type: "email", "type": "string", "pattern": "^\\S+@\\S+$", title: gettext("Email") }
+ schema.required.push('email');
+ }
+ var perimeter = { name: '', description: '' };
+ var config = {
+ title: gettext('Create Perimeter'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: perimeter
+ };
+ if (type == 'subject') {
+ config.form.push('email');
+ }
+
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ policyService.createPerimeter(type, policy, form.model).then(function (perimeters) {
+ util.pushAll(self.currentData.perimeters, perimeters);
+ })
+ }
+ }
+
+ self.addPerimeter = function addPerimeter(type, policy, perimeter) {
+ policyService.addPerimeterToPolicy(type, policy, perimeter).then(function () {
+ self.currentData.allPerimeters.splice(self.currentData.allPerimeters.indexOf(perimeter), 1);
+ self.currentData.perimeters.push(perimeter);
+ })
+ }
+
+ self.assign = function assign(type, policy, perimeter, data) {
+ policyService.createAssignment(type, policy, perimeter, data).then(function () {
+ self.currentData.assignments.push(perimeter);
+ self.currentData.perimeters.splice(self.currentData.perimeters.indexOf(perimeter), 1);
+ })
+ }
+
+ self.unassign = function unassign(type, policy, perimeter, data) {
+ policyService.removeAssignment(type, policy, perimeter, data).then(function () {
+ self.currentData.perimeters.push(perimeter);
+ self.currentData.assignments.splice(self.currentData.assignments.indexOf(perimeter), 1);
+ })
+ }
+
+ self.removePerimeterFromPolicy = function removePerimeterFromPolicy(type, policy, perimeter) {
+ if (confirm(gettext('Are you sure to delete this Perimeter? (Associated assignments will be deleted too)')))
+ policyService.removePerimeterFromPolicy(type, policy, perimeter).then(function () {
+ self.currentData.perimeters.splice(self.currentData.perimeters.indexOf(perimeter), 1);
+ perimeter.policy_list.splice(perimeter.policy_list.indexOf(policy.id), 1);
+ if (perimeter.policy_list.length > 0) {
+ self.currentData.allPerimeters.push(perimeter);
+ }
+ })
+ }
+
+ self.removeData = function removeData(type, policy, data) {
+ if (confirm(gettext('Are you sure to delete this Data? (Associated assignments and rules will be deleted too)')))
+ policyService.removeData(type, policy, data)
+ }
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/policy/policy.html b/old/moon_dashboard/moon/static/moon/policy/policy.html
new file mode 100644
index 00000000..ba13bec2
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/policy/policy.html
@@ -0,0 +1,214 @@
+<div ng-controller="moon.policy.controller as ctrl">
+ <div class="clearfix list-group">
+ <div class="pull-right">
+ <input type="search" class="form-control filter" placeholder="Filter" ng-model="filterText">
+ <button type="button" class="btn btn-default" ng-click="ctrl.createPolicy()">
+ <span class="fa fa-plus"></span>
+ <translate>Create Policy</translate>
+ </button>
+ </div>
+ </div>
+
+ <div class="list-group">
+ <div ng-repeat="policy in ctrl.model.policies | orderBy:'name' | filter:filterText" class="list-group-item" ng-init="toggle = {};toggle.showUnused = false">
+ <h3 class="list-group-item-heading inline">{$ policy.name $}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash" title="{$ 'Remove Policy' | translate $}" ng-click="ctrl.removePolicy(policy)"></button>
+ <button type="button" class="fa fa-edit" title="{$ 'Edit Policy' | translate $}" ng-click="ctrl.updatePolicy(policy)"></button>
+ </div>
+ <p class="list-group-item-text">{$ policy.description $}</p>
+ <h4 class="list-group-item-text">
+ <translate>Model: {$ policy.model ? policy.model.name : 'none' $}</translate>
+ </h4>
+ <h4 class="list-group-item-text">
+ <translate>Genre:</translate>
+ <translate>{$ policy.genre ? policy.genre : 'none' $}</translate>
+ </h4>
+ <div ng-if="policy.unusedSubjectData.length
+ || policy.unusedSubjectData.length
+ || policy.unusedSubjectData.length" class="alert alert-dismissable alert-warning">
+ <button type="button" class="close" data-dismiss="alert" ng-click="toggle.showUnused=false">×</button>
+ <h4 translate>Warning!</h4>
+ <p translate>
+ Some data are unused, please check them and delete them if necessary.
+ <a href="" ng-click="toggle.showUnused=true" ng-show="!toggle.showUnused" translate>Show unused data</a>
+ <a href="" ng-click="toggle.showUnused=false" ng-show="toggle.showUnused" translate>Hide unused data</a>
+ </p>
+ </div>
+
+ <div ng-if="toggle.showUnused" class="list-group-item-text overflow-hidden">
+ <div class="list-group col-lg-3" ng-if="policy.unusedSubjectData.length">
+ <h3 class="list-group-item active" translate>Unused Subject data</h3>
+ <div ng-repeat="subject in policy.unusedSubjectData | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline" title="{$ subject.description $}">{$ subject.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeData('subject', policy, subject)" title="{$ 'Remove Subject data' | translate $}"></button>
+ </div>
+ </div>
+
+ <div class="list-group col-lg-3" ng-if="policy.unusedObjectData.length">
+ <h3 class="list-group-item active" translate>Unused Object data</h3>
+ <div ng-repeat="object in policy.unusedObjectData | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline" title="{$ object.description $}">{$ object.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeData('object', policy, object)" title="{$ 'Remove Object data' | translate $}"></button>
+ </div>
+ </div>
+
+ <div class="list-group col-lg-3" ng-if="policy.unusedActionData.length">
+ <h3 class="list-group-item active" translate>Unused Action data</h3>
+ <div ng-repeat="action in policy.unusedActionData | orderBy:'name'" class="list-group-item">
+ <h4 class="list-group-item-heading inline" title="{$ action.description $}">{$ action.name $}</h4>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeData('action', policy, action)" title="{$ 'Remove Action data' | translate $}"></button>
+ </div>
+ </div>
+
+ </div>
+
+
+ <details class="list-group-item-text">
+ <summary ng-click="ctrl.populatePolicy(policy)">
+ <h4 class="inline" translate>Rules</h4>
+ <button type="button" class="fa fa-plus " ng-click="ctrl.addRule(policy)" title="{$ 'Add Rule' | translate $}"></button>
+ </summary>
+ <div class="list-group">
+ <p ng-if="!policy.rules" class="list-group-item-text" translate>Loading rules...</p>
+ <div ng-if="policy.rules" ng-repeat="rule in policy.rules | orderBy:'name'" class="list-group-item">
+ <div class="list-group-item-heading" ng-if="ctrl.selectedRule != rule">
+ <div class="inline-block width-200">
+ <b>
+ <translate>Metarule: </translate>
+ </b> {$ rule.metaRule.name $}
+ </div>
+ <b>
+ <translate>Rule: </translate>
+ </b>
+ <span ng-repeat="data in rule.subjectData">
+ <span>{$ data.name $}{$ $last ? '' : ', ' $}</span>
+ </span> |
+ <span ng-repeat="data in rule.actionData">
+ <span>{$ data.name $}{$ $last ? '' : ', ' $}</span>
+ </span> |
+ <span ng-repeat="data in rule.objectData">
+ <span>{$ data.name $}{$ $last ? '' : ', ' $}</span>
+ </span>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeRuleFromPolicy(policy, rule)" title="{$ 'Remove Rule' | translate $}"></button>
+ <button type="button" class="fa fa-eye pull-right" ng-click="ctrl.showRule(rule)" title="{$ 'Show Rule' | translate $}"></button>
+ </div>
+ </div>
+
+ <div ng-if="ctrl.selectedRule == rule">
+ <h3 class="list-group-item-heading inline">
+ <translate>Metarule: </translate> {$ rule.metaRule.name $}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removeRuleFromPolicy(policy, rule)" title="{$ 'Remove Rule' | translate $}"></button>
+ <button type="button" class="fa fa-eye-slash pull-right" ng-click="ctrl.hideRule()" title="{$ 'Hide Rule' | translate $}"></button>
+ </div>
+ <p class="list-group-item-text">
+ <table class="table">
+ <thead>
+ <tr>
+ <th>
+ <span translate>Subjects</span>
+ </th>
+ <th>
+ <span translate>Objects</span>
+ </th>
+ <th>
+ <span translate>Actions</span>
+ </th>
+ <th>
+ <span translate>Instructions</span>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p ng-repeat="data in rule.subjectData">
+ <span ng-class="{'text-primary': ctrl.currentData.data == data}" title="{$ data.description $}">{$ data.name $}</span>
+ <button ng-if="ctrl.currentData.data != data" type="button" class="fa fa-exchange pull-right" ng-click="ctrl.assignData('subject', policy, data)"
+ title="{$ 'Assign to perimeters' | translate $}"></button>
+ <button ng-if="ctrl.currentData.data == data" type="button" class="fa fa-times pull-right" ng-click="ctrl.currentData = null"
+ title="{$ 'Close' | translate $}"></button>
+ </p>
+ </td>
+ <td>
+ <p ng-repeat="data in rule.objectData">
+ <span ng-class="{'text-primary': ctrl.currentData.data == data}" title="{$ data.description $}">{$ data.name $}</span>
+ <button ng-if="ctrl.currentData.data != data" type="button" class="fa fa-exchange pull-right" ng-click="ctrl.assignData('object', policy, data)"
+ title="{$ 'Assign to perimeters' | translate $}"></button>
+ <button ng-if="ctrl.currentData.data == data" type="button" class="fa fa-times pull-right" ng-click="ctrl.currentData = null"
+ title="{$ 'Close' | translate $}"></button>
+ </p>
+ </td>
+ <td>
+ <p ng-repeat="data in rule.actionData">
+ <span ng-class="{'text-primary': ctrl.currentData.data == data}" title="{$ data.description $}">{$ data.name $}</span>
+ <button ng-if="ctrl.currentData.data != data" type="button" class="fa fa-exchange pull-right" ng-click="ctrl.assignData('action', policy, data)"
+ title="{$ 'Assign to perimeters' | translate $}"></button>
+ <button ng-if="ctrl.currentData.data == data" type="button" class="fa fa-times pull-right" ng-click="ctrl.currentData = null"
+ title="{$ 'Close' | translate $}"></button>
+ </p>
+ </td>
+ <td>
+ <pre ng-bind="rule.instructions | json "></pre>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div ng-if="ctrl.currentData && ctrl.currentData.loading" class="row padding-10">
+ <h4 translate>Loading...</h4>
+ </div>
+ <div ng-if="ctrl.currentData && !ctrl.currentData.loading" class="row">
+ <div class="padding-10">
+ <h3>
+ <translate>Assign perimeters to</translate> {$ ctrl.currentData.data.name $}</h3>
+ <input type="search" class="form-control filter" placeholder="Filter" ng-model="filterPerimeter">
+ <button type="button" class="btn btn-default" ng-click="ctrl.createPerimeter(ctrl.currentData.type, policy)">
+ <span class="fa fa-plus"></span>
+ <translate>Create Perimeter</translate>
+ </button>
+ </div>
+ <div>
+ <div class="col-lg-4">
+ <h4 translate>All perimeters</h4>
+ <div class="w-100 height-200 scroll list-group border">
+ <button class="list-group-item" ng-repeat="perimeter in ctrl.currentData.allPerimeters | orderBy:'name' | filter:filterPerimeter"
+ title="{$ perimeter.description $}" ng-click="ctrl.addPerimeter(ctrl.currentData.type, policy, perimeter)">{$ perimeter.name $}</button>
+
+ </div>
+ <p translate class="mt-5">Click to add</p>
+ </div>
+
+ <div class="col-lg-4">
+ <h4 translate>Policy perimeters</h4>
+ <div class="w-100 height-200 scroll list-group border">
+ <div ng-click="ctrl.assign(ctrl.currentData.type, policy, perimeter, ctrl.currentData.data)" class="list-group-item" ng-repeat="perimeter in ctrl.currentData.perimeters | orderBy:'name' | filter:filterPerimeter">
+ <span title="{$ perimeter.description $}">
+ {$ perimeter.name $}
+ </span>
+ <button type="button" class="fa fa-trash pull-right" ng-click="$event.stopPropagation();ctrl.removePerimeterFromPolicy(ctrl.currentData.type, policy, perimeter)"
+ title="{$ 'Remove Perimeter' | translate $}"></button>
+ </div>
+
+ </div>
+ <p translate class="mt-5">Click to assign</p>
+ </div>
+ <div class="col-lg-4">
+ <h4 translate>Assigned perimeters</h4>
+ <div class="w-100 list-group border height-200 scroll">
+ <button class="list-group-item" ng-repeat="perimeter in ctrl.currentData.assignments | orderBy:'name' | filter:filterPerimeter"
+ title="{$ perimeter.description $}" ng-click="ctrl.unassign(ctrl.currentData.type, policy, perimeter, ctrl.currentData.data)">{$ perimeter.name $}</button>
+ </div>
+ <p translate class="mt-5">Click to unassign</p>
+ </div>
+ </div>
+ </div>
+ </p>
+ </div>
+ </div>
+ </div>
+ </details>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/policy/policy.service.js b/old/moon_dashboard/moon/static/moon/policy/policy.service.js
new file mode 100755
index 00000000..3781156d
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/policy/policy.service.js
@@ -0,0 +1,428 @@
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('moon')
+ .factory('moon.policy.service', policyService);
+
+ policyService.$inject = ['moon.util.service', 'moon.model.service', '$resource', 'moon.URI', '$q', 'horizon.framework.widgets.toast.service'];
+
+ function policyService(util, modelService, $resource, URI, $q, toast) {
+ var host = URI.API;
+
+ var policyResource = $resource(host + '/policies/' + ':id', {}, {
+ get: { method: 'GET' },
+ query: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' },
+ update: { method: 'PATCH' }
+ });
+
+ var policyRulesResource = $resource(host + '/policies/' + ':policy_id' + '/rules/' + ':rule_id', {}, {
+ get: { method: 'GET' },
+ query: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ });
+
+ var policySubjectDataResource = $resource(host + '/policies/' + ':policy_id' + '/subject_data/' + ':category_id' + '/' + ':data_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policyObjectDataResource = $resource(host + '/policies/' + ':policy_id' + '/object_data/' + ':category_id' + '/' + ':data_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policyActionDataResource = $resource(host + '/policies/' + ':policy_id' + '/action_data/' + ':category_id' + '/' + ':data_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policySubjectPerimetersResource = $resource(host + '/policies/' + ':policy_id' + '/subjects/' + ':perimeter_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policyObjectPerimetersResource = $resource(host + '/policies/' + ':policy_id' + '/objects/' + ':perimeter_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policyActionPerimetersResource = $resource(host + '/policies/' + ':policy_id' + '/actions/' + ':perimeter_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var subjectPerimetersResource = $resource(host + '/subjects/' + ':perimeter_id', {}, {
+ query: {method: 'GET'},
+ update: { method: 'PATCH' }
+ })
+
+ var objectPerimetersResource = $resource(host + '/objects/' + ':perimeter_id', {}, {
+ query: {method: 'GET'},
+ update: { method: 'PATCH' }
+ })
+
+ var actionPerimetersResource = $resource(host + '/actions/' + ':perimeter_id', {}, {
+ query: {method: 'GET'},
+ update: { method: 'PATCH' }
+ })
+
+ var policySubjectAssignmentsResource = $resource(host + '/policies/' + ':policy_id' + '/subject_assignments/' + ':perimeter_id' + '/' + ':category_id' + '/' + ':data_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policyObjectAssignmentsResource = $resource(host + '/policies/' + ':policy_id' + '/object_assignments/' + ':perimeter_id' + '/' + ':category_id' + '/' + ':data_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+ var policyActionAssignmentsResource = $resource(host + '/policies/' + ':policy_id' + '/action_assignments/' + ':perimeter_id' + '/' + ':category_id' + '/' + ':data_id', {}, {
+ query: {method: 'GET'},
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' }
+ })
+
+
+ var categoryMap = {
+ 'subject': {
+ resource: policySubjectDataResource,
+ arrayName: "subjectData",
+ mapName: "subjectDataMap",
+ responseName: "subject_data",
+ policyPerimeterResource: policySubjectPerimetersResource,
+ perimeterResource: subjectPerimetersResource,
+ assignmentResource: policySubjectAssignmentsResource,
+ perimeterResponseName: "subjects",
+ assignmentResponseName: "subject_assignments",
+ unusedArrayName: "unusedSubjectData",
+ },
+ 'object': {
+ resource: policyObjectDataResource,
+ arrayName: "objectData",
+ mapName: "objectDataMap",
+ responseName: "object_data",
+ policyPerimeterResource: policyObjectPerimetersResource,
+ perimeterResource: objectPerimetersResource,
+ assignmentResource: policyObjectAssignmentsResource,
+ perimeterResponseName: "objects",
+ assignmentResponseName: "object_assignments",
+ unusedArrayName: "unusedObjectData",
+ },
+ 'action': {
+ resource: policyActionDataResource,
+ arrayName: "actionData",
+ mapName: "actionDataMap",
+ responseName: "action_data",
+ policyPerimeterResource: policyActionPerimetersResource,
+ perimeterResource: actionPerimetersResource,
+ assignmentResource: policyActionAssignmentsResource,
+ perimeterResponseName: "actions",
+ assignmentResponseName: "action_assignments",
+ unusedArrayName: "unusedActionData",
+ }
+ }
+
+ var policiesMap = {};
+ var policies = [];
+
+ function loadPolicies() {
+ var queries = {
+ policies: policyResource.query().$promise,
+ models: modelService.initialize(),
+ }
+
+ $q.all(queries).then(function (result) {
+ createPolicies(result.policies);
+ console.log('moon', 'policies initialized')
+ })
+ }
+
+ function createPolicies(policiesData) {
+ policies.splice(0, policies.length);
+ util.cleanObject(policiesMap);
+ createPolicyInternal(policiesData.policies);
+ }
+
+ function mapPolicy(policy) {
+ if (policy.model_id) {
+ policy.model = modelService.getModel(policy.model_id);
+ }
+ }
+
+ function createPolicyInternal(data) {
+ return util.createInternal(data, policies, policiesMap, mapPolicy);
+ }
+
+ function removePolicyInternal(id) {
+ return util.removeInternal(id, policies, policiesMap);
+ }
+
+ function updatePolicyInternal(data) {
+ return util.updateInternal(data, policiesMap, mapPolicy);
+ }
+
+ function removeRuleInternal(policy, rule) {
+ policy.rules.splice(policy.rules.indexOf(rule), 1);
+ updateUnusedData(policy);
+ }
+
+ function loadPolicyRule(policy) {
+ if (!policy.rules) {
+ var queries = {
+ rules: policyRulesResource.query({ policy_id: policy.id }).$promise,
+ subjectData: policySubjectDataResource.query({ policy_id: policy.id }).$promise,
+ objectData: policyObjectDataResource.query({ policy_id: policy.id }).$promise,
+ actionData: policyActionDataResource.query({ policy_id: policy.id }).$promise,
+ }
+
+ $q.all(queries).then(function (result) {
+ createRules(policy, result.rules, result.subjectData, result.objectData, result.actionData);
+ updateUnusedData(policy);
+ }, util.displayErrorFunction('Unable to load rules'))
+ }
+ }
+
+ function updateUnusedData(policy) {
+ policy.unusedSubjectData.splice(0, policy.unusedSubjectData.length);
+ util.pushAll(policy.unusedSubjectData, policy.subjectData);
+
+ policy.unusedObjectData.splice(0, policy.unusedObjectData.length);
+ util.pushAll(policy.unusedObjectData, policy.objectData);
+
+ policy.unusedActionData.splice(0, policy.unusedActionData.length);
+ util.pushAll(policy.unusedActionData, policy.actionData);
+
+ for (var i = 0; i < policy.rules.length; i++) {
+ var rule = policy.rules[i];
+ removeUsedData(rule.subjectData, policy.unusedSubjectData);
+ removeUsedData(rule.objectData, policy.unusedObjectData);
+ removeUsedData(rule.actionData, policy.unusedActionData);
+ }
+ }
+
+ function removeUsedData(list, orphanList) {
+ for (var j = 0; j < list.length; j++) {
+ var data = list[j];
+ var notOrphanIndex = util.indexOf(orphanList, "id", data.id);
+ if (notOrphanIndex >= 0) {
+ orphanList.splice(notOrphanIndex, 1);
+ }
+ }
+ }
+
+ function createRules(policy, rulesData, subjectsData, objectsData, actionsData) {
+ policy.rules = rulesData ? rulesData.rules.rules : [];
+ policy.subjectDataMap = subjectsData.subject_data.length > 0 ? subjectsData.subject_data[0].data : [];
+ policy.subjectData = util.mapToArray(policy.subjectDataMap);
+ policy.objectDataMap = objectsData.object_data.length > 0 ? objectsData.object_data[0].data : [];
+ policy.objectData = util.mapToArray(policy.objectDataMap);
+ policy.actionDataMap = actionsData.action_data.length > 0 ? actionsData.action_data[0].data : [];
+ policy.actionData = util.mapToArray(policy.actionDataMap);
+ policy.unusedSubjectData = [];
+ policy.unusedObjectData = [];
+ policy.unusedActionData = [];
+ for (var i = 0; i < policy.rules.length; i++) {
+ var rule = policy.rules[i];
+ populateRule(policy, rule);
+ }
+ }
+
+ function populateRule(policy, rule) {
+ if (rule.meta_rule_id) {
+ rule.metaRule = modelService.getMetaRule(rule.meta_rule_id);
+ }
+ if (rule.metaRule) {
+ var j = 0;
+ var k, id;
+ rule.subjectData = [];
+ rule.objectData = [];
+ rule.actionData = [];
+ for (k = 0; k < rule.metaRule.subject_categories.length; k++) {
+ id = rule.rule[j + k];
+ rule.subjectData.push(policy.subjectDataMap[id]);
+ }
+ j += k;
+ for (k = 0; k < rule.metaRule.object_categories.length; k++) {
+ id = rule.rule[j + k];
+ rule.objectData.push(policy.objectDataMap[id]);
+ }
+ j += k;
+ for (k = 0; k < rule.metaRule.action_categories.length; k++) {
+ id = rule.rule[j + k];
+ rule.actionData.push(policy.actionDataMap[id]);
+ }
+ }
+ return rule;
+ }
+
+ return {
+ initialize: loadPolicies,
+ createPolicies: createPolicies,
+ policies: policies,
+ getPolicy: function getPolicy(id) {
+ return policiesMap[id];
+ },
+ createPolicy: function createPolicy(policy) {
+ policyResource.create(null, policy, success, util.displayErrorFunction('Unable to create Policy'));
+
+ function success(data) {
+ createPolicyInternal(data.policies);
+ util.displaySuccess('Policy created');
+ }
+ },
+ removePolicy: function removePolicy(policy) {
+ policyResource.remove({ id: policy.id }, null, success, util.displayErrorFunction('Unable to remove Policy'));
+
+ function success(data) {
+ removePolicyInternal(policy.id);
+ util.displaySuccess('Policy removed');
+ }
+ },
+ updatePolicy: function updatePolicy(policy) {
+ policyResource.update({ id: policy.id }, policy, success, util.displayErrorFunction('Unable to update Policy'));
+
+ function success(data) {
+ updatePolicyInternal(data.policies)
+ util.displaySuccess('Policy updated');
+ }
+ },
+ populatePolicy: loadPolicyRule,
+ createRules: createRules,
+ addRuleToPolicy: function addRuleToPolicy(policy, rule) {
+ policyRulesResource.create({ policy_id: policy.id }, rule, success, util.displayErrorFunction('Unable to create Rule'));
+
+ function success(data) {
+ var rules = util.mapToArray(data.rules);
+ for (var i = 0; i < rules.length; i++) {
+ var rule = rules[i];
+ policy.rules.push(populateRule(policy, rule))
+ }
+ util.displaySuccess('Rule created');
+ updateUnusedData(policy);
+ }
+ },
+ removeRuleFromPolicy: function removeRuleFromPolicy(policy, rule) {
+ policyRulesResource.remove({ policy_id: policy.id, rule_id: rule.id }, null, success, util.displayErrorFunction('Unable to remove Rule'));
+
+ function success(data) {
+ removeRuleInternal(policy, rule);
+ util.displaySuccess('Rule removed');
+ }
+ },
+ createData: function createData(type, policy, category, dataCategory) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.resource.create({ policy_id: policy.id, category_id: category.id }, dataCategory).$promise.then(
+ function (data) {
+ var result = util.createInternal(data[categoryValue.responseName].data, policy[categoryValue.arrayName], policy[categoryValue.mapName]);
+ util.displaySuccess('Data created');
+ util.pushAll(policy[categoryValue.unusedArrayName], result);
+ return result;
+ },
+ util.displayErrorFunction('Unable to create Data')
+ );
+ },
+ removeData: function removeData(type, policy, data) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.resource.remove({ policy_id: policy.id, category_id: data.category_id, data_id: data.id }).$promise.then(
+ function (data) {
+ policy[categoryValue.arrayName].splice(policy.subjectData.indexOf(data), 1);
+ policy[categoryValue.unusedArrayName].splice(policy.unusedSubjectData.indexOf(data), 1);
+ delete policy[categoryValue.mapName][data.id];
+ util.displaySuccess('Data removed');
+ },
+ util.displayErrorFunction('Unable to remove Data')
+ );
+ },
+ createPerimeter: function createPerimeter(type, policy, perimeter) {
+ var categoryValue = categoryMap[type];
+ return categoryValue.policyPerimeterResource.create({ policy_id: policy.id }, perimeter).$promise.then(
+ function (data) {
+ util.displaySuccess('Perimeter created');
+ return util.mapToArray(data[categoryValue.perimeterResponseName]);
+ },
+ util.displayErrorFunction('Unable to create Perimeter')
+ );
+ },
+ removePerimeterFromPolicy: function removePerimeterFromPolicy(type, policy, perimeter) {
+ var categoryValue = categoryMap[type];
+
+ return categoryValue.policyPerimeterResource.remove({ policy_id: policy.id, perimeter_id: perimeter.id }, null).$promise.then(
+ function (data) {
+ util.displaySuccess('Perimeter removed');
+ return perimeter;
+ },
+ util.displayErrorFunction('Unable to remove Perimeter')
+ )
+ },
+ addPerimeterToPolicy: function addPerimeterToPolicy(type, policy, perimeter) {
+ var categoryValue = categoryMap[type];
+ perimeter.policy_list.push(policy.id);
+
+ return categoryValue.perimeterResource.update({ perimeter_id: perimeter.id }, perimeter).$promise.then(
+ function (data) {
+ util.displaySuccess('Perimeter added');
+ },
+ util.displayErrorFunction('Unable to add Perimeter')
+ )
+ },
+ loadPerimetersAndAssignments: function loadPerimetersAndAssignments(type, policy) {
+ var categoryValue = categoryMap[type];
+ var queries = {
+ allPerimeters: categoryValue.perimeterResource.query().$promise,
+ perimeters: categoryValue.policyPerimeterResource.query({ policy_id: policy.id }).$promise,
+ assignments: categoryValue.assignmentResource.query({ policy_id: policy.id }).$promise,
+ }
+
+ return $q.all(queries).then(function (data) {
+ var result = {};
+ result.assignments = util.mapToArray(data.assignments[categoryValue.assignmentResponseName]);
+ result.perimetersMap = data.perimeters[categoryValue.perimeterResponseName];
+ result.perimeters = util.mapToArray(result.perimetersMap);
+ result.allPerimeters = util.mapToArray(data.allPerimeters[categoryValue.perimeterResponseName]);
+ return result;
+ }, util.displayErrorFunction('Unable to load Perimeters'))
+
+ },
+ createAssignment: function createAssignment(type, policy, perimeter, data) {
+ var categoryValue = categoryMap[type];
+ var assignment = {
+ "id": perimeter.id,
+ "category_id": data.category_id,
+ "data_id": data.id,
+ "policy_id": policy.id
+ }
+ return categoryValue.assignmentResource.create({ policy_id: policy.id }, assignment).$promise.then(
+ function (data) {
+ util.displaySuccess('Assignment created');
+ return util.mapToArray(data[categoryValue.assignmentResponseName]);
+ },
+ util.displayErrorFunction('Unable to create Assignment')
+ )
+ },
+ removeAssignment: function removeAssignment(type, policy, perimeter, data) {
+ var categoryValue = categoryMap[type];
+
+ return categoryValue.assignmentResource.remove({ policy_id: policy.id, perimeter_id: perimeter.id, category_id: data.category_id, data_id: data.id }, null).$promise.then(
+ function (data) {
+ util.displaySuccess('Assignment removed');
+ },
+ util.displayErrorFunction('Unable to remove Assignment')
+ )
+ },
+ }
+
+ }
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/policy/policy.service.spec.js b/old/moon_dashboard/moon/static/moon/policy/policy.service.spec.js
new file mode 100755
index 00000000..8d0ca8bf
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/policy/policy.service.spec.js
@@ -0,0 +1,487 @@
+(function () {
+ 'use strict';
+
+ describe('moon.policy.service', function () {
+ var service, modelService, $httpBackend, URI;
+ var policiesData;
+ var modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData;
+ var rulesData, subjectsData, objectsData, actionsData;
+
+
+ function initData() {
+ policiesData = {
+ policies:
+ {
+ 'policyId1': { name: 'policy1', description: 'pDescription1', genre: 'genre1', model_id: 'modelId1' },
+ }
+ };
+
+ modelsData = {
+ models:
+ { 'modelId1': { name: 'model1', description: 'mDescription1', meta_rules: ['metaRuleId1'] } }
+ };
+
+ subjectCategoriesData = {
+ subject_categories:
+ {
+ 'subjectCategoryId1': { name: 'subjectCategory1', description: 'scDescription1' },
+ 'subjectCategoryId2': { name: 'subjectCategory2', description: 'scDescription2' }
+ },
+ };
+ objectCategoriesData = {
+ object_categories:
+ {
+ 'objectCategoryId1': { name: 'objectCategory1', description: 'ocDescription1' },
+ 'objectCategoryId2': { name: 'objectCategory2', description: 'ocDescription2' }
+ }
+ };
+ actionCategoriesData = {
+ action_categories:
+ {
+ 'actionCategoryId1': { name: 'actionCategory1', description: 'acDescription1' },
+ 'actionCategoryId2': { name: 'actionCategory2', description: 'acDescription2' }
+ }
+ };
+ metaRulesData = {
+ meta_rules:
+ {
+ 'metaRuleId1': { name: 'metaRule1', description: 'mrDescription1', subject_categories: ['subjectCategoryId1'], object_categories: ['objectCategoryId1'], action_categories: ['actionCategoryId1'] },
+ 'metaRuleId2': { name: 'metaRule2', description: 'mrDescription2', subject_categories: [], object_categories: [], action_categories: [] }
+ }
+ };
+ }
+
+ function initRuleData() {
+ rulesData = {
+ rules: {
+ rules: [
+ { meta_rule_id: 'metaRuleId1', rule: ['subjectId1', 'objectId1', 'actionId1'], id: 'ruleId1', instructions: { test: 'test' } }
+ ]
+ }
+ };
+
+ subjectsData = {
+ subject_data:
+ [
+ {
+ data: {
+ 'subjectId1': { name: 'subject1', description: 'sDescription1' },
+ }
+ }
+ ]
+ };
+ objectsData = {
+ object_data:
+ [
+ {
+ data: {
+ 'objectId1': { name: 'object1', description: 'oDescription1' },
+ }
+ }
+ ]
+ };
+ actionsData = {
+ action_data:
+ [
+ {
+ data: {
+ 'actionId1': { name: 'action1', description: 'aDescription1' },
+ }
+ }
+ ]
+ };
+ }
+
+ beforeEach(module('horizon.app.core'));
+ beforeEach(module('horizon.framework'));
+ beforeEach(module('moon'));
+
+ beforeEach(inject(function ($injector) {
+ service = $injector.get('moon.policy.service');
+ modelService = $injector.get('moon.model.service');
+ $httpBackend = $injector.get('$httpBackend');
+ URI = $injector.get('moon.URI');
+ }));
+
+ afterEach(function () {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ it('should initialize', function () {
+ initData();
+ $httpBackend.expectGET(URI.API + '/policies').respond(200, policiesData);
+ $httpBackend.expectGET(URI.API + '/subject_categories').respond(200, subjectCategoriesData);
+ $httpBackend.expectGET(URI.API + '/object_categories').respond(200, objectCategoriesData);
+ $httpBackend.expectGET(URI.API + '/action_categories').respond(200, actionCategoriesData);
+ $httpBackend.expectGET(URI.API + '/meta_rules').respond(200, metaRulesData);
+ $httpBackend.expectGET(URI.API + '/models').respond(200, modelsData);
+
+
+ service.initialize();
+ $httpBackend.flush();
+
+ expect(service.policies.length).toBe(1);
+ var policy = service.policies[0];
+ expect(policy.id).toBe('policyId1');
+ expect(policy.name).toBe('policy1');
+ expect(policy.description).toBe('pDescription1');
+ expect(policy.genre).toBe('genre1');
+ expect(policy.model.id).toBe('modelId1');
+
+ });
+
+
+
+ it('should create policy', function () {
+ initData();
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+
+ var policyCreatedData = {
+ policies:
+ { 'policyId1': { name: 'policy1', description: 'pDescription1', genre: 'genre1', model_id: 'modelId1' } }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/policies').respond(200, policyCreatedData);
+
+ service.createPolicy({ name: 'policy1', description: 'pDescription1', genre: 'genre1', model: modelService.getModel('modelId1') });
+ $httpBackend.flush();
+
+ expect(service.policies.length).toBe(1);
+ var policy = service.policies[0];
+ expect(policy.id).toBe('policyId1');
+ expect(policy.name).toBe('policy1');
+ expect(policy.description).toBe('pDescription1');
+ expect(policy.genre).toBe('genre1');
+ expect(policy.model.id).toBe('modelId1');
+ });
+
+ it('should remove policy', function () {
+ initData();
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+ service.createPolicies(policiesData);
+
+ $httpBackend.expectDELETE(URI.API + '/policies/policyId1').respond(200);
+
+ service.removePolicy({ id: 'policyId1' });
+ $httpBackend.flush();
+
+ expect(service.policies.length).toBe(0);
+ });
+
+ it('should update policy', function () {
+ initData();
+ var policyUpdatedData = {
+ policies:
+ { 'policyId1': { name: 'policy2', description: 'pDescription2', genre: 'genre2', model_id: 'modelId1' } }
+ };
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+ service.createPolicies(policiesData);
+
+ $httpBackend.expectPATCH(URI.API + '/policies/policyId1').respond(200, policyUpdatedData);
+
+ service.updatePolicy({ id: 'policyId1', name: 'policy2', description: 'pDescription2', genre: 'genre2', model: modelService.getModel('modelId1') });
+ $httpBackend.flush();
+
+ expect(service.policies.length).toBe(1);
+ var policy = service.policies[0];
+ expect(policy.id).toBe('policyId1');
+ expect(policy.name).toBe('policy2');
+ expect(policy.description).toBe('pDescription2');
+ expect(policy.genre).toBe('genre2');
+ expect(policy.model.id).toBe('modelId1');
+
+ });
+
+
+ it('should populate policy', function () {
+ initData();
+ initRuleData();
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+ service.createPolicies(policiesData);
+
+ var policy = service.getPolicy('policyId1')
+
+ $httpBackend.expectGET(URI.API + '/policies/policyId1/rules').respond(200, rulesData);
+ $httpBackend.expectGET(URI.API + '/policies/policyId1/subject_data').respond(200, subjectsData);
+ $httpBackend.expectGET(URI.API + '/policies/policyId1/object_data').respond(200, objectsData);
+ $httpBackend.expectGET(URI.API + '/policies/policyId1/action_data').respond(200, actionsData);
+
+ service.populatePolicy(policy);
+ $httpBackend.flush();
+
+ expect(policy.rules.length).toBe(1);
+ var rule = policy.rules[0];
+ expect(rule.id).toBe('ruleId1');
+ expect(rule.metaRule.id).toBe('metaRuleId1');
+ expect(rule.instructions.test).toBe('test');
+ expect(rule.subjectData.length).toBe(1);
+ expect(rule.subjectData[0].id).toBe('subjectId1');
+ expect(rule.objectData.length).toBe(1);
+ expect(rule.objectData[0].id).toBe('objectId1');
+ expect(rule.actionData.length).toBe(1);
+ expect(rule.actionData[0].id).toBe('actionId1');
+
+ expect(policy.subjectData.length).toBe(1);
+ var subjectData = policy.subjectData[0];
+ expect(subjectData.id).toBe('subjectId1');
+ expect(subjectData.name).toBe('subject1');
+ expect(subjectData.description).toBe('sDescription1');
+
+ expect(policy.objectData.length).toBe(1);
+ var objectData = policy.objectData[0];
+ expect(objectData.id).toBe('objectId1');
+ expect(objectData.name).toBe('object1');
+ expect(objectData.description).toBe('oDescription1');
+
+ expect(policy.actionData.length).toBe(1);
+ var actionData = policy.actionData[0];
+ expect(actionData.id).toBe('actionId1');
+ expect(actionData.name).toBe('action1');
+ expect(actionData.description).toBe('aDescription1');
+
+ });
+
+
+ it('should add rule to policy', function () {
+ initData();
+ initRuleData();
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+ service.createPolicies(policiesData);
+
+
+ var ruleCreatedData = {
+ rules: {
+ 'ruleId1': { meta_rule_id: 'metaRuleId1', rule: ['subjectId1', 'objectId1', 'actionId1'], instructions: { test: 'test' } }
+ }
+ };
+
+ var policy = service.getPolicy('policyId1');
+
+ service.createRules(policy, null, subjectsData, objectsData, actionsData);
+
+ $httpBackend.expectPOST(URI.API + '/policies/policyId1/rules').respond(200, ruleCreatedData);
+
+ service.addRuleToPolicy(policy, { meta_rule_id: 'metaRuleId1', rule: ['subjectId1', 'objectId1', 'actionId1'], instructions: { test: 'test' } });
+ $httpBackend.flush();
+
+ expect(policy.rules.length).toBe(1);
+ var rule = policy.rules[0];
+ expect(rule.id).toBe('ruleId1');
+ expect(rule.metaRule.id).toBe('metaRuleId1');
+ expect(rule.subjectData.length).toBe(1);
+ expect(rule.subjectData[0].id).toBe('subjectId1');
+ expect(rule.objectData.length).toBe(1);
+ expect(rule.objectData[0].id).toBe('objectId1');
+ expect(rule.actionData.length).toBe(1);
+ expect(rule.actionData[0].id).toBe('actionId1');
+
+ });
+
+ it('should remove rule from policy', function () {
+ initData();
+ initRuleData();
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+ service.createPolicies(policiesData);
+
+ var policy = service.getPolicy('policyId1');
+
+ service.createRules(policy, rulesData, subjectsData, objectsData, actionsData);
+
+ $httpBackend.expectDELETE(URI.API + '/policies/policyId1/rules/ruleId1').respond(200);
+
+ service.removeRuleFromPolicy(policy, { id: 'ruleId1' });
+ $httpBackend.flush();
+
+ expect(policy.rules.length).toBe(0);
+ });
+
+
+ it('should create data', function () {
+ initData();
+ initRuleData();
+ modelService.createModels(modelsData, metaRulesData, subjectCategoriesData, objectCategoriesData, actionCategoriesData);
+ service.createPolicies(policiesData);
+
+
+ var dataCreatedData = {
+ subject_data: {
+ data: {
+ 'subjectId1': { name: 'subject1', description: 'sDescription1' },
+ }
+ }
+ };
+
+ var policy = service.getPolicy('policyId1');
+ policy.subjectData = [];
+ policy.subjectDataMap = {};
+
+ $httpBackend.expectPOST(URI.API + '/policies/policyId1/subject_data/subjectCategoryId1').respond(200, dataCreatedData);
+
+ service.createData('subject', policy, modelService.getCategory('subject', 'subjectCategoryId1'), { name: 'subject1', description: 'sDescription1' });
+ $httpBackend.flush();
+
+ expect(policy.subjectData.length).toBe(1);
+ var subjectData = policy.subjectData[0];
+ expect(subjectData.id).toBe('subjectId1');
+ expect(subjectData.name).toBe('subject1');
+ expect(subjectData.description).toBe('sDescription1');
+
+ });
+
+ it('should create perimeter', function () {
+ var perimeterCreatedData = {
+ subjects: {
+ 'subjectId1': { name: 'subject1', description: 'sDescription1' },
+ }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/policies/policyId1/subjects').respond(200, perimeterCreatedData);
+ var type = 'subject';
+ var policy = { id: 'policyId1' };
+ var perimeter = { name: 'subject1', description: 'sDescription1' };
+
+ var promise = service.createPerimeter(type, policy, perimeter);
+ $httpBackend.flush();
+
+ promise.then(function (result) {
+ expect(result.length).toBe(1);
+ var perimeter = result[0];
+ expect(perimeter.id).toBe('subjectId1');
+ expect(perimeter.name).toBe('subject1');
+ expect(perimeter.description).toBe('sDescription1');
+ })
+ });
+
+ it('should remove perimeter', function () {
+ $httpBackend.expectDELETE(URI.API + '/policies/policyId1/subjects/subjectId1').respond(200);
+ var type = 'subject';
+ var policy = { id: 'policyId1' };
+ var perimeter = { id: 'subjectId1' };
+
+ var promise = service.removePerimeterFromPolicy(type, policy, perimeter);
+ $httpBackend.flush();
+
+ promise.then(function (result) {
+ expect(result.id).toBe('subjectId1');
+ })
+ });
+
+ it('should load perimeters and assignments', function () {
+ var assignmentsData = {
+ subject_assignments: {
+ 'subjectAssignmentId1': {
+ id: 'subjectAssignmentId1',
+ policy_id: 'policyId1',
+ subject_id: 'subjectId1',
+ category_id: 'subjectCategoryId1',
+ assignments: ['subjectDataId1']
+ },
+ }
+ };
+
+ var perimetersData = {
+ subjects: {
+ 'subjectId1': { name: 'subject1', description: 'sDescription1' },
+ }
+ };
+
+ var allPerimetersData = {
+ subjects: {
+ 'subjectId1': { name: 'subject1', description: 'sDescription1' },
+ 'subjectId2': { name: 'subject2', description: 'sDescription2' },
+ }
+ };
+
+ var type = 'subject';
+ var policy = { id: 'policyId1' };
+ $httpBackend.expectGET(URI.API + '/subjects').respond(200, allPerimetersData);
+ $httpBackend.expectGET(URI.API + '/policies/policyId1/subjects').respond(200, perimetersData);
+ $httpBackend.expectGET(URI.API + '/policies/policyId1/subject_assignments').respond(200, assignmentsData);
+
+ var promise = service.loadPerimetersAndAssignments(type, policy);
+
+ $httpBackend.flush();
+
+ promise.then(function (result) {
+ expect(result.perimeters.length).toBe(1);
+ var perimeter = result.perimeters[0];
+ expect(perimeter.id).toBe('subjectId1');
+ expect(perimeter.name).toBe('subject1');
+ expect(perimeter.description).toBe('sDescription1');
+
+ expect(result.allPerimeters.length).toBe(2);
+ perimeter = result.allPerimeters[0];
+ expect(perimeter.id).toBe('subjectId1');
+ expect(perimeter.name).toBe('subject1');
+ expect(perimeter.description).toBe('sDescription1');
+
+ perimeter = result.allPerimeters[1];
+ expect(perimeter.id).toBe('subjectId2');
+ expect(perimeter.name).toBe('subject2');
+ expect(perimeter.description).toBe('sDescription2');
+
+
+ expect(result.assignments.length).toBe(1);
+ var assignment = result.assignments[0];
+ expect(assignment.id).toBe('subjectAssignmentId1');
+ expect(assignment.policy_id).toBe('policyId1');
+ expect(assignment.subject_id).toBe('subjectId1');
+ expect(assignment.category_id).toBe('subjectCategoryId1');
+ expect(assignment.assignments.length).toBe(1);
+ expect(assignment.assignments[0]).toBe('subjectDataId1');
+ })
+
+ });
+
+ it('should create assignment', function () {
+ var assignmentCreatedData = {
+ subject_assignments: {
+ 'subjectAssignmentId1': {
+ id: 'subjectAssignmentId1',
+ policy_id: 'policyId1',
+ subject_id: 'subjectId1',
+ category_id: 'subjectCategoryId1',
+ assignments: ['subjectDataId1']
+ },
+ }
+ };
+
+ var type = 'subject';
+ var policy = { id: 'policyId1' };
+ var perimeter = { id: 'subjectId1' };
+ var data = { id: 'subjectDataId1', category_id: 'subjectCategoryId1'};
+
+ $httpBackend.expectPOST(URI.API + '/policies/policyId1/subject_assignments').respond(200, assignmentCreatedData);
+ var promise = service.createAssignment(type, policy, perimeter, data);
+
+ $httpBackend.flush();
+
+ promise.then(function (result) {
+ expect(result.length).toBe(1);
+ var assignment = result[0];
+ expect(assignment.id).toBe('subjectAssignmentId1');
+ expect(assignment.policy_id).toBe('policyId1');
+ expect(assignment.subject_id).toBe('subjectId1');
+ expect(assignment.category_id).toBe('subjectCategoryId1');
+ expect(assignment.assignments.length).toBe(1);
+ expect(assignment.assignments[0]).toBe('subjectDataId1');
+ })
+ });
+
+ it('should remove assignment', function () {
+ var type = 'subject';
+ var policy = { id: 'policyId1' };
+ var perimeter = { id: 'subjectId1' };
+ var data = { id: 'subjectDataId1', category_id: 'subjectCategoryId1'};
+
+ $httpBackend.expectDELETE(URI.API + '/policies/policyId1/subject_assignments/subjectId1/subjectCategoryId1/subjectDataId1').respond(200);
+ service.removeAssignment(type, policy, perimeter, data);
+ $httpBackend.flush();
+ });
+
+
+ });
+
+
+})(); \ No newline at end of file
diff --git a/old/moon_dashboard/moon/static/moon/scss/moon.scss b/old/moon_dashboard/moon/static/moon/scss/moon.scss
new file mode 100644
index 00000000..3cdbb6e3
--- /dev/null
+++ b/old/moon_dashboard/moon/static/moon/scss/moon.scss
@@ -0,0 +1,58 @@
+.inline {
+ display: inline;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+summary{
+ outline:none;
+ margin-bottom: 10px;
+}
+
+details {
+ cursor: default;
+}
+
+.filter {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+}
+
+.categories td {
+ width: 33%;
+}
+
+.width-200 {
+ width: 200px;
+}
+
+.height-200 {
+ height: 200px;
+}
+
+.border {
+ border: 1px #DDD solid;
+}
+
+.padding-10 {
+ padding: 10px;
+}
+
+.scroll {
+ overflow-y: auto;
+}
+
+.mt-5 {
+ margin-top: 5px;
+}
+
+.input-file {
+ display: none !important;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+} \ No newline at end of file
diff --git a/old/moon_dashboard/moon/templates/moon/base.html b/old/moon_dashboard/moon/templates/moon/base.html
new file mode 100644
index 00000000..f07a01ba
--- /dev/null
+++ b/old/moon_dashboard/moon/templates/moon/base.html
@@ -0,0 +1,11 @@
+{% load horizon %}{% jstemplate %}[% extends 'base.html' %]
+
+[% block sidebar %]
+ [% include 'horizon/common/_sidebar.html' %]
+[% endblock %]
+
+[% block main %]
+ [% include "horizon/_messages.html" %]
+ [% block {{ dash_name }}_main %][% endblock %]
+[% endblock %]
+{% endjstemplate %}
diff --git a/old/moon_dashboard/run.sh b/old/moon_dashboard/run.sh
new file mode 100644
index 00000000..9a68ca6e
--- /dev/null
+++ b/old/moon_dashboard/run.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+# sudo docker run -ti --rm -p 8000:8000 -e MANAGER_HOST=localhost -e MANAGER_PORT=30001 -e KEYSTONE_HOST=localhost -e KEYSTONE_PORT=30005 moonplatform/dashboard:dev
+
+echo -----------------------------------
+export OPENSTACK_KEYSTONE_URL="http://${KEYSTONE_HOST}:${KEYSTONE_PORT}/identity/v3"
+echo MANAGER_HOST=${MANAGER_HOST}
+echo MANAGER_PORT=${MANAGER_PORT}
+echo KEYSTONE_HOST=${KEYSTONE_HOST}
+echo KEYSTONE_PORT=${KEYSTONE_PORT}
+echo OPENSTACK_HOST=${OPENSTACK_HOST}
+echo OPENSTACK_KEYSTONE_URL=${OPENSTACK_KEYSTONE_URL}
+echo SERVER_IP_ADDR=${SERVER_IP_ADDR}
+echo -----------------------------------
+
+CONSTANT_FILE=/root/horizon/openstack_dashboard/dashboards/moon/static/moon/js/moon.module.js
+
+sed "s/{{MANAGER_HOST}}/${MANAGER_HOST}/g" -i ${CONSTANT_FILE}
+sed "s/{{MANAGER_PORT}}/${MANAGER_PORT}/g" -i ${CONSTANT_FILE}
+sed "s/{{KEYSTONE_HOST}}/${KEYSTONE_HOST}/g" -i ${CONSTANT_FILE}
+sed "s/{{KEYSTONE_PORT}}/${KEYSTONE_PORT}/g" -i ${CONSTANT_FILE}
+
+cd /root/horizon
+
+LOCAL_SETTINGS=/root/horizon/openstack_dashboard/local/local_settings.py
+
+sed "s/OPENSTACK_HOST = \"127.0.0.1\"/OPENSTACK_HOST = \"${OPENSTACK_HOST}\"/" -i ${LOCAL_SETTINGS}
+sed "s#OPENSTACK_KEYSTONE_URL = \"http://%s:5000/v3\" % OPENSTACK_HOST#OPENSTACK_KEYSTONE_URL = \"${OPENSTACK_KEYSTONE_URL}\"#" -i ${LOCAL_SETTINGS}
+sed "s/#ALLOWED_HOSTS = \['horizon.example.com', \]/ALLOWED_HOSTS = \['${SERVER_IP_ADDR}'\]/" -i ${LOCAL_SETTINGS}
+
+echo -----------------
+grep OPENSTACK_HOST ${LOCAL_SETTINGS}
+grep ALLOWED_HOSTS ${LOCAL_SETTINGS}
+echo -----------------
+export NO_PROXY=127.0.0.1,10.0.2.15,10.96.0.0/12,192.168.0.0/16,10.192.118.95,10.192.118.96,keystone,manager,devstack
+
+echo "${KEYSTONE_HOST} devstack, keystone" | tee -a /etc/hosts
+
+echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ${CONSTANT_FILE}"
+cat ${CONSTANT_FILE}
+echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+
+tox -e runserver -- 0.0.0.0:8000
diff --git a/old/moon_dashboard/setup.cfg b/old/moon_dashboard/setup.cfg
new file mode 100644
index 00000000..9cf3f779
--- /dev/null
+++ b/old/moon_dashboard/setup.cfg
@@ -0,0 +1,24 @@
+[metadata]
+name = moon
+version=1.5.0
+summary = A dashboard plugin for Moon
+description-file =
+ README.rst
+author = Jonathan Gourdin
+author_email = jonathan.gourdin@orange.com
+home-page = https://docs.openstack.org/horizon/latest/
+classifiers = [
+ Environment :: OpenStack
+ Framework :: Django
+ Intended Audience :: Developers
+ Intended Audience :: System Administrators
+ License :: OSI Approved :: Apache Software License
+ Operating System :: POSIX :: Linux
+ Programming Language :: Python
+ Programming Language :: Python :: 2
+ Programming Language :: Python :: 2.7
+ Programming Language :: Python :: 3.5
+
+[files]
+packages =
+ moon \ No newline at end of file
diff --git a/old/moon_dashboard/setup.py b/old/moon_dashboard/setup.py
new file mode 100644
index 00000000..4794e334
--- /dev/null
+++ b/old/moon_dashboard/setup.py
@@ -0,0 +1,14 @@
+# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
+import setuptools
+
+# In python < 2.7.4, a lazy loading of package `pbr` will break
+# setuptools if some other modules registered functions in `atexit`.
+# solution from: http://bugs.python.org/issue15881#msg170215
+try:
+ import multiprocessing # noqa
+except ImportError:
+ pass
+
+setuptools.setup(
+ setup_requires=['pbr>=1.8'],
+ pbr=True) \ No newline at end of file
diff --git a/old/moon_forming/.gitignore b/old/moon_forming/.gitignore
new file mode 100644
index 00000000..7bff7318
--- /dev/null
+++ b/old/moon_forming/.gitignore
@@ -0,0 +1,105 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
diff --git a/old/moon_forming/Changelog b/old/moon_forming/Changelog
new file mode 100644
index 00000000..a107efd9
--- /dev/null
+++ b/old/moon_forming/Changelog
@@ -0,0 +1,11 @@
+CHANGES
+=======
+
+1.4.0
+-----
+- Update the python_moondb version to 1.2.10
+
+1.4.1
+-----
+- Update the python_moondb version to 1.2.16
+
diff --git a/moon_forming/Dockerfile b/old/moon_forming/Dockerfile
index ffae02c5..3a39880b 100644
--- a/moon_forming/Dockerfile
+++ b/old/moon_forming/Dockerfile
@@ -1,5 +1,13 @@
FROM python:3
+
+LABEL Name=Forming
+LABEL Description="Configuration job for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+USER root
+
WORKDIR /usr/src/app
RUN pip install --no-cache-dir --upgrade requests pytest pyyaml python_moonutilities python_moondb python_moonclient
diff --git a/moon_forming/README.md b/old/moon_forming/README.md
index 9b755d96..9b755d96 100644
--- a/moon_forming/README.md
+++ b/old/moon_forming/README.md
diff --git a/moon_forming/conf2consul.py b/old/moon_forming/conf2consul.py
index 148bf923..df7a6b18 100644
--- a/moon_forming/conf2consul.py
+++ b/old/moon_forming/conf2consul.py
@@ -6,6 +6,8 @@ import logging
import json
import base64
+__version__ = "1.4.1"
+
logging.basicConfig(level=logging.INFO)
log = logging.getLogger("moon.conf2consul")
requests_log = logging.getLogger("requests.packages.urllib3")
diff --git a/moon_forming/config_moon.sh b/old/moon_forming/config_moon.sh
index 0a55898f..0a55898f 100644
--- a/moon_forming/config_moon.sh
+++ b/old/moon_forming/config_moon.sh
diff --git a/moon_gui/.gitignore b/old/moon_gui/.gitignore
index 04bca1bc..04bca1bc 100644
--- a/moon_gui/.gitignore
+++ b/old/moon_gui/.gitignore
diff --git a/moon_gui/.jshintrc b/old/moon_gui/.jshintrc
index b9955f87..b9955f87 100644
--- a/moon_gui/.jshintrc
+++ b/old/moon_gui/.jshintrc
diff --git a/moon_gui/DEV.md b/old/moon_gui/DEV.md
index 1bd1ef4c..1bd1ef4c 100644
--- a/moon_gui/DEV.md
+++ b/old/moon_gui/DEV.md
diff --git a/moon_gui/Dockerfile b/old/moon_gui/Dockerfile
index 428e1037..428e1037 100644
--- a/moon_gui/Dockerfile
+++ b/old/moon_gui/Dockerfile
diff --git a/moon_gui/README.md b/old/moon_gui/README.md
index ea46b079..ea46b079 100644
--- a/moon_gui/README.md
+++ b/old/moon_gui/README.md
diff --git a/moon_gui/delivery/assets/css/main.css b/old/moon_gui/delivery/assets/css/main.css
index 3aefca39..3aefca39 100644
--- a/moon_gui/delivery/assets/css/main.css
+++ b/old/moon_gui/delivery/assets/css/main.css
diff --git a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.eot b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.eot
index 4a4ca865..4a4ca865 100644
--- a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.eot
+++ b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.svg b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.svg
index e3e2dc73..e3e2dc73 100644
--- a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.svg
+++ b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.svg
diff --git a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.ttf b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.ttf
index 67fa00bf..67fa00bf 100644
--- a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.ttf
+++ b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.woff b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.woff
index 8c54182a..8c54182a 100644
--- a/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.woff
+++ b/old/moon_gui/delivery/assets/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/moon_gui/delivery/assets/i18n/en.json b/old/moon_gui/delivery/assets/i18n/en.json
index 4dc7cea5..4dc7cea5 100755
--- a/moon_gui/delivery/assets/i18n/en.json
+++ b/old/moon_gui/delivery/assets/i18n/en.json
diff --git a/moon_gui/delivery/assets/i18n/fr.json b/old/moon_gui/delivery/assets/i18n/fr.json
index 85c513b3..85c513b3 100755
--- a/moon_gui/delivery/assets/i18n/fr.json
+++ b/old/moon_gui/delivery/assets/i18n/fr.json
diff --git a/moon_gui/delivery/assets/img/ajax-loader.gif b/old/moon_gui/delivery/assets/img/ajax-loader.gif
index d0bce154..d0bce154 100755
--- a/moon_gui/delivery/assets/img/ajax-loader.gif
+++ b/old/moon_gui/delivery/assets/img/ajax-loader.gif
Binary files differ
diff --git a/moon_gui/delivery/assets/img/ajax-waiting.gif b/old/moon_gui/delivery/assets/img/ajax-waiting.gif
index d84f6537..d84f6537 100755
--- a/moon_gui/delivery/assets/img/ajax-waiting.gif
+++ b/old/moon_gui/delivery/assets/img/ajax-waiting.gif
Binary files differ
diff --git a/moon_gui/delivery/assets/img/arrow-link.gif b/old/moon_gui/delivery/assets/img/arrow-link.gif
index ca17f44b..ca17f44b 100755
--- a/moon_gui/delivery/assets/img/arrow-link.gif
+++ b/old/moon_gui/delivery/assets/img/arrow-link.gif
Binary files differ
diff --git a/moon_gui/delivery/assets/img/et.jpg b/old/moon_gui/delivery/assets/img/et.jpg
index 67cc0a9d..67cc0a9d 100644
--- a/moon_gui/delivery/assets/img/et.jpg
+++ b/old/moon_gui/delivery/assets/img/et.jpg
Binary files differ
diff --git a/moon_gui/delivery/assets/img/favicon.ico b/old/moon_gui/delivery/assets/img/favicon.ico
index a7910bf5..a7910bf5 100755
--- a/moon_gui/delivery/assets/img/favicon.ico
+++ b/old/moon_gui/delivery/assets/img/favicon.ico
Binary files differ
diff --git a/moon_gui/delivery/assets/img/logo-openstack.png b/old/moon_gui/delivery/assets/img/logo-openstack.png
index 60ab0e1e..60ab0e1e 100755
--- a/moon_gui/delivery/assets/img/logo-openstack.png
+++ b/old/moon_gui/delivery/assets/img/logo-openstack.png
Binary files differ
diff --git a/moon_gui/delivery/assets/img/logo-orange.gif b/old/moon_gui/delivery/assets/img/logo-orange.gif
index 9c612291..9c612291 100755
--- a/moon_gui/delivery/assets/img/logo-orange.gif
+++ b/old/moon_gui/delivery/assets/img/logo-orange.gif
Binary files differ
diff --git a/moon_gui/delivery/html/authentication/authentication.tpl.html b/old/moon_gui/delivery/html/authentication/authentication.tpl.html
index d942d8e8..d942d8e8 100644
--- a/moon_gui/delivery/html/authentication/authentication.tpl.html
+++ b/old/moon_gui/delivery/html/authentication/authentication.tpl.html
diff --git a/moon_gui/delivery/html/common/404/404.tpl.html b/old/moon_gui/delivery/html/common/404/404.tpl.html
index f03a2e98..f03a2e98 100644
--- a/moon_gui/delivery/html/common/404/404.tpl.html
+++ b/old/moon_gui/delivery/html/common/404/404.tpl.html
diff --git a/moon_gui/delivery/html/common/compatibility/compatibility.tpl.html b/old/moon_gui/delivery/html/common/compatibility/compatibility.tpl.html
index 26c0f09e..26c0f09e 100644
--- a/moon_gui/delivery/html/common/compatibility/compatibility.tpl.html
+++ b/old/moon_gui/delivery/html/common/compatibility/compatibility.tpl.html
diff --git a/moon_gui/delivery/html/common/footer/footer.tpl.html b/old/moon_gui/delivery/html/common/footer/footer.tpl.html
index 6c01bd92..6c01bd92 100644
--- a/moon_gui/delivery/html/common/footer/footer.tpl.html
+++ b/old/moon_gui/delivery/html/common/footer/footer.tpl.html
diff --git a/moon_gui/delivery/html/common/header/header.tpl.html b/old/moon_gui/delivery/html/common/header/header.tpl.html
index 92224309..92224309 100644
--- a/moon_gui/delivery/html/common/header/header.tpl.html
+++ b/old/moon_gui/delivery/html/common/header/header.tpl.html
diff --git a/moon_gui/delivery/html/common/loader/loader.tpl.html b/old/moon_gui/delivery/html/common/loader/loader.tpl.html
index dc52e911..dc52e911 100644
--- a/moon_gui/delivery/html/common/loader/loader.tpl.html
+++ b/old/moon_gui/delivery/html/common/loader/loader.tpl.html
diff --git a/moon_gui/delivery/html/common/waiting/waiting.tpl.html b/old/moon_gui/delivery/html/common/waiting/waiting.tpl.html
index eca2ae9e..eca2ae9e 100644
--- a/moon_gui/delivery/html/common/waiting/waiting.tpl.html
+++ b/old/moon_gui/delivery/html/common/waiting/waiting.tpl.html
diff --git a/moon_gui/delivery/html/dashboard/dashboard.tpl.html b/old/moon_gui/delivery/html/dashboard/dashboard.tpl.html
index caee0db0..caee0db0 100644
--- a/moon_gui/delivery/html/dashboard/dashboard.tpl.html
+++ b/old/moon_gui/delivery/html/dashboard/dashboard.tpl.html
diff --git a/moon_gui/delivery/html/logs/logs.tpl.html b/old/moon_gui/delivery/html/logs/logs.tpl.html
index bb6dd686..bb6dd686 100644
--- a/moon_gui/delivery/html/logs/logs.tpl.html
+++ b/old/moon_gui/delivery/html/logs/logs.tpl.html
diff --git a/moon_gui/delivery/html/model/action/model-add.tpl.html b/old/moon_gui/delivery/html/model/action/model-add.tpl.html
index ed370f05..ed370f05 100644
--- a/moon_gui/delivery/html/model/action/model-add.tpl.html
+++ b/old/moon_gui/delivery/html/model/action/model-add.tpl.html
diff --git a/moon_gui/delivery/html/model/action/model-delete.tpl.html b/old/moon_gui/delivery/html/model/action/model-delete.tpl.html
index a3e51261..a3e51261 100644
--- a/moon_gui/delivery/html/model/action/model-delete.tpl.html
+++ b/old/moon_gui/delivery/html/model/action/model-delete.tpl.html
diff --git a/moon_gui/delivery/html/model/action/model-view.tpl.html b/old/moon_gui/delivery/html/model/action/model-view.tpl.html
index 4e016c12..4e016c12 100644
--- a/moon_gui/delivery/html/model/action/model-view.tpl.html
+++ b/old/moon_gui/delivery/html/model/action/model-view.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metadata/metadata-edit.tpl.html b/old/moon_gui/delivery/html/model/edit/metadata/metadata-edit.tpl.html
index 188c3678..188c3678 100644
--- a/moon_gui/delivery/html/model/edit/metadata/metadata-edit.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metadata/metadata-edit.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metadata/metadata-list.tpl.html b/old/moon_gui/delivery/html/model/edit/metadata/metadata-list.tpl.html
index 050bfbce..050bfbce 100644
--- a/moon_gui/delivery/html/model/edit/metadata/metadata-list.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metadata/metadata-list.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-add.tpl.html b/old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-add.tpl.html
index 8593236d..8593236d 100644
--- a/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-add.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-add.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-map.tpl.html b/old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-map.tpl.html
index 9041f072..9041f072 100644
--- a/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-map.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-map.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-unmap.tpl.html b/old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-unmap.tpl.html
index 37e21f11..37e21f11 100644
--- a/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-unmap.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metarules/action/mapping/metarules-unmap.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit-basic.tpl.html b/old/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit-basic.tpl.html
index 3a171600..3a171600 100644
--- a/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit-basic.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit-basic.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit.tpl.html b/old/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit.tpl.html
index 5c454d3f..5c454d3f 100644
--- a/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metarules/action/metarules-edit.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/metarules/metarules-list.tpl.html b/old/moon_gui/delivery/html/model/edit/metarules/metarules-list.tpl.html
index c6d6c92e..c6d6c92e 100644
--- a/moon_gui/delivery/html/model/edit/metarules/metarules-list.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/metarules/metarules-list.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/model-edit-basic.tpl.html b/old/moon_gui/delivery/html/model/edit/model-edit-basic.tpl.html
index a645b1ee..a645b1ee 100644
--- a/moon_gui/delivery/html/model/edit/model-edit-basic.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/model-edit-basic.tpl.html
diff --git a/moon_gui/delivery/html/model/edit/model-edit.tpl.html b/old/moon_gui/delivery/html/model/edit/model-edit.tpl.html
index 10f4545b..10f4545b 100644
--- a/moon_gui/delivery/html/model/edit/model-edit.tpl.html
+++ b/old/moon_gui/delivery/html/model/edit/model-edit.tpl.html
diff --git a/moon_gui/delivery/html/model/model-list.tpl.html b/old/moon_gui/delivery/html/model/model-list.tpl.html
index 138a66b7..138a66b7 100644
--- a/moon_gui/delivery/html/model/model-list.tpl.html
+++ b/old/moon_gui/delivery/html/model/model-list.tpl.html
diff --git a/moon_gui/delivery/html/pdp/action/pdp-add.tpl.html b/old/moon_gui/delivery/html/pdp/action/pdp-add.tpl.html
index 5d8b2b65..5d8b2b65 100644
--- a/moon_gui/delivery/html/pdp/action/pdp-add.tpl.html
+++ b/old/moon_gui/delivery/html/pdp/action/pdp-add.tpl.html
diff --git a/moon_gui/delivery/html/pdp/action/pdp-delete.tpl.html b/old/moon_gui/delivery/html/pdp/action/pdp-delete.tpl.html
index f5f1d322..f5f1d322 100644
--- a/moon_gui/delivery/html/pdp/action/pdp-delete.tpl.html
+++ b/old/moon_gui/delivery/html/pdp/action/pdp-delete.tpl.html
diff --git a/moon_gui/delivery/html/pdp/edit/pdp-edit-basic.tpl.html b/old/moon_gui/delivery/html/pdp/edit/pdp-edit-basic.tpl.html
index e15e27e0..e15e27e0 100644
--- a/moon_gui/delivery/html/pdp/edit/pdp-edit-basic.tpl.html
+++ b/old/moon_gui/delivery/html/pdp/edit/pdp-edit-basic.tpl.html
diff --git a/moon_gui/delivery/html/pdp/edit/pdp-edit.tpl.html b/old/moon_gui/delivery/html/pdp/edit/pdp-edit.tpl.html
index 96b3dd78..96b3dd78 100644
--- a/moon_gui/delivery/html/pdp/edit/pdp-edit.tpl.html
+++ b/old/moon_gui/delivery/html/pdp/edit/pdp-edit.tpl.html
diff --git a/moon_gui/delivery/html/pdp/pdp-list.tpl.html b/old/moon_gui/delivery/html/pdp/pdp-list.tpl.html
index 31d1aae0..31d1aae0 100644
--- a/moon_gui/delivery/html/pdp/pdp-list.tpl.html
+++ b/old/moon_gui/delivery/html/pdp/pdp-list.tpl.html
diff --git a/moon_gui/delivery/html/policy/action/mapping/policy-map.tpl.html b/old/moon_gui/delivery/html/policy/action/mapping/policy-map.tpl.html
index 0d185618..0d185618 100644
--- a/moon_gui/delivery/html/policy/action/mapping/policy-map.tpl.html
+++ b/old/moon_gui/delivery/html/policy/action/mapping/policy-map.tpl.html
diff --git a/moon_gui/delivery/html/policy/action/mapping/policy-unmap.tpl.html b/old/moon_gui/delivery/html/policy/action/mapping/policy-unmap.tpl.html
index 844510e9..844510e9 100644
--- a/moon_gui/delivery/html/policy/action/mapping/policy-unmap.tpl.html
+++ b/old/moon_gui/delivery/html/policy/action/mapping/policy-unmap.tpl.html
diff --git a/moon_gui/delivery/html/policy/action/policy-add.tpl.html b/old/moon_gui/delivery/html/policy/action/policy-add.tpl.html
index 17f714c8..17f714c8 100644
--- a/moon_gui/delivery/html/policy/action/policy-add.tpl.html
+++ b/old/moon_gui/delivery/html/policy/action/policy-add.tpl.html
diff --git a/moon_gui/delivery/html/policy/action/policy-delete.tpl.html b/old/moon_gui/delivery/html/policy/action/policy-delete.tpl.html
index 2e042fc0..2e042fc0 100644
--- a/moon_gui/delivery/html/policy/action/policy-delete.tpl.html
+++ b/old/moon_gui/delivery/html/policy/action/policy-delete.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-edit.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-edit.tpl.html
index 4d9e8a85..4d9e8a85 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-edit.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-edit.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-list.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-list.tpl.html
index 6cae38d8..6cae38d8 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-list.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/assignments/assignments-list.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/data/data-edit.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/data/data-edit.tpl.html
index d63f6683..d63f6683 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/data/data-edit.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/data/data-edit.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/data/data-list.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/data/data-list.tpl.html
index ef9b2ba7..ef9b2ba7 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/data/data-list.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/data/data-list.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-edit.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-edit.tpl.html
index 23b29cb5..23b29cb5 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-edit.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-edit.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-list.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-list.tpl.html
index 5331e640..5331e640 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-list.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/perimeter/perimeter-list.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/rules/rules-edit.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/rules/rules-edit.tpl.html
index 46716d0d..46716d0d 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/rules/rules-edit.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/rules/rules-edit.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/parameter/rules/rules-list.tpl.html b/old/moon_gui/delivery/html/policy/edit/parameter/rules/rules-list.tpl.html
index 25cfe6f1..25cfe6f1 100644
--- a/moon_gui/delivery/html/policy/edit/parameter/rules/rules-list.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/parameter/rules/rules-list.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/policy-edit-basic.tpl.html b/old/moon_gui/delivery/html/policy/edit/policy-edit-basic.tpl.html
index 23f760d4..23f760d4 100644
--- a/moon_gui/delivery/html/policy/edit/policy-edit-basic.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/policy-edit-basic.tpl.html
diff --git a/moon_gui/delivery/html/policy/edit/policy-edit.tpl.html b/old/moon_gui/delivery/html/policy/edit/policy-edit.tpl.html
index f32497a2..f32497a2 100644
--- a/moon_gui/delivery/html/policy/edit/policy-edit.tpl.html
+++ b/old/moon_gui/delivery/html/policy/edit/policy-edit.tpl.html
diff --git a/moon_gui/delivery/html/policy/policy-list.tpl.html b/old/moon_gui/delivery/html/policy/policy-list.tpl.html
index 2e8a981c..2e8a981c 100644
--- a/moon_gui/delivery/html/policy/policy-list.tpl.html
+++ b/old/moon_gui/delivery/html/policy/policy-list.tpl.html
diff --git a/moon_gui/delivery/html/policy/policy-mapped-list.tpl.html b/old/moon_gui/delivery/html/policy/policy-mapped-list.tpl.html
index 2e18a1b5..2e18a1b5 100644
--- a/moon_gui/delivery/html/policy/policy-mapped-list.tpl.html
+++ b/old/moon_gui/delivery/html/policy/policy-mapped-list.tpl.html
diff --git a/moon_gui/delivery/html/project/action/mapping/project-map.tpl.html b/old/moon_gui/delivery/html/project/action/mapping/project-map.tpl.html
index 13cef98b..13cef98b 100644
--- a/moon_gui/delivery/html/project/action/mapping/project-map.tpl.html
+++ b/old/moon_gui/delivery/html/project/action/mapping/project-map.tpl.html
diff --git a/moon_gui/delivery/html/project/action/mapping/project-unmap.tpl.html b/old/moon_gui/delivery/html/project/action/mapping/project-unmap.tpl.html
index 735011a9..735011a9 100644
--- a/moon_gui/delivery/html/project/action/mapping/project-unmap.tpl.html
+++ b/old/moon_gui/delivery/html/project/action/mapping/project-unmap.tpl.html
diff --git a/moon_gui/delivery/html/project/action/project-add.tpl.html b/old/moon_gui/delivery/html/project/action/project-add.tpl.html
index 4db03982..4db03982 100644
--- a/moon_gui/delivery/html/project/action/project-add.tpl.html
+++ b/old/moon_gui/delivery/html/project/action/project-add.tpl.html
diff --git a/moon_gui/delivery/html/project/action/project-delete.tpl.html b/old/moon_gui/delivery/html/project/action/project-delete.tpl.html
index 867a6674..867a6674 100644
--- a/moon_gui/delivery/html/project/action/project-delete.tpl.html
+++ b/old/moon_gui/delivery/html/project/action/project-delete.tpl.html
diff --git a/moon_gui/delivery/html/project/action/project-view.tpl.html b/old/moon_gui/delivery/html/project/action/project-view.tpl.html
index 157eec80..157eec80 100644
--- a/moon_gui/delivery/html/project/action/project-view.tpl.html
+++ b/old/moon_gui/delivery/html/project/action/project-view.tpl.html
diff --git a/moon_gui/delivery/html/project/project-list.tpl.html b/old/moon_gui/delivery/html/project/project-list.tpl.html
index d0ab8886..d0ab8886 100644
--- a/moon_gui/delivery/html/project/project-list.tpl.html
+++ b/old/moon_gui/delivery/html/project/project-list.tpl.html
diff --git a/moon_gui/delivery/index.html b/old/moon_gui/delivery/index.html
index 0631ab7a..0631ab7a 100644
--- a/moon_gui/delivery/index.html
+++ b/old/moon_gui/delivery/index.html
diff --git a/moon_gui/delivery/js/app.js b/old/moon_gui/delivery/js/app.js
index 96bb1f6a..96bb1f6a 100644
--- a/moon_gui/delivery/js/app.js
+++ b/old/moon_gui/delivery/js/app.js
diff --git a/moon_gui/delivery/js/modules.js b/old/moon_gui/delivery/js/modules.js
index ec3b37a3..ec3b37a3 100644
--- a/moon_gui/delivery/js/modules.js
+++ b/old/moon_gui/delivery/js/modules.js
diff --git a/moon_gui/delivery/version.json b/old/moon_gui/delivery/version.json
index 0e224bd8..0e224bd8 100755
--- a/moon_gui/delivery/version.json
+++ b/old/moon_gui/delivery/version.json
diff --git a/moon_gui/gulpfile.js b/old/moon_gui/gulpfile.js
index 5929da4b..5929da4b 100644
--- a/moon_gui/gulpfile.js
+++ b/old/moon_gui/gulpfile.js
diff --git a/moon_gui/package.json b/old/moon_gui/package.json
index 599452e4..45157e5e 100644
--- a/moon_gui/package.json
+++ b/old/moon_gui/package.json
@@ -50,5 +50,5 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
- "license": "ISC"
+ "license": "Apache-2.0"
}
diff --git a/moon_gui/run.sh b/old/moon_gui/run.sh
index 94bc8360..94bc8360 100644
--- a/moon_gui/run.sh
+++ b/old/moon_gui/run.sh
diff --git a/moon_gui/static/app/authentication/authentication.controller.js b/old/moon_gui/static/app/authentication/authentication.controller.js
index ce38bc5f..ce38bc5f 100755
--- a/moon_gui/static/app/authentication/authentication.controller.js
+++ b/old/moon_gui/static/app/authentication/authentication.controller.js
diff --git a/moon_gui/static/app/authentication/authentication.tpl.html b/old/moon_gui/static/app/authentication/authentication.tpl.html
index 77d1646b..77d1646b 100755
--- a/moon_gui/static/app/authentication/authentication.tpl.html
+++ b/old/moon_gui/static/app/authentication/authentication.tpl.html
diff --git a/moon_gui/static/app/common/404/404.tpl.html b/old/moon_gui/static/app/common/404/404.tpl.html
index 61e0420c..61e0420c 100755
--- a/moon_gui/static/app/common/404/404.tpl.html
+++ b/old/moon_gui/static/app/common/404/404.tpl.html
diff --git a/moon_gui/static/app/common/compatibility/compatibility.tpl.html b/old/moon_gui/static/app/common/compatibility/compatibility.tpl.html
index 0e32dc4f..0e32dc4f 100755
--- a/moon_gui/static/app/common/compatibility/compatibility.tpl.html
+++ b/old/moon_gui/static/app/common/compatibility/compatibility.tpl.html
diff --git a/moon_gui/static/app/common/footer/footer.controller.js b/old/moon_gui/static/app/common/footer/footer.controller.js
index d7506840..d7506840 100755
--- a/moon_gui/static/app/common/footer/footer.controller.js
+++ b/old/moon_gui/static/app/common/footer/footer.controller.js
diff --git a/moon_gui/static/app/common/footer/footer.tpl.html b/old/moon_gui/static/app/common/footer/footer.tpl.html
index aacb392d..aacb392d 100755
--- a/moon_gui/static/app/common/footer/footer.tpl.html
+++ b/old/moon_gui/static/app/common/footer/footer.tpl.html
diff --git a/moon_gui/static/app/common/header/header.controller.js b/old/moon_gui/static/app/common/header/header.controller.js
index 13ef4d6f..13ef4d6f 100755
--- a/moon_gui/static/app/common/header/header.controller.js
+++ b/old/moon_gui/static/app/common/header/header.controller.js
diff --git a/moon_gui/static/app/common/header/header.tpl.html b/old/moon_gui/static/app/common/header/header.tpl.html
index 7c7633d1..7c7633d1 100755
--- a/moon_gui/static/app/common/header/header.tpl.html
+++ b/old/moon_gui/static/app/common/header/header.tpl.html
diff --git a/moon_gui/static/app/common/loader/loader.dir.js b/old/moon_gui/static/app/common/loader/loader.dir.js
index ba40c121..ba40c121 100755
--- a/moon_gui/static/app/common/loader/loader.dir.js
+++ b/old/moon_gui/static/app/common/loader/loader.dir.js
diff --git a/moon_gui/static/app/common/loader/loader.tpl.html b/old/moon_gui/static/app/common/loader/loader.tpl.html
index 51da439f..51da439f 100755
--- a/moon_gui/static/app/common/loader/loader.tpl.html
+++ b/old/moon_gui/static/app/common/loader/loader.tpl.html
diff --git a/moon_gui/static/app/common/waiting/waiting.tpl.html b/old/moon_gui/static/app/common/waiting/waiting.tpl.html
index 6c042635..6c042635 100755
--- a/moon_gui/static/app/common/waiting/waiting.tpl.html
+++ b/old/moon_gui/static/app/common/waiting/waiting.tpl.html
diff --git a/moon_gui/static/app/dashboard/dashboard.tpl.html b/old/moon_gui/static/app/dashboard/dashboard.tpl.html
index 67184bcc..67184bcc 100755
--- a/moon_gui/static/app/dashboard/dashboard.tpl.html
+++ b/old/moon_gui/static/app/dashboard/dashboard.tpl.html
diff --git a/moon_gui/static/app/logs/logs.controller.js b/old/moon_gui/static/app/logs/logs.controller.js
index e48e2b8b..e48e2b8b 100755
--- a/moon_gui/static/app/logs/logs.controller.js
+++ b/old/moon_gui/static/app/logs/logs.controller.js
diff --git a/moon_gui/static/app/logs/logs.tpl.html b/old/moon_gui/static/app/logs/logs.tpl.html
index fecc0289..fecc0289 100755
--- a/moon_gui/static/app/logs/logs.tpl.html
+++ b/old/moon_gui/static/app/logs/logs.tpl.html
diff --git a/moon_gui/static/app/model/action/model-add.tpl.html b/old/moon_gui/static/app/model/action/model-add.tpl.html
index dee53a97..dee53a97 100755
--- a/moon_gui/static/app/model/action/model-add.tpl.html
+++ b/old/moon_gui/static/app/model/action/model-add.tpl.html
diff --git a/moon_gui/static/app/model/action/model-delete.tpl.html b/old/moon_gui/static/app/model/action/model-delete.tpl.html
index cde16d0e..cde16d0e 100755
--- a/moon_gui/static/app/model/action/model-delete.tpl.html
+++ b/old/moon_gui/static/app/model/action/model-delete.tpl.html
diff --git a/moon_gui/static/app/model/action/model-view.tpl.html b/old/moon_gui/static/app/model/action/model-view.tpl.html
index 46c295c7..46c295c7 100755
--- a/moon_gui/static/app/model/action/model-view.tpl.html
+++ b/old/moon_gui/static/app/model/action/model-view.tpl.html
diff --git a/moon_gui/static/app/model/action/model.controller.add.js b/old/moon_gui/static/app/model/action/model.controller.add.js
index 11d3abf4..11d3abf4 100755
--- a/moon_gui/static/app/model/action/model.controller.add.js
+++ b/old/moon_gui/static/app/model/action/model.controller.add.js
diff --git a/moon_gui/static/app/model/action/model.controller.delete.js b/old/moon_gui/static/app/model/action/model.controller.delete.js
index 5d9dae1a..5d9dae1a 100755
--- a/moon_gui/static/app/model/action/model.controller.delete.js
+++ b/old/moon_gui/static/app/model/action/model.controller.delete.js
diff --git a/moon_gui/static/app/model/action/model.controller.view.js b/old/moon_gui/static/app/model/action/model.controller.view.js
index 7605eecf..7605eecf 100755
--- a/moon_gui/static/app/model/action/model.controller.view.js
+++ b/old/moon_gui/static/app/model/action/model.controller.view.js
diff --git a/moon_gui/static/app/model/edit/metadata/metadata-edit.tpl.html b/old/moon_gui/static/app/model/edit/metadata/metadata-edit.tpl.html
index 2616be1c..2616be1c 100755
--- a/moon_gui/static/app/model/edit/metadata/metadata-edit.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metadata/metadata-edit.tpl.html
diff --git a/moon_gui/static/app/model/edit/metadata/metadata-list.tpl.html b/old/moon_gui/static/app/model/edit/metadata/metadata-list.tpl.html
index 30a42dbc..30a42dbc 100755
--- a/moon_gui/static/app/model/edit/metadata/metadata-list.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metadata/metadata-list.tpl.html
diff --git a/moon_gui/static/app/model/edit/metadata/metadata.edit.dir.js b/old/moon_gui/static/app/model/edit/metadata/metadata.edit.dir.js
index ab79b5db..ab79b5db 100755
--- a/moon_gui/static/app/model/edit/metadata/metadata.edit.dir.js
+++ b/old/moon_gui/static/app/model/edit/metadata/metadata.edit.dir.js
diff --git a/moon_gui/static/app/model/edit/metadata/metadata.list.dir.js b/old/moon_gui/static/app/model/edit/metadata/metadata.list.dir.js
index 305192b6..305192b6 100755
--- a/moon_gui/static/app/model/edit/metadata/metadata.list.dir.js
+++ b/old/moon_gui/static/app/model/edit/metadata/metadata.list.dir.js
diff --git a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-add.tpl.html b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-add.tpl.html
index a721e6d0..a721e6d0 100755
--- a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-add.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-add.tpl.html
diff --git a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-map.tpl.html b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-map.tpl.html
index 1830204b..1830204b 100755
--- a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-map.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-map.tpl.html
diff --git a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-unmap.tpl.html b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-unmap.tpl.html
index bb02aba2..bb02aba2 100755
--- a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-unmap.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules-unmap.tpl.html
diff --git a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.controller.add.js b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.controller.add.js
index a95951fa..a95951fa 100755
--- a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.controller.add.js
+++ b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.controller.add.js
diff --git a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.map.controller.js b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.map.controller.js
index cf9ba06c..cf9ba06c 100755
--- a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.map.controller.js
+++ b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.map.controller.js
diff --git a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.unmap.controller.js b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.unmap.controller.js
index 30f32d51..30f32d51 100755
--- a/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.unmap.controller.js
+++ b/old/moon_gui/static/app/model/edit/metarules/action/mapping/metarules.unmap.controller.js
diff --git a/moon_gui/static/app/model/edit/metarules/action/metarules-edit-basic.tpl.html b/old/moon_gui/static/app/model/edit/metarules/action/metarules-edit-basic.tpl.html
index b6136195..b6136195 100755
--- a/moon_gui/static/app/model/edit/metarules/action/metarules-edit-basic.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metarules/action/metarules-edit-basic.tpl.html
diff --git a/moon_gui/static/app/model/edit/metarules/action/metarules-edit.tpl.html b/old/moon_gui/static/app/model/edit/metarules/action/metarules-edit.tpl.html
index 7b074448..7b074448 100755
--- a/moon_gui/static/app/model/edit/metarules/action/metarules-edit.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metarules/action/metarules-edit.tpl.html
diff --git a/moon_gui/static/app/model/edit/metarules/action/metarules.controller.edit.js b/old/moon_gui/static/app/model/edit/metarules/action/metarules.controller.edit.js
index de6965d0..de6965d0 100755
--- a/moon_gui/static/app/model/edit/metarules/action/metarules.controller.edit.js
+++ b/old/moon_gui/static/app/model/edit/metarules/action/metarules.controller.edit.js
diff --git a/moon_gui/static/app/model/edit/metarules/action/metarules.edit.basic.dir.js b/old/moon_gui/static/app/model/edit/metarules/action/metarules.edit.basic.dir.js
index b9dcd19c..b9dcd19c 100755
--- a/moon_gui/static/app/model/edit/metarules/action/metarules.edit.basic.dir.js
+++ b/old/moon_gui/static/app/model/edit/metarules/action/metarules.edit.basic.dir.js
diff --git a/moon_gui/static/app/model/edit/metarules/metarules-list.tpl.html b/old/moon_gui/static/app/model/edit/metarules/metarules-list.tpl.html
index ebe307c3..ebe307c3 100755
--- a/moon_gui/static/app/model/edit/metarules/metarules-list.tpl.html
+++ b/old/moon_gui/static/app/model/edit/metarules/metarules-list.tpl.html
diff --git a/moon_gui/static/app/model/edit/metarules/metarules.list.dir.js b/old/moon_gui/static/app/model/edit/metarules/metarules.list.dir.js
index 9c1bc72e..9c1bc72e 100755
--- a/moon_gui/static/app/model/edit/metarules/metarules.list.dir.js
+++ b/old/moon_gui/static/app/model/edit/metarules/metarules.list.dir.js
diff --git a/moon_gui/static/app/model/edit/model-edit-basic.tpl.html b/old/moon_gui/static/app/model/edit/model-edit-basic.tpl.html
index bd73b4ef..bd73b4ef 100755
--- a/moon_gui/static/app/model/edit/model-edit-basic.tpl.html
+++ b/old/moon_gui/static/app/model/edit/model-edit-basic.tpl.html
diff --git a/moon_gui/static/app/model/edit/model-edit.tpl.html b/old/moon_gui/static/app/model/edit/model-edit.tpl.html
index 4955f441..4955f441 100755
--- a/moon_gui/static/app/model/edit/model-edit.tpl.html
+++ b/old/moon_gui/static/app/model/edit/model-edit.tpl.html
diff --git a/moon_gui/static/app/model/edit/model.controller.edit.js b/old/moon_gui/static/app/model/edit/model.controller.edit.js
index 3e10a533..3e10a533 100755
--- a/moon_gui/static/app/model/edit/model.controller.edit.js
+++ b/old/moon_gui/static/app/model/edit/model.controller.edit.js
diff --git a/moon_gui/static/app/model/edit/model.edit.basic.dir.js b/old/moon_gui/static/app/model/edit/model.edit.basic.dir.js
index 54bb7071..54bb7071 100755
--- a/moon_gui/static/app/model/edit/model.edit.basic.dir.js
+++ b/old/moon_gui/static/app/model/edit/model.edit.basic.dir.js
diff --git a/moon_gui/static/app/model/model-list.tpl.html b/old/moon_gui/static/app/model/model-list.tpl.html
index 89c682cc..89c682cc 100755
--- a/moon_gui/static/app/model/model-list.tpl.html
+++ b/old/moon_gui/static/app/model/model-list.tpl.html
diff --git a/moon_gui/static/app/model/model.controller.list.js b/old/moon_gui/static/app/model/model.controller.list.js
index 5021a57e..5021a57e 100755
--- a/moon_gui/static/app/model/model.controller.list.js
+++ b/old/moon_gui/static/app/model/model.controller.list.js
diff --git a/moon_gui/static/app/moon.constants.js b/old/moon_gui/static/app/moon.constants.js
index 9681e3dc..9681e3dc 100644
--- a/moon_gui/static/app/moon.constants.js
+++ b/old/moon_gui/static/app/moon.constants.js
diff --git a/moon_gui/static/app/moon.module.js b/old/moon_gui/static/app/moon.module.js
index cc374f24..cc374f24 100755
--- a/moon_gui/static/app/moon.module.js
+++ b/old/moon_gui/static/app/moon.module.js
diff --git a/moon_gui/static/app/pdp/action/pdp-add.tpl.html b/old/moon_gui/static/app/pdp/action/pdp-add.tpl.html
index f83fb85c..f83fb85c 100755
--- a/moon_gui/static/app/pdp/action/pdp-add.tpl.html
+++ b/old/moon_gui/static/app/pdp/action/pdp-add.tpl.html
diff --git a/moon_gui/static/app/pdp/action/pdp-delete.tpl.html b/old/moon_gui/static/app/pdp/action/pdp-delete.tpl.html
index 167ba417..167ba417 100755
--- a/moon_gui/static/app/pdp/action/pdp-delete.tpl.html
+++ b/old/moon_gui/static/app/pdp/action/pdp-delete.tpl.html
diff --git a/moon_gui/static/app/pdp/action/pdp.controller.add.js b/old/moon_gui/static/app/pdp/action/pdp.controller.add.js
index d1c34c79..d1c34c79 100755
--- a/moon_gui/static/app/pdp/action/pdp.controller.add.js
+++ b/old/moon_gui/static/app/pdp/action/pdp.controller.add.js
diff --git a/moon_gui/static/app/pdp/action/pdp.controller.delete.js b/old/moon_gui/static/app/pdp/action/pdp.controller.delete.js
index 62557864..62557864 100755
--- a/moon_gui/static/app/pdp/action/pdp.controller.delete.js
+++ b/old/moon_gui/static/app/pdp/action/pdp.controller.delete.js
diff --git a/moon_gui/static/app/pdp/edit/pdp-edit-basic.tpl.html b/old/moon_gui/static/app/pdp/edit/pdp-edit-basic.tpl.html
index 887d81ca..887d81ca 100755
--- a/moon_gui/static/app/pdp/edit/pdp-edit-basic.tpl.html
+++ b/old/moon_gui/static/app/pdp/edit/pdp-edit-basic.tpl.html
diff --git a/moon_gui/static/app/pdp/edit/pdp-edit.tpl.html b/old/moon_gui/static/app/pdp/edit/pdp-edit.tpl.html
index 1fbd555a..1fbd555a 100755
--- a/moon_gui/static/app/pdp/edit/pdp-edit.tpl.html
+++ b/old/moon_gui/static/app/pdp/edit/pdp-edit.tpl.html
diff --git a/moon_gui/static/app/pdp/edit/pdp.controller.edit.js b/old/moon_gui/static/app/pdp/edit/pdp.controller.edit.js
index 41b73098..41b73098 100755
--- a/moon_gui/static/app/pdp/edit/pdp.controller.edit.js
+++ b/old/moon_gui/static/app/pdp/edit/pdp.controller.edit.js
diff --git a/moon_gui/static/app/pdp/edit/pdp.edit.basic.dir.js b/old/moon_gui/static/app/pdp/edit/pdp.edit.basic.dir.js
index 402422b6..402422b6 100755
--- a/moon_gui/static/app/pdp/edit/pdp.edit.basic.dir.js
+++ b/old/moon_gui/static/app/pdp/edit/pdp.edit.basic.dir.js
diff --git a/moon_gui/static/app/pdp/pdp-list.tpl.html b/old/moon_gui/static/app/pdp/pdp-list.tpl.html
index 8aa4e653..8aa4e653 100755
--- a/moon_gui/static/app/pdp/pdp-list.tpl.html
+++ b/old/moon_gui/static/app/pdp/pdp-list.tpl.html
diff --git a/moon_gui/static/app/pdp/pdp.controller.list.js b/old/moon_gui/static/app/pdp/pdp.controller.list.js
index a831cfe3..a831cfe3 100755
--- a/moon_gui/static/app/pdp/pdp.controller.list.js
+++ b/old/moon_gui/static/app/pdp/pdp.controller.list.js
diff --git a/moon_gui/static/app/policy/action/mapping/policy-map.tpl.html b/old/moon_gui/static/app/policy/action/mapping/policy-map.tpl.html
index 8b787f14..8b787f14 100755
--- a/moon_gui/static/app/policy/action/mapping/policy-map.tpl.html
+++ b/old/moon_gui/static/app/policy/action/mapping/policy-map.tpl.html
diff --git a/moon_gui/static/app/policy/action/mapping/policy-unmap.tpl.html b/old/moon_gui/static/app/policy/action/mapping/policy-unmap.tpl.html
index a2cda52a..a2cda52a 100755
--- a/moon_gui/static/app/policy/action/mapping/policy-unmap.tpl.html
+++ b/old/moon_gui/static/app/policy/action/mapping/policy-unmap.tpl.html
diff --git a/moon_gui/static/app/policy/action/mapping/policy.controller.map.js b/old/moon_gui/static/app/policy/action/mapping/policy.controller.map.js
index 6ad8caa7..6ad8caa7 100755
--- a/moon_gui/static/app/policy/action/mapping/policy.controller.map.js
+++ b/old/moon_gui/static/app/policy/action/mapping/policy.controller.map.js
diff --git a/moon_gui/static/app/policy/action/mapping/policy.controller.unmap.js b/old/moon_gui/static/app/policy/action/mapping/policy.controller.unmap.js
index d309ec0f..d309ec0f 100755
--- a/moon_gui/static/app/policy/action/mapping/policy.controller.unmap.js
+++ b/old/moon_gui/static/app/policy/action/mapping/policy.controller.unmap.js
diff --git a/moon_gui/static/app/policy/action/policy-add.tpl.html b/old/moon_gui/static/app/policy/action/policy-add.tpl.html
index d20c41be..d20c41be 100755
--- a/moon_gui/static/app/policy/action/policy-add.tpl.html
+++ b/old/moon_gui/static/app/policy/action/policy-add.tpl.html
diff --git a/moon_gui/static/app/policy/action/policy-delete.tpl.html b/old/moon_gui/static/app/policy/action/policy-delete.tpl.html
index 3b5df88b..3b5df88b 100755
--- a/moon_gui/static/app/policy/action/policy-delete.tpl.html
+++ b/old/moon_gui/static/app/policy/action/policy-delete.tpl.html
diff --git a/moon_gui/static/app/policy/action/policy.controller.add.js b/old/moon_gui/static/app/policy/action/policy.controller.add.js
index 0320c2e9..0320c2e9 100755
--- a/moon_gui/static/app/policy/action/policy.controller.add.js
+++ b/old/moon_gui/static/app/policy/action/policy.controller.add.js
diff --git a/moon_gui/static/app/policy/action/policy.controller.delete.js b/old/moon_gui/static/app/policy/action/policy.controller.delete.js
index 9a718ddc..9a718ddc 100755
--- a/moon_gui/static/app/policy/action/policy.controller.delete.js
+++ b/old/moon_gui/static/app/policy/action/policy.controller.delete.js
diff --git a/moon_gui/static/app/policy/edit/parameter/assignments/assignments-edit.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments-edit.tpl.html
index 9069dcd0..9069dcd0 100755
--- a/moon_gui/static/app/policy/edit/parameter/assignments/assignments-edit.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments-edit.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/assignments/assignments-list.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments-list.tpl.html
index 34bbc7a8..34bbc7a8 100755
--- a/moon_gui/static/app/policy/edit/parameter/assignments/assignments-list.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments-list.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/assignments/assignments.edit.dir.js b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments.edit.dir.js
index 5297eccb..5297eccb 100755
--- a/moon_gui/static/app/policy/edit/parameter/assignments/assignments.edit.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments.edit.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/assignments/assignments.list.dir.js b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments.list.dir.js
index 22931e4d..22931e4d 100755
--- a/moon_gui/static/app/policy/edit/parameter/assignments/assignments.list.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/assignments/assignments.list.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/data/data-edit.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/data/data-edit.tpl.html
index fae647e3..fae647e3 100755
--- a/moon_gui/static/app/policy/edit/parameter/data/data-edit.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/data/data-edit.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/data/data-list.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/data/data-list.tpl.html
index b69a4eed..b69a4eed 100755
--- a/moon_gui/static/app/policy/edit/parameter/data/data-list.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/data/data-list.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/data/data.edit.dir.js b/old/moon_gui/static/app/policy/edit/parameter/data/data.edit.dir.js
index 2ae08177..2ae08177 100755
--- a/moon_gui/static/app/policy/edit/parameter/data/data.edit.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/data/data.edit.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/data/data.list.dir.js b/old/moon_gui/static/app/policy/edit/parameter/data/data.list.dir.js
index 23a7e535..23a7e535 100755
--- a/moon_gui/static/app/policy/edit/parameter/data/data.list.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/data/data.list.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-edit.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-edit.tpl.html
index fa2f93c0..fa2f93c0 100755
--- a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-edit.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-edit.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-list.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-list.tpl.html
index a94d663e..a94d663e 100755
--- a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-list.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter-list.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.edit.dir.js b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.edit.dir.js
index d72e23b7..d72e23b7 100755
--- a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.edit.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.edit.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.list.dir.js b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.list.dir.js
index dffa7783..dffa7783 100755
--- a/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.list.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/perimeter/perimeter.list.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/rules/rules-edit.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/rules/rules-edit.tpl.html
index 685046a5..685046a5 100755
--- a/moon_gui/static/app/policy/edit/parameter/rules/rules-edit.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/rules/rules-edit.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/rules/rules-list.tpl.html b/old/moon_gui/static/app/policy/edit/parameter/rules/rules-list.tpl.html
index 7f556f93..7f556f93 100755
--- a/moon_gui/static/app/policy/edit/parameter/rules/rules-list.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/parameter/rules/rules-list.tpl.html
diff --git a/moon_gui/static/app/policy/edit/parameter/rules/rules.edit.dir.js b/old/moon_gui/static/app/policy/edit/parameter/rules/rules.edit.dir.js
index b7bb7614..b7bb7614 100755
--- a/moon_gui/static/app/policy/edit/parameter/rules/rules.edit.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/rules/rules.edit.dir.js
diff --git a/moon_gui/static/app/policy/edit/parameter/rules/rules.list.dir.js b/old/moon_gui/static/app/policy/edit/parameter/rules/rules.list.dir.js
index 5c3e7457..5c3e7457 100755
--- a/moon_gui/static/app/policy/edit/parameter/rules/rules.list.dir.js
+++ b/old/moon_gui/static/app/policy/edit/parameter/rules/rules.list.dir.js
diff --git a/moon_gui/static/app/policy/edit/policy-edit-basic.tpl.html b/old/moon_gui/static/app/policy/edit/policy-edit-basic.tpl.html
index f55c1d05..f55c1d05 100755
--- a/moon_gui/static/app/policy/edit/policy-edit-basic.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/policy-edit-basic.tpl.html
diff --git a/moon_gui/static/app/policy/edit/policy-edit.tpl.html b/old/moon_gui/static/app/policy/edit/policy-edit.tpl.html
index 60841168..60841168 100755
--- a/moon_gui/static/app/policy/edit/policy-edit.tpl.html
+++ b/old/moon_gui/static/app/policy/edit/policy-edit.tpl.html
diff --git a/moon_gui/static/app/policy/edit/policy.controller.edit.js b/old/moon_gui/static/app/policy/edit/policy.controller.edit.js
index cd6e429b..cd6e429b 100755
--- a/moon_gui/static/app/policy/edit/policy.controller.edit.js
+++ b/old/moon_gui/static/app/policy/edit/policy.controller.edit.js
diff --git a/moon_gui/static/app/policy/edit/policy.edit.basic.dir.js b/old/moon_gui/static/app/policy/edit/policy.edit.basic.dir.js
index c32d9e69..c32d9e69 100755
--- a/moon_gui/static/app/policy/edit/policy.edit.basic.dir.js
+++ b/old/moon_gui/static/app/policy/edit/policy.edit.basic.dir.js
diff --git a/moon_gui/static/app/policy/policy-list.tpl.html b/old/moon_gui/static/app/policy/policy-list.tpl.html
index aeb90f0b..aeb90f0b 100755
--- a/moon_gui/static/app/policy/policy-list.tpl.html
+++ b/old/moon_gui/static/app/policy/policy-list.tpl.html
diff --git a/moon_gui/static/app/policy/policy-mapped-list.tpl.html b/old/moon_gui/static/app/policy/policy-mapped-list.tpl.html
index 127dae3b..127dae3b 100755
--- a/moon_gui/static/app/policy/policy-mapped-list.tpl.html
+++ b/old/moon_gui/static/app/policy/policy-mapped-list.tpl.html
diff --git a/moon_gui/static/app/policy/policy.controller.list.js b/old/moon_gui/static/app/policy/policy.controller.list.js
index fc2c6503..fc2c6503 100755
--- a/moon_gui/static/app/policy/policy.controller.list.js
+++ b/old/moon_gui/static/app/policy/policy.controller.list.js
diff --git a/moon_gui/static/app/policy/policy.mapped.list.dir.js b/old/moon_gui/static/app/policy/policy.mapped.list.dir.js
index 78bb3b8d..78bb3b8d 100755
--- a/moon_gui/static/app/policy/policy.mapped.list.dir.js
+++ b/old/moon_gui/static/app/policy/policy.mapped.list.dir.js
diff --git a/moon_gui/static/app/project/action/mapping/project-map.tpl.html b/old/moon_gui/static/app/project/action/mapping/project-map.tpl.html
index 5ffd98e2..5ffd98e2 100755
--- a/moon_gui/static/app/project/action/mapping/project-map.tpl.html
+++ b/old/moon_gui/static/app/project/action/mapping/project-map.tpl.html
diff --git a/moon_gui/static/app/project/action/mapping/project-unmap.tpl.html b/old/moon_gui/static/app/project/action/mapping/project-unmap.tpl.html
index 5cc5c6dd..5cc5c6dd 100755
--- a/moon_gui/static/app/project/action/mapping/project-unmap.tpl.html
+++ b/old/moon_gui/static/app/project/action/mapping/project-unmap.tpl.html
diff --git a/moon_gui/static/app/project/action/mapping/project.controller.map.js b/old/moon_gui/static/app/project/action/mapping/project.controller.map.js
index afa2bfc0..afa2bfc0 100755
--- a/moon_gui/static/app/project/action/mapping/project.controller.map.js
+++ b/old/moon_gui/static/app/project/action/mapping/project.controller.map.js
diff --git a/moon_gui/static/app/project/action/mapping/project.controller.unmap.js b/old/moon_gui/static/app/project/action/mapping/project.controller.unmap.js
index 911b30ff..911b30ff 100755
--- a/moon_gui/static/app/project/action/mapping/project.controller.unmap.js
+++ b/old/moon_gui/static/app/project/action/mapping/project.controller.unmap.js
diff --git a/moon_gui/static/app/project/action/project-add.tpl.html b/old/moon_gui/static/app/project/action/project-add.tpl.html
index a90dcfa1..a90dcfa1 100755
--- a/moon_gui/static/app/project/action/project-add.tpl.html
+++ b/old/moon_gui/static/app/project/action/project-add.tpl.html
diff --git a/moon_gui/static/app/project/action/project-delete.tpl.html b/old/moon_gui/static/app/project/action/project-delete.tpl.html
index 96b4f2e3..96b4f2e3 100755
--- a/moon_gui/static/app/project/action/project-delete.tpl.html
+++ b/old/moon_gui/static/app/project/action/project-delete.tpl.html
diff --git a/moon_gui/static/app/project/action/project-view.tpl.html b/old/moon_gui/static/app/project/action/project-view.tpl.html
index 3228c915..3228c915 100755
--- a/moon_gui/static/app/project/action/project-view.tpl.html
+++ b/old/moon_gui/static/app/project/action/project-view.tpl.html
diff --git a/moon_gui/static/app/project/action/project.controller.add.js b/old/moon_gui/static/app/project/action/project.controller.add.js
index 4d12b75d..4d12b75d 100755
--- a/moon_gui/static/app/project/action/project.controller.add.js
+++ b/old/moon_gui/static/app/project/action/project.controller.add.js
diff --git a/moon_gui/static/app/project/action/project.controller.delete.js b/old/moon_gui/static/app/project/action/project.controller.delete.js
index 4f18f8e6..4f18f8e6 100755
--- a/moon_gui/static/app/project/action/project.controller.delete.js
+++ b/old/moon_gui/static/app/project/action/project.controller.delete.js
diff --git a/moon_gui/static/app/project/action/project.controller.view.js b/old/moon_gui/static/app/project/action/project.controller.view.js
index fe98a507..fe98a507 100755
--- a/moon_gui/static/app/project/action/project.controller.view.js
+++ b/old/moon_gui/static/app/project/action/project.controller.view.js
diff --git a/moon_gui/static/app/project/project-list.tpl.html b/old/moon_gui/static/app/project/project-list.tpl.html
index 82a3745e..82a3745e 100755
--- a/moon_gui/static/app/project/project-list.tpl.html
+++ b/old/moon_gui/static/app/project/project-list.tpl.html
diff --git a/moon_gui/static/app/project/project.controller.list.js b/old/moon_gui/static/app/project/project.controller.list.js
index b1cb2056..b1cb2056 100755
--- a/moon_gui/static/app/project/project.controller.list.js
+++ b/old/moon_gui/static/app/project/project.controller.list.js
diff --git a/moon_gui/static/app/services/gui/alert.service.js b/old/moon_gui/static/app/services/gui/alert.service.js
index 8435eab1..8435eab1 100755
--- a/moon_gui/static/app/services/gui/alert.service.js
+++ b/old/moon_gui/static/app/services/gui/alert.service.js
diff --git a/moon_gui/static/app/services/gui/browser.service.js b/old/moon_gui/static/app/services/gui/browser.service.js
index 88c693a8..88c693a8 100755
--- a/moon_gui/static/app/services/gui/browser.service.js
+++ b/old/moon_gui/static/app/services/gui/browser.service.js
diff --git a/moon_gui/static/app/services/gui/form.service.js b/old/moon_gui/static/app/services/gui/form.service.js
index e436593c..e436593c 100755
--- a/moon_gui/static/app/services/gui/form.service.js
+++ b/old/moon_gui/static/app/services/gui/form.service.js
diff --git a/moon_gui/static/app/services/gui/menu.service.js b/old/moon_gui/static/app/services/gui/menu.service.js
index fd90a2fa..fd90a2fa 100755
--- a/moon_gui/static/app/services/gui/menu.service.js
+++ b/old/moon_gui/static/app/services/gui/menu.service.js
diff --git a/moon_gui/static/app/services/gui/security.pipeline.service.js b/old/moon_gui/static/app/services/gui/security.pipeline.service.js
index 3831e487..3831e487 100755
--- a/moon_gui/static/app/services/gui/security.pipeline.service.js
+++ b/old/moon_gui/static/app/services/gui/security.pipeline.service.js
diff --git a/moon_gui/static/app/services/gui/util.service.js b/old/moon_gui/static/app/services/gui/util.service.js
index 7274244a..7274244a 100755
--- a/moon_gui/static/app/services/gui/util.service.js
+++ b/old/moon_gui/static/app/services/gui/util.service.js
diff --git a/moon_gui/static/app/services/gui/version.service.js b/old/moon_gui/static/app/services/gui/version.service.js
index 5f9f2786..5f9f2786 100755
--- a/moon_gui/static/app/services/gui/version.service.js
+++ b/old/moon_gui/static/app/services/gui/version.service.js
diff --git a/moon_gui/static/app/services/moon/model/model.service.js b/old/moon_gui/static/app/services/moon/model/model.service.js
index a676fc1a..a676fc1a 100755
--- a/moon_gui/static/app/services/moon/model/model.service.js
+++ b/old/moon_gui/static/app/services/moon/model/model.service.js
diff --git a/moon_gui/static/app/services/moon/pdp.service.js b/old/moon_gui/static/app/services/moon/pdp.service.js
index 822f7414..822f7414 100755
--- a/moon_gui/static/app/services/moon/pdp.service.js
+++ b/old/moon_gui/static/app/services/moon/pdp.service.js
diff --git a/moon_gui/static/app/services/moon/policy/parameters/assignements.service.js b/old/moon_gui/static/app/services/moon/policy/parameters/assignements.service.js
index ca138b45..ca138b45 100755
--- a/moon_gui/static/app/services/moon/policy/parameters/assignements.service.js
+++ b/old/moon_gui/static/app/services/moon/policy/parameters/assignements.service.js
diff --git a/moon_gui/static/app/services/moon/policy/parameters/data.service.js b/old/moon_gui/static/app/services/moon/policy/parameters/data.service.js
index 1bbd3b24..1bbd3b24 100755
--- a/moon_gui/static/app/services/moon/policy/parameters/data.service.js
+++ b/old/moon_gui/static/app/services/moon/policy/parameters/data.service.js
diff --git a/moon_gui/static/app/services/moon/policy/parameters/perimeter.service.js b/old/moon_gui/static/app/services/moon/policy/parameters/perimeter.service.js
index 42e7288a..42e7288a 100755
--- a/moon_gui/static/app/services/moon/policy/parameters/perimeter.service.js
+++ b/old/moon_gui/static/app/services/moon/policy/parameters/perimeter.service.js
diff --git a/moon_gui/static/app/services/moon/policy/parameters/rule.service.js b/old/moon_gui/static/app/services/moon/policy/parameters/rule.service.js
index b1a350ae..b1a350ae 100644
--- a/moon_gui/static/app/services/moon/policy/parameters/rule.service.js
+++ b/old/moon_gui/static/app/services/moon/policy/parameters/rule.service.js
diff --git a/moon_gui/static/app/services/moon/policy/parameters/rules.service.js b/old/moon_gui/static/app/services/moon/policy/parameters/rules.service.js
index 76b24011..76b24011 100755
--- a/moon_gui/static/app/services/moon/policy/parameters/rules.service.js
+++ b/old/moon_gui/static/app/services/moon/policy/parameters/rules.service.js
diff --git a/moon_gui/static/app/services/moon/policy/policy.service.js b/old/moon_gui/static/app/services/moon/policy/policy.service.js
index 5ad31421..5ad31421 100755
--- a/moon_gui/static/app/services/moon/policy/policy.service.js
+++ b/old/moon_gui/static/app/services/moon/policy/policy.service.js
diff --git a/moon_gui/static/app/services/moon/rule/metadata.service.js b/old/moon_gui/static/app/services/moon/rule/metadata.service.js
index 8c68b2ef..8c68b2ef 100755
--- a/moon_gui/static/app/services/moon/rule/metadata.service.js
+++ b/old/moon_gui/static/app/services/moon/rule/metadata.service.js
diff --git a/moon_gui/static/app/services/moon/rule/metarule.service.js b/old/moon_gui/static/app/services/moon/rule/metarule.service.js
index 05167849..05167849 100755
--- a/moon_gui/static/app/services/moon/rule/metarule.service.js
+++ b/old/moon_gui/static/app/services/moon/rule/metarule.service.js
diff --git a/moon_gui/static/app/services/partner/authentication.service.js b/old/moon_gui/static/app/services/partner/authentication.service.js
index b6d3f36d..b6d3f36d 100755
--- a/moon_gui/static/app/services/partner/authentication.service.js
+++ b/old/moon_gui/static/app/services/partner/authentication.service.js
diff --git a/moon_gui/static/app/services/partner/nova.service.js b/old/moon_gui/static/app/services/partner/nova.service.js
index 38e2a0fc..38e2a0fc 100755
--- a/moon_gui/static/app/services/partner/nova.service.js
+++ b/old/moon_gui/static/app/services/partner/nova.service.js
diff --git a/moon_gui/static/app/services/partner/project.service.js b/old/moon_gui/static/app/services/partner/project.service.js
index 4ec27f2e..4ec27f2e 100755
--- a/moon_gui/static/app/services/partner/project.service.js
+++ b/old/moon_gui/static/app/services/partner/project.service.js
diff --git a/moon_gui/static/favicon.ico b/old/moon_gui/static/favicon.ico
index a7910bf5..a7910bf5 100755
--- a/moon_gui/static/favicon.ico
+++ b/old/moon_gui/static/favicon.ico
Binary files differ
diff --git a/moon_gui/static/i18n/en.json b/old/moon_gui/static/i18n/en.json
index 4dc7cea5..4dc7cea5 100755
--- a/moon_gui/static/i18n/en.json
+++ b/old/moon_gui/static/i18n/en.json
diff --git a/moon_gui/static/i18n/fr.json b/old/moon_gui/static/i18n/fr.json
index 85c513b3..85c513b3 100755
--- a/moon_gui/static/i18n/fr.json
+++ b/old/moon_gui/static/i18n/fr.json
diff --git a/moon_gui/static/img/ajax-loader.gif b/old/moon_gui/static/img/ajax-loader.gif
index d0bce154..d0bce154 100755
--- a/moon_gui/static/img/ajax-loader.gif
+++ b/old/moon_gui/static/img/ajax-loader.gif
Binary files differ
diff --git a/moon_gui/static/img/ajax-waiting.gif b/old/moon_gui/static/img/ajax-waiting.gif
index d84f6537..d84f6537 100755
--- a/moon_gui/static/img/ajax-waiting.gif
+++ b/old/moon_gui/static/img/ajax-waiting.gif
Binary files differ
diff --git a/moon_gui/static/img/arrow-link.gif b/old/moon_gui/static/img/arrow-link.gif
index ca17f44b..ca17f44b 100755
--- a/moon_gui/static/img/arrow-link.gif
+++ b/old/moon_gui/static/img/arrow-link.gif
Binary files differ
diff --git a/moon_gui/static/img/et.jpg b/old/moon_gui/static/img/et.jpg
index 67cc0a9d..67cc0a9d 100644
--- a/moon_gui/static/img/et.jpg
+++ b/old/moon_gui/static/img/et.jpg
Binary files differ
diff --git a/moon_gui/static/img/logo-openstack.png b/old/moon_gui/static/img/logo-openstack.png
index 60ab0e1e..60ab0e1e 100755
--- a/moon_gui/static/img/logo-openstack.png
+++ b/old/moon_gui/static/img/logo-openstack.png
Binary files differ
diff --git a/moon_gui/static/img/logo-orange.gif b/old/moon_gui/static/img/logo-orange.gif
index 9c612291..9c612291 100755
--- a/moon_gui/static/img/logo-orange.gif
+++ b/old/moon_gui/static/img/logo-orange.gif
Binary files differ
diff --git a/moon_gui/static/styles/main.css b/old/moon_gui/static/styles/main.css
index 4e10370e..4e10370e 100644
--- a/moon_gui/static/styles/main.css
+++ b/old/moon_gui/static/styles/main.css
diff --git a/moon_gui/static/version.json b/old/moon_gui/static/version.json
index 4f228d2b..4f228d2b 100755
--- a/moon_gui/static/version.json
+++ b/old/moon_gui/static/version.json
diff --git a/moon_gui/templates/index.html b/old/moon_gui/templates/index.html
index 7a321543..7a321543 100644
--- a/moon_gui/templates/index.html
+++ b/old/moon_gui/templates/index.html
diff --git a/moon_interface/Changelog b/old/moon_interface/Changelog
index f58682a9..361d7840 100644
--- a/moon_interface/Changelog
+++ b/old/moon_interface/Changelog
@@ -26,3 +26,11 @@ CHANGES
4.3.3
-----
- use the threading capability of Flask app
+
+4.3.3-1
+-----
+- Fix a bug in authz_requests
+
+4.4.0
+-----
+- Add the update API
diff --git a/old/moon_interface/Dockerfile b/old/moon_interface/Dockerfile
new file mode 100644
index 00000000..00880496
--- /dev/null
+++ b/old/moon_interface/Dockerfile
@@ -0,0 +1,15 @@
+FROM python:3
+
+LABEL Name=Interface
+LABEL Description="Interface component for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+USER root
+
+ADD . /root
+WORKDIR /root/
+RUN pip3 install --no-cache-dir -r requirements.txt
+RUN pip3 install --no-cache-dir .
+
+CMD ["python3", "-m", "moon_interface"] \ No newline at end of file
diff --git a/python_moonclient/LICENSE b/old/moon_interface/LICENSE
index d6456956..d6456956 100644
--- a/python_moonclient/LICENSE
+++ b/old/moon_interface/LICENSE
diff --git a/moon_interface/MANIFEST.in b/old/moon_interface/MANIFEST.in
index 1f674d50..1f674d50 100644
--- a/moon_interface/MANIFEST.in
+++ b/old/moon_interface/MANIFEST.in
diff --git a/moon_interface/README.md b/old/moon_interface/README.md
index 4c0e483d..4c0e483d 100644
--- a/moon_interface/README.md
+++ b/old/moon_interface/README.md
diff --git a/moon_orchestrator/moon_orchestrator/__init__.py b/old/moon_interface/moon_interface/__init__.py
index bc8f2781..85c245e0 100644
--- a/moon_orchestrator/moon_orchestrator/__init__.py
+++ b/old/moon_interface/moon_interface/__init__.py
@@ -3,4 +3,4 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-__version__ = "4.4.1"
+__version__ = "4.4.0"
diff --git a/moon_interface/moon_interface/__main__.py b/old/moon_interface/moon_interface/__main__.py
index 9ad7bf2a..9ad7bf2a 100644
--- a/moon_interface/moon_interface/__main__.py
+++ b/old/moon_interface/moon_interface/__main__.py
diff --git a/python_moondb/python_moondb/migrate_repo/__init__.py b/old/moon_interface/moon_interface/api/__init__.py
index e69de29b..e69de29b 100644
--- a/python_moondb/python_moondb/migrate_repo/__init__.py
+++ b/old/moon_interface/moon_interface/api/__init__.py
diff --git a/moon_interface/moon_interface/api/authz.py b/old/moon_interface/moon_interface/api/authz.py
index b82a14f1..b82a14f1 100644
--- a/moon_interface/moon_interface/api/authz.py
+++ b/old/moon_interface/moon_interface/api/authz.py
diff --git a/moon_interface/moon_interface/api/generic.py b/old/moon_interface/moon_interface/api/generic.py
index dadac259..dadac259 100644
--- a/moon_interface/moon_interface/api/generic.py
+++ b/old/moon_interface/moon_interface/api/generic.py
diff --git a/old/moon_interface/moon_interface/api/update.py b/old/moon_interface/moon_interface/api/update.py
new file mode 100644
index 00000000..e798059c
--- /dev/null
+++ b/old/moon_interface/moon_interface/api/update.py
@@ -0,0 +1,49 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Authz is the endpoint to get authorization response
+"""
+
+from flask import request
+from flask_restful import Resource
+import requests
+import logging
+
+__version__ = "4.3.1"
+
+logger = logging.getLogger("moon.interface.api." + __name__)
+
+
+class Update(Resource):
+ """
+ Endpoint for update requests
+ """
+
+ __urls__ = (
+ "/update",
+ )
+
+ def __init__(self, **kwargs):
+ self.CACHE = kwargs.get("cache")
+ self.INTERFACE_NAME = kwargs.get("interface_name", "interface")
+ self.MANAGER_URL = kwargs.get("manager_url", "http://manager:8080")
+ self.TIMEOUT = 5
+
+ def put(self):
+ try:
+ self.CACHE.update_assignments(
+ request.form.get("policy_id", None),
+ request.form.get("perimeter_id", None),
+ )
+ for project_id in self.CACHE.container_chaining:
+ hostname = self.CACHE.container_chaining[project_id][0]["hostip"]
+ port = self.CACHE.container_chaining[project_id][0]["port"]
+ req = requests.put("http://{}:{}/update".format(hostname, port), request.form)
+ if req.status_code != 200:
+ logger.error("Cannot connect to {} on port {}".format(hostname, port))
+ except Exception as e:
+ logger.exception(e)
+ return {"result": False, "reason": str(e)}
+ return {"result": True}
diff --git a/moon_interface/moon_interface/authz_requests.py b/old/moon_interface/moon_interface/authz_requests.py
index 2ef0e0a1..cf50dfe5 100644
--- a/moon_interface/moon_interface/authz_requests.py
+++ b/old/moon_interface/moon_interface/authz_requests.py
@@ -53,7 +53,9 @@ class AuthzRequest:
raise exceptions.AuthzException(
"error in address no hostname or hostip"
)
+ tried_hostnames = []
while tries < 2:
+ tried_hostnames.append(hostname)
try:
req = requests.post("http://{}:{}/authz".format(
hostname,
@@ -62,17 +64,20 @@ class AuthzRequest:
if req.status_code != 200:
raise exceptions.AuthzException(
"Receive bad response from Authz function "
- "(with address - {})".format(req.status_code)
+ "(with {} -> {})".format(hostname, req.status_code)
)
success = True
except requests.exceptions.ConnectionError:
- logger.error("Cannot connect to {}".format(
- "http://{}:{}/authz".format(
- hostname,
- self.container_chaining[0]["port"]
- )))
- except:
- logger.error("Unexpected error:", sys.exc_info()[0])
+ if tries > 1:
+ logger.error("Cannot connect to {}".format(
+ "http://[{}]:{}/authz".format(
+ ", ".join(tried_hostnames),
+ self.container_chaining[0]["port"]
+ )))
+ except Exception as e:
+ logger.exception(e)
+ else:
+ break
hostname = self.container_chaining[0]["hostname"],
tries += 1
diff --git a/moon_interface/moon_interface/http_server.py b/old/moon_interface/moon_interface/http_server.py
index 1e0858c0..50bf2a62 100644
--- a/moon_interface/moon_interface/http_server.py
+++ b/old/moon_interface/moon_interface/http_server.py
@@ -9,6 +9,7 @@ import logging
from moon_interface import __version__
from moon_interface.api.generic import Status, API
from moon_interface.api.authz import Authz
+from moon_interface.api.update import Update
from moon_interface.authz_requests import CACHE
from python_moonutilities import configuration, exceptions
@@ -131,6 +132,15 @@ class HTTPServer(Server):
self.manager_port),
}
)
+ self.api.add_resource(Update, *Update.__urls__,
+ resource_class_kwargs={
+ "cache": CACHE,
+ "interface_name": self.host,
+ "manager_url": "http://{}:{}".format(
+ self.manager_hostname,
+ self.manager_port),
+ }
+ )
def run(self):
self.app.run(host=self._host, port=self._port, threaded=True) # nosec
diff --git a/moon_interface/moon_interface/server.py b/old/moon_interface/moon_interface/server.py
index 29403a6b..29403a6b 100644
--- a/moon_interface/moon_interface/server.py
+++ b/old/moon_interface/moon_interface/server.py
diff --git a/moon_interface/requirements.txt b/old/moon_interface/requirements.txt
index f22b38e7..f22b38e7 100644
--- a/moon_interface/requirements.txt
+++ b/old/moon_interface/requirements.txt
diff --git a/moon_interface/setup.py b/old/moon_interface/setup.py
index f358c598..f358c598 100644
--- a/moon_interface/setup.py
+++ b/old/moon_interface/setup.py
diff --git a/python_moondb/python_moondb/migrate_repo/versions/__init__.py b/old/moon_interface/tests/unit_python/api/__init__.py
index e69de29b..e69de29b 100644
--- a/python_moondb/python_moondb/migrate_repo/versions/__init__.py
+++ b/old/moon_interface/tests/unit_python/api/__init__.py
diff --git a/moon_interface/tests/unit_python/api/test_authz.py b/old/moon_interface/tests/unit_python/api/test_authz.py
index 052bc9c9..a227a303 100644
--- a/moon_interface/tests/unit_python/api/test_authz.py
+++ b/old/moon_interface/tests/unit_python/api/test_authz.py
@@ -23,7 +23,8 @@ def test_authz_true(context):
assert "result" in data
assert data['result'] is True
-def test_authz_False(context):
+
+def test_authz_false(context):
import moon_interface.server
server = moon_interface.server.create_server()
client = server.app.test_client()
@@ -48,7 +49,7 @@ def test_authz_effect_unset(context, set_consul_and_db):
set_consul_and_db.register_uri(
'POST', 'http://127.0.0.1:8081/authz',
- content = conftest.get_pickled_context_invalid()
+ content=conftest.get_pickled_context_invalid()
)
req = client.get("/authz/{p_id}/{s_id}/{o_id}/{a_id}".format(
@@ -63,6 +64,7 @@ def test_authz_effect_unset(context, set_consul_and_db):
assert "result" in data
assert data['result'] is False
+
def test_authz_invalid_ip(context, set_consul_and_db):
import moon_interface.server
server = moon_interface.server.create_server()
diff --git a/moon_interface/tests/unit_python/conftest.py b/old/moon_interface/tests/unit_python/conftest.py
index f6b204e6..f6b204e6 100644
--- a/moon_interface/tests/unit_python/conftest.py
+++ b/old/moon_interface/tests/unit_python/conftest.py
diff --git a/moon_interface/tests/unit_python/requirements.txt b/old/moon_interface/tests/unit_python/requirements.txt
index 21975ce3..21975ce3 100644
--- a/moon_interface/tests/unit_python/requirements.txt
+++ b/old/moon_interface/tests/unit_python/requirements.txt
diff --git a/old/moon_manager/.gitignore b/old/moon_manager/.gitignore
new file mode 100644
index 00000000..894a44cc
--- /dev/null
+++ b/old/moon_manager/.gitignore
@@ -0,0 +1,104 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
diff --git a/old/moon_manager/Changelog b/old/moon_manager/Changelog
new file mode 100644
index 00000000..1fb9ac08
--- /dev/null
+++ b/old/moon_manager/Changelog
@@ -0,0 +1,73 @@
+# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+CHANGES
+=======
+
+1.0.0
+-----
+- First version of the manager
+
+2.0.0
+-----
+- Version built inside the Keystone component
+
+3.0.0
+-----
+- Version built outside the Keystone component
+
+4.0.0
+-----
+- First micro-architecture version
+
+4.5.2
+-----
+- use the threading capability of Flask app
+- set the number of manager to 1
+- update to the latest version of the python-moondb library
+
+4.5.2-1
+-----
+- integrating validation to send mandatory key names
+
+4.5.3
+-----
+- Removing try catch from all requets to allow raised exception to be passed to http server, to send actual error to client side
+- fixing test cases to assert on the expected exception after removing try-catch
+- allow 404 to be catched from our side instead of flask itself
+- revert the params in the get/post/patch/delete to be by default = None, so that we could catch the param if it was None
+instead of having not found url if the param is mandatory
+
+4.5.4
+-----
+- fixing test cases after validation dependencies added in moondb
+
+4.5.5
+-----
+- removing validation on meta_rule categories
+- Update to python_moonutilities 1.4.17 and fix tests
+- adding extra test cases for update requests
+- adding None to requests ( to avoid request not found)
+- removing validation on categories, meta_rules so that can be added empty
+
+4.5.5-1
+-------
+- Update to python_moonutilities 1.4.18
+
+4.5.5-2
+-------
+- Update to python_moonutilities 1.4.19
+
+4.5.6
+----
+apply pyLint
+adding extra test cases for policy update
+- separate perimeter add/update with validation
+
+4.6.0
+-----
+- Add a connection to the Update endpoint in Wrapper
+>>>>>>> Stashed changes
diff --git a/old/moon_manager/Dockerfile b/old/moon_manager/Dockerfile
new file mode 100644
index 00000000..d264a113
--- /dev/null
+++ b/old/moon_manager/Dockerfile
@@ -0,0 +1,15 @@
+FROM python:3
+
+LABEL Name=Manager
+LABEL Description="Manager component for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+USER root
+
+ADD . /root
+WORKDIR /root/
+RUN pip3 install --no-cache-dir -r requirements.txt
+RUN pip3 install --no-cache-dir .
+
+CMD ["python3", "-m", "moon_manager"] \ No newline at end of file
diff --git a/python_moondb/LICENSE b/old/moon_manager/LICENSE
index d6456956..d6456956 100644
--- a/python_moondb/LICENSE
+++ b/old/moon_manager/LICENSE
diff --git a/old/moon_manager/MANIFEST.in b/old/moon_manager/MANIFEST.in
new file mode 100644
index 00000000..cf4d2e4e
--- /dev/null
+++ b/old/moon_manager/MANIFEST.in
@@ -0,0 +1,9 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+include README.md
+include LICENSE
+include setup.py
+include requirements.txt
diff --git a/old/moon_manager/README.md b/old/moon_manager/README.md
new file mode 100644
index 00000000..c74ccc28
--- /dev/null
+++ b/old/moon_manager/README.md
@@ -0,0 +1,8 @@
+# moon_manager
+
+This package contains the core module for the Moon project
+It is designed to provide authorization features to all OpenStack components.
+
+For any other information, refer to the parent project:
+
+ https://git.opnfv.org/moon
diff --git a/moon_authz/moon_authz/__init__.py b/old/moon_manager/moon_manager/__init__.py
index 0fb32055..f0887748 100644
--- a/moon_authz/moon_authz/__init__.py
+++ b/old/moon_manager/moon_manager/__init__.py
@@ -3,4 +3,4 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-__version__ = "4.3.3"
+__version__ = "4.6.0"
diff --git a/old/moon_manager/moon_manager/__main__.py b/old/moon_manager/moon_manager/__main__.py
new file mode 100644
index 00000000..4fed8d10
--- /dev/null
+++ b/old/moon_manager/moon_manager/__main__.py
@@ -0,0 +1,4 @@
+from moon_manager.server import create_server
+
+server = create_server()
+server.run()
diff --git a/python_moondb/tests/unit_python/models/__init__.py b/old/moon_manager/moon_manager/api/__init__.py
index e69de29b..e69de29b 100755..100644
--- a/python_moondb/tests/unit_python/models/__init__.py
+++ b/old/moon_manager/moon_manager/api/__init__.py
diff --git a/old/moon_manager/moon_manager/api/assignments.py b/old/moon_manager/moon_manager/api/assignments.py
new file mode 100644
index 00000000..9bc54b2d
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/assignments.py
@@ -0,0 +1,391 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Assignments allow to connect data with elements of perimeter
+
+"""
+import flask
+from flask import request
+from flask_restful import Resource
+import logging
+import requests
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import PolicyManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+def invalidate_data_in_slaves(
+ policy_id,
+ perimeter_id,
+ category_id,
+ data_id):
+ slaves = requests.get("http://{}/slaves".format(request.host)).json().get("slaves")
+ for slave in slaves:
+ if not slave.get("configured", False):
+ continue
+ try:
+ update = requests.put("http://{}:{}/update".format(
+ slave.get("wrapper_name"), slave.get("internal_port")),
+ data={
+ "policy_id": policy_id,
+ "perimeter_id": perimeter_id,
+ "category_id": category_id,
+ "data_id": data_id
+ },
+ timeout=1
+ )
+ logger.info("result {} {}:{} = {}".format(
+ update.status_code,
+ slave.get("wrapper_name"),
+ slave.get("internal_port"),
+ update.text))
+ except requests.exceptions.ConnectionError:
+ logger.warning("Cannot reach {}:{}".format(slave.get("wrapper_name"), slave.get("port")))
+
+
+class SubjectAssignments(Resource):
+ """
+ Endpoint for subject assignment requests
+ """
+
+ __urls__ = (
+ "/policies/<string:uuid>/subject_assignments",
+ "/policies/<string:uuid>/subject_assignments/",
+ "/policies/<string:uuid>/subject_assignments/<string:perimeter_id>",
+ "/policies/<string:uuid>/subject_assignments/<string:perimeter_id>/<string:category_id>",
+ "/policies/<string:uuid>/subject_assignments/<string:perimeter_id>/<string:category_id>/<string:data_id>",
+ )
+
+ @validate_input("get", kwargs_state=[True, False, False, False, False])
+ @check_auth
+ def get(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Retrieve all subject assignments or a specific one for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the subject
+ :param category_id: uuid of the subject category
+ :param data_id: uuid of the subject scope (not used here)
+ :param user_id: user ID who do the request
+ :return: {
+ "subject_data_id": {
+ "policy_id": "ID of the policy",
+ "subject_id": "ID of the subject",
+ "category_id": "ID of the category",
+ "assignments": "Assignments list (list of data_id)",
+ }
+ }
+ :internal_api: get_subject_assignments
+ """
+
+ data = PolicyManager.get_subject_assignments(
+ user_id=user_id, policy_id=uuid,
+ subject_id=perimeter_id, category_id=category_id)
+
+ return {"subject_assignments": data}
+
+ @validate_input("post", kwargs_state=[True, False, False, False, False],
+ body_state={"id": True, "category_id": True, "data_id": True})
+ @check_auth
+ def post(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Create a subject assignment.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the subject (not used here)
+ :param category_id: uuid of the subject category (not used here)
+ :param data_id: uuid of the subject scope (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "id": "UUID of the subject (mandatory)",
+ "category_id": "UUID of the category (mandatory)"
+ "data_id": "UUID of the scope (mandatory)"
+ }
+ :return: {
+ "subject_data_id": {
+ "policy_id": "ID of the policy",
+ "subject_id": "ID of the subject (mandatory)",
+ "category_id": "ID of the category (mandatory)",
+ "assignments": "Assignments list (list of data_id)",
+ }
+ }
+ :internal_api: update_subject_assignment
+ """
+ data_id = request.json.get("data_id")
+ category_id = request.json.get("category_id")
+ perimeter_id = request.json.get("id")
+ data = PolicyManager.add_subject_assignment(
+ user_id=user_id, policy_id=uuid,
+ subject_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+ invalidate_data_in_slaves(
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"subject_assignments": data}
+
+ @validate_input("delete", kwargs_state=[True, True, True, True, False])
+ @check_auth
+ def delete(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Delete a subject assignment for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the subject
+ :param category_id: uuid of the subject category
+ :param data_id: uuid of the subject scope
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message"
+ }
+ :internal_api: delete_subject_assignment
+ """
+
+ data = PolicyManager.delete_subject_assignment(
+ user_id=user_id, policy_id=uuid,
+ subject_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+ invalidate_data_in_slaves(
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"result": True}
+
+
+class ObjectAssignments(Resource):
+ """
+ Endpoint for object assignment requests
+ """
+
+ __urls__ = (
+ "/policies/<string:uuid>/object_assignments",
+ "/policies/<string:uuid>/object_assignments/",
+ "/policies/<string:uuid>/object_assignments/<string:perimeter_id>",
+ "/policies/<string:uuid>/object_assignments/<string:perimeter_id>/<string:category_id>",
+ "/policies/<string:uuid>/object_assignments/<string:perimeter_id>/<string:category_id>/<string:data_id>",
+ )
+
+ @validate_input("get", kwargs_state=[True, False, False, False, False])
+ @check_auth
+ def get(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Retrieve all object assignment or a specific one for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the object
+ :param category_id: uuid of the object category
+ :param data_id: uuid of the object scope (not used here)
+ :param user_id: user ID who do the request
+ :return: {
+ "object_data_id": {
+ "policy_id": "ID of the policy",
+ "object_id": "ID of the object",
+ "category_id": "ID of the category",
+ "assignments": "Assignments list (list of data_id)",
+ }
+ }
+ :internal_api: get_object_assignments
+ """
+
+ data = PolicyManager.get_object_assignments(
+ user_id=user_id, policy_id=uuid,
+ object_id=perimeter_id, category_id=category_id)
+
+ return {"object_assignments": data}
+
+ @validate_input("post", kwargs_state=[True, False, False, False, False],
+ body_state={"id": True, "category_id": True, "data_id": True})
+ @check_auth
+ def post(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Create an object assignment.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the object (not used here)
+ :param category_id: uuid of the object category (not used here)
+ :param data_id: uuid of the object scope (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "id": "UUID of the action (mandatory)",
+ "category_id": "UUID of the category (mandatory)",
+ "data_id": "UUID of the scope (mandatory)"
+ }
+ :return: {
+ "object_data_id": {
+ "policy_id": "ID of the policy",
+ "object_id": "ID of the object",
+ "category_id": "ID of the category",
+ "assignments": "Assignments list (list of data_id)",
+ }
+ }
+ :internal_api: update_object_assignment
+ """
+
+ data_id = request.json.get("data_id")
+ category_id = request.json.get("category_id")
+ perimeter_id = request.json.get("id")
+ data = PolicyManager.add_object_assignment(
+ user_id=user_id, policy_id=uuid,
+ object_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+ invalidate_data_in_slaves(
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"object_assignments": data}
+
+ @validate_input("delete", kwargs_state=[True, True, True, True, False])
+ @check_auth
+ def delete(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Delete a object assignment for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the object
+ :param category_id: uuid of the object category
+ :param data_id: uuid of the object scope
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message"
+ }
+ :internal_api: delete_object_assignment
+ """
+ data = PolicyManager.delete_object_assignment(
+ user_id=user_id, policy_id=uuid,
+ object_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+ invalidate_data_in_slaves(
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"result": True}
+
+
+class ActionAssignments(Resource):
+ """
+ Endpoint for action assignment requests
+ """
+
+ __urls__ = (
+ "/policies/<string:uuid>/action_assignments",
+ "/policies/<string:uuid>/action_assignments/",
+ "/policies/<string:uuid>/action_assignments/<string:perimeter_id>",
+ "/policies/<string:uuid>/action_assignments/<string:perimeter_id>/<string:category_id>",
+ "/policies/<string:uuid>/action_assignments/<string:perimeter_id>/<string:category_id>/<string:data_id>",
+ )
+
+ @validate_input("get", kwargs_state=[True, False, False, False, False])
+ @check_auth
+ def get(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Retrieve all action assignment or a specific one for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the action
+ :param category_id: uuid of the action category
+ :param data_id: uuid of the action scope
+ :param user_id: user ID who do the request
+ :return: {
+ "action_data_id": {
+ "policy_id": "ID of the policy",
+ "object_id": "ID of the action",
+ "category_id": "ID of the category",
+ "assignments": "Assignments list (list of data_id)",
+ }
+ }
+ :internal_api: get_action_assignments
+ """
+ data = PolicyManager.get_action_assignments(
+ user_id=user_id, policy_id=uuid,
+ action_id=perimeter_id, category_id=category_id)
+
+ return {"action_assignments": data}
+
+ @validate_input("post", kwargs_state=[True, False, False, False, False],
+ body_state={"id": True, "category_id": True, "data_id": True})
+ @check_auth
+ def post(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Create an action assignment.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the action (not used here)
+ :param category_id: uuid of the action category (not used here)
+ :param data_id: uuid of the action scope (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "id": "UUID of the action (mandatory)",
+ "category_id": "UUID of the category (mandatory)",
+ "data_id": "UUID of the scope (mandatory)"
+ }
+ :return: {
+ "action_data_id": {
+ "policy_id": "ID of the policy",
+ "object_id": "ID of the action",
+ "category_id": "ID of the category",
+ "assignments": "Assignments list (list of data_id)",
+ }
+ }
+ :internal_api: update_action_assignment
+ """
+
+ data_id = request.json.get("data_id")
+ category_id = request.json.get("category_id")
+ perimeter_id = request.json.get("id")
+ data = PolicyManager.add_action_assignment(
+ user_id=user_id, policy_id=uuid,
+ action_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+ invalidate_data_in_slaves(
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"action_assignments": data}
+
+ @validate_input("delete", kwargs_state=[True, True, True, True, False])
+ @check_auth
+ def delete(self, uuid=None, perimeter_id=None, category_id=None,
+ data_id=None, user_id=None):
+ """Delete a action assignment for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the action
+ :param category_id: uuid of the action category
+ :param data_id: uuid of the action scope
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message"
+ }
+ :internal_api: delete_action_assignment
+ """
+
+ data = PolicyManager.delete_action_assignment(
+ user_id=user_id, policy_id=uuid,
+ action_id=perimeter_id, category_id=category_id,
+ data_id=data_id)
+ invalidate_data_in_slaves(
+ policy_id=uuid,
+ perimeter_id=perimeter_id,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"result": True}
diff --git a/moon_manager/moon_manager/api/base_exception.py b/old/moon_manager/moon_manager/api/base_exception.py
index 0af3b6d0..0a414a59 100644
--- a/moon_manager/moon_manager/api/base_exception.py
+++ b/old/moon_manager/moon_manager/api/base_exception.py
@@ -1,4 +1,3 @@
-
class BaseException(Exception):
def __init__(self, message):
self._code = 500
@@ -15,4 +14,4 @@ class BaseException(Exception):
return self._message
def __str__(self):
- return "Error " + str(self._code) + " " + self.__class__.__name__ + ': ' + self.message \ No newline at end of file
+ return "Error " + str(self._code) + " " + self.__class__.__name__ + ': ' + self.message
diff --git a/old/moon_manager/moon_manager/api/data.py b/old/moon_manager/moon_manager/api/data.py
new file mode 100644
index 00000000..92d7b2c6
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/data.py
@@ -0,0 +1,311 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Data are elements used to create rules
+
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import PolicyManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class SubjectData(Resource):
+ """
+ Endpoint for subject data requests
+ """
+
+ __urls__ = (
+ "/policies/<string:uuid>/subject_data",
+ "/policies/<string:uuid>/subject_data/",
+ "/policies/<string:uuid>/subject_data/<string:category_id>",
+ "/policies/<string:uuid>/subject_data/<string:category_id>/<string:data_id>",
+ )
+
+ @validate_input("get", kwargs_state=[True, False, False, False])
+ @check_auth
+ def get(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Retrieve all subject categories or a specific one if data_id is given
+ for a given policy
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the subject category
+ :param data_id: uuid of the subject data
+ :param user_id: user ID who do the request
+ :return: [{
+ "policy_id": "policy_id1",
+ "category_id": "category_id1",
+ "data": {
+ "subject_data_id": {
+ "name": "name of the data",
+ "description": "description of the data (optional)"
+ }
+ }
+ }]
+ :internal_api: get_subject_data
+ """
+ logger.info("api.get {} {} {}".format(uuid, category_id, data_id))
+ data = PolicyManager.get_subject_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ data_id=data_id)
+ logger.info("api.get data = {}".format(data))
+
+ return {"subject_data": data}
+
+ @validate_input("post", kwargs_state=[True, True, False, False], body_state={"name": True})
+ @check_auth
+ def post(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Create or update a subject.
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the subject category
+ :param data_id: uuid of the subject data (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the data (mandatory)",
+ "description": "description of the data (optional)"
+ }
+ :return: {
+ "policy_id": "policy_id1",
+ "category_id": "category_id1",
+ "data": {
+ "subject_data_id": {
+ "name": "name of the data (mandatory)",
+ "description": "description of the data (optional)"
+ }
+ }
+ }
+ :internal_api: add_subject_data
+ """
+ data = PolicyManager.set_subject_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ value=request.json)
+
+ return {"subject_data": data}
+
+ @validate_input("delete", kwargs_state=[True, False, False, False])
+ @check_auth
+ def delete(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Delete a subject for a given policy
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the subject category
+ :param data_id: uuid of the subject data
+ :param user_id: user ID who do the request
+ :return: [{
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }]
+ :internal_api: delete_subject_data
+ """
+ logger.info("api.delete {} {}".format(uuid, data_id))
+ data = PolicyManager.delete_subject_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"result": True}
+
+
+class ObjectData(Resource):
+ """
+ Endpoint for object data requests
+ """
+
+ __urls__ = (
+ "/policies/<string:uuid>/object_data",
+ "/policies/<string:uuid>/object_data/",
+ "/policies/<string:uuid>/object_data/<string:category_id>",
+ "/policies/<string:uuid>/object_data/<string:category_id>/"
+ "<string:data_id>",
+ )
+
+ @validate_input("get", kwargs_state=[True, False, False, False])
+ @check_auth
+ def get(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Retrieve all object categories or a specific one if sid is given
+ for a given policy
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the object category
+ :param data_id: uuid of the object data
+ :param user_id: user ID who do the request
+ :return: [{
+ "policy_id": "policy_id1",
+ "category_id": "category_id1",
+ "data": {
+ "object_data_id": {
+ "name": "name of the data",
+ "description": "description of the data (optional)"
+ }
+ }
+ }]
+ :internal_api: get_object_data
+ """
+ data = PolicyManager.get_object_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"object_data": data}
+
+ @validate_input("post", kwargs_state=[True, True, False, False], body_state={"name": True})
+ @check_auth
+ def post(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Create or update a object.
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the object category
+ :param data_id: uuid of the object data (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the data (mandatory)",
+ "description": "description of the data (optional)"
+ }
+ :return: {
+ "policy_id": "policy_id1",
+ "category_id": "category_id1",
+ "data": {
+ "object_data_id": {
+ "name": "name of the data",
+ "description": "description of the data (optional)"
+ }
+ }
+ }
+ :internal_api: add_object_data
+ """
+ data = PolicyManager.add_object_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ value=request.json)
+
+ return {"object_data": data}
+
+ @validate_input("delete", kwargs_state=[True, False, False, False])
+ @check_auth
+ def delete(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Delete a object for a given policy
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the object category
+ :param data_id: uuid of the object data
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_object_data
+ """
+ data = PolicyManager.delete_object_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"result": True}
+
+
+class ActionData(Resource):
+ """
+ Endpoint for action data requests
+ """
+
+ __urls__ = (
+ "/policies/<string:uuid>/action_data",
+ "/policies/<string:uuid>/action_data/",
+ "/policies/<string:uuid>/action_data/<string:category_id>",
+ "/policies/<string:uuid>/action_data/<string:category_id>/"
+ "<string:data_id>",
+ )
+
+ @validate_input("get", kwargs_state=[True, False, False, False])
+ @check_auth
+ def get(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Retrieve all action categories or a specific one if sid is given
+ for a given policy
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the action category
+ :param data_id: uuid of the action data
+ :param user_id: user ID who do the request
+ :return: [{
+ "policy_id": "policy_id1",
+ "category_id": "category_id1",
+ "data": {
+ "action_data_id": {
+ "name": "name of the data",
+ "description": "description of the data (optional)"
+ }
+ }
+ }]
+ :internal_api: get_action_data
+ """
+ data = PolicyManager.get_action_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"action_data": data}
+
+ @validate_input("post", kwargs_state=[True, True, False, False], body_state={"name": True})
+ @check_auth
+ def post(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Create or update a action.
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the action category
+ :param data_id: uuid of the action data
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the data (mandatory)",
+ "description": "description of the data (optional)"
+ }
+ :return: {
+ "policy_id": "policy_id1",
+ "category_id": "category_id1",
+ "data": {
+ "action_data_id": {
+ "name": "name of the data",
+ "description": "description of the data (optional)"
+ }
+ }
+ }
+ :internal_api: add_action_data
+ """
+ data = PolicyManager.add_action_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ value=request.json)
+ return {"action_data": data}
+
+ @validate_input("delete", kwargs_state=[True, False, False, False])
+ @check_auth
+ def delete(self, uuid=None, category_id=None, data_id=None, user_id=None):
+ """Delete a action for a given policy
+
+ :param uuid: uuid of the policy
+ :param category_id: uuid of the action category
+ :param data_id: uuid of the action data
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_action_data
+ """
+ data = PolicyManager.delete_action_data(user_id=user_id,
+ policy_id=uuid,
+ category_id=category_id,
+ data_id=data_id)
+
+ return {"result": True}
diff --git a/moon_manager/moon_manager/api/generic.py b/old/moon_manager/moon_manager/api/generic.py
index c79520f7..721f6213 100644
--- a/moon_manager/moon_manager/api/generic.py
+++ b/old/moon_manager/moon_manager/api/generic.py
@@ -122,13 +122,16 @@ class API(Resource):
api_desc[api_name]["version"] = group_api_obj.__version__
object_list = list(filter(lambda x: "__" not in x,
dir(group_api_obj)))
- for obj in map(lambda x: eval("moon_manager.api.{}.{}".format(api_name, x)), object_list):
+ for obj in map(lambda x: eval("moon_manager.api.{}.{}".format(api_name, x)),
+ object_list):
if "__urls__" in dir(obj):
api_desc[api_name][obj.__name__] = dict()
api_desc[api_name][obj.__name__]["urls"] = obj.__urls__
api_desc[api_name][obj.__name__]["methods"] = dict()
for _method in filter(lambda x: x in __methods, dir(obj)):
- docstring = eval("moon_manager.api.{}.{}.{}.__doc__".format(api_name, obj.__name__, _method))
+ docstring = eval(
+ "moon_manager.api.{}.{}.{}.__doc__".format(api_name, obj.__name__,
+ _method))
api_desc[api_name][obj.__name__]["methods"][_method] = docstring
api_desc[api_name][obj.__name__]["description"] = str(obj.__doc__)
if group_id in api_desc:
diff --git a/old/moon_manager/moon_manager/api/json_export.py b/old/moon_manager/moon_manager/api/json_export.py
new file mode 100644
index 00000000..069e5884
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/json_export.py
@@ -0,0 +1,279 @@
+# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import logging
+from flask_restful import Resource
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import PDPManager
+from python_moondb.core import PolicyManager
+from python_moondb.core import ModelManager
+from moon_manager.api.json_utils import JsonUtils, BaseException
+
+__version__ = "4.5.0"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class JsonExport(Resource):
+ __urls__ = (
+ "/export",
+ "/export/",
+ )
+
+ def _export_rules(self, json_content):
+ policies = PolicyManager.get_policies(self._user_id)
+ rules_array = []
+
+ for policy_key in policies:
+ rules = PolicyManager.get_rules(self._user_id, policy_key)
+ rules = rules["rules"]
+ # logger.info(rules)
+ for rule in rules:
+ rule_dict = dict()
+ JsonUtils.copy_field_if_exists(rule, rule_dict, "instructions", dict)
+ JsonUtils.copy_field_if_exists(rule, rule_dict, "enabled", True)
+ JsonUtils.convert_id_to_name(rule["meta_rule_id"], rule_dict, "meta_rule",
+ "meta_rule", ModelManager, self._user_id)
+ JsonUtils.convert_id_to_name(policy_key, rule_dict, "policy", "policy",
+ PolicyManager, self._user_id)
+ ids = rule["rule"]
+ rule_description = dict()
+ meta_rule = ModelManager.get_meta_rules(self._user_id, rule["meta_rule_id"])
+ meta_rule = [v for v in meta_rule.values()]
+ meta_rule = meta_rule[0]
+ index_subject_data = len(meta_rule["subject_categories"]) - 1
+ index_object_data = len(meta_rule["subject_categories"]) + len(
+ meta_rule["object_categories"]) - 1
+ index_action_data = len(meta_rule["subject_categories"]) + len(
+ meta_rule["object_categories"]) + len(meta_rule["action_categories"]) - 1
+ ids_subject_data = [ids[0]] if len(meta_rule["subject_categories"]) == 1 else ids[
+ 0:index_subject_data]
+ ids_object_data = [ids[index_object_data]] if len(
+ meta_rule["object_categories"]) == 1 else ids[
+ index_subject_data + 1:index_object_data]
+ ids_action_date = [ids[index_action_data]] if len(
+ meta_rule["action_categories"]) == 1 else ids[
+ index_object_data + 1:index_action_data]
+ JsonUtils.convert_ids_to_names(ids_subject_data, rule_description, "subject_data",
+ "subject_data", PolicyManager, self._user_id,
+ policy_key)
+ JsonUtils.convert_ids_to_names(ids_object_data, rule_description, "object_data",
+ "object_data", PolicyManager, self._user_id,
+ policy_key)
+ JsonUtils.convert_ids_to_names(ids_action_date, rule_description, "action_data",
+ "action_data", PolicyManager, self._user_id,
+ policy_key)
+ rule_dict["rule"] = rule_description
+ rules_array.append(rule_dict)
+
+ if len(rules_array) > 0:
+ json_content['rules'] = rules_array
+
+ def _export_meta_rules(self, json_content):
+ meta_rules = ModelManager.get_meta_rules(self._user_id)
+ meta_rules_array = []
+ # logger.info(meta_rules)
+ for meta_rule_key in meta_rules:
+ # logger.info(meta_rules[meta_rule_key])
+ meta_rule_dict = dict()
+ JsonUtils.copy_field_if_exists(meta_rules[meta_rule_key], meta_rule_dict, "name", str)
+ JsonUtils.copy_field_if_exists(meta_rules[meta_rule_key], meta_rule_dict, "description",
+ str)
+ JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["subject_categories"],
+ meta_rule_dict, "subject_categories", "subject_category",
+ ModelManager, self._user_id)
+ JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["object_categories"],
+ meta_rule_dict, "object_categories", "object_category",
+ ModelManager, self._user_id)
+ JsonUtils.convert_ids_to_names(meta_rules[meta_rule_key]["action_categories"],
+ meta_rule_dict, "action_categories", "action_category",
+ ModelManager, self._user_id)
+ logger.info("Exporting meta rule {}".format(meta_rule_dict))
+ meta_rules_array.append(meta_rule_dict)
+ if len(meta_rules_array) > 0:
+ json_content['meta_rules'] = meta_rules_array
+
+ def _export_subject_object_action_assignments(self, type_element, json_content):
+ export_method_data = getattr(PolicyManager, 'get_' + type_element + '_assignments')
+ policies = PolicyManager.get_policies(self._user_id)
+ element_assignments_array = []
+ for policy_key in policies:
+ assignments = export_method_data(self._user_id, policy_key)
+ # logger.info(assignments)
+ for assignment_key in assignments:
+ assignment_dict = dict()
+ JsonUtils.convert_id_to_name(assignments[assignment_key][type_element + "_id"],
+ assignment_dict, type_element, type_element,
+ PolicyManager, self._user_id, policy_key)
+ JsonUtils.convert_id_to_name(assignments[assignment_key]["category_id"],
+ assignment_dict, "category",
+ type_element + "_category", ModelManager,
+ self._user_id, policy_key)
+ JsonUtils.convert_ids_to_names(assignments[assignment_key]["assignments"],
+ assignment_dict, "assignments",
+ type_element + "_data", PolicyManager, self._user_id,
+ policy_key)
+ element_assignments_array.append(assignment_dict)
+ logger.info("Exporting {} assignment {}".format(type_element, assignment_dict))
+ if len(element_assignments_array) > 0:
+ json_content[type_element + '_assignments'] = element_assignments_array
+
+ def _export_subject_object_action_datas(self, type_element, json_content):
+ export_method_data = getattr(PolicyManager, 'get_' + type_element + '_data')
+ policies = PolicyManager.get_policies(self._user_id)
+ element_datas_array = []
+ for policy_key in policies:
+ datas = export_method_data(self._user_id, policy_key)
+ # logger.info("data found : {}".format(datas))
+ for data_group in datas:
+ policy_id = data_group["policy_id"]
+ category_id = data_group["category_id"]
+ # logger.info(data_group["data"])
+ for data_key in data_group["data"]:
+ data_dict = dict()
+ if type_element == 'subject':
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "name", str)
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "description", str)
+ else:
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "name", str)
+ JsonUtils.copy_field_if_exists(data_group["data"][data_key], data_dict,
+ "description", str)
+
+ JsonUtils.convert_id_to_name(policy_id, data_dict, "policy", "policy",
+ PolicyManager, self._user_id)
+ JsonUtils.convert_id_to_name(category_id, data_dict, "category",
+ type_element + "_category", ModelManager,
+ self._user_id, policy_key)
+ logger.info("Exporting {} data {}".format(type_element, data_dict))
+ element_datas_array.append(data_dict)
+
+ if len(element_datas_array) > 0:
+ json_content[type_element + '_data'] = element_datas_array
+
+ def _export_subject_object_action_categories(self, type_element, json_content):
+ export_method = getattr(ModelManager, 'get_' + type_element + '_categories')
+ element_categories = export_method(self._user_id)
+ element_categories_array = []
+ for element_category_key in element_categories:
+ element_category = dict()
+ JsonUtils.copy_field_if_exists(element_categories[element_category_key],
+ element_category, "name", str)
+ JsonUtils.copy_field_if_exists(element_categories[element_category_key],
+ element_category, "description", str)
+ element_categories_array.append(element_category)
+ logger.info("Exporting {} category {}".format(type_element, element_category))
+ if len(element_categories_array) > 0:
+ json_content[type_element + '_categories'] = element_categories_array
+
+ def _export_subject_object_action(self, type_element, json_content):
+ export_method = getattr(PolicyManager, 'get_' + type_element + 's')
+ policies = PolicyManager.get_policies(self._user_id)
+ element_dict = dict()
+ elements_array = []
+ for policy_key in policies:
+ elements = export_method(self._user_id, policy_key)
+ for element_key in elements:
+ # logger.info("Exporting {}".format(elements[element_key]))
+ element = dict()
+ JsonUtils.copy_field_if_exists(elements[element_key], element, "name", str)
+ JsonUtils.copy_field_if_exists(elements[element_key], element, "description", str)
+ JsonUtils.copy_field_if_exists(elements[element_key], element, "extra", dict)
+ if element["name"] not in element_dict:
+ element["policies"] = []
+ element_dict[element["name"]] = element
+ current_element = element_dict[element["name"]]
+ current_element["policies"].append({"name": JsonUtils.convert_id_to_name_string(
+ policy_key, "policy", PolicyManager, self._user_id)})
+
+ for key in element_dict:
+ logger.info("Exporting {} {}".format(type_element, element_dict[key]))
+ elements_array.append(element_dict[key])
+
+ if len(elements_array) > 0:
+ json_content[type_element + 's'] = elements_array
+
+ def _export_policies(self, json_content):
+ policies = PolicyManager.get_policies(self._user_id)
+ policies_array = []
+ for policy_key in policies:
+ policy = dict()
+ JsonUtils.copy_field_if_exists(policies[policy_key], policy, "name", str)
+ JsonUtils.copy_field_if_exists(policies[policy_key], policy, "genre", str)
+ JsonUtils.copy_field_if_exists(policies[policy_key], policy, "description", str)
+ JsonUtils.convert_id_to_name(policies[policy_key]["model_id"], policy, "model", "model",
+ ModelManager, self._user_id)
+ logger.info("Exporting policy {}".format(policy))
+ policies_array.append(policy)
+ if len(policies_array) > 0:
+ json_content["policies"] = policies_array
+
+ def _export_models(self, json_content):
+ models = ModelManager.get_models(self._user_id)
+ models_array = []
+ for model_key in models:
+ model = dict()
+ JsonUtils.copy_field_if_exists(models[model_key], model, "name", str)
+ JsonUtils.copy_field_if_exists(models[model_key], model, "description", str)
+ # logger.info(models[model_key]["meta_rules"])
+ JsonUtils.convert_ids_to_names(models[model_key]["meta_rules"], model, "meta_rules",
+ "meta_rule", ModelManager, self._user_id)
+ logger.info("Exporting model {}".format(model))
+ models_array.append(model)
+ if len(models_array) > 0:
+ json_content["models"] = models_array
+
+ def _export_pdps(self, json_content):
+ pdps = PDPManager.get_pdp(self._user_id)
+ pdps_array = []
+ for pdp_key in pdps:
+ logger.info("Exporting pdp {}".format(pdps[pdp_key]))
+ pdps_array.append(pdps[pdp_key])
+ if len(pdps_array) > 0:
+ json_content["pdps"] = pdps_array
+
+ def _export_json(self, user_id):
+ self._user_id = user_id
+ json_content = dict()
+
+ logger.info("Exporting pdps...")
+ self._export_pdps(json_content)
+ logger.info("Exporting policies...")
+ self._export_policies(json_content)
+ logger.info("Exporting models...")
+ self._export_models(json_content)
+ # export subjects, subject_data, subject_categories, subject_assignements idem for object and action
+ list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
+ for elt in list_element:
+ logger.info("Exporting {}s...".format(elt["key"]))
+ self._export_subject_object_action(elt["key"], json_content)
+ logger.info("Exporting {} categories...".format(elt["key"]))
+ self._export_subject_object_action_categories(elt["key"], json_content)
+ logger.info("Exporting {} data...".format(elt["key"]))
+ self._export_subject_object_action_datas(elt["key"], json_content)
+ logger.info("Exporting {} assignments...".format(elt["key"]))
+ self._export_subject_object_action_assignments(elt["key"], json_content)
+ logger.info("Exporting meta rules...")
+ self._export_meta_rules(json_content)
+ logger.info("Exporting rules...")
+ self._export_rules(json_content)
+
+ return json_content
+
+ @check_auth
+ def get(self, user_id=None):
+ """Import file.
+
+ :param user_id: user ID who do the request
+ :return: {
+
+ }
+ :internal_api:
+ """
+ json_file = self._export_json(user_id)
+ logger.info(json_file)
+ return {"content": json_file}
diff --git a/old/moon_manager/moon_manager/api/json_import.py b/old/moon_manager/moon_manager/api/json_import.py
new file mode 100644
index 00000000..05f4a0c0
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/json_import.py
@@ -0,0 +1,584 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from flask import request
+from flask_restful import Resource
+import flask_restful
+from flask import abort
+
+from python_moonutilities.security_functions import check_auth
+from python_moonutilities import exceptions
+import logging
+import json
+
+from moon_manager.api.base_exception import BaseException
+from moon_manager.api.json_utils import JsonUtils, UnknownName
+from python_moondb.core import PDPManager
+from python_moondb.core import PolicyManager
+from python_moondb.core import ModelManager
+
+__version__ = "4.5.0"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+INST_CALLBACK = 0
+DATA_CALLBACK = 1
+ASSIGNMENT_CALLBACK = 2
+CATEGORIES_CALLBACK = 3
+
+
+class ForbiddenOverride(BaseException):
+ def __init__(self, message):
+ # Call the base class constructor with the parameters it needs
+ super(ForbiddenOverride, self).__init__(message)
+
+
+class UnknownPolicy(BaseException):
+ def __init__(self, message):
+ # Call the base class constructor with the parameters it needs
+ super(UnknownPolicy, self).__init__(message)
+
+
+class UnknownModel(BaseException):
+ def __init__(self, message):
+ # Call the base class constructor with the parameters it needs
+ super(UnknownModel, self).__init__(message)
+
+
+class UnknownData(BaseException):
+ def __init__(self, message):
+ # Call the base class constructor with the parameters it needs
+ super(UnknownData, self).__init__(message)
+
+
+class MissingPolicy(BaseException):
+ def __init__(self, message):
+ # Call the base class constructor with the parameters it needs
+ super(MissingPolicy, self).__init__(message)
+
+
+class InvalidJson(BaseException):
+ def __init__(self, message):
+ # Call the base class constructor with the parameters it needs
+ super(InvalidJson, self).__init__(message)
+
+
+class JsonImport(Resource):
+ __urls__ = (
+ "/import",
+ "/import/",
+ )
+
+ def _reorder_rules_ids(self, rule, ordered_perimeter_categories_ids, json_data_ids, policy_id,
+ get_function):
+ ordered_json_ids = [None] * len(ordered_perimeter_categories_ids)
+ for json_id in json_data_ids:
+ data = get_function(self._user_id, policy_id, data_id=json_id)
+ data = data[0]
+ if data["category_id"] not in ordered_perimeter_categories_ids:
+ raise InvalidJson(
+ "The category id {} of the rule {} does not match the meta rule".format(
+ data["category_id"], rule))
+ if ordered_json_ids[
+ ordered_perimeter_categories_ids.index(data["category_id"])] is not None:
+ raise InvalidJson(
+ "The category id {} of the rule {} shall not be used twice in the same rule".format(
+ data["category_id"], rule))
+ ordered_json_ids[ordered_perimeter_categories_ids.index(data["category_id"])] = json_id
+ logger.info(ordered_json_ids)
+ return ordered_json_ids
+
+ def _import_rules(self, json_rules):
+ if not isinstance(json_rules, list):
+ raise InvalidJson("rules shall be a list!")
+
+ for json_rule in json_rules:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_rule, json_to_use, "instructions", str)
+ JsonUtils.copy_field_if_exists(json_rule, json_to_use, "enabled", bool,
+ default_value=True)
+
+ json_ids = dict()
+ JsonUtils.convert_name_to_id(json_rule, json_ids, "policy", "policy_id", "policy",
+ PolicyManager, self._user_id)
+ JsonUtils.convert_name_to_id(json_rule, json_to_use, "meta_rule", "meta_rule_id",
+ "meta_rule", ModelManager, self._user_id)
+ json_subject_ids = dict()
+ json_object_ids = dict()
+ json_action_ids = dict()
+ JsonUtils.convert_names_to_ids(json_rule["rule"], json_subject_ids, "subject_data",
+ "subject", "subject_data", PolicyManager, self._user_id,
+ json_ids["policy_id"])
+ JsonUtils.convert_names_to_ids(json_rule["rule"], json_object_ids, "object_data",
+ "object", "object_data", PolicyManager, self._user_id,
+ json_ids["policy_id"])
+ JsonUtils.convert_names_to_ids(json_rule["rule"], json_action_ids, "action_data",
+ "action", "action_data", PolicyManager, self._user_id,
+ json_ids["policy_id"])
+
+ meta_rule = ModelManager.get_meta_rules(self._user_id, json_to_use["meta_rule_id"])
+ meta_rule = [v for v in meta_rule.values()]
+ meta_rule = meta_rule[0]
+
+ json_to_use_rule = self._reorder_rules_ids(json_rule, meta_rule["subject_categories"],
+ json_subject_ids["subject"],
+ json_ids["policy_id"],
+ PolicyManager.get_subject_data)
+ json_to_use_rule = json_to_use_rule + self._reorder_rules_ids(json_rule, meta_rule[
+ "object_categories"], json_object_ids["object"], json_ids["policy_id"],
+ PolicyManager.get_object_data)
+ json_to_use_rule = json_to_use_rule + self._reorder_rules_ids(json_rule, meta_rule[
+ "action_categories"], json_action_ids["action"], json_ids["policy_id"],
+ PolicyManager.get_action_data)
+ json_to_use["rule"] = json_to_use_rule
+ try:
+ logger.debug("Adding / updating a rule from json {}".format(json_to_use))
+ PolicyManager.add_rule(self._user_id, json_ids["policy_id"],
+ json_to_use["meta_rule_id"], json_to_use)
+ except exceptions.RuleExisting:
+ pass
+ except exceptions.PolicyUnknown:
+ raise UnknownPolicy("Unknown policy with id {}".format(json_ids["policy_id"]))
+
+ def _import_meta_rules(self, json_meta_rules):
+ logger.info("Input meta rules : {}".format(json_meta_rules))
+ for json_meta_rule in json_meta_rules:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_meta_rule, json_to_use, "name", str)
+ JsonUtils.copy_field_if_exists(json_meta_rule, json_to_use, "description", str)
+ JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "subject_categories",
+ "subject_categories", "subject_category", ModelManager,
+ self._user_id)
+ JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "object_categories",
+ "object_categories", "object_category", ModelManager,
+ self._user_id)
+ JsonUtils.convert_names_to_ids(json_meta_rule, json_to_use, "action_categories",
+ "action_categories", "action_category", ModelManager,
+ self._user_id)
+ logger.debug("Adding / updating a metarule from json {}".format(json_meta_rule))
+ meta_rule = ModelManager.add_meta_rule(self._user_id, meta_rule_id=None,
+ value=json_to_use)
+ logger.debug("Added / updated meta rule : {}".format(meta_rule))
+
+ def _import_subject_object_action_assignments(self, json_item_assignments, type_element):
+ import_method = getattr(PolicyManager, 'add_' + type_element + '_assignment')
+ get_method = getattr(PolicyManager, 'get_' + type_element + '_data')
+
+ if not isinstance(json_item_assignments, list):
+ raise InvalidJson(type_element + " assignments shall be a list!")
+
+ # get the policy id related to the user
+ policies = PolicyManager.get_policies(self._user_id)
+
+ for json_item_assignment in json_item_assignments:
+ item_override = JsonUtils.get_override(json_item_assignment)
+ if item_override is True:
+ raise ForbiddenOverride(
+ "{} assignments do not support override flag !".format(type_element))
+
+ json_assignment = dict()
+ JsonUtils.convert_name_to_id(json_item_assignment, json_assignment, "category",
+ "category_id", type_element + "_category", ModelManager,
+ self._user_id)
+
+ has_found_data = False
+ # loop over policies
+ for policy_id in policies:
+ json_data = dict()
+ try:
+ JsonUtils.convert_name_to_id(json_item_assignment, json_assignment,
+ type_element, "id", type_element, PolicyManager,
+ self._user_id, policy_id)
+ JsonUtils.convert_names_to_ids(json_item_assignment, json_data, "assignments",
+ "data_id", type_element + "_data", PolicyManager,
+ self._user_id, policy_id,
+ json_assignment["category_id"])
+ has_found_data = True
+ except UnknownName:
+ # the category or data has not been found in this policy : we look into the next one
+ continue
+ for data_id in json_data["data_id"]:
+ # find the policy related to the current data
+ data = get_method(self._user_id, policy_id, data_id,
+ json_assignment["category_id"])
+ if data is not None and len(data) == 1:
+ logger.debug(
+ "Adding / updating a {} assignment from json {}".format(type_element,
+ json_assignment))
+ import_method(self._user_id, policy_id, json_assignment["id"],
+ json_assignment["category_id"],
+ data_id)
+ else:
+ raise UnknownData("Unknown data with id {}".format(data_id))
+
+ # case the data has not been found in any policies
+ if has_found_data is False:
+ raise InvalidJson("The json contains unknown {} data or category : {}".format(
+ type_element,
+ json_item_assignment))
+
+ def _import_subject_object_action_datas(self, json_items_data, mandatory_policy_ids,
+ type_element):
+ if type_element == "subject":
+ import_method = getattr(PolicyManager, 'set_' + type_element + '_data')
+ else:
+ import_method = getattr(PolicyManager, 'add_' + type_element + '_data')
+ # get_method = getattr(PolicyManager, 'get_' + type_element + '_data')
+
+ if not isinstance(json_items_data, list):
+ raise InvalidJson(type_element + " data shall be a list!")
+
+ for json_item_data in json_items_data:
+ item_override = JsonUtils.get_override(json_items_data)
+ if item_override is True:
+ raise ForbiddenOverride(
+ "{} datas do not support override flag !".format(type_element))
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_item_data, json_to_use, "name", str)
+ JsonUtils.copy_field_if_exists(json_item_data, json_to_use, "description", str)
+ json_policy = dict()
+ # field_mandatory : not mandatory if there is some mandatory policies
+ JsonUtils.convert_names_to_ids(json_item_data, json_policy, "policies", "policy_id",
+ "policy",
+ PolicyManager, self._user_id,
+ field_mandatory=len(mandatory_policy_ids) == 0)
+ json_category = dict()
+ JsonUtils.convert_name_to_id(json_item_data, json_category, "category", "category_id",
+ type_element + "_category",
+ ModelManager, self._user_id)
+ policy_ids = []
+ if "policy_id" in json_policy:
+ policy_ids = json_policy["policy_id"]
+
+ for policy_id in policy_ids:
+ if policy_id is not None and policy_id not in mandatory_policy_ids:
+ mandatory_policy_ids.append(policy_id)
+
+ if len(mandatory_policy_ids) == 0:
+ raise InvalidJson("Invalid data, the policy shall be set when importing {}".format(
+ json_item_data))
+ category_id = None
+ if "category_id" in json_category:
+ category_id = json_category["category_id"]
+ if category_id is None:
+ raise InvalidJson(
+ "Invalid data, the category shall be set when importing {}".format(
+ json_item_data))
+
+ for policy_id in mandatory_policy_ids:
+ try:
+ data = import_method(self._user_id, policy_id, category_id=category_id,
+ value=json_to_use)
+ except exceptions.PolicyUnknown:
+ raise UnknownPolicy("Unknown policy with id {}".format(policy_id))
+ except Exception as e:
+ logger.exception(str(e))
+ raise e
+
+ def _import_subject_object_action_categories(self, json_item_categories, type_element):
+ import_method = getattr(ModelManager, 'add_' + type_element + '_category')
+ get_method = getattr(ModelManager, 'get_' + type_element + '_categories')
+
+ categories = get_method(self._user_id)
+
+ if not isinstance(json_item_categories, list):
+ raise InvalidJson(type_element + " categories shall be a list!")
+
+ for json_item_category in json_item_categories:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_item_category, json_to_use, "name", str)
+
+ # check if category with the same name exists : do this in moondb ?
+ existing_id = None
+ for category_key in categories:
+ if categories[category_key]["name"] == json_to_use["name"]:
+ existing_id = category_key
+
+ JsonUtils.copy_field_if_exists(json_item_category, json_to_use, "description", str)
+ item_override = JsonUtils.get_override(json_item_category)
+ if item_override is True:
+ raise ForbiddenOverride(
+ "{} categories do not support override flag !".format(type_element))
+
+ try:
+ category = import_method(self._user_id, existing_id, json_to_use)
+ except (exceptions.SubjectCategoryExisting, exceptions.ObjectCategoryExisting,
+ exceptions.ActionCategoryExisting):
+ # it already exists: do nothing
+ logger.warning("Ignored {} category with name {} is already in the database".format(
+ type_element, json_to_use["name"]))
+ except Exception as e:
+ logger.warning("Error while importing the category : {}".format(str(e)))
+ logger.exception(str(e))
+ raise e
+
+ def _import_subject_object_action(self, json_items, mandatory_policy_ids, type_element):
+ import_method = getattr(PolicyManager, 'add_' + type_element)
+ get_method = getattr(PolicyManager, 'get_' + type_element + 's')
+
+ if not isinstance(json_items, list):
+ raise InvalidJson(type_element + " items shall be a list!")
+
+ for json_item in json_items:
+ json_without_policy_name = dict()
+ JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "name", str)
+ JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "description", str)
+ JsonUtils.copy_field_if_exists(json_item, json_without_policy_name, "extra", dict)
+ JsonUtils.convert_names_to_ids(json_item, json_without_policy_name, "policies",
+ "policy_list", "policy", PolicyManager, self._user_id,
+ field_mandatory=False)
+ policy_ids = json_without_policy_name["policy_list"]
+ for mandatory_policy_id in mandatory_policy_ids:
+ if mandatory_policy_id not in policy_ids:
+ policy_ids.append(mandatory_policy_id)
+ # policy_ids and json_without_policy_name are references to the same array...
+ # json_without_policy_name["policy_list"].append(mandatory_policy_id)
+
+ item_override = JsonUtils.get_override(json_item)
+ if item_override is True:
+ raise ForbiddenOverride("{} does not support override flag !".format(type_element))
+
+ if len(policy_ids) == 0:
+ raise MissingPolicy(
+ "a {} needs at least one policy to be created or updated : {}".format(
+ type_element, json.dumps(json_item)))
+
+ for policy_id in policy_ids:
+ try:
+ items_in_db = get_method(self._user_id, policy_id)
+ key = None
+ for key_in_db in items_in_db:
+ if items_in_db[key_in_db]["name"] == json_without_policy_name["name"]:
+ key = key_in_db
+ break
+ element = import_method(self._user_id, policy_id, perimeter_id=key,
+ value=json_without_policy_name)
+ logger.debug("Added / updated {} : {}".format(type_element, element))
+
+ except exceptions.PolicyUnknown:
+ raise UnknownPolicy("Unknown policy when adding a {}!".format(type_element))
+ except Exception as e:
+ logger.exception(str(e))
+ raise BaseException(str(e))
+
+ def _import_policies(self, json_policies):
+ policy_mandatory_ids = []
+
+ if not isinstance(json_policies, list):
+ raise InvalidJson("policies shall be a list!")
+
+ for json_policy in json_policies:
+ # TODO put this in moondb
+ # policy_in_db = PolicyManager.get_policies_by_name(json_without_model_name["name"])
+ policies = PolicyManager.get_policies(self._user_id)
+ policy_in_db = None
+ policy_id = None
+ for policy_key in policies:
+ if policies[policy_key]["name"] == json_policy["name"]:
+ policy_in_db = policies[policy_key]
+ policy_id = policy_key
+ # end TODO
+ if policy_in_db is None:
+ policy_does_exist = False
+ else:
+ policy_does_exist = True
+
+ policy_override = JsonUtils.get_override(json_policy)
+ policy_mandatory = JsonUtils.get_mandatory(json_policy)
+
+ if policy_override is False and policy_does_exist:
+ if policy_id:
+ policy_mandatory_ids.append(policy_id)
+ logger.warning(
+ "Existing policy not updated because of the override option is not set !")
+ continue
+
+ json_without_model_name = dict()
+ JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "name", str)
+ JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "description", str)
+ JsonUtils.copy_field_if_exists(json_policy, json_without_model_name, "genre", str)
+ JsonUtils.convert_name_to_id(json_policy, json_without_model_name, "model", "model_id",
+ "model", ModelManager, self._user_id,
+ field_mandatory=False)
+
+ if not policy_does_exist:
+ logger.debug("Creating policy {} ".format(json_without_model_name))
+ added_policy = PolicyManager.add_policy(self._user_id, None,
+ json_without_model_name)
+ if policy_mandatory is True:
+ keys = list(added_policy.keys())
+ policy_mandatory_ids.append(keys[0])
+ elif policy_override is True:
+ logger.debug("Updating policy {} ".format(json_without_model_name))
+ updated_policy = PolicyManager.update_policy(self._user_id, policy_id,
+ json_without_model_name)
+ if policy_mandatory is True:
+ policy_mandatory_ids.append(policy_id)
+ return policy_mandatory_ids
+
+ def _import_models_with_new_meta_rules(self, json_models):
+ if not isinstance(json_models, list):
+ raise InvalidJson("models shall be a list!")
+
+ for json_model in json_models:
+ logger.debug("json_model {}".format(json_model))
+ models = ModelManager.get_models(self._user_id)
+ model_in_db = None
+ model_id = None
+ for model_key in models:
+ if ("id" in json_model and model_key == json_model["id"]) or (
+ "name" in json_model and models[model_key]["name"] == json_model["name"]):
+ model_in_db = models[model_key]
+ model_id = model_key
+
+ # this should not occur as the model has been put in db previously in _import_models_without_new_meta_rules
+ if model_in_db is None:
+ raise UnknownModel("Unknown model ")
+
+ json_key = dict()
+ JsonUtils.convert_names_to_ids(json_model, json_key, "meta_rules", "meta_rule_id",
+ "meta_rule", ModelManager, self._user_id)
+ for meta_rule_id in json_key["meta_rule_id"]:
+ if meta_rule_id not in model_in_db["meta_rules"]:
+ model_in_db["meta_rules"].append(meta_rule_id)
+
+ ModelManager.update_model(self._user_id, model_id, model_in_db)
+
+ def _import_models_without_new_meta_rules(self, json_models):
+ if not isinstance(json_models, list):
+ raise InvalidJson("models shall be a list!")
+
+ for json_model in json_models:
+ json_without_new_metarules = dict()
+ JsonUtils.copy_field_if_exists(json_model, json_without_new_metarules, "name", str)
+
+ # TODO put this in moondb
+ # model_in_db = ModelManager.get_models_by_name(json_without_new_metarules["name"])
+ models = ModelManager.get_models(self._user_id)
+ model_in_db = None
+ for model_key in models:
+ if models[model_key]["name"] == json_without_new_metarules["name"]:
+ model_in_db = models[model_key]
+ model_id = model_key
+ # end TODO
+
+ JsonUtils.copy_field_if_exists(json_model, json_without_new_metarules, "description",
+ str)
+ if model_in_db is None:
+ model_does_exist = False
+ else:
+ json_without_new_metarules["meta_rules"] = model_in_db["meta_rules"]
+ model_does_exist = True
+ model_override = JsonUtils.get_override(json_model)
+ if not model_does_exist:
+ logger.debug("Creating model {} ".format(json_without_new_metarules))
+ ModelManager.add_model(self._user_id, None, json_without_new_metarules)
+ elif model_override is True:
+ logger.debug(
+ "Updating model with id {} : {} ".format(model_id, json_without_new_metarules))
+ ModelManager.update_model(self._user_id, model_id, json_without_new_metarules)
+
+ def _import_pdps(self, json_pdps):
+ if not isinstance(json_pdps, list):
+ raise InvalidJson("pdps shall be a list!")
+
+ for json_pdp in json_pdps:
+ json_to_use = dict()
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "name", str)
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "keystone_project_id", str)
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "security_pipeline", list)
+ JsonUtils.copy_field_if_exists(json_pdp, json_to_use, "description", str)
+
+ pdps = PDPManager.get_pdp(self._user_id)
+ exists = False
+ for pdp_key in pdps:
+ if pdps[pdp_key]["name"] == json_to_use["name"]:
+ PDPManager.update_pdp(self._user_id, pdp_id=pdp_key, value=json_to_use)
+ exists = True
+ if exists is False:
+ PDPManager.add_pdp(self._user_id, value=json_to_use)
+
+ def _import_json(self, user_id):
+ self._user_id = user_id
+ if 'file' in request.files:
+ file = request.files['file']
+ logger.debug("Importing {} file...".format(file))
+ json_content = json.load(file)
+ else:
+ json_content = request.json
+ logger.debug("Importing content: {} ...".format(json_content))
+
+ # first import the models without the meta rules as they are not yet defined
+ if "models" in json_content:
+ logger.info("Importing models...")
+ self._import_models_without_new_meta_rules(json_content["models"])
+
+ # import the policies that depends on the models
+ mandatory_policy_ids = []
+ if "policies" in json_content:
+ logger.info("Importing policies...")
+ mandatory_policy_ids = self._import_policies(json_content["policies"])
+
+ # import subjects, subject_data, subject_categories, idem for object and action
+ list_element = [{"key": "subject"}, {"key": "object"}, {"key": "action"}]
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "s"
+ if key in json_content:
+ logger.info("Importing {}...".format(key))
+ self._import_subject_object_action(json_content[key], mandatory_policy_ids, in_key)
+ key = in_key + "_categories"
+ if key in json_content:
+ logger.info("Importing {}...".format(key))
+ self._import_subject_object_action_categories(json_content[key], in_key)
+
+ # import meta rules
+ if "meta_rules" in json_content:
+ logger.info("Importing meta rules...")
+ self._import_meta_rules(json_content["meta_rules"])
+
+ # add the metarule to model
+ if "models" in json_content:
+ logger.info("Updating models with meta rules...")
+ self._import_models_with_new_meta_rules(json_content["models"])
+
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_data"
+ if key in json_content:
+ logger.info("Importing {}...".format(key))
+ self._import_subject_object_action_datas(json_content[key], mandatory_policy_ids,
+ in_key)
+
+ # import subjects assignments, idem for object and action
+ for elt in list_element:
+ in_key = elt["key"]
+ key = in_key + "_assignments"
+ if key in json_content:
+ logger.info("Importing {}...".format(key))
+ self._import_subject_object_action_assignments(json_content[key], in_key)
+
+ # import rules
+ if "rules" in json_content:
+ logger.info("Importing rules...")
+ self._import_rules(json_content["rules"])
+
+ # import pdps
+ if "pdps" in json_content:
+ logger.info("Importing pdps...")
+ self._import_pdps(json_content["pdps"])
+
+ @check_auth
+ def post(self, user_id=None):
+ """Import file.
+
+ :param user_id: user ID who do the request
+ :return: {
+
+ }
+ :internal_api:
+ """
+ self._import_json(user_id)
+ return "Import ok !"
diff --git a/moon_manager/moon_manager/api/json_utils.py b/old/moon_manager/moon_manager/api/json_utils.py
index cc4c8b0f..6a5830f1 100644
--- a/moon_manager/moon_manager/api/json_utils.py
+++ b/old/moon_manager/moon_manager/api/json_utils.py
@@ -6,28 +6,24 @@ logger = logging.getLogger("moon.manager.api." + __name__)
class UnknownName(BaseException):
def __init__(self, message):
-
# Call the base class constructor with the parameters it needs
super(UnknownName, self).__init__(message)
class UnknownId(BaseException):
def __init__(self, message):
-
# Call the base class constructor with the parameters it needs
super(UnknownId, self).__init__(message)
class MissingIdOrName(BaseException):
def __init__(self, message):
-
# Call the base class constructor with the parameters it needs
super(MissingIdOrName, self).__init__(message)
class UnknownField(BaseException):
def __init__(self, message):
-
# Call the base class constructor with the parameters it needs
super(UnknownField, self).__init__(message)
@@ -64,7 +60,8 @@ class JsonUtils:
json_out[field_name] = []
@staticmethod
- def _get_element_in_db_from_id(element_type, element_id, user_id, policy_id, category_id, meta_rule_id, manager):
+ def _get_element_in_db_from_id(element_type, element_id, user_id, policy_id, category_id,
+ meta_rule_id, manager):
# the item is supposed to be in the db, we check it exists!
if element_type == "model":
data_db = manager.get_models(user_id, model_id=element_id)
@@ -85,11 +82,14 @@ class JsonUtils:
elif element_type == "meta_rule":
data_db = manager.get_meta_rules(user_id, meta_rule_id=element_id)
elif element_type == "subject_data":
- data_db = manager.get_subject_data(user_id, policy_id, data_id=element_id, category_id=category_id)
+ data_db = manager.get_subject_data(user_id, policy_id, data_id=element_id,
+ category_id=category_id)
elif element_type == "object_data":
- data_db = manager.get_object_data(user_id, policy_id, data_id=element_id, category_id=category_id)
+ data_db = manager.get_object_data(user_id, policy_id, data_id=element_id,
+ category_id=category_id)
elif element_type == "action_data":
- data_db = manager.get_action_data(user_id, policy_id, data_id=element_id, category_id=category_id)
+ data_db = manager.get_action_data(user_id, policy_id, data_id=element_id,
+ category_id=category_id)
elif element_type == "meta_rule":
data_db = manager.get_meta_rules(user_id, meta_rule_id=meta_rule_id)
else:
@@ -101,15 +101,16 @@ class JsonUtils:
if element_type == "subject_data" or element_type == "object_data" or element_type == "action_data":
if data_db is not None and isinstance(data_db, list):
# TODO remove comments after fixing the bug on moondb when adding metarule : we can have several identical entries !
- #if len(data_db) > 1:
+ # if len(data_db) > 1:
# raise Exception("Several {} with the same id : {}".format(element_type, data_db))
data_db = data_db[0]
- if data_db is not None and data_db["data"] is not None and isinstance(data_db["data"], dict):
+ if data_db is not None and data_db["data"] is not None and isinstance(data_db["data"],
+ dict):
# TODO remove comments after fixing the bug on moondb when adding metarule : we can have several identical entries !
- #if len(data_db["data"].values()) != 1:
+ # if len(data_db["data"].values()) != 1:
# raise Exception("Several {} with the same id : {}".format(element_type, data_db))
- #data_db = data_db["data"]
+ # data_db = data_db["data"]
# TODO remove these two lines after fixing the bug on moondb when adding metarule : we can have several identical entries !
list_values = list(data_db["data"].values())
data_db = list_values[0]
@@ -117,7 +118,8 @@ class JsonUtils:
return data_db
@staticmethod
- def _get_element_id_in_db_from_name(element_type, element_name, user_id, policy_id, category_id, meta_rule_id, manager):
+ def _get_element_id_in_db_from_name(element_type, element_name, user_id, policy_id, category_id,
+ meta_rule_id, manager):
if element_type == "model":
data_db = manager.get_models(user_id)
elif element_type == "policy":
@@ -156,7 +158,8 @@ class JsonUtils:
return key_id
else:
for elt in data_db:
- if isinstance(elt, dict) and "data" in elt: # we handle here subject_data, object_data and action_data...
+ if isinstance(elt,
+ dict) and "data" in elt: # we handle here subject_data, object_data and action_data...
for data_key in elt["data"]:
# logger.info("data from the db {} ".format(elt["data"][data_key]))
data = elt["data"][data_key]
@@ -167,20 +170,31 @@ class JsonUtils:
return None
@staticmethod
- def convert_name_to_id(json_in, json_out, field_name_in, field_name_out, element_type, manager, user_id, policy_id=None, category_id=None, meta_rule_id=None, field_mandatory=True):
+ def convert_name_to_id(json_in, json_out, field_name_in, field_name_out, element_type, manager,
+ user_id, policy_id=None, category_id=None, meta_rule_id=None,
+ field_mandatory=True):
if field_name_in not in json_in:
raise UnknownField("The field {} is not in the input json".format(field_name_in))
if "id" in json_in[field_name_in]:
- data_db = JsonUtils._get_element_in_db_from_id(element_type, json_in[field_name_in]["id"], user_id, policy_id, category_id, meta_rule_id, manager)
+ data_db = JsonUtils._get_element_in_db_from_id(element_type,
+ json_in[field_name_in]["id"], user_id,
+ policy_id, category_id, meta_rule_id,
+ manager)
if data_db is None:
- raise UnknownId("No {} with id {} found in database".format(element_type, json_in[field_name_in]["id"]))
+ raise UnknownId("No {} with id {} found in database".format(element_type,
+ json_in[field_name_in]["id"]))
json_out[field_name_out] = json_in[field_name_in]["id"]
elif "name" in json_in[field_name_in]:
- id_in_db = JsonUtils._get_element_id_in_db_from_name(element_type, json_in[field_name_in]["name"], user_id, policy_id, category_id, meta_rule_id, manager)
+ id_in_db = JsonUtils._get_element_id_in_db_from_name(element_type,
+ json_in[field_name_in]["name"],
+ user_id, policy_id, category_id,
+ meta_rule_id, manager)
if id_in_db is None:
- raise UnknownName("No {} with name {} found in database".format(element_type,json_in[field_name_in]["name"]))
+ raise UnknownName(
+ "No {} with name {} found in database".format(element_type,
+ json_in[field_name_in]["name"]))
json_out[field_name_out] = id_in_db
elif field_mandatory is True:
raise MissingIdOrName("No id or name found in the input json {}".format(json_in))
@@ -188,7 +202,9 @@ class JsonUtils:
@staticmethod
def convert_id_to_name(id_, json_out, field_name_out, element_type, manager, user_id,
policy_id=None, category_id=None, meta_rule_id=None):
- json_out[field_name_out] = {"name": JsonUtils.convert_id_to_name_string(id_, element_type, manager, user_id, policy_id, category_id, meta_rule_id)}
+ json_out[field_name_out] = {
+ "name": JsonUtils.convert_id_to_name_string(id_, element_type, manager, user_id,
+ policy_id, category_id, meta_rule_id)}
@staticmethod
def __convert_results_to_element(element):
@@ -203,9 +219,10 @@ class JsonUtils:
@staticmethod
def convert_id_to_name_string(id_, element_type, manager, user_id,
- policy_id=None, category_id=None, meta_rule_id=None):
+ policy_id=None, category_id=None, meta_rule_id=None):
- element = JsonUtils._get_element_in_db_from_id(element_type, id_, user_id, policy_id, category_id, meta_rule_id, manager)
+ element = JsonUtils._get_element_in_db_from_id(element_type, id_, user_id, policy_id,
+ category_id, meta_rule_id, manager)
# logger.info(element)
if element is None:
raise UnknownId("No {} with id {} found in database".format(element_type, id_))
@@ -218,31 +235,42 @@ class JsonUtils:
return None
@staticmethod
- def convert_names_to_ids(json_in, json_out, field_name_in, field_name_out, element_type, manager, user_id, policy_id=None, category_id=None, meta_rule_id=None, field_mandatory=True):
+ def convert_names_to_ids(json_in, json_out, field_name_in, field_name_out, element_type,
+ manager, user_id, policy_id=None, category_id=None, meta_rule_id=None,
+ field_mandatory=True):
ids = []
if field_name_in not in json_in:
raise UnknownField("The field {} is not in the input json".format(field_name_in))
for elt in json_in[field_name_in]:
if "id" in elt:
- data_db = JsonUtils._get_element_in_db_from_id(element_type, elt["id"], user_id, policy_id, category_id, meta_rule_id, manager)
+ data_db = JsonUtils._get_element_in_db_from_id(element_type, elt["id"], user_id,
+ policy_id, category_id,
+ meta_rule_id, manager)
if data_db is None:
- raise UnknownId("No {} with id {} found in database".format(element_type, elt["id"]))
+ raise UnknownId(
+ "No {} with id {} found in database".format(element_type, elt["id"]))
ids.append(elt["id"])
elif "name" in elt:
- id_in_db = JsonUtils._get_element_id_in_db_from_name(element_type, elt["name"], user_id, policy_id, category_id, meta_rule_id, manager)
+ id_in_db = JsonUtils._get_element_id_in_db_from_name(element_type, elt["name"],
+ user_id, policy_id,
+ category_id, meta_rule_id,
+ manager)
if id_in_db is None:
- raise UnknownName("No {} with name {} found in database".format(element_type, elt["name"]))
+ raise UnknownName(
+ "No {} with name {} found in database".format(element_type, elt["name"]))
ids.append(id_in_db)
elif field_mandatory is True:
raise MissingIdOrName("No id or name found in the input json {}".format(elt))
json_out[field_name_out] = ids
@staticmethod
- def convert_ids_to_names(ids, json_out, field_name_out, element_type, manager, user_id, policy_id=None, category_id=None, meta_rule_id=None):
+ def convert_ids_to_names(ids, json_out, field_name_out, element_type, manager, user_id,
+ policy_id=None, category_id=None, meta_rule_id=None):
res_array = []
for id_ in ids:
- element = JsonUtils._get_element_in_db_from_id(element_type, id_, user_id, policy_id, category_id, meta_rule_id, manager)
+ element = JsonUtils._get_element_in_db_from_id(element_type, id_, user_id, policy_id,
+ category_id, meta_rule_id, manager)
if element is None:
raise UnknownId("No {} with id {} found in database".format(element_type, id_))
res = JsonUtils.__convert_results_to_element(element)
@@ -252,4 +280,3 @@ class JsonUtils:
if "value" in res and "name" in res["value"]:
res_array.append({"name": res["value"]["name"]})
json_out[field_name_out] = res_array
-
diff --git a/old/moon_manager/moon_manager/api/meta_data.py b/old/moon_manager/moon_manager/api/meta_data.py
new file mode 100644
index 00000000..b0b86d10
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/meta_data.py
@@ -0,0 +1,246 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Meta Data are elements used to create Meta data (skeleton of security policies)
+
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import ModelManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class SubjectCategories(Resource):
+ """
+ Endpoint for subject categories requests
+ """
+
+ __urls__ = (
+ "/subject_categories",
+ "/subject_categories/",
+ "/subject_categories/<string:category_id>",
+ )
+
+ @validate_input("get", kwargs_state=[False, False])
+ @check_auth
+ def get(self, category_id=None, user_id=None):
+ """Retrieve all subject categories or a specific one
+
+ :param category_id: uuid of the subject category
+ :param user_id: user ID who do the request
+ :return: {
+ "subject_category_id": {
+ "name": "name of the category",
+ "description": "description of the category (optional)"
+ }
+ }
+ :internal_api: get_subject_categories
+ """
+ data = ModelManager.get_subject_categories(
+ user_id=user_id, category_id=category_id)
+
+ return {"subject_categories": data}
+
+ @validate_input("post", body_state={"name": True})
+ @check_auth
+ def post(self, category_id=None, user_id=None):
+ """Create or update a subject category.
+
+ :param category_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the category (mandatory)",
+ "description": "description of the category (optional)"
+ }
+ :return: {
+ "subject_category_id": {
+ "name": "name of the category",
+ "description": "description of the category (optional)"
+ }
+ }
+ :internal_api: add_subject_category
+ """
+ data = ModelManager.add_subject_category(
+ user_id=user_id, value=request.json)
+
+ return {"subject_categories": data}
+
+ @validate_input("delete", kwargs_state=[True, False])
+ @check_auth
+ def delete(self, category_id=None, user_id=None):
+ """Delete a subject category
+
+ :param category_id: uuid of the subject category to delete
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_subject_category
+ """
+
+ data = ModelManager.delete_subject_category(
+ user_id=user_id, category_id=category_id)
+
+ return {"result": True}
+
+
+class ObjectCategories(Resource):
+ """
+ Endpoint for object categories requests
+ """
+
+ __urls__ = (
+ "/object_categories",
+ "/object_categories/",
+ "/object_categories/<string:category_id>",
+ )
+
+ @validate_input("get", kwargs_state=[False, False])
+ @check_auth
+ def get(self, category_id=None, user_id=None):
+ """Retrieve all object categories or a specific one
+
+ :param category_id: uuid of the object category
+ :param user_id: user ID who do the request
+ :return: {
+ "object_category_id": {
+ "name": "name of the category",
+ "description": "description of the category (optional)"
+ }
+ }
+ :internal_api: get_object_categories
+ """
+ data = ModelManager.get_object_categories(
+ user_id=user_id, category_id=category_id)
+
+ return {"object_categories": data}
+
+ @validate_input("post", body_state={"name": True})
+ @check_auth
+ def post(self, category_id=None, user_id=None):
+ """Create or update a object category.
+
+ :param category_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the category (mandatory)",
+ "description": "description of the category (optional)"
+ }
+ :return: {
+ "object_category_id": {
+ "name": "name of the category",
+ "description": "description of the category (optional)"
+ }
+ }
+ :internal_api: add_object_category
+ """
+
+ data = ModelManager.add_object_category(
+ user_id=user_id, value=request.json)
+
+ return {"object_categories": data}
+
+ @validate_input("delete", kwargs_state=[True, False])
+ @check_auth
+ def delete(self, category_id=None, user_id=None):
+ """Delete an object category
+
+ :param category_id: uuid of the object category to delete
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_object_category
+ """
+
+ data = ModelManager.delete_object_category(
+ user_id=user_id, category_id=category_id)
+
+ return {"result": True}
+
+
+class ActionCategories(Resource):
+ """
+ Endpoint for action categories requests
+ """
+
+ __urls__ = (
+ "/action_categories",
+ "/action_categories/",
+ "/action_categories/<string:category_id>",
+ )
+
+ @validate_input("get", kwargs_state=[False, False])
+ @check_auth
+ def get(self, category_id=None, user_id=None):
+ """Retrieve all action categories or a specific one
+
+ :param category_id: uuid of the action category
+ :param user_id: user ID who do the request
+ :return: {
+ "action_category_id": {
+ "name": "name of the category",
+ "description": "description of the category (optional)"
+ }
+ }
+ :internal_api: get_action_categories
+ """
+
+ data = ModelManager.get_action_categories(
+ user_id=user_id, category_id=category_id)
+
+ return {"action_categories": data}
+
+ @validate_input("post", body_state={"name": True})
+ @check_auth
+ def post(self, category_id=None, user_id=None):
+ """Create or update an action category.
+
+ :param category_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the category (mandatory)",
+ "description": "description of the category (optional)"
+ }
+ :return: {
+ "action_category_id": {
+ "name": "name of the category",
+ "description": "description of the category (optional)"
+ }
+ }
+ :internal_api: add_action_category
+ """
+
+ data = ModelManager.add_action_category(
+ user_id=user_id, value=request.json)
+
+ return {"action_categories": data}
+
+ @validate_input("delete", kwargs_state=[True, False])
+ @check_auth
+ def delete(self, category_id=None, user_id=None):
+ """Delete an action
+
+ :param category_id: uuid of the action category to delete
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_action_category
+ """
+ data = ModelManager.delete_action_category(
+ user_id=user_id, category_id=category_id)
+
+ return {"result": True}
diff --git a/old/moon_manager/moon_manager/api/meta_rules.py b/old/moon_manager/moon_manager/api/meta_rules.py
new file mode 100644
index 00000000..738aad71
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/meta_rules.py
@@ -0,0 +1,152 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Meta rules are skeleton for security policies
+
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import ModelManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class MetaRules(Resource):
+ """
+ Endpoint for meta rules requests
+ """
+
+ __urls__ = (
+ "/meta_rules",
+ "/meta_rules/",
+ "/meta_rules/<string:meta_rule_id>",
+ "/meta_rules/<string:meta_rule_id>/"
+ )
+
+ @validate_input("get", kwargs_state=[False, False])
+ @check_auth
+ def get(self, meta_rule_id=None, user_id=None):
+ """Retrieve all sub meta rules
+
+ :param meta_rule_id: Meta rule algorithm ID
+ :param user_id: user ID who do the request
+ :return: {
+ "meta_rules": {
+ "meta_rule_id1": {
+ "name": "name of the meta rule",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ },
+ }
+ }
+ :internal_api: get_meta_rules
+ """
+
+ data = ModelManager.get_meta_rules(
+ user_id=user_id, meta_rule_id=meta_rule_id)
+
+ return {"meta_rules": data}
+
+ @validate_input("post", body_state={"name": True, "subject_categories": False,
+ "object_categories": False, "action_categories": False})
+ @check_auth
+ def post(self, meta_rule_id=None, user_id=None):
+ """Add a meta rule
+
+ :param meta_rule_id: Meta rule ID (not used here)
+ :param user_id: user ID who do the request
+ :request body: post = {
+ "name": "name of the meta rule (mandatory)",
+ "subject_categories": ["subject_category_id1 (mandatory)",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1 (mandatory)"],
+ "action_categories": ["action_category_id1 (mandatory)"]
+ }
+ :return: {
+ "meta_rules": {
+ "meta_rule_id1": {
+ "name": "name of the meta rule",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ },
+ }
+ }
+ :internal_api: add_meta_rules
+ """
+
+ data = ModelManager.add_meta_rule(
+ user_id=user_id, meta_rule_id=None, value=request.json)
+
+ return {"meta_rules": data}
+
+ @validate_input("patch", kwargs_state=[True, False],
+ body_state={"name": True, "subject_categories": False,
+ "object_categories": False, "action_categories": False})
+ @check_auth
+ def patch(self, meta_rule_id=None, user_id=None):
+ """Update a meta rule
+
+ :param meta_rule_id: Meta rule ID
+ :param user_id: user ID who do the request
+ :request body: patch = {
+ "name": "name of the meta rule",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ }
+ :return: {
+ "meta_rules": {
+ "meta_rule_id1": {
+ "name": "name of the meta rule",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ },
+ }
+ }
+ :internal_api: set_meta_rules
+ """
+ data = ModelManager.update_meta_rule(
+ user_id=user_id, meta_rule_id=meta_rule_id, value=request.json)
+
+ return {"meta_rules": data}
+
+ @validate_input("delete", kwargs_state=[True, False])
+ @check_auth
+ def delete(self, meta_rule_id=None, user_id=None):
+ """Delete a meta rule
+
+ :param meta_rule_id: Meta rule ID
+ :param user_id: user ID who do the request
+ :return: {
+ "meta_rules": {
+ "meta_rule_id1": {
+ "name": "name of the meta rule",
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ },
+ }
+ }
+ :internal_api: delete_meta_rules
+ """
+
+ data = ModelManager.delete_meta_rule(
+ user_id=user_id, meta_rule_id=meta_rule_id)
+
+ return {"result": True}
diff --git a/old/moon_manager/moon_manager/api/models.py b/old/moon_manager/moon_manager/api/models.py
new file mode 100644
index 00000000..c72396cf
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/models.py
@@ -0,0 +1,117 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Models aggregate multiple meta rules
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import ModelManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class Models(Resource):
+ """
+ Endpoint for model requests
+ """
+
+ __urls__ = (
+ "/models",
+ "/models/",
+ "/models/<string:uuid>",
+ "/models/<string:uuid>/",
+ )
+
+ @validate_input("get", kwargs_state=[False, False])
+ @check_auth
+ def get(self, uuid=None, user_id=None):
+ """Retrieve all models
+
+ :param uuid: uuid of the model
+ :param user_id: user ID who do the request
+ :return: {
+ "model_id1": {
+ "name": "...",
+ "description": "... (optional)",
+ "meta_rules": ["meta_rule_id1", ]
+ }
+ }
+ :internal_api: get_models
+ """
+ data = ModelManager.get_models(user_id=user_id, model_id=uuid)
+
+ return {"models": data}
+
+ @validate_input("post", body_state={"name": True, "meta_rules": False})
+ @check_auth
+ def post(self, uuid=None, user_id=None):
+ """Create model.
+
+ :param uuid: uuid of the model (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the model (mandatory)",
+ "description": "description of the model (optional)",
+ "meta_rules": ["meta_rule_id1", ]
+ }
+ :return: {
+ "model_id1": {
+ "name": "name of the model",
+ "description": "description of the model (optional)",
+ "meta_rules": ["meta_rule_id1", ]
+ }
+ }
+ :internal_api: add_model
+ """
+ data = ModelManager.add_model(
+ user_id=user_id, model_id=uuid, value=request.json)
+
+ return {"models": data}
+
+ @validate_input("delete", kwargs_state=[True, False])
+ @check_auth
+ def delete(self, uuid=None, user_id=None):
+ """Delete a model
+
+ :param uuid: uuid of the model to delete
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_model
+ """
+
+ data = ModelManager.delete_model(user_id=user_id, model_id=uuid)
+
+ return {"result": True}
+
+ @validate_input("patch", kwargs_state=[True, False],
+ body_state={"name": True, "meta_rules": False})
+ @check_auth
+ def patch(self, uuid=None, user_id=None):
+ """Update a model
+
+ :param uuid: uuid of the model to update
+ :param user_id: user ID who do the request
+ :return: {
+ "model_id1": {
+ "name": "name of the model",
+ "description": "... (optional)",
+ "meta_rules": ["meta_rule_id1", ]
+ }
+ }
+ :internal_api: update_model
+ """
+ data = ModelManager.update_model(
+ user_id=user_id, model_id=uuid, value=request.json)
+
+ return {"models": data}
diff --git a/old/moon_manager/moon_manager/api/pdp.py b/old/moon_manager/moon_manager/api/pdp.py
new file mode 100644
index 00000000..65a6a5f1
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/pdp.py
@@ -0,0 +1,214 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+PDP are Policy Decision Point.
+
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+import requests
+import time
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import PDPManager
+from python_moondb.core import PolicyManager
+from python_moondb.core import ModelManager
+from python_moonutilities import configuration, exceptions
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+def delete_pod(uuid):
+ conf = configuration.get_configuration("components/orchestrator")
+ hostname = conf["components/orchestrator"].get("hostname", "orchestrator")
+ port = conf["components/orchestrator"].get("port", 80)
+ proto = conf["components/orchestrator"].get("protocol", "http")
+ # while True:
+ # try:
+ url = "{}://{}:{}/pods".format(proto, hostname, port)
+ req = requests.get(url)
+ # except requests.exceptions.ConnectionError:
+ # logger.warning("Orchestrator is not ready, standby... {}".format(url))
+ # time.sleep(1)
+ # else:
+ # break
+ for pod_key, pod_list in req.json().get("pods", {}).items():
+ for pod_value in pod_list:
+ if "pdp_id" in pod_value:
+ if pod_value["pdp_id"] == uuid:
+ req = requests.delete(
+ "{}://{}:{}/pods/{}".format(proto, hostname, port, pod_key))
+ if req.status_code != 200:
+ logger.warning(
+ "Cannot delete pod {} - {}".format(pod_key, pod_value['name']))
+ logger.debug(req.content)
+ # Note (Asteroide): no need to go further if one match
+ break
+
+
+def add_pod(uuid, data):
+ if not data.get("keystone_project_id"):
+ return
+ logger.info("Add a new pod {}".format(data))
+ if "pdp_id" not in data:
+ data["pdp_id"] = uuid
+ data['policies'] = PolicyManager.get_policies(user_id="admin")
+ data['models'] = ModelManager.get_models(user_id="admin")
+ conf = configuration.get_configuration("components/orchestrator")
+ hostname = conf["components/orchestrator"].get("hostname", "orchestrator")
+ port = conf["components/orchestrator"].get("port", 80)
+ proto = conf["components/orchestrator"].get("protocol", "http")
+ while True:
+ try:
+ req = requests.post(
+ "{}://{}:{}/pods".format(proto, hostname, port),
+ json=data,
+ headers={"content-type": "application/json"})
+ except requests.exceptions.ConnectionError as e:
+ logger.warning("add_pod: Orchestrator is not ready, standby...")
+ logger.exception(e)
+ time.sleep(1)
+ else:
+ break
+ logger.info("Pod add request answer : {}".format(req.text))
+
+
+def check_keystone_pid(k_pid):
+ data = PDPManager.get_pdp(user_id="admin")
+ for pdp_key, pdp_value in data.items():
+ logger.info("pdp={}".format(pdp_value))
+ if pdp_value["keystone_project_id"] == k_pid:
+ return True
+
+
+class PDP(Resource):
+ """
+ Endpoint for pdp requests
+ """
+
+ __urls__ = (
+ "/pdp",
+ "/pdp/",
+ "/pdp/<string:uuid>",
+ "/pdp/<string:uuid>/",
+ )
+
+ @validate_input("get", kwargs_state=[False, False])
+ @check_auth
+ def get(self, uuid=None, user_id=None):
+ """Retrieve all pdp
+
+ :param uuid: uuid of the pdp
+ :param user_id: user ID who do the request
+ :return: {
+ "pdp_id1": {
+ "name": "...",
+ "security_pipeline": [...],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "... (optional)",
+ }
+ }
+ :internal_api: get_pdp
+ """
+
+ data = PDPManager.get_pdp(user_id=user_id, pdp_id=uuid)
+
+ return {"pdps": data}
+
+ @validate_input("post", body_state={"name": True, "security_pipeline": True,
+ "keystone_project_id": True})
+ @check_auth
+ def post(self, uuid=None, user_id=None):
+ """Create pdp.
+
+ :param uuid: uuid of the pdp (not used here)
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the PDP (mandatory)",
+ "security_pipeline": ["may be empty"],
+ "keystone_project_id": "keystone_project_id1 (may be empty)",
+ "description": "description of the PDP (optional)",
+ }
+ :return: {
+ "pdp_id1": {
+ "name": "...",
+ "security_pipeline": [...],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "... (optional)",
+ }
+ }
+ :internal_api: add_pdp
+ """
+
+ data = dict(request.json)
+ if not data.get("keystone_project_id"):
+ data["keystone_project_id"] = None
+ else:
+ if check_keystone_pid(data.get("keystone_project_id")):
+ raise exceptions.PdpKeystoneMappingConflict
+ data = PDPManager.add_pdp(
+ user_id=user_id, pdp_id=None, value=request.json)
+ uuid = list(data.keys())[0]
+ logger.debug("data={}".format(data))
+ logger.debug("uuid={}".format(uuid))
+ add_pod(uuid=uuid, data=data[uuid])
+
+ return {"pdps": data}
+
+ @validate_input("delete", kwargs_state=[True, False])
+ @check_auth
+ def delete(self, uuid, user_id=None):
+ """Delete a pdp
+
+ :param uuid: uuid of the pdp to delete
+ :param user_id: user ID who do the request
+ :return: {
+ "result": "True or False",
+ "message": "optional message (optional)"
+ }
+ :internal_api: delete_pdp
+ """
+ data = PDPManager.delete_pdp(user_id=user_id, pdp_id=uuid)
+ delete_pod(uuid)
+
+ return {"result": True}
+
+ @validate_input("patch", kwargs_state=[True, False],
+ body_state={"name": True, "security_pipeline": True,
+ "keystone_project_id": True})
+ @check_auth
+ def patch(self, uuid, user_id=None):
+ """Update a pdp
+
+ :param uuid: uuid of the pdp to update
+ :param user_id: user ID who do the request
+ :return: {
+ "pdp_id1": {
+ "name": "name of the PDP",
+ "security_pipeline": ["may be empty"],
+ "keystone_project_id": "keystone_project_id1 (may be empty)",
+ "description": "description of the PDP (optional)",
+ }
+ }
+ :internal_api: update_pdp
+ """
+
+ _data = dict(request.json)
+ if not _data.get("keystone_project_id"):
+ _data["keystone_project_id"] = None
+ else:
+ if check_keystone_pid(_data.get("keystone_project_id")):
+ raise exceptions.PdpKeystoneMappingConflict
+ data = PDPManager.update_pdp(
+ user_id=user_id, pdp_id=uuid, value=_data)
+ logger.debug("data={}".format(data))
+ logger.debug("uuid={}".format(uuid))
+ add_pod(uuid=uuid, data=data[uuid])
+
+ return {"pdps": data}
diff --git a/old/moon_manager/moon_manager/api/perimeter.py b/old/moon_manager/moon_manager/api/perimeter.py
new file mode 100644
index 00000000..a0fda4ad
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/perimeter.py
@@ -0,0 +1,375 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+* Subjects are the source of an action on an object
+ (examples : users, virtual machines)
+* Objects are the destination of an action
+ (examples virtual machines, virtual Routers)
+* Actions are what subject wants to do on an object
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import PolicyManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class Subjects(Resource):
+ """
+ Endpoint for subjects requests
+ """
+
+ __urls__ = (
+ "/subjects",
+ "/subjects/",
+ "/subjects/<string:perimeter_id>",
+ "/policies/<string:uuid>/subjects",
+ "/policies/<string:uuid>/subjects/",
+ "/policies/<string:uuid>/subjects/<string:perimeter_id>",
+ )
+
+ @validate_input("get", kwargs_state=[False, False, False])
+ @check_auth
+ def get(self, uuid=None, perimeter_id=None, user_id=None):
+ """Retrieve all subjects or a specific one if perimeter_id is
+ given for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the subject
+ :param user_id: user ID who do the request
+ :return: {
+ "subject_id": {
+ "name": "name of the subject",
+ "keystone_id": "keystone id of the subject",
+ "description": "a description (optional)"
+ }
+ }
+ :internal_api: get_subjects
+ """
+
+ data = PolicyManager.get_subjects(
+ user_id=user_id,
+ policy_id=uuid,
+ perimeter_id=perimeter_id
+ )
+
+ return {"subjects": data}
+
+ @validate_input("post", body_state={"name": True})
+ @check_auth
+ def post(self, uuid=None, perimeter_id=None, user_id=None):
+ """Create or update a subject.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the subject (mandatory)",
+ "description": "description of the subject (optional)",
+ "password": "password for the subject (optional)",
+ "email": "email address of the subject (optional)"
+ }
+ :return: {
+ "subject_id": {
+ "name": "name of the subject",
+ "keystone_id": "keystone id of the subject",
+ "description": "description of the subject (optional)",
+ "password": "password for the subject (optional)",
+ "email": "email address of the subject (optional)"
+ }
+ }
+ :internal_api: set_subject
+ """
+
+ data = PolicyManager.add_subject(
+ user_id=user_id, policy_id=uuid,
+ perimeter_id=perimeter_id, value=request.json)
+
+ return {"subjects": data}
+
+ @validate_input("patch", kwargs_state=[False, True, False])
+ @check_auth
+ def patch(self, uuid=None, perimeter_id=None, user_id=None):
+ """Create or update a subject.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the subject",
+ "description": "description of the subject (optional)",
+ "password": "password for the subject (optional)",
+ "email": "email address of the subject (optional)"
+ }
+ :return: {
+ "subject_id": {
+ "name": "name of the subject",
+ "keystone_id": "keystone id of the subject",
+ "description": "description of the subject (optional)",
+ "password": "password for the subject (optional)",
+ "email": "email address of the subject (optional)"
+ }
+ }
+ :internal_api: set_subject
+ """
+ data = PolicyManager.update_subject(user_id=user_id, perimeter_id=perimeter_id,
+ value=request.json)
+ return {"subjects": data}
+
+ @validate_input("delete", kwargs_state=[False, True, False])
+ @check_auth
+ def delete(self, uuid=None, perimeter_id=None, user_id=None):
+ """Delete a subject for a given policy
+
+ :param uuid: uuid of the policy (mandatory if perimeter_id is not set)
+ :param perimeter_id: uuid of the subject (mandatory if uuid is not set)
+ :param user_id: user ID who do the request
+ :return: {
+ "subject_id": {
+ "name": "name of the subject",
+ "keystone_id": "keystone id of the subject",
+ "description": "description of the subject (optional)",
+ "password": "password for the subject (optional)",
+ "email": "email address of the subject (optional)"
+ }
+ }
+ :internal_api: delete_subject
+ """
+
+ data = PolicyManager.delete_subject(
+ user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
+
+ return {"result": True}
+
+
+class Objects(Resource):
+ """
+ Endpoint for objects requests
+ """
+
+ __urls__ = (
+ "/objects",
+ "/objects/",
+ "/objects/<string:perimeter_id>",
+ "/policies/<string:uuid>/objects",
+ "/policies/<string:uuid>/objects/",
+ "/policies/<string:uuid>/objects/<string:perimeter_id>",
+ )
+
+ @validate_input("get", kwargs_state=[False, False, False])
+ @check_auth
+ def get(self, uuid=None, perimeter_id=None, user_id=None):
+ """Retrieve all objects or a specific one if perimeter_id is
+ given for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the object
+ :param user_id: user ID who do the request
+ :return: {
+ "object_id": {
+ "name": "name of the object",
+ "description": "description of the object (optional)"
+ }
+ }
+ :internal_api: get_objects
+ """
+
+ data = PolicyManager.get_objects(
+ user_id=user_id,
+ policy_id=uuid,
+ perimeter_id=perimeter_id
+ )
+
+ return {"objects": data}
+
+ @validate_input("post", body_state={"name": True})
+ @check_auth
+ def post(self, uuid=None, perimeter_id=None, user_id=None):
+ """Create or update a object.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "object_name": "name of the object (mandatory)",
+ "object_description": "description of the object (optional)"
+ }
+ :return: {
+ "object_id": {
+ "name": "name of the object",
+ "description": "description of the object (optional)"
+ }
+ }
+ :internal_api: set_object
+ """
+ data = PolicyManager.add_object(
+ user_id=user_id, policy_id=uuid,
+ perimeter_id=perimeter_id, value=request.json)
+
+ return {"objects": data}
+
+ @validate_input("patch", kwargs_state=[False, True, False])
+ @check_auth
+ def patch(self, uuid=None, perimeter_id=None, user_id=None):
+ """Create or update a object.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "object_name": "name of the object",
+ "object_description": "description of the object (optional)"
+ }
+ :return: {
+ "object_id": {
+ "name": "name of the object",
+ "description": "description of the object (optional)"
+ }
+ }
+ :internal_api: set_object
+ """
+ data = PolicyManager.update_object(user_id=user_id, perimeter_id=perimeter_id,
+ value=request.json)
+
+ return {"objects": data}
+
+ @validate_input("delete", kwargs_state=[False, True, False])
+ @check_auth
+ def delete(self, uuid=None, perimeter_id=None, user_id=None):
+ """Delete a object for a given policy
+
+ :param uuid: uuid of the policy (mandatory if perimeter_id is not set)
+ :param perimeter_id: uuid of the object (mandatory if uuid is not set)
+ :param user_id: user ID who do the request
+ :return: {
+ "object_id": {
+ "name": "name of the object",
+ "description": "description of the object (optional)"
+ }
+ }
+ :internal_api: delete_object
+ """
+
+ data = PolicyManager.delete_object(
+ user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
+
+ return {"result": True}
+
+
+class Actions(Resource):
+ """
+ Endpoint for actions requests
+ """
+
+ __urls__ = (
+ "/actions",
+ "/actions/",
+ "/actions/<string:perimeter_id>",
+ "/policies/<string:uuid>/actions",
+ "/policies/<string:uuid>/actions/",
+ "/policies/<string:uuid>/actions/<string:perimeter_id>",
+ )
+
+ @validate_input("get", kwargs_state=[False, False, False])
+ @check_auth
+ def get(self, uuid=None, perimeter_id=None, user_id=None):
+ """Retrieve all actions or a specific one if perimeter_id
+ is given for a given policy
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: uuid of the action
+ :param user_id: user ID who do the request
+ :return: {
+ "action_id": {
+ "name": "name of the action",
+ "description": "description of the action (optional)"
+ }
+ }
+ :internal_api: get_actions
+ """
+
+ data = PolicyManager.get_actions(
+ user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
+
+ return {"actions": data}
+
+ @validate_input("post", body_state={"name": True})
+ @check_auth
+ def post(self, uuid=None, perimeter_id=None, user_id=None):
+ """Create or update a action.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the action (mandatory)",
+ "description": "description of the action (optional)"
+ }
+ :return: {
+ "action_id": {
+ "name": "name of the action",
+ "description": "description of the action (optional)"
+ }
+ }
+ :internal_api: set_action
+ """
+ data = PolicyManager.add_action(
+ user_id=user_id, policy_id=uuid,
+ perimeter_id=perimeter_id, value=request.json)
+
+ return {"actions": data}
+
+ @validate_input("patch", kwargs_state=[False, True, False])
+ @check_auth
+ def patch(self, uuid=None, perimeter_id=None, user_id=None):
+ """Create or update a action.
+
+ :param uuid: uuid of the policy
+ :param perimeter_id: must not be used here
+ :param user_id: user ID who do the request
+ :request body: {
+ "name": "name of the action",
+ "description": "description of the action (optional)"
+ }
+ :return: {
+ "action_id": {
+ "name": "name of the action",
+ "description": "description of the action (optional)"
+ }
+ }
+ :internal_api: set_action
+ """
+ data = PolicyManager.update_action(user_id=user_id, perimeter_id=perimeter_id,
+ value=request.json)
+
+ return {"actions": data}
+
+ @validate_input("delete", kwargs_state=[False, True, False])
+ @check_auth
+ def delete(self, uuid=None, perimeter_id=None, user_id=None):
+ """Delete a action for a given policy
+
+ :param uuid: uuid of the policy (mandatory if perimeter_id is not set)
+ :param perimeter_id: uuid of the action (mandatory if uuid is not set)
+ :param user_id: user ID who do the request
+ :return: {
+ "action_id": {
+ "name": "name of the action",
+ "description": "description of the action (optional)"
+ }
+ }
+ :internal_api: delete_action
+ """
+
+ data = PolicyManager.delete_action(
+ user_id=user_id, policy_id=uuid, perimeter_id=perimeter_id)
+
+ return {"result": True}
diff --git a/moon_manager/moon_manager/api/policies.py b/old/moon_manager/moon_manager/api/policies.py
index 3447beb1..3264e8e0 100644
--- a/moon_manager/moon_manager/api/policies.py
+++ b/old/moon_manager/moon_manager/api/policies.py
@@ -12,6 +12,7 @@ from flask_restful import Resource
import logging
from python_moonutilities.security_functions import check_auth
from python_moondb.core import PolicyManager
+from python_moonutilities.security_functions import validate_input
__version__ = "4.3.2"
@@ -30,6 +31,7 @@ class Policies(Resource):
"/policies/<string:uuid>/",
)
+ @validate_input("get", kwargs_state=[False, False])
@check_auth
def get(self, uuid=None, user_id=None):
"""Retrieve all policies
@@ -38,53 +40,49 @@ class Policies(Resource):
:param user_id: user ID who do the request
:return: {
"policy_id1": {
- "name": "...",
- "model_id": "...",
- "genre": "... (optional)",
- "description": "... (optional)",
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
}
}
:internal_api: get_policies
"""
- try:
- data = PolicyManager.get_policies(user_id=user_id, policy_id=uuid)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = PolicyManager.get_policies(user_id=user_id, policy_id=uuid)
+
return {"policies": data}
+ @validate_input("post", body_state={"name": True, "model_id": False})
@check_auth
def post(self, uuid=None, user_id=None):
"""Create policy.
- :param uuid: uuid of the policy (not used here)
+ :param uuid: uuid of the policy (not used here if a new policy is created)
:param user_id: user ID who do the request
:request body: {
- "name": "...",
- "model_id": "...",
- "genre": "... (optional)",
- "description": "... (optional)",
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
}
:return: {
"policy_id1": {
- "name": "...",
- "model_id": "...",
- "genre": "... (optional)",
- "description": "... (optional)",
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
}
}
:internal_api: add_policy
"""
- try:
- data = PolicyManager.add_policy(
- user_id=user_id, policy_id=uuid, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = PolicyManager.add_policy(
+ user_id=user_id, policy_id=uuid, value=request.json)
+
return {"policies": data}
+ @validate_input("delete", kwargs_state=[True, False])
@check_auth
def delete(self, uuid=None, user_id=None):
"""Delete a policy
@@ -97,14 +95,13 @@ class Policies(Resource):
}
:internal_api: delete_policy
"""
- try:
- data = PolicyManager.delete_policy(user_id=user_id, policy_id=uuid)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
+
+ data = PolicyManager.delete_policy(user_id=user_id, policy_id=uuid)
+
return {"result": True}
+ @validate_input("patch", kwargs_state=[True, False],
+ body_state={"name": True, "model_id": False})
@check_auth
def patch(self, uuid=None, user_id=None):
"""Update a policy
@@ -113,20 +110,16 @@ class Policies(Resource):
:param user_id: user ID who do the request
:return: {
"policy_id1": {
- "name": "...",
- "model_id": "...",
- "genre": "... (optional)",
- "description": "... (optional)",
+ "name": "name of the policy (mandatory)",
+ "model_id": "ID of the model linked to this policy",
+ "genre": "authz of admin (optional, default to authz)",
+ "description": "description of the policy (optional)",
}
}
:internal_api: update_policy
"""
- try:
- data = PolicyManager.update_policy(
- user_id=user_id, policy_id=uuid, value=request.json)
- except Exception as e:
- logger.error(e, exc_info=True)
- return {"result": False,
- "error": str(e)}, 500
- return {"policies": data}
+ data = PolicyManager.update_policy(
+ user_id=user_id, policy_id=uuid, value=request.json)
+
+ return {"policies": data}
diff --git a/old/moon_manager/moon_manager/api/rules.py b/old/moon_manager/moon_manager/api/rules.py
new file mode 100644
index 00000000..cbd39969
--- /dev/null
+++ b/old/moon_manager/moon_manager/api/rules.py
@@ -0,0 +1,135 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Rules (TODO)
+"""
+
+from flask import request
+from flask_restful import Resource
+import logging
+from python_moonutilities.security_functions import check_auth
+from python_moondb.core import PolicyManager
+from python_moonutilities.security_functions import validate_input
+
+__version__ = "4.3.2"
+
+logger = logging.getLogger("moon.manager.api." + __name__)
+
+
+class Rules(Resource):
+ """
+ Endpoint for rules requests
+ """
+
+ __urls__ = ("/policies/<string:uuid>/rules",
+ "/policies/<string:uuid>/rules/",
+ "/policies/<string:uuid>/rules/<string:rule_id>",
+ "/policies/<string:uuid>/rules/<string:rule_id>/",
+ )
+
+ @validate_input("get", kwargs_state=[False, False, False])
+ @check_auth
+ def get(self, uuid=None, rule_id=None, user_id=None):
+ """Retrieve all rules or a specific one
+
+ :param uuid: policy ID
+ :param rule_id: rule ID
+ :param user_id: user ID who do the request
+ :return: {
+ "rules": [
+ "policy_id": "policy_id1",
+ "meta_rule_id": "meta_rule_id1",
+ "rule_id1":
+ ["subject_data_id1", "subject_data_id2", "object_data_id1", "action_data_id1"],
+ "rule_id2":
+ ["subject_data_id3", "subject_data_id4", "object_data_id2", "action_data_id2"],
+ ]
+ }
+ :internal_api: get_rules
+ """
+
+ data = PolicyManager.get_rules(user_id=user_id,
+ policy_id=uuid,
+ rule_id=rule_id)
+
+ return {"rules": data}
+
+ @validate_input("post", kwargs_state=[True, False, False],
+ body_state={"meta_rule_id": True, "rule": True, "instructions": True})
+ @check_auth
+ def post(self, uuid=None, rule_id=None, user_id=None):
+ """Add a rule to a meta rule
+
+ :param uuid: policy ID
+ :param rule_id: rule ID (not used here)
+ :param user_id: user ID who do the request
+ :request body: post = {
+ "meta_rule_id": "meta_rule_id1", # mandatory
+ "rule": ["subject_data_id2", "object_data_id2", "action_data_id2"], # mandatory
+ "instructions": ( # mandatory
+ {"decision": "grant"},
+ )
+ "enabled": True
+ }
+ :return: {
+ "rules": [
+ "meta_rule_id": "meta_rule_id1",
+ "rule_id1": {
+ "rule": ["subject_data_id1",
+ "object_data_id1",
+ "action_data_id1"],
+ "instructions": (
+ {"decision": "grant"},
+ # "grant" to immediately exit,
+ # "continue" to wait for the result of next policy
+ # "deny" to deny the request
+ )
+ }
+ "rule_id2": {
+ "rule": ["subject_data_id2",
+ "object_data_id2",
+ "action_data_id2"],
+ "instructions": (
+ {
+ "update": {
+ "operation": "add",
+ # operations may be "add" or "delete"
+ "target": "rbac:role:admin"
+ # add the role admin to the current user
+ }
+ },
+ {"chain": {"name": "rbac"}}
+ # chain with the policy named rbac
+ )
+ }
+ ]
+ }
+ :internal_api: add_rule
+ """
+ args = request.json
+
+ data = PolicyManager.add_rule(user_id=user_id,
+ policy_id=uuid,
+ meta_rule_id=args['meta_rule_id'],
+ value=args)
+
+ return {"rules": data}
+
+ @validate_input("delete", kwargs_state=[True, True, False])
+ @check_auth
+ def delete(self, uuid=None, rule_id=None, user_id=None):
+ """Delete one rule linked to a specific sub meta rule
+
+ :param uuid: policy ID
+ :param rule_id: rule ID
+ :param user_id: user ID who do the request
+ :return: { "result": true }
+ :internal_api: delete_rule
+ """
+
+ data = PolicyManager.delete_rule(
+ user_id=user_id, policy_id=uuid, rule_id=rule_id)
+
+ return {"result": True}
diff --git a/moon_manager/moon_manager/api/slaves.py b/old/moon_manager/moon_manager/api/slaves.py
index f5b3fa14..e2928de0 100644
--- a/moon_manager/moon_manager/api/slaves.py
+++ b/old/moon_manager/moon_manager/api/slaves.py
@@ -11,12 +11,10 @@ from flask import request
from flask_restful import Resource
import logging
import requests
-import time
from python_moonutilities.security_functions import check_auth
-from python_moondb.core import PDPManager
-from python_moondb.core import PolicyManager
-from python_moondb.core import ModelManager
-from python_moonutilities import configuration, exceptions
+
+from python_moonutilities import configuration
+from python_moonutilities.security_functions import validate_input
__version__ = "4.3.0"
@@ -42,6 +40,7 @@ class Slaves(Resource):
self.orchestrator_port = conf["components/orchestrator"].get("port",
80)
+ @validate_input("get", kwargs_state=[False, False])
@check_auth
def get(self, uuid=None, user_id=None):
"""Retrieve all slaves
@@ -66,6 +65,8 @@ class Slaves(Resource):
))
return {"slaves": req.json().get("slaves", dict())}
+ @validate_input("patch", kwargs_state=[False, False],
+ body_state={"op": True, "variable": True, "value": True})
@check_auth
def patch(self, uuid=None, user_id=None):
"""Update a slave
@@ -82,11 +83,11 @@ class Slaves(Resource):
"""
logger.info("Will made a request for {}".format(uuid))
if request.json.get("op") == "replace" \
- and request.json.get("variable") == "configured" \
+ and request.json.get("variable") == "configured" \
and request.json.get("value"):
req = requests.post("http://{}:{}/pods".format(
self.orchestrator_hostname, self.orchestrator_port,
- ),
+ ),
json={"slave_name": uuid}
)
if req.status_code != 200:
@@ -95,7 +96,7 @@ class Slaves(Resource):
))
return "Orchestrator: " + str(req.reason), req.status_code
elif request.json.get("op") == "replace" \
- and request.json.get("variable") == "configured" \
+ and request.json.get("variable") == "configured" \
and not request.json.get("value"):
req = requests.delete("http://{}:{}/pods/{}".format(
self.orchestrator_hostname, self.orchestrator_port, uuid
diff --git a/moon_manager/moon_manager/http_server.py b/old/moon_manager/moon_manager/http_server.py
index a7258a75..53879529 100644
--- a/moon_manager/moon_manager/http_server.py
+++ b/old/moon_manager/moon_manager/http_server.py
@@ -26,7 +26,6 @@ from moon_manager.api.json_export import JsonExport
from python_moonutilities import configuration
from python_moondb.core import PDPManager
-
logger = logging.getLogger("moon.manager.http_server")
__API__ = (
@@ -36,7 +35,7 @@ __API__ = (
SubjectAssignments, ObjectAssignments, ActionAssignments,
SubjectData, ObjectData, ActionData,
Models, Policies, PDP, Slaves, JsonImport, JsonExport
- )
+)
class Server:
@@ -87,7 +86,7 @@ class Root(Resource):
"""
The root of the web service
"""
- __urls__ = ("/", )
+ __urls__ = ("/",)
__methods = ("get", "post", "put", "delete", "options")
def get(self):
@@ -112,11 +111,13 @@ class CustomApi(Api):
@staticmethod
def handle_error(e):
try:
- error_message = dumps({'message': str(e), "code": getattr(e, "code", 500)})
+ error_message = dumps(
+ {"result": False, 'message': str(e), "code": getattr(e, "code", 500)})
+ logger.error(e, exc_info=True)
logger.error(error_message)
return make_response(error_message, getattr(e, "code", 500))
except Exception as e2: # unhandled exception in the api...
- logger.error(str(e2))
+ logger.exception(str(e2))
return make_response(error_message, 500)
@@ -132,7 +133,7 @@ class HTTPServer(Server):
self.manager_port = conf["components/manager"].get("port", 80)
# TODO : specify only few urls instead of *
CORS(self.app)
- self.api = CustomApi(self.app)
+ self.api = CustomApi(self.app, catch_all_404s=True)
self.__set_route()
def __set_route(self):
diff --git a/old/moon_manager/moon_manager/server.py b/old/moon_manager/moon_manager/server.py
new file mode 100644
index 00000000..70ddaee0
--- /dev/null
+++ b/old/moon_manager/moon_manager/server.py
@@ -0,0 +1,39 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import logging
+from python_moonutilities import configuration, exceptions
+from moon_manager.http_server import HTTPServer
+
+logger = logging.getLogger("moon.manager.server")
+
+
+def create_server():
+ configuration.init_logging()
+ try:
+ conf = configuration.get_configuration("components/manager")
+ hostname = conf["components/manager"].get("hostname", "manager")
+ port = conf["components/manager"].get("port", 80)
+ bind = conf["components/manager"].get("bind", "127.0.0.1")
+ except exceptions.ConsulComponentNotFound:
+ hostname = "manager"
+ bind = "127.0.0.1"
+ port = 80
+ configuration.add_component(uuid="manager",
+ name=hostname,
+ port=port,
+ bind=bind)
+ logger.info("Starting server with IP {} on port {} bind to {}".format(
+ hostname, port, bind))
+ return HTTPServer(host=bind, port=port)
+
+
+def run():
+ server = create_server()
+ server.run()
+
+
+if __name__ == '__main__':
+ run()
diff --git a/old/moon_manager/requirements.txt b/old/moon_manager/requirements.txt
new file mode 100644
index 00000000..e2dd5c96
--- /dev/null
+++ b/old/moon_manager/requirements.txt
@@ -0,0 +1,5 @@
+flask
+flask_restful
+flask_cors
+python_moonutilities
+python_moondb
diff --git a/old/moon_manager/setup.py b/old/moon_manager/setup.py
new file mode 100644
index 00000000..35c944c3
--- /dev/null
+++ b/old/moon_manager/setup.py
@@ -0,0 +1,47 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from setuptools import setup, find_packages
+import moon_manager
+
+
+setup(
+
+ name='moon_manager',
+
+ version=moon_manager.__version__,
+
+ packages=find_packages(),
+
+ author="Thomas Duval",
+
+ author_email="thomas.duval@orange.com",
+
+ description="",
+
+ long_description=open('README.md').read(),
+
+ # install_requires= ,
+
+ include_package_data=True,
+
+ url='https://git.opnfv.org/cgit/moon',
+
+ classifiers=[
+ "Programming Language :: Python",
+ "Development Status :: 1 - Planning",
+ "License :: OSI Approved",
+ "Natural Language :: French",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python :: 3",
+ ],
+
+ entry_points={
+ 'console_scripts': [
+ 'moon_manager = moon_manager.server:create_server',
+ ],
+ }
+
+)
diff --git a/moon_manager/tests/functional_pod/conftest.py b/old/moon_manager/tests/functional_pod/conftest.py
index b5811755..b5811755 100644
--- a/moon_manager/tests/functional_pod/conftest.py
+++ b/old/moon_manager/tests/functional_pod/conftest.py
diff --git a/moon_manager/tests/functional_pod/json/mls.json b/old/moon_manager/tests/functional_pod/json/mls.json
index 01ef6deb..01ef6deb 100644
--- a/moon_manager/tests/functional_pod/json/mls.json
+++ b/old/moon_manager/tests/functional_pod/json/mls.json
diff --git a/moon_manager/tests/functional_pod/json/rbac.json b/old/moon_manager/tests/functional_pod/json/rbac.json
index a75f291b..a75f291b 100644
--- a/moon_manager/tests/functional_pod/json/rbac.json
+++ b/old/moon_manager/tests/functional_pod/json/rbac.json
diff --git a/moon_manager/tests/functional_pod/run_functional_tests.sh b/old/moon_manager/tests/functional_pod/run_functional_tests.sh
index 960e9480..960e9480 100644
--- a/moon_manager/tests/functional_pod/run_functional_tests.sh
+++ b/old/moon_manager/tests/functional_pod/run_functional_tests.sh
diff --git a/moon_manager/tests/functional_pod/test_manager.py b/old/moon_manager/tests/functional_pod/test_manager.py
index 454d861b..454d861b 100644
--- a/moon_manager/tests/functional_pod/test_manager.py
+++ b/old/moon_manager/tests/functional_pod/test_manager.py
diff --git a/moon_manager/tests/functional_pod/test_models.py b/old/moon_manager/tests/functional_pod/test_models.py
index 8b4ceef5..8b4ceef5 100644
--- a/moon_manager/tests/functional_pod/test_models.py
+++ b/old/moon_manager/tests/functional_pod/test_models.py
diff --git a/moon_manager/tests/unit_python/api/import_export_utilities.py b/old/moon_manager/tests/unit_python/api/import_export_utilities.py
index 98586d02..2ee2627d 100644
--- a/moon_manager/tests/unit_python/api/import_export_utilities.py
+++ b/old/moon_manager/tests/unit_python/api/import_export_utilities.py
@@ -3,14 +3,13 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-import api.utilities as utilities
-import api.test_models as test_models
+import api.test_unit_models as test_models
import api.test_policies as test_policies
import api.test_perimeter as test_perimeter
-import api.meta_data_test as test_categories
+import api.test_meta_data as test_categories
import api.test_data as test_data
-import api.meta_rules_test as test_meta_rules
-import api.test_assignemnt as test_assignments
+import api.test_meta_rules as test_meta_rules
+import api.test_assignement as test_assignments
import api.test_rules as test_rules
import logging
@@ -21,7 +20,6 @@ def clean_models(client):
req, models = test_models.get_models(client)
for key in models["models"]:
client.delete("/models/{}".format(key))
- print("deleted model with id {}".format(key))
def clean_policies(client):
@@ -29,47 +27,40 @@ def clean_policies(client):
for key in policies["policies"]:
req = client.delete("/policies/{}".format(key))
assert req.status_code == 200
- print("deleted policy with id {}".format(key))
def clean_subjects(client):
subjects = test_perimeter.get_subjects(client)
logger.info("subjects {}".format(subjects))
- for key in subjects["subjects"]:
- subject = subjects["subjects"][key]
+ for key in subjects[1]["subjects"]:
+ subject = subjects[1]["subjects"][key]
policy_keys = subject["policy_list"]
logger.info("subjects policy_keys {}".format(policy_keys))
for policy_key in policy_keys:
- client.delete("/policies/{}/subjects/{}".format(policy_key,key))
- client.delete("/subjects/{}".format(key))
- print("deleted subject with id {}".format(key))
+ client.delete("/policies/{}/subjects/{}".format(policy_key, key))
def clean_objects(client):
objects = test_perimeter.get_objects(client)
logger.info("objects {}".format(objects))
- for key in objects["objects"]:
- object_ = objects["objects"][key]
+ for key in objects[1]["objects"]:
+ object_ = objects[1]["objects"][key]
policy_keys = object_["policy_list"]
logger.info("objects policy_keys {}".format(policy_keys))
for policy_key in policy_keys:
- print("/policies/{}/objects/{}".format(policy_key, key))
- req = client.delete("/policies/{}/objects/{}".format(policy_key, key))
- client.delete("/objects/{}".format(key))
- print("deleted object with id {}".format(key))
+ client.delete("/policies/{}/objects/{}".format(policy_key, key))
def clean_actions(client):
actions = test_perimeter.get_actions(client)
- logger.info("objects {}".format(actions))
- for key in actions["actions"]:
- action = actions["actions"][key]
+ actions = test_perimeter.get_actions(client)
+ logger.info("actions {}".format(actions))
+ for key in actions[1]["actions"]:
+ action = actions[1]["actions"][key]
policy_keys = action["policy_list"]
logger.info("action policy_keys {}".format(policy_keys))
for policy_key in policy_keys:
client.delete("/policies/{}/actions/{}".format(policy_key, key))
- client.delete("/actions/{}".format(key))
- print("deleted action with id {}".format(key))
def clean_subject_categories(client):
@@ -95,35 +86,45 @@ def clean_action_categories(client):
def clean_subject_data(client):
req, policies = test_policies.get_policies(client)
+ logger.info("clean_subject_data on {}".format(policies))
for policy_key in policies["policies"]:
req, data = test_data.get_subject_data(client, policy_id=policy_key)
- print(data)
- for key in data["subject_data"]:
- client.delete("/policies/{}/subject_data/{}".format(policy_key, key))
+ logger.info("============= data {}".format(data))
+ for data_item in data["subject_data"]:
+ if data_item["data"]:
+ for data_id in data_item["data"]:
+ logger.info("============= Deleting {}/{}".format(policy_key, data_id))
+ client.delete("/policies/{}/subject_data/{}/{}".format(policy_key, data_item['category_id'], data_id))
def clean_object_data(client):
req, policies = test_policies.get_policies(client)
for policy_key in policies["policies"]:
req, data = test_data.get_object_data(client, policy_id=policy_key)
- print(data)
- for key in data["object_data"]:
- client.delete("/policies/{}/object_data/{}".format(policy_key, key))
+ for data_item in data["object_data"]:
+ if data_item["data"]:
+ for data_id in data_item["data"]:
+ logger.info("============= object_data {}/{}".format(policy_key, data_id))
+ client.delete("/policies/{}/object_data/{}/{}".format(policy_key, data_item['category_id'], data_id))
def clean_action_data(client):
req, policies = test_policies.get_policies(client)
for policy_key in policies["policies"]:
req, data = test_data.get_action_data(client, policy_id=policy_key)
- for key in data["action_data"]:
- client.delete("/policies/{}/action_data/{}".format(policy_key, key))
+ for data_item in data["action_data"]:
+ if data_item["data"]:
+ for data_id in data_item["data"]:
+ logger.info("============= action_data {}/{}".format(policy_key, data_id))
+ client.delete("/policies/{}/action_data/{}/{}".format(policy_key, data_item['category_id'], data_id))
def clean_meta_rule(client):
req, meta_rules = test_meta_rules.get_meta_rules(client)
meta_rules = meta_rules["meta_rules"]
for meta_rule_key in meta_rules:
- print(meta_rule_key)
+ logger.info("clean_meta_rule.meta_rule_key={}".format(meta_rule_key))
+ logger.info("clean_meta_rule.meta_rule={}".format(meta_rules[meta_rule_key]))
client.delete("/meta_rules/{}".format(meta_rule_key))
@@ -136,7 +137,8 @@ def clean_subject_assignments(client):
cat_key = assignments["subject_assignments"][key]["category_id"]
data_keys = assignments["subject_assignments"][key]["assignments"]
for data_key in data_keys:
- req = client.delete("/policies/{}/subject_assignments/{}/{}/{}".format(policy_key, subject_key, cat_key, data_key))
+ client.delete("/policies/{}/subject_assignments/{}/{}/{}".format(policy_key, subject_key,
+ cat_key, data_key))
def clean_object_assignments(client):
@@ -148,7 +150,8 @@ def clean_object_assignments(client):
cat_key = assignments["object_assignments"][key]["category_id"]
data_keys = assignments["object_assignments"][key]["assignments"]
for data_key in data_keys:
- req = client.delete("/policies/{}/object_assignments/{}/{}/{}".format(policy_key, object_key, cat_key, data_key))
+ client.delete("/policies/{}/object_assignments/{}/{}/{}".format(policy_key, object_key,
+ cat_key, data_key))
def clean_action_assignments(client):
@@ -160,18 +163,17 @@ def clean_action_assignments(client):
cat_key = assignments["action_assignments"][key]["category_id"]
data_keys = assignments["action_assignments"][key]["assignments"]
for data_key in data_keys:
- req = client.delete("/policies/{}/action_assignments/{}/{}/{}".format(policy_key, action_key, cat_key, data_key))
+ client.delete("/policies/{}/action_assignments/{}/{}/{}".format(policy_key, action_key,
+ cat_key, data_key))
def clean_rules(client):
req, policies = test_policies.get_policies(client)
for policy_key in policies["policies"]:
req, rules = test_rules.get_rules(client, policy_key)
- print(rules)
- rules = rules["rules"]
- rules = rules["rules"]
+ rules = rules["rules"]["rules"]
for rule_key in rules:
- client.delete("/policies/{}/rules/{}".format(policy_key, rule_key))
+ req = client.delete("/policies/{}/rules/{}".format(policy_key, rule_key["id"]))
def clean_all(client):
@@ -181,11 +183,6 @@ def clean_all(client):
clean_object_assignments(client)
clean_action_assignments(client)
- clean_meta_rule(client)
-
- clean_subject_categories(client)
- clean_object_categories(client)
- clean_action_categories(client)
clean_subject_data(client)
clean_object_data(client)
@@ -195,5 +192,11 @@ def clean_all(client):
clean_objects(client)
clean_subjects(client)
+ clean_subject_categories(client)
+ clean_object_categories(client)
+ clean_action_categories(client)
+
+
clean_policies(client)
- clean_models(client) \ No newline at end of file
+ clean_models(client)
+ clean_meta_rule(client) \ No newline at end of file
diff --git a/moon_manager/tests/unit_python/api/meta_data_test.py b/old/moon_manager/tests/unit_python/api/meta_data_test.py
index 0d67a8cd..8609f0b5 100644
--- a/moon_manager/tests/unit_python/api/meta_data_test.py
+++ b/old/moon_manager/tests/unit_python/api/meta_data_test.py
@@ -54,6 +54,20 @@ def test_add_subject_categories():
assert value['description'] == "description of {}".format("testuser")
+def test_add_subject_categories_with_empty_user():
+ client = utilities.register_client()
+ req, subject_categories = add_subject_categories(client, "")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "Empty String"
+
+
+def test_add_subject_categories_with_user_contain_space():
+ client = utilities.register_client()
+ req, subject_categories = add_subject_categories(client, "test user")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "String contains space"
+
+
def test_delete_subject_categories():
client = utilities.register_client()
req = delete_subject_categories(client, "testuser")
@@ -119,6 +133,20 @@ def test_add_object_categories():
assert value['description'] == "description of {}".format("testuser")
+def test_add_object_categories_with_empty_user():
+ client = utilities.register_client()
+ req, object_categories = add_object_categories(client, "")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "Empty String"
+
+
+def test_add_object_categories_with_user_contain_space():
+ client = utilities.register_client()
+ req, object_categories = add_object_categories(client, "test user")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "String contains space"
+
+
def test_delete_object_categories():
client = utilities.register_client()
req = delete_object_categories(client, "testuser")
@@ -184,6 +212,20 @@ def test_add_action_categories():
assert value['description'] == "description of {}".format("testuser")
+def test_add_action_categories_with_empty_user():
+ client = utilities.register_client()
+ req, action_categories = add_action_categories(client, "")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "Empty String"
+
+
+def test_add_action_categories_with_user_contain_space():
+ client = utilities.register_client()
+ req, action_categories = add_action_categories(client, "test user")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "String contains space"
+
+
def test_delete_action_categories():
client = utilities.register_client()
req = delete_action_categories(client, "testuser")
diff --git a/old/moon_manager/tests/unit_python/api/meta_rules_test.py b/old/moon_manager/tests/unit_python/api/meta_rules_test.py
new file mode 100644
index 00000000..a87c16f3
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/meta_rules_test.py
@@ -0,0 +1,162 @@
+import json
+import api.utilities as utilities
+
+
+def get_meta_rules(client):
+ req = client.get("/meta_rules")
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def add_meta_rules(client, name):
+ data = {
+ "name": name,
+ "subject_categories": ["subject_category_id1",
+ "subject_category_id2"],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ }
+ req = client.post("/meta_rules", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def add_meta_rules_without_subject_category_ids(client, name):
+ data = {
+ "name": name,
+ "subject_categories": [],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ }
+ req = client.post("/meta_rules", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def update_meta_rules(client, name, metaRuleId):
+ data = {
+ "name": name,
+ "subject_categories": ["subject_category_id1_update",
+ "subject_category_id2_update"],
+ "object_categories": ["object_category_id1_update"],
+ "action_categories": ["action_category_id1_update"]
+ }
+ req = client.patch("/meta_rules/{}".format(metaRuleId), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def update_meta_rules_without_subject_category_ids(client, name):
+ data = {
+ "name": name,
+ "subject_categories": [],
+ "object_categories": ["object_category_id1"],
+ "action_categories": ["action_category_id1"]
+ }
+ req = client.post("/meta_rules", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def delete_meta_rules(client, name):
+ request, meta_rules = get_meta_rules(client)
+ for key, value in meta_rules['meta_rules'].items():
+ if value['name'] == name:
+ req = client.delete("/meta_rules/{}".format(key))
+ break
+ return req
+
+
+def delete_meta_rules_without_id(client):
+ req = client.delete("/meta_rules/{}".format(""))
+ return req
+
+
+def test_get_meta_rules():
+ client = utilities.register_client()
+ req, meta_rules = get_meta_rules(client)
+ assert req.status_code == 200
+ assert isinstance(meta_rules, dict)
+ assert "meta_rules" in meta_rules
+
+
+def test_add_meta_rules():
+ client = utilities.register_client()
+ req, meta_rules = add_meta_rules(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(meta_rules, dict)
+ value = list(meta_rules["meta_rules"].values())[0]
+ assert "meta_rules" in meta_rules
+ assert value['name'] == "testuser"
+ assert value["subject_categories"][0] == "subject_category_id1"
+ assert value["object_categories"][0] == "object_category_id1"
+ assert value["action_categories"][0] == "action_category_id1"
+
+
+def test_add_meta_rules_with_empty_user():
+ client = utilities.register_client()
+ req, meta_rules = add_meta_rules(client, "")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "Empty String"
+
+
+def test_add_meta_rules_with_user_contain_space():
+ client = utilities.register_client()
+ req, meta_rules = add_meta_rules(client, "test user")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == "String contains space"
+
+
+def test_add_meta_rules_without_subject_categories():
+ client = utilities.register_client()
+ req, meta_rules = add_meta_rules_without_subject_category_ids(client, "testuser")
+ assert req.status_code == 500
+ assert json.loads(req.data)["message"] == 'Empty Container'
+
+
+def test_delete_meta_rules():
+ client = utilities.register_client()
+ req = delete_meta_rules(client, "testuser")
+ assert req.status_code == 200
+
+
+def test_delete_meta_rules_without_id():
+ client = utilities.register_client()
+ req = delete_meta_rules_without_id(client)
+ assert req.status_code == 500
+
+
+def test_update_meta_rules():
+ client = utilities.register_client()
+ req = add_meta_rules(client, "testuser")
+ meta_rule_id = list(req[1]['meta_rules'])[0]
+ req_update = update_meta_rules(client, "testuser", meta_rule_id)
+ assert req_update[0].status_code == 200
+ value = list(req_update[1]["meta_rules"].values())[0]
+ assert value["subject_categories"][0] == "subject_category_id1_update"
+ delete_meta_rules(client, "testuser")
+ get_meta_rules(client)
+
+
+def test_update_meta_rules_without_id():
+ client = utilities.register_client()
+ req_update = update_meta_rules(client, "testuser", "")
+ assert req_update[0].status_code == 500
+
+
+def test_update_meta_rules_without_user():
+ client = utilities.register_client()
+ req_update = update_meta_rules(client, "", "")
+ assert req_update[0].status_code == 500
+ assert json.loads(req_update[0].data)["message"] == "Empty String"
+
+
+def test_update_meta_rules_without_subject_categories():
+ client = utilities.register_client()
+ req_update = update_meta_rules_without_subject_category_ids(client, "testuser")
+ assert req_update[0].status_code == 500
+ assert json.loads(req_update[0].data)["message"] == "Empty Container"
diff --git a/old/moon_manager/tests/unit_python/api/test_assignement.py b/old/moon_manager/tests/unit_python/api/test_assignement.py
new file mode 100644
index 00000000..b56fb420
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_assignement.py
@@ -0,0 +1,280 @@
+import api.utilities as utilities
+import json
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+# subject_categories_test
+
+
+def get_subject_assignment(client, policy_id):
+ req = client.get("/policies/{}/subject_assignments".format(policy_id))
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def add_subject_assignment(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ subject_id = builder.create_subject(policy_id)
+ data_id = builder.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ data = {
+ "id": subject_id,
+ "category_id": subject_category_id,
+ "data_id": data_id
+ }
+ req = client.post("/policies/{}/subject_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def add_subject_assignment_without_cat_id(client):
+
+ data = {
+ "id": "subject_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = client.post("/policies/{}/subject_assignments".format("1111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def delete_subject_assignment(client, policy_id, sub_id, cat_id,data_id):
+ req = client.delete("/policies/{}/subject_assignments/{}/{}/{}".format(policy_id, sub_id, cat_id,data_id))
+ return req
+
+
+def test_add_subject_assignment():
+ client = utilities.register_client()
+ req, subject_assignment = add_subject_assignment(client)
+ assert req.status_code == 200
+ assert isinstance(subject_assignment, dict)
+ assert "subject_assignments" in subject_assignment
+
+
+# def test_add_subject_assignment_without_cat_id():
+# client = utilities.register_client()
+# req, subject_assignment = add_subject_assignment_without_cat_id(client)
+# assert req.status_code == 400
+# assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_get_subject_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(subject_assignment, dict)
+ assert "subject_assignments" in subject_assignment
+
+
+def test_delete_subject_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(client, policy_id)
+ value = subject_assignment["subject_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_subject_assignment(client,
+ policy_id,
+ value[_id]['subject_id'],
+ value[_id]['category_id'],
+ value[_id]['assignments'][0])
+ assert success_req.status_code == 200
+
+
+def test_delete_subject_assignment_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_subject_assignment(client, "", "id1", "111", "data_id1")
+ assert success_req.status_code == 404
+
+
+# ---------------------------------------------------------------------------
+# object_categories_test
+
+
+def get_object_assignment(client, policy_id):
+ req = client.get("/policies/{}/object_assignments".format(policy_id))
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def add_object_assignment(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ object_id = builder.create_object(policy_id)
+ data_id = builder.create_object_data(policy_id=policy_id, category_id=object_category_id)
+
+ data = {
+ "id": object_id,
+ "category_id": object_category_id,
+ "data_id": data_id
+ }
+
+ req = client.post("/policies/{}/object_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def add_object_assignment_without_cat_id(client):
+
+ data = {
+ "id": "object_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = client.post("/policies/{}/object_assignments".format("1111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def delete_object_assignment(client, policy_id, obj_id, cat_id, data_id):
+ req = client.delete("/policies/{}/object_assignments/{}/{}/{}".format(policy_id, obj_id, cat_id, data_id))
+ return req
+
+
+def test_get_object_assignment():
+ policy_id = builder.get_policy_id_with_object_assignment()
+ client = utilities.register_client()
+ req, object_assignment = get_object_assignment(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(object_assignment, dict)
+ assert "object_assignments" in object_assignment
+
+
+def test_add_object_assignment():
+ client = utilities.register_client()
+ req, object_assignment = add_object_assignment(client)
+ assert req.status_code == 200
+ assert "object_assignments" in object_assignment
+
+
+# def test_add_object_assignment_without_cat_id():
+# client = utilities.register_client()
+# req, object_assignment = add_object_assignment_without_cat_id(client)
+# assert req.status_code == 400
+# assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_delete_object_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_object_assignment()
+ req, object_assignment = get_object_assignment(client, policy_id)
+ value = object_assignment["object_assignments"]
+ _id = list(value.keys())[0]
+ success_req = delete_object_assignment(client,
+ policy_id,
+ value[_id]['object_id'],
+ value[_id]['category_id'],
+ value[_id]['assignments'][0])
+ assert success_req.status_code == 200
+
+
+def test_delete_object_assignment_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_object_assignment(client, "", "id1", "111", "data_id1")
+ assert success_req.status_code == 404
+
+
+# ---------------------------------------------------------------------------
+# action_categories_test
+
+
+def get_action_assignment(client, policy_id):
+ req = client.get("/policies/{}/action_assignments".format(policy_id))
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def add_action_assignment(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ action_id = builder.create_action(policy_id)
+ data_id = builder.create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ data = {
+ "id": action_id,
+ "category_id": action_category_id,
+ "data_id": data_id
+ }
+ req = client.post("/policies/{}/action_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def add_action_assignment_without_cat_id(client):
+
+ data = {
+ "id": "action_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = client.post("/policies/{}/action_assignments".format("1111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def delete_action_assignment(client, policy_id, action_id, cat_id, data_id):
+ req = client.delete("/policies/{}/action_assignments/{}/{}/{}".format(policy_id, action_id, cat_id, data_id))
+ return req
+
+
+def test_get_action_assignment():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ client = utilities.register_client()
+ req, action_assignment = get_action_assignment(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(action_assignment, dict)
+ assert "action_assignments" in action_assignment
+
+
+def test_add_action_assignment():
+ client = utilities.register_client()
+ req, action_assignment = add_action_assignment(client)
+ assert req.status_code == 200
+ assert "action_assignments" in action_assignment
+
+
+# def test_add_action_assignment_without_cat_id():
+# client = utilities.register_client()
+# req, action_assignment = add_action_assignment_without_cat_id(client)
+# assert req.status_code == 400
+# assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_delete_action_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(client, policy_id)
+ value = action_assignment["action_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_action_assignment(client,
+ policy_id,
+ value[id]['action_id'],
+ value[id]['category_id'],
+ value[id]['assignments'][0])
+ assert success_req.status_code == 200
+
+
+def test_delete_action_assignment_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_action_assignment(client, "", "id1", "111", "data_id1")
+ assert success_req.status_code == 404
+
+# ---------------------------------------------------------------------------
diff --git a/old/moon_manager/tests/unit_python/api/test_assignemnt.py b/old/moon_manager/tests/unit_python/api/test_assignemnt.py
new file mode 100644
index 00000000..22c727af
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_assignemnt.py
@@ -0,0 +1,270 @@
+import api.utilities as utilities
+import json
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+# subject_categories_test
+
+
+def get_subject_assignment(client, policy_id):
+ req = client.get("/policies/{}/subject_assignments".format(policy_id))
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def add_subject_assignment(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ subject_id = builder.create_subject(policy_id)
+ data_id = builder.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ data = {
+ "id": subject_id,
+ "category_id": subject_category_id,
+ "data_id": data_id
+ }
+ req = client.post("/policies/{}/subject_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def add_subject_assignment_without_cat_id(client):
+
+ data = {
+ "id": "subject_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = client.post("/policies/{}/subject_assignments".format("1111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subject_assignment = utilities.get_json(req.data)
+ return req, subject_assignment
+
+
+def delete_subject_assignment(client, policy_id, sub_id, cat_id,data_id):
+ req = client.delete("/policies/{}/subject_assignments/{}/{}/{}".format(policy_id, sub_id, cat_id,data_id))
+ return req
+
+
+def test_add_subject_assignment():
+ client = utilities.register_client()
+ req, subject_assignment = add_subject_assignment(client)
+ assert req.status_code == 200
+ assert isinstance(subject_assignment, dict)
+ assert "subject_assignments" in subject_assignment
+
+
+def test_add_subject_assignment_without_cat_id():
+ client = utilities.register_client()
+ req, subject_assignment = add_subject_assignment_without_cat_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_get_subject_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(subject_assignment, dict)
+ assert "subject_assignments" in subject_assignment
+
+
+def test_delete_subject_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_subject_assignment()
+ req, subject_assignment = get_subject_assignment(client, policy_id)
+ value = subject_assignment["subject_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_subject_assignment(client, policy_id, value[id]['subject_id'], value[id]['category_id'],value[id]['assignments'][0])
+ assert success_req.status_code == 200
+
+
+def test_delete_subject_assignment_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_subject_assignment(client, "", "id1", "111" ,"data_id1")
+ assert success_req.status_code == 404
+
+
+# ---------------------------------------------------------------------------
+
+# object_categories_test
+
+
+def get_object_assignment(client, policy_id):
+ req = client.get("/policies/{}/object_assignments".format(policy_id))
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def add_object_assignment(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ object_id = builder.create_object(policy_id)
+ data_id = builder.create_object_data(policy_id=policy_id, category_id=object_category_id)
+
+ data = {
+ "id": object_id,
+ "category_id": object_category_id,
+ "data_id": data_id
+ }
+
+ req = client.post("/policies/{}/object_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def add_object_assignment_without_cat_id(client):
+
+ data = {
+ "id": "object_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = client.post("/policies/{}/object_assignments".format("1111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ object_assignment = utilities.get_json(req.data)
+ return req, object_assignment
+
+
+def delete_object_assignment(client, policy_id, obj_id, cat_id, data_id):
+ req = client.delete("/policies/{}/object_assignments/{}/{}/{}".format(policy_id, obj_id, cat_id, data_id))
+ return req
+
+
+def test_get_object_assignment():
+ policy_id = builder.get_policy_id_with_object_assignment()
+ client = utilities.register_client()
+ req, object_assignment = get_object_assignment(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(object_assignment, dict)
+ assert "object_assignments" in object_assignment
+
+
+def test_add_object_assignment():
+ client = utilities.register_client()
+ req, object_assignment = add_object_assignment(client)
+ assert req.status_code == 200
+ assert "object_assignments" in object_assignment
+
+
+def test_add_object_assignment_without_cat_id():
+ client = utilities.register_client()
+ req, object_assignment = add_object_assignment_without_cat_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_delete_object_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_object_assignment()
+ req, object_assignment = get_object_assignment(client, policy_id)
+ value = object_assignment["object_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_object_assignment(client, policy_id, value[id]['object_id'], value[id]['category_id'],value[id]['assignments'][0])
+ assert success_req.status_code == 200
+
+
+def test_delete_object_assignment_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_object_assignment(client, "", "id1", "111","data_id1")
+ assert success_req.status_code == 404
+
+
+# ---------------------------------------------------------------------------
+
+# action_categories_test
+
+
+def get_action_assignment(client, policy_id):
+ req = client.get("/policies/{}/action_assignments".format(policy_id))
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def add_action_assignment(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ action_id = builder.create_action(policy_id)
+ data_id = builder.create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ data = {
+ "id": action_id,
+ "category_id": action_category_id,
+ "data_id": data_id
+ }
+ req = client.post("/policies/{}/action_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def add_action_assignment_without_cat_id(client):
+
+ data = {
+ "id": "action_id",
+ "category_id": "",
+ "data_id": "data_id"
+ }
+ req = client.post("/policies/{}/action_assignments".format("1111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ action_assignment = utilities.get_json(req.data)
+ return req, action_assignment
+
+
+def delete_action_assignment(client, policy_id, action_id, cat_id, data_id):
+ req = client.delete("/policies/{}/action_assignments/{}/{}/{}".format(policy_id, action_id, cat_id, data_id))
+ return req
+
+
+def test_get_action_assignment():
+ policy_id = builder.get_policy_id_with_action_assignment()
+ client = utilities.register_client()
+ req, action_assignment = get_action_assignment(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(action_assignment, dict)
+ assert "action_assignments" in action_assignment
+
+
+def test_add_action_assignment():
+ client = utilities.register_client()
+ req, action_assignment = add_action_assignment(client)
+ assert req.status_code == 200
+ assert "action_assignments" in action_assignment
+
+
+def test_add_action_assignment_without_cat_id():
+ client = utilities.register_client()
+ req, action_assignment = add_action_assignment_without_cat_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'category_id', [Empty String]"
+
+
+def test_delete_action_assignment():
+ client = utilities.register_client()
+ policy_id = builder.get_policy_id_with_action_assignment()
+ req, action_assignment = get_action_assignment(client, policy_id)
+ value = action_assignment["action_assignments"]
+ id = list(value.keys())[0]
+ success_req = delete_action_assignment(client, policy_id, value[id]['action_id'], value[id]['category_id'],value[id]['assignments'][0])
+ assert success_req.status_code == 200
+
+
+def test_delete_action_assignment_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_action_assignment(client, "", "id1", "111" ,"data_id1")
+ assert success_req.status_code == 404
+
+# ---------------------------------------------------------------------------
diff --git a/old/moon_manager/tests/unit_python/api/test_data.py b/old/moon_manager/tests/unit_python/api/test_data.py
new file mode 100644
index 00000000..433f69e6
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_data.py
@@ -0,0 +1,239 @@
+# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import api.utilities as utilities
+import json
+from helpers import data_builder as builder
+from uuid import uuid4
+
+# subject_categories_test
+
+
+def get_subject_data(client, policy_id, category_id=None):
+ if category_id is None:
+ req = client.get("/policies/{}/subject_data".format(policy_id))
+ else:
+ req = client.get("/policies/{}/subject_data/{}".format(policy_id, category_id))
+ subject_data = utilities.get_json(req.data)
+ return req, subject_data
+
+
+def add_subject_data(client, name):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = client.post("/policies/{}/subject_data/{}".format(policy_id, subject_category_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subject_data = utilities.get_json(req.data)
+ return req, subject_data
+
+
+def delete_subject_data(client, policy_id, category_id, data_id):
+ req = client.delete("/policies/{}/subject_data/{}/{}".format(policy_id,category_id,data_id))
+ return req
+
+
+def test_get_subject_data():
+ policy_id = utilities.get_policy_id()
+ client = utilities.register_client()
+ req, subject_data = get_subject_data(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(subject_data, dict)
+ assert "subject_data" in subject_data
+
+
+def test_add_subject_data():
+ client = utilities.register_client()
+ req, subject_data = add_subject_data(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(subject_data, dict)
+ value = subject_data["subject_data"]['data']
+ assert "subject_data" in subject_data
+ id = list(value.keys())[0]
+ assert value[id]['name'] == "testuser"
+ assert value[id]['description'] == "description of {}".format("testuser")
+
+
+def test_delete_subject_data():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id,policy_id = builder.create_new_policy()
+ data_id = builder.create_subject_data(policy_id,subject_category_id)
+ success_req = delete_subject_data(client, policy_id, subject_category_id, data_id )
+ assert success_req.status_code == 200
+
+
+def test_add_subject_data_with_forbidden_char_in_user():
+ client = utilities.register_client()
+ req, subject_data = add_subject_data(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_subject_data_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_subject_data(client, "", "", "")
+ assert success_req.status_code == 404
+
+# ---------------------------------------------------------------------------
+# object_categories_test
+
+
+def get_object_data(client, policy_id, category_id=None):
+ if category_id is None:
+ req = client.get("/policies/{}/object_data".format(policy_id))
+ else:
+ req = client.get("/policies/{}/object_data/{}".format(policy_id, category_id))
+ object_data = utilities.get_json(req.data)
+ return req, object_data
+
+
+def add_object_data(client, name):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = client.post("/policies/{}/object_data/{}".format(policy_id, object_category_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ object_data = utilities.get_json(req.data)
+ return req, object_data
+
+
+def delete_object_data(client, policy_id, category_id, data_id):
+ req = client.delete("/policies/{}/object_data/{}/{}".format(policy_id, category_id, data_id))
+ return req
+
+
+def test_get_object_data():
+ policy_id = utilities.get_policy_id()
+ client = utilities.register_client()
+ req, object_data = get_object_data(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(object_data, dict)
+ assert "object_data" in object_data
+
+
+def test_add_object_data():
+ client = utilities.register_client()
+ req, object_data = add_object_data(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(object_data, dict)
+ value = object_data["object_data"]['data']
+ assert "object_data" in object_data
+ _id = list(value.keys())[0]
+ assert value[_id]['name'] == "testuser"
+ assert value[_id]['description'] == "description of {}".format("testuser")
+
+
+def test_delete_object_data():
+ client = utilities.register_client()
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ data_id = builder.create_object_data(policy_id, object_category_id)
+
+ success_req = delete_object_data(client, policy_id, data_id, object_category_id)
+ assert success_req.status_code == 200
+
+
+def test_add_object_data_with_forbidden_char_in_user():
+ client = utilities.register_client()
+ req, subject_data = add_object_data(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_object_data_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_object_data(client, "", "", "")
+ assert success_req.status_code == 404
+
+# ---------------------------------------------------------------------------
+# action_categories_test
+
+
+def get_action_data(client, policy_id, category_id=None):
+ if category_id is None:
+ req = client.get("/policies/{}/action_data".format(policy_id))
+ else:
+ req = client.get("/policies/{}/action_data/{}".format(policy_id, category_id))
+ action_data = utilities.get_json(req.data)
+ return req, action_data
+
+
+def add_action_data(client, name):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = client.post("/policies/{}/action_data/{}".format(policy_id, action_category_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ action_data = utilities.get_json(req.data)
+ return req, action_data
+
+
+def delete_action_data(client, policy_id, categorgy_id, data_id):
+ req = client.delete("/policies/{}/action_data/{}/{}".format(policy_id, categorgy_id, data_id))
+ return req
+
+
+def test_get_action_data():
+ policy_id = utilities.get_policy_id()
+ client = utilities.register_client()
+ req, action_data = get_action_data(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(action_data, dict)
+ assert "action_data" in action_data
+
+
+def test_add_action_data():
+ client = utilities.register_client()
+ req, action_data = add_action_data(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(action_data, dict)
+ value = action_data["action_data"]['data']
+ assert "action_data" in action_data
+ id = list(value.keys())[0]
+ assert value[id]['name'] == "testuser"
+ assert value[id]['description'] == "description of {}".format("testuser")
+
+
+def test_delete_action_data():
+ client = utilities.register_client()
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ data_id = builder.create_action_data(policy_id, action_category_id)
+
+ success_req = delete_action_data(client, policy_id, data_id, action_category_id)
+
+ assert success_req.status_code == 200
+
+
+def test_add_action_data_with_forbidden_char_in_user():
+ client = utilities.register_client()
+ req, action_data = add_action_data(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_action_data_without_policy_id():
+ client = utilities.register_client()
+ success_req = delete_action_data(client, "", "", "")
+ assert success_req.status_code == 404
+# ---------------------------------------------------------------------------
diff --git a/moon_manager/tests/unit_python/api/test_export.py b/old/moon_manager/tests/unit_python/api/test_export.py
index 122ab927..ac8e8d17 100644
--- a/moon_manager/tests/unit_python/api/test_export.py
+++ b/old/moon_manager/tests/unit_python/api/test_export.py
@@ -51,11 +51,11 @@ ASSIGNMENTS = {"models": [{"name": "test model", "description": "", "meta_rules"
"action_data": [{"name": "test action data", "description": "action data description", "policies": [{"name": "test policy"}], "category": {"name": "test action categories"}}],
"meta_rules": [{"name": "meta rule", "description": "valid meta rule", "subject_categories": [{"name": "test subject categories"}], "object_categories": [{"name": "test object categories"}], "action_categories": [{"name": "test action categories"}]}],
"subjects": [{"name": "testuser", "description": "description of the subject", "extra": {"field_extra_subject": "value extra subject"}, "policies": [{"name": "test policy"}]}],
- "objects": [{"name": "test object", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
- "actions": [{"name": "test action", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object e0", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action e0", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
"subject_assignments": [{"subject": {"name": "testuser"}, "category": {"name": "test subject categories"}, "assignments": [{"name": "test subject data"}]}],
- "object_assignments": [{"object": {"name": "test object"}, "category": {"name": "test object categories"}, "assignments": [{"name": "test object data"}]}],
- "action_assignments": [{"action": {"name": "test action"}, "category": {"name": "test action categories"}, "assignments": [{"name": "test action data"}]}]}
+ "object_assignments": [{"object": {"name": "test object e0"}, "category": {"name": "test object categories"}, "assignments": [{"name": "test object data"}]}],
+ "action_assignments": [{"action": {"name": "test action e0"}, "category": {"name": "test action categories"}, "assignments": [{"name": "test action data"}]}]}
RULES = {"models": [{"name": "test model", "description": "", "meta_rules": [{"name": "meta rule"}]}],
"policies": [{"name": "test policy", "genre": "authz", "description": "policy description", "model": {"name" : "test model"}}],
@@ -67,12 +67,12 @@ RULES = {"models": [{"name": "test model", "description": "", "meta_rules": [{"n
"action_data": [{"name": "test action data", "description": "action data description", "policies": [{"name": "test policy"}], "category": {"name": "test action categories"}}],
"meta_rules": [{"name": "meta rule", "description": "valid meta rule", "subject_categories": [{"name": "test subject categories"}], "object_categories": [{"name": "test object categories"}], "action_categories": [{"name": "test action categories"}]}],
"subjects": [{"name": "testuser", "description": "description of the subject", "extra": {"field_extra_subject": "value extra subject"}, "policies": [{"name": "test policy"}]}],
- "objects": [{"name": "test object", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
- "actions": [{"name": "test action", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
+ "objects": [{"name": "test object e1", "description": "description of the object", "extra": {"field_extra_object": "value extra object"}, "policies": [{"name": "test policy"}]}],
+ "actions": [{"name": "test action e1", "description": "description of the action", "extra": {"field_extra_action": "value extra action"}, "policies": [{"name": "test policy"}]}],
"subject_assignments": [{"subject": {"name": "testuser"}, "category": {"name": "test subject categories"}, "assignments": [{"name": "test subject data"}]}],
- "object_assignments": [{"object": {"name": "test object"}, "category": {"name": "test object categories"}, "assignments": [{"name": "test object data"}]}],
- "action_assignments": [{"action": {"name": "test action"}, "category": {"name": "test action categories"}, "assignments": [{"name": "test action data"}]}],
- "rules": [{"meta_rule": {"name" : "meta rule"}, "rule": {"subject_data" : [{"name":"test subject data"}], "object_data": [{"name": "test object data"}], "action_data": [{"name": "test action data"}]}, "policy": {"name" :"test policy"}, "instructions" : {"decision" : "grant"}, "enabled": True}]
+ "object_assignments": [{"object": {"name": "test object e1"}, "category": {"name": "test object categories"}, "assignments": [{"name": "test object data"}]}],
+ "action_assignments": [{"action": {"name": "test action e1"}, "category": {"name": "test action categories"}, "assignments": [{"name": "test action data"}]}],
+ "rules": [{"meta_rule": {"name": "meta rule"}, "rule": {"subject_data": [{"name": "test subject data"}], "object_data": [{"name": "test object data"}], "action_data": [{"name": "test action data"}]}, "policy": {"name":"test policy"}, "instructions": {"decision": "grant"}, "enabled": True}]
}
@@ -87,7 +87,6 @@ def test_export_models():
assert req.status_code == 200
data = utilities.get_json(req.data)
- print(data)
assert "content" in data
assert "models" in data["content"]
assert isinstance(data["content"]["models"], list)
@@ -110,7 +109,6 @@ def test_export_policies():
assert req.status_code == 200
data = utilities.get_json(req.data)
- print(data)
assert "content" in data
assert "policies" in data["content"]
assert isinstance(data["content"]["policies"], list)
@@ -136,7 +134,6 @@ def test_export_subject_object_action():
assert req.status_code == 200
data = utilities.get_json(req.data)
- print(data)
assert "content" in data
type_elements = ["subject", "object", "action"]
for type_element in type_elements:
@@ -158,10 +155,8 @@ def test_export_subject_object_action():
assert isinstance(element["extra"], dict)
key_dict = "field_extra_" + type_element
value_dict = "value extra " + type_element
- #TODO change this after bug fix on extra
- if False:
- assert key_dict in element["extra"]
- assert element["extra"][key_dict] == value_dict
+ assert key_dict in element["extra"]
+ assert element["extra"][key_dict] == value_dict
def test_export_subject_object_action_categories():
@@ -196,7 +191,6 @@ def test_export_subject_object_action_data():
req = client.get("/export")
assert req.status_code == 200
data = utilities.get_json(req.data)
- print(data)
assert "content" in data
type_elements = ["subject", "object", "action"]
for type_element in type_elements:
@@ -207,9 +201,9 @@ def test_export_subject_object_action_data():
data_elt = data["content"][key][0]
assert data_elt["name"] == "test " + type_element + " data"
assert data_elt["description"] == type_element + " data description"
- assert isinstance(data_elt["policy"],dict)
+ assert isinstance(data_elt["policy"], dict)
assert data_elt["policy"]["name"] == "test policy"
- assert isinstance(data_elt["category"],dict)
+ assert isinstance(data_elt["category"], dict)
assert data_elt["category"]["name"] == "test " + type_element + " categories"
@@ -223,7 +217,6 @@ def test_export_assignments():
req = client.get("/export")
assert req.status_code == 200
data = utilities.get_json(req.data)
- print(data)
assert "content" in data
type_elements = ["subject", "object", "action"]
for type_element in type_elements:
@@ -237,7 +230,7 @@ def test_export_assignments():
if type_element == "subject":
assert assignment_elt[type_element]["name"] == "testuser"
else:
- assert assignment_elt[type_element]["name"] == "test " + type_element
+ assert assignment_elt[type_element]["name"] == "test " + type_element + " e0"
assert "category" in assignment_elt
assert isinstance(assignment_elt["category"], dict)
assert assignment_elt["category"]["name"] == "test " + type_element + " categories"
@@ -246,6 +239,8 @@ def test_export_assignments():
assert len(assignment_elt["assignments"]) == 1
assert assignment_elt["assignments"][0]["name"] == "test " + type_element + " data"
+ import_export_utilities.clean_all(client)
+
def test_export_rules():
client = utilities.register_client()
@@ -257,7 +252,6 @@ def test_export_rules():
req = client.get("/export")
assert req.status_code == 200
data = utilities.get_json(req.data)
- print(data)
assert "content" in data
assert "rules" in data["content"]
assert isinstance(data["content"]["rules"], list)
@@ -267,7 +261,7 @@ def test_export_rules():
assert "decision" in rule["instructions"]
assert rule["instructions"]["decision"] == "grant"
assert "enabled" in rule
- assert rule["enabled"] == True
+ assert rule["enabled"]
assert "meta_rule" in rule
assert rule["meta_rule"]["name"] == "meta rule"
assert "policy" in rule
diff --git a/moon_manager/tests/unit_python/api/test_import.py b/old/moon_manager/tests/unit_python/api/test_import.py
index 4e970a0e..af5f753a 100644
--- a/moon_manager/tests/unit_python/api/test_import.py
+++ b/old/moon_manager/tests/unit_python/api/test_import.py
@@ -4,13 +4,12 @@
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
import api.utilities as utilities
-import api.test_models as test_models
+import api.test_unit_models as test_models
import api.test_policies as test_policies
-import api.test_perimeter as test_perimeter
-import api.meta_data_test as test_categories
+import api.test_meta_data as test_categories
import api.test_data as test_data
-import api.meta_rules_test as test_meta_rules
-import api.test_assignemnt as test_assignments
+import api.test_meta_rules as test_meta_rules
+import api.test_assignement as test_assignments
import api.test_rules as test_rules
import api.import_export_utilities as import_export_utilities
@@ -37,11 +36,18 @@ SUBJECTS = [{"subjects": [{"name": "testuser", "description": "description of th
{"policies": [{"name": "test policy", "genre": "authz", "description": "description", "model": {}, "mandatory": False}], "subjects": [{"name": "testuser", "description": "description of the subject", "extra": {}, "policies": [{"name": "test policy"}]}]}]
-OBJECTS = [{"objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": []}]},
- {"policies": [{"name": "test policy", "genre": "authz", "description": "description", "model": {}, "mandatory": False}], "objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": []}]},
- {"policies": [{"name": "test other policy", "genre": "authz", "description": "description", "model": {}, "mandatory": True}], "objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": []}]},
- {"objects": [{"name": "test object", "description": "new description of the object", "extra": {"test": "test extra"}, "policies": [{"name": "test other policy"}]}]},
- {"policies": [{"name": "test policy", "genre": "authz", "description": "description", "model": {}, "mandatory": False}], "objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": [{"name": "test policy"}]}]}]
+OBJECTS = [
+ {"objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": []}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description", "model": {}, "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": []}]},
+ {"policies": [{"name": "test other policy", "genre": "authz", "description": "description", "model": {}, "mandatory": True}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": []}]},
+ {"objects": [{"name": "test object", "description": "new description of the object",
+ "extra": {"test": "test extra"},
+ "policies": [{"name": "test other policy"}]}]},
+ {"policies": [{"name": "test policy", "genre": "authz", "description": "description", "model": {}, "mandatory": False}],
+ "objects": [{"name": "test object", "description": "description of the object", "extra": {}, "policies": [{"name": "test policy"}]}]},
+]
ACTIONS = [{"actions": [{"name": "test action", "description": "description of the action", "extra": {}, "policies": []}]},
@@ -100,7 +106,8 @@ META_RULES = [{"meta_rules" :[{"name": "bad meta rule", "description": "not vali
{"meta_rules": [{"name": "bad meta rule", "description": "not valid meta rule", "subject_categories": [{"name": "test subject categories"}], "object_categories": [{"name": "test object categories"}], "action_categories": [{"name": "not valid category"}]}]},
{"meta_rules": [{"name": "good meta rule", "description": "valid meta rule", "subject_categories": [{"name": "test subject categories"}], "object_categories": [{"name": "test object categories"}], "action_categories": [{"name": "test action categories"}]}]}]
-PRE_ASSIGNMENTS = {"models": [{"name": "test model", "description": "", "meta_rules": [{"name" : "good meta rule"}]}],
+
+PRE_ASSIGNMENTS = {"models": [{"name": "test model", "description": "", "meta_rules": [{"name": "good meta rule"}]}],
"policies": [{"name": "test policy", "genre": "authz", "description": "description", "model": {"name" : "test model"}, "mandatory": True}],
"subject_categories": [{"name": "test subject categories", "description": "subject category description"}],
"object_categories": [{"name": "test object categories", "description": "object category description"}],
@@ -137,8 +144,6 @@ RULES = [{"rules": [{"meta_rule": {"name": "unknown meta rule"}, "policy": {"nam
{"rules": [{"meta_rule": {"name": "good meta rule"}, "policy": {"name": "test policy"}, "instructions": {"decision": "grant"}, "enabled": True, "rule": {"subject_data": [{"name": "subject data"}], "object_data": [{"name": "object data"}], "action_data": [{"name": "action data"}]}}]}]
-
-
def test_import_models_without_new_meta_rules():
client = utilities.register_client()
import_export_utilities.clean_all(client)
@@ -170,8 +175,8 @@ def test_import_policies():
try:
data = utilities.get_json(req.data)
assert data == "Import ok !"
- except Exception as e:
- assert counter == 2 # this is an expected failure
+ except Exception:
+ assert counter == 2 # this is an expected failure
continue
req, policies = test_policies.get_policies(client)
@@ -191,7 +196,7 @@ def test_import_policies():
def test_import_subject_object_action():
client = utilities.register_client()
- type_elements =["object", "action"]
+ type_elements = ["object", "action"]
for type_element in type_elements:
import_export_utilities.clean_all(client)
@@ -199,21 +204,18 @@ def test_import_subject_object_action():
# set the getters and the comparison values
if type_element == "subject":
elements = SUBJECTS
- get_method = test_perimeter.get_subjects
- clean_method= import_export_utilities.clean_subjects
+ clean_method = import_export_utilities.clean_subjects
name = "testuser"
key_extra = "email"
value_extra = "new-email@test.com"
elif type_element == "object":
elements = OBJECTS
- get_method = test_perimeter.get_objects
clean_method = import_export_utilities.clean_objects
name = "test object"
key_extra = "test"
value_extra = "test extra"
else:
elements = ACTIONS
- get_method = test_perimeter.get_actions
clean_method = import_export_utilities.clean_actions
name = "test action"
key_extra = "test"
@@ -221,11 +223,17 @@ def test_import_subject_object_action():
for element in elements:
counter = counter + 1
- print("counter {}".format(counter))
if counter == 2 or counter == 4:
clean_method(client)
- req = client.post("/import", content_type='application/json', data=json.dumps(element))
+
+ if counter == 3:
+ req = client.patch("/{}s/{}".format(type_element,perimeter_id), content_type='application/json',
+ data=json.dumps(
+ element["{}s".format(type_element)][0]))
+ else :
+ req = client.post("/import", content_type='application/json',
+ data=json.dumps(element))
if counter < 2:
assert req.status_code == 500
continue
@@ -233,28 +241,26 @@ def test_import_subject_object_action():
try:
data = utilities.get_json(req.data)
except Exception as e:
- print(str(e))
assert False
#assert counter < 2 #  this is an expected failure
#continue
- assert data == "Import ok !"
- get_elements = get_method(client)
+ if counter != 3:
+ assert data == "Import ok !"
+ get_elements = utilities.get_json(client.get("/"+type_element + "s").data)
get_elements = get_elements[type_element + "s"]
+ perimeter_id = list(get_elements.keys())[0]
+
assert len(list(get_elements.keys())) == 1
values = list(get_elements.values())
assert values[0]["name"] == name
- print(values[0])
if counter == 2 or counter == 4:
assert values[0]["description"] == "description of the " + type_element
- print(values[0])
#assert not values[0]["extra"]
if counter == 3:
- #TODO uncomment this if update shall be done through import !
- #assert values[0]["description"] == "new description of the " + type_element
- #assert values[0]["extra"][key_extra] == value_extra
- assert True
+ assert values[0]["description"] == "new description of the " + type_element
+ assert values[0]["extra"][key_extra] == value_extra
# assert len(values[0]["policy_list"]) == 1
import_export_utilities.clean_all(client)
@@ -311,10 +317,9 @@ def test_import_meta_rules():
assert data == "Import ok !"
assert req.status_code == 200
- req ,meta_rules= test_meta_rules.get_meta_rules(client)
+ req, meta_rules = test_meta_rules.get_meta_rules(client)
meta_rules = meta_rules["meta_rules"]
key = list(meta_rules.keys())[0]
- print(meta_rules)
assert isinstance(meta_rules,dict)
assert meta_rules[key]["name"] == "good meta rule"
assert meta_rules[key]["description"] == "valid meta rule"
@@ -344,6 +349,7 @@ def test_import_meta_rules():
def test_import_subject_object_action_assignments():
client = utilities.register_client()
import_export_utilities.clean_all(client)
+
req = client.post("/import", content_type='application/json', data=json.dumps(PRE_ASSIGNMENTS))
data = utilities.get_json(req.data)
assert data == "Import ok !"
@@ -369,8 +375,6 @@ def test_import_subject_object_action_assignments():
assert req.status_code == 500
continue
else:
- print(data)
- print(req)
assert data == "Import ok !"
assert req.status_code == 200
req, policies = test_policies.get_policies(client)
@@ -400,16 +404,13 @@ def test_import_rules():
req, rules = test_rules.test_get_rules()
rules = rules["rules"]
- policy_key = rules["policy_id"]
rules = rules["rules"]
- print(rules)
assert len(rules) == 1
rules = rules[0]
- assert rules["enabled"] == True
+ assert rules["enabled"]
assert rules["instructions"]["decision"] == "grant"
req, meta_rules = test_meta_rules.get_meta_rules(client)
- print(meta_rules)
assert meta_rules["meta_rules"][list(meta_rules["meta_rules"].keys())[0]]["name"] == "good meta rule"
@@ -441,7 +442,6 @@ def test_import_subject_object_action_data():
if counter == 0 or counter == 1:
assert req.status_code == 500
continue
- print(counter)
assert req.status_code == 200
data = utilities.get_json(req.data)
assert data == "Import ok !"
@@ -450,30 +450,20 @@ def test_import_subject_object_action_data():
policies = policies["policies"]
req, categories = get_categories(client)
categories = categories[type_element + "_categories"]
- print("categories {}".format(categories))
- print("policies {}".format(policies))
- print("data in import {}".format(element))
case_tested = False
for policy_key in policies.keys():
- print("policy in test {}".format(policy_key))
policy = policies[policy_key]
- print("policy {}".format(policy))
for category_key in categories:
- print("category in test {}".format(category_key))
- print("looking for {} data with policy {} and category {}".format(type_element, policy_key,category_key))
req, get_elements = get_method(client, policy_id=policy_key, category_id=category_key)
if len(get_elements[type_element+"_data"]) == 0:
continue
- # do this because the backend gives an element with empty data if the policy_key, category_key couple does not have any data...
+ # do this because the backend gives an element with empty data if the policy_key,
+ # category_key couple does not have any data...
get_elements = get_elements[type_element+"_data"]
- print("test")
if len(get_elements[0]["data"]) == 0:
- print("test2")
continue
- print("get_elements {}".format(get_elements))
-
if policy["name"] == "test policy":
assert len(get_elements) == 1
el = get_elements[0]
@@ -483,7 +473,6 @@ def test_import_subject_object_action_data():
el = el["data"][list(el["data"].keys())[0]]
if "value" in el:
el = el["value"]
- print(el)
assert el["name"] == "one valid " + type_element + " data"
if counter == 3:
assert len(el["data"].keys()) == 2
@@ -505,7 +494,6 @@ def test_import_subject_object_action_data():
assert isinstance(el["data"], dict)
assert len(el["data"].keys()) == 1
el = el["data"][list(el["data"].keys())[0]]
- print(el)
if "value" in el:
el = el["value"]
assert el["name"] == "valid " + type_element + " data"
@@ -519,4 +507,4 @@ def test_clean():
client = utilities.register_client()
import_export_utilities.clean_all(client)
#restore the database as previously
- utilities.get_policy_id() \ No newline at end of file
+ utilities.get_policy_id()
diff --git a/old/moon_manager/tests/unit_python/api/test_meta_data.py b/old/moon_manager/tests/unit_python/api/test_meta_data.py
new file mode 100644
index 00000000..e6cb0833
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_meta_data.py
@@ -0,0 +1,305 @@
+import json
+import api.utilities as utilities
+from helpers import data_builder
+from uuid import uuid4
+
+
+# subject_categories_test
+
+
+def get_subject_categories(client):
+ req = client.get("/subject_categories")
+ subject_categories = utilities.get_json(req.data)
+ return req, subject_categories
+
+
+def add_subject_categories(client, name):
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = client.post("/subject_categories", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subject_categories = utilities.get_json(req.data)
+ return req, subject_categories
+
+
+def delete_subject_categories(client, name):
+ request, subject_categories = get_subject_categories(client)
+ for key, value in subject_categories['subject_categories'].items():
+ if value['name'] == name:
+ return client.delete("/subject_categories/{}".format(key))
+
+
+def delete_subject_categories_without_id(client):
+ req = client.delete("/subject_categories/{}".format(""))
+ return req
+
+
+def test_get_subject_categories():
+ client = utilities.register_client()
+ req, subject_categories = get_subject_categories(client)
+ assert req.status_code == 200
+ assert isinstance(subject_categories, dict)
+ assert "subject_categories" in subject_categories
+
+
+def test_add_subject_categories():
+ client = utilities.register_client()
+ req, subject_categories = add_subject_categories(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(subject_categories, dict)
+ value = list(subject_categories["subject_categories"].values())[0]
+ assert "subject_categories" in subject_categories
+ assert value['name'] == "testuser"
+ assert value['description'] == "description of {}".format("testuser")
+
+
+def test_add_subject_categories_with_existed_name():
+ client = utilities.register_client()
+ name = uuid4().hex
+ req, subject_categories = add_subject_categories(client, name)
+ assert req.status_code == 200
+ req, subject_categories = add_subject_categories(client, name)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Subject Category Existing'
+
+
+def test_add_subject_categories_name_contain_space():
+ client = utilities.register_client()
+ req, subject_categories = add_subject_categories(client, " ")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Category Name Invalid'
+
+
+def test_add_subject_categories_with_empty_name():
+ client = utilities.register_client()
+ req, subject_categories = add_subject_categories(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_subject_categories_with_name_contain_space():
+ client = utilities.register_client()
+ req, subject_categories = add_subject_categories(client, "test<z>user")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_subject_categories():
+ client = utilities.register_client()
+ req = delete_subject_categories(client, "testuser")
+ assert req.status_code == 200
+
+
+def test_delete_subject_categories_without_id():
+ client = utilities.register_client()
+ req = delete_subject_categories_without_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Subject Category Unknown"
+
+
+# ---------------------------------------------------------------------------
+# object_categories_test
+
+def get_object_categories(client):
+ req = client.get("/object_categories")
+ object_categories = utilities.get_json(req.data)
+ return req, object_categories
+
+
+def add_object_categories(client, name):
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = client.post("/object_categories", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ object_categories = utilities.get_json(req.data)
+ return req, object_categories
+
+
+def delete_object_categories(client, name):
+ request, object_categories = get_object_categories(client)
+ for key, value in object_categories['object_categories'].items():
+ if value['name'] == name:
+ return client.delete("/object_categories/{}".format(key))
+
+
+def delete_object_categories_without_id(client):
+ req = client.delete("/object_categories/{}".format(""))
+ return req
+
+
+def test_get_object_categories():
+ client = utilities.register_client()
+ req, object_categories = get_object_categories(client)
+ assert req.status_code == 200
+ assert isinstance(object_categories, dict)
+ assert "object_categories" in object_categories
+
+
+def test_add_object_categories():
+ client = utilities.register_client()
+ req, object_categories = add_object_categories(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(object_categories, dict)
+ value = list(object_categories["object_categories"].values())[0]
+ assert "object_categories" in object_categories
+ assert value['name'] == "testuser"
+ assert value['description'] == "description of {}".format("testuser")
+
+
+def test_add_object_categories_with_existed_name():
+ client = utilities.register_client()
+ name = uuid4().hex
+ req, object_categories = add_object_categories(client, name)
+ assert req.status_code == 200
+ req, object_categories = add_object_categories(client, name)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Object Category Existing'
+
+
+def test_add_object_categories_name_contain_space():
+ client = utilities.register_client()
+ req, subject_categories = add_object_categories(client, " ")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Category Name Invalid'
+
+
+def test_add_object_categories_with_empty_name():
+ client = utilities.register_client()
+ req, object_categories = add_object_categories(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_object_categories_with_name_contain_space():
+ client = utilities.register_client()
+ req, object_categories = add_object_categories(client, "test<a>user")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_object_categories():
+ client = utilities.register_client()
+ req = delete_object_categories(client, "testuser")
+ assert req.status_code == 200
+
+
+def test_delete_object_categories_without_id():
+ client = utilities.register_client()
+ req = delete_object_categories_without_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Object Category Unknown"
+
+
+# ---------------------------------------------------------------------------
+# action_categories_test
+
+def get_action_categories(client):
+ req = client.get("/action_categories")
+ action_categories = utilities.get_json(req.data)
+ return req, action_categories
+
+
+def add_action_categories(client, name):
+ data = {
+ "name": name,
+ "description": "description of {}".format(name)
+ }
+ req = client.post("/action_categories", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ action_categories = utilities.get_json(req.data)
+ return req, action_categories
+
+
+def delete_action_categories(client, name):
+ request, action_categories = get_action_categories(client)
+ for key, value in action_categories['action_categories'].items():
+ if value['name'] == name:
+ return client.delete("/action_categories/{}".format(key))
+
+
+def delete_action_categories_without_id(client):
+ req = client.delete("/action_categories/{}".format(""))
+ return req
+
+
+def test_get_action_categories():
+ client = utilities.register_client()
+ req, action_categories = get_action_categories(client)
+ assert req.status_code == 200
+ assert isinstance(action_categories, dict)
+ assert "action_categories" in action_categories
+
+
+def test_add_action_categories():
+ client = utilities.register_client()
+ req, action_categories = add_action_categories(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(action_categories, dict)
+ value = list(action_categories["action_categories"].values())[0]
+ assert "action_categories" in action_categories
+ assert value['name'] == "testuser"
+ assert value['description'] == "description of {}".format("testuser")
+
+
+def test_add_action_categories_with_existed_name():
+ client = utilities.register_client()
+ name = uuid4().hex
+ req, action_categories = add_action_categories(client, name)
+ assert req.status_code == 200
+ req, action_categories = add_action_categories(client, name)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Action Category Existing'
+
+
+def test_add_action_categories_name_contain_space():
+ client = utilities.register_client()
+ req, subject_categories = add_action_categories(client, " ")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Category Name Invalid'
+
+
+def test_add_action_categories_with_empty_name():
+ client = utilities.register_client()
+ req, action_categories = add_action_categories(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_action_categories_with_name_contain_space():
+ client = utilities.register_client()
+ req, action_categories = add_action_categories(client, "test<a>user")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_delete_action_categories():
+ client = utilities.register_client()
+ req = delete_action_categories(client, "testuser")
+ assert req.status_code == 200
+
+
+def test_delete_action_categories_without_id():
+ client = utilities.register_client()
+ req = delete_action_categories_without_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Action Category Unknown"
+
+
+def test_delete_data_categories_connected_to_meta_rule():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ client = utilities.register_client()
+ req = client.delete("/subject_categories/{}".format(subject_category_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Subject Category With Meta Rule Error'
+
+ req = client.delete("/object_categories/{}".format(object_category_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Object Category With Meta Rule Error'
+
+ req = client.delete("/action_categories/{}".format(action_category_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Action Category With Meta Rule Error'
diff --git a/old/moon_manager/tests/unit_python/api/test_meta_rules.py b/old/moon_manager/tests/unit_python/api/test_meta_rules.py
new file mode 100644
index 00000000..634f19da
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_meta_rules.py
@@ -0,0 +1,415 @@
+import json
+import api.utilities as utilities
+from helpers import category_helper
+from helpers import data_builder
+from uuid import uuid4
+
+
+def get_meta_rules(client):
+ req = client.get("/meta_rules")
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def add_meta_rules(client, name, data=None):
+ if not data:
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id = list(action_category.keys())[0]
+
+ data = {
+ "name": name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ req = client.post("/meta_rules", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def add_meta_rules_without_category_ids(client, name):
+ data = {
+ "name": name + uuid4().hex,
+ "subject_categories": [],
+ "object_categories": [],
+ "action_categories": []
+ }
+ req = client.post("/meta_rules", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def update_meta_rules(client, name, metaRuleId, data=None):
+ if not data:
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name update" + uuid4().hex,
+ "description": "description 1"})
+ subject_category_id = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name update" + uuid4().hex,
+ "description": "description 1"})
+ object_category_id = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name update" + uuid4().hex,
+ "description": "description 1"})
+ action_category_id = list(action_category.keys())[0]
+ data = {
+ "name": name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+
+ req = client.patch("/meta_rules/{}".format(metaRuleId), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def update_meta_rules_with_categories(client, name, data=None, meta_rule_id=None):
+ if not meta_rule_id:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": name,
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+
+ req = client.patch("/meta_rules/{}".format(meta_rule_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ meta_rules = utilities.get_json(req.data)
+ return req, meta_rules
+
+
+def delete_meta_rules(client, name):
+ request, meta_rules = get_meta_rules(client)
+ for key, value in meta_rules['meta_rules'].items():
+ if value['name'] == name:
+ return client.delete("/meta_rules/{}".format(key))
+
+
+def delete_meta_rules_without_id(client):
+ req = client.delete("/meta_rules/{}".format(""))
+ return req
+
+
+def test_get_meta_rules():
+ client = utilities.register_client()
+ req, meta_rules = get_meta_rules(client)
+ assert req.status_code == 200
+ assert isinstance(meta_rules, dict)
+ assert "meta_rules" in meta_rules
+
+
+def test_add_meta_rules():
+ client = utilities.register_client()
+ meta_rule_name = uuid4().hex
+ req, meta_rules = add_meta_rules(client, meta_rule_name)
+ assert req.status_code == 200
+ assert isinstance(meta_rules, dict)
+ value = list(meta_rules["meta_rules"].values())[0]
+ assert "meta_rules" in meta_rules
+ assert value['name'] == meta_rule_name
+
+
+def test_add_two_meta_rules_with_same_categories_combination():
+ client = utilities.register_client()
+ meta_rule_name = uuid4().hex
+ req, meta_rules = add_meta_rules(client, meta_rule_name)
+ assert req.status_code == 200
+ for meta_rule_id in meta_rules['meta_rules']:
+ if meta_rules['meta_rules'][meta_rule_id]['name'] == meta_rule_name:
+ data = meta_rules['meta_rules'][meta_rule_id]
+
+ data['name'] = uuid4().hex
+ req, meta_rules = add_meta_rules(client, name=data['name'], data=data)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Meta Rule Existing'
+
+
+def test_add_three_meta_rules_with_different_combination_but_similar_items():
+ client = utilities.register_client()
+ meta_rule_name1 = uuid4().hex
+ req, meta_rules = add_meta_rules(client, meta_rule_name1)
+ assert req.status_code == 200
+ for meta_rule_id in meta_rules['meta_rules']:
+ if meta_rules['meta_rules'][meta_rule_id]['name'] == meta_rule_name1:
+ data = meta_rules['meta_rules'][meta_rule_id]
+ break
+
+ meta_rule_name2 = uuid4().hex
+
+ req, meta_rules = add_meta_rules(client, meta_rule_name2)
+
+ for meta_rule_id in meta_rules['meta_rules']:
+ if meta_rules['meta_rules'][meta_rule_id]['name'] == meta_rule_name2:
+ data['subject_categories'] += meta_rules['meta_rules'][meta_rule_id][
+ 'subject_categories']
+ data['object_categories'] += meta_rules['meta_rules'][meta_rule_id]['object_categories']
+ data['action_categories'] += meta_rules['meta_rules'][meta_rule_id]['action_categories']
+ break
+
+ data['name'] = uuid4().hex
+
+ req, meta_rules = add_meta_rules(client, name=data['name'], data=data)
+ assert req.status_code == 200
+
+
+def test_add_two_meta_rules_with_different_combination_but_similar_items():
+ client = utilities.register_client()
+ meta_rule_name1 = uuid4().hex
+ meta_rule_name2 = uuid4().hex
+
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id1 = list(subject_category.keys())[0]
+
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id1 = list(object_category.keys())[0]
+
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id1 = list(action_category.keys())[0]
+
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id2 = list(subject_category.keys())[0]
+
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id2 = list(object_category.keys())[0]
+
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id2 = list(action_category.keys())[0]
+
+ data = {
+ "name": meta_rule_name1,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1, object_category_id2],
+ "action_categories": [action_category_id1, action_category_id2]
+ }
+ req, meta_rules = add_meta_rules(client, meta_rule_name1, data=data)
+ assert req.status_code == 200
+ data = {
+ "name": meta_rule_name2,
+ "subject_categories": [subject_category_id2],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id2]
+ }
+
+ req, meta_rules = add_meta_rules(client, meta_rule_name1, data=data)
+ assert req.status_code == 200
+
+
+def test_add_meta_rule_with_existing_name_error():
+ client = utilities.register_client()
+ name = uuid4().hex
+ req, meta_rules = add_meta_rules(client, name)
+ assert req.status_code == 200
+ req, meta_rules = add_meta_rules(client, name)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Meta Rule Existing'
+
+
+def test_add_meta_rules_with_forbidden_char_in_name():
+ client = utilities.register_client()
+ req, meta_rules = add_meta_rules(client, "<a>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_meta_rules_with_blank_name():
+ client = utilities.register_client()
+ req, meta_rules = add_meta_rules(client, "")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Meta Rule Error'
+
+
+def test_add_meta_rules_without_subject_categories():
+ client = utilities.register_client()
+ name_meta_rule = uuid4().hex
+ req, meta_rules = add_meta_rules_without_category_ids(client, name_meta_rule)
+ assert req.status_code == 200
+
+
+def test_delete_meta_rules():
+ client = utilities.register_client()
+ name_meta_rule = uuid4().hex
+ req, meta_rules = add_meta_rules_without_category_ids(client, name_meta_rule)
+ meta_rule_id = next(iter(meta_rules['meta_rules']))
+ req = delete_meta_rules(client, meta_rules['meta_rules'][meta_rule_id]['name'])
+ assert req.status_code == 200
+
+
+def test_delete_meta_rules_without_id():
+ client = utilities.register_client()
+ req = delete_meta_rules_without_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Meta Rule Unknown"
+
+
+def test_update_meta_rules():
+ client = utilities.register_client()
+ req = add_meta_rules(client, "testuser")
+ meta_rule_id = list(req[1]['meta_rules'])[0]
+ req_update = update_meta_rules(client, "testuser", meta_rule_id)
+ assert req_update[0].status_code == 200
+ delete_meta_rules(client, "testuser")
+ get_meta_rules(client)
+
+
+def test_update_meta_rule_with_combination_existed():
+ client = utilities.register_client()
+ meta_rule_name1 = uuid4().hex
+ req, meta_rules = add_meta_rules(client, meta_rule_name1)
+ meta_rule_id1 = next(iter(meta_rules['meta_rules']))
+ data1 = meta_rules['meta_rules'][meta_rule_id1]
+
+ meta_rule_name2 = uuid4().hex
+ req, meta_rules = add_meta_rules(client, meta_rule_name2)
+ meta_rule_id2 = next(iter(meta_rules['meta_rules']))
+ data2 = meta_rules['meta_rules'][meta_rule_id2]
+ data1['name'] = data2['name']
+ req_update = update_meta_rules(client, name=meta_rule_name2, metaRuleId=meta_rule_id2,
+ data=data1)
+ assert req_update[0].status_code == 409
+ assert req_update[1]['message']== '409: Meta Rule Existing'
+
+
+def test_update_meta_rule_with_different_combination_but_same_data():
+ client = utilities.register_client()
+ meta_rule_name1 = uuid4().hex
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id1 = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id1 = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id1 = list(action_category.keys())[0]
+ subject_category = category_helper.add_subject_category(
+ value={"name": "subject category name" + uuid4().hex, "description": "description 1"})
+ subject_category_id2 = list(subject_category.keys())[0]
+ object_category = category_helper.add_object_category(
+ value={"name": "object category name" + uuid4().hex, "description": "description 1"})
+ object_category_id2 = list(object_category.keys())[0]
+ action_category = category_helper.add_action_category(
+ value={"name": "action category name" + uuid4().hex, "description": "description 1"})
+ action_category_id2 = list(action_category.keys())[0]
+
+ data = {
+ "name": meta_rule_name1,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1, object_category_id2],
+ "action_categories": [action_category_id1, action_category_id2]
+ }
+ req, meta_rules = add_meta_rules(client, meta_rule_name1, data=data)
+ assert req.status_code == 200
+
+ meta_rule_name2 = uuid4().hex
+ req, meta_rules = add_meta_rules(client, meta_rule_name2)
+ meta_rule_id2 = next(iter(meta_rules['meta_rules']))
+ data2 = {
+ "name": meta_rule_name2,
+ "subject_categories": [subject_category_id1, subject_category_id2],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id1,action_category_id2]
+ }
+
+ req_update = update_meta_rules(client, name=meta_rule_name2, metaRuleId=meta_rule_id2,
+ data=data2)
+ assert req_update[0].status_code == 200
+
+
+def test_update_meta_rules_without_id():
+ client = utilities.register_client()
+ req_update = update_meta_rules(client, "testuser", "")
+ assert req_update[0].status_code == 400
+ assert json.loads(req_update[0].data)["message"] == "400: Meta Rule Unknown"
+
+
+def test_update_meta_rules_without_name():
+ client = utilities.register_client()
+ req_update = update_meta_rules(client, "<br/>", "1234567")
+ assert req_update[0].status_code == 400
+ assert json.loads(req_update[0].data)[
+ "message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_update_meta_rules_without_categories():
+ client = utilities.register_client()
+ req_update = update_meta_rules_with_categories(client, "testuser")
+ assert req_update[0].status_code == 200
+
+
+def test_update_meta_rules_with_empty_categories():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [""],
+ "object_categories": [""],
+ "action_categories": [""]
+ }
+ req_update = update_meta_rules_with_categories(client, "testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status_code == 400
+ assert req_update[1]['message'] == '400: Subject Category Unknown'
+
+
+def test_update_meta_rules_with_empty_action_category():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [""]
+ }
+ req_update = update_meta_rules_with_categories(client, "testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status_code == 400
+ assert req_update[1]['message'] == '400: Action Category Unknown'
+
+
+def test_update_meta_rules_with_empty_object_category():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [subject_category_id],
+ "object_categories": [""],
+ "action_categories": [action_category_id]
+ }
+ req_update = update_meta_rules_with_categories(client, "testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status_code == 400
+ assert req_update[1]['message'] == '400: Object Category Unknown'
+
+
+def test_update_meta_rules_with_categories_and_one_empty():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = data_builder.create_new_meta_rule()
+ data = {
+ "name": "testuser",
+ "subject_categories": [subject_category_id, ""],
+ "object_categories": [object_category_id, ""],
+ "action_categories": [action_category_id, ""]
+ }
+ req_update = update_meta_rules_with_categories(client, "testuser", data=data,
+ meta_rule_id=meta_rule_id)
+ assert req_update[0].status_code == 400
+ assert req_update[1]['message'] == '400: Subject Category Unknown'
diff --git a/old/moon_manager/tests/unit_python/api/test_pdp.py b/old/moon_manager/tests/unit_python/api/test_pdp.py
new file mode 100644
index 00000000..53a87b21
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_pdp.py
@@ -0,0 +1,164 @@
+import json
+import api.utilities as utilities
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+def get_pdp(client):
+ req = client.get("/pdp")
+ pdp = utilities.get_json(req.data)
+ return req, pdp
+
+
+def add_pdp(client, data):
+ req = client.post("/pdp", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ pdp = utilities.get_json(req.data)
+ return req, pdp
+
+
+def update_pdp(client, data, pdp_id):
+ req = client.patch("/pdp/{}".format(pdp_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ pdp = utilities.get_json(req.data)
+ return req, pdp
+
+
+def delete_pdp(client, key):
+ req = client.delete("/pdp/{}".format(key))
+ return req
+
+
+def delete_pdp_without_id(client):
+ req = client.delete("/pdp/{}".format(""))
+ return req
+
+
+def test_get_pdp():
+ client = utilities.register_client()
+ req, pdp = get_pdp(client)
+ assert req.status_code == 200
+ assert isinstance(pdp, dict)
+ assert "pdps" in pdp
+
+
+def test_add_pdp():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data = {
+ "name": "testuser",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id",
+ "description": "description of testuser"
+ }
+ client = utilities.register_client()
+ req, pdp = add_pdp(client, data)
+ assert req.status_code == 200
+ assert isinstance(pdp, dict)
+ value = list(pdp["pdps"].values())[0]
+ assert "pdps" in pdp
+ assert value['name'] == "testuser"
+ assert value["description"] == "description of {}".format("testuser")
+ assert value["keystone_project_id"] == "keystone_project_id"
+
+
+def test_delete_pdp():
+ client = utilities.register_client()
+ request, pdp = get_pdp(client)
+ success_req = None
+ for key, value in pdp['pdps'].items():
+ if value['name'] == "testuser":
+ success_req = delete_pdp(client, key)
+ break
+ assert success_req
+ assert success_req.status_code == 200
+
+
+def test_add_pdp_with_forbidden_char_in_user():
+ data = {
+ "name": "<a>",
+ "security_pipeline": ["policy_id_1", "policy_id_2"],
+ "keystone_project_id": "keystone_project_id",
+ "description": "description of testuser"
+ }
+ client = utilities.register_client()
+ req, models = add_pdp(client, data)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_pdp_with_forbidden_char_in_keystone():
+ data = {
+ "name": "testuser",
+ "security_pipeline": ["policy_id_1", "policy_id_2"],
+ "keystone_project_id": "<a>",
+ "description": "description of testuser"
+ }
+ client = utilities.register_client()
+ req, meta_rules = add_pdp(client, data)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'keystone_project_id', [Forbidden characters in string]"
+
+
+def test_update_pdp():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1"+uuid4().hex,
+ object_category_name="object_category1"+uuid4().hex,
+ action_category_name="action_category1"+uuid4().hex,
+ meta_rule_name="meta_rule_1"+uuid4().hex,
+ model_name="model1"+uuid4().hex)
+ data_add = {
+ "name": "testuser",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id",
+ "description": "description of testuser"
+ }
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id_update = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ data_update = {
+ "name": "testuser",
+ "security_pipeline": [policy_id_update],
+ "keystone_project_id": "keystone_project_id_update",
+ "description": "description of testuser"
+ }
+ client = utilities.register_client()
+ req = add_pdp(client, data_add)
+ pdp_id = list(req[1]['pdps'])[0]
+ req_update = update_pdp(client, data_update, pdp_id)
+ assert req_update[0].status_code == 200
+ value = list(req_update[1]["pdps"].values())[0]
+ assert value["keystone_project_id"] == "keystone_project_id_update"
+ request, pdp = get_pdp(client)
+ for key, value in pdp['pdps'].items():
+ if value['name'] == "testuser":
+ delete_pdp(client, key)
+ break
+
+
+def test_update_pdp_without_id():
+ client = utilities.register_client()
+ req_update = update_pdp(client, "testuser", "")
+ assert req_update[0].status_code == 400
+ assert json.loads(req_update[0].data)["message"] == 'Invalid Key :name not found'
+
+
+def test_update_pdp_without_user():
+ data = {
+ "name": "",
+ "security_pipeline": ["policy_id_1", "policy_id_2"],
+ "keystone_project_id": "keystone_project_id",
+ "description": "description of testuser"
+ }
+ client = utilities.register_client()
+ req_update = update_pdp(client, data, "<a>")
+ assert req_update[0].status_code == 400
+ assert json.loads(req_update[0].data)["message"] == "Forbidden characters in string"
diff --git a/old/moon_manager/tests/unit_python/api/test_perimeter.py b/old/moon_manager/tests/unit_python/api/test_perimeter.py
new file mode 100644
index 00000000..ff7b09d7
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_perimeter.py
@@ -0,0 +1,1028 @@
+# import moon_manager
+# import moon_manager.api
+import json
+import api.utilities as utilities
+from helpers import data_builder as builder
+import helpers.policy_helper as policy_helper
+from uuid import uuid4
+
+
+def get_subjects(client):
+ req = client.get("/subjects")
+ subjects = utilities.get_json(req.data)
+ return req, subjects
+
+
+def add_subjects(client, policy_id, name, perimeter_id=None, data=None):
+ if not data:
+ name = name + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ if not perimeter_id:
+ req = client.post("/policies/{}/subjects".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ else:
+ req = client.post("/policies/{}/subjects/{}".format(policy_id, perimeter_id),
+ data=json.dumps(
+ data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ return req, subjects
+
+
+def delete_subjects_without_perimeter_id(client):
+ req = client.delete("/subjects/{}".format(""))
+ return req
+
+
+def test_perimeter_get_subject():
+ client = utilities.register_client()
+ req, subjects = get_subjects(client)
+ assert req.status_code == 200
+ assert isinstance(subjects, dict)
+ assert "subjects" in subjects
+
+
+def test_perimeter_add_subject():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ req, subjects = add_subjects(client, policy_id, "testuser")
+ value = list(subjects["subjects"].values())[0]
+ assert req.status_code == 200
+ assert value["name"]
+ assert value["email"]
+
+
+def test_perimeter_add_same_subject_perimeter_id_with_new_policy_id():
+ client = utilities.register_client()
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ name = "testuser"
+ perimeter_id = uuid4().hex
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ add_subjects(client, policy_id1, data['name'], perimeter_id=perimeter_id, data=data)
+ policies2 = policy_helper.add_policies()
+ policy_id2 = list(policies2.keys())[0]
+ req, subjects = add_subjects(client, policy_id2, data['name'],
+ perimeter_id=perimeter_id, data=data)
+ value = list(subjects["subjects"].values())[0]
+ assert req.status_code == 200
+ assert value["name"]
+ assert value["email"]
+ assert len(value['policy_list']) == 2
+ assert policy_id1 in value['policy_list']
+ assert policy_id2 in value['policy_list']
+
+
+def test_perimeter_add_same_subject_perimeter_id_with_different_name():
+ client = utilities.register_client()
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id = uuid4().hex
+ add_subjects(client, policy_id1, "testuser", perimeter_id=perimeter_id)
+ policies2 = policy_helper.add_policies()
+ policy_id2 = list(policies2.keys())[0]
+ req, subjects = add_subjects(client, policy_id2, "testuser", perimeter_id=perimeter_id)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_add_same_subject_name_with_new_policy_id():
+ client = utilities.register_client()
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id = uuid4().hex
+ name = "testuser" + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ req, subjects = add_subjects(client, policy_id1, None, perimeter_id=perimeter_id,
+ data=data)
+ policies2 = policy_helper.add_policies()
+ policy_id2 = list(policies2.keys())[0]
+ value = list(subjects["subjects"].values())[0]
+ data = {
+ "name": value['name'],
+ "description": "description of {}".format(value['name']),
+ "password": "password for {}".format(value['name']),
+ "email": "{}@moon".format(value['name'])
+ }
+ req, subjects = add_subjects(client, policy_id2, None, data=data)
+ value = list(subjects["subjects"].values())[0]
+ assert req.status_code == 200
+ assert value["name"]
+ assert value["email"]
+ assert len(value['policy_list']) == 2
+ assert policy_id1 in value['policy_list']
+ assert policy_id2 in value['policy_list']
+
+
+def test_perimeter_add_same_subject_name_with_same_policy_id():
+ client = utilities.register_client()
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id = uuid4().hex
+ name = "testuser" + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ req, subjects = add_subjects(client, policy_id1, None, perimeter_id=perimeter_id,
+ data=data)
+ value = list(subjects["subjects"].values())[0]
+ data = {
+ "name": value['name'],
+ "description": "description of {}".format(value['name']),
+ "password": "password for {}".format(value['name']),
+ "email": "{}@moon".format(value['name'])
+ }
+ req, subjects = add_subjects(client, policy_id1, None, data=data)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_same_subject_perimeter_id_with_existed_policy_id_in_list():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ name = "testuser" + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ req, subjects = add_subjects(client, policy_id, name, data=data)
+ perimeter_id = list(subjects["subjects"].values())[0]['id']
+ req, subjects = add_subjects(client, policy_id, name, perimeter_id=perimeter_id, data=data)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_subject_invalid_policy_id():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ name = "testuser"
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ req, subjects = add_subjects(client, policy_id + "0", "testuser", data)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_subject_policy_id_none():
+ client = utilities.register_client()
+ name = "testuser"
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ "password": "password for {}".format(name),
+ "email": "{}@moon".format(name)
+ }
+ req, subjects = add_subjects(client, None, "testuser", data)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_subject_with_forbidden_char_in_name():
+ client = utilities.register_client()
+ data = {
+ "name": "<a>",
+ "description": "description of {}".format(""),
+ "password": "password for {}".format(""),
+ "email": "{}@moon".format("")
+ }
+ req = client.post("/policies/{}/subjects".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_update_subject_name():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ req, subjects = add_subjects(client, policy_id, "testuser")
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update"
+ }
+ req = client.patch("/subjects/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["subjects"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] == value2['description']
+
+
+def test_perimeter_update_subject_description():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ req, subjects = add_subjects(client, policy_id, "testuser")
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update",
+ }
+ req = client.patch("/subjects/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["subjects"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_subject_description_and_name():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ req, subjects = add_subjects(client, policy_id, "testuser")
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update",
+ 'name': value1['name'] + "update"
+ }
+ req = client.patch("/subjects/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["subjects"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_subject_wrong_id():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, subjects = add_subjects(client, policy_id=policy_id1, name='testuser', data=data)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/subjects/{}".format(perimeter_id + "wrong"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_update_subject_name_with_existed_one():
+ client = utilities.register_client()
+ name1 = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ perimeter_id1 = uuid4().hex
+ req, subjects = add_subjects(client, policy_id=policy_id1, name=name1,
+ perimeter_id=perimeter_id1)
+ value1 = list(subjects["subjects"].values())[0]
+ perimeter_id2 = uuid4().hex
+ name2 = 'testuser' + uuid4().hex
+ req, subjects = add_subjects(client, policy_id=policy_id1, name=name2,
+ perimeter_id=perimeter_id2)
+ data = {
+ 'name': value1['name'],
+ }
+ req = client.patch("/subjects/{}".format(perimeter_id2), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 409
+
+
+def test_perimeter_delete_subject():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ req, subjects = add_subjects(client, policy_id, "testuser")
+ subject_id = list(subjects["subjects"].values())[0]["id"]
+ req = client.delete("/policies/{}/subjects/{}".format(policy_id, subject_id))
+ assert req.status_code == 200
+
+
+def test_perimeter_delete_subjects_without_perimeter_id():
+ client = utilities.register_client()
+ req = delete_subjects_without_perimeter_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Subject Unknown"
+
+
+def get_objects(client):
+ req = client.get("/objects")
+ objects = utilities.get_json(req.data)
+ return req, objects
+
+
+def add_objects(client, name, policyId=None, data=None, perimeter_id=None):
+ if not policyId:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policyId = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+ if not data:
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ }
+ if not perimeter_id:
+ req = client.post("/policies/{}/objects/".format(policyId), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ else:
+ req = client.post("/policies/{}/objects/{}".format(policyId, perimeter_id),
+ data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ objects = utilities.get_json(req.data)
+ return req, objects
+
+
+def delete_objects_without_perimeter_id(client):
+ req = client.delete("/objects/{}".format(""))
+ return req
+
+
+def test_perimeter_get_object():
+ client = utilities.register_client()
+ req, objects = get_objects(client)
+ assert req.status_code == 200
+ assert isinstance(objects, dict)
+ assert "objects" in objects
+
+
+def test_perimeter_add_object():
+ client = utilities.register_client()
+ req, objects = add_objects(client, "testuser")
+ value = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ assert value['name']
+
+
+def test_perimeter_add_object_with_wrong_policy_id():
+ client = utilities.register_client()
+ req, objects = add_objects(client, "testuser", policyId='wrong')
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_object_with_policy_id_none():
+ client = utilities.register_client()
+ data = {
+ "name": "testuser" + uuid4().hex,
+ "description": "description of {}".format("testuser"),
+ }
+ req = client.post("/policies/{}/objects/".format(None), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_same_object_name_with_new_policy_id():
+ client = utilities.register_client()
+ req, objects = add_objects(client, "testuser")
+ value1 = list(objects["objects"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_object_perimeter_id_with_new_policy_id():
+ client = utilities.register_client()
+ req, objects = add_objects(client, "testuser")
+ value1 = list(objects["objects"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data,
+ perimeter_id=value1['id'])
+ value2 = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_object_perimeter_id_with_different_name():
+ client = utilities.register_client()
+ req, objects = add_objects(client, "testuser")
+ value1 = list(objects["objects"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'] + 'different',
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data,
+ perimeter_id=value1['id'])
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_add_same_object_name_with_same_policy_id():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+ value = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_same_object_perimeter_id_with_existed_policy_id_in_list():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+ value = list(objects["objects"].values())[0]
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data,
+ perimeter_id=value['id'])
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_update_object_name():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update"
+ }
+ req = client.patch("/objects/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ objects = utilities.get_json(req.data)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] == value2['description']
+
+
+def test_perimeter_update_object_description():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/objects/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ objects = utilities.get_json(req.data)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_object_description_and_name():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/objects/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ objects = utilities.get_json(req.data)
+ value2 = list(objects["objects"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_object_wrong_id():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data)
+
+ value1 = list(objects["objects"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/objects/{}".format(perimeter_id + "wrong"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+
+
+def test_perimeter_update_object_name_with_existed_one():
+ client = utilities.register_client()
+ name = 'testuser' + uuid4().hex
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data1 = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data1)
+ value1 = list(objects["objects"].values())[0]
+
+ name = 'testuser' + uuid4().hex
+
+ data2 = {
+ "name": name,
+ "description": "description of {}".format('testuser'),
+ }
+ req, objects = add_objects(client, 'testuser', policyId=policy_id1, data=data2)
+
+ value2 = list(objects["objects"].values())[0]
+ perimeter_id2 = value2['id']
+
+ data3 = {
+ 'name': value1['name']
+ }
+ req = client.patch("/objects/{}".format(perimeter_id2), data=json.dumps(data3),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Object Existing'
+
+
+def test_perimeter_add_object_without_name():
+ client = utilities.register_client()
+ data = {
+ "name": "<br/>",
+ "description": "description of {}".format(""),
+ }
+ req = client.post("/policies/{}/objects/".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_add_object_with_name_contain_spaces():
+ client = utilities.register_client()
+ data = {
+ "name": "test<a>user",
+ "description": "description of {}".format("test user"),
+ }
+ req = client.post("/policies/{}/objects/".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_delete_object():
+ client = utilities.register_client()
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ object_id = builder.create_object(policy_id)
+ req = client.delete("/policies/{}/objects/{}".format(policy_id, object_id))
+ assert req.status_code == 200
+
+
+def test_perimeter_delete_objects_without_perimeter_id():
+ client = utilities.register_client()
+ req = delete_objects_without_perimeter_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Object Unknown"
+
+
+def get_actions(client):
+ req = client.get("/actions")
+ actions = utilities.get_json(req.data)
+ return req, actions
+
+
+def add_actions(client, name, policy_id=None, data=None, perimeter_id=None):
+ if not policy_id:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex,
+ model_name="model1" + uuid4().hex)
+
+ if not data:
+ data = {
+ "name": name + uuid4().hex,
+ "description": "description of {}".format(name),
+ }
+ if not perimeter_id:
+ req = client.post("/policies/{}/actions/".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ else:
+ req = client.post("/policies/{}/actions/{}".format(policy_id, perimeter_id),
+ data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ actions = utilities.get_json(req.data)
+ return req, actions
+
+
+def delete_actions_without_perimeter_id(client):
+ req = client.delete("/actions/{}".format(""))
+ return req
+
+
+def test_perimeter_get_actions():
+ client = utilities.register_client()
+ req, actions = get_actions(client)
+ assert req.status_code == 200
+ assert isinstance(actions, dict)
+ assert "actions" in actions
+
+
+def test_perimeter_add_actions():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser")
+ value = list(actions["actions"].values())[0]
+ assert req.status_code == 200
+ assert value['name']
+
+
+def test_perimeter_add_action_with_wrong_policy_id():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser", policy_id="wrong")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_action_with_policy_id_none():
+ client = utilities.register_client()
+ data = {
+ "name": "testuser" + uuid4().hex,
+ "description": "description of {}".format("testuser"),
+ }
+ req = client.post("/policies/{}/actions/".format(None), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
+
+
+def test_perimeter_add_same_action_name_with_new_policy_id():
+ client = utilities.register_client()
+ req, action = add_actions(client, "testuser")
+ value1 = list(action["actions"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions(client, 'testuser', policy_id=policy_id1, data=data)
+ value2 = list(action["actions"].values())[0]
+ assert req.status_code == 200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_action_perimeter_id_with_new_policy_id():
+ client = utilities.register_client()
+ req, action = add_actions(client, "testuser")
+ value1 = list(action["actions"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions(client, 'testuser', policy_id=policy_id1, data=data,
+ perimeter_id=value1['id'])
+ value2 = list(action["actions"].values())[0]
+ assert req.status_code == 200
+ assert value1['id'] == value2['id']
+ assert value1['name'] == value2['name']
+
+
+def test_perimeter_add_same_action_perimeter_id_with_different_name():
+ client = utilities.register_client()
+ req, action = add_actions(client, "testuser")
+ value1 = list(action["actions"].values())[0]
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ data = {
+ "name": value1['name'] + 'different',
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions(client, 'testuser', policy_id=policy_id1, data=data,
+ perimeter_id=value1['id'])
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_add_same_action_name_with_same_policy_id():
+ client = utilities.register_client()
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ req, action = add_actions(client, "testuser", policy_id=policy_id1)
+ value1 = list(action["actions"].values())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions(client, 'testuser', policy_id=policy_id1, data=data)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_same_action_perimeter_id_with_existed_policy_id_in_list():
+ client = utilities.register_client()
+ policies1 = policy_helper.add_policies()
+ policy_id1 = list(policies1.keys())[0]
+ req, action = add_actions(client, "testuser", policy_id=policy_id1)
+ value1 = list(action["actions"].values())[0]
+ data = {
+ "name": value1['name'],
+ "description": "description of {}".format('testuser'),
+ }
+ req, action = add_actions(client, 'testuser', policy_id=policy_id1, data=data,
+ perimeter_id=value1['id'])
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_perimeter_add_actions_without_name():
+ client = utilities.register_client()
+ data = {
+ "name": "<a>",
+ "description": "description of {}".format(""),
+ }
+ req = client.post("/policies/{}/actions".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_perimeter_add_actions_with_name_contain_spaces():
+ client = utilities.register_client()
+ data = {
+ "name": "test<a>user",
+ "description": "description of {}".format("test user"),
+ }
+ req = client.post("/policies/{}/actions".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_subjects_without_policy_id():
+ client = utilities.register_client()
+ data = {
+ "name": "testuser",
+ "description": "description of {}".format("test user"),
+ }
+ req = client.post("/policies/{}/subjects".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+
+def test_add_objects_without_policy_id():
+ client = utilities.register_client()
+ data = {
+ "name": "testuser",
+ "description": "description of {}".format("test user"),
+ }
+ req = client.post("/policies/{}/objects".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+
+def test_add_action_without_policy_id():
+ client = utilities.register_client()
+ data = {
+ "name": "testuser",
+ "description": "description of {}".format("test user"),
+ }
+ req = client.post("/policies/{}/actions".format("111"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+
+def test_perimeter_update_action_name():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser")
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update"
+ }
+ req = client.patch("/actions/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["actions"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] == value2['description']
+
+
+def test_perimeter_update_actions_description():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser")
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/actions/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["actions"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_actions_description_and_name():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser")
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/actions/{}".format(perimeter_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ subjects = utilities.get_json(req.data)
+ value2 = list(subjects["actions"].values())[0]
+ assert req.status_code == 200
+ assert value1['name'] + 'update' == value2['name']
+ assert value1['id'] == value2['id']
+ assert value1['description'] + 'update' == value2['description']
+
+
+def test_perimeter_update_action_wrong_id():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser")
+ value1 = list(actions["actions"].values())[0]
+ perimeter_id = value1['id']
+ data = {
+ 'name': value1['name'] + "update",
+ 'description': value1['description'] + "update"
+ }
+ req = client.patch("/actions/{}".format(perimeter_id + "wrong"), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Perimeter content is invalid.'
+
+
+def test_perimeter_update_action_name_with_existed_one():
+ client = utilities.register_client()
+ req, actions = add_actions(client, "testuser")
+ value1 = list(actions["actions"].values())[0]
+ req, actions = add_actions(client, "testuser")
+ value2 = list(actions["actions"].values())[0]
+ perimeter_id2 = value2['id']
+ data = {
+ 'name': value1['name'],
+ }
+ req = client.patch("/actions/{}".format(perimeter_id2), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Action Existing'
+
+
+def test_perimeter_delete_actions():
+ client = utilities.register_client()
+
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ action_id = builder.create_action(policy_id)
+ req = client.delete("/policies/{}/actions/{}".format(policy_id, action_id))
+ assert req.status_code == 200
+
+
+def test_delete_subject_without_policy():
+ client = utilities.register_client()
+
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ action_id = builder.create_action(policy_id)
+
+ req = client.delete("/subjects/{}".format(action_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+
+def test_delete_objects_without_policy():
+ client = utilities.register_client()
+
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ action_id = builder.create_action(policy_id)
+
+ req = client.delete("/objects/{}".format(action_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+
+def test_delete_actions_without_policy():
+ client = utilities.register_client()
+
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+
+ action_id = builder.create_action(policy_id)
+
+ req = client.delete("/actions/{}".format(action_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+
+def test_perimeter_delete_actions_without_perimeter_id():
+ client = utilities.register_client()
+ req = delete_actions_without_perimeter_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Action Unknown"
diff --git a/old/moon_manager/tests/unit_python/api/test_policies.py b/old/moon_manager/tests/unit_python/api/test_policies.py
new file mode 100644
index 00000000..76161d53
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_policies.py
@@ -0,0 +1,342 @@
+# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import json
+from uuid import uuid4
+import api.utilities as utilities
+from helpers import model_helper
+from helpers import policy_helper
+from helpers import data_builder
+
+
+def get_policies(client):
+ req = client.get("/policies")
+ policies = utilities.get_json(req.data)
+ return req, policies
+
+
+def add_policies(client, name):
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policies = utilities.get_json(req.data)
+ return req, policies
+
+
+def delete_policies_without_id(client):
+ req = client.delete("/policies/{}".format(""))
+ return req
+
+
+def test_get_policies():
+ client = utilities.register_client()
+ req, policies = get_policies(client)
+ assert req.status_code == 200
+ assert isinstance(policies, dict)
+ assert "policies" in policies
+
+
+def test_add_policies():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req, policies = add_policies(client, policy_name)
+ assert req.status_code == 200
+ assert isinstance(policies, dict)
+ value = list(policies["policies"].values())[0]
+ assert "policies" in policies
+ assert value['name'] == policy_name
+ assert value["description"] == "description of {}".format(policy_name)
+
+
+def test_add_policies_without_model():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": "",
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ assert req.status_code == 200
+
+
+def test_add_policies_with_same_name():
+ name = uuid4().hex
+ policy_name = name
+ client = utilities.register_client()
+ req, policies = add_policies(client, policy_name)
+ assert req.status_code == 200
+ assert isinstance(policies, dict)
+ value = list(policies["policies"].values())[0]
+ assert "policies" in policies
+ assert value['name'] == policy_name
+ assert value["description"] == "description of {}".format(policy_name)
+ client = utilities.register_client()
+ req, policies = add_policies(client, policy_name)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_add_policy_with_empty_name():
+ policy_name = ""
+ client = utilities.register_client()
+ req, policies = add_policies(client, policy_name)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Content Error'
+
+
+def test_update_policies_with_model():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": "",
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id = next(iter(utilities.get_json(req.data)['policies']))
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name + "-2",
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.patch("/policies/{}".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+ assert json.loads(req.data)['policies'][policy_id]['name'] == policy_name + '-2'
+
+
+def test_update_policies_name_success():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id = next(iter(utilities.get_json(req.data)['policies']))
+
+ data = {
+ "name": policy_name + "-2",
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.patch("/policies/{}".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+ assert json.loads(req.data)['policies'][policy_id]['name'] == policy_name + '-2'
+
+
+def test_update_policies_model_unused():
+ policy_name = uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id = next(iter(utilities.get_json(req.data)['policies']))
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.patch("/policies/{}".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+
+
+def test_update_policy_name_with_existed_one():
+ policy_name1 = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name1,
+ "description": "description of {}".format(policy_name1),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id1 = next(iter(utilities.get_json(req.data)['policies']))
+
+ policy_name2 = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name2,
+ "description": "description of {}".format(policy_name2),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id2 = next(iter(utilities.get_json(req.data)['policies']))
+
+ data = {
+ "name": policy_name1,
+ "description": "description of {}".format(policy_name1),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.patch("/policies/{}".format(policy_id2), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Policy Already Exists'
+
+
+def test_update_policies_with_empty_name():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id = next(iter(utilities.get_json(req.data)['policies']))
+
+ data = {
+ "name": "",
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.patch("/policies/{}".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Content Error'
+
+
+def test_update_policies_with_blank_model():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies/", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ policy_id = next(iter(utilities.get_json(req.data)['policies']))
+
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": "",
+ "genre": "genre"
+ }
+
+ req = client.patch("/policies/{}".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+
+
+def test_update_policies_connected_to_rules_with_blank_model():
+ client = utilities.register_client()
+ req, rules, policy_id = data_builder.add_rules(client)
+ req = client.get("/policies")
+ data = utilities.get_json(req.data)
+ for policy_obj_id in data['policies']:
+ if policy_obj_id == policy_id:
+ policy = data['policies'][policy_obj_id]
+ policy['model_id'] = ''
+ req = client.patch("/policies/{}".format(policy_id), data=json.dumps(policy),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy update error'
+
+
+def test_delete_policies():
+ client = utilities.register_client()
+
+ policy = policy_helper.add_policies()
+ policy_id = list(policy.keys())[0]
+
+ req = client.delete("/policies/{}".format(policy_id))
+ assert req.status_code == 200
+
+
+def test_delete_policy_with_dependencies_rule():
+ client = utilities.register_client()
+ req, rules, policy_id = data_builder.add_rules(client)
+ req = client.delete("/policies/{}".format(policy_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy With Rule Error'
+
+
+def test_delete_policy_with_dependencies_subject_data():
+ client = utilities.register_client()
+ req, rules, policy_id = data_builder.add_rules(client)
+ req = client.delete("/policies/{}/rules/{}".format(policy_id, next(iter(rules['rules']))))
+ assert req.status_code == 200
+ req = client.delete("/policies/{}".format(policy_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy With Data Error'
+
+
+def test_delete_policy_with_dependencies_perimeter():
+ client = utilities.register_client()
+ policy = policy_helper.add_policies()
+ policy_id = next(iter(policy))
+
+ data = {
+ "name": 'testuser'+uuid4().hex,
+ "description": "description of {}".format(uuid4().hex),
+ "password": "password for {}".format(uuid4().hex),
+ "email": "{}@moon".format(uuid4().hex)
+ }
+ req = client.post("/policies/{}/subjects".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ assert req.status_code == 200
+ req = client.delete("/policies/{}".format(policy_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy With Perimeter Error'
+
+
+def test_delete_policies_without_id():
+ client = utilities.register_client()
+ req = delete_policies_without_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Policy Unknown'
diff --git a/old/moon_manager/tests/unit_python/api/test_rules.py b/old/moon_manager/tests/unit_python/api/test_rules.py
new file mode 100644
index 00000000..a3c21839
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_rules.py
@@ -0,0 +1,129 @@
+import api.utilities as utilities
+import json
+from helpers import data_builder as builder
+from uuid import uuid4
+from helpers import policy_helper
+
+
+def get_rules(client, policy_id):
+ req = client.get("/policies/{}/rules".format(policy_id))
+ rules = utilities.get_json(req.data)
+ return req, rules
+
+
+def add_rules_without_policy_id(client):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [subject_category_id, object_category_id, action_category_id],
+ "instructions": (
+ {"decision": "grant"},
+ ),
+ "enabled": True
+ }
+ req = client.post("/policies/{}/rules".format(None), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ rules = utilities.get_json(req.data)
+ return req, rules
+
+
+def add_rules_without_meta_rule_id(client, policy_id):
+ data = {
+ "meta_rule_id": "",
+ "rule": ["subject_data_id2", "object_data_id2", "action_data_id2"],
+ "instructions": (
+ {"decision": "grant"},
+ ),
+ "enabled": True
+ }
+ req = client.post("/policies/{}/rules".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ rules = utilities.get_json(req.data)
+ return req, rules
+
+
+def add_rules_without_rule(client, policy_id):
+ data = {
+ "meta_rule_id": "meta_rule_id1",
+ "instructions": (
+ {"decision": "grant"},
+ ),
+ "enabled": True
+ }
+ req = client.post("/policies/{}/rules".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ rules = utilities.get_json(req.data)
+ return req, rules
+
+
+def delete_rules(client, policy_id, meta_rule_id):
+ req = client.delete("/policies/{}/rules/{}".format(policy_id, meta_rule_id))
+ return req
+
+
+def test_get_rules():
+ policy_id = utilities.get_policy_id()
+ client = utilities.register_client()
+ req, rules = get_rules(client, policy_id)
+ assert req.status_code == 200
+ assert isinstance(rules, dict)
+ assert "rules" in rules
+ return req, rules
+
+
+def test_add_rules():
+ client = utilities.register_client()
+ req, rules, policy = builder.add_rules(client, )
+ assert req.status_code == 200
+
+
+def test_add_rules_without_policy_id():
+ client = utilities.register_client()
+ req, rules = add_rules_without_policy_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Policy Unknown"
+
+#
+# def test_add_rules_without_meta_rule_id():
+# policy_id = utilities.get_policy_id()
+# client = utilities.register_client()
+# req, rules = add_rules_without_meta_rule_id(client, policy_id)
+# assert req.status_code == 400
+# assert json.loads(req.data)["message"] == "Key: 'meta_rule_id', [Empty String]"
+
+
+def test_add_rules_without_rule():
+ policy_id = utilities.get_policy_id()
+ client = utilities.register_client()
+ req, rules = add_rules_without_rule(client, policy_id)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == 'Invalid Key :rule not found'
+
+
+def test_delete_rules_with_invalid_parameters():
+ client = utilities.register_client()
+ req = delete_rules(client, "", "")
+ assert req.status_code == 404
+ # assert json.loads(req.data)["message"] == 'Invalid Key :rule not found'
+
+
+def test_delete_rules_without_policy_id():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = builder.create_new_policy()
+ sub_data_id = builder.create_subject_data(policy_id, subject_category_id)
+ obj_data_id = builder.create_object_data(policy_id, object_category_id)
+ act_data_id = builder.create_action_data(policy_id, action_category_id)
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [sub_data_id, obj_data_id, act_data_id],
+ "instructions": (
+ {"decision": "grant"},
+ ),
+ "enabled": True
+ }
+ client.post("/policies/{}/rules".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ req, added_rules = get_rules(client, policy_id)
+ id = list(added_rules["rules"]["rules"])[0]["id"]
+ rules = delete_rules(client, None, id)
+ assert rules.status_code == 200
diff --git a/old/moon_manager/tests/unit_python/api/test_unit_models.py b/old/moon_manager/tests/unit_python/api/test_unit_models.py
new file mode 100644
index 00000000..6e93ed28
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/test_unit_models.py
@@ -0,0 +1,352 @@
+# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import json
+import api.utilities as utilities
+from helpers import data_builder as builder
+from helpers import policy_helper
+from helpers import model_helper
+from uuid import uuid4
+
+
+def get_models(client):
+ req = client.get("/models")
+ models = utilities.get_json(req.data)
+ return req, models
+
+
+def add_models(client, name, data=None):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+
+ if not data:
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ req = client.post("/models", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ models = utilities.get_json(req.data)
+ return req, models
+
+
+def update_model(client, name, model_id):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ req = client.patch("/models/{}".format(model_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ models = utilities.get_json(req.data)
+ return req, models
+
+
+def add_model_without_meta_rules_ids(client, name):
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": []
+ }
+ req = client.post("/models", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ models = utilities.get_json(req.data)
+ return req, models
+
+
+def add_model_with_empty_meta_rule_id(client, name):
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [""]
+ }
+ req = client.post("/models", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ models = utilities.get_json(req.data)
+ return req, models
+
+
+def update_model_without_meta_rules_ids(client, model_id):
+ name = "model_id" + uuid4().hex
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": []
+ }
+ req = client.patch("/models/{}".format(model_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ models = utilities.get_json(req.data)
+ return req, models
+
+
+def delete_models(client, name):
+ request, models = get_models(client)
+ for key, value in models['models'].items():
+ if value['name'] == name:
+ req = client.delete("/models/{}".format(key))
+ break
+ return req
+
+
+def delete_models_without_id(client):
+ req = client.delete("/models/{}".format(""))
+ return req
+
+
+def test_delete_model_assigned_to_policy():
+ policy_name = "testuser" + uuid4().hex
+ client = utilities.register_client()
+ req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(req.keys())[0]
+ data = {
+ "name": policy_name,
+ "description": "description of {}".format(policy_name),
+ "model_id": model_id,
+ "genre": "genre"
+ }
+ req = client.post("/policies", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ req = client.delete("/models/{}".format(model_id))
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Model With Policy Error'
+
+
+def clean_models():
+ client = utilities.register_client()
+ req, models = get_models(client)
+ for key, value in models['models'].items():
+ print(key)
+ print(value)
+ client.delete("/models/{}".format(key))
+
+
+def test_get_models():
+ client = utilities.register_client()
+ req, models = get_models(client)
+ assert req.status_code == 200
+ assert isinstance(models, dict)
+ assert "models" in models
+
+
+def test_add_models():
+ clean_models()
+ client = utilities.register_client()
+ req, models = add_models(client, "testuser")
+ assert req.status_code == 200
+ assert isinstance(models, dict)
+ model_id = list(models["models"])[0]
+ assert "models" in models
+ assert models['models'][model_id]['name'] == "testuser"
+ assert models['models'][model_id]["description"] == "description of {}".format("testuser")
+
+
+def test_delete_models():
+ client = utilities.register_client()
+ req = delete_models(client, "testuser")
+ assert req.status_code == 200
+
+
+def test_update_models_with_assigned_policy():
+ client = utilities.register_client()
+
+ model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(model.keys())[0]
+ value = {
+ "name": "test_policy" + uuid4().hex,
+ "model_id": model_id,
+ "description": "test",
+ }
+ policy = policy_helper.add_policies(value=value)
+ data = {
+ "name": "model_" + uuid4().hex,
+ "description": "description of model_2",
+ "meta_rules": []
+ }
+ req = client.patch("/models/{}".format(model_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Model With Policy Error"
+
+
+def test_update_models_with_no_assigned_policy():
+ client = utilities.register_client()
+
+ model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(model.keys())[0]
+
+ data = {
+ "name": "model_" + uuid4().hex,
+ "description": "description of model_2",
+ "meta_rules": []
+ }
+ req = client.patch("/models/{}".format(model_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ assert req.status_code == 200
+
+
+def test_add_models_with_meta_rule_key():
+ client = utilities.register_client()
+
+ model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex)
+ model_id = list(model.keys())[0]
+
+ data = {
+ "name": "model_" + uuid4().hex,
+ "description": "description of model_2",
+
+ }
+ req = client.patch("/models/{}".format(model_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Invalid Key :meta_rules not found"
+
+
+def test_delete_models_without_id():
+ client = utilities.register_client()
+ req = delete_models_without_id(client)
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "400: Model Unknown"
+
+
+def test_add_model_with_empty_name():
+ clean_models()
+ client = utilities.register_client()
+ req, models = add_models(client, "<br/>")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_model_with_name_contain_space():
+ clean_models()
+ client = utilities.register_client()
+ req, models = add_models(client, "test<br>user")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_add_model_with_name_space():
+ clean_models()
+ client = utilities.register_client()
+ req, models = add_models(client, " ")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Model Unknown'
+
+
+def test_add_model_with_empty_meta_rule_id():
+ clean_models()
+ client = utilities.register_client()
+ req, meta_rules = add_model_with_empty_meta_rule_id(client, "testuser")
+ assert req.status_code == 400
+ assert json.loads(req.data)["message"] == '400: Meta Rule Unknown'
+
+
+def test_add_model_with_existed_name():
+ clean_models()
+ client = utilities.register_client()
+ name = uuid4().hex
+ req, models = add_models(client, name)
+ assert req.status_code == 200
+ req, models = add_models(client, name)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Model Error'
+
+
+def test_add_model_with_existed_meta_rules_list():
+ clean_models()
+ client = utilities.register_client()
+ name = uuid4().hex
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ name = uuid4().hex
+ req, models = add_models(client=client, name=name, data=data)
+ assert req.status_code == 200
+
+ data = {
+ "name": name,
+ "description": "description of {}".format(name),
+ "meta_rules": [meta_rule_id]
+ }
+ req, models = add_models(client=client, name=name, data=data)
+ assert req.status_code == 409
+ assert json.loads(req.data)["message"] == '409: Model Error'
+
+
+def test_add_model_without_meta_rules():
+ clean_models()
+ client = utilities.register_client()
+ req, meta_rules = add_model_without_meta_rules_ids(client, "testuser")
+ assert req.status_code == 200
+ # assert json.loads(req.data)["message"] == "Key: 'meta_rules', [Empty Container]"
+
+
+def test_update_model():
+ clean_models()
+ client = utilities.register_client()
+ req = add_models(client, "testuser")
+ model_id = list(req[1]['models'])[0]
+ req_update = update_model(client, "testuser", model_id)
+ assert req_update[0].status_code == 200
+ model_id = list(req_update[1]["models"])[0]
+ assert req_update[1]["models"][model_id]["meta_rules"][0] is not None
+ delete_models(client, "testuser")
+
+
+def test_update_model_name_with_space():
+ clean_models()
+ client = utilities.register_client()
+ req = add_models(client, "testuser")
+ model_id = list(req[1]['models'])[0]
+ req_update = update_model(client, " ", model_id)
+ assert req_update[0].status_code == 400
+ assert req_update[1]["message"] == '400: Model Unknown'
+
+
+def test_update_model_with_empty_name():
+ clean_models()
+ client = utilities.register_client()
+ req = add_models(client, "testuser")
+ model_id = list(req[1]['models'])[0]
+ req_update = update_model(client, "", model_id)
+ assert req_update[0].status_code == 400
+ assert req_update[1]['message'] == '400: Model Unknown'
+
+
+def test_update_meta_rules_without_id():
+ clean_models()
+ client = utilities.register_client()
+ req_update = update_model(client, "testuser", "")
+ assert req_update[0].status_code == 400
+ assert json.loads(req_update[0].data)["message"] == "400: Model Unknown"
+
+
+def test_update_meta_rules_without_name():
+ client = utilities.register_client()
+ req_update = update_model(client, "<a></a>", "1234567")
+ assert req_update[0].status_code == 400
+ assert json.loads(req_update[0].data)[
+ "message"] == "Key: 'name', [Forbidden characters in string]"
+
+
+def test_update_meta_rules_without_meta_rules():
+ value = {
+ "name": "mls_model_id" + uuid4().hex,
+ "description": "test",
+ "meta_rules": []
+ }
+ model = model_helper.add_model(value=value)
+ model_id = list(model.keys())[0]
+ client = utilities.register_client()
+ req_update = update_model_without_meta_rules_ids(client, model_id)
+ assert req_update[0].status_code == 200
diff --git a/old/moon_manager/tests/unit_python/api/utilities.py b/old/moon_manager/tests/unit_python/api/utilities.py
new file mode 100644
index 00000000..2e51fec8
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/api/utilities.py
@@ -0,0 +1,26 @@
+import json
+from uuid import uuid4
+
+def get_json(data):
+ return json.loads(data.decode("utf-8"))
+
+
+def register_client():
+ import moon_manager.server
+ server = moon_manager.server.create_server()
+ client = server.app.test_client()
+ return client
+
+
+def get_policy_id():
+ from helpers import policy_helper
+ value = {
+ "name": "test_policy"+uuid4().hex,
+ "model_id": "",
+ "genre": "authz",
+ "description": "test",
+ }
+ policy_helper.add_policies(value=value)
+ req = policy_helper.get_policies()
+ policy_id = list(req.keys())[0]
+ return policy_id
diff --git a/old/moon_manager/tests/unit_python/conftest.py b/old/moon_manager/tests/unit_python/conftest.py
new file mode 100644
index 00000000..90a27e54
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/conftest.py
@@ -0,0 +1,254 @@
+import base64
+import json
+import logging
+import pytest
+import requests_mock
+
+CONF = {
+ "openstack": {
+ "keystone": {
+ "url": "http://keystone:5000/v3",
+ "user": "admin",
+ "check_token": False,
+ "password": "p4ssw0rd",
+ "domain": "default",
+ "certificate": False,
+ "project": "admin"
+ }
+ },
+ "components": {
+ "wrapper": {
+ "bind": "0.0.0.0",
+ "port": 8080,
+ "container": "wukongsun/moon_wrapper:v4.3",
+ "timeout": 5,
+ "hostname": "wrapper"
+ },
+ "manager": {
+ "bind": "0.0.0.0",
+ "port": 8082,
+ "container": "wukongsun/moon_manager:v4.3",
+ "hostname": "manager"
+ },
+ "port_start": 31001,
+ "orchestrator": {
+ "bind": "0.0.0.0",
+ "port": 8083,
+ "container": "wukongsun/moon_orchestrator:v4.3",
+ "hostname": "orchestrator"
+ },
+ "pipeline": {
+ "interface": {
+ "bind": "0.0.0.0",
+ "port": 8080,
+ "container": "wukongsun/moon_interface:v4.3",
+ "hostname": "interface"
+ },
+ "authz": {
+ "bind": "0.0.0.0",
+ "port": 8081,
+ "container": "wukongsun/moon_authz:v4.3",
+ "hostname": "authz"
+ },
+ }
+ },
+ "logging": {
+ "handlers": {
+ "file": {
+ "filename": "/tmp/moon.log",
+ "class": "logging.handlers.RotatingFileHandler",
+ "level": "DEBUG",
+ "formatter": "custom",
+ "backupCount": 3,
+ "maxBytes": 1048576
+ },
+ "console": {
+ "class": "logging.StreamHandler",
+ "formatter": "brief",
+ "level": "INFO",
+ "stream": "ext://sys.stdout"
+ }
+ },
+ "formatters": {
+ "brief": {
+ "format": "%(levelname)s %(name)s %(message)-30s"
+ },
+ "custom": {
+ "format": "%(asctime)-15s %(levelname)s %(name)s %(message)s"
+ }
+ },
+ "root": {
+ "handlers": [
+ "console"
+ ],
+ "level": "ERROR"
+ },
+ "version": 1,
+ "loggers": {
+ "moon": {
+ "handlers": [
+ "console",
+ "file"
+ ],
+ "propagate": False,
+ "level": "DEBUG"
+ }
+ }
+ },
+ "slave": {
+ "name": None,
+ "master": {
+ "url": None,
+ "login": None,
+ "password": None
+ }
+ },
+ "docker": {
+ "url": "tcp://172.88.88.1:2376",
+ "network": "moon"
+ },
+ "database": {
+ "url": "sqlite:///database.db",
+ # "url": "mysql+pymysql://moon:p4sswOrd1@db/moon",
+ "driver": "sql"
+ },
+ "messenger": {
+ "url": "rabbit://moon:p4sswOrd1@messenger:5672/moon"
+ },
+}
+
+COMPONENTS = (
+ "logging",
+ "openstack/keystone",
+ "database",
+ "slave",
+ "components/manager",
+ "components/orchestrator"
+)
+
+PODS = {
+ "pods": {
+ "721760dd-de5f-11e7-8001-3863bbb766f3": [
+ {
+ "pdp_id": "b3d3e18abf3340e8b635fd49e6634ccd",
+ "port": 8080,
+ "genre": "interface",
+ "name": "interface-paltry",
+ "keystone_project_id": "a64beb1cc224474fb4badd43173e7101",
+ "namespace": "moon",
+ "container": "wukongsun/moon_interface:v4.3"
+ },
+ {
+ "pdp_id": "b3d3e18abf3340e8b635fd49e6634ccd",
+ "meta_rule_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "port": 8081,
+ "genre": "authz",
+ "name": "authz-economic",
+ "policy_id": "f8f49a779ceb47b3ac810f01ef71b4e0",
+ "keystone_project_id": "a64beb1cc224474fb4badd43173e7101",
+ "namespace": "moon",
+ "container": "wukongsun/moon_authz:v4.3"
+ }
+ ]
+ }
+}
+
+SLAVES = {
+ "slaves": [
+ {
+ "context":
+ {
+ "cluster": "kubernetes",
+ "user": "kubernetes-admin"
+ },
+ "name": "kubernetes-admin@kubernetes",
+ "configured": True,
+ "wrapper_name": "mywrapper",
+ "ip": "NC",
+ "port": 31002,
+ "internal_port": 8080
+ }
+ ]
+}
+
+
+def get_b64_conf(component=None):
+ if component in CONF:
+ return base64.b64encode(
+ json.dumps(
+ CONF[component]).encode('utf-8') + b"\n").decode('utf-8')
+ elif "/" in component:
+ key1, _, key2 = component.partition("/")
+ return base64.b64encode(
+ json.dumps(
+ CONF[key1][key2]).encode('utf-8') + b"\n").decode('utf-8')
+ else:
+ return base64.b64encode(
+ json.dumps(CONF).encode('utf-8') + b"\n").decode('utf-8')
+
+
+@pytest.fixture(autouse=True)
+def no_requests(monkeypatch):
+ """ Modify the response from Requests module
+ """
+ with requests_mock.Mocker(real_http=True) as m:
+ for component in COMPONENTS:
+ m.register_uri(
+ 'GET', 'http://consul:8500/v1/kv/{}'.format(component),
+ json=[{'Key': component, 'Value': get_b64_conf(component)}]
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "111111111"}
+ )
+ m.register_uri(
+ 'DELETE', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "111111111"}
+ )
+
+ def match_request_text(request):
+ # request.url may be None, or '' prevents a TypeError.
+ return 'http://keystone:5000/v3/users?name=testuser' in request.url
+
+ m.register_uri(
+ requests_mock.ANY, '/v3/users',
+ additional_matcher=match_request_text,
+ json={"users": {}}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/users/',
+ json={"users": [{"id": "1111111111111"}]}
+ )
+ m.register_uri(
+ 'POST', 'http://orchestrator:8083/pods',
+ json=PODS,
+ headers={"content-type": "application/json"}
+ )
+ m.register_uri(
+ 'GET', 'http://orchestrator:8083/pods',
+ json=PODS
+ )
+ m.register_uri(
+ 'GET', 'http://localhost/slaves',
+ json=SLAVES
+ )
+ m.register_uri(
+ 'DELETE', 'http://orchestrator:8083/pods/{}'.format(list([PODS['pods'].keys()])[0]),
+ headers={"content-type": "application/json"}
+ )
+
+ print("Start populating the DB.")
+ from python_moondb.db_manager import init_engine, main
+ engine = init_engine()
+ print("engine={}".format(engine))
+ main("upgrade", logging.getLogger("db_manager"), engine)
+ print("End populating the DB.")
+ yield m
+
+# @pytest.fixture(autouse=True, scope="session")
+# def manage_database():
+# from moon_db.db_manager import init_engine, run
+# engine = init_engine()
+# run("upgrade", logging.getLogger("db_manager"), engine)
+# yield
+# print("Will close the DB")
diff --git a/python_moondb/tests/unit_python/policies/__init__.py b/old/moon_manager/tests/unit_python/helpers/__init__.py
index e69de29b..e69de29b 100644
--- a/python_moondb/tests/unit_python/policies/__init__.py
+++ b/old/moon_manager/tests/unit_python/helpers/__init__.py
diff --git a/old/moon_manager/tests/unit_python/helpers/assignment_helper.py b/old/moon_manager/tests/unit_python/helpers/assignment_helper.py
new file mode 100644
index 00000000..22a56e38
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/assignment_helper.py
@@ -0,0 +1,49 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+def get_action_assignments(policy_id, action_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_action_assignments("", policy_id, action_id, category_id)
+
+
+def add_action_assignment(policy_id, action_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_action_assignment("", policy_id, action_id, category_id, data_id)
+
+
+def delete_action_assignment(policy_id, action_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_action_assignment("", policy_id, action_id, category_id, data_id)
+
+
+def get_object_assignments(policy_id, object_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_object_assignments("", policy_id, object_id, category_id)
+
+
+def add_object_assignment(policy_id, object_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_object_assignment("", policy_id, object_id, category_id, data_id)
+
+
+def delete_object_assignment(policy_id, object_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_object_assignment("", policy_id, object_id, category_id, data_id)
+
+
+def get_subject_assignments(policy_id, subject_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_subject_assignments("", policy_id, subject_id, category_id)
+
+
+def add_subject_assignment(policy_id, subject_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_subject_assignment("", policy_id, subject_id, category_id, data_id)
+
+
+def delete_subject_assignment(policy_id, subject_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_subject_assignment("", policy_id, subject_id, category_id, data_id)
+
diff --git a/old/moon_manager/tests/unit_python/helpers/category_helper.py b/old/moon_manager/tests/unit_python/helpers/category_helper.py
new file mode 100644
index 00000000..6c419ca8
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/category_helper.py
@@ -0,0 +1,40 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+def add_subject_category(cat_id=None, value=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.add_subject_category(user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_subject_category(cat_id=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.get_subject_categories(user_id=None, category_id=cat_id)
+ return category
+
+
+def add_object_category(cat_id=None, value=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.add_object_category(user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_object_category(cat_id=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.get_object_categories(user_id=None, category_id=cat_id)
+ return category
+
+
+def add_action_category(cat_id=None, value=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.add_action_category(user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_action_category(cat_id=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.get_action_categories(user_id=None, category_id=cat_id)
+ return category
diff --git a/old/moon_manager/tests/unit_python/helpers/data_builder.py b/old/moon_manager/tests/unit_python/helpers/data_builder.py
new file mode 100644
index 00000000..91808cbe
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/data_builder.py
@@ -0,0 +1,260 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from .category_helper import *
+from .policy_helper import *
+from .data_helper import *
+from helpers import model_helper
+from .meta_rule_helper import *
+import api.utilities as utilities
+import json
+from uuid import uuid4
+
+
+def create_subject_category(name):
+ subject_category = add_subject_category(
+ value={"name": name + uuid4().hex, "description": "description 1"})
+ return list(subject_category.keys())[0]
+
+
+def create_object_category(name):
+ object_category = add_object_category(
+ value={"name": name + uuid4().hex, "description": "description 1"})
+ return list(object_category.keys())[0]
+
+
+def create_action_category(name):
+ action_category = add_action_category(
+ value={"name": name + uuid4().hex, "description": "description 1"})
+ return list(action_category.keys())[0]
+
+
+def create_model(meta_rule_id, model_name="test_model"):
+ value = {
+ "name": model_name + uuid4().hex,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+
+ }
+ return value
+
+
+def create_policy(model_id, policy_name="policy_1"):
+ value = {
+ "name": policy_name,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ return value
+
+
+def create_pdp(policies_ids):
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": policies_ids,
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ return value
+
+
+def create_new_policy(subject_category_name=None, object_category_name=None,
+ action_category_name=None, model_name=None, policy_name=None,
+ meta_rule_name=None):
+ if not subject_category_name:
+ subject_category_name = "subjectCategory_" + uuid4().hex
+ if not object_category_name:
+ object_category_name = "objectCategory_" + uuid4().hex
+ if not action_category_name:
+ action_category_name = "actionCategory_" + uuid4().hex
+
+ if not meta_rule_name:
+ meta_rule_name = "meta_rule_" + uuid4().hex
+
+ if not model_name:
+ model_name = "model_name_" + uuid4().hex
+ if not policy_name:
+ policy_name = "policy_name_" + uuid4().hex
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = create_new_meta_rule(
+ subject_category_name=subject_category_name + uuid4().hex,
+ object_category_name=object_category_name + uuid4().hex,
+ action_category_name=action_category_name + uuid4().hex,
+ meta_rule_name=meta_rule_name + uuid4().hex
+ )
+
+ model = model_helper.add_model(value=create_model(meta_rule_id, model_name + uuid4().hex))
+ model_id = list(model.keys())[0]
+ value = create_policy(model_id, policy_name + uuid4().hex)
+ policy = add_policies(value=value)
+ assert policy
+ policy_id = list(policy.keys())[0]
+ return subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id
+
+
+def create_new_meta_rule(subject_category_name=None, object_category_name=None,
+ action_category_name=None, meta_rule_name=None):
+ if not subject_category_name:
+ subject_category_name = "subjectCategory_" + uuid4().hex
+ if not object_category_name:
+ object_category_name = "objectCategory_" + uuid4().hex
+ if not action_category_name:
+ action_category_name = "actionCategory_" + uuid4().hex
+
+ if not meta_rule_name:
+ meta_rule_name = "meta_rule_" + uuid4().hex
+
+ subject_category_id = create_subject_category(subject_category_name)
+ object_category_id = create_object_category(object_category_name)
+ action_category_id = create_action_category(action_category_name)
+ value = {"name": meta_rule_name,
+ "description": "name of the meta rule algorithm",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rule = add_meta_rule(value=value)
+ return subject_category_id, object_category_id, action_category_id, list(meta_rule.keys())[0]
+
+
+def create_subject(policy_id):
+ value = {
+ "name": "testuser" + uuid4().hex,
+ "description": "test",
+ }
+ subject = add_subject(policy_id=policy_id, value=value)
+ return list(subject.keys())[0]
+
+
+def create_object(policy_id):
+ value = {
+ "name": "testobject" + uuid4().hex,
+ "description": "test",
+ }
+ object = add_object(policy_id=policy_id, value=value)
+ return list(object.keys())[0]
+
+
+def create_action(policy_id):
+ value = {
+ "name": "testaction" + uuid4().hex,
+ "description": "test",
+ }
+ action = add_action(policy_id=policy_id, value=value)
+ return list(action.keys())[0]
+
+
+def create_subject_data(policy_id, category_id):
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = add_subject_data(policy_id=policy_id, category_id=category_id, value=value).get(
+ 'data')
+ assert subject_data
+ return list(subject_data.keys())[0]
+
+
+def create_object_data(policy_id, category_id):
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ object_data = add_object_data(policy_id=policy_id, category_id=category_id, value=value).get(
+ 'data')
+ return list(object_data.keys())[0]
+
+
+def create_action_data(policy_id, category_id):
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ action_data = add_action_data(policy_id=policy_id, category_id=category_id, value=value).get(
+ 'data')
+ return list(action_data.keys())[0]
+
+
+def get_policy_id_with_subject_assignment():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ subject_id = create_subject(policy_id)
+ data_id = create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ data = {
+ "id": subject_id,
+ "category_id": subject_category_id,
+ "data_id": data_id
+ }
+ client.post("/policies/{}/subject_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ return policy_id
+
+
+def get_policy_id_with_object_assignment():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ object_id = create_object(policy_id)
+ data_id = create_object_data(policy_id=policy_id, category_id=object_category_id)
+
+ data = {
+ "id": object_id,
+ "category_id": object_category_id,
+ "data_id": data_id
+ }
+
+ client.post("/policies/{}/object_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ return policy_id
+
+
+def get_policy_id_with_action_assignment():
+ client = utilities.register_client()
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = create_new_policy(
+ subject_category_name="subject_category1" + uuid4().hex,
+ object_category_name="object_category1" + uuid4().hex,
+ action_category_name="action_category1" + uuid4().hex,
+ meta_rule_name="meta_rule_1" + uuid4().hex)
+ action_id = create_action(policy_id)
+ data_id = create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ data = {
+ "id": action_id,
+ "category_id": action_category_id,
+ "data_id": data_id
+ }
+ client.post("/policies/{}/action_assignments".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ return policy_id
+
+
+def add_rules(client):
+ sub_id, obj_id, act_id, meta_rule_id, policy_id = create_new_policy("sub_cat" + uuid4().hex,
+ "obj_cat" + uuid4().hex,
+ "act_cat" + uuid4().hex)
+ sub_data_id = create_subject_data(policy_id, sub_id)
+ obj_data_id = create_object_data(policy_id, obj_id)
+ act_data_id = create_action_data(policy_id, act_id)
+ data = {
+ "meta_rule_id": meta_rule_id,
+ "rule": [sub_data_id, obj_data_id, act_data_id],
+ "instructions": (
+ {"decision": "grant"},
+ ),
+ "enabled": True
+ }
+ req = client.post("/policies/{}/rules".format(policy_id), data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ rules = utilities.get_json(req.data)
+ return req, rules, policy_id
diff --git a/old/moon_manager/tests/unit_python/helpers/data_helper.py b/old/moon_manager/tests/unit_python/helpers/data_helper.py
new file mode 100644
index 00000000..e1c05640
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/data_helper.py
@@ -0,0 +1,99 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+def get_action_data(policy_id, data_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_action_data("", policy_id, data_id, category_id)
+
+
+def add_action_data(policy_id, data_id=None, category_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_action_data("", policy_id, data_id, category_id, value)
+
+
+def delete_action_data(policy_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_action_data("", policy_id=policy_id, data_id=data_id)
+
+
+def get_object_data(policy_id, data_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_object_data("", policy_id, data_id, category_id)
+
+
+def add_object_data(policy_id, data_id=None, category_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_object_data("", policy_id, data_id, category_id, value)
+
+
+def delete_object_data(policy_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_object_data("", policy_id=policy_id, data_id=data_id)
+
+
+def get_subject_data(policy_id, data_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_subject_data("", policy_id, data_id, category_id)
+
+
+def add_subject_data(policy_id, data_id=None, category_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.set_subject_data("", policy_id, data_id, category_id, value)
+
+
+def delete_subject_data(policy_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_subject_data("", policy_id=policy_id, data_id=data_id)
+
+
+def get_actions(policy_id, perimeter_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_actions("", policy_id, perimeter_id)
+
+
+def add_action(policy_id, perimeter_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_action("", policy_id, perimeter_id, value)
+
+
+def delete_action(policy_id, perimeter_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_action("", policy_id, perimeter_id)
+
+
+def get_objects(policy_id, perimeter_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_objects("", policy_id, perimeter_id)
+
+
+def add_object(policy_id, perimeter_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_object("", policy_id, perimeter_id, value)
+
+
+def delete_object(policy_id, perimeter_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_object("", policy_id, perimeter_id)
+
+
+def get_subjects(policy_id, perimeter_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_subjects("", policy_id, perimeter_id)
+
+
+def add_subject(policy_id, perimeter_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_subject("", policy_id, perimeter_id, value)
+
+
+def delete_subject(policy_id, perimeter_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_subject("", policy_id, perimeter_id)
+
+
+def get_available_metadata(policy_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_available_metadata("", policy_id)
diff --git a/old/moon_manager/tests/unit_python/helpers/meta_rule_helper.py b/old/moon_manager/tests/unit_python/helpers/meta_rule_helper.py
new file mode 100644
index 00000000..e882706b
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/meta_rule_helper.py
@@ -0,0 +1,49 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+def set_meta_rule(meta_rule_id, value=None):
+ from python_moondb.core import ModelManager
+ if not value:
+ action_category_id = builder.create_action_category("action_category_id1"+uuid4().hex)
+ subject_category_id = builder.create_subject_category("subject_category_id1"+uuid4().hex)
+ object_category_id = builder.create_object_category("object_category_id1"+uuid4().hex)
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ return ModelManager.set_meta_rule(user_id=None, meta_rule_id=meta_rule_id, value=value)
+
+
+def add_meta_rule(meta_rule_id=None, value=None):
+ from python_moondb.core import ModelManager
+ if not value:
+ action_category_id = builder.create_action_category("action_category_id1"+uuid4().hex)
+ subject_category_id = builder.create_subject_category("subject_category_id1"+uuid4().hex)
+ object_category_id = builder.create_object_category("object_category_id1"+uuid4().hex)
+ value = {
+ "name": "MLS_meta_rule"+uuid4().hex,
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ return ModelManager.add_meta_rule(user_id=None, meta_rule_id=meta_rule_id, value=value)
+
+
+def get_meta_rules(meta_rule_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.get_meta_rules(user_id=None, meta_rule_id=meta_rule_id)
+
+
+def delete_meta_rules(meta_rule_id=None):
+ from python_moondb.core import ModelManager
+ ModelManager.delete_meta_rule(user_id=None, meta_rule_id=meta_rule_id)
diff --git a/old/moon_manager/tests/unit_python/helpers/model_helper.py b/old/moon_manager/tests/unit_python/helpers/model_helper.py
new file mode 100644
index 00000000..73808e03
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/model_helper.py
@@ -0,0 +1,48 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from helpers import data_builder as builder
+from uuid import uuid4
+
+
+def get_models(model_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.get_models(user_id=None, model_id=model_id)
+
+
+def add_model(model_id=None, value=None):
+ from python_moondb.core import ModelManager
+ if not value:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = builder.create_new_meta_rule()
+ name = "MLS"+uuid4().hex if model_id is None else "MLS " + model_id
+ value = {
+ "name": name,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ return ModelManager.add_model(user_id=None, model_id=model_id, value=value)
+
+
+def delete_models(uuid=None, name=None):
+ from python_moondb.core import ModelManager
+ if not uuid:
+ for model_id, model_value in get_models():
+ if name == model_value['name']:
+ uuid = model_id
+ break
+ ModelManager.delete_model(user_id=None, model_id=uuid)
+
+
+def delete_all_models():
+ from python_moondb.core import ModelManager
+ models_values = get_models()
+ print(models_values)
+ for model_id, model_value in models_values.items():
+ ModelManager.delete_model(user_id=None, model_id=model_id)
+
+
+def update_model(model_id=None, value=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.update_model(user_id=None, model_id=model_id, value=value)
diff --git a/old/moon_manager/tests/unit_python/helpers/pdp_helper.py b/old/moon_manager/tests/unit_python/helpers/pdp_helper.py
new file mode 100644
index 00000000..3d169b06
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/pdp_helper.py
@@ -0,0 +1,23 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+def update_pdp(pdp_id, value):
+ from python_moondb.core import PDPManager
+ return PDPManager.update_pdp("", pdp_id, value)
+
+
+def delete_pdp(pdp_id):
+ from python_moondb.core import PDPManager
+ PDPManager.delete_pdp("", pdp_id)
+
+
+def add_pdp(pdp_id=None, value=None):
+ from python_moondb.core import PDPManager
+ return PDPManager.add_pdp("", pdp_id, value)
+
+
+def get_pdp(pdp_id=None):
+ from python_moondb.core import PDPManager
+ return PDPManager.get_pdp("", pdp_id)
diff --git a/old/moon_manager/tests/unit_python/helpers/policy_helper.py b/old/moon_manager/tests/unit_python/helpers/policy_helper.py
new file mode 100644
index 00000000..eddd0b8d
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/helpers/policy_helper.py
@@ -0,0 +1,63 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from uuid import uuid4
+
+def get_policies():
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_policies("admin")
+
+
+def add_policies(policy_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ if not value:
+ value = {
+ "name": "test_policy"+ uuid4().hex,
+ "model_id": "",
+ "genre": "authz",
+ "description": "test",
+ }
+ return PolicyManager.add_policy("admin", policy_id=policy_id, value=value)
+
+
+def delete_policies(uuid=None, name=None):
+ from python_moondb.core import PolicyManager
+ if not uuid:
+ for policy_id, policy_value in get_policies():
+ if name == policy_value['name']:
+ uuid = policy_id
+ break
+ PolicyManager.delete_policy("admin", uuid)
+
+
+def update_policy(policy_id, value):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.update_policy("admin", policy_id, value)
+
+
+def get_policy_from_meta_rules(meta_rule_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_policy_from_meta_rules("admin", meta_rule_id)
+
+
+def get_rules(policy_id=None, meta_rule_id=None, rule_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_rules("", policy_id, meta_rule_id, rule_id)
+
+
+def add_rule(policy_id=None, meta_rule_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ if not value:
+ value = {
+ "rule": ("high", "medium", "vm-action"),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+ return PolicyManager.add_rule("", policy_id, meta_rule_id, value)
+
+
+def delete_rule(policy_id=None, rule_id=None):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_rule("", policy_id, rule_id)
diff --git a/old/moon_manager/tests/unit_python/requirements.txt b/old/moon_manager/tests/unit_python/requirements.txt
new file mode 100644
index 00000000..d6f190e4
--- /dev/null
+++ b/old/moon_manager/tests/unit_python/requirements.txt
@@ -0,0 +1,5 @@
+flask
+flask_cors
+flask_restful
+python_moondb==1.2.20
+python_moonutilities==1.4.20
diff --git a/moon_orchestrator/Changelog b/old/moon_orchestrator/Changelog
index 783c9130..c04af79c 100644
--- a/moon_orchestrator/Changelog
+++ b/old/moon_orchestrator/Changelog
@@ -27,3 +27,10 @@ CHANGES
-----
- the processing of a request is now performed in a thread
+4.4.2
+-----
+- apply pylint rules
+
+4.4.3
+-----
+- add "internal_port" key in slave API
diff --git a/old/moon_orchestrator/Dockerfile b/old/moon_orchestrator/Dockerfile
new file mode 100644
index 00000000..7c59efb5
--- /dev/null
+++ b/old/moon_orchestrator/Dockerfile
@@ -0,0 +1,15 @@
+FROM python:3.6
+
+LABEL Name=Orchestrator
+LABEL Description="Orchestrator component for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+USER root
+
+ADD . /root
+WORKDIR /root/
+RUN pip3 install --no-cache-dir -r requirements.txt
+RUN pip3 install --no-cache-dir .
+
+CMD ["python3", "-m", "moon_orchestrator"] \ No newline at end of file
diff --git a/python_moonutilities/LICENSE b/old/moon_orchestrator/LICENSE
index d6456956..d6456956 100644
--- a/python_moonutilities/LICENSE
+++ b/old/moon_orchestrator/LICENSE
diff --git a/moon_orchestrator/MANIFEST.in b/old/moon_orchestrator/MANIFEST.in
index 8de5a391..8de5a391 100644
--- a/moon_orchestrator/MANIFEST.in
+++ b/old/moon_orchestrator/MANIFEST.in
diff --git a/moon_orchestrator/README.md b/old/moon_orchestrator/README.md
index aec5cda2..aec5cda2 100644
--- a/moon_orchestrator/README.md
+++ b/old/moon_orchestrator/README.md
diff --git a/moon_interface/moon_interface/__init__.py b/old/moon_orchestrator/moon_orchestrator/__init__.py
index 0fb32055..31d40184 100644
--- a/moon_interface/moon_interface/__init__.py
+++ b/old/moon_orchestrator/moon_orchestrator/__init__.py
@@ -3,4 +3,4 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-__version__ = "4.3.3"
+__version__ = "4.4.3"
diff --git a/moon_orchestrator/moon_orchestrator/__main__.py b/old/moon_orchestrator/moon_orchestrator/__main__.py
index df051f26..df051f26 100644
--- a/moon_orchestrator/moon_orchestrator/__main__.py
+++ b/old/moon_orchestrator/moon_orchestrator/__main__.py
diff --git a/old/moon_orchestrator/moon_orchestrator/api/__init__.py b/old/moon_orchestrator/moon_orchestrator/api/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/moon_orchestrator/moon_orchestrator/api/__init__.py
diff --git a/moon_orchestrator/moon_orchestrator/api/generic.py b/old/moon_orchestrator/moon_orchestrator/api/generic.py
index 37e30a22..9128140a 100644
--- a/moon_orchestrator/moon_orchestrator/api/generic.py
+++ b/old/moon_orchestrator/moon_orchestrator/api/generic.py
@@ -77,13 +77,16 @@ class API(Resource):
if "__version__" in dir(group_api_obj):
api_desc[api_name]["version"] = group_api_obj.__version__
object_list = list(filter(lambda x: "__" not in x, dir(group_api_obj)))
- for obj in map(lambda x: eval("moon_interface.api.{}.{}".format(api_name, x)), object_list):
+ for obj in map(lambda x: eval("moon_interface.api.{}.{}".format(api_name, x)),
+ object_list):
if "__urls__" in dir(obj):
api_desc[api_name][obj.__name__] = dict()
api_desc[api_name][obj.__name__]["urls"] = obj.__urls__
api_desc[api_name][obj.__name__]["methods"] = dict()
for _method in filter(lambda x: x in __methods, dir(obj)):
- docstring = eval("moon_interface.api.{}.{}.{}.__doc__".format(api_name, obj.__name__, _method))
+ docstring = eval(
+ "moon_interface.api.{}.{}.{}.__doc__".format(api_name, obj.__name__,
+ _method))
api_desc[api_name][obj.__name__]["methods"][_method] = docstring
api_desc[api_name][obj.__name__]["description"] = str(obj.__doc__)
if group_id in api_desc:
diff --git a/moon_orchestrator/moon_orchestrator/api/pods.py b/old/moon_orchestrator/moon_orchestrator/api/pods.py
index 3a01c3a9..8943e018 100644
--- a/moon_orchestrator/moon_orchestrator/api/pods.py
+++ b/old/moon_orchestrator/moon_orchestrator/api/pods.py
@@ -52,27 +52,29 @@ class Pods(Resource):
for _pod_key, _pod_values in self.driver.get_pods().items():
pods[_pod_key] = []
for _pod_value in _pod_values:
- if _pod_value['namespace'] != "moon":
+ if "namespace" in _pod_value and _pod_value['namespace'] != "moon":
continue
pods[_pod_key].append(_pod_value)
return {"pods": pods}
except Exception as e:
return {"result": False, "message": str(e)}, 500
- def __get_pod_with_keystone_pid(self, keystone_pid):
+ def __validate_pod_with_keystone_pid(self, keystone_pid):
for pod_key, pod_values in self.driver.get_pods().items():
- if pod_values[0]['keystone_project_id'] == keystone_pid:
+ if pod_values and "keystone_project_id" in pod_values[0] \
+ and pod_values[0]['keystone_project_id'] == keystone_pid:
return True
- def __get_wrapper(self, slave_name):
+ def __is_slave_exist(self, slave_name):
for slave in self.driver.get_slaves():
- if slave_name == slave["name"] \
- and slave["configured"]:
+ if "name" in slave and "configured" in slave \
+ and slave_name == slave["name"] and slave["configured"]:
return True
def __get_slave_names(self):
for slave in self.driver.get_slaves():
- yield slave["name"]
+ if "name" in slave:
+ yield slave["name"]
@check_auth
def post(self, uuid=None, user_id=None):
@@ -98,27 +100,24 @@ class Pods(Resource):
}
}
"""
- pods = {}
if "security_pipeline" in request.json:
- if self.__get_pod_with_keystone_pid(request.json.get("keystone_project_id")):
+ if self.__validate_pod_with_keystone_pid(request.json.get("keystone_project_id")):
raise exceptions.PipelineConflict
+ if not request.json.get("pdp_id"):
+ raise exceptions.PdpUnknown
+ if not request.json.get("security_pipeline"):
+ raise exceptions.PolicyUnknown
self.driver.create_pipeline(
request.json.get("keystone_project_id"),
request.json.get("pdp_id"),
request.json.get("security_pipeline"),
manager_data=request.json,
slave_name=request.json.get("slave_name"))
- for _pod_key, _pod_values in self.driver.get_pods().items():
- pods[_pod_key] = []
- for _pod_value in _pod_values:
- if _pod_value['namespace'] != "moon":
- continue
- pods[_pod_key].append(_pod_value)
else:
logger.info("------------------------------------")
logger.info(list(self.__get_slave_names()))
logger.info("------------------------------------")
- if self.__get_wrapper(request.json.get("slave_name")):
+ if self.__is_slave_exist(request.json.get("slave_name")):
raise exceptions.WrapperConflict
if request.json.get("slave_name") not in self.__get_slave_names():
raise exceptions.SlaveNameUnknown
@@ -144,8 +143,11 @@ class Pods(Resource):
return {'result': True}
except exceptions.PipelineUnknown:
for slave in self.driver.get_slaves():
- if uuid in (slave['name'], slave["wrapper_name"]):
- self.driver.delete_wrapper(name=slave["wrapper_name"])
+ if "name" in slave and "wrapper_name" in slave:
+ if uuid in (slave['name'], slave["wrapper_name"]):
+ self.driver.delete_wrapper(name=slave["wrapper_name"])
+ else:
+ raise exceptions.SlaveNameUnknown
except Exception as e:
return {"result": False, "message": str(e)}, 500
diff --git a/moon_orchestrator/moon_orchestrator/api/slaves.py b/old/moon_orchestrator/moon_orchestrator/api/slaves.py
index 7453d305..7453d305 100644
--- a/moon_orchestrator/moon_orchestrator/api/slaves.py
+++ b/old/moon_orchestrator/moon_orchestrator/api/slaves.py
diff --git a/moon_orchestrator/moon_orchestrator/drivers.py b/old/moon_orchestrator/moon_orchestrator/drivers.py
index bb0d0c2c..233d389e 100644
--- a/moon_orchestrator/moon_orchestrator/drivers.py
+++ b/old/moon_orchestrator/moon_orchestrator/drivers.py
@@ -203,13 +203,15 @@ class K8S(Driver):
for key, value in pods.items():
# logger.info("ctx={}".format(active_context))
# logger.info("value={}".format(value))
- if active_context["name"] == value[0].get('slave_name'):
- data = dict(active_context)
- data["wrapper_name"] = value[0]['name']
- data["ip"] = value[0].get("ip", "NC")
- data["port"] = value[0].get("external_port", "NC")
- slaves.append(data)
- break
+ if "name" in active_context and value and "name" in value[0]:
+ if active_context["name"] == value[0].get('slave_name'):
+ data = dict(active_context)
+ data["wrapper_name"] = value[0]['name']
+ data["ip"] = value[0].get("ip", "NC")
+ data["port"] = value[0].get("external_port", "NC")
+ data["internal_port"] = value[0].get("port", "NC")
+ slaves.append(data)
+ break
return slaves
for ctx in contexts:
data = dict(ctx)
@@ -217,12 +219,14 @@ class K8S(Driver):
for key, value in pods.items():
# logger.info("ctx={}".format(ctx))
# logger.info("value={}".format(value))
- if ctx["name"] == value[0].get('slave_name'):
- data["wrapper_name"] = value[0]['name']
- data["ip"] = value[0].get("ip", "NC")
- data["port"] = value[0].get("external_port", "NC")
- data["configured"] = True
- break
+ if "name" in ctx and value and "name" in value[0]:
+ if ctx["name"] == value[0].get('slave_name'):
+ data["wrapper_name"] = value[0]['name']
+ data["ip"] = value[0].get("ip", "NC")
+ data["port"] = value[0].get("external_port", "NC")
+ data["internal_port"] = value[0].get("port", "NC")
+ data["configured"] = True
+ break
slaves.append(data)
return slaves
diff --git a/moon_orchestrator/moon_orchestrator/http_server.py b/old/moon_orchestrator/moon_orchestrator/http_server.py
index 1cb12618..72e12358 100644
--- a/moon_orchestrator/moon_orchestrator/http_server.py
+++ b/old/moon_orchestrator/moon_orchestrator/http_server.py
@@ -19,7 +19,7 @@ logger = logging.getLogger("moon.orchestrator.http_server")
__API__ = (
Status,
- )
+)
class Server:
@@ -70,7 +70,7 @@ class Root(Resource):
"""
The root of the web service
"""
- __urls__ = ("/", )
+ __urls__ = ("/",)
__methods = ("get", "post", "put", "delete", "options")
def get(self):
@@ -136,10 +136,12 @@ class HTTPServer(Server):
def get_404_json(e):
return jsonify({"result": False, "code": 404, "description": str(e)}), 404
+
self.app.register_error_handler(404, get_404_json)
def get_400_json(e):
return jsonify({"result": False, "code": 400, "description": str(e)}), 400
+
self.app.register_error_handler(400, lambda e: get_400_json)
self.app.register_error_handler(403, exceptions.AuthException)
@@ -163,4 +165,3 @@ class HTTPServer(Server):
@staticmethod
def __filter_str(data):
return data.replace("@", "-")
-
diff --git a/moon_orchestrator/moon_orchestrator/server.py b/old/moon_orchestrator/moon_orchestrator/server.py
index 88d56e3a..88d56e3a 100644
--- a/moon_orchestrator/moon_orchestrator/server.py
+++ b/old/moon_orchestrator/moon_orchestrator/server.py
diff --git a/moon_orchestrator/requirements.txt b/old/moon_orchestrator/requirements.txt
index dbb62043..dbb62043 100644
--- a/moon_orchestrator/requirements.txt
+++ b/old/moon_orchestrator/requirements.txt
diff --git a/moon_orchestrator/setup.py b/old/moon_orchestrator/setup.py
index 494bd131..494bd131 100644
--- a/moon_orchestrator/setup.py
+++ b/old/moon_orchestrator/setup.py
diff --git a/moon_orchestrator/tests/unit_python/conftest.py b/old/moon_orchestrator/tests/unit_python/conftest.py
index 044489e6..044489e6 100644
--- a/moon_orchestrator/tests/unit_python/conftest.py
+++ b/old/moon_orchestrator/tests/unit_python/conftest.py
diff --git a/moon_orchestrator/tests/unit_python/mock_pods.py b/old/moon_orchestrator/tests/unit_python/mock_pods.py
index 84e6c7ea..59e1b3c0 100644
--- a/moon_orchestrator/tests/unit_python/mock_pods.py
+++ b/old/moon_orchestrator/tests/unit_python/mock_pods.py
@@ -208,12 +208,25 @@ def patch_k8s(monkeypatch):
'create_namespaced_deployment',
create_namespaced_deployment_mockreturn)
+ def delete_namespaced_deployment_mockreturn(*args, **kwargs):
+ return None
+
+ monkeypatch.setattr(client.ExtensionsV1beta1Api,
+ 'delete_namespaced_deployment',
+ delete_namespaced_deployment_mockreturn)
+
def create_namespaced_service_mockreturn(*args, **kwargs):
return {}
monkeypatch.setattr(client.CoreV1Api,
'create_namespaced_service',
create_namespaced_service_mockreturn)
+ def delete_namespaced_service_mockreturn(*args, **kwargs):
+ return {}
+ monkeypatch.setattr(client.CoreV1Api,
+ 'delete_namespaced_service',
+ delete_namespaced_service_mockreturn)
+
def register_pods(m):
""" Modify the response from Requests module
diff --git a/moon_orchestrator/tests/unit_python/requirements.txt b/old/moon_orchestrator/tests/unit_python/requirements.txt
index 21975ce3..21975ce3 100644
--- a/moon_orchestrator/tests/unit_python/requirements.txt
+++ b/old/moon_orchestrator/tests/unit_python/requirements.txt
diff --git a/old/moon_orchestrator/tests/unit_python/test_pods.py b/old/moon_orchestrator/tests/unit_python/test_pods.py
new file mode 100644
index 00000000..5e1b3767
--- /dev/null
+++ b/old/moon_orchestrator/tests/unit_python/test_pods.py
@@ -0,0 +1,287 @@
+import json
+from mock_pods import patch_k8s
+from utilities import get_json
+
+
+def test_get_pods(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ req = _client.get("/pods")
+ assert req.status_code == 200
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert "pods" in data
+ assert data["pods"]
+
+
+def test_get_pods_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ req = _client.get("/pods/invalid")
+ assert req.status_code == 200
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert not data["pods"]
+
+############################ /post ############################
+
+def test_add_pods_with_pipeline(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "keystone_project_id": context.get('project_id'),
+ "pdp_id": context.get('pdp_id'),
+ "security_pipeline": context.get('security_pipeline'),
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert "pods" in data
+ assert data["pods"]
+
+
+def test_add_pods_without_pipeline_with_bad_slave_name_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "slave_name": "test",
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert 'The slave is unknown.' in data['message']
+
+
+def test_add_pods_without_pipeline_with_good_slave_name(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "slave_name": "active_context",
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert "pods" in data
+ assert data["pods"]
+
+
+def test_add_pods_without_pipeline_without_slave_name_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert 'The slave is unknown.' in data['message']
+
+
+def test_add_pods_with_no_data_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ req = _client.post("/pods", data=json.dumps({}),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert req.data
+ data = get_json(req.data)
+ assert 'The slave is unknown.' in data['message']
+
+
+def test_add_pods_with_no_policies_no_models(context, monkeypatch, no_requests):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ no_requests.get("http://manager:8082/policies",
+ json={'policies': {}})
+
+ no_requests.get("http://manager:8082/models",
+ json={'models': {}})
+ data = {
+ "keystone_project_id": context.get('project_id'),
+ "pdp_id": context.get('pdp_id'),
+ "security_pipeline": context.get('security_pipeline'),
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+
+
+def test_add_pods_with_empty_pdp_id_and_keystone_project_id_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "keystone_project_id": "",
+ "pdp_id": "",
+ "security_pipeline": context.get('security_pipeline'),
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert req.data
+ data = get_json(req.data)
+ assert "The pdp is unknown." in data['message']
+
+
+def test_add_pods_with_empty_security_pipeline_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "keystone_project_id": context.get('project_id'),
+ "pdp_id": context.get('pdp_id'),
+ "security_pipeline": "",
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 400
+ assert req.data
+ data = get_json(req.data)
+ assert 'The policy is unknown.' in data['message']
+
+
+def test_add_different_pods_with_same_pdp_id(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "keystone_project_id": context.get('project_id'),
+ "pdp_id": context.get('pdp_id'),
+ "security_pipeline": context.get('security_pipeline'),
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ data["keystone_project_id"] = data["keystone_project_id"] + "x"
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+
+
+def test_add_different_pods_with_same_keystone_project_id_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "keystone_project_id": context.get('project_id'),
+ "pdp_id": context.get('pdp_id'),
+ "security_pipeline": context.get('security_pipeline'),
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ data["pdp_id"] = data["pdp_id"] + "xyz"
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 409
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert 'A Pipeline already exist for the specified slave.' in data['message']
+
+
+def test_add_pod_with_slave_more_than_once_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "slave_name": "active_context",
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 409
+ assert req.data
+ data = get_json(req.data)
+ assert isinstance(data, dict)
+ assert 'A Wrapper already exist for the specified slave.' in data['message']
+
+############################ /delete ############################
+
+def test_delete_pod_valid_uuid(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+ data = {
+ "keystone_project_id": context.get('project_id'),
+ "pdp_id": context.get('pdp_id'),
+ "security_pipeline": context.get('security_pipeline'),
+ }
+ req = _client.post("/pods", data=json.dumps(data),
+ headers={'Content-Type': 'application/json'})
+ assert req.status_code == 200
+ assert req.data
+ data = get_json(req.data)
+ for key in data["pods"]:
+ req = _client.delete("/pods/{}".format(key))
+ assert req.status_code == 200
+
+def test_delete_pod_Invalid_uuid_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+
+ req = _client.delete("/pods/invalid")
+ assert req.status_code == 400
+ data = get_json(req.data)
+ assert 'The slave is unknown.' in data['message']
+
+def test_delete_pod_without_uuid_failure(context, monkeypatch):
+ patch_k8s(monkeypatch)
+
+ import moon_orchestrator.server
+ server = moon_orchestrator.server.create_server()
+ _client = server.app.test_client()
+
+ req = _client.delete("/pods/")
+ assert req.status_code == 400
+ data = get_json(req.data)
+ assert 'The slave is unknown.' in data['message'] \ No newline at end of file
diff --git a/moon_orchestrator/tests/unit_python/test_slaves.py b/old/moon_orchestrator/tests/unit_python/test_slaves.py
index 88ff7e55..88ff7e55 100644
--- a/moon_orchestrator/tests/unit_python/test_slaves.py
+++ b/old/moon_orchestrator/tests/unit_python/test_slaves.py
diff --git a/moon_orchestrator/tests/unit_python/utilities.py b/old/moon_orchestrator/tests/unit_python/utilities.py
index bc4aebcc..bc4aebcc 100644
--- a/moon_orchestrator/tests/unit_python/utilities.py
+++ b/old/moon_orchestrator/tests/unit_python/utilities.py
diff --git a/moon_pythonfunctest/Dockerfile b/old/moon_pythonfunctest/Dockerfile
index 8ae093b8..8ae093b8 100644
--- a/moon_pythonfunctest/Dockerfile
+++ b/old/moon_pythonfunctest/Dockerfile
diff --git a/moon_pythonfunctest/README.md b/old/moon_pythonfunctest/README.md
index e2a4d14b..e2a4d14b 100644
--- a/moon_pythonfunctest/README.md
+++ b/old/moon_pythonfunctest/README.md
diff --git a/moon_pythonfunctest/run_func_test.sh b/old/moon_pythonfunctest/run_func_test.sh
index acd0e1e9..acd0e1e9 100755
--- a/moon_pythonfunctest/run_func_test.sh
+++ b/old/moon_pythonfunctest/run_func_test.sh
diff --git a/moon_pythonunittest/Dockerfile b/old/moon_pythonunittest/Dockerfile
index b8fb5151..b8fb5151 100644
--- a/moon_pythonunittest/Dockerfile
+++ b/old/moon_pythonunittest/Dockerfile
diff --git a/moon_pythonunittest/README.md b/old/moon_pythonunittest/README.md
index 45d3a988..45d3a988 100644
--- a/moon_pythonunittest/README.md
+++ b/old/moon_pythonunittest/README.md
diff --git a/moon_pythonunittest/requirements.txt b/old/moon_pythonunittest/requirements.txt
index fe107293..fe107293 100644
--- a/moon_pythonunittest/requirements.txt
+++ b/old/moon_pythonunittest/requirements.txt
diff --git a/moon_pythonunittest/run_tests.sh b/old/moon_pythonunittest/run_tests.sh
index 285bd856..285bd856 100644
--- a/moon_pythonunittest/run_tests.sh
+++ b/old/moon_pythonunittest/run_tests.sh
diff --git a/moon_wrapper/Changelog b/old/moon_wrapper/Changelog
index 071e4ef9..b2d62657 100644
--- a/moon_wrapper/Changelog
+++ b/old/moon_wrapper/Changelog
@@ -26,3 +26,22 @@ CHANGES
4.5.1
-----
- use the threading capability of Flask app
+
+4.5.2
+-----
+- apply pylint rules
+
+4.5.3
+-----
+- Fix bug when OpenStack requests Moon
+ - bug on Keystone project ID
+ - bug when filtering the pipeline container name
+
+4.5.4
+-----
+- Fix a bug in retrieval of object from OpenStack
+- Fix a bug in rule element
+
+4.6.0
+-----
+- Add the Update API
diff --git a/old/moon_wrapper/Dockerfile b/old/moon_wrapper/Dockerfile
new file mode 100644
index 00000000..e3ad9020
--- /dev/null
+++ b/old/moon_wrapper/Dockerfile
@@ -0,0 +1,15 @@
+FROM python:3
+
+LABEL Name=Wrapper
+LABEL Description="Wrapper component for the Moon platform"
+LABEL Maintainer="Thomas Duval"
+LABEL Url="https://wiki.opnfv.org/display/moon/Moon+Project+Proposal"
+
+USER root
+
+ADD . /root
+WORKDIR /root/
+RUN pip3 install --no-cache-dir -r requirements.txt
+RUN pip3 install --no-cache-dir .
+
+CMD ["python3", "-m", "moon_wrapper"]
diff --git a/old/moon_wrapper/LICENSE b/old/moon_wrapper/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/old/moon_wrapper/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/old/moon_wrapper/MANIFEST.in b/old/moon_wrapper/MANIFEST.in
new file mode 100644
index 00000000..cf4d2e4e
--- /dev/null
+++ b/old/moon_wrapper/MANIFEST.in
@@ -0,0 +1,9 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+include README.md
+include LICENSE
+include setup.py
+include requirements.txt
diff --git a/moon_wrapper/README.md b/old/moon_wrapper/README.md
index cdd043a9..cdd043a9 100644
--- a/moon_wrapper/README.md
+++ b/old/moon_wrapper/README.md
diff --git a/old/moon_wrapper/moon_wrapper/__init__.py b/old/moon_wrapper/moon_wrapper/__init__.py
new file mode 100644
index 00000000..f0887748
--- /dev/null
+++ b/old/moon_wrapper/moon_wrapper/__init__.py
@@ -0,0 +1,6 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+__version__ = "4.6.0"
diff --git a/moon_wrapper/moon_wrapper/__main__.py b/old/moon_wrapper/moon_wrapper/__main__.py
index 46cafa76..3a403293 100644
--- a/moon_wrapper/moon_wrapper/__main__.py
+++ b/old/moon_wrapper/moon_wrapper/__main__.py
@@ -1,4 +1,4 @@
from moon_wrapper.server import main
-server = main()
-server.run()
+SERVER = main()
+SERVER.run()
diff --git a/old/moon_wrapper/moon_wrapper/api/__init__.py b/old/moon_wrapper/moon_wrapper/api/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/moon_wrapper/moon_wrapper/api/__init__.py
diff --git a/moon_wrapper/moon_wrapper/api/generic.py b/old/moon_wrapper/moon_wrapper/api/generic.py
index 498513c7..e492b327 100644
--- a/moon_wrapper/moon_wrapper/api/generic.py
+++ b/old/moon_wrapper/moon_wrapper/api/generic.py
@@ -6,14 +6,14 @@
Those API are helping API used to manage the Moon platform.
"""
-from flask_restful import Resource, request
import logging
+from flask_restful import Resource, request
import moon_wrapper.api
from python_moonutilities.security_functions import check_auth
__version__ = "0.1.0"
-logger = logging.getLogger("moon.manager.api." + __name__)
+LOGGER = logging.getLogger("moon.manager.api." + __name__)
class Status(Resource):
@@ -35,7 +35,7 @@ class Status(Resource):
}
}
"""
- raise NotImplemented
+ raise NotImplementedError
class Logs(Resource):
@@ -70,7 +70,7 @@ class Logs(Resource):
args["to"] = to_str
args["event_number"] = event_number
- raise NotImplemented
+ raise NotImplementedError
class API(Resource):
@@ -112,20 +112,23 @@ class API(Resource):
if "__version__" in dir(group_api_obj):
api_desc[api_name]["version"] = group_api_obj.__version__
object_list = list(filter(lambda x: "__" not in x, dir(group_api_obj)))
- for obj in map(lambda x: eval("moon_interface.api.{}.{}".format(api_name, x)), object_list):
+ for obj in map(lambda x: eval("moon_interface.api.{}.{}".format(api_name, x)),
+ object_list):
if "__urls__" in dir(obj):
api_desc[api_name][obj.__name__] = dict()
api_desc[api_name][obj.__name__]["urls"] = obj.__urls__
api_desc[api_name][obj.__name__]["methods"] = dict()
for _method in filter(lambda x: x in __methods, dir(obj)):
- docstring = eval("moon_interface.api.{}.{}.{}.__doc__".format(api_name, obj.__name__, _method))
+ docstring = eval(
+ "moon_interface.api.{}.{}.{}.__doc__".format(api_name, obj.__name__,
+ _method))
api_desc[api_name][obj.__name__]["methods"][_method] = docstring
api_desc[api_name][obj.__name__]["description"] = str(obj.__doc__)
if group_id in api_desc:
if endpoint_id in api_desc[group_id]:
return {group_id: {endpoint_id: api_desc[group_id][endpoint_id]}}
elif len(endpoint_id) > 0:
- logger.error("Unknown endpoint_id {}".format(endpoint_id))
+ LOGGER.error("Unknown endpoint_id {}".format(endpoint_id))
return {"error": "Unknown endpoint_id {}".format(endpoint_id)}
return {group_id: api_desc[group_id]}
return api_desc
diff --git a/moon_wrapper/moon_wrapper/api/oslowrapper.py b/old/moon_wrapper/moon_wrapper/api/oslowrapper.py
index 905c32db..39128621 100644
--- a/moon_wrapper/moon_wrapper/api/oslowrapper.py
+++ b/old/moon_wrapper/moon_wrapper/api/oslowrapper.py
@@ -6,17 +6,17 @@
Authz is the endpoint to get authorization response
"""
+import logging
+import json
import flask
from flask import request
from flask_restful import Resource
-import logging
-import json
import requests
from python_moonutilities import exceptions
__version__ = "0.1.0"
-logger = logging.getLogger("moon.wrapper.api." + __name__)
+LOGGER = logging.getLogger("moon.wrapper.api." + __name__)
class OsloWrapper(Resource):
@@ -35,15 +35,15 @@ class OsloWrapper(Resource):
self.TIMEOUT = 5
def post(self):
- logger.debug("POST {}".format(request.form))
+ LOGGER.debug("POST {}".format(request.form))
response = flask.make_response("False")
try:
if self.manage_data():
response = flask.make_response("True")
- except exceptions.AuthzException as e:
- logger.error(e, exc_info=True)
- except Exception as e:
- logger.error(e, exc_info=True)
+ except exceptions.AuthzException as exception:
+ LOGGER.error(exception, exc_info=True)
+ except Exception as exception:
+ LOGGER.error(exception, exc_info=True)
response.headers['content-type'] = 'application/octet-stream'
return response
@@ -64,20 +64,22 @@ class OsloWrapper(Resource):
pass
# note: default case
- return target.get("project_id", "none")
+ return "none"
@staticmethod
def __get_project_id(target, credentials):
- logger.info("__get_project_id {}".format(target))
- return target.get("project_id", "none")
+ project_id = target.get("project_id", None)
+ if not project_id:
+ project_id = credentials.get("project_id", None)
+ return project_id
def get_interface_url(self, project_id):
- logger.debug("project_id {}".format(project_id))
+ LOGGER.debug("project_id {}".format(project_id))
for containers in self.CACHE.containers.values():
- logger.info("containers {}".format(containers))
+ LOGGER.info("containers {}".format(containers))
for container in containers:
if container.get("keystone_project_id") == project_id:
- if "interface" in container['name']:
+ if "pipeline" in container['name']:
return "http://{}:{}".format(
container['name'],
container['port'])
@@ -86,7 +88,7 @@ class OsloWrapper(Resource):
for containers in self.CACHE.containers.values():
for container in containers:
if container.get("keystone_project_id") == project_id:
- if "interface" in container['name']:
+ if "pipeline" in container['name']:
return "http://{}:{}".format(
container['name'],
container['port'])
@@ -100,14 +102,15 @@ class OsloWrapper(Resource):
data = json.loads(request.data.decode("utf-8"))
target = json.loads(data.get('target', {}))
credentials = json.loads(data.get('credentials', {}))
- rule = data.get('rule', "")
+ rule = data.get('rule', "").strip('"').strip("'")
_subject = self.__get_subject(target, credentials)
_object = self.__get_object(target, credentials)
_action = rule
+ LOGGER.info("authz {} {} {}".format(_subject, _object, _action))
_project_id = self.__get_project_id(target, credentials)
_pdp_id = self.CACHE.get_pdp_from_keystone_project(_project_id)
interface_url = self.get_interface_url(_project_id)
- logger.debug("interface_url={}".format(interface_url))
+ LOGGER.debug("interface_url={}".format(interface_url))
req = requests.get("{}/authz/{}/{}/{}/{}".format(
interface_url,
_pdp_id,
@@ -116,9 +119,9 @@ class OsloWrapper(Resource):
_action
))
- logger.debug("Get interface {}".format(req.text))
+ LOGGER.debug("Get interface {}".format(req.text))
if req.status_code == 200:
if req.json().get("result", False):
return True
- raise exceptions.AuthzException("error in authz request") \ No newline at end of file
+ raise exceptions.AuthzException("error in authz request")
diff --git a/old/moon_wrapper/moon_wrapper/api/slaveupdate.py b/old/moon_wrapper/moon_wrapper/api/slaveupdate.py
new file mode 100644
index 00000000..b2ce22f0
--- /dev/null
+++ b/old/moon_wrapper/moon_wrapper/api/slaveupdate.py
@@ -0,0 +1,87 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+"""
+Authz is the endpoint to get authorization response
+"""
+
+import logging
+import json
+import flask
+from flask import request
+from flask_restful import Resource
+import requests
+from python_moonutilities import exceptions
+
+__version__ = "0.1.0"
+
+LOGGER = logging.getLogger("moon.wrapper.api." + __name__)
+
+
+class SlaveUpdate(Resource):
+ """
+ Endpoint for authz requests
+ """
+
+ __urls__ = (
+ "/update",
+ "/update/",
+ )
+
+ def __init__(self, **kwargs):
+ self.port = kwargs.get("port")
+ self.CACHE = kwargs.get("cache", {})
+ self.TIMEOUT = 5
+
+ def put(self):
+ LOGGER.warning("PUT {}".format(request.form))
+ response = flask.make_response("False")
+ try:
+ if self.update_slave():
+ response = flask.make_response("True")
+ except Exception as exception:
+ LOGGER.error(exception, exc_info=True)
+
+ response.headers['content-type'] = 'application/octet-stream'
+ return response
+
+ def get_interface_url(self, pdp_id):
+ LOGGER.debug("pdp_id {}".format(pdp_id))
+ for containers in self.CACHE.containers.values():
+ LOGGER.info("containers0 {}".format(containers))
+ for container in containers:
+ if container.get("pdp_id") == pdp_id:
+ if "pipeline" in container['name']:
+ yield "http://{}:{}".format(
+ container['name'],
+ container['port'])
+ self.CACHE.update()
+ # Note (asteroide): test an other time after the update
+ for containers in self.CACHE.containers.values():
+ LOGGER.info("containers1 {}".format(containers))
+ for container in containers:
+ if container.get("pdp_id") == pdp_id:
+ if "pipeline" in container['name']:
+ yield "http://{}:{}".format(
+ container['name'],
+ container['port'])
+
+ def update_slave(self):
+ result = {}
+ result_list = []
+ for _pdp_id in self.CACHE.pdp:
+ result[_pdp_id] = {}
+ for interface_url in self.get_interface_url(_pdp_id):
+
+ req = requests.put("{}/update".format(interface_url), request.form)
+
+ if req.status_code == 200:
+ if req.json().get("result", False):
+ result[_pdp_id][interface_url] = True
+ result_list.append(True)
+ continue
+ LOGGER.warning("Error in {} {}: {}".format(_pdp_id, interface_url, req.text))
+ result[_pdp_id][interface_url] = False
+ result_list.append(False)
+ return all(result_list)
diff --git a/moon_wrapper/moon_wrapper/http_server.py b/old/moon_wrapper/moon_wrapper/http_server.py
index dfbaed9f..015bb285 100644
--- a/moon_wrapper/moon_wrapper/http_server.py
+++ b/old/moon_wrapper/moon_wrapper/http_server.py
@@ -10,17 +10,17 @@ import logging
from moon_wrapper import __version__
from moon_wrapper.api.generic import Status, Logs, API
from moon_wrapper.api.oslowrapper import OsloWrapper
+from moon_wrapper.api.slaveupdate import SlaveUpdate
from python_moonutilities.cache import Cache
from python_moonutilities import configuration, exceptions
-logger = logging.getLogger("moon.wrapper.http_server")
-
+LOGGER = logging.getLogger("moon.wrapper.http_server")
CACHE = Cache()
__API__ = (
Status, Logs, API
- )
+)
class Server:
@@ -71,7 +71,7 @@ class Root(Resource):
"""
The root of the web service
"""
- __urls__ = ("/", )
+ __urls__ = ("/",)
__methods = ("get", "post", "put", "delete", "options")
def get(self):
@@ -111,7 +111,6 @@ class HTTPServer(Server):
self.__hook_errors()
def __hook_errors(self):
-
def get_404_json(e):
return flask.make_response("False")
@@ -134,7 +133,12 @@ class HTTPServer(Server):
"cache": CACHE,
}
)
+ self.api.add_resource(SlaveUpdate, *SlaveUpdate.__urls__,
+ resource_class_kwargs={
+ "orchestrator_url": self.orchestrator_url,
+ "cache": CACHE,
+ }
+ )
def run(self):
self.app.run(host=self._host, port=self._port, threaded=True) # nosec
-
diff --git a/moon_wrapper/moon_wrapper/server.py b/old/moon_wrapper/moon_wrapper/server.py
index 280fdb68..77def174 100644
--- a/moon_wrapper/moon_wrapper/server.py
+++ b/old/moon_wrapper/moon_wrapper/server.py
@@ -28,5 +28,5 @@ def main():
if __name__ == '__main__':
- server = main()
- server.run()
+ SERVER = main()
+ SERVER.run()
diff --git a/moon_wrapper/requirements.txt b/old/moon_wrapper/requirements.txt
index c1bd9a2f..c1bd9a2f 100644
--- a/moon_wrapper/requirements.txt
+++ b/old/moon_wrapper/requirements.txt
diff --git a/moon_wrapper/setup.py b/old/moon_wrapper/setup.py
index b6190c80..b6190c80 100644
--- a/moon_wrapper/setup.py
+++ b/old/moon_wrapper/setup.py
diff --git a/moon_wrapper/tests/README.md b/old/moon_wrapper/tests/README.md
index 73a9fcd2..73a9fcd2 100644
--- a/moon_wrapper/tests/README.md
+++ b/old/moon_wrapper/tests/README.md
diff --git a/old/moon_wrapper/tests/unit_python/api/__init__.py b/old/moon_wrapper/tests/unit_python/api/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/moon_wrapper/tests/unit_python/api/__init__.py
diff --git a/moon_wrapper/tests/unit_python/api/test_wrapper.py b/old/moon_wrapper/tests/unit_python/api/test_wrapper.py
index bd6baf32..bd6baf32 100644
--- a/moon_wrapper/tests/unit_python/api/test_wrapper.py
+++ b/old/moon_wrapper/tests/unit_python/api/test_wrapper.py
diff --git a/moon_wrapper/tests/unit_python/conftest.py b/old/moon_wrapper/tests/unit_python/conftest.py
index 2c332c89..a6677849 100644
--- a/moon_wrapper/tests/unit_python/conftest.py
+++ b/old/moon_wrapper/tests/unit_python/conftest.py
@@ -288,10 +288,10 @@ def set_consul_and_db(monkeypatch):
"pdp_id": "b3d3e18abf3340e8b635fd49e6634ccd",
"port": 8080,
"genre": "interface",
- "name": "interface-paltry",
+ "name": "pipeline-paltry",
"keystone_project_id": "a64beb1cc224474fb4badd43173e7101",
"namespace": "moon",
- "container": "wukongsun/moon_interface:v4.3"
+ "container": "wukongsun/moon_pipeline:v4.3"
},
{
"pdp_id": "b3d3e18abf3340e8b635fd49e6634ccd",
@@ -308,7 +308,7 @@ def set_consul_and_db(monkeypatch):
"pdp_id": "invalid_pdp_id",
"port": 8080,
"genre": "interface",
- "name": "interface-paltry",
+ "name": "pipeline-paltry",
"keystone_project_id": "invalid_project_id",
"namespace": "moon",
"container": "wukongsun/moon_authz:v4.3"
@@ -696,7 +696,7 @@ def set_consul_and_db(monkeypatch):
content=get_pickled_context()
)
m.register_uri(
- 'GET', 'http://interface-paltry:8080/authz/{}/{}/{}/{}'.format(
+ 'GET', 'http://pipeline-paltry:8080/authz/{}/{}/{}/{}'.format(
CONTEXT.get("pdp_id"),
CONTEXT.get("subject_name"),
CONTEXT.get("object_name"),
@@ -705,7 +705,7 @@ def set_consul_and_db(monkeypatch):
json={"result": True, "message": "================"}
)
m.register_uri(
- 'GET', 'http://interface-paltry:8080/authz/{}/{}/{}/{}'.format(
+ 'GET', 'http://pipeline-paltry:8080/authz/{}/{}/{}/{}'.format(
CONTEXT.get("invalid_pdp_id"),
CONTEXT.get("subject_name"),
CONTEXT.get("object_name"),
diff --git a/moon_wrapper/tests/unit_python/requirements.txt b/old/moon_wrapper/tests/unit_python/requirements.txt
index 21975ce3..21975ce3 100644
--- a/moon_wrapper/tests/unit_python/requirements.txt
+++ b/old/moon_wrapper/tests/unit_python/requirements.txt
diff --git a/old/python_moonclient/.gitignore b/old/python_moonclient/.gitignore
new file mode 100644
index 00000000..9c29724f
--- /dev/null
+++ b/old/python_moonclient/.gitignore
@@ -0,0 +1,106 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+/tests/unit_python/database.db
diff --git a/python_moonclient/Changelog b/old/python_moonclient/Changelog
index c58d83c4..7cd14340 100644
--- a/python_moonclient/Changelog
+++ b/old/python_moonclient/Changelog
@@ -68,3 +68,11 @@ CHANGES
- moon object data list
- moon action data list
- moon metarule list
+
+1.4.1
+-----
+- Update exception during configuration
+
+1.4.2
+-----
+- apply PyLint rules \ No newline at end of file
diff --git a/old/python_moonclient/LICENSE b/old/python_moonclient/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/old/python_moonclient/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/python_moonclient/MANIFEST.in b/old/python_moonclient/MANIFEST.in
index 2a5ac509..2a5ac509 100644
--- a/python_moonclient/MANIFEST.in
+++ b/old/python_moonclient/MANIFEST.in
diff --git a/python_moonclient/README.md b/old/python_moonclient/README.md
index 1a9731e7..1a9731e7 100644
--- a/python_moonclient/README.md
+++ b/old/python_moonclient/README.md
diff --git a/old/python_moonclient/python_moonclient/__init__.py b/old/python_moonclient/python_moonclient/__init__.py
new file mode 100644
index 00000000..bbd31082
--- /dev/null
+++ b/old/python_moonclient/python_moonclient/__init__.py
@@ -0,0 +1,6 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+__version__ = "1.4.2"
diff --git a/old/python_moonclient/python_moonclient/cli/__init__.py b/old/python_moonclient/python_moonclient/cli/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moonclient/python_moonclient/cli/__init__.py
diff --git a/python_moonclient/python_moonclient/cli/authz.py b/old/python_moonclient/python_moonclient/cli/authz.py
index 2f45e847..4edc307f 100644
--- a/python_moonclient/python_moonclient/cli/authz.py
+++ b/old/python_moonclient/python_moonclient/cli/authz.py
@@ -1,12 +1,13 @@
import logging
-from cliff.command import Command
+
from importlib.machinery import SourceFileLoader
+from cliff.command import Command
from python_moonclient.core import models, policies, pdp, authz
from python_moonclient.cli.parser import Parser
from python_moonclient.cli.projects import ProjectsUtils
-logger = logging.getLogger("moonclient.cli.authz")
+LOGGER = logging.getLogger("moonclient.cli.authz")
class SendAuthz(Command):
@@ -29,13 +30,14 @@ class SendAuthz(Command):
pdp.init(consul_host, consul_port)
if parsed_args.filename:
- logger.info("Loading: {}".format(parsed_args.filename))
+ LOGGER.info("Loading: {}".format(parsed_args.filename))
m = SourceFileLoader("scenario", parsed_args.filename)
scenario = m.load_module()
- keystone_project_id = ProjectsUtils.get_project_id(pdp, parsed_args.id_project, parsed_args.name_project)
+ keystone_project_id = ProjectsUtils.get_project_id(pdp, parsed_args.id_project,
+ parsed_args.name_project)
if keystone_project_id is None:
- logger.error("Project not found !")
+ LOGGER.error("Project not found !")
keystone_project_id = pdp.get_keystone_id(keystone_project_id)
time_data = authz.send_requests(
@@ -50,4 +52,4 @@ class SendAuthz(Command):
destination=parsed_args.destination
)
if not parsed_args.dry_run:
- authz.save_data(parsed_args.write, time_data) \ No newline at end of file
+ authz.save_data(parsed_args.write, time_data)
diff --git a/python_moonclient/python_moonclient/cli/export.py b/old/python_moonclient/python_moonclient/cli/export.py
index a16928de..4ea5cf4f 100644
--- a/python_moonclient/python_moonclient/cli/export.py
+++ b/old/python_moonclient/python_moonclient/cli/export.py
@@ -8,6 +8,7 @@ from cliff.command import Command
class Export(Command):
"""dump the complete moon database into a json file"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_filename_argument(parser)
@@ -27,6 +28,5 @@ class Export(Command):
json_file = open(parsed_args.filename, "w")
json.dump(res["content"], json_file)
return "Export ok!"
- else:
- return "Unexpected results : the returned json does not have the correct syntax"
+ return "Unexpected results : the returned json does not have the correct syntax"
diff --git a/python_moonclient/python_moonclient/cli/import.py b/old/python_moonclient/python_moonclient/cli/import.py
index c6c43439..efefc304 100644
--- a/python_moonclient/python_moonclient/cli/import.py
+++ b/old/python_moonclient/python_moonclient/cli/import.py
@@ -1,4 +1,3 @@
-
from python_moonclient.core import models, policies, pdp, json_import
from python_moonclient.cli.parser import Parser
from python_moonclient.cli.projects import ProjectsUtils
@@ -8,6 +7,7 @@ from cliff.command import Command
class Import(Command):
"""import a json file describing pdps """
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -26,4 +26,3 @@ class Import(Command):
if "message" in res:
return res["message"]
return res
-
diff --git a/python_moonclient/python_moonclient/cli/models.py b/old/python_moonclient/python_moonclient/cli/models.py
index 922a1830..369d9027 100644
--- a/python_moonclient/python_moonclient/cli/models.py
+++ b/old/python_moonclient/python_moonclient/cli/models.py
@@ -1,13 +1,12 @@
import logging
+from importlib.machinery import SourceFileLoader
from cliff.lister import Lister
from cliff.command import Command
-from importlib.machinery import SourceFileLoader
-
from python_moonclient.core import models, policies, pdp
from python_moonclient.cli.parser import Parser
from python_moonclient.cli.projects import ProjectsUtils
-logger = logging.getLogger("moonclient.cli.pdps")
+LOGGER = logging.getLogger("moonclient.cli.pdps")
class ModelUtils:
@@ -19,7 +18,8 @@ class ModelUtils:
modelz = models.check_model()
for _model_key, _model_value in modelz["models"].items():
if _model_key == parsed_id or _model_value['name'] == parsed_name:
- # logger.info("Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
+ # LOGGER.info(
+ # "Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
return _model_key
return None
@@ -28,7 +28,8 @@ class ModelUtils:
modelz = models.check_model()
for _model_key, _model_value in modelz["models"].items():
if _model_key == parsed_id or _model_value['name'] == parsed_name:
- # logger.info("Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
+ # LOGGER.info(
+ # "Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
return _model_value['name']
return None
@@ -156,6 +157,3 @@ class SubjectCategoryAdd(Command):
else:
print("Error while creating subject category")
# subject_categories = models.check_subject_category(subject_category_id)
-
-
-
diff --git a/python_moonclient/python_moonclient/cli/parser.py b/old/python_moonclient/python_moonclient/cli/parser.py
index edd18a25..e71cd6c9 100644
--- a/python_moonclient/python_moonclient/cli/parser.py
+++ b/old/python_moonclient/python_moonclient/cli/parser.py
@@ -1,10 +1,13 @@
-
class Parser:
@staticmethod
def add_common_options(parser):
- parser.add_argument('--consul-host', help='Set the name of the consul server (default: 127.0.0.1)', default="127.0.0.1")
- parser.add_argument('--consul-port', help='Set the port of the consult server (default: 30005)',default="30005")
+ parser.add_argument('--consul-host',
+ help='Set the name of the consul server (default: 127.0.0.1)',
+ default="127.0.0.1")
+ parser.add_argument('--consul-port',
+ help='Set the port of the consult server (default: 30005)',
+ default="30005")
parser.add_argument("--verbose", "-v", action='store_true', help="verbose mode")
parser.add_argument("--debug", "-d", action='store_true', help="debug mode")
@@ -30,7 +33,7 @@ class Parser:
@staticmethod
def add_id_or_name_argument(parser):
- group = parser.add_mutually_exclusive_group(required=True)
+ group = parser.add_mutually_exclusive_group(required=True)
Parser._add_id_argument(group)
Parser._add_name_argument(group)
@@ -44,7 +47,7 @@ class Parser:
@staticmethod
def add_id_or_name_pdp_argument(parser):
- group = parser.add_mutually_exclusive_group(required=True)
+ group = parser.add_mutually_exclusive_group(required=True)
Parser._add_id_pdp_argument(group)
Parser._add_name_pdp_argument(group)
@@ -55,10 +58,10 @@ class Parser:
@staticmethod
def _add_name_pdp_argument(parser):
parser.add_argument('--name-pdp', help='name of the pdp')
-
+
@staticmethod
def add_id_or_name_project_argument(parser):
- group = parser.add_mutually_exclusive_group(required=True)
+ group = parser.add_mutually_exclusive_group(required=True)
Parser._add_id_project_argument(group)
Parser._add_name_project_argument(group)
@@ -92,4 +95,4 @@ class Parser:
help="Execute stressing tests (warning delta measures "
"will be false, implies -t)")
parser.add_argument("--write", "-w", help="Write test data to a JSON file",
- default="/tmp/data.json")
+ default="/tmp/data.json")
diff --git a/python_moonclient/python_moonclient/cli/pdps.py b/old/python_moonclient/python_moonclient/cli/pdps.py
index f1f8fe35..a4f7bba0 100644
--- a/python_moonclient/python_moonclient/cli/pdps.py
+++ b/old/python_moonclient/python_moonclient/cli/pdps.py
@@ -1,13 +1,13 @@
import logging
+from importlib.machinery import SourceFileLoader
from cliff.lister import Lister
from cliff.command import Command
-from importlib.machinery import SourceFileLoader
from python_moonclient.core import models, policies, pdp
from python_moonclient.cli.parser import Parser
from python_moonclient.cli.projects import ProjectsUtils
-logger = logging.getLogger("moonclient.cli.pdps")
+LOGGER = logging.getLogger("moonclient.cli.pdps")
class PdpUtils:
@@ -19,7 +19,8 @@ class PdpUtils:
pdps = pdp.check_pdp()
for _pdp_key, _pdp_value in pdps["pdps"].items():
if _pdp_key == parsed_id or _pdp_value['name'] == parsed_name:
- #logger.info("Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
+ # LOGGER.info(
+ # "Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
return _pdp_key
return None
@@ -28,10 +29,12 @@ class PdpUtils:
pdps = pdp.check_pdp()
for _pdp_key, _pdp_value in pdps["pdps"].items():
if _pdp_key == parsed_id or _pdp_value['name'] == parsed_name:
- #logger.info("Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
+ # LOGGER.info(
+ # "Found pdp : [key='{}' , name='{}']".format(_pdp_key, _pdp_value['name']))
return _pdp_value['name']
return None
+
class Pdps(Lister):
"""show the list of existing pdps """
@@ -50,13 +53,15 @@ class Pdps(Lister):
pdps = pdp.check_pdp()
- return (('Key' , 'Name', 'Project id'),
- ((_pdp_key, _pdp_value['name'], _pdp_value['keystone_project_id']) for _pdp_key, _pdp_value in pdps["pdps"].items())
- )
+ return (('Key', 'Name', 'Project id'),
+ ((_pdp_key, _pdp_value['name'], _pdp_value['keystone_project_id']) for
+ _pdp_key, _pdp_value in pdps["pdps"].items())
+ )
class CreatePdp(Command):
"""create a new pdp from a json file and returns the newly created pdp id"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -78,7 +83,7 @@ class CreatePdp(Command):
pdp.init(consul_host, consul_port)
if parsed_args.filename:
- logger.info("Loading: {}".format(parsed_args.filename))
+ LOGGER.info("Loading: {}".format(parsed_args.filename))
m = SourceFileLoader("scenario", parsed_args.filename)
scenario = m.load_module()
@@ -94,11 +99,12 @@ class CreatePdp(Command):
policy_id = policies.create_policy(scenario, model_id, meta_rule_list)
pdp_id = pdp.create_pdp(scenario, policy_id=policy_id)
pdp_name = PdpUtils.get_pdp_name(pdp, pdp_id, None)
- logger.info("Pdp created : [id='{}', name='{}']".format(pdp_id, pdp_name))
+ LOGGER.info("Pdp created : [id='{}', name='{}']".format(pdp_id, pdp_name))
class DeletePdp(Command):
"""delete an existing pdp"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -117,36 +123,38 @@ class DeletePdp(Command):
_search = PdpUtils.get_pdp_id(pdp, parsed_args.id, parsed_args.name)
_pdp_key = _search
if _pdp_key is None:
- logger.error("Error pdp not found ")
+ LOGGER.error("Error pdp not found ")
return
- #if parsed_args.id:
+ # if parsed_args.id:
# logger.info("Deleting: {}".format(parsed_args.id))
# _search = parsed_args.id
- #if parsed_args.name:
+ # if parsed_args.name:
# logger.info("Deleting: {}".format(parsed_args.name))
# _search = parsed_args.name
-
- #pdps = pdp.check_pdp()
- #for _pdp_key, _pdp_value in pdps["pdps"].items():
+
+ # pdps = pdp.check_pdp()
+ # for _pdp_key, _pdp_value in pdps["pdps"].items():
# if _pdp_key == _search or _pdp_value['name'] == _search:
- logger.info("Found {}".format(_pdp_key))
+ LOGGER.info("Found {}".format(_pdp_key))
pdp.delete_pdp(_pdp_key)
pdps = pdp.check_pdp()
- logger.info("Listing all PDP:")
+ LOGGER.info("Listing all PDP:")
for _pdp_key, _pdp_value in pdps["pdps"].items():
- if _pdp_key == _search : #or _pdp_value['name'] == _search:
- logger.error("Error in deleting {}".format(_search))
+ if _pdp_key == _search: # or _pdp_value['name'] == _search:
+ LOGGER.error("Error in deleting {}".format(_search))
return (('Key', 'Name', 'Project id'),
- ((_pdp_key, _pdp_value['name'], _pdp_value['keystone_project_id']) for _pdp_key, _pdp_value in
+ ((_pdp_key, _pdp_value['name'], _pdp_value['keystone_project_id']) for
+ _pdp_key, _pdp_value in
pdps["pdps"].items())
)
class MapPdp(Command):
"""map an existing pdp to a keystone project"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -162,19 +170,21 @@ class MapPdp(Command):
policies.init(consul_host, consul_port)
pdp.init(consul_host, consul_port)
- #_pdp_key = PdpUtils.get_pdp_id(pdp, parsed_args.id_pdp, parsed_args.name_pdp)
+ # _pdp_key = PdpUtils.get_pdp_id(pdp, parsed_args.id_pdp, parsed_args.name_pdp)
_pdp_name = PdpUtils.get_pdp_name(pdp, parsed_args.id_pdp, parsed_args.name_pdp)
if _pdp_name is None:
- logger.error("Error pdp not found ")
+ LOGGER.error("Error pdp not found ")
return
- #_project_key = ProjectsUtils.get_project_id(pdp, parsed_args.id_project, parsed_args.name_project)
- _project_name = ProjectsUtils.get_project_name(pdp, parsed_args.id_project, parsed_args.name_project)
+ # _project_key = ProjectsUtils.get_project_id(
+ # pdp, parsed_args.id_project, parsed_args.name_project)
+ _project_name = ProjectsUtils.get_project_name(pdp, parsed_args.id_project,
+ parsed_args.name_project)
if _project_name is None:
- logger.error("Error project not found ")
+ LOGGER.error("Error project not found ")
return
- logger.info("Mapping: {}=>{}".format(_pdp_name, _project_name))
+ LOGGER.info("Mapping: {}=>{}".format(_pdp_name, _project_name))
- #pdp.map_to_keystone(pdp_id=parsed_args.id_pdp, keystone_project_id=parsed_args.id_project)
+ # pdp.map_to_keystone(pdp_id=parsed_args.id_pdp, keystone_project_id=parsed_args.id_project)
pdp.map_to_keystone(pdp_id=_pdp_name, keystone_project_id=_project_name)
diff --git a/python_moonclient/python_moonclient/cli/policies.py b/old/python_moonclient/python_moonclient/cli/policies.py
index 94d13db1..af8e959b 100644
--- a/python_moonclient/python_moonclient/cli/policies.py
+++ b/old/python_moonclient/python_moonclient/cli/policies.py
@@ -6,7 +6,7 @@ from python_moonclient.cli.parser import Parser
from python_moonclient.core import models, policies, pdp
-logger = logging.getLogger("moonclient.cli.pdps")
+LOGGER = logging.getLogger("moonclient.cli.pdps")
class PoliciesUtils:
@@ -16,23 +16,25 @@ class PoliciesUtils:
@staticmethod
def get_policy_id(policies, parsed_id, parsed_name):
_policies = policies.check_policy()
- for _policy_key, _policy_value in _policies["policies"].items():
+ for _policy_key, _policy_value in _policies["policies"].items():
if _policy_key == parsed_id or _policy_value['name'] == parsed_name:
- #logger.info("Found {}".format(_policy_key))
+ # logger.info("Found {}".format(_policy_key))
return _policy_key
return None
@staticmethod
def get_policy_name(policies, parsed_id, parsed_name):
_policies = policies.check_policy()
- for _policy_key, _policy_value in _policies["policies"].items():
+ for _policy_key, _policy_value in _policies["policies"].items():
if _policy_key == parsed_id or _policy_value['name'] == parsed_name:
- #logger.info("Found {}".format(_policy_key))
+ # logger.info("Found {}".format(_policy_key))
return _policy_value['name']
return None
+
class Policies(Lister):
"""show the list of existing policies"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -47,9 +49,10 @@ class Policies(Lister):
pdp.init(consul_host, consul_port)
_policies = policies.check_policy()
- return (('Key' , 'Name'),
- ((_policy_key, _policy_value['name']) for _policy_key, _policy_value in _policies["policies"].items())
- )
+ return (('Key', 'Name'),
+ ((_policy_key, _policy_value['name']) for _policy_key, _policy_value in
+ _policies["policies"].items())
+ )
class Subjects(Lister):
@@ -70,14 +73,15 @@ class Subjects(Lister):
_policies = policies.check_subject(parsed_args.id, parsed_args.policy_id)
- return (('Key' , 'Name'),
- ((_policy_key, _policy_value['name']) for _policy_key, _policy_value in _policies["policies"].items())
- )
-
+ return (('Key', 'Name'),
+ ((_policy_key, _policy_value['name']) for _policy_key, _policy_value in
+ _policies["policies"].items())
+ )
class DeletePolicy(Command):
"""delete an existing policy"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -92,27 +96,28 @@ class DeletePolicy(Command):
policies.init(consul_host, consul_port)
pdp.init(consul_host, consul_port)
- policy_id = PoliciesUtils.get_policy_id(policies,parsed_args.id, parsed_args.name)
+ policy_id = PoliciesUtils.get_policy_id(policies, parsed_args.id, parsed_args.name)
policy_name = PoliciesUtils.get_policy_name(policies, parsed_args.id, parsed_args.name)
- logger.info("Deleting: {}".format(policy_name))
+ LOGGER.info("Deleting: {}".format(policy_name))
pdp.delete_pdp(policy_id)
_policies = policies.check_policy()
- #logger.info("Listing all Policies:")
+ # logger.info("Listing all Policies:")
for _policy_key, _policy_value in _policies["policies"].items():
- #print(" {} {}".format(_policy_key, _policy_value['name']))
+ # print(" {} {}".format(_policy_key, _policy_value['name']))
if _policy_key == policy_id:
- logger.error("Error in deleting {}".format(policy_id))
+ LOGGER.error("Error in deleting {}".format(policy_id))
return (('Key', 'Value'),
- ((_policy_key, _policy_value) for _policy_key, _policy_value in _policies["policies"].items())
+ ((_policy_key, _policy_value) for _policy_key, _policy_value in
+ _policies["policies"].items())
)
-
class SubjectDatas(Lister):
"""list the subject data """
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -128,17 +133,20 @@ class SubjectDatas(Lister):
policies.init(consul_host, consul_port)
pdp.init(consul_host, consul_port)
- subject_data = policies.check_subject_data(parsed_args.policy_id, None, parsed_args.category_id)
+ subject_data = policies.check_subject_data(parsed_args.policy_id, None,
+ parsed_args.category_id)
if len(subject_data["subject_data"]) == 0:
- return (('Key', 'Name'),())
+ return (('Key', 'Name'), ())
return (('Key', 'Name'),
- ((_subject_key, subject_data["subject_data"][0]["data"][_subject_key]['name']) for _subject_key in subject_data["subject_data"][0]["data"].keys())
- )
+ ((_subject_key, subject_data["subject_data"][0]["data"][_subject_key]['name']) for
+ _subject_key in subject_data["subject_data"][0]["data"].keys())
+ )
class ObjectDatas(Lister):
"""list the object data"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -154,19 +162,22 @@ class ObjectDatas(Lister):
policies.init(consul_host, consul_port)
pdp.init(consul_host, consul_port)
- object_datas = policies.check_object_data(parsed_args.policy_id, None, parsed_args.category_id)
+ object_datas = policies.check_object_data(parsed_args.policy_id, None,
+ parsed_args.category_id)
if len(object_datas["object_data"]) == 0:
- return (('Key', 'Name'),())
+ return (('Key', 'Name'), ())
object_data = object_datas["object_data"][0]["data"]
- res = (('Key', 'Name'),
- ((_object_key, object_data[_object_key]["value"]['name']) for _object_key in list(object_data))
+ res = (('Key', 'Name'),
+ ((_object_key, object_data[_object_key]["value"]['name']) for _object_key in
+ list(object_data))
)
return res
class ActionDatas(Lister):
"""list the action data"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -182,19 +193,22 @@ class ActionDatas(Lister):
policies.init(consul_host, consul_port)
pdp.init(consul_host, consul_port)
- action_datas = policies.check_action_data(parsed_args.policy_id, None, parsed_args.category_id)
+ action_datas = policies.check_action_data(parsed_args.policy_id, None,
+ parsed_args.category_id)
if len(action_datas["action_data"]) == 0:
- return (('Key', 'Name'),())
+ return (('Key', 'Name'), ())
action_data = action_datas["action_data"][0]["data"]
- res = (('Key', 'Name'),
- ((_action_key, action_data[_action_key]["value"]['name']) for _action_key in list(action_data))
+ res = (('Key', 'Name'),
+ ((_action_key, action_data[_action_key]["value"]['name']) for _action_key in
+ list(action_data))
)
return res
class MetaRules(Lister):
"""list the meta rules"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -211,16 +225,18 @@ class MetaRules(Lister):
metarule_datas = policies.check_meta_rule()
if len(metarule_datas["meta_rules"]) == 0:
- return (('Key', 'Name'),())
+ return (('Key', 'Name'), ())
metarule_data = metarule_datas["meta_rules"]
- res = (('Key', 'Name'),
- ((_key, metarule_data[_key]['name']) for _key in list(metarule_data))
+ res = (('Key', 'Name'),
+ ((_key, metarule_data[_key]['name']) for _key in list(metarule_data))
)
return res
+
class CreateSubjectData(Command):
"""create a subject data according to a policy and a category"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -237,10 +253,12 @@ class CreateSubjectData(Command):
policies.init(consul_host, consul_port)
pdp.init(consul_host, consul_port)
- subject_data_id = policies.add_subject_data(parsed_args.policy_id, parsed_args.category_id, parsed_args.name)
+ subject_data_id = policies.add_subject_data(parsed_args.policy_id, parsed_args.category_id,
+ parsed_args.name)
if subject_data_id is not None:
print("Subject category created with id {}".format(subject_data_id))
else:
print("Error while creating subject category")
- subject_data = policies.check_subject_data(parsed_args.policy_id, None, parsed_args.category_id)
+ subject_data = policies.check_subject_data(parsed_args.policy_id, None,
+ parsed_args.category_id)
# subject_categories = models.check_subject_category(subject_category_id)
diff --git a/python_moonclient/python_moonclient/cli/projects.py b/old/python_moonclient/python_moonclient/cli/projects.py
index c4653a51..1caa0ace 100644
--- a/python_moonclient/python_moonclient/cli/projects.py
+++ b/old/python_moonclient/python_moonclient/cli/projects.py
@@ -3,7 +3,7 @@ from python_moonclient.core import models, policies, pdp
from python_moonclient.cli.parser import Parser
from cliff.lister import Lister
-logger = logging.getLogger("moonclient.cli.projects")
+LOGGER = logging.getLogger("moonclient.cli.projects")
class ProjectsUtils:
@@ -15,7 +15,8 @@ class ProjectsUtils:
projects = pdp.get_keystone_projects()
for _project_value in projects['projects']:
if _project_value['id'] == parsed_id or _project_value['name'] == parsed_name:
- #logger.info("Found project : [key='{}' , name='{}']".format(_project_value['id'], _project_value['name']))
+ # LOGGER.info(
+ # "Found project : [key='{}' , name='{}']".format(_project_value['id'], _project_value['name']))
return _project_value['id']
return None
@@ -24,7 +25,8 @@ class ProjectsUtils:
projects = pdp.get_keystone_projects()
for _project_value in projects['projects']:
if _project_value['id'] == parsed_id or _project_value['name'] == parsed_name:
- #logger.info("Found project : [key='{}' , name='{}']".format(_project_value['id'], _project_value['name']))
+ # LOGGER.info(
+ # "Found project : [key='{}' , name='{}']".format(_project_value['id'], _project_value['name']))
return _project_value['name']
return None
@@ -47,10 +49,6 @@ class Projects(Lister):
projects = pdp.get_keystone_projects()
- return (('Id' , 'Name'),
- ((_project['id'], _project['name']) for _project in projects['projects'])
- )
-
-
-
-
+ return (('Id', 'Name'),
+ ((_project['id'], _project['name']) for _project in projects['projects'])
+ )
diff --git a/python_moonclient/python_moonclient/cli/slaves.py b/old/python_moonclient/python_moonclient/cli/slaves.py
index 1880f4c2..587e9033 100644
--- a/python_moonclient/python_moonclient/cli/slaves.py
+++ b/old/python_moonclient/python_moonclient/cli/slaves.py
@@ -5,7 +5,7 @@ from cliff.command import Command
from python_moonclient.core import models, policies, pdp, slaves
from python_moonclient.cli.parser import Parser
-logger = logging.getLogger("moonclient.cli.slaves")
+LOGGER = logging.getLogger("moonclient.cli.slaves")
class SlavesUtils:
@@ -17,13 +17,14 @@ class SlavesUtils:
_slaves = slaves.get_slaves()
for _slave_value in _slaves['slaves']:
if _slave_value['name'] == parsed_name:
- logger.info("Found {}".format(_slave_value['name']))
+ LOGGER.info("Found {}".format(_slave_value['name']))
return _slave_value['name']
return None
class Slaves(Lister):
"""show the list of slaves"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -43,12 +44,14 @@ class Slaves(Lister):
slaves.init(consul_host, consul_port)
return (('Name', 'Configured'),
- ((value['name'], value['configured']) for value in slaves.get_slaves().get('slaves', dict()))
+ ((value['name'], value['configured']) for value in
+ slaves.get_slaves().get('slaves', dict()))
)
class SetSlave(Command):
"""update an existing slave to a configured state"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -73,14 +76,14 @@ class SetSlave(Command):
slave_input_name = "kubernetes-admin@kubernetes"
slaves.set_slave(slave_input_name)
- #if slave_name is None:
+ # if slave_name is None:
# slave_name = "kubernetes-admin@kubernetes"
- #if parsed_args.name:
+ # if parsed_args.name:
# slave_name = parsed_args.name
print(" {} (configured=True)".format(slave_input_name))
- #for value in slaves.set_slave(slave_name).get('slaves', dict()):
+ # for value in slaves.set_slave(slave_name).get('slaves', dict()):
# if value['configured']:
# print(" {} (configured)".format(value['name']))
# else:
@@ -89,6 +92,7 @@ class SetSlave(Command):
class DeleteSlave(Command):
"""update an existing slave to a unconfigured state"""
+
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
Parser.add_common_options(parser)
@@ -114,7 +118,3 @@ class DeleteSlave(Command):
slaves.delete_slave(slave_input_name)
print(" {} (configured=False)".format(slave_input_name))
-
-
-
-
diff --git a/old/python_moonclient/python_moonclient/core/__init__.py b/old/python_moonclient/python_moonclient/core/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moonclient/python_moonclient/core/__init__.py
diff --git a/python_moonclient/python_moonclient/core/authz.py b/old/python_moonclient/python_moonclient/core/authz.py
index 7bf9b57b..d331004c 100644
--- a/python_moonclient/python_moonclient/core/authz.py
+++ b/old/python_moonclient/python_moonclient/core/authz.py
@@ -1,19 +1,19 @@
+from uuid import uuid4
import copy
import logging
import threading
-import requests
import time
import json
import random
-from uuid import uuid4
+import requests
HOST_MANAGER = None
PORT_MANAGER = None
HOST_KEYSTONE = None
PORT_KEYSTONE = None
-lock = threading.Lock()
-logger = logging.getLogger("moonclient.core.authz")
+LOCK = threading.Lock()
+LOGGER = logging.getLogger("moonclient.core.authz")
def _construct_payload(creds, current_rule, enforcer, target):
@@ -43,15 +43,16 @@ def _send(url, data=None, stress_test=False):
try:
if stress_test:
current_request['start'] = time.time()
- # with lock:
+ # with LOCK:
res = requests.get(url)
current_request['end'] = time.time()
current_request['delta'] = current_request["end"] - current_request["start"]
else:
- with lock:
+ with LOCK:
current_request['start'] = time.time()
if data:
- data, _ = _construct_payload(data['credentials'], data['rule'], True, data['target'])
+ data, _ = _construct_payload(data['credentials'], data['rule'], True,
+ data['target'])
res = requests.post(url, json=data,
headers={'content-type': "application/x-www-form-urlencode"}
)
@@ -60,34 +61,34 @@ def _send(url, data=None, stress_test=False):
current_request['end'] = time.time()
current_request['delta'] = current_request["end"] - current_request["start"]
except requests.exceptions.ConnectionError:
- logger.warning("Unable to connect to server")
+ LOGGER.warning("Unable to connect to server")
return {}
if not stress_test:
try:
j = res.json()
if res.status_code == 200:
- logger.warning("\033[1m{}\033[m \033[32mGrant\033[m".format(url))
+ LOGGER.warning("\033[1m{}\033[m \033[32mGrant\033[m".format(url))
elif res.status_code == 401:
- logger.warning("\033[1m{}\033[m \033[31mDeny\033[m".format(url))
+ LOGGER.warning("\033[1m{}\033[m \033[31mDeny\033[m".format(url))
else:
- logger.error("\033[1m{}\033[m {} {}".format(url, res.status_code, res.text))
+ LOGGER.error("\033[1m{}\033[m {} {}".format(url, res.status_code, res.text))
except Exception as e:
if res.text == "True":
- logger.warning("\033[1m{}\033[m \033[32mGrant\033[m".format(url))
+ LOGGER.warning("\033[1m{}\033[m \033[32mGrant\033[m".format(url))
elif res.text == "False":
- logger.warning("\033[1m{}\033[m \033[31mDeny\033[m".format(url))
+ LOGGER.warning("\033[1m{}\033[m \033[31mDeny\033[m".format(url))
else:
- logger.error("\033[1m{}\033[m {} {}".format(url, res.status_code, res.text))
- logger.exception(e)
- logger.error(res.text)
+ LOGGER.error("\033[1m{}\033[m {} {}".format(url, res.status_code, res.text))
+ LOGGER.exception(e)
+ LOGGER.error(res.text)
else:
if j.get("result"):
# logger.warning("{} \033[32m{}\033[m".format(url, j.get("result")))
- logger.debug("{}".format(j.get("error", "")))
+ LOGGER.debug("{}".format(j.get("error", "")))
current_request['result'] = "Grant"
else:
# logger.warning("{} \033[31m{}\033[m".format(url, "Deny"))
- logger.debug("{}".format(j))
+ LOGGER.debug("{}".format(j))
current_request['result'] = "Deny"
return current_request
@@ -110,35 +111,37 @@ class AsyncGet(threading.Thread):
self.result['index'] = self.index
-def send_requests(scenario, authz_host, authz_port, keystone_project_id, request_second=1, limit=500,
+def send_requests(scenario, authz_host, authz_port, keystone_project_id, request_second=1,
+ limit=500,
dry_run=None, stress_test=False, destination="wrapper"):
backgrounds = []
time_data = list()
start_timing = time.time()
request_cpt = 0
- SUBJECTS = tuple(scenario.subjects.keys())
- OBJECTS = tuple(scenario.objects.keys())
- ACTIONS = tuple(scenario.actions.keys())
+ subjects = tuple(scenario.subjects.keys())
+ objects = tuple(scenario.objects.keys())
+ actions = tuple(scenario.actions.keys())
while request_cpt < limit:
- rule = (random.choice(SUBJECTS), random.choice(OBJECTS), random.choice(ACTIONS))
+ rule = (random.choice(subjects), random.choice(objects), random.choice(actions))
if destination.lower() == "wrapper":
url = "http://{}:{}/authz/oslo".format(authz_host, authz_port)
data = {
'target': {
- "user_id": random.choice(SUBJECTS),
+ "user_id": random.choice(subjects),
"target": {
- "name": random.choice(OBJECTS)
+ "name": random.choice(objects)
},
"project_id": keystone_project_id
},
'credentials': None,
- 'rule': random.choice(ACTIONS)
+ 'rule': random.choice(actions)
}
else:
- url = "http://{}:{}/authz/{}/{}".format(authz_host, authz_port, keystone_project_id, "/".join(rule))
+ url = "http://{}:{}/authz/{}/{}".format(authz_host, authz_port, keystone_project_id,
+ "/".join(rule))
data = None
if dry_run:
- logger.info(url)
+ LOGGER.info(url)
continue
request_cpt += 1
if stress_test:
@@ -150,9 +153,9 @@ def send_requests(scenario, authz_host, authz_port, keystone_project_id, request
background.start()
if request_second > 0:
if request_cpt % request_second == 0:
- if time.time()-start_timing < 1:
+ if time.time() - start_timing < 1:
while True:
- if time.time()-start_timing > 1:
+ if time.time() - start_timing > 1:
break
start_timing = time.time()
if not stress_test:
@@ -175,4 +178,3 @@ def get_delta(time_data):
time_delta_sum1 += item['delta']
time_delta_average1 = time_delta_sum1 / len(time_data)
return time_delta, time_delta_average1
-
diff --git a/python_moonclient/python_moonclient/core/check_tools.py b/old/python_moonclient/python_moonclient/core/check_tools.py
index 8138f54e..381e92c7 100644
--- a/python_moonclient/python_moonclient/core/check_tools.py
+++ b/old/python_moonclient/python_moonclient/core/check_tools.py
@@ -10,16 +10,19 @@ def check_optionnal_result(result):
def check_result(result):
if type(result) is not dict or "result" not in result:
- raise MoonCliException("Unexpected request result. It should be a dictionnary with a 'result' entry")
+ raise MoonCliException(
+ "Unexpected request result. It should be a dictionnary with a 'result' entry")
if result["result"] is None:
raise MoonCliException("Unexpected request result. The 'result' entry shall not be null")
def _check_generic_in_result(field, result, check_not_null=False):
if type(field) is not str or type(result) is not dict or field not in result:
- raise MoonCliException("Unexpected request result. It should be a dictionnary with a '{}' entry".format(field))
+ raise MoonCliException(
+ "Unexpected request result. It should be a dictionnary with a '{}' entry".format(field))
if check_not_null is True and result[field] is None:
- raise MoonCliException("Unexpected request result. The '{}' entry shall not be null".format(field))
+ raise MoonCliException(
+ "Unexpected request result. The '{}' entry shall not be null".format(field))
def check_slaves_in_result(result):
@@ -93,13 +96,17 @@ def check_pdp_id(pdp_id, result):
def _check_generic_name(field, name, field_elt_id, result, do_check_name=True):
if type(field) is str:
if result[field] is None:
- raise MoonCliException("Unexpected request result : {} shall not be empty".format(field))
+ raise MoonCliException(
+ "Unexpected request result : {} shall not be empty".format(field))
if field_elt_id not in result[field]:
raise MoonCliException("Unexpected request result. Unknown {} id".format(field))
if "name" not in result[field][field_elt_id]:
- raise MoonCliException("Unexpected request result : {} with id {} has no name".format(field, field_elt_id))
+ raise MoonCliException(
+ "Unexpected request result : {} with id {} has no name".format(field, field_elt_id))
if do_check_name and name != result[field][field_elt_id]["name"]:
- raise MoonCliException("Unexpected request result : {} with id {} has a bad name. Expected {}".format(field, field_elt_id, name))
+ raise MoonCliException(
+ "Unexpected request result : {} with id {} has a bad name. Expected {}".format(
+ field, field_elt_id, name))
def check_model_name(name, model_id, result, do_check_name):
@@ -159,7 +166,9 @@ def check_acat_id_in_dict(acat_id, in_dict):
def check_policy_id_in_pipeline(policy_id, pipeline):
if policy_id not in pipeline:
- raise MoonCliException("Unexpected request result. The policy id {} shall be in the pipeline".format(policy_id))
+ raise MoonCliException(
+ "Unexpected request result. The policy id {} shall be in the pipeline".format(
+ policy_id))
def _check_generic_policy_in_dict(field, policy_id, in_dict):
@@ -167,10 +176,12 @@ def _check_generic_policy_in_dict(field, policy_id, in_dict):
if policy_id is not None:
if "policy_list" not in in_dict:
raise MoonCliException(
- "Unexpected request result. The policy list of the {} shall not be empty".format(field))
+ "Unexpected request result. The policy list of the {} shall not be empty".format(
+ field))
if policy_id not in in_dict["policy_list"]:
raise MoonCliException(
- "Unexpected request result. The policy with id {} shall be in the {}".format(policy_id, field))
+ "Unexpected request result. The policy with id {} shall be in the {}".format(
+ policy_id, field))
def check_subject_policy(policy_id, in_dict):
@@ -188,14 +199,19 @@ def check_action_policy(policy_id, in_dict):
def _check_generic_elt_id(field1, field1_id, field2, field2_id, result):
if type(field1) is str and type(field2) is str:
if result[field1] is None:
- raise MoonCliException("Unexpected request result: {} shall not be empty".format(field1))
+ raise MoonCliException(
+ "Unexpected request result: {} shall not be empty".format(field1))
if field1_id not in result[field1]:
raise MoonCliException("Unexpected request result. Unknown {} with id".format(field1))
if field2 not in result[field1][field1_id]:
- raise MoonCliException("Unexpected request result. {} element with id {} has no {} field".format(field1, field1_id, field2))
+ raise MoonCliException(
+ "Unexpected request result. {} element with id {} has no {} field".format(field1,
+ field1_id,
+ field2))
if field2_id != result[field1][field1_id][field2]:
raise MoonCliException(
- "Unexpected request result. {} element with id {} has a bad {} id. Expected {}".format(field1, field1_id, field2, field2_id))
+ "Unexpected request result. {} element with id {} has a bad {} id. Expected {}".format(
+ field1, field1_id, field2, field2_id))
def check_policy_model_id(model_id, policy_id, result):
@@ -213,7 +229,8 @@ def check_subject_description(description, in_dict):
"Unexpected request result. The description of the subject shall not be empty")
if description not in in_dict["description"]:
raise MoonCliException(
- "Unexpected request result. The description {} shall be in the subject".format(description))
+ "Unexpected request result. The description {} shall be in the subject".format(
+ description))
def check_meta_rules_list_in_model(meta_rule_list, model_id, result):
@@ -222,9 +239,13 @@ def check_meta_rules_list_in_model(meta_rule_list, model_id, result):
if model_id not in result['models']:
raise MoonCliException("Unexpected request result. Unknown Model id")
if "meta_rules" not in result['models'][model_id]:
- raise MoonCliException("Unexpected request result. Meta rules related to model with id {} are empty".format(model_id))
+ raise MoonCliException(
+ "Unexpected request result. Meta rules related to model with id {} are empty".format(
+ model_id))
if meta_rule_list != result['models'][model_id]["meta_rules"]:
- raise MoonCliException("Unexpected request result. Meta rule of model with id {} are different from those expected".format(model_id))
+ raise MoonCliException(
+ "Unexpected request result. Meta rule of model with id {} are different from those expected".format(
+ model_id))
def check_name_in_slaves(name, slaves):
@@ -235,10 +256,11 @@ def check_name_in_slaves(name, slaves):
raise MoonCliException("The slave '{}' was not found !".format(name))
-def _check_generic_data_data(field,result):
+def _check_generic_data_data(field, result):
if type(field) is str:
if field not in result:
- raise MoonCliException("Unexpected request result. The {} field shall be in result".format(field))
+ raise MoonCliException(
+ "Unexpected request result. The {} field shall be in result".format(field))
# if "data" not in resulti[field]:
# raise MoonCliException("Unexpected request result. The data field shall be in result['{}']".format(field))
@@ -248,7 +270,8 @@ def _check_id_in_generic_data_data(field, data_id, result):
_check_generic_data_data(field, result)
for _data in result[field]:
if data_id not in list(_data['data'].keys()):
- raise MoonCliException("Unexpected request result. Data id {} not in {}".format(data_id, field))
+ raise MoonCliException(
+ "Unexpected request result. Data id {} not in {}".format(data_id, field))
def _check_id_not_in_generic_data_data(field, data_id, result):
@@ -256,14 +279,18 @@ def _check_id_not_in_generic_data_data(field, data_id, result):
_check_generic_data_data(field, result)
for _data in result[field]:
if data_id in list(_data['data'].keys()):
- raise MoonCliException("Unexpected request result. Data id {} shall not be in {}".format(data_id, field))
+ raise MoonCliException(
+ "Unexpected request result. Data id {} shall not be in {}".format(data_id,
+ field))
def _check_category_in_generic_data_data(field, category_id, result):
_check_generic_data_data(field, result)
for _data in result[field]:
if category_id != _data["category_id"]:
- raise MoonCliException("Unexpected request result. Category id {} not in {} data".format(category_id, field))
+ raise MoonCliException(
+ "Unexpected request result. Category id {} not in {} data".format(category_id,
+ field))
def check_subject_data_data(result):
@@ -314,74 +341,92 @@ def check_category_id_in_action_data_data(category_id, result):
_check_category_in_generic_data_data('action_data', category_id, result)
-def _check_generic_assignments(field, field_id_name, field_id, field_cat_id, field_data_id, result):
+def _check_generic_assignments(field, field_id_name, field_id, field_cat_id, field_data_id, result):
if type(field) is str and type(field_id_name) is str:
for key in result[field]:
if field_id_name not in result[field][key]:
- raise MoonCliException("Unexpected request result. subject_id not in result[{}] data".format(field))
+ raise MoonCliException(
+ "Unexpected request result. subject_id not in result[{}] data".format(field))
if "category_id" not in result[field][key]:
- raise MoonCliException("Unexpected request result. category_id not in result[{}] data".format(field))
+ raise MoonCliException(
+ "Unexpected request result. category_id not in result[{}] data".format(field))
if "assignments" not in result[field][key]:
- raise MoonCliException("Unexpected request result. assignments not in result[{}] data".format(field))
+ raise MoonCliException(
+ "Unexpected request result. assignments not in result[{}] data".format(field))
if result[field][key][field_id_name] == field_id and \
result[field][key]["category_id"] == field_cat_id:
if field_data_id not in result[field][key]["assignments"]:
raise MoonCliException(
- "Unexpected request result. {} data with id {} not in result[{}][]['assignements'] data".format(field, field_data_id, field))
+ "Unexpected request result. {} data with id {} not in result[{}][]['assignements'] data".format(
+ field, field_data_id, field))
def check_subject_assignements(subject_id, subject_act_id, subject_data_id, result):
- _check_generic_assignments("subject_assignments", "subject_id", subject_id, subject_act_id, subject_data_id, result)
+ _check_generic_assignments("subject_assignments", "subject_id", subject_id, subject_act_id,
+ subject_data_id, result)
def check_object_assignements(object_id, object_act_id, object_data_id, result):
- _check_generic_assignments("object_assignments", "object_id", object_id, object_act_id, object_data_id, result)
+ _check_generic_assignments("object_assignments", "object_id", object_id, object_act_id,
+ object_data_id, result)
def check_action_assignements(action_id, action_act_id, action_data_id, result):
- _check_generic_assignments("action_assignments", "action_id", action_id, action_act_id, action_data_id, result)
+ _check_generic_assignments("action_assignments", "action_id", action_id, action_act_id,
+ action_data_id, result)
-def _check_not_generic_assignments(field, field_id_name, field_id, field_cat_id, field_data_id, result):
+def _check_not_generic_assignments(field, field_id_name, field_id, field_cat_id, field_data_id,
+ result):
if type(field) is str and type(field_id_name) is str:
for key in result[field]:
if field_id_name not in result[field][key]:
- raise MoonCliException("Unexpected request result. subject_id not in result[{}] data".format(field))
+ raise MoonCliException(
+ "Unexpected request result. subject_id not in result[{}] data".format(field))
if "category_id" not in result[field][key]:
- raise MoonCliException("Unexpected request result. category_id not in result[{}] data".format(field))
+ raise MoonCliException(
+ "Unexpected request result. category_id not in result[{}] data".format(field))
if "assignments" not in result[field][key]:
- raise MoonCliException("Unexpected request result. assignments not in result[{}] data".format(field))
+ raise MoonCliException(
+ "Unexpected request result. assignments not in result[{}] data".format(field))
if result[field][key]['subject_id'] == field_id and \
result[field][key]["category_id"] == field_cat_id:
if field_data_id in result[field][key]["assignments"]:
raise MoonCliException(
- "Unexpected request result. {} data with id {} shall not be in result[{}][]['assignements'] data".format(field, field_data_id, field))
+ "Unexpected request result. {} data with id {} shall not be in result[{}][]['assignements'] data".format(
+ field, field_data_id, field))
def check_not_subject_assignements(subject_id, subject_act_id, subject_data_id, result):
- _check_not_generic_assignments("subject_assignments", "subject_id", subject_id, subject_act_id, subject_data_id, result)
+ _check_not_generic_assignments("subject_assignments", "subject_id", subject_id, subject_act_id,
+ subject_data_id, result)
def check_not_object_assignements(object_id, object_act_id, object_data_id, result):
- _check_not_generic_assignments("object_assignments", "object_id", object_id, object_act_id, object_data_id, result)
+ _check_not_generic_assignments("object_assignments", "object_id", object_id, object_act_id,
+ object_data_id, result)
def check_not_action_assignements(action_id, action_act_id, action_data_id, result):
- _check_not_generic_assignments("action_assignments", "action_id", action_id, action_act_id, action_data_id, result)
+ _check_not_generic_assignments("action_assignments", "action_id", action_id, action_act_id,
+ action_data_id, result)
def check_policy_id_in_dict(policy_id, in_dict):
if "policy_id" not in in_dict:
raise MoonCliException("Unexpected request result. policy_id not in result")
if policy_id != in_dict["policy_id"]:
- raise MoonCliException("Unexpected request result. Bad policy id in result, expected {}".format(policy_id))
+ raise MoonCliException(
+ "Unexpected request result. Bad policy id in result, expected {}".format(policy_id))
def check_meta_rule_id_in_dict(meta_rule_id, in_dict):
if "meta_rule_id" not in in_dict:
raise MoonCliException("Unexpected request result. meta_rule_id not in result")
if meta_rule_id != in_dict["meta_rule_id"]:
- raise MoonCliException("Unexpected request result. Bad meta rule id in result, expected {}".format(meta_rule_id))
+ raise MoonCliException(
+ "Unexpected request result. Bad meta rule id in result, expected {}".format(
+ meta_rule_id))
def check_rule_in_dict(rule, in_dict):
@@ -399,7 +444,8 @@ def check_rule_id_in_list(meta_rule_id, rule_id, rule, in_dict):
if meta_rule_id == item["meta_rule_id"]:
if rule_id == item["id"]:
if rule != item["rule"]:
- raise MoonCliException("Unexpected request result. Bad rule in result, expected {}".format(rule))
+ raise MoonCliException(
+ "Unexpected request result. Bad rule in result, expected {}".format(rule))
def check_rule_id_not_in_list(rule_id, in_dict):
@@ -408,4 +454,5 @@ def check_rule_id_not_in_list(rule_id, in_dict):
if rule_id == item["id"]:
found_rule = True
if found_rule is True:
- raise MoonCliException("Unexpected request result. Rule with id {} shall not be in result".format(rule_id)) \ No newline at end of file
+ raise MoonCliException(
+ "Unexpected request result. Rule with id {} shall not be in result".format(rule_id))
diff --git a/python_moonclient/python_moonclient/core/cli_exceptions.py b/old/python_moonclient/python_moonclient/core/cli_exceptions.py
index 2ec2ed18..01fd23e0 100644
--- a/python_moonclient/python_moonclient/core/cli_exceptions.py
+++ b/old/python_moonclient/python_moonclient/core/cli_exceptions.py
@@ -1,7 +1,4 @@
class MoonCliException(Exception):
def __init__(self, message):
-
# Call the base class constructor with the parameters it needs
super(MoonCliException, self).__init__(message)
-
-
diff --git a/python_moonclient/python_moonclient/core/config.py b/old/python_moonclient/python_moonclient/core/config.py
index 300ebf1a..c123499b 100644
--- a/python_moonclient/python_moonclient/core/config.py
+++ b/old/python_moonclient/python_moonclient/core/config.py
@@ -7,16 +7,17 @@ def get_configuration(consul_host, consul_port, key):
url = "http://{}:{}/v1/kv/{}".format(consul_host, consul_port, key)
req = requests.get(url)
if req.status_code != 200:
- raise Exception("xxx")
+ raise Exception("Exception when retrieving configuration from Consul: {} {}".format(
+ req.status_code, req.text
+ ))
data = req.json()
if len(data) == 1:
data = data[0]
return {data["Key"]: json.loads(base64.b64decode(data["Value"]).decode("utf-8"))}
- else:
- return [
- {item["Key"]: json.loads(base64.b64decode(item["Value"]).decode("utf-8"))}
- for item in data
- ]
+ return [
+ {item["Key"]: json.loads(base64.b64decode(item["Value"]).decode("utf-8"))}
+ for item in data
+ ]
def get_config_data(consul_host, consul_port):
@@ -29,9 +30,9 @@ def get_config_data(consul_host, consul_port):
'components/manager')['components/manager']['external']['port']
try:
requests.get("http://{}:{}/".format(
- conf_data['manager_host'],
- conf_data['manager_port']
- ),
+ conf_data['manager_host'],
+ conf_data['manager_port']
+ ),
timeout=2)
except requests.exceptions.ConnectionError:
conf_data['manager_host'] = get_configuration(consul_host, consul_port,
@@ -52,9 +53,12 @@ def get_config_data(consul_host, consul_port):
'openstack/keystone')['openstack/keystone']['url']
conf_data['keystone_user'] = get_configuration(consul_host, consul_port,
- 'openstack/keystone')['openstack/keystone']['user']
+ 'openstack/keystone')['openstack/keystone'][
+ 'user']
conf_data['keystone_password'] = get_configuration(consul_host, consul_port,
- 'openstack/keystone')['openstack/keystone']['password']
+ 'openstack/keystone')['openstack/keystone'][
+ 'password']
conf_data['keystone_project'] = get_configuration(consul_host, consul_port,
- 'openstack/keystone')['openstack/keystone']['project']
+ 'openstack/keystone')['openstack/keystone'][
+ 'project']
return conf_data
diff --git a/python_moonclient/python_moonclient/core/json_export.py b/old/python_moonclient/python_moonclient/core/json_export.py
index 53c1b1f0..edaeb177 100644
--- a/python_moonclient/python_moonclient/core/json_export.py
+++ b/old/python_moonclient/python_moonclient/core/json_export.py
@@ -1,14 +1,14 @@
import logging
-import requests
import copy
+import requests
from python_moonclient.core import config
-
-logger = logging.getLogger("moonclient.core.export_json")
+LOGGER = logging.getLogger("moonclient.core.export_json")
URL = None
HEADERS = None
+
def init(consul_host, consul_port):
conf_data = config.get_config_data(consul_host, consul_port)
global URL, HEADERS
@@ -23,4 +23,4 @@ def export_to_json():
req = requests.get(URL.format("/export"))
req.raise_for_status()
result = req.json()
- return result \ No newline at end of file
+ return result
diff --git a/python_moonclient/python_moonclient/core/json_import.py b/old/python_moonclient/python_moonclient/core/json_import.py
index a724476b..b65ec39b 100644
--- a/python_moonclient/python_moonclient/core/json_import.py
+++ b/old/python_moonclient/python_moonclient/core/json_import.py
@@ -3,12 +3,12 @@ import requests
import copy
from python_moonclient.core import config
-
-logger = logging.getLogger("moonclient.core.import_json")
+LOGGER = logging.getLogger("moonclient.core.import_json")
URL = None
HEADERS = None
+
def init(consul_host, consul_port):
conf_data = config.get_config_data(consul_host, consul_port)
global URL, HEADERS
@@ -23,7 +23,7 @@ def import_json(file_name):
files = {'file': open(file_name, 'rb')}
req = requests.post(URL.format("/import"), files=files)
result = req.json()
- if isinstance(result,dict) and "message" in result:
+ if isinstance(result, dict) and "message" in result:
req.reason = result["message"]
req.raise_for_status()
- return result \ No newline at end of file
+ return result
diff --git a/python_moonclient/python_moonclient/core/models.py b/old/python_moonclient/python_moonclient/core/models.py
index 709b4a7a..8d3c8858 100644
--- a/python_moonclient/python_moonclient/core/models.py
+++ b/old/python_moonclient/python_moonclient/core/models.py
@@ -1,11 +1,10 @@
import logging
-import requests
import copy
+import requests
from python_moonclient.core import config
from python_moonclient.core.check_tools import *
-logger = logging.getLogger("moonclient.core.models")
-
+LOGGER = logging.getLogger("moonclient.core.models")
URL = None
HEADERS = None
@@ -241,17 +240,17 @@ def add_meta_rule_to_model(model_id, meta_rule_id):
def create_model(scenario, model_id=None):
- logger.info("Creating model {}".format(scenario.model_name))
+ LOGGER.info("Creating model {}".format(scenario.model_name))
if not model_id:
- logger.info("Add model")
+ LOGGER.info("Add model")
model_id = add_model(name=scenario.model_name)
- logger.info("Add subject categories")
+ LOGGER.info("Add subject categories")
for cat in scenario.subject_categories:
scenario.subject_categories[cat] = add_subject_category(name=cat)
- logger.info("Add object categories")
+ LOGGER.info("Add object categories")
for cat in scenario.object_categories:
scenario.object_categories[cat] = add_object_category(name=cat)
- logger.info("Add action categories")
+ LOGGER.info("Add action categories")
for cat in scenario.action_categories:
scenario.action_categories[cat] = add_action_category(name=cat)
sub_cat = []
@@ -272,7 +271,7 @@ def create_model(scenario, model_id=None):
meta_rule_id = _meta_rule_id
break
else:
- logger.info("Add meta rule")
+ LOGGER.info("Add meta rule")
meta_rule_id = add_meta_rule(item_name, sub_cat, ob_cat, act_cat)
item_value["id"] = meta_rule_id
if meta_rule_id not in meta_rule_list:
diff --git a/python_moonclient/python_moonclient/core/pdp.py b/old/python_moonclient/python_moonclient/core/pdp.py
index 4e9e404c..f67a4d01 100644
--- a/python_moonclient/python_moonclient/core/pdp.py
+++ b/old/python_moonclient/python_moonclient/core/pdp.py
@@ -4,8 +4,7 @@ import requests
from python_moonclient.core import config
from python_moonclient.core.check_tools import *
-
-logger = logging.getLogger("python_moonclient.core.pdp")
+LOGGER = logging.getLogger("python_moonclient.core.pdp")
URL = None
HEADERS = None
@@ -14,7 +13,6 @@ KEYSTONE_PASSWORD = None
KEYSTONE_PROJECT = None
KEYSTONE_SERVER = None
-
pdp_template = {
"name": "test_pdp",
"security_pipeline": [],
@@ -63,11 +61,11 @@ def get_keystone_projects():
}
req = requests.post("{}/auth/tokens".format(KEYSTONE_SERVER), json=data_auth, headers=HEADERS)
- logger.debug("{}/auth/tokens".format(KEYSTONE_SERVER))
- logger.debug(req.text)
+ LOGGER.debug("{}/auth/tokens".format(KEYSTONE_SERVER))
+ LOGGER.debug(req.text)
req.raise_for_status()
- TOKEN = req.headers['X-Subject-Token']
- HEADERS['X-Auth-Token'] = TOKEN
+ token = req.headers['X-Subject-Token']
+ HEADERS['X-Auth-Token'] = token
req = requests.get("{}/projects".format(KEYSTONE_SERVER), headers=HEADERS)
if req.status_code not in (200, 201):
data_auth["auth"]["scope"] = {
@@ -78,10 +76,11 @@ def get_keystone_projects():
}
}
}
- req = requests.post("{}/auth/tokens".format(KEYSTONE_SERVER), json=data_auth, headers=HEADERS)
+ req = requests.post("{}/auth/tokens".format(KEYSTONE_SERVER), json=data_auth,
+ headers=HEADERS)
req.raise_for_status()
- TOKEN = req.headers['X-Subject-Token']
- HEADERS['X-Auth-Token'] = TOKEN
+ token = req.headers['X-Subject-Token']
+ HEADERS['X-Auth-Token'] = token
req = requests.get("{}/projects".format(KEYSTONE_SERVER), headers=HEADERS)
req.raise_for_status()
return req.json()
@@ -94,21 +93,21 @@ def get_keystone_id(pdp_name):
if pdp_name != pdp_value["name"]:
continue
if pdp_value['security_pipeline'] and pdp_value["keystone_project_id"]:
- logger.debug("Found pdp with keystone_project_id={}".format(pdp_value["keystone_project_id"]))
+ LOGGER.debug(
+ "Found pdp with keystone_project_id={}".format(pdp_value["keystone_project_id"]))
keystone_project_id = pdp_value["keystone_project_id"]
if not keystone_project_id:
- logger.error("Cannot find PDP with keystone project ID")
+ LOGGER.error("Cannot find PDP with keystone project ID")
sys.exit(1)
return keystone_project_id
-
def check_pdp(pdp_id=None, keystone_project_id=None, moon_url=None):
- _URL = URL
+ _url = URL
if moon_url:
- _URL = moon_url
- req = requests.get(_URL + "/pdp")
+ _url = moon_url
+ req = requests.get(_url + "/pdp")
req.raise_for_status()
result = req.json()
check_pdp_in_result(result)
@@ -124,8 +123,8 @@ def add_pdp(name="test_pdp", policy_id=None):
if policy_id:
pdp_template['security_pipeline'].append(policy_id)
req = requests.post(URL + "/pdp", json=pdp_template, headers=HEADERS)
- logger.debug(req.status_code)
- logger.debug(req)
+ LOGGER.debug(req.status_code)
+ LOGGER.debug(req)
req.raise_for_status()
result = req.json()
check_pdp_in_result(result)
@@ -175,7 +174,7 @@ def delete_pdp(pdp_id):
def create_pdp(scenario, policy_id=None, project_id=None):
- logger.info("Creating PDP {}".format(scenario.pdp_name))
+ LOGGER.info("Creating PDP {}".format(scenario.pdp_name))
projects = get_keystone_projects()
# if not project_id:
# for _project in projects['projects']:
@@ -186,7 +185,9 @@ def create_pdp(scenario, policy_id=None, project_id=None):
for pdp_id, pdp_value in pdps.items():
if scenario.pdp_name == pdp_value["name"]:
update_pdp(pdp_id, policy_id=policy_id)
- logger.debug("Found existing PDP named {} (will add policy {})".format(scenario.pdp_name, policy_id))
+ LOGGER.debug(
+ "Found existing PDP named {} (will add policy {})".format(scenario.pdp_name,
+ policy_id))
return pdp_id
_pdp_id = add_pdp(name=scenario.pdp_name, policy_id=policy_id)
# map_to_keystone(pdp_id=_pdp_id, keystone_project_id=project_id)
diff --git a/python_moonclient/python_moonclient/core/policies.py b/old/python_moonclient/python_moonclient/core/policies.py
index 46d918aa..b9b05dd8 100644
--- a/python_moonclient/python_moonclient/core/policies.py
+++ b/old/python_moonclient/python_moonclient/core/policies.py
@@ -3,7 +3,7 @@ import requests
from python_moonclient.core import models, config
from python_moonclient.core.check_tools import *
-logger = logging.getLogger("moonclient.core.policies")
+LOGGER = logging.getLogger("moonclient.core.policies")
URL = None
HEADERS = None
@@ -108,13 +108,13 @@ def delete_policy(policy_id):
def add_subject(policy_id=None, name="test_subject"):
subject_template['name'] = name
if policy_id:
- logger.debug(URL.format("/policies/{}/subjects".format(policy_id)))
+ LOGGER.debug(URL.format("/policies/{}/subjects".format(policy_id)))
req = requests.post(URL.format("/policies/{}/subjects".format(policy_id)),
json=subject_template, headers=HEADERS)
else:
- logger.debug(URL.format("/subjects"))
+ LOGGER.debug(URL.format("/subjects"))
req = requests.post(URL.format("/subjects"), json=subject_template, headers=HEADERS)
- logger.debug(req.text)
+ LOGGER.debug(req.text)
req.raise_for_status()
result = req.json()
check_subject_in_result(result)
@@ -186,11 +186,12 @@ def add_object(policy_id=None, name="test_object"):
def update_object(object_id, policy_id):
- req = requests.patch(URL.format("/policies/{}/objects/{}".format(policy_id, object_id)), json={})
+ req = requests.patch(URL.format("/policies/{}/objects/{}".format(policy_id, object_id)),
+ json={})
req.raise_for_status()
result = req.json()
check_object_in_result(result)
- check_object_name(object_template["name"] , object_id, result)
+ check_object_name(object_template["name"], object_id, result)
check_object_policy(policy_id, result["objects"][object_id])
@@ -244,7 +245,8 @@ def add_action(policy_id=None, name="test_action"):
def update_action(action_id, policy_id):
- req = requests.patch(URL.format("/policies/{}/actions/{}".format(policy_id, action_id)), json={})
+ req = requests.patch(URL.format("/policies/{}/actions/{}".format(policy_id, action_id)),
+ json={})
req.raise_for_status()
result = req.json()
check_action_in_result(result)
@@ -310,8 +312,9 @@ def check_subject_data(policy_id, data_id, category_id):
def delete_subject_data(policy_id, category_id, data_id):
- req = requests.delete(URL.format("/policies/{}/subject_data/{}/{}".format(policy_id, category_id, data_id)),
- headers=HEADERS)
+ req = requests.delete(
+ URL.format("/policies/{}/subject_data/{}/{}".format(policy_id, category_id, data_id)),
+ headers=HEADERS)
req.raise_for_status()
req = requests.get(URL.format("/policies/{}/subject_data/{}".format(policy_id, category_id)))
req.raise_for_status()
@@ -340,9 +343,11 @@ def check_object_data(policy_id, data_id, category_id):
check_category_id_in_object_data_data(category_id, result)
return result
+
def delete_object_data(policy_id, category_id, data_id):
- req = requests.delete(URL.format("/policies/{}/object_data/{}/{}".format(policy_id, category_id, data_id)),
- headers=HEADERS)
+ req = requests.delete(
+ URL.format("/policies/{}/object_data/{}/{}".format(policy_id, category_id, data_id)),
+ headers=HEADERS)
req.raise_for_status()
req = requests.get(URL.format("/policies/{}/object_data/{}".format(policy_id, category_id)))
req.raise_for_status()
@@ -372,9 +377,11 @@ def check_action_data(policy_id, data_id, category_id):
check_category_id_in_action_data_data(category_id, result)
return result
+
def delete_action_data(policy_id, category_id, data_id):
- req = requests.delete(URL.format("/policies/{}/action_data/{}/{}".format(policy_id, category_id, data_id)),
- headers=HEADERS)
+ req = requests.delete(
+ URL.format("/policies/{}/action_data/{}/{}".format(policy_id, category_id, data_id)),
+ headers=HEADERS)
req.raise_for_status()
req = requests.get(URL.format("/policies/{}/action_data/{}".format(policy_id, category_id)))
req.raise_for_status()
@@ -386,10 +393,10 @@ def delete_action_data(policy_id, category_id, data_id):
def add_subject_assignments(policy_id, subject_id, subject_cat_id, subject_data_id):
req = requests.post(URL.format("/policies/{}/subject_assignments".format(policy_id)),
json={
- "id": subject_id,
- "category_id": subject_cat_id,
- "data_id": subject_data_id
- }, headers=HEADERS)
+ "id": subject_id,
+ "category_id": subject_cat_id,
+ "data_id": subject_data_id
+ }, headers=HEADERS)
req.raise_for_status()
result = req.json()
check_subject_assignment_in_result(result)
@@ -425,10 +432,10 @@ def check_action_assignments(policy_id, action_id, action_cat_id, action_data_id
def add_object_assignments(policy_id, object_id, object_cat_id, object_data_id):
req = requests.post(URL.format("/policies/{}/object_assignments".format(policy_id)),
json={
- "id": object_id,
- "category_id": object_cat_id,
- "data_id": object_data_id
- }, headers=HEADERS)
+ "id": object_id,
+ "category_id": object_cat_id,
+ "data_id": object_data_id
+ }, headers=HEADERS)
req.raise_for_status()
result = req.json()
check_object_assignment_in_result(result)
@@ -437,10 +444,10 @@ def add_object_assignments(policy_id, object_id, object_cat_id, object_data_id):
def add_action_assignments(policy_id, action_id, action_cat_id, action_data_id):
req = requests.post(URL.format("/policies/{}/action_assignments".format(policy_id)),
json={
- "id": action_id,
- "category_id": action_cat_id,
- "data_id": action_data_id
- }, headers=HEADERS)
+ "id": action_id,
+ "category_id": action_cat_id,
+ "data_id": action_data_id
+ }, headers=HEADERS)
req.raise_for_status()
result = req.json()
check_action_assignment_in_result(result)
@@ -491,7 +498,8 @@ def delete_action_assignment(policy_id, action_id, action_cat_id, action_data_id
check_not_action_assignements(action_id, action_cat_id, action_data_id, result)
-def add_rule(policy_id, meta_rule_id, rule, instructions={"chain": [{"security_pipeline": "rbac"}]}):
+def add_rule(policy_id, meta_rule_id, rule,
+ instructions={"chain": [{"security_pipeline": "rbac"}]}):
req = requests.post(URL.format("/policies/{}/rules".format(policy_id)),
json={
"meta_rule_id": meta_rule_id,
@@ -539,8 +547,9 @@ def check_meta_rule():
print(result)
return result
+
def create_policy(scenario, model_id, meta_rule_list):
- logger.info("Creating policy {}".format(scenario.policy_name))
+ LOGGER.info("Creating policy {}".format(scenario.policy_name))
_policies = check_policy()
for _policy_id, _policy_value in _policies["policies"].items():
if _policy_value['name'] == scenario.policy_name:
@@ -552,24 +561,24 @@ def create_policy(scenario, model_id, meta_rule_list):
update_policy(policy_id, model_id)
for meta_rule_id in meta_rule_list:
- logger.debug("add_meta_rule_to_model {} {}".format(model_id, meta_rule_id))
+ LOGGER.debug("add_meta_rule_to_model {} {}".format(model_id, meta_rule_id))
models.add_meta_rule_to_model(model_id, meta_rule_id)
- logger.info("Add subject data")
+ LOGGER.info("Add subject data")
for subject_cat_name in scenario.subject_data:
for subject_data_name in scenario.subject_data[subject_cat_name]:
data_id = scenario.subject_data[subject_cat_name][subject_data_name] = add_subject_data(
policy_id=policy_id,
category_id=scenario.subject_categories[subject_cat_name], name=subject_data_name)
scenario.subject_data[subject_cat_name][subject_data_name] = data_id
- logger.info("Add object data")
+ LOGGER.info("Add object data")
for object_cat_name in scenario.object_data:
for object_data_name in scenario.object_data[object_cat_name]:
data_id = scenario.object_data[object_cat_name][object_data_name] = add_object_data(
policy_id=policy_id,
category_id=scenario.object_categories[object_cat_name], name=object_data_name)
scenario.object_data[object_cat_name][object_data_name] = data_id
- logger.info("Add action data")
+ LOGGER.info("Add action data")
for action_cat_name in scenario.action_data:
for action_data_name in scenario.action_data[action_cat_name]:
data_id = scenario.action_data[action_cat_name][action_data_name] = add_action_data(
@@ -577,17 +586,17 @@ def create_policy(scenario, model_id, meta_rule_list):
category_id=scenario.action_categories[action_cat_name], name=action_data_name)
scenario.action_data[action_cat_name][action_data_name] = data_id
- logger.info("Add subjects")
+ LOGGER.info("Add subjects")
for name in scenario.subjects:
scenario.subjects[name] = add_subject(policy_id, name=name)
- logger.info("Add objects")
+ LOGGER.info("Add objects")
for name in scenario.objects:
scenario.objects[name] = add_object(policy_id, name=name)
- logger.info("Add actions")
+ LOGGER.info("Add actions")
for name in scenario.actions:
scenario.actions[name] = add_action(policy_id, name=name)
- logger.info("Add subject assignments")
+ LOGGER.info("Add subject assignments")
for subject_name in scenario.subject_assignments:
if type(scenario.subject_assignments[subject_name]) in (list, tuple):
for items in scenario.subject_assignments[subject_name]:
@@ -595,16 +604,19 @@ def create_policy(scenario, model_id, meta_rule_list):
subject_id = scenario.subjects[subject_name]
subject_cat_id = scenario.subject_categories[subject_category_name]
for data in scenario.subject_assignments[subject_name]:
- subject_data_id = scenario.subject_data[subject_category_name][data[subject_category_name]]
- add_subject_assignments(policy_id, subject_id, subject_cat_id, subject_data_id)
+ subject_data_id = scenario.subject_data[subject_category_name][
+ data[subject_category_name]]
+ add_subject_assignments(policy_id, subject_id, subject_cat_id,
+ subject_data_id)
else:
for subject_category_name in scenario.subject_assignments[subject_name]:
subject_id = scenario.subjects[subject_name]
subject_cat_id = scenario.subject_categories[subject_category_name]
- subject_data_id = scenario.subject_data[subject_category_name][scenario.subject_assignments[subject_name][subject_category_name]]
+ subject_data_id = scenario.subject_data[subject_category_name][
+ scenario.subject_assignments[subject_name][subject_category_name]]
add_subject_assignments(policy_id, subject_id, subject_cat_id, subject_data_id)
- logger.info("Add object assignments")
+ LOGGER.info("Add object assignments")
for object_name in scenario.object_assignments:
if type(scenario.object_assignments[object_name]) in (list, tuple):
for items in scenario.object_assignments[object_name]:
@@ -612,16 +624,18 @@ def create_policy(scenario, model_id, meta_rule_list):
object_id = scenario.objects[object_name]
object_cat_id = scenario.object_categories[object_category_name]
for data in scenario.object_assignments[object_name]:
- object_data_id = scenario.object_data[object_category_name][data[object_category_name]]
+ object_data_id = scenario.object_data[object_category_name][
+ data[object_category_name]]
add_object_assignments(policy_id, object_id, object_cat_id, object_data_id)
else:
for object_category_name in scenario.object_assignments[object_name]:
object_id = scenario.objects[object_name]
object_cat_id = scenario.object_categories[object_category_name]
- object_data_id = scenario.object_data[object_category_name][scenario.object_assignments[object_name][object_category_name]]
+ object_data_id = scenario.object_data[object_category_name][
+ scenario.object_assignments[object_name][object_category_name]]
add_object_assignments(policy_id, object_id, object_cat_id, object_data_id)
- logger.info("Add action assignments")
+ LOGGER.info("Add action assignments")
for action_name in scenario.action_assignments:
if type(scenario.action_assignments[action_name]) in (list, tuple):
for items in scenario.action_assignments[action_name]:
@@ -629,16 +643,18 @@ def create_policy(scenario, model_id, meta_rule_list):
action_id = scenario.actions[action_name]
action_cat_id = scenario.action_categories[action_category_name]
for data in scenario.action_assignments[action_name]:
- action_data_id = scenario.action_data[action_category_name][data[action_category_name]]
+ action_data_id = scenario.action_data[action_category_name][
+ data[action_category_name]]
add_action_assignments(policy_id, action_id, action_cat_id, action_data_id)
else:
for action_category_name in scenario.action_assignments[action_name]:
action_id = scenario.actions[action_name]
action_cat_id = scenario.action_categories[action_category_name]
- action_data_id = scenario.action_data[action_category_name][scenario.action_assignments[action_name][action_category_name]]
+ action_data_id = scenario.action_data[action_category_name][
+ scenario.action_assignments[action_name][action_category_name]]
add_action_assignments(policy_id, action_id, action_cat_id, action_data_id)
- logger.info("Add rules")
+ LOGGER.info("Add rules")
for meta_rule_name in scenario.rules:
meta_rule_value = scenario.meta_rule[meta_rule_name]
for rule in scenario.rules[meta_rule_name]:
@@ -655,4 +671,3 @@ def create_policy(scenario, model_id, meta_rule_list):
instructions = rule["instructions"]
add_rule(policy_id, meta_rule_value["id"], data_list, instructions)
return policy_id
-
diff --git a/python_moonclient/python_moonclient/core/slaves.py b/old/python_moonclient/python_moonclient/core/slaves.py
index 112b56f3..77b127c1 100644
--- a/python_moonclient/python_moonclient/core/slaves.py
+++ b/old/python_moonclient/python_moonclient/core/slaves.py
@@ -3,8 +3,7 @@ import requests
from python_moonclient.core import config
from python_moonclient.core.check_tools import *
-logger = logging.getLogger("moonclient.core.slaves")
-
+LOGGER = logging.getLogger("moonclient.core.slaves")
URL = None
HEADERS = None
@@ -20,8 +19,6 @@ def init(consul_host, consul_port):
HEADERS = {"content-type": "application/json"}
-
-
def get_slaves():
req = requests.get(URL.format("/slaves"))
req.raise_for_status()
@@ -36,10 +33,10 @@ def set_slave(name):
req = requests.patch(URL.format("/slaves/{}".format(name)),
headers=HEADERS,
json={
- "op": "replace",
- "variable": "configured",
- "value": True
- })
+ "op": "replace",
+ "variable": "configured",
+ "value": True
+ })
req.raise_for_status()
result = req.json()
check_slaves_in_result(result)
@@ -52,10 +49,10 @@ def delete_slave(name):
req = requests.patch(URL.format("/slaves/{}".format(name)),
headers=HEADERS,
json={
- "op": "replace",
- "variable": "configured",
- "value": False
- })
+ "op": "replace",
+ "variable": "configured",
+ "value": False
+ })
req.raise_for_status()
result = req.json()
check_slaves_in_result(result)
diff --git a/old/python_moonclient/python_moonclient/moon.py b/old/python_moonclient/python_moonclient/moon.py
new file mode 100644
index 00000000..0bd80921
--- /dev/null
+++ b/old/python_moonclient/python_moonclient/moon.py
@@ -0,0 +1,37 @@
+import sys
+import python_moonclient
+
+from cliff.app import App
+from cliff.commandmanager import CommandManager
+
+
+class Moon(App):
+
+ def __init__(self):
+ super(Moon, self).__init__(
+ description='Moon client',
+ version=python_moonclient.__version__,
+ command_manager=CommandManager('moon'),
+ deferred_help=True,
+ )
+
+
+def main(argv=sys.argv[1:]):
+ myapp = Moon()
+ return myapp.run(argv)
+
+
+if __name__ == '__main__':
+ # import python_moonclient.python_moonclient.core.import_json
+ # import python_moonclient.python_moonclient.core.models
+ # import python_moonclient.core.policies.init as init_policy
+ # import python_moonclient.core.pdp.init as init_pdp
+ # consul_host = "consul"
+ # consul_port = "8005"
+
+ # init_model(consul_host, consul_port)
+ # init_policy.init(consul_host, consul_port)
+ # init_pdp.init(consul_host, consul_port)
+ # import_json('/home/fcellier/moon/tests/functional/scenario_available/rbac.json')
+
+ sys.exit(Moon(sys.argv[1:]))
diff --git a/python_moonclient/requirements.txt b/old/python_moonclient/requirements.txt
index bbcd8cd5..bbcd8cd5 100644
--- a/python_moonclient/requirements.txt
+++ b/old/python_moonclient/requirements.txt
diff --git a/python_moonclient/setup.py b/old/python_moonclient/setup.py
index 4a3a8233..4a3a8233 100644
--- a/python_moonclient/setup.py
+++ b/old/python_moonclient/setup.py
diff --git a/old/python_moonclient/tests/unit_python/__init__.py b/old/python_moonclient/tests/unit_python/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moonclient/tests/unit_python/__init__.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_action_assignments.py b/old/python_moonclient/tests/unit_python/conf/conf_action_assignments.py
index 43c4db59..43c4db59 100644
--- a/python_moonclient/tests/unit_python/conf/conf_action_assignments.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_action_assignments.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_action_categories.py b/old/python_moonclient/tests/unit_python/conf/conf_action_categories.py
index 909befb2..909befb2 100644
--- a/python_moonclient/tests/unit_python/conf/conf_action_categories.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_action_categories.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_action_data.py b/old/python_moonclient/tests/unit_python/conf/conf_action_data.py
index fb6f501c..fb6f501c 100644
--- a/python_moonclient/tests/unit_python/conf/conf_action_data.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_action_data.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_actions.py b/old/python_moonclient/tests/unit_python/conf/conf_actions.py
index 4e6784dd..4e6784dd 100644
--- a/python_moonclient/tests/unit_python/conf/conf_actions.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_actions.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_all.py b/old/python_moonclient/tests/unit_python/conf/conf_all.py
index b87d4fe7..b87d4fe7 100644
--- a/python_moonclient/tests/unit_python/conf/conf_all.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_all.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_meta_rules.py b/old/python_moonclient/tests/unit_python/conf/conf_meta_rules.py
index 67c14ddf..67c14ddf 100644
--- a/python_moonclient/tests/unit_python/conf/conf_meta_rules.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_meta_rules.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_models.py b/old/python_moonclient/tests/unit_python/conf/conf_models.py
index 930af88f..930af88f 100644
--- a/python_moonclient/tests/unit_python/conf/conf_models.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_models.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_object_assignments.py b/old/python_moonclient/tests/unit_python/conf/conf_object_assignments.py
index 9e88e03e..9e88e03e 100644
--- a/python_moonclient/tests/unit_python/conf/conf_object_assignments.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_object_assignments.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_object_categories.py b/old/python_moonclient/tests/unit_python/conf/conf_object_categories.py
index a942f9c6..a942f9c6 100644
--- a/python_moonclient/tests/unit_python/conf/conf_object_categories.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_object_categories.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_object_data.py b/old/python_moonclient/tests/unit_python/conf/conf_object_data.py
index 8fa81d69..8fa81d69 100644
--- a/python_moonclient/tests/unit_python/conf/conf_object_data.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_object_data.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_objects.py b/old/python_moonclient/tests/unit_python/conf/conf_objects.py
index cf3e7aa4..cf3e7aa4 100644
--- a/python_moonclient/tests/unit_python/conf/conf_objects.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_objects.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_pdps.py b/old/python_moonclient/tests/unit_python/conf/conf_pdps.py
index 1090fccb..1090fccb 100644
--- a/python_moonclient/tests/unit_python/conf/conf_pdps.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_pdps.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_policies.py b/old/python_moonclient/tests/unit_python/conf/conf_policies.py
index bf6883bc..bf6883bc 100644
--- a/python_moonclient/tests/unit_python/conf/conf_policies.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_policies.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_projects.py b/old/python_moonclient/tests/unit_python/conf/conf_projects.py
index 63be05e0..63be05e0 100644
--- a/python_moonclient/tests/unit_python/conf/conf_projects.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_projects.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_rules.py b/old/python_moonclient/tests/unit_python/conf/conf_rules.py
index 30b8c682..30b8c682 100644
--- a/python_moonclient/tests/unit_python/conf/conf_rules.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_rules.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_subject_assignments.py b/old/python_moonclient/tests/unit_python/conf/conf_subject_assignments.py
index 92b689c0..92b689c0 100644
--- a/python_moonclient/tests/unit_python/conf/conf_subject_assignments.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_subject_assignments.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_subject_categories.py b/old/python_moonclient/tests/unit_python/conf/conf_subject_categories.py
index e59a458a..e59a458a 100644
--- a/python_moonclient/tests/unit_python/conf/conf_subject_categories.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_subject_categories.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_subject_data.py b/old/python_moonclient/tests/unit_python/conf/conf_subject_data.py
index 19db217d..19db217d 100644
--- a/python_moonclient/tests/unit_python/conf/conf_subject_data.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_subject_data.py
diff --git a/python_moonclient/tests/unit_python/conf/conf_subjects.py b/old/python_moonclient/tests/unit_python/conf/conf_subjects.py
index bde6093f..bde6093f 100644
--- a/python_moonclient/tests/unit_python/conf/conf_subjects.py
+++ b/old/python_moonclient/tests/unit_python/conf/conf_subjects.py
diff --git a/python_moonclient/tests/unit_python/conftest.py b/old/python_moonclient/tests/unit_python/conftest.py
index bd3e5f4d..bd3e5f4d 100644
--- a/python_moonclient/tests/unit_python/conftest.py
+++ b/old/python_moonclient/tests/unit_python/conftest.py
diff --git a/python_moonclient/tests/unit_python/mock_config.py b/old/python_moonclient/tests/unit_python/mock_config.py
index 135964ab..b6c42d76 100644
--- a/python_moonclient/tests/unit_python/mock_config.py
+++ b/old/python_moonclient/tests/unit_python/mock_config.py
@@ -37,4 +37,28 @@ def register_consul(m):
m.register_uri(
'GET', 'http://manager:30001',
json={}
- ) \ No newline at end of file
+ )
+ m.register_uri(
+ 'GET', 'http://keystone:5000/v3',
+ json={}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "111111111"}
+ )
+ m.register_uri(
+ 'DELETE', 'http://keystone:5000/v3/auth/tokens',
+ headers={'X-Subject-Token': "111111111"}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/users?name=testuser&domain_id=default',
+ json={"users": {}}
+ )
+ m.register_uri(
+ 'GET', 'http://keystone:5000/v3/users?name=testuser&domain_id=default',
+ json={"users": {}}
+ )
+ m.register_uri(
+ 'POST', 'http://keystone:5000/v3/users/',
+ json={"users": [{"id": "1111111111111"}]}
+ )
diff --git a/python_moonclient/tests/unit_python/requirements.txt b/old/python_moonclient/tests/unit_python/requirements.txt
index 3c1ad607..3c1ad607 100644
--- a/python_moonclient/tests/unit_python/requirements.txt
+++ b/old/python_moonclient/tests/unit_python/requirements.txt
diff --git a/python_moonclient/tests/unit_python/test_config.py b/old/python_moonclient/tests/unit_python/test_config.py
index e4effec6..e4effec6 100644
--- a/python_moonclient/tests/unit_python/test_config.py
+++ b/old/python_moonclient/tests/unit_python/test_config.py
diff --git a/python_moonclient/tests/unit_python/test_models.py b/old/python_moonclient/tests/unit_python/test_models.py
index fed889e3..fed889e3 100644
--- a/python_moonclient/tests/unit_python/test_models.py
+++ b/old/python_moonclient/tests/unit_python/test_models.py
diff --git a/python_moonclient/tests/unit_python/test_pdp.py b/old/python_moonclient/tests/unit_python/test_pdp.py
index e979aeae..e979aeae 100644
--- a/python_moonclient/tests/unit_python/test_pdp.py
+++ b/old/python_moonclient/tests/unit_python/test_pdp.py
diff --git a/python_moonclient/tests/unit_python/test_policies.py b/old/python_moonclient/tests/unit_python/test_policies.py
index 9ab9003e..9ab9003e 100644
--- a/python_moonclient/tests/unit_python/test_policies.py
+++ b/old/python_moonclient/tests/unit_python/test_policies.py
diff --git a/python_moonclient/tests/unit_python/utilities.py b/old/python_moonclient/tests/unit_python/utilities.py
index ae2932c7..ae2932c7 100644
--- a/python_moonclient/tests/unit_python/utilities.py
+++ b/old/python_moonclient/tests/unit_python/utilities.py
diff --git a/old/python_moondb/.gitignore b/old/python_moondb/.gitignore
new file mode 100644
index 00000000..9c29724f
--- /dev/null
+++ b/old/python_moondb/.gitignore
@@ -0,0 +1,106 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+/tests/unit_python/database.db
diff --git a/python_moondb/Changelog b/old/python_moondb/Changelog
index 19cd0ac0..9236c260 100644
--- a/python_moondb/Changelog
+++ b/old/python_moondb/Changelog
@@ -69,3 +69,60 @@ CHANGES
1.2.8
-----
- Add unique constraints on db tables
+
+1.2.9
+-----
+- Add some verifications when deleting some elements in database
+
+1.2.10
+-----
+- Update the migration script because of a bug introduced in 1.2.8 in rule table
+- Fix bugs due to the previous version
+
+1.2.11
+------
+- adding test cases for perimeter
+- adding subject_object_action to model_test
+- update import of exception
+- add unit_test to test_model
+- add validation for not accepting blank perimeter name or category name
+
+1.2.12
+------
+- Fix the SubjectExisting exception problem
+
+1.2.13
+------
+- Add validations and refactor test cases
+
+1.2.14
+------
+- Fix some bugs for the manager and clean the code
+
+1.2.15
+------
+- Fix test cases after removing syntax error in exceptions
+
+1.2.16
+------
+- Fix the "key length error" in meta_rule table
+
+1.2.17
+------
+- adding extra validation for addition and deletion dependencies
+
+1.2.18
+------
+- adding changelog
+
+1.2.19
+------
+- adding extra validation for update requests
+
+1.2.20
+------
+- adding extra validation of rule content
+- update validation for category with meta-rule dependencies
+- update validation on updating meta-rule
+- applying PyLint
+- fixing Jira issues related to update policy \ No newline at end of file
diff --git a/old/python_moondb/LICENSE b/old/python_moondb/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/old/python_moondb/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/python_moondb/MANIFEST.in b/old/python_moondb/MANIFEST.in
index 02655837..02655837 100644
--- a/python_moondb/MANIFEST.in
+++ b/old/python_moondb/MANIFEST.in
diff --git a/python_moondb/README.md b/old/python_moondb/README.md
index d36c6ae3..d36c6ae3 100644
--- a/python_moondb/README.md
+++ b/old/python_moondb/README.md
diff --git a/python_moondb/bin/drop_tables.sql b/old/python_moondb/bin/drop_tables.sql
index f5f65ea7..f5f65ea7 100644
--- a/python_moondb/bin/drop_tables.sql
+++ b/old/python_moondb/bin/drop_tables.sql
diff --git a/old/python_moondb/python_moondb/__init__.py b/old/python_moondb/python_moondb/__init__.py
new file mode 100644
index 00000000..37c9a725
--- /dev/null
+++ b/old/python_moondb/python_moondb/__init__.py
@@ -0,0 +1,6 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+__version__ = "1.2.20"
diff --git a/old/python_moondb/python_moondb/api/__init__.py b/old/python_moondb/python_moondb/api/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moondb/python_moondb/api/__init__.py
diff --git a/python_moondb/python_moondb/api/keystone.py b/old/python_moondb/python_moondb/api/keystone.py
index 582ae710..57521c36 100644
--- a/python_moondb/python_moondb/api/keystone.py
+++ b/old/python_moondb/python_moondb/api/keystone.py
@@ -103,4 +103,3 @@ class KeystoneManager(Managers):
_exception=exceptions.KeystoneUserError)
except exceptions.KeystoneUserConflict:
return True
-
diff --git a/python_moondb/python_moondb/api/managers.py b/old/python_moondb/python_moondb/api/managers.py
index f500d02e..414725f6 100644
--- a/python_moondb/python_moondb/api/managers.py
+++ b/old/python_moondb/python_moondb/api/managers.py
@@ -4,6 +4,7 @@
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
import logging
+
logger = logging.getLogger("moon.db.api.managers")
diff --git a/old/python_moondb/python_moondb/api/model.py b/old/python_moondb/python_moondb/api/model.py
new file mode 100644
index 00000000..4f6c34cb
--- /dev/null
+++ b/old/python_moondb/python_moondb/api/model.py
@@ -0,0 +1,338 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from uuid import uuid4
+import logging
+from python_moonutilities import exceptions
+from python_moonutilities.security_functions import filter_input, enforce
+from python_moondb.api.managers import Managers
+import copy
+
+logger = logging.getLogger("moon.db.api.model")
+
+
+class ModelManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.ModelManager = self
+
+ @enforce(("read", "write"), "models")
+ def update_model(self, user_id, model_id, value):
+ if model_id not in self.driver.get_models(model_id=model_id):
+ raise exceptions.ModelUnknown
+
+ if not value['name'].strip():
+ raise exceptions.ModelContentError('Model name invalid')
+
+ if 'meta_rules' not in value:
+ raise exceptions.MetaRuleUnknown
+
+ if not value['name']:
+ raise exceptions.ModelContentError
+
+ model = self.get_models(user_id=user_id, model_id=model_id)
+ model = model[next(iter(model))]
+ if ((model['meta_rules'] and value['meta_rules'] and model['meta_rules'] != value[
+ 'meta_rules']) \
+ or (model['meta_rules'] and not value['meta_rules'])):
+ policies = Managers.PolicyManager.get_policies(user_id=user_id)
+ for policy_id in policies:
+ if policies[policy_id]["model_id"] == model_id:
+ raise exceptions.DeleteModelWithPolicy
+
+ if value and 'meta_rules' in value:
+ for meta_rule_id in value['meta_rules']:
+ if not self.driver.get_meta_rules(meta_rule_id=meta_rule_id):
+ raise exceptions.MetaRuleUnknown
+
+ return self.driver.update_model(model_id=model_id, value=value)
+
+ @enforce(("read", "write"), "models")
+ def delete_model(self, user_id, model_id):
+ if model_id not in self.driver.get_models(model_id=model_id):
+ raise exceptions.ModelUnknown
+ # TODO (asteroide): check that no policy is connected to this model
+ policies = Managers.PolicyManager.get_policies(user_id=user_id)
+ for policy in policies:
+ if policies[policy]['model_id'] == model_id:
+ raise exceptions.DeleteModelWithPolicy
+ return self.driver.delete_model(model_id=model_id)
+
+ @enforce(("read", "write"), "models")
+ def add_model(self, user_id, model_id=None, value=None):
+
+ if not value['name']:
+ raise exceptions.ModelContentError
+
+ if not value['name'].strip():
+ raise exceptions.ModelContentError('Model name invalid')
+
+ models = self.driver.get_models()
+ if model_id in models:
+ raise exceptions.ModelExisting
+
+ for model in models:
+ if models[model]['name'] == value['name']:
+ raise exceptions.ModelExisting("Model Name Existed")
+ same_meta_rule_counter = 0
+ for meta_rule_id in models[model]['meta_rules']:
+ if meta_rule_id in value['meta_rules']:
+ same_meta_rule_counter += 1
+ if same_meta_rule_counter == len(value['meta_rules']) and \
+ len(models[model]['meta_rules']) == len(value['meta_rules']):
+ raise exceptions.ModelExisting("Meta Rules List Existed in another Model")
+
+ if not model_id:
+ model_id = uuid4().hex
+ if value and 'meta_rules' in value:
+ for meta_rule_id in value['meta_rules']:
+ if not meta_rule_id:
+ raise exceptions.MetaRuleUnknown
+ meta_rule = self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
+ if not meta_rule:
+ raise exceptions.MetaRuleUnknown
+
+ meta_rule_content = meta_rule[next(iter(meta_rule))]
+ if (not meta_rule_content['subject_categories']) or (
+ not meta_rule_content['object_categories']) or (
+ not meta_rule_content['action_categories']):
+ raise exceptions.MetaRuleContentError
+
+ return self.driver.add_model(model_id=model_id, value=value)
+
+ @enforce("read", "models")
+ def get_models(self, user_id, model_id=None):
+ return self.driver.get_models(model_id=model_id)
+
+ @enforce(("read", "write"), "meta_rules")
+ def update_meta_rule(self, user_id, meta_rule_id, value):
+ meta_rules=self.driver.get_meta_rules()
+ if not meta_rule_id or meta_rule_id not in meta_rules:
+ raise exceptions.MetaRuleUnknown
+ self.__check_meta_rule_dependencies(user_id=user_id, meta_rule_id=meta_rule_id)
+ if value:
+ if 'subject_categories' in value:
+ for subject_category_id in value['subject_categories']:
+ if not subject_category_id or not self.driver.get_subject_categories(
+ category_id=subject_category_id):
+ raise exceptions.SubjectCategoryUnknown
+ if 'object_categories' in value:
+ for object_category_id in value['object_categories']:
+ if not object_category_id or not self.driver.get_object_categories(
+ category_id=object_category_id):
+ raise exceptions.ObjectCategoryUnknown
+ if 'action_categories' in value:
+ for action_category_id in value['action_categories']:
+ if not action_category_id or not self.driver.get_action_categories(
+ category_id=action_category_id):
+ raise exceptions.ActionCategoryUnknown
+
+ for meta_rule_obj_id in meta_rules:
+ counter_matched_list = 0
+ counter_matched_list += self.check_combination(meta_rules[meta_rule_obj_id]['subject_categories'],
+ value['subject_categories'])
+ counter_matched_list += self.check_combination(meta_rules[meta_rule_obj_id]['object_categories'],
+ value['object_categories'])
+ counter_matched_list += self.check_combination(meta_rules[meta_rule_obj_id]['action_categories'],
+ value['action_categories'])
+ if counter_matched_list == 3 and meta_rule_obj_id!=meta_rule_id:
+ raise exceptions.MetaRuleExisting("Same categories combination existed")
+
+ return self.driver.set_meta_rule(meta_rule_id=meta_rule_id, value=value)
+
+ def __check_meta_rule_dependencies(self, user_id, meta_rule_id):
+ policies = Managers.PolicyManager.get_policies(user_id=user_id)
+ for policy_id in policies:
+ rules = Managers.PolicyManager.get_rules(user_id=user_id, policy_id=policy_id,
+ meta_rule_id=meta_rule_id)
+ if len(rules['rules']):
+ raise exceptions.MetaRuleUpdateError
+
+ @enforce("read", "meta_rules")
+ def get_meta_rules(self, user_id, meta_rule_id=None):
+ return self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
+
+ @enforce(("read", "write"), "meta_rules")
+ def add_meta_rule(self, user_id, meta_rule_id=None, value=None):
+
+ if not value['name']:
+ raise exceptions.MetaRuleContentError
+
+ meta_rules = self.driver.get_meta_rules()
+
+ if meta_rule_id in meta_rules:
+ raise exceptions.MetaRuleExisting
+
+ if value:
+ if 'subject_categories' in value:
+ for subject_category_id in value['subject_categories']:
+ if not self.driver.get_subject_categories(category_id=subject_category_id):
+ raise exceptions.SubjectCategoryUnknown
+ if 'object_categories' in value:
+ for object_category_id in value['object_categories']:
+ if not self.driver.get_object_categories(category_id=object_category_id):
+ raise exceptions.ObjectCategoryUnknown
+ if 'action_categories' in value:
+ for action_category_id in value['action_categories']:
+ if not self.driver.get_action_categories(category_id=action_category_id):
+ raise exceptions.ActionCategoryUnknown
+
+ for meta_rule_obj_id in meta_rules:
+ counter_matched_list = 0
+ counter_matched_list += self.check_combination(meta_rules[meta_rule_obj_id]['subject_categories'],
+ value['subject_categories'])
+ counter_matched_list += self.check_combination(meta_rules[meta_rule_obj_id]['object_categories'],
+ value['object_categories'])
+ counter_matched_list += self.check_combination(meta_rules[meta_rule_obj_id]['action_categories'],
+ value['action_categories'])
+ if counter_matched_list == 3:
+ raise exceptions.MetaRuleExisting("Same categories combination existed")
+
+ return self.driver.set_meta_rule(meta_rule_id=meta_rule_id, value=value)
+
+ @enforce(("read", "write"), "meta_rules")
+ def check_combination(self, list_one, list_two):
+ counter_removed_items = 0
+ temp_list_two = copy.deepcopy(list_two)
+ for item in list_one:
+ if item in temp_list_two:
+ temp_list_two.remove(item)
+ counter_removed_items += 1
+
+ if counter_removed_items == len(list_two) and len(list_two) == len(list_one) and len(list_two):
+ return 1
+ return 0
+
+ @enforce(("read", "write"), "meta_rules")
+ def delete_meta_rule(self, user_id, meta_rule_id=None):
+ if meta_rule_id not in self.driver.get_meta_rules(meta_rule_id=meta_rule_id):
+ raise exceptions.MetaRuleUnknown
+ # TODO (asteroide): check and/or delete data and assignments and rules linked to that meta_rule
+ models = self.get_models(user_id=user_id)
+ for model_id in models:
+ for id in models[model_id]['meta_rules']:
+ if id == meta_rule_id:
+ raise exceptions.DeleteMetaRuleWithModel
+ return self.driver.delete_meta_rule(meta_rule_id=meta_rule_id)
+
+ @enforce("read", "meta_data")
+ def get_subject_categories(self, user_id, category_id=None):
+ return self.driver.get_subject_categories(category_id=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def add_subject_category(self, user_id, category_id=None, value=None):
+ subject_categories = self.driver.get_subject_categories(category_id=category_id)
+
+ if not value['name']:
+ raise exceptions.CategoryNameInvalid
+
+ if category_id in subject_categories:
+ raise exceptions.SubjectCategoryExisting
+
+ return self.driver.add_subject_category(name=value["name"],
+ description=value["description"], uuid=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def delete_subject_category(self, user_id, category_id):
+ # TODO (asteroide): delete all data linked to that category
+ # TODO (asteroide): delete all meta_rules linked to that category
+ if category_id not in self.driver.get_subject_categories(category_id=category_id):
+ raise exceptions.SubjectCategoryUnknown
+ meta_rules = self.get_meta_rules(user_id=user_id)
+ for meta_rule_id in meta_rules:
+ for subject_category_id in meta_rules[meta_rule_id]['subject_categories']:
+ logger.info(
+ "delete_subject_category {} {}".format(subject_category_id, meta_rule_id))
+ logger.info("delete_subject_category {}".format(meta_rules[meta_rule_id]))
+ if subject_category_id == category_id:
+ # has_rules = self.driver.is_meta_rule_has_rules(meta_rule_id)
+ # if has_rules:
+ raise exceptions.DeleteSubjectCategoryWithMetaRule
+
+ if self.driver.is_subject_category_has_assignment(category_id):
+ raise exceptions.DeleteCategoryWithAssignment
+
+ if self.driver.is_subject_data_exist(category_id=category_id):
+ raise exceptions.DeleteCategoryWithData
+
+ return self.driver.delete_subject_category(category_id=category_id)
+
+ @enforce("read", "meta_data")
+ def get_object_categories(self, user_id, category_id=None):
+ return self.driver.get_object_categories(category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def add_object_category(self, user_id, category_id=None, value=None):
+ if not value['name']:
+ raise exceptions.CategoryNameInvalid
+
+ object_categories = self.driver.get_object_categories(category_id=category_id)
+ if category_id in object_categories:
+ raise exceptions.ObjectCategoryExisting
+
+ return self.driver.add_object_category(name=value["name"], description=value["description"],
+ uuid=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def delete_object_category(self, user_id, category_id):
+ # TODO (asteroide): delete all data linked to that category
+ # TODO (asteroide): delete all meta_rules linked to that category
+ if category_id not in self.driver.get_object_categories(category_id=category_id):
+ raise exceptions.ObjectCategoryUnknown
+ meta_rules = self.get_meta_rules(user_id=user_id)
+ for meta_rule_id in meta_rules:
+ for object_category_id in meta_rules[meta_rule_id]['object_categories']:
+ if object_category_id == category_id:
+ # has_rules = self.driver.is_meta_rule_has_rules(meta_rule_id)
+ # if has_rules:
+ raise exceptions.DeleteObjectCategoryWithMetaRule
+
+ if self.driver.is_object_category_has_assignment(category_id):
+ raise exceptions.DeleteCategoryWithAssignment
+
+ if self.driver.is_object_data_exist(category_id=category_id):
+ raise exceptions.DeleteCategoryWithData
+
+ return self.driver.delete_object_category(category_id=category_id)
+
+ @enforce("read", "meta_data")
+ def get_action_categories(self, user_id, category_id=None):
+ return self.driver.get_action_categories(category_id=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def add_action_category(self, user_id, category_id=None, value=None):
+
+ if not value['name']:
+ raise exceptions.CategoryNameInvalid
+
+ action_categories = self.driver.get_action_categories(category_id=category_id)
+ if category_id in action_categories:
+ raise exceptions.ActionCategoryExisting
+
+ return self.driver.add_action_category(name=value["name"], description=value["description"],
+ uuid=category_id)
+
+ @enforce(("read", "write"), "meta_data")
+ def delete_action_category(self, user_id, category_id):
+ # TODO (asteroide): delete all data linked to that category
+ # TODO (asteroide): delete all meta_rules linked to that category
+ if category_id not in self.driver.get_action_categories(category_id=category_id):
+ raise exceptions.ActionCategoryUnknown
+ meta_rules = self.get_meta_rules(user_id=user_id)
+ for meta_rule_id in meta_rules:
+ for action_category_id in meta_rules[meta_rule_id]['action_categories']:
+ if action_category_id == category_id:
+ # has_rules = self.driver.is_meta_rule_has_rules(meta_rule_id)
+ # if has_rules:
+ raise exceptions.DeleteActionCategoryWithMetaRule
+
+ if self.driver.is_action_category_has_assignment(category_id):
+ raise exceptions.DeleteCategoryWithAssignment
+
+ if self.driver.is_action_data_exist(category_id=category_id):
+ raise exceptions.DeleteCategoryWithData
+
+ return self.driver.delete_action_category(category_id=category_id)
diff --git a/python_moondb/python_moondb/api/pdp.py b/old/python_moondb/python_moondb/api/pdp.py
index 7e852ca8..d0a071c9 100644
--- a/python_moondb/python_moondb/api/pdp.py
+++ b/old/python_moondb/python_moondb/api/pdp.py
@@ -22,6 +22,10 @@ class PDPManager(Managers):
def update_pdp(self, user_id, pdp_id, value):
if pdp_id not in self.driver.get_pdp(pdp_id=pdp_id):
raise exceptions.PdpUnknown
+ if value and 'security_pipeline' in value:
+ for policy_id in value['security_pipeline']:
+ if not Managers.PolicyManager.get_policies(user_id=user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
return self.driver.update_pdp(pdp_id=pdp_id, value=value)
@enforce(("read", "write"), "pdp")
@@ -36,6 +40,10 @@ class PDPManager(Managers):
raise exceptions.PdpExisting
if not pdp_id:
pdp_id = uuid4().hex
+ if value and 'security_pipeline' in value:
+ for policy_id in value['security_pipeline']:
+ if not Managers.PolicyManager.get_policies(user_id=user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
return self.driver.add_pdp(pdp_id=pdp_id, value=value)
@enforce("read", "pdp")
diff --git a/old/python_moondb/python_moondb/api/policy.py b/old/python_moondb/python_moondb/api/policy.py
new file mode 100644
index 00000000..03a93ff5
--- /dev/null
+++ b/old/python_moondb/python_moondb/api/policy.py
@@ -0,0 +1,751 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from uuid import uuid4
+import logging
+from python_moonutilities.security_functions import enforce
+from python_moondb.api.managers import Managers
+from python_moonutilities import exceptions
+
+# from python_moondb.core import PDPManager
+
+logger = logging.getLogger("moon.db.api.policy")
+
+
+class PolicyManager(Managers):
+
+ def __init__(self, connector=None):
+ self.driver = connector.driver
+ Managers.PolicyManager = self
+
+ def get_policy_from_meta_rules(self, user_id, meta_rule_id):
+ policies = self.PolicyManager.get_policies("admin")
+ models = self.ModelManager.get_models("admin")
+ for pdp_key, pdp_value in self.PDPManager.get_pdp(user_id).items():
+ if 'security_pipeline' not in pdp_value:
+ raise exceptions.PdpContentError
+ for policy_id in pdp_value["security_pipeline"]:
+ if not policies or policy_id not in policies:
+ raise exceptions.PolicyUnknown
+ model_id = policies[policy_id]["model_id"]
+ if not models:
+ raise exceptions.ModelUnknown
+ if model_id not in models:
+ raise exceptions.ModelUnknown
+ if meta_rule_id in models[model_id]["meta_rules"]:
+ return policy_id
+
+ @enforce(("read", "write"), "policies")
+ def update_policy(self, user_id, policy_id, value):
+
+ if not value or not value['name']:
+ raise exceptions.PolicyContentError
+
+ policyList = self.driver.get_policies(policy_id=policy_id)
+ if not policy_id or policy_id not in policyList:
+ raise exceptions.PolicyUnknown
+
+ policies = self.driver.get_policies(policy_name=value['name'])
+ if len(policies) and not (policy_id in policies):
+ raise exceptions.PolicyExisting("Policy name Existed")
+
+ if 'model_id' in value and value['model_id']:
+ if not Managers.ModelManager.get_models(user_id, model_id=value['model_id']):
+ raise exceptions.ModelUnknown
+
+ policy_obj = policyList[policy_id]
+ if (policy_obj["model_id"] and value["model_id"] != policy_obj["model_id"]):
+
+ subjects = self.driver.get_subjects(policy_id=policy_id)
+ if subjects:
+ raise exceptions.PolicyUpdateError("Policy is used in subject")
+ objects = self.driver.get_objects(policy_id=policy_id)
+ if objects:
+ raise exceptions.PolicyUpdateError("Policy is used in object")
+ actions = self.driver.get_actions(policy_id=policy_id)
+ if actions:
+ raise exceptions.PolicyUpdateError("Policy is used in action")
+
+ rules = self.driver.get_rules(policy_id=policy_id)["rules"]
+ if rules:
+ raise exceptions.PolicyUpdateError("Policy is used in rule")
+
+ subject_data = self.get_subject_data(user_id, policy_id=policy_id)
+ if subject_data and subject_data[0]["data"]:
+ raise exceptions.PolicyUpdateError("Policy is used in subject_data")
+ object_data = self.get_object_data(user_id, policy_id=policy_id)
+ if object_data and object_data[0]["data"]:
+ raise exceptions.PolicyUpdateError("Policy is used in object_data")
+ action_data = self.get_action_data(user_id, policy_id=policy_id)
+ if action_data and action_data[0]["data"]:
+ raise exceptions.PolicyUpdateError("Policy is used in action_data")
+
+ return self.driver.update_policy(policy_id=policy_id, value=value)
+
+ @enforce(("read", "write"), "policies")
+ def delete_policy(self, user_id, policy_id):
+ # TODO (asteroide): unmap PDP linked to that policy
+ if policy_id not in self.driver.get_policies(policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+ pdps = self.PDPManager.get_pdp(user_id=user_id)
+ for pdp in pdps:
+ for policy_id in pdps[pdp]['security_pipeline']:
+ if policy_id == policy_id:
+ raise exceptions.DeletePolicyWithPdp
+ subjects = self.driver.get_subjects(policy_id=policy_id)
+ if subjects:
+ raise exceptions.DeletePolicyWithPerimeter
+ objects = self.driver.get_objects(policy_id=policy_id)
+ if objects:
+ raise exceptions.DeletePolicyWithPerimeter
+ actions = self.driver.get_actions(policy_id=policy_id)
+ if actions:
+ raise exceptions.DeletePolicyWithPerimeter
+
+ rules = self.driver.get_rules(policy_id=policy_id)["rules"]
+ if rules:
+ raise exceptions.DeletePolicyWithRules
+
+ subject_data = self.get_subject_data(user_id, policy_id=policy_id)
+ if subject_data and subject_data[0]["data"]:
+ raise exceptions.DeletePolicyWithData
+ object_data = self.get_object_data(user_id, policy_id=policy_id)
+ if object_data and object_data[0]["data"]:
+ raise exceptions.DeletePolicyWithData
+ action_data = self.get_action_data(user_id, policy_id=policy_id)
+ if action_data and action_data[0]["data"]:
+ raise exceptions.DeletePolicyWithData
+
+ return self.driver.delete_policy(policy_id=policy_id)
+
+ @enforce(("read", "write"), "policies")
+ def add_policy(self, user_id, policy_id=None, value=None):
+
+ if not value or not value['name']:
+ raise exceptions.PolicyContentError
+ if policy_id in self.driver.get_policies(policy_id=policy_id):
+ raise exceptions.PolicyExisting
+
+ if len(self.driver.get_policies(policy_name=value['name'])):
+ raise exceptions.PolicyExisting("Policy name Existed")
+
+ if not policy_id:
+ policy_id = uuid4().hex
+ if 'model_id' in value and value['model_id'] != "":
+ if not Managers.ModelManager.get_models(user_id, model_id=value['model_id']):
+ raise exceptions.ModelUnknown
+ return self.driver.add_policy(policy_id=policy_id, value=value)
+
+ @enforce("read", "policies")
+ def get_policies(self, user_id, policy_id=None):
+ return self.driver.get_policies(policy_id=policy_id)
+
+ @enforce("read", "perimeter")
+ def get_subjects(self, user_id, policy_id, perimeter_id=None):
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+ if policy_id and (not self.get_policies(user_id=user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+ return self.driver.get_subjects(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce(("read", "write"), "perimeter")
+ def add_subject(self, user_id, policy_id, perimeter_id=None, value=None):
+
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+
+ if not policy_id or (not self.get_policies(user_id=user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+
+ if perimeter_id:
+ subjects = self.driver.get_subjects(policy_id=None, perimeter_id=perimeter_id)
+ if subjects and subjects[perimeter_id]['name'] != value['name']:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ subject_per = self.driver.get_subject_by_name(value['name'])
+ if len(subject_per):
+ perimeter_id = next(iter(subject_per))
+
+ k_user = Managers.KeystoneManager.get_user_by_name(value.get('name'))
+ if not k_user['users']:
+ k_user = Managers.KeystoneManager.create_user(value)
+ if not perimeter_id:
+ try:
+ logger.info("k_user={}".format(k_user))
+ perimeter_id = k_user['users'][0].get('id', uuid4().hex)
+ except IndexError:
+ k_user = Managers.KeystoneManager.get_user_by_name(
+ value.get('name'))
+ perimeter_id = uuid4().hex
+ except KeyError:
+ k_user = Managers.KeystoneManager.get_user_by_name(
+ value.get('name'))
+ perimeter_id = uuid4().hex
+
+ value.update(k_user['users'][0])
+
+ return self.driver.set_subject(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def update_subject(self, user_id, perimeter_id, value):
+ logger.debug("update_subject perimeter_id = {}".format(perimeter_id))
+
+ if not perimeter_id:
+ raise exceptions.SubjectUnknown
+
+ subjects = self.driver.get_subjects(policy_id=None, perimeter_id=perimeter_id)
+ if not subjects or not (perimeter_id in subjects):
+ raise exceptions.PerimeterContentError
+
+ if 'policy_list' in value or ('name' in value and not value['name']):
+ raise exceptions.PerimeterContentError
+
+ return self.driver.update_subject(perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def delete_subject(self, user_id, policy_id, perimeter_id):
+
+ if not perimeter_id:
+ raise exceptions.SubjectUnknown
+
+ if not policy_id:
+ raise exceptions.PolicyUnknown
+
+ if not self.get_subjects(user_id=user_id, policy_id=policy_id, perimeter_id=perimeter_id):
+ raise exceptions.SubjectUnknown
+
+ if not self.get_policies(user_id=user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ subj_assig = self.driver.get_subject_assignments(policy_id=policy_id,
+ subject_id=perimeter_id)
+ if subj_assig:
+ raise exceptions.DeletePerimeterWithAssignment
+
+ return self.driver.delete_subject(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce("read", "perimeter")
+ def get_objects(self, user_id, policy_id, perimeter_id=None):
+ # if not policy_id:
+ # pass
+ if policy_id and (not self.get_policies(user_id=user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+ return self.driver.get_objects(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce(("read", "write"), "perimeter")
+ def add_object(self, user_id, policy_id, perimeter_id=None, value=None):
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+
+ if not policy_id or (not self.get_policies(user_id=user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+
+ if perimeter_id:
+ object_perimeter = self.driver.get_objects(policy_id=None, perimeter_id=perimeter_id)
+ if not object_perimeter:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ object_perimeter = self.driver.get_object_by_name(value['name'])
+ if len(object_perimeter):
+ perimeter_id = next(iter(object_perimeter))
+
+ if perimeter_id and object_perimeter[perimeter_id]['name'] != value['name']:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ perimeter_id = uuid4().hex
+ return self.driver.set_object(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def update_object(self, user_id, perimeter_id, value):
+ logger.debug("update_object perimeter_id = {}".format(perimeter_id))
+
+ if not perimeter_id:
+ raise exceptions.ObjectUnknown
+
+ objects = self.driver.get_objects(policy_id=None, perimeter_id=perimeter_id)
+ if not objects or not (perimeter_id in objects):
+ raise exceptions.PerimeterContentError
+
+ if 'policy_list' in value or ('name' in value and not value['name']):
+ raise exceptions.PerimeterContentError
+
+ return self.driver.update_object(perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def delete_object(self, user_id, policy_id, perimeter_id):
+
+ if not perimeter_id:
+ raise exceptions.ObjectUnknown
+
+ if not policy_id:
+ raise exceptions.PolicyUnknown
+
+ if not self.get_objects(user_id=user_id, policy_id=policy_id, perimeter_id=perimeter_id):
+ raise exceptions.ObjectUnknown
+
+ if not self.get_policies(user_id=user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ obj_assig = self.driver.get_object_assignments(policy_id=policy_id, object_id=perimeter_id)
+ if obj_assig:
+ raise exceptions.DeletePerimeterWithAssignment
+
+ return self.driver.delete_object(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce("read", "perimeter")
+ def get_actions(self, user_id, policy_id, perimeter_id=None):
+ # if not policy_id:
+ # pass
+ if policy_id and (not self.get_policies(user_id=user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+ return self.driver.get_actions(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce(("read", "write"), "perimeter")
+ def add_action(self, user_id, policy_id, perimeter_id=None, value=None):
+ logger.debug("add_action {}".format(policy_id))
+
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+
+ if not policy_id or (not self.get_policies(user_id=user_id, policy_id=policy_id)):
+ raise exceptions.PolicyUnknown
+
+ if perimeter_id:
+ action_perimeter = self.driver.get_actions(policy_id=None, perimeter_id=perimeter_id)
+ if not action_perimeter:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ action_perimeter = self.driver.get_action_by_name(value['name'])
+ if len(action_perimeter):
+ perimeter_id = next(iter(action_perimeter))
+
+ if perimeter_id and action_perimeter[perimeter_id]['name'] != value['name']:
+ raise exceptions.PerimeterContentError
+
+ if not perimeter_id:
+ perimeter_id = uuid4().hex
+
+ return self.driver.set_action(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def update_action(self, user_id, perimeter_id, value):
+ logger.debug("update_action perimeter_id = {}".format(perimeter_id))
+
+ if not perimeter_id:
+ raise exceptions.ActionUnknown
+
+ actions = self.driver.get_actions(policy_id=None, perimeter_id=perimeter_id)
+ if not actions or not (perimeter_id in actions):
+ raise exceptions.PerimeterContentError
+
+ if 'policy_list' in value or ('name' in value and not value['name']):
+ raise exceptions.PerimeterContentError
+
+ return self.driver.update_action(perimeter_id=perimeter_id, value=value)
+
+ @enforce(("read", "write"), "perimeter")
+ def delete_action(self, user_id, policy_id, perimeter_id):
+
+ if not perimeter_id:
+ raise exceptions.ActionUnknown
+
+ if not policy_id:
+ raise exceptions.PolicyUnknown
+
+ if not self.get_actions(user_id=user_id, policy_id=policy_id, perimeter_id=perimeter_id):
+ raise exceptions.ActionUnknown
+
+ logger.debug("delete_action {} {} {}".format(policy_id, perimeter_id,
+ self.get_policies(user_id=user_id,
+ policy_id=policy_id)))
+ if not self.get_policies(user_id=user_id, policy_id=policy_id):
+ raise exceptions.PolicyUnknown
+
+ act_assig = self.driver.get_action_assignments(policy_id=policy_id, action_id=perimeter_id)
+ if act_assig:
+ raise exceptions.DeletePerimeterWithAssignment
+ return self.driver.delete_action(policy_id=policy_id, perimeter_id=perimeter_id)
+
+ @enforce("read", "data")
+ def get_subject_data(self, user_id, policy_id, data_id=None, category_id=None):
+ available_metadata = self.get_available_metadata(user_id, policy_id)
+ results = []
+ if not category_id:
+ for cat in available_metadata["subject"]:
+ results.append(self.driver.get_subject_data(policy_id=policy_id, data_id=data_id,
+ category_id=cat))
+ if category_id and category_id in available_metadata["subject"]:
+ results.append(self.driver.get_subject_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id))
+ return results
+
+ @enforce(("read", "write"), "data")
+ def set_subject_data(self, user_id, policy_id, data_id=None, category_id=None, value=None):
+ if not category_id or (
+ not Managers.ModelManager.get_subject_categories(user_id=user_id,
+ category_id=category_id)):
+ raise exceptions.SubjectCategoryUnknown
+
+ self.__category_dependency_validation(user_id, policy_id, category_id, 'subject_categories')
+
+ if not data_id:
+ data_id = uuid4().hex
+ return self.driver.set_subject_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+
+ @enforce(("read", "write"), "data")
+ def delete_subject_data(self, user_id, policy_id, data_id, category_id=None):
+ # TODO (asteroide): check and/or delete assignments linked to that data
+ subject_assignments = self.get_subject_assignments(user_id=user_id, policy_id=policy_id,
+ category_id=category_id)
+ if subject_assignments:
+ raise exceptions.DeleteData
+ return self.driver.delete_subject_data(policy_id=policy_id, category_id=category_id,
+ data_id=data_id)
+
+ @enforce("read", "data")
+ def get_object_data(self, user_id, policy_id, data_id=None, category_id=None):
+ available_metadata = self.get_available_metadata(user_id, policy_id)
+ results = []
+ if not category_id:
+ for cat in available_metadata["object"]:
+ results.append(self.driver.get_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=cat))
+ if category_id and category_id in available_metadata["object"]:
+ results.append(self.driver.get_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id))
+ return results
+
+ @enforce(("read", "write"), "data")
+ def add_object_data(self, user_id, policy_id, data_id=None, category_id=None, value=None):
+
+ if not category_id or (
+ not Managers.ModelManager.get_object_categories(user_id=user_id,
+ category_id=category_id)):
+ raise exceptions.ObjectCategoryUnknown
+
+ self.__category_dependency_validation(user_id, policy_id, category_id, 'object_categories')
+
+ if not data_id:
+ data_id = uuid4().hex
+ return self.driver.set_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+
+ @enforce(("read", "write"), "data")
+ def delete_object_data(self, user_id, policy_id, data_id, category_id=None):
+ # TODO (asteroide): check and/or delete assignments linked to that data
+ object_assignments = self.get_object_assignments(user_id=user_id, policy_id=policy_id,
+ category_id=category_id)
+ if object_assignments:
+ raise exceptions.DeleteData
+ return self.driver.delete_object_data(policy_id=policy_id, category_id=category_id,
+ data_id=data_id)
+
+ @enforce("read", "data")
+ def get_action_data(self, user_id, policy_id, data_id=None, category_id=None):
+ available_metadata = self.get_available_metadata(user_id, policy_id)
+ results = []
+ if not category_id:
+ for cat in available_metadata["action"]:
+ results.append(self.driver.get_action_data(policy_id=policy_id, data_id=data_id,
+ category_id=cat))
+ if category_id and category_id in available_metadata["action"]:
+ results.append(self.driver.get_action_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id))
+ return results
+
+ @enforce(("read", "write"), "data")
+ def add_action_data(self, user_id, policy_id, data_id=None, category_id=None, value=None):
+ if not category_id or (
+ not Managers.ModelManager.get_action_categories(user_id=user_id,
+ category_id=category_id)):
+ raise exceptions.ActionCategoryUnknown
+
+ self.__category_dependency_validation(user_id, policy_id, category_id, 'action_categories')
+
+ if not data_id:
+ data_id = uuid4().hex
+ return self.driver.set_action_data(policy_id=policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+
+ @enforce(("read", "write"), "data")
+ def delete_action_data(self, user_id, policy_id, data_id, category_id=None):
+ # TODO (asteroide): check and/or delete assignments linked to that data
+ action_assignments = self.get_action_assignments(user_id=user_id, policy_id=policy_id,
+ category_id=category_id)
+ if action_assignments:
+ raise exceptions.DeleteData
+ return self.driver.delete_action_data(policy_id=policy_id, category_id=category_id,
+ data_id=data_id)
+
+ @enforce("read", "assignments")
+ def get_subject_assignments(self, user_id, policy_id, subject_id=None, category_id=None):
+ return self.driver.get_subject_assignments(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
+
+ @enforce(("read", "write"), "assignments")
+ def add_subject_assignment(self, user_id, policy_id, subject_id, category_id, data_id):
+
+ if not category_id or (
+ not Managers.ModelManager.get_subject_categories(user_id=user_id,
+ category_id=category_id)):
+ raise exceptions.SubjectCategoryUnknown
+
+ self.__category_dependency_validation(user_id, policy_id, category_id, 'subject_categories')
+
+ if not subject_id or (
+ not self.get_subjects(user_id=user_id, policy_id=policy_id,
+ perimeter_id=subject_id)):
+ raise exceptions.SubjectUnknown
+
+ if not data_id or (
+ not self.get_subject_data(user_id=user_id, policy_id=policy_id, data_id=data_id,
+ category_id=category_id)):
+ raise exceptions.DataUnknown
+
+ return self.driver.add_subject_assignment(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce(("read", "write"), "assignments")
+ def delete_subject_assignment(self, user_id, policy_id, subject_id, category_id, data_id):
+ return self.driver.delete_subject_assignment(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce("read", "assignments")
+ def get_object_assignments(self, user_id, policy_id, object_id=None, category_id=None):
+ return self.driver.get_object_assignments(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
+
+ @enforce(("read", "write"), "assignments")
+ def add_object_assignment(self, user_id, policy_id, object_id, category_id, data_id):
+
+ if not category_id or (
+ not Managers.ModelManager.get_object_categories(user_id=user_id,
+ category_id=category_id)):
+ raise exceptions.ObjectCategoryUnknown
+
+ self.__category_dependency_validation(user_id, policy_id, category_id, 'object_categories')
+
+ if not object_id or (
+ not self.get_objects(user_id=user_id, policy_id=policy_id, perimeter_id=object_id)):
+ raise exceptions.ObjectUnknown
+
+ if not data_id or (
+ not self.get_object_data(user_id=user_id, policy_id=policy_id, data_id=data_id,
+ category_id=category_id)):
+ raise exceptions.DataUnknown
+
+ return self.driver.add_object_assignment(policy_id=policy_id, object_id=object_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce(("read", "write"), "assignments")
+ def delete_object_assignment(self, user_id, policy_id, object_id, category_id, data_id):
+ return self.driver.delete_object_assignment(policy_id=policy_id, object_id=object_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce("read", "assignments")
+ def get_action_assignments(self, user_id, policy_id, action_id=None, category_id=None):
+ return self.driver.get_action_assignments(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
+
+ @enforce(("read", "write"), "assignments")
+ def add_action_assignment(self, user_id, policy_id, action_id, category_id, data_id):
+
+ if not category_id or (
+ not Managers.ModelManager.get_action_categories(user_id=user_id,
+ category_id=category_id)):
+ raise exceptions.ActionCategoryUnknown
+
+ self.__category_dependency_validation(user_id, policy_id, category_id, 'action_categories')
+
+ if not action_id or (
+ not self.get_actions(user_id=user_id, policy_id=policy_id, perimeter_id=action_id)):
+ raise exceptions.ActionUnknown
+
+ if not data_id or (
+ not self.get_action_data(user_id=user_id, policy_id=policy_id, data_id=data_id,
+ category_id=category_id)):
+ raise exceptions.DataUnknown
+
+ return self.driver.add_action_assignment(policy_id=policy_id, action_id=action_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce(("read", "write"), "assignments")
+ def delete_action_assignment(self, user_id, policy_id, action_id, category_id, data_id):
+ return self.driver.delete_action_assignment(policy_id=policy_id, action_id=action_id,
+ category_id=category_id, data_id=data_id)
+
+ @enforce("read", "rules")
+ def get_rules(self, user_id, policy_id, meta_rule_id=None, rule_id=None):
+ return self.driver.get_rules(policy_id=policy_id, meta_rule_id=meta_rule_id,
+ rule_id=rule_id)
+
+ @enforce(("read", "write"), "rules")
+ def add_rule(self, user_id, policy_id, meta_rule_id, value):
+ if not meta_rule_id or (
+ not self.ModelManager.get_meta_rules(user_id=user_id, meta_rule_id=meta_rule_id)):
+ raise exceptions.MetaRuleUnknown
+
+ self.__check_existing_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, user_id=user_id,
+ rule_value=value)
+ self.__dependencies_validation(user_id, policy_id, meta_rule_id)
+
+ return self.driver.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+
+ def __check_existing_rule(self, user_id, policy_id, meta_rule_id, rule_value):
+
+ if not meta_rule_id:
+ raise exceptions.MetaRuleUnknown
+
+ meta_rule = self.ModelManager.get_meta_rules(user_id=user_id, meta_rule_id=meta_rule_id)
+ if not meta_rule:
+ raise exceptions.MetaRuleUnknown
+
+ if len(meta_rule[meta_rule_id]['subject_categories']) + len(
+ meta_rule[meta_rule_id]['object_categories']) \
+ + len(meta_rule[meta_rule_id]['action_categories']) > len(rule_value['rule']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ if len(meta_rule[meta_rule_id]['subject_categories']) + len(
+ meta_rule[meta_rule_id]['object_categories']) \
+ + len(meta_rule[meta_rule_id]['action_categories']) < len(rule_value['rule']):
+ raise exceptions.MetaRuleContentError(message="Missing Data")
+
+ temp_rule_data = list(
+ rule_value['rule'][0:len(meta_rule[meta_rule_id]['subject_categories'])])
+ found_data_counter = 0
+ start_sub = len(meta_rule[meta_rule_id]['subject_categories'])
+
+ for sub_cat_id in meta_rule[meta_rule_id]['subject_categories']:
+ subjects_data = self.get_subject_data(user_id=user_id,
+ category_id=sub_cat_id, policy_id=policy_id)
+ found_data_counter = self.__validate_data_id(sub_cat_id, subjects_data[0]['data'],
+ temp_rule_data,
+ "Missing Subject_category "
+ , found_data_counter)
+
+ if found_data_counter != len(meta_rule[meta_rule_id]['subject_categories']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ temp_rule_data = list(
+ rule_value['rule'][
+ start_sub:start_sub + len(meta_rule[meta_rule_id]['object_categories'])])
+ found_data_counter = 0
+ start_sub = start_sub + len(meta_rule[meta_rule_id]['object_categories'])
+
+ for ob_cat_id in meta_rule[meta_rule_id]['object_categories']:
+ object_data = self.get_object_data(user_id=user_id,
+ category_id=ob_cat_id, policy_id=policy_id)
+
+ found_data_counter = self.__validate_data_id(ob_cat_id, object_data[0]['data'],
+ temp_rule_data,
+ "Missing Object_category ",
+ found_data_counter)
+
+ if found_data_counter != len(meta_rule[meta_rule_id]['object_categories']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ temp_rule_data = list(
+ rule_value['rule'][
+ start_sub:start_sub + len(meta_rule[meta_rule_id]['action_categories'])])
+ found_data_counter = 0
+
+ for act_cat_id in meta_rule[meta_rule_id]['action_categories']:
+ action_data = self.get_action_data(user_id=user_id, category_id=act_cat_id,
+ policy_id=policy_id)
+ found_data_counter = self.__validate_data_id(act_cat_id, action_data[0]['data'],
+ temp_rule_data,
+ "Missing Action_category ",
+ found_data_counter)
+
+ if found_data_counter != len(meta_rule[meta_rule_id]['action_categories']):
+ raise exceptions.RuleContentError(message="Missing Data")
+
+ def __validate_data_id(self, cat_id, data_ids, temp_rule_data, error_msg, found_data_counter):
+ for ID in data_ids:
+ if ID in temp_rule_data:
+ temp_rule_data.remove(ID)
+ found_data_counter += 1
+ # if no data id found in the rule, so rule not valid
+ if found_data_counter < 1:
+ raise exceptions.RuleContentError(message=error_msg + cat_id)
+ return found_data_counter
+
+ @enforce(("read", "write"), "rules")
+ def delete_rule(self, user_id, policy_id, rule_id):
+ return self.driver.delete_rule(policy_id=policy_id, rule_id=rule_id)
+
+ @enforce("read", "meta_data")
+ def get_available_metadata(self, user_id, policy_id):
+ categories = {
+ "subject": [],
+ "object": [],
+ "action": []
+ }
+ policy = self.driver.get_policies(policy_id=policy_id)
+ if not policy:
+ raise exceptions.PolicyUnknown
+ model_id = policy[policy_id]["model_id"]
+ model = Managers.ModelManager.get_models(user_id=user_id, model_id=model_id)
+ try:
+ meta_rule_list = model[model_id]["meta_rules"]
+ for meta_rule_id in meta_rule_list:
+ meta_rule = Managers.ModelManager.get_meta_rules(user_id=user_id,
+ meta_rule_id=meta_rule_id)
+ categories["subject"].extend(meta_rule[meta_rule_id]["subject_categories"])
+ categories["object"].extend(meta_rule[meta_rule_id]["object_categories"])
+ categories["action"].extend(meta_rule[meta_rule_id]["action_categories"])
+ finally:
+ return categories
+
+ def __dependencies_validation(self, user_id, policy_id, meta_rule_id=None):
+
+ policies = self.get_policies(user_id=user_id, policy_id=policy_id)
+ if not policy_id or (not policies):
+ raise exceptions.PolicyUnknown
+
+ policy_content = policies[next(iter(policies))]
+ model_id = policy_content['model_id']
+ models = Managers.ModelManager.get_models(user_id=user_id, model_id=model_id)
+ if not model_id or not models:
+ raise exceptions.ModelUnknown
+
+ model_content = models[next(iter(models))]
+ if meta_rule_id:
+ meta_rule_exists = False
+
+ for model_meta_rule_id in model_content['meta_rules']:
+ if model_meta_rule_id == meta_rule_id:
+ meta_rule_exists = True
+ break
+
+ if not meta_rule_exists:
+ raise exceptions.MetaRuleNotLinkedWithPolicyModel
+
+ meta_rule = self.ModelManager.get_meta_rules(user_id=user_id, meta_rule_id=meta_rule_id)
+ meta_rule_content = meta_rule[next(iter(meta_rule))]
+ if (not meta_rule_content['subject_categories']) or (
+ not meta_rule_content['object_categories']) or (
+ not meta_rule_content['action_categories']):
+ raise exceptions.MetaRuleContentError
+ return model_content
+
+ def __category_dependency_validation(self, user_id, policy_id, category_id, category_key):
+ model = self.__dependencies_validation(user_id=user_id, policy_id=policy_id)
+ category_found = False
+ for model_meta_rule_id in model['meta_rules']:
+ meta_rule = self.ModelManager.get_meta_rules(user_id=user_id,
+ meta_rule_id=model_meta_rule_id)
+ meta_rule_content = meta_rule[next(iter(meta_rule))]
+ if meta_rule_content[category_key] and category_id in meta_rule_content[category_key]:
+ category_found = True
+ break
+
+ if not category_found:
+ raise exceptions.CategoryNotAssignedMetaRule
diff --git a/python_moondb/python_moondb/backends/__init__.py b/old/python_moondb/python_moondb/backends/__init__.py
index 237bdc3e..6f1cd3d5 100644
--- a/python_moondb/python_moondb/backends/__init__.py
+++ b/old/python_moondb/python_moondb/backends/__init__.py
@@ -1,4 +1,3 @@
-
"""
intra_extensions = {
intra_extension_id1: {
@@ -94,4 +93,4 @@ rules = {
...},
sub_meta_rule_id2: { },
...}
-""" \ No newline at end of file
+"""
diff --git a/python_moondb/python_moondb/backends/sql.py b/old/python_moondb/python_moondb/backends/sql.py
index a838a854..d25586ba 100644
--- a/python_moondb/python_moondb/backends/sql.py
+++ b/old/python_moondb/python_moondb/backends/sql.py
@@ -14,13 +14,14 @@ from sqlalchemy import create_engine
from contextlib import contextmanager
from sqlalchemy import types as sql_types
from python_moonutilities import configuration
-from python_moonutilities.exceptions import *
+from python_moonutilities import exceptions
from python_moondb.core import PDPDriver, PolicyDriver, ModelDriver
import sqlalchemy
logger = logging.getLogger("moon.db.driver.sql")
Base = declarative_base()
-DEBUG = True if configuration.get_configuration("logging")['logging']['loggers']['moon']['level'] == "DEBUG" else False
+DEBUG = True if configuration.get_configuration("logging")['logging']['loggers']['moon'][
+ 'level'] == "DEBUG" else False
class DictBase:
@@ -50,7 +51,6 @@ class DictBase:
class JsonBlob(sql_types.TypeDecorator):
-
impl = sql.Text
def process_bind_param(self, value, dialect):
@@ -134,6 +134,7 @@ class PerimeterBase(DictBase):
name = sql.Column(sql.String(256), nullable=False)
value = sql.Column(JsonBlob(), nullable=True)
__mapper_args__ = {'concrete': True}
+
def __repr__(self):
return "{} with name {} : {}".format(self.id, self.name, json.dumps(self.value))
@@ -155,6 +156,7 @@ class PerimeterBase(DictBase):
'value': dict_value
}
+
class Subject(Base, PerimeterBase):
__tablename__ = 'subjects'
@@ -172,6 +174,7 @@ class PerimeterDataBase(DictBase):
id = sql.Column(sql.String(64), primary_key=True)
name = sql.Column(sql.String(256), nullable=False)
value = sql.Column(JsonBlob(), nullable=True)
+
@declared_attr
def policy_id(cls):
return sql.Column(sql.ForeignKey("policies.id"), nullable=False)
@@ -252,10 +255,11 @@ class ActionAssignment(Base, PerimeterAssignmentBase):
class MetaRule(Base, DictBase):
__tablename__ = 'meta_rules'
- attributes = ['id', 'name', 'subject_categories', 'object_categories', 'action_categories', 'value']
+ attributes = ['id', 'name', 'subject_categories', 'object_categories', 'action_categories',
+ 'value']
id = sql.Column(sql.String(64), primary_key=True)
name = sql.Column(sql.String(256), nullable=False)
- subject_categories = sql.Column(JsonBlob(), nullable=True)
+ subject_categories = sql.Column(JsonBlob(), nullable=True)
object_categories = sql.Column(JsonBlob(), nullable=True)
action_categories = sql.Column(JsonBlob(), nullable=True)
value = sql.Column(JsonBlob(), nullable=True)
@@ -351,8 +355,10 @@ class PDPConnector(BaseConnector, PDPDriver):
d.update(value_wo_name)
setattr(ref, "value", d)
return {ref.id: ref.to_dict()}
- except sqlalchemy.exc.IntegrityError:
- raise PdpExisting
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.PdpExisting
+ raise error
def delete_pdp(self, pdp_id):
with self.get_session_for_write() as session:
@@ -373,8 +379,10 @@ class PDPConnector(BaseConnector, PDPDriver):
})
session.add(new)
return {new.id: new.to_dict()}
- except sqlalchemy.exc.IntegrityError:
- raise PdpExisting
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.PdpExisting
+ raise error
def get_pdp(self, pdp_id=None):
with self.get_session_for_read() as session:
@@ -388,20 +396,27 @@ class PDPConnector(BaseConnector, PDPDriver):
class PolicyConnector(BaseConnector, PolicyDriver):
def update_policy(self, policy_id, value):
- with self.get_session_for_write() as session:
- query = session.query(Policy)
- query = query.filter_by(id=policy_id)
- ref = query.first()
- if ref:
- value_wo_other_info = copy.deepcopy(value)
- value_wo_other_info.pop("name", None)
- value_wo_other_info.pop("model_id", None)
- ref.name = value["name"]
- ref.model_id= value["model_id"]
- d = dict(ref.value)
- d.update(value_wo_other_info)
- setattr(ref, "value", d)
- return {ref.id: ref.to_dict()}
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(Policy)
+ query = query.filter_by(id=policy_id)
+ ref = query.first()
+
+ if ref:
+ value_wo_other_info = copy.deepcopy(value)
+ value_wo_other_info.pop("name", None)
+ value_wo_other_info.pop("model_id", None)
+ ref.name = value["name"]
+ ref.model_id = value["model_id"]
+ d = dict(ref.value)
+ d.update(value_wo_other_info)
+ setattr(ref, "value", d)
+ return {ref.id: ref.to_dict()}
+
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.PolicyExisting
+ raise error
def delete_policy(self, policy_id):
with self.get_session_for_write() as session:
@@ -409,40 +424,49 @@ class PolicyConnector(BaseConnector, PolicyDriver):
session.delete(ref)
def add_policy(self, policy_id=None, value=None):
- with self.get_session_for_write() as session:
- value_wo_other_info = copy.deepcopy(value)
- value_wo_other_info.pop("name", None)
- value_wo_other_info.pop("model_id", None)
- new = Policy.from_dict({
- "id": policy_id if policy_id else uuid4().hex,
- "name": value["name"],
- "model_id": value["model_id"],
- "value": value_wo_other_info
- })
- session.add(new)
- return {new.id: new.to_dict()}
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_other_info = copy.deepcopy(value)
+ value_wo_other_info.pop("name", None)
+ value_wo_other_info.pop("model_id", None)
+ new = Policy.from_dict({
+ "id": policy_id if policy_id else uuid4().hex,
+ "name": value["name"],
+ "model_id": value.get("model_id", ""),
+ "value": value_wo_other_info
+ })
+ session.add(new)
+ return {new.id: new.to_dict()}
+
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.PolicyExisting
+ raise error
- def get_policies(self, policy_id=None):
+ def get_policies(self, policy_id=None, policy_name=None):
with self.get_session_for_read() as session:
query = session.query(Policy)
if policy_id:
query = query.filter_by(id=policy_id)
+ elif policy_name:
+ query = query.filter_by(name=policy_name)
+
ref_list = query.all()
return {_ref.id: _ref.to_dict() for _ref in ref_list}
def __get_perimeters(self, ClassType, policy_id, perimeter_id=None):
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+
with self.get_session_for_read() as session:
query = session.query(ClassType)
- ref_list = copy.deepcopy(query.all())
+
if perimeter_id:
- for _ref in ref_list:
- _ref_value = _ref.to_return()
- if perimeter_id == _ref.id:
- if policy_id and policy_id in _ref_value["policy_list"]:
- return {_ref.id: _ref_value}
- else:
- return {}
- elif policy_id:
+ query = query.filter_by(id=perimeter_id)
+
+ ref_list = copy.deepcopy(query.all())
+
+ if policy_id:
results = []
for _ref in ref_list:
_ref_value = _ref.to_return()
@@ -451,14 +475,60 @@ class PolicyConnector(BaseConnector, PolicyDriver):
return {_ref.id: _ref.to_return() for _ref in results}
return {_ref.id: _ref.to_return() for _ref in ref_list}
- def __set_perimeter(self, ClassType, ClassTypeException, policy_id, perimeter_id=None, value=None):
- _perimeter = None
+ def __get_perimeter_by_name(self, ClassType, perimeter_name):
+ # if not policy_id:
+ # raise exceptions.PolicyUnknown
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ if not perimeter_name or not perimeter_name.strip():
+ raise exceptions.PerimeterContentError('invalid name')
+ query = query.filter_by(name=perimeter_name)
+ ref_list = copy.deepcopy(query.all())
+ return {_ref.id: _ref.to_return() for _ref in ref_list}
+
+ def __update_perimeter(self, class_type, class_type_exception, perimeter_id, value):
+ if not perimeter_id:
+ return exceptions.PerimeterContentError
with self.get_session_for_write() as session:
+ query = session.query(class_type)
+ query = query.filter_by(id=perimeter_id)
+ _perimeter = query.first()
+ if not _perimeter:
+ raise class_type_exception
+ temp_perimeter = copy.deepcopy(_perimeter.to_dict())
+ if 'name' in value:
+ temp_perimeter['value']['name'] = value['name']
+ if 'description' in value:
+ temp_perimeter['value']['description'] = value['description']
+ if 'extra' in value:
+ temp_perimeter['value']['extra'] = value['extra']
+ name = temp_perimeter['value']['name']
+ temp_perimeter['value'].pop("name", None)
+ new_perimeter = class_type.from_dict({
+ "id": temp_perimeter["id"],
+ "name": name,
+ "value": temp_perimeter["value"]
+ })
+ _perimeter.value = new_perimeter.value
+ _perimeter.name = new_perimeter.name
+ return {_perimeter.id: _perimeter.to_return()}
+
+ def __set_perimeter(self, ClassType, ClassTypeException, policy_id, perimeter_id=None,
+ value=None):
+ if not value or "name" not in value or not value["name"].strip():
+ raise exceptions.PerimeterContentError('invalid name')
+ with self.get_session_for_write() as session:
+ _perimeter = None
if perimeter_id:
query = session.query(ClassType)
query = query.filter_by(id=perimeter_id)
_perimeter = query.first()
- logger.info("+++++++++++++ {}".format(_perimeter))
+ if not perimeter_id and not _perimeter:
+ query = session.query(ClassType)
+ query = query.filter_by(name=value['name'])
+ _perimeter = query.first()
+ if _perimeter:
+ raise ClassTypeException
if not _perimeter:
if "policy_list" not in value or type(value["policy_list"]) is not list:
value["policy_list"] = []
@@ -466,9 +536,9 @@ class PolicyConnector(BaseConnector, PolicyDriver):
value["policy_list"] = [policy_id, ]
value_wo_name = copy.deepcopy(value)
- value_wo_name.pop("name",None)
+ value_wo_name.pop("name", None)
new = ClassType.from_dict({
- "id": uuid4().hex,
+ "id": perimeter_id if perimeter_id else uuid4().hex,
"name": value["name"],
"value": value_wo_name
})
@@ -476,11 +546,17 @@ class PolicyConnector(BaseConnector, PolicyDriver):
return {new.id: new.to_return()}
else:
_value = copy.deepcopy(_perimeter.to_dict())
- if "policy_list" not in _value["value"] or type(_value["value"]["policy_list"]) is not list:
+ if "policy_list" not in _value["value"] or type(
+ _value["value"]["policy_list"]) is not list:
_value["value"]["policy_list"] = []
if policy_id and policy_id not in _value["value"]["policy_list"]:
_value["value"]["policy_list"].append(policy_id)
- logger.info("-------------_value- {}".format(_value))
+ else:
+ if policy_id:
+ raise exceptions.PolicyExisting
+ raise exceptions.PerimeterContentError
+
+ _value["value"].update(value)
name = _value["value"]["name"]
_value["value"].pop("name")
@@ -489,13 +565,11 @@ class PolicyConnector(BaseConnector, PolicyDriver):
"name": name,
"value": _value["value"]
})
- logger.info("-------------- new {}".format(new_perimeter))
- logger.info("-------------- old {}".format(_perimeter))
_perimeter.value = new_perimeter.value
_perimeter.name = new_perimeter.name
return {_perimeter.id: _perimeter.to_return()}
- def __delete_perimeter(self,ClassType, ClassUnknownException, policy_id, perimeter_id):
+ def __delete_perimeter(self, ClassType, ClassUnknownException, policy_id, perimeter_id):
with self.get_session_for_write() as session:
query = session.query(ClassType)
query = query.filter_by(id=perimeter_id)
@@ -503,11 +577,13 @@ class PolicyConnector(BaseConnector, PolicyDriver):
if not _perimeter:
raise ClassUnknownException
old_perimeter = copy.deepcopy(_perimeter.to_dict())
- # value = _subject.to_dict()
try:
old_perimeter["value"]["policy_list"].remove(policy_id)
new_perimeter = ClassType.from_dict(old_perimeter)
- setattr(_perimeter, "value", getattr(new_perimeter, "value"))
+ if not new_perimeter.value["policy_list"]:
+ session.delete(_perimeter)
+ else:
+ setattr(_perimeter, "value", getattr(new_perimeter, "value"))
except ValueError:
if not _perimeter.value["policy_list"]:
session.delete(_perimeter)
@@ -515,56 +591,115 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def get_subjects(self, policy_id, perimeter_id=None):
return self.__get_perimeters(Subject, policy_id, perimeter_id)
+ def get_subject_by_name(self, perimeter_name):
+ return self.__get_perimeter_by_name(Subject, perimeter_name)
+
def set_subject(self, policy_id, perimeter_id=None, value=None):
try:
- return self.__set_perimeter(Subject, SubjectExisting, policy_id, perimeter_id=perimeter_id, value=value)
- except sqlalchemy.exc.IntegrityError:
- raise SubjectExisting
+ return self.__set_perimeter(Subject, exceptions.SubjectExisting, policy_id,
+ perimeter_id=perimeter_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.SubjectExisting
+ raise error
+
+ def update_subject(self, perimeter_id, value):
+ try:
+ return self.__update_perimeter(Subject, exceptions.SubjectExisting, perimeter_id, value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.SubjectExisting
+ raise error
def delete_subject(self, policy_id, perimeter_id):
- self.__delete_perimeter(Subject, SubjectUnknown, policy_id, perimeter_id)
+ self.__delete_perimeter(Subject, exceptions.SubjectUnknown, policy_id, perimeter_id)
def get_objects(self, policy_id, perimeter_id=None):
return self.__get_perimeters(Object, policy_id, perimeter_id)
+ def get_object_by_name(self, perimeter_name):
+ return self.__get_perimeter_by_name(Object, perimeter_name)
+
def set_object(self, policy_id, perimeter_id=None, value=None):
try:
- return self.__set_perimeter(Object, ObjectExisting, policy_id, perimeter_id=perimeter_id, value=value)
- except sqlalchemy.exc.IntegrityError:
- raise ObjectExisting
+ return self.__set_perimeter(Object, exceptions.ObjectExisting, policy_id,
+ perimeter_id=perimeter_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ logger.exception("IntegrityError {}".format(error))
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ObjectExisting
+ raise error
+
+ def update_object(self, perimeter_id, value):
+ try:
+ return self.__update_perimeter(Object, exceptions.ObjectExisting, perimeter_id, value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ObjectExisting
+ raise error
def delete_object(self, policy_id, perimeter_id):
- self.__delete_perimeter(Object, ObjectUnknown, policy_id, perimeter_id)
+ self.__delete_perimeter(Object, exceptions.ObjectUnknown, policy_id, perimeter_id)
def get_actions(self, policy_id, perimeter_id=None):
return self.__get_perimeters(Action, policy_id, perimeter_id)
+ def get_action_by_name(self, perimeter_name):
+ return self.__get_perimeter_by_name(Action, perimeter_name)
+
def set_action(self, policy_id, perimeter_id=None, value=None):
try:
- return self.__set_perimeter(Action, ActionExisting, policy_id, perimeter_id=perimeter_id, value=value)
- except sqlalchemy.exc.IntegrityError:
- raise ActionExisting
+ return self.__set_perimeter(Action, exceptions.ActionExisting, policy_id,
+ perimeter_id=perimeter_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ActionExisting
+ raise error
+
+ def update_action(self, perimeter_id, value):
+ try:
+ return self.__update_perimeter(Action, exceptions.ActionExisting, perimeter_id, value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ActionExisting
+ raise error
def delete_action(self, policy_id, perimeter_id):
- self.__delete_perimeter(Action, ActionUnknown, policy_id, perimeter_id)
+ self.__delete_perimeter(Action, exceptions.ActionUnknown, policy_id, perimeter_id)
- def __get_perimeter_data(self, ClassType, policy_id, data_id=None, category_id=None):
- logger.info("driver {} {} {}".format(policy_id, data_id, category_id))
+ def __is_data_exist(self, ClassType, category_id=None):
+
+ with self.get_session_for_read() as session:
+ query = session.query(ClassType)
+ query = query.filter_by(category_id=category_id)
+ ref_list = query.all()
+ if ref_list:
+ return True
+ return False
+
+ def __get_data(self, ClassType, policy_id, data_id=None, category_id=None):
with self.get_session_for_read() as session:
query = session.query(ClassType)
- if data_id:
+ if policy_id and data_id and category_id:
query = query.filter_by(policy_id=policy_id, id=data_id, category_id=category_id)
- else:
+ elif policy_id and category_id:
query = query.filter_by(policy_id=policy_id, category_id=category_id)
+ elif category_id:
+ query = query.filter_by(category_id=category_id)
+ elif policy_id:
+ query = query.filter_by(policy_id=policy_id)
+ else:
+ raise exceptions.PolicyUnknown
+
ref_list = query.all()
- logger.info("ref_list={}".format(ref_list))
return {
"policy_id": policy_id,
"category_id": category_id,
"data": {_ref.id: _ref.to_dict() for _ref in ref_list}
}
- def __set_perimeter_data(self, ClassType, ClassTypeData, policy_id, data_id=None, category_id=None, value=None):
+ def __set_data(self, ClassType, ClassTypeData, policy_id, data_id=None, category_id=None,
+ value=None):
with self.get_session_for_write() as session:
query = session.query(ClassTypeData)
query = query.filter_by(policy_id=policy_id, id=data_id, category_id=category_id)
@@ -594,56 +729,81 @@ class PolicyConnector(BaseConnector, PolicyDriver):
"data": {ref.id: ref.to_dict()}
}
- def __delete_perimeter_data(self, ClassType, policy_id, data_id):
+ def __delete_data(self, ClassType, policy_id, category_id, data_id):
+
+ if not data_id:
+ raise exceptions.DataUnknown
with self.get_session_for_write() as session:
query = session.query(ClassType)
- query = query.filter_by(policy_id=policy_id, id=data_id)
+ if category_id:
+ query = query.filter_by(policy_id=policy_id, category_id=category_id, id=data_id)
+ else:
+ query = query.filter_by(policy_id=policy_id, id=data_id)
ref = query.first()
if ref:
session.delete(ref)
+ def is_subject_data_exist(self, category_id=None):
+ return self.__is_data_exist(SubjectData, category_id=category_id)
+
def get_subject_data(self, policy_id, data_id=None, category_id=None):
- return self.__get_perimeter_data(SubjectData, policy_id, data_id=data_id, category_id=category_id)
+ return self.__get_data(SubjectData, policy_id, data_id=data_id, category_id=category_id)
def set_subject_data(self, policy_id, data_id=None, category_id=None, value=None):
try:
- return self.__set_perimeter_data(Subject, SubjectData, policy_id, data_id=data_id, category_id=category_id, value=value)
- except sqlalchemy.exc.IntegrityError:
- raise SubjectScopeExisting
+ return self.__set_data(Subject, SubjectData, policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.SubjectScopeExisting
+ raise error
- def delete_subject_data(self, policy_id, data_id):
- return self.__delete_perimeter_data(SubjectData, policy_id, data_id)
+ def delete_subject_data(self, policy_id, category_id, data_id):
+ return self.__delete_data(SubjectData, policy_id, category_id, data_id)
+
+ def is_object_data_exist(self, category_id=None):
+ return self.__is_data_exist(ObjectData, category_id=category_id)
def get_object_data(self, policy_id, data_id=None, category_id=None):
- return self.__get_perimeter_data(ObjectData, policy_id, data_id=data_id, category_id=category_id)
+ return self.__get_data(ObjectData, policy_id, data_id=data_id, category_id=category_id)
def set_object_data(self, policy_id, data_id=None, category_id=None, value=None):
try:
- return self.__set_perimeter_data(Object, ObjectData, policy_id, data_id=data_id, category_id=category_id, value=value)
- except sqlalchemy.exc.IntegrityError:
- raise ObjectScopeExisting
+ return self.__set_data(Object, ObjectData, policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ObjectScopeExisting
+ raise error
+
+ def delete_object_data(self, policy_id, category_id, data_id):
+ return self.__delete_data(ObjectData, policy_id, category_id, data_id)
- def delete_object_data(self, policy_id, data_id):
- return self.__delete_perimeter_data(ObjectData, policy_id, data_id)
+ def is_action_data_exist(self, category_id=None):
+ return self.__is_data_exist(ActionData, category_id=category_id)
def get_action_data(self, policy_id, data_id=None, category_id=None):
- return self.__get_perimeter_data(ActionData, policy_id, data_id=data_id, category_id=category_id)
+ return self.__get_data(ActionData, policy_id, data_id=data_id, category_id=category_id)
def set_action_data(self, policy_id, data_id=None, category_id=None, value=None):
try:
- return self.__set_perimeter_data(Action, ActionData, policy_id, data_id=data_id, category_id=category_id, value=value)
- except sqlalchemy.exc.IntegrityError:
- raise ActionScopeExisting
+ return self.__set_data(Action, ActionData, policy_id, data_id=data_id,
+ category_id=category_id, value=value)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ActionScopeExisting
+ raise error
- def delete_action_data(self, policy_id, data_id):
- return self.__delete_perimeter_data(ActionData, policy_id, data_id)
+ def delete_action_data(self, policy_id, category_id, data_id):
+ return self.__delete_data(ActionData, policy_id, category_id, data_id)
def get_subject_assignments(self, policy_id, subject_id=None, category_id=None):
with self.get_session_for_write() as session:
query = session.query(SubjectAssignment)
if subject_id and category_id:
- #TODO change the subject_id to perimeter_id to allow code refactoring
- query = query.filter_by(policy_id=policy_id, subject_id=subject_id, category_id=category_id)
+ # TODO change the subject_id to perimeter_id to allow code refactoring
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
elif subject_id:
query = query.filter_by(policy_id=policy_id, subject_id=subject_id)
else:
@@ -654,7 +814,8 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def add_subject_assignment(self, policy_id, subject_id, category_id, data_id):
with self.get_session_for_write() as session:
query = session.query(SubjectAssignment)
- query = query.filter_by(policy_id=policy_id, subject_id=subject_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
ref = query.first()
if ref:
old_ref = copy.deepcopy(ref.to_dict())
@@ -663,7 +824,7 @@ class PolicyConnector(BaseConnector, PolicyDriver):
assignments.append(data_id)
setattr(ref, "assignments", assignments)
else:
- raise SubjectAssignmentExisting
+ raise exceptions.SubjectAssignmentExisting
else:
ref = SubjectAssignment.from_dict(
{
@@ -677,10 +838,27 @@ class PolicyConnector(BaseConnector, PolicyDriver):
session.add(ref)
return {ref.id: ref.to_dict()}
+ def is_subject_category_has_assignment(self, category_id):
+ return self.__is_category_has_assignment(SubjectAssignment, category_id)
+
+ def is_object_category_has_assignment(self, category_id):
+ return self.__is_category_has_assignment(ObjectAssignment, category_id)
+
+ def is_action_category_has_assignment(self, category_id):
+ return self.__is_category_has_assignment(ActionAssignment, category_id)
+
+ def __is_category_has_assignment(self, ClassType, category_id):
+ with self.get_session_for_write() as session:
+ query = session.query(ClassType)
+ query = query.filter_by(category_id=category_id)
+ count = query.count()
+ return count > 0
+
def delete_subject_assignment(self, policy_id, subject_id, category_id, data_id):
with self.get_session_for_write() as session:
query = session.query(SubjectAssignment)
- query = query.filter_by(policy_id=policy_id, subject_id=subject_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, subject_id=subject_id,
+ category_id=category_id)
ref = query.first()
if ref:
old_ref = copy.deepcopy(ref.to_dict())
@@ -697,8 +875,9 @@ class PolicyConnector(BaseConnector, PolicyDriver):
with self.get_session_for_write() as session:
query = session.query(ObjectAssignment)
if object_id and category_id:
- #TODO change the object_id to perimeter_id to allow code refactoring
- query = query.filter_by(policy_id=policy_id, object_id=object_id, category_id=category_id)
+ # TODO change the object_id to perimeter_id to allow code refactoring
+ query = query.filter_by(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
elif object_id:
query = query.filter_by(policy_id=policy_id, object_id=object_id)
else:
@@ -709,7 +888,8 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def add_object_assignment(self, policy_id, object_id, category_id, data_id):
with self.get_session_for_write() as session:
query = session.query(ObjectAssignment)
- query = query.filter_by(policy_id=policy_id, object_id=object_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
ref = query.first()
if ref:
old_ref = copy.deepcopy(ref.to_dict())
@@ -718,7 +898,7 @@ class PolicyConnector(BaseConnector, PolicyDriver):
assignments.append(data_id)
setattr(ref, "assignments", assignments)
else:
- raise ObjectAssignmentExisting
+ raise exceptions.ObjectAssignmentExisting
else:
ref = ObjectAssignment.from_dict(
{
@@ -735,7 +915,8 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def delete_object_assignment(self, policy_id, object_id, category_id, data_id):
with self.get_session_for_write() as session:
query = session.query(ObjectAssignment)
- query = query.filter_by(policy_id=policy_id, object_id=object_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, object_id=object_id,
+ category_id=category_id)
ref = query.first()
if ref:
old_ref = copy.deepcopy(ref.to_dict())
@@ -750,12 +931,17 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def get_action_assignments(self, policy_id, action_id=None, category_id=None):
with self.get_session_for_write() as session:
+ if not policy_id:
+ return exceptions.PolicyUnknown
query = session.query(ActionAssignment)
if action_id and category_id:
# TODO change the action_id to perimeter_id to allow code refactoring
- query = query.filter_by(policy_id=policy_id, action_id=action_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
elif action_id:
query = query.filter_by(policy_id=policy_id, action_id=action_id)
+ elif category_id:
+ query = query.filter_by(policy_id=policy_id, category_id=category_id)
else:
query = query.filter_by(policy_id=policy_id)
ref_list = query.all()
@@ -764,7 +950,8 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def add_action_assignment(self, policy_id, action_id, category_id, data_id):
with self.get_session_for_write() as session:
query = session.query(ActionAssignment)
- query = query.filter_by(policy_id=policy_id, action_id=action_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
ref = query.first()
if ref:
old_ref = copy.deepcopy(ref.to_dict())
@@ -773,7 +960,7 @@ class PolicyConnector(BaseConnector, PolicyDriver):
assignments.append(data_id)
setattr(ref, "assignments", assignments)
else:
- raise ActionAssignmentExisting
+ raise exceptions.ActionAssignmentExisting
else:
ref = ActionAssignment.from_dict(
{
@@ -790,7 +977,8 @@ class PolicyConnector(BaseConnector, PolicyDriver):
def delete_action_assignment(self, policy_id, action_id, category_id, data_id):
with self.get_session_for_write() as session:
query = session.query(ActionAssignment)
- query = query.filter_by(policy_id=policy_id, action_id=action_id, category_id=category_id)
+ query = query.filter_by(policy_id=policy_id, action_id=action_id,
+ category_id=category_id)
ref = query.first()
if ref:
old_ref = copy.deepcopy(ref.to_dict())
@@ -810,7 +998,7 @@ class PolicyConnector(BaseConnector, PolicyDriver):
query = query.filter_by(policy_id=policy_id, rule_id=rule_id)
ref = query.first()
return {ref.id: ref.to_dict()}
- elif meta_rule_id:
+ elif meta_rule_id and policy_id:
query = query.filter_by(policy_id=policy_id, meta_rule_id=meta_rule_id)
ref_list = query.all()
return {
@@ -826,8 +1014,20 @@ class PolicyConnector(BaseConnector, PolicyDriver):
"rules": list(map(lambda x: x.to_dict(), ref_list))
}
+ def is_meta_rule_has_rules(self, meta_rule_id):
+ with self.get_session_for_read() as session:
+ query = session.query(Rule)
+
+ query = query.filter_by(meta_rule_id=meta_rule_id)
+ count = query.count()
+ return count > 0
+
def add_rule(self, policy_id, meta_rule_id, value):
try:
+ rules = self.get_rules(policy_id, meta_rule_id=meta_rule_id)
+ for _rule in map(lambda x: x["rule"], rules["rules"]):
+ if list(value.get('rule')) == list(_rule):
+ raise exceptions.RuleExisting
with self.get_session_for_write() as session:
ref = Rule.from_dict(
{
@@ -839,8 +1039,10 @@ class PolicyConnector(BaseConnector, PolicyDriver):
)
session.add(ref)
return {ref.id: ref.to_dict()}
- except sqlalchemy.exc.IntegrityError:
- raise RuleExisting
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.RuleExisting
+ raise error
def delete_rule(self, policy_id, rule_id):
with self.get_session_for_write() as session:
@@ -854,19 +1056,24 @@ class PolicyConnector(BaseConnector, PolicyDriver):
class ModelConnector(BaseConnector, ModelDriver):
def update_model(self, model_id, value):
- with self.get_session_for_write() as session:
- query = session.query(Model)
- if model_id:
- query = query.filter_by(id=model_id)
- ref = query.first()
- if ref:
- value_wo_name = copy.deepcopy(value)
- value_wo_name.pop("name", None)
- setattr(ref, "name", value["name"])
- d = dict(ref.value)
- d.update(value_wo_name)
- setattr(ref, "value", d)
- return {ref.id: ref.to_dict()}
+ try:
+ with self.get_session_for_write() as session:
+ query = session.query(Model)
+ if model_id:
+ query = query.filter_by(id=model_id)
+ ref = query.first()
+ if ref:
+ value_wo_name = copy.deepcopy(value)
+ value_wo_name.pop("name", None)
+ setattr(ref, "name", value["name"])
+ d = dict(ref.value)
+ d.update(value_wo_name)
+ setattr(ref, "value", d)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ModelExisting
+ raise error
def delete_model(self, model_id):
with self.get_session_for_write() as session:
@@ -885,8 +1092,9 @@ class ModelConnector(BaseConnector, ModelDriver):
})
session.add(new)
return {new.id: new.to_dict()}
- except sqlalchemy.exc.IntegrityError as e:
- raise ModelExisting
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ModelExisting
def get_models(self, model_id=None):
with self.get_session_for_read() as session:
@@ -900,37 +1108,44 @@ class ModelConnector(BaseConnector, ModelDriver):
return r
def set_meta_rule(self, meta_rule_id, value):
- with self.get_session_for_write() as session:
- value_wo_other_data = copy.deepcopy(value)
- value_wo_other_data.pop("name", None)
- value_wo_other_data.pop("subject_categories", None)
- value_wo_other_data.pop("object_categories", None)
- value_wo_other_data.pop("action_categories", None)
- if meta_rule_id is None:
- try:
- ref = MetaRule.from_dict(
- {
- "id": uuid4().hex,
- "name": value["name"],
- "subject_categories": value["subject_categories"],
- "object_categories": value["object_categories"],
- "action_categories": value["action_categories"],
- "value": value_wo_other_data
- }
- )
- session.add(ref)
- except sqlalchemy.exc.IntegrityError as e:
- raise MetaRuleExisting
- else:
- query = session.query(MetaRule)
- query = query.filter_by(id=meta_rule_id)
- ref = query.first()
- setattr(ref, "name", value["name"])
- setattr(ref, "subject_categories", value["subject_categories"])
- setattr(ref, "object_categories", value["object_categories"])
- setattr(ref, "action_categories", value["action_categories"])
- setattr(ref, "value", value_wo_other_data)
- return {ref.id: ref.to_dict()}
+ try:
+ with self.get_session_for_write() as session:
+ value_wo_other_data = copy.deepcopy(value)
+ value_wo_other_data.pop("name", None)
+ value_wo_other_data.pop("subject_categories", None)
+ value_wo_other_data.pop("object_categories", None)
+ value_wo_other_data.pop("action_categories", None)
+ if meta_rule_id is None:
+ try:
+ ref = MetaRule.from_dict(
+ {
+ "id": uuid4().hex,
+ "name": value["name"],
+ "subject_categories": value["subject_categories"],
+ "object_categories": value["object_categories"],
+ "action_categories": value["action_categories"],
+ "value": value_wo_other_data
+ }
+ )
+ session.add(ref)
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.MetaRuleExisting
+ raise error
+ else:
+ query = session.query(MetaRule)
+ query = query.filter_by(id=meta_rule_id)
+ ref = query.first()
+ setattr(ref, "name", value["name"])
+ setattr(ref, "subject_categories", value["subject_categories"])
+ setattr(ref, "object_categories", value["object_categories"])
+ setattr(ref, "action_categories", value["action_categories"])
+ setattr(ref, "value", value_wo_other_data)
+ return {ref.id: ref.to_dict()}
+ except sqlalchemy.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.MetaRuleExisting
+ raise error
def get_meta_rules(self, meta_rule_id=None):
with self.get_session_for_read() as session:
@@ -957,6 +1172,8 @@ class ModelConnector(BaseConnector, ModelDriver):
return {_ref.id: _ref.to_dict() for _ref in ref_list}
def __add_perimeter_category(self, ClassType, name, description, uuid=None):
+ if not name or not name.strip():
+ raise exceptions.CategoryNameInvalid
with self.get_session_for_write() as session:
ref = ClassType.from_dict(
{
@@ -982,8 +1199,10 @@ class ModelConnector(BaseConnector, ModelDriver):
def add_subject_category(self, name, description, uuid=None):
try:
return self.__add_perimeter_category(SubjectCategory, name, description, uuid=uuid)
- except sql.exc.IntegrityError as e:
- raise SubjectCategoryExisting()
+ except sql.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.SubjectCategoryExisting
+ raise error
def delete_subject_category(self, category_id):
self.__delete_perimeter_category(SubjectCategory, category_id)
@@ -994,8 +1213,10 @@ class ModelConnector(BaseConnector, ModelDriver):
def add_object_category(self, name, description, uuid=None):
try:
return self.__add_perimeter_category(ObjectCategory, name, description, uuid=uuid)
- except sql.exc.IntegrityError as e:
- raise ObjectCategoryExisting()
+ except sql.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ObjectCategoryExisting
+ raise error
def delete_object_category(self, category_id):
self.__delete_perimeter_category(ObjectCategory, category_id)
@@ -1007,8 +1228,10 @@ class ModelConnector(BaseConnector, ModelDriver):
def add_action_category(self, name, description, uuid=None):
try:
return self.__add_perimeter_category(ActionCategory, name, description, uuid=uuid)
- except sql.exc.IntegrityError as e:
- raise ActionCategoryExisting()
+ except sql.exc.IntegrityError as error:
+ if 'UNIQUE constraint' in str(error):
+ raise exceptions.ActionCategoryExisting
+ raise error
def delete_action_category(self, category_id):
self.__delete_perimeter_category(ActionCategory, category_id)
diff --git a/python_moondb/python_moondb/core.py b/old/python_moondb/python_moondb/core.py
index 984b81a7..3fee146b 100644
--- a/python_moondb/python_moondb/core.py
+++ b/old/python_moondb/python_moondb/core.py
@@ -19,7 +19,7 @@ class Driver(DriverManager):
namespace='moon_db.driver',
name=driver_name,
invoke_on_load=True,
- invoke_args=(engine_name, ),
+ invoke_args=(engine_name,),
)
diff --git a/python_moondb/python_moondb/db_manager.py b/old/python_moondb/python_moondb/db_manager.py
index c251afbb..c251afbb 100644
--- a/python_moondb/python_moondb/db_manager.py
+++ b/old/python_moondb/python_moondb/db_manager.py
diff --git a/old/python_moondb/python_moondb/migrate_repo/__init__.py b/old/python_moondb/python_moondb/migrate_repo/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moondb/python_moondb/migrate_repo/__init__.py
diff --git a/python_moondb/python_moondb/migrate_repo/versions/001_moon.py b/old/python_moondb/python_moondb/migrate_repo/versions/001_moon.py
index f69d708d..13670b91 100644
--- a/python_moondb/python_moondb/migrate_repo/versions/001_moon.py
+++ b/old/python_moondb/python_moondb/migrate_repo/versions/001_moon.py
@@ -3,7 +3,19 @@
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+import json
import sqlalchemy as sql
+from sqlalchemy import types as sql_types
+
+
+class JsonBlob(sql_types.TypeDecorator):
+ impl = sql.Text
+
+ def process_bind_param(self, value, dialect):
+ return json.dumps(value)
+
+ def process_result_value(self, value, dialect):
+ return json.loads(value)
def upgrade(migrate_engine):
@@ -16,7 +28,7 @@ def upgrade(migrate_engine):
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
sql.Column('keystone_project_id', sql.String(64), nullable=True, default=""),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', 'keystone_project_id', name='unique_constraint_models'),
mysql_engine='InnoDB',
mysql_charset='utf8')
@@ -28,7 +40,7 @@ def upgrade(migrate_engine):
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
sql.Column('model_id', sql.String(64), nullable=True, default=""),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', 'model_id', name='unique_constraint_models'),
mysql_engine='InnoDB',
mysql_charset='utf8')
@@ -39,7 +51,7 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', name='unique_constraint_models'),
mysql_engine='InnoDB',
mysql_charset='utf8')
@@ -86,7 +98,7 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', name='unique_constraint_subjects'),
mysql_engine='InnoDB',
mysql_charset='utf8')
@@ -97,7 +109,7 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', name='unique_constraint_objects'),
mysql_engine='InnoDB',
mysql_charset='utf8')
@@ -108,7 +120,7 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', name='unique_constraint_actions'),
mysql_engine='InnoDB',
mysql_charset='utf8')
@@ -119,10 +131,11 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.Column('category_id', sql.ForeignKey("subject_categories.id"), nullable=False),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
- sql.UniqueConstraint('name', 'category_id', 'policy_id', name='unique_constraint_subject_data'),
+ sql.UniqueConstraint('name', 'category_id', 'policy_id',
+ name='unique_constraint_subject_data'),
mysql_engine='InnoDB',
mysql_charset='utf8')
subject_data_table.create(migrate_engine, checkfirst=True)
@@ -132,10 +145,11 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.Column('category_id', sql.ForeignKey("object_categories.id"), nullable=False),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
- sql.UniqueConstraint('name', 'category_id', 'policy_id', name='unique_constraint_object_data'),
+ sql.UniqueConstraint('name', 'category_id', 'policy_id',
+ name='unique_constraint_object_data'),
mysql_engine='InnoDB',
mysql_charset='utf8')
object_data_table.create(migrate_engine, checkfirst=True)
@@ -145,10 +159,11 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.Column('category_id', sql.ForeignKey("action_categories.id"), nullable=False),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
- sql.UniqueConstraint('name', 'category_id', 'policy_id', name='unique_constraint_action_data'),
+ sql.UniqueConstraint('name', 'category_id', 'policy_id',
+ name='unique_constraint_action_data'),
mysql_engine='InnoDB',
mysql_charset='utf8')
action_data_table.create(migrate_engine, checkfirst=True)
@@ -157,11 +172,12 @@ def upgrade(migrate_engine):
'subject_assignments',
meta,
sql.Column('id', sql.String(64), primary_key=True),
- sql.Column('assignments', sql.Text(), nullable=True),
+ sql.Column('assignments', sql.String(256), nullable=True),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
sql.Column('subject_id', sql.ForeignKey("subjects.id"), nullable=False),
sql.Column('category_id', sql.ForeignKey("subject_categories.id"), nullable=False),
- sql.UniqueConstraint('policy_id', 'subject_id', 'category_id', name='unique_constraint_subject_assignment'),
+ sql.UniqueConstraint('policy_id', 'subject_id', 'category_id',
+ name='unique_constraint_subject_assignment'),
mysql_engine='InnoDB',
mysql_charset='utf8')
subject_assignments_table.create(migrate_engine, checkfirst=True)
@@ -170,11 +186,12 @@ def upgrade(migrate_engine):
'object_assignments',
meta,
sql.Column('id', sql.String(64), primary_key=True),
- sql.Column('assignments', sql.Text(), nullable=True),
+ sql.Column('assignments', sql.String(256), nullable=True),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
sql.Column('object_id', sql.ForeignKey("objects.id"), nullable=False),
sql.Column('category_id', sql.ForeignKey("object_categories.id"), nullable=False),
- sql.UniqueConstraint('policy_id', 'object_id', 'category_id', name='unique_constraint_object_assignment'),
+ sql.UniqueConstraint('policy_id', 'object_id', 'category_id',
+ name='unique_constraint_object_assignment'),
mysql_engine='InnoDB',
mysql_charset='utf8')
object_assignments_table.create(migrate_engine, checkfirst=True)
@@ -183,11 +200,12 @@ def upgrade(migrate_engine):
'action_assignments',
meta,
sql.Column('id', sql.String(64), primary_key=True),
- sql.Column('assignments', sql.Text(), nullable=True),
+ sql.Column('assignments', sql.String(256), nullable=True),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
sql.Column('action_id', sql.ForeignKey("actions.id"), nullable=False),
sql.Column('category_id', sql.ForeignKey("action_categories.id"), nullable=False),
- sql.UniqueConstraint('policy_id', 'action_id', 'category_id', name='unique_constraint_action_assignment'),
+ sql.UniqueConstraint('policy_id', 'action_id', 'category_id',
+ name='unique_constraint_action_assignment'),
mysql_engine='InnoDB',
mysql_charset='utf8')
action_assignments_table.create(migrate_engine, checkfirst=True)
@@ -197,12 +215,12 @@ def upgrade(migrate_engine):
meta,
sql.Column('id', sql.String(64), primary_key=True),
sql.Column('name', sql.String(256), nullable=False),
- sql.Column('subject_categories', sql.Text(), nullable=False),
- sql.Column('object_categories', sql.Text(), nullable=False),
- sql.Column('action_categories', sql.Text(), nullable=False),
- sql.Column('value', sql.Text(), nullable=True),
+ sql.Column('subject_categories', JsonBlob(), nullable=False),
+ sql.Column('object_categories', JsonBlob(), nullable=False),
+ sql.Column('action_categories', JsonBlob(), nullable=False),
+ sql.Column('value', JsonBlob(), nullable=True),
sql.UniqueConstraint('name', name='unique_constraint_meta_rule_name'),
- sql.UniqueConstraint('subject_categories', 'object_categories', 'action_categories', name='unique_constraint_meta_rule_def'),
+ # sql.UniqueConstraint('subject_categories', 'object_categories', 'action_categories', name='unique_constraint_meta_rule_def'),
mysql_engine='InnoDB',
mysql_charset='utf8')
meta_rules_table.create(migrate_engine, checkfirst=True)
@@ -211,10 +229,9 @@ def upgrade(migrate_engine):
'rules',
meta,
sql.Column('id', sql.String(64), primary_key=True),
- sql.Column('rule', sql.Text(), nullable=True),
+ sql.Column('rule', JsonBlob(), nullable=True),
sql.Column('policy_id', sql.ForeignKey("policies.id"), nullable=False),
sql.Column('meta_rule_id', sql.ForeignKey("meta_rules.id"), nullable=False),
- sql.UniqueConstraint('rule', 'policy_id', 'meta_rule_id', name='unique_constraint_rule'),
mysql_engine='InnoDB',
mysql_charset='utf8')
rules_table.create(migrate_engine, checkfirst=True)
@@ -225,28 +242,26 @@ def downgrade(migrate_engine):
meta.bind = migrate_engine
for _table in (
- 'rules',
- 'meta_rules',
- 'action_assignments',
- 'object_assignments',
- 'subject_assignments',
- 'action_data',
- 'object_data',
- 'subject_data',
- 'actions',
- 'objects',
- 'subjects',
- 'action_categories',
- 'object_categories',
- 'subject_categories',
- 'models',
- 'policies',
- 'pdp'
+ 'rules',
+ 'meta_rules',
+ 'action_assignments',
+ 'object_assignments',
+ 'subject_assignments',
+ 'action_data',
+ 'object_data',
+ 'subject_data',
+ 'actions',
+ 'objects',
+ 'subjects',
+ 'action_categories',
+ 'object_categories',
+ 'subject_categories',
+ 'models',
+ 'policies',
+ 'pdp'
):
try:
table = sql.Table(_table, meta, autoload=True)
table.drop(migrate_engine, checkfirst=True)
except Exception as e:
print(e)
-
-
diff --git a/old/python_moondb/python_moondb/migrate_repo/versions/__init__.py b/old/python_moondb/python_moondb/migrate_repo/versions/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moondb/python_moondb/migrate_repo/versions/__init__.py
diff --git a/python_moondb/requirements.txt b/old/python_moondb/requirements.txt
index a205666f..a205666f 100644
--- a/python_moondb/requirements.txt
+++ b/old/python_moondb/requirements.txt
diff --git a/python_moondb/setup.py b/old/python_moondb/setup.py
index e34369d4..e34369d4 100644
--- a/python_moondb/setup.py
+++ b/old/python_moondb/setup.py
diff --git a/python_moondb/tests/unit_python/conftest.py b/old/python_moondb/tests/unit_python/conftest.py
index a1057907..a1057907 100644
--- a/python_moondb/tests/unit_python/conftest.py
+++ b/old/python_moondb/tests/unit_python/conftest.py
diff --git a/old/python_moondb/tests/unit_python/helpers/__init__.py b/old/python_moondb/tests/unit_python/helpers/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/__init__.py
diff --git a/old/python_moondb/tests/unit_python/helpers/assignment_helper.py b/old/python_moondb/tests/unit_python/helpers/assignment_helper.py
new file mode 100644
index 00000000..22a56e38
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/assignment_helper.py
@@ -0,0 +1,49 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+def get_action_assignments(policy_id, action_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_action_assignments("", policy_id, action_id, category_id)
+
+
+def add_action_assignment(policy_id, action_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_action_assignment("", policy_id, action_id, category_id, data_id)
+
+
+def delete_action_assignment(policy_id, action_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_action_assignment("", policy_id, action_id, category_id, data_id)
+
+
+def get_object_assignments(policy_id, object_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_object_assignments("", policy_id, object_id, category_id)
+
+
+def add_object_assignment(policy_id, object_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_object_assignment("", policy_id, object_id, category_id, data_id)
+
+
+def delete_object_assignment(policy_id, object_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_object_assignment("", policy_id, object_id, category_id, data_id)
+
+
+def get_subject_assignments(policy_id, subject_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_subject_assignments("", policy_id, subject_id, category_id)
+
+
+def add_subject_assignment(policy_id, subject_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_subject_assignment("", policy_id, subject_id, category_id, data_id)
+
+
+def delete_subject_assignment(policy_id, subject_id, category_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_subject_assignment("", policy_id, subject_id, category_id, data_id)
+
diff --git a/old/python_moondb/tests/unit_python/helpers/category_helper.py b/old/python_moondb/tests/unit_python/helpers/category_helper.py
new file mode 100644
index 00000000..55e95d91
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/category_helper.py
@@ -0,0 +1,54 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+def add_subject_category(cat_id=None, value=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.add_subject_category(user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_subject_category(cat_id=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.get_subject_categories(user_id=None, category_id=cat_id)
+ return category
+
+
+def add_object_category(cat_id=None, value=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.add_object_category(user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_object_category(cat_id=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.get_object_categories(user_id=None, category_id=cat_id)
+ return category
+
+
+def add_action_category(cat_id=None, value=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.add_action_category(user_id=None, category_id=cat_id, value=value)
+ return category
+
+
+def get_action_category(cat_id=None):
+ from python_moondb.core import ModelManager
+ category = ModelManager.get_action_categories(user_id=None, category_id=cat_id)
+ return category
+
+
+def delete_subject_category(category_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.delete_subject_category("", category_id=category_id)
+
+
+def delete_object_category(category_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.delete_object_category("", category_id=category_id)
+
+
+def delete_action_category(category_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.delete_action_category("", category_id=category_id)
diff --git a/old/python_moondb/tests/unit_python/helpers/data_helper.py b/old/python_moondb/tests/unit_python/helpers/data_helper.py
new file mode 100644
index 00000000..8a8238f5
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/data_helper.py
@@ -0,0 +1,98 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+def get_action_data(policy_id, data_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_action_data("", policy_id, data_id, category_id)
+
+
+def add_action_data(policy_id, data_id=None, category_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_action_data("", policy_id, data_id, category_id, value)
+
+
+def delete_action_data(policy_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_action_data("",policy_id=policy_id, data_id=data_id)
+
+
+def get_object_data(policy_id, data_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_object_data("", policy_id, data_id, category_id)
+
+
+def add_object_data(policy_id, data_id=None, category_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_object_data("", policy_id, data_id, category_id, value)
+
+
+def delete_object_data(policy_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_object_data("", policy_id=policy_id, data_id=data_id)
+
+
+def get_subject_data(policy_id, data_id=None, category_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_subject_data("", policy_id, data_id, category_id)
+
+
+def add_subject_data(policy_id, data_id=None, category_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.set_subject_data("", policy_id, data_id, category_id, value)
+
+
+def delete_subject_data(policy_id, data_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_subject_data("", policy_id=policy_id, data_id=data_id)
+
+
+def get_actions(policy_id, perimeter_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_actions("", policy_id, perimeter_id)
+
+
+def add_action(policy_id, perimeter_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_action("", policy_id, perimeter_id, value)
+
+
+def delete_action(policy_id, perimeter_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_action("", policy_id, perimeter_id)
+
+
+def get_objects(policy_id, perimeter_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_objects("", policy_id, perimeter_id)
+
+
+def add_object(policy_id, perimeter_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_object("", policy_id, perimeter_id, value)
+
+
+def delete_object(policy_id, perimeter_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_object("", policy_id, perimeter_id)
+
+
+def get_subjects(policy_id, perimeter_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_subjects("", policy_id, perimeter_id)
+
+
+def add_subject(policy_id, perimeter_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.add_subject("", policy_id, perimeter_id, value)
+
+
+def delete_subject(policy_id, perimeter_id):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_subject("", policy_id, perimeter_id)
+
+
+def get_available_metadata(policy_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_available_metadata("", policy_id)
diff --git a/old/python_moondb/tests/unit_python/helpers/meta_rule_helper.py b/old/python_moondb/tests/unit_python/helpers/meta_rule_helper.py
new file mode 100644
index 00000000..87af250a
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/meta_rule_helper.py
@@ -0,0 +1,48 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from helpers import mock_data
+
+
+def update_meta_rule(meta_rule_id, value=None):
+ from python_moondb.core import ModelManager
+ if not value:
+ action_category_id = mock_data.create_action_category("action_category_id1")
+ subject_category_id = mock_data.create_subject_category("subject_category_id1")
+ object_category_id = mock_data.create_object_category("object_category_id1")
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ return ModelManager.update_meta_rule(user_id=None, meta_rule_id=meta_rule_id, value=value)
+
+
+def add_meta_rule(meta_rule_id=None, value=None):
+ from python_moondb.core import ModelManager
+ if not value:
+ action_category_id = mock_data.create_action_category("action_category_id1")
+ subject_category_id = mock_data.create_subject_category("subject_category_id1")
+ object_category_id = mock_data.create_object_category("object_category_id1")
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ return ModelManager.add_meta_rule(user_id=None, meta_rule_id=meta_rule_id, value=value)
+
+
+def get_meta_rules(meta_rule_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.get_meta_rules(user_id=None, meta_rule_id=meta_rule_id)
+
+
+def delete_meta_rules(meta_rule_id=None):
+ from python_moondb.core import ModelManager
+ ModelManager.delete_meta_rule(user_id=None, meta_rule_id=meta_rule_id)
diff --git a/old/python_moondb/tests/unit_python/helpers/mock_data.py b/old/python_moondb/tests/unit_python/helpers/mock_data.py
new file mode 100644
index 00000000..0d65ea02
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/mock_data.py
@@ -0,0 +1,156 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from .category_helper import *
+from .policy_helper import *
+from .data_helper import *
+from .model_helper import *
+from .meta_rule_helper import *
+from uuid import uuid4
+
+
+def create_subject_category(name):
+ subject_category = add_subject_category(
+ value={"name": name, "description": "description 1"})
+ return list(subject_category.keys())[0]
+
+
+def create_object_category(name):
+ object_category = add_object_category(
+ value={"name": name, "description": "description 1"})
+ return list(object_category.keys())[0]
+
+
+def create_action_category(name):
+ action_category = add_action_category(
+ value={"name": name, "description": "description 1"})
+ return list(action_category.keys())[0]
+
+
+def create_model(meta_rule_id, model_name="test_model"):
+ value = {
+ "name": model_name,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+
+ }
+ return value
+
+
+def create_policy(model_id, policy_name="policy_1"):
+ value = {
+ "name": policy_name,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ return value
+
+
+def create_pdp(policies_ids):
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": policies_ids,
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ return value
+
+
+def create_new_policy(subject_category_name="subjectCategory", object_category_name="objectCategory",
+ action_category_name="actionCategory",
+ model_name="test_model", policy_name="policy_name",
+ meta_rule_name="meta_rule_"):
+ if policy_name == "policy_name":
+ policy_name = "policy_name_" + uuid4().hex
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = create_new_meta_rule(
+ subject_category_name=subject_category_name + uuid4().hex,
+ object_category_name=object_category_name + uuid4().hex,
+ action_category_name=action_category_name + uuid4().hex,
+ meta_rule_name=meta_rule_name + uuid4().hex
+ )
+ model = add_model(value=create_model(meta_rule_id, model_name))
+ model_id = list(model.keys())[0]
+ value = create_policy(model_id, policy_name)
+ policy = add_policies(value=value)
+ assert policy
+ policy_id = list(policy.keys())[0]
+ return subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id
+
+
+def create_new_meta_rule(subject_category_name="subject_category" + uuid4().hex,
+ object_category_name="object_category" + uuid4().hex,
+ action_category_name="action_category" + uuid4().hex,
+ meta_rule_name="meta_rule" + uuid4().hex):
+ from python_moondb.core import ModelManager
+
+ subject_category_id = create_subject_category(subject_category_name)
+ object_category_id = create_object_category(object_category_name)
+ action_category_id = create_action_category(action_category_name)
+ value = {"name": meta_rule_name,
+ "algorithm": "name of the meta rule algorithm",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ # meta_rule = add_meta_rule(value=value)
+ meta_rule = ModelManager.add_meta_rule(user_id=None, meta_rule_id=None, value=value)
+ return subject_category_id, object_category_id, action_category_id, list(meta_rule.keys())[0]
+
+
+def create_subject(policy_id):
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ subject = add_subject(policy_id=policy_id, value=value)
+ return list(subject.keys())[0]
+
+
+def create_object(policy_id):
+ value = {
+ "name": "testobject",
+ "description": "test",
+ }
+ object = add_object(policy_id=policy_id, value=value)
+ return list(object.keys())[0]
+
+
+def create_action(policy_id):
+ value = {
+ "name": "testaction",
+ "description": "test",
+ }
+ action = add_action(policy_id=policy_id, value=value)
+ return list(action.keys())[0]
+
+
+def create_subject_data(policy_id, category_id):
+ value = {
+ "name": uuid4().hex,
+ "description": {uuid4().hex: "", uuid4().hex: "", uuid4().hex: ""},
+ }
+ subject_data = add_subject_data(policy_id=policy_id, category_id=category_id, value=value).get('data')
+ assert subject_data
+ return list(subject_data.keys())[0]
+
+
+def create_object_data(policy_id, category_id):
+ value = {
+ "name": uuid4().hex,
+ "description": {uuid4().hex: "", uuid4().hex: "", uuid4().hex: ""},
+ }
+ object_data = add_object_data(policy_id=policy_id, category_id=category_id, value=value).get('data')
+ return list(object_data.keys())[0]
+
+
+def create_action_data(policy_id, category_id):
+ value = {
+ "name": uuid4().hex,
+ "description": {uuid4().hex: "", uuid4().hex: "", uuid4().hex: ""},
+ }
+ action_data = add_action_data(policy_id=policy_id, category_id=category_id, value=value).get('data')
+ return list(action_data.keys())[0]
diff --git a/old/python_moondb/tests/unit_python/helpers/model_helper.py b/old/python_moondb/tests/unit_python/helpers/model_helper.py
new file mode 100644
index 00000000..98a6271d
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/model_helper.py
@@ -0,0 +1,47 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+from helpers import mock_data
+from uuid import uuid4
+
+def get_models(model_id=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.get_models(user_id=None, model_id=model_id)
+
+
+def add_model(model_id=None, value=None):
+ from python_moondb.core import ModelManager
+ if not value:
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = mock_data.create_new_meta_rule()
+ name = "MLS" if model_id is None else "MLS " + model_id
+ value = {
+ "name": name,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ return ModelManager.add_model(user_id=None, model_id=model_id, value=value)
+
+
+def delete_models(uuid=None, name=None):
+ from python_moondb.core import ModelManager
+ if not uuid:
+ for model_id, model_value in get_models():
+ if name == model_value['name']:
+ uuid = model_id
+ break
+ ModelManager.delete_model(user_id=None, model_id=uuid)
+
+
+def delete_all_models():
+ from python_moondb.core import ModelManager
+ models_values = get_models()
+ print(models_values)
+ for model_id, model_value in models_values.items():
+ ModelManager.delete_model(user_id=None, model_id=model_id)
+
+
+def update_model(model_id=None, value=None):
+ from python_moondb.core import ModelManager
+ return ModelManager.update_model(user_id=None, model_id=model_id, value=value)
diff --git a/old/python_moondb/tests/unit_python/helpers/pdp_helper.py b/old/python_moondb/tests/unit_python/helpers/pdp_helper.py
new file mode 100644
index 00000000..3d169b06
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/pdp_helper.py
@@ -0,0 +1,23 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+def update_pdp(pdp_id, value):
+ from python_moondb.core import PDPManager
+ return PDPManager.update_pdp("", pdp_id, value)
+
+
+def delete_pdp(pdp_id):
+ from python_moondb.core import PDPManager
+ PDPManager.delete_pdp("", pdp_id)
+
+
+def add_pdp(pdp_id=None, value=None):
+ from python_moondb.core import PDPManager
+ return PDPManager.add_pdp("", pdp_id, value)
+
+
+def get_pdp(pdp_id=None):
+ from python_moondb.core import PDPManager
+ return PDPManager.get_pdp("", pdp_id)
diff --git a/old/python_moondb/tests/unit_python/helpers/policy_helper.py b/old/python_moondb/tests/unit_python/helpers/policy_helper.py
new file mode 100644
index 00000000..93d81c62
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/helpers/policy_helper.py
@@ -0,0 +1,72 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+from helpers import mock_data as mock_data
+from helpers import meta_rule_helper
+
+def get_policies():
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_policies("admin")
+
+
+def add_policies(policy_id=None, value=None):
+ from python_moondb.core import PolicyManager
+ if not value:
+ value = {
+ "name": "test_policy",
+ "model_id": "",
+ "genre": "authz",
+ "description": "test",
+ }
+ return PolicyManager.add_policy("admin", policy_id=policy_id, value=value)
+
+
+def delete_policies(uuid=None, name=None):
+ from python_moondb.core import PolicyManager
+ if not uuid:
+ for policy_id, policy_value in get_policies():
+ if name == policy_value['name']:
+ uuid = policy_id
+ break
+ PolicyManager.delete_policy("admin", uuid)
+
+
+def update_policy(policy_id, value):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.update_policy("admin", policy_id, value)
+
+
+def get_policy_from_meta_rules(meta_rule_id):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_policy_from_meta_rules("admin", meta_rule_id)
+
+
+def get_rules(policy_id=None, meta_rule_id=None, rule_id=None):
+ from python_moondb.core import PolicyManager
+ return PolicyManager.get_rules("", policy_id, meta_rule_id, rule_id)
+
+
+def add_rule(policy_id, meta_rule_id, value=None):
+ from python_moondb.core import PolicyManager
+ if not value:
+ meta_rule = meta_rule_helper.get_meta_rules(meta_rule_id)
+ sub_cat_id = meta_rule[meta_rule_id]['subject_categories'][0]
+ ob_cat_id = meta_rule[meta_rule_id]['object_categories'][0]
+ act_cat_id = meta_rule[meta_rule_id]['action_categories'][0]
+
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=sub_cat_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id, category_id=ob_cat_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id, category_id=act_cat_id)
+
+ value = {
+ "rule": (subject_data_id, object_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+ return PolicyManager.add_rule("", policy_id, meta_rule_id, value)
+
+
+def delete_rule(policy_id=None, rule_id=None):
+ from python_moondb.core import PolicyManager
+ PolicyManager.delete_rule("", policy_id, rule_id)
diff --git a/python_moondb/tests/unit_python/mock_components.py b/old/python_moondb/tests/unit_python/mock_components.py
index a0319e1a..a0319e1a 100644
--- a/python_moondb/tests/unit_python/mock_components.py
+++ b/old/python_moondb/tests/unit_python/mock_components.py
diff --git a/python_moondb/tests/unit_python/mock_keystone.py b/old/python_moondb/tests/unit_python/mock_keystone.py
index 3f262538..3f262538 100644
--- a/python_moondb/tests/unit_python/mock_keystone.py
+++ b/old/python_moondb/tests/unit_python/mock_keystone.py
diff --git a/old/python_moondb/tests/unit_python/models/__init__.py b/old/python_moondb/tests/unit_python/models/__init__.py
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/models/__init__.py
diff --git a/old/python_moondb/tests/unit_python/models/test_categories.py b/old/python_moondb/tests/unit_python/models/test_categories.py
new file mode 100644
index 00000000..39dc4c71
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/models/test_categories.py
@@ -0,0 +1,111 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import pytest
+import logging
+from python_moonutilities.exceptions import *
+from helpers import category_helper
+
+logger = logging.getLogger("moon.db.tests.models.test_categories")
+
+
+def test_add_subject_category_twice():
+ category = category_helper.add_subject_category(
+ value={"name": "category name", "description": "description 1"})
+ category_id = list(category.keys())[0]
+ assert category is not None
+ with pytest.raises(SubjectCategoryExisting):
+ category_helper.add_subject_category(category_id,
+ value={"name": "category name",
+ "description": "description 2"})
+
+
+def test_add_subject_category_name_space():
+ with pytest.raises(CategoryNameInvalid) as exp:
+ category = category_helper.add_subject_category(value={"name": " ", "description":
+ "description 1"})
+ assert exp.value.code == 400
+ assert exp.value.description == 'The given category name is invalid.'
+
+
+def test_get_subject_categories():
+ added_category = category_helper.add_subject_category(
+ value={"name": "category name", "description": "description 1"})
+ category_id = list(added_category.keys())[0]
+ subject_category = category_helper.get_subject_category(category_id)
+ assert subject_category == added_category
+
+
+def test_get_subject_categories_with_invalid_id():
+ category_id = "invalid_id"
+ subject_category = category_helper.get_subject_category(category_id)
+ assert len(subject_category) == 0
+
+
+def test_add_object_category_twice():
+ category = category_helper.add_object_category(
+ value={"name": "category name", "description": "description 1"})
+ category_id = list(category.keys())[0]
+ assert category is not None
+ with pytest.raises(ObjectCategoryExisting):
+ category_helper.add_object_category(category_id,
+ value={"name": "category name",
+ "description": "description 2"})
+
+
+def test_add_object_category_name_space():
+ with pytest.raises(CategoryNameInvalid) as exp:
+ category = category_helper.add_object_category(value={"name": " ", "description":
+ "description 1"})
+ assert exp.value.code == 400
+ assert exp.value.description == 'The given category name is invalid.'
+
+
+def test_get_object_categories():
+ added_category = category_helper.add_object_category(
+ value={"name": "category name", "description": "description 1"})
+ category_id = list(added_category.keys())[0]
+ object_category = category_helper.get_object_category(category_id)
+ assert object_category == added_category
+
+
+def test_get_object_categories_with_invalid_id():
+ category_id = "invalid_id"
+ object_category = category_helper.get_object_category(category_id)
+ assert len(object_category) == 0
+
+
+def test_add_action_category_twice():
+ category = category_helper.add_action_category(
+ value={"name": "category name", "description": "description 1"})
+ category_id = list(category.keys())[0]
+ assert category is not None
+ with pytest.raises(ActionCategoryExisting) as exp_info:
+ category_helper.add_action_category(category_id,
+ value={"name": "category name",
+ "description": "description 2"})
+ assert str(exp_info.value)=='409: Action Category Existing'
+
+
+def test_add_action_category_name_space():
+ with pytest.raises(CategoryNameInvalid) as exp:
+ category = category_helper.add_action_category(value={"name": " ", "description":
+ "description 1"})
+ assert exp.value.code == 400
+ assert exp.value.description == 'The given category name is invalid.'
+
+
+def test_get_action_categories():
+ added_category = category_helper.add_action_category(
+ value={"name": "category name", "description": "description 1"})
+ category_id = list(added_category.keys())[0]
+ action_category = category_helper.get_action_category(category_id)
+ assert action_category == added_category
+
+
+def test_get_action_categories_with_invalid_id():
+ category_id = "invalid_id"
+ action_category = category_helper.get_action_category(category_id)
+ assert len(action_category) == 0
diff --git a/old/python_moondb/tests/unit_python/models/test_meta_rules.py b/old/python_moondb/tests/unit_python/models/test_meta_rules.py
new file mode 100644
index 00000000..3b2b5b0e
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/models/test_meta_rules.py
@@ -0,0 +1,403 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import pytest
+from helpers import meta_rule_helper
+from helpers import policy_helper
+import helpers.mock_data as mock_data
+import helpers.model_helper as model_helper
+from python_moonutilities.exceptions import *
+from uuid import uuid4
+
+
+def test_update_not_exist_meta_rule_error(db):
+ # set not existing meta rule and expect to raise and error
+ with pytest.raises(MetaRuleUnknown) as exception_info:
+ meta_rule_helper.update_meta_rule(meta_rule_id=None)
+ assert str(exception_info.value) == '400: Meta Rule Unknown'
+
+
+def test_update_meta_rule_connected_with_policy_and_rule():
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+
+ value = {
+ "rule": (subject_data_id, object_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ rules = policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert rules
+ assert len(rules) == 1
+
+ action_category_id = mock_data.create_action_category("action_category_id2")
+ subject_category_id = mock_data.create_subject_category("subject_category_id2")
+ object_category_id = mock_data.create_object_category("object_category_id2")
+
+ updated_value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ with pytest.raises(MetaRuleUpdateError) as exception_info:
+ updated_meta_rule = meta_rule_helper.update_meta_rule(meta_rule_id, updated_value)
+ assert str(exception_info.value) == '400: Meta_Rule Update Error'
+
+
+def test_update_meta_rule_connected_with_policy(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ action_category_id = mock_data.create_action_category("action_category_id2")
+ subject_category_id = mock_data.create_subject_category("subject_category_id2")
+ object_category_id = mock_data.create_object_category("object_category_id2")
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value)
+ assert isinstance(meta_rules, dict)
+ assert meta_rules
+ assert len(meta_rules) is 1
+ meta_rule_id = list(meta_rules.keys())[0]
+ for key in (
+ "name", "description", "subject_categories", "object_categories", "action_categories"):
+ assert key in meta_rules[meta_rule_id]
+ assert meta_rules[meta_rule_id][key] == value[key]
+
+
+def test_add_new_meta_rule_success(db):
+ action_category_id = mock_data.create_action_category("action_category_id1")
+ subject_category_id = mock_data.create_subject_category("subject_category_id1")
+ object_category_id = mock_data.create_object_category("object_category_id1")
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value)
+ assert isinstance(meta_rules, dict)
+ assert meta_rules
+ assert len(meta_rules) is 1
+ meta_rule_id = list(meta_rules.keys())[0]
+ for key in (
+ "name", "description", "subject_categories", "object_categories", "action_categories"):
+ assert key in meta_rules[meta_rule_id]
+ assert meta_rules[meta_rule_id][key] == value[key]
+
+
+def test_meta_rule_with_blank_name(db):
+ action_category_id = mock_data.create_action_category(uuid4().hex)
+ subject_category_id = mock_data.create_subject_category(uuid4().hex)
+ object_category_id = mock_data.create_object_category(uuid4().hex)
+ value = {
+ "name": "",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ with pytest.raises(MetaRuleContentError) as exception_info:
+ meta_rule_helper.add_meta_rule(value=value)
+ assert str(exception_info.value) == '400: Meta Rule Error'
+
+
+def test_update_meta_rule_success(db):
+ # arrange
+ meta_rules = meta_rule_helper.add_meta_rule()
+ meta_rule_id = list(meta_rules.keys())[0]
+ action_category_id = mock_data.create_action_category("action_category_id2")
+ subject_category_id = mock_data.create_subject_category("subject_category_id2")
+ object_category_id = mock_data.create_object_category("object_category_id2")
+ updated_value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ # action
+ updated_meta_rule = meta_rule_helper.update_meta_rule(meta_rule_id, updated_value)
+ # assert
+ updated_meta_rule_id = list(updated_meta_rule.keys())[0]
+ assert updated_meta_rule_id == meta_rule_id
+ assert updated_meta_rule[updated_meta_rule_id]["subject_categories"] == updated_value[
+ "subject_categories"]
+
+
+def test_update_meta_rule_with_existed_categories_combination(db):
+ action_category_id1 = mock_data.create_action_category(uuid4().hex)
+ subject_category_id1 = mock_data.create_subject_category(uuid4().hex)
+ object_category_id1 = mock_data.create_object_category(uuid4().hex)
+ meta_rule_name1=uuid4().hex
+ value1 = {
+ "name": meta_rule_name1,
+ "description": "test",
+ "subject_categories": [subject_category_id1],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id1]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value1)
+
+ action_category_id2 = mock_data.create_action_category(uuid4().hex)
+ subject_category_id2 = mock_data.create_subject_category(uuid4().hex)
+ object_category_id2 = mock_data.create_object_category(uuid4().hex)
+ meta_rule_name2 = uuid4().hex
+ value2 = {
+ "name": meta_rule_name2,
+ "description": "test",
+ "subject_categories": [subject_category_id2],
+ "object_categories": [object_category_id2],
+ "action_categories": [action_category_id2]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value2)
+ meta_rule_id2 = list(meta_rules.keys())[0]
+ value1['name']=value2['name']
+ with pytest.raises(MetaRuleExisting) as exception_info:
+ updated_meta_rule = meta_rule_helper.update_meta_rule(meta_rule_id2, value1)
+ assert str(exception_info.value) == '409: Meta Rule Existing'
+ assert exception_info.value.description=="Same categories combination existed"
+
+
+def test_update_meta_rule_with_different_categories_combination_but_same_data(db):
+ action_category_id1 = mock_data.create_action_category(uuid4().hex)
+ subject_category_id1 = mock_data.create_subject_category(uuid4().hex)
+ object_category_id1 = mock_data.create_object_category(uuid4().hex)
+ meta_rule_name1=uuid4().hex
+ value1 = {
+ "name": meta_rule_name1,
+ "description": "test",
+ "subject_categories": [subject_category_id1],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id1]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value1)
+
+ action_category_id2 = mock_data.create_action_category(uuid4().hex)
+ subject_category_id2 = mock_data.create_subject_category(uuid4().hex)
+ object_category_id2 = mock_data.create_object_category(uuid4().hex)
+ meta_rule_name2 = uuid4().hex
+ value2 = {
+ "name": meta_rule_name2,
+ "description": "test",
+ "subject_categories": [subject_category_id2],
+ "object_categories": [object_category_id2],
+ "action_categories": [action_category_id2]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value2)
+ meta_rule_id2 = list(meta_rules.keys())[0]
+ value1['name']=value2['name']
+ value1['object_categories']+=[object_category_id1]
+ updated_meta_rule = meta_rule_helper.update_meta_rule(meta_rule_id2, value1)
+ assert meta_rule_id2 in updated_meta_rule
+
+
+def test_add_existing_meta_rule_error(db):
+ action_category_id = mock_data.create_action_category("action_category_id3")
+ subject_category_id = mock_data.create_subject_category("subject_category_id3")
+ object_category_id = mock_data.create_object_category("object_category_id3")
+ value = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rules = meta_rule_helper.add_meta_rule(value=value)
+ meta_rule_id = list(meta_rules.keys())[0]
+ with pytest.raises(MetaRuleExisting) as exception_info:
+ meta_rule_helper.add_meta_rule(meta_rule_id=meta_rule_id)
+ assert str(exception_info.value) == '409: Meta Rule Existing'
+
+
+def test_add_meta_rule_with_existing_name_error(db):
+ action_category_id = mock_data.create_action_category(uuid4().hex)
+ subject_category_id = mock_data.create_subject_category(uuid4().hex)
+ object_category_id = mock_data.create_object_category(uuid4().hex)
+ name = uuid4().hex
+ value = {
+ "name": name,
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rule_helper.add_meta_rule(value=value)
+ action_category_id = mock_data.create_action_category(uuid4().hex)
+ subject_category_id = mock_data.create_subject_category(uuid4().hex)
+ object_category_id = mock_data.create_object_category(uuid4().hex)
+ value = {
+ "name": name,
+ "description": 'test',
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ with pytest.raises(MetaRuleExisting) as exception_info:
+ meta_rule_helper.add_meta_rule(value=value)
+ assert str(exception_info.value) == '409: Meta Rule Existing'
+ assert exception_info.value.description == 'The meta rule already exists.'
+
+
+def test_add_meta_rule_with_existing_categories_combination(db):
+ action_category_id = mock_data.create_action_category(uuid4().hex)
+ subject_category_id = mock_data.create_subject_category(uuid4().hex)
+ object_category_id = mock_data.create_object_category(uuid4().hex)
+ name = uuid4().hex
+ value = {
+ "name": name,
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rule_helper.add_meta_rule(value=value)
+ value['name'] = uuid4().hex
+ with pytest.raises(MetaRuleExisting) as exception_info:
+ meta_rule_helper.add_meta_rule(value=value)
+ assert str(exception_info.value) == '409: Meta Rule Existing'
+ assert exception_info.value.description == "Same categories combination existed"
+
+
+def test_add_meta_rule_with_different_categories_combination_but_same_data(db):
+ action_category_id = mock_data.create_action_category(uuid4().hex)
+ subject_category_id = mock_data.create_subject_category(uuid4().hex)
+ object_category_id1 = mock_data.create_object_category(uuid4().hex)
+ object_category_id2 = mock_data.create_object_category(uuid4().hex)
+
+ name1 = uuid4().hex
+ value = {
+ "name": name1,
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id1],
+ "action_categories": [action_category_id]
+ }
+ meta_rule_helper.add_meta_rule(value=value)
+ name2 = uuid4().hex
+ value['name'] = name2
+ value['object_categories'] += [object_category_id2]
+ meta_rules = meta_rule_helper.add_meta_rule(value=value)
+ bool_found_meta_rule = 0
+ for meta_rule_id in meta_rules:
+ if meta_rules[meta_rule_id]['name'] == name2:
+ bool_found_meta_rule = 1
+ break
+ assert bool_found_meta_rule
+
+
+def test_get_meta_rule_success(db):
+ # arrange
+ action_category_id = mock_data.create_action_category("action_type")
+ subject_category_id = mock_data.create_subject_category("user_security_level")
+ object_category_id = mock_data.create_object_category("vm_security_level")
+ values = {}
+ value1 = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rules1 = meta_rule_helper.add_meta_rule(value=value1)
+ meta_rule_id1 = list(meta_rules1.keys())[0]
+ values[meta_rule_id1] = value1
+ action_category_id = mock_data.create_action_category("action_type2")
+ subject_category_id = mock_data.create_subject_category("user_security_level2")
+ object_category_id = mock_data.create_object_category("vm_security_level2")
+ value2 = {
+ "name": "rbac_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rules2 = meta_rule_helper.add_meta_rule(value=value2)
+ meta_rule_id2 = list(meta_rules2.keys())[0]
+ values[meta_rule_id2] = value2
+
+ # action
+ meta_rules = meta_rule_helper.get_meta_rules()
+ # assert
+ assert isinstance(meta_rules, dict)
+ assert meta_rules
+ assert len(meta_rules) is 2
+ for meta_rule_id in meta_rules:
+ for key in (
+ "name", "description", "subject_categories", "object_categories", "action_categories"):
+ assert key in meta_rules[meta_rule_id]
+ assert meta_rules[meta_rule_id][key] == values[meta_rule_id][key]
+
+
+def test_get_specific_meta_rule_success(db):
+ # arrange
+ added_meta_rules = meta_rule_helper.add_meta_rule()
+ added_meta_rule_id = list(added_meta_rules.keys())[0]
+ # action
+ meta_rules = meta_rule_helper.get_meta_rules(meta_rule_id=added_meta_rule_id)
+ meta_rule_id = list(meta_rules.keys())[0]
+ # assert
+ assert meta_rule_id == added_meta_rule_id
+ for key in (
+ "name", "description", "subject_categories", "object_categories", "action_categories"):
+ assert key in meta_rules[meta_rule_id]
+ assert meta_rules[meta_rule_id][key] == added_meta_rules[added_meta_rule_id][key]
+
+
+def test_delete_meta_rules_success(db):
+ action_category_id = mock_data.create_action_category("action_type")
+ subject_category_id = mock_data.create_subject_category("user_security_level")
+ object_category_id = mock_data.create_object_category("vm_security_level")
+ # arrange
+ value1 = {
+ "name": "MLS_meta_rule",
+ "description": "test",
+ "subject_categories": [subject_category_id],
+ "object_categories": [object_category_id],
+ "action_categories": [action_category_id]
+ }
+ meta_rules1 = meta_rule_helper.add_meta_rule(value=value1)
+ meta_rule_id1 = list(meta_rules1.keys())[0]
+
+ # action
+ meta_rule_helper.delete_meta_rules(meta_rule_id1)
+ # assert
+ meta_rules = meta_rule_helper.get_meta_rules()
+ assert meta_rule_id1 not in meta_rules
+
+
+def test_delete_meta_rules_with_model(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ with pytest.raises(DeleteMetaRuleWithModel) as exception_info:
+ meta_rule_helper.delete_meta_rules(meta_rule_id)
+ assert str(exception_info.value) == '400: Meta rule With Model Error'
+
+
+def test_delete_invalid_meta_rules_error(db):
+ with pytest.raises(MetaRuleUnknown) as exception_info:
+ meta_rule_helper.delete_meta_rules("INVALID_META_RULE_ID")
+ assert str(exception_info.value) == '400: Meta Rule Unknown'
diff --git a/old/python_moondb/tests/unit_python/models/test_models.py b/old/python_moondb/tests/unit_python/models/test_models.py
new file mode 100644
index 00000000..1b171069
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/models/test_models.py
@@ -0,0 +1,622 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import pytest
+from python_moonutilities.exceptions import *
+import logging
+import helpers.mock_data as mock_data
+import helpers.model_helper as model_helper
+import helpers.category_helper as category_helper
+import helpers.policy_helper as policy_helper
+import helpers.assignment_helper as assignment_helper
+from uuid import uuid4
+
+logger = logging.getLogger("moon.db.tests.test_model")
+
+
+def test_get_models_empty(db):
+ # act
+ models = model_helper.get_models()
+ # assert
+ assert isinstance(models, dict)
+ assert not models
+
+
+def test_get_model(db):
+ # prepare
+ model_helper.add_model(model_id="mls_model_id")
+ # act
+ models = model_helper.get_models()
+ # assert
+ assert isinstance(models, dict)
+ assert models # assert model is not empty
+ assert len(models) is 1
+ model_helper.delete_all_models()
+
+
+def test_get_specific_model(db):
+ # prepare
+ model_helper.add_model(model_id="mls_model_id")
+ # act
+ models = model_helper.get_models(model_id="mls_model_id")
+ # assert
+ assert isinstance(models, dict)
+ assert models # assert model is not empty
+ assert len(models) is 1
+ model_helper.delete_all_models()
+
+
+def test_add_model(db):
+ # act
+ model = model_helper.add_model()
+ # assert
+ assert isinstance(model, dict)
+ assert model # assert model is not empty
+ assert len(model) is 1
+ model_helper.delete_all_models()
+
+
+def test_add_same_model_twice(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "model1",
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ # prepare
+ model_helper.add_model(model_id="model_1", value=value) # add model twice
+ # act
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category2",
+ object_category_name="object_category2",
+ action_category_name="action_category2",
+ meta_rule_name="meta_rule_2")
+ value = {
+ "name": "model2",
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ with pytest.raises(ModelExisting) as exception_info:
+ model_helper.add_model(model_id="model_1", value=value)
+ model_helper.delete_all_models()
+ assert str(exception_info.value) == '409: Model Error'
+
+
+def test_add_model_generate_new_uuid(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id1 = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category3",
+ object_category_name="object_category3",
+ action_category_name="action_category3",
+ meta_rule_name="meta_rule_3")
+ model_value1 = {
+ "name": "MLS",
+ "description": "test",
+ "meta_rules": [meta_rule_id1]
+ }
+ model1 = model_helper.add_model(value=model_value1)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id2 = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category4",
+ object_category_name="object_category4",
+ action_category_name="action_category4",
+ meta_rule_name="meta_rule_4")
+ model_value2 = {
+ "name": "rbac",
+ "description": "test",
+ "meta_rules": [meta_rule_id2]
+ }
+ model2 = model_helper.add_model(value=model_value2)
+
+ assert list(model1)[0] != list(model2)[0]
+ model_helper.delete_all_models()
+
+
+def test_add_models(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category5",
+ object_category_name="object_category5",
+ action_category_name="action_category5")
+ model_value1 = {
+ "name": "MLS",
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ models = model_helper.add_model(value=model_value1)
+ assert isinstance(models, dict)
+ assert models
+ assert len(models.keys()) == 1
+ model_id = list(models.keys())[0]
+ for key in ("name", "meta_rules", "description"):
+ assert key in models[model_id]
+ assert models[model_id][key] == model_value1[key]
+ model_helper.delete_all_models()
+
+
+def test_add_models_with_same_name_twice(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category5",
+ object_category_name="object_category5",
+ action_category_name="action_category5")
+ model_value1 = {
+ "name": "MLS",
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ models = model_helper.add_model(value=model_value1)
+ assert isinstance(models, dict)
+ assert models
+ with pytest.raises(Exception) as exception_info:
+ model_helper.add_model(value=model_value1)
+ model_helper.delete_all_models()
+ assert str(exception_info.value) == '409: Model Error'
+
+def test_add_model_with_existed_meta_rules_list(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id = mock_data.create_new_meta_rule(
+ subject_category_name=uuid4().hex,
+ object_category_name=uuid4().hex,
+ action_category_name=uuid4().hex)
+ model_value1 = {
+ "name": uuid4().hex,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ models = model_helper.add_model(value=model_value1)
+ assert isinstance(models, dict)
+ assert models
+ model_value1 = {
+ "name": uuid4().hex,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+ }
+ with pytest.raises(Exception) as exception_info:
+ model_helper.add_model(value=model_value1)
+ model_helper.delete_all_models()
+ assert str(exception_info.value) == '409: Model Error'
+ assert str(exception_info.value.description)=='Meta Rules List Existed in another Model'
+
+
+def test_delete_models(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id1 = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category6",
+ object_category_name="object_category6",
+ action_category_name="action_category6",
+ meta_rule_name="meta_rule_6")
+ model_value1 = {
+ "name": "MLS",
+ "description": "test",
+ "meta_rules": [meta_rule_id1]
+ }
+ model1 = model_helper.add_model(value=model_value1)
+ subject_category_id, object_category_id, action_category_id, meta_rule_id2 = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category7",
+ object_category_name="object_category7",
+ action_category_name="action_category7",
+ meta_rule_name="meta_rule_7")
+ model_value2 = {
+ "name": "rbac",
+ "description": "test",
+ "meta_rules": [meta_rule_id2]
+ }
+ model_helper.add_model(value=model_value2)
+
+ id = list(model1)[0]
+ model_helper.delete_models(id)
+ # assert
+ models = model_helper.get_models()
+ assert id not in models
+ model_helper.delete_all_models()
+
+
+def test_update_model(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id1 = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category8",
+ object_category_name="object_category8",
+ action_category_name="action_category8",
+ meta_rule_name="meta_rule_8")
+ # prepare
+ model_value = {
+ "name": "MLS",
+ "description": "test",
+ "meta_rules": [meta_rule_id1]
+ }
+ model = model_helper.add_model(value=model_value)
+ model_id = list(model)[0]
+ subject_category_id, object_category_id, action_category_id, meta_rule_id2 = mock_data.create_new_meta_rule(
+ subject_category_name="subject_category9",
+ object_category_name="object_category9",
+ action_category_name="action_category9",
+ meta_rule_name="meta_rule_9")
+ new_model_value = {
+ "name": "MLS2",
+ "description": "test",
+ "meta_rules": [meta_rule_id2]
+ }
+ # act
+ model_helper.update_model(model_id=model_id, value=new_model_value)
+ # assert
+ model = model_helper.get_models(model_id)
+
+ for key in ("name", "meta_rules", "description"):
+ assert key in model[model_id]
+ assert model[model_id][key] == new_model_value[key]
+ model_helper.delete_all_models()
+
+
+def test_delete_model_assigned_to_policy(db):
+ model_value1 = {
+ "name": "MLS",
+ "description": "test",
+ "meta_rules": []
+ }
+ models = model_helper.add_model(value=model_value1)
+ assert isinstance(models, dict)
+ assert models
+ assert len(models.keys()) == 1
+ model_id = list(models.keys())[0]
+ value = {
+ "name": "test_policy",
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ policy_helper.add_policies(value=value)
+ with pytest.raises(DeleteModelWithPolicy) as exception_info:
+ model_helper.delete_models(uuid=model_id)
+ assert str(exception_info.value) == '400: Model With Policy Error'
+
+
+def test_add_subject_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "subject_category",
+ "description": "description subject_category"
+ }
+ subject_category = category_helper.add_subject_category(category_id, value)
+ assert subject_category
+ assert len(subject_category) == 1
+
+
+def test_add_subject_categories_with_existed_name(db):
+ name = uuid4().hex
+ value = {
+ "name": name,
+ "description": "description subject_category"
+ }
+ subject_category = category_helper.add_subject_category(value=value)
+ assert subject_category
+ assert len(subject_category) == 1
+
+ value = {
+ "name": name,
+ "description": "description subject_category"
+ }
+ with pytest.raises(SubjectCategoryExisting) as exception_info:
+ category_helper.add_subject_category(value=value)
+ assert str(exception_info.value) == '409: Subject Category Existing'
+
+
+def test_add_subject_category_with_empty_name(db):
+ category_id = "category_id1"
+ value = {
+ "name": "",
+ "description": "description subject_category"
+ }
+ with pytest.raises(CategoryNameInvalid) as exception_info:
+ category_helper.add_subject_category(category_id, value)
+ assert str(exception_info.value) == '400: Category Name Invalid'
+
+
+def test_add_subject_category_with_same_category_id(db):
+ category_id = "category_id1"
+ value = {
+ "name": "subject_category",
+ "description": "description subject_category"
+ }
+ category_helper.add_subject_category(category_id, value)
+ with pytest.raises(SubjectCategoryExisting) as exception_info:
+ category_helper.add_subject_category(category_id, value)
+ assert str(exception_info.value) == '409: Subject Category Existing'
+
+
+def test_get_subject_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "subject_category",
+ "description": "description subject_category"
+ }
+ category_helper.add_subject_category(category_id, value)
+ subject_category = category_helper.get_subject_category(category_id)
+ assert subject_category
+ assert len(subject_category) == 1
+
+
+def test_delete_subject_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "subject_category",
+ "description": "description subject_category"
+ }
+ category_helper.add_subject_category(category_id, value)
+ subject_category = category_helper.delete_subject_category(category_id)
+ assert not subject_category
+
+
+def test_delete_subject_category_with_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ mock_data.create_subject_data(policy_id, subject_category_id)
+
+ with pytest.raises(DeleteSubjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_subject_category(subject_category_id)
+ assert str(exception_info.value) == '400: Subject Category With Meta Rule Error'
+
+
+def test_delete_subject_category_with_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id, subject_category_id)
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+
+ with pytest.raises(DeleteSubjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_subject_category(subject_category_id)
+ assert str(exception_info.value) == '400: Subject Category With Meta Rule Error'
+
+
+def test_delete_subject_category_with_rule(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id)
+
+ with pytest.raises(DeleteSubjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_subject_category(subject_category_id)
+ assert str(exception_info.value) == '400: Subject Category With Meta Rule Error'
+
+
+def test_delete_subject_category_with_unkown_category_id(db):
+ category_id = "invalid_category_id"
+
+ with pytest.raises(SubjectCategoryUnknown) as exception_info:
+ category_helper.delete_subject_category(category_id)
+ assert str(exception_info.value) == '400: Subject Category Unknown'
+
+
+def test_add_object_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "object_category",
+ "description": "description object_category"
+ }
+ object_category = category_helper.add_object_category(category_id, value)
+ assert object_category
+ assert len(object_category) == 1
+
+
+def test_add_object_categories_with_existed_name(db):
+ name = uuid4().hex
+ value = {
+ "name": name,
+ "description": "description object_category"
+ }
+ object_category = category_helper.add_object_category(value=value)
+ assert object_category
+ assert len(object_category) == 1
+ with pytest.raises(ObjectCategoryExisting) as exception_info:
+ category_helper.add_object_category(value=value)
+ assert str(exception_info.value) == '409: Object Category Existing'
+
+
+def test_add_object_category_with_same_category_id(db):
+ category_id = "category_id1"
+ value = {
+ "name": "object_category",
+ "description": "description object_category"
+ }
+ category_helper.add_object_category(category_id, value)
+ with pytest.raises(ObjectCategoryExisting) as exception_info:
+ category_helper.add_object_category(category_id, value)
+ assert str(exception_info.value) == '409: Object Category Existing'
+
+
+def test_add_object_category_with_empty_name(db):
+ category_id = "category_id1"
+ value = {
+ "name": "",
+ "description": "description object_category"
+ }
+ with pytest.raises(CategoryNameInvalid) as exception_info:
+ category_helper.add_object_category(category_id, value)
+ assert str(exception_info.value) == '400: Category Name Invalid'
+
+
+def test_get_object_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "object_category",
+ "description": "description object_category"
+ }
+ category_helper.add_object_category(category_id, value)
+ object_category = category_helper.get_object_category(category_id)
+ assert object_category
+ assert len(object_category) == 1
+
+
+def test_delete_object_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "object_category",
+ "description": "description object_category"
+ }
+ category_helper.add_object_category(category_id, value)
+ object_category = category_helper.delete_object_category(category_id)
+ assert not object_category
+
+
+def test_delete_object_category_with_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+ mock_data.create_subject_data(policy_id, subject_category_id)
+
+ mock_data.create_object_data(policy_id, object_category_id)
+
+ with pytest.raises(DeleteObjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_object_category(object_category_id)
+ assert str(exception_info.value) == '400: Object Category With Meta Rule Error'
+
+
+def test_delete_object_category_with_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id, object_category_id)
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+
+ with pytest.raises(DeleteObjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_object_category(object_category_id)
+ assert str(exception_info.value) == '400: Object Category With Meta Rule Error'
+
+
+def test_delete_object_category_with_rule(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id)
+
+ with pytest.raises(DeleteObjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_object_category(object_category_id)
+ assert str(exception_info.value) == '400: Object Category With Meta Rule Error'
+
+
+def test_delete_object_category_with_unkown_category_id(db):
+ category_id = "invalid_category_id"
+
+ with pytest.raises(ObjectCategoryUnknown) as exception_info:
+ category_helper.delete_object_category(category_id)
+ assert str(exception_info.value) == '400: Object Category Unknown'
+
+
+def test_add_action_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "action_category",
+ "description": "description action_category"
+ }
+ action_category = category_helper.add_action_category(category_id, value)
+ assert action_category
+ assert len(action_category) == 1
+
+
+def test_add_action_categories_with_existed_name(db):
+ name = uuid4().hex
+ value = {
+ "name": name,
+ "description": "description action_category"
+ }
+ action_category = category_helper.add_action_category(value=value)
+ assert action_category
+ assert len(action_category) == 1
+ with pytest.raises(ActionCategoryExisting) as exception_info:
+ category_helper.add_action_category(value=value)
+ assert str(exception_info.value) == '409: Action Category Existing'
+
+
+def test_add_action_category_with_same_category_id(db):
+ category_id = "category_id1"
+ value = {
+ "name": "action_category",
+ "description": "description action_category"
+ }
+ category_helper.add_action_category(category_id, value)
+ with pytest.raises(ActionCategoryExisting) as exception_info:
+ category_helper.add_action_category(category_id, value)
+ assert str(exception_info.value) == '409: Action Category Existing'
+
+
+def test_add_action_category_with_empty_name(db):
+ category_id = "category_id1"
+ value = {
+ "name": "",
+ "description": "description action_category"
+ }
+ with pytest.raises(CategoryNameInvalid) as exception_info:
+ category_helper.add_action_category(category_id, value)
+ assert str(exception_info.value) == '400: Category Name Invalid'
+
+
+def test_get_action_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "action_category",
+ "description": "description action_category"
+ }
+ category_helper.add_action_category(category_id, value)
+ action_category = category_helper.get_action_category(category_id)
+ assert action_category
+ assert len(action_category) == 1
+
+
+def test_delete_action_category(db):
+ category_id = "category_id1"
+ value = {
+ "name": "action_category",
+ "description": "description action_category"
+ }
+ category_helper.add_action_category(category_id, value)
+ action_category = category_helper.delete_action_category(category_id)
+ assert not action_category
+
+
+def test_delete_action_category_with_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+ mock_data.create_subject_data(policy_id, subject_category_id)
+
+ mock_data.create_action_data(policy_id, action_category_id)
+
+ with pytest.raises(DeleteActionCategoryWithMetaRule) as exception_info:
+ category_helper.delete_action_category(action_category_id)
+ assert str(exception_info.value) == '400: Action Category With Meta Rule Error'
+
+
+def test_delete_action_category_with_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ action_id = mock_data.create_action(policy_id)
+ data_id = mock_data.create_action_data(policy_id, action_category_id)
+ assignment_helper.add_action_assignment(policy_id, action_id, action_category_id, data_id)
+
+ with pytest.raises(DeleteActionCategoryWithMetaRule) as exception_info:
+ category_helper.delete_action_category(action_category_id)
+ assert str(exception_info.value) == '400: Action Category With Meta Rule Error'
+
+
+def test_delete_action_category_with_rule(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id)
+
+ with pytest.raises(DeleteActionCategoryWithMetaRule) as exception_info:
+ category_helper.delete_action_category(action_category_id)
+ assert str(exception_info.value) == '400: Action Category With Meta Rule Error'
+
+
+def test_delete_action_category_with_unkown_category_id(db):
+ category_id = "invalid_category_id"
+
+ with pytest.raises(ActionCategoryUnknown) as exception_info:
+ category_helper.delete_action_category(category_id)
+ assert str(exception_info.value) == '400: Action Category Unknown'
+
+
+def test_delete_data_categories_connected_to_meta_rule(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+ with pytest.raises(DeleteSubjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_subject_category(subject_category_id)
+ assert str(exception_info.value) == '400: Subject Category With Meta Rule Error'
+
+ with pytest.raises(DeleteObjectCategoryWithMetaRule) as exception_info:
+ category_helper.delete_object_category(object_category_id)
+ assert str(exception_info.value) == '400: Object Category With Meta Rule Error'
+
+ with pytest.raises(DeleteActionCategoryWithMetaRule) as exception_info:
+ category_helper.delete_action_category(action_category_id)
+ assert str(exception_info.value) == '400: Action Category With Meta Rule Error'
diff --git a/old/python_moondb/tests/unit_python/policies/__init__.py b/old/python_moondb/tests/unit_python/policies/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/policies/__init__.py
diff --git a/old/python_moondb/tests/unit_python/policies/mock_data.py b/old/python_moondb/tests/unit_python/policies/mock_data.py
new file mode 100644
index 00000000..47fc9f9e
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/policies/mock_data.py
@@ -0,0 +1,74 @@
+import helpers.model_helper as model_helper
+import helpers.meta_rule_helper as meta_rule_helper
+import helpers.policy_helper as policy_helper
+import helpers.category_helper as category_helper
+
+
+def create_meta_rule(meta_rule_name="meta_rule1", category_prefix=""):
+ meta_rule_value = {
+ "name": meta_rule_name,
+ "algorithm": "name of the meta rule algorithm",
+ "subject_categories": [category_prefix + "subject_category_id1",
+ category_prefix + "subject_category_id2"],
+ "object_categories": [category_prefix + "object_category_id1"],
+ "action_categories": [category_prefix + "action_category_id1"]
+ }
+ return meta_rule_value
+
+
+def create_model(meta_rule_id, model_name="test_model"):
+ value = {
+ "name": model_name,
+ "description": "test",
+ "meta_rules": [meta_rule_id]
+
+ }
+ return value
+
+
+def create_policy(model_id, policy_name="policy_1"):
+ value = {
+ "name": policy_name,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ return value
+
+
+def create_pdp(pdp_ids):
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": pdp_ids,
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ return value
+
+
+def get_policy_id(model_name="test_model", policy_name="policy_1", meta_rule_name="meta_rule1", category_prefix=""):
+ category_helper.add_subject_category(
+ category_prefix + "subject_category_id1",
+ value={"name": category_prefix + "subject_category_id1",
+ "description": "description 1"})
+ category_helper.add_subject_category(
+ category_prefix + "subject_category_id2",
+ value={"name": category_prefix + "subject_category_id2",
+ "description": "description 1"})
+ category_helper.add_object_category(
+ category_prefix + "object_category_id1",
+ value={"name": category_prefix + "object_category_id1",
+ "description": "description 1"})
+ category_helper.add_action_category(
+ category_prefix + "action_category_id1",
+ value={"name": category_prefix + "action_category_id1",
+ "description": "description 1"})
+ meta_rule = meta_rule_helper.add_meta_rule(value=create_meta_rule(meta_rule_name, category_prefix))
+ meta_rule_id = list(meta_rule.keys())[0]
+ model = model_helper.add_model(value=create_model(meta_rule_id, model_name))
+ model_id = list(model.keys())[0]
+ value = create_policy(model_id, policy_name)
+ policy = policy_helper.add_policies(value=value)
+ assert policy
+ policy_id = list(policy.keys())[0]
+ return policy_id
diff --git a/old/python_moondb/tests/unit_python/policies/test_assignments.py b/old/python_moondb/tests/unit_python/policies/test_assignments.py
new file mode 100755
index 00000000..24a3a7b0
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/policies/test_assignments.py
@@ -0,0 +1,235 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import helpers.mock_data as mock_data
+import helpers.assignment_helper as assignment_helper
+from python_moonutilities.exceptions import *
+import pytest
+
+
+def test_get_action_assignments(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ action_id = mock_data.create_action(policy_id)
+ data_id = mock_data.create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ assignment_helper.add_action_assignment(policy_id, action_id, action_category_id, data_id)
+ act_assignments = assignment_helper.get_action_assignments(policy_id, action_id,
+ action_category_id)
+ action_id_1 = list(act_assignments.keys())[0]
+ assert act_assignments[action_id_1]["policy_id"] == policy_id
+ assert act_assignments[action_id_1]["action_id"] == action_id
+ assert act_assignments[action_id_1]["category_id"] == action_category_id
+ assert len(act_assignments[action_id_1].get("assignments")) == 1
+ assert data_id in act_assignments[action_id_1].get("assignments")
+
+
+def test_add_action_assignments(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ action_id = mock_data.create_action(policy_id)
+ data_id = mock_data.create_action_data(policy_id=policy_id, category_id=action_category_id)
+ action_assignments = assignment_helper.add_action_assignment(policy_id, action_id,
+ action_category_id, data_id)
+ assert action_assignments
+ action_id_1 = list(action_assignments.keys())[0]
+ assert action_assignments[action_id_1]["policy_id"] == policy_id
+ assert action_assignments[action_id_1]["action_id"] == action_id
+ assert action_assignments[action_id_1]["category_id"] == action_category_id
+ assert len(action_assignments[action_id_1].get("assignments")) == 1
+ assert data_id in action_assignments[action_id_1].get("assignments")
+
+ with pytest.raises(ActionAssignmentExisting) as exception_info:
+ assignment_helper.add_action_assignment(policy_id, action_id, action_category_id, data_id)
+ assert str(exception_info.value) == '409: Action Assignment Existing'
+ assert str(exception_info.value.description) == 'The given action assignment value is existing.'
+
+
+def test_delete_action_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ action_id = mock_data.create_action(policy_id)
+ data_id = mock_data.create_action_data(policy_id=policy_id, category_id=action_category_id)
+ assignment_helper.add_action_assignment(policy_id, action_id, action_category_id, data_id)
+ assignment_helper.delete_action_assignment(policy_id, "", "", "")
+ assignments = assignment_helper.get_action_assignments(policy_id, )
+ assert len(assignments) == 1
+
+
+def test_delete_action_assignment_with_invalid_policy_id(db):
+ policy_id = "invalid_id"
+ assignment_helper.delete_action_assignment(policy_id, "", "", "")
+ assignments = assignment_helper.get_action_assignments(policy_id, )
+ assert len(assignments) == 0
+
+
+def test_get_object_assignments(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+ obj_assignments = assignment_helper.get_object_assignments(policy_id, object_id,
+ object_category_id)
+ object_id_1 = list(obj_assignments.keys())[0]
+ assert obj_assignments[object_id_1]["policy_id"] == policy_id
+ assert obj_assignments[object_id_1]["object_id"] == object_id
+ assert obj_assignments[object_id_1]["category_id"] == object_category_id
+ assert len(obj_assignments[object_id_1].get("assignments")) == 1
+ assert data_id in obj_assignments[object_id_1].get("assignments")
+
+
+def test_get_object_assignments_by_policy_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+ obj_assignments = assignment_helper.get_object_assignments(policy_id)
+ assert len(obj_assignments) == 1
+
+
+def test_add_object_assignments(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+ object_assignments = assignment_helper.add_object_assignment(policy_id, object_id,
+ object_category_id, data_id)
+ assert object_assignments
+ object_id_1 = list(object_assignments.keys())[0]
+ assert object_assignments[object_id_1]["policy_id"] == policy_id
+ assert object_assignments[object_id_1]["object_id"] == object_id
+ assert object_assignments[object_id_1]["category_id"] == object_category_id
+ assert len(object_assignments[object_id_1].get("assignments")) == 1
+ assert data_id in object_assignments[object_id_1].get("assignments")
+
+ with pytest.raises(ObjectAssignmentExisting) as exception_info:
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+ assert str(exception_info.value) == '409: Object Assignment Existing'
+ assert str(exception_info.value.description) == 'The given object assignment value is existing.'
+
+
+def test_delete_object_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+
+ assignment_helper.delete_object_assignment(policy_id, object_id, object_category_id,
+ data_id=data_id)
+ assignments = assignment_helper.get_object_assignments(policy_id)
+ assert len(assignments) == 0
+
+
+def test_delete_object_assignment_with_invalid_policy_id(db):
+ policy_id = "invalid_id"
+ assignment_helper.delete_object_assignment(policy_id, "", "", "")
+ assignments = assignment_helper.get_object_assignments(policy_id, )
+ assert len(assignments) == 0
+
+
+def test_get_subject_assignments(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+ subj_assignments = assignment_helper.get_subject_assignments(policy_id, subject_id,
+ subject_category_id)
+ subject_id_1 = list(subj_assignments.keys())[0]
+ assert subj_assignments[subject_id_1]["policy_id"] == policy_id
+ assert subj_assignments[subject_id_1]["subject_id"] == subject_id
+ assert subj_assignments[subject_id_1]["category_id"] == subject_category_id
+ assert len(subj_assignments[subject_id_1].get("assignments")) == 1
+ assert data_id in subj_assignments[subject_id_1].get("assignments")
+
+
+def test_get_subject_assignments_by_policy_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+ subj_assignments = assignment_helper.get_subject_assignments(policy_id)
+ assert len(subj_assignments) == 1
+
+
+def test_add_subject_assignments(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ subject_assignments = assignment_helper.add_subject_assignment(policy_id, subject_id,
+ subject_category_id, data_id)
+ assert subject_assignments
+ subject_id_1 = list(subject_assignments.keys())[0]
+ assert subject_assignments[subject_id_1]["policy_id"] == policy_id
+ assert subject_assignments[subject_id_1]["subject_id"] == subject_id
+ assert subject_assignments[subject_id_1]["category_id"] == subject_category_id
+ assert len(subject_assignments[subject_id_1].get("assignments")) == 1
+ assert data_id in subject_assignments[subject_id_1].get("assignments")
+
+ with pytest.raises(SubjectAssignmentExisting) as exception_info:
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id,
+ data_id)
+ assert str(exception_info.value) == '409: Subject Assignment Existing'
+ assert str(
+ exception_info.value.description) == 'The given subject assignment value is existing.'
+
+
+def test_delete_subject_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+ assignment_helper.delete_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+ assignments = assignment_helper.get_subject_assignments(policy_id)
+ assert len(assignments) == 0
+
+
+def test_delete_subject_assignment_with_invalid_policy_id(db):
+ policy_id = "invalid_id"
+ assignment_helper.delete_subject_assignment(policy_id, "", "", "")
+ assignments = assignment_helper.get_subject_assignments(policy_id, )
+ assert len(assignments) == 0
diff --git a/old/python_moondb/tests/unit_python/policies/test_data.py b/old/python_moondb/tests/unit_python/policies/test_data.py
new file mode 100755
index 00000000..8ce1ac00
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/policies/test_data.py
@@ -0,0 +1,707 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import helpers.mock_data as mock_data
+import policies.mock_data
+import helpers.data_helper as data_helper
+import helpers.assignment_helper as assignment_helper
+import pytest
+from uuid import uuid4
+import logging
+from python_moonutilities.exceptions import *
+
+logger = logging.getLogger("python_moondb.tests.api.test_data")
+
+
+def test_get_action_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ action_data = data_helper.add_action_data(policy_id=policy_id, category_id=action_category_id, value=value)
+ data_id = list(action_data["data"])[0]
+ found_action_data = data_helper.get_action_data(policy_id=policy_id, data_id=data_id,
+ category_id=action_category_id)
+ assert found_action_data
+ assert len(found_action_data[0]["data"]) == 1
+
+
+def test_get_action_data_with_invalid_category_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ action_data = data_helper.get_action_data(policy_id=policy_id, category_id="invalid")
+ assert len(action_data) == 0
+
+
+def test_add_action_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ action_data = data_helper.add_action_data(policy_id=policy_id, category_id=action_category_id, value=value)
+ assert action_data
+ assert len(action_data['data']) == 1
+
+
+def test_add_action_data_duplicate(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ action_data = data_helper.add_action_data(policy_id=policy_id, category_id=action_category_id, value=value)
+ with pytest.raises(ActionScopeExisting) as exception_info:
+ action_data = data_helper.add_action_data(policy_id=policy_id, category_id=action_category_id, value=value)
+ assert str(exception_info.value) == '409: Action Scope Existing'
+
+def test_add_action_data_with_invalid_category_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ with pytest.raises(ActionCategoryUnknown) as exception_info:
+ data_helper.add_action_data(policy_id=policy_id, value=value).get('data')
+ assert str(exception_info.value) == '400: Action Category Unknown'
+
+
+def test_delete_action_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ data_helper.get_available_metadata(policy_id)
+ value = {
+ "name": "action-type",
+ "description": {"vm-action": "", "storage-action": "", },
+ }
+ action_data = data_helper.add_action_data(policy_id=policy_id, category_id=action_category_id, value=value)
+ data_id = list(action_data["data"])[0]
+ data_helper.delete_action_data(policy_id=policy_id, data_id=data_id)
+ new_action_data = data_helper.get_action_data(policy_id)
+ assert len(new_action_data[0]['data']) == 0
+
+
+def test_get_object_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ object_data = data_helper.add_object_data(policy_id=policy_id, category_id=object_category_id, value=value)
+ data_id = list(object_data["data"])[0]
+ found_object_data = data_helper.get_object_data(policy_id=policy_id, data_id=data_id,
+ category_id=object_category_id)
+ assert found_object_data
+ assert len(found_object_data[0]['data']) == 1
+
+
+def test_get_object_data_with_invalid_category_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ object_data = data_helper.get_object_data(policy_id=policy_id, category_id="invalid")
+ assert len(object_data) == 0
+
+
+def test_add_object_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ object_data = data_helper.add_object_data(policy_id=policy_id, category_id=object_category_id, value=value).get(
+ 'data')
+ assert object_data
+ object_data_id = list(object_data.keys())[0]
+ assert object_data[object_data_id].get('policy_id') == policy_id
+
+
+def test_add_object_data_with_invalid_category_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ with pytest.raises(ObjectCategoryUnknown) as exception_info:
+ data_helper.add_object_data(policy_id=policy_id, category_id="invalid", value=value).get('data')
+ assert str(exception_info.value) == '400: Object Category Unknown'
+
+
+def test_add_object_data_duplicate(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ object_data = data_helper.add_object_data(policy_id=policy_id, category_id=object_category_id, value=value).get(
+ 'data')
+ with pytest.raises(ObjectScopeExisting) as exception_info:
+ data_helper.add_object_data(policy_id=policy_id, category_id=object_category_id, value=value).get(
+ 'data')
+ assert str(exception_info.value) == '409: Object Scope Existing'
+
+
+def test_delete_object_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "object-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ object_data = data_helper.add_object_data(policy_id=policy_id, category_id=object_category_id, value=value).get(
+ 'data')
+ object_data_id = list(object_data.keys())[0]
+ data_helper.delete_object_data(policy_id=object_data[object_data_id].get('policy_id'), data_id=object_data_id)
+ new_object_data = data_helper.get_object_data(policy_id)
+ assert len(new_object_data[0]['data']) == 0
+
+
+def test_get_subject_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = data_helper.add_subject_data(policy_id=policy_id, category_id=subject_category_id, value=value).get(
+ 'data')
+ subject_data_id = list(subject_data.keys())[0]
+ subject_data = data_helper.get_subject_data(policy_id, subject_data_id, subject_category_id)
+ assert subject_data
+ assert len(subject_data[0]['data']) == 1
+
+
+def test_get_subject_data_with_invalid_category_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = data_helper.add_subject_data(policy_id=policy_id, category_id=subject_category_id, value=value).get(
+ 'data')
+ subject_data_id = list(subject_data.keys())[0]
+ found_subject_data = data_helper.get_subject_data(policy_id, subject_data_id, "invalid")
+ assert len(found_subject_data) == 0
+
+
+def test_add_subject_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = data_helper.add_subject_data(policy_id=policy_id, category_id=subject_category_id, value=value).get(
+ 'data')
+ assert subject_data
+ subject_data_id = list(subject_data.keys())[0]
+ assert subject_data[subject_data_id].get('policy_id') == policy_id
+
+
+def test_add_subject_data_with_no_category_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ with pytest.raises(SubjectCategoryUnknown) as exception_info:
+ data_helper.add_subject_data(policy_id=policy_id, data_id=subject_category_id, value=value).get('data')
+ assert str(exception_info.value) == '400: Subject Category Unknown'
+
+
+def test_add_subject_data_duplicate(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = data_helper.add_subject_data(policy_id=policy_id, category_id=subject_category_id, value=value).get(
+ 'data')
+
+ with pytest.raises(SubjectScopeExisting) as exception_info:
+ subject_data = data_helper.add_subject_data(policy_id=policy_id, category_id=subject_category_id,
+ value=value).get('data')
+ assert str(exception_info.value) == '409: Subject Scope Existing'
+
+
+def test_delete_subject_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "subject-security-level",
+ "description": {"low": "", "medium": "", "high": ""},
+ }
+ subject_data = data_helper.add_subject_data(policy_id=policy_id, category_id=subject_category_id, value=value).get(
+ 'data')
+ subject_data_id = list(subject_data.keys())[0]
+ data_helper.delete_subject_data(policy_id=subject_data[subject_data_id].get('policy_id'), data_id=subject_data_id)
+ new_subject_data = data_helper.get_subject_data(policy_id)
+ assert len(new_subject_data[0]['data']) == 0
+
+
+def test_get_actions(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_action",
+ "description": "test",
+ }
+ data_helper.add_action(policy_id=policy_id, value=value)
+ actions = data_helper.get_actions(policy_id, )
+ assert actions
+ assert len(actions) == 1
+ action_id = list(actions.keys())[0]
+ assert actions[action_id].get('policy_list')[0] == policy_id
+
+
+def test_add_action(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_action",
+ "description": "test",
+ }
+ action = data_helper.add_action(policy_id=policy_id, value=value)
+ assert action
+ action_id = list(action.keys())[0]
+ assert len(action[action_id].get('policy_list')) == 1
+
+
+def test_add_action_twice(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_action",
+ "description": "test",
+ }
+ data_helper.add_action(policy_id=policy_id, value=value)
+ with pytest.raises(PolicyExisting) as exception_info:
+ data_helper.add_action(policy_id=policy_id, value=value)
+ assert str(exception_info.value) == '409: Policy Already Exists'
+
+
+def test_add_action_blank_name(db):
+ policy_id = policies.mock_data.get_policy_id()
+ value = {
+ "name": "",
+ "description": "test",
+ }
+ with pytest.raises(PerimeterContentError) as exception_info:
+ data_helper.add_action(policy_id=policy_id, value=value)
+ assert str(exception_info.value) == '400: Perimeter content is invalid.'
+
+
+def test_add_action_with_name_space(db):
+ policy_id = policies.mock_data.get_policy_id()
+ value = {
+ "name": " ",
+ "description": "test",
+ }
+ with pytest.raises(PerimeterContentError) as exception_info:
+ data_helper.add_action(policy_id=policy_id, value=value)
+ assert str(exception_info.value) == '400: Perimeter content is invalid.'
+
+
+def test_add_action_multiple_times(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id1 = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_action",
+ "description": "test",
+ }
+ action = data_helper.add_action(policy_id=policy_id1, value=value)
+ logger.info("action : {}".format(action))
+ action_id = list(action.keys())[0]
+ perimeter_id = action[action_id].get('id')
+ assert action
+ value = {
+ "name": "test_action",
+ "description": "test",
+ "policy_list": ['policy_id_3', 'policy_id_4']
+ }
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id2 = mock_data.create_new_policy(
+ subject_category_name="subject_category2",
+ object_category_name="object_category2",
+ action_category_name="action_category2",
+ meta_rule_name="meta_rule_2",
+ model_name="model2")
+ action = data_helper.add_action(policy_id=policy_id2, perimeter_id=perimeter_id, value=value)
+ logger.info("action : {}".format(action))
+ assert action
+ action_id = list(action.keys())[0]
+ assert len(action[action_id].get('policy_list')) == 2
+
+
+def test_delete_action(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_action",
+ "description": "test",
+ }
+ action = data_helper.add_action(policy_id=policy_id, value=value)
+ action_id = list(action.keys())[0]
+ data_helper.delete_action(policy_id, action_id)
+ actions = data_helper.get_actions(policy_id, )
+ assert not actions
+
+
+def test_delete_action_with_invalid_perimeter_id(db):
+ policy_id = "invalid"
+ perimeter_id = "invalid"
+ with pytest.raises(PolicyUnknown) as exception_info:
+ data_helper.delete_action(policy_id, perimeter_id)
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_get_objects(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_object",
+ "description": "test",
+ }
+ data_helper.add_object(policy_id=policy_id, value=value)
+ objects = data_helper.get_objects(policy_id, )
+ assert objects
+ assert len(objects) == 1
+ object_id = list(objects.keys())[0]
+ assert objects[object_id].get('policy_list')[0] == policy_id
+
+
+def test_add_object_with_same_policy_twice(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_object",
+ "description": "test",
+ }
+ added_object = data_helper.add_object(policy_id=policy_id, value=value)
+ assert added_object
+ object_id = list(added_object.keys())[0]
+ assert len(added_object[object_id].get('policy_list')) == 1
+
+ with pytest.raises(PolicyExisting) as exception_info:
+ data_helper.add_object(policy_id=policy_id, value=value)
+ assert str(exception_info.value) == '409: Policy Already Exists'
+
+
+def test_add_objects_multiple_times(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_object",
+ "description": "test",
+ }
+ added_object = data_helper.add_object(policy_id=policy_id, value=value)
+ object_id = list(added_object.keys())[0]
+ perimeter_id = added_object[object_id].get('id')
+ assert added_object
+ value = {
+ "name": "test_object",
+ "description": "test",
+ }
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category2",
+ object_category_name="object_category2",
+ action_category_name="action_category2",
+ meta_rule_name="meta_rule_2",
+ model_name="model2")
+ added_object = data_helper.add_object(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+ assert added_object
+ object_id = list(added_object.keys())[0]
+ assert len(added_object[object_id].get('policy_list')) == 2
+
+
+def test_delete_object(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "test_object",
+ "description": "test",
+ }
+ added_object = data_helper.add_object(policy_id=policy_id, value=value)
+ object_id = list(added_object.keys())[0]
+ data_helper.delete_object(policy_id, object_id)
+ objects = data_helper.get_objects(policy_id, )
+ assert not objects
+
+
+def test_delete_object_with_invalid_perimeter_id(db):
+ policy_id = "invalid"
+ perimeter_id = "invalid"
+ with pytest.raises(PolicyUnknown) as exception_info:
+ data_helper.delete_object(policy_id, perimeter_id)
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_get_subjects(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ data_helper.add_subject(policy_id=policy_id, value=value)
+ subjects = data_helper.get_subjects(policy_id=policy_id)
+ assert subjects
+ assert len(subjects) == 1
+ subject_id = list(subjects.keys())[0]
+ assert subjects[subject_id].get('policy_list')[0] == policy_id
+
+
+def test_get_subjects_with_invalid_policy_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ data_helper.add_subject(policy_id=policy_id, value=value)
+ with pytest.raises(PolicyUnknown) as exception_info:
+ data_helper.get_subjects(policy_id="invalid")
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_add_subject_with_same_policy_twice(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ subject = data_helper.add_subject(policy_id=policy_id, value=value)
+ assert subject
+ subject_id = list(subject.keys())[0]
+ assert len(subject[subject_id].get('policy_list')) == 1
+ with pytest.raises(PolicyExisting) as exception_info:
+ data_helper.add_subject(policy_id=policy_id, value=value)
+ assert str(exception_info.value) == '409: Policy Already Exists'
+
+
+def test_add_subjects_multiple_times(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ subject = data_helper.add_subject(policy_id=policy_id, value=value)
+ subject_id = list(subject.keys())[0]
+ perimeter_id = subject[subject_id].get('id')
+ assert subject
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category2",
+ object_category_name="object_category2",
+ action_category_name="action_category2",
+ meta_rule_name="meta_rule_2",
+ model_name="model2")
+ subject = data_helper.add_subject(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
+ assert subject
+ subject_id = list(subject.keys())[0]
+ assert len(subject[subject_id].get('policy_list')) == 2
+
+
+def test_delete_subject(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ value = {
+ "name": "testuser",
+ "description": "test",
+ }
+ subject = data_helper.add_subject(policy_id=policy_id, value=value)
+ subject_id = list(subject.keys())[0]
+ data_helper.delete_subject(policy_id, subject_id)
+ subjects = data_helper.get_subjects(policy_id, )
+ assert not subjects
+
+
+def test_delete_subject_with_invalid_perimeter_id(db):
+ policy_id = "invalid"
+ perimeter_id = "invalid"
+ with pytest.raises(PolicyUnknown) as exception_info:
+ data_helper.delete_subject(policy_id, perimeter_id)
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_delete_subject_with_assignment(db):
+
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category"+uuid4().hex,
+ object_category_name="object_category"+uuid4().hex,
+ action_category_name="action_category"+uuid4().hex,
+ meta_rule_name="meta_rule_"+uuid4().hex)
+
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+
+ with pytest.raises(DeletePerimeterWithAssignment) as exception_info:
+ data_helper.delete_subject(policy_id, subject_id)
+ assert '400: Perimeter With Assignment Error' == str(exception_info.value)
+
+
+def test_delete_object_with_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category" + uuid4().hex,
+ object_category_name="object_category" + uuid4().hex,
+ action_category_name="action_category" + uuid4().hex,
+ meta_rule_name="meta_rule_" + uuid4().hex)
+
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+
+ with pytest.raises(DeletePerimeterWithAssignment) as exception_info:
+ data_helper.delete_object(policy_id, object_id)
+ assert '400: Perimeter With Assignment Error' == str(exception_info.value)
+
+def test_delete_action_with_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category" + uuid4().hex,
+ object_category_name="object_category" + uuid4().hex,
+ action_category_name="action_category" + uuid4().hex,
+ meta_rule_name="meta_rule_" + uuid4().hex)
+
+ action_id = mock_data.create_action(policy_id)
+ data_id = mock_data.create_action_data(policy_id=policy_id, category_id=action_category_id)
+ assignment_helper.add_action_assignment(policy_id, action_id, action_category_id, data_id)
+
+ with pytest.raises(DeletePerimeterWithAssignment) as exception_info:
+ data_helper.delete_action(policy_id, action_id)
+ assert '400: Perimeter With Assignment Error' == str(exception_info.value)
+
+
+def test_get_available_metadata(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1")
+ metadata = data_helper.get_available_metadata(policy_id=policy_id)
+ assert metadata
+ assert metadata['object'][0] == object_category_id
+ assert metadata['subject'][0] == subject_category_id
+ assert metadata['action'][0] == action_category_id
+
+
+def test_get_available_metadata_with_invalid_policy_id(db):
+ with pytest.raises(PolicyUnknown) as exception_info:
+ data_helper.get_available_metadata(policy_id='invalid')
+ assert '400: Policy Unknown' == str(exception_info.value)
diff --git a/old/python_moondb/tests/unit_python/policies/test_policies.py b/old/python_moondb/tests/unit_python/policies/test_policies.py
new file mode 100755
index 00000000..b2394203
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/policies/test_policies.py
@@ -0,0 +1,643 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import pytest
+import helpers.mock_data as mock_data
+import helpers.policy_helper as policy_helper
+import helpers.model_helper as model_helper
+import helpers.model_helper as model_helper
+from python_moonutilities.exceptions import *
+import helpers.pdp_helper as pdp_helper
+import helpers.data_helper as data_helper
+import helpers.assignment_helper as assignment_helper
+from uuid import uuid4
+
+
+def test_get_policies(db):
+ policies = policy_helper.get_policies()
+ assert isinstance(policies, dict)
+ assert not policies
+
+
+def test_add_policies(db):
+ model = model_helper.add_model(model_id=uuid4().hex)
+ model_id = next(iter(model))
+ value = {
+ "name": "test_policy",
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ policies = policy_helper.add_policies(value=value)
+ assert isinstance(policies, dict)
+ assert policies
+ assert len(policies.keys()) == 1
+ policy_id = list(policies.keys())[0]
+ for key in ("genre", "name", "model_id", "description"):
+ assert key in policies[policy_id]
+ assert policies[policy_id][key] == value[key]
+
+
+def test_add_policies_twice_with_same_id(db):
+ policy_id = 'policy_id_1'
+ model = model_helper.add_model(model_id=uuid4().hex)
+ model_id = next(iter(model))
+ value = {
+ "name": "test_policy",
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ policy_helper.add_policies(policy_id, value)
+ with pytest.raises(PolicyExisting) as exception_info:
+ policy_helper.add_policies(policy_id, value)
+ assert str(exception_info.value) == '409: Policy Already Exists'
+
+
+def test_add_policies_twice_with_same_name(db):
+ model = model_helper.add_model(model_id=uuid4().hex)
+ model_id = next(iter(model))
+ policy_name=uuid4().hex
+ value = {
+ "name": policy_name,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ policy_helper.add_policies(value=value)
+ with pytest.raises(Exception) as exception_info:
+ policy_helper.add_policies(value=value)
+ assert str(exception_info.value) == '409: Policy Already Exists'
+ assert str(exception_info.value.description)== 'Policy name Existed'
+
+
+def test_delete_policies(db):
+ model = model_helper.add_model(model_id=uuid4().hex)
+ model_id = next(iter(model))
+ policy_name1 = uuid4().hex
+ value = {
+ "name": policy_name1,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ policies = policy_helper.add_policies(value=value)
+ policy_id1 = list(policies.keys())[0]
+ policy_name2 = uuid4().hex
+ value = {
+ "name": policy_name2,
+ "model_id": model_id,
+ "genre": "authz",
+ "description": "test",
+ }
+ policies = policy_helper.add_policies(value=value)
+ policy_id2 = list(policies.keys())[0]
+ assert policy_id1 != policy_id2
+ policy_helper.delete_policies(policy_id1)
+ policies = policy_helper.get_policies()
+ assert policy_id1 not in policies
+
+
+def test_delete_policies_with_invalid_id(db):
+ policy_id = 'policy_id_1'
+ with pytest.raises(PolicyUnknown) as exception_info:
+ policy_helper.delete_policies(policy_id)
+ # assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_update_policy(db):
+ policies = policy_helper.add_policies()
+ policy_id = list(policies.keys())[0]
+ value = {
+ "name": "test_policy4",
+ "model_id": policies[policy_id]['model_id'],
+ "genre": "authz",
+ "description": "test-3",
+ }
+ updated_policy = policy_helper.update_policy(policy_id, value)
+ assert updated_policy
+ for key in ("genre", "name", "model_id", "description"):
+ assert key in updated_policy[policy_id]
+ assert updated_policy[policy_id][key] == value[key]
+
+
+def test_update_policy_name_with_existed_one(db):
+ policies = policy_helper.add_policies()
+ policy_id1 = list(policies.keys())[0]
+ policy_name = uuid4().hex
+ value = {
+ "name": policy_name,
+ "model_id": policies[policy_id1]['model_id'],
+ "genre": "authz",
+ "description": "test-3",
+ }
+ policy_helper.add_policies(value=value)
+ with pytest.raises(PolicyExisting) as exception_info:
+ policy_helper.update_policy(policy_id=policy_id1,value=value)
+
+ assert str(exception_info.value) == '409: Policy Already Exists'
+ assert str(exception_info.value.description)== 'Policy name Existed'
+
+
+def test_update_policy_with_invalid_id(db):
+ policy_id = 'invalid-id'
+ value = {
+ "name": "test_policy4",
+ "model_id": "",
+ "genre": "authz",
+ "description": "test-3",
+ }
+ with pytest.raises(PolicyUnknown) as exception_info:
+ policy_helper.update_policy(policy_id, value)
+ assert str(exception_info.value) == '400: Policy Unknown'
+
+
+def test_get_policy_from_meta_rules(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ security_pipeline = [policy_id]
+ pdp_obj = mock_data.create_pdp(security_pipeline)
+ pdp_helper.add_pdp(value=pdp_obj)
+ matched_policy_id = policy_helper.get_policy_from_meta_rules(meta_rule_id)
+ assert matched_policy_id
+ assert policy_id == matched_policy_id
+
+
+def test_get_policy_from_meta_rules_with_no_policy_ids(db):
+ meta_rule_id = 'meta_rule_id'
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(value=value)
+ matched_policy_id = policy_helper.get_policy_from_meta_rules(meta_rule_id)
+ assert not matched_policy_id
+
+
+def test_get_rules(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category12",
+ object_category_name="object_category12",
+ action_category_name="action_category12",
+ meta_rule_name="meta_rule_12",
+ model_name="model12")
+
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id)
+
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id)
+ rules = policy_helper.get_rules(policy_id=policy_id, meta_rule_id=meta_rule_id)
+ assert isinstance(rules, dict)
+ assert rules
+ obj = rules.get('rules')
+ assert len(obj) == 2
+
+
+def test_get_rules_with_invalid_policy_id_failure(db):
+ rules = policy_helper.get_rules("invalid_policy_id", "meta_rule_id")
+ assert not rules.get('meta_rule-id')
+ assert len(rules.get('rules')) == 0
+
+
+def test_add_rule_existing(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+
+ value = {
+ "rule": (subject_data_id, object_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ rules = policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert rules
+ assert len(rules) == 1
+ assert isinstance(rules, dict)
+ rule_id = list(rules.keys())[0]
+ for key in ("rule", "instructions", "enabled"):
+ assert key in rules[rule_id]
+ assert rules[rule_id][key] == value[key]
+
+ with pytest.raises(RuleExisting) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '409: Rule Existing'
+
+
+def test_check_existing_rule_valid_request(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (subject_data_id, object_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ rules = policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert rules
+ assert len(rules) == 1
+ assert isinstance(rules, dict)
+ rule_id = list(rules.keys())[0]
+ for key in ("rule", "instructions", "enabled"):
+ assert key in rules[rule_id]
+ assert rules[rule_id][key] == value[key]
+
+ with pytest.raises(RuleExisting) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '409: Rule Existing'
+
+
+def test_check_existing_rule_valid_multiple__data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id1 = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ subject_data_id2 = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id1 = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ object_data_id2 = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id1 = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ action_data_id2 = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (
+ subject_data_id1, object_data_id2, action_data_id1),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ rules = policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert rules
+ assert len(rules) == 1
+ assert isinstance(rules, dict)
+ rule_id = list(rules.keys())[0]
+ for key in ("rule", "instructions", "enabled"):
+ assert key in rules[rule_id]
+ assert rules[rule_id][key] == value[key]
+
+ with pytest.raises(RuleExisting) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '409: Rule Existing'
+
+
+def test_check_existing_rule_missing_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (object_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(RuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Rule Error'
+ assert exception_info.value.description== "Missing Data"
+
+
+def test_check_existing_rule_meta_rule_missing_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (subject_data_id, object_data_id, action_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(MetaRuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Meta Rule Error'
+ assert exception_info.value.description == "Missing Data"
+
+
+def test_check_existing_rule_invalid_data_id_order(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (object_data_id, action_data_id, subject_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(RuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Rule Error'
+ assert "Missing Subject_category" in exception_info.value.description
+
+
+def test_check_existing_rule_invalid_data_id_order_scenrio_2(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (subject_data_id, action_data_id, object_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(RuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Rule Error'
+ assert "Missing Object_category" in exception_info.value.description
+
+
+def test_check_existing_rule_wrong_subject_data_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (uuid4().hex, object_data_id, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(RuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Rule Error'
+ assert "Missing Subject_category" in exception_info.value.description
+
+
+def test_check_existing_rule_wrong_object_data_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (subject_data_id, uuid4().hex, action_data_id),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(RuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Rule Error'
+ assert "Missing Object_category" in exception_info.value.description
+
+
+def test_check_existing_rule_wrong_action_data_id(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ subject_data_id = mock_data.create_subject_data(policy_id=policy_id,
+ category_id=subject_category_id)
+ object_data_id = mock_data.create_object_data(policy_id=policy_id,
+ category_id=object_category_id)
+ action_data_id = mock_data.create_action_data(policy_id=policy_id,
+ category_id=action_category_id)
+ value = {
+ "rule": (subject_data_id, object_data_id, uuid4().hex),
+ "instructions": ({"decision": "grant"}),
+ "enabled": "",
+ }
+
+ with pytest.raises(RuleContentError) as exception_info:
+ policy_helper.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
+ assert str(exception_info.value) == '400: Rule Error'
+ assert "Missing Action_category" in exception_info.value.description
+
+
+def test_delete_rule(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ rules = policy_helper.add_rule(policy_id, meta_rule_id)
+ rule_id = list(rules.keys())[0]
+ policy_helper.delete_rule(policy_id, rule_id)
+ rules = policy_helper.get_rules(policy_id, meta_rule_id)
+ assert not rules.get('rules')
+
+
+def test_delete_policies_with_pdp(db):
+ policies = policy_helper.add_policies()
+ policy_id1 = list(policies.keys())[0]
+ pdp_id = "pdp_id1"
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id1],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(pdp_id=pdp_id, value=value)
+ with pytest.raises(DeletePolicyWithPdp) as exception_info:
+ policy_helper.delete_policies(policy_id1)
+ assert str(exception_info.value) == '400: Policy With PDP Error'
+ assert 'Cannot delete policy with pdp' == exception_info.value.description
+
+
+def test_delete_policies_with_subject_perimeter(db):
+ policies = policy_helper.add_policies()
+ policy_id1 = list(policies.keys())[0]
+
+ value = {
+ "name": "testuser",
+ "security_pipeline": [policy_id1],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ data_helper.add_subject(policy_id=policy_id1, value=value)
+ with pytest.raises(DeletePolicyWithPerimeter) as exception_info:
+ policy_helper.delete_policies(policy_id1)
+ assert str(exception_info.value) == '400: Policy With Perimeter Error'
+ assert 'Cannot delete policy with perimeter'== exception_info.value.description
+
+
+def test_delete_policies_with_object_perimeter(db):
+ policies = policy_helper.add_policies()
+ policy_id1 = list(policies.keys())[0]
+
+ value = {
+ "name": "test_obj",
+ "security_pipeline": [policy_id1],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ data_helper.add_object(policy_id=policy_id1, value=value)
+ with pytest.raises(DeletePolicyWithPerimeter) as exception_info:
+ policy_helper.delete_policies(policy_id1)
+ assert str(exception_info.value) == '400: Policy With Perimeter Error'
+ assert 'Cannot delete policy with perimeter'== exception_info.value.description
+
+
+def test_delete_policies_with_action_perimeter(db):
+ policies = policy_helper.add_policies()
+ policy_id1 = list(policies.keys())[0]
+
+ value = {
+ "name": "test_act",
+ "security_pipeline": [policy_id1],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ data_helper.add_action(policy_id=policy_id1, value=value)
+ with pytest.raises(DeletePolicyWithPerimeter) as exception_info:
+ policy_helper.delete_policies(policy_id1)
+ assert '400: Policy With Perimeter Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_subject_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ subject_id = mock_data.create_subject(policy_id)
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+ assignment_helper.add_subject_assignment(policy_id, subject_id, subject_category_id, data_id)
+
+ with pytest.raises(DeletePolicyWithPerimeter) as exception_info:
+ policy_helper.delete_policies(policy_id)
+
+ assert '400: Policy With Perimeter Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_object_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ object_id = mock_data.create_object(policy_id)
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+ assignment_helper.add_object_assignment(policy_id, object_id, object_category_id, data_id)
+
+ with pytest.raises(DeletePolicyWithPerimeter) as exception_info:
+ policy_helper.delete_policies(policy_id)
+ assert '400: Policy With Perimeter Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_action_assignment(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ action_id = mock_data.create_action(policy_id)
+ data_id = mock_data.create_action_data(policy_id=policy_id, category_id=action_category_id)
+ assignment_helper.add_action_assignment(policy_id, action_id, action_category_id, data_id)
+
+ with pytest.raises(DeletePolicyWithPerimeter) as exception_info:
+ policy_helper.delete_policies(policy_id)
+ assert '400: Policy With Perimeter Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_subject_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ data_id = mock_data.create_subject_data(policy_id=policy_id, category_id=subject_category_id)
+
+ with pytest.raises(DeletePolicyWithData) as exception_info:
+ policy_helper.delete_policies(policy_id)
+
+ assert '400: Policy With Data Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_object_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ data_id = mock_data.create_object_data(policy_id=policy_id, category_id=object_category_id)
+
+ with pytest.raises(DeletePolicyWithData) as exception_info:
+ policy_helper.delete_policies(policy_id)
+ assert '400: Policy With Data Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_action_data(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ data_id = mock_data.create_action_data(policy_id=policy_id, category_id=action_category_id)
+
+ with pytest.raises(DeletePolicyWithData) as exception_info:
+ policy_helper.delete_policies(policy_id)
+ assert '400: Policy With Data Error' == str(exception_info.value)
+
+
+def test_delete_policies_with_rule(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy()
+
+ rules = policy_helper.add_rule(policy_id, meta_rule_id)
+
+ with pytest.raises(DeletePolicyWithRules) as exception_info:
+ policy_helper.delete_policies(policy_id)
+ assert '400: Policy With Rule Error' == str(exception_info.value)
diff --git a/python_moondb/tests/unit_python/requirements.txt b/old/python_moondb/tests/unit_python/requirements.txt
index 5f507ff7..aea8e3d5 100644
--- a/python_moondb/tests/unit_python/requirements.txt
+++ b/old/python_moondb/tests/unit_python/requirements.txt
@@ -1,5 +1,4 @@
sqlalchemy
pymysql
-pytest
requests_mock
-python_moonutilities \ No newline at end of file
+python_moonutilities==1.4.20 \ No newline at end of file
diff --git a/python_moondb/tests/unit_python/test_keystone.py b/old/python_moondb/tests/unit_python/test_keystone.py
index 134bec0d..134bec0d 100644
--- a/python_moondb/tests/unit_python/test_keystone.py
+++ b/old/python_moondb/tests/unit_python/test_keystone.py
diff --git a/old/python_moondb/tests/unit_python/test_pdp.py b/old/python_moondb/tests/unit_python/test_pdp.py
new file mode 100755
index 00000000..4d245e4d
--- /dev/null
+++ b/old/python_moondb/tests/unit_python/test_pdp.py
@@ -0,0 +1,149 @@
+import pytest
+import helpers.mock_data as mock_data
+import helpers.pdp_helper as pdp_helper
+
+
+def test_update_pdp(db):
+ pdp_id = "pdp_id1"
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(pdp_id, value)
+ pdp = pdp_helper.update_pdp(pdp_id, value)
+ assert pdp
+
+
+def test_update_pdp_with_invalid_id(db):
+ pdp_id = "pdp_id1"
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ with pytest.raises(Exception) as exception_info:
+ pdp_helper.update_pdp(pdp_id, value)
+ assert str(exception_info.value) == '400: Pdp Unknown'
+
+
+def test_delete_pdp(db):
+ pdp_id = "pdp_id1"
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(pdp_id, value)
+ pdp_helper.delete_pdp(pdp_id)
+ assert len(pdp_helper.get_pdp(pdp_id)) == 0
+
+
+def test_delete_pdp_with_invalid_id(db):
+ pdp_id = "pdp_id1"
+ with pytest.raises(Exception) as exception_info:
+ pdp_helper.delete_pdp(pdp_id)
+ assert str(exception_info.value) == '400: Pdp Unknown'
+
+
+def test_add_pdp(db):
+ pdp_id = "pdp_id1"
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp = pdp_helper.add_pdp(pdp_id, value)
+ assert pdp
+
+
+def test_add_pdp_twice_with_same_id(db):
+ pdp_id = "pdp_id1"
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(pdp_id, value)
+ with pytest.raises(Exception) as exception_info:
+ pdp_helper.add_pdp(pdp_id, value)
+ assert str(exception_info.value) == '409: Pdp Error'
+
+
+def test_add_pdp_twice_with_same_name(db):
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(value=value)
+ with pytest.raises(Exception) as exception_info:
+ pdp_helper.add_pdp(value=value)
+ assert str(exception_info.value) == '409: Pdp Error'
+
+
+def test_get_pdp(db):
+ pdp_id = "pdp_id1"
+ subject_category_id, object_category_id, action_category_id, meta_rule_id, policy_id = mock_data.create_new_policy(
+ subject_category_name="subject_category1",
+ object_category_name="object_category1",
+ action_category_name="action_category1",
+ meta_rule_name="meta_rule_1",
+ model_name="model1")
+ value = {
+ "name": "test_pdp",
+ "security_pipeline": [policy_id],
+ "keystone_project_id": "keystone_project_id1",
+ "description": "...",
+ }
+ pdp_helper.add_pdp(pdp_id, value)
+ pdp = pdp_helper.get_pdp(pdp_id)
+ assert len(pdp) == 1
+
+
+def test_get_pdp_with_invalid_id(db):
+ pdp_id = "invalid"
+ pdp = pdp_helper.get_pdp(pdp_id)
+ assert len(pdp) == 0
diff --git a/python_moondb/tests/unit_python/utilities.py b/old/python_moondb/tests/unit_python/utilities.py
index 1d79d890..1d79d890 100644
--- a/python_moondb/tests/unit_python/utilities.py
+++ b/old/python_moondb/tests/unit_python/utilities.py
diff --git a/old/python_moonutilities/.gitignore b/old/python_moonutilities/.gitignore
new file mode 100644
index 00000000..7bff7318
--- /dev/null
+++ b/old/python_moonutilities/.gitignore
@@ -0,0 +1,105 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
diff --git a/python_moonutilities/Changelog b/old/python_moonutilities/Changelog
index e6ab2f6e..d001c892 100644
--- a/python_moonutilities/Changelog
+++ b/old/python_moonutilities/Changelog
@@ -89,4 +89,69 @@ CHANGES
1.4.8
-----
-- Add SubjectScopeExisting, ObjectScopeExisting, ActionScopeExisting exceptions \ No newline at end of file
+- Add SubjectScopeExisting, ObjectScopeExisting, ActionScopeExisting exceptions
+
+1.4.9
+-----
+- Add some exceptions when deletion of elements is impossible
+
+1.4.10
+-----
+- Add CategoryNameInvalid and PerimeterNameInvalid exceptions
+
+1.4.11
+-----
+- Add validate_data function
+
+1.4.12
+-----
+- Fix a bug for the authz component
+- updating Validation to be on mandatory keys only
+
+1.4.13
+-----
+- Adding InvalidKey , InvalidContent exception
+- fix error code of 'CategoryNameInvalid' to be 400
+- updating error of post/patch to mention key name
+
+1.4.14
+-----
+- Adding updates to log
+1.4.15
+-----
+- Delete the check on each key send in request body for POST /models
+
+1.4.15-1
+--------
+- Revert to the previous functionality
+
+1.4.16
+-----
+- Adding exceptions for MetaRuleNotLinkedWithPolicyModel , CategoryNotAssignedMetaRule
+
+1.4.17
+-----
+- Update the security verification on attributes
+
+1.4.18
+-----
+- Allow None values in input attributes (None is replaced by an empty string)
+
+1.4.19
+-----
+- Allow boolean values in input attributes
+
+1.4.20
+-----
+- Adding DeleteSubjectCategoryWithMetaRule exception
+- Adding MetaRuleUpdate , PolicyUpdateError, ModelContentError exception
+- Adding DeleteObjectCategoryWithMetaRule DeleteActionCategoryWithMetaRule exceptions
+
+1.4.21
+-----
+- Allow in the cache the search of a perimeter element by it ID
+
+1.4.22
+-----
+- Enable the target update in context manager
+- Fix assignments update in cache
diff --git a/old/python_moonutilities/Jenkinsfile b/old/python_moonutilities/Jenkinsfile
new file mode 100644
index 00000000..95939e9b
--- /dev/null
+++ b/old/python_moonutilities/Jenkinsfile
@@ -0,0 +1,10 @@
+pipeline {
+ agent { docker { image 'python:3.5.1' } }
+ stages {
+ stage('build') {
+ steps {
+ sh 'python --version'
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/old/python_moonutilities/LICENSE b/old/python_moonutilities/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/old/python_moonutilities/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/python_moonutilities/MANIFEST.in b/old/python_moonutilities/MANIFEST.in
index 2a5ac509..2a5ac509 100644
--- a/python_moonutilities/MANIFEST.in
+++ b/old/python_moonutilities/MANIFEST.in
diff --git a/python_moonutilities/README.md b/old/python_moonutilities/README.md
index 8e21966a..8e21966a 100644
--- a/python_moonutilities/README.md
+++ b/old/python_moonutilities/README.md
diff --git a/old/python_moonutilities/python_moonutilities/__init__.py b/old/python_moonutilities/python_moonutilities/__init__.py
new file mode 100644
index 00000000..6e924e93
--- /dev/null
+++ b/old/python_moonutilities/python_moonutilities/__init__.py
@@ -0,0 +1,6 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+__version__ = "1.4.22"
diff --git a/python_moonutilities/python_moonutilities/cache.py b/old/python_moonutilities/python_moonutilities/cache.py
index 1bb9d09e..49a3ef5b 100644
--- a/python_moonutilities/python_moonutilities/cache.py
+++ b/old/python_moonutilities/python_moonutilities/cache.py
@@ -102,14 +102,14 @@ class Cache(object):
if policy_id in self.subjects:
for _subject_id, _subject_dict in self.subjects[policy_id].items():
- if "name" in _subject_dict and _subject_dict["name"] == name:
+ if _subject_id == name or _subject_dict.get("name") == name:
return _subject_id
self.__update_subjects(policy_id)
if policy_id in self.subjects:
for _subject_id, _subject_dict in self.subjects[policy_id].items():
- if "name" in _subject_dict and _subject_dict["name"] == name:
+ if _subject_id == name or _subject_dict.get("name") == name:
return _subject_id
raise exceptions.SubjectUnknown("Cannot find subject {}".format(name))
@@ -131,14 +131,14 @@ class Cache(object):
if policy_id in self.objects:
for _object_id, _object_dict in self.__OBJECTS[policy_id].items():
- if "name" in _object_dict and _object_dict["name"] == name:
+ if _object_id == name or _object_dict.get("name") == name:
return _object_id
self.__update_objects(policy_id)
if policy_id in self.objects:
for _object_id, _object_dict in self.__OBJECTS[policy_id].items():
- if "name" in _object_dict and _object_dict["name"] == name:
+ if _object_id == name or _object_dict.get("name") == name:
return _object_id
raise exceptions.ObjectUnknown("Cannot find object {}".format(name))
@@ -161,13 +161,13 @@ class Cache(object):
if policy_id in self.actions:
for _action_id, _action_dict in self.__ACTIONS[policy_id].items():
- if "name" in _action_dict and _action_dict["name"] == name:
+ if _action_id == name or _action_dict.get("name") == name:
return _action_id
self.__update_actions(policy_id)
for _action_id, _action_dict in self.__ACTIONS[policy_id].items():
- if "name" in _action_dict and _action_dict["name"] == name:
+ if _action_id == name or _action_dict.get("name") == name:
return _action_id
raise exceptions.ActionUnknown("Cannot find action {}".format(name))
@@ -218,6 +218,17 @@ class Cache(object):
# assignment functions
+ def update_assignments(self, policy_id=None, perimeter_id=None):
+ if policy_id:
+ self.__update_subject_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ self.__update_object_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ self.__update_action_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ else:
+ for policy_id in self.__POLICIES:
+ self.__update_subject_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ self.__update_object_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+ self.__update_action_assignments(policy_id=policy_id, perimeter_id=perimeter_id)
+
@property
def subject_assignments(self):
return self.__SUBJECT_ASSIGNMENTS
@@ -233,8 +244,7 @@ class Cache(object):
if 'subject_assignments' in response.json():
if policy_id not in self.subject_assignments:
self.__SUBJECT_ASSIGNMENTS[policy_id] = {}
-
- self.__SUBJECT_ASSIGNMENTS[policy_id].update(response.json()['subject_assignments'])
+ self.__SUBJECT_ASSIGNMENTS[policy_id] = response.json()['subject_assignments']
else:
raise exceptions.SubjectAssignmentUnknown(
"Cannot find subject assignment within policy_id {}".format(policy_id))
@@ -251,7 +261,7 @@ class Cache(object):
if perimeter_id == value['subject_id'] and category_id == value['category_id']:
return value['assignments']
else:
- logger.warning("'subject_id' or 'category_id' or'assignments'"
+ logger.warning("'subject_id' or 'category_id' or 'assignments'"
" keys are not found in subject_assignments")
return []
@@ -271,7 +281,7 @@ class Cache(object):
if policy_id not in self.object_assignments:
self.__OBJECT_ASSIGNMENTS[policy_id] = {}
- self.__OBJECT_ASSIGNMENTS[policy_id].update(response.json()['object_assignments'])
+ self.__OBJECT_ASSIGNMENTS[policy_id] = response.json()['object_assignments']
else:
raise exceptions.ObjectAssignmentUnknown(
"Cannot find object assignment within policy_id {}".format(policy_id))
@@ -308,7 +318,7 @@ class Cache(object):
if policy_id not in self.__ACTION_ASSIGNMENTS:
self.__ACTION_ASSIGNMENTS[policy_id] = {}
- self.__ACTION_ASSIGNMENTS[policy_id].update(response.json()['action_assignments'])
+ self.__ACTION_ASSIGNMENTS[policy_id] = response.json()['action_assignments']
else:
raise exceptions.ActionAssignmentUnknown(
"Cannot find action assignment within policy_id {}".format(policy_id))
diff --git a/python_moonutilities/python_moonutilities/configuration.py b/old/python_moonutilities/python_moonutilities/configuration.py
index 0516274c..0516274c 100644
--- a/python_moonutilities/python_moonutilities/configuration.py
+++ b/old/python_moonutilities/python_moonutilities/configuration.py
diff --git a/python_moonutilities/python_moonutilities/context.py b/old/python_moonutilities/python_moonutilities/context.py
index 1d25cda2..dc140b74 100644
--- a/python_moonutilities/python_moonutilities/context.py
+++ b/old/python_moonutilities/python_moonutilities/context.py
@@ -59,19 +59,19 @@ class Context:
@property
def current_state(self):
- self.__validate_meta_rule_content(self.__meta_rule_ids[self.__index])
+ self.__validate_meta_rule_content(self.__pdp_set[self.__meta_rule_ids[self.__index]])
return self.__pdp_set[self.__meta_rule_ids[self.__index]]['effect']
@current_state.setter
def current_state(self, state):
if state not in ("grant", "deny", "passed"):
state = "passed"
- self.__validate_meta_rule_content(self.__meta_rule_ids[self.__index])
+ self.__validate_meta_rule_content(self.__pdp_set[self.__meta_rule_ids[self.__index]])
self.__pdp_set[self.__meta_rule_ids[self.__index]]['effect'] = state
@current_state.deleter
def current_state(self):
- self.__validate_meta_rule_content(self.__meta_rule_ids[self.__index])
+ self.__validate_meta_rule_content(self.__pdp_set[self.__meta_rule_ids[self.__index]])
self.__pdp_set[self.__meta_rule_ids[self.__index]]['effect'] = "unset"
@property
@@ -110,38 +110,46 @@ class Context:
self.__pdp_set[meta_rule_id]["effect"] = "unset"
self.__pdp_set["effect"] = "deny"
- # def update_target(self, context):
- # # result = dict()
- # current_request = context['current_request']
- # _subject = current_request.get("subject")
- # _object = current_request.get("object")
- # _action = current_request.get("action")
- # meta_rule_id = context['headers'][context['index']]
- # policy_id = self.cache.get_policy_from_meta_rules(meta_rule_id)
- # meta_rules = self.cache.meta_rules()
- # # for meta_rule_id in meta_rules:
- # for sub_cat in meta_rules[meta_rule_id]['subject_categories']:
- # if sub_cat not in context["pdp_set"][meta_rule_id]["target"]:
- # context["pdp_set"][meta_rule_id]["target"][sub_cat] = []
- # for assign in self.cache.get_subject_assignments(policy_id, _subject, sub_cat).values():
- # for assign in assign["assignments"]:
- # if assign not in context["pdp_set"][meta_rule_id]["target"][sub_cat]:
- # context["pdp_set"][meta_rule_id]["target"][sub_cat].append(assign)
- # for obj_cat in meta_rules[meta_rule_id]['object_categories']:
- # if obj_cat not in context["pdp_set"][meta_rule_id]["target"]:
- # context["pdp_set"][meta_rule_id]["target"][obj_cat] = []
- # for assign in self.cache.get_object_assignments(policy_id, _object, obj_cat).values():
- # for assign in assign["assignments"]:
- # if assign not in context["pdp_set"][meta_rule_id]["target"][obj_cat]:
- # context["pdp_set"][meta_rule_id]["target"][obj_cat].append(assign)
- # for act_cat in meta_rules[meta_rule_id]['action_categories']:
- # if act_cat not in context["pdp_set"][meta_rule_id]["target"]:
- # context["pdp_set"][meta_rule_id]["target"][act_cat] = []
- # for assign in self.cache.get_action_assignments(policy_id, _action, act_cat).values():
- # for assign in assign["assignments"]:
- # if assign not in context["pdp_set"][meta_rule_id]["target"][act_cat]:
- # context["pdp_set"][meta_rule_id]["target"][act_cat].append(assign)
- # # context["pdp_set"][meta_rule_id]["target"].update(result)
+ def update_target(self):
+ for meta_rule_id in self.__meta_rule_ids:
+ result = dict()
+ _subject = self.__current_request["subject"]
+ _object = self.__current_request["object"]
+ _action = self.__current_request["action"]
+
+ meta_rules = self.cache.meta_rules
+ policy_id = self.cache.get_policy_from_meta_rules(meta_rule_id)
+
+ if 'subject_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'subject_categories' key not found ")
+
+ self.cache.update_assignments(policy_id)
+
+ for sub_cat in meta_rules[meta_rule_id]['subject_categories']:
+ if sub_cat not in result:
+ result[sub_cat] = []
+ result[sub_cat].extend(
+ self.cache.get_subject_assignments(policy_id, _subject, sub_cat))
+
+ if 'object_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'object_categories' key not found ")
+
+ for obj_cat in meta_rules[meta_rule_id]['object_categories']:
+ if obj_cat not in result:
+ result[obj_cat] = []
+ result[obj_cat].extend(
+ self.cache.get_object_assignments(policy_id, _object, obj_cat))
+
+ if 'action_categories' not in meta_rules[meta_rule_id]:
+ raise exceptions.MetaRuleContentError(" 'action_categories' key not found ")
+
+ for act_cat in meta_rules[meta_rule_id]['action_categories']:
+ if act_cat not in result:
+ result[act_cat] = []
+ result[act_cat].extend(
+ self.cache.get_action_assignments(policy_id, _action, act_cat))
+
+ self.__pdp_set[meta_rule_id]["target"] = result
def __add_target(self, meta_rule_id):
"""build target from meta_rule
@@ -341,4 +349,5 @@ pdp_set: {pdp_set}
def __validate_meta_rule_content(self, meta_rules):
if 'effect' not in meta_rules:
- raise exceptions.PdpContentError
+ logger.error("meta_rules={}".format(meta_rules))
+ raise exceptions.PdpContentError("effect not in meta_rules")
diff --git a/python_moonutilities/python_moonutilities/exceptions.py b/old/python_moonutilities/python_moonutilities/exceptions.py
index f1dcd31e..8ad90e96 100644
--- a/python_moonutilities/python_moonutilities/exceptions.py
+++ b/old/python_moonutilities/python_moonutilities/exceptions.py
@@ -133,6 +133,13 @@ class ModelUnknown(MoonError):
logger = "Error"
+class ModelContentError(MoonError):
+ description = _("The model content is invalid.")
+ code = 400
+ title = 'Model Unknown'
+ logger = "Error"
+
+
class ModelExisting(MoonError):
description = _("The model already exists.")
code = 409
@@ -198,10 +205,10 @@ class AdminRule(AdminException):
title = 'Rule Exception'
-class SubjectCategoryNameExisting(AdminMetaData):
- description = _("The given subject category name already exists.")
- code = 409
- title = 'Subject Category Name Existing'
+class CategoryNameInvalid(AdminMetaData):
+ description = _("The given category name is invalid.")
+ code = 400
+ title = 'Category Name Invalid'
logger = "ERROR"
@@ -211,28 +218,12 @@ class SubjectCategoryExisting(AdminMetaData):
title = 'Subject Category Existing'
logger = "ERROR"
-
-class ObjectCategoryNameExisting(AdminMetaData):
- description = _("The given object category name already exists.")
- code = 409
- title = 'Object Category Name Existing'
- logger = "ERROR"
-
-
class ObjectCategoryExisting(AdminMetaData):
description = _("The given object category already exists.")
code = 409
title = 'Object Category Existing'
logger = "ERROR"
-
-class ActionCategoryNameExisting(AdminMetaData):
- description = _("The given action category name already exists.")
- code = 409
- title = 'Action Category Name Existing'
- logger = "ERROR"
-
-
class ActionCategoryExisting(AdminMetaData):
description = _("The given action category already exists.")
code = 409
@@ -247,6 +238,20 @@ class SubjectCategoryUnknown(AdminMetaData):
logger = "ERROR"
+class DeleteSubjectCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete subject category used in meta rule ")
+ code = 400
+ title = 'Subject Category With Meta Rule Error'
+ logger = "Error"
+
+
+class DeleteObjectCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete Object category used in meta rule ")
+ code = 400
+ title = 'Object Category With Meta Rule Error'
+ logger = "Error"
+
+
class ObjectCategoryUnknown(AdminMetaData):
description = _("The given object category is unknown.")
code = 400
@@ -254,12 +259,32 @@ class ObjectCategoryUnknown(AdminMetaData):
logger = "ERROR"
+class DeleteActionCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete Action category used in meta rule ")
+ code = 400
+ title = 'Action Category With Meta Rule Error'
+ logger = "Error"
+
+
class ActionCategoryUnknown(AdminMetaData):
description = _("The given action category is unknown.")
code = 400
title = 'Action Category Unknown'
logger = "ERROR"
+class PerimeterContentError(AdminPerimeter):
+ description = _("Perimeter content is invalid.")
+ code = 400
+ title = 'Perimeter content is invalid.'
+ logger = "ERROR"
+
+
+class DeletePerimeterWithAssignment(MoonError):
+ description = _("Cannot delete perimeter with assignment")
+ code = 400
+ title = 'Perimeter With Assignment Error'
+ logger = "Error"
+
class SubjectUnknown(AdminPerimeter):
description = _("The given subject is unknown.")
@@ -302,23 +327,24 @@ class ActionExisting(AdminPerimeter):
title = 'Action Existing'
logger = "ERROR"
+
class SubjectNameExisting(AdminPerimeter):
description = _("The given subject name is existing.")
- code = 400
+ code = 409
title = 'Subject Name Existing'
logger = "ERROR"
class ObjectNameExisting(AdminPerimeter):
description = _("The given object name is existing.")
- code = 400
+ code = 409
title = 'Object Name Existing'
logger = "ERROR"
class ActionNameExisting(AdminPerimeter):
description = _("The given action name is existing.")
- code = 400
+ code = 409
title = 'Action Name Existing'
logger = "ERROR"
@@ -381,21 +407,21 @@ class ActionScopeExisting(AdminScope):
class SubjectScopeNameExisting(AdminScope):
description = _("The given subject scope name is existing.")
- code = 400
+ code = 409
title = 'Subject Scope Name Existing'
logger = "ERROR"
class ObjectScopeNameExisting(AdminScope):
description = _("The given object scope name is existing.")
- code = 400
+ code = 409
title = 'Object Scope Name Existing'
logger = "ERROR"
class ActionScopeNameExisting(AdminScope):
description = _("The given action scope name is existing.")
- code = 400
+ code = 409
title = 'Action Scope Name Existing'
logger = "ERROR"
@@ -423,21 +449,21 @@ class ActionAssignmentUnknown(AdminAssignment):
class SubjectAssignmentExisting(AdminAssignment):
description = _("The given subject assignment value is existing.")
- code = 400
+ code = 409
title = 'Subject Assignment Existing'
logger = "ERROR"
class ObjectAssignmentExisting(AdminAssignment):
description = _("The given object assignment value is existing.")
- code = 400
+ code = 409
title = 'Object Assignment Existing'
logger = "ERROR"
class ActionAssignmentExisting(AdminAssignment):
description = _("The given action assignment value is existing.")
- code = 400
+ code = 409
title = 'Action Assignment Existing'
logger = "ERROR"
@@ -464,23 +490,37 @@ class SubMetaRuleAlgorithmNotExisting(AdminMetaRule):
class MetaRuleUnknown(AdminMetaRule):
- description = _("The given sub meta rule is unknown.")
+ description = _("The given meta rule is unknown.")
code = 400
- title = 'Sub Meta Rule Unknown'
+ title = 'Meta Rule Unknown'
logger = "ERROR"
+class MetaRuleNotLinkedWithPolicyModel(MoonError):
+ description = _("The meta rule is not found in the model attached to the policy.")
+ code = 400
+ title = 'MetaRule Not Linked With Model - Policy'
+ logger = "Error"
+
+
+class CategoryNotAssignedMetaRule(MoonError):
+ description = _("The category is not found in the meta rules attached to the policy.")
+ code = 400
+ title = 'Category Not Linked With Meta Rule - Policy'
+ logger = "Error"
+
+
class SubMetaRuleNameExisting(AdminMetaRule):
description = _("The sub meta rule name already exists.")
- code = 400
+ code = 409
title = 'Sub Meta Rule Name Existing'
logger = "ERROR"
class MetaRuleExisting(AdminMetaRule):
- description = _("The sub meta rule already exists.")
- code = 400
- title = 'Sub Meta Rule Existing'
+ description = _("The meta rule already exists.")
+ code = 409
+ title = 'Meta Rule Existing'
logger = "ERROR"
@@ -491,13 +531,27 @@ class MetaRuleContentError(AdminMetaRule):
logger = "ERROR"
+class MetaRuleUpdateError(AdminMetaRule):
+ description = _("Meta_rule is used in Rule.")
+ code = 400
+ title = 'Meta_Rule Update Error'
+ logger = "ERROR"
+
+
class RuleExisting(AdminRule):
description = _("The rule already exists.")
- code = 400
+ code = 409
title = 'Rule Existing'
logger = "ERROR"
+class RuleContentError(AdminRule):
+ description = _("Invalid content of rule.")
+ code = 400
+ title = 'Rule Error'
+ logger = "ERROR"
+
+
class RuleUnknown(AdminRule):
description = _("The rule for that request doesn't exist.")
code = 400
@@ -559,6 +613,7 @@ class ConsulComponentContentError(ConsulError):
title = 'Consul Content error'
logger = "WARNING"
+
# Containers exceptions
@@ -627,7 +682,7 @@ class PdpExisting(MoonError):
class PdpContentError(MoonError):
description = _("Invalid content of pdp.")
- code = 409
+ code = 400
title = 'Pdp Error'
logger = "Error"
@@ -645,9 +700,134 @@ class PolicyUnknown(MoonError):
title = 'Policy Unknown'
logger = "Error"
+class PolicyContentError(MoonError):
+ description = _("The policy content is invalid.")
+ code = 400
+ title = 'Policy Content Error'
+ logger = "Error"
+
class PolicyExisting(MoonError):
description = _("The policy already exists.")
code = 409
- title = 'Policy Error'
+ title = 'Policy Already Exists'
+ logger = "Error"
+
+
+class PolicyUpdateError(MoonError):
+ description = _("The policy data is used.")
+ code = 400
+ title = 'Policy update error'
+ logger = "Error"
+
+
+class DeleteData(MoonError):
+ description = _("Cannot delete data with assignment")
+ code = 400
+ title = 'Data Error'
+ logger = "Error"
+
+
+class DeleteCategoryWithData(MoonError):
+ description = _("Cannot delete category with data")
+ code = 400
+ title = 'Category With Data Error'
+ logger = "Error"
+
+
+class DeleteCategoryWithMetaRule(MoonError):
+ description = _("Cannot delete category with meta rule")
+ code = 400
+ title = 'Category With MetaRule Error'
+ logger = "Error"
+
+
+class DeleteCategoryWithAssignment(MoonError):
+ description = _("Cannot delete category with assignment ")
+ code = 400
+ title = 'Category With Assignment Error'
+ logger = "Error"
+
+
+class DeleteModelWithPolicy(MoonError):
+ description = _("Cannot delete model with policy")
+ code = 400
+ title = 'Model With Policy Error'
+ logger = "Error"
+
+
+class DeletePolicyWithPdp(MoonError):
+ description = _("Cannot delete policy with pdp")
+ code = 400
+ title = 'Policy With PDP Error'
+ logger = "Error"
+
+
+class DeletePolicyWithPerimeter(MoonError):
+ description = _("Cannot delete policy with perimeter")
+ code = 400
+ title = 'Policy With Perimeter Error'
+ logger = "Error"
+
+
+class DeletePolicyWithData(MoonError):
+ description = _("Cannot delete policy with data")
+ code = 400
+ title = 'Policy With Data Error'
+ logger = "Error"
+
+
+class DeletePolicyWithRules(MoonError):
+ description = _("Cannot delete policy with rules")
+ code = 400
+ title = 'Policy With Rule Error'
+ logger = "Error"
+
+
+class DeleteMetaRuleWithModel(MoonError):
+ description = _("Cannot delete meta rule with model")
+ code = 400
+ title = 'Meta rule With Model Error'
+ logger = "Error"
+
+
+class DeleteMetaRuleWithRule(MoonError):
+ description = _("Cannot delete meta rule with rule")
+ code = 400
+ title = 'Meta rule With Model Error'
logger = "Error"
+
+
+class DataUnknown(MoonError):
+ description = _("The data unknown.")
+ code = 400
+ title = 'Data Unknown'
+ logger = "Error"
+
+
+class ValidationContentError(MoonError):
+ description = _("The Content validation incorrect.")
+ code = 400
+ title = 'Invalid Content'
+ logger = "Error"
+
+ def __init__(self, message=""):
+ self.message = message
+ super().__init__(message)
+
+ def __str__(self):
+ return self.message
+
+
+class ValidationKeyError(MoonError):
+ description = _("The Key validation incorrect.")
+ code = 400
+ title = 'Invalid Key'
+ logger = "Error"
+
+ def __init__(self, message=""):
+ self.message = message
+ super().__init__(message)
+
+ def __str__(self):
+ return self.message
diff --git a/python_moonutilities/python_moonutilities/misc.py b/old/python_moonutilities/python_moonutilities/misc.py
index 1db4d7cd..1db4d7cd 100644
--- a/python_moonutilities/python_moonutilities/misc.py
+++ b/old/python_moonutilities/python_moonutilities/misc.py
diff --git a/python_moonutilities/python_moonutilities/request_wrapper.py b/old/python_moonutilities/python_moonutilities/request_wrapper.py
index f1603b9d..f1603b9d 100644
--- a/python_moonutilities/python_moonutilities/request_wrapper.py
+++ b/old/python_moonutilities/python_moonutilities/request_wrapper.py
diff --git a/python_moonutilities/python_moonutilities/security_functions.py b/old/python_moonutilities/python_moonutilities/security_functions.py
index 15cbc8be..1069eb2f 100644
--- a/python_moonutilities/python_moonutilities/security_functions.py
+++ b/old/python_moonutilities/python_moonutilities/security_functions.py
@@ -4,6 +4,7 @@
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+import html
import re
import os
import types
@@ -82,6 +83,112 @@ def filter_input(func_or_str):
return None
+"""
+To do should check value of Dictionary but it's dependent on from where it's coming
+"""
+
+
+def validate_data(data):
+ def __validate_string(string):
+ temp_str = html.escape(string)
+ if string != temp_str:
+ raise exceptions.ValidationContentError('Forbidden characters in string')
+
+ def __validate_list_or_tuple(container):
+ for i in container:
+ validate_data(i)
+
+ def __validate_dict(dictionary):
+ for key in dictionary:
+ validate_data(dictionary[key])
+
+ if isinstance(data, bool):
+ return True
+ if data is None:
+ data = ""
+ if isinstance(data, str):
+ __validate_string(data)
+ elif isinstance(data, list) or isinstance(data, tuple):
+ __validate_list_or_tuple(data)
+ elif isinstance(data, dict):
+ __validate_dict(data)
+ else:
+ raise exceptions.ValidationContentError('Value is Not String or Container or Dictionary: {}'.format(data))
+
+
+def validate_input(type='get', args_state=[], kwargs_state=[], body_state=[]):
+ """
+ this fucntion works only on List or tuple or dictionary of Strings ,and String direct
+ Check if input of function is Valid or not, Valid if not has spaces and values is not None or empty.
+
+ :param type: type of request if function is used as decorator
+ :param args_state: list of Booleans for args,
+ values must be order as target values of arguments,
+ True if None is not Allowed and False if is allowed
+ :param kwargs_state: list of Booleans for kwargs as order of input kwargs,
+ values must be order as target values of arguments,
+ True if None is not Allowed and False if is allowed
+ :param body_state: list of Booleans for arguments in body of request if request is post,
+ values must be order as target values of arguments,
+ True if None is not Allowed and False if is allowed
+ :return:
+ """
+
+ def validate_input_decorator(func):
+ def wrapped(*args, **kwargs):
+
+ temp_args = []
+ """
+ this loop made to filter args from object class,
+ when put this function as decorator in function control
+ then there is copy of this class add to front of args
+ """
+ for arg in args:
+ if isinstance(arg, str) == True or \
+ isinstance(arg, list) == True or \
+ isinstance(arg, dict) == True:
+ temp_args.append(arg)
+
+ while len(args_state) < len(temp_args):
+ args_state.append(True)
+
+ for i in range(0, len(temp_args)):
+ if args_state[i]:
+ validate_data(temp_args[i])
+
+ while len(kwargs_state) < len(kwargs):
+ kwargs_state.append(False)
+ counter = 0
+ for i in kwargs:
+ if kwargs_state[counter]:
+ validate_data(kwargs[i])
+
+ counter = counter + 1
+
+ if type == "post" or type == "patch":
+ body = request.json
+ # while len(body_state) < len(body):
+ # body_state.append(True)
+ # counter = 0
+ for key in body_state:
+ if key in body:
+ if body_state[key]:
+ try:
+ validate_data(body.get(key))
+ except exceptions.ValidationContentError as e:
+ raise exceptions.ValidationContentError("Key: '{}', [{}]".format(key, str(e)))
+ else:
+ raise exceptions.ValidationKeyError('Invalid Key :{} not found'.format(key))
+
+ # counter = counter + 1
+
+ return func(*args, **kwargs)
+
+ return wrapped
+
+ return validate_input_decorator
+
+
def enforce(action_names, object_name, **extra):
"""Fake version of the enforce decorator"""
def wrapper_func(func):
diff --git a/python_moonutilities/requirements.txt b/old/python_moonutilities/requirements.txt
index 5b80e5f2..5b80e5f2 100644
--- a/python_moonutilities/requirements.txt
+++ b/old/python_moonutilities/requirements.txt
diff --git a/python_moonutilities/setup.py b/old/python_moonutilities/setup.py
index 4a2eef5d..4a2eef5d 100644
--- a/python_moonutilities/setup.py
+++ b/old/python_moonutilities/setup.py
diff --git a/python_moonutilities/tests/unit_python/conftest.py b/old/python_moonutilities/tests/unit_python/conftest.py
index 34e5c272..34e5c272 100644
--- a/python_moonutilities/tests/unit_python/conftest.py
+++ b/old/python_moonutilities/tests/unit_python/conftest.py
diff --git a/python_moonutilities/tests/unit_python/mock_repo/__init__.py b/old/python_moonutilities/tests/unit_python/mock_repo/__init__.py
index fa50edb3..fa50edb3 100644
--- a/python_moonutilities/tests/unit_python/mock_repo/__init__.py
+++ b/old/python_moonutilities/tests/unit_python/mock_repo/__init__.py
diff --git a/python_moonutilities/tests/unit_python/mock_repo/components_utilities.py b/old/python_moonutilities/tests/unit_python/mock_repo/components_utilities.py
index 11686ce4..11686ce4 100644
--- a/python_moonutilities/tests/unit_python/mock_repo/components_utilities.py
+++ b/old/python_moonutilities/tests/unit_python/mock_repo/components_utilities.py
diff --git a/python_moonutilities/tests/unit_python/mock_repo/data.py b/old/python_moonutilities/tests/unit_python/mock_repo/data.py
index 0e772e2c..0e772e2c 100644
--- a/python_moonutilities/tests/unit_python/mock_repo/data.py
+++ b/old/python_moonutilities/tests/unit_python/mock_repo/data.py
diff --git a/python_moonutilities/tests/unit_python/mock_repo/urls.py b/old/python_moonutilities/tests/unit_python/mock_repo/urls.py
index 41fd1eec..41fd1eec 100644
--- a/python_moonutilities/tests/unit_python/mock_repo/urls.py
+++ b/old/python_moonutilities/tests/unit_python/mock_repo/urls.py
diff --git a/old/python_moonutilities/tests/unit_python/requirements.txt b/old/python_moonutilities/tests/unit_python/requirements.txt
new file mode 100644
index 00000000..b08a2603
--- /dev/null
+++ b/old/python_moonutilities/tests/unit_python/requirements.txt
@@ -0,0 +1 @@
+requests_mock \ No newline at end of file
diff --git a/python_moonutilities/tests/unit_python/test_cache.py b/old/python_moonutilities/tests/unit_python/test_cache.py
index bef10a21..bef10a21 100644
--- a/python_moonutilities/tests/unit_python/test_cache.py
+++ b/old/python_moonutilities/tests/unit_python/test_cache.py
diff --git a/python_moonutilities/tests/unit_python/test_configuration.py b/old/python_moonutilities/tests/unit_python/test_configuration.py
index d5d83f7a..d5d83f7a 100644
--- a/python_moonutilities/tests/unit_python/test_configuration.py
+++ b/old/python_moonutilities/tests/unit_python/test_configuration.py
diff --git a/old/python_moonutilities/tests/unit_python/test_validated_input.py b/old/python_moonutilities/tests/unit_python/test_validated_input.py
new file mode 100644
index 00000000..723bc8ba
--- /dev/null
+++ b/old/python_moonutilities/tests/unit_python/test_validated_input.py
@@ -0,0 +1,154 @@
+# Copyright 2018 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+
+import pytest
+
+
+def test_valid_string():
+ from python_moonutilities.security_functions import validate_data
+ validate_data("CorrectString")
+ validate_data("Correct String")
+ validate_data("Correct String!")
+ validate_data("Correct String@")
+ validate_data(None)
+ validate_data(True)
+
+
+def test_invalid_string():
+ from python_moonutilities.security_functions import validate_data
+ with pytest.raises(Exception) as exception_info:
+ validate_data("Notcorrect<a>String")
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
+
+
+def test_none_value():
+ from python_moonutilities.security_functions import validate_data
+ with pytest.raises(Exception) as exception_info:
+ validate_data(object)
+
+ assert 'Value is Not String or Container or Dictionary' in str(exception_info.value)
+
+
+def test_numeric_value():
+ from python_moonutilities.security_functions import validate_data
+ with pytest.raises(Exception) as exception_info:
+ validate_data(1)
+ assert 'Value is Not String or Container or Dictionary' in str(exception_info.value)
+
+ with pytest.raises(Exception) as exception_info:
+ validate_data(1.23)
+ assert 'Value is Not String or Container or Dictionary' in str(exception_info.value)
+
+
+def test_correct_list_one_element():
+ from python_moonutilities.security_functions import validate_data
+ validate_data(["test_1", "test_2", "test_3"])
+
+
+def test_correct_list_multiple_element():
+ from python_moonutilities.security_functions import validate_data
+ validate_data(["test"])
+
+
+def test_correct_nested_list():
+ from python_moonutilities.security_functions import validate_data
+ validate_data([["test_1", "test_2"], [["test_3"], ["test_4"]], ["test_5", "test_6"], ["test_7"]])
+
+
+def test_incorrect_string_inside_list():
+ from python_moonutilities.security_functions import validate_data
+ with pytest.raises(Exception) as exception_info:
+ validate_data(["test_1", ["test_2", "forbidden<a>character"]])
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
+
+
+def test_correct_tuples():
+ from python_moonutilities.security_functions import validate_data
+ validate_data(("test_1", "test_2"))
+
+
+def test_correct_tuple_of_tuple():
+ from python_moonutilities.security_functions import validate_data
+ validate_data(("test_1", ("test_2", "test_3"), (("test_4", "test_5"), ("test_6", "test_7"))))
+
+
+def test_incorrect_string_within_tuple():
+ from python_moonutilities.security_functions import validate_data
+ with pytest.raises(Exception) as exception_info:
+ validate_data(("test_1", "forbidden<a>character"))
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
+
+
+def test_correct_dictionary():
+ from python_moonutilities.security_functions import validate_data
+ validate_data({"test_1": "test_2"})
+
+
+def test_incorrect_string_within_dictionary():
+ from python_moonutilities.security_functions import validate_data
+ with pytest.raises(Exception) as exception_info:
+ validate_data({"test_1": "forbidden<a>character"})
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
+
+
+def test_correct_function_pass():
+ from python_moonutilities.security_functions import validate_input
+
+ @validate_input()
+ def temp_function(string, list, tuple):
+ if string != "teststring":
+ raise ValueError("values which passed incorrect")
+
+ temp_function("teststring", ["teststring", ["teststring"]], ("teststring", ("teststring", )))
+
+
+def test_incorrect_validating_function_with_kwargs():
+ from python_moonutilities.security_functions import validate_input
+
+ @validate_input(kwargs_state=[True,True])
+ def temp_function(string, list, tuple):
+ if string != "teststring":
+ raise ValueError("values which passed incorrect")
+
+ with pytest.raises(Exception) as exception_info:
+ temp_function("teststring", list=["teststring", ["testst<a>ring"]],tuple=("teststring", ("teststri<a>ng", )))
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
+
+
+def test_incorrect_validating_function():
+ from python_moonutilities.security_functions import validate_input
+
+ @validate_input()
+ def temp_function(string, list, dictionary):
+ if string != "teststring":
+ raise ValueError("values which passed incorrect")
+
+ with pytest.raises(Exception) as exception_info:
+ temp_function("teststring", ["teststring", ["teststri<a>ng"]], {"teststring": ("teststring", )})
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
+
+
+def test_incorrect_validating_class_function():
+ from python_moonutilities.security_functions import validate_input
+
+ class Testclass:
+ @validate_input()
+ def temp_function(self, string, list, dictionary):
+ if string != "teststring":
+ raise ValueError("values which passed incorrect")
+
+ e = Testclass()
+
+ with pytest.raises(Exception) as exception_info:
+ e.temp_function("teststring", ["teststring", ["teststri<a>ng"]], {"teststring": ("teststring", )})
+
+ assert str(exception_info.value) == 'Forbidden characters in string'
diff --git a/tests/functional/README.md b/old/tests/functional/README.md
index 4cac22b6..4cac22b6 100644
--- a/tests/functional/README.md
+++ b/old/tests/functional/README.md
diff --git a/old/tests/functional/run_tests.sh b/old/tests/functional/run_tests.sh
new file mode 100755
index 00000000..cf55c3bd
--- /dev/null
+++ b/old/tests/functional/run_tests.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+MOON_HOME=${1:-.}
+
+echo "Starting Moon Functional Tests on ${MOON_HOME}"
+
+cd ${MOON_HOME}
+
+COMPONENTS="moon_manager moon_wrapper"
+
+for dir in ${COMPONENTS}; do
+ echo "Testing component ${dir}"
+ cd ${MOON_HOME}/${dir}
+ bash ../tests/functional/run_tests_for_component.sh
+ cd -
+done
+
+# TODO: download tests results
diff --git a/tests/functional/run_tests_for_component.sh b/old/tests/functional/run_tests_for_component.sh
index 6c6a0330..6c6a0330 100644
--- a/tests/functional/run_tests_for_component.sh
+++ b/old/tests/functional/run_tests_for_component.sh
diff --git a/tests/functional/scenario_available/delegation.py b/old/tests/functional/scenario_available/delegation.py
index 839e74ce..839e74ce 100644
--- a/tests/functional/scenario_available/delegation.py
+++ b/old/tests/functional/scenario_available/delegation.py
diff --git a/tests/functional/scenario_available/mls.py b/old/tests/functional/scenario_available/mls.py
index 0e6285c9..0e6285c9 100644
--- a/tests/functional/scenario_available/mls.py
+++ b/old/tests/functional/scenario_available/mls.py
diff --git a/tests/functional/scenario_available/rbac.py b/old/tests/functional/scenario_available/rbac.py
index 25c010fd..25c010fd 100644
--- a/tests/functional/scenario_available/rbac.py
+++ b/old/tests/functional/scenario_available/rbac.py
diff --git a/tests/functional/scenario_available/rbac_custom_100.py b/old/tests/functional/scenario_available/rbac_custom_100.py
index 9ee55dbd..9ee55dbd 100644
--- a/tests/functional/scenario_available/rbac_custom_100.py
+++ b/old/tests/functional/scenario_available/rbac_custom_100.py
diff --git a/tests/functional/scenario_available/rbac_custom_1000.py b/old/tests/functional/scenario_available/rbac_custom_1000.py
index d6850485..d6850485 100644
--- a/tests/functional/scenario_available/rbac_custom_1000.py
+++ b/old/tests/functional/scenario_available/rbac_custom_1000.py
diff --git a/tests/functional/scenario_available/rbac_custom_50.py b/old/tests/functional/scenario_available/rbac_custom_50.py
index e1437cf4..e1437cf4 100644
--- a/tests/functional/scenario_available/rbac_custom_50.py
+++ b/old/tests/functional/scenario_available/rbac_custom_50.py
diff --git a/tests/functional/scenario_available/rbac_large.py b/old/tests/functional/scenario_available/rbac_large.py
index ef5dd9b2..ef5dd9b2 100644
--- a/tests/functional/scenario_available/rbac_large.py
+++ b/old/tests/functional/scenario_available/rbac_large.py
diff --git a/tests/functional/scenario_available/rbac_mls.py b/old/tests/functional/scenario_available/rbac_mls.py
index 8a5362ea..8a5362ea 100644
--- a/tests/functional/scenario_available/rbac_mls.py
+++ b/old/tests/functional/scenario_available/rbac_mls.py
diff --git a/tests/functional/scenario_available/session.py b/old/tests/functional/scenario_available/session.py
index 97d7aec3..97d7aec3 100644
--- a/tests/functional/scenario_available/session.py
+++ b/old/tests/functional/scenario_available/session.py
diff --git a/tests/functional/scenario_available/session_large.py b/old/tests/functional/scenario_available/session_large.py
index 5b4a64b6..5b4a64b6 100644
--- a/tests/functional/scenario_available/session_large.py
+++ b/old/tests/functional/scenario_available/session_large.py
diff --git a/tests/functional/scenario_enabled/mls.py b/old/tests/functional/scenario_enabled/mls.py
index 6acd75ce..6acd75ce 120000
--- a/tests/functional/scenario_enabled/mls.py
+++ b/old/tests/functional/scenario_enabled/mls.py
diff --git a/tests/functional/scenario_enabled/rbac.py b/old/tests/functional/scenario_enabled/rbac.py
index 0edc905a..0edc905a 120000
--- a/tests/functional/scenario_enabled/rbac.py
+++ b/old/tests/functional/scenario_enabled/rbac.py
diff --git a/tests/functional/scenario_tests/mls.py b/old/tests/functional/scenario_tests/mls.py
index 0e6285c9..0e6285c9 100644
--- a/tests/functional/scenario_tests/mls.py
+++ b/old/tests/functional/scenario_tests/mls.py
diff --git a/tests/functional/scenario_tests/rbac.py b/old/tests/functional/scenario_tests/rbac.py
index 1d2cabee..1d2cabee 100644
--- a/tests/functional/scenario_tests/rbac.py
+++ b/old/tests/functional/scenario_tests/rbac.py
diff --git a/tests/performance/README.md b/old/tests/performance/README.md
index fcb80589..fcb80589 100644
--- a/tests/performance/README.md
+++ b/old/tests/performance/README.md
diff --git a/tests/python_unit/README.md b/old/tests/python_unit/README.md
index a399f834..a399f834 100644
--- a/tests/python_unit/README.md
+++ b/old/tests/python_unit/README.md
diff --git a/tests/python_unit/run_tests.sh b/old/tests/python_unit/run_tests.sh
index ab30e523..ab30e523 100644
--- a/tests/python_unit/run_tests.sh
+++ b/old/tests/python_unit/run_tests.sh
diff --git a/tools/bin/README.md b/old/tools/bin/README.md
index 71ff4a44..71ff4a44 100644
--- a/tools/bin/README.md
+++ b/old/tools/bin/README.md
diff --git a/tools/bin/api2rst.py b/old/tools/bin/api2rst.py
index 6d407bdf..6d407bdf 100644
--- a/tools/bin/api2rst.py
+++ b/old/tools/bin/api2rst.py
diff --git a/tools/bin/bootstrap.py b/old/tools/bin/bootstrap.py
index 6f2a5e03..6f2a5e03 100644
--- a/tools/bin/bootstrap.py
+++ b/old/tools/bin/bootstrap.py
diff --git a/tools/bin/build_all.sh b/old/tools/bin/build_all.sh
index 5bbf6a19..5bbf6a19 100644
--- a/tools/bin/build_all.sh
+++ b/old/tools/bin/build_all.sh
diff --git a/tools/bin/build_all_pip.sh b/old/tools/bin/build_all_pip.sh
index 2b415bf0..2b415bf0 100644
--- a/tools/bin/build_all_pip.sh
+++ b/old/tools/bin/build_all_pip.sh
diff --git a/tools/bin/delete_orchestrator.sh b/old/tools/bin/delete_orchestrator.sh
index 4d9d7c98..4d9d7c98 100644
--- a/tools/bin/delete_orchestrator.sh
+++ b/old/tools/bin/delete_orchestrator.sh
diff --git a/tools/bin/get_keystone_token.py b/old/tools/bin/get_keystone_token.py
index 1856aab8..1856aab8 100644
--- a/tools/bin/get_keystone_token.py
+++ b/old/tools/bin/get_keystone_token.py
diff --git a/tools/bin/moon_lib_upload.sh b/old/tools/bin/moon_lib_upload.sh
index d2dc2a3f..d2dc2a3f 100644
--- a/tools/bin/moon_lib_upload.sh
+++ b/old/tools/bin/moon_lib_upload.sh
diff --git a/tools/bin/set_auth.src b/old/tools/bin/set_auth.src
index d955e30b..d955e30b 100644
--- a/tools/bin/set_auth.src
+++ b/old/tools/bin/set_auth.src
diff --git a/tools/bin/start.sh b/old/tools/bin/start.sh
index e95ac393..e95ac393 100755
--- a/tools/bin/start.sh
+++ b/old/tools/bin/start.sh
diff --git a/tools/moon_jenkins/Dockerfile b/old/tools/moon_jenkins/Dockerfile
index 058f388c..058f388c 100644
--- a/tools/moon_jenkins/Dockerfile
+++ b/old/tools/moon_jenkins/Dockerfile
diff --git a/tools/moon_jenkins/README.md b/old/tools/moon_jenkins/README.md
index 684b351c..684b351c 100644
--- a/tools/moon_jenkins/README.md
+++ b/old/tools/moon_jenkins/README.md
diff --git a/tools/moon_jenkins/docker-compose.yml b/old/tools/moon_jenkins/docker-compose.yml
index eb9354ce..eb9354ce 100644
--- a/tools/moon_jenkins/docker-compose.yml
+++ b/old/tools/moon_jenkins/docker-compose.yml
diff --git a/tools/moon_jenkins/images/Create Multibranch Pipeline.png b/old/tools/moon_jenkins/images/Create Multibranch Pipeline.png
index c71415c0..c71415c0 100644
--- a/tools/moon_jenkins/images/Create Multibranch Pipeline.png
+++ b/old/tools/moon_jenkins/images/Create Multibranch Pipeline.png
Binary files differ
diff --git a/tools/moon_jenkins/images/Git Source Multibranch Pipeline.png b/old/tools/moon_jenkins/images/Git Source Multibranch Pipeline.png
index dd37f217..dd37f217 100644
--- a/tools/moon_jenkins/images/Git Source Multibranch Pipeline.png
+++ b/old/tools/moon_jenkins/images/Git Source Multibranch Pipeline.png
Binary files differ
diff --git a/tools/moon_jenkins/images/Multibranch Pipeline Log.png b/old/tools/moon_jenkins/images/Multibranch Pipeline Log.png
index a1905934..a1905934 100644
--- a/tools/moon_jenkins/images/Multibranch Pipeline Log.png
+++ b/old/tools/moon_jenkins/images/Multibranch Pipeline Log.png
Binary files differ
diff --git a/tools/moon_jenkins/images/Select Source Multibranch Pipeline.png b/old/tools/moon_jenkins/images/Select Source Multibranch Pipeline.png
index eadbe916..eadbe916 100644
--- a/tools/moon_jenkins/images/Select Source Multibranch Pipeline.png
+++ b/old/tools/moon_jenkins/images/Select Source Multibranch Pipeline.png
Binary files differ
diff --git a/tools/moon_jenkins/plugins.txt b/old/tools/moon_jenkins/plugins.txt
index 65bae872..65bae872 100644
--- a/tools/moon_jenkins/plugins.txt
+++ b/old/tools/moon_jenkins/plugins.txt
diff --git a/tools/moon_jenkins/security.groovy b/old/tools/moon_jenkins/security.groovy
index 0fb5ff6e..0fb5ff6e 100644
--- a/tools/moon_jenkins/security.groovy
+++ b/old/tools/moon_jenkins/security.groovy
diff --git a/tools/moon_keystone/Dockerfile b/old/tools/moon_keystone/Dockerfile
index 2a43bd92..2a43bd92 100644
--- a/tools/moon_keystone/Dockerfile
+++ b/old/tools/moon_keystone/Dockerfile
diff --git a/tools/moon_keystone/README.md b/old/tools/moon_keystone/README.md
index 7027324e..7027324e 100644
--- a/tools/moon_keystone/README.md
+++ b/old/tools/moon_keystone/README.md
diff --git a/tools/moon_keystone/run.sh b/old/tools/moon_keystone/run.sh
index 2a61901e..2a61901e 100644
--- a/tools/moon_keystone/run.sh
+++ b/old/tools/moon_keystone/run.sh
diff --git a/tools/moon_kubernetes/README.md b/old/tools/moon_kubernetes/README.md
index e75fe086..e75fe086 100644
--- a/tools/moon_kubernetes/README.md
+++ b/old/tools/moon_kubernetes/README.md
diff --git a/tools/moon_kubernetes/conf/moon.conf b/old/tools/moon_kubernetes/conf/moon.conf
index 5fc94edd..5fc94edd 100644
--- a/tools/moon_kubernetes/conf/moon.conf
+++ b/old/tools/moon_kubernetes/conf/moon.conf
diff --git a/tools/moon_kubernetes/conf/password_moon.txt b/old/tools/moon_kubernetes/conf/password_moon.txt
index bb9bcf7d..bb9bcf7d 100644
--- a/tools/moon_kubernetes/conf/password_moon.txt
+++ b/old/tools/moon_kubernetes/conf/password_moon.txt
diff --git a/tools/moon_kubernetes/conf/password_root.txt b/old/tools/moon_kubernetes/conf/password_root.txt
index bb9bcf7d..bb9bcf7d 100644
--- a/tools/moon_kubernetes/conf/password_root.txt
+++ b/old/tools/moon_kubernetes/conf/password_root.txt
diff --git a/tools/moon_kubernetes/init_k8s_moon.sh b/old/tools/moon_kubernetes/init_k8s_moon.sh
index 00c1b443..0617de86 100644
--- a/tools/moon_kubernetes/init_k8s_moon.sh
+++ b/old/tools/moon_kubernetes/init_k8s_moon.sh
@@ -108,7 +108,7 @@ function wait_for_moon_forming() {
function wait_for_moon_manager() {
echo "Waiting for moon (manager) ..."
kube_namespace="moon"
- declare -a kube_pods=("manager # 3")
+ declare -a kube_pods=("manager # 1")
check_pods_running "$kube_namespace" "${kube_pods[@]}"
}
diff --git a/tools/moon_kubernetes/templates/consul.yaml b/old/tools/moon_kubernetes/templates/consul.yaml
index f0fb764e..f0fb764e 100644
--- a/tools/moon_kubernetes/templates/consul.yaml
+++ b/old/tools/moon_kubernetes/templates/consul.yaml
diff --git a/tools/moon_kubernetes/templates/db.yaml b/old/tools/moon_kubernetes/templates/db.yaml
index a055507e..5a0e5e98 100644
--- a/tools/moon_kubernetes/templates/db.yaml
+++ b/old/tools/moon_kubernetes/templates/db.yaml
@@ -14,7 +14,7 @@ spec:
spec:
containers:
- name: db
- image: mysql:latest
+ image: mysql:5.7
env:
- name: MYSQL_DATABASE
value: "moon"
diff --git a/tools/moon_kubernetes/templates/keystone.yaml b/old/tools/moon_kubernetes/templates/keystone.yaml
index e4218e4c..e4218e4c 100644
--- a/tools/moon_kubernetes/templates/keystone.yaml
+++ b/old/tools/moon_kubernetes/templates/keystone.yaml
diff --git a/tools/moon_kubernetes/templates/kube-dns.yaml b/old/tools/moon_kubernetes/templates/kube-dns.yaml
index c8f18fd8..c8f18fd8 100644
--- a/tools/moon_kubernetes/templates/kube-dns.yaml
+++ b/old/tools/moon_kubernetes/templates/kube-dns.yaml
diff --git a/tools/moon_kubernetes/templates/moon_forming.yaml b/old/tools/moon_kubernetes/templates/moon_forming.yaml
index 1214a41a..1214a41a 100644
--- a/tools/moon_kubernetes/templates/moon_forming.yaml
+++ b/old/tools/moon_kubernetes/templates/moon_forming.yaml
diff --git a/tools/moon_kubernetes/templates/moon_functest.yaml b/old/tools/moon_kubernetes/templates/moon_functest.yaml
index e876849e..e876849e 100644
--- a/tools/moon_kubernetes/templates/moon_functest.yaml
+++ b/old/tools/moon_kubernetes/templates/moon_functest.yaml
diff --git a/tools/moon_kubernetes/templates/moon_gui.yaml b/old/tools/moon_kubernetes/templates/moon_gui.yaml
index eca4267d..eca4267d 100644
--- a/tools/moon_kubernetes/templates/moon_gui.yaml
+++ b/old/tools/moon_kubernetes/templates/moon_gui.yaml
diff --git a/tools/moon_kubernetes/templates/moon_manager.yaml b/old/tools/moon_kubernetes/templates/moon_manager.yaml
index 8eb59482..8eb59482 100644
--- a/tools/moon_kubernetes/templates/moon_manager.yaml
+++ b/old/tools/moon_kubernetes/templates/moon_manager.yaml
diff --git a/tools/moon_kubernetes/templates/moon_orchestrator.yaml b/old/tools/moon_kubernetes/templates/moon_orchestrator.yaml
index a4ae2bd9..a4ae2bd9 100644
--- a/tools/moon_kubernetes/templates/moon_orchestrator.yaml
+++ b/old/tools/moon_kubernetes/templates/moon_orchestrator.yaml
diff --git a/tools/openstack/README.md b/old/tools/openstack/README.md
index 8b5d06e5..8b5d06e5 100644
--- a/tools/openstack/README.md
+++ b/old/tools/openstack/README.md
diff --git a/tools/openstack/glance/policy.json b/old/tools/openstack/glance/policy.json
index 5505f67f..5505f67f 100644
--- a/tools/openstack/glance/policy.json
+++ b/old/tools/openstack/glance/policy.json
diff --git a/tools/openstack/nova/policy.json b/old/tools/openstack/nova/policy.json
index 29763ce3..29763ce3 100644
--- a/tools/openstack/nova/policy.json
+++ b/old/tools/openstack/nova/policy.json
diff --git a/tools/policies/generate_opst_policy.py b/old/tools/policies/generate_opst_policy.py
index dd01d1c1..dd01d1c1 100644
--- a/tools/policies/generate_opst_policy.py
+++ b/old/tools/policies/generate_opst_policy.py
diff --git a/old/tools/policies/policy.json.d/cinder.policy.json b/old/tools/policies/policy.json.d/cinder.policy.json
new file mode 100644
index 00000000..02af88bd
--- /dev/null
+++ b/old/tools/policies/policy.json.d/cinder.policy.json
@@ -0,0 +1,104 @@
+{
+ "context_is_admin": "role:admin",
+ "admin_or_owner": "is_admin:True or project_id:%(project_id)s",
+ "default": "rule:admin_or_owner",
+
+ "admin_api": "is_admin:True",
+
+ "volume:create": "",
+ "volume:delete": "rule:admin_or_owner",
+ "volume:get": "rule:admin_or_owner",
+ "volume:get_all": "rule:admin_or_owner",
+ "volume:get_volume_metadata": "rule:admin_or_owner",
+ "volume:delete_volume_metadata": "rule:admin_or_owner",
+ "volume:update_volume_metadata": "rule:admin_or_owner",
+ "volume:get_volume_admin_metadata": "rule:admin_api",
+ "volume:update_volume_admin_metadata": "rule:admin_api",
+ "volume:get_snapshot": "rule:admin_or_owner",
+ "volume:get_all_snapshots": "rule:admin_or_owner",
+ "volume:create_snapshot": "rule:admin_or_owner",
+ "volume:delete_snapshot": "rule:admin_or_owner",
+ "volume:update_snapshot": "rule:admin_or_owner",
+ "volume:extend": "rule:admin_or_owner",
+ "volume:update_readonly_flag": "rule:admin_or_owner",
+ "volume:retype": "rule:admin_or_owner",
+ "volume:update": "rule:admin_or_owner",
+
+ "volume_extension:types_manage": "rule:admin_api",
+ "volume_extension:types_extra_specs": "rule:admin_api",
+ "volume_extension:access_types_qos_specs_id": "rule:admin_api",
+ "volume_extension:access_types_extra_specs": "rule:admin_api",
+ "volume_extension:volume_type_access": "rule:admin_or_owner",
+ "volume_extension:volume_type_access:addProjectAccess": "rule:admin_api",
+ "volume_extension:volume_type_access:removeProjectAccess": "rule:admin_api",
+ "volume_extension:volume_type_encryption": "rule:admin_api",
+ "volume_extension:volume_encryption_metadata": "rule:admin_or_owner",
+ "volume_extension:extended_snapshot_attributes": "rule:admin_or_owner",
+ "volume_extension:volume_image_metadata": "rule:admin_or_owner",
+
+ "volume_extension:quotas:show": "",
+ "volume_extension:quotas:update": "rule:admin_api",
+ "volume_extension:quotas:delete": "rule:admin_api",
+ "volume_extension:quota_classes": "rule:admin_api",
+ "volume_extension:quota_classes:validate_setup_for_nested_quota_use": "rule:admin_api",
+
+ "volume_extension:volume_admin_actions:reset_status": "rule:admin_api",
+ "volume_extension:snapshot_admin_actions:reset_status": "rule:admin_api",
+ "volume_extension:backup_admin_actions:reset_status": "rule:admin_api",
+ "volume_extension:volume_admin_actions:force_delete": "rule:admin_api",
+ "volume_extension:volume_admin_actions:force_detach": "rule:admin_api",
+ "volume_extension:snapshot_admin_actions:force_delete": "rule:admin_api",
+ "volume_extension:backup_admin_actions:force_delete": "rule:admin_api",
+ "volume_extension:volume_admin_actions:migrate_volume": "rule:admin_api",
+ "volume_extension:volume_admin_actions:migrate_volume_completion": "rule:admin_api",
+
+ "volume_extension:volume_host_attribute": "rule:admin_api",
+ "volume_extension:volume_tenant_attribute": "rule:admin_or_owner",
+ "volume_extension:volume_mig_status_attribute": "rule:admin_api",
+ "volume_extension:hosts": "rule:admin_api",
+ "volume_extension:services:index": "rule:admin_api",
+ "volume_extension:services:update" : "rule:admin_api",
+
+ "volume_extension:volume_manage": "rule:admin_api",
+ "volume_extension:volume_unmanage": "rule:admin_api",
+
+ "volume_extension:capabilities": "rule:admin_api",
+
+ "volume:create_transfer": "rule:admin_or_owner",
+ "volume:accept_transfer": "",
+ "volume:delete_transfer": "rule:admin_or_owner",
+ "volume:get_all_transfers": "rule:admin_or_owner",
+
+ "volume_extension:replication:promote": "rule:admin_api",
+ "volume_extension:replication:reenable": "rule:admin_api",
+
+ "volume:enable_replication": "rule:admin_api",
+ "volume:disable_replication": "rule:admin_api",
+ "volume:failover_replication": "rule:admin_api",
+ "volume:list_replication_targets": "rule:admin_api",
+
+ "backup:create" : "",
+ "backup:delete": "rule:admin_or_owner",
+ "backup:get": "rule:admin_or_owner",
+ "backup:get_all": "rule:admin_or_owner",
+ "backup:restore": "rule:admin_or_owner",
+ "backup:backup-import": "rule:admin_api",
+ "backup:backup-export": "rule:admin_api",
+
+ "snapshot_extension:snapshot_actions:update_snapshot_status": "",
+ "snapshot_extension:snapshot_manage": "rule:admin_api",
+ "snapshot_extension:snapshot_unmanage": "rule:admin_api",
+
+ "consistencygroup:create" : "group:nobody",
+ "consistencygroup:delete": "group:nobody",
+ "consistencygroup:update": "group:nobody",
+ "consistencygroup:get": "group:nobody",
+ "consistencygroup:get_all": "group:nobody",
+
+ "consistencygroup:create_cgsnapshot" : "group:nobody",
+ "consistencygroup:delete_cgsnapshot": "group:nobody",
+ "consistencygroup:get_cgsnapshot": "group:nobody",
+ "consistencygroup:get_all_cgsnapshots": "group:nobody",
+
+ "scheduler_extension:scheduler_stats:get_pools" : "rule:admin_api"
+}
diff --git a/old/tools/policies/policy.json.d/glance.policy.json b/old/tools/policies/policy.json.d/glance.policy.json
new file mode 100644
index 00000000..5b1f6be7
--- /dev/null
+++ b/old/tools/policies/policy.json.d/glance.policy.json
@@ -0,0 +1,63 @@
+{
+ "context_is_admin": "role:admin",
+ "default": "role:admin",
+
+ "add_image": "",
+ "delete_image": "",
+ "get_image": "",
+ "get_images": "",
+ "modify_image": "",
+ "publicize_image": "role:admin",
+ "communitize_image": "",
+ "copy_from": "",
+
+ "download_image": "",
+ "upload_image": "",
+
+ "delete_image_location": "",
+ "get_image_location": "",
+ "set_image_location": "",
+
+ "add_member": "",
+ "delete_member": "",
+ "get_member": "",
+ "get_members": "",
+ "modify_member": "",
+
+ "manage_image_cache": "role:admin",
+
+ "get_task": "",
+ "get_tasks": "",
+ "add_task": "",
+ "modify_task": "",
+ "tasks_api_access": "role:admin",
+
+ "deactivate": "",
+ "reactivate": "",
+
+ "get_metadef_namespace": "",
+ "get_metadef_namespaces":"",
+ "modify_metadef_namespace":"",
+ "add_metadef_namespace":"",
+
+ "get_metadef_object":"",
+ "get_metadef_objects":"",
+ "modify_metadef_object":"",
+ "add_metadef_object":"",
+
+ "list_metadef_resource_types":"",
+ "get_metadef_resource_type":"",
+ "add_metadef_resource_type_association":"",
+
+ "get_metadef_property":"",
+ "get_metadef_properties":"",
+ "modify_metadef_property":"",
+ "add_metadef_property":"",
+
+ "get_metadef_tag":"",
+ "get_metadef_tags":"",
+ "modify_metadef_tag":"",
+ "add_metadef_tag":"",
+ "add_metadef_tags":""
+
+}
diff --git a/old/tools/policies/policy.json.d/keystone.policy.json b/old/tools/policies/policy.json.d/keystone.policy.json
new file mode 100644
index 00000000..263912bf
--- /dev/null
+++ b/old/tools/policies/policy.json.d/keystone.policy.json
@@ -0,0 +1,260 @@
+{
+ "admin_required": "role:admin",
+ "cloud_admin": "role:admin and (is_admin_project:True or domain_id:admin_domain_id)",
+ "service_role": "role:service",
+ "service_or_admin": "rule:admin_required or rule:service_role",
+ "owner": "user_id:%(user_id)s or user_id:%(target.token.user_id)s",
+ "admin_or_owner": "(rule:admin_required and domain_id:%(target.token.user.domain.id)s) or rule:owner",
+ "admin_and_matching_domain_id": "rule:admin_required and domain_id:%(domain_id)s",
+ "service_admin_or_owner": "rule:service_or_admin or rule:owner",
+
+ "default": "rule:admin_required",
+
+ "identity:get_region": "",
+ "identity:list_regions": "",
+ "identity:create_region": "rule:cloud_admin",
+ "identity:update_region": "rule:cloud_admin",
+ "identity:delete_region": "rule:cloud_admin",
+
+ "identity:get_service": "rule:admin_required",
+ "identity:list_services": "rule:admin_required",
+ "identity:create_service": "rule:cloud_admin",
+ "identity:update_service": "rule:cloud_admin",
+ "identity:delete_service": "rule:cloud_admin",
+
+ "identity:get_endpoint": "rule:admin_required",
+ "identity:list_endpoints": "rule:admin_required",
+ "identity:create_endpoint": "rule:cloud_admin",
+ "identity:update_endpoint": "rule:cloud_admin",
+ "identity:delete_endpoint": "rule:cloud_admin",
+
+ "identity:get_registered_limit": "",
+ "identity:list_registered_limits": "",
+ "identity:create_registered_limits": "rule:admin_required",
+ "identity:update_registered_limits": "rule:admin_required",
+ "identity:delete_registered_limit": "rule:admin_required",
+
+ "identity:get_limit": "",
+ "identity:list_limits": "",
+ "identity:create_limits": "rule:admin_required",
+ "identity:update_limits": "rule:admin_required",
+ "identity:delete_limit": "rule:admin_required",
+
+ "identity:get_domain": "rule:cloud_admin or rule:admin_and_matching_domain_id or token.project.domain.id:%(target.domain.id)s",
+ "identity:list_domains": "rule:cloud_admin",
+ "identity:create_domain": "rule:cloud_admin",
+ "identity:update_domain": "rule:cloud_admin",
+ "identity:delete_domain": "rule:cloud_admin",
+
+ "admin_and_matching_target_project_domain_id": "rule:admin_required and domain_id:%(target.project.domain_id)s",
+ "admin_and_matching_project_domain_id": "rule:admin_required and domain_id:%(project.domain_id)s",
+ "identity:get_project": "rule:cloud_admin or rule:admin_and_matching_target_project_domain_id or project_id:%(target.project.id)s",
+ "identity:list_projects": "rule:cloud_admin or rule:admin_and_matching_domain_id",
+ "identity:list_user_projects": "rule:owner or rule:admin_and_matching_domain_id",
+ "identity:create_project": "rule:cloud_admin or rule:admin_and_matching_project_domain_id",
+ "identity:update_project": "rule:cloud_admin or rule:admin_and_matching_target_project_domain_id",
+ "identity:delete_project": "rule:cloud_admin or rule:admin_and_matching_target_project_domain_id",
+ "identity:create_project_tag": "rule:admin_required",
+ "identity:delete_project_tag": "rule:admin_required",
+ "identity:get_project_tag": "rule:admin_required",
+ "identity:list_project_tags": "rule:admin_required",
+ "identity:delete_project_tags": "rule:admin_required",
+ "identity:update_project_tags": "rule:admin_required",
+
+ "admin_and_matching_target_user_domain_id": "rule:admin_required and domain_id:%(target.user.domain_id)s",
+ "admin_and_matching_user_domain_id": "rule:admin_required and domain_id:%(user.domain_id)s",
+ "identity:get_user": "rule:cloud_admin or rule:admin_and_matching_target_user_domain_id or rule:owner",
+ "identity:list_users": "rule:cloud_admin or rule:admin_and_matching_domain_id",
+ "identity:create_user": "rule:cloud_admin or rule:admin_and_matching_user_domain_id",
+ "identity:update_user": "rule:cloud_admin or rule:admin_and_matching_target_user_domain_id",
+ "identity:delete_user": "rule:cloud_admin or rule:admin_and_matching_target_user_domain_id",
+
+ "admin_and_matching_target_group_domain_id": "rule:admin_required and domain_id:%(target.group.domain_id)s",
+ "admin_and_matching_group_domain_id": "rule:admin_required and domain_id:%(group.domain_id)s",
+ "identity:get_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:list_groups": "rule:cloud_admin or rule:admin_and_matching_domain_id",
+ "identity:list_groups_for_user": "rule:owner or rule:admin_and_matching_target_user_domain_id",
+ "identity:create_group": "rule:cloud_admin or rule:admin_and_matching_group_domain_id",
+ "identity:update_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:delete_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:list_users_in_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:remove_user_from_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:check_user_in_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+ "identity:add_user_to_group": "rule:cloud_admin or rule:admin_and_matching_target_group_domain_id",
+
+ "identity:get_credential": "rule:admin_required",
+ "identity:list_credentials": "rule:admin_required or user_id:%(user_id)s",
+ "identity:create_credential": "rule:admin_required",
+ "identity:update_credential": "rule:admin_required",
+ "identity:delete_credential": "rule:admin_required",
+
+ "identity:ec2_get_credential": "rule:admin_required or (rule:owner and user_id:%(target.credential.user_id)s)",
+ "identity:ec2_list_credentials": "rule:admin_required or rule:owner",
+ "identity:ec2_create_credential": "rule:admin_required or rule:owner",
+ "identity:ec2_delete_credential": "rule:admin_required or (rule:owner and user_id:%(target.credential.user_id)s)",
+
+ "identity:get_role": "rule:admin_required",
+ "identity:list_roles": "rule:admin_required",
+ "identity:create_role": "rule:cloud_admin",
+ "identity:update_role": "rule:cloud_admin",
+ "identity:delete_role": "rule:cloud_admin",
+
+ "identity:get_domain_role": "rule:cloud_admin or rule:get_domain_roles",
+ "identity:list_domain_roles": "rule:cloud_admin or rule:list_domain_roles",
+ "identity:create_domain_role": "rule:cloud_admin or rule:domain_admin_matches_domain_role",
+ "identity:update_domain_role": "rule:cloud_admin or rule:domain_admin_matches_target_domain_role",
+ "identity:delete_domain_role": "rule:cloud_admin or rule:domain_admin_matches_target_domain_role",
+ "domain_admin_matches_domain_role": "rule:admin_required and domain_id:%(role.domain_id)s",
+ "get_domain_roles": "rule:domain_admin_matches_target_domain_role or rule:project_admin_matches_target_domain_role",
+ "domain_admin_matches_target_domain_role": "rule:admin_required and domain_id:%(target.role.domain_id)s",
+ "project_admin_matches_target_domain_role": "rule:admin_required and project_domain_id:%(target.role.domain_id)s",
+ "list_domain_roles": "rule:domain_admin_matches_filter_on_list_domain_roles or rule:project_admin_matches_filter_on_list_domain_roles",
+ "domain_admin_matches_filter_on_list_domain_roles": "rule:admin_required and domain_id:%(domain_id)s",
+ "project_admin_matches_filter_on_list_domain_roles": "rule:admin_required and project_domain_id:%(domain_id)s",
+ "admin_and_matching_prior_role_domain_id": "rule:admin_required and domain_id:%(target.prior_role.domain_id)s",
+ "implied_role_matches_prior_role_domain_or_global": "(domain_id:%(target.implied_role.domain_id)s or None:%(target.implied_role.domain_id)s)",
+
+ "identity:get_implied_role": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+ "identity:list_implied_roles": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+ "identity:create_implied_role": "rule:cloud_admin or (rule:admin_and_matching_prior_role_domain_id and rule:implied_role_matches_prior_role_domain_or_global)",
+ "identity:delete_implied_role": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+ "identity:list_role_inference_rules": "rule:cloud_admin",
+ "identity:check_implied_role": "rule:cloud_admin or rule:admin_and_matching_prior_role_domain_id",
+
+ "identity:list_system_grants_for_user": "rule:admin_required",
+ "identity:check_system_grant_for_user": "rule:admin_required",
+ "identity:create_system_grant_for_user": "rule:admin_required",
+ "identity:revoke_system_grant_for_user": "rule:admin_required",
+
+ "identity:list_system_grants_for_group": "rule:admin_required",
+ "identity:check_system_grant_for_group": "rule:admin_required",
+ "identity:create_system_grant_for_group": "rule:admin_required",
+ "identity:revoke_system_grant_for_group": "rule:admin_required",
+
+ "identity:check_grant": "rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants",
+ "identity:list_grants": "rule:cloud_admin or rule:domain_admin_for_list_grants or rule:project_admin_for_list_grants",
+ "identity:create_grant": "rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants",
+ "identity:revoke_grant": "rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants",
+ "domain_admin_for_grants": "rule:domain_admin_for_global_role_grants or rule:domain_admin_for_domain_role_grants",
+ "domain_admin_for_global_role_grants": "rule:admin_required and None:%(target.role.domain_id)s and rule:domain_admin_grant_match",
+ "domain_admin_for_domain_role_grants": "rule:admin_required and domain_id:%(target.role.domain_id)s and rule:domain_admin_grant_match",
+ "domain_admin_grant_match": "domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s",
+ "project_admin_for_grants": "rule:project_admin_for_global_role_grants or rule:project_admin_for_domain_role_grants",
+ "project_admin_for_global_role_grants": "rule:admin_required and None:%(target.role.domain_id)s and project_id:%(project_id)s",
+ "project_admin_for_domain_role_grants": "rule:admin_required and project_domain_id:%(target.role.domain_id)s and project_id:%(project_id)s",
+ "domain_admin_for_list_grants": "rule:admin_required and rule:domain_admin_grant_match",
+ "project_admin_for_list_grants": "rule:admin_required and project_id:%(project_id)s",
+
+ "admin_on_domain_filter": "rule:admin_required and domain_id:%(scope.domain.id)s",
+ "admin_on_project_filter": "rule:admin_required and project_id:%(scope.project.id)s",
+ "admin_on_domain_of_project_filter": "rule:admin_required and domain_id:%(target.project.domain_id)s",
+ "identity:list_role_assignments": "rule:cloud_admin or rule:admin_on_domain_filter or rule:admin_on_project_filter",
+ "identity:list_role_assignments_for_tree": "rule:cloud_admin or rule:admin_on_domain_of_project_filter",
+ "identity:get_policy": "rule:cloud_admin",
+ "identity:list_policies": "rule:cloud_admin",
+ "identity:create_policy": "rule:cloud_admin",
+ "identity:update_policy": "rule:cloud_admin",
+ "identity:delete_policy": "rule:cloud_admin",
+
+ "identity:check_token": "rule:admin_or_owner",
+ "identity:validate_token": "rule:service_admin_or_owner",
+ "identity:validate_token_head": "rule:service_or_admin",
+ "identity:revocation_list": "rule:service_or_admin",
+ "identity:revoke_token": "rule:admin_or_owner",
+
+ "identity:create_trust": "user_id:%(trust.trustor_user_id)s",
+ "identity:list_trusts": "",
+ "identity:list_roles_for_trust": "",
+ "identity:get_role_for_trust": "",
+ "identity:delete_trust": "",
+ "identity:get_trust": "",
+
+ "identity:create_consumer": "rule:admin_required",
+ "identity:get_consumer": "rule:admin_required",
+ "identity:list_consumers": "rule:admin_required",
+ "identity:delete_consumer": "rule:admin_required",
+ "identity:update_consumer": "rule:admin_required",
+
+ "identity:authorize_request_token": "rule:admin_required",
+ "identity:list_access_token_roles": "rule:admin_required",
+ "identity:get_access_token_role": "rule:admin_required",
+ "identity:list_access_tokens": "rule:admin_required",
+ "identity:get_access_token": "rule:admin_required",
+ "identity:delete_access_token": "rule:admin_required",
+
+ "identity:list_projects_for_endpoint": "rule:admin_required",
+ "identity:add_endpoint_to_project": "rule:admin_required",
+ "identity:check_endpoint_in_project": "rule:admin_required",
+ "identity:list_endpoints_for_project": "rule:admin_required",
+ "identity:remove_endpoint_from_project": "rule:admin_required",
+
+ "identity:create_endpoint_group": "rule:admin_required",
+ "identity:list_endpoint_groups": "rule:admin_required",
+ "identity:get_endpoint_group": "rule:admin_required",
+ "identity:update_endpoint_group": "rule:admin_required",
+ "identity:delete_endpoint_group": "rule:admin_required",
+ "identity:list_projects_associated_with_endpoint_group": "rule:admin_required",
+ "identity:list_endpoints_associated_with_endpoint_group": "rule:admin_required",
+ "identity:get_endpoint_group_in_project": "rule:admin_required",
+ "identity:list_endpoint_groups_for_project": "rule:admin_required",
+ "identity:add_endpoint_group_to_project": "rule:admin_required",
+ "identity:remove_endpoint_group_from_project": "rule:admin_required",
+
+ "identity:create_identity_provider": "rule:cloud_admin",
+ "identity:list_identity_providers": "rule:cloud_admin",
+ "identity:get_identity_provider": "rule:cloud_admin",
+ "identity:update_identity_provider": "rule:cloud_admin",
+ "identity:delete_identity_provider": "rule:cloud_admin",
+
+ "identity:create_protocol": "rule:cloud_admin",
+ "identity:update_protocol": "rule:cloud_admin",
+ "identity:get_protocol": "rule:cloud_admin",
+ "identity:list_protocols": "rule:cloud_admin",
+ "identity:delete_protocol": "rule:cloud_admin",
+
+ "identity:create_mapping": "rule:cloud_admin",
+ "identity:get_mapping": "rule:cloud_admin",
+ "identity:list_mappings": "rule:cloud_admin",
+ "identity:delete_mapping": "rule:cloud_admin",
+ "identity:update_mapping": "rule:cloud_admin",
+
+ "identity:create_service_provider": "rule:cloud_admin",
+ "identity:list_service_providers": "rule:cloud_admin",
+ "identity:get_service_provider": "rule:cloud_admin",
+ "identity:update_service_provider": "rule:cloud_admin",
+ "identity:delete_service_provider": "rule:cloud_admin",
+
+ "identity:get_auth_catalog": "",
+ "identity:get_auth_projects": "",
+ "identity:get_auth_domains": "",
+ "identity:get_auth_system": "",
+
+ "identity:list_projects_for_user": "",
+ "identity:list_domains_for_user": "",
+
+ "identity:list_revoke_events": "rule:service_or_admin",
+
+ "identity:create_policy_association_for_endpoint": "rule:cloud_admin",
+ "identity:check_policy_association_for_endpoint": "rule:cloud_admin",
+ "identity:delete_policy_association_for_endpoint": "rule:cloud_admin",
+ "identity:create_policy_association_for_service": "rule:cloud_admin",
+ "identity:check_policy_association_for_service": "rule:cloud_admin",
+ "identity:delete_policy_association_for_service": "rule:cloud_admin",
+ "identity:create_policy_association_for_region_and_service": "rule:cloud_admin",
+ "identity:check_policy_association_for_region_and_service": "rule:cloud_admin",
+ "identity:delete_policy_association_for_region_and_service": "rule:cloud_admin",
+ "identity:get_policy_for_endpoint": "rule:cloud_admin",
+ "identity:list_endpoints_for_policy": "rule:cloud_admin",
+
+ "identity:create_domain_config": "rule:cloud_admin",
+ "identity:get_domain_config": "rule:cloud_admin",
+ "identity:get_security_compliance_domain_config": "",
+ "identity:update_domain_config": "rule:cloud_admin",
+ "identity:delete_domain_config": "rule:cloud_admin",
+ "identity:get_domain_config_default": "rule:cloud_admin",
+
+ "identity:get_application_credential": "rule:admin_or_owner",
+ "identity:list_application_credentials": "rule:admin_or_owner",
+ "identity:create_application_credential": "rule:admin_or_owner",
+ "identity:delete_application_credential": "rule:admin_or_owner"
+}
diff --git a/old/tools/policies/policy.json.d/neutron.policy.json b/old/tools/policies/policy.json.d/neutron.policy.json
new file mode 100644
index 00000000..15f17203
--- /dev/null
+++ b/old/tools/policies/policy.json.d/neutron.policy.json
@@ -0,0 +1,235 @@
+{
+ "context_is_admin": "role:admin or user_name:neutron",
+ "owner": "tenant_id:%(tenant_id)s",
+ "admin_or_owner": "rule:context_is_admin or rule:owner",
+ "context_is_advsvc": "role:advsvc",
+ "admin_or_network_owner": "rule:context_is_admin or tenant_id:%(network:tenant_id)s",
+ "admin_owner_or_network_owner": "rule:owner or rule:admin_or_network_owner",
+ "admin_only": "rule:context_is_admin",
+ "regular_user": "",
+ "admin_or_data_plane_int": "rule:context_is_admin or role:data_plane_integrator",
+ "shared": "field:networks:shared=True",
+ "shared_subnetpools": "field:subnetpools:shared=True",
+ "shared_address_scopes": "field:address_scopes:shared=True",
+ "external": "field:networks:router:external=True",
+ "default": "rule:admin_or_owner",
+
+ "create_subnet": "rule:admin_or_network_owner",
+ "create_subnet:segment_id": "rule:admin_only",
+ "create_subnet:service_types": "rule:admin_only",
+ "get_subnet": "rule:admin_or_owner or rule:shared",
+ "get_subnet:segment_id": "rule:admin_only",
+ "update_subnet": "rule:admin_or_network_owner",
+ "update_subnet:service_types": "rule:admin_only",
+ "delete_subnet": "rule:admin_or_network_owner",
+
+ "create_subnetpool": "",
+ "create_subnetpool:shared": "rule:admin_only",
+ "create_subnetpool:is_default": "rule:admin_only",
+ "get_subnetpool": "rule:admin_or_owner or rule:shared_subnetpools",
+ "update_subnetpool": "rule:admin_or_owner",
+ "update_subnetpool:is_default": "rule:admin_only",
+ "delete_subnetpool": "rule:admin_or_owner",
+
+ "create_address_scope": "",
+ "create_address_scope:shared": "rule:admin_only",
+ "get_address_scope": "rule:admin_or_owner or rule:shared_address_scopes",
+ "update_address_scope": "rule:admin_or_owner",
+ "update_address_scope:shared": "rule:admin_only",
+ "delete_address_scope": "rule:admin_or_owner",
+
+ "create_network": "",
+ "get_network": "rule:admin_or_owner or rule:shared or rule:external or rule:context_is_advsvc",
+ "get_network:router:external": "rule:regular_user",
+ "get_network:segments": "rule:admin_only",
+ "get_network:provider:network_type": "rule:admin_only",
+ "get_network:provider:physical_network": "rule:admin_only",
+ "get_network:provider:segmentation_id": "rule:admin_only",
+ "get_network:queue_id": "rule:admin_only",
+ "get_network_ip_availabilities": "rule:admin_only",
+ "get_network_ip_availability": "rule:admin_only",
+ "create_network:shared": "rule:admin_only",
+ "create_network:router:external": "rule:admin_only",
+ "create_network:is_default": "rule:admin_only",
+ "create_network:segments": "rule:admin_only",
+ "create_network:provider:network_type": "rule:admin_only",
+ "create_network:provider:physical_network": "rule:admin_only",
+ "create_network:provider:segmentation_id": "rule:admin_only",
+ "update_network": "rule:admin_or_owner",
+ "update_network:segments": "rule:admin_only",
+ "update_network:shared": "rule:admin_only",
+ "update_network:provider:network_type": "rule:admin_only",
+ "update_network:provider:physical_network": "rule:admin_only",
+ "update_network:provider:segmentation_id": "rule:admin_only",
+ "update_network:router:external": "rule:admin_only",
+ "delete_network": "rule:admin_or_owner",
+
+ "create_segment": "rule:admin_only",
+ "get_segment": "rule:admin_only",
+ "update_segment": "rule:admin_only",
+ "delete_segment": "rule:admin_only",
+
+ "network_device": "field:port:device_owner=~^network:",
+ "create_port": "",
+ "create_port:device_owner": "not rule:network_device or rule:context_is_advsvc or rule:admin_or_network_owner",
+ "create_port:mac_address": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "create_port:fixed_ips:ip_address": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "create_port:fixed_ips:subnet_id": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:shared",
+ "create_port:port_security_enabled": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "create_port:binding:host_id": "rule:admin_only",
+ "create_port:binding:profile": "rule:admin_only",
+ "create_port:mac_learning_enabled": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "create_port:allowed_address_pairs": "rule:admin_or_network_owner",
+ "get_port": "rule:context_is_advsvc or rule:admin_owner_or_network_owner",
+ "get_port:queue_id": "rule:admin_only",
+ "get_port:binding:vif_type": "rule:admin_only",
+ "get_port:binding:vif_details": "rule:admin_only",
+ "get_port:binding:host_id": "rule:admin_only",
+ "get_port:binding:profile": "rule:admin_only",
+ "update_port": "rule:admin_or_owner or rule:context_is_advsvc",
+ "update_port:device_owner": "not rule:network_device or rule:context_is_advsvc or rule:admin_or_network_owner",
+ "update_port:mac_address": "rule:admin_only or rule:context_is_advsvc",
+ "update_port:fixed_ips:ip_address": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "update_port:fixed_ips:subnet_id": "rule:context_is_advsvc or rule:admin_or_network_owner or rule:shared",
+ "update_port:port_security_enabled": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "update_port:binding:host_id": "rule:admin_only",
+ "update_port:binding:profile": "rule:admin_only",
+ "update_port:mac_learning_enabled": "rule:context_is_advsvc or rule:admin_or_network_owner",
+ "update_port:allowed_address_pairs": "rule:admin_or_network_owner",
+ "update_port:data_plane_status": "rule:admin_or_data_plane_int",
+ "delete_port": "rule:context_is_advsvc or rule:admin_owner_or_network_owner",
+
+ "get_router:ha": "rule:admin_only",
+ "create_router": "rule:regular_user",
+ "create_router:external_gateway_info:enable_snat": "rule:admin_only",
+ "create_router:distributed": "rule:admin_only",
+ "create_router:ha": "rule:admin_only",
+ "get_router": "http://192.168.1.50:31002/wrapper/authz/grant",
+ "get_router:distributed": "rule:admin_only",
+ "update_router": "rule:admin_or_owner",
+ "update_router:external_gateway_info": "rule:admin_or_owner",
+ "update_router:external_gateway_info:network_id": "rule:admin_or_owner",
+ "update_router:external_gateway_info:enable_snat": "rule:admin_only",
+ "update_router:distributed": "rule:admin_only",
+ "update_router:ha": "rule:admin_only",
+ "delete_router": "rule:admin_or_owner",
+
+ "add_router_interface": "rule:admin_or_owner",
+ "remove_router_interface": "rule:admin_or_owner",
+
+ "create_router:external_gateway_info:external_fixed_ips": "rule:admin_only",
+ "update_router:external_gateway_info:external_fixed_ips": "rule:admin_only",
+
+ "create_qos_queue": "rule:admin_only",
+ "get_qos_queue": "rule:admin_only",
+
+ "update_agent": "rule:admin_only",
+ "delete_agent": "rule:admin_only",
+ "get_agent": "rule:admin_only",
+
+ "create_dhcp-network": "rule:admin_only",
+ "delete_dhcp-network": "rule:admin_only",
+ "get_dhcp-networks": "rule:admin_only",
+ "create_l3-router": "rule:admin_only",
+ "delete_l3-router": "rule:admin_only",
+ "get_l3-routers": "rule:admin_only",
+ "get_dhcp-agents": "rule:admin_only",
+ "get_l3-agents": "rule:admin_only",
+ "get_loadbalancer-agent": "rule:admin_only",
+ "get_loadbalancer-pools": "rule:admin_only",
+ "get_agent-loadbalancers": "rule:admin_only",
+ "get_loadbalancer-hosting-agent": "rule:admin_only",
+
+ "create_floatingip": "rule:regular_user",
+ "create_floatingip:floating_ip_address": "rule:admin_only",
+ "update_floatingip": "rule:admin_or_owner",
+ "delete_floatingip": "rule:admin_or_owner",
+ "get_floatingip": "rule:admin_or_owner",
+
+ "create_network_profile": "rule:admin_only",
+ "update_network_profile": "rule:admin_only",
+ "delete_network_profile": "rule:admin_only",
+ "get_network_profiles": "",
+ "get_network_profile": "",
+ "update_policy_profiles": "rule:admin_only",
+ "get_policy_profiles": "",
+ "get_policy_profile": "",
+
+ "create_metering_label": "rule:admin_only",
+ "delete_metering_label": "rule:admin_only",
+ "get_metering_label": "rule:admin_only",
+
+ "create_metering_label_rule": "rule:admin_only",
+ "delete_metering_label_rule": "rule:admin_only",
+ "get_metering_label_rule": "rule:admin_only",
+
+ "get_service_provider": "rule:regular_user",
+ "get_lsn": "rule:admin_only",
+ "create_lsn": "rule:admin_only",
+
+ "create_flavor": "rule:admin_only",
+ "update_flavor": "rule:admin_only",
+ "delete_flavor": "rule:admin_only",
+ "get_flavors": "rule:regular_user",
+ "get_flavor": "rule:regular_user",
+ "create_service_profile": "rule:admin_only",
+ "update_service_profile": "rule:admin_only",
+ "delete_service_profile": "rule:admin_only",
+ "get_service_profiles": "rule:admin_only",
+ "get_service_profile": "rule:admin_only",
+
+ "get_policy": "rule:regular_user",
+ "create_policy": "rule:admin_only",
+ "update_policy": "rule:admin_only",
+ "delete_policy": "rule:admin_only",
+ "get_policy_bandwidth_limit_rule": "rule:regular_user",
+ "create_policy_bandwidth_limit_rule": "rule:admin_only",
+ "delete_policy_bandwidth_limit_rule": "rule:admin_only",
+ "update_policy_bandwidth_limit_rule": "rule:admin_only",
+ "get_policy_dscp_marking_rule": "rule:regular_user",
+ "create_policy_dscp_marking_rule": "rule:admin_only",
+ "delete_policy_dscp_marking_rule": "rule:admin_only",
+ "update_policy_dscp_marking_rule": "rule:admin_only",
+ "get_rule_type": "rule:regular_user",
+ "get_policy_minimum_bandwidth_rule": "rule:regular_user",
+ "create_policy_minimum_bandwidth_rule": "rule:admin_only",
+ "delete_policy_minimum_bandwidth_rule": "rule:admin_only",
+ "update_policy_minimum_bandwidth_rule": "rule:admin_only",
+
+ "restrict_wildcard": "(not field:rbac_policy:target_tenant=*) or rule:admin_only",
+ "create_rbac_policy": "",
+ "create_rbac_policy:target_tenant": "rule:restrict_wildcard",
+ "update_rbac_policy": "rule:admin_or_owner",
+ "update_rbac_policy:target_tenant": "rule:restrict_wildcard and rule:admin_or_owner",
+ "get_rbac_policy": "rule:admin_or_owner",
+ "delete_rbac_policy": "rule:admin_or_owner",
+
+ "create_flavor_service_profile": "rule:admin_only",
+ "delete_flavor_service_profile": "rule:admin_only",
+ "get_flavor_service_profile": "rule:regular_user",
+ "get_auto_allocated_topology": "rule:admin_or_owner",
+
+ "create_trunk": "rule:regular_user",
+ "get_trunk": "rule:admin_or_owner",
+ "delete_trunk": "rule:admin_or_owner",
+ "get_subports": "",
+ "add_subports": "rule:admin_or_owner",
+ "remove_subports": "rule:admin_or_owner",
+
+ "get_security_groups": "rule:admin_or_owner",
+ "get_security_group": "rule:admin_or_owner",
+ "create_security_group": "rule:admin_or_owner",
+ "update_security_group": "rule:admin_or_owner",
+ "delete_security_group": "rule:admin_or_owner",
+ "get_security_group_rules": "rule:admin_or_owner",
+ "get_security_group_rule": "rule:admin_or_owner",
+ "create_security_group_rule": "rule:admin_or_owner",
+ "delete_security_group_rule": "rule:admin_or_owner",
+
+ "get_loggable_resources": "rule:admin_only",
+ "create_log": "rule:admin_only",
+ "update_log": "rule:admin_only",
+ "delete_log": "rule:admin_only",
+ "get_logs": "rule:admin_only",
+ "get_log": "rule:admin_only"
+}
diff --git a/old/tools/policies/policy.json.d/nova.policy.json b/old/tools/policies/policy.json.d/nova.policy.json
new file mode 100644
index 00000000..da8f5740
--- /dev/null
+++ b/old/tools/policies/policy.json.d/nova.policy.json
@@ -0,0 +1,485 @@
+{
+ "context_is_admin": "role:admin",
+ "admin_or_owner": "is_admin:True or project_id:%(project_id)s",
+ "default": "rule:admin_or_owner",
+
+ "cells_scheduler_filter:TargetCellFilter": "is_admin:True",
+
+ "compute:create": "",
+ "compute:create:attach_network": "",
+ "compute:create:attach_volume": "",
+ "compute:create:forced_host": "is_admin:True",
+
+ "compute:get": "",
+ "compute:get_all": "",
+ "compute:get_all_tenants": "is_admin:True",
+
+ "compute:update": "",
+
+ "compute:get_instance_metadata": "",
+ "compute:get_all_instance_metadata": "",
+ "compute:get_all_instance_system_metadata": "",
+ "compute:update_instance_metadata": "",
+ "compute:delete_instance_metadata": "",
+
+ "compute:get_instance_faults": "",
+ "compute:get_diagnostics": "",
+ "compute:get_instance_diagnostics": "",
+
+ "compute:start": "rule:admin_or_owner",
+ "compute:stop": "rule:admin_or_owner",
+
+ "compute:get_lock": "",
+ "compute:lock": "rule:admin_or_owner",
+ "compute:unlock": "rule:admin_or_owner",
+ "compute:unlock_override": "rule:admin_api",
+
+ "compute:get_vnc_console": "",
+ "compute:get_spice_console": "",
+ "compute:get_rdp_console": "",
+ "compute:get_serial_console": "",
+ "compute:get_mks_console": "",
+ "compute:get_console_output": "",
+
+ "compute:reset_network": "",
+ "compute:inject_network_info": "",
+ "compute:add_fixed_ip": "",
+ "compute:remove_fixed_ip": "",
+
+ "compute:attach_volume": "",
+ "compute:detach_volume": "",
+ "compute:swap_volume": "",
+
+ "compute:attach_interface": "",
+ "compute:detach_interface": "",
+
+ "compute:set_admin_password": "",
+
+ "compute:rescue": "",
+ "compute:unrescue": "",
+
+ "compute:suspend": "",
+ "compute:resume": "",
+
+ "compute:pause": "",
+ "compute:unpause": "",
+
+ "compute:shelve": "",
+ "compute:shelve_offload": "",
+ "compute:unshelve": "",
+
+ "compute:snapshot": "",
+ "compute:snapshot_volume_backed": "",
+ "compute:backup": "",
+
+ "compute:resize": "",
+ "compute:confirm_resize": "",
+ "compute:revert_resize": "",
+
+ "compute:rebuild": "",
+ "compute:reboot": "",
+ "compute:delete": "rule:admin_or_owner",
+ "compute:soft_delete": "rule:admin_or_owner",
+ "compute:force_delete": "rule:admin_or_owner",
+
+ "compute:security_groups:add_to_instance": "",
+ "compute:security_groups:remove_from_instance": "",
+
+ "compute:restore": "",
+
+ "compute:volume_snapshot_create": "",
+ "compute:volume_snapshot_delete": "",
+
+ "admin_api": "is_admin:True",
+ "compute_extension:accounts": "rule:admin_api",
+ "compute_extension:admin_actions": "rule:admin_api",
+ "compute_extension:admin_actions:pause": "rule:admin_or_owner",
+ "compute_extension:admin_actions:unpause": "rule:admin_or_owner",
+ "compute_extension:admin_actions:suspend": "rule:admin_or_owner",
+ "compute_extension:admin_actions:resume": "rule:admin_or_owner",
+ "compute_extension:admin_actions:lock": "rule:admin_or_owner",
+ "compute_extension:admin_actions:unlock": "rule:admin_or_owner",
+ "compute_extension:admin_actions:resetNetwork": "rule:admin_api",
+ "compute_extension:admin_actions:injectNetworkInfo": "rule:admin_api",
+ "compute_extension:admin_actions:createBackup": "rule:admin_or_owner",
+ "compute_extension:admin_actions:migrateLive": "rule:admin_api",
+ "compute_extension:admin_actions:resetState": "rule:admin_api",
+ "compute_extension:admin_actions:migrate": "rule:admin_api",
+ "compute_extension:aggregates": "rule:admin_api",
+ "compute_extension:agents": "rule:admin_api",
+ "compute_extension:attach_interfaces": "",
+ "compute_extension:baremetal_nodes": "rule:admin_api",
+ "compute_extension:cells": "rule:admin_api",
+ "compute_extension:cells:create": "rule:admin_api",
+ "compute_extension:cells:delete": "rule:admin_api",
+ "compute_extension:cells:update": "rule:admin_api",
+ "compute_extension:cells:sync_instances": "rule:admin_api",
+ "compute_extension:certificates": "",
+ "compute_extension:cloudpipe": "rule:admin_api",
+ "compute_extension:cloudpipe_update": "rule:admin_api",
+ "compute_extension:config_drive": "",
+ "compute_extension:console_output": "",
+ "compute_extension:consoles": "",
+ "compute_extension:createserverext": "",
+ "compute_extension:deferred_delete": "",
+ "compute_extension:disk_config": "",
+ "compute_extension:evacuate": "rule:admin_api",
+ "compute_extension:extended_server_attributes": "rule:admin_api",
+ "compute_extension:extended_status": "",
+ "compute_extension:extended_availability_zone": "",
+ "compute_extension:extended_ips": "",
+ "compute_extension:extended_ips_mac": "",
+ "compute_extension:extended_vif_net": "",
+ "compute_extension:extended_volumes": "",
+ "compute_extension:fixed_ips": "rule:admin_api",
+ "compute_extension:flavor_access": "",
+ "compute_extension:flavor_access:addTenantAccess": "rule:admin_api",
+ "compute_extension:flavor_access:removeTenantAccess": "rule:admin_api",
+ "compute_extension:flavor_disabled": "",
+ "compute_extension:flavor_rxtx": "",
+ "compute_extension:flavor_swap": "",
+ "compute_extension:flavorextradata": "",
+ "compute_extension:flavorextraspecs:index": "",
+ "compute_extension:flavorextraspecs:show": "",
+ "compute_extension:flavorextraspecs:create": "rule:admin_api",
+ "compute_extension:flavorextraspecs:update": "rule:admin_api",
+ "compute_extension:flavorextraspecs:delete": "rule:admin_api",
+ "compute_extension:flavormanage": "rule:admin_api",
+ "compute_extension:floating_ip_dns": "",
+ "compute_extension:floating_ip_pools": "",
+ "compute_extension:floating_ips": "",
+ "compute_extension:floating_ips_bulk": "rule:admin_api",
+ "compute_extension:fping": "",
+ "compute_extension:fping:all_tenants": "rule:admin_api",
+ "compute_extension:hide_server_addresses": "is_admin:False",
+ "compute_extension:hosts": "rule:admin_api",
+ "compute_extension:hypervisors": "rule:admin_api",
+ "compute_extension:image_size": "",
+ "compute_extension:instance_actions": "",
+ "compute_extension:instance_actions:events": "rule:admin_api",
+ "compute_extension:instance_usage_audit_log": "rule:admin_api",
+ "compute_extension:keypairs": "",
+ "compute_extension:keypairs:index": "",
+ "compute_extension:keypairs:show": "",
+ "compute_extension:keypairs:create": "",
+ "compute_extension:keypairs:delete": "",
+ "compute_extension:multinic": "",
+ "compute_extension:networks": "rule:admin_api",
+ "compute_extension:networks:view": "",
+ "compute_extension:networks_associate": "rule:admin_api",
+ "compute_extension:os-tenant-networks": "",
+ "compute_extension:quotas:show": "",
+ "compute_extension:quotas:update": "rule:admin_api",
+ "compute_extension:quotas:delete": "rule:admin_api",
+ "compute_extension:quota_classes": "",
+ "compute_extension:rescue": "",
+ "compute_extension:security_group_default_rules": "rule:admin_api",
+ "compute_extension:security_groups": "",
+ "compute_extension:server_diagnostics": "rule:admin_api",
+ "compute_extension:server_groups": "",
+ "compute_extension:server_password": "",
+ "compute_extension:server_usage": "",
+ "compute_extension:services": "rule:admin_api",
+ "compute_extension:shelve": "",
+ "compute_extension:shelveOffload": "rule:admin_api",
+ "compute_extension:simple_tenant_usage:show": "rule:admin_or_owner",
+ "compute_extension:simple_tenant_usage:list": "rule:admin_api",
+ "compute_extension:unshelve": "",
+ "compute_extension:users": "rule:admin_api",
+ "compute_extension:virtual_interfaces": "",
+ "compute_extension:virtual_storage_arrays": "",
+ "compute_extension:volumes": "",
+ "compute_extension:volume_attachments:index": "",
+ "compute_extension:volume_attachments:show": "",
+ "compute_extension:volume_attachments:create": "",
+ "compute_extension:volume_attachments:update": "",
+ "compute_extension:volume_attachments:delete": "",
+ "compute_extension:volumetypes": "",
+ "compute_extension:availability_zone:list": "",
+ "compute_extension:availability_zone:detail": "rule:admin_api",
+ "compute_extension:used_limits_for_admin": "rule:admin_api",
+ "compute_extension:migrations:index": "rule:admin_api",
+ "compute_extension:os-assisted-volume-snapshots:create": "rule:admin_api",
+ "compute_extension:os-assisted-volume-snapshots:delete": "rule:admin_api",
+ "compute_extension:console_auth_tokens": "rule:admin_api",
+ "compute_extension:os-server-external-events:create": "rule:admin_api",
+
+ "network:get_all": "",
+ "network:get": "",
+ "network:create": "",
+ "network:delete": "",
+ "network:associate": "",
+ "network:disassociate": "",
+ "network:get_vifs_by_instance": "",
+ "network:allocate_for_instance": "",
+ "network:deallocate_for_instance": "",
+ "network:validate_networks": "",
+ "network:get_instance_uuids_by_ip_filter": "",
+ "network:get_instance_id_by_floating_address": "",
+ "network:setup_networks_on_host": "",
+ "network:get_backdoor_port": "",
+
+ "network:get_floating_ip": "",
+ "network:get_floating_ip_pools": "",
+ "network:get_floating_ip_by_address": "",
+ "network:get_floating_ips_by_project": "",
+ "network:get_floating_ips_by_fixed_address": "",
+ "network:allocate_floating_ip": "",
+ "network:associate_floating_ip": "",
+ "network:disassociate_floating_ip": "",
+ "network:release_floating_ip": "",
+ "network:migrate_instance_start": "",
+ "network:migrate_instance_finish": "",
+
+ "network:get_fixed_ip": "",
+ "network:get_fixed_ip_by_address": "",
+ "network:add_fixed_ip_to_instance": "",
+ "network:remove_fixed_ip_from_instance": "",
+ "network:add_network_to_project": "",
+ "network:get_instance_nw_info": "",
+
+ "network:get_dns_domains": "",
+ "network:add_dns_entry": "",
+ "network:modify_dns_entry": "",
+ "network:delete_dns_entry": "",
+ "network:get_dns_entries_by_address": "",
+ "network:get_dns_entries_by_name": "",
+ "network:create_private_dns_domain": "",
+ "network:create_public_dns_domain": "",
+ "network:delete_dns_domain": "",
+ "network:attach_external_network": "rule:admin_api",
+ "network:get_vif_by_mac_address": "",
+
+ "os_compute_api:servers:detail:get_all_tenants": "is_admin:True",
+ "os_compute_api:servers:index:get_all_tenants": "is_admin:True",
+ "os_compute_api:servers:confirm_resize": "",
+ "os_compute_api:servers:create": "",
+ "os_compute_api:servers:create:attach_network": "",
+ "os_compute_api:servers:create:attach_volume": "",
+ "os_compute_api:servers:create:forced_host": "rule:admin_api",
+ "os_compute_api:servers:delete": "",
+ "os_compute_api:servers:update": "",
+ "os_compute_api:servers:detail": "",
+ "os_compute_api:servers:index": "",
+ "os_compute_api:servers:reboot": "",
+ "os_compute_api:servers:rebuild": "",
+ "os_compute_api:servers:resize": "",
+ "os_compute_api:servers:revert_resize": "",
+ "os_compute_api:servers:show": "",
+ "os_compute_api:servers:create_image": "",
+ "os_compute_api:servers:create_image:allow_volume_backed": "",
+ "os_compute_api:servers:start": "rule:admin_or_owner",
+ "os_compute_api:servers:stop": "rule:admin_or_owner",
+ "os_compute_api:os-access-ips:discoverable": "",
+ "os_compute_api:os-access-ips": "",
+ "os_compute_api:os-admin-actions": "rule:admin_api",
+ "os_compute_api:os-admin-actions:discoverable": "",
+ "os_compute_api:os-admin-actions:reset_network": "rule:admin_api",
+ "os_compute_api:os-admin-actions:inject_network_info": "rule:admin_api",
+ "os_compute_api:os-admin-actions:reset_state": "rule:admin_api",
+ "os_compute_api:os-admin-password": "",
+ "os_compute_api:os-admin-password:discoverable": "",
+ "os_compute_api:os-aggregates:discoverable": "",
+ "os_compute_api:os-aggregates:index": "rule:admin_api",
+ "os_compute_api:os-aggregates:create": "rule:admin_api",
+ "os_compute_api:os-aggregates:show": "rule:admin_api",
+ "os_compute_api:os-aggregates:update": "rule:admin_api",
+ "os_compute_api:os-aggregates:delete": "rule:admin_api",
+ "os_compute_api:os-aggregates:add_host": "rule:admin_api",
+ "os_compute_api:os-aggregates:remove_host": "rule:admin_api",
+ "os_compute_api:os-aggregates:set_metadata": "rule:admin_api",
+ "os_compute_api:os-agents": "rule:admin_api",
+ "os_compute_api:os-agents:discoverable": "",
+ "os_compute_api:os-attach-interfaces": "",
+ "os_compute_api:os-attach-interfaces:discoverable": "",
+ "os_compute_api:os-baremetal-nodes": "rule:admin_api",
+ "os_compute_api:os-baremetal-nodes:discoverable": "",
+ "os_compute_api:os-block-device-mapping-v1:discoverable": "",
+ "os_compute_api:os-cells": "rule:admin_api",
+ "os_compute_api:os-cells:create": "rule:admin_api",
+ "os_compute_api:os-cells:delete": "rule:admin_api",
+ "os_compute_api:os-cells:update": "rule:admin_api",
+ "os_compute_api:os-cells:sync_instances": "rule:admin_api",
+ "os_compute_api:os-cells:discoverable": "",
+ "os_compute_api:os-certificates:create": "",
+ "os_compute_api:os-certificates:show": "",
+ "os_compute_api:os-certificates:discoverable": "",
+ "os_compute_api:os-cloudpipe": "rule:admin_api",
+ "os_compute_api:os-cloudpipe:discoverable": "",
+ "os_compute_api:os-config-drive": "",
+ "os_compute_api:os-consoles:discoverable": "",
+ "os_compute_api:os-consoles:create": "",
+ "os_compute_api:os-consoles:delete": "",
+ "os_compute_api:os-consoles:index": "",
+ "os_compute_api:os-consoles:show": "",
+ "os_compute_api:os-console-output:discoverable": "",
+ "os_compute_api:os-console-output": "",
+ "os_compute_api:os-remote-consoles": "",
+ "os_compute_api:os-remote-consoles:discoverable": "",
+ "os_compute_api:os-create-backup:discoverable": "",
+ "os_compute_api:os-create-backup": "rule:admin_or_owner",
+ "os_compute_api:os-deferred-delete": "",
+ "os_compute_api:os-deferred-delete:discoverable": "",
+ "os_compute_api:os-disk-config": "",
+ "os_compute_api:os-disk-config:discoverable": "",
+ "os_compute_api:os-evacuate": "rule:admin_api",
+ "os_compute_api:os-evacuate:discoverable": "",
+ "os_compute_api:os-extended-server-attributes": "rule:admin_api",
+ "os_compute_api:os-extended-server-attributes:discoverable": "",
+ "os_compute_api:os-extended-status": "",
+ "os_compute_api:os-extended-status:discoverable": "",
+ "os_compute_api:os-extended-availability-zone": "",
+ "os_compute_api:os-extended-availability-zone:discoverable": "",
+ "os_compute_api:extensions": "",
+ "os_compute_api:extension_info:discoverable": "",
+ "os_compute_api:os-extended-volumes": "",
+ "os_compute_api:os-extended-volumes:discoverable": "",
+ "os_compute_api:os-fixed-ips": "rule:admin_api",
+ "os_compute_api:os-fixed-ips:discoverable": "",
+ "os_compute_api:os-flavor-access": "",
+ "os_compute_api:os-flavor-access:discoverable": "",
+ "os_compute_api:os-flavor-access:remove_tenant_access": "rule:admin_api",
+ "os_compute_api:os-flavor-access:add_tenant_access": "rule:admin_api",
+ "os_compute_api:os-flavor-rxtx": "",
+ "os_compute_api:os-flavor-rxtx:discoverable": "",
+ "os_compute_api:flavors:discoverable": "",
+ "os_compute_api:os-flavor-extra-specs:discoverable": "",
+ "os_compute_api:os-flavor-extra-specs:index": "",
+ "os_compute_api:os-flavor-extra-specs:show": "",
+ "os_compute_api:os-flavor-extra-specs:create": "rule:admin_api",
+ "os_compute_api:os-flavor-extra-specs:update": "rule:admin_api",
+ "os_compute_api:os-flavor-extra-specs:delete": "rule:admin_api",
+ "os_compute_api:os-flavor-manage:discoverable": "",
+ "os_compute_api:os-flavor-manage": "rule:admin_api",
+ "os_compute_api:os-floating-ip-dns": "",
+ "os_compute_api:os-floating-ip-dns:discoverable": "",
+ "os_compute_api:os-floating-ip-dns:domain:update": "rule:admin_api",
+ "os_compute_api:os-floating-ip-dns:domain:delete": "rule:admin_api",
+ "os_compute_api:os-floating-ip-pools": "",
+ "os_compute_api:os-floating-ip-pools:discoverable": "",
+ "os_compute_api:os-floating-ips": "",
+ "os_compute_api:os-floating-ips:discoverable": "",
+ "os_compute_api:os-floating-ips-bulk": "rule:admin_api",
+ "os_compute_api:os-floating-ips-bulk:discoverable": "",
+ "os_compute_api:os-fping": "",
+ "os_compute_api:os-fping:discoverable": "",
+ "os_compute_api:os-fping:all_tenants": "rule:admin_api",
+ "os_compute_api:os-hide-server-addresses": "is_admin:False",
+ "os_compute_api:os-hide-server-addresses:discoverable": "",
+ "os_compute_api:os-hosts": "rule:admin_api",
+ "os_compute_api:os-hosts:discoverable": "",
+ "os_compute_api:os-hypervisors": "rule:admin_api",
+ "os_compute_api:os-hypervisors:discoverable": "",
+ "os_compute_api:images:discoverable": "",
+ "os_compute_api:image-size": "",
+ "os_compute_api:image-size:discoverable": "",
+ "os_compute_api:os-instance-actions": "",
+ "os_compute_api:os-instance-actions:discoverable": "",
+ "os_compute_api:os-instance-actions:events": "rule:admin_api",
+ "os_compute_api:os-instance-usage-audit-log": "rule:admin_api",
+ "os_compute_api:os-instance-usage-audit-log:discoverable": "",
+ "os_compute_api:ips:discoverable": "",
+ "os_compute_api:ips:index": "rule:admin_or_owner",
+ "os_compute_api:ips:show": "rule:admin_or_owner",
+ "os_compute_api:os-keypairs:discoverable": "",
+ "os_compute_api:os-keypairs": "",
+ "os_compute_api:os-keypairs:index": "rule:admin_api or user_id:%(user_id)s",
+ "os_compute_api:os-keypairs:show": "rule:admin_api or user_id:%(user_id)s",
+ "os_compute_api:os-keypairs:create": "rule:admin_api or user_id:%(user_id)s",
+ "os_compute_api:os-keypairs:delete": "rule:admin_api or user_id:%(user_id)s",
+ "os_compute_api:limits:discoverable": "",
+ "os_compute_api:limits": "",
+ "os_compute_api:os-lock-server:discoverable": "",
+ "os_compute_api:os-lock-server:lock": "rule:admin_or_owner",
+ "os_compute_api:os-lock-server:unlock": "rule:admin_or_owner",
+ "os_compute_api:os-lock-server:unlock:unlock_override": "rule:admin_api",
+ "os_compute_api:os-migrate-server:discoverable": "",
+ "os_compute_api:os-migrate-server:migrate": "rule:admin_api",
+ "os_compute_api:os-migrate-server:migrate_live": "rule:admin_api",
+ "os_compute_api:os-multinic": "",
+ "os_compute_api:os-multinic:discoverable": "",
+ "os_compute_api:os-networks": "rule:admin_api",
+ "os_compute_api:os-networks:view": "",
+ "os_compute_api:os-networks:discoverable": "",
+ "os_compute_api:os-networks-associate": "rule:admin_api",
+ "os_compute_api:os-networks-associate:discoverable": "",
+ "os_compute_api:os-pause-server:discoverable": "",
+ "os_compute_api:os-pause-server:pause": "rule:admin_or_owner",
+ "os_compute_api:os-pause-server:unpause": "rule:admin_or_owner",
+ "os_compute_api:os-pci:pci_servers": "",
+ "os_compute_api:os-pci:discoverable": "",
+ "os_compute_api:os-pci:index": "rule:admin_api",
+ "os_compute_api:os-pci:detail": "rule:admin_api",
+ "os_compute_api:os-pci:show": "rule:admin_api",
+ "os_compute_api:os-personality:discoverable": "",
+ "os_compute_api:os-preserve-ephemeral-rebuild:discoverable": "",
+ "os_compute_api:os-quota-sets:discoverable": "",
+ "os_compute_api:os-quota-sets:show": "rule:admin_or_owner",
+ "os_compute_api:os-quota-sets:defaults": "",
+ "os_compute_api:os-quota-sets:update": "rule:admin_api",
+ "os_compute_api:os-quota-sets:delete": "rule:admin_api",
+ "os_compute_api:os-quota-sets:detail": "rule:admin_api",
+ "os_compute_api:os-quota-class-sets:update": "rule:admin_api",
+ "os_compute_api:os-quota-class-sets:show": "is_admin:True or quota_class:%(quota_class)s",
+ "os_compute_api:os-quota-class-sets:discoverable": "",
+ "os_compute_api:os-rescue": "",
+ "os_compute_api:os-rescue:discoverable": "",
+ "os_compute_api:os-scheduler-hints:discoverable": "",
+ "os_compute_api:os-security-group-default-rules:discoverable": "",
+ "os_compute_api:os-security-group-default-rules": "rule:admin_api",
+ "os_compute_api:os-security-groups": "",
+ "os_compute_api:os-security-groups:discoverable": "",
+ "os_compute_api:os-server-diagnostics": "rule:admin_api",
+ "os_compute_api:os-server-diagnostics:discoverable": "",
+ "os_compute_api:os-server-password": "",
+ "os_compute_api:os-server-password:discoverable": "",
+ "os_compute_api:os-server-usage": "",
+ "os_compute_api:os-server-usage:discoverable": "",
+ "os_compute_api:os-server-groups": "",
+ "os_compute_api:os-server-groups:discoverable": "",
+ "os_compute_api:os-services": "rule:admin_api",
+ "os_compute_api:os-services:discoverable": "",
+ "os_compute_api:server-metadata:discoverable": "",
+ "os_compute_api:server-metadata:index": "rule:admin_or_owner",
+ "os_compute_api:server-metadata:show": "rule:admin_or_owner",
+ "os_compute_api:server-metadata:delete": "rule:admin_or_owner",
+ "os_compute_api:server-metadata:create": "rule:admin_or_owner",
+ "os_compute_api:server-metadata:update": "rule:admin_or_owner",
+ "os_compute_api:server-metadata:update_all": "rule:admin_or_owner",
+ "os_compute_api:servers:discoverable": "",
+ "os_compute_api:os-shelve:shelve": "",
+ "os_compute_api:os-shelve:shelve:discoverable": "",
+ "os_compute_api:os-shelve:shelve_offload": "rule:admin_api",
+ "os_compute_api:os-simple-tenant-usage:discoverable": "",
+ "os_compute_api:os-simple-tenant-usage:show": "rule:admin_or_owner",
+ "os_compute_api:os-simple-tenant-usage:list": "rule:admin_api",
+ "os_compute_api:os-suspend-server:discoverable": "",
+ "os_compute_api:os-suspend-server:suspend": "rule:admin_or_owner",
+ "os_compute_api:os-suspend-server:resume": "rule:admin_or_owner",
+ "os_compute_api:os-tenant-networks": "rule:admin_or_owner",
+ "os_compute_api:os-tenant-networks:discoverable": "",
+ "os_compute_api:os-shelve:unshelve": "",
+ "os_compute_api:os-user-data:discoverable": "",
+ "os_compute_api:os-virtual-interfaces": "",
+ "os_compute_api:os-virtual-interfaces:discoverable": "",
+ "os_compute_api:os-volumes": "",
+ "os_compute_api:os-volumes:discoverable": "",
+ "os_compute_api:os-volumes-attachments:index": "",
+ "os_compute_api:os-volumes-attachments:show": "",
+ "os_compute_api:os-volumes-attachments:create": "",
+ "os_compute_api:os-volumes-attachments:update": "",
+ "os_compute_api:os-volumes-attachments:delete": "",
+ "os_compute_api:os-volumes-attachments:discoverable": "",
+ "os_compute_api:os-availability-zone:list": "",
+ "os_compute_api:os-availability-zone:discoverable": "",
+ "os_compute_api:os-availability-zone:detail": "rule:admin_api",
+ "os_compute_api:os-used-limits": "rule:admin_api",
+ "os_compute_api:os-used-limits:discoverable": "",
+ "os_compute_api:os-migrations:index": "rule:admin_api",
+ "os_compute_api:os-migrations:discoverable": "",
+ "os_compute_api:os-assisted-volume-snapshots:create": "rule:admin_api",
+ "os_compute_api:os-assisted-volume-snapshots:delete": "rule:admin_api",
+ "os_compute_api:os-assisted-volume-snapshots:discoverable": "",
+ "os_compute_api:os-console-auth-tokens": "rule:admin_api",
+ "os_compute_api:os-server-external-events:create": "rule:admin_api"
+}
diff --git a/python_moonclient/python_moonclient/__init__.py b/python_moonclient/python_moonclient/__init__.py
deleted file mode 100644
index 8b353f9f..00000000
--- a/python_moonclient/python_moonclient/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-
-__version__ = "1.4.0"
diff --git a/python_moonclient/python_moonclient/moon.py b/python_moonclient/python_moonclient/moon.py
deleted file mode 100644
index f8cf027d..00000000
--- a/python_moonclient/python_moonclient/moon.py
+++ /dev/null
@@ -1,41 +0,0 @@
-import sys
-import python_moonclient
-
-from cliff.app import App
-from cliff.commandmanager import CommandManager
-
-
-class Moon(App):
-
- def __init__(self):
- super(Moon, self).__init__(
- description='Moon client',
- version=python_moonclient.__version__,
- command_manager=CommandManager('moon'),
- deferred_help=True,
- )
-
-
-def main(argv=sys.argv[1:]):
- myapp = Moon()
- return myapp.run(argv)
-
-
-if __name__ == '__main__':
- #import python_moonclient.python_moonclient.core.import_json
- #import python_moonclient.python_moonclient.core.models
- #import python_moonclient.core.policies.init as init_policy
- #import python_moonclient.core.pdp.init as init_pdp
- #consul_host = "consul"
- #consul_port = "8005"
-
- #init_model(consul_host, consul_port)
- #init_policy.init(consul_host, consul_port)
- #init_pdp.init(consul_host, consul_port)
- #import_json('/home/fcellier/moon/tests/functional/scenario_available/rbac.json')
-
-
- sys.exit(Moon(sys.argv[1:]))
-
-
-
diff --git a/python_moondb/python_moondb/api/model.py b/python_moondb/python_moondb/api/model.py
deleted file mode 100644
index 57857cd2..00000000
--- a/python_moondb/python_moondb/api/model.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-
-from uuid import uuid4
-import logging
-from python_moonutilities import exceptions
-from python_moonutilities.security_functions import filter_input, enforce
-from python_moondb.api.managers import Managers
-
-
-logger = logging.getLogger("moon.db.api.model")
-
-
-class ModelManager(Managers):
-
- def __init__(self, connector=None):
- self.driver = connector.driver
- Managers.ModelManager = self
-
- @enforce(("read", "write"), "models")
- def update_model(self, user_id, model_id, value):
- if model_id not in self.driver.get_models(model_id=model_id):
- raise exceptions.ModelUnknown
- return self.driver.update_model(model_id=model_id, value=value)
-
- @enforce(("read", "write"), "models")
- def delete_model(self, user_id, model_id):
- if model_id not in self.driver.get_models(model_id=model_id):
- raise exceptions.ModelUnknown
- # TODO (asteroide): check that no policy is connected to this model
- return self.driver.delete_model(model_id=model_id)
-
- @enforce(("read", "write"), "models")
- def add_model(self, user_id, model_id=None, value=None):
- if model_id in self.driver.get_models(model_id=model_id):
- raise exceptions.ModelExisting
- if not model_id:
- model_id = uuid4().hex
- return self.driver.add_model(model_id=model_id, value=value)
-
- @enforce("read", "models")
- def get_models(self, user_id, model_id=None):
- return self.driver.get_models(model_id=model_id)
-
- @enforce(("read", "write"), "meta_rules")
- def set_meta_rule(self, user_id, meta_rule_id, value):
- if meta_rule_id not in self.driver.get_meta_rules(meta_rule_id=meta_rule_id):
- raise exceptions.MetaRuleUnknown
- return self.driver.set_meta_rule(meta_rule_id=meta_rule_id, value=value)
-
- @enforce("read", "meta_rules")
- def get_meta_rules(self, user_id, meta_rule_id=None):
- return self.driver.get_meta_rules(meta_rule_id=meta_rule_id)
-
- @enforce(("read", "write"), "meta_rules")
- def add_meta_rule(self, user_id, meta_rule_id=None, value=None):
- if meta_rule_id in self.driver.get_meta_rules(meta_rule_id=meta_rule_id):
- raise exceptions.MetaRuleExisting
- return self.driver.set_meta_rule(meta_rule_id=meta_rule_id, value=value)
-
- @enforce(("read", "write"), "meta_rules")
- def delete_meta_rule(self, user_id, meta_rule_id=None):
- if meta_rule_id not in self.driver.get_meta_rules(meta_rule_id=meta_rule_id):
- raise exceptions.MetaRuleUnknown
- # TODO (asteroide): check and/or delete data and assignments and rules linked to that meta_rule
- return self.driver.delete_meta_rule(meta_rule_id=meta_rule_id)
-
- @enforce("read", "meta_data")
- def get_subject_categories(self, user_id, category_id=None):
- return self.driver.get_subject_categories(category_id=category_id)
-
- @enforce(("read", "write"), "meta_data")
- def add_subject_category(self, user_id, category_id=None, value=None):
- if category_id in self.driver.get_subject_categories(category_id=category_id):
- raise exceptions.SubjectCategoryExisting
- return self.driver.add_subject_category(name=value["name"], description=value["description"], uuid=category_id)
-
- @enforce(("read", "write"), "meta_data")
- def delete_subject_category(self, user_id, category_id):
- # TODO (asteroide): delete all data linked to that category
- # TODO (asteroide): delete all meta_rules linked to that category
- if category_id not in self.driver.get_subject_categories(category_id=category_id):
- raise exceptions.SubjectCategoryUnknown
- return self.driver.delete_subject_category(category_id=category_id)
-
- @enforce("read", "meta_data")
- def get_object_categories(self, user_id, category_id=None):
- return self.driver.get_object_categories(category_id)
-
- @enforce(("read", "write"), "meta_data")
- def add_object_category(self, user_id, category_id=None, value=None):
- if category_id in self.driver.get_object_categories(category_id=category_id):
- raise exceptions.ObjectCategoryExisting
- return self.driver.add_object_category(name=value["name"], description=value["description"], uuid=category_id)
-
- @enforce(("read", "write"), "meta_data")
- def delete_object_category(self, user_id, category_id):
- # TODO (asteroide): delete all data linked to that category
- # TODO (asteroide): delete all meta_rules linked to that category
- if category_id not in self.driver.get_object_categories(category_id=category_id):
- raise exceptions.ObjectCategoryUnknown
- return self.driver.delete_object_category(category_id=category_id)
-
- @enforce("read", "meta_data")
- def get_action_categories(self, user_id, category_id=None):
- return self.driver.get_action_categories(category_id=category_id)
-
- @enforce(("read", "write"), "meta_data")
- def add_action_category(self, user_id, category_id=None, value=None):
- if category_id in self.driver.get_action_categories(category_id=category_id):
- raise exceptions.ActionCategoryExisting
- return self.driver.add_action_category(name=value["name"], description=value["description"], uuid=category_id)
-
- @enforce(("read", "write"), "meta_data")
- def delete_action_category(self, user_id, category_id):
- # TODO (asteroide): delete all data linked to that category
- # TODO (asteroide): delete all meta_rules linked to that category
- if category_id not in self.driver.get_action_categories(category_id=category_id):
- raise exceptions.ActionCategoryExisting
- return self.driver.delete_action_category(category_id=category_id)
-
diff --git a/python_moondb/python_moondb/api/policy.py b/python_moondb/python_moondb/api/policy.py
deleted file mode 100644
index 9e7ad96c..00000000
--- a/python_moondb/python_moondb/api/policy.py
+++ /dev/null
@@ -1,290 +0,0 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-
-from uuid import uuid4
-import logging
-from python_moonutilities.security_functions import enforce
-from python_moondb.api.managers import Managers
-from python_moonutilities import exceptions
-
-logger = logging.getLogger("moon.db.api.policy")
-
-
-class PolicyManager(Managers):
-
- def __init__(self, connector=None):
- self.driver = connector.driver
- Managers.PolicyManager = self
-
- def get_policy_from_meta_rules(self, user_id, meta_rule_id):
- policies = self.PolicyManager.get_policies("admin")
- models = self.ModelManager.get_models("admin")
- for pdp_key, pdp_value in self.PDPManager.get_pdp(user_id).items():
- if 'security_pipeline' not in pdp_value:
- raise exceptions.PdpContentError
- for policy_id in pdp_value["security_pipeline"]:
- if not policies or policy_id not in policies:
- raise exceptions.PolicyUnknown
- model_id = policies[policy_id]["model_id"]
- if not models:
- raise exceptions.ModelUnknown
- if model_id not in models:
- raise exceptions.ModelUnknown
- if meta_rule_id in models[model_id]["meta_rules"]:
- return policy_id
-
- @enforce(("read", "write"), "policies")
- def update_policy(self, user_id, policy_id, value):
- if policy_id not in self.driver.get_policies(policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.update_policy(policy_id=policy_id, value=value)
-
- @enforce(("read", "write"), "policies")
- def delete_policy(self, user_id, policy_id):
- # TODO (asteroide): unmap PDP linked to that policy
- if policy_id not in self.driver.get_policies(policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.delete_policy(policy_id=policy_id)
-
- @enforce(("read", "write"), "policies")
- def add_policy(self, user_id, policy_id=None, value=None):
- if policy_id in self.driver.get_policies(policy_id=policy_id):
- raise exceptions.PolicyExisting
- if not policy_id:
- policy_id = uuid4().hex
- return self.driver.add_policy(policy_id=policy_id, value=value)
-
- @enforce("read", "policies")
- def get_policies(self, user_id, policy_id=None):
- return self.driver.get_policies(policy_id=policy_id)
-
- @enforce("read", "perimeter")
- def get_subjects(self, user_id, policy_id, perimeter_id=None):
- return self.driver.get_subjects(policy_id=policy_id, perimeter_id=perimeter_id)
-
- @enforce(("read", "write"), "perimeter")
- def add_subject(self, user_id, policy_id, perimeter_id=None, value=None):
- k_user = Managers.KeystoneManager.get_user_by_name(value.get('name'))
- if not k_user['users']:
- k_user = Managers.KeystoneManager.create_user(value)
- if not perimeter_id:
- try:
- logger.info("k_user={}".format(k_user))
- perimeter_id = k_user['users'][0].get('id', uuid4().hex)
- except IndexError:
- k_user = Managers.KeystoneManager.get_user_by_name(
- value.get('name'))
- perimeter_id = uuid4().hex
- except KeyError:
- k_user = Managers.KeystoneManager.get_user_by_name(
- value.get('name'))
- perimeter_id = uuid4().hex
- value.update(k_user['users'][0])
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.set_subject(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
-
- @enforce(("read", "write"), "perimeter")
- def delete_subject(self, user_id, policy_id, perimeter_id):
- return self.driver.delete_subject(policy_id=policy_id, perimeter_id=perimeter_id)
-
- @enforce("read", "perimeter")
- def get_objects(self, user_id, policy_id, perimeter_id=None):
- return self.driver.get_objects(policy_id=policy_id, perimeter_id=perimeter_id)
-
- @enforce(("read", "write"), "perimeter")
- def add_object(self, user_id, policy_id, perimeter_id=None, value=None):
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- if not perimeter_id:
- perimeter_id = uuid4().hex
- return self.driver.set_object(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
-
- @enforce(("read", "write"), "perimeter")
- def delete_object(self, user_id, policy_id, perimeter_id):
- return self.driver.delete_object(policy_id=policy_id, perimeter_id=perimeter_id)
-
- @enforce("read", "perimeter")
- def get_actions(self, user_id, policy_id, perimeter_id=None):
- return self.driver.get_actions(policy_id=policy_id, perimeter_id=perimeter_id)
-
- @enforce(("read", "write"), "perimeter")
- def add_action(self, user_id, policy_id, perimeter_id=None, value=None):
- logger.info("add_action {}".format(policy_id))
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.set_action(policy_id=policy_id, perimeter_id=perimeter_id, value=value)
-
- @enforce(("read", "write"), "perimeter")
- def delete_action(self, user_id, policy_id, perimeter_id):
- return self.driver.delete_action(policy_id=policy_id, perimeter_id=perimeter_id)
-
- @enforce("read", "data")
- def get_subject_data(self, user_id, policy_id, data_id=None, category_id=None):
- available_metadata = self.get_available_metadata(user_id, policy_id)
- results = []
- if not category_id:
- for cat in available_metadata["subject"]:
- results.append(self.driver.get_subject_data(policy_id=policy_id, data_id=data_id,
- category_id=cat))
- if category_id and category_id in available_metadata["subject"]:
- results.append(self.driver.get_subject_data(policy_id=policy_id, data_id=data_id,
- category_id=category_id))
- return results
-
- @enforce(("read", "write"), "data")
- def set_subject_data(self, user_id, policy_id, data_id=None, category_id=None, value=None):
- if not category_id:
- raise Exception('Invalid category id')
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- if not data_id:
- data_id = uuid4().hex
- return self.driver.set_subject_data(policy_id=policy_id, data_id=data_id, category_id=category_id, value=value)
-
- @enforce(("read", "write"), "data")
- def delete_subject_data(self, user_id, policy_id, data_id):
- # TODO (asteroide): check and/or delete assignments linked to that data
- return self.driver.delete_subject_data(policy_id=policy_id, data_id=data_id)
-
- @enforce("read", "data")
- def get_object_data(self, user_id, policy_id, data_id=None, category_id=None):
- available_metadata = self.get_available_metadata(user_id, policy_id)
- results = []
- if not category_id:
- for cat in available_metadata["object"]:
- results.append(self.driver.get_object_data(policy_id=policy_id, data_id=data_id,
- category_id=cat))
- if category_id and category_id in available_metadata["object"]:
- results.append(self.driver.get_object_data(policy_id=policy_id, data_id=data_id,
- category_id=category_id))
- return results
-
- @enforce(("read", "write"), "data")
- def add_object_data(self, user_id, policy_id, data_id=None, category_id=None, value=None):
- if not category_id:
- raise Exception('Invalid category id')
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- if not data_id:
- data_id = uuid4().hex
- return self.driver.set_object_data(policy_id=policy_id, data_id=data_id, category_id=category_id, value=value)
-
- @enforce(("read", "write"), "data")
- def delete_object_data(self, user_id, policy_id, data_id):
- # TODO (asteroide): check and/or delete assignments linked to that data
- return self.driver.delete_object_data(policy_id=policy_id, data_id=data_id)
-
- @enforce("read", "data")
- def get_action_data(self, user_id, policy_id, data_id=None, category_id=None):
- available_metadata = self.get_available_metadata(user_id, policy_id)
- results = []
- if not category_id:
- for cat in available_metadata["action"]:
- results.append(self.driver.get_action_data(policy_id=policy_id, data_id=data_id,
- category_id=cat))
- if category_id and category_id in available_metadata["action"]:
- results.append(self.driver.get_action_data(policy_id=policy_id, data_id=data_id,
- category_id=category_id))
- return results
-
- @enforce(("read", "write"), "data")
- def add_action_data(self, user_id, policy_id, data_id=None, category_id=None, value=None):
- if not category_id:
- raise Exception('Invalid category id')
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- if not data_id:
- data_id = uuid4().hex
- return self.driver.set_action_data(policy_id=policy_id, data_id=data_id, category_id=category_id, value=value)
-
- @enforce(("read", "write"), "data")
- def delete_action_data(self, user_id, policy_id, data_id):
- # TODO (asteroide): check and/or delete assignments linked to that data
- return self.driver.delete_action_data(policy_id=policy_id, data_id=data_id)
-
- @enforce("read", "assignments")
- def get_subject_assignments(self, user_id, policy_id, subject_id=None, category_id=None):
- return self.driver.get_subject_assignments(policy_id=policy_id, subject_id=subject_id, category_id=category_id)
-
- @enforce(("read", "write"), "assignments")
- def add_subject_assignment(self, user_id, policy_id, subject_id, category_id, data_id):
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.add_subject_assignment(policy_id=policy_id, subject_id=subject_id,
- category_id=category_id, data_id=data_id)
-
- @enforce(("read", "write"), "assignments")
- def delete_subject_assignment(self, user_id, policy_id, subject_id, category_id, data_id):
- return self.driver.delete_subject_assignment(policy_id=policy_id, subject_id=subject_id,
- category_id=category_id, data_id=data_id)
-
- @enforce("read", "assignments")
- def get_object_assignments(self, user_id, policy_id, object_id=None, category_id=None):
- return self.driver.get_object_assignments(policy_id=policy_id, object_id=object_id, category_id=category_id)
-
- @enforce(("read", "write"), "assignments")
- def add_object_assignment(self, user_id, policy_id, object_id, category_id, data_id):
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.add_object_assignment(policy_id=policy_id, object_id=object_id,
- category_id=category_id, data_id=data_id)
-
- @enforce(("read", "write"), "assignments")
- def delete_object_assignment(self, user_id, policy_id, object_id, category_id, data_id):
- return self.driver.delete_object_assignment(policy_id=policy_id, object_id=object_id,
- category_id=category_id, data_id=data_id)
-
- @enforce("read", "assignments")
- def get_action_assignments(self, user_id, policy_id, action_id=None, category_id=None):
- return self.driver.get_action_assignments(policy_id=policy_id, action_id=action_id, category_id=category_id)
-
- @enforce(("read", "write"), "assignments")
- def add_action_assignment(self, user_id, policy_id, action_id, category_id, data_id):
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.add_action_assignment(policy_id=policy_id, action_id=action_id,
- category_id=category_id, data_id=data_id)
-
- @enforce(("read", "write"), "assignments")
- def delete_action_assignment(self, user_id, policy_id, action_id, category_id, data_id):
- return self.driver.delete_action_assignment(policy_id=policy_id, action_id=action_id,
- category_id=category_id, data_id=data_id)
-
- @enforce("read", "rules")
- def get_rules(self, user_id, policy_id, meta_rule_id=None, rule_id=None):
- return self.driver.get_rules(policy_id=policy_id, meta_rule_id=meta_rule_id, rule_id=rule_id)
-
- @enforce(("read", "write"), "rules")
- def add_rule(self, user_id, policy_id, meta_rule_id, value):
- if not self.get_policies(user_id=user_id, policy_id=policy_id):
- raise exceptions.PolicyUnknown
- return self.driver.add_rule(policy_id=policy_id, meta_rule_id=meta_rule_id, value=value)
-
- @enforce(("read", "write"), "rules")
- def delete_rule(self, user_id, policy_id, rule_id):
- return self.driver.delete_rule(policy_id=policy_id, rule_id=rule_id)
-
- @enforce("read", "meta_data")
- def get_available_metadata(self, user_id, policy_id):
- categories = {
- "subject": [],
- "object": [],
- "action": []
- }
- policy = self.driver.get_policies(policy_id=policy_id)
- if not policy:
- raise exceptions.PolicyUnknown
- model_id = policy[policy_id]["model_id"]
- model = Managers.ModelManager.get_models(user_id=user_id, model_id=model_id)
- try:
- meta_rule_list = model[model_id]["meta_rules"]
- for meta_rule_id in meta_rule_list:
- meta_rule = Managers.ModelManager.get_meta_rules(user_id=user_id, meta_rule_id=meta_rule_id)
- categories["subject"].extend(meta_rule[meta_rule_id]["subject_categories"])
- categories["object"].extend(meta_rule[meta_rule_id]["object_categories"])
- categories["action"].extend(meta_rule[meta_rule_id]["action_categories"])
- finally:
- return categories
diff --git a/python_moondb/tests/unit_python/models/test_categories.py b/python_moondb/tests/unit_python/models/test_categories.py
deleted file mode 100644
index 111538b4..00000000
--- a/python_moondb/tests/unit_python/models/test_categories.py
+++ /dev/null
@@ -1,44 +0,0 @@
-import pytest
-import logging
-from python_moonutilities.exceptions import *
-
-logger = logging.getLogger("moon.db.tests.models.test_categories")
-
-
-def add_subject_category(cat_id=None, value=None):
- from python_moondb.core import ModelManager
- category = ModelManager.add_subject_category(user_id=None, category_id=cat_id, value=value)
- return category
-
-
-def test_add_subject_category_twice():
- category = add_subject_category(value={"name":"category name", "description":"description 1"})
- assert category is not None
- with pytest.raises(SubjectCategoryExisting):
- add_subject_category(value={"name":"category name", "description":"description 2"})
-
-
-def add_object_category(cat_id=None, value=None):
- from python_moondb.core import ModelManager
- category = ModelManager.add_object_category(user_id=None, category_id=cat_id, value=value)
- return category
-
-
-def test_add_object_category_twice():
- category = add_object_category(value={"name":"category name", "description":"description 1"})
- assert category is not None
- with pytest.raises(ObjectCategoryExisting):
- add_object_category(value={"name":"category name", "description":"description 2"})
-
-
-def add_action_category(cat_id=None, value=None):
- from python_moondb.core import ModelManager
- category = ModelManager.add_action_category(user_id=None, category_id=cat_id, value=value)
- return category
-
-
-def test_add_action_category_twice():
- category = add_action_category(value={"name":"category name", "description":"description 1"})
- assert category is not None
- with pytest.raises(ActionCategoryExisting):
- add_action_category(value={"name":"category name", "description":"description 2"})
diff --git a/python_moondb/tests/unit_python/models/test_meta_rules.py b/python_moondb/tests/unit_python/models/test_meta_rules.py
deleted file mode 100644
index 585274d9..00000000
--- a/python_moondb/tests/unit_python/models/test_meta_rules.py
+++ /dev/null
@@ -1,174 +0,0 @@
-import pytest
-
-
-def set_meta_rule(meta_rule_id, value=None):
- from python_moondb.core import ModelManager
- if not value:
- value = {
- "name": "MLS_meta_rule",
- "description": "test",
- "subject_categories": ["user_security_level_id_1"],
- "object_categories": ["vm_security_level_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- return ModelManager.set_meta_rule(user_id=None, meta_rule_id=meta_rule_id, value=value)
-
-
-def add_meta_rule(meta_rule_id=None, value=None):
- from python_moondb.core import ModelManager
- if not value:
- value = {
- "name": "MLS_meta_rule",
- "description": "test",
- "subject_categories": ["user_security_level_id_1"],
- "object_categories": ["vm_security_level_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- return ModelManager.add_meta_rule(user_id=None, meta_rule_id=meta_rule_id, value=value)
-
-
-def get_meta_rules(meta_rule_id=None):
- from python_moondb.core import ModelManager
- return ModelManager.get_meta_rules(user_id=None, meta_rule_id=meta_rule_id)
-
-
-def delete_meta_rules(meta_rule_id=None):
- from python_moondb.core import ModelManager
- ModelManager.delete_meta_rule(user_id=None, meta_rule_id=meta_rule_id)
-
-def test_set_not_exist_meta_rule_error(db):
- # set not existing meta rule and expect to raise and error
- with pytest.raises(Exception) as exception_info:
- set_meta_rule(meta_rule_id=None)
- assert str(exception_info.value) == '400: Sub Meta Rule Unknown'
-
-
-def test_add_new_meta_rule_success(db):
- value = {
- "name": "MLS_meta_rule",
- "description": "test",
- "subject_categories": ["user_security_level_id_1"],
- "object_categories": ["vm_security_level_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- metaRules = add_meta_rule();
- assert isinstance(metaRules, dict)
- assert metaRules
- assert len(metaRules) is 1
- meta_rule_id = list(metaRules.keys())[0]
- for key in ("name", "description", "subject_categories", "object_categories", "action_categories"):
- assert key in metaRules[meta_rule_id]
- assert metaRules[meta_rule_id][key] == value[key]
-
-
-def test_set_meta_rule_succes(db):
- # arrange
- meta_rules = add_meta_rule()
- meta_rule_id = list(meta_rules.keys())[0]
- updated_value = {
- "name": "MLS_meta_rule",
- "description": "test",
- "subject_categories": ["user_role_id_1"],
- "object_categories": ["vm_security_level_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- # action
- updated_meta_rule = set_meta_rule(meta_rule_id, updated_value)
- # assert
- updated_meta_rule_id = list(updated_meta_rule.keys())[0]
- assert updated_meta_rule_id == meta_rule_id
- assert updated_meta_rule[updated_meta_rule_id]["subject_categories"] == \
- updated_value["subject_categories"]
-
-
-def test_add_existing_meta_rule_error(db):
- meta_rules = add_meta_rule()
- meta_rule_id = list(meta_rules.keys())[0]
- with pytest.raises(Exception) as exception_info:
- add_meta_rule(meta_rule_id=meta_rule_id)
- assert str(exception_info.value) == '400: Sub Meta Rule Existing'
-
-
-def test_get_meta_rule_success(db):
- # arrange
- values = {}
- value1 = {
- "name": "MLS_meta_rule",
- "description": "test",
- "subject_categories": ["user_security_level_id_1"],
- "object_categories": ["vm_security_level_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- meta_rules1 = add_meta_rule(value=value1)
- meta_rule_id1 = list(meta_rules1.keys())[0]
- values[meta_rule_id1] = value1
- value2 = {
- "name": "rbac_meta_rule",
- "description": "test",
- "subject_categories": ["user_role_id_1"],
- "object_categories": ["vm_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- meta_rules2 = add_meta_rule(value=value2)
- meta_rule_id2 = list(meta_rules2.keys())[0]
- values[meta_rule_id2] = value2
-
- # action
- meta_rules = get_meta_rules()
- # assert
- assert isinstance(meta_rules , dict)
- assert meta_rules
- assert len(meta_rules) is 2
- for meta_rule_id in meta_rules:
- for key in ("name", "description", "subject_categories", "object_categories", "action_categories"):
- assert key in meta_rules[meta_rule_id]
- assert meta_rules[meta_rule_id][key] == values[meta_rule_id][key]
-
-
-def test_get_specific_meta_rule_success(db):
- # arrange
- added_meta_rules = add_meta_rule()
- added_meta_rule_id = list(added_meta_rules.keys())[0]
- # action
- meta_rules = get_meta_rules(meta_rule_id=added_meta_rule_id)
- meta_rule_id = list(meta_rules.keys())[0]
- # assert
- assert meta_rule_id == added_meta_rule_id
- for key in ("name", "description", "subject_categories", "object_categories", "action_categories"):
- assert key in meta_rules[meta_rule_id]
- assert meta_rules[meta_rule_id][key] == added_meta_rules[added_meta_rule_id][key]
-
-
-def test_delete_meta_rules_success(db):
- # arrange
- value1 = {
- "name": "MLS_meta_rule",
- "description": "test",
- "subject_categories": ["user_security_level_id_1"],
- "object_categories": ["vm_security_level_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- meta_rules1 = add_meta_rule(value=value1)
- meta_rule_id1 = list(meta_rules1.keys())[0]
-
- value2 = {
- "name": "rbac_meta_rule",
- "description": "test",
- "subject_categories": ["user_role_id_1"],
- "object_categories": ["vm_id_1"],
- "action_categories": ["action_type_id_1"]
- }
- meta_rules2 = add_meta_rule(value=value2)
- meta_rule_id2 = list(meta_rules2.keys())[0]
-
- # action
- delete_meta_rules(meta_rule_id1)
- # assert
- meta_rules = get_meta_rules()
- assert meta_rule_id1 not in meta_rules
-
-
-def test_delete_invalid_meta_rules_error(db):
- with pytest.raises(Exception) as exception_info:
- delete_meta_rules("INVALID_META_RULE_ID")
- assert str(exception_info.value) == '400: Sub Meta Rule Unknown'
diff --git a/python_moondb/tests/unit_python/models/test_models.py b/python_moondb/tests/unit_python/models/test_models.py
deleted file mode 100644
index 54c45e77..00000000
--- a/python_moondb/tests/unit_python/models/test_models.py
+++ /dev/null
@@ -1,178 +0,0 @@
-import pytest
-from python_moonutilities.exceptions import *
-import logging
-logger = logging.getLogger("moon.db.tests.test_model")
-
-def get_models(model_id=None):
- from python_moondb.core import ModelManager
- return ModelManager.get_models(user_id= None , model_id= model_id)
-
-
-def add_model(model_id=None, value=None):
- from python_moondb.core import ModelManager
- if not value:
- name = "MLS" if model_id is None else "MLS " + model_id
- value = {
- "name": name,
- "description": "test",
- "meta_rules": "meta_rule_mls_1"
- }
- return ModelManager.add_model(user_id=None, model_id=model_id, value=value)
-
-
-def delete_models(uuid=None, name=None):
- from python_moondb.core import ModelManager
- if not uuid:
- for model_id, model_value in get_models():
- if name == model_value['name']:
- uuid = model_id
- break
- ModelManager.delete_model(user_id=None, model_id=uuid)
-
-
-def delete_all_models():
- from python_moondb.core import ModelManager
- models_values = get_models()
- print(models_values)
- for model_id, model_value in models_values.items():
- ModelManager.delete_model(user_id=None, model_id=model_id)
-
-
-def update_model(model_id=None, value=None):
- from python_moondb.core import ModelManager
- return ModelManager.update_model(user_id=None, model_id=model_id, value=value)
-
-
-def test_get_models_empty(db):
- # act
- models = get_models()
- # assert
- assert isinstance(models, dict)
- assert not models
-
-
-def test_get_model(db):
- # prepare
- add_model(model_id="mls_model_id")
- # act
- models = get_models()
- # assert
- assert isinstance(models, dict)
- assert models # assert model is not empty
- assert len(models) is 1
- delete_all_models()
-
-def test_get_specific_model(db):
- # prepare
- add_model(model_id="mls_model_id")
- add_model(model_id="rbac_model_id")
- # act
- models = get_models(model_id="mls_model_id")
- # assert
- assert isinstance(models, dict)
- assert models # assert model is not empty
- assert len(models) is 1
- delete_all_models()
-
-def test_add_model(db):
- # act
- model = add_model()
- # assert
- assert isinstance(model, dict)
- assert model # assert model is not empty
- assert len(model) is 1
- delete_all_models()
-
-
-def test_add_same_model_twice(db):
- # prepare
- add_model(model_id="model_1") # add model twice
- # act
- with pytest.raises(ModelExisting) as exception_info:
- add_model(model_id="model_1")
- delete_all_models()
- #assert str(exception_info.value) == '409: Model Error'
-
-
-def test_add_model_generate_new_uuid(db):
- model_value1 = {
- "name": "MLS",
- "description": "test",
- "meta_rules": "meta_rule_mls_1"
- }
- model1 = add_model(value=model_value1)
-
- model_value2 = {
- "name": "rbac",
- "description": "test",
- "meta_rules": "meta_rule_mls_2"
- }
- model2 = add_model(value=model_value2)
-
- assert list(model1)[0] != list(model2)[0]
- delete_all_models()
-
-
-def test_add_models(db):
- model_value1 = {
- "name": "MLS",
- "description": "test",
- "meta_rules": "meta_rule_mls_1"
- }
- models = add_model(value=model_value1)
- assert isinstance(models, dict)
- assert models
- assert len(models.keys()) == 1
- model_id = list(models.keys())[0]
- for key in ("name", "meta_rules", "description"):
- assert key in models[model_id]
- assert models[model_id][key] == model_value1[key]
- delete_all_models()
-
-
-def test_delete_models(db):
- model_value1 = {
- "name": "MLS",
- "description": "test",
- "meta_rules": "meta_rule_mls_1"
- }
- model1 = add_model(value=model_value1)
-
- model_value2 = {
- "name": "rbac",
- "description": "test",
- "meta_rules": "meta_rule_mls_2"
- }
- model2 = add_model(value=model_value2)
-
- id = list(model1)[0]
- delete_models(id)
- # assert
- models = get_models()
- assert id not in models
- delete_all_models()
-
-
-def test_update_model(db):
- # prepare
- model_value = {
- "name": "MLS",
- "description": "test",
- "meta_rules": "meta_rule_mls_1"
- }
- model = add_model(value=model_value)
- model_id = list(model)[0]
- new_model_value = {
- "name": "MLS2",
- "description": "test",
- "meta_rules": "meta_rule_mls_2"
- }
- # act
- update_model(model_id=model_id, value=new_model_value)
- # assert
- model = get_models(model_id)
-
- for key in ("name", "meta_rules", "description"):
- assert key in model[model_id]
- assert model[model_id][key] == new_model_value[key]
- delete_all_models() \ No newline at end of file
diff --git a/python_moondb/tests/unit_python/policies/mock_data.py b/python_moondb/tests/unit_python/policies/mock_data.py
deleted file mode 100644
index 3e9bea93..00000000
--- a/python_moondb/tests/unit_python/policies/mock_data.py
+++ /dev/null
@@ -1,55 +0,0 @@
-def create_meta_rule(meta_rule_name="meta_rule1", category_prefix=""):
- meta_rule_value = {
- "name": meta_rule_name,
- "algorithm": "name of the meta rule algorithm",
- "subject_categories": [category_prefix + "subject_category_id1",
- category_prefix + "subject_category_id2"],
- "object_categories": [category_prefix +"object_category_id1"],
- "action_categories": [category_prefix +"action_category_id1"]
- }
- return meta_rule_value
-
-
-def create_model(meta_rule_id, model_name="test_model"):
- value = {
- "name": model_name,
- "description": "test",
- "meta_rules": [meta_rule_id]
-
- }
- return value
-
-
-def create_policy(model_id, policy_name="policy_1"):
- value = {
- "name": policy_name,
- "model_id": model_id,
- "genre": "authz",
- "description": "test",
- }
- return value
-
-
-def create_pdp(pdp_ids):
- value = {
- "name": "test_pdp",
- "security_pipeline": pdp_ids,
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- return value
-
-
-def get_policy_id(model_name="test_model", policy_name="policy_1", meta_rule_name="meta_rule1", category_prefix=""):
- import policies.test_policies as test_policies
- import models.test_models as test_models
- import models.test_meta_rules as test_meta_rules
- meta_rule = test_meta_rules.add_meta_rule(value=create_meta_rule(meta_rule_name, category_prefix))
- meta_rule_id = list(meta_rule.keys())[0]
- model = test_models.add_model(value=create_model(meta_rule_id, model_name))
- model_id = list(model.keys())[0]
- value = create_policy(model_id, policy_name)
- policy = test_policies.add_policies(value=value)
- assert policy
- policy_id = list(policy.keys())[0]
- return policy_id
diff --git a/python_moondb/tests/unit_python/policies/test_assignments.py b/python_moondb/tests/unit_python/policies/test_assignments.py
deleted file mode 100755
index 1ca140e6..00000000
--- a/python_moondb/tests/unit_python/policies/test_assignments.py
+++ /dev/null
@@ -1,257 +0,0 @@
-import policies.mock_data as mock_data
-from python_moonutilities.exceptions import *
-import pytest
-
-def get_action_assignments(policy_id, action_id=None, category_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_action_assignments("", policy_id, action_id, category_id)
-
-
-def add_action_assignment(policy_id, action_id, category_id, data_id):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_action_assignment("", policy_id, action_id, category_id, data_id)
-
-
-def delete_action_assignment(policy_id, action_id, category_id, data_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_action_assignment("", policy_id, action_id, category_id, data_id)
-
-
-def get_object_assignments(policy_id, object_id=None, category_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_object_assignments("", policy_id, object_id, category_id)
-
-
-def add_object_assignment(policy_id, object_id, category_id, data_id):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_object_assignment("", policy_id, object_id, category_id, data_id)
-
-
-def delete_object_assignment(policy_id, object_id, category_id, data_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_object_assignment("", policy_id, object_id, category_id, data_id)
-
-
-def get_subject_assignments(policy_id, subject_id=None, category_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_subject_assignments("", policy_id, subject_id, category_id)
-
-
-def add_subject_assignment(policy_id, subject_id, category_id, data_id):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_subject_assignment("", policy_id, subject_id, category_id, data_id)
-
-
-def delete_subject_assignment(policy_id, subject_id, category_id, data_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_subject_assignment("", policy_id, subject_id, category_id, data_id)
-
-
-def test_get_action_assignments(db):
- policy_id = mock_data.get_policy_id()
- action_id = "action_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- add_action_assignment(policy_id, action_id, category_id, data_id)
- act_assignments = get_action_assignments(policy_id, action_id, category_id)
- action_id_1 = list(act_assignments.keys())[0]
- assert act_assignments[action_id_1]["policy_id"] == policy_id
- assert act_assignments[action_id_1]["action_id"] == action_id
- assert act_assignments[action_id_1]["category_id"] == category_id
- assert len(act_assignments[action_id_1].get("assignments")) == 1
- assert data_id in act_assignments[action_id_1].get("assignments")
-
-
-def test_get_action_assignments_by_policy_id(db):
- policy_id = mock_data.get_policy_id()
- action_id = "action_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- add_action_assignment(policy_id, action_id, category_id, data_id)
- data_id = "data_id_2"
- add_action_assignment(policy_id, action_id, category_id, data_id)
- data_id = "data_id_3"
- add_action_assignment(policy_id, action_id, category_id, data_id)
- act_assignments = get_action_assignments(policy_id)
- action_id_1 = list(act_assignments.keys())[0]
- assert act_assignments[action_id_1]["policy_id"] == policy_id
- assert act_assignments[action_id_1]["action_id"] == action_id
- assert act_assignments[action_id_1]["category_id"] == category_id
- assert len(act_assignments[action_id_1].get("assignments")) == 3
-
-
-def test_add_action_assignments(db):
- policy_id = mock_data.get_policy_id()
- action_id = "action_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- action_assignments = add_action_assignment(policy_id, action_id, category_id, data_id)
- assert action_assignments
- action_id_1 = list(action_assignments.keys())[0]
- assert action_assignments[action_id_1]["policy_id"] == policy_id
- assert action_assignments[action_id_1]["action_id"] == action_id
- assert action_assignments[action_id_1]["category_id"] == category_id
- assert len(action_assignments[action_id_1].get("assignments")) == 1
- assert data_id in action_assignments[action_id_1].get("assignments")
-
- with pytest.raises(ActionAssignmentExisting) as exception_info:
- add_action_assignment(policy_id, action_id, category_id, data_id)
-
-def test_delete_action_assignment(db):
- policy_id = mock_data.get_policy_id()
- add_action_assignment(policy_id, "", "", "")
- policy_id = mock_data.get_policy_id(model_name="test_model2", policy_name="policy_2", meta_rule_name="meta_rule2", category_prefix="_")
- action_id = "action_id_2"
- category_id = "category_id_2"
- data_id = "data_id_2"
- add_action_assignment(policy_id, action_id, category_id, data_id)
- delete_action_assignment(policy_id, "", "", "")
- assignments = get_action_assignments(policy_id, )
- assert len(assignments) == 1
-
-
-def test_delete_action_assignment_with_invalid_policy_id(db):
- policy_id = "invalid_id"
- delete_action_assignment(policy_id, "", "", "")
- assignments = get_action_assignments(policy_id, )
- assert len(assignments) == 0
-
-
-def test_get_object_assignments(db):
- policy_id = mock_data.get_policy_id()
- object_id = "object_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- add_object_assignment(policy_id, object_id, category_id, data_id)
- obj_assignments = get_object_assignments(policy_id, object_id, category_id)
- object_id_1 = list(obj_assignments.keys())[0]
- assert obj_assignments[object_id_1]["policy_id"] == policy_id
- assert obj_assignments[object_id_1]["object_id"] == object_id
- assert obj_assignments[object_id_1]["category_id"] == category_id
- assert len(obj_assignments[object_id_1].get("assignments")) == 1
- assert data_id in obj_assignments[object_id_1].get("assignments")
-
-
-def test_get_object_assignments_by_policy_id(db):
- policy_id = mock_data.get_policy_id()
- object_id_1 = "object_id_1"
- category_id_1 = "category_id_1"
- data_id = "data_id_1"
- add_action_assignment(policy_id, object_id_1, category_id_1, data_id)
- object_id_2 = "object_id_2"
- category_id_2 = "category_id_2"
- data_id = "data_id_2"
- add_action_assignment(policy_id, object_id_2, category_id_2, data_id)
- object_id_3 = "object_id_3"
- category_id_3 = "category_id_3"
- data_id = "data_id_3"
- add_action_assignment(policy_id, object_id_3, category_id_3, data_id)
- act_assignments = get_action_assignments(policy_id)
- assert len(act_assignments) == 3
-
-
-def test_add_object_assignments(db):
- policy_id = mock_data.get_policy_id()
- object_id = "object_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- object_assignments = add_object_assignment(policy_id, object_id, category_id, data_id)
- assert object_assignments
- object_id_1 = list(object_assignments.keys())[0]
- assert object_assignments[object_id_1]["policy_id"] == policy_id
- assert object_assignments[object_id_1]["object_id"] == object_id
- assert object_assignments[object_id_1]["category_id"] == category_id
- assert len(object_assignments[object_id_1].get("assignments")) == 1
- assert data_id in object_assignments[object_id_1].get("assignments")
-
- with pytest.raises(ObjectAssignmentExisting):
- add_object_assignment(policy_id, object_id, category_id, data_id)
-
-
-def test_delete_object_assignment(db):
- policy_id = mock_data.get_policy_id()
- add_object_assignment(policy_id, "", "", "")
- object_id = "action_id_2"
- category_id = "category_id_2"
- data_id = "data_id_2"
- add_object_assignment(policy_id, object_id, category_id, data_id)
- delete_object_assignment(policy_id, "", "", "")
- assignments = get_object_assignments(policy_id, )
- assert len(assignments) == 1
-
-
-def test_delete_object_assignment_with_invalid_policy_id(db):
- policy_id = "invalid_id"
- delete_object_assignment(policy_id, "", "", "")
- assignments = get_object_assignments(policy_id, )
- assert len(assignments) == 0
-
-
-def test_get_subject_assignments(db):
- policy_id = mock_data.get_policy_id()
- subject_id = "object_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- add_subject_assignment(policy_id, subject_id, category_id, data_id)
- subj_assignments = get_subject_assignments(policy_id, subject_id, category_id)
- subject_id_1 = list(subj_assignments.keys())[0]
- assert subj_assignments[subject_id_1]["policy_id"] == policy_id
- assert subj_assignments[subject_id_1]["subject_id"] == subject_id
- assert subj_assignments[subject_id_1]["category_id"] == category_id
- assert len(subj_assignments[subject_id_1].get("assignments")) == 1
- assert data_id in subj_assignments[subject_id_1].get("assignments")
-
-
-def test_get_subject_assignments_by_policy_id(db):
- policy_id = mock_data.get_policy_id()
- subject_id_1 = "subject_id_1"
- category_id_1 = "category_id_1"
- data_id = "data_id_1"
- add_subject_assignment(policy_id, subject_id_1, category_id_1, data_id)
- subject_id_2 = "subject_id_2"
- category_id_2 = "category_id_2"
- data_id = "data_id_2"
- add_subject_assignment(policy_id, subject_id_2, category_id_2, data_id)
- subject_id_3 = "subject_id_3"
- category_id_3 = "category_id_3"
- data_id = "data_id_3"
- add_subject_assignment(policy_id, subject_id_3, category_id_3, data_id)
- subj_assignments = get_subject_assignments(policy_id)
- assert len(subj_assignments) == 3
-
-
-def test_add_subject_assignments(db):
- policy_id = mock_data.get_policy_id()
- subject_id = "subject_id_1"
- category_id = "category_id_1"
- data_id = "data_id_1"
- subject_assignments = add_subject_assignment(policy_id, subject_id, category_id, data_id)
- assert subject_assignments
- subject_id_1 = list(subject_assignments.keys())[0]
- assert subject_assignments[subject_id_1]["policy_id"] == policy_id
- assert subject_assignments[subject_id_1]["subject_id"] == subject_id
- assert subject_assignments[subject_id_1]["category_id"] == category_id
- assert len(subject_assignments[subject_id_1].get("assignments")) == 1
- assert data_id in subject_assignments[subject_id_1].get("assignments")
-
- with pytest.raises(SubjectAssignmentExisting):
- add_subject_assignment(policy_id, subject_id, category_id, data_id)
-
-
-def test_delete_subject_assignment(db):
- policy_id = mock_data.get_policy_id()
- add_subject_assignment(policy_id, "", "", "")
- subject_id = "subject_id_2"
- category_id = "category_id_2"
- data_id = "data_id_2"
- add_subject_assignment(policy_id, subject_id, category_id, data_id)
- delete_subject_assignment(policy_id, "", "", "")
- assignments = get_subject_assignments(policy_id, )
- assert len(assignments) == 1
-
-
-def test_delete_subject_assignment_with_invalid_policy_id(db):
- policy_id = "invalid_id"
- delete_subject_assignment(policy_id, "", "", "")
- assignments = get_subject_assignments(policy_id, )
- assert len(assignments) == 0
diff --git a/python_moondb/tests/unit_python/policies/test_data.py b/python_moondb/tests/unit_python/policies/test_data.py
deleted file mode 100755
index 6a57130e..00000000
--- a/python_moondb/tests/unit_python/policies/test_data.py
+++ /dev/null
@@ -1,567 +0,0 @@
-import policies.mock_data as mock_data
-import pytest
-import logging
-from python_moonutilities.exceptions import *
-
-logger = logging.getLogger("python_moondb.tests.api.test_data")
-
-
-def get_action_data(policy_id, data_id=None, category_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_action_data("", policy_id, data_id, category_id)
-
-
-def add_action_data(policy_id, data_id=None, category_id=None, value=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_action_data("", policy_id, data_id, category_id, value)
-
-
-def delete_action_data(policy_id, data_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_action_data("", policy_id, data_id)
-
-
-def get_object_data(policy_id, data_id=None, category_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_object_data("", policy_id, data_id, category_id)
-
-
-def add_object_data(policy_id, data_id=None, category_id=None, value=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_object_data("", policy_id, data_id, category_id, value)
-
-
-def delete_object_data(policy_id, data_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_object_data("", policy_id, data_id)
-
-
-def get_subject_data(policy_id, data_id=None, category_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_subject_data("", policy_id, data_id, category_id)
-
-
-def add_subject_data(policy_id, data_id=None, category_id=None, value=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.set_subject_data("", policy_id, data_id, category_id, value)
-
-
-def delete_subject_data(policy_id, data_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_subject_data("", policy_id, data_id)
-
-
-def get_actions(policy_id, perimeter_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_actions("", policy_id, perimeter_id)
-
-
-def add_action(policy_id, perimeter_id=None, value=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_action("", policy_id, perimeter_id, value)
-
-
-def delete_action(policy_id, perimeter_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_action("", policy_id, perimeter_id)
-
-
-def get_objects(policy_id, perimeter_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_objects("", policy_id, perimeter_id)
-
-
-def add_object(policy_id, perimeter_id=None, value=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_object("", policy_id, perimeter_id, value)
-
-
-def delete_object(policy_id, perimeter_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_object("", policy_id, perimeter_id)
-
-
-def get_subjects(policy_id, perimeter_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_subjects("", policy_id, perimeter_id)
-
-
-def add_subject(policy_id, perimeter_id=None, value=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.add_subject("", policy_id, perimeter_id, value)
-
-
-def delete_subject(policy_id, perimeter_id):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_subject("", policy_id, perimeter_id)
-
-
-def get_available_metadata(policy_id):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_available_metadata("", policy_id)
-
-
-def test_get_action_data(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
-
- policy_id = policy_id
- data_id = "data_id_1"
- category_id = "action_category_id1"
- value = {
- "name": "action-type",
- "description": {"vm-action": "", "storage-action": "", },
- }
- add_action_data(policy_id, data_id, category_id, value)
- action_data = get_action_data(policy_id, data_id, category_id)
- assert action_data
- assert len(action_data[0]['data']) == 1
-
-
-def test_get_action_data_with_invalid_category_id(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "action_category_id1"
- value = {
- "name": "action-type",
- "description": {"vm-action": "", "storage-action": "", },
- }
- add_action_data(policy_id, data_id, category_id, value)
- action_data = get_action_data(policy_id)
- assert action_data
- assert len(action_data[0]['data']) == 1
-
-
-def test_add_action_data(db):
- policy_id = mock_data.get_policy_id()
- data_id = "data_id_1"
- category_id = "category_id_1"
- value = {
- "name": "action-type",
- "description": {"vm-action": "", "storage-action": "", },
- }
- action_data = add_action_data(policy_id, data_id, category_id, value).get('data')
- assert action_data
- action_data_id = list(action_data.keys())[0]
- assert action_data[action_data_id].get('policy_id') == policy_id
-
- with pytest.raises(ActionScopeExisting) as exception_info:
- add_action_data(policy_id, category_id=category_id, value=value).get('data')
-
-
-def test_add_action_data_with_invalid_category_id(db):
- policy_id = mock_data.get_policy_id()
- data_id = "data_id_1"
- value = {
- "name": "action-type",
- "description": {"vm-action": "", "storage-action": "", },
- }
- with pytest.raises(Exception) as exception_info:
- add_action_data(policy_id=policy_id, data_id=data_id, value=value).get('data')
- assert str(exception_info.value) == 'Invalid category id'
-
-
-def test_delete_action_data(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "category_id_1"
- value = {
- "name": "action-type",
- "description": {"vm-action": "", "storage-action": "", },
- }
- action_data = add_action_data(policy_id, data_id, category_id, value).get('data')
- action_data_id = list(action_data.keys())[0]
- delete_action_data(action_data[action_data_id].get('policy_id'), None)
- new_action_data = get_action_data(policy_id)
- assert len(new_action_data[0]['data']) == 0
-
-
-def test_get_object_data(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "object_category_id1"
- value = {
- "name": "object-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- add_object_data(policy_id, data_id, category_id, value)
- object_data = get_object_data(policy_id, data_id, category_id)
- assert object_data
- assert len(object_data[0]['data']) == 1
-
-
-def test_get_object_data_with_invalid_category_id(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "object_category_id1"
- value = {
- "name": "object-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- add_object_data(policy_id, data_id, category_id, value)
- object_data = get_object_data(policy_id)
- assert object_data
- assert len(object_data[0]['data']) == 1
-
-
-def test_add_object_data(db):
- policy_id = mock_data.get_policy_id()
- data_id = "data_id_1"
- category_id = "object_category_id1"
- value = {
- "name": "object-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- object_data = add_object_data(policy_id, data_id, category_id, value).get('data')
- assert object_data
- object_data_id = list(object_data.keys())[0]
- assert object_data[object_data_id].get('policy_id') == policy_id
-
- with pytest.raises(ObjectScopeExisting) as exception_info:
- add_object_data(policy_id, category_id=category_id, value=value).get('data')
-
-
-def test_add_object_data_with_invalid_category_id(db):
- policy_id = mock_data.get_policy_id()
- data_id = "data_id_1"
- value = {
- "name": "object-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- with pytest.raises(Exception) as exception_info:
- add_object_data(policy_id=policy_id, data_id=data_id, value=value).get('data')
- assert str(exception_info.value) == 'Invalid category id'
-
-
-def test_delete_object_data(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "object_category_id1"
- value = {
- "name": "object-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- object_data = add_object_data(policy_id, data_id, category_id, value).get('data')
- object_data_id = list(object_data.keys())[0]
- delete_object_data(object_data[object_data_id].get('policy_id'), data_id)
- new_object_data = get_object_data(policy_id)
- assert len(new_object_data[0]['data']) == 0
-
-
-def test_get_subject_data(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "subject_category_id1"
- value = {
- "name": "subject-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- add_subject_data(policy_id, data_id, category_id, value)
- subject_data = get_subject_data(policy_id, data_id, category_id)
- assert subject_data
- assert len(subject_data[0]['data']) == 1
-
-
-def test_get_subject_data_with_invalid_category_id(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "subject_category_id1"
- value = {
- "name": "subject-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- add_subject_data(policy_id, data_id, category_id, value)
- subject_data = get_subject_data(policy_id)
- assert subject_data
- assert len(subject_data[0]['data']) == 1
-
-
-def test_add_subject_data(db):
- policy_id = mock_data.get_policy_id()
- data_id = "data_id_1"
- category_id = "subject_category_id1"
- value = {
- "name": "subject-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- subject_data = add_subject_data(policy_id, data_id, category_id, value).get('data')
- assert subject_data
- subject_data_id = list(subject_data.keys())[0]
- assert subject_data[subject_data_id].get('policy_id') == policy_id
- with pytest.raises(SubjectScopeExisting):
- add_subject_data(policy_id, category_id=category_id, value=value).get('data')
-
-
-def test_add_subject_data_with_no_category_id(db):
- policy_id = mock_data.get_policy_id()
- data_id = "data_id_1"
- value = {
- "name": "subject-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- with pytest.raises(Exception) as exception_info:
- add_subject_data(policy_id=policy_id, data_id=data_id, value=value).get('data')
- assert str(exception_info.value) == 'Invalid category id'
-
-
-def test_delete_subject_data(db):
- policy_id = mock_data.get_policy_id()
- get_available_metadata(policy_id)
- data_id = "data_id_1"
- category_id = "subject_category_id1"
- value = {
- "name": "subject-security-level",
- "description": {"low": "", "medium": "", "high": ""},
- }
- subject_data = add_subject_data(policy_id, data_id, category_id, value).get('data')
- subject_data_id = list(subject_data.keys())[0]
- delete_subject_data(subject_data[subject_data_id].get('policy_id'), data_id)
- new_subject_data = get_subject_data(policy_id)
- assert len(new_subject_data[0]['data']) == 0
-
-
-def test_get_actions(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_action",
- "description": "test",
- }
- add_action(policy_id=policy_id, value=value)
- actions = get_actions(policy_id, )
- assert actions
- assert len(actions) == 1
- action_id = list(actions.keys())[0]
- assert actions[action_id].get('policy_list')[0] == policy_id
-
-
-def test_add_action(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_action",
- "description": "test",
- }
- action = add_action(policy_id=policy_id, value=value)
- assert action
- action_id = list(action.keys())[0]
- assert len(action[action_id].get('policy_list')) == 1
-
- with pytest.raises(ActionExisting):
- add_action(policy_id=policy_id, value=value)
-
-
-def test_add_action_multiple_times(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_action",
- "description": "test",
- }
- action = add_action(policy_id=policy_id, value=value)
- logger.info("action : {}".format(action))
- action_id = list(action.keys())[0]
- perimeter_id = action[action_id].get('id')
- assert action
- value = {
- "name": "test_action",
- "description": "test",
- "policy_list": ['policy_id_3', 'policy_id_4']
- }
- action = add_action(mock_data.get_policy_id(model_name="test_model2", policy_name="policy_2", meta_rule_name="meta_rule2", category_prefix="_"), perimeter_id, value)
- logger.info("action : {}".format(action))
- assert action
- action_id = list(action.keys())[0]
- assert len(action[action_id].get('policy_list')) == 2
-
-
-def test_delete_action(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_action",
- "description": "test",
- }
- action = add_action(policy_id=policy_id, value=value)
- action_id = list(action.keys())[0]
- delete_action(policy_id, action_id)
- actions = get_actions(policy_id, )
- assert not actions
-
-
-def test_delete_action_with_invalid_perimeter_id(db):
- policy_id = "invalid"
- perimeter_id = "invalid"
- with pytest.raises(Exception) as exception_info:
- delete_action(policy_id, perimeter_id)
- assert str(exception_info.value) == '400: Action Unknown'
-
-
-def test_get_objects(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_object",
- "description": "test",
- }
- add_object(policy_id=policy_id, value=value)
- objects = get_objects(policy_id, )
- assert objects
- assert len(objects) == 1
- object_id = list(objects.keys())[0]
- assert objects[object_id].get('policy_list')[0] == policy_id
-
-
-def test_add_object(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_object",
- "description": "test",
- }
- added_object = add_object(policy_id=policy_id, value=value)
- assert added_object
- object_id = list(added_object.keys())[0]
- assert len(added_object[object_id].get('policy_list')) == 1
-
- with pytest.raises(ObjectExisting):
- add_object(policy_id=policy_id, value=value)
-
-
-def test_add_objects_multiple_times(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_object",
- "description": "test",
- }
- added_object = add_object(policy_id=policy_id, value=value)
- object_id = list(added_object.keys())[0]
- perimeter_id = added_object[object_id].get('id')
- assert added_object
- value = {
- "name": "test_object",
- "description": "test",
- "policy_list": ['policy_id_3', 'policy_id_4']
- }
- added_object = add_object(mock_data.get_policy_id(model_name="test_model2", policy_name="policy_2", meta_rule_name="meta_rule2", category_prefix="_"), perimeter_id, value)
- assert added_object
- object_id = list(added_object.keys())[0]
- assert len(added_object[object_id].get('policy_list')) == 2
-
-
-def test_delete_object(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "test_object",
- "description": "test",
- }
- added_object = add_object(policy_id=policy_id, value=value)
- object_id = list(added_object.keys())[0]
- delete_object(policy_id, object_id)
- objects = get_objects(policy_id, )
- assert not objects
-
-
-def test_delete_object_with_invalid_perimeter_id(db):
- policy_id = "invalid"
- perimeter_id = "invalid"
- with pytest.raises(Exception) as exception_info:
- delete_object(policy_id, perimeter_id)
- assert str(exception_info.value) == '400: Object Unknown'
-
-
-def test_get_subjects(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "testuser",
- "description": "test",
- }
- add_subject(policy_id=policy_id, value=value)
- subjects = get_subjects(policy_id, )
- assert subjects
- assert len(subjects) == 1
- subject_id = list(subjects.keys())[0]
- assert subjects[subject_id].get('policy_list')[0] == policy_id
-
-
-def test_add_subject(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "testuser",
- "description": "test",
- }
- subject = add_subject(policy_id=policy_id, value=value)
- assert subject
- subject_id = list(subject.keys())[0]
- assert len(subject[subject_id].get('policy_list')) == 1
-
- with pytest.raises(SubjectExisting):
- add_subject(policy_id=policy_id, value=value)
-
-
-def test_add_subjects_multiple_times(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "testuser",
- "description": "test",
- }
- subject = add_subject(policy_id=policy_id, value=value)
- subject_id = list(subject.keys())[0]
- perimeter_id = subject[subject_id].get('id')
- assert subject
- value = {
- "name": "testuser",
- "description": "test",
- "policy_list": ['policy_id_3', 'policy_id_4']
- }
- subject = add_subject(mock_data.get_policy_id(model_name="test_model2", policy_name="policy_2", meta_rule_name="meta_rule2", category_prefix="_"), perimeter_id, value)
- assert subject
- subject_id = list(subject.keys())[0]
- assert len(subject[subject_id].get('policy_list')) == 2
-
-
-def test_delete_subject(db):
- policy_id = mock_data.get_policy_id()
- value = {
- "name": "testuser",
- "description": "test",
- }
- subject = add_subject(policy_id=policy_id, value=value)
- subject_id = list(subject.keys())[0]
- delete_subject(policy_id, subject_id)
- subjects = get_subjects(policy_id, )
- assert not subjects
-
-
-def test_delete_subject_with_invalid_perimeter_id(db):
- policy_id = "invalid"
- perimeter_id = "invalid"
- with pytest.raises(Exception) as exception_info:
- delete_subject(policy_id, perimeter_id)
- assert str(exception_info.value) == '400: Subject Unknown'
-
-
-def test_get_available_metadata(db):
- policy_id = mock_data.get_policy_id()
- metadata = get_available_metadata(policy_id=policy_id)
- assert metadata
- assert metadata['object'][0] == "object_category_id1"
- assert metadata['subject'][0] == "subject_category_id1"
- assert metadata['subject'][1] == "subject_category_id2"
-
-
-def test_get_available_metadata_empty_model(db):
- import policies.test_policies as test_policies
- value = mock_data.create_policy("invalid")
- policy = test_policies.add_policies(value=value)
- assert policy
- policy_id = list(policy.keys())[0]
- metadata = get_available_metadata(policy_id=policy_id)
- assert metadata
-
-
-def test_get_available_metadata_with_invalid_policy_id(db):
- with pytest.raises(Exception) as exception_info:
- get_available_metadata(policy_id='invalid')
- assert '400: Policy Unknown' == str(exception_info.value)
diff --git a/python_moondb/tests/unit_python/policies/test_policies.py b/python_moondb/tests/unit_python/policies/test_policies.py
deleted file mode 100755
index f81f0d39..00000000
--- a/python_moondb/tests/unit_python/policies/test_policies.py
+++ /dev/null
@@ -1,290 +0,0 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-
-import pytest
-import policies.mock_data as mock_data
-from python_moonutilities.exceptions import *
-
-def get_policies():
- from python_moondb.core import PolicyManager
- return PolicyManager.get_policies("admin")
-
-
-def add_policies(policy_id=None, value=None):
- from python_moondb.core import PolicyManager
- if not value:
- value = {
- "name": "test_policiy",
- "model_id": "",
- "genre": "authz",
- "description": "test",
- }
- return PolicyManager.add_policy("admin", policy_id=policy_id, value=value)
-
-
-def delete_policies(uuid=None, name=None):
- from python_moondb.core import PolicyManager
- if not uuid:
- for policy_id, policy_value in get_policies():
- if name == policy_value['name']:
- uuid = policy_id
- break
- PolicyManager.delete_policy("admin", uuid)
-
-
-def update_policy(policy_id, value):
- from python_moondb.core import PolicyManager
- return PolicyManager.update_policy("admin", policy_id, value)
-
-
-def get_policy_from_meta_rules(meta_rule_id):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_policy_from_meta_rules("admin", meta_rule_id)
-
-
-def get_rules(policy_id=None, meta_rule_id=None, rule_id=None):
- from python_moondb.core import PolicyManager
- return PolicyManager.get_rules("", policy_id, meta_rule_id, rule_id)
-
-
-def add_rule(policy_id=None, meta_rule_id=None, value=None):
- from python_moondb.core import PolicyManager
- if not value:
- value = {
- "rule": ("high", "medium", "vm-action"),
- "instructions": ({"decision": "grant"}),
- "enabled": "",
- }
- return PolicyManager.add_rule("", policy_id, meta_rule_id, value)
-
-
-def delete_rule(policy_id=None, rule_id=None):
- from python_moondb.core import PolicyManager
- PolicyManager.delete_rule("", policy_id, rule_id)
-
-
-def test_get_policies(db):
- policies = get_policies()
- assert isinstance(policies, dict)
- assert not policies
-
-
-def test_add_policies(db):
- value = {
- "name": "test_policy",
- "model_id": "",
- "genre": "authz",
- "description": "test",
- }
- policies = add_policies(value=value)
- assert isinstance(policies, dict)
- assert policies
- assert len(policies.keys()) == 1
- policy_id = list(policies.keys())[0]
- for key in ("genre", "name", "model_id", "description"):
- assert key in policies[policy_id]
- assert policies[policy_id][key] == value[key]
-
-
-def test_add_policies_twice_with_same_id(db):
- policy_id = 'policy_id_1'
- value = {
- "name": "test_policy",
- "model_id": "",
- "genre": "authz",
- "description": "test",
- }
- add_policies(policy_id, value)
- with pytest.raises(PolicyExisting) as exception_info:
- add_policies(policy_id, value)
- #assert str(exception_info.value) == '409: Policy Error'
-
-
-def test_delete_policies(db):
- value = {
- "name": "test_policy1",
- "model_id": "",
- "genre": "authz",
- "description": "test",
- }
- policies = add_policies(value=value)
- policy_id1 = list(policies.keys())[0]
- value = {
- "name": "test_policy2",
- "model_id": "",
- "genre": "authz",
- "description": "test",
- }
- policies = add_policies(value=value)
- policy_id2 = list(policies.keys())[0]
- assert policy_id1 != policy_id2
- delete_policies(policy_id1)
- policies = get_policies()
- assert policy_id1 not in policies
-
-
-def test_delete_policies_with_invalid_id(db):
- policy_id = 'policy_id_1'
- with pytest.raises(PolicyUnknown) as exception_info:
- delete_policies(policy_id)
- #assert str(exception_info.value) == '400: Policy Unknown'
-
-
-def test_update_policy(db):
- policies = add_policies()
- policy_id = list(policies.keys())[0]
- value = {
- "name": "test_policy4",
- "model_id": "",
- "genre": "authz",
- "description": "test-3",
- }
- updated_policy = update_policy(policy_id, value)
- assert updated_policy
- for key in ("genre", "name", "model_id", "description"):
- assert key in updated_policy[policy_id]
- assert updated_policy[policy_id][key] == value[key]
-
-
-def test_update_policy_with_invalid_id(db):
- policy_id = 'invalid-id'
- value = {
- "name": "test_policy4",
- "model_id": "",
- "genre": "authz",
- "description": "test-3",
- }
- with pytest.raises(PolicyUnknown) as exception_info:
- update_policy(policy_id, value)
- #assert str(exception_info.value) == '400: Policy Unknown'
-
-
-def test_get_policy_from_meta_rules(db):
- import models.test_models as test_models
- import models.test_meta_rules as test_meta_rules
- import test_pdp as test_pdp
- meta_rule = test_meta_rules.add_meta_rule(value=mock_data.create_meta_rule())
- meta_rule_id = list(meta_rule.keys())[0]
- model = test_models.add_model(value=mock_data.create_model(meta_rule_id))
- model_id = list(model.keys())[0]
- value = mock_data.create_policy(model_id)
- policy = add_policies(value=value)
- assert policy
- policy_id = list(policy.keys())[0]
- pdp_ids = [policy_id,]
- pdp_obj = mock_data.create_pdp(pdp_ids)
- test_pdp.add_pdp(value=pdp_obj)
- matched_policy_id = get_policy_from_meta_rules(meta_rule_id)
- assert matched_policy_id
- assert policy_id == matched_policy_id
-
-
-def test_get_policy_from_meta_rules_with_no_policy_ids(db):
- import test_pdp as test_pdp
- meta_rule_id = 'meta_rule_id'
- value = {
- "name": "test_pdp",
- "security_pipeline": [],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- test_pdp.add_pdp(value=value)
- matched_policy_id = get_policy_from_meta_rules(meta_rule_id)
- assert not matched_policy_id
-
-
-def test_get_policy_from_meta_rules_with_no_policies(db):
- import test_pdp as test_pdp
- meta_rule_id = 'meta_rule_id'
- policy_id = 'invalid'
- pdp_ids = [policy_id,]
- pdp_obj = mock_data.create_pdp(pdp_ids)
- test_pdp.add_pdp(value=pdp_obj)
- with pytest.raises(Exception) as exception_info:
- get_policy_from_meta_rules(meta_rule_id)
- assert str(exception_info.value) == '400: Policy Unknown'
-
-
-def test_get_policy_from_meta_rules_with_no_models(db):
- import models.test_meta_rules as test_meta_rules
- import test_pdp as test_pdp
- meta_rule = test_meta_rules.add_meta_rule(value=mock_data.create_meta_rule())
- meta_rule_id = list(meta_rule.keys())[0]
- model_id = 'invalid'
- value = mock_data.create_policy(model_id)
- policy = add_policies(value=value)
- assert policy
- policy_id = list(policy.keys())[0]
- pdp_ids = [policy_id,]
- pdp_obj = mock_data.create_pdp(pdp_ids)
- test_pdp.add_pdp(value=pdp_obj)
- with pytest.raises(Exception) as exception_info:
- get_policy_from_meta_rules(meta_rule_id)
- assert str(exception_info.value) == '400: Model Unknown'
-
-
-def test_get_rules(db):
- value = {
- "rule": ("low", "medium", "vm-action"),
- "instructions": ({"decision": "grant"}),
- "enabled": "",
- }
- policy_id = mock_data.get_policy_id()
- meta_rule_id = "1"
- add_rule(policy_id, meta_rule_id, value)
- value = {
- "rule": ("low", "low", "vm-action"),
- "instructions": ({"decision": "grant"}),
- "enabled": "",
- }
- meta_rule_id = "1"
- add_rule(policy_id, meta_rule_id, value)
- rules = get_rules(policy_id, meta_rule_id)
- assert isinstance(rules, dict)
- assert rules
- obj = rules.get('rules')
- assert len(obj) == 2
-
-
-def test_get_rules_with_invalid_policy_id_failure(db):
- rules = get_rules("invalid_policy_id", "meta_rule_id")
- assert not rules.get('meta_rule-id')
- assert len(rules.get('rules')) == 0
-
-
-def test_add_rule(db):
- value = {
- "rule": ("high", "medium", "vm-action"),
- "instructions": ({"decision": "grant"}),
- "enabled": "",
- }
- policy_id = mock_data.get_policy_id()
- meta_rule_id = "1"
- rules = add_rule(policy_id, meta_rule_id, value)
- assert rules
- assert len(rules) == 1
- assert isinstance(rules, dict)
- rule_id = list(rules.keys())[0]
- for key in ("rule", "instructions", "enabled"):
- assert key in rules[rule_id]
- assert rules[rule_id][key] == value[key]
-
- with pytest.raises(RuleExisting):
- add_rule(policy_id, meta_rule_id, value)
-
-
-def test_delete_rule(db):
- value = {
- "rule": ("low", "low", "vm-action"),
- "instructions": ({"decision": "grant"}),
- "enabled": "",
- }
- policy_id = mock_data.get_policy_id()
- meta_rule_id = "2"
- rules = add_rule(policy_id, meta_rule_id, value)
- rule_id = list(rules.keys())[0]
- delete_rule(policy_id, rule_id)
- rules = get_rules(policy_id, meta_rule_id)
- assert not rules.get('rules')
diff --git a/python_moondb/tests/unit_python/test_pdp.py b/python_moondb/tests/unit_python/test_pdp.py
deleted file mode 100755
index 5134c0fb..00000000
--- a/python_moondb/tests/unit_python/test_pdp.py
+++ /dev/null
@@ -1,112 +0,0 @@
-import pytest
-
-
-def update_pdp(pdp_id, value):
- from python_moondb.core import PDPManager
- return PDPManager.update_pdp("", pdp_id, value)
-
-
-def delete_pdp(pdp_id):
- from python_moondb.core import PDPManager
- PDPManager.delete_pdp("", pdp_id)
-
-
-def add_pdp(pdp_id=None, value=None):
- from python_moondb.core import PDPManager
- return PDPManager.add_pdp("", pdp_id, value)
-
-
-def get_pdp(pdp_id=None):
- from python_moondb.core import PDPManager
- return PDPManager.get_pdp("", pdp_id)
-
-
-def test_update_pdp(db):
- pdp_id = "pdp_id1"
- value = {
- "name": "test_pdp",
- "security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- add_pdp(pdp_id, value)
- pdp = update_pdp(pdp_id, value)
- assert pdp
-
-
-def test_update_pdp_with_invalid_id(db):
- pdp_id = "pdp_id1"
- value = {
- "name": "test_pdp",
- "security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- with pytest.raises(Exception) as exception_info:
- update_pdp(pdp_id, value)
- assert str(exception_info.value) == '400: Pdp Unknown'
-
-
-def test_delete_pdp(db):
- pdp_id = "pdp_id1"
- value = {
- "name": "test_pdp",
- "security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- add_pdp(pdp_id, value)
- delete_pdp(pdp_id)
- assert len(get_pdp(pdp_id)) == 0
-
-
-def test_delete_pdp_with_invalid_id(db):
- pdp_id = "pdp_id1"
- with pytest.raises(Exception) as exception_info:
- delete_pdp(pdp_id)
- assert str(exception_info.value) == '400: Pdp Unknown'
-
-
-def test_add_pdp(db):
- pdp_id = "pdp_id1"
- value = {
- "name": "test_pdp",
- "security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- pdp = add_pdp(pdp_id, value)
- assert pdp
-
-
-def test_add_pdp_twice_with_same_id(db):
- pdp_id = "pdp_id1"
- value = {
- "name": "test_pdp",
- "security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- add_pdp(pdp_id, value)
- with pytest.raises(Exception) as exception_info:
- add_pdp(pdp_id, value)
- assert str(exception_info.value) == '409: Pdp Error'
-
-
-def test_get_pdp(db):
- pdp_id = "pdp_id1"
- value = {
- "name": "test_pdp",
- "security_pipeline": ["policy_id_1", "policy_id_2"],
- "keystone_project_id": "keystone_project_id1",
- "description": "...",
- }
- add_pdp(pdp_id, value)
- pdp = get_pdp(pdp_id)
- assert len(pdp) == 1
-
-
-def test_get_pdp_with_invalid_id(db):
- pdp_id = "invalid"
- pdp = get_pdp(pdp_id)
- assert len(pdp) == 0
diff --git a/python_moonutilities/python_moonutilities/__init__.py b/python_moonutilities/python_moonutilities/__init__.py
deleted file mode 100644
index cabb4c52..00000000
--- a/python_moonutilities/python_moonutilities/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
-# This software is distributed under the terms and conditions of the 'Apache-2.0'
-# license which can be found in the file 'LICENSE' in this package distribution
-# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-
-__version__ = "1.4.8"
-
-
diff --git a/python_moonutilities/tests/unit_python/requirements.txt b/python_moonutilities/tests/unit_python/requirements.txt
deleted file mode 100644
index 3c1ad607..00000000
--- a/python_moonutilities/tests/unit_python/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-pytest
-requests_mock \ No newline at end of file
diff --git a/tests/functional/run_tests.sh b/tests/functional/run_tests.sh
deleted file mode 100644
index c5cbabbb..00000000
--- a/tests/functional/run_tests.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-echo "starting Moon Functional Tests"
-
-COMPONENTS="moon_authz, moon_interface, moon_manager, moon_orchestrator, moon_wrapper"
-
-for dir in ${COMPONENTS}; do
- echo "Testing component ${dir}"
- cd ${MOON_HOME}/${dir}
- docker run --rm --volume $(pwd):/data wukongsun/moon_forming:latest /bin/bash /root/switch.sh functest
-done
-
-# TODO: download tests results